Changeset: df6fb82513f6 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=df6fb82513f6
Modified Files:
        sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/18.stable.out
        sql/benchmarks/tpch/Tests/01-22.stable.out
        sql/benchmarks/tpch/Tests/18.stable.out
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/test/ADT2006/Tests/benesamo.stable.out
        sql/test/ADT2006/Tests/woud.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
        sql/test/bugs/Tests/groupby_having-bug-sf-947600.stable.out
        sql/test/bugs/Tests/groupby_having_charlength-bug-sf-943566.stable.out
        sql/test/bugs/Tests/in_or_bug.stable.out
        sql/test/rdf/Tests/q2_28_t.stable.out
        sql/test/rdf/Tests/q3_28_t.stable.out
        sql/test/rdf/Tests/q4_28_t.stable.out
        sql/test/rdf/Tests/q6_28_t.stable.out
Branch: Oct2012
Log Message:

fixes for bug 3189, ie use correct types on both sides of the IN.


diffs (truncated from 434 to 300 lines):

diff --git a/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out 
b/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
--- a/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
+++ b/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
@@ -862,7 +862,7 @@ Ready.
 # 11:48:06 >  
 
 % sys.customer,        sys.customer,   sys.orders,     sys.orders,     
sys.orders,     sys.lineitem # table_name
-% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L4 # name
+% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L6 # name
 % varchar,     int,    int,    date,   decimal,        bigint # type
 % 18,  3,      5,      10,     17,     3 # length
 [ "Customer#000000667",        667,    29158,  1995-10-21,     439687.23,      
305     ]
diff --git a/sql/benchmarks/tpch/LOCKED/Tests/18.stable.out 
b/sql/benchmarks/tpch/LOCKED/Tests/18.stable.out
--- a/sql/benchmarks/tpch/LOCKED/Tests/18.stable.out
+++ b/sql/benchmarks/tpch/LOCKED/Tests/18.stable.out
@@ -24,7 +24,7 @@ Ready.
 # 11:48:03 >  
 
 % sys.customer,        sys.customer,   sys.orders,     sys.orders,     
sys.orders,     sys.lineitem # table_name
-% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L4 # name
+% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L6 # name
 % varchar,     int,    int,    date,   decimal,        bigint # type
 % 18,  3,      5,      10,     17,     3 # length
 [ "Customer#000000667",        667,    29158,  1995-10-21,     439687.23,      
305     ]
diff --git a/sql/benchmarks/tpch/Tests/01-22.stable.out 
b/sql/benchmarks/tpch/Tests/01-22.stable.out
--- a/sql/benchmarks/tpch/Tests/01-22.stable.out
+++ b/sql/benchmarks/tpch/Tests/01-22.stable.out
@@ -862,7 +862,7 @@ Ready.
 # 11:48:06 >  
 
 % sys.customer,        sys.customer,   sys.orders,     sys.orders,     
sys.orders,     sys.lineitem # table_name
-% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L4 # name
+% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L6 # name
 % varchar,     int,    int,    date,   decimal,        bigint # type
 % 18,  3,      5,      10,     17,     3 # length
 [ "Customer#000000667",        667,    29158,  1995-10-21,     439687.23,      
305     ]
diff --git a/sql/benchmarks/tpch/Tests/18.stable.out 
b/sql/benchmarks/tpch/Tests/18.stable.out
--- a/sql/benchmarks/tpch/Tests/18.stable.out
+++ b/sql/benchmarks/tpch/Tests/18.stable.out
@@ -24,7 +24,7 @@ Ready.
 # 11:48:03 >  
 
 % sys.customer,        sys.customer,   sys.orders,     sys.orders,     
sys.orders,     sys.lineitem # table_name
-% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L4 # name
+% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L6 # name
 % varchar,     int,    int,    date,   decimal,        bigint # type
 % 18,  3,      5,      10,     17,     3 # length
 [ "Customer#000000667",        667,    29158,  1995-10-21,     439687.23,      
305     ]
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
@@ -4224,14 +4224,13 @@ positional_exps_mark_used( sql_rel *rel,
 
        if ((is_topn(subrel->op) || is_sample(subrel->op)) && subrel->l)
                subrel = subrel->l;
+       /* everything is used within the set operation */
        if (rel->exps && subrel->exps) {
-               node *n, *m;
-               for (n=rel->exps->h, m=subrel->exps->h; n && m; n = n->next, m 
= m->next) {
-                       sql_exp *e = n->data;
+               node *m;
+               for (m=subrel->exps->h; m; m = m->next) {
                        sql_exp *se = m->data;
 
-                       if (e->used)
-                               se->used = 1;
+                       se->used = 1;
                }
        }
 }
@@ -4453,9 +4452,6 @@ rel_remove_unused(mvc *sql, sql_rel *rel
        case op_project:
        case op_groupby: 
 
-       case op_union: 
-       case op_inter: 
-       case op_except: 
 
                if (rel->l && rel->exps) {
                        node *n;
@@ -4483,6 +4479,10 @@ rel_remove_unused(mvc *sql, sql_rel *rel
                }
                return rel;
 
+       case op_union: 
+       case op_inter: 
+       case op_except: 
+
        case op_insert:
        case op_update:
        case op_delete:
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
@@ -2943,7 +2943,7 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                sql_rel *left = NULL, *right = NULL, *outer = rel;
                sql_exp *l = rel_value_exp(sql, &left, lo, f, ek), *e, *r = 
NULL;
                list *vals = NULL;
-               int correlated = 0, vals_only = 1;
+               int correlated = 0;
                int l_is_value = 1, r_is_rel = 0;
 
                if (!l && sql->session->status != -ERR_AMBIGUOUS) {
@@ -2975,53 +2975,80 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                /* list of values or subqueries */
                if (n->type == type_list) {
                        sql_subtype *st = exp_subtype(l);
+                       sql_rel *z = NULL;
 
                        vals = new_exp_list(sql->sa);
+                       n = dl->h->next;
                        n = n->data.lval->h;
+
+                       /* Simple value list first */
                        for (; n; n = n->next) {
-                               symbol *sval = n->data.sym;
-                               /* without correlation first */
-                               sql_rel *z = NULL;
-                               sql_rel *rl;
-
-                               r = rel_value_exp(sql, &z, sval, f, ek);
-                               if (z)
-                                       r_is_rel = 1;
-                               if (!r && sql->session->status != 
-ERR_AMBIGUOUS) {
-                                       /* reset error */
-                                       sql->session->status = 0;
-                                       sql->errstr[0] = 0;
-
-                                       /* TODO remove null checking (not 
needed in correlated case because of the semi/anti join) ! */
-                                       if (l_is_value) 
-                                               rel = rel_dup(outer);
-                                       else
-                                               rel = left = rel_dup(left);
-                                       r = rel_value_exp(sql, &rel, sval, f, 
ek);
-                                       if (r && !is_project(rel->op)) {
-                                               rel = rel_project(sql->sa, rel, 
NULL);
-                                               rel_project_add_exp(sql, rel, 
r);
+                               r = rel_value_exp(sql, &z, n->data.sym, f, ek);
+                               if (z || !r)
+                                       break;
+                               if (rel_convert_types(sql, &l, &r, 1, 
type_equal) < 0) 
+                                       return NULL;
+                               list_append(vals, r);
+                       }
+                       if (!n) { /* correct types */
+                               list *nvals = new_exp_list(sql->sa);
+                               node *n;
+
+                               st = exp_subtype(l);
+                               for ( n=vals->h; n; n = n->next) {
+                                       if ((r = rel_check_type(sql, st, 
n->data, type_equal)) == NULL) 
+                                               return NULL;
+                                       list_append(nvals, r);
+                               }
+                               e = exp_in(sql->sa, l, nvals, 
sc->token==SQL_NOT_IN?cmp_notin:cmp_in);
+                               return rel_select(sql->sa, rel, e);
+                       } else { /* complex case */
+                               vals = new_exp_list(sql->sa);
+                               n = dl->h->next;
+                               n = n->data.lval->h;
+                               for (; n; n = n->next) {
+                                       symbol *sval = n->data.sym;
+                                       /* without correlation first */
+                                       sql_rel *z = NULL;
+                                       sql_rel *rl;
+
+                                       r = rel_value_exp(sql, &z, sval, f, ek);
+                                       if (z)
+                                               r_is_rel = 1;
+                                       if (!r && sql->session->status != 
-ERR_AMBIGUOUS) {
+                                               /* reset error */
+                                               sql->session->status = 0;
+                                               sql->errstr[0] = 0;
+
+                                               if (l_is_value) 
+                                                       rel = rel_dup(outer);
+                                               else
+                                                       rel = left = 
rel_dup(left);
+                                               r = rel_value_exp(sql, &rel, 
sval, f, ek);
+                                               if (r && !is_project(rel->op)) {
+                                                       rel = 
rel_project(sql->sa, rel, NULL);
+                                                       
rel_project_add_exp(sql, rel, r);
+                                               }
+                                               z = rel;
+                                               correlated = 1;
                                        }
-                                       z = rel;
-                                       correlated = 1;
+                                       if (!r || !(r=rel_check_type(sql, st, 
r, type_equal))) {
+                                               rel_destroy(right);
+                                               return NULL;
+                                       }
+                                       if (z) {
+                                               rl = z;
+                                       } else {
+                                               list_append(vals, r);
+                                               rl = rel_project_exp(sql->sa, 
exp_label(sql->sa, r, ++sql->label));
+                                       }
+                                       if (right) {
+                                               rl = rel_setop(sql->sa, right, 
rl, op_union);
+                                               rl->exps = rel_projections(sql, 
rl, NULL, 0, 1);
+                                               set_processed(rl);
+                                       }
+                                       right = rl;
                                }
-                               if (!r || !(r=rel_check_type(sql, st, r, 
type_equal))) {
-                                       rel_destroy(right);
-                                       return NULL;
-                               }
-                               if (z) {
-                                       vals_only = 0;
-                                       rl = z;
-                               } else {
-                                       list_append(vals, r);
-                                       rl = rel_project_exp(sql->sa, 
exp_label(sql->sa, r, ++sql->label));
-                               }
-                               if (right) {
-                                       rl = rel_setop(sql->sa, right, rl, 
op_union);
-                                       rl->exps = rel_projections(sql, rl, 
NULL, 0, 1);
-                                       set_processed(rl);
-                               }
-                               right = rl;
                        }
                        if (!correlated) {
                                if (right->processed)
@@ -3033,29 +3060,6 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                }
 
                if (right) {
-                       if (vals_only && !correlated) {
-                               list *nvals = sa_list(sql->sa);
-                               sql_exp *e = NULL;
-                               node *n;
-
-                               rel_destroy(right);
-                               for(n=vals->h; n; n = n->next) {
-                                       sql_exp *r = n->data;
-
-                                       r = rel_check_type(sql, exp_subtype(l), 
r, type_equal);
-                                       if (!r)
-                                               return NULL;
-                                       append(nvals, r);
-                               }
-
-                               if (sc->token == SQL_NOT_IN) {
-                                       e = exp_in(sql->sa, l, nvals, 
cmp_notin);
-                               } else {
-                                       e = exp_in(sql->sa, l, nvals, cmp_in);
-                               }
-                               rel = rel_select(sql->sa, rel, e);
-                               return rel;
-                       }
                        r = rel_lastexp(sql, right);
                        rel = rel_crossproduct(sql->sa, left, right, op_join);
                        if (rel_convert_types(sql, &l, &r, 1, type_equal) < 0) 
diff --git a/sql/test/ADT2006/Tests/benesamo.stable.out 
b/sql/test/ADT2006/Tests/benesamo.stable.out
--- a/sql/test/ADT2006/Tests/benesamo.stable.out
+++ b/sql/test/ADT2006/Tests/benesamo.stable.out
@@ -190,12 +190,12 @@ Ready.
 [ "Ada",       "Wilson",       "(survived the attack on 1888-28-03)"   ]
 [ "Annie",     "Farmer",       "(survived the attack on 1888-11-20)"   ]
 % sys.scene_witness # table_name
-% L5 # name
+% L12 # name
 % wrd # type
 % 1 # length
 [ 6    ]
 % sys.scene_inspector # table_name
-% L3 # name
+% L4 # name
 % wrd # type
 % 1 # length
 [ 2    ]
diff --git a/sql/test/ADT2006/Tests/woud.stable.out 
b/sql/test/ADT2006/Tests/woud.stable.out
--- a/sql/test/ADT2006/Tests/woud.stable.out
+++ b/sql/test/ADT2006/Tests/woud.stable.out
@@ -65,7 +65,7 @@ Ready.
 % bigint # type
 % 1 # length
 % . # table_name
-% L4 # name
+% L5 # name
 % double # type
 % 24 # length
 [ NULL ]
diff --git a/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out 
b/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
--- a/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
+++ b/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
@@ -19,56 +19,30 @@ Ready.
 
 
 
-
-
-
-
-
-
-
-
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to