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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list