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