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

Reply via email to