libgda r3060 - in branches/V4-branch: . doc/C libgda libgda/sql-parser libgda/sqlite providers/postgres providers/skel-implementation/capi tests/parser



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]