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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list