[libgda] SQL case sensitiveness corrections
- From: Vivien Malerba <vivien src gnome org>
- To: svn-commits-list gnome org
- Subject: [libgda] SQL case sensitiveness corrections
- Date: Sun, 5 Jul 2009 12:16:07 +0000 (UTC)
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]