Changeset: 90b4495128ef for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=90b4495128ef
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_exp.c
        sql/server/rel_exp.h
        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-2008/Tests/group_by_in_subquery_fails.SF-2219131.stable.out
        sql/test/BugTracker-2009/Tests/correlated-selection-bug.stable.out
        sql/test/BugTracker-2011/Tests/aggregate-in-subquery.Bug-2739.stable.out
        sql/test/BugTracker-2011/Tests/exists-select.Bug-2933.stable.out
        sql/test/Dependencies/Tests/Dependencies.stable.out
        sql/test/Tests/marcin1.stable.out
        sql/test/Tests/zones.stable.out
        sql/test/bugs/Tests/zero_or_one_bug.stable.out
        sql/test/null/Tests/coalesce2.stable.out
        sql/test/null/Tests/coalesce3.stable.out
Branch: Dec2011
Log Message:

fixed problem with recursive exist (with set operations)


diffs (truncated from 742 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,   
L5 # name
+% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L4 # 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,   
L5 # name
+% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L4 # 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,   
L5 # name
+% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L4 # 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,   
L5 # name
+% c_name,      c_custkey,      o_orderkey,     o_orderdate,    o_totalprice,   
L4 # 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_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1037,3 +1037,27 @@ compare_func( comp_type t )
        }
 }
 
+int
+is_identity( sql_exp *e, sql_rel *r)
+{
+       switch(e->type) {
+       case e_column:
+               if (r && is_project(r->op)) {
+                       sql_exp *re = NULL;
+                       if (e->l)
+                               re = exps_bind_column2(r->exps, e->l, e->r);
+                       if (!re && ((char*)e->r)[0] == 'L')
+                               re = exps_bind_column(r->exps, e->r, NULL);
+                       if (re)
+                               return is_identity(re, r->l);
+               }
+               return 0;
+       case e_func: {
+               sql_subfunc *f = e->f;
+               return (strcmp(f->func->base.name, "identity") == 0);
+       }
+       default:
+               return 0;
+       }
+}
+
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -100,5 +100,6 @@ extern void exps_fix_card( list *exps, i
 extern int exps_intern(list *exps);
 
 extern char *compare_func( comp_type t );
+extern int is_identity( sql_exp *e, sql_rel *r);
 
 #endif /* _REL_EXP_H_ */
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
@@ -1848,7 +1848,7 @@ exps_case_fixup( mvc *sql, list *exps, s
                list *nexps = new_exp_list(sql->sa);
                for( n = exps->h; n; n = n->next) {
                        sql_exp *e = n->data;
-                       if (e->type == e_func && e->l && !is_rank_op(e) ) {
+                       if (is_func(e->type) && e->l && !is_rank_op(e) ) {
                                sql_subfunc *f = e->f;
 
                                if (!f->func->s && !strcmp(f->func->base.name, 
"sql_div")) {
@@ -4921,30 +4921,6 @@ rel_reduce_casts(int *changes, mvc *sql,
 }
 
 static int
-is_identity( sql_exp *e, sql_rel *r)
-{
-       switch(e->type) {
-       case e_column:
-               if (r && is_project(r->op)) {
-                       sql_exp *re = NULL;
-                       if (e->l)
-                               re = exps_bind_column2(r->exps, e->l, e->r);
-                       if (!re && ((char*)e->r)[0] == 'L')
-                               re = exps_bind_column(r->exps, e->r, NULL);
-                       if (re)
-                               return is_identity(re, r->l);
-               }
-               return 0;
-       case e_func: {
-               sql_subfunc *f = e->f;
-               return (strcmp(f->func->base.name, "identity") == 0);
-       }
-       default:
-               return 0;
-       }
-}
-
-static int
 is_identity_of(sql_exp *e, sql_rel *l) 
 {
        if (e->type != e_cmp)
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
@@ -174,7 +174,11 @@ exp_alias_or_copy( mvc *sql, char *tname
        if (settname && !tname && old->type == e_column)
                tname = old->l;
 
-       if (!cname) {
+       if (!cname && exp_name(old) && exp_name(old)[0] == 'L') {
+               ne = exp_column(sql->sa, exp_relname(old), exp_name(old), 
exp_subtype(old), orel->card, has_nil(old), is_intern(old));
+               ne->p = prop_copy(sql->sa, old->p);
+               return ne;
+       } else if (!cname) {
                char name[16], *nme;
                nme = number2name(name, 16, ++sql->label);
 
@@ -2708,12 +2712,87 @@ rel_add_identity(mvc *sql, sql_rel *rel,
        }
        rel = rel_project(sql->sa, rel, rel_projections(sql, rel, NULL, 1, 1));
        e = rel_unop_(sql, rel->exps->h->data, NULL, "identity", card_value);
-       set_intern(e);
+       //set_intern(e);
        rel_project_add_exp(sql, rel, e);
        *exp = exp_label(sql->sa, e, ++sql->label);
        return rel;
 }
 
+static sql_exp *
+find_identity(list *exps, sql_rel *r) 
+{
+       node *n;
+
+       if (!exps)
+               return NULL;
+       for (n = exps->h; n; n = n->next) {
+               sql_exp *e = n->data;
+
+               if (is_identity(e, r)) 
+                       return e;
+       }
+       return NULL;
+}
+
+static sql_exp *
+rel_find_identity(mvc *sql, sql_rel *r, sql_exp *e ) 
+{
+       sql_exp *ne = NULL;
+       node *n;
+
+       switch(r->op) {
+       case op_join:
+       case op_left:
+       case op_right:
+       case op_full:
+               ne = rel_find_identity(sql, r->l, e);
+               if (!ne)
+                       ne = rel_find_identity(sql, r->r, e);
+               return ne;
+       case op_semi:
+       case op_anti:
+       case op_select:
+               ne = rel_find_identity(sql, r->l, e);
+               return ne;
+       case op_topn:
+       case op_sample:
+       case op_groupby:
+       case op_union:
+       case op_except:
+       case op_inter:
+       case op_project:
+
+               ne = rel_find_identity(sql, r->l, e);
+               if (ne && r->exps) { /* find exp pointing to ne */
+                       for (n = r->exps->h; n; n = n->next) {
+                               sql_exp *re = n->data;
+                       
+                               if (e->rname && re->l && strcmp(e->rname, 
re->l) == 0 && strcmp(e->name, re->r) == 0) 
+                                       return re;
+                               if (!e->rname && !re->l && strcmp(e->name, 
re->r) == 0) 
+                                       return re;
+                       }
+               } else if (r->exps) {
+                       return e;
+               }
+               return NULL;
+       case op_table:
+       case op_basetable:
+               if (r->exps) {
+                       node *en;
+
+                       for (en = r->exps->h; en; en = en->next) {
+                               sql_exp *oe = en->data;
+
+                               if (oe == e)
+                                       return e;
+                       }
+               }
+       default:
+               return NULL;
+       }
+}
+
 sql_rel *
 rel_logical_exp(mvc *sql, sql_rel *rel, symbol *sc, int f)
 {
@@ -2970,7 +3049,9 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
 
                        /* look up the identity columns and label these */
                        le = rel_bind_column(sql, rel, e->name, f);
-                       re = rel_bind_column(sql, r, e->name, f);
+
+                       /* find expression back */
+                       re = rel_find_identity(sql, r, le );
 
                        if (!le || !re)
                                return NULL;
@@ -4598,16 +4679,20 @@ rel_select_exp(mvc *sql, sql_rel *rel, s
                                        outer_gbexps = rel_projections(sql, 
outer, NULL, 1, 1);
                                        if (!is_project(outer->op))
                                                rel->l = outer = 
rel_project(sql->sa, outer, rel_projections(sql, outer, NULL, 1, 1));
-                                       e = rel_unop_(sql, 
outer->exps->h->data, NULL, "identity", card_value);
-                                       set_intern(e);
-                                       rel_project_add_exp(sql, outer, e);
+                                       /* find or create identity column */
+                                       if ((e = find_identity(outer->exps, 
outer)) == NULL) {
+                                               e = rel_unop_(sql, 
outer->exps->h->data, NULL, "identity", card_value);
+                                               set_intern(e);
+                                               rel_project_add_exp(sql, outer, 
e);
+                                       }
                                        set_processed(outer);
                                        e = rel_lastexp(sql, outer);
 
-                                       assert(pre_prj != NULL);
-                                       for(n = pre_prj->h; n; n = n->next) {
-                                               sql_exp *e = n->data;
-                                               e->card = CARD_AGGR;
+                                       if (pre_prj) {
+                                               for(n = pre_prj->h; n; n = 
n->next) {
+                                                       sql_exp *e = n->data;
+                                                       e->card = CARD_AGGR;
+                                               }
                                        }
                                        rel = rel_groupby_gbe(sql->sa, rel, e);
                                }
@@ -4854,6 +4939,7 @@ rel_query(mvc *sql, sql_rel *rel, symbol
 {
        sql_rel *res = NULL;
        SelectNode *sn = NULL;
+       int used = 0;
 
        if (sq->token != SQL_SELECT)
                return table_ref(sql, rel, sq);
@@ -4873,7 +4959,13 @@ rel_query(mvc *sql, sql_rel *rel, symbol
                sql_rel *fnd = NULL;
 
                for (n = fl->h; n ; n = n->next) {
-                       fnd = table_ref(sql, rel, n->data.sym);
+                       fnd = table_ref(sql, NULL, n->data.sym);
+                       if (!fnd && rel) {
+                               if (used)
+                                       rel = rel_dup(rel);
+                               fnd = table_ref(sql, rel, n->data.sym);
+                               used = 1;
+                       }
 
                        if (!fnd)
                                break;
@@ -4887,11 +4979,10 @@ rel_query(mvc *sql, sql_rel *rel, symbol
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to