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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list