[libgda/LIBGDA_4.2] SQLite: don't enclose each SELECT in a compound statement with parenthesis when rendering
- From: Vivien Malerba <vivien src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda/LIBGDA_4.2] SQLite: don't enclose each SELECT in a compound statement with parenthesis when rendering
- Date: Sat, 19 Nov 2011 17:11:57 +0000 (UTC)
commit ee6ae7203bc2acea045cbd72f31ee2bef9db38c7
Author: Vivien Malerba <malerba gnome-db org>
Date: Tue Nov 8 21:20:39 2011 +0100
SQLite: don't enclose each SELECT in a compound statement with parenthesis when rendering
libgda/sqlite/gda-sqlite-provider.c | 81 +++++++++++++++++++++++++++++++++++
1 files changed, 81 insertions(+), 0 deletions(-)
---
diff --git a/libgda/sqlite/gda-sqlite-provider.c b/libgda/sqlite/gda-sqlite-provider.c
index 0b8687d..c1f46ed 100644
--- a/libgda/sqlite/gda-sqlite-provider.c
+++ b/libgda/sqlite/gda-sqlite-provider.c
@@ -1686,6 +1686,8 @@ gda_sqlite_provider_create_parser (G_GNUC_UNUSED GdaServerProvider *provider, G_
/*
* GdaStatement to SQL request
*/
+static gchar *sqlite_render_compound (GdaSqlStatementCompound *stmt, GdaSqlRenderingContext *context, GError **error);
+
static gchar *sqlite_render_operation (GdaSqlOperation *op, GdaSqlRenderingContext *context, GError **error);
static gchar *sqlite_render_expr (GdaSqlExpr *expr, GdaSqlRenderingContext *context,
gboolean *is_default, gboolean *is_null,
@@ -1710,6 +1712,7 @@ gda_sqlite_provider_statement_to_sql (GdaServerProvider *provider, GdaConnection
context.params = params;
context.flags = flags;
context.render_operation = (GdaSqlRenderingFunc) sqlite_render_operation; /* specific REGEXP rendering */
+ context.render_compound = (GdaSqlRenderingFunc) sqlite_render_compound; /* don't surround each SELECT with parenthesis, EXCEPT ALL and INTERSECT ALL are not supported */
context.render_expr = sqlite_render_expr; /* render "FALSE" as 0 and TRUE as 1 */
str = gda_statement_to_sql_real (stmt, &context, error);
@@ -1728,6 +1731,84 @@ gda_sqlite_provider_statement_to_sql (GdaServerProvider *provider, GdaConnection
return str;
}
+/*
+ * The difference with the default implementation is to avoid surrounding each SELECT with parenthesis
+ * and that EXCEPT ALL and INTERSECT ALL are not supported
+ */
+static gchar *
+sqlite_render_compound (GdaSqlStatementCompound *stmt, GdaSqlRenderingContext *context, GError **error)
+{
+ GString *string;
+ gchar *str;
+ GSList *list;
+
+ g_return_val_if_fail (stmt, NULL);
+ g_return_val_if_fail (GDA_SQL_ANY_PART (stmt)->type == GDA_SQL_ANY_STMT_COMPOUND, NULL);
+
+ string = g_string_new ("");
+
+ for (list = stmt->stmt_list; list; list = list->next) {
+ GdaSqlStatement *sqlstmt = (GdaSqlStatement*) list->data;
+ if (list != stmt->stmt_list) {
+ switch (stmt->compound_type) {
+ case GDA_SQL_STATEMENT_COMPOUND_UNION:
+ g_string_append (string, " UNION ");
+ break;
+ case GDA_SQL_STATEMENT_COMPOUND_UNION_ALL:
+ g_string_append (string, " UNION ALL ");
+ break;
+ case GDA_SQL_STATEMENT_COMPOUND_INTERSECT:
+ g_string_append (string, " INTERSECT ");
+ break;
+ case GDA_SQL_STATEMENT_COMPOUND_INTERSECT_ALL:
+ g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
+ GDA_SERVER_PROVIDER_NON_SUPPORTED_ERROR,
+ _("'%s' compound not supported by SQLite"),
+ "INTERSECT ALL");
+ goto err;
+ break;
+ case GDA_SQL_STATEMENT_COMPOUND_EXCEPT:
+ g_string_append (string, " EXCEPT ");
+ break;
+ case GDA_SQL_STATEMENT_COMPOUND_EXCEPT_ALL:
+ g_set_error (error, GDA_SERVER_PROVIDER_ERROR,
+ GDA_SERVER_PROVIDER_NON_SUPPORTED_ERROR,
+ _("'%s' compound not supported by SQLite"),
+ "EXCEPT ALL");
+ goto err;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ }
+ switch (sqlstmt->stmt_type) {
+ case GDA_SQL_ANY_STMT_SELECT:
+ str = context->render_select (GDA_SQL_ANY_PART (sqlstmt->contents), context, error);
+ if (!str) goto err;
+ g_string_append (string, str);
+ g_free (str);
+ break;
+ case GDA_SQL_ANY_STMT_COMPOUND:
+ str = context->render_compound (GDA_SQL_ANY_PART (sqlstmt->contents), context, error);
+ if (!str) goto err;
+ g_string_append (string, str);
+ g_free (str);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ }
+
+ str = string->str;
+ g_string_free (string, FALSE);
+ return str;
+
+ err:
+ g_string_free (string, TRUE);
+ return NULL;
+}
+
+/* The difference with the default implementation is specific REGEXP rendering */
static gchar *
sqlite_render_operation (GdaSqlOperation *op, GdaSqlRenderingContext *context, GError **error)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]