Changeset: 1ae81b91cb04 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1ae81b91cb04
Modified Files:
        clients/mapiclient/dump.c
        clients/mapiclient/mclient.c
        clients/mapiclient/msqldump.h
Branch: Aug2018
Log Message:

Do not exit from a library function; not even a very local one.
Do some proper error handling when getting the clause to retrieve
comments.
This fixes bug 6637.


diffs (truncated from 330 to 300 lines):

diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -16,13 +16,74 @@
 #include "msqldump.h"
 
 static const char *
-get_compat_clause(Mapi mid)
+get_with_comments_as_clause(Mapi mid)
 {
-       static const char *compat_clause = NULL;
-       if (!compat_clause) {
-               compat_clause = get_with_comments_as_clause(mid);
+       const char *query = /* check whether sys.comments exists */
+               "SELECT t.id "
+               "FROM sys._tables t JOIN sys.schemas s ON t.schema_id = s.id "
+               "WHERE s.name = 'sys' AND t.name = 'comments'";
+       const char *new_clause =
+               "WITH comments AS (SELECT * FROM sys.comments), "
+                    "function_types AS (SELECT * FROM sys.function_types), "
+                    "function_languages AS (SELECT * FROM 
sys.function_languages)";
+       const char *old_clause =
+               "WITH comments AS ("
+                       "SELECT 42 AS id, 'no comment' AS remark WHERE FALSE"
+                    "), "
+                    "function_types AS ("
+                       "SELECT function_type_id, function_type_name, 
function_type_keyword "
+                       "FROM sys.function_types, "
+                            "(VALUES "
+                               "(1, 'FUNCTION'),  "
+                               "(2, 'PROCEDURE'), "
+                               "(3, 'AGGREGATE'), "
+                               "(4, 'FILTER FUNCTION'), "
+                               "(5, 'FUNCTION'),  "
+                               "(6, 'FUNCTION'),  "
+                               "(7, 'LOADER')) AS (id, function_type_keyword) "
+                       "WHERE id = function_type_id"
+                    "), "
+                    "function_languages AS ("
+                       "SELECT language_id, language_name, language_keyword "
+                       "FROM sys.function_languages, (VALUES "
+                               "(3, 'R'), "
+                               "(4, 'C', 'C'), "
+                               "(6, 'PYTHON'), "
+                               "(7, 'PYTHON_MAP'), "
+                               "(8, 'PYTHON2'), "
+                               "(9, 'PYTHON2_MAP'), "
+                               "(10, 'PYTHON3'), "
+                               "(11, 'PYTHON3_MAP'), "
+                               "(12, 'C++', 'CPP')) AS (id, language_keyword) "
+                       "WHERE id = language_id"
+                    ")";
+
+       MapiHdl hdl;
+       const char *comments_clause;
+
+       hdl = mapi_query(mid, query);
+       if (mapi_error(mid)) {
+               if (hdl) {
+                       mapi_explain_result(hdl, stderr);
+                       mapi_close_handle(hdl);
+               } else
+                       mapi_explain(mid, stderr);
+               return NULL;
        }
-       return compat_clause;
+       comments_clause = mapi_fetch_row(hdl) ? new_clause : old_clause;
+       mapi_close_handle(hdl);
+
+       return comments_clause;
+}
+
+const char *
+get_comments_clause(Mapi mid)
+{
+       static const char *comments_clause = NULL;
+       if (comments_clause == NULL) {
+               comments_clause = get_with_comments_as_clause(mid);
+       }
+       return comments_clause;
 }
 
 static int
@@ -824,6 +885,10 @@ describe_table(Mapi mid, const char *sch
        size_t maxquerylen;
        char *sname = NULL;
        bool hashge;
+       const char *comments_clause = get_comments_clause(mid);
+
+       if (comments_clause == NULL)
+               return 1;
 
        if (schema == NULL) {
                if ((sname = strchr(tname, '.')) != NULL) {
@@ -851,7 +916,7 @@ describe_table(Mapi mid, const char *sch
                 "WHERE s.name = '%s' AND "
                       "t.schema_id = s.id AND "
                       "t.name = '%s'",
-                get_compat_clause(mid),
+                comments_clause,
                 schema, tname);
 
        if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid))
@@ -1011,7 +1076,7 @@ describe_table(Mapi mid, const char *sch
                         "WHERE i.id = c.id "
                           "AND i.table_id = (SELECT id FROM sys._tables WHERE 
schema_id = (select id FROM sys.schemas WHERE name = '%s') AND name = '%s') "
                         "ORDER BY i.name",
-                        get_compat_clause(mid),
+                        comments_clause,
                         schema, tname);
                if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid))
                        goto bailout;
@@ -1031,7 +1096,7 @@ describe_table(Mapi mid, const char *sch
                 "WHERE col.id = com.id "
                   "AND col.table_id = (SELECT id FROM sys._tables WHERE 
schema_id = (SELECT id FROM sys.schemas WHERE name = '%s') AND name = '%s') "
                 "ORDER BY number",
-                get_compat_clause(mid),
+                comments_clause,
                 schema, tname);
        if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid))
                goto bailout;
@@ -1082,6 +1147,10 @@ describe_sequence(Mapi mid, const char *
        char *query;
        size_t maxquerylen;
        char *sname = NULL;
+       const char *comments_clause = get_comments_clause(mid);
+
+       if (comments_clause == NULL)
+               return 1;
 
        if (schema == NULL) {
                if ((sname = strchr(tname, '.')) != NULL) {
@@ -1116,7 +1185,7 @@ describe_sequence(Mapi mid, const char *
                      "s.name = '%s' AND "
                      "seq.name = '%s' "
                "ORDER BY s.name, seq.name",
-               get_compat_clause(mid),
+               comments_clause,
                schema, tname);
 
        if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid))
@@ -1180,6 +1249,10 @@ describe_schema(Mapi mid, const char *sn
 {
        MapiHdl hdl = NULL;
        char schemas[5120];
+       const char *comments_clause = get_comments_clause(mid);
+
+       if (comments_clause == NULL)
+               return 1;
 
        snprintf(schemas, sizeof(schemas),
                "%s "
@@ -1189,7 +1262,7 @@ describe_schema(Mapi mid, const char *sn
                "WHERE s.\"authorization\" = a.id AND "
                      "s.name = '%s' "
                "ORDER BY s.name",
-               get_compat_clause(mid),
+               comments_clause,
                sname);
 
        if ((hdl = mapi_query(mid, schemas)) == NULL || mapi_error(mid)) {
@@ -1428,13 +1501,17 @@ dump_function(Mapi mid, stream *toConsol
        MapiHdl hdl;
        size_t query_size = 5120 + strlen(fid);
        int query_len;
-       char *query = malloc(query_size);
+       char *query;
        const char *sep;
        char *ffunc = NULL, *flkey = NULL, *remark = NULL;
        char *sname, *fname, *ftkey;
        int flang, ftype;
+       const char *comments_clause = get_comments_clause(mid);
 
-       if (query == NULL)
+       if (comments_clause == NULL)
+               return 1;
+
+       if ((query = malloc(query_size)) == NULL)
                return 1;
 
        query_len = snprintf(query, query_size,
@@ -1454,7 +1531,7 @@ dump_function(Mapi mid, stream *toConsol
                           "LEFT OUTER JOIN function_languages fl ON f.language 
= fl.language_id "
                           "LEFT OUTER JOIN comments c ON f.id = c.id "
                      "WHERE f.id = %s",
-                     get_compat_clause(mid), fid);
+                     comments_clause, fid);
        assert(query_len < (int) query_size);
        if (query_len < 0 || query_len >= (int) query_size ||
            (hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) {
@@ -1897,6 +1974,10 @@ dump_database(Mapi mid, stream *toConsol
        char *query;
        size_t query_size = 5120;
        int query_len = 0;
+       const char *comments_clause = get_comments_clause(mid);
+
+       if (comments_clause == NULL)
+               return 1;
 
        query = malloc(query_size);
        if (!query)
@@ -1959,7 +2040,7 @@ dump_database(Mapi mid, stream *toConsol
 
                /* dump schemas */
                query_len = snprintf(query, query_size, "%s %s",
-                                    get_compat_clause(mid), schemas);
+                                    comments_clause, schemas);
                assert(query_len < (int) query_size);
                if (query_len < 0 ||
                    query_len >= (int) query_size ||
@@ -2034,7 +2115,7 @@ dump_database(Mapi mid, stream *toConsol
 
        /* dump sequences, part 1 */
        query_len = snprintf(query, query_size, "%s %s",
-                            get_compat_clause(mid), sequences1);
+                            comments_clause, sequences1);
        assert(query_len < (int) query_size);
        if (query_len < 0 ||
            query_len >= (int) query_size ||
@@ -2131,7 +2212,7 @@ dump_database(Mapi mid, stream *toConsol
 
        /* dump views, functions, and triggers */
        query_len = snprintf(query, query_size, "%s%s",
-                             get_compat_clause(mid), views_functions_triggers);
+                             comments_clause, views_functions_triggers);
        assert(query_len < (int) query_size);
        if (query_len < 0 ||
            query_len >= (int) query_size ||
@@ -2468,61 +2549,3 @@ dump_version(Mapi mid, stream *toConsole
        if (hdl)
                mapi_close_handle(hdl);
 }
-
-const char *
-get_with_comments_as_clause(Mapi mid)
-{
-       const char *query = /* check whether sys.comments exists */
-               "SELECT t.id "
-               "FROM sys._tables t JOIN sys.schemas s ON t.schema_id = s.id "
-               "WHERE s.name = 'sys' AND t.name = 'comments'";
-       const char *new_clause =
-               "WITH comments AS (SELECT * FROM sys.comments), "
-                    "function_types AS (SELECT * FROM sys.function_types), "
-                    "function_languages AS (SELECT * FROM 
sys.function_languages)";
-       const char *old_clause =
-               "WITH comments AS ("
-                       "SELECT 42 AS id, 'no comment' AS remark WHERE FALSE"
-                    "), "
-                    "function_types AS ("
-                       "SELECT function_type_id, function_type_name, 
function_type_keyword "
-                       "FROM sys.function_types, "
-                            "(VALUES "
-                               "(1, 'FUNCTION'),  "
-                               "(2, 'PROCEDURE'), "
-                               "(3, 'AGGREGATE'), "
-                               "(4, 'FILTER FUNCTION'), "
-                               "(5, 'FUNCTION'),  "
-                               "(6, 'FUNCTION'),  "
-                               "(7, 'LOADER')) AS (id, function_type_keyword) "
-                       "WHERE id = function_type_id"
-                    "), "
-                    "function_languages AS ("
-                       "SELECT language_id, language_name, language_keyword "
-                       "FROM sys.function_languages, (VALUES "
-                               "(3, 'R'), "
-                               "(4, 'C', 'C'), "
-                               "(6, 'PYTHON'), "
-                               "(7, 'PYTHON_MAP'), "
-                               "(8, 'PYTHON2'), "
-                               "(9, 'PYTHON2_MAP'), "
-                               "(10, 'PYTHON3'), "
-                               "(11, 'PYTHON3_MAP'), "
-                               "(12, 'C++', 'CPP')) AS (id, language_keyword) "
-                       "WHERE id = language_id"
-                    ")";
-
-       MapiHdl hdl;
-       const char *compat_clause;
-
-       hdl = mapi_query(mid, query);
-       if (mapi_error(mid)) {
-               mapi_explain(mid, stderr);
-               exit(2);
-       }
-       compat_clause = mapi_fetch_row(hdl) ? new_clause : old_clause;
-       mapi_close_handle(hdl);
-       hdl = NULL;
-
-       return compat_clause;
-}
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -2611,9 +2611,16 @@ doFile(Mapi mid, stream *fp, bool useins
                                                char *query = malloc(len);
                                                char *q = query, *endq = query 
+ len;
                                                char *name_column = hasSchema ? 
"fullname" : "name";
+                                               const char *comments_clause = 
get_comments_clause(mid);
 
-                                               if (!query)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to