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