Changeset: 68b926da7b27 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=68b926da7b27
Added Files:
        sql/test/BugTracker-2019/Tests/NOT_IN-AND-OR-wrong-results.Bug-6775.sql
        
sql/test/BugTracker-2019/Tests/NOT_IN-AND-OR-wrong-results.Bug-6775.stable.err
        
sql/test/BugTracker-2019/Tests/NOT_IN-AND-OR-wrong-results.Bug-6775.stable.out
        sql/test/BugTracker-2019/Tests/msqldump-mapi-cache.Bug-6777.py
        sql/test/BugTracker-2019/Tests/msqldump-mapi-cache.Bug-6777.stable.err
        sql/test/BugTracker-2019/Tests/msqldump-mapi-cache.Bug-6777.stable.out
        sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.sql
        sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.stable.err
        sql/test/BugTracker-2019/Tests/outer-join-varchar.Bug-6776.stable.out
Modified Files:
        clients/mapiclient/dump.c
        sql/ChangeLog.Nov2019
        sql/server/rel_select.c
        sql/test/BugTracker-2019/Tests/All
        sql/test/miscellaneous/Tests/groupby_expressions.stable.err
Branch: default
Log Message:

Merge with Nov2019


diffs (truncated from 2380 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
@@ -523,22 +523,30 @@ dump_foreign_keys(Mapi mid, const char *
        if (hdl == NULL || mapi_error(mid))
                goto bailout;
 
-       cnt = mapi_fetch_row(hdl);
-       while (cnt != 0) {
-               const char *c_psname = mapi_fetch_field(hdl, 0);
-               const char *c_ptname = mapi_fetch_field(hdl, 1);
-               const char *c_pcolumn = mapi_fetch_field(hdl, 2);
-               const char *c_fcolumn = mapi_fetch_field(hdl, 3);
-               const char *c_nr = mapi_fetch_field(hdl, 4);
-               const char *c_fkname = mapi_fetch_field(hdl, 5);
-               const char *c_faction = mapi_fetch_field(hdl, 6);
-               const char *c_fsname = mapi_fetch_field(hdl, 7);
-               const char *c_ftname = mapi_fetch_field(hdl, 8);
+       while ((cnt = mapi_fetch_row(hdl)) != 0) {
+               char *c_psname = strdup(mapi_fetch_field(hdl, 0));
+               char *c_ptname = strdup(mapi_fetch_field(hdl, 1));
+               char *c_pcolumn = strdup(mapi_fetch_field(hdl, 2));
+               char *c_fcolumn = strdup(mapi_fetch_field(hdl, 3));
+               char *c_nr = mapi_fetch_field(hdl, 4); /* no need to strdup, 
because it's not used */
+               char *c_fkname = strdup(mapi_fetch_field(hdl, 5));
+               char *c_faction = strdup(mapi_fetch_field(hdl, 6));
+               char *c_fsname = strdup(mapi_fetch_field(hdl, 7));
+               char *c_ftname = strdup(mapi_fetch_field(hdl, 8));
                const char **fkeys, **pkeys;
                int nkeys = 0;
 
-               if (mapi_error(mid))
+               if (mapi_error(mid) || !c_psname || !c_ptname || !c_pcolumn || 
!c_fcolumn || !c_fkname || !c_faction || !c_fsname || !c_ftname) {
+                       free(c_psname);
+                       free(c_ptname);
+                       free(c_pcolumn);
+                       free(c_fcolumn);
+                       free(c_fkname);
+                       free(c_faction);
+                       free(c_fsname);
+                       free(c_ftname);
                        goto bailout;
+               }
                assert(strcmp(c_nr, "0") == 0);
                (void) c_nr;    /* pacify compilers in case assertions are 
disabled */
                nkeys = 1;
@@ -549,6 +557,14 @@ dump_foreign_keys(Mapi mid, const char *
                                free((void *) fkeys);
                        if (pkeys)
                                free((void *) pkeys);
+                       free(c_psname);
+                       free(c_ptname);
+                       free(c_pcolumn);
+                       free(c_fcolumn);
+                       free(c_fkname);
+                       free(c_faction);
+                       free(c_fsname);
+                       free(c_ftname);
                        goto bailout;
                }
                pkeys[nkeys - 1] = c_pcolumn;
@@ -560,6 +576,14 @@ dump_foreign_keys(Mapi mid, const char *
                        if (tkeys == NULL) {
                                free((void *) pkeys);
                                free((void *) fkeys);
+                               free(c_psname);
+                               free(c_ptname);
+                               free(c_pcolumn);
+                               free(c_fcolumn);
+                               free(c_fkname);
+                               free(c_faction);
+                               free(c_fsname);
+                               free(c_ftname);
                                goto bailout;
                        }
                        pkeys = tkeys;
@@ -567,6 +591,14 @@ dump_foreign_keys(Mapi mid, const char *
                        if (tkeys == NULL) {
                                free((void *) pkeys);
                                free((void *) fkeys);
+                               free(c_psname);
+                               free(c_ptname);
+                               free(c_pcolumn);
+                               free(c_fcolumn);
+                               free(c_fkname);
+                               free(c_faction);
+                               free(c_fsname);
+                               free(c_ftname);
                                goto bailout;
                        }
                        fkeys = tkeys;
@@ -599,8 +631,6 @@ dump_foreign_keys(Mapi mid, const char *
                        dquoted_print(toConsole, pkeys[i], NULL);
                }
                mnstr_printf(toConsole, ")");
-               free((void *) fkeys);
-               free((void *) pkeys);
                if (c_faction) {
                        int action = atoi(c_faction);
                        int on_update;
@@ -617,6 +647,17 @@ dump_foreign_keys(Mapi mid, const char *
                                mnstr_printf(toConsole, " ON UPDATE %s",
                                             actions[on_update]);
                }
+               free(c_psname);
+               free(c_ptname);
+               free(c_pcolumn);
+               free(c_fcolumn);
+               free(c_fkname);
+               free(c_faction);
+               free(c_fsname);
+               free(c_ftname);
+               free((void *) fkeys);
+               free((void *) pkeys);
+
                if (tname == NULL && tid == NULL)
                        mnstr_printf(toConsole, ";\n");
 
@@ -875,15 +916,19 @@ dump_column_definition(Mapi mid, stream 
        cnt = 0;
        while ((mapi_fetch_row(hdl)) != 0) {
                const char *c_name = mapi_fetch_field(hdl, 0);
-               const char *c_type = mapi_fetch_field(hdl, 1);
-               const char *c_type_digits = mapi_fetch_field(hdl, 2);
-               const char *c_type_scale = mapi_fetch_field(hdl, 3);
+               char *c_type = strdup(mapi_fetch_field(hdl, 1)); /* copy 
variables used outside this scope (look for possible mapi cache incoherency) */
+               char *c_type_digits = strdup(mapi_fetch_field(hdl, 2));
+               char *c_type_scale = strdup(mapi_fetch_field(hdl, 3));
                const char *c_null = mapi_fetch_field(hdl, 4);
                const char *c_default = mapi_fetch_field(hdl, 5);
                int space;
 
-               if (mapi_error(mid))
+               if (mapi_error(mid) || !c_type || !c_type_digits || 
!c_type_scale) {
+                       free(c_type);
+                       free(c_type_digits);
+                       free(c_type_scale);
                        goto bailout;
+               }
                if (cnt)
                        mnstr_printf(toConsole, ",\n");
 
@@ -901,6 +946,9 @@ dump_column_definition(Mapi mid, stream 
                                        CAP(13 - space), "", c_default);
 
                cnt++;
+               free(c_type);
+               free(c_type_digits);
+               free(c_type_scale);
                if (mnstr_errnr(toConsole))
                        goto bailout;
        }
@@ -1167,7 +1215,7 @@ describe_table(Mapi mid, const char *sch
                mnstr_printf(toConsole, "%s\n", view);
                comment_on(toConsole, "VIEW", schema, tname, NULL, remark);
        } else {
-               if(!databaseDump) { //if it is not a database dump the table 
might depend on UDFs that must be dumped first
+               if (!databaseDump) { //if it is not a database dump the table 
might depend on UDFs that must be dumped first
                        assert(table_id);
                        snprintf(query, maxquerylen,
                                         "SELECT f.id, s.name, f.name "
@@ -1178,11 +1226,23 @@ describe_table(Mapi mid, const char *sch
                                         table_id);
                        if ((hdl = mapi_query(mid, query)) == NULL || 
mapi_error(mid))
                                goto bailout;
-                       while(mapi_fetch_row(hdl) != 0) {
-                               const char* function_id = mapi_fetch_field(hdl, 
0);
-                               const char* schema_name = mapi_fetch_field(hdl, 
1);
-                               const char* function_name = 
mapi_fetch_field(hdl, 2);
-                               dump_functions(mid, toConsole, 0, schema_name, 
function_name, function_id);
+                       while (mapi_fetch_row(hdl) != 0) {
+                               bool failure = false;
+                               char *function_id = 
strdup(mapi_fetch_field(hdl, 0));
+                               char *schema_name = 
strdup(mapi_fetch_field(hdl, 1));
+                               char *function_name = 
strdup(mapi_fetch_field(hdl, 2));
+
+                               if (function_id && schema_name && function_name)
+                                       dump_functions(mid, toConsole, 0, 
schema_name, function_name, function_id);
+                               else
+                                       failure = true;
+
+                               free(function_id);
+                               free(schema_name);
+                               free(function_name);
+
+                               if (failure)
+                                       goto bailout;
                        }
                        mapi_close_handle(hdl);
                        hdl = NULL;
@@ -1891,13 +1951,16 @@ dump_function(Mapi mid, stream *toConsol
                sep = "";
                while (mapi_fetch_row(hdl) != 0) {
                        const char *aname = mapi_fetch_field(hdl, 0);
-                       const char *atype = mapi_fetch_field(hdl, 1);
-                       const char *adigs = mapi_fetch_field(hdl, 2);
-                       const char *ascal = mapi_fetch_field(hdl, 3);
+                       char *atype = strdup(mapi_fetch_field(hdl, 1));
+                       char *adigs = strdup(mapi_fetch_field(hdl, 2));
+                       char *ascal = strdup(mapi_fetch_field(hdl, 3));
                        const char *ainou = mapi_fetch_field(hdl, 4);
 
                        if (strcmp(ainou, "0") == 0) {
                                /* end of arguments */
+                               free(atype);
+                               free(adigs);
+                               free(ascal);
                                break;
                        }
 
@@ -1905,6 +1968,10 @@ dump_function(Mapi mid, stream *toConsol
                        dquoted_print(toConsole, aname, " ");
                        dump_type(mid, toConsole, atype, adigs, ascal, hashge);
                        sep = ", ";
+
+                       free(atype);
+                       free(adigs);
+                       free(ascal);
                }
                mnstr_printf(toConsole, ")");
                if (ftype == 1 || ftype == 3 || ftype == 5) {
@@ -1912,9 +1979,9 @@ dump_function(Mapi mid, stream *toConsol
                        mnstr_printf(toConsole, " RETURNS ");
                        do {
                                const char *aname = mapi_fetch_field(hdl, 0);
-                               const char *atype = mapi_fetch_field(hdl, 1);
-                               const char *adigs = mapi_fetch_field(hdl, 2);
-                               const char *ascal = mapi_fetch_field(hdl, 3);
+                               char *atype = strdup(mapi_fetch_field(hdl, 1));
+                               char *adigs = strdup(mapi_fetch_field(hdl, 2));
+                               char *ascal = strdup(mapi_fetch_field(hdl, 3));
 
                                assert(strcmp(mapi_fetch_field(hdl, 4), "0") == 
0);
                                if (ftype == 5) {
@@ -1923,6 +1990,10 @@ dump_function(Mapi mid, stream *toConsol
                                        sep = ", ";
                                }
                                dump_type(mid, toConsole, atype, adigs, ascal, 
hashge);
+
+                               free(atype);
+                               free(adigs);
+                               free(ascal);
                        } while (mapi_fetch_row(hdl) != 0);
                }
                if (flkey) {
@@ -1948,18 +2019,25 @@ dump_function(Mapi mid, stream *toConsol
                free(ftkey);
                sep = "";
                while (mapi_fetch_row(hdl) != 0) {
-                       const char *atype = mapi_fetch_field(hdl, 1);
-                       const char *adigs = mapi_fetch_field(hdl, 2);
-                       const char *ascal = mapi_fetch_field(hdl, 3);
+                       char *atype = strdup(mapi_fetch_field(hdl, 1));
+                       char *adigs = strdup(mapi_fetch_field(hdl, 2));
+                       char *ascal = strdup(mapi_fetch_field(hdl, 3));
                        const char *ainou = mapi_fetch_field(hdl, 4);
 
                        if (strcmp(ainou, "0") == 0) {
                                /* end of arguments */
+                               free(atype);
+                               free(adigs);
+                               free(ascal);
                                break;
                        }
                        mnstr_printf(toConsole, "%s", sep);
                        dump_type(mid, toConsole, atype, adigs, ascal, hashge);
                        sep = ", ";
+
+                       free(atype);
+                       free(adigs);
+                       free(ascal);
                }
                mnstr_printf(toConsole, ") IS ");
                squoted_print(toConsole, remark, '\'');
@@ -2053,13 +2131,19 @@ dump_functions(Mapi mid, stream *toConso
        while (!mnstr_errnr(toConsole) && mapi_fetch_row(hdl) != 0) {
                long sid = strtol(mapi_fetch_field(hdl, 0), NULL, 10);
                const char *schema = mapi_fetch_field(hdl, 1);
-               const char *fid = mapi_fetch_field(hdl, 2);
-               if (set_schema && sid != prev_sid) {
-                       mnstr_printf(toConsole, "SET SCHEMA ");
-                       dquoted_print(toConsole, schema, ";\n");
-                       prev_sid = sid;
+               char *fid = strdup(mapi_fetch_field(hdl, 2));
+
+               if (fid) {
+                       if (set_schema && sid != prev_sid) {
+                               mnstr_printf(toConsole, "SET SCHEMA ");
+                               dquoted_print(toConsole, schema, ";\n");
+                               prev_sid = sid;
+                       }
+                       dump_function(mid, toConsole, fid, hashge);
+                       free(fid);
+               } else {
+                       goto bailout;
                }
-               dump_function(mid, toConsole, fid, hashge);
        }
        if (mapi_error(mid))
                goto bailout;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to