Changeset: ef68ce68797a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ef68ce68797a
Modified Files:
sql/src/server/rel_exp.c
sql/src/server/rel_optimizer.c
sql/src/server/rel_select.c
sql/src/test/BugTracker-2009/Tests/correlated-selection-bug.stable.out
Branch: default
Log Message:
fixed bug 2729
diffs (182 lines):
diff -r 7a19dd9d42d0 -r ef68ce68797a sql/src/server/rel_exp.c
--- a/sql/src/server/rel_exp.c Sat Dec 04 17:24:34 2010 +0100
+++ b/sql/src/server/rel_exp.c Sat Dec 04 23:09:10 2010 +0100
@@ -668,7 +668,8 @@
list *l = e->l;
node *n = l->h;
- while (ne == NULL && n != NULL) {
+ ne = n->data;
+ while (ne != NULL && n != NULL) {
ne = rel_find_exp_(rel, n->data);
n = n->next;
}
@@ -677,7 +678,7 @@
case e_cmp:
return NULL;
case e_atom:
- return ne;
+ return e;
}
return ne;
}
diff -r 7a19dd9d42d0 -r ef68ce68797a sql/src/server/rel_optimizer.c
--- a/sql/src/server/rel_optimizer.c Sat Dec 04 17:24:34 2010 +0100
+++ b/sql/src/server/rel_optimizer.c Sat Dec 04 23:09:10 2010 +0100
@@ -623,7 +623,9 @@
/* find the involved relations */
- /* TODO all current code assumes expressions only touch 2
(atmost) 2 base tables, but complex expressions my touch multiple base tables */
+ /* complex expressions may touch multiple base tables
+ * Should be push up to extra selection.
+ * */
l = find_one_rel(rels, cje->l);
r = find_one_rel(rels, cje->r);
@@ -720,10 +722,26 @@
top = n->data;
}
}
- if (list_length(exps)) { /* more expressions */
+ if (list_length(exps)) { /* more expressions (add selects) */
node *n;
- for(n=exps->h; n; n = n->next)
- rel_join_add_exp(sql->sa, top, n->data);
+ top = rel_select(sql->sa, top, NULL);
+ for(n=exps->h; n; n = n->next) {
+ sql_exp *e = n->data;
+
+ /* find the involved relations */
+
+ /* complex expressions may touch multiple base tables
+ * Should be push up to extra selection.
+ * */
+ l = find_one_rel(rels, e->l);
+ r = find_one_rel(rels, e->r);
+
+ if (l && r)
+ rel_join_add_exp(sql->sa, top->l, e);
+ else
+ rel_select_add_exp(top, e);
+ }
+
}
return top;
}
@@ -2854,11 +2872,20 @@
int nr = 0;
if (rel->exps) {
node *n;
- for (n=rel->exps->h; n; n = n->next) {
- sql_exp *e = n->data;
-
- if (!is_project(rel->op) || e->used)
+ int len = list_length(rel->exps), i;
+ sql_exp **exps = (sql_exp**)alloca(sizeof(sql_exp*) * len);
+
+ for (n=rel->exps->h, i = 0; n; n = n->next, i++)
+ exps[i] = n->data;
+
+ for (i = len-1; i >= 0; i--) {
+ sql_exp *e = exps[i];
+
+ if (!is_project(rel->op) || e->used) {
+ if (is_project(rel->op))
+ nr += exp_mark_used(rel, e);
nr += exp_mark_used(subrel, e);
+ }
}
}
/* for count/rank we need atleast one column */
diff -r 7a19dd9d42d0 -r ef68ce68797a sql/src/server/rel_select.c
--- a/sql/src/server/rel_select.c Sat Dec 04 17:24:34 2010 +0100
+++ b/sql/src/server/rel_select.c Sat Dec 04 23:09:10 2010 +0100
@@ -657,7 +657,6 @@
rel->exps = new_exp_list(sql->sa);
append(rel->exps, e);
} else if (rel->op == op_groupby) {
- /* todo fix leak */
(void) rel_groupby_add_aggr(sql, rel, e);
}
}
@@ -3287,6 +3286,10 @@
no_nil = 1;
e = rel_value_exp(sql, &gr, sym, f, ek);
+ if (gr && e && is_project(gr->op) && !is_set(gr->op) && e->type
!= e_column) {
+ rel_project_add_exp(sql, gr, e);
+ e = exp_alias_or_copy(sql, exp_relname(e), exp_name(e),
gr->l, e, 0);
+ }
groupby->l = gr;
}
diff -r 7a19dd9d42d0 -r ef68ce68797a
sql/src/test/BugTracker-2009/Tests/correlated-selection-bug.stable.out
--- a/sql/src/test/BugTracker-2009/Tests/correlated-selection-bug.stable.out
Sat Dec 04 17:24:34 2010 +0100
+++ b/sql/src/test/BugTracker-2009/Tests/correlated-selection-bug.stable.out
Sat Dec 04 23:09:10 2010 +0100
@@ -21,11 +21,61 @@
Over..
-# 19:20:37 >
-# 19:20:37 > mclient -lsql -umonetdb -Pmonetdb --host=alf --port=35158
-# 19:20:37 >
+# 15:01:39 >
+# 15:01:39 > mclient -lsql -ftest -i -e --host=alf --port=35460
+# 15:01:39 >
-% sys.store, sys.L3, sys.L7, sys.L13, sys., sys., sys.warehouse #
table_name
+#CREATE TABLE "sys"."store" (
+# "store_id" int NOT NULL,
+# "store_type" varchar(30),
+# "region_id" int,
+# "store_name" varchar(30),
+# "store_number" int,
+# "store_street_address" varchar(30),
+# "store_city" varchar(30),
+# "store_state" varchar(30),
+# "store_postal_code" varchar(30),
+# "store_country" varchar(30),
+# "store_manager" varchar(30),
+# "store_phone" varchar(30),
+# "store_fax" varchar(30),
+# "first_open
+#CREATE TABLE "sys"."warehouse" (
+# "warehouse_id" int NOT NULL,
+# "warehouse_class_id" int,
+# "stores_id" int,
+# "warehouse_name" varchar(60),
+# "wa_address1" varchar(30),
+# "wa_address2" varchar(30),
+# "wa_address3" varchar(30),
+# "wa_address4" varchar(30),
+# "warehouse_city" varchar(30),
+# "warehouse_state_province" varchar(30),
+# "warehouse_postal_code" varchar(30),
+# "warehouse_country" varchar(30),
+# "warehouse_owner_name" va
+#CREATE TABLE "sys"."warehouse_class" (
+# "warehouse_class_id" int NOT NULL,
+# "description" varchar(30)
+#);
+#select
+# "store"."store_type" as "c0",
+# count(distinct (
+# select
+# "warehouse_class"."warehouse_class_id" AS "warehouse_class_id"
+# from
+# "warehouse_class" AS "warehouse_class"
+# where
+# "warehouse_class"."warehouse_class_id" =
"warehouse"."warehouse_class_id" and
+# "warehouse_class"."description" = 'Large Owned')) as "m0",
+# count(distinct (
+# select
+# "warehouse_class"."warehouse_class_id" AS "warehouse_class_id"
+# from
+# "warehouse_class" AS "warehouse_class"
+# where
+# "warehouse_class"."warehouse_cl
+% sys.store, sys.L3, sys.L7, sys.L13, sys.L15, sys.L17,
sys.warehouse # table_name
% c0, m0, m1, m2, m3, m4, m5 # name
% varchar, wrd, wrd, wrd, wrd, wrd, wrd # type
% 0, 1, 1, 1, 1, 1, 1 # length
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list