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