Changeset: 974c4105edf4 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=974c4105edf4
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_optimizer.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/include/sql_catalog.h
        sql/server/rel_optimizer.c
        sql/test/BugTracker-2012/Tests/null_except_null.Bug-3040.stable.out
        sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
Branch: default
Log Message:

fixed bug 3040, ie use subjoin with nil = nil to fix except/intersect semantics 
problem.

also cleanup of sql_statement* code


diffs (truncated from 794 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1370,7 +1370,7 @@ join_hash_key( mvc *sql, list *l )
 }
 
 static stmt *
-releqjoin( mvc *sql, list *l1, list *l2, int used_hash )
+releqjoin( mvc *sql, list *l1, list *l2, int used_hash, comp_type cmp_op )
 {
        node *n1 = l1->h, *n2 = l2->h;
        stmt *l, *r, *res;
@@ -1378,18 +1378,18 @@ releqjoin( mvc *sql, list *l1, list *l2,
        if (list_length(l1) <= 1) {
                l = l1->h->data;
                r = l2->h->data;
-               return stmt_join(sql->sa, l, r, cmp_equal);
+               return stmt_join(sql->sa, l, r, cmp_op);
        }
        if (used_hash) {
                l = n1->data;
                r = n2->data;
                n1 = n1->next;
                n2 = n2->next;
-               res = stmt_join(sql->sa, l, r, cmp_equal);
+               res = stmt_join(sql->sa, l, r, cmp_op);
        } else { /* need hash */
                l = join_hash_key(sql, l1);
                r = join_hash_key(sql, l2);
-               res = stmt_join(sql->sa, l, r, cmp_equal);
+               res = stmt_join(sql->sa, l, r, cmp_op);
        }
        l = stmt_result(sql->sa, res, 0);
        r = stmt_result(sql->sa, res, 1);
@@ -1399,10 +1399,15 @@ releqjoin( mvc *sql, list *l1, list *l2,
                stmt *le = stmt_project(sql->sa, l, ld );
                stmt *re = stmt_project(sql->sa, r, rd );
                /* intentional both tail_type's of le (as re sometimes is a 
find for bulk loading */
-               sql_subfunc *f=sql_bind_func(sql->sa, sql->session->schema, 
"=", tail_type(le), tail_type(le), F_FUNC);
+               sql_subfunc *f = NULL;
                stmt * cmp;
 
+               if (cmp_op == cmp_equal)
+                       f = sql_bind_func(sql->sa, sql->session->schema, "=", 
tail_type(le), tail_type(le), F_FUNC);
+               else    /* cmp_equal_nil ? */
+                       f = sql_bind_func(sql->sa, sql->session->schema, "=", 
tail_type(le), tail_type(le), F_FUNC);
                assert(f);
+
                cmp = stmt_binop(sql->sa, le, re, f);
                cmp = stmt_uselect(sql->sa, cmp, stmt_bool(sql->sa, 1), 
cmp_equal, NULL);
                l = stmt_project(sql->sa, cmp, l );
@@ -1522,7 +1527,7 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
                        list_append(rje, s->op2);
                }
                if (list_length(lje) > 1) {
-                       join = releqjoin(sql, lje, rje, used_hash);
+                       join = releqjoin(sql, lje, rje, used_hash, cmp_equal);
                } else if (!join) {
                        join = stmt_join(sql->sa, lje->h->data, rje->h->data, 
cmp_equal);
                }
@@ -1680,7 +1685,7 @@ rel2bin_semijoin( mvc *sql, sql_rel *rel
                        }
                }
                if (list_length(lje) > 1) {
-                       join = releqjoin(sql, lje, rje, 0 /* no hash used */);
+                       join = releqjoin(sql, lje, rje, 0 /* no hash used */, 
cmp_equal);
                } else if (!join) {
                        join = stmt_join(sql->sa, lje->h->data, rje->h->data, 
cmp_equal);
                }
@@ -1920,10 +1925,7 @@ rel2bin_except( mvc *sql, sql_rel *rel, 
        stmt_group_done(rg);
 
        /* now find the matching groups */
-       /* There is a bug (#3040) in the scheme, ie the join removes the nil's
-        * as during joining nil != nil. But for except's nil aren't distinct.
-        * We would need a bat.join operator which has both semantics.
-        */
+
        /* TODO change to leftjoin semantics to keep those in A not in B */
        /* would need outerjoin eqjoin and outer project code, cleans up 
following mess */
        for (n = left->op4.lval->h, m = right->op4.lval->h; n && m; n = 
n->next, m = m->next) {
@@ -1935,7 +1937,7 @@ rel2bin_except( mvc *sql, sql_rel *rel, 
                list_append(lje, l);
                list_append(rje, r);
        }
-       s = releqjoin(sql, lje, rje, 0 /* no hash used */);
+       s = releqjoin(sql, lje, rje, 1 /* no hash used */, cmp_equal_nil);
        lm = stmt_result(sql->sa, s, 0);
        rm = stmt_result(sql->sa, s, 1);
 
@@ -2069,7 +2071,7 @@ rel2bin_inter( mvc *sql, sql_rel *rel, l
                list_append(lje, l);
                list_append(rje, r);
        }
-       s = releqjoin(sql, lje, rje, 0 /* no hash used */);
+       s = releqjoin(sql, lje, rje, 1 /* no hash used */, cmp_equal_nil);
        lm = stmt_result(sql->sa, s, 0);
        rm = stmt_result(sql->sa, s, 1);
                
@@ -2763,7 +2765,7 @@ insert_check_ukey(mvc *sql, list *insert
                                list_append(lje, col);
                                list_append(rje, nth(inserts, 
c->c->colnr)->op1);
                        }
-                       s = releqjoin(sql, lje, rje, 1 /* hash used */);
+                       s = releqjoin(sql, lje, rje, 1 /* hash used */, 
cmp_equal);
                        s = stmt_result(sql->sa, s, 0);
                }
                s = stmt_binop(sql->sa, stmt_aggr(sql->sa, s, NULL, NULL, cnt, 
1, 0), stmt_atom_wrd(sql->sa, 0), ne);
@@ -3165,7 +3167,7 @@ update_check_ukey(mvc *sql, stmt **updat
                                list_append(lje, stmt_col(sql, c->c, nu_tids));
                                list_append(rje, upd);
                        }
-                       s = releqjoin(sql, lje, rje, 1 /* hash used */);
+                       s = releqjoin(sql, lje, rje, 1 /* hash used */, 
cmp_equal);
                        s = stmt_result(sql->sa, s, 0);
                        s = stmt_binop(sql->sa, stmt_aggr(sql->sa, s, NULL, 
NULL, cnt, 1, 0), stmt_atom_wrd(sql->sa, 0), ne);
                }
@@ -3399,7 +3401,7 @@ join_updated_pkey(mvc *sql, sql_key * k,
                list_append(lje, upd);
                list_append(rje, col);
        }
-       s = releqjoin(sql, lje, rje, 1 /* hash used */);
+       s = releqjoin(sql, lje, rje, 1 /* hash used */, cmp_equal);
        s = stmt_result(sql->sa, s, 0);
        /* add missing nulls */
        if (nulls)
@@ -3700,7 +3702,7 @@ join_idx_update(mvc *sql, sql_idx * i, s
                list_append(lje, check_types(sql, &rc->c->type, upd, 
type_equal));
                list_append(rje, stmt_col(sql, rc->c, rdels));
        }
-       s = releqjoin(sql, lje, rje, 0 /* no hash used */);
+       s = releqjoin(sql, lje, rje, 0 /* no hash used */, cmp_equal);
        l = stmt_result(sql->sa, s, 0);
        r = stmt_result(sql->sa, s, 1);
        s = stmt_project(sql->sa, stmt_reverse(sql->sa, l), r);
diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -177,14 +177,6 @@ pattern restart{unsafe}( sname:str, sequ
 address mvc_restart_seq
 comment "restart the sequence with value start";
 
-pattern bind_dbat(mvc:int, schema:str, table:str, access:int):bat[:oid,:oid]
-address mvc_bind_dbat_wrap
-comment "Bind to 'schema.table' BAT with deleted objecs
-and with specific access kind:
-       0 - base table
-       1 - inserts
-       2 - updates";
-
 pattern bind_idxbat(mvc:int, schema:str, table:str, index:str, 
access:int):bat[:oid,:any_1]
 address mvc_bind_idxbat_wrap
 comment "Bind the 'schema.table.index' BAT with access kind:
@@ -1156,25 +1148,6 @@ function octopus.bind(conn:str, sch:str,
        return bind:= b;
 end octopus.bind;
 
-function octopus.bind_dbat(mvc:int, sch:str, tab:str,access:int, 
version:int):bat[:oid,:oid];
-       b := sql.bind_dbat(mvc,sch,tab,access);
-       return bind_dbat:= b;
-end octopus.bind_dbat;
-
-function octopus.bind_dbat(conn:str, sch:str, tab:str, access:int, 
version:int):bat[:oid,:oid];
-       b:bat[:oid,:any_1] := nil:bat[:oid,:any_1];
-       m := nil:int;
-       rm := remote.put(conn,m);
-       rm := remote.exec(conn,"sql","mvc");
-       s := remote.put(conn,sch);
-       t := remote.put(conn,tab);
-       a := remote.put(conn,access);
-       bh:= remote.put(conn,b);
-       bh:= remote.exec(conn,"sql","bind_dbat",rm,s,t,a);
-       b:bat[:oid,:oid]:= remote.get(conn,bh);
-       return bind_dbat:= b;
-end octopus.bind_dbat;
-
 function octopus.bind_idxbat(mvc:int, sch:str, tab:str, index:str, access:int, 
version:int):bat[:oid,:oid];
        b := sql.bind_idxbat(mvc,sch,tab,index,access);
        return bind_idxbat:= b;
@@ -1292,21 +1265,6 @@ function remote.bind_idxbat{inline}(dbco
        return bind_idxbat:= b;
 end remote.bind_idxbat;
 
-function remote.bind_dbat{inline}(dbconn:str, sch:str, tab:str, access:int, 
version:int):bat[:oid,:oid];
-       b:bat[:oid,:any_1] := nil:bat[:oid,:any_1];
-       m := nil:int;
-       conn := remote.connect(dbconn, "monetdb", "monetdb", "msql");
-       rm := remote.put(conn,m);
-       rm := remote.exec(conn,"sql","mvc");
-       s := remote.put(conn,sch);
-       t := remote.put(conn,tab);
-       a := remote.put(conn,access);
-       bh:= remote.put(conn,b);
-       bh:= remote.exec(conn,"sql","bind_dbat",rm,s,t,a);
-       b:bat[:oid,:oid]:= remote.get(conn,bh);
-       return bind_dbat:= b;
-end remote.bind_dbat;
-
 pattern rdfshred (location:str, gname:str, schema:str)
 address SQLrdfShred
 comment "Procedure that wraps around the shredder of the rdf module in MAL. 
@@ -1370,7 +1328,6 @@ extern int sqlcleanup(mvc *c, int err);
 extern sql_rel *sql_symbol2relation(mvc *c, symbol *sym);
 extern stmt *sql_relation2stmt(mvc *c, sql_rel *r);
 
-extern BAT *mvc_bind_dbat(mvc *m, char *sname, char *tname, int access);
 extern BAT *mvc_bind_idxbat(mvc *m, char *sname, char *tname, char *iname, int 
access);
 
 sql5_export str SQLmvc(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
@@ -1383,7 +1340,6 @@ sql5_export str SQLcatalog(Client cntxt,
 sql5_export str mvc_append_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str mvc_update_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str mvc_bind_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
-sql5_export str mvc_bind_dbat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str mvc_bind_idxbat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 sql5_export str mvc_clear_table_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 sql5_export str mvc_delete_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
@@ -1439,7 +1395,6 @@ sql5_export str SQLgzdecompress(Client c
 sql5_export str SQLtruncate(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str SQLexpand(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str SQLoctopusBind(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
-sql5_export str SQLoctopusBinddbat(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str SQLargRecord(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str SQLrdfShred(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str SQLoptimizersUpdate(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
@@ -3126,7 +3081,7 @@ mvc_bind(mvc *m, char *sname, char *tnam
        return b;
 }
 
-BAT *
+static BAT *
 mvc_bind_dbat(mvc *m, char *sname, char *tname, int access)
 {
        sql_trans *tr = m->session->tr;
@@ -3415,28 +3370,6 @@ mvc_update_wrap(Client cntxt, MalBlkPtr 
 @
 @c
 
-/* str mvc_bind_dbat_wrap(int *ret, str *sname, str *tname, int *access); */
-str
-mvc_bind_dbat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
-       BAT *b;
-       int *ret = (int *)getArgReference(stk, pci, 0);
-       mvc *m = NULL;
-       str msg = getSQLContext(cntxt,mb, &m, NULL);
-       str *sname = (str *)getArgReference(stk, pci, 2);
-       str *tname = (str *)getArgReference(stk, pci, 3);
-       int *access = (int*)getArgReference(stk, pci, 4);
-
-       if ((msg = checkSQLContext(cntxt)) != NULL)
-               return msg;
-       b = mvc_bind_dbat(m, *sname, *tname, *access);
-       if (b) {
-               BBPkeepref( *ret = b->batCacheid);
-               return MAL_SUCCEED;
-       }
-       throw(SQL, "mvc_bind_dbat_wrap", "error");
-}
-
 /* str mvc_clear_table_wrap(wrd *res, str *sname, str *tname); */
 str
 mvc_clear_table_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -791,19 +791,6 @@ static int
                        }
                }
                        break;
-               case st_dbat:{
-                       int ht = TYPE_oid;
-                       sql_table *t = s->op4.tval;
-
-                       q = newStmt2(mb, sqlRef, binddbatRef);
-                       setVarType(mb, getArg(q,0), newBatType(ht,TYPE_oid));
-                       q = pushArgument(mb, q, sql->mvc_var);
-                       q = pushSchema(mb, q, t);
-                       q = pushStr(mb, q, t->base.name);
-                       q = pushInt(mb, q, s->flag);
-                       s->nr = getDestVar(q);
-               }
-                       break;
                case st_idxbat:{
                        int ht = TYPE_oid;
                        int tt = tail_type(s)->type->localtype;
@@ -1156,7 +1143,7 @@ static int
                                        q = pushStr(mb, q, ">=");
                                        break;
                                default:
-                                       showException(GDKout, 
SQL,"sql","SQL2MAL: error impossible\n");
+                                       showException(GDKout, 
SQL,"sql","SQL2MAL: error impossible subselect compare\n");
                                }
                        }
                        if ( q )
@@ -1318,6 +1305,7 @@ static int
                        int l = _dumpstmt(sql, mb, s->op1);
                        int r = _dumpstmt(sql, mb, s->op2);
                        char *jt = "join";
+                       char *sjt = "subjoin";
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to