Changeset: cffe5ff7bdad for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cffe5ff7bdad
Modified Files:
        gdk/gdk.h
        gdk/gdk_private.h
Branch: string_imprints
Log Message:

Merge with default


diffs (truncated from 125754 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -5752,7 +5752,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batcalc",   "timestamp",    "pattern batcalc.timestamp(X_0:bat[:timestamp], 
X_1:bat[:oid], X_2:int):bat[:timestamp] ",      "timestamp_2time_timestamp;",   
""      ]
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:str], 
X_1:bat[:oid]):bat[:uuid] ",       "UUIDstr2uuid_bulk;",   ""      ]
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:uuid], 
X_1:bat[:oid]):bat[:uuid] ",      "UUIDuuid2uuid_bulk;",  ""      ]
-[ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:wkb], X_1:int, 
X_2:int):bat[:wkb] ",      "geom_2_geom_bat;",     ""      ]
+[ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:wkb], X_1:bat[:oid], 
X_2:int, X_3:int):bat[:wkb] ",       "geom_2_geom_bat;",     ""      ]
 [ "batcalc",   "xml",  "command batcalc.xml(X_0:bat[:str]):bat[:xml] ",        
"BATXMLstr2xml;",       ""      ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], 
X_1:bat[:bit]):bat[:bit] ", "CMDbatXOR;",   ""      ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], X_1:bat[:bit], 
X_2:bat[:oid], X_3:bat[:oid]):bat[:bit] ",   "CMDbatXOR;",   ""      ]
@@ -9208,7 +9208,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "analyze",      "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str):void ", "sql_analyze;", ""      ]
 [ "sql",       "analyze",      "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str, X_4:str):void ",        "sql_analyze;", ""      ]
 [ "sql",       "any",  "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",      
"SQLany_cmp;",  ""      ]
-[ "sql",       "append",       "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:lng, X_5:any):int ",        "mvc_append_wrap;",     ""      ]
+[ "sql",       "append",       "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:bat[:oid], X_5:any):int ",  "mvc_append_wrap;",     ""      ]
 [ "sql",       "argRecord",    "pattern sql.argRecord():str ", 
"SQLargRecord;",        ""      ]
 [ "sql",       "argRecord",    "pattern sql.argRecord(X_0:any...):str ",       
"SQLargRecord;",        ""      ]
 [ "sql",       "assert",       "pattern sql.assert(X_0:bit, X_1:str):void ",   
"SQLassert;",   ""      ]
@@ -9232,7 +9232,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int):bat[:any_1] ",    "mvc_bind_idxbat_wrap;",        "" 
     ]
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1]) 
",     "mvc_bind_idxbat_wrap;",        ""      ]
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ",  
"mvc_bind_idxbat_wrap;",        ""      ]
-[ "sql",       "claim",        "unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng):lng ",    "mvc_claim_wrap;",      ""      ]
+[ "sql",       "claim",        "unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng):bat[:oid] ",      "mvc_claim_wrap;",      ""      ]
 [ "sql",       "clear_table",  "unsafe pattern sql.clear_table(X_0:str, 
X_1:str):lng ",        "mvc_clear_table_wrap;",        ""      ]
 [ "sql",       "commit",       "unsafe pattern sql.commit():void ",    
"SQLcommit;",   ""      ]
 [ "sql",       "copy_from",    "unsafe pattern sql.copy_from(X_0:ptr, X_1:str, 
X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str, 
X_10:int, X_11:int):bat[:any]... ",     "mvc_import_table_wrap;",       ""      
]
@@ -9244,6 +9244,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "corr", "pattern sql.corr(X_0:int, X_1:int, X_2:bit, X_3:bit, 
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;",     ""      ]
 [ "sql",       "corr", "pattern sql.corr(X_0:lng, X_1:lng, X_2:bit, X_3:bit, 
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;",     ""      ]
 [ "sql",       "corr", "pattern sql.corr(X_0:sht, X_1:sht, X_2:bit, X_3:bit, 
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;",     ""      ]
+[ "sql",       "count",        "pattern sql.count(X_0:str, X_1:str):lng ",     
"SQLbasecount;",        ""      ]
 [ "sql",       "count",        "pattern sql.count(X_0:any_1, X_1:bit, X_2:bit, 
X_3:bit, X_4:int, X_5:oid, X_6:oid):lng ",      "SQLcount;",    ""      ]
 [ "sql",       "covariance",   "pattern sql.covariance(X_0:bte, X_1:bte, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ",   "SQLcovar_samp;",       
""      ]
 [ "sql",       "covariance",   "pattern sql.covariance(X_0:dbl, X_1:dbl, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ",   "SQLcovar_samp;",       
""      ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -8276,7 +8276,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batcalc",   "timestamp",    "pattern batcalc.timestamp(X_0:bat[:timestamp], 
X_1:bat[:oid], X_2:int):bat[:timestamp] ",      "timestamp_2time_timestamp;",   
""      ]
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:str], 
X_1:bat[:oid]):bat[:uuid] ",       "UUIDstr2uuid_bulk;",   ""      ]
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:uuid], 
X_1:bat[:oid]):bat[:uuid] ",      "UUIDuuid2uuid_bulk;",  ""      ]
-[ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:wkb], X_1:int, 
X_2:int):bat[:wkb] ",      "geom_2_geom_bat;",     ""      ]
+[ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:wkb], X_1:bat[:oid], 
X_2:int, X_3:int):bat[:wkb] ",       "geom_2_geom_bat;",     ""      ]
 [ "batcalc",   "xml",  "command batcalc.xml(X_0:bat[:str]):bat[:xml] ",        
"BATXMLstr2xml;",       ""      ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], 
X_1:bat[:bit]):bat[:bit] ", "CMDbatXOR;",   ""      ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], X_1:bat[:bit], 
X_2:bat[:oid], X_3:bat[:oid]):bat[:bit] ",   "CMDbatXOR;",   ""      ]
@@ -12509,7 +12509,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "analyze",      "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str):void ", "sql_analyze;", ""      ]
 [ "sql",       "analyze",      "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str, X_4:str):void ",        "sql_analyze;", ""      ]
 [ "sql",       "any",  "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",      
"SQLany_cmp;",  ""      ]
-[ "sql",       "append",       "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:lng, X_5:any):int ",        "mvc_append_wrap;",     ""      ]
+[ "sql",       "append",       "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:bat[:oid], X_5:any):int ",  "mvc_append_wrap;",     ""      ]
 [ "sql",       "argRecord",    "pattern sql.argRecord():str ", 
"SQLargRecord;",        ""      ]
 [ "sql",       "argRecord",    "pattern sql.argRecord(X_0:any...):str ",       
"SQLargRecord;",        ""      ]
 [ "sql",       "assert",       "pattern sql.assert(X_0:bit, X_1:str):void ",   
"SQLassert;",   ""      ]
@@ -12535,7 +12535,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int):bat[:any_1] ",    "mvc_bind_idxbat_wrap;",        "" 
     ]
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1]) 
",     "mvc_bind_idxbat_wrap;",        ""      ]
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ",  
"mvc_bind_idxbat_wrap;",        ""      ]
-[ "sql",       "claim",        "unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng):lng ",    "mvc_claim_wrap;",      ""      ]
+[ "sql",       "claim",        "unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng):bat[:oid] ",      "mvc_claim_wrap;",      ""      ]
 [ "sql",       "clear_table",  "unsafe pattern sql.clear_table(X_0:str, 
X_1:str):lng ",        "mvc_clear_table_wrap;",        ""      ]
 [ "sql",       "commit",       "unsafe pattern sql.commit():void ",    
"SQLcommit;",   ""      ]
 [ "sql",       "copy_from",    "unsafe pattern sql.copy_from(X_0:ptr, X_1:str, 
X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str, 
X_10:int, X_11:int):bat[:any]... ",     "mvc_import_table_wrap;",       ""      
]
@@ -12548,6 +12548,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "corr", "pattern sql.corr(X_0:int, X_1:int, X_2:bit, X_3:bit, 
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;",     ""      ]
 [ "sql",       "corr", "pattern sql.corr(X_0:lng, X_1:lng, X_2:bit, X_3:bit, 
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;",     ""      ]
 [ "sql",       "corr", "pattern sql.corr(X_0:sht, X_1:sht, X_2:bit, X_3:bit, 
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;",     ""      ]
+[ "sql",       "count",        "pattern sql.count(X_0:str, X_1:str):lng ",     
"SQLbasecount;",        ""      ]
 [ "sql",       "count",        "pattern sql.count(X_0:any_1, X_1:bit, X_2:bit, 
X_3:bit, X_4:int, X_5:oid, X_6:oid):lng ",      "SQLcount;",    ""      ]
 [ "sql",       "covariance",   "pattern sql.covariance(X_0:bte, X_1:bte, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ",   "SQLcovar_samp;",       
""      ]
 [ "sql",       "covariance",   "pattern sql.covariance(X_0:dbl, X_1:dbl, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ",   "SQLcovar_samp;",       
""      ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -203,6 +203,7 @@ void BATtseqbase(BAT *b, oid o);
 void BATundo(BAT *b);
 BAT *BATunique(BAT *b, BAT *s);
 BAT *BATunmask(BAT *b);
+gdk_return BATupdate(BAT *b, BAT *p, BAT *n, bool force) 
__attribute__((__warn_unused_result__));
 BBPrec *BBP[N_BBPINIT];
 gdk_return BBPaddfarm(const char *dirname, uint32_t rolemask, bool logerror);
 void BBPclear(bat bid);
@@ -330,6 +331,7 @@ gdk_return GDKtracer_set_adapter(const c
 gdk_return GDKtracer_set_component_level(const char *comp, const char *lvl);
 gdk_return GDKtracer_set_flush_level(const char *lvl);
 gdk_return GDKtracer_set_layer_level(const char *layer, const char *lvl);
+gdk_return GDKtracer_set_tracefile(const char *tracefile);
 gdk_return GDKtracer_stop(void);
 size_t GDKuniqueid(size_t offset);
 gdk_return GDKupgradevarheap(BAT *b, var_t v, BUN cap, bool copyall) 
__attribute__((__warn_unused_result__));
@@ -894,6 +896,7 @@ const char *columnRef;
 const char *comment_onRef;
 const char *commitRef;
 str compileString(Symbol *fcn, Client c, str s);
+char *concatErrors(char *err1, const char *err2) __attribute__((__nonnull__(1, 
2))) __attribute__((__returns_nonnull__));
 const char *connectRef;
 const char *contextRef;
 str convertConstant(malType type, ValPtr vr);
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);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to