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

Reply via email to