Changeset: 2e4495012072 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2e4495012072
Added Files:
        sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.sql
        
sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.stable.err
        
sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.stable.out
        sql/test/BugTracker-2013/Tests/rangejoin_optimizer.Bug-3411.sql
        sql/test/BugTracker-2013/Tests/rangejoin_optimizer.Bug-3411.stable.err
        sql/test/BugTracker-2013/Tests/rangejoin_optimizer.Bug-3411.stable.out
Modified Files:
        monetdb5/mal/mal_instruction.h
        monetdb5/mal/mal_interpreter.c
        monetdb5/modules/mal/mal_mapi.c
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/server/rel_select.h
        sql/test/BugTracker-2013/Tests/All
Branch: default
Log Message:

Merge with Jan2014 branch.


diffs (truncated from 511 to 300 lines):

diff --git a/monetdb5/mal/mal_instruction.h b/monetdb5/mal/mal_instruction.h
--- a/monetdb5/mal/mal_instruction.h
+++ b/monetdb5/mal/mal_instruction.h
@@ -175,7 +175,7 @@ typedef struct MALBLK {
 #define isTmpVar(M,I)          ((M)->var[I]->tmpindex)
 #define getVarType(M,I)                ((M)->var[I]->type)
 #define getVarGDKType(M,I)     getGDKType((M)->var[I]->type)
-#define ignoreVar(M,I)         ((M)->var[I]->type == TYPE_ptr? 1: 0)
+#define ignoreVar(M,I)         ((M)->var[I]->type == TYPE_ptr)
 #define getGDKType(T)          ( T <= TYPE_str ? T : (T == TYPE_any ? 
TYPE_void : findGDKtype(T)))
 
 #define clrVarFixed(M,I)               ((M)->var[I]->flags &= ~VAR_FIXTYPE)
diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -37,34 +37,29 @@
 inline
 ptr getArgReference(MalStkPtr stk, InstrPtr pci, int k)
 {
+       ValRecord *v = &stk->stk[pci->argv[k]];
+
 #ifdef STRUCT_ALIGNED
-       return (ptr) & stk->stk[pci->argv[k]].val.ival;
+       return (ptr) &v->val.ival;
 #else
-       int j = 0;
-       ValRecord *v = 0;
        ptr ret = NULL;
 
-       j = pci->argv[k];
-       v = &stk->stk[j];
-
        switch (ATOMstorage(v->vtype)) {
-       case TYPE_void: ret = (ptr) & v->val.ival; break;
-       case TYPE_bit: ret = (ptr) & v->val.btval; break;
-       case TYPE_sht: ret = (ptr) & v->val.shval; break;
-       case TYPE_bat: ret = (ptr) & v->val.bval; break;
-       case TYPE_int: ret = (ptr) & v->val.ival; break;
-       case TYPE_wrd: ret = (ptr) & v->val.wval; break;
-       case TYPE_bte: ret = (ptr) & v->val.btval; break;
-       case TYPE_oid: ret = (ptr) & v->val.oval; break;
-       case TYPE_ptr: ret = (ptr) & v->val.pval; break;
-       case TYPE_flt: ret = (ptr) & v->val.fval; break;
-       case TYPE_dbl: ret = (ptr) & v->val.dval; break;
-       case TYPE_lng: ret = (ptr) & v->val.lval; break;
-       case TYPE_str: ret = (ptr) & v->val.sval; break;
-       default:
-               ret = (ptr) & v->val.pval;
+       case TYPE_void: return (ptr) &v->val.ival;
+       case TYPE_bit:  return (ptr) &v->val.btval;
+       case TYPE_sht:  return (ptr) &v->val.shval;
+       case TYPE_bat:  return (ptr) &v->val.bval;
+       case TYPE_int:  return (ptr) &v->val.ival;
+       case TYPE_wrd:  return (ptr) &v->val.wval;
+       case TYPE_bte:  return (ptr) &v->val.btval;
+       case TYPE_oid:  return (ptr) &v->val.oval;
+       case TYPE_ptr:  return (ptr) &v->val.pval;
+       case TYPE_flt:  return (ptr) &v->val.fval;
+       case TYPE_dbl:  return (ptr) &v->val.dval;
+       case TYPE_lng:  return (ptr) &v->val.lval;
+       case TYPE_str:  return (ptr) &v->val.sval;
+       default:        return (ptr) &v->val.pval;
        }
-       return ret;
 #endif
 }
 
diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -1585,9 +1585,9 @@ SERVERputLocal(Client cntxt, MalBlkPtr m
        case TYPE_bat:
        case TYPE_ptr:
                throw(MAL, "mapi.glue","Unsupported type");
-        case TYPE_str:
-                snprintf(buf,BUFSIZ,"%s:=%s;",*nme,*(char**)val);
-                break;
+       case TYPE_str:
+               snprintf(buf,BUFSIZ,"%s:=%s;",*nme,*(char**)val);
+               break;
        default:
                ATOMformat(tpe,val,&w);
                snprintf(buf,BUFSIZ,"%s:=%s;",*nme,w);
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
@@ -887,7 +887,7 @@ order_joins(mvc *sql, list *rels, list *
                        if (exp_is_join_exp(e) == 0)
                                rel_join_add_exp(sql->sa, top->l, e);
                        else
-                               rel_select_add_exp(top, e);
+                               rel_select_add_exp(sql->sa, top, e);
                }
        }
        return top;
@@ -3004,12 +3004,12 @@ rel_push_select_down(int *changes, mvc *
                                ne = exp_push_down(sql, e, jl, jl);
                        if (ne && ne != e) {
                                done = 1; 
-                               rel_select_add_exp(jl, ne);
+                               rel_select_add_exp(sql->sa, jl, ne);
                        } else if (right) {
                                ne = exp_push_down(sql, e, jr, jr);
                                if (ne && ne != e) {
                                        done = 1; 
-                                       rel_select_add_exp(jr, ne);
+                                       rel_select_add_exp(sql->sa, jr, ne);
                                }
                        }
                        if (!done)
@@ -3065,7 +3065,7 @@ rel_push_select_down(int *changes, mvc *
 
                                /* can we move it down */
                                if (ne && ne != e) {
-                                       rel_select_add_exp(pl, ne);
+                                       rel_select_add_exp(sql->sa, pl, ne);
                                        (*changes)++;
                                } else {
                                        append(rel->exps, (ne)?ne:e);
@@ -5228,22 +5228,33 @@ exp_merge_range(sql_allocator *sa, list 
 
                                if (f->type == e_cmp && f->flag < cmp_equal && 
!f->f  &&
                                    rf->card > CARD_ATOM) {
-                                       sql_exp *ne;
+                                       sql_exp *ne, *t;
                                        int swap = 0, lt = 0, gt = 0;
                                        comp_type ef = (comp_type) e->flag, ff 
= (comp_type) f->flag;
                                
+                                       /* both swapped ? */
+                                       if (exp_match_exp(re, rf)) {
+                                               t = re; 
+                                               re = le;
+                                               le = t;
+                                               ef = swap_compare(ef);
+                                               t = rf;
+                                               rf = lf;
+                                               lf = t;
+                                               ff = swap_compare(ff);
+                                       }
+
                                        /* is left swapped ? */
                                        if (exp_match_exp(re, lf)) {
-                                               sql_exp *t = re; 
-
+                                               t = re; 
                                                re = le;
                                                le = t;
                                                ef = swap_compare(ef);
                                        }
+
                                        /* is right swapped ? */
                                        if (exp_match_exp(le, rf)) {
-                                               sql_exp *t = rf; 
-
+                                               t = rf; 
                                                rf = lf;
                                                lf = t;
                                                ff = swap_compare(ff);
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
@@ -812,9 +812,13 @@ rel_find_lastexp(sql_rel *rel )
 }
 
 void
-rel_select_add_exp(sql_rel *l, sql_exp *e)
+rel_select_add_exp(sql_allocator *sa, sql_rel *l, sql_exp *e)
 {
        assert(l->op == op_select || is_outerjoin(l->op));
+       if (e->type != e_cmp && e->card > CARD_ATOM) {
+               sql_exp *t = exp_atom_bool(sa, 1);
+               e = exp_compare(sa, e, t, cmp_equal);
+       }
        append(l->exps, e);
 }
 
@@ -834,7 +838,7 @@ rel_select(sql_allocator *sa, sql_rel *l
                
        if (l && l->op == op_select && !rel_is_ref(l)) { /* refine old select */
                if (e)
-                       rel_select_add_exp(l, e);
+                       rel_select_add_exp(sa, l, e);
                return l;
        }
        rel = rel_create(sa);
@@ -843,7 +847,7 @@ rel_select(sql_allocator *sa, sql_rel *l
        rel->op = op_select;
        rel->exps = new_exp_list(sa);
        if (e)
-               append(rel->exps, e);
+               rel_select_add_exp(sa, rel, e);
        rel->card = CARD_ATOM; /* no relation */
        if (l) {
                rel->card = l->card;
@@ -1036,7 +1040,7 @@ rel_push_select(sql_allocator *sa, sql_r
        if (!lrel) 
                return NULL;
        if (p && p->op == op_select && !rel_is_ref(p)) { /* refine old select */
-               rel_select_add_exp(p, e);
+               rel_select_add_exp(sa, p, e);
        } else {
                sql_rel *n = rel_select(sa, lrel, e);
 
@@ -1132,9 +1136,9 @@ rel_push_join(sql_allocator *sa, sql_rel
        /* filter on columns of this relation */
        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);
+                       rel_select_add_exp(sa, lrel, e);
                } else if (p && p->op == op_select && !rel_is_ref(p)) {
-                       rel_select_add_exp(p, e);
+                       rel_select_add_exp(sa, p, e);
                } else {
                        sql_rel *n = rel_select(sa, lrel, e);
 
@@ -2898,7 +2902,7 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                        if (!is_select(rel->op) && !rel_is_ref(rel))
                                left = rel = rel_select(sql->sa, rel, e);
                        else
-                               rel_select_add_exp(rel, e);
+                               rel_select_add_exp(sql->sa, rel, e);
                }
 
                /* list of values or subqueries */
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -42,7 +42,7 @@ extern sql_exp *rel_column_exp(mvc *sql,
 
 extern void rel_add_intern(mvc *sql, sql_rel *rel);
 
-extern void rel_select_add_exp(sql_rel *l, sql_exp *e);
+extern void rel_select_add_exp(sql_allocator *sa, sql_rel *l, sql_exp *e);
 extern sql_rel *rel_select(sql_allocator *sa, sql_rel *l, sql_exp *e);
 extern sql_rel *rel_select_copy(sql_allocator *sa, sql_rel *l, list *exps);
 extern sql_rel *rel_basetable(mvc *sql, sql_table *t, char *tname);
diff --git a/sql/test/BugTracker-2013/Tests/All 
b/sql/test/BugTracker-2013/Tests/All
--- a/sql/test/BugTracker-2013/Tests/All
+++ b/sql/test/BugTracker-2013/Tests/All
@@ -65,3 +65,5 @@ not_null.Bug-3403
 nested_concat_query.Bug-3408
 json_is_null.Bug-3406
 restore-uuid.Bug-3407
+rangejoin_optimizer.Bug-3411
+boolean_column_predicate.Bug-3412
diff --git 
a/sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.sql 
b/sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.sql
@@ -0,0 +1,6 @@
+create table boolean_test (b boolean not null, i int not null);
+insert into boolean_test (b, i) values (true, 1), (true, 2), (true, 3), (true, 
4);
+select * from boolean_test;
+select * from boolean_test where b and (i < 3);
+select * from boolean_test where b = true and (i < 3);
+drop table boolean_test;
diff --git 
a/sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.stable.err 
b/sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.stable.err
new file mode 100644
--- /dev/null
+++ 
b/sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.stable.err
@@ -0,0 +1,35 @@
+stderr of test 'boolean_column_predicate.Bug-3412` in directory 
'sql/test/BugTracker-2013` itself:
+
+
+# 16:06:14 >  
+# 16:06:14 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=39442" "--set" 
"mapi_usock=/var/tmp/mtest-16327/.s.monetdb.39442" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2013"
 "--set" "mal_listing=0"
+# 16:06:14 >  
+
+# builtin opt  gdk_dbpath = 
/home/niels/scratch/rc-clean/Linux-x86_64/var/monetdb5/dbfarm/demo
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_vmtrim = yes
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 39442
+# cmdline opt  mapi_usock = /var/tmp/mtest-16327/.s.monetdb.39442
+# cmdline opt  monet_prompt = 
+# cmdline opt  mal_listing = 2
+# cmdline opt  gdk_dbpath = 
/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2013
+# cmdline opt  mal_listing = 0
+
+# 16:06:14 >  
+# 16:06:14 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-16327" "--port=39442"
+# 16:06:14 >  
+
+
+# 16:06:15 >  
+# 16:06:15 >  "Done."
+# 16:06:15 >  
+
diff --git 
a/sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.stable.out 
b/sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.stable.out
new file mode 100644
--- /dev/null
+++ 
b/sql/test/BugTracker-2013/Tests/boolean_column_predicate.Bug-3412.stable.out
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to