Changeset: 2a5071d68205 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2a5071d68205 Added Files: sql/test/BugTracker-2019/Tests/remote-table-non-existent-column.Bug-6750.stable.err Removed Files: sql/test/BugTracker-2019/Tests/msqldump-mapi-cache.Bug-6777.timeout Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 monetdb5/mal/mal_import.c monetdb5/modules/mal/mal_io.c monetdb5/modules/mal/pcre.c monetdb5/modules/mal/projectionpath.c monetdb5/optimizer/opt_mergetable.c sql/backends/monet5/sql.mal sql/backends/monet5/sql_execute.c sql/backends/monet5/sql_gencode.c sql/backends/monet5/wlr.c sql/server/rel_dump.c sql/server/rel_updates.c sql/server/rel_updates.h sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.stable.err sql/test/BugTracker-2015/Tests/schemadiff.Bug-3778.stable.out sql/test/BugTracker-2019/Tests/All sql/test/BugTracker-2019/Tests/msqldump-mapi-cache.Bug-6777.py sql/test/BugTracker-2019/Tests/msqldump-mapi-cache.Bug-6777.stable.out sql/test/BugTracker-2019/Tests/remote-table-non-existent-column.Bug-6750.py Branch: json Log Message:
Merge with default diffs (truncated from 3310 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 @@ -11456,7 +11456,8 @@ stdout of test 'MAL-signatures` in direc [ "sql", "querylog_enable", "command sql.querylog_enable():void ", "QLOGenable;", "" ] [ "sql", "querylog_enable", "command sql.querylog_enable(thres:int):void ", "QLOGenableThreshold;", "" ] [ "sql", "rank", "pattern sql.rank(b:any_1, p:bit, o:bit):int ", "SQLrank;", "return the ranked groups" ] -[ "sql", "register", "pattern sql.register(mod:str, fname:str, rel_stmt:str, sig:str):int ", "RAstatement2;", "Compile the relational statement (rel_smt) and register it as mal function, mod.fname(signature)" ] +[ "sql", "register", "pattern sql.register(mod:str, fname:str, rel_stmt:str, sig:str):int ", "RAstatement2;", "" ] +[ "sql", "register", "pattern sql.register(mod:str, fname:str, rel_stmt:str, sig:str, typ:str):int ", "RAstatement2;", "Compile the relational statement (rel_smt) and register it as mal function, mod.fname(signature)" ] [ "sql", "restart", "unsafe pattern sql.restart(sname:str, sequence:str, start:lng):lng ", "mvc_restart_seq;", "restart the sequence with value start" ] [ "sql", "resultSet", "unsafe pattern sql.resultSet(tbl:bat[:str], attr:bat[:str], tpe:bat[:str], len:bat[:int], scale:bat[:int], cols:any...):int ", "mvc_row_result_wrap;", "Prepare a table result set for the client front-end" ] [ "sql", "resultSet", "unsafe pattern sql.resultSet(tbl:str, attr:str, tpe:str, len:int, scale:int, eclass:int, val:any):int ", "mvc_scalar_value_wrap;", "Prepare a table result set for the client front-end." ] 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 @@ -15888,7 +15888,8 @@ stdout of test 'MAL-signatures` in direc [ "sql", "querylog_enable", "command sql.querylog_enable():void ", "QLOGenable;", "" ] [ "sql", "querylog_enable", "command sql.querylog_enable(thres:int):void ", "QLOGenableThreshold;", "" ] [ "sql", "rank", "pattern sql.rank(b:any_1, p:bit, o:bit):int ", "SQLrank;", "return the ranked groups" ] -[ "sql", "register", "pattern sql.register(mod:str, fname:str, rel_stmt:str, sig:str):int ", "RAstatement2;", "Compile the relational statement (rel_smt) and register it as mal function, mod.fname(signature)" ] +[ "sql", "register", "pattern sql.register(mod:str, fname:str, rel_stmt:str, sig:str):int ", "RAstatement2;", "" ] +[ "sql", "register", "pattern sql.register(mod:str, fname:str, rel_stmt:str, sig:str, typ:str):int ", "RAstatement2;", "Compile the relational statement (rel_smt) and register it as mal function, mod.fname(signature)" ] [ "sql", "restart", "unsafe pattern sql.restart(sname:str, sequence:str, start:lng):lng ", "mvc_restart_seq;", "restart the sequence with value start" ] [ "sql", "resultSet", "unsafe pattern sql.resultSet(tbl:bat[:str], attr:bat[:str], tpe:bat[:str], len:bat[:int], scale:bat[:int], cols:any...):int ", "mvc_row_result_wrap;", "Prepare a table result set for the client front-end" ] [ "sql", "resultSet", "unsafe pattern sql.resultSet(tbl:str, attr:str, tpe:str, len:int, scale:int, eclass:int, val:any):int ", "mvc_scalar_value_wrap;", "Prepare a table result set for the client front-end." ] diff --git a/monetdb5/mal/mal_import.c b/monetdb5/mal/mal_import.c --- a/monetdb5/mal/mal_import.c +++ b/monetdb5/mal/mal_import.c @@ -200,9 +200,7 @@ malInclude(Client c, str name, int listi } bstream_next(c->fdin); parseMAL(c, c->curprg, 1, INT_MAX); - free(mal_init_buf); - free(mal_init_stream); - free(c->fdin); + bstream_destroy(c->fdin); c->fdin = NULL; GDKfree(mal_init_buf); } diff --git a/monetdb5/modules/mal/mal_io.c b/monetdb5/modules/mal/mal_io.c --- a/monetdb5/modules/mal/mal_io.c +++ b/monetdb5/modules/mal/mal_io.c @@ -48,6 +48,8 @@ io_stdin(Client cntxt, MalBlkPtr mb, Mal { bstream **ret= (bstream**) getArgReference(stk,pci,0); (void) mb; + if( cntxt->fdin == NULL) + throw(MAL, "io.print", SQLSTATE(HY002) "Input channel missing"); *ret = cntxt->fdin; return MAL_SUCCEED; } @@ -57,6 +59,8 @@ io_stdout(Client cntxt, MalBlkPtr mb, Ma { stream **ret= (stream**) getArgReference(stk,pci,0); (void) mb; + if( cntxt->fdout == NULL) + throw(MAL, "io.print", SQLSTATE(HY002) "Output channel missing"); *ret = cntxt->fdout; return MAL_SUCCEED; } @@ -69,6 +73,8 @@ IOprintBoth(Client cntxt, MalBlkPtr mb, stream *fp = cntxt->fdout; (void) mb; + if( cntxt->fdout == NULL) + throw(MAL, "io.print", SQLSTATE(HY002) "Output channel missing"); if (tpe == TYPE_any) tpe = stk->stk[pci->argv[indx]].vtype; diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c --- a/monetdb5/modules/mal/pcre.c +++ b/monetdb5/modules/mal/pcre.c @@ -714,6 +714,7 @@ re_likeselect(BAT **bnp, BAT *b, BAT *s, oid o, off; const char *v; RE *re = NULL; + uint32_t *wpat = NULL; assert(ATOMstorage(b->ttype) == TYPE_str); @@ -735,7 +736,6 @@ re_likeselect(BAT **bnp, BAT *b, BAT *s, if (use_strcmp) { if (caseignore) { - uint32_t *wpat; wpat = utf8stoucs(pat); if (wpat == NULL) throw(MAL, "pcre.likeselect", SQLSTATE(HY013) MAL_MALLOC_FAIL); @@ -746,6 +746,7 @@ re_likeselect(BAT **bnp, BAT *b, BAT *s, candscanloop(v && *v != '\200' && mywstrcasecmp(v, wpat) == 0); GDKfree(wpat); + wpat = NULL; } else { if (anti) candscanloop(v && *v != '\200' && @@ -786,7 +787,6 @@ re_likeselect(BAT **bnp, BAT *b, BAT *s, } if (use_strcmp) { if (caseignore) { - uint32_t *wpat; wpat = utf8stoucs(pat); if (wpat == NULL) throw(MAL, "pcre.likeselect", SQLSTATE(HY013) MAL_MALLOC_FAIL); @@ -797,6 +797,7 @@ re_likeselect(BAT **bnp, BAT *b, BAT *s, scanloop(v && *v != '\200' && mywstrcasecmp(v, wpat) == 0); GDKfree(wpat); + wpat = NULL; } else { if (anti) scanloop(v && *v != '\200' && @@ -834,6 +835,7 @@ re_likeselect(BAT **bnp, BAT *b, BAT *s, bunins_failed: re_destroy(re); + GDKfree(wpat); BBPreclaim(bn); *bnp = NULL; throw(MAL, "pcre.likeselect", OPERATION_FAILED); diff --git a/monetdb5/modules/mal/projectionpath.c b/monetdb5/modules/mal/projectionpath.c --- a/monetdb5/modules/mal/projectionpath.c +++ b/monetdb5/modules/mal/projectionpath.c @@ -15,13 +15,14 @@ ALGprojectionpath(Client cntxt, MalBlkPt int i; bat bid; bat *r = getArgReference_bat(stk, pci, 0); - BAT *b, **joins = (BAT**)GDKzalloc(pci->argc * sizeof(BAT*)); + BAT *b, **joins = NULL; (void) mb; (void) cntxt; if(pci->argc <= 1) throw(MAL, "algebra.projectionpath", SQLSTATE(HY013) "INTERNAL ERROR"); + joins = (BAT**)GDKzalloc(pci->argc * sizeof(BAT*)); if ( joins == NULL) throw(MAL, "algebra.projectionpath", SQLSTATE(HY013) MAL_MALLOC_FAIL); for (i = pci->retc; i < pci->argc; i++) { diff --git a/monetdb5/optimizer/opt_mergetable.c b/monetdb5/optimizer/opt_mergetable.c --- a/monetdb5/optimizer/opt_mergetable.c +++ b/monetdb5/optimizer/opt_mergetable.c @@ -1417,8 +1417,13 @@ mat_group_new(MalBlkPtr mb, InstrPtr p, pushInstruction(mb, q); if(setPartnr(ml, getArg(ml->v[b].mi,i), getArg(q,0), i) || setPartnr(ml, getArg(ml->v[b].mi,i), getArg(q,1), i) || - setPartnr(ml, getArg(ml->v[b].mi,i), getArg(q,2), i)) + setPartnr(ml, getArg(ml->v[b].mi,i), getArg(q,2), i)){ + freeInstruction(r0); + freeInstruction(r1); + freeInstruction(r2); + freeInstruction(attr); return -1; + } /* add result to mats */ r0 = addArgument(mb,r0,getArg(q,0)); @@ -1429,8 +1434,13 @@ mat_group_new(MalBlkPtr mb, InstrPtr p, getArg(r, 0) = newTmpVariable(mb, atp); r = addArgument(mb, r, getArg(q,1)); r = addArgument(mb, r, getArg(ml->v[b].mi,i)); - if(setPartnr(ml, getArg(ml->v[b].mi,i), getArg(r,0), i)) + if(setPartnr(ml, getArg(ml->v[b].mi,i), getArg(r,0), i)){ + freeInstruction(r0); + freeInstruction(r1); + freeInstruction(r2); + freeInstruction(attr); return -1; + } pushInstruction(mb,r); attr = addArgument(mb, attr, getArg(r, 0)); diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal --- a/sql/backends/monet5/sql.mal +++ b/sql/backends/monet5/sql.mal @@ -55,6 +55,8 @@ address RAstatement comment "Compile and execute a single 'relational algebra' statement"; pattern register(mod:str, fname:str, rel_stmt:str, sig:str):int +address RAstatement2; +pattern register(mod:str, fname:str, rel_stmt:str, sig:str, typ:str):int address RAstatement2 comment "Compile the relational statement (rel_smt) and register it as mal function, mod.fname(signature)"; diff --git a/sql/backends/monet5/sql_execute.c b/sql/backends/monet5/sql_execute.c --- a/sql/backends/monet5/sql_execute.c +++ b/sql/backends/monet5/sql_execute.c @@ -873,13 +873,14 @@ str RAstatement2(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { int pos = 0; - str *mod = getArgReference_str(stk, pci, 1); - str *nme = getArgReference_str(stk, pci, 2); - str *expr = getArgReference_str(stk, pci, 3); - str *sig = getArgReference_str(stk, pci, 4), c = *sig; + str mod = *getArgReference_str(stk, pci, 1); + str nme = *getArgReference_str(stk, pci, 2); + str expr = *getArgReference_str(stk, pci, 3); + str sig = *getArgReference_str(stk, pci, 4); + str types = pci->argc == 6 ? *getArgReference_str(stk, pci, 5) : NULL; backend *be = NULL; mvc *m = NULL; - str msg; + str msg = MAL_SUCCEED; sql_rel *rel; list *refs, *ops; char buf[BUFSIZ]; @@ -892,18 +893,22 @@ RAstatement2(Client cntxt, MalBlkPtr mb, return msg; if (!m->sa) m->sa = sa_create(); - if (!m->sa) + if (!m->sa) { + sqlcleanup(m, 0); return createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL); + } /* keep copy of signature and relational expression */ - snprintf(buf, BUFSIZ, "%s %s", *sig, *expr); + snprintf(buf, BUFSIZ, "%s %s", sig, expr); - if(!stack_push_frame(m, NULL)) + if (!stack_push_frame(m, NULL)) { + sqlcleanup(m, 0); return createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL); + } ops = sa_list(m->sa); - while (c && *c && !isspace((unsigned char) *c)) { - char *vnme = c, *tnme; - char *p = strchr(++c, (int)' '); + while (sig && *sig && !isspace((unsigned char) *sig)) { + char *vnme = sig, *tnme; + char *p = strchr(++sig, (int)' '); int d,s,nr = -1; sql_subtype t; atom *a; @@ -917,7 +922,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb, *p++ = 0; tnme = sa_strdup(m->sa, tnme); if (!tnme) { - stack_pop_frame(m); + sqlcleanup(m, 0); return createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL); } d = strtol(p, &p, 10); @@ -932,28 +937,56 @@ RAstatement2(Client cntxt, MalBlkPtr mb, * */ if (nr >= 0) { append(ops, exp_atom_ref(m->sa, nr, &t)); - if(!sql_set_arg(m, nr, a)) { - stack_pop_frame(m); + if (!sql_set_arg(m, nr, a)) { + sqlcleanup(m, 0); return createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL); } } else { - if(!stack_push_var(m, vnme+1, &t)) { - stack_pop_frame(m); + if (!stack_push_var(m, vnme+1, &t)) { + sqlcleanup(m, 0); return createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL); } append(ops, exp_var(m->sa, sa_strdup(m->sa, vnme+1), &t, m->frame)); } - c = strchr(p, (int)','); - if (c) - c++; + sig = strchr(p, (int)','); + if (sig) + sig++; } refs = sa_list(m->sa); - rel = rel_read(m, *expr, &pos, refs); + rel = rel_read(m, expr, &pos, refs); stack_pop_frame(m); if (rel) - rel = sql_processrelation(m, rel, 0); - if (!rel || monet5_create_relational_function(m, *mod, *nme, rel, NULL, ops, 0) < 0) - throw(SQL, "sql.register", SQLSTATE(42000) "Cannot register %s: %s", buf, m->errstr); + rel = sql_processrelation(m, rel, 1); + if (!rel) { + if (strlen(m->errstr) > 6 && m->errstr[5] == '!') + msg = createException(SQL, "RAstatement2", "%s", m->errstr); + else + msg = createException(SQL, "RAstatement2", SQLSTATE(42000) "%s", m->errstr); + } else if (rel && types && is_simple_project(rel->op)) { /* Test if types match */ + list *types_list = sa_list(m->sa); + str token, rest; + + for (token = strtok_r(types, "%%", &rest); token; token = strtok_r(NULL, "%%", &rest)) + list_append(types_list, token); + + if (list_length(types_list) != list_length(rel->exps)) + msg = createException(SQL, "RAstatement2", SQLSTATE(42000) "The number of projections don't match between the generated plan and the expected one: %d != %d", + list_length(types_list), list_length(rel->exps)); + else { + int i = 1; + for (node *n = rel->exps->h, *m = types_list->h ; n && m && !msg ; n = n->next, m = m->next) { + sql_exp *e = (sql_exp *) n->data; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list