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