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 Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list