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

Reply via email to