Changeset: bd75c8aecaab for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bd75c8aecaab
Modified Files:
        sql/src/server/rel_exp.mx
        sql/src/server/rel_optimizer.mx
        sql/src/server/rel_select.mx
        sql/src/test/BugTracker-2009/Tests/correlated-selection-bug.stable.out
Branch: Oct2010
Log Message:

fixed bug 2729 (complex expressions with different relations being used
on one of the sides of the compare expression).
We push in an extra select.


diffs (181 lines):

diff -r 38195aa0606a -r bd75c8aecaab sql/src/server/rel_exp.mx
--- a/sql/src/server/rel_exp.mx Fri Dec 03 21:28:44 2010 +0100
+++ b/sql/src/server/rel_exp.mx Sat Dec 04 23:08:23 2010 +0100
@@ -795,7 +795,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;
                        }
@@ -804,7 +805,7 @@
        case e_cmp:     
                return NULL;
        case e_atom:
-               return ne;
+               return e;
        }
        return ne;
 }
diff -r 38195aa0606a -r bd75c8aecaab sql/src/server/rel_optimizer.mx
--- a/sql/src/server/rel_optimizer.mx   Fri Dec 03 21:28:44 2010 +0100
+++ b/sql/src/server/rel_optimizer.mx   Sat Dec 04 23:08:23 2010 +0100
@@ -653,7 +653,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);
 
@@ -750,10 +752,25 @@
                                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(top, exp_dup(n->data));
+               top = rel_select(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(top->l, exp_dup(e));
+                       else
+                               rel_select_add_exp(top, exp_dup(e));
+               }
        }
        return top;
 }
@@ -2963,11 +2980,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 38195aa0606a -r bd75c8aecaab sql/src/server/rel_select.mx
--- a/sql/src/server/rel_select.mx      Fri Dec 03 21:28:44 2010 +0100
+++ b/sql/src/server/rel_select.mx      Sat Dec 04 23:08:23 2010 +0100
@@ -729,7 +729,6 @@
                        rel->exps = new_exp_list();
                append(rel->exps, e);
        } else if (rel->op == op_groupby) {
-               /* todo fix leak */
                (void) rel_groupby_add_aggr(sql, rel, e);
        }
 }
@@ -3485,6 +3484,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 38195aa0606a -r bd75c8aecaab 
sql/src/test/BugTracker-2009/Tests/correlated-selection-bug.stable.out
--- a/sql/src/test/BugTracker-2009/Tests/correlated-selection-bug.stable.out    
Fri Dec 03 21:28:44 2010 +0100
+++ b/sql/src/test/BugTracker-2009/Tests/correlated-selection-bug.stable.out    
Sat Dec 04 23:08:23 2010 +0100
@@ -21,11 +21,61 @@
 
 Over..
 
-# 19:20:37 >  
-# 19:20:37 >  mclient -lsql -umonetdb -Pmonetdb --host=alf --port=35158 
-# 19:20:37 >  
+# 22:51:44 >  
+# 22:51:44 >  mclient -lsql -ftest -i -e --host=alf --port=37337 
+# 22:51:44 >  
 
-% 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