Changeset: 79dabc8675d7 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=79dabc8675d7 Modified Files: sql/backends/monet5/sql.mx sql/include/sql_relation.h sql/server/rel_bin.c sql/server/rel_exp.c sql/server/rel_optimizer.c sql/server/rel_select.c sql/server/rel_select.h sql/test/BugTracker-2009/Tests/decimal_needs_truncation.SF-2605686.sql sql/test/BugTracker-2009/Tests/prepare_commit_execute.SF-2606020.sql sql/test/BugTracker-2009/Tests/prepare_decimal_bug.SF-2831994.sql sql/test/BugTracker-2010/Tests/limit_in_prepare.Bug-2552.sql sql/test/BugTracker-2010/Tests/prepare_stmt.Bug-2533.Bug-2534.sql sql/test/BugTracker-2010/Tests/prepare_stmt.Bug-2533.Bug-2534.stable.err sql/test/BugTracker/Tests/bind_with_cast.SF-1720934.sql sql/test/BugTracker/Tests/bind_with_cast.SF-1720934.stable.err sql/test/BugTracker/Tests/decimal_prepare.SF-1655818.sql sql/test/BugTracker/Tests/large_prepare.SF-1363729.sql sql/test/BugTracker/Tests/large_prepare_2.SF-1363729.sql sql/test/BugTracker/Tests/prepare_decimal_float.SF-1675795.sql Branch: default Log Message:
Merge with Dec2011 branch. diffs (truncated from 1036 to 300 lines): diff --git a/buildtools/ChangeLog.Dec2011 b/buildtools/ChangeLog.Dec2011 --- a/buildtools/ChangeLog.Dec2011 +++ b/buildtools/ChangeLog.Dec2011 @@ -1,6 +1,11 @@ # ChangeLog file for buildtools # This file is updated with Maddlog +* Wed Feb 22 2012 Sjoerd Mullender <sjo...@acm.org> +- Fixed some of the package names for Debian/Ubuntu. Packages for + libraries should contain the major number of the library version number. + This was not always the case. + * Tue Feb 7 2012 Sjoerd Mullender <sjo...@acm.org> - On Debian and Ubuntu, install Python modules in dist-packages instead of site-packages. This fixed bug 2997. diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c --- a/clients/mapiclient/mclient.c +++ b/clients/mapiclient/mclient.c @@ -1765,6 +1765,7 @@ doFile(Mapi mid, const char *file, int u enum hmyesno hassysfuncs = UNKNOWN; FILE *fp; char *prompt = NULL; + int prepno = 0; (void) save_history; /* not used if no readline */ if (strcmp(file, "-") == 0) { @@ -1962,6 +1963,18 @@ doFile(Mapi mid, const char *file, int u case '\n': case '\0': break; + case 'e': + /* a bit of a hack for prepare/exec + * tests: replace "exec **" with the + * ID of the last prepared + * statement */ + if (mode == SQL && + formatter == TESTformatter && + strncmp(line, "exec **", 7) == 0) { + line[5] = prepno < 10 ? ' ' : prepno / 10 + '0'; + line[6] = prepno % 10 + '0'; + } + break; case '\\': switch (line[1]) { case 'q': @@ -2447,6 +2460,11 @@ doFile(Mapi mid, const char *file, int u } CHECK_RESULT(mid, hdl, buf, continue); + if (mapi_get_querytype(hdl) == Q_PREPARE) { + prepno = mapi_get_tableid(hdl); + assert(prepno < 100); + } + rc = format_result(mid, hdl, interactive); if (rc == MMORE && (line != NULL || mapi_query_done(hdl) != MOK)) diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx --- a/sql/backends/monet5/sql.mx +++ b/sql/backends/monet5/sql.mx @@ -1696,6 +1696,7 @@ sqlcleanup(mvc *c, int err) c->label = 0; c->point_query = 0; scanner_query_processed(&(c->scanner)); + c->point_query = 0; return err; } diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h --- a/sql/include/sql_relation.h +++ b/sql/include/sql_relation.h @@ -160,6 +160,12 @@ typedef enum operator_type { (rel->op == op_ddl && rel->flag == DDL_OUTPUT) #define is_outerjoin(op) \ (op == op_left || op == op_right || op == op_full) +#define is_left(op) \ + (op == op_left) +#define is_right(op) \ + (op == op_right) +#define is_full(op) \ + (op == op_full) #define is_join(op) \ (op == op_join || is_outerjoin(op)) #define is_semi(op) \ 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 @@ -1359,39 +1359,34 @@ rel2bin_join( mvc *sql, sql_rel *rel, li } if (join_idx != sql->opt_stats[0]) idx = 1; - if (!join) { + + if (s->type != st_join && + s->type != st_join2 && + s->type != st_joinN) { + /* predicate */ + if (!list_length(jns) && s->nrcols == 0) { + stmt *l = bin_first_column(sql->sa, left); + stmt *r = bin_first_column(sql->sa, right); + + l = stmt_uselect(sql->sa, stmt_const(sql->sa, l, stmt_bool(sql->sa, 1)), s, cmp_equal); + join = stmt_join(sql->sa, l, stmt_reverse(sql->sa, r), cmp_all); + continue; + } + if (!join) { + stmt *l = bin_first_column(sql->sa, left); + stmt *r = bin_first_column(sql->sa, right); + join = stmt_join(sql->sa, l, stmt_reverse(sql->sa, r), cmp_all); + } + break; + } + + if (!join) join = s; - /* stop on first non equality join */ - } else if (s->type != st_join && - s->type != st_join2 && - s->type != st_joinN) { - if (s->type == st_reverse) { - stmt *rs = s->op1; - - if (rs->type == st_join || - rs->type == st_join2 || - rs->type == st_joinN) { - list_append(jns, s); - continue; - } - } - /* handle select expressions */ - /*assert(0);*/ - /* should be handled by join list (reljoin) */ - if (s->h == join->h) { - join = stmt_semijoin(sql->sa, join,s); - } else { - join = stmt_reverse(sql->sa, join); - join = stmt_semijoin(sql->sa, join,s); - join = stmt_reverse(sql->sa, join); - } - continue; - } list_append(jns, s); } if (list_length(jns) > 1) { join = stmt_releqjoin(sql->sa, jns); - } else { + } else if (!join) { join = jns->h->data; } } else { diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c --- a/sql/server/rel_exp.c +++ b/sql/server/rel_exp.c @@ -853,7 +853,7 @@ exp_is_join(sql_exp *e) { /* only simple compare expressions, ie not or lists or range expressions (e->f) - */ + */ if (e->type == e_cmp && !is_complex_exp(e->flag) && e->l && e->r && !e->f && e->card >= CARD_AGGR && !complex_select(e)) return 0; if (e->type == e_cmp && e->flag == cmp_filter && e->l && e->r && e->card >= CARD_AGGR) diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -738,7 +738,8 @@ order_joins(mvc *sql, list *rels, list * /* complex expressions may touch multiple base tables * Should be pushed up to extra selection. * */ - if (cje->type != e_cmp || !is_complex_exp(cje->flag)) { + if (cje->type != e_cmp || !is_complex_exp(cje->flag) /*|| + (cje->type == e_cmp && cje->f == NULL)*/) { l = find_one_rel(rels, cje->l); r = find_one_rel(rels, cje->r); } @@ -1199,7 +1200,10 @@ _exp_push_down(mvc *sql, sql_exp *e, sql if (l && r && r2) return exp_compare2(sql->sa, l, r, r2, e->flag); } else if (l && r) { - return exp_compare(sql->sa, l, r, e->flag); + if (l->card < r->card) + return exp_compare(sql->sa, r, l, swap_compare(e->flag)); + else + return exp_compare(sql->sa, l, r, e->flag); } } return NULL; @@ -2805,7 +2809,7 @@ rel_push_select_down_join(int *changes, sql_exp *re = e->r; if (re->card >= CARD_AGGR) { - rel->l = rel_push_join(sql->sa, r, e->l, re, e); + rel->l = rel_push_join(sql->sa, r, e->l, re, NULL, e); } else { rel->l = rel_push_select(sql->sa, r, e->l, e); } diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1042,43 +1042,73 @@ rel_push_select(sql_allocator *sa, sql_r join expression. */ sql_rel * -rel_push_join(sql_allocator *sa, sql_rel *rel, sql_exp *ls, sql_exp *rs, sql_exp *e) +rel_push_join(sql_allocator *sa, sql_rel *rel, sql_exp *ls, sql_exp *rs, sql_exp *rs2, sql_exp *e) { list *l = rel_bind_path(sa, rel, ls); list *r = rel_bind_path(sa, rel, rs); + list *r2 = NULL; node *ln, *rn; - sql_rel *lrel = NULL, *rrel = NULL, *p = NULL; - - if (!l || !r) + sql_rel *lrel = NULL, *rrel = NULL, *rrel2 = NULL, *p = NULL; + + if (rs2) + r2 = rel_bind_path(sa, rel, rs2); + if (!l || !r || (rs2 && !r2)) return NULL; p = rel; - for (ln = l->h, rn = r->h; ln && rn; ln = ln->next, rn = rn->next ) { - lrel = ln->data; - rrel = rn->data; - - if (rel_is_ref(lrel) || rel_is_ref(rrel)) - break; - - /* push down as long as the operators allow this - and the relation is equal. - */ - if (lrel != rrel || + if (r2) { + node *rn2; + + for (ln = l->h, rn = r->h, rn2 = r2->h; ln && rn && rn2; ln = ln->next, rn = rn->next, rn2 = rn2->next ) { + lrel = ln->data; + rrel = rn->data; + rrel2 = rn2->data; + + if (rel_is_ref(lrel) || rel_is_ref(rrel) || rel_is_ref(rrel2)) + break; + + /* push down as long as the operators allow this + and the relation is equal. + */ + if (lrel != rrel || lrel != rrel2 || (!is_select(lrel->op) && !(is_semi(lrel->op) && !rel_is_ref(lrel->l)) && lrel->op != op_join && lrel->op != op_left)) - break; - /* pushing through left head of a left join is allowed */ - if (lrel->op == op_left && (!ln->next || lrel->l != ln->next->data)) - break; - p = lrel; - } - if (!lrel || !rrel) + break; + /* pushing through left head of a left join is allowed */ + if (lrel->op == op_left && (!ln->next || lrel->l != ln->next->data)) + break; + p = lrel; + } + } else { + for (ln = l->h, rn = r->h; ln && rn; ln = ln->next, rn = rn->next ) { + lrel = ln->data; + rrel = rn->data; + + if (rel_is_ref(lrel) || rel_is_ref(rrel)) + break; + + /* push down as long as the operators allow this + and the relation is equal. + */ + if (lrel != rrel || + (!is_select(lrel->op) && + !(is_semi(lrel->op) && !rel_is_ref(lrel->l)) && + lrel->op != op_join && + lrel->op != op_left)) + break; + /* pushing through left head of a left join is allowed */ + if (lrel->op == op_left && (!ln->next || lrel->l != ln->next->data)) + break; + p = lrel; + } + } + if (!lrel || !rrel || (r2 && !rrel2)) return NULL; /* filter on columns of this relation */ - if ((lrel == rrel && lrel->op != op_join) || rel_is_ref(p)) { + if ((lrel == rrel && (!r2 || lrel == rrel2) && lrel->op != op_join) || rel_is_ref(p)) { if (lrel->op == op_select && !rel_is_ref(lrel)) { rel_select_add_exp(lrel, e); } else if (p && p->op == op_select && !rel_is_ref(p)) { @@ -2075,7 +2105,7 @@ rel_filter_exp_(mvc *sql, sql_rel *rel, return rel; } /* push join into the given relation */ _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list