Changeset: 8cb9aaea0019 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8cb9aaea0019
Modified Files:
clients/examples/C/sample2.c
sql/backends/monet5/sql_gencode.c
sql/server/bin_optimizer.c
sql/server/rel_bin.c
sql/server/sql_rel2bin.c
sql/server/sql_statement.c
sql/server/sql_statement.h
Branch: default
Log Message:
More steps towards columns.
use of semijoin/diff is split in intersect/difference and tintersect/tdifference
diffs (truncated from 855 to 300 lines):
diff --git a/clients/examples/C/sample2.c b/clients/examples/C/sample2.c
--- a/clients/examples/C/sample2.c
+++ b/clients/examples/C/sample2.c
@@ -40,6 +40,7 @@ main(int argc, char **argv)
int age = 0;
char *parm[] = { "peter", 0 };
char *parm2[] = { "25", 0 };
+ char *parm3[] = { "peter", "25", 0 };
Mapi dbh= NULL;
MapiHdl hdl = NULL;
@@ -61,7 +62,7 @@ main(int argc, char **argv)
die(dbh, hdl);
if (mapi_close_handle(hdl) != MOK)
die(dbh, hdl);
- if ((hdl = mapi_query_array(dbh, "insert into emp values('?',
?)", parm)) == NULL || mapi_error(dbh))
+ if ((hdl = mapi_query_array(dbh, "insert into emp values('?',
?)", parm3)) == NULL || mapi_error(dbh))
die(dbh, hdl);
if (mapi_close_handle(hdl) != MOK)
die(dbh, hdl);
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
@@ -588,6 +588,19 @@ dump_2(backend *sql, MalBlkPtr mb, stmt
s->nr = _dump_2(mb, mod, name, o1, o2);
}
+static void
+dump_2_(backend *sql, MalBlkPtr mb, stmt *s, char *mod, char *name)
+{
+ InstrPtr q;
+ int o1 = _dumpstmt(sql, mb, s->op1);
+ int o2 = _dumpstmt(sql, mb, s->op2);
+
+ q = newStmt1(mb, mod, name);
+ q = pushArgument(mb, q, o1);
+ q = pushArgument(mb, q, o2);
+ s->nr = getDestVar(q);
+}
+
static InstrPtr
multiplex2(MalBlkPtr mb, char *mod, char *name /* should be eaten */, int o1,
int o2, int rtype)
{
@@ -1275,7 +1288,15 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
case st_joinN:
s->nr = dump_joinN(sql, mb, s);
break;
- case st_semijoin:{
+ case st_tinter:{
+ dump_2_(sql, mb, s, algebraRef, "tintersect");
+ }
+ break;
+ case st_tdiff:{
+ dump_2_(sql, mb, s, algebraRef, "tdifference");
+ }
+ break;
+ case st_inter:{
dump_2(sql, mb, s, algebraRef, semijoinRef);
}
break;
diff --git a/sql/server/bin_optimizer.c b/sql/server/bin_optimizer.c
--- a/sql/server/bin_optimizer.c
+++ b/sql/server/bin_optimizer.c
@@ -38,12 +38,12 @@ stmt_uselect_select(stmt *s)
}
static stmt *
-eliminate_semijoin(sql_allocator *sa, stmt *s)
+eliminate_inter(sql_allocator *sa, stmt *s)
{
stmt *s1, *s2;
sql_column *bc1, *bc2;
- assert(s->type == st_semijoin);
+ assert(s->type == st_inter);
s1 = s->op1;
s2 = s->op2;
bc1 = basecolumn(s1);
@@ -53,7 +53,7 @@ eliminate_semijoin(sql_allocator *sa, st
int match2 = (PSEL(s2) || RSEL(s2));
if (match1 && match2) {
- /* semijoin( select(x,..), select(x,..) ) */
+ /* intersect( select(x,..), select(x,..) ) */
int swap = 0;
if (PSEL(s1) && s1->flag == cmp_equal) {
@@ -87,7 +87,7 @@ eliminate_semijoin(sql_allocator *sa, st
s1 = stmt_uselect_select(s1);
}
} else if (match1) {
- /* semijoin( select(x,..), f(x) ) => semijoin( f(x),
select(x,..) ) */
+ /* intersect( select(x,..), f(x) ) => intersect(
f(x), select(x,..) ) */
stmt *os;
int m;
@@ -99,18 +99,18 @@ eliminate_semijoin(sql_allocator *sa, st
s2 = os;
}
if (match2 && 0) {
- /* semijoin( f(x), select(x,..) ) => select( f(x), ..
) */
+ /* intersect( f(x), select(x,..) ) => select( f(x),
.. ) */
stmt *ns = NULL;
switch (s2->type) {
case st_select:
case st_uselect:
- /* uselect => select as semijoin also
propagates the left input's tail */
+ /* uselect => select as intersect also
propagates the left input's tail */
ns = stmt_select(sa, s1, s2->op2, (comp_type)
s2->flag);
break;
case st_select2:
case st_uselect2:
- /* uselect => select as semijoin also
propagates the left input's tail */
+ /* uselect => select as intersect also
propagates the left input's tail */
ns = stmt_select2(sa, s1, s2->op2, s2->op3,
s2->flag);
break;
default:
@@ -247,13 +247,13 @@ _bin_optimizer(mvc *c, stmt *s)
return s;
}
- case st_semijoin:{
+ case st_inter:{
stmt *j = NULL;
stmt *os, *ns;
- os = stmt_semijoin(c->sa, _bin_optimizer(c, s->op1),
_bin_optimizer(c, s->op2));
- /* try to push the semijoin through the (fetch) join */
+ os = stmt_inter(c->sa, _bin_optimizer(c, s->op1),
_bin_optimizer(c, s->op2));
+ /* try to push the intersect through the (fetch) join */
if (os->op1->type == st_join) {
j = os->op1;
/* equi join on same base table */
@@ -261,7 +261,7 @@ _bin_optimizer(mvc *c, stmt *s)
j->op1->t == j->op2->h ) {
stmt *l = j->op1;
stmt *r = j->op2;
- s = stmt_semijoin(c->sa, l, os->op2);
+ s = stmt_inter(c->sa, l, os->op2);
l = _bin_optimizer(c, s);
os = stmt_join( c->sa, l, r, cmp_equal);
os->optimized = 3;
@@ -269,7 +269,7 @@ _bin_optimizer(mvc *c, stmt *s)
}
}
if (!mvc_debug_on(c, 4096) && os->nrcols) {
- ns = eliminate_semijoin(c->sa, os);
+ ns = eliminate_inter(c->sa, os);
} else {
ns = os;
}
@@ -400,6 +400,8 @@ _bin_optimizer(mvc *c, stmt *s)
return s;
}
+ case st_tinter:
+ case st_tdiff:
case st_temp:
case st_single:
case st_diff:
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -203,7 +203,7 @@ row2cols(mvc *sql, stmt *sub)
/* Here we also recognize 'IN'.
* We change that into a
- * mark(reverse(semijoin( reverse(column), bat_of_vals)), 0).
+ * tintersect( column, bat_of_vals)).
*/
static int
are_equality_exps( list *exps )
@@ -267,9 +267,9 @@ handle_in_exps( mvc *sql, sql_exp *ce, l
s = stmt_append(sql->sa, s, i);
}
if (in)
- s = stmt_mark_tail(sql->sa, stmt_reverse(sql->sa,
stmt_semijoin(sql->sa, stmt_reverse(sql->sa, c), stmt_reverse(sql->sa, s))), 0);
+ s = stmt_tinter(sql->sa, c, s);
else
- s = stmt_reverse(sql->sa, stmt_diff(sql->sa,
stmt_reverse(sql->sa, c), stmt_reverse(sql->sa, stmt_unique(sql->sa, s,
NULL))));
+ s = stmt_tdiff(sql->sa, c, stmt_unique(sql->sa, s,
NULL));
s = stmt_const(sql->sa, s, NULL);
}
return s;
@@ -564,7 +564,7 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
print_stmtlist(sql->sa, right);
}
if (s && sel)
- s = stmt_semijoin(sql->sa, s, sel);
+ s = stmt_inter(sql->sa, s, sel);
} break;
case e_cmp: {
stmt *l = NULL, *r = NULL, *r2 = NULL;
@@ -590,7 +590,7 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
/* Here we also recognize 'IN'.
* We change that into a
- * reverse(semijoin( reverse(column), bat_of_vals)).
+ * tintersect( column, bat_of_vals).
*/
if (are_equality_exps(e->l) && are_equality_exps(e->r))
if ((s = handle_equality_exps(sql, e->l, e->r,
left, right, grp)) != NULL)
@@ -741,7 +741,7 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
stmt_binop(sql->sa, l, r, lf),
stmt_binop(sql->sa, l, r2, rf),
a);
} else if (l->nrcols > 0 && r->nrcols > 0 &&
r2->nrcols > 0) {
- s = stmt_semijoin(sql->sa,
+ s = stmt_inter(sql->sa,
stmt_uselect(sql->sa, l, r,
range2lcompare(e->flag)),
stmt_uselect(sql->sa, l, r2,
range2rcompare(e->flag)));
} else {
@@ -1647,10 +1647,10 @@ rel2bin_semijoin( mvc *sql, sql_rel *rel
/*assert(0);*/
/* should be handled by join list (reljoin) */
if (s->h == join->h) {
- join = stmt_semijoin(sql->sa, join,s);
- } else {
+ join = stmt_inter(sql->sa, join,s);
+ } else {
join = stmt_reverse(sql->sa, join);
- join = stmt_semijoin(sql->sa, join,s);
+ join = stmt_inter(sql->sa, join, s);
join = stmt_reverse(sql->sa, join);
}
continue;
@@ -1719,18 +1719,18 @@ rel2bin_semijoin( mvc *sql, sql_rel *rel
l = sa_list(sql->sa);
/* We did a full join, thats too much.
- Reduce this using difference and semijoin */
+ Reduce this using difference and intersect */
if (rel->op == op_anti) {
stmt *c = left->op4.lval->h->data;
join = stmt_diff(sql->sa, c, stmt_reverse(sql->sa, jl));
} else {
stmt *c = left->op4.lval->h->data;
- join = stmt_semijoin(sql->sa, c, stmt_reverse(sql->sa, jl));
+ join = stmt_inter(sql->sa, c, stmt_reverse(sql->sa, jl));
}
join = stmt_reverse(sql->sa, stmt_mark_tail(sql->sa, join,0));
- /* semijoin all the left columns */
+ /* project all the left columns */
for( n = left->op4.lval->h; n; n = n->next ) {
stmt *c = n->data;
char *rnme = table_name(sql->sa, c);
@@ -3141,7 +3141,7 @@ update_check_ukey(mvc *sql, stmt **updat
if (updates[c->c->colnr]) {
upd = updates[c->c->colnr]->op1;
} else {
- upd = stmt_semijoin(sql->sa,
stmt_bat(sql->sa, c->c, ts, RDONLY), updates[updcol]->op1);
+ upd = stmt_inter(sql->sa,
stmt_bat(sql->sa, c->c, ts, RDONLY), updates[updcol]->op1);
}
if ((k->type == ukey) && stmt_has_null(upd)) {
sql_subtype *t = tail_type(upd);
@@ -3176,7 +3176,7 @@ update_check_ukey(mvc *sql, stmt **updat
upd = updates[c->c->colnr]->op1;
} else if (updates) {
upd = updates[updcol]->op1;
- upd = stmt_semijoin(sql->sa,
stmt_bat(sql->sa, c->c, ts, RDONLY), upd);
+ upd = stmt_inter(sql->sa,
stmt_bat(sql->sa, c->c, ts, RDONLY), upd);
} else {
upd = stmt_bat(sql->sa, c->c, ts,
RDONLY);
}
@@ -3322,8 +3322,7 @@ join_updated_pkey(mvc *sql, sql_key * k,
s->flag = NO_HASH;
rows = stmt_idxbat(sql->sa, k->idx, fts, RDONLY);
- rows = stmt_semijoin(sql->sa, stmt_reverse(sql->sa, rows),
updates[updcol]->op1);
- rows = stmt_reverse(sql->sa, rows);
+ rows = stmt_tinter(sql->sa, rows, stmt_reverse(sql->sa,
stmt_mark_tail(sql->sa, updates[updcol]->op1, 0)));
for (m = k->idx->columns->h, o = rk->columns->h; m && o; m = m->next, o
= o->next) {
sql_kc *fc = m->data;
@@ -3334,19 +3333,19 @@ join_updated_pkey(mvc *sql, sql_key * k,
upd = updates[c->c->colnr]->op1;
} else {
upd = updates[updcol]->op1;
- upd = stmt_semijoin(sql->sa, stmt_bat(sql->sa, c->c,
ts, RDONLY), upd);
+ upd = stmt_inter(sql->sa, stmt_bat(sql->sa, c->c, ts,
RDONLY), upd);
}
if (c->c->null) { /* new nulls (MATCH SIMPLE) */
stmt *nn = upd;
nn = stmt_uselect(sql->sa, nn, stmt_atom(sql->sa,
atom_general(sql->sa, &c->c->type, NULL)), cmp_equal);
if (null)
- null = stmt_semijoin(sql->sa, null, nn);
+ null = stmt_inter(sql->sa, null, nn);
else
null = nn;
nulls = 1;
}
- stmt_releqjoin_fill(s, upd, stmt_semijoin(sql->sa,
stmt_bat(sql->sa, fc->c, fts, RDONLY), rows ));
+ stmt_releqjoin_fill(s, upd, stmt_inter(sql->sa,
stmt_bat(sql->sa, fc->c, fts, RDONLY), rows ));
}
/* add missing nulls */
if (nulls)
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list