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