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