Changeset: e38659f82888 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e38659f82888
Added Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/rel_bin.h
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
Removed Files:
        sql/server/rel_bin.c
        sql/server/rel_bin.h
        sql/server/sql_rel2bin.c
        sql/server/sql_rel2bin.h
        sql/server/sql_statement.c
        sql/server/sql_statement.h
Modified Files:
        sql/backends/monet5/Makefile.ag
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_gencode.c
        sql/include/sql_catalog.h
        sql/server/Makefile.ag
        sql/server/rel_psm.c
        sql/server/rel_schema.h
        sql/server/rel_sequence.h
        sql/server/rel_updates.h
        sql/server/sql_env.h
        sql/server/sql_mvc.c
        sql/server/sql_parser.h
        sql/server/sql_privileges.c
        sql/server/sql_scan.c
        sql/server/sql_semantic.c
        sql/test/BugTracker-2010/Tests/constants-optimizer.Bug-2317.sql
        sql/test/BugTracker-2010/Tests/constants-optimizer.Bug-2317.stable.out
        
sql/test/BugTracker-2012/Tests/large-number-operation-strange-results.Bug-2929.stable.err
        sql/test/BugTracker-2012/Tests/predicate_select.Bug-3090.stable.err
        sql/test/BugTracker-2012/Tests/predicate_select.Bug-3090.stable.out
        sql/test/Dependencies/Tests/Dependencies.stable.out
        sql/test/Tests/systemfunctions.stable.out
        sql/test/leaks/Tests/check0.stable.out
        sql/test/leaks/Tests/check1.stable.out
        sql/test/leaks/Tests/check2.stable.out
        sql/test/leaks/Tests/check3.stable.out
        sql/test/leaks/Tests/check4.stable.out
        sql/test/leaks/Tests/check5.stable.out
        sql/test/mapi/Tests/php_monetdb.stable.out
Branch: Feb2013
Log Message:

included last remains of sql_rel2bin into rel_bin.
Also the rel_bin and sql_statement can now live in the proper
location (ie backends/monet5).

Approved output of test

addapted test to use existing pipeline


diffs (truncated from 2055 to 300 lines):

diff --git a/sql/backends/monet5/Makefile.ag b/sql/backends/monet5/Makefile.ag
--- a/sql/backends/monet5/Makefile.ag
+++ b/sql/backends/monet5/Makefile.ag
@@ -39,6 +39,8 @@ lib__sql = {
                sql.mx \
                sql_user.c sql_user.h \
                sql_scenario.c sql_scenario.h \
+               rel_bin.c rel_bin.h \
+               sql_statement.c sql_statement.h \
                sql_gencode.c sql_gencode.h \
                sql_optimizer.c sql_optimizer.h \
                sql_result.c sql_result.h \
diff --git a/sql/server/rel_bin.c b/sql/backends/monet5/rel_bin.c
rename from sql/server/rel_bin.c
rename to sql/backends/monet5/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1427,10 +1427,79 @@ rel2bin_hash_lookup( mvc *sql, sql_rel *
                } else {
                        return stmt_join(sql->sa, h, idx, cmp_equal);
                }
-       } else
+       } else {
+               assert(0);
                return stmt_uselect(sql->sa, idx, h, cmp_equal, NULL);
+       }
 }
 
+static stmt *
+join_hash_key( mvc *sql, list *l ) 
+{
+       node *m;
+       sql_subtype *it, *wrd;
+       stmt *h = NULL;
+       stmt *bits = stmt_atom_int(sql->sa, 1 + 
((sizeof(wrd)*8)-1)/(list_length(l)+1));
+
+       it = sql_bind_localtype("int");
+       wrd = sql_bind_localtype("wrd");
+       for (m = l->h; m; m = m->next) {
+               stmt *s = m->data;
+
+               if (h) {
+                       sql_subfunc *xor = sql_bind_func_result3(sql->sa, 
sql->session->schema, "rotate_xor_hash", wrd, it, tail_type(s), wrd);
+
+                       h = stmt_Nop(sql->sa, stmt_list(sql->sa,  list_append( 
list_append( list_append(sa_list(sql->sa), h), bits), s )), xor);
+               } else {
+                       sql_subfunc *hf = sql_bind_func_result(sql->sa, 
sql->session->schema, "hash", tail_type(s), NULL, wrd);
+                       h = stmt_unop(sql->sa, s, hf);
+               }
+       }
+       return h;
+}
+
+static stmt *
+releqjoin( mvc *sql, list *l1, list *l2, int used_hash )
+{
+       node *n1 = l1->h, *n2 = l2->h;
+       stmt *l, *r, *res;
+
+       if (list_length(l1) <= 1) {
+               l = l1->h->data;
+               r = l2->h->data;
+               return stmt_join(sql->sa, l, r, cmp_equal);
+       }
+       if (used_hash) {
+               l = n1->data;
+               r = n2->data;
+               n1 = n1->next;
+               n2 = n2->next;
+               res = stmt_join(sql->sa, l, r, cmp_equal);
+       } else { /* need hash */
+               l = join_hash_key(sql, l1);
+               r = join_hash_key(sql, l2);
+               res = stmt_join(sql->sa, l, r, cmp_equal);
+       }
+       l = stmt_result(sql->sa, res, 0);
+       r = stmt_result(sql->sa, res, 1);
+       for (; n1 && n2; n1 = n1->next, n2 = n2->next) {
+               stmt *ld = n1->data;
+               stmt *rd = n2->data;
+               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);
+               stmt * cmp;
+
+               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 );
+               r = stmt_project(sql->sa, cmp, r );
+       }
+       res = stmt_join(sql->sa, l, r, cmp_joined);
+       return res;
+}
 
 static stmt *
 rel2bin_join( mvc *sql, sql_rel *rel, list *refs)
@@ -1454,10 +1523,11 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
         *      second selects/filters 
          */
        if (rel->exps) {
-               int use_hash = 0;
+               int used_hash = 0;
                int idx = 0;
                list *jexps = sa_list(sql->sa);
-               list *jns = sa_list(sql->sa);
+               list *lje = sa_list(sql->sa);
+               list *rje = sa_list(sql->sa);
 
                /* get equi-joins first */
                if (list_length(rel->exps) > 1) {
@@ -1482,7 +1552,7 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
                        prop *p;
 
                        /* only handle simple joins here */             
-                       if (list_length(jns) && (idx || e->type != e_cmp || 
e->flag != cmp_equal))
+                       if (list_length(lje) && (idx || e->type != e_cmp || 
e->flag != cmp_equal))
                                break;
 
                        /* handle possible index lookups */
@@ -1493,8 +1563,9 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
                        
                                join = s = rel2bin_hash_lookup(sql, rel, left, 
right, i, en);
                                if (s) {
-                                       list_append(jns, s);
-                                       use_hash = 1;
+                                       list_append(lje, s->op1);
+                                       list_append(rje, s->op2);
+                                       used_hash = 1;
                                }
                        }
 
@@ -1510,7 +1581,7 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
                            s->type != st_join2 && 
                            s->type != st_joinN) {
                                /* predicate */
-                               if (!list_length(jns) && s->nrcols == 0) { 
+                               if (!list_length(lje) && s->nrcols == 0) { 
                                        stmt *l = bin_first_column(sql->sa, 
left);
                                        stmt *r = bin_first_column(sql->sa, 
right);
 
@@ -1528,14 +1599,13 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
 
                        if (!join) 
                                join = s;
-                       list_append(jns, s);
+                       list_append(lje, s->op1);
+                       list_append(rje, s->op2);
                }
-               if (list_length(jns) > 1) {
-                       join = stmt_releqjoin(sql->sa, jns);
-                       if (use_hash)
-                               join->flag = NO_HASH;
+               if (list_length(lje) > 1) {
+                       join = releqjoin(sql, lje, rje, used_hash);
                } else if (!join) {
-                       join = jns->h->data; 
+                       join = stmt_join(sql->sa, lje->h->data, rje->h->data, 
cmp_equal);
                }
        } else {
                stmt *l = bin_first_column(sql->sa, left);
@@ -1660,7 +1730,8 @@ rel2bin_semijoin( mvc *sql, sql_rel *rel
          */
        if (rel->exps) {
                int idx = 0;
-               list *jns = sa_list(sql->sa);
+               list *lje = sa_list(sql->sa);
+               list *rje = sa_list(sql->sa);
 
                for( en = rel->exps->h; en; en = en->next ) {
                        int join_idx = sql->opt_stats[0];
@@ -1668,7 +1739,7 @@ rel2bin_semijoin( mvc *sql, sql_rel *rel
                        stmt *s = NULL;
 
                        /* only handle simple joins here */             
-                       if (list_length(jns) && (idx || e->type != e_cmp || 
e->flag != cmp_equal))
+                       if (list_length(lje) && (idx || e->type != e_cmp || 
e->flag != cmp_equal))
                                break;
 
                        s = exp_bin(sql, en->data, left, right, NULL, NULL, 
NULL, NULL);
@@ -1676,25 +1747,23 @@ rel2bin_semijoin( mvc *sql, sql_rel *rel
                                return NULL;
                        if (join_idx != sql->opt_stats[0])
                                idx = 1;
+                       /* stop on first non equality join */
                        if (!join) {
                                join = s;
-                       /* stop on first non equality join */
-                       } else if (s->type != st_join && 
-                                  s->type != st_join2 && 
-                                  s->type != st_joinN) {
+                       } else if (s->type != st_join && s->type != st_join2 && 
s->type != st_joinN) {
                                /* handle select expressions */
-                               printf("help\n");
                                assert(0);
-                               //join = stmt_inter(sql->sa, join,s);
-                               //continue;
                                return NULL;
                        }
-                       list_append(jns, s);
+                       if (s->type == st_join || s->type == st_join2 || 
s->type == st_joinN) { 
+                               list_append(lje, s->op1);
+                               list_append(rje, s->op2);
+                       }
                }
-               if (list_length(jns) > 1) {
-                       join = stmt_releqjoin(sql->sa, jns);
-               } else {
-                       join = jns->h->data; 
+               if (list_length(lje) > 1) {
+                       join = releqjoin(sql, lje, rje, 0 /* no hash used */);
+               } else if (!join) {
+                       join = stmt_join(sql->sa, lje->h->data, rje->h->data, 
cmp_equal);
                }
        } else {
                stmt *l = bin_first_column(sql->sa, left);
@@ -1890,6 +1959,8 @@ rel2bin_except( mvc *sql, sql_rel *rel, 
        stmt *lext = NULL, *rext = NULL;
        stmt *lcnt = NULL, *rcnt = NULL;
        stmt *s, *lm, *rm, *ecnt = NULL;
+       list *lje = sa_list(sql->sa);
+       list *rje = sa_list(sql->sa);
 
        if (rel->l) /* first construct the left sub relation */
                left = subrel_bin(sql, rel->l, refs);
@@ -1936,15 +2007,16 @@ rel2bin_except( mvc *sql, sql_rel *rel, 
          */
        /* 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 */
-       s = stmt_releqjoin_init(sql->sa);
        for (n = left->op4.lval->h, m = right->op4.lval->h; n && m; n = 
n->next, m = m->next) {
                stmt *l = column(sql->sa, n->data);
                stmt *r = column(sql->sa, m->data);
 
                l = stmt_project(sql->sa, lext, l);
                r = stmt_project(sql->sa, rext, r);
-               stmt_releqjoin_fill(s, l, r);
+               list_append(lje, l);
+               list_append(rje, r);
        }
+       s = releqjoin(sql, lje, rje, 0 /* no hash used */);
        lm = stmt_result(sql->sa, s, 0);
        rm = stmt_result(sql->sa, s, 1);
 
@@ -2027,6 +2099,8 @@ rel2bin_inter( mvc *sql, sql_rel *rel, l
        stmt *lext = NULL, *rext = NULL;
        stmt *lcnt = NULL, *rcnt = NULL;
        stmt *s, *lm, *rm;
+       list *lje = sa_list(sql->sa);
+       list *rje = sa_list(sql->sa);
 
        if (rel->l) /* first construct the left sub relation */
                left = subrel_bin(sql, rel->l, refs);
@@ -2067,15 +2141,16 @@ rel2bin_inter( mvc *sql, sql_rel *rel, l
        stmt_group_done(rg);
 
        /* now find the matching groups */
-       s = stmt_releqjoin_init(sql->sa);
        for (n = left->op4.lval->h, m = right->op4.lval->h; n && m; n = 
n->next, m = m->next) {
                stmt *l = column(sql->sa, n->data);
                stmt *r = column(sql->sa, m->data);
 
                l = stmt_project(sql->sa, lext, l);
                r = stmt_project(sql->sa, rext, r);
-               stmt_releqjoin_fill(s, l, r);
+               list_append(lje, l);
+               list_append(rje, r);
        }
+       s = releqjoin(sql, lje, rje, 0 /* no hash used */);
        lm = stmt_result(sql->sa, s, 0);
        rm = stmt_result(sql->sa, s, 1);
                
@@ -2778,22 +2853,20 @@ insert_check_ukey(mvc *sql, list *insert
                                }
                        }
                } else {
-                       s = stmt_releqjoin_init(sql->sa);
-                       s->flag = NO_HASH;
-                       if (k->idx && hash_index(k->idx->type)) 
-                               stmt_releqjoin_fill(s, stmt_idx(sql, k->idx, 
dels), idx_inserts);
+                       list *lje = sa_list(sql->sa);
+                       list *rje = sa_list(sql->sa);
+                       if (k->idx && hash_index(k->idx->type)) {
+                               list_append(lje, stmt_idx(sql, k->idx, dels));
+                               list_append(rje, idx_inserts);
+                       }
                        for (m = k->columns->h; m; m = m->next) {
                                sql_kc *c = m->data;
 
                                col = stmt_col(sql, c->c, dels);
-/*
-                               if ((k->type == ukey) && stmt_has_null(col)) {
-                                       stmt *nn = stmt_selectnonil(sql, col, 
s);
-                                       col = stmt_project(sql->sa, nn, col);
-                               }
-*/
-                               stmt_releqjoin_fill(s, col, nth(inserts, 
c->c->colnr)->op1);
+                               list_append(lje, col);
+                               list_append(rje, nth(inserts, 
c->c->colnr)->op1);
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to