[libgda] SQL case sensitiveness corrections



commit a3f37933ef3ebe89900646def973ef49619138e9
Author: Vivien Malerba <malerba gnome-db org>
Date:   Thu Jul 2 22:12:08 2009 +0200

    SQL case sensitiveness corrections
    
    * documentation updates regarding writing providers
    * new function to check the validity of a GdaMetaContext
    * various connections to gda_connection_update_meta_store() and
      gda_sql_identifier_needs_quotes()
    * new test program: tests/test-sql-identifier.c
    * tests/meta-store/data_table_constraints.csv: fixed test case

 doc/C/libgda-4.0-docs.sgml                    |   61 +++++-
 doc/C/prov-writing.xml                        |   38 ++++
 libgda/gda-connection.c                       |   41 +++--
 libgda/gda-data-meta-wrapper.c                |   21 ++-
 libgda/gda-meta-store-extra.h                 |    1 +
 libgda/gda-meta-store.c                       |  129 +++++++++++
 libgda/sql-parser/gda-statement-struct-util.c |   31 +++-
 tests/.gitignore                              |    1 +
 tests/Makefile.am                             |   11 +-
 tests/meta-store/data_table_constraints.csv   |  282 ++++++++++++------------
 tests/test-sql-identifier.c                   |   65 ++++++
 11 files changed, 513 insertions(+), 168 deletions(-)
---
diff --git a/doc/C/libgda-4.0-docs.sgml b/doc/C/libgda-4.0-docs.sgml
index 1463e8f..ffe4fd7 100644
--- a/doc/C/libgda-4.0-docs.sgml
+++ b/doc/C/libgda-4.0-docs.sgml
@@ -1074,15 +1074,66 @@ g_object_unref (store);
 	<sect2 id="information_schema:sql_identifiers">
 	  <title>SQL identifiers</title>
 	  <para>
-	    SQL identifiers (database object's names) are generally case insensitive, but it is still possible to
-	    have case sensitive SQL identifier if they are enclosed between double quotes. Each database has its own
-	    way of representing case insensitive SQL identifiers (for instance PostgreSQL represents them in lower
+	    The SQL standard has never defined if SQL identifiers (database object's names) have to be case sensitive
+	    or not, leaving that
+	    subject to each database engine implementation. All of them accept two syntaxes for SQL identifiers:
+	    <itemizedlist>
+	      <listitem><para>the first is if the SQL identifier is surrounded by double quotes (sometimes simple
+		  quotes are also accepted), making the SQL identifier case sensitive (and also making
+		  it possible to use reserved SQL keywords as identifiers).</para></listitem>
+	      <listitem><para>the second is if it's not enquoted, meaning that the SQL identifier is not
+		  case sensitive.</para></listitem>
+	    </itemizedlist>
+	    <note>
+	      <para>
+		Many people consider that using the quoted syntax should be avoided if possible because:
+		<itemizedlist>
+		  <listitem><para>once an SQL identifier has been defined using the quoted syntax, it must
+		      <emphasis>always</emphasis> be used quoted, which is error prone especially if external
+		      tools are used on the database</para></listitem>
+		  <listitem><para>the SQL code is less readable (there are quoted strings everywhere)</para></listitem>
+		  <listitem><para>the SQL code is less portable as each database engine sets up different techniques to
+		      avoid confusing the SQL identifiers' quoting with SQL literals which are quoted when writing
+		      complex statements</para></listitem>
+		  <listitem><para>writing SQL requires a more in-depth knowledge of the database engine being used and as
+		      a consequence it's far easier to make errors when writing SQL</para></listitem>
+		</itemizedlist>
+		For some more example, see
+		<ulink url="http://www.alberton.info/dbms_identifiers_and_case_sensitivity.html";>Database identifiers, quoting and case sensitivity</ulink> from  Lorenzo Alberton.
+	      </para>
+	    </note>
+	  </para>
+	  <para>
+	    Considering that each database has its own
+	    internal way of representing case insensitive SQL identifiers (for instance PostgreSQL
+	    represents them in lower
 	    case whereas Oracle represents them in upper case and MySQL represents them in upper or lower case
-	    depending on the platform). To harmonize meta data information usage, &LIBGDA; has chosen
-	    to represent case insensitive SQL identifiers in lower case 
+	    depending on the platform and the configuration), &LIBGDA; has chosen by convention
+	    to represent, in the meta data, case insensitive SQL identifiers in lower case 
 	    and case sensitive SQL identifiers enclosed between double quotes. 
 	  </para>
 	  <para>
+	    This convention has been made necessary to avoid confusion. To illustrate the problem, let's consider a 
+	    table named <emphasis>mytable</emphasis>. Without this convention, if that table was in a PostgreSQL
+	    database, then the meta data would report it as <emphasis>mytable</emphasis>, and if it was in an ORACLE,
+	    it would report it as <emphasis>MYTABLE</emphasis>. Now, a programmer which wants to compare the schemas
+	    of the PostgreSQL and Oracle databases has to know that the PostgreSQL's <emphasis>mytable</emphasis> and
+	    Oracle's <emphasis>MYTABLE</emphasis> represent in fact the same table which means he needs to know
+	    how each database internally stores SQL identifiers, which is not a good choice because it makes
+	    the application less portable between database engines. Better let each database provider do the job.
+
+	    Note that things can even get more confusing if MySQL is used because then one needs to figure out on
+	    which platform the MySQL server is running and how it's configured, a task which makes an application
+	    even less portable.
+	  </para>
+	  <para>
+	    To keep the same example, to build some SQL using the SQL identifier as reported by the meta data
+	    (<emphasis>mytable</emphasis> for PostgreSQL and <emphasis>MYTABLE</emphasis> for Oracle), one has either
+	    to determine if the SQL identifier needs to be quoted or not (which limits the application's portability),
+	    or systematically enquote the SQL identifier which is not something &LIBGDA; can impose to
+	    application developpers.
+	  </para>
+	  <para>
 	    This convention must be respected by database providers' implementations or the 
 	    <link linkend="GdaMetaStruct">GdaMetaStruct</link> object and the associated features
 	    (such as keyword completion) will not work properly.
diff --git a/doc/C/prov-writing.xml b/doc/C/prov-writing.xml
index 1f0fc49..1bd301d 100644
--- a/doc/C/prov-writing.xml
+++ b/doc/C/prov-writing.xml
@@ -375,6 +375,44 @@ gboolean (*tables_views) (GdaServerProvider *, GdaConnection *, GdaMetaStore *,
       <link linkend="information_schema:sql_identifiers">SQL identifiers</link> section.
     </para>
     <sect2>
+      <title>Important note about SQL identifiers</title>
+      <para>
+	As mentionned in the <link linkend="information_schema:sql_identifiers">SQL identifiers</link> section,
+	any SQL identifier in the meta store is represented either:
+	<itemizedlist>
+	  <listitem><para>between double quotes if the SQL identifier is case sensitive</para></listitem>
+	  <listitem><para>all in lower case if the SQL identifier is not case sensitive</para></listitem>
+	</itemizedlist>
+      </para>
+      <para>
+	For database engines which internally store case insensitive SQL identifiers in lower case
+	(such as PostgreSQL),
+	the meta data reported by the database engine can be used almost AS IS, but for database
+	engines which internally store case insensitive SQL identifiers in upper case (such as Oracle),
+	the upper case needs to be converted to lower case. Also case sensitive SQL identifiers also need
+	to be double quoted.
+      </para>
+      <para>
+	To minimize the work required to implement a database provider, &LIBGDA; allows the database
+	provider to specifiy how case insensitive SQL identifiers are represented using 
+	<link linkend="gda-meta-store-set-identifiers-style">gda_meta_store_set_identifiers_style()</link>
+	and the <link linkend="GdaMetaStore">GdaMetaStore</link> object will perform the work itself (the
+	default being GDA_SQL_IDENTIFIERS_LOWER_CASE in <link linkend="GdaSqlIdentifierStyle">GdaSqlIdentifierStyle</link>.
+      </para>
+      <para>
+	Also note that the extra arguments for each virtual method listed below, when they are present
+	and when they represent an SQL identifier, will be represented:
+	<itemizedlist>
+	  <listitem><para>for case insitive SQL identifiers: using all lower or all upper case (depending on the setting
+	      set using <link linkend="gda-meta-store-set-identifiers-style">gda_meta_store_set_identifiers_style()</link>
+	  </para></listitem>
+	  <listitem><para>for case sensitive SQL identifiers: without the double quotes, but possibily with
+	      mixed or not lower and upper characters</para></listitem>
+	  <listitem><para></para></listitem>
+	</itemizedlist>
+      </para>
+    </sect2>
+    <sect2>
       <title>_info()</title>
       <para>
 	<programlisting>
diff --git a/libgda/gda-connection.c b/libgda/gda-connection.c
index 7f24601..95a0454 100644
--- a/libgda/gda-connection.c
+++ b/libgda/gda-connection.c
@@ -1,5 +1,5 @@
 /* GDA library
- * Copyright (C) 1998 - 2008 The GNOME Foundation.
+ * Copyright (C) 1998 - 2009 The GNOME Foundation.
  *
  * AUTHORS:
  *      Michael Lausch <michael lausch at>
@@ -3735,29 +3735,31 @@ gda_connection_update_meta_store (GdaConnection *cnc, GdaMetaContext *context, G
 	/* unlock connection */
 	gda_connection_unlock ((GdaLockable*) cnc);
 
-	/* prepare local context */
-	GdaMetaContext lcontext;
-
 	if (context) {
+		GdaMetaContext *lcontext;
 		GSList *list;
 		GSList *up_templates;
 		GSList *dn_templates;
 		GError *lerror = NULL;
-		lcontext = *context;
+
+		lcontext = _gda_meta_store_validate_context (store, context, error);
+		if (!lcontext)
+			return FALSE;
 		/* alter local context because "_tables" and "_views" always go together so only
 		   "_tables" should be updated and providers should always update "_tables" and "_views"
 		*/
-		if (!strcmp (lcontext.table_name, "_views"))
-			lcontext.table_name = "_tables";
+		if (!strcmp (lcontext->table_name, "_views"))
+			lcontext->table_name = "_tables";
 
-		up_templates = build_upstream_context_templates (store, context, NULL, &lerror);
+		/* build context templates */
+		up_templates = build_upstream_context_templates (store, lcontext, NULL, &lerror);
 		if (!up_templates) {
 			if (lerror) {
 				g_propagate_error (error, lerror);
 				return FALSE;
 			}
 		}
-		dn_templates = build_downstream_context_templates (store, context, NULL, &lerror);
+		dn_templates = build_downstream_context_templates (store, lcontext, NULL, &lerror);
 		if (!dn_templates) {
 			if (lerror) {
 				g_propagate_error (error, lerror);
@@ -3772,7 +3774,7 @@ gda_connection_update_meta_store (GdaConnection *cnc, GdaMetaContext *context, G
 			meta_context_dump ((GdaMetaContext*) list->data);
 		}
 		g_print ("->: ");
-		meta_context_dump (context);
+		meta_context_dump (lcontext);
 		for (list = dn_templates; list; list = list->next) {
 			g_print ("DN: ");
 			meta_context_dump ((GdaMetaContext*) list->data);
@@ -3786,7 +3788,7 @@ gda_connection_update_meta_store (GdaConnection *cnc, GdaMetaContext *context, G
 		cbd.prov = cnc->priv->provider_obj;
 		cbd.cnc = cnc;
 		cbd.error = NULL;
-		cbd.context_templates = g_slist_concat (g_slist_append (up_templates, context), dn_templates);
+		cbd.context_templates = g_slist_concat (g_slist_append (up_templates, lcontext), dn_templates);
 		cbd.context_templates_hash = g_hash_table_new (g_str_hash, g_str_equal);
 		for (list = cbd.context_templates; list; list = list->next) 
 			g_hash_table_insert (cbd.context_templates_hash, ((GdaMetaContext*)list->data)->table_name,
@@ -3803,13 +3805,19 @@ gda_connection_update_meta_store (GdaConnection *cnc, GdaMetaContext *context, G
 		/* free the memory associated with each template */
 		for (list = cbd.context_templates; list; list = list->next) {
 			GdaMetaContext *c = (GdaMetaContext *) list->data;
-			if (c != context) {
-				if (c->size > 0) {
-					g_free (c->column_names);
-					g_free (c->column_values);
+			if (c == lcontext) {
+				gint i;
+				for (i = 0; i < c->size; i++) {
+					g_free (c->column_names [i]);
+					if (c->column_values [i])
+						gda_value_free (c->column_values [i]);
 				}
-				g_free (c);
 			}
+			if (c->size > 0) {
+				g_free (c->column_names);
+				g_free (c->column_values);
+			}
+			g_free (c);
 		}
 		g_slist_free (cbd.context_templates);
 		g_hash_table_destroy (cbd.context_templates_hash);
@@ -3825,6 +3833,7 @@ gda_connection_update_meta_store (GdaConnection *cnc, GdaMetaContext *context, G
 			RFunc  func;
 		} RMeta;
 
+		GdaMetaContext lcontext;
 		gint nb = 0, i;
 		RMeta rmeta[] = {
 			{"_information_schema_catalog_name", "_info", NULL},
diff --git a/libgda/gda-data-meta-wrapper.c b/libgda/gda-data-meta-wrapper.c
index 288a6f4..9e32493 100644
--- a/libgda/gda-data-meta-wrapper.c
+++ b/libgda/gda-data-meta-wrapper.c
@@ -406,9 +406,23 @@ identifier_needs_quotes (const gchar *str, GdaSqlIdentifierStyle mode)
 {
 	const gchar *ptr;
 	for (ptr = str; *ptr; ptr++) {
-		if ((*ptr == ' ') ||
-		    ((mode == GDA_SQL_IDENTIFIERS_LOWER_CASE) && (*ptr != g_ascii_tolower (*ptr))) ||
-		    ((mode == GDA_SQL_IDENTIFIERS_UPPER_CASE) && (*ptr != g_ascii_toupper (*ptr))))
+		/* quote if 1st char is a number */
+		if ((*ptr <= '9') && (*ptr >= '0')) {
+			if (ptr == str)
+				return TRUE;
+			continue;
+		}
+		if ((*ptr >= 'A') && (*ptr <= 'Z')) {
+			if (mode == GDA_SQL_IDENTIFIERS_LOWER_CASE)
+				return TRUE;
+			continue;
+		}
+		if ((*ptr >= 'a') && (*ptr <= 'z')) {
+			if (mode == GDA_SQL_IDENTIFIERS_UPPER_CASE)
+				return TRUE;
+			continue;
+		}
+		if ((*ptr != '$') && (*ptr != '_') && (*ptr != '#'))
 			return TRUE;
 	}
 	return FALSE;
@@ -486,6 +500,7 @@ compute_value (const GValue *value, GdaSqlIdentifierStyle mode)
 		}
 	}
 	g_strfreev (sa);
+
 	return retval;
 }
 
diff --git a/libgda/gda-meta-store-extra.h b/libgda/gda-meta-store-extra.h
index e2c2dce..85e7f67 100644
--- a/libgda/gda-meta-store-extra.h
+++ b/libgda/gda-meta-store-extra.h
@@ -27,6 +27,7 @@ gboolean  _gda_meta_store_begin_data_reset (GdaMetaStore *store, GError **error)
 gboolean  _gda_meta_store_cancel_data_reset (GdaMetaStore *store, GError **error);
 gboolean  _gda_meta_store_finish_data_reset (GdaMetaStore *store, GError **error);
 
+GdaMetaContext *_gda_meta_store_validate_context (GdaMetaStore *store, GdaMetaContext *context, GError **error);
 GSList   *_gda_meta_store_schema_get_upstream_contexts (GdaMetaStore *store, GdaMetaContext *context, GError **error);
 GSList   *_gda_meta_store_schema_get_downstream_contexts (GdaMetaStore *store, GdaMetaContext *context, GError **error);
 
diff --git a/libgda/gda-meta-store.c b/libgda/gda-meta-store.c
index f958f52..2d7c286 100644
--- a/libgda/gda-meta-store.c
+++ b/libgda/gda-meta-store.c
@@ -3598,6 +3598,135 @@ gda_meta_store_schema_remove_custom_object (GdaMetaStore *store, const gchar *ob
 }
 
 /*
+ * Makes sure @context is well formed, and call gda_sql_identifier_remove_quotes() on SQL
+ * identifiers's values
+ *
+ * Returns: a new #GdaMetaContext
+ */
+GdaMetaContext *
+_gda_meta_store_validate_context (GdaMetaStore *store, GdaMetaContext *context, GError **error)
+{
+	GdaMetaStoreClass *klass;
+	gint i;
+
+	if (!context->table_name || !(*context->table_name)) {
+		g_set_error (error, GDA_META_STORE_ERROR, GDA_META_STORE_META_CONTEXT_ERROR,
+			     _("Missing table name in meta data context"));
+		return NULL;
+	}
+	if (context->size <= 0) {
+		g_set_error (error, GDA_META_STORE_ERROR, GDA_META_STORE_META_CONTEXT_ERROR,
+			     _("Missing condition in meta data context"));
+		return NULL;
+	}
+
+	klass = GDA_META_STORE_CLASS (G_OBJECT_GET_CLASS (store));
+
+	/* handle quoted SQL identifiers */
+	DbObject *dbobj = g_hash_table_lookup (klass->cpriv->db_objects_hash, context->table_name);
+	if (dbobj && (dbobj->obj_type == GDA_SERVER_OPERATION_CREATE_TABLE)) {
+		GdaMetaContext *lcontext;
+		TableInfo *tinfo;
+
+		lcontext = g_new0 (GdaMetaContext, 1);
+		lcontext->table_name = context->table_name;
+		lcontext->size = context->size;
+		lcontext->column_names = g_new0 (gchar*, lcontext->size);
+		lcontext->column_values = g_new0 (GValue*, lcontext->size);
+		
+		tinfo = TABLE_INFO (dbobj);
+		for (i = 0; i < lcontext->size; i++) {
+			GSList *list;
+			gint colindex;
+
+			if (!context->column_names [i]) {
+				g_set_error (error, GDA_META_STORE_ERROR, GDA_META_STORE_META_CONTEXT_ERROR,
+					     _("Missing column name in meta data context"));
+				goto onerror;
+			}
+			lcontext->column_names [i] = g_strdup (context->column_names [i]);
+
+			for (colindex = 0, list = tinfo->columns;
+			     list;
+			     colindex++, list = list->next) {
+				if (!strcmp (TABLE_COLUMN (list->data)->column_name, lcontext->column_names [i])) {
+					gint j;
+					for (j = 0; j < tinfo->ident_cols_size; j++) {
+						if (tinfo->ident_cols [j] == colindex) {
+							/* we have an SQL identifier */
+							if (! context->column_values [i]) {
+								g_set_error (error, GDA_META_STORE_ERROR,
+									     GDA_META_STORE_META_CONTEXT_ERROR,
+									     _("Missing condition in meta data context"));
+								goto onerror;
+							}
+							else if (G_VALUE_TYPE (context->column_values [i]) == G_TYPE_STRING) {
+								gchar *id;
+								id = g_value_dup_string (context->column_values [i]);
+								gda_sql_identifier_remove_quotes (id);
+								if (store->priv->ident_style == GDA_SQL_IDENTIFIERS_UPPER_CASE) {
+									/* move to upper case */
+									gchar *ptr;
+									for (ptr = id; *ptr; ptr++) {
+										if ((*ptr >= 'a') && (*ptr <= 'z'))
+											*ptr += 'A' - 'a';
+									}
+								}
+								lcontext->column_values [i] = gda_value_new (G_TYPE_STRING);
+								g_value_take_string (lcontext->column_values [i], id);
+								
+							}
+							else if (G_VALUE_TYPE (context->column_values [i]) == GDA_TYPE_NULL) {
+								lcontext->column_values [i] = gda_value_new_null ();
+							}
+							else {
+								g_set_error (error, GDA_META_STORE_ERROR,
+									     GDA_META_STORE_META_CONTEXT_ERROR,
+									     _("Malformed condition in meta data context"));
+								goto onerror;
+							}
+						}
+					}
+
+					if (! lcontext->column_values [i]) {
+						lcontext->column_values [i] = gda_value_copy (context->column_values [i]);
+					}
+					colindex = -1;
+					break;
+				}
+			}
+
+			if (colindex != -1) {
+				/* column not found => error */
+				g_set_error (error, GDA_META_STORE_ERROR, GDA_META_STORE_META_CONTEXT_ERROR,
+					     _("Unknown column name '%s' in meta data context"),
+					     lcontext->column_names [i]);
+				goto onerror;
+			}
+			else
+				continue;
+
+		onerror:
+			for (i = 0; i < lcontext->size; i++) {
+				g_free (lcontext->column_names [i]);
+				if (lcontext->column_values [i])
+					gda_value_free (lcontext->column_values [i]);
+			}
+			g_free (lcontext->column_names);
+			g_free (lcontext->column_values);
+			g_free (lcontext);
+			return NULL;
+		}
+		return lcontext;
+	}
+	else {
+		g_set_error (error, GDA_META_STORE_ERROR, GDA_META_STORE_META_CONTEXT_ERROR,
+			     _("Unknown table in meta data context"));
+		return NULL;
+	}
+}
+
+/*
  * Returns: a list of new #GdaMetaContext structures, one for each dependency context->table_name has,
  * or %NULL if there is no downstream context, or if an error occurred (check @error to make the difference).
  *
diff --git a/libgda/sql-parser/gda-statement-struct-util.c b/libgda/sql-parser/gda-statement-struct-util.c
index 951c40d..4592a89 100644
--- a/libgda/sql-parser/gda-statement-struct-util.c
+++ b/libgda/sql-parser/gda-statement-struct-util.c
@@ -291,16 +291,45 @@ _string_is_identifier (const gchar *str)
  * Tells if @str needs to be quoted before using it in an SQL statement. To actually add quotes,
  * use gda_sql_identifier_add_quotes().
  *
+ * To determine if quotes are needed: the following rules are applied:
+ * <itemizedlist>
+ *  <listitem><para>If the 1st character is a digit, then %TRUE is returned</para></listitem>
+ *  <listitem><para>If there are mixed lower and upper case letters, then %TRUE is returned</para></listitem>
+ *  <listitem><para>If there are other characters than digits, letters and the '_', '$' and '#', then %TRUE is returned</para></listitem>
+ *  <listitem><para>Otherwise %FALSE is returned</para></listitem>
+ * </itemizedlist>
+ *
  * Returns: TRUE if @str needs some quotes
  */
 gboolean
 gda_sql_identifier_needs_quotes (const gchar *str)
 {
 	const gchar *ptr;
+	gchar icase = 0;
 
 	g_return_val_if_fail (str, FALSE);
 	for (ptr = str; *ptr; ptr++) {
-		if ((*ptr == ' ') || (*ptr != g_ascii_tolower (*ptr)))
+		/* quote if 1st char is a number */
+		if ((*ptr <= '9') && (*ptr >= '0')) {
+			if (ptr == str)
+				return TRUE;
+			continue;
+		}
+		if ((*ptr >= 'A') && (*ptr <= 'Z')) {
+			if (icase == 0) /* first alpha char encountered */
+				icase = 'U';
+			else if (icase == 'L') /* @str has mixed case */
+				return TRUE;
+			continue;
+		}
+		if ((*ptr >= 'a') && (*ptr <= 'z')) {
+			if (icase == 0) /* first alpha char encountered */
+				icase = 'L';
+			else if (icase == 'U')
+				return TRUE; /* @str has mixed case */
+			continue;
+		}
+		if ((*ptr != '$') && (*ptr != '_') && (*ptr != '#'))
 			return TRUE;
 	}
 	return FALSE;
diff --git a/tests/.gitignore b/tests/.gitignore
index b0f19ac..3d3b592 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -1,2 +1,3 @@
 test-bin-converter
 test-ddl-creator
+test-sql-identifier
diff --git a/tests/Makefile.am b/tests/Makefile.am
index b05641b..7224cde 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,6 +1,6 @@
 noinst_LTLIBRARIES = libgda-test-4.0.la
-TESTS = test-ddl-creator test-bin-converter
-check_PROGRAMS = test-ddl-creator test-bin-converter
+TESTS = test-ddl-creator test-bin-converter test-sql-identifier
+check_PROGRAMS = test-ddl-creator test-bin-converter test-sql-identifier
 
 
 SUBDIRS = providers parser value-holders meta-store data-models multi-threading
@@ -45,4 +45,11 @@ test_bin_converter_LDADD = \
 	libgda-test-4.0.la \
         $(LIBGDA_LIBS)
 
+test_sql_identifier_SOURCES = \
+        test-sql-identifier.c
+
+test_sql_identifier_LDADD = \
+        $(top_builddir)/libgda/libgda-4.0.la \
+        $(LIBGDA_LIBS)
+
 EXTRA_DIST = dbstruct.xml
\ No newline at end of file
diff --git a/tests/meta-store/data_table_constraints.csv b/tests/meta-store/data_table_constraints.csv
index d9cd57d..2f00177 100644
--- a/tests/meta-store/data_table_constraints.csv
+++ b/tests/meta-store/data_table_constraints.csv
@@ -1,144 +1,144 @@
-"meta","public","2200_78469_1_not_null","meta","public","_attributes","CHECK","att_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78469_2_not_null","meta","public","_attributes","CHECK","att_value IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78476_1_not_null","meta","public","_information_schema_catalog_name","CHECK","catalog_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78483_1_not_null","meta","public","_builtin_data_types","CHECK","short_type_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78483_2_not_null","meta","public","_builtin_data_types","CHECK","full_type_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78483_6_not_null","meta","public","_builtin_data_types","CHECK","internal IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78490_1_not_null","meta","public","_udt","CHECK","udt_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78490_2_not_null","meta","public","_udt","CHECK","udt_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78490_3_not_null","meta","public","_udt","CHECK","udt_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78490_6_not_null","meta","public","_udt","CHECK","udt_short_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78490_7_not_null","meta","public","_udt","CHECK","udt_full_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78490_8_not_null","meta","public","_udt","CHECK","udt_internal IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78497_1_not_null","meta","public","_element_types","CHECK","specific_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78497_2_not_null","meta","public","_element_types","CHECK","object_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78497_3_not_null","meta","public","_element_types","CHECK","object_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78497_4_not_null","meta","public","_element_types","CHECK","object_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78497_6_not_null","meta","public","_element_types","CHECK","object_type IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78497_7_not_null","meta","public","_element_types","CHECK","data_type IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78497_8_not_null","meta","public","_element_types","CHECK","min_cardinality IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78497_9_not_null","meta","public","_element_types","CHECK","max_cardinality IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78504_1_not_null","meta","public","_schemata","CHECK","catalog_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78504_2_not_null","meta","public","_schemata","CHECK","schema_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78504_4_not_null","meta","public","_schemata","CHECK","schema_internal IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78516_11_not_null","meta","public","_udt_columns","CHECK","character_set_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78516_12_not_null","meta","public","_udt_columns","CHECK","character_set_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78516_13_not_null","meta","public","_udt_columns","CHECK","character_set_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78516_14_not_null","meta","public","_udt_columns","CHECK","collation_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78516_15_not_null","meta","public","_udt_columns","CHECK","collation_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78516_16_not_null","meta","public","_udt_columns","CHECK","collation_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78516_1_not_null","meta","public","_udt_columns","CHECK","udt_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78516_2_not_null","meta","public","_udt_columns","CHECK","udt_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78516_3_not_null","meta","public","_udt_columns","CHECK","udt_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78516_4_not_null","meta","public","_udt_columns","CHECK","udt_column IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78516_5_not_null","meta","public","_udt_columns","CHECK","data_type IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78528_1_not_null","meta","public","_enums","CHECK","udt_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78528_2_not_null","meta","public","_enums","CHECK","udt_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78528_3_not_null","meta","public","_enums","CHECK","udt_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78528_4_not_null","meta","public","_enums","CHECK","label IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78540_18_not_null","meta","public","_domains","CHECK","domain_short_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78540_19_not_null","meta","public","_domains","CHECK","domain_full_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78540_1_not_null","meta","public","_domains","CHECK","domain_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78540_20_not_null","meta","public","_domains","CHECK","domain_internal IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78540_2_not_null","meta","public","_domains","CHECK","domain_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78540_3_not_null","meta","public","_domains","CHECK","domain_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78552_1_not_null","meta","public","_tables","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78552_2_not_null","meta","public","_tables","CHECK","table_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78552_3_not_null","meta","public","_tables","CHECK","table_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78552_4_not_null","meta","public","_tables","CHECK","table_type IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78552_7_not_null","meta","public","_tables","CHECK","table_short_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78552_8_not_null","meta","public","_tables","CHECK","table_full_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78564_1_not_null","meta","public","_collations","CHECK","collation_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78564_2_not_null","meta","public","_collations","CHECK","collation_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78564_3_not_null","meta","public","_collations","CHECK","collation_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78564_5_not_null","meta","public","_collations","CHECK","collation_short_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78564_6_not_null","meta","public","_collations","CHECK","collation_full_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78576_19_not_null","meta","public","_routines","CHECK","routine_short_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78576_1_not_null","meta","public","_routines","CHECK","specific_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78576_20_not_null","meta","public","_routines","CHECK","routine_full_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78576_2_not_null","meta","public","_routines","CHECK","specific_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78576_3_not_null","meta","public","_routines","CHECK","specific_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78576_6_not_null","meta","public","_routines","CHECK","routine_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78576_9_not_null","meta","public","_routines","CHECK","returns_set IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78588_1_not_null","meta","public","_views","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78588_2_not_null","meta","public","_views","CHECK","table_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78588_3_not_null","meta","public","_views","CHECK","table_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78600_1_not_null","meta","public","_character_sets","CHECK","character_set_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78600_2_not_null","meta","public","_character_sets","CHECK","character_set_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78600_3_not_null","meta","public","_character_sets","CHECK","character_set_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78600_8_not_null","meta","public","_character_sets","CHECK","character_set_short_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78600_9_not_null","meta","public","_character_sets","CHECK","character_set_full_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78617_10_not_null","meta","public","_triggers","CHECK","condition_timing IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78617_12_not_null","meta","public","_triggers","CHECK","trigger_short_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78617_13_not_null","meta","public","_triggers","CHECK","trigger_full_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78617_1_not_null","meta","public","_triggers","CHECK","trigger_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78617_2_not_null","meta","public","_triggers","CHECK","trigger_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78617_3_not_null","meta","public","_triggers","CHECK","trigger_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78617_4_not_null","meta","public","_triggers","CHECK","event_manipulation IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78617_5_not_null","meta","public","_triggers","CHECK","event_object_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78617_6_not_null","meta","public","_triggers","CHECK","event_object_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78617_7_not_null","meta","public","_triggers","CHECK","event_object_table IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78617_9_not_null","meta","public","_triggers","CHECK","action_orientation IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78634_1_not_null","meta","public","_table_constraints","CHECK","constraint_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78634_2_not_null","meta","public","_table_constraints","CHECK","constraint_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78634_3_not_null","meta","public","_table_constraints","CHECK","constraint_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78634_4_not_null","meta","public","_table_constraints","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78634_5_not_null","meta","public","_table_constraints","CHECK","table_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78634_6_not_null","meta","public","_table_constraints","CHECK","table_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78634_7_not_null","meta","public","_table_constraints","CHECK","constraint_type IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78651_1_not_null","meta","public","_domain_constraints","CHECK","constraint_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78651_2_not_null","meta","public","_domain_constraints","CHECK","constraint_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78651_3_not_null","meta","public","_domain_constraints","CHECK","constraint_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78651_4_not_null","meta","public","_domain_constraints","CHECK","domain_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78651_5_not_null","meta","public","_domain_constraints","CHECK","domain_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78651_6_not_null","meta","public","_domain_constraints","CHECK","domain_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78668_1_not_null","meta","public","_parameters","CHECK","specific_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78668_2_not_null","meta","public","_parameters","CHECK","specific_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78668_3_not_null","meta","public","_parameters","CHECK","specific_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78668_4_not_null","meta","public","_parameters","CHECK","ordinal_position IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78668_5_not_null","meta","public","_parameters","CHECK","parameter_mode IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78668_7_not_null","meta","public","_parameters","CHECK","data_type IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78680_1_not_null","meta","public","_routine_columns","CHECK","specific_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78680_2_not_null","meta","public","_routine_columns","CHECK","specific_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78680_3_not_null","meta","public","_routine_columns","CHECK","specific_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78680_4_not_null","meta","public","_routine_columns","CHECK","column_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78680_5_not_null","meta","public","_routine_columns","CHECK","ordinal_position IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78680_6_not_null","meta","public","_routine_columns","CHECK","data_type IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78696_1_not_null","meta","public","_columns","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78696_2_not_null","meta","public","_columns","CHECK","table_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78696_3_not_null","meta","public","_columns","CHECK","table_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78696_4_not_null","meta","public","_columns","CHECK","column_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78696_5_not_null","meta","public","_columns","CHECK","ordinal_position IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78696_7_not_null","meta","public","_columns","CHECK","is_nullable IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78696_8_not_null","meta","public","_columns","CHECK","data_type IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78718_1_not_null","meta","public","_referential_constraints","CHECK","constraint_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78718_2_not_null","meta","public","_referential_constraints","CHECK","constraint_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78718_3_not_null","meta","public","_referential_constraints","CHECK","constraint_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78718_4_not_null","meta","public","_referential_constraints","CHECK","unique_constraint_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78718_5_not_null","meta","public","_referential_constraints","CHECK","unique_constraint_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78718_6_not_null","meta","public","_referential_constraints","CHECK","unique_constraint_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78738_1_not_null","meta","public","_key_column_usage","CHECK","constraint_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78738_2_not_null","meta","public","_key_column_usage","CHECK","constraint_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78738_3_not_null","meta","public","_key_column_usage","CHECK","constraint_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78738_4_not_null","meta","public","_key_column_usage","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78738_5_not_null","meta","public","_key_column_usage","CHECK","table_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78738_6_not_null","meta","public","_key_column_usage","CHECK","table_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78738_7_not_null","meta","public","_key_column_usage","CHECK","column_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78738_8_not_null","meta","public","_key_column_usage","CHECK","ordinal_position IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78755_1_not_null","meta","public","_check_column_usage","CHECK","constraint_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78755_2_not_null","meta","public","_check_column_usage","CHECK","constraint_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78755_3_not_null","meta","public","_check_column_usage","CHECK","constraint_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78755_4_not_null","meta","public","_check_column_usage","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78755_5_not_null","meta","public","_check_column_usage","CHECK","table_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78755_6_not_null","meta","public","_check_column_usage","CHECK","table_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78755_7_not_null","meta","public","_check_column_usage","CHECK","column_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78772_1_not_null","meta","public","_view_column_usage","CHECK","view_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78772_2_not_null","meta","public","_view_column_usage","CHECK","view_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78772_3_not_null","meta","public","_view_column_usage","CHECK","view_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78772_4_not_null","meta","public","_view_column_usage","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78772_5_not_null","meta","public","_view_column_usage","CHECK","table_schema IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78772_6_not_null","meta","public","_view_column_usage","CHECK","table_name IS NOT NULL",FALSE,FALSE
-"meta","public","2200_78772_7_not_null","meta","public","_view_column_usage","CHECK","column_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78469_1_not_null""","meta","public","_attributes","CHECK","att_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78469_2_not_null""","meta","public","_attributes","CHECK","att_value IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78476_1_not_null""","meta","public","_information_schema_catalog_name","CHECK","catalog_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78483_1_not_null""","meta","public","_builtin_data_types","CHECK","short_type_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78483_2_not_null""","meta","public","_builtin_data_types","CHECK","full_type_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78483_6_not_null""","meta","public","_builtin_data_types","CHECK","internal IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78490_1_not_null""","meta","public","_udt","CHECK","udt_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78490_2_not_null""","meta","public","_udt","CHECK","udt_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78490_3_not_null""","meta","public","_udt","CHECK","udt_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78490_6_not_null""","meta","public","_udt","CHECK","udt_short_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78490_7_not_null""","meta","public","_udt","CHECK","udt_full_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78490_8_not_null""","meta","public","_udt","CHECK","udt_internal IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78497_1_not_null""","meta","public","_element_types","CHECK","specific_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78497_2_not_null""","meta","public","_element_types","CHECK","object_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78497_3_not_null""","meta","public","_element_types","CHECK","object_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78497_4_not_null""","meta","public","_element_types","CHECK","object_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78497_6_not_null""","meta","public","_element_types","CHECK","object_type IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78497_7_not_null""","meta","public","_element_types","CHECK","data_type IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78497_8_not_null""","meta","public","_element_types","CHECK","min_cardinality IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78497_9_not_null""","meta","public","_element_types","CHECK","max_cardinality IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78504_1_not_null""","meta","public","_schemata","CHECK","catalog_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78504_2_not_null""","meta","public","_schemata","CHECK","schema_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78504_4_not_null""","meta","public","_schemata","CHECK","schema_internal IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78516_11_not_null""","meta","public","_udt_columns","CHECK","character_set_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78516_12_not_null""","meta","public","_udt_columns","CHECK","character_set_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78516_13_not_null""","meta","public","_udt_columns","CHECK","character_set_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78516_14_not_null""","meta","public","_udt_columns","CHECK","collation_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78516_15_not_null""","meta","public","_udt_columns","CHECK","collation_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78516_16_not_null""","meta","public","_udt_columns","CHECK","collation_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78516_1_not_null""","meta","public","_udt_columns","CHECK","udt_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78516_2_not_null""","meta","public","_udt_columns","CHECK","udt_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78516_3_not_null""","meta","public","_udt_columns","CHECK","udt_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78516_4_not_null""","meta","public","_udt_columns","CHECK","udt_column IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78516_5_not_null""","meta","public","_udt_columns","CHECK","data_type IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78528_1_not_null""","meta","public","_enums","CHECK","udt_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78528_2_not_null""","meta","public","_enums","CHECK","udt_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78528_3_not_null""","meta","public","_enums","CHECK","udt_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78528_4_not_null""","meta","public","_enums","CHECK","label IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78540_18_not_null""","meta","public","_domains","CHECK","domain_short_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78540_19_not_null""","meta","public","_domains","CHECK","domain_full_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78540_1_not_null""","meta","public","_domains","CHECK","domain_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78540_20_not_null""","meta","public","_domains","CHECK","domain_internal IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78540_2_not_null""","meta","public","_domains","CHECK","domain_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78540_3_not_null""","meta","public","_domains","CHECK","domain_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78552_1_not_null""","meta","public","_tables","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78552_2_not_null""","meta","public","_tables","CHECK","table_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78552_3_not_null""","meta","public","_tables","CHECK","table_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78552_4_not_null""","meta","public","_tables","CHECK","table_type IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78552_7_not_null""","meta","public","_tables","CHECK","table_short_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78552_8_not_null""","meta","public","_tables","CHECK","table_full_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78564_1_not_null""","meta","public","_collations","CHECK","collation_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78564_2_not_null""","meta","public","_collations","CHECK","collation_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78564_3_not_null""","meta","public","_collations","CHECK","collation_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78564_5_not_null""","meta","public","_collations","CHECK","collation_short_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78564_6_not_null""","meta","public","_collations","CHECK","collation_full_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78576_19_not_null""","meta","public","_routines","CHECK","routine_short_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78576_1_not_null""","meta","public","_routines","CHECK","specific_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78576_20_not_null""","meta","public","_routines","CHECK","routine_full_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78576_2_not_null""","meta","public","_routines","CHECK","specific_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78576_3_not_null""","meta","public","_routines","CHECK","specific_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78576_6_not_null""","meta","public","_routines","CHECK","routine_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78576_9_not_null""","meta","public","_routines","CHECK","returns_set IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78588_1_not_null""","meta","public","_views","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78588_2_not_null""","meta","public","_views","CHECK","table_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78588_3_not_null""","meta","public","_views","CHECK","table_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78600_1_not_null""","meta","public","_character_sets","CHECK","character_set_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78600_2_not_null""","meta","public","_character_sets","CHECK","character_set_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78600_3_not_null""","meta","public","_character_sets","CHECK","character_set_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78600_8_not_null""","meta","public","_character_sets","CHECK","character_set_short_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78600_9_not_null""","meta","public","_character_sets","CHECK","character_set_full_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78617_10_not_null""","meta","public","_triggers","CHECK","condition_timing IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78617_12_not_null""","meta","public","_triggers","CHECK","trigger_short_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78617_13_not_null""","meta","public","_triggers","CHECK","trigger_full_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78617_1_not_null""","meta","public","_triggers","CHECK","trigger_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78617_2_not_null""","meta","public","_triggers","CHECK","trigger_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78617_3_not_null""","meta","public","_triggers","CHECK","trigger_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78617_4_not_null""","meta","public","_triggers","CHECK","event_manipulation IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78617_5_not_null""","meta","public","_triggers","CHECK","event_object_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78617_6_not_null""","meta","public","_triggers","CHECK","event_object_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78617_7_not_null""","meta","public","_triggers","CHECK","event_object_table IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78617_9_not_null""","meta","public","_triggers","CHECK","action_orientation IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78634_1_not_null""","meta","public","_table_constraints","CHECK","constraint_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78634_2_not_null""","meta","public","_table_constraints","CHECK","constraint_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78634_3_not_null""","meta","public","_table_constraints","CHECK","constraint_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78634_4_not_null""","meta","public","_table_constraints","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78634_5_not_null""","meta","public","_table_constraints","CHECK","table_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78634_6_not_null""","meta","public","_table_constraints","CHECK","table_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78634_7_not_null""","meta","public","_table_constraints","CHECK","constraint_type IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78651_1_not_null""","meta","public","_domain_constraints","CHECK","constraint_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78651_2_not_null""","meta","public","_domain_constraints","CHECK","constraint_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78651_3_not_null""","meta","public","_domain_constraints","CHECK","constraint_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78651_4_not_null""","meta","public","_domain_constraints","CHECK","domain_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78651_5_not_null""","meta","public","_domain_constraints","CHECK","domain_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78651_6_not_null""","meta","public","_domain_constraints","CHECK","domain_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78668_1_not_null""","meta","public","_parameters","CHECK","specific_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78668_2_not_null""","meta","public","_parameters","CHECK","specific_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78668_3_not_null""","meta","public","_parameters","CHECK","specific_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78668_4_not_null""","meta","public","_parameters","CHECK","ordinal_position IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78668_5_not_null""","meta","public","_parameters","CHECK","parameter_mode IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78668_7_not_null""","meta","public","_parameters","CHECK","data_type IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78680_1_not_null""","meta","public","_routine_columns","CHECK","specific_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78680_2_not_null""","meta","public","_routine_columns","CHECK","specific_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78680_3_not_null""","meta","public","_routine_columns","CHECK","specific_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78680_4_not_null""","meta","public","_routine_columns","CHECK","column_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78680_5_not_null""","meta","public","_routine_columns","CHECK","ordinal_position IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78680_6_not_null""","meta","public","_routine_columns","CHECK","data_type IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78696_1_not_null""","meta","public","_columns","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78696_2_not_null""","meta","public","_columns","CHECK","table_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78696_3_not_null""","meta","public","_columns","CHECK","table_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78696_4_not_null""","meta","public","_columns","CHECK","column_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78696_5_not_null""","meta","public","_columns","CHECK","ordinal_position IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78696_7_not_null""","meta","public","_columns","CHECK","is_nullable IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78696_8_not_null""","meta","public","_columns","CHECK","data_type IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78718_1_not_null""","meta","public","_referential_constraints","CHECK","constraint_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78718_2_not_null""","meta","public","_referential_constraints","CHECK","constraint_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78718_3_not_null""","meta","public","_referential_constraints","CHECK","constraint_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78718_4_not_null""","meta","public","_referential_constraints","CHECK","unique_constraint_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78718_5_not_null""","meta","public","_referential_constraints","CHECK","unique_constraint_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78718_6_not_null""","meta","public","_referential_constraints","CHECK","unique_constraint_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78738_1_not_null""","meta","public","_key_column_usage","CHECK","constraint_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78738_2_not_null""","meta","public","_key_column_usage","CHECK","constraint_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78738_3_not_null""","meta","public","_key_column_usage","CHECK","constraint_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78738_4_not_null""","meta","public","_key_column_usage","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78738_5_not_null""","meta","public","_key_column_usage","CHECK","table_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78738_6_not_null""","meta","public","_key_column_usage","CHECK","table_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78738_7_not_null""","meta","public","_key_column_usage","CHECK","column_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78738_8_not_null""","meta","public","_key_column_usage","CHECK","ordinal_position IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78755_1_not_null""","meta","public","_check_column_usage","CHECK","constraint_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78755_2_not_null""","meta","public","_check_column_usage","CHECK","constraint_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78755_3_not_null""","meta","public","_check_column_usage","CHECK","constraint_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78755_4_not_null""","meta","public","_check_column_usage","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78755_5_not_null""","meta","public","_check_column_usage","CHECK","table_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78755_6_not_null""","meta","public","_check_column_usage","CHECK","table_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78755_7_not_null""","meta","public","_check_column_usage","CHECK","column_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78772_1_not_null""","meta","public","_view_column_usage","CHECK","view_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78772_2_not_null""","meta","public","_view_column_usage","CHECK","view_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78772_3_not_null""","meta","public","_view_column_usage","CHECK","view_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78772_4_not_null""","meta","public","_view_column_usage","CHECK","table_catalog IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78772_5_not_null""","meta","public","_view_column_usage","CHECK","table_schema IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78772_6_not_null""","meta","public","_view_column_usage","CHECK","table_name IS NOT NULL",FALSE,FALSE
+"meta","public","""2200_78772_7_not_null""","meta","public","_view_column_usage","CHECK","column_name IS NOT NULL",FALSE,FALSE
 "meta","public","_attributes_pkey","meta","public","_attributes","PRIMARY KEY","NULL",FALSE,FALSE
 "meta","public","_builtin_data_types_pkey","meta","public","_builtin_data_types","PRIMARY KEY","NULL",FALSE,FALSE
 "meta","public","_character_sets_character_set_catalog_fkey","meta","public","_character_sets","FOREIGN KEY","NULL",FALSE,FALSE
diff --git a/tests/test-sql-identifier.c b/tests/test-sql-identifier.c
new file mode 100644
index 0000000..79dcc6e
--- /dev/null
+++ b/tests/test-sql-identifier.c
@@ -0,0 +1,65 @@
+/* 
+ * Copyright (C) 2009 The GNOME Foundation.
+ *
+ * AUTHORS:
+ *      Vivien Malerba <malerba gnome-db org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <libgda/sql-parser/gda-sql-parser.h>
+
+typedef struct {
+	gchar *sql_identifier;
+	gboolean need_quotes;
+} ATest;
+
+ATest tests[] = {
+	{"\"Solution\"", TRUE},
+	{"mytable", FALSE},
+	{"MYTABLE", FALSE},
+	{"MyTable", TRUE},
+	{"my.blob", TRUE},
+	{"_table", FALSE},
+	{"$table", FALSE},
+	{"#table", FALSE},
+	{"8table", TRUE},
+	{"t8ble", FALSE},
+	{"t8ble_1", FALSE},
+	{"t8ble_A", TRUE},
+	{"T8BLE_A", FALSE},
+	{"T8BLE_a", TRUE},
+};
+
+int
+main (int argc, char** argv)
+{
+	gint i, nfailed = 0;
+	for (i = 0; i < G_N_ELEMENTS (tests); i++) {
+		ATest *test = &(tests [i]);
+		if (gda_sql_identifier_needs_quotes (test->sql_identifier) != test->need_quotes) {
+			g_print ("Failed for %s: reported %s\n", test->sql_identifier,
+				 test->need_quotes ? "no quotes needed" : "quotes needed");
+			nfailed++;
+		}
+	}
+
+	g_print ("%d tests executed, ", i);
+	if (nfailed > 0)
+		g_print ("%d failed\n", nfailed);
+	else
+		g_print ("Ok\n");
+	return EXIT_SUCCESS;
+}



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