libgda r3340 - in trunk: . libgda libgda/sql-parser libgda/sqlite tests/parser tests/parser/scripts tools



Author: vivien
Date: Mon Mar  2 20:08:39 2009
New Revision: 3340
URL: http://svn.gnome.org/viewvc/libgda?rev=3340&view=rev

Log:
2009-03-02  Vivien Malerba <malerba gnome-db org>

	* tools/gda-sql.c:
	  - corrected the "\i" command
	  - corrected multi line commands handling
	* tools/gda-threader.c: removed unnecessary warning
	* tests/parser: added a new test which checks the parsing of whole script files
	* libgda/sql-parser/gda-sql-parser.c: consider a single '#' to be the start of a comment
	up to the end of the line for MySQL
	* libgda/libgda.symbols: added missing symbols (gda_data_model_error_get_type and
	gda_utility_data_model_find_column_description), and other corrections
	* libgda/sqlite/: renamed symbols which are not supposed to be exported


Added:
   trunk/tests/parser/check_script.c
   trunk/tests/parser/scripts/
   trunk/tests/parser/scripts/mysql_employees.sql
   trunk/tests/parser/scripts/mysql_employees_partitioned.sql
   trunk/tests/parser/testscripts.xml
Modified:
   trunk/ChangeLog
   trunk/libgda/libgda.symbols
   trunk/libgda/sql-parser/gda-sql-parser.c
   trunk/libgda/sqlite/gda-sqlite-blob-op.c
   trunk/libgda/sqlite/gda-sqlite-blob-op.h
   trunk/libgda/sqlite/gda-sqlite-ddl.c
   trunk/libgda/sqlite/gda-sqlite-ddl.h
   trunk/libgda/sqlite/gda-sqlite-handler-bin.c
   trunk/libgda/sqlite/gda-sqlite-handler-bin.h
   trunk/libgda/sqlite/gda-sqlite-provider.c
   trunk/libgda/sqlite/gda-sqlite-pstmt.c
   trunk/libgda/sqlite/gda-sqlite-pstmt.h
   trunk/libgda/sqlite/gda-sqlite-recordset.c
   trunk/libgda/sqlite/gda-sqlite-recordset.h
   trunk/tests/parser/   (props changed)
   trunk/tests/parser/Makefile.am
   trunk/tools/gda-sql.c
   trunk/tools/gda-threader.c

Modified: trunk/libgda/libgda.symbols
==============================================================================
--- trunk/libgda/libgda.symbols	(original)
+++ trunk/libgda/libgda.symbols	Mon Mar  2 20:08:39 2009
@@ -64,6 +64,7 @@
 	gda_column_set_position
 	gda_completion_list_get
 	gda_compute_dml_statements
+	gda_compute_select_statement_from_update
 	gda_compute_unique_table_row_condition
 	gda_config_can_modify_system_config
 	gda_config_define_dsn
@@ -202,6 +203,7 @@
 	gda_data_model_dsn_list_get_type
 	gda_data_model_dump
 	gda_data_model_dump_as_string
+	gda_data_model_error_get_type
 	gda_data_model_error_quark
 	gda_data_model_export_to_file
 	gda_data_model_export_to_string
@@ -238,12 +240,12 @@
 	gda_data_model_iter_get_value_for_field
 	gda_data_model_iter_invalidate_contents
 	gda_data_model_iter_is_valid
-	gda_data_model_iter_move_to_row
-	gda_data_model_iter_move_to_row_default
 	gda_data_model_iter_move_next
 	gda_data_model_iter_move_next_default
 	gda_data_model_iter_move_prev
 	gda_data_model_iter_move_prev_default
+	gda_data_model_iter_move_to_row
+	gda_data_model_iter_move_to_row_default
 	gda_data_model_iter_set_value_at
 	gda_data_model_remove_row
 	gda_data_model_reset
@@ -577,21 +579,7 @@
 	gda_sql_identifier_needs_quotes
 	gda_sql_identifier_remove_quotes
 	gda_sql_identifier_split
-	gda_sqlite_handler_bin_get_type
-	gda_sqlite_handler_bin_new
 	gda_sqlite_provider_get_type
-	gda_sqlite_pstmt_get_type
-	gda_sqlite_pstmt_new
-	gda_sqlite_recordset_get_type
-	gda_sqlite_recordset_new
-	gda_sqlite_render_ADD_COLUMN
-	gda_sqlite_render_CREATE_INDEX
-	gda_sqlite_render_CREATE_TABLE
-	gda_sqlite_render_CREATE_VIEW
-	gda_sqlite_render_DROP_INDEX
-	gda_sqlite_render_DROP_TABLE
-	gda_sqlite_render_DROP_VIEW
-	gda_sqlite_render_RENAME_TABLE
 	gda_sql_operation_copy
 	gda_sql_operation_free
 	gda_sql_operation_new
@@ -739,6 +727,7 @@
 	gda_ushort_get_type
 	gda_utility_check_data_model
 	gda_utility_data_model_dump_data_to_xml
+	gda_utility_data_model_find_column_description
 	gda_utility_holder_load_attributes
 	gda_value_attribute_get_type
 	gda_value_compare

Modified: trunk/libgda/sql-parser/gda-sql-parser.c
==============================================================================
--- trunk/libgda/sql-parser/gda-sql-parser.c	(original)
+++ trunk/libgda/sql-parser/gda-sql-parser.c	Mon Mar  2 20:08:39 2009
@@ -1304,6 +1304,7 @@
 		break;
 	case '#': {
 		if (z[1] == '#') {
+			/* parameter */
 			for (i=2; (z[i]) && 
 				     (IdChar (z[i]) || (z[i] == '+') || (z[i] == '-') || (z[i] == '.') || (z[i] == ':') || 
 				      (z[i] == '|') || (z[i] == '@') || (z[i] == '?')) &&
@@ -1318,8 +1319,16 @@
 				parser->priv->context->token_type = L_UNSPECVAL;
 			consumed_chars = i;
 		}
-		else
-			parser->priv->context->token_type = L_ILLEGAL;
+		else {
+			if (parser->priv->flavour == GDA_SQL_PARSER_FLAVOUR_MYSQL) {
+				/* comment */
+				for (i=1;  (c=z[i])!=0 && c!='\n'; i++){}
+				parser->priv->context->token_type = L_SQLCOMMENT;
+				consumed_chars = i;
+			}
+			else
+				parser->priv->context->token_type = L_ILLEGAL;
+		}
 		break;
 	}
 	case '$':

Modified: trunk/libgda/sqlite/gda-sqlite-blob-op.c
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-blob-op.c	(original)
+++ trunk/libgda/sqlite/gda-sqlite-blob-op.c	Mon Mar  2 20:08:39 2009
@@ -46,7 +46,7 @@
  * Object init and finalize
  */
 GType
-gda_sqlite_blob_op_get_type (void)
+_gda_sqlite_blob_op_get_type (void)
 {
 	static GType type = 0;
 
@@ -111,7 +111,7 @@
 }
 
 GdaBlobOp *
-gda_sqlite_blob_op_new (SqliteConnectionData *cdata, const gchar *db_name, const gchar *table_name,
+_gda_sqlite_blob_op_new (SqliteConnectionData *cdata, const gchar *db_name, const gchar *table_name,
 			const gchar *column_name, sqlite3_int64 rowid)
 {
 	GdaSqliteBlobOp *bop = NULL;

Modified: trunk/libgda/sqlite/gda-sqlite-blob-op.h
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-blob-op.h	(original)
+++ trunk/libgda/sqlite/gda-sqlite-blob-op.h	Mon Mar  2 20:08:39 2009
@@ -27,7 +27,7 @@
 
 G_BEGIN_DECLS
 
-#define GDA_TYPE_SQLITE_BLOB_OP            (gda_sqlite_blob_op_get_type())
+#define GDA_TYPE_SQLITE_BLOB_OP            (_gda_sqlite_blob_op_get_type())
 #define GDA_SQLITE_BLOB_OP(obj)            (G_TYPE_CHECK_INSTANCE_CAST (obj, GDA_TYPE_SQLITE_BLOB_OP, GdaSqliteBlobOp))
 #define GDA_SQLITE_BLOB_OP_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST (klass, GDA_TYPE_SQLITE_BLOB_OP, GdaSqliteBlobOpClass))
 #define GDA_IS_SQLITE_BLOB_OP(obj)         (G_TYPE_CHECK_INSTANCE_TYPE (obj, GDA_TYPE_SQLITE_BLOB_OP))
@@ -46,8 +46,8 @@
 	GdaBlobOpClass        parent_class;
 };
 
-GType         gda_sqlite_blob_op_get_type     (void) G_GNUC_CONST;
-GdaBlobOp    *gda_sqlite_blob_op_new          (SqliteConnectionData *cdata, const gchar *db_name, const gchar *table_name,
+GType         _gda_sqlite_blob_op_get_type     (void) G_GNUC_CONST;
+GdaBlobOp    *_gda_sqlite_blob_op_new          (SqliteConnectionData *cdata, const gchar *db_name, const gchar *table_name,
 					       const gchar *column_name, sqlite3_int64 rowid);
 
 G_END_DECLS

Modified: trunk/libgda/sqlite/gda-sqlite-ddl.c
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-ddl.c	(original)
+++ trunk/libgda/sqlite/gda-sqlite-ddl.c	Mon Mar  2 20:08:39 2009
@@ -27,7 +27,7 @@
 
 
 gchar *
-gda_sqlite_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
+_gda_sqlite_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
 			       GdaServerOperation *op, GError **error)
 {
 	GString *string;
@@ -225,7 +225,7 @@
 }
 
 gchar *
-gda_sqlite_render_DROP_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
+_gda_sqlite_render_DROP_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
 			     GdaServerOperation *op, GError **error)
 {
 	GString *string;
@@ -251,7 +251,7 @@
 }
 
 gchar *
-gda_sqlite_render_RENAME_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
+_gda_sqlite_render_RENAME_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
 				GdaServerOperation *op, GError **error)
 {
 	GString *string;
@@ -277,7 +277,7 @@
 }
 
 gchar *
-gda_sqlite_render_ADD_COLUMN (GdaServerProvider *provider, GdaConnection *cnc, 
+_gda_sqlite_render_ADD_COLUMN (GdaServerProvider *provider, GdaConnection *cnc, 
 			      GdaServerOperation *op, GError **error)
 {
 	GString *string;
@@ -345,7 +345,7 @@
 
 
 gchar *
-gda_sqlite_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cnc, 
+_gda_sqlite_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cnc, 
 			       GdaServerOperation *op, GError **error)
 {
 	GString *string;
@@ -424,7 +424,7 @@
 }
 
 gchar *
-gda_sqlite_render_DROP_INDEX (GdaServerProvider *provider, GdaConnection *cnc, 
+_gda_sqlite_render_DROP_INDEX (GdaServerProvider *provider, GdaConnection *cnc, 
 			     GdaServerOperation *op, GError **error)
 {
 	GString *string;
@@ -449,7 +449,7 @@
 }
 
 gchar *
-gda_sqlite_render_CREATE_VIEW (GdaServerProvider *provider, GdaConnection *cnc, 
+_gda_sqlite_render_CREATE_VIEW (GdaServerProvider *provider, GdaConnection *cnc, 
 			       GdaServerOperation *op, GError **error)
 {
 	GString *string;
@@ -493,7 +493,7 @@
 }
 	
 gchar *
-gda_sqlite_render_DROP_VIEW (GdaServerProvider *provider, GdaConnection *cnc, 
+_gda_sqlite_render_DROP_VIEW (GdaServerProvider *provider, GdaConnection *cnc, 
 			     GdaServerOperation *op, GError **error)
 {
 	GString *string;

Modified: trunk/libgda/sqlite/gda-sqlite-ddl.h
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-ddl.h	(original)
+++ trunk/libgda/sqlite/gda-sqlite-ddl.h	Mon Mar  2 20:08:39 2009
@@ -26,21 +26,21 @@
 
 G_BEGIN_DECLS
 
-gchar *gda_sqlite_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
+gchar *_gda_sqlite_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
 				       GdaServerOperation *op, GError **error);
-gchar *gda_sqlite_render_DROP_TABLE   (GdaServerProvider *provider, GdaConnection *cnc, 
+gchar *_gda_sqlite_render_DROP_TABLE   (GdaServerProvider *provider, GdaConnection *cnc, 
 				       GdaServerOperation *op, GError **error);
-gchar *gda_sqlite_render_RENAME_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
+gchar *_gda_sqlite_render_RENAME_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
 				       GdaServerOperation *op, GError **error);
-gchar *gda_sqlite_render_ADD_COLUMN  (GdaServerProvider *provider, GdaConnection *cnc, 
+gchar *_gda_sqlite_render_ADD_COLUMN  (GdaServerProvider *provider, GdaConnection *cnc, 
 				      GdaServerOperation *op, GError **error);
-gchar *gda_sqlite_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cnc, 
+gchar *_gda_sqlite_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cnc, 
 				       GdaServerOperation *op, GError **error);
-gchar *gda_sqlite_render_DROP_INDEX   (GdaServerProvider *provider, GdaConnection *cnc, 
+gchar *_gda_sqlite_render_DROP_INDEX   (GdaServerProvider *provider, GdaConnection *cnc, 
 				       GdaServerOperation *op, GError **error);
-gchar *gda_sqlite_render_CREATE_VIEW  (GdaServerProvider *provider, GdaConnection *cnc, 
+gchar *_gda_sqlite_render_CREATE_VIEW  (GdaServerProvider *provider, GdaConnection *cnc, 
 				       GdaServerOperation *op, GError **error);
-gchar *gda_sqlite_render_DROP_VIEW    (GdaServerProvider *provider, GdaConnection *cnc, 
+gchar *_gda_sqlite_render_DROP_VIEW    (GdaServerProvider *provider, GdaConnection *cnc, 
 				       GdaServerOperation *op, GError **error);
 
 G_END_DECLS

Modified: trunk/libgda/sqlite/gda-sqlite-handler-bin.c
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-handler-bin.c	(original)
+++ trunk/libgda/sqlite/gda-sqlite-handler-bin.c	Mon Mar  2 20:08:39 2009
@@ -50,7 +50,7 @@
 static GObjectClass *parent_class = NULL;
 
 GType
-gda_sqlite_handler_bin_get_type (void)
+_gda_sqlite_handler_bin_get_type (void)
 {
 	static GType type = 0;
 
@@ -144,14 +144,14 @@
 }
 
 /**
- * gda_sqlite_handler_bin_new
+ * _gda_sqlite_handler_bin_new
  *
  * Creates a data handler for binary values
  *
  * Returns: the new object
  */
 GdaDataHandler *
-gda_sqlite_handler_bin_new (void)
+_gda_sqlite_handler_bin_new (void)
 {
 	GObject *obj;
 

Modified: trunk/libgda/sqlite/gda-sqlite-handler-bin.h
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-handler-bin.h	(original)
+++ trunk/libgda/sqlite/gda-sqlite-handler-bin.h	Mon Mar  2 20:08:39 2009
@@ -25,10 +25,10 @@
 
 G_BEGIN_DECLS
 
-#define GDA_TYPE_SQLITE_HANDLER_BIN          (gda_sqlite_handler_bin_get_type())
-#define GDA_SQLITE_HANDLER_BIN(obj)          G_TYPE_CHECK_INSTANCE_CAST (obj, gda_sqlite_handler_bin_get_type(), GdaSqliteHandlerBin)
-#define GDA_SQLITE_HANDLER_BIN_CLASS(klass)  G_TYPE_CHECK_CLASS_CAST (klass, gda_sqlite_handler_bin_get_type (), GdaSqliteHandlerBinClass)
-#define GDA_IS_SQLITE_HANDLER_BIN(obj)       G_TYPE_CHECK_INSTANCE_TYPE (obj, gda_sqlite_handler_bin_get_type ())
+#define GDA_TYPE_SQLITE_HANDLER_BIN          (_gda_sqlite_handler_bin_get_type())
+#define GDA_SQLITE_HANDLER_BIN(obj)          G_TYPE_CHECK_INSTANCE_CAST (obj, _gda_sqlite_handler_bin_get_type(), GdaSqliteHandlerBin)
+#define GDA_SQLITE_HANDLER_BIN_CLASS(klass)  G_TYPE_CHECK_CLASS_CAST (klass, _gda_sqlite_handler_bin_get_type (), GdaSqliteHandlerBinClass)
+#define GDA_IS_SQLITE_HANDLER_BIN(obj)       G_TYPE_CHECK_INSTANCE_TYPE (obj, _gda_sqlite_handler_bin_get_type ())
 
 
 typedef struct _GdaSqliteHandlerBin      GdaSqliteHandlerBin;
@@ -51,8 +51,8 @@
 };
 
 
-GType           gda_sqlite_handler_bin_get_type      (void) G_GNUC_CONST;
-GdaDataHandler *gda_sqlite_handler_bin_new           (void);
+GType           _gda_sqlite_handler_bin_get_type      (void) G_GNUC_CONST;
+GdaDataHandler *_gda_sqlite_handler_bin_new           (void);
 
 G_END_DECLS
 

Modified: trunk/libgda/sqlite/gda-sqlite-provider.c
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-provider.c	(original)
+++ trunk/libgda/sqlite/gda-sqlite-provider.c	Mon Mar  2 20:08:39 2009
@@ -1007,28 +1007,28 @@
 		sql = NULL;
                 break;
         case GDA_SERVER_OPERATION_CREATE_TABLE:
-                sql = gda_sqlite_render_CREATE_TABLE (provider, cnc, op, error);
+                sql = _gda_sqlite_render_CREATE_TABLE (provider, cnc, op, error);
                 break;
         case GDA_SERVER_OPERATION_DROP_TABLE:
-                sql = gda_sqlite_render_DROP_TABLE (provider, cnc, op, error);
+                sql = _gda_sqlite_render_DROP_TABLE (provider, cnc, op, error);
                 break;
         case GDA_SERVER_OPERATION_RENAME_TABLE:
-                sql = gda_sqlite_render_RENAME_TABLE (provider, cnc, op, error);
+                sql = _gda_sqlite_render_RENAME_TABLE (provider, cnc, op, error);
                 break;
         case GDA_SERVER_OPERATION_ADD_COLUMN:
-                sql = gda_sqlite_render_ADD_COLUMN (provider, cnc, op, error);
+                sql = _gda_sqlite_render_ADD_COLUMN (provider, cnc, op, error);
                 break;
         case GDA_SERVER_OPERATION_CREATE_INDEX:
-                sql = gda_sqlite_render_CREATE_INDEX (provider, cnc, op, error);
+                sql = _gda_sqlite_render_CREATE_INDEX (provider, cnc, op, error);
                 break;
         case GDA_SERVER_OPERATION_DROP_INDEX:
-                sql = gda_sqlite_render_DROP_INDEX (provider, cnc, op, error);
+                sql = _gda_sqlite_render_DROP_INDEX (provider, cnc, op, error);
                 break;
         case GDA_SERVER_OPERATION_CREATE_VIEW:
-                sql = gda_sqlite_render_CREATE_VIEW (provider, cnc, op, error);
+                sql = _gda_sqlite_render_CREATE_VIEW (provider, cnc, op, error);
                 break;
         case GDA_SERVER_OPERATION_DROP_VIEW:
-                sql = gda_sqlite_render_DROP_VIEW (provider, cnc, op, error);
+                sql = _gda_sqlite_render_DROP_VIEW (provider, cnc, op, error);
                 break;
 
         default:
@@ -1284,7 +1284,7 @@
 	else if (type == GDA_TYPE_BINARY) {
 		dh = gda_server_provider_handler_find (provider, cnc, type, NULL);
 		if (!dh) {
-			dh = gda_sqlite_handler_bin_new ();
+			dh = _gda_sqlite_handler_bin_new ();
 			if (dh) {
 				gda_server_provider_handler_declare (provider, dh, cnc, GDA_TYPE_BINARY, NULL);
 				g_object_unref (dh);
@@ -1888,7 +1888,7 @@
 		g_object_unref (params);
 
 	/* create a prepared statement object */
-	ps = gda_sqlite_pstmt_new (sqlite_stmt);
+	ps = _gda_sqlite_pstmt_new (sqlite_stmt);
 	gda_pstmt_set_gda_statement (_GDA_PSTMT (ps), stmt);
 	_GDA_PSTMT (ps)->param_ids = param_ids;
 	_GDA_PSTMT (ps)->sql = sql;
@@ -2108,7 +2108,7 @@
 		if (rowid >= 0) {
 			/*g_print ("Filling BLOB @ %s.%s.%s, rowID %ld\n", pb->db, pb->table, pb->column, rowid);*/
 			GdaSqliteBlobOp *bop;
-			bop = (GdaSqliteBlobOp*) gda_sqlite_blob_op_new (cdata, pb->db, pb->table, pb->column, rowid);
+			bop = (GdaSqliteBlobOp*) _gda_sqlite_blob_op_new (cdata, pb->db, pb->table, pb->column, rowid);
 			if (!bop) {
 				str =  _("Can't create SQLite BLOB handle");
 				goto blobs_out;
@@ -2132,7 +2132,7 @@
 				}
 				rowid = g_value_get_int64 (cvalue);
 				GdaSqliteBlobOp *bop;
-				bop = (GdaSqliteBlobOp*) gda_sqlite_blob_op_new (cdata, pb->db, pb->table, pb->column, rowid);
+				bop = (GdaSqliteBlobOp*) _gda_sqlite_blob_op_new (cdata, pb->db, pb->table, pb->column, rowid);
 				if (!bop) {
 					str =  _("Can't create SQLite BLOB handle");
 					g_object_unref (model);
@@ -2268,7 +2268,7 @@
 			}
 
 			/* create a SQLitePreparedStatement */
-			ps = gda_sqlite_pstmt_new (sqlite_stmt);
+			ps = _gda_sqlite_pstmt_new (sqlite_stmt);
 			_GDA_PSTMT (ps)->sql = sql;
 
 			new_ps = TRUE;
@@ -2551,7 +2551,7 @@
 		else
 			flags = GDA_DATA_MODEL_ACCESS_CURSOR_FORWARD;
 
-                data_model = (GObject *) gda_sqlite_recordset_new (cnc, ps, params, flags, col_types, empty_rs);
+                data_model = (GObject *) _gda_sqlite_recordset_new (cnc, ps, params, flags, col_types, empty_rs);
 		gda_connection_internal_statement_executed (cnc, stmt, params, NULL);
 		if (new_ps)
 			g_object_unref (ps);

Modified: trunk/libgda/sqlite/gda-sqlite-pstmt.c
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-pstmt.c	(original)
+++ trunk/libgda/sqlite/gda-sqlite-pstmt.c	Mon Mar  2 20:08:39 2009
@@ -31,12 +31,12 @@
 static GObjectClass *parent_class = NULL;
 
 /**
- * gda_sqlite_pstmt_get_type
+ * _gda_sqlite_pstmt_get_type
  *
  * Returns: the #GType of GdaSqlitePStmt.
  */
 GType
-gda_sqlite_pstmt_get_type (void)
+_gda_sqlite_pstmt_get_type (void)
 {
 	static GType type = 0;
 
@@ -101,7 +101,7 @@
 }
 
 GdaSqlitePStmt *
-gda_sqlite_pstmt_new (sqlite3_stmt *sqlite_stmt)
+_gda_sqlite_pstmt_new (sqlite3_stmt *sqlite_stmt)
 {
 	GdaSqlitePStmt *pstmt;
 

Modified: trunk/libgda/sqlite/gda-sqlite-pstmt.h
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-pstmt.h	(original)
+++ trunk/libgda/sqlite/gda-sqlite-pstmt.h	Mon Mar  2 20:08:39 2009
@@ -32,7 +32,7 @@
 
 G_BEGIN_DECLS
 
-#define GDA_TYPE_SQLITE_PSTMT            (gda_sqlite_pstmt_get_type())
+#define GDA_TYPE_SQLITE_PSTMT            (_gda_sqlite_pstmt_get_type())
 #define GDA_SQLITE_PSTMT(obj)            (G_TYPE_CHECK_INSTANCE_CAST (obj, GDA_TYPE_PSTMT, GdaSqlitePStmt))
 #define GDA_SQLITE_PSTMT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST (klass, GDA_TYPE_PSTMT, GdaSqlitePStmtClass))
 #define GDA_IS_SQLITE_PSTMT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE(obj, GDA_TYPE_PSTMT))
@@ -55,8 +55,8 @@
 	GdaPStmtClass  parent_class;
 };
 
-GType           gda_sqlite_pstmt_get_type  (void) G_GNUC_CONST;
-GdaSqlitePStmt *gda_sqlite_pstmt_new       (sqlite3_stmt *sqlite_stmt);
+GType           _gda_sqlite_pstmt_get_type  (void) G_GNUC_CONST;
+GdaSqlitePStmt *_gda_sqlite_pstmt_new       (sqlite3_stmt *sqlite_stmt);
 
 G_END_DECLS
 

Modified: trunk/libgda/sqlite/gda-sqlite-recordset.c
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-recordset.c	(original)
+++ trunk/libgda/sqlite/gda-sqlite-recordset.c	Mon Mar  2 20:08:39 2009
@@ -108,7 +108,7 @@
  */
 
 GType
-gda_sqlite_recordset_get_type (void)
+_gda_sqlite_recordset_get_type (void)
 {
 	static GType type = 0;
 
@@ -184,7 +184,7 @@
  * this function
  */
 GdaDataModel *
-gda_sqlite_recordset_new (GdaConnection *cnc, GdaSqlitePStmt *ps, GdaSet *exec_params,
+_gda_sqlite_recordset_new (GdaConnection *cnc, GdaSqlitePStmt *ps, GdaSet *exec_params,
 			  GdaDataModelAccessFlags flags, GType *col_types, gboolean force_empty)
 {
 	GdaSqliteRecordset *model;
@@ -420,7 +420,7 @@
 						gint64 rowid;
 						rowid = sqlite3_column_int64 (ps->sqlite_stmt, oidcol - 1); /* remove 1
 													       because it was added in the first place */
-						bop = gda_sqlite_blob_op_new (cdata,
+						bop = _gda_sqlite_blob_op_new (cdata,
 									      sqlite3_column_database_name (ps->sqlite_stmt, 
 													    real_col),
 									      sqlite3_column_table_name (ps->sqlite_stmt,

Modified: trunk/libgda/sqlite/gda-sqlite-recordset.h
==============================================================================
--- trunk/libgda/sqlite/gda-sqlite-recordset.h	(original)
+++ trunk/libgda/sqlite/gda-sqlite-recordset.h	Mon Mar  2 20:08:39 2009
@@ -32,7 +32,7 @@
 
 G_BEGIN_DECLS
 
-#define GDA_TYPE_SQLITE_RECORDSET            (gda_sqlite_recordset_get_type())
+#define GDA_TYPE_SQLITE_RECORDSET            (_gda_sqlite_recordset_get_type())
 #define GDA_SQLITE_RECORDSET(obj)            (G_TYPE_CHECK_INSTANCE_CAST (obj, GDA_TYPE_SQLITE_RECORDSET, GdaSqliteRecordset))
 #define GDA_SQLITE_RECORDSET_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST (klass, GDA_TYPE_SQLITE_RECORDSET, GdaSqliteRecordsetClass))
 #define GDA_IS_SQLITE_RECORDSET(obj)         (G_TYPE_CHECK_INSTANCE_TYPE (obj, GDA_TYPE_SQLITE_RECORDSET))
@@ -51,8 +51,8 @@
 	GdaDataSelectClass             parent_class;
 };
 
-GType         gda_sqlite_recordset_get_type  (void) G_GNUC_CONST;
-GdaDataModel *gda_sqlite_recordset_new       (GdaConnection *cnc, GdaSqlitePStmt *ps, GdaSet *exec_params,
+GType         _gda_sqlite_recordset_get_type  (void) G_GNUC_CONST;
+GdaDataModel *_gda_sqlite_recordset_new       (GdaConnection *cnc, GdaSqlitePStmt *ps, GdaSet *exec_params,
 					      GdaDataModelAccessFlags flags, GType *col_types, 
 					      gboolean force_empty);
 

Modified: trunk/tests/parser/Makefile.am
==============================================================================
--- trunk/tests/parser/Makefile.am	(original)
+++ trunk/tests/parser/Makefile.am	Mon Mar  2 20:08:39 2009
@@ -7,8 +7,8 @@
 	-DTOP_BUILD_DIR=\""$(top_builddir)"\" \
 	-DTOP_SRC_DIR=\""$(top_srcdir)"\"
 
-TESTS = check_parser check_validation check_normalization check_dml_comp
-check_PROGRAMS = check_parser check_validation check_normalization check_dml_comp
+TESTS = check_parser check_validation check_normalization check_dml_comp check_script
+check_PROGRAMS = check_parser check_validation check_normalization check_dml_comp check_script
 
 check_parser_SOURCES = check_parser.c
 check_parser_LDADD = \
@@ -30,4 +30,11 @@
 	$(top_builddir)/libgda/libgda-4.0.la \
 	$(LIBGDA_LIBS)
 
-EXTRA_DIST = testdata.xml testvalid.xml
+check_script_SOURCES = check_script.c
+check_script_LDADD = \
+	$(top_builddir)/libgda/libgda-4.0.la \
+	$(LIBGDA_LIBS)
+
+EXTRA_DIST = testdata.xml testvalid.xml testscripts.xml \
+	scripts/mysql_employees.sql \
+	scripts/mysql_employees_partitioned.sql

Added: trunk/tests/parser/check_script.c
==============================================================================
--- (empty file)
+++ trunk/tests/parser/check_script.c	Mon Mar  2 20:08:39 2009
@@ -0,0 +1,219 @@
+#include <stdio.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <string.h>
+#include <gmodule.h>
+#include <libgda/libgda.h>
+#include <sql-parser/gda-sql-parser.h>
+
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+static GdaSqlParser *create_parser_for_provider (const gchar *prov_name);
+static gint do_test (GdaSqlParser *parser, const xmlChar *id, const xmlChar *file, xmlNodePtr test_node);
+
+int 
+main (int argc, char** argv)
+{
+	xmlDocPtr doc;
+        xmlNodePtr root, node;
+	GdaSqlParser *parser;
+	gint failures = 0;
+	gint ntests = 0;
+	gchar *fname;
+	GHashTable *parsers_hash;
+	GdaDataModel *providers_model;
+	gint i;
+
+	gda_init ();
+
+	/* load file */
+	fname = g_build_filename (ROOT_DIR, "tests", "parser", "testscripts.xml", NULL);
+	if (! g_file_test (fname, G_FILE_TEST_EXISTS)) {
+                g_print ("File '%s' does not exist\n", fname);
+                exit (1);
+        }
+
+	/* create parsers */
+	parsers_hash = g_hash_table_new (g_str_hash, g_str_equal);
+	providers_model = gda_config_list_providers ();
+	for (i = 0; i < gda_data_model_get_n_rows (providers_model); i++) {
+		const GValue *pname;
+		GError *lerror = NULL;
+		pname = gda_data_model_get_value_at (providers_model, 0, i, &lerror);
+		if (!pname) {
+			g_print ("Can't get data model's value: %s",
+				 lerror && lerror->message ? lerror->message : "No detail");
+			exit (1);
+		}
+		parser = create_parser_for_provider (g_value_get_string (pname));
+		g_hash_table_insert (parsers_hash, g_strdup (g_value_get_string (pname)), parser);
+		g_print ("Created parser for provider %s\n", g_value_get_string (pname));
+	}
+	g_object_unref (providers_model);
+	g_hash_table_insert (parsers_hash, "", gda_sql_parser_new ());
+
+	/* use test data */
+	doc = xmlParseFile (fname);
+	g_free (fname);
+	g_assert (doc);
+	root = xmlDocGetRootElement (doc);
+	g_assert (!strcmp ((gchar*) root->name, "testdata"));
+	for (node = root->children; node; node = node->next) {
+		if (strcmp ((gchar*) node->name, "test"))
+			continue;
+		xmlChar *id;
+		xmlChar *file;
+		xmlChar *prov_name;
+
+		prov_name = xmlGetProp (node, BAD_CAST "provider");
+		if (prov_name) {
+			parser = g_hash_table_lookup (parsers_hash, (gchar *) prov_name);
+			xmlFree (prov_name);
+		}
+		else
+			parser = g_hash_table_lookup (parsers_hash, "");
+		if (!parser)
+			continue;
+
+		id = xmlGetProp (node, BAD_CAST "id");
+		file = xmlGetProp (node, BAD_CAST "file");
+		
+		if (id && file) {
+			failures += do_test (parser, id, file, node);
+			ntests++;
+		}
+
+		/* mem free */
+		if (id)	xmlFree (id);
+		if (file) xmlFree (file);
+	}
+	xmlFreeDoc (doc);
+
+	g_print ("TESTS COUNT: %d\n", ntests);
+	g_print ("FAILURES: %d\n", failures);
+  
+	return failures != 0 ? 1 : 0;
+}
+
+/*
+ * Returns: the number of failures
+ */
+static gint
+do_test (GdaSqlParser *parser, const xmlChar *id, const xmlChar *file, xmlNodePtr test_node)
+{
+	gboolean failures = 0;
+	GdaBatch *batch;
+	GError *error = NULL;
+	gchar *full_file;
+
+	full_file = g_build_filename (ROOT_DIR, "tests", "parser", "scripts", file, NULL);
+
+#ifdef GDA_DEBUG
+	g_print ("===== TEST %s FILE: %s\n", id, full_file);
+#endif
+
+	batch = gda_sql_parser_parse_file_as_batch (parser, full_file, &error);
+	g_free (full_file);
+
+	if (!batch) {
+		g_print ("ERROR for test '%s':\n   *got error while parsing: %s\n", id,
+			 error && error->message ? error->message: "No detail");
+		if (error)
+			g_error_free (error);
+		failures ++;
+	}
+	else {
+		const GSList *stmt_list;
+		xmlNodePtr snode;
+		gint nb_stmt = 0;
+
+		stmt_list = gda_batch_get_statements (batch);
+
+		/* number of statements */
+		for (snode = test_node->children; snode; snode = snode->next) {
+			if (!strcmp ((gchar*) snode->name, "stmt"))
+				nb_stmt++;
+		}
+		if (nb_stmt != g_slist_length ((GSList*) stmt_list)) {
+			g_print ("ERROR for test '%s':\n   *expected %d statements and got %d\n", id,
+				 nb_stmt, g_slist_length ((GSList*) stmt_list));
+			failures ++;
+		}
+
+		/* each statement */
+		GSList *list;
+		for (snode = test_node->children, list = (GSList*) stmt_list;
+		     list;
+		     list = list->next) {
+			gchar *sql;
+			sql = gda_statement_to_sql (GDA_STATEMENT (list->data), NULL, &error);
+			if (!sql) {
+				g_print ("ERROR for test '%s':\n   *can't convert statement at position %d to SQL: %s\n", id,
+					 g_slist_position ((GSList*) stmt_list, list),
+					 error && error->message ? error->message: "No detail");
+				if (error)
+					g_error_free (error);
+				failures ++;
+			}
+			else {
+				/* find the next <stmt> node */
+				xmlChar *expected = NULL;
+				for (; snode; snode = snode->next) {
+					if (strcmp ((gchar*) snode->name, "stmt"))
+						continue;
+					expected = xmlNodeGetContent (snode);
+					snode = snode->next;
+					break;
+				}
+				if (!expected) {
+					g_print ("ERROR for test '%s':\n   *missing <stmt> tag for statement at position %d\n", id,
+						 g_slist_position ((GSList*) stmt_list, list));	 
+					failures ++;
+				}
+
+				gchar *ptr;
+				for (ptr = sql; *ptr; ptr++) {
+					if ((*ptr == '\n') || (*ptr == '\t') || (*ptr == '\r'))
+						*ptr = ' ';
+				}
+				g_strstrip (sql);
+				if (expected) {
+					if (strcmp (sql, expected)) {
+						g_print ("ERROR for test '%s', statement at position %d:\n   *exp:%s\n   *got:%s\n", id,
+							 g_slist_position ((GSList*) stmt_list, list), expected, sql);	 
+						failures ++;
+						break;
+					}
+				}
+				else
+					g_print ("% 2d: %s\n", g_slist_position ((GSList*) stmt_list, list), sql);
+				g_free (sql);
+			}
+		}
+		g_object_unref (batch);
+	}
+
+	return failures;
+}
+
+static GdaSqlParser *
+create_parser_for_provider (const gchar *prov_name)
+{
+	GdaServerProvider *prov;
+	GdaSqlParser *parser;
+	GError *error = NULL;
+
+	prov = gda_config_get_provider (prov_name, &error);
+	if (!prov) 
+		g_error ("Could not create provider for '%s': %s\n", prov_name,
+			 error && error->message ? error->message : "No detail");
+
+	parser = gda_server_provider_create_parser (prov, NULL);
+	if (!parser)
+		parser = gda_sql_parser_new ();
+
+	return parser;
+}

Added: trunk/tests/parser/scripts/mysql_employees.sql
==============================================================================
--- (empty file)
+++ trunk/tests/parser/scripts/mysql_employees.sql	Mon Mar  2 20:08:39 2009
@@ -0,0 +1,119 @@
+--  Sample employee database 
+--  See changelog table for details
+--  Copyright (C) 2007,2008, MySQL AB
+--  
+--  Original data created by Fusheng Wang and Carlo Zaniolo
+--  http://www.cs.aau.dk/TimeCenter/software.htm
+--  http://www.cs.aau.dk/TimeCenter/Data/employeeTemporalDataSet.zip
+-- 
+--  Current schema by Giuseppe Maxia 
+--  Data conversion from XML to relational by Patrick Crews
+-- 
+-- This work is licensed under the 
+-- Creative Commons Attribution-Share Alike 3.0 Unported License. 
+-- To view a copy of this license, visit 
+-- http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to 
+-- Creative Commons, 171 Second Street, Suite 300, San Francisco, 
+-- California, 94105, USA.
+-- 
+--  DISCLAIMER
+--  To the best of our knowledge, this data is fabricated, and
+--  it does not correspond to real people. 
+--  Any similarity to existing people is purely coincidental.
+-- 
+
+DROP DATABASE IF EXISTS employees;
+CREATE DATABASE IF NOT EXISTS employees;
+USE employees;
+
+SELECT 'CREATING DATABASE STRUCTURE' as 'INFO';
+
+DROP TABLE IF EXISTS dept_emp,
+                     dept_manager,
+                     titles,
+                     salaries, 
+                     employees, 
+                     departments;
+
+   set storage_engine = InnoDB;
+-- set storage_engine = MyISAM;
+-- set storage_engine = Falcon;
+-- set storage_engine = PBXT;
+-- set storage_engine = Maria;
+
+select CONCAT('storage engine: ', @@storage_engine) as INFO;
+
+CREATE TABLE employees (
+    emp_no      INT             NOT NULL,
+    birth_date  DATE            NOT NULL,
+    first_name  VARCHAR(14)     NOT NULL,
+    last_name   VARCHAR(16)     NOT NULL,
+    gender      ENUM ('M','F')  NOT NULL,    
+    hire_date   DATE            NOT NULL,
+    PRIMARY KEY (emp_no)
+);
+
+CREATE TABLE departments (
+    dept_no     CHAR(4)         NOT NULL,
+    dept_name   VARCHAR(40)     NOT NULL,
+    PRIMARY KEY (dept_no),
+    UNIQUE  KEY (dept_name)
+);
+
+CREATE TABLE dept_manager (
+   dept_no      CHAR(4)         NOT NULL,
+   emp_no       INT             NOT NULL,
+   from_date    DATE            NOT NULL,
+   to_date      DATE            NOT NULL,
+   KEY         (emp_no),
+   KEY         (dept_no),
+   FOREIGN KEY (emp_no)  REFERENCES employees (emp_no)    ON DELETE CASCADE,
+   FOREIGN KEY (dept_no) REFERENCES departments (dept_no) ON DELETE CASCADE,
+   PRIMARY KEY (emp_no,dept_no)
+); 
+
+CREATE TABLE dept_emp (
+    emp_no      INT             NOT NULL,
+    dept_no     CHAR(4)         NOT NULL,
+    from_date   DATE            NOT NULL,
+    to_date     DATE            NOT NULL,
+    KEY         (emp_no),
+    KEY         (dept_no),
+    FOREIGN KEY (emp_no)  REFERENCES employees   (emp_no)  ON DELETE CASCADE,
+    FOREIGN KEY (dept_no) REFERENCES departments (dept_no) ON DELETE CASCADE,
+    PRIMARY KEY (emp_no,dept_no)
+);
+
+CREATE TABLE titles (
+    emp_no      INT             NOT NULL,
+    title       VARCHAR(50)     NOT NULL,
+    from_date   DATE            NOT NULL,
+    to_date     DATE,
+    KEY         (emp_no),
+    FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE,
+    PRIMARY KEY (emp_no,title, from_date)
+); 
+
+CREATE TABLE salaries (
+    emp_no      INT             NOT NULL,
+    salary      INT             NOT NULL,
+    from_date   DATE            NOT NULL,
+    to_date     DATE            NOT NULL,
+    KEY         (emp_no),
+    FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE,
+    PRIMARY KEY (emp_no, from_date)
+); 
+
+SELECT 'LOADING departments' as 'INFO';
+source load_departments.dump ;
+SELECT 'LOADING employees' as 'INFO';
+source load_employees.dump ;
+SELECT 'LOADING dept_emp' as 'INFO';
+source load_dept_emp.dump ;
+SELECT 'LOADING dept_manager' as 'INFO';
+source load_dept_manager.dump ;
+SELECT 'LOADING titles' as 'INFO';
+source load_titles.dump ;
+SELECT 'LOADING salaries' as 'INFO';
+source load_salaries.dump ;
+

Added: trunk/tests/parser/scripts/mysql_employees_partitioned.sql
==============================================================================
--- (empty file)
+++ trunk/tests/parser/scripts/mysql_employees_partitioned.sql	Mon Mar  2 20:08:39 2009
@@ -0,0 +1,168 @@
+--  Sample employee database 
+--  See changelog table for details
+--  Copyright (C) 2007,2008, MySQL AB
+--  
+--  Original data created by Fusheng Wang and Carlo Zaniolo
+--  http://www.cs.aau.dk/TimeCenter/software.htm
+--  http://www.cs.aau.dk/TimeCenter/Data/employeeTemporalDataSet.zip
+-- 
+--  Current schema by Giuseppe Maxia 
+--  Data conversion from XML to relational by Patrick Crews
+-- 
+-- This work is licensed under the 
+-- Creative Commons Attribution-Share Alike 3.0 Unported License. 
+-- To view a copy of this license, visit 
+-- http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to 
+-- Creative Commons, 171 Second Street, Suite 300, San Francisco, 
+-- California, 94105, USA.
+-- 
+--  DISCLAIMER
+--  To the best of our knowledge, this data is fabricated, and
+--  it does not correspond to real people. 
+--  Any similarity to existing people is purely coincidental.
+-- 
+
+DROP DATABASE IF EXISTS employees;
+CREATE DATABASE IF NOT EXISTS employees;
+USE employees;
+
+SELECT 'CREATING DATABASE STRUCTURE' as 'INFO';
+
+DROP TABLE IF EXISTS dept_emp,
+                     dept_manager,
+                     titles,
+                     salaries, 
+                     employees, 
+                     departments;
+
+-- set storage_engine = InnoDB;
+   set storage_engine = MyISAM;
+-- set storage_engine = Falcon;
+-- set storage_engine = PBXT;
+-- set storage_engine = Maria;
+
+select CONCAT('storage engine: ', @@storage_engine) as INFO;
+
+CREATE TABLE employees (
+    emp_no      INT             NOT NULL,
+    birth_date  DATE            NOT NULL,
+    first_name  VARCHAR(14)     NOT NULL,
+    last_name   VARCHAR(16)     NOT NULL,
+    gender      ENUM ('M','F')  NOT NULL,    
+    hire_date   DATE            NOT NULL,
+    PRIMARY KEY (emp_no)
+);
+
+CREATE TABLE departments (
+    dept_no     CHAR(4)         NOT NULL,
+    dept_name   VARCHAR(40)     NOT NULL,
+    PRIMARY KEY (dept_no),
+    UNIQUE  KEY (dept_name)
+);
+
+CREATE TABLE dept_manager (
+   dept_no      CHAR(4)         NOT NULL,
+   emp_no       INT             NOT NULL,
+   from_date    DATE            NOT NULL,
+   to_date      DATE            NOT NULL,
+   KEY         (emp_no),
+   KEY         (dept_no),
+   # FOREIGN KEY (emp_no)  REFERENCES employees (emp_no)    ON DELETE CASCADE,
+   # FOREIGN KEY (dept_no) REFERENCES departments (dept_no) ON DELETE CASCADE,
+   PRIMARY KEY (emp_no,dept_no)
+); 
+
+CREATE TABLE dept_emp (
+    emp_no      INT             NOT NULL,
+    dept_no     CHAR(4)         NOT NULL,
+    from_date   DATE            NOT NULL,
+    to_date     DATE            NOT NULL,
+    KEY         (emp_no),
+    KEY         (dept_no),
+    # FOREIGN KEY (emp_no)  REFERENCES employees   (emp_no)  ON DELETE CASCADE,
+    # FOREIGN KEY (dept_no) REFERENCES departments (dept_no) ON DELETE CASCADE,
+    PRIMARY KEY (emp_no,dept_no)
+);
+
+CREATE TABLE titles (
+    emp_no      INT             NOT NULL,
+    title       VARCHAR(50)     NOT NULL,
+    from_date   DATE            NOT NULL,
+    to_date     DATE,
+    KEY         (emp_no),
+    # FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE,
+    PRIMARY KEY (emp_no,title, from_date)
+); 
+
+ALTER TABLE titles 
+partition by range (year(from_date))
+(
+    partition p01 values less than (1985),
+    partition p02 values less than (1986),
+    partition p03 values less than (1987),
+    partition p04 values less than (1988),
+    partition p05 values less than (1989),
+    partition p06 values less than (1990),
+    partition p07 values less than (1991),
+    partition p08 values less than (1992),
+    partition p09 values less than (1993),
+    partition p10 values less than (1994),
+    partition p11 values less than (1995),
+    partition p12 values less than (1996),
+    partition p13 values less than (1997),
+    partition p14 values less than (1998),
+    partition p15 values less than (1999),
+    partition p16 values less than (2000),
+    partition p17 values less than (2001),
+    partition p18 values less than (2002),
+    partition p19 values less than (MAXVALUE)
+);
+
+CREATE TABLE salaries (
+    emp_no      INT             NOT NULL,
+    salary      INT             NOT NULL,
+    from_date   DATE            NOT NULL,
+    to_date     DATE            NOT NULL,
+    KEY         (emp_no),
+    # FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE,
+    PRIMARY KEY (emp_no, from_date)
+); 
+
+ALTER TABLE salaries
+partition by range (year(from_date))
+(
+    partition p01 values less than (1985),
+    partition p02 values less than (1986),
+    partition p03 values less than (1987),
+    partition p04 values less than (1988),
+    partition p05 values less than (1989),
+    partition p06 values less than (1990),
+    partition p07 values less than (1991),
+    partition p08 values less than (1992),
+    partition p09 values less than (1993),
+    partition p10 values less than (1994),
+    partition p11 values less than (1995),
+    partition p12 values less than (1996),
+    partition p13 values less than (1997),
+    partition p14 values less than (1998),
+    partition p15 values less than (1999),
+    partition p16 values less than (2000),
+    partition p17 values less than (2001),
+    partition p18 values less than (2002),
+    partition p19 values less than (MAXVALUE)
+);
+
+
+SELECT 'LOADING departments' as 'INFO';
+source load_departments.dump ;
+SELECT 'LOADING employees' as 'INFO';
+source load_employees.dump ;
+SELECT 'LOADING dept_emp' as 'INFO';
+source load_dept_emp.dump ;
+SELECT 'LOADING dept_manager' as 'INFO';
+source load_dept_manager.dump ;
+SELECT 'LOADING titles' as 'INFO';
+source load_titles.dump ;
+SELECT 'LOADING salaries' as 'INFO';
+source load_salaries.dump ;
+

Added: trunk/tests/parser/testscripts.xml
==============================================================================
--- (empty file)
+++ trunk/tests/parser/testscripts.xml	Mon Mar  2 20:08:39 2009
@@ -0,0 +1,60 @@
+<testdata>
+  <test id="0" file="mysql_employees.sql">
+    <stmt>DROP DATABASE IF EXISTS employees</stmt>
+    <stmt>CREATE DATABASE IF NOT EXISTS employees</stmt>
+    <stmt>USE employees</stmt>
+    <stmt>SELECT 'CREATING DATABASE STRUCTURE' AS 'INFO'</stmt>
+    <stmt>DROP TABLE IF EXISTS dept_emp,                      dept_manager,                      titles,                      salaries,                       employees,                       departments</stmt>
+    <stmt>set storage_engine = InnoDB</stmt>
+    <stmt>select CONCAT('storage engine: ', @@storage_engine) as INFO</stmt>
+    <stmt>CREATE TABLE employees (     emp_no      INT             NOT NULL,     birth_date  DATE            NOT NULL,     first_name  VARCHAR(14)     NOT NULL,     last_name   VARCHAR(16)     NOT NULL,     gender      ENUM ('M','F')  NOT NULL,         hire_date   DATE            NOT NULL,     PRIMARY KEY (emp_no) )</stmt>
+    <stmt>CREATE TABLE departments (     dept_no     CHAR(4)         NOT NULL,     dept_name   VARCHAR(40)     NOT NULL,     PRIMARY KEY (dept_no),     UNIQUE  KEY (dept_name) )</stmt>
+    <stmt>CREATE TABLE dept_manager (    dept_no      CHAR(4)         NOT NULL,    emp_no       INT             NOT NULL,    from_date    DATE            NOT NULL,    to_date      DATE            NOT NULL,    KEY         (emp_no),    KEY         (dept_no),    FOREIGN KEY (emp_no)  REFERENCES employees (emp_no)    ON DELETE CASCADE,    FOREIGN KEY (dept_no) REFERENCES departments (dept_no) ON DELETE CASCADE,    PRIMARY KEY (emp_no,dept_no) )</stmt>
+    <stmt>CREATE TABLE dept_emp (     emp_no      INT             NOT NULL,     dept_no     CHAR(4)         NOT NULL,     from_date   DATE            NOT NULL,     to_date     DATE            NOT NULL,     KEY         (emp_no),     KEY         (dept_no),     FOREIGN KEY (emp_no)  REFERENCES employees   (emp_no)  ON DELETE CASCADE,     FOREIGN KEY (dept_no) REFERENCES departments (dept_no) ON DELETE CASCADE,     PRIMARY KEY (emp_no,dept_no) )</stmt>
+    <stmt>CREATE TABLE titles (     emp_no      INT             NOT NULL,     title       VARCHAR(50)     NOT NULL,     from_date   DATE            NOT NULL,     to_date     DATE,     KEY         (emp_no),     FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE,     PRIMARY KEY (emp_no,title, from_date) )</stmt>
+    <stmt>CREATE TABLE salaries (     emp_no      INT             NOT NULL,     salary      INT             NOT NULL,     from_date   DATE            NOT NULL,     to_date     DATE            NOT NULL,     KEY         (emp_no),     FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE,     PRIMARY KEY (emp_no, from_date) )</stmt>
+    <stmt>SELECT 'LOADING departments' AS 'INFO'</stmt>
+    <stmt>source load_departments.dump</stmt>
+    <stmt>SELECT 'LOADING employees' AS 'INFO'</stmt>
+    <stmt>source load_employees.dump</stmt>
+    <stmt>SELECT 'LOADING dept_emp' AS 'INFO'</stmt>
+    <stmt>source load_dept_emp.dump</stmt>
+    <stmt>SELECT 'LOADING dept_manager' AS 'INFO'</stmt>
+    <stmt>source load_dept_manager.dump</stmt>
+    <stmt>SELECT 'LOADING titles' AS 'INFO'</stmt>
+    <stmt>source load_titles.dump</stmt>
+    <stmt>SELECT 'LOADING salaries' AS 'INFO'</stmt>
+    <stmt>source load_salaries.dump</stmt>
+  </test>
+
+  <test id="1" file="mysql_employees_partitioned.sql" provider="MySQL">
+    <stmt>DROP DATABASE IF EXISTS employees</stmt>
+    <stmt>CREATE DATABASE IF NOT EXISTS employees</stmt>
+    <stmt>USE employees</stmt>
+    <stmt>SELECT 'CREATING DATABASE STRUCTURE' AS 'INFO'</stmt>
+    <stmt>DROP TABLE IF EXISTS dept_emp,                      dept_manager,                      titles,                      salaries,                       employees,                       departments</stmt>
+    <stmt>set storage_engine = MyISAM</stmt>
+    <stmt>select CONCAT('storage engine: ', @@storage_engine) as INFO</stmt>
+    <stmt>CREATE TABLE employees (     emp_no      INT             NOT NULL,     birth_date  DATE            NOT NULL,     first_name  VARCHAR(14)     NOT NULL,     last_name   VARCHAR(16)     NOT NULL,     gender      ENUM ('M','F')  NOT NULL,         hire_date   DATE            NOT NULL,     PRIMARY KEY (emp_no) )</stmt>
+    <stmt>CREATE TABLE departments (     dept_no     CHAR(4)         NOT NULL,     dept_name   VARCHAR(40)     NOT NULL,     PRIMARY KEY (dept_no),     UNIQUE  KEY (dept_name) )</stmt>
+    <stmt>CREATE TABLE dept_manager (    dept_no      CHAR(4)         NOT NULL,    emp_no       INT             NOT NULL,    from_date    DATE            NOT NULL,    to_date      DATE            NOT NULL,    KEY         (emp_no),    KEY         (dept_no),            PRIMARY KEY (emp_no,dept_no) )</stmt>
+    <stmt>CREATE TABLE dept_emp (     emp_no      INT             NOT NULL,     dept_no     CHAR(4)         NOT NULL,     from_date   DATE            NOT NULL,     to_date     DATE            NOT NULL,     KEY         (emp_no),     KEY         (dept_no),               PRIMARY KEY (emp_no,dept_no) )</stmt>
+    <stmt>CREATE TABLE titles (     emp_no      INT             NOT NULL,     title       VARCHAR(50)     NOT NULL,     from_date   DATE            NOT NULL,     to_date     DATE,     KEY         (emp_no),          PRIMARY KEY (emp_no,title, from_date) )</stmt>
+    <stmt>ALTER TABLE titles  partition by range (year(from_date)) (     partition p01 values less than (1985),     partition p02 values less than (1986),     partition p03 values less than (1987),     partition p04 values less than (1988),     partition p05 values less than (1989),     partition p06 values less than (1990),     partition p07 values less than (1991),     partition p08 values less than (1992),     partition p09 values less than (1993),     partition p10 values less than (1994),     partition p11 values less than (1995),     partition p12 values less than (1996),     partition p13 values less than (1997),     partition p14 values less than (1998),     partition p15 values less than (1999),     partition p16 values less than (2000),     partition p17 values less than (2001),     partition p18 values less than (2002),     partition p19 values less than (MAXVALUE) )</stmt>
+    <stmt>CREATE TABLE salaries (     emp_no      INT             NOT NULL,     salary      INT             NOT NULL,     from_date   DATE            NOT NULL,     to_date     DATE            NOT NULL,     KEY         (emp_no),          PRIMARY KEY (emp_no, from_date) )</stmt>
+    <stmt>ALTER TABLE salaries partition by range (year(from_date)) (     partition p01 values less than (1985),     partition p02 values less than (1986),     partition p03 values less than (1987),     partition p04 values less than (1988),     partition p05 values less than (1989),     partition p06 values less than (1990),     partition p07 values less than (1991),     partition p08 values less than (1992),     partition p09 values less than (1993),     partition p10 values less than (1994),     partition p11 values less than (1995),     partition p12 values less than (1996),     partition p13 values less than (1997),     partition p14 values less than (1998),     partition p15 values less than (1999),     partition p16 values less than (2000),     partition p17 values less than (2001),     partition p18 values less than (2002),     partition p19 values less than (MAXVALUE) )</stmt>
+    <stmt>SELECT 'LOADING departments' AS 'INFO'</stmt>
+    <stmt>source load_departments.dump</stmt>
+    <stmt>SELECT 'LOADING employees' AS 'INFO'</stmt>
+    <stmt>source load_employees.dump</stmt>
+    <stmt>SELECT 'LOADING dept_emp' AS 'INFO'</stmt>
+    <stmt>source load_dept_emp.dump</stmt>
+    <stmt>SELECT 'LOADING dept_manager' AS 'INFO'</stmt>
+    <stmt>source load_dept_manager.dump</stmt>
+    <stmt>SELECT 'LOADING titles' AS 'INFO'</stmt>
+    <stmt>source load_titles.dump</stmt>
+    <stmt>SELECT 'LOADING salaries' AS 'INFO'</stmt>
+    <stmt>source load_salaries.dump</stmt>
+  </test>
+
+</testdata>

Modified: trunk/tools/gda-sql.c
==============================================================================
--- trunk/tools/gda-sql.c	(original)
+++ trunk/tools/gda-sql.c	Mon Mar  2 20:08:39 2009
@@ -138,7 +138,7 @@
 static GdaDataModel *list_all_dsn (void);
 static GdaDataModel *list_all_providers (void);
 
-static gboolean treat_line_func (const gchar *cmde, gpointer data);
+static gboolean treat_line_func (const gchar *cmde, gboolean *out_cmde_exec_ok);
 static const char *prompt_func (void);
 
 
@@ -315,8 +315,11 @@
 		for (;;) {
 			cmde = input_from_stream (data->input_stream);
 			if (cmde) {
-				treat_line_func (cmde, NULL);
+				gboolean command_ok;
+				treat_line_func (cmde, &command_ok);
 				g_free (cmde);
+				if (! command_ok)
+					break;
 			}
 			else
 				break;
@@ -364,9 +367,13 @@
 
 /* @cmde is stolen here */
 static gboolean
-treat_line_func (const gchar *cmde, gpointer data)
+treat_line_func (const gchar *cmde, gboolean *out_cmde_exec_ok)
 {
 	gchar *loc_cmde = NULL;
+
+	if (out_cmde_exec_ok)
+		*out_cmde_exec_ok = TRUE;
+
 	if (!cmde) {
 		save_history (NULL, NULL);
 		if (!main_data->output_stream)
@@ -384,7 +391,7 @@
 			main_data->partial_command = g_string_new (loc_cmde);
 		}
 		else {
-			g_string_append_c (main_data->partial_command, ' ');
+			g_string_append_c (main_data->partial_command, '\n');
 			g_string_append (main_data->partial_command, loc_cmde);
 		}
 		if (command_is_complete (main_data->partial_command->str)) {
@@ -401,16 +408,22 @@
 				}
 			}
 			
-			if (data && main_data->output_stream)
+			if (main_data && main_data->output_stream)
 				to_stream = main_data->output_stream;
 			else
 				to_stream = stdout;
 			res = command_execute (NULL, main_data->partial_command->str, &error);
 			
 			if (!res) {
-				g_fprintf (to_stream,
-					   "ERROR: %s\n", 
-					   error && error->message ? error->message : _("No detail"));
+				if (!error ||
+				    (error->domain != GDA_SQL_PARSER_ERROR) ||
+				    (error->code != GDA_SQL_PARSER_EMPTY_SQL_ERROR)) {
+					g_fprintf (to_stream,
+						   "ERROR: %s\n", 
+						   error && error->message ? error->message : _("No detail"));
+					if (out_cmde_exec_ok)
+						*out_cmde_exec_ok = FALSE;
+				}
 				if (error) {
 					g_error_free (error);
 					error = NULL;
@@ -700,7 +713,13 @@
 		return TRUE;
 	}
 	else {
-		if (command [strlen (command) - 1] == ';')
+		gint i, len;
+		len = strlen (command);
+		for (i = len - 1; i > 0; i--) {
+			if ((command [i] != ' ') && (command [i] != '\n') && (command [i] != '\r'))
+				break;
+		}
+		if (command [i] == ';')
 			return TRUE;
 		else
 			return FALSE;
@@ -2381,6 +2400,33 @@
 	return res;
 }
 
+static gboolean
+idle_read_input_stream (gpointer data)
+{
+	if (main_data->input_stream) {
+		gchar *cmde;
+		cmde = input_from_stream (main_data->input_stream);
+		if (cmde) {
+			gboolean command_ok;
+			treat_line_func (cmde, &command_ok);
+			g_free (cmde);
+			if (command_ok)
+				return TRUE; /* potentially some more work to do from the stream */
+			else 
+				goto stop;
+		}
+		else 
+			goto stop;
+	}
+
+ stop:
+	compute_prompt (NULL, prompt, main_data->partial_command == NULL ? FALSE : TRUE);
+	g_print ("\n%s", prompt->str);
+	fflush (NULL);
+	set_input_file (NULL, NULL);
+	return FALSE; /* stop calling this function */
+}
+
 static GdaInternalCommandResult *
 extra_command_set_input (SqlConsole *console, GdaConnection *cnc, const gchar **args,
 			 GError **error, gpointer data)
@@ -2397,6 +2443,8 @@
 	if (set_input_file (args[0], error)) {
 		GdaInternalCommandResult *res;
 		
+		g_idle_add ((GSourceFunc) idle_read_input_stream, NULL);
+
 		res = g_new0 (GdaInternalCommandResult, 1);
 		res->type = GDA_INTERNAL_COMMAND_RESULT_EMPTY;
 		return res;

Modified: trunk/tools/gda-threader.c
==============================================================================
--- trunk/tools/gda-threader.c	(original)
+++ trunk/tools/gda-threader.c	Mon Mar  2 20:08:39 2009
@@ -175,7 +175,7 @@
 		}
 
 		if (thread->priv->nb_jobs > 0) {
-			g_warning ("There are still some running threads, some memory will be leaked!");
+			/*g_warning ("There are still some running threads, some memory will be leaked!");*/
 			thread->priv->nb_jobs = 0;
 		}
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]