Changeset: 464415388beb for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/464415388beb Modified Files: sql/storage/bat/bat_storage.c sql/storage/store.c Branch: iso Log Message:
Merged with Jul2021 diffs (truncated from 3782 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 @@ -394,15 +394,15 @@ dump_foreign_keys(Mapi mid, const char * goto bailout; } snprintf(query, maxquerylen, - "SELECT ps.name, " /* 0 */ + "SELECT ps.name, " /* 0 */ "pkt.name, " /* 1 */ - "pkkc.name, " /* 2 */ - "fkkc.name, " /* 3 */ - "fkkc.nr, " /* 4 */ - "fkk.name, " /* 5 */ - "fkk.\"action\", " /* 6 */ - "fs.name, " /* 7 */ - "fkt.name " /* 8 */ + "pkkc.name, " /* 2 */ + "fkkc.name, " /* 3 */ + "fkkc.nr, " /* 4 */ + "fkk.name, " /* 5 */ + "fkk.\"action\", " /* 6 */ + "fs.name, " /* 7 */ + "fkt.name " /* 8 */ "FROM sys._tables fkt, " "sys.objects fkkc, " "sys.keys fkk, " @@ -430,15 +430,15 @@ dump_foreign_keys(Mapi mid, const char * if (query == NULL) goto bailout; snprintf(query, maxquerylen, - "SELECT ps.name, " /* 0 */ + "SELECT ps.name, " /* 0 */ "pkt.name, " /* 1 */ - "pkkc.name, " /* 2 */ - "fkkc.name, " /* 3 */ - "fkkc.nr, " /* 4 */ - "fkk.name, " /* 5 */ - "fkk.\"action\", " /* 6 */ - "0, " /* 7 */ - "fkt.name " /* 8 */ + "pkkc.name, " /* 2 */ + "fkkc.name, " /* 3 */ + "fkkc.nr, " /* 4 */ + "fkk.name, " /* 5 */ + "fkk.\"action\", " /* 6 */ + "0, " /* 7 */ + "fkt.name " /* 8 */ "FROM sys._tables fkt, " "sys.objects fkkc, " "sys.keys fkk, " @@ -457,14 +457,14 @@ dump_foreign_keys(Mapi mid, const char * "ORDER BY fkk.name, fkkc.nr", tid); } else { query = "SELECT ps.name, " /* 0 */ - "pkt.name, " /* 1 */ + "pkt.name, " /* 1 */ "pkkc.name, " /* 2 */ "fkkc.name, " /* 3 */ - "fkkc.nr, " /* 4 */ - "fkk.name, " /* 5 */ + "fkkc.nr, " /* 4 */ + "fkk.name, " /* 5 */ "fkk.\"action\", " /* 6 */ - "fs.name, " /* 7 */ - "fkt.name " /* 8 */ + "fs.name, " /* 7 */ + "fkt.name " /* 8 */ "FROM sys._tables fkt, " "sys.objects fkkc, " "sys.keys fkk, " @@ -494,40 +494,56 @@ dump_foreign_keys(Mapi mid, const char * cnt = mapi_fetch_row(hdl); while (cnt != 0) { - char *nc_psname = mapi_fetch_field(hdl, 0), *c_psname = nc_psname ? strdup(nc_psname) : NULL; - char *nc_ptname = mapi_fetch_field(hdl, 1), *c_ptname = nc_ptname ? strdup(nc_ptname) : NULL; - char *nc_pcolumn = mapi_fetch_field(hdl, 2), *c_pcolumn = nc_pcolumn ? strdup(nc_pcolumn) : NULL; - char *nc_fcolumn = mapi_fetch_field(hdl, 3), *c_fcolumn = nc_fcolumn ? strdup(nc_fcolumn) : NULL; - char *c_nr = mapi_fetch_field(hdl, 4); /* no need to strdup, because it's not used */ - char *nc_fkname = mapi_fetch_field(hdl, 5), *c_fkname = nc_fkname ? strdup(nc_fkname) : NULL; - char *nc_faction = mapi_fetch_field(hdl, 6), *c_faction = nc_faction ? strdup(nc_faction) : NULL; - char *nc_fsname = mapi_fetch_field(hdl, 7), *c_fsname = nc_fsname ? strdup(nc_fsname) : NULL; - char *nc_ftname = mapi_fetch_field(hdl, 8), *c_ftname = nc_ftname ? strdup(nc_ftname) : NULL; - char **fkeys, **pkeys, *npkey, *nfkey; - int nkeys = 0; + char *c_psname = mapi_fetch_field(hdl, 0); + char *c_ptname = mapi_fetch_field(hdl, 1); + char *c_pcolumn = mapi_fetch_field(hdl, 2); + char *c_fcolumn = mapi_fetch_field(hdl, 3); + char *c_nr = mapi_fetch_field(hdl, 4); + char *c_fkname = mapi_fetch_field(hdl, 5); + char *c_faction = mapi_fetch_field(hdl, 6); + char *c_fsname = mapi_fetch_field(hdl, 7); + char *c_ftname = mapi_fetch_field(hdl, 8); + char **fkeys, **pkeys; + int nkeys = 1; - if (mapi_error(mid) || (nc_psname && !c_psname) || (nc_ptname && !c_ptname) || (nc_pcolumn && !c_pcolumn) || (nc_fcolumn && !c_fcolumn) || - (nc_fkname && !c_fkname) || (nc_faction && !c_faction) || (nc_fsname && !c_fsname) || (nc_ftname && !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); + if (mapi_error(mid) || c_psname == NULL || c_ptname == NULL || + c_pcolumn == NULL || c_fcolumn == NULL || c_nr == NULL || + c_fkname == NULL || c_faction == NULL || c_fsname == NULL || + c_ftname == NULL) { + /* none of the columns should be NULL */ goto bailout; } assert(strcmp(c_nr, "0") == 0); (void) c_nr; /* pacify compilers in case assertions are disabled */ - nkeys = 1; fkeys = malloc(nkeys * sizeof(*fkeys)); pkeys = malloc(nkeys * sizeof(*pkeys)); - npkey = c_pcolumn ? strdup(c_pcolumn) : NULL; - nfkey = c_fcolumn ? strdup(c_fcolumn) : NULL; - if (!fkeys || !pkeys || (c_pcolumn && !npkey) || (c_fcolumn && !nfkey)) { - free(nfkey); - free(npkey); + if (fkeys == NULL || pkeys == NULL) { + free(fkeys); + free(pkeys); + goto bailout; + } + pkeys[0] = strdup(c_pcolumn); + fkeys[0] = strdup(c_fcolumn); + c_psname = strdup(c_psname); + c_ptname = strdup(c_ptname); + c_pcolumn = strdup(c_pcolumn); + c_fcolumn = strdup(c_fcolumn); + c_fkname = strdup(c_fkname); + c_faction = strdup(c_faction); + c_fsname = strdup(c_fsname); + c_ftname = strdup(c_ftname); + if (c_psname == NULL || c_ptname == NULL || c_pcolumn == NULL || + c_fcolumn == NULL || c_nr == NULL || c_fkname == NULL || + c_faction == NULL || c_fsname == NULL || c_ftname == NULL || + fkeys[0] == NULL || pkeys[0] == NULL) { + freeall_bailout: + /* free all temporarily allocated data, then bailout */ + while (nkeys-- > 0) { + if (pkeys) + free(pkeys[nkeys]); + if (fkeys) + free(fkeys[nkeys]); + } free(fkeys); free(pkeys); free(c_psname); @@ -540,40 +556,29 @@ dump_foreign_keys(Mapi mid, const char * free(c_ftname); goto bailout; } - pkeys[nkeys - 1] = npkey; - fkeys[nkeys - 1] = nfkey; while ((cnt = mapi_fetch_row(hdl)) != 0 && strcmp(mapi_fetch_field(hdl, 4), "0") != 0) { - char *npkey = mapi_fetch_field(hdl, 2), *pkey = npkey ? strdup(npkey) : NULL; - char *nfkey = mapi_fetch_field(hdl, 3), *fkey = nfkey ? strdup(nfkey) : NULL; + char *pkey = mapi_fetch_field(hdl, 2); + char *fkey = mapi_fetch_field(hdl, 3); char **tkeys; - nkeys++; - tkeys = realloc(pkeys, nkeys * sizeof(*pkeys)); + if (pkey == NULL || fkey == NULL) { + /* we're not expecting NULL values */ + goto freeall_bailout; + } + tkeys = realloc(pkeys, (nkeys + 1) * sizeof(*pkeys)); + if (tkeys == NULL) + goto freeall_bailout; pkeys = tkeys; - tkeys = realloc(fkeys, nkeys * sizeof(*fkeys)); + tkeys = realloc(fkeys, (nkeys + 1) * sizeof(*fkeys)); + if (tkeys == NULL) + goto freeall_bailout; fkeys = tkeys; - if (!tkeys || !fkeys || (npkey && !pkey) || (nfkey && !fkey)) { - nkeys--; - for (int i = 0 ; i < nkeys; i++) { - free(pkeys[i]); - free(fkeys[i]); - } - free(pkey); - free(fkey); - free(pkeys); - free(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; + nkeys++; + pkeys[nkeys - 1] = strdup(pkey); + fkeys[nkeys - 1] = strdup(fkey); + if (pkeys[nkeys - 1] == NULL || fkeys[nkeys - 1] == NULL) { + goto freeall_bailout; } - pkeys[nkeys - 1] = pkey; - fkeys[nkeys - 1] = fkey; } if (tname == NULL && tid == NULL) { mnstr_printf(toConsole, "ALTER TABLE "); @@ -625,9 +630,9 @@ dump_foreign_keys(Mapi mid, const char * free(c_faction); free(c_fsname); free(c_ftname); - for (int i = 0 ; i < nkeys; i++) { - free(pkeys[i]); - free(fkeys[i]); + while (nkeys-- > 0) { + free(pkeys[nkeys]); + free(fkeys[nkeys]); } free(fkeys); free(pkeys); @@ -866,24 +871,24 @@ dump_column_definition(Mapi mid, stream if (tid) snprintf(query, maxquerylen, "SELECT c.name, " /* 0 */ - "c.type, " /* 1 */ + "c.type, " /* 1 */ "c.type_digits, " /* 2 */ "c.type_scale, " /* 3 */ "c.\"null\", " /* 4 */ "c.\"default\", " /* 5 */ - "c.number " /* 6 */ + "c.number " /* 6 */ "FROM sys._columns c " "WHERE c.table_id = %s " "ORDER BY c.number", tid); else snprintf(query, maxquerylen, "SELECT c.name, " /* 0 */ - "c.type, " /* 1 */ + "c.type, " /* 1 */ "c.type_digits, " /* 2 */ "c.type_scale, " /* 3 */ "c.\"null\", " /* 4 */ "c.\"default\", " /* 5 */ - "c.number " /* 6 */ + "c.number " /* 6 */ "FROM sys._columns c, " "sys._tables t, " "sys.schemas s " @@ -974,9 +979,9 @@ dump_column_definition(Mapi mid, stream if (tid) snprintf(query, maxquerylen, "SELECT kc.name, " /* 0 */ - "kc.nr, " /* 1 */ - "k.name, " /* 2 */ - "kc.id " /* 3 */ + "kc.nr, " /* 1 */ + "k.name, " /* 2 */ + "kc.id " /* 3 */ "FROM sys.objects kc, " "sys.keys k " "WHERE kc.id = k.id " @@ -986,9 +991,9 @@ dump_column_definition(Mapi mid, stream else snprintf(query, maxquerylen, "SELECT kc.name, " /* 0 */ - "kc.nr, " /* 1 */ - "k.name, " /* 2 */ - "kc.id " /* 3 */ + "kc.nr, " /* 1 */ + "k.name, " /* 2 */ + "kc.id " /* 3 */ "FROM sys.objects kc, " "sys.keys k, " "sys.schemas s, " @@ -1033,9 +1038,9 @@ dump_column_definition(Mapi mid, stream if (tid) snprintf(query, maxquerylen, "SELECT kc.name, " /* 0 */ - "kc.nr, " /* 1 */ - "k.name, " /* 2 */ - "kc.id " /* 3 */ + "kc.nr, " /* 1 */ + "k.name, " /* 2 */ + "kc.id " /* 3 */ "FROM sys.objects kc, " "sys.keys k " "WHERE kc.id = k.id " @@ -1045,9 +1050,9 @@ dump_column_definition(Mapi mid, stream else snprintf(query, maxquerylen, "SELECT kc.name, " /* 0 */ - "kc.nr, " /* 1 */ - "k.name, " /* 2 */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list