[libgda] Secured GdaServerOperation usage of SQL identifiers



commit 902bfdfe9258de57076473742f6f065abe71f26a
Author: Vivien Malerba <malerba gnome-db org>
Date:   Tue Apr 15 21:14:44 2014 +0200

    Secured GdaServerOperation usage of SQL identifiers

 doc/C/migration4.xml                              |    2 +-
 libgda/gda-server-operation.c                     |   32 +-
 libgda/gda-server-operation.h                     |    7 +-
 libgda/sqlite/gda-sqlite-ddl.c                    |   90 ++-
 providers/jdbc/gda-jdbc-ddl.c                     |   23 +-
 providers/mysql/gda-mysql-ddl.c                   |  735 ++++++++++++---------
 providers/oracle/gda-oracle-ddl.c                 |   23 +-
 providers/postgres/gda-postgres-ddl.c             |  596 ++++++++++-------
 providers/skel-implementation/capi/gda-capi-ddl.c |   19 +-
 providers/web/gda-web-ddl.c                       |   24 +-
 10 files changed, 941 insertions(+), 610 deletions(-)
---
diff --git a/doc/C/migration4.xml b/doc/C/migration4.xml
index 3bba6c0..8581221 100644
--- a/doc/C/migration4.xml
+++ b/doc/C/migration4.xml
@@ -85,7 +85,7 @@
         <listitem><para>The gda_connection_async_statement_execute() function has been 
removed</para></listitem>
         <listitem><para>The gda_connection_internal_get_provider_data() has been replaced by
        <link 
linkend="gda-connection-internal-get-provider-data-error">gda_connection_internal_get_provider_data_error</link>()</para></listitem>
-        <listitem><para>The </para></listitem>
+        <listitem><para>The <link 
linkend="gda-server-operation-get-sql-identifier-at">gda_server_operation_get_sql_identifier_at()</link> and 
<link 
linkend="gda-server-operation-get-sql-identifier-at-path">gda_server_operation_get_sql_identifier_at_path()</link>
 now have an extra argument for errors</para></listitem>
         <listitem><para>The </para></listitem>
         <listitem><para>The </para></listitem>
         <listitem><para>The </para></listitem>
diff --git a/libgda/gda-server-operation.c b/libgda/gda-server-operation.c
index 0a67b6c..6f9fb13 100644
--- a/libgda/gda-server-operation.c
+++ b/libgda/gda-server-operation.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2006 - 2008 Murray Cumming <murrayc murrayc com>
- * Copyright (C) 2006 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2006 - 2014 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2007 Leonardo Boshell <lb kmc com co>
  * Copyright (C) 2008 Armin Burgmeier <armin openismus com>
  * Copyright (C) 2008 Phil Longstaff <plongstaff rogers com>
@@ -2097,6 +2097,7 @@ gda_server_operation_get_value_at (GdaServerOperation *op, const gchar *path_for
  * @cnc: (allow-none): a #GdaConnection, or %NULL
  * @prov: (allow-none): a #GdaServerProvider, or %NULL
  * @path_format: a complete path to a node (starting with "/")
+ * @error: (allow-none): a place to store errors, or %NULL
  * @...: arguments to use with @path_format to make a complete path
  *
  * This method is similar to gda_server_operation_get_value_at(), but for SQL identifiers: a new string
@@ -2112,7 +2113,7 @@ gda_server_operation_get_value_at (GdaServerOperation *op, const gchar *path_for
  */
 gchar *
 gda_server_operation_get_sql_identifier_at (GdaServerOperation *op, GdaConnection *cnc, GdaServerProvider 
*prov,
-                                           const gchar *path_format, ...)
+                                           const gchar *path_format, GError **error, ...)
 {
        gchar *path, *ret;
        va_list args;
@@ -2120,11 +2121,11 @@ gda_server_operation_get_sql_identifier_at (GdaServerOperation *op, GdaConnectio
        g_return_val_if_fail (GDA_IS_SERVER_OPERATION (op), NULL);
 
        /* build path */
-       va_start (args, path_format);
+       va_start (args, error);
        path = g_strdup_vprintf (path_format, args);
        va_end (args);
 
-       ret = gda_server_operation_get_sql_identifier_at_path (op, cnc, prov, path);
+       ret = gda_server_operation_get_sql_identifier_at_path (op, cnc, prov, path, error);
        g_free (path);
 
        return ret;
@@ -2136,6 +2137,7 @@ gda_server_operation_get_sql_identifier_at (GdaServerOperation *op, GdaConnectio
  * @cnc: (allow-none): a #GdaConnection, or %NULL
  * @prov: (allow-none): a #GdaServerProvider, or %NULL
  * @path: a complete path to a node (starting with "/")
+ * @error: (allow-none): a place to store errors, or %NULL
  *
  * This method is similar to gda_server_operation_get_value_at(), but for SQL identifiers: a new string
  * is returned instead of a #GValue. Also the returned string is assumed to represents an SQL identifier
@@ -2143,8 +2145,8 @@ gda_server_operation_get_sql_identifier_at (GdaServerOperation *op, GdaConnectio
  * will be applied if both are %NULL).
  *
  * Returns: (transfer full): a new string, or %NULL if the value is undefined or
- * if the @path is not defined or @path does not hold any value, or if the value held is not a string
- * (in that last case a warning is shown).
+ * if the @path is not defined or @path does not hold any value, or if the value held is not a string or
+ * a valid SQL identifier.
  *
  * Since: 4.2.6
  *
@@ -2152,7 +2154,7 @@ gda_server_operation_get_sql_identifier_at (GdaServerOperation *op, GdaConnectio
  */
 gchar *
 gda_server_operation_get_sql_identifier_at_path (GdaServerOperation *op, GdaConnection *cnc, 
GdaServerProvider *prov,
-                                                const gchar *path)
+                                                const gchar *path, GError **error)
 {
        const GValue *value = NULL;
        GdaConnectionOptions cncoptions = 0;
@@ -2161,13 +2163,25 @@ gda_server_operation_get_sql_identifier_at_path (GdaServerOperation *op, GdaConn
 
        value = gda_server_operation_get_value_at_path (op, path);
        
-       if (!value || (G_VALUE_TYPE (value) == GDA_TYPE_NULL))
+       if (!value || (G_VALUE_TYPE (value) == GDA_TYPE_NULL)) {
+               g_set_error (error, GDA_SERVER_OPERATION_ERROR, GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
+                            _("Wrong SQL identifier value"));
                return NULL;
+       }
+
        g_return_val_if_fail (G_VALUE_TYPE (value) == G_TYPE_STRING, NULL);
 
+       const gchar *str;
+       str = g_value_get_string (value);
+       if (!str || !*str) {
+               g_set_error (error, GDA_SERVER_OPERATION_ERROR, GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
+                            _("Wrong SQL identifier value"));
+               return NULL;
+       }
+
        if (cnc)
                g_object_get (G_OBJECT (cnc), "options", &cncoptions, NULL);
-       return gda_sql_identifier_quote (g_value_get_string (value), cnc, prov, FALSE,
+       return gda_sql_identifier_quote (str, cnc, prov, FALSE,
                                         cncoptions & GDA_CONNECTION_OPTIONS_SQL_IDENTIFIERS_CASE_SENSITIVE);
 }
 
diff --git a/libgda/gda-server-operation.h b/libgda/gda-server-operation.h
index cec195f..fb3ba43 100644
--- a/libgda/gda-server-operation.h
+++ b/libgda/gda-server-operation.h
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2006 Murray Cumming <murrayc murrayc com>
- * Copyright (C) 2006 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2006 - 2014 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2010 Jonh Wendell <jwendell gnome org>
  *
@@ -208,10 +208,11 @@ const GValue              *gda_server_operation_get_value_at            (GdaServ
 const GValue              *gda_server_operation_get_value_at_path       (GdaServerOperation *op, const gchar 
*path);
 gchar                     *gda_server_operation_get_sql_identifier_at   (GdaServerOperation *op,
                                                                         GdaConnection *cnc, 
GdaServerProvider *prov,
-                                                                        const gchar *path_format, ...);    
+                                                                        const gchar *path_format, GError 
**error,
+                                                                        ...);    
 gchar                     *gda_server_operation_get_sql_identifier_at_path (GdaServerOperation *op, 
                                                                            GdaConnection *cnc, 
GdaServerProvider *prov,
-                                                                           const gchar *path);
+                                                                           const gchar *path, GError 
**error);
 gboolean                   gda_server_operation_set_value_at            (GdaServerOperation *op, const gchar 
*value, 
                                                                         GError **error, const gchar 
*path_format, ...);
 gboolean                   gda_server_operation_set_value_at_path       (GdaServerOperation *op, const gchar 
*value, 
diff --git a/libgda/sqlite/gda-sqlite-ddl.c b/libgda/sqlite/gda-sqlite-ddl.c
index c879057..58c4fb3 100644
--- a/libgda/sqlite/gda-sqlite-ddl.c
+++ b/libgda/sqlite/gda-sqlite-ddl.c
@@ -53,7 +53,11 @@ _gda_sqlite_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc
        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
                g_string_append (string, "IF NOT EXISTS ");
                
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
        g_string_append (string, " (");
@@ -71,7 +75,12 @@ _gda_sqlite_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc
                        value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i);
                        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) {
                                tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                                 
"/FIELDS_A/@COLUMN_NAME/%d", i);
+                                                                                 
"/FIELDS_A/@COLUMN_NAME/%d", error,
+                                                                                 i);
+                               if (!tmp) {
+                                       g_string_free (string, TRUE);
+                                       return NULL;
+                               }
                                pkfields = g_slist_append (pkfields, tmp);
                                nbpkfields++;
                        }
@@ -87,7 +96,12 @@ _gda_sqlite_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc
                        else
                                g_string_append (string, ", ");
                                
-                       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
"/FIELDS_A/@COLUMN_NAME/%d", i);
+                       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
+                                                                         "/FIELDS_A/@COLUMN_NAME/%d", error, 
i);
+                       if (!tmp) {
+                               g_string_free (string, TRUE);
+                               return NULL;
+                       }
                        g_string_append (string, tmp);
                        g_free (tmp);
                        g_string_append_c (string, ' ');
@@ -230,7 +244,7 @@ _gda_sqlite_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc
 
 gchar *
 _gda_sqlite_render_DROP_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
-                              GdaServerOperation *op, G_GNUC_UNUSED GError **error)
+                              GdaServerOperation *op, GError **error)
 {
        GString *string;
        const GValue *value;
@@ -244,7 +258,11 @@ _gda_sqlite_render_DROP_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
                g_string_append (string, " IF EXISTS");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append_c (string, ' ');
        g_string_append (string, tmp);
        g_free (tmp);
@@ -257,7 +275,7 @@ _gda_sqlite_render_DROP_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
 
 gchar *
 _gda_sqlite_render_RENAME_TABLE (GdaServerProvider *provider, GdaConnection *cnc, 
-                                GdaServerOperation *op, G_GNUC_UNUSED GError **error)
+                                GdaServerOperation *op, GError **error)
 {
        GString *string;
        gchar *sql = NULL;
@@ -266,11 +284,19 @@ _gda_sqlite_render_RENAME_TABLE (GdaServerProvider *provider, GdaConnection *cnc
        /* DROP TABLE */
        string = g_string_new ("ALTER TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NEW_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NEW_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, " RENAME TO ");
        g_string_append (string, tmp);
        g_free (tmp);
@@ -293,13 +319,21 @@ _gda_sqlite_render_ADD_COLUMN (GdaServerProvider *provider, GdaConnection *cnc,
        /* DROP TABLE */
        string = g_string_new ("ALTER TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
 
        g_string_append (string, " ADD COLUMN ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/COLUMN_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/COLUMN_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -377,13 +411,21 @@ _gda_sqlite_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cnc
                g_string_append (string, " IF NOT EXISTS ");
        
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
 
        g_string_append (string, " ON ");
        
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_ON_TABLE");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_ON_TABLE", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -394,7 +436,7 @@ _gda_sqlite_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cnc
        nrows = gda_server_operation_get_sequence_size (op, "/INDEX_FIELDS_S");
        for (i = 0; i < nrows; i++) {
                tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                 "/INDEX_FIELDS_S/%d/INDEX_FIELD", i);
+                                                                 "/INDEX_FIELDS_S/%d/INDEX_FIELD", error, i);
                if (tmp) {
                        if (i != 0)
                                g_string_append (string, ", ");
@@ -420,6 +462,10 @@ _gda_sqlite_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cnc
                                }
                        }
                }
+               else {
+                       g_string_free (string, TRUE);
+                       return NULL;
+               }
        }
 
        g_string_append (string, ")");
@@ -446,7 +492,11 @@ _gda_sqlite_render_DROP_INDEX (GdaServerProvider *provider, GdaConnection *cnc,
        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
                g_string_append (string, "IF EXISTS ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DESC_P/INDEX_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DESC_P/INDEX_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -477,7 +527,11 @@ _gda_sqlite_render_CREATE_VIEW (GdaServerProvider *provider, GdaConnection *cnc,
        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
                g_string_append (string, "IF NOT EXISTS ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/VIEW_DEF_P/VIEW_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/VIEW_DEF_P/VIEW_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
        
@@ -515,7 +569,11 @@ _gda_sqlite_render_DROP_VIEW (GdaServerProvider *provider, GdaConnection *cnc,
        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
                g_string_append (string, " IF EXISTS");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/VIEW_DESC_P/VIEW_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/VIEW_DESC_P/VIEW_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append_c (string, ' ');
        g_string_append (string, tmp);
        g_free (tmp);
diff --git a/providers/jdbc/gda-jdbc-ddl.c b/providers/jdbc/gda-jdbc-ddl.c
index 8e4ca9f..a985a36 100644
--- a/providers/jdbc/gda-jdbc-ddl.c
+++ b/providers/jdbc/gda-jdbc-ddl.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2008 Murray Cumming <murrayc murrayc com>
- * Copyright (C) 2008 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2008 - 2014 Vivien Malerba <malerba gnome-db org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -41,7 +41,11 @@ gda_jdbc_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
        /* CREATE TABLE */
        string = g_string_new ("CREATE TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
        g_string_append (string, " (");
@@ -59,7 +63,13 @@ gda_jdbc_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
                        value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i);
                        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) {
                                tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                                 
"/FIELDS_A/@COLUMN_NAME/%d", i);
+                                                                                 "/FIELDS_A/@COLUMN_NAME/%d",
+                                                                                 error, i);
+                               if (!tmp) {
+                                       g_string_free (string, TRUE);
+                                       return NULL;
+                               }
+
                                pkfields = g_slist_append (pkfields, tmp);
                                nbpkfields++;
                        }
@@ -75,7 +85,12 @@ gda_jdbc_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
                                g_string_append (string, ", ");
                                
                        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                         "/FIELDS_A/@COLUMN_NAME/%d", i);
+                                                                         "/FIELDS_A/@COLUMN_NAME/%d", error, 
i);
+                       if (!tmp) {
+                               g_string_free (string, TRUE);
+                               return NULL;
+                       }
+
                        g_string_append (string, tmp);
                        g_free (tmp);
                        g_string_append_c (string, ' ');
diff --git a/providers/mysql/gda-mysql-ddl.c b/providers/mysql/gda-mysql-ddl.c
index c7fd5d9..a80c971 100644
--- a/providers/mysql/gda-mysql-ddl.c
+++ b/providers/mysql/gda-mysql-ddl.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2006 - 2009 Bas Driessen <bas driessen xobas com>
- * Copyright (C) 2006 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2006 - 2014 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2008 - 2011 Murray Cumming <murrayc murrayc com>
  *
  * This library is free software; you can redistribute it and/or
@@ -40,19 +40,29 @@ gda_mysql_render_CREATE_DB (GdaServerProvider *provider, GdaConnection *cnc,
        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
                g_string_append (string, "IF NOT EXISTS ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/DB_DEF_P/DB_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/DB_DEF_P/DB_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
-       value = gda_server_operation_get_value_at (op, "/DB_DEF_P/DB_CSET");
+       value = gda_server_operation_get_value_at_path (op, "/DB_DEF_P/DB_CSET");
        if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) {
                g_string_append (string, " CHARACTER SET ");
                g_string_append (string, g_value_get_string (value));
                first = FALSE;
        }
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/DB_DEF_P/DB_COLLATION");
-       if (tmp) {
+       if (gda_server_operation_get_value_at_path (op, "/DB_DEF_P/DB_COLLATION")) {
+               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
"/DB_DEF_P/DB_COLLATION", error);
+               if (!tmp) {
+                       g_string_free (string, TRUE);
+                       return NULL;
+               }
+
                if (first)
                        first = FALSE;
                else
@@ -83,7 +93,11 @@ gda_mysql_render_DROP_DB (GdaServerProvider *provider, GdaConnection *cnc,
        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
                g_string_append (string, "IF EXISTS ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/DB_DESC_P/DB_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/DB_DESC_P/DB_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -100,7 +114,6 @@ gda_mysql_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
 {
        GString *string;
        const GValue *value;
-       gboolean allok = TRUE;
        gboolean hasfields = FALSE;
        gint nrows;
        gint i;
@@ -120,110 +133,124 @@ gda_mysql_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
                g_string_append (string, "IF NOT EXISTS ");
                
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
        g_string_append (string, " (");
                
        /* FIELDS */
-       if (allok) {
-               GdaServerOperationNode *node;
+       GdaServerOperationNode *node;
 
-               node = gda_server_operation_get_node_info (op, "/FIELDS_A");
-               g_assert (node);
+       node = gda_server_operation_get_node_info (op, "/FIELDS_A");
+       g_assert (node);
 
-               /* finding if there is a composed primary key */
-               nrows = gda_data_model_get_n_rows (node->model);
-               for (i = 0; i < nrows; i++) {
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) {
-                               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
-                                                                                 
"/FIELDS_A/@COLUMN_NAME/%d", i);
-                               pkfields = g_slist_append (pkfields, tmp);
-                               nbpkfields ++;
+       /* finding if there is a composed primary key */
+       nrows = gda_data_model_get_n_rows (node->model);
+       for (i = 0; i < nrows; i++) {
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) {
+                       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
+                                                                         "/FIELDS_A/@COLUMN_NAME/%d",
+                                                                         error, i);
+                       if (!tmp) {
+                               g_string_free (string, TRUE);
+                               return NULL;
                        }
+
+                       pkfields = g_slist_append (pkfields, tmp);
+                       nbpkfields ++;
                }
+       }
 
-               /* manually defined fields */
-               first = TRUE;
-               for (i = 0; i < nrows; i++) {
-                       hasfields = TRUE;
-                       if (first) 
-                               first = FALSE;
-                       else
-                               g_string_append (string, ", ");
-                               
-                       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                         "/FIELDS_A/@COLUMN_NAME/%d", i);
-                       g_string_append (string, tmp);
-                       g_free (tmp);
-                       g_string_append_c (string, ' ');
-                               
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_TYPE/%d", i);
-                       g_string_append (string, g_value_get_string (value));
+       /* manually defined fields */
+       first = TRUE;
+       for (i = 0; i < nrows; i++) {
+               hasfields = TRUE;
+               if (first) 
+                       first = FALSE;
+               else
+                       g_string_append (string, ", ");
+
+               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
+                                                                 "/FIELDS_A/@COLUMN_NAME/%d", error, i);
+               if (!tmp) {
+                       g_string_free (string, TRUE);
+                       return NULL;
+               }
+
+               g_string_append (string, tmp);
+               g_free (tmp);
+               g_string_append_c (string, ' ');
+
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_TYPE/%d", i);
+               g_string_append (string, g_value_get_string (value));
                                
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SIZE/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_UINT)) {
-                               g_string_append_printf (string, "(%d", g_value_get_uint (value));
-
-                               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SCALE/%d", 
i);
-                               if (value && G_VALUE_HOLDS (value, G_TYPE_UINT))
-                                       g_string_append_printf (string, ",%d)", g_value_get_uint (value));
-                               else
-                                       g_string_append (string, ")");
-                       }
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SIZE/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_UINT)) {
+                       g_string_append_printf (string, "(%d", g_value_get_uint (value));
 
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_DEFAULT/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) {
-                               const gchar *str = g_value_get_string (value);
-                               if (str && *str) {
-                                       g_string_append (string, " DEFAULT ");
-                                       g_string_append (string, str);
-                               }
+                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SCALE/%d", i);
+                       if (value && G_VALUE_HOLDS (value, G_TYPE_UINT))
+                               g_string_append_printf (string, ",%d)", g_value_get_uint (value));
+                       else
+                               g_string_append (string, ")");
+               }
+
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_DEFAULT/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) {
+                       const gchar *str = g_value_get_string (value);
+                       if (str && *str) {
+                               g_string_append (string, " DEFAULT ");
+                               g_string_append (string, str);
                        }
-                               
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_NNUL/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
-                               g_string_append (string, " NOT NULL");
+               }
+
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_NNUL/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
+                       g_string_append (string, " NOT NULL");
                        
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_AUTOINC/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
-                               g_string_append (string, " AUTO_INCREMENT");
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_AUTOINC/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
+                       g_string_append (string, " AUTO_INCREMENT");
 
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_UNIQUE/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
-                               g_string_append (string, " UNIQUE");
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_UNIQUE/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
+                       g_string_append (string, " UNIQUE");
                                
-                       if (nbpkfields == 1) {
-                               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", 
i);
-                               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean 
(value))
-                                       g_string_append (string, " PRIMARY KEY");
-                       }
+               if (nbpkfields == 1) {
+                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i);
+                       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
+                               g_string_append (string, " PRIMARY KEY");
+               }
 
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_COMMENT/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) {
-                               GdaDataHandler *dh;
-                               gchar *str;
-                               
-                               dh = gda_server_provider_get_data_handler_g_type (provider, cnc, 
G_TYPE_STRING);
-                               str = gda_data_handler_get_sql_from_value (dh, value);
-                               if (str) {
-                                       if (*str) {
-                                               g_string_append (string, " COMMENT ");
-                                               g_string_append (string, str);
-                                       }
-                                       g_free (str);
-                               }
-                       }
-                               
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_CHECK/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) {
-                               const gchar *str = g_value_get_string (value);
-                               if (str && *str) {
-                                       g_string_append (string, " CHECK (");
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_COMMENT/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) {
+                       GdaDataHandler *dh;
+                       gchar *str;
+
+                       dh = gda_server_provider_get_data_handler_g_type (provider, cnc, G_TYPE_STRING);
+                       str = gda_data_handler_get_sql_from_value (dh, value);
+                       if (str) {
+                               if (*str) {
+                                       g_string_append (string, " COMMENT ");
                                        g_string_append (string, str);
-                                       g_string_append_c (string, ')');
                                }
+                               g_free (str);
+                       }
+               }
+
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_CHECK/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) {
+                       const gchar *str = g_value_get_string (value);
+                       if (str && *str) {
+                               g_string_append (string, " CHECK (");
+                               g_string_append (string, str);
+                               g_string_append_c (string, ')');
                        }
                }
        }
@@ -244,232 +271,225 @@ gda_mysql_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
        g_slist_free (pkfields);
 
        /* foreign keys */
-       if (allok) {
-               GdaServerOperationNode *node;
-
-               first = TRUE;
-               node = gda_server_operation_get_node_info (op, "/FKEY_S");
-               if (node) {
-                       nrows = gda_server_operation_get_sequence_size (op, "/FKEY_S");
-                       for (i = 0; i < nrows; i++) {
-                               gint nbfields = 0, j;
-
-                               g_string_append (string, ", FOREIGN KEY (");
-                               node = gda_server_operation_get_node_info (op, "/FKEY_S/%d/FKEY_FIELDS_A", i);
-                               if (!node || ((nbfields = gda_data_model_get_n_rows (node->model)) == 0)) {
-                                       allok = FALSE;
-                                       g_set_error (error, GDA_SERVER_OPERATION_ERROR,
-                                                    GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
-                                                    "%s", _("No field specified in foreign key constraint"));
-                               }
-                               else {
-                                       for (j = 0; j < nbfields; j++) {
-                                               if (j != 0)
-                                                       g_string_append (string, ", ");
-                                               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, 
provider,
-                                                                                                 
"/FKEY_S/%d/FKEY_FIELDS_A/@FK_FIELD/%d", i, j);
-                                               if (tmp) {
-                                                       g_string_append (string, tmp);
-                                                       g_free (tmp);
-                                               }
-                                               else {
-                                                       allok = FALSE;
-                                                       g_set_error (error, GDA_SERVER_OPERATION_ERROR,
-                                                                    
GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
-                                                                    "%s",  
-                                                                    _("Empty field specified in foreign key 
constraint"));
-                                               }
-                                       }
-                               }
-                               g_string_append (string, ") REFERENCES ");
-                               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                                 
"/FKEY_S/%d/FKEY_REF_TABLE", i);
-                               if (tmp) {
-                                       g_string_append (string, tmp);
-                                       g_free (tmp);
-                               }
-                               else {
-                                       allok = FALSE;
-                                       g_set_error (error, GDA_SERVER_OPERATION_ERROR,
-                                                    GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
-                                                    "%s", _("No referenced table specified in foreign key 
constraint"));
-                               }
+       first = TRUE;
+       node = gda_server_operation_get_node_info (op, "/FKEY_S");
+       if (node) {
+               nrows = gda_server_operation_get_sequence_size (op, "/FKEY_S");
+               for (i = 0; i < nrows; i++) {
+                       gint nbfields = 0, j;
 
-                               g_string_append (string, " (");
+                       g_string_append (string, ", FOREIGN KEY (");
+                       node = gda_server_operation_get_node_info (op, "/FKEY_S/%d/FKEY_FIELDS_A", i);
+                       if (!node || ((nbfields = gda_data_model_get_n_rows (node->model)) == 0)) {
+                               g_string_free (string, TRUE);
+                               g_set_error (error, GDA_SERVER_OPERATION_ERROR,
+                                            GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
+                                            "%s", _("No field specified in foreign key constraint"));
+                               return NULL;
+                       }
+                       else {
                                for (j = 0; j < nbfields; j++) {
                                        if (j != 0)
                                                g_string_append (string, ", ");
                                        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                                         
"/FKEY_S/%d/FKEY_FIELDS_A/@FK_REF_PK_FIELD/%d", i, j);
+                                                                                         
"/FKEY_S/%d/FKEY_FIELDS_A/@FK_FIELD/%d",
+                                                                                         error, i, j);
                                        if (tmp) {
                                                g_string_append (string, tmp);
                                                g_free (tmp);
                                        }
                                        else {
-                                               allok = FALSE;
-                                               g_set_error (error, GDA_SERVER_OPERATION_ERROR,
-                                                            GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
-                                                            "%s",  
-                                                            _("Empty referenced field specified in foreign 
key constraint"));
+                                               g_string_free (string, TRUE);
+                                               return NULL;
                                        }
                                }
-                               g_string_append_c (string, ')');
-                               value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_MATCH_TYPE", 
i);
-                               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string 
(value))
-                                       g_string_append_printf (string, " %s", g_value_get_string (value));
-                               value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONUPDATE", i);
-                               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string 
(value))
-                                       g_string_append_printf (string, " ON UPDATE %s", g_value_get_string 
(value));
-                               value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONDELETE", i);
-                               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string 
(value))
-                                       g_string_append_printf (string, " ON DELETE %s", g_value_get_string 
(value));
                        }
+                       g_string_append (string, ") REFERENCES ");
+                       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
+                                                                         "/FKEY_S/%d/FKEY_REF_TABLE", error, 
i);
+                       if (tmp) {
+                               g_string_append (string, tmp);
+                               g_free (tmp);
+                       }
+                       else {
+                               g_string_free (string, TRUE);
+                               return NULL;
+                       }
+
+                       g_string_append (string, " (");
+                       for (j = 0; j < nbfields; j++) {
+                               if (j != 0)
+                                       g_string_append (string, ", ");
+                               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
+                                                                                 
"/FKEY_S/%d/FKEY_FIELDS_A/@FK_REF_PK_FIELD/%d",
+                                                                                 error, i, j);
+                               if (tmp) {
+                                       g_string_append (string, tmp);
+                                       g_free (tmp);
+                               }
+                               else {
+                                       g_string_free (string, TRUE);
+                                       return NULL;
+                               }
+                       }
+                       g_string_append_c (string, ')');
+                       value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_MATCH_TYPE", i);
+                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
+                               g_string_append_printf (string, " %s", g_value_get_string (value));
+                       value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONUPDATE", i);
+                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
+                               g_string_append_printf (string, " ON UPDATE %s", g_value_get_string (value));
+                       value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONDELETE", i);
+                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
+                               g_string_append_printf (string, " ON DELETE %s", g_value_get_string (value));
                }
        }
 
        g_string_append (string, ")");
 
        if (!hasfields) {
-               allok = FALSE;
                g_set_error (error, GDA_SERVER_OPERATION_ERROR,
                              GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
                             "%s", _("Table to create must have at least one row"));
+               g_string_free (string, TRUE);
+               return NULL;
        }
 
        /* other options */
-       if (allok) {
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_ENGINE");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
-                   g_value_get_string (value) && *g_value_get_string (value))
-                       g_string_append (string, " ENGINE = ");
-               g_string_append (string, g_value_get_string (value));
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_ENGINE");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
+           g_value_get_string (value) && *g_value_get_string (value))
+               g_string_append (string, " ENGINE = ");
+       g_string_append (string, g_value_get_string (value));
                
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_AUTOINC_VALUE");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_INT)) 
-                       g_string_append_printf (string, " AUTO_INCREMENT = %d", g_value_get_int (value));
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_AUTOINC_VALUE");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_INT)) 
+               g_string_append_printf (string, " AUTO_INCREMENT = %d", g_value_get_int (value));
 
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_AVG_ROW_LENTGH");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_INT)) 
-                       g_string_append_printf (string, " AVG_ROW_LENGTH = %d", g_value_get_int (value));
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_AVG_ROW_LENTGH");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_INT)) 
+               g_string_append_printf (string, " AVG_ROW_LENGTH = %d", g_value_get_int (value));
 
-               
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_CSET");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
-                   g_value_get_string (value) && *g_value_get_string (value)) {
-                       g_string_append (string, " CHARACTER SET ");
-                       g_string_append (string, g_value_get_string (value));
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_CSET");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
+           g_value_get_string (value) && *g_value_get_string (value)) {
+               g_string_append (string, " CHARACTER SET ");
+               g_string_append (string, g_value_get_string (value));
 
+               if (gda_server_operation_get_value_at_path (op, "/TABLE_OPTIONS_P/TABLE_COLLATION")) {
                        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                         "/TABLE_OPTIONS_P/TABLE_COLLATION");
-                       if (tmp) {
-                               g_string_append (string, " COLLATE ");
-                               g_string_append (string, tmp);
-                               g_free (tmp);
-                       }
-               }
-               
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_CHECKSUM");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) 
-                       g_string_append (string, " CHECKSUM = 1");
-               
-               value = gda_server_operation_get_value_at (op, "/TABLE_DEF_P/TABLE_COMMENT");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
-                   g_value_get_string (value) && *g_value_get_string (value)) {
-                       GdaDataHandler *dh;
-                       gchar *str;
-                       
-                       dh = gda_server_provider_get_data_handler_g_type (provider, cnc, G_TYPE_STRING);
-                       str = gda_data_handler_get_sql_from_value (dh, value);
-                       if (str) {
-                               g_string_append (string, " COMMENT = ");
-                               g_string_append (string, str);
-                               g_free (str);
+                                                                         "/TABLE_OPTIONS_P/TABLE_COLLATION", 
error);
+                       if (!tmp) {
+                               g_string_free (string, TRUE);
+                               return NULL;
                        }
+                       g_string_append (string, " COLLATE ");
+                       g_string_append (string, tmp);
+                       g_free (tmp);
                }
-               
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_MAX_ROWS");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_INT)) 
-                       g_string_append_printf (string, " MAX_ROWS = %d", g_value_get_int (value));
-               
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_MIN_ROWS");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_INT)) 
-                       g_string_append_printf (string, " MIN_ROWS = %d", g_value_get_int (value));
-               
-               value = gda_server_operation_get_value_at (op, "/TABLE_DEF_P/TABLE_PACK_KEYS");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
-                   g_value_get_string (value) && *g_value_get_string (value)) {
-                       g_string_append (string, " PACK_KEYS = ");
-                       g_string_append (string, g_value_get_string (value));
-               }
+       }
 
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_PASSWORD");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
-                   g_value_get_string (value) && *g_value_get_string (value)) {
-                       GdaDataHandler *dh;
-                       gchar *str;
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_CHECKSUM");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) 
+               g_string_append (string, " CHECKSUM = 1");
 
-                       dh = gda_server_provider_get_data_handler_g_type (provider, cnc, G_TYPE_STRING);
-                       str = gda_data_handler_get_sql_from_value (dh, value);
-                       if (str) {
-                               g_string_append (string, " PASSWORD = ");
-                               g_string_append (string, str);
-                               g_free (str);
-                       }
+       value = gda_server_operation_get_value_at (op, "/TABLE_DEF_P/TABLE_COMMENT");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
+           g_value_get_string (value) && *g_value_get_string (value)) {
+               GdaDataHandler *dh;
+               gchar *str;
+
+               dh = gda_server_provider_get_data_handler_g_type (provider, cnc, G_TYPE_STRING);
+               str = gda_data_handler_get_sql_from_value (dh, value);
+               if (str) {
+                       g_string_append (string, " COMMENT = ");
+                       g_string_append (string, str);
+                       g_free (str);
                }
+       }
 
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_DELAY_KEY_WRITE");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) 
-                       g_string_append (string, " DELAY_KEY_WRITE = 1");
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_MAX_ROWS");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_INT)) 
+               g_string_append_printf (string, " MAX_ROWS = %d", g_value_get_int (value));
 
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_ROW_FORMAT");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
-                   g_value_get_string (value) && *g_value_get_string (value)) {
-                       g_string_append (string, " ROW_FORMAT = ");
-                       g_string_append (string, g_value_get_string (value));
-               }
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_MIN_ROWS");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_INT)) 
+               g_string_append_printf (string, " MIN_ROWS = %d", g_value_get_int (value));
 
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_UNION");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
-                   g_value_get_string (value) && *g_value_get_string (value)) {
-                       g_string_append (string, " UNION = ");
-                       g_string_append (string, g_value_get_string (value));
-               }
+       value = gda_server_operation_get_value_at (op, "/TABLE_DEF_P/TABLE_PACK_KEYS");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
+           g_value_get_string (value) && *g_value_get_string (value)) {
+               g_string_append (string, " PACK_KEYS = ");
+               g_string_append (string, g_value_get_string (value));
+       }
 
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_INSERT_METHOD");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
-                   g_value_get_string (value) && *g_value_get_string (value)) {
-                       g_string_append (string, " INSERT_METHOD = ");
-                       g_string_append (string, g_value_get_string (value));
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_PASSWORD");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
+           g_value_get_string (value) && *g_value_get_string (value)) {
+               GdaDataHandler *dh;
+               gchar *str;
+
+               dh = gda_server_provider_get_data_handler_g_type (provider, cnc, G_TYPE_STRING);
+               str = gda_data_handler_get_sql_from_value (dh, value);
+               if (str) {
+                       g_string_append (string, " PASSWORD = ");
+                       g_string_append (string, str);
+                       g_free (str);
                }
+       }
 
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_DATA_DIR");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
-                   g_value_get_string (value) && *g_value_get_string (value)) {
-                       GdaDataHandler *dh;
-                       gchar *str;
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_DELAY_KEY_WRITE");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) 
+               g_string_append (string, " DELAY_KEY_WRITE = 1");
 
-                       dh = gda_server_provider_get_data_handler_g_type (provider, cnc, G_TYPE_STRING);
-                       str = gda_data_handler_get_sql_from_value (dh, value);
-                       if (str) {
-                               g_string_append (string, " DATA_DIRECTORY = ");
-                               g_string_append (string, str);
-                               g_free (str);
-                       }
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_ROW_FORMAT");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
+           g_value_get_string (value) && *g_value_get_string (value)) {
+               g_string_append (string, " ROW_FORMAT = ");
+               g_string_append (string, g_value_get_string (value));
+       }
+
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_UNION");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
+           g_value_get_string (value) && *g_value_get_string (value)) {
+               g_string_append (string, " UNION = ");
+               g_string_append (string, g_value_get_string (value));
+       }
+
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_INSERT_METHOD");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
+           g_value_get_string (value) && *g_value_get_string (value)) {
+               g_string_append (string, " INSERT_METHOD = ");
+               g_string_append (string, g_value_get_string (value));
+       }
+
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_DATA_DIR");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
+           g_value_get_string (value) && *g_value_get_string (value)) {
+               GdaDataHandler *dh;
+               gchar *str;
+
+               dh = gda_server_provider_get_data_handler_g_type (provider, cnc, G_TYPE_STRING);
+               str = gda_data_handler_get_sql_from_value (dh, value);
+               if (str) {
+                       g_string_append (string, " DATA_DIRECTORY = ");
+                       g_string_append (string, str);
+                       g_free (str);
                }
+       }
 
-               value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_INDEX_DIR");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
-                   g_value_get_string (value) && *g_value_get_string (value)) {
-                       GdaDataHandler *dh;
-                       gchar *str;
+       value = gda_server_operation_get_value_at (op, "/TABLE_OPTIONS_P/TABLE_INDEX_DIR");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && 
+           g_value_get_string (value) && *g_value_get_string (value)) {
+               GdaDataHandler *dh;
+               gchar *str;
 
-                       dh = gda_server_provider_get_data_handler_g_type (provider, cnc, G_TYPE_STRING);
-                       str = gda_data_handler_get_sql_from_value (dh, value);
-                       if (str) {
-                               g_string_append (string, " INDEX_DIRECTORY = ");
-                               g_string_append (string, str);
-                               g_free (str);
-                       }
+               dh = gda_server_provider_get_data_handler_g_type (provider, cnc, G_TYPE_STRING);
+               str = gda_data_handler_get_sql_from_value (dh, value);
+               if (str) {
+                       g_string_append (string, " INDEX_DIRECTORY = ");
+                       g_string_append (string, str);
+                       g_free (str);
                }
        }
 
@@ -500,7 +520,12 @@ gda_mysql_render_DROP_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
                g_string_append (string, " IF EXISTS");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append_c (string, ' ');
        g_string_append (string, tmp);
        g_free (tmp);
@@ -527,11 +552,21 @@ gda_mysql_render_RENAME_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
 
        string = g_string_new ("ALTER TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NEW_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NEW_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, " RENAME TO ");
        g_string_append (string, tmp);
        g_free (tmp);
@@ -554,7 +589,12 @@ gda_mysql_render_COMMENT_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
 
        string = g_string_new ("ALTER TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -582,13 +622,23 @@ gda_mysql_render_ADD_COLUMN (GdaServerProvider *provider, GdaConnection *cnc,
 
        string = g_string_new ("ALTER TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
        g_string_append (string, " ADD COLUMN ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/COLUMN_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/COLUMN_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -689,11 +739,21 @@ gda_mysql_render_DROP_COLUMN (GdaServerProvider *provider, GdaConnection *cnc,
 
        string = g_string_new ("ALTER TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/COLUMN_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/COLUMN_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, " DROP COLUMN ");
        g_string_append (string, tmp);
        g_free (tmp);
@@ -718,12 +778,22 @@ gda_mysql_render_COMMENT_COLUMN (GdaServerProvider *provider, GdaConnection *cnc
 
        string = g_string_new ("ALTER TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        table_name = tmp;
        g_string_append (string, tmp);
        g_free (tmp);
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/COLUMN_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/COLUMN_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        column_name = tmp;
        g_string_append (string, " CHANGE COLUMN ");
        g_string_append (string, tmp);
@@ -805,7 +875,12 @@ gda_mysql_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cnc,
 
        g_string_append (string, "INDEX ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -817,7 +892,12 @@ gda_mysql_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cnc,
 
        g_string_append (string, " ON ");
        
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_ON_TABLE");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_ON_TABLE", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -828,23 +908,25 @@ gda_mysql_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cnc,
        nrows = gda_server_operation_get_sequence_size (op, "/INDEX_FIELDS_S");
        for (i = 0; i < nrows; i++) {
                tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                 "/INDEX_FIELDS_S/%d/INDEX_FIELD", i);
-                if (tmp) {
+                                                                 "/INDEX_FIELDS_S/%d/INDEX_FIELD", error, i);
+               if (!tmp) {
+                       g_string_free (string, TRUE);
+                       return NULL;
+               }
 
-                       if (i != 0)
-                               g_string_append (string, ", ");
-                       g_string_append (string, tmp);
-                       g_free (tmp);
+               if (i != 0)
+                       g_string_append (string, ", ");
+               g_string_append (string, tmp);
+               g_free (tmp);
                        
-                       value = gda_server_operation_get_value_at (op, "/INDEX_FIELDS_S/%d/INDEX_LENGTH", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_INT) && (g_value_get_int (value) > 0))
-                               g_string_append_printf (string, " (%d)", g_value_get_int (value));
-
-                       value = gda_server_operation_get_value_at (op, "/INDEX_FIELDS_S/%d/INDEX_SORT_ORDER", 
i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) {
-                               g_string_append_c (string, ' ');
-                               g_string_append (string, g_value_get_string (value));
-                       }
+               value = gda_server_operation_get_value_at (op, "/INDEX_FIELDS_S/%d/INDEX_LENGTH", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_INT) && (g_value_get_int (value) > 0))
+                       g_string_append_printf (string, " (%d)", g_value_get_int (value));
+
+               value = gda_server_operation_get_value_at (op, "/INDEX_FIELDS_S/%d/INDEX_SORT_ORDER", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) {
+                       g_string_append_c (string, ' ');
+                       g_string_append (string, g_value_get_string (value));
                }
        }
 
@@ -866,11 +948,21 @@ gda_mysql_render_DROP_INDEX (GdaServerProvider *provider, GdaConnection *cnc,
 
        string = g_string_new ("DROP INDEX ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DESC_P/INDEX_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DESC_P/INDEX_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DESC_P/INDEX_ON_TABLE");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DESC_P/INDEX_ON_TABLE", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, " ON ");
        g_string_append (string, tmp);
        g_free (tmp);
@@ -900,7 +992,12 @@ gda_mysql_render_CREATE_VIEW (GdaServerProvider *provider, GdaConnection *cnc,
 
        g_string_append (string, "VIEW ");
        
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/VIEW_DEF_P/VIEW_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/VIEW_DEF_P/VIEW_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -915,21 +1012,18 @@ gda_mysql_render_CREATE_VIEW (GdaServerProvider *provider, GdaConnection *cnc,
                                g_string_append (string, " (");
 
                        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                         "/FIELDS_A/@COLUMN_NAME/%d", i);
-                       if (tmp) {
-                               if (i != 0) 
-                                       g_string_append (string, ", ");
-                               
-                               g_string_append (string, tmp);
-                               g_string_append_c (string, ' ');
-                               g_free (tmp);
-                       }
-                       else {
-                               g_set_error (error, GDA_SERVER_OPERATION_ERROR,
-                                            GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
-                                            "%s", _("Incorrect specified column name"));
-                               allok = FALSE;
+                                                                         "/FIELDS_A/@COLUMN_NAME/%d", error, 
i);
+                       if (!tmp) {
+                               g_string_free (string, TRUE);
+                               return NULL;
                        }
+
+                       if (i != 0) 
+                               g_string_append (string, ", ");
+                               
+                       g_string_append (string, tmp);
+                       g_string_append_c (string, ' ');
+                       g_free (tmp);
                }
                if (i > 0)
                        g_string_append (string, ")");
@@ -969,7 +1063,12 @@ gda_mysql_render_DROP_VIEW (GdaServerProvider *provider, GdaConnection *cnc,
        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
                g_string_append (string, " IF EXISTS");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/VIEW_DESC_P/VIEW_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/VIEW_DESC_P/VIEW_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append_c (string, ' ');
        g_string_append (string, tmp);
        g_free (tmp);
diff --git a/providers/oracle/gda-oracle-ddl.c b/providers/oracle/gda-oracle-ddl.c
index 2267646..7da2921 100644
--- a/providers/oracle/gda-oracle-ddl.c
+++ b/providers/oracle/gda-oracle-ddl.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2006 Bas Driessen <bas driessen xobas com>
- * Copyright (C) 2009 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -41,7 +41,11 @@ gda_oracle_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
        /* CREATE TABLE */
        string = g_string_new ("CREATE TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
        g_string_append (string, " (");
@@ -59,7 +63,13 @@ gda_oracle_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
                        value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i);
                        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { 
                                tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
-                                                                                 
"/FIELDS_A/@COLUMN_NAME/%d", i);
+                                                                                 "/FIELDS_A/@COLUMN_NAME/%d",
+                                                                                 error, i);
+                               if (!tmp) {
+                                       g_string_free (string, TRUE);
+                                       return NULL;
+                               }
+
                                pkfields = g_slist_append (pkfields, tmp);
                                nbpkfields ++;
                        }
@@ -75,7 +85,12 @@ gda_oracle_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
                                g_string_append (string, ", ");
                                
                        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
-                                                                         "/FIELDS_A/@COLUMN_NAME/%d", i);
+                                                                         "/FIELDS_A/@COLUMN_NAME/%d", error, 
i);
+                       if (!tmp) {
+                               g_string_free (string, TRUE);
+                               return NULL;
+                       }
+
                        g_string_append (string, tmp);
                        g_free (tmp);
                        g_string_append_c (string, ' ');
diff --git a/providers/postgres/gda-postgres-ddl.c b/providers/postgres/gda-postgres-ddl.c
index 60f7382..4364add 100644
--- a/providers/postgres/gda-postgres-ddl.c
+++ b/providers/postgres/gda-postgres-ddl.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2006 Bas Driessen <bas driessen xobas com>
- * Copyright (C) 2006 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2006 - 2014 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2008 - 2011 Murray Cumming <murrayc murrayc com>
  * Copyright (C) 2010 David King <davidk openismus com>
  *
@@ -36,7 +36,12 @@ gda_postgres_render_CREATE_DB (GdaServerProvider *provider, GdaConnection *cnc,
 
        string = g_string_new ("CREATE DATABASE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/DB_DEF_P/DB_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/DB_DEF_P/DB_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -88,7 +93,12 @@ gda_postgres_render_DROP_DB (GdaServerProvider *provider, GdaConnection *cnc,
 
        string = g_string_new ("DROP DATABASE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/DB_DESC_P/DB_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/DB_DESC_P/DB_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -104,7 +114,6 @@ gda_postgres_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cn
 {
        GString *string;
        const GValue *value;
-       gboolean allok = TRUE;
        gboolean hasfields = FALSE;
        gint nrows;
        gint i;
@@ -121,123 +130,139 @@ gda_postgres_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cn
        g_string_append (string, "TABLE ");
 
        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                         "/TABLE_DEF_P/TABLE_NAME");
+                                                         "/TABLE_DEF_P/TABLE_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
        g_string_append (string, " (");
                
        /* FIELDS */
-       if (allok) {
-               GdaServerOperationNode *node;
+       GdaServerOperationNode *node;
 
-               node = gda_server_operation_get_node_info (op, "/FIELDS_A");
-               g_assert (node);
+       node = gda_server_operation_get_node_info (op, "/FIELDS_A");
+       g_assert (node);
 
-               /* finding if there is a composed primary key */
-               nrows = gda_data_model_get_n_rows (node->model);
-               for (i = 0; i < nrows; i++) {
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) {
-                               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                                 
"/FIELDS_A/@COLUMN_NAME/%d", i);
-                               pkfields = g_slist_append (pkfields, tmp);
-                               nbpkfields ++;
+       /* finding if there is a composed primary key */
+       nrows = gda_data_model_get_n_rows (node->model);
+       for (i = 0; i < nrows; i++) {
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) {
+                       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
+                                                                         "/FIELDS_A/@COLUMN_NAME/%d", error, 
i);
+                       if (!tmp) {
+                               g_string_free (string, TRUE);
+                               return NULL;
                        }
+
+                       pkfields = g_slist_append (pkfields, tmp);
+                       nbpkfields ++;
                }
+       }
 
-               /* manually defined fields */
-               first = TRUE;
-               for (i = 0; i < nrows; i++) {
-                       hasfields = TRUE;
-                       if (first) 
-                               first = FALSE;
+       /* manually defined fields */
+       first = TRUE;
+       for (i = 0; i < nrows; i++) {
+               hasfields = TRUE;
+               if (first) 
+                       first = FALSE;
+               else
+                       g_string_append (string, ", ");
+
+               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
+                                                                 "/FIELDS_A/@COLUMN_NAME/%d", error, i);
+               if (!tmp) {
+                       g_string_free (string, TRUE);
+                       return NULL;
+               }
+
+               g_string_append (string, tmp);
+               g_free (tmp);
+               g_string_append_c (string, ' ');
+
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_AUTOINC/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
+                       g_string_append (string, "serial");
+               else {
+                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_TYPE/%d", i);
+                       g_string_append (string, g_value_get_string (value));
+               }
+
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SIZE/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_UINT)) {
+                       g_string_append_printf (string, "(%d", g_value_get_uint (value));
+
+                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SCALE/%d", i);
+                       if (value && G_VALUE_HOLDS (value, G_TYPE_UINT))
+                               g_string_append_printf (string, ",%d)", g_value_get_uint (value));
                        else
-                               g_string_append (string, ", ");
-                               
-                       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                         "/FIELDS_A/@COLUMN_NAME/%d", i);
-                       g_string_append (string, tmp);
-                       g_free (tmp);
-                       g_string_append_c (string, ' ');
+                               g_string_append (string, ")");
+               }
 
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_AUTOINC/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
-                               g_string_append (string, "serial");
-                       else {
-                               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_TYPE/%d", 
i);
-                               g_string_append (string, g_value_get_string (value));
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_DEFAULT/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) {
+                       const gchar *str = g_value_get_string (value);
+                       if (str && *str) {
+                               g_string_append (string, " DEFAULT ");
+                               g_string_append (string, str);
                        }
-                               
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SIZE/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_UINT)) {
-                               g_string_append_printf (string, "(%d", g_value_get_uint (value));
+               }
 
-                               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SCALE/%d", 
i);
-                               if (value && G_VALUE_HOLDS (value, G_TYPE_UINT))
-                                       g_string_append_printf (string, ",%d)", g_value_get_uint (value));
-                               else
-                                       g_string_append (string, ")");
-                       }
-                               
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_DEFAULT/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) {
-                               const gchar *str = g_value_get_string (value);
-                               if (str && *str) {
-                                       g_string_append (string, " DEFAULT ");
-                                       g_string_append (string, str);
-                               }
-                       }
-                               
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_NNUL/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
-                               g_string_append (string, " NOT NULL");
-                               
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_UNIQUE/%d", i);
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_NNUL/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
+                       g_string_append (string, " NOT NULL");
+
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_UNIQUE/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
+                       g_string_append (string, " UNIQUE");
+
+               if (nbpkfields == 1) {
+                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i);
                        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
-                               g_string_append (string, " UNIQUE");
-                               
-                       if (nbpkfields == 1) {
-                               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", 
i);
-                               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean 
(value))
-                                       g_string_append (string, " PRIMARY KEY");
-                       }
-                               
-                       value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_CHECK/%d", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) {
-                               const gchar *str = g_value_get_string (value);
-                               if (str && *str) {
-                                       g_string_append (string, " CHECK (");
-                                       g_string_append (string, str);
-                                       g_string_append_c (string, ')');
-                               }
-                       }
+                               g_string_append (string, " PRIMARY KEY");
                }
 
-               /* LIKE inheritance */
-               nrows = gda_server_operation_get_sequence_size (op, "/TABLE_PARENTS_S");
-               for (i = 0; i < nrows; i++) {
-                       value = gda_server_operation_get_value_at (op, 
"/TABLE_PARENTS_S/%d/TABLE_PARENT_COPY", i);
-                       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && !g_value_get_boolean (value)) {
+               value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_CHECK/%d", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) {
+                       const gchar *str = g_value_get_string (value);
+                       if (str && *str) {
+                               g_string_append (string, " CHECK (");
+                               g_string_append (string, str);
+                               g_string_append_c (string, ')');
+                       }
+               }
+       }
 
-                               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                           
"/TABLE_PARENTS_S/%d/TABLE_PARENT_TABLE", i);
-                               if (tmp && *tmp) {
-                                       hasfields = TRUE;
-                                       if (first) 
-                                               first = FALSE;
-                                       else
-                                               g_string_append (string, ", ");
-                                       
-                                       g_string_append (string, "LIKE ");
-                                       g_string_append (string, tmp);
-                                       value = gda_server_operation_get_value_at (op, 
-                                                                                  
"/TABLE_PARENTS_S/%d/TABLE_PARENT_COPY_DEFAULTS", i);
-                                       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && 
-                                           g_value_get_boolean (value))
-                                               g_string_append (string, " INCLUDING DEFAULTS");
-                               }
-                               g_free (tmp);
+       /* LIKE inheritance */
+       nrows = gda_server_operation_get_sequence_size (op, "/TABLE_PARENTS_S");
+       for (i = 0; i < nrows; i++) {
+               value = gda_server_operation_get_value_at (op, "/TABLE_PARENTS_S/%d/TABLE_PARENT_COPY", i);
+               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && !g_value_get_boolean (value)) {
+                       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
+                                                                         
"/TABLE_PARENTS_S/%d/TABLE_PARENT_TABLE",
+                                                                         error, i);
+                       if (!tmp) {
+                               g_string_free (string, TRUE);
+                               return NULL;
                        }
+
+                       hasfields = TRUE;
+                       if (first) 
+                               first = FALSE;
+                       else
+                               g_string_append (string, ", ");
+
+                       g_string_append (string, "LIKE ");
+                       g_string_append (string, tmp);
+                       value = gda_server_operation_get_value_at (op, 
+                                                                  
"/TABLE_PARENTS_S/%d/TABLE_PARENT_COPY_DEFAULTS", i);
+                       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && 
+                           g_value_get_boolean (value))
+                               g_string_append (string, " INCLUDING DEFAULTS");
+                       g_free (tmp);
                }
        }
 
@@ -257,93 +282,83 @@ gda_postgres_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cn
        g_slist_free (pkfields);
 
        /* foreign keys */
-       if (allok) {
-               GdaServerOperationNode *node;
-
-               first = TRUE;
-               node = gda_server_operation_get_node_info (op, "/FKEY_S");
-               if (node) {
-                       nrows = gda_server_operation_get_sequence_size (op, "/FKEY_S");
-                       for (i = 0; i < nrows; i++) {
-                               gint nbfields = 0;
-                               gint j;
-
-                               g_string_append (string, ", FOREIGN KEY (");
-                               node = gda_server_operation_get_node_info (op, "/FKEY_S/%d/FKEY_FIELDS_A", i);
-                               if (!node || ((nbfields = gda_data_model_get_n_rows (node->model)) == 0)) {
-                                       allok = FALSE;
-                                       g_set_error (error, GDA_SERVER_OPERATION_ERROR,
-                                                    GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
-                                                    "%s",
-                                                    _("No field specified in foreign key constraint"));
-                               }
-                               else {
-                                       for (j = 0; j < nbfields; j++) {
-                                               if (j != 0)
-                                                       g_string_append (string, ", ");
-                                               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, 
provider,
-                                                                "/FKEY_S/%d/FKEY_FIELDS_A/@FK_FIELD/%d", i, 
j);
-                                               if (tmp) {
-                                                       g_string_append (string, tmp);
-                                                       g_free (tmp);
-                                               }
-                                               else {
-                                                       allok = FALSE;
-                                                       g_set_error (error, GDA_SERVER_OPERATION_ERROR,
-                                                                    
GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
-                                                                    "%s",  
-                                                                    _("Empty field specified in foreign key 
constraint"));
-                                               }
-                                       }
-                               }
-                               g_string_append (string, ") REFERENCES ");
-
-                               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                                 
"/FKEY_S/%d/FKEY_REF_TABLE", i);
-                               if (tmp) {
-                                       g_string_append (string, tmp);
-                                       g_free (tmp);
-                               }
-                               else {
-                                       allok = FALSE;
-                                       g_set_error (error, GDA_SERVER_OPERATION_ERROR,
-                                                    GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
-                                                    "%s",
-                                                    _("No referenced table specified in foreign key 
constraint"));
-                               }
-
-                               g_string_append (string, " (");
+       first = TRUE;
+       node = gda_server_operation_get_node_info (op, "/FKEY_S");
+       if (node) {
+               nrows = gda_server_operation_get_sequence_size (op, "/FKEY_S");
+               for (i = 0; i < nrows; i++) {
+                       gint nbfields = 0;
+                       gint j;
+
+                       g_string_append (string, ", FOREIGN KEY (");
+                       node = gda_server_operation_get_node_info (op, "/FKEY_S/%d/FKEY_FIELDS_A", i);
+                       if (!node || ((nbfields = gda_data_model_get_n_rows (node->model)) == 0)) {
+                               g_string_free (string, TRUE);
+                               g_set_error (error, GDA_SERVER_OPERATION_ERROR,
+                                            GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
+                                            "%s",
+                                            _("No field specified in foreign key constraint"));
+                               return NULL;
+                       }
+                       else {
                                for (j = 0; j < nbfields; j++) {
                                        if (j != 0)
                                                g_string_append (string, ", ");
                                        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                               
"/FKEY_S/%d/FKEY_FIELDS_A/@FK_REF_PK_FIELD/%d", i, j);
+                                                                                         
"/FKEY_S/%d/FKEY_FIELDS_A/@FK_FIELD/%d",
+                                                                                         error, i, j);
                                        if (tmp) {
                                                g_string_append (string, tmp);
                                                g_free (tmp);
                                        }
                                        else {
-                                               allok = FALSE;
-                                               g_set_error (error, GDA_SERVER_OPERATION_ERROR,
-                                                            GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
-                                                            "%s",  
-                                                            _("Empty referenced field specified in foreign 
key constraint"));
+                                               g_string_free (string, TRUE);
+                                               return NULL;
                                        }
                                }
-                               g_string_append_c (string, ')');
-                               value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_MATCH_TYPE", 
i);
-                               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string 
(value))
-                                       g_string_append_printf (string, " %s", g_value_get_string (value));
-                               value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONUPDATE", i);
-                               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string 
(value))
-                                       g_string_append_printf (string, " ON UPDATE %s", g_value_get_string 
(value));
-                               value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONDELETE", i);
-                               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string 
(value))
-                                       g_string_append_printf (string, " ON DELETE %s", g_value_get_string 
(value));
-                               value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_DEFERRABLE", 
i);
-                               if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string 
(value))
-                                       g_string_append_printf (string, " %s", g_value_get_string (value));
                        }
+                       g_string_append (string, ") REFERENCES ");
+
+                       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
+                                                                         "/FKEY_S/%d/FKEY_REF_TABLE", error, 
i);
+                       if (tmp) {
+                               g_string_append (string, tmp);
+                               g_free (tmp);
+                       }
+                       else {
+                               g_string_free (string, TRUE);
+                               return NULL;
+                       }
+
+                       g_string_append (string, " (");
+                       for (j = 0; j < nbfields; j++) {
+                               if (j != 0)
+                                       g_string_append (string, ", ");
+                               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
+                                                                                 
"/FKEY_S/%d/FKEY_FIELDS_A/@FK_REF_PK_FIELD/%d",
+                                                                                 error, i, j);
+                               if (tmp) {
+                                       g_string_append (string, tmp);
+                                       g_free (tmp);
+                               }
+                               else {
+                                       g_string_free (string, TRUE);
+                                       return NULL;
+                               }
+                       }
+                       g_string_append_c (string, ')');
+                       value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_MATCH_TYPE", i);
+                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
+                               g_string_append_printf (string, " %s", g_value_get_string (value));
+                       value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONUPDATE", i);
+                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
+                               g_string_append_printf (string, " ON UPDATE %s", g_value_get_string (value));
+                       value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONDELETE", i);
+                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
+                               g_string_append_printf (string, " ON DELETE %s", g_value_get_string (value));
+                       value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_DEFERRABLE", i);
+                       if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value))
+                               g_string_append_printf (string, " %s", g_value_get_string (value));
                }
        }
 
@@ -356,7 +371,8 @@ gda_postgres_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cn
                value = gda_server_operation_get_value_at (op, "/TABLE_PARENTS_S/%d/TABLE_PARENT_COPY", i);
                if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) {
                        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                         
"/TABLE_PARENTS_S/%d/TABLE_PARENT_TABLE", i);
+                                                                         
"/TABLE_PARENTS_S/%d/TABLE_PARENT_TABLE",
+                                                                         error, i);
                        if (tmp) {
                                hasfields = TRUE;
                                if (first) {
@@ -368,21 +384,24 @@ gda_postgres_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cn
                                g_string_append (string, tmp);
                                g_free (tmp);
                        }
+                       else {
+                               g_string_free (string, TRUE);
+                               return NULL;
+                       }
                }
        }
 
        if (!hasfields) {
-               allok = FALSE;
+               g_string_free (string, TRUE);
                g_set_error (error, GDA_SERVER_OPERATION_ERROR,
                              GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR,
                             "%s", _("Table to create must have at least one row"));
+               return NULL;
        }
 
-       if (allok) {
-               value = gda_server_operation_get_value_at (op, "/TABLE_DEF_P/TABLE_WITH_OIDS");
-               if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
-                       g_string_append (string, " WITH OIDS");
-       }
+       value = gda_server_operation_get_value_at (op, "/TABLE_DEF_P/TABLE_WITH_OIDS");
+       if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
+               g_string_append (string, " WITH OIDS");
 
        sql = string->str;
        g_string_free (string, FALSE);
@@ -402,7 +421,12 @@ gda_postgres_render_DROP_TABLE   (GdaServerProvider *provider, GdaConnection *cn
        string = g_string_new ("DROP TABLE ");
 
        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                         "/TABLE_DESC_P/TABLE_NAME");
+                                                         "/TABLE_DESC_P/TABLE_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -428,11 +452,21 @@ gda_postgres_render_RENAME_TABLE (GdaServerProvider *provider, GdaConnection *cn
 
        string = g_string_new ("ALTER TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NEW_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DESC_P/TABLE_NEW_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, " RENAME TO ");
        g_string_append (string, tmp);
        g_free (tmp);
@@ -459,13 +493,23 @@ gda_postgres_render_ADD_COLUMN (GdaServerProvider *provider, GdaConnection *cnc,
        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value))
                g_string_append (string, "ONLY ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
        g_string_append (string, " ADD COLUMN ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/COLUMN_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DEF_P/COLUMN_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -533,10 +577,20 @@ gda_postgres_render_DROP_COLUMN  (GdaServerProvider *provider, GdaConnection *cn
 
        string = g_string_new ("ALTER TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/COLUMN_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/COLUMN_DESC_P/COLUMN_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, " DROP COLUMN ");
        g_string_append (string, tmp);
        g_free (tmp);
@@ -579,13 +633,23 @@ gda_postgres_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cn
 
        g_string_append (string, "INDEX ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
        g_string_append (string, " ON ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_ON_TABLE");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_ON_TABLE", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -602,13 +666,18 @@ gda_postgres_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cn
        nrows = gda_server_operation_get_sequence_size (op, "/INDEX_FIELDS_S");
        for (i = 0; i < nrows; i++) {
                tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
-                                                                 "/INDEX_FIELDS_S/%d/INDEX_FIELD", i);
+                                                                 "/INDEX_FIELDS_S/%d/INDEX_FIELD", error, i);
                if (tmp) {
                        if (i != 0)
                                g_string_append (string, ", ");
                        g_string_append (string, tmp);
                        g_free (tmp);
                }
+               else {
+                       g_string_free (string, TRUE);
+                       return NULL;
+               }
+
        }
 
        g_string_append (string, ")");
@@ -643,7 +712,12 @@ gda_postgres_render_DROP_INDEX   (GdaServerProvider *provider, GdaConnection *cn
 
        string = g_string_new ("DROP INDEX ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DESC_P/INDEX_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DESC_P/INDEX_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -665,7 +739,6 @@ gda_postgres_render_CREATE_VIEW (GdaServerProvider *provider, GdaConnection *cnc
 {
        GString *string;
        const GValue *value;
-       gboolean allok = TRUE;
        gchar *sql = NULL;
        gchar *tmp;
 
@@ -681,53 +754,51 @@ gda_postgres_render_CREATE_VIEW (GdaServerProvider *provider, GdaConnection *cnc
 
        g_string_append (string, "VIEW ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/VIEW_DEF_P/VIEW_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/VIEW_DEF_P/VIEW_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
        
-       if (allok) {
-               GdaServerOperationNode *node;
-
-               node = gda_server_operation_get_node_info (op, "/FIELDS_A");
-               if (node) {
-                       gint i, nrows;
-                       GString *cols = NULL;
-
-                       nrows = gda_data_model_get_n_rows (node->model);
-                       for (i = 0; i < nrows; i++) {
-                               tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
-                                                                                 
"/FIELDS_A/@COLUMN_NAME/%d", i);
-                               if (!tmp)
-                                       continue;
-                               if (cols)
-                                       g_string_append (cols, ", ");
-                               g_string_append (cols, tmp);
-                               g_string_append_c (cols, ' ');
-                               g_free (tmp);
-                       }
-                       if (cols) {
-                               g_string_append_c (cols, ')');
-                               g_string_append (string, cols->str);
-                               g_string_free (cols, TRUE);
+       GdaServerOperationNode *node;
+
+       node = gda_server_operation_get_node_info (op, "/FIELDS_A");
+       if (node) {
+               gint i, nrows;
+               GString *cols = NULL;
+
+               nrows = gda_data_model_get_n_rows (node->model);
+               for (i = 0; i < nrows; i++) {
+                       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
+                                                                         "/FIELDS_A/@COLUMN_NAME/%d",
+                                                                         error, i);
+                       if (!tmp) {
+                               g_string_free (string, TRUE);
+                               return NULL;
                        }
+                       if (cols)
+                               g_string_append (cols, ", ");
+                       g_string_append (cols, tmp);
+                       g_string_append_c (cols, ' ');
+                       g_free (tmp);
+               }
+               if (cols) {
+                       g_string_append_c (cols, ')');
+                       g_string_append (string, cols->str);
+                       g_string_free (cols, TRUE);
                }
        }
 
-       if (allok) {
-               value = gda_server_operation_get_value_at (op, "/VIEW_DEF_P/VIEW_DEF");
-               g_assert (value && G_VALUE_HOLDS (value, G_TYPE_STRING));
-               g_string_append (string, " AS ");
-               g_string_append (string, g_value_get_string (value));
-       }
+       value = gda_server_operation_get_value_at (op, "/VIEW_DEF_P/VIEW_DEF");
+       g_assert (value && G_VALUE_HOLDS (value, G_TYPE_STRING));
+       g_string_append (string, " AS ");
+       g_string_append (string, g_value_get_string (value));
 
-       if (allok) {
-               sql = string->str;
-               g_string_free (string, FALSE);
-       }
-       else {
-               sql = NULL;
-               g_string_free (string, TRUE);
-       }
+       sql = string->str;
+       g_string_free (string, FALSE);
 
        return sql;
 }
@@ -748,7 +819,12 @@ gda_postgres_render_DROP_VIEW (GdaServerProvider *provider, GdaConnection *cnc,
                g_string_append (string, " IF EXISTS");
 
        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                         "/VIEW_DESC_P/VIEW_NAME");
+                                                         "/VIEW_DESC_P/VIEW_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append_c (string, ' ');
        g_string_append (string, tmp);
        g_free (tmp);
@@ -789,7 +865,12 @@ gda_postgres_render_CREATE_USER (GdaServerProvider *provider, GdaConnection *cnc
        else
                string = g_string_new ("CREATE USER ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/USER_DEF_P/USER_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/USER_DEF_P/USER_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
 
@@ -891,11 +972,13 @@ gda_postgres_render_CREATE_USER (GdaServerProvider *provider, GdaConnection *cnc
        for (first  = TRUE, i = 0; i < nrows; i++) {
                gchar *name;
                if (use_role)
-                       name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
"/GROUPS_S/%d/ROLE", i);
+                       name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
"/GROUPS_S/%d/ROLE",
+                                                                          error, i);
                else
-                       name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
"/GROUPS_S/%d/USER", i);
+                       name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, 
"/GROUPS_S/%d/USER",
+                                                                          error, i);
 
-               if (name && *name) {
+               if (name) {
                        if (first) {
                                first = FALSE;
                                if (use_role)
@@ -907,15 +990,19 @@ gda_postgres_render_CREATE_USER (GdaServerProvider *provider, GdaConnection *cnc
                                g_string_append (string, ", ");
 
                        g_string_append (string, name);
+                       g_free (name);
+               }
+               else {
+                       g_string_free (string, TRUE);
+                       return NULL;
                }
-               g_free (name);
        }
 
        nrows = gda_server_operation_get_sequence_size (op, "/ROLES_S");
        for (first  = TRUE, i = 0; i < nrows; i++) {
                gchar *name;
-               name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/ROLES_S/%d/ROLE", i);
-               if (name && *name) {
+               name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/ROLES_S/%d/ROLE", 
error, i);
+               if (name) {
                        if (first) {
                                first = FALSE;
                                g_string_append (string, " ROLE ");
@@ -924,15 +1011,19 @@ gda_postgres_render_CREATE_USER (GdaServerProvider *provider, GdaConnection *cnc
                                g_string_append (string, ", ");
 
                        g_string_append (string, name);
+                       g_free (name);
+               }
+               else {
+                       g_string_free (string, TRUE);
+                       return NULL;
                }
-               g_free (name);
        }
 
        nrows = gda_server_operation_get_sequence_size (op, "/ADMINS_S");
        for (first  = TRUE, i = 0; i < nrows; i++) {
                gchar *name;
-               name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/ADMINS_S/%d/ROLE", i);
-               if (name && *name) {
+               name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/ADMINS_S/%d/ROLE", 
error, i);
+               if (name) {
                        if (first) {
                                first = FALSE;
                                g_string_append (string, " ADMIN ");
@@ -941,8 +1032,12 @@ gda_postgres_render_CREATE_USER (GdaServerProvider *provider, GdaConnection *cnc
                                g_string_append (string, ", ");
 
                        g_string_append (string, name);
+                       g_free (name);
+               }
+               else {
+                       g_string_free (string, TRUE);
+                       return NULL;
                }
-               g_free (name);
        }
        
        value = gda_server_operation_get_value_at (op, "/USER_DEF_P/VALIDITY");
@@ -999,7 +1094,12 @@ gda_postgres_render_DROP_USER (GdaServerProvider *provider, GdaConnection *cnc,
                g_string_append (string, " IF EXISTS");
 
        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                         "/USER_DESC_P/USER_NAME");
+                                                         "/USER_DESC_P/USER_NAME", error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append_c (string, ' ');
        g_string_append (string, tmp);
        g_free (tmp);
diff --git a/providers/skel-implementation/capi/gda-capi-ddl.c 
b/providers/skel-implementation/capi/gda-capi-ddl.c
index 0528fbd..30535b7 100644
--- a/providers/skel-implementation/capi/gda-capi-ddl.c
+++ b/providers/skel-implementation/capi/gda-capi-ddl.c
@@ -43,7 +43,11 @@ gda_capi_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
        /* CREATE TABLE */
        string = g_string_new ("CREATE TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
        g_string_append (string, tmp);
        g_free (tmp);
        g_string_append (string, " (");
@@ -61,7 +65,11 @@ gda_capi_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
                        value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i);
                        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) {
                                tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                                 
"/FIELDS_A/@COLUMN_NAME/%d", i);
+                                                                                 
"/FIELDS_A/@COLUMN_NAME/%d", error, i);
+                               if (!tmp) {
+                                       g_string_free (string, TRUE);
+                                       return NULL;
+                               }
                                pkfields = g_slist_append (pkfields, tmp);
                                nbpkfields++;
                        }
@@ -77,7 +85,12 @@ gda_capi_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
                                g_string_append (string, ", ");
                                
                        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                         "/FIELDS_A/@COLUMN_NAME/%d", i);
+                                                                         "/FIELDS_A/@COLUMN_NAME/%d", error, 
i);
+                       if (!tmp) {
+                               g_string_free (string, TRUE);
+                               return NULL;
+                       }
+
                        g_string_append (string, tmp);
                        g_free (tmp);
                        g_string_append_c (string, ' ');
diff --git a/providers/web/gda-web-ddl.c b/providers/web/gda-web-ddl.c
index b083c4a..6d8cdfe 100644
--- a/providers/web/gda-web-ddl.c
+++ b/providers/web/gda-web-ddl.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2008 Murray Cumming <murrayc murrayc com>
- * Copyright (C) 2008 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2008 - 2014 Vivien Malerba <malerba gnome-db org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -40,7 +40,12 @@ gda_web_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
        /* CREATE TABLE */
        string = g_string_new ("CREATE TABLE ");
 
-       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME");
+       tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME", 
error);
+       if (!tmp) {
+               g_string_free (string, TRUE);
+               return NULL;
+       }
+
        g_string_append (string, tmp);
        g_free (tmp);
        g_string_append (string, " (");
@@ -58,7 +63,13 @@ gda_web_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
                        value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i);
                        if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) {
                                tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                                 
"/FIELDS_A/@COLUMN_NAME/%d", i);
+                                                                                 "/FIELDS_A/@COLUMN_NAME/%d",
+                                                                                 error, i);
+                               if (!tmp) {
+                                       g_string_free (string, TRUE);
+                                       return NULL;
+                               }
+
                                pkfields = g_slist_append (pkfields, tmp);
                                nbpkfields++;
                        }
@@ -74,7 +85,12 @@ gda_web_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc,
                                g_string_append (string, ", ");
                                
                        tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider,
-                                                                         "/FIELDS_A/@COLUMN_NAME/%d", i);
+                                                                         "/FIELDS_A/@COLUMN_NAME/%d", error, 
i);
+                       if (!tmp) {
+                               g_string_free (string, TRUE);
+                               return NULL;
+                       }
+
                        g_string_append (string, tmp);
                        g_free (tmp);
                        g_string_append_c (string, ' ');



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