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

Reply via email to