libgda r3060 - in branches/V4-branch: . doc/C libgda libgda/sql-parser libgda/sqlite providers/postgres providers/skel-implementation/capi tests/parser
- From: vivien svn gnome org
- To: svn-commits-list gnome org
- Subject: libgda r3060 - in branches/V4-branch: . doc/C libgda libgda/sql-parser libgda/sqlite providers/postgres providers/skel-implementation/capi tests/parser
- Date: Sat, 23 Feb 2008 14:23:22 +0000 (GMT)
Author: vivien
Date: Sat Feb 23 14:23:22 2008
New Revision: 3060
URL: http://svn.gnome.org/viewvc/libgda?rev=3060&view=rev
Log:
2008-02-23 Vivien Malerba <malerba gnome-db org>
* doc/C/libgda-4.0-sections.txt:
* libgda/gda-set.[ch]: added gda_set_copy()
* providers/skel-implementation/capi/gda-capi-recordset.c: fixed compilation problem
* libgda/sqlite/gda-sqlite-provider.c:
* libgda/sql-parser/gda-statement-struct.c:
* libgda/sql-parser/parser.y:
* providers/postgres/parser.y:
* libgda/sql-parser/gda-statement-struct-parts.c:
* libgda/sql-parser/gda-statement-struct-parts.h:
* libgda/gda-statement.c:
* tests/parser/testdata.xml: fixed the SQL parser because "field NOT IN (...)" is not
the same as "NOT field IN (...)"
Modified:
branches/V4-branch/ChangeLog
branches/V4-branch/doc/C/libgda-4.0-sections.txt
branches/V4-branch/libgda/gda-set.c
branches/V4-branch/libgda/gda-set.h
branches/V4-branch/libgda/gda-statement.c
branches/V4-branch/libgda/sql-parser/gda-statement-struct-parts.c
branches/V4-branch/libgda/sql-parser/gda-statement-struct-parts.h
branches/V4-branch/libgda/sql-parser/gda-statement-struct.c
branches/V4-branch/libgda/sql-parser/parser.y
branches/V4-branch/libgda/sqlite/gda-sqlite-provider.c
branches/V4-branch/providers/postgres/parser.y
branches/V4-branch/providers/skel-implementation/capi/gda-capi-recordset.c
branches/V4-branch/tests/parser/testdata.xml
Modified: branches/V4-branch/doc/C/libgda-4.0-sections.txt
==============================================================================
--- branches/V4-branch/doc/C/libgda-4.0-sections.txt (original)
+++ branches/V4-branch/doc/C/libgda-4.0-sections.txt Sat Feb 23 14:23:22 2008
@@ -1108,6 +1108,7 @@
GdaSetGroup
GdaSetSource
gda_set_new
+gda_set_copy
gda_set_new_inline
gda_set_new_from_spec_string
gda_set_new_from_spec_node
Modified: branches/V4-branch/libgda/gda-set.c
==============================================================================
--- branches/V4-branch/libgda/gda-set.c (original)
+++ branches/V4-branch/libgda/gda-set.c Sat Feb 23 14:23:22 2008
@@ -286,6 +286,32 @@
}
/**
+ * gda_set_copy
+ * @set: a #GdaSet object
+ *
+ * Creates a new #GdaSet object, opy of @set
+ *
+ * Returns: a new #GdaSet object
+ */
+GdaSet *
+gda_set_copy (GdaSet *set)
+{
+ GdaSet *copy;
+ GSList *list, *holders = NULL;
+ g_return_val_if_fail (GDA_IS_SET (set), NULL);
+
+ for (list = set->holders; list; list = list->next)
+ holders = g_slist_prepend (holders, gda_holder_copy (GDA_HOLDER (list->data)));
+ holders = g_slist_reverse (holders);
+
+ copy = g_object_new (GDA_TYPE_SET, "holders", holders, NULL);
+ g_slist_foreach (holders, (GFunc) g_object_unref, NULL);
+ g_slist_free (holders);
+
+ return copy;
+}
+
+/**
* gda_set_new_inline
* @nb: the number of value holders which will be contained in the new #GdaSet
* @...: a serie of a (const gchar*) id, (GType) type, and value
Modified: branches/V4-branch/libgda/gda-set.h
==============================================================================
--- branches/V4-branch/libgda/gda-set.h (original)
+++ branches/V4-branch/libgda/gda-set.h Sat Feb 23 14:23:22 2008
@@ -132,6 +132,7 @@
GType gda_set_get_type (void) G_GNUC_CONST;
GdaSet *gda_set_new (GSList *holders);
+GdaSet *gda_set_copy (GdaSet *set);
GdaSet *gda_set_new_inline (gint nb, ...);
GdaSet *gda_set_new_from_spec_string (const gchar *xml_spec, GError **error);
Modified: branches/V4-branch/libgda/gda-statement.c
==============================================================================
--- branches/V4-branch/libgda/gda-statement.c (original)
+++ branches/V4-branch/libgda/gda-statement.c Sat Feb 23 14:23:22 2008
@@ -1503,14 +1503,26 @@
str = g_strdup_printf ("NOT %s", SQL_OPERAND (sql_list->data)->sql);
break;
case GDA_SQL_OPERATOR_IN:
+ case GDA_SQL_OPERATOR_NOTIN:
+ gboolean add_p = TRUE;
+ if (sql_list->next && !(sql_list->next->next) &&
+ *(SQL_OPERAND (sql_list->next->data)->sql)=='(')
+ add_p = FALSE;
+
string = g_string_new (SQL_OPERAND (sql_list->data)->sql);
- g_string_append (string, " IN (");
+ if (op->operator == GDA_SQL_OPERATOR_IN)
+ g_string_append (string, " IN ");
+ else
+ g_string_append (string, " NOT IN ");
+ if (add_p)
+ g_string_append_c (string, '(');
for (list = sql_list->next; list; list = list->next) {
if (list != sql_list->next)
g_string_append (string, ", ");
g_string_append (string, SQL_OPERAND (list->data)->sql);
}
- g_string_append_c (string, ')');
+ if (add_p)
+ g_string_append_c (string, ')');
str = string->str;
g_string_free (string, FALSE);
break;
Modified: branches/V4-branch/libgda/sql-parser/gda-statement-struct-parts.c
==============================================================================
--- branches/V4-branch/libgda/sql-parser/gda-statement-struct-parts.c (original)
+++ branches/V4-branch/libgda/sql-parser/gda-statement-struct-parts.c Sat Feb 23 14:23:22 2008
@@ -509,6 +509,8 @@
return "IS NOT NULL";
case GDA_SQL_OPERATOR_IN:
return "IN";
+ case GDA_SQL_OPERATOR_NOTIN:
+ return "NOT IN";
case GDA_SQL_OPERATOR_LIKE:
return "LIKE";
case GDA_SQL_OPERATOR_BETWEEN:
Modified: branches/V4-branch/libgda/sql-parser/gda-statement-struct-parts.h
==============================================================================
--- branches/V4-branch/libgda/sql-parser/gda-statement-struct-parts.h (original)
+++ branches/V4-branch/libgda/sql-parser/gda-statement-struct-parts.h Sat Feb 23 14:23:22 2008
@@ -141,6 +141,7 @@
GDA_SQL_OPERATOR_ISNOTNULL,
GDA_SQL_OPERATOR_NOT,
GDA_SQL_OPERATOR_IN,
+ GDA_SQL_OPERATOR_NOTIN,
GDA_SQL_OPERATOR_CONCAT,
GDA_SQL_OPERATOR_PLUS,
Modified: branches/V4-branch/libgda/sql-parser/gda-statement-struct.c
==============================================================================
--- branches/V4-branch/libgda/sql-parser/gda-statement-struct.c (original)
+++ branches/V4-branch/libgda/sql-parser/gda-statement-struct.c Sat Feb 23 14:23:22 2008
@@ -653,6 +653,7 @@
case GDA_SQL_OPERATOR_AND:
case GDA_SQL_OPERATOR_OR:
case GDA_SQL_OPERATOR_IN:
+ case GDA_SQL_OPERATOR_NOTIN:
case GDA_SQL_OPERATOR_CONCAT:
case GDA_SQL_OPERATOR_STAR:
if (g_slist_length (operation->operands) < 2) {
Modified: branches/V4-branch/libgda/sql-parser/parser.y
==============================================================================
--- branches/V4-branch/libgda/sql-parser/parser.y (original)
+++ branches/V4-branch/libgda/sql-parser/parser.y Sat Feb 23 14:23:22 2008
@@ -886,43 +886,27 @@
GDA_SQL_ANY_PART (R)->parent = GDA_SQL_ANY_PART (cond);
}
expr(E) ::= expr(R) NOT IN LP exprlist(L) RP. {GdaSqlOperation *cond;
- GdaSqlExpr *expr;
GSList *list;
- expr = gda_sql_expr_new (NULL);
- cond = gda_sql_operation_new (GDA_SQL_ANY_PART (expr));
- expr->cond = cond;
- cond->operator = GDA_SQL_OPERATOR_IN;
+ E = gda_sql_expr_new (NULL);
+ cond = gda_sql_operation_new (GDA_SQL_ANY_PART (E));
+ E->cond = cond;
+ cond->operator = GDA_SQL_OPERATOR_NOTIN;
cond->operands = g_slist_prepend (L, R);
for (list = cond->operands; list; list = list->next)
GDA_SQL_ANY_PART (list->data)->parent = GDA_SQL_ANY_PART (cond);
-
+}
+expr(E) ::= expr(R) NOT IN LP compound(S) RP. {GdaSqlOperation *cond;
+ GdaSqlExpr *expr;
E = gda_sql_expr_new (NULL);
cond = gda_sql_operation_new (GDA_SQL_ANY_PART (E));
E->cond = cond;
- cond->operator = GDA_SQL_OPERATOR_NOT;
+ cond->operator = GDA_SQL_OPERATOR_NOTIN;
+
+ expr = gda_sql_expr_new (GDA_SQL_ANY_PART (cond));
+ gda_sql_expr_take_select (expr, S);
cond->operands = g_slist_prepend (NULL, expr);
- GDA_SQL_ANY_PART (expr)->parent = GDA_SQL_ANY_PART (cond);
-}
-expr(E) ::= expr(R) NOT IN LP compound(S) RP. {GdaSqlOperation *cond;
- GdaSqlExpr *expr1, *expr2;
- expr1 = gda_sql_expr_new (NULL);
- cond = gda_sql_operation_new (GDA_SQL_ANY_PART (expr1));
- expr1->cond = cond;
- cond->operator = GDA_SQL_OPERATOR_IN;
-
- expr2 = gda_sql_expr_new (NULL);
- gda_sql_expr_take_select (expr2, S);
- cond->operands = g_slist_prepend (NULL, expr2);
- GDA_SQL_ANY_PART (expr2)->parent = GDA_SQL_ANY_PART (cond);
- cond->operands = g_slist_prepend (cond->operands, R);
- GDA_SQL_ANY_PART (R)->parent = GDA_SQL_ANY_PART (cond);
-
- E = gda_sql_expr_new (NULL);
- cond = gda_sql_operation_new (GDA_SQL_ANY_PART (E));
- E->cond = cond;
- cond->operator = GDA_SQL_OPERATOR_NOT;
- cond->operands = g_slist_prepend (NULL, expr1);
- GDA_SQL_ANY_PART (expr1)->parent = GDA_SQL_ANY_PART (cond);
+ cond->operands = g_slist_prepend (cond->operands, R);
+ GDA_SQL_ANY_PART (R)->parent = GDA_SQL_ANY_PART (cond);
}
expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
GdaSqlCase *sc;
Modified: branches/V4-branch/libgda/sqlite/gda-sqlite-provider.c
==============================================================================
--- branches/V4-branch/libgda/sqlite/gda-sqlite-provider.c (original)
+++ branches/V4-branch/libgda/sqlite/gda-sqlite-provider.c Sat Feb 23 14:23:22 2008
@@ -1319,17 +1319,30 @@
str = g_strdup_printf ("NOT %s", SQL_OPERAND (sql_list->data)->sql);
break;
case GDA_SQL_OPERATOR_IN:
+ case GDA_SQL_OPERATOR_NOTIN: {
+ gboolean add_p = TRUE;
+ if (sql_list->next && !(sql_list->next->next) &&
+ *(SQL_OPERAND (sql_list->next->data)->sql)=='(')
+ add_p = FALSE;
+
string = g_string_new (SQL_OPERAND (sql_list->data)->sql);
- g_string_append (string, " IN (");
+ if (op->operator == GDA_SQL_OPERATOR_IN)
+ g_string_append (string, " IN ");
+ else
+ g_string_append (string, " NOT IN ");
+ if (add_p)
+ g_string_append_c (string, '(');
for (list = sql_list->next; list; list = list->next) {
if (list != sql_list->next)
g_string_append (string, ", ");
g_string_append (string, SQL_OPERAND (list->data)->sql);
}
- g_string_append_c (string, ')');
+ if (add_p)
+ g_string_append_c (string, ')');
str = string->str;
g_string_free (string, FALSE);
break;
+ }
case GDA_SQL_OPERATOR_CONCAT:
multi_op = "||";
break;
@@ -1448,6 +1461,7 @@
goto out_err;
/* prepare statement */
+ g_print ("PREP1%s\n", sql);
status = sqlite3_prepare_v2 (cdata->connection, sql, -1, &sqlite_stmt, &left);
if (status != SQLITE_OK) {
g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_PREPARE_STMT_ERROR,
@@ -1555,6 +1569,7 @@
if (!sql)
return NULL;
+ g_print ("PREP2%s\n", sql);
status = sqlite3_prepare_v2 (cdata->connection, sql, -1, &sqlite_stmt, (const char**) &left);
if (status != SQLITE_OK) {
g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_PREPARE_STMT_ERROR,
Modified: branches/V4-branch/providers/postgres/parser.y
==============================================================================
--- branches/V4-branch/providers/postgres/parser.y (original)
+++ branches/V4-branch/providers/postgres/parser.y Sat Feb 23 14:23:22 2008
@@ -887,43 +887,27 @@
GDA_SQL_ANY_PART (R)->parent = GDA_SQL_ANY_PART (cond);
}
expr(E) ::= expr(R) NOT IN LP exprlist(L) RP. {GdaSqlOperation *cond;
- GdaSqlExpr *expr;
GSList *list;
- expr = gda_sql_expr_new (NULL);
- cond = gda_sql_operation_new (GDA_SQL_ANY_PART (expr));
- expr->cond = cond;
- cond->operator = GDA_SQL_OPERATOR_IN;
+ E = gda_sql_expr_new (NULL);
+ cond = gda_sql_operation_new (GDA_SQL_ANY_PART (E));
+ E->cond = cond;
+ cond->operator = GDA_SQL_OPERATOR_NOTIN;
cond->operands = g_slist_prepend (L, R);
for (list = cond->operands; list; list = list->next)
GDA_SQL_ANY_PART (list->data)->parent = GDA_SQL_ANY_PART (cond);
-
+}
+expr(E) ::= expr(R) NOT IN LP compound(S) RP. {GdaSqlOperation *cond;
+ GdaSqlExpr *expr;
E = gda_sql_expr_new (NULL);
cond = gda_sql_operation_new (GDA_SQL_ANY_PART (E));
E->cond = cond;
- cond->operator = GDA_SQL_OPERATOR_NOT;
+ cond->operator = GDA_SQL_OPERATOR_NOTIN;
+
+ expr = gda_sql_expr_new (GDA_SQL_ANY_PART (cond));
+ gda_sql_expr_take_select (expr, S);
cond->operands = g_slist_prepend (NULL, expr);
- GDA_SQL_ANY_PART (expr)->parent = GDA_SQL_ANY_PART (cond);
-}
-expr(E) ::= expr(R) NOT IN LP compound(S) RP. {GdaSqlOperation *cond;
- GdaSqlExpr *expr1, *expr2;
- expr1 = gda_sql_expr_new (NULL);
- cond = gda_sql_operation_new (GDA_SQL_ANY_PART (expr1));
- expr1->cond = cond;
- cond->operator = GDA_SQL_OPERATOR_IN;
-
- expr2 = gda_sql_expr_new (NULL);
- gda_sql_expr_take_select (expr2, S);
- cond->operands = g_slist_prepend (NULL, expr2);
- GDA_SQL_ANY_PART (expr2)->parent = GDA_SQL_ANY_PART (cond);
- cond->operands = g_slist_prepend (cond->operands, R);
- GDA_SQL_ANY_PART (R)->parent = GDA_SQL_ANY_PART (cond);
-
- E = gda_sql_expr_new (NULL);
- cond = gda_sql_operation_new (GDA_SQL_ANY_PART (E));
- E->cond = cond;
- cond->operator = GDA_SQL_OPERATOR_NOT;
- cond->operands = g_slist_prepend (NULL, expr1);
- GDA_SQL_ANY_PART (expr1)->parent = GDA_SQL_ANY_PART (cond);
+ cond->operands = g_slist_prepend (cond->operands, R);
+ GDA_SQL_ANY_PART (R)->parent = GDA_SQL_ANY_PART (cond);
}
expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
GdaSqlCase *sc;
Modified: branches/V4-branch/providers/skel-implementation/capi/gda-capi-recordset.c
==============================================================================
--- branches/V4-branch/providers/skel-implementation/capi/gda-capi-recordset.c (original)
+++ branches/V4-branch/providers/skel-implementation/capi/gda-capi-recordset.c Sat Feb 23 14:23:22 2008
@@ -261,6 +261,7 @@
gda_capi_recordset_store_all (GdaPModel *model, GError **error)
{
GdaCapiRecordset *imodel;
+ gint i;
imodel = GDA_CAPI_RECORDSET (model);
Modified: branches/V4-branch/tests/parser/testdata.xml
==============================================================================
--- branches/V4-branch/tests/parser/testdata.xml (original)
+++ branches/V4-branch/tests/parser/testdata.xml Sat Feb 23 14:23:22 2008
@@ -946,12 +946,12 @@
<test id="2246">
<sql>select a not in (SELECT name from cust);</sql>
- <expected>{"statements":[{"statement":{"sql":"select a not in (SELECT name from cust);","stmt_type":"SELECT","contents":{"distinct":"false","fields":[{"expr":{"operation":{"operator":"NOT","operand0":{"operation":{"operator":"IN","operand0":{"value":"a"},"operand1":{"select":{"contents":{"distinct":"false","fields":[{"expr":{"value":"name"},"field_name":"name"}],"from":{"targets":[{"expr":{"value":"cust"},"table_name":"cust"}]}}}}}}}}}]}}}]}</expected>
+ <expected>{"statements":[{"statement":{"sql":"select a not in (SELECT name from cust);","stmt_type":"SELECT","contents":{"distinct":"false","fields":[{"expr":{"operation":{"operator":"NOT IN","operand0":{"value":"a"},"operand1":{"select":{"contents":{"distinct":"false","fields":[{"expr":{"value":"name"},"field_name":"name"}],"from":{"targets":[{"expr":{"value":"cust"},"table_name":"cust"}]}}}}}}}]}}}]}</expected>
</test>
<test id="2247">
<sql>select a not in (1, 2, 3, '007')</sql>
- <expected>{"statements":[{"statement":{"sql":"select a not in (1, 2, 3, '007')","stmt_type":"SELECT","contents":{"distinct":"false","fields":[{"expr":{"operation":{"operator":"NOT","operand0":{"operation":{"operator":"IN","operand0":{"value":"a"},"operand1":{"value":"1"},"operand2":{"value":"2"},"operand3":{"value":"3"},"operand4":{"value":"'007'"}}}}}}]}}}]}</expected>
+ <expected>{"statements":[{"statement":{"sql":"select a not in (1, 2, 3, '007')","stmt_type":"SELECT","contents":{"distinct":"false","fields":[{"expr":{"operation":{"operator":"NOT IN","operand0":{"value":"a"},"operand1":{"value":"1"},"operand2":{"value":"2"},"operand3":{"value":"3"},"operand4":{"value":"'007'"}}}}]}}}]}</expected>
</test>
<test id="2248">
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]