[libgda] Allow INSERT statement with no field and no value
- From: Vivien Malerba <vivien src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] Allow INSERT statement with no field and no value
- Date: Wed, 21 Jul 2010 19:18:07 +0000 (UTC)
commit 587aed3a6445dd38108835f4a7857e6f4c8d5ff3
Author: Vivien Malerba <malerba gnome-db org>
Date: Wed Jul 21 17:11:08 2010 +0200
Allow INSERT statement with no field and no value
libgda/gda-statement.c | 4 +-
libgda/sql-parser/gda-statement-struct-insert.c | 2 +-
providers/mysql/gda-mysql-provider.c | 90 +++++++++++++++++++++++
3 files changed, 94 insertions(+), 2 deletions(-)
---
diff --git a/libgda/gda-statement.c b/libgda/gda-statement.c
index ffb62bb..3f8aa1f 100644
--- a/libgda/gda-statement.c
+++ b/libgda/gda-statement.c
@@ -866,8 +866,10 @@ default_render_insert (GdaSqlStatementInsert *stmt, GdaSqlRenderingContext *cont
}
g_string_append_c (string, ')');
}
+
+ if (!stmt->fields_list && !stmt->values_list)
+ g_string_append (string, " DEFAULT VALUES");
}
-
str = string->str;
g_string_free (string, FALSE);
diff --git a/libgda/sql-parser/gda-statement-struct-insert.c b/libgda/sql-parser/gda-statement-struct-insert.c
index 8402aa7..12d73f6 100644
--- a/libgda/sql-parser/gda-statement-struct-insert.c
+++ b/libgda/sql-parser/gda-statement-struct-insert.c
@@ -380,7 +380,7 @@ gda_sql_statement_insert_check_structure (GdaSqlAnyPart *stmt, gpointer data, GE
}
else {
/* using values list */
- if (!insert->values_list) {
+ if (!insert->values_list && (nb_values != 0)) {
g_set_error (error, GDA_SQL_ERROR, GDA_SQL_STRUCTURE_CONTENTS_ERROR,
"%s", _("Missing values to insert in INSERT statement"));
return FALSE;
diff --git a/providers/mysql/gda-mysql-provider.c b/providers/mysql/gda-mysql-provider.c
index 08f5c6e..04d580f 100644
--- a/providers/mysql/gda-mysql-provider.c
+++ b/providers/mysql/gda-mysql-provider.c
@@ -1396,6 +1396,7 @@ gda_mysql_provider_create_parser (GdaServerProvider *provider,
*
* This method renders a #GdaStatement into its SQL representation.
*/
+static gchar *mysql_render_insert (GdaSqlStatementInsert *stmt, GdaSqlRenderingContext *context, GError **error);
static gchar *mysql_render_function (GdaSqlFunction *func, GdaSqlRenderingContext *context, GError **error);
static gchar *mysql_render_expr (GdaSqlExpr *expr, GdaSqlRenderingContext *context,
gboolean *is_default, gboolean *is_null,
@@ -1427,6 +1428,7 @@ gda_mysql_provider_statement_to_sql (GdaServerProvider *provider,
* and the opening parenthesis, see
* http://blog.152.org/2009/12/mysql-error-1305-function-xxx-does-not.html */
context.render_expr = mysql_render_expr; /* render "FALSE" as 0 and TRUE as 1 */
+ context.render_insert = (GdaSqlRenderingFunc) mysql_render_insert;
str = gda_statement_to_sql_real (stmt, &context, error);
@@ -1445,6 +1447,94 @@ gda_mysql_provider_statement_to_sql (GdaServerProvider *provider,
}
static gchar *
+mysql_render_insert (GdaSqlStatementInsert *stmt, GdaSqlRenderingContext *context, GError **error)
+{
+ GString *string;
+ gchar *str;
+ GSList *list;
+ gboolean pretty = context->flags & GDA_STATEMENT_SQL_PRETTY;
+
+ g_return_val_if_fail (stmt, NULL);
+ g_return_val_if_fail (GDA_SQL_ANY_PART (stmt)->type == GDA_SQL_ANY_STMT_INSERT, NULL);
+
+ string = g_string_new ("INSERT ");
+
+ /* conflict algo */
+ if (stmt->on_conflict)
+ g_string_append_printf (string, "OR %s ", stmt->on_conflict);
+
+ /* INTO */
+ g_string_append (string, "INTO ");
+ str = context->render_table (GDA_SQL_ANY_PART (stmt->table), context, error);
+ if (!str) goto err;
+ g_string_append (string, str);
+ g_free (str);
+
+ /* fields list */
+ for (list = stmt->fields_list; list; list = list->next) {
+ if (list == stmt->fields_list)
+ g_string_append (string, " (");
+ else
+ g_string_append (string, ", ");
+ str = context->render_field (GDA_SQL_ANY_PART (list->data), context, error);
+ if (!str) goto err;
+ g_string_append (string, str);
+ g_free (str);
+ }
+ if (stmt->fields_list)
+ g_string_append_c (string, ')');
+
+ /* values */
+ if (stmt->select) {
+ if (pretty)
+ g_string_append_c (string, '\n');
+ else
+ g_string_append_c (string, ' ');
+ str = context->render_select (GDA_SQL_ANY_PART (stmt->select), context, error);
+ if (!str) goto err;
+ g_string_append (string, str);
+ g_free (str);
+ }
+ else {
+ for (list = stmt->values_list; list; list = list->next) {
+ GSList *rlist;
+ if (list == stmt->values_list) {
+ if (pretty)
+ g_string_append (string, "\nVALUES");
+ else
+ g_string_append (string, " VALUES");
+ }
+ else
+ g_string_append_c (string, ',');
+ for (rlist = (GSList*) list->data; rlist; rlist = rlist->next) {
+ if (rlist == (GSList*) list->data)
+ g_string_append (string, " (");
+ else
+ g_string_append (string, ", ");
+ str = context->render_expr ((GdaSqlExpr*) rlist->data, context, NULL, NULL, error);
+ if (!str) goto err;
+ if (pretty && (rlist != (GSList*) list->data))
+ g_string_append (string, "\n\t");
+ g_string_append (string, str);
+ g_free (str);
+ }
+ g_string_append_c (string, ')');
+ }
+
+ if (!stmt->fields_list && !stmt->values_list)
+ g_string_append (string, " () VALUES ()");
+ }
+
+ str = string->str;
+ g_string_free (string, FALSE);
+ return str;
+
+ err:
+ g_string_free (string, TRUE);
+ return NULL;
+}
+
+static gchar *
mysql_render_function (GdaSqlFunction *func, GdaSqlRenderingContext *context, GError **error)
{
GString *string;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]