Changeset: de78d0cca567 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=de78d0cca567
Modified Files:
sql/backends/monet5/Tests/pyapi05.stable.out
sql/backends/monet5/Tests/rapi05.stable.out
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_select.c
sql/server/sql_mvc.c
sql/server/sql_mvc.h
sql/test/BugTracker-2017/Tests/aggr_udf_with_more_than_2params.Bug-6385.stable.err
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-coalesce-error-message.Bug-6608.stable.err
sql/test/BugTracker/Tests/caching.SF-1651599.stable.out
Branch: context
Log Message:
created branch 'context' for creating clean context layers between gdk, mal,
sql, relational etc
first cleanup some usage of the 'sql context mvc'
replaced groupby stack solution by an expression matching solution
when we can create an expression with sql_groupby set) and can match
this
against an expression in the group by list, we can use that one.
diffs (truncated from 818 to 300 lines):
diff --git a/sql/backends/monet5/Tests/pyapi05.stable.out
b/sql/backends/monet5/Tests/pyapi05.stable.out
--- a/sql/backends/monet5/Tests/pyapi05.stable.out
+++ b/sql/backends/monet5/Tests/pyapi05.stable.out
@@ -48,7 +48,7 @@ stdout of test 'pyapi05` in directory 's
#};
#SELECT cluster FROM (SELECT MIN(x) AS minx, MAX(x) AS maxx, kmeans(x,5) AS
cluster FROM xdata
# GROUP BY cluster) as cdata ORDER BY cluster;
-% sys.L12 # table_name
+% sys.cdata # table_name
% cluster # name
% int # type
% 1 # length
diff --git a/sql/backends/monet5/Tests/rapi05.stable.out
b/sql/backends/monet5/Tests/rapi05.stable.out
--- a/sql/backends/monet5/Tests/rapi05.stable.out
+++ b/sql/backends/monet5/Tests/rapi05.stable.out
@@ -31,7 +31,7 @@ stdout of test 'rapi05` in directory 'sq
#language R {kmeans(arg1,arg2)$cluster};
#SELECT cluster FROM (SELECT MIN(x) AS minx, MAX(x) AS maxx, kmeans(x,5) AS
cluster FROM xdata
# GROUP BY cluster) as cdata ORDER BY cluster;
-% sys.L12 # table_name
+% sys.cdata # table_name
% cluster # name
% int # type
% 1 # length
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
@@ -886,6 +886,21 @@ exps_find_exp( list *l, sql_exp *e)
return NULL;
}
+sql_exp*
+exps_match_exp(mvc *sql, list *l, sql_exp *e)
+{
+ node *n;
+
+ if (!l || !l->h)
+ return NULL;
+
+ for(n=l->h; n; n = n->next) {
+ if (exp_match_exp(sql, n->data, e))
+ return n->data;
+ }
+ return NULL;
+}
+
/* c refers to the parent p */
int
@@ -902,7 +917,7 @@ exp_refers( sql_exp *p, sql_exp *c)
}
int
-exp_match_col_exps( sql_exp *e, list *l)
+exp_match_col_exps(mvc *sql, sql_exp *e, list *l)
{
node *n;
@@ -911,17 +926,17 @@ exp_match_col_exps( sql_exp *e, list *l)
sql_exp *re_r = re->r;
if (re->type == e_cmp && re->flag == cmp_or)
- return exp_match_col_exps(e, re->l) &&
- exp_match_col_exps(e, re->r);
+ return exp_match_col_exps(sql, e, re->l) &&
+ exp_match_col_exps(sql, e, re->r);
- if (re->type != e_cmp || /*re->flag != cmp_equal ||*/ !re_r ||
re_r->card != 1 || !exp_match_exp(e, re->l))
+ if (re->type != e_cmp || /*re->flag != cmp_equal ||*/ !re_r ||
re_r->card != 1 || !exp_match_exp(sql, e, re->l))
return 0;
}
return 1;
}
int
-exps_match_col_exps( sql_exp *e1, sql_exp *e2)
+exps_match_col_exps(mvc *sql, sql_exp *e1, sql_exp *e2)
{
sql_exp *e1_r = e1->r;
sql_exp *e2_r = e2->r;
@@ -931,25 +946,25 @@ exps_match_col_exps( sql_exp *e1, sql_ex
if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == CARD_ATOM &&
!is_complex_exp(e2->flag) && e2_r && e2_r->card == CARD_ATOM)
- return exp_match_exp(e1->l, e2->l);
+ return exp_match_exp(sql, e1->l, e2->l);
if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == CARD_ATOM &&
(e2->flag == cmp_in || e2->flag == cmp_notin))
- return exp_match_exp(e1->l, e2->l);
+ return exp_match_exp(sql, e1->l, e2->l);
if ((e1->flag == cmp_in || e1->flag == cmp_notin) &&
(e2->flag == cmp_in || e2->flag == cmp_notin))
- return exp_match_exp(e1->l, e2->l);
+ return exp_match_exp(sql, e1->l, e2->l);
if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == CARD_ATOM &&
e2->flag == cmp_or)
- return exp_match_col_exps(e1->l, e2->l) &&
- exp_match_col_exps(e1->l, e2->r);
+ return exp_match_col_exps(sql, e1->l, e2->l) &&
+ exp_match_col_exps(sql, e1->l, e2->r);
if (e1->flag == cmp_or &&
!is_complex_exp(e2->flag) && e2_r && e2_r->card == CARD_ATOM)
- return exp_match_col_exps(e2->l, e1->l) &&
- exp_match_col_exps(e2->l, e1->r);
+ return exp_match_col_exps(sql, e2->l, e1->l) &&
+ exp_match_col_exps(sql, e2->l, e1->r);
if (e1->flag == cmp_or && e2->flag == cmp_or) {
list *l = e1->l, *r = e1->r;
@@ -957,14 +972,14 @@ exps_match_col_exps( sql_exp *e1, sql_ex
sql_exp *er = r->h->data;
return list_length(l) == 1 && list_length(r) == 1 &&
- exps_match_col_exps(el, e2) &&
- exps_match_col_exps(er, e2);
+ exps_match_col_exps(sql, el, e2) &&
+ exps_match_col_exps(sql, er, e2);
}
return 0;
}
static int
-exp_match_list( list *l, list *r)
+exp_match_list(mvc *sql, list *l, list *r)
{
node *n, *m;
char *lu, *ru;
@@ -982,7 +997,7 @@ exp_match_list( list *l, list *r)
for ( m = r->h, rc = 0; m; m = m->next, rc++) {
sql_exp *re = m->data;
- if (!ru[rc] && exp_match_exp(le,re)) {
+ if (!ru[rc] && exp_match_exp(sql, le,re)) {
lu[lc] = 1;
ru[rc] = 1;
match = 1;
@@ -1001,7 +1016,7 @@ exp_match_list( list *l, list *r)
}
static int
-exps_equal( list *l, list *r)
+exps_equal(mvc *sql, list *l, list *r)
{
node *n, *m;
@@ -1012,14 +1027,14 @@ exps_equal( list *l, list *r)
for (n = l->h, m = r->h; n && m; n = n->next, m = m->next) {
sql_exp *le = n->data, *re = m->data;
- if (!exp_match_exp(le,re))
+ if (!exp_match_exp(sql, le, re))
return 0;
}
return 1;
}
int
-exp_match_exp( sql_exp *e1, sql_exp *e2)
+exp_match_exp(mvc *sql, sql_exp *e1, sql_exp *e2)
{
if (exp_match(e1, e2))
return 1;
@@ -1027,37 +1042,37 @@ exp_match_exp( sql_exp *e1, sql_exp *e2)
switch(e1->type) {
case e_cmp:
if (e1->flag == e2->flag && !is_complex_exp(e1->flag) &&
- exp_match_exp(e1->l, e2->l) &&
- exp_match_exp(e1->r, e2->r) &&
- ((!e1->f && !e2->f) || exp_match_exp(e1->f, e2->f)))
+ exp_match_exp(sql, e1->l, e2->l) &&
+ exp_match_exp(sql, e1->r, e2->r) &&
+ ((!e1->f && !e2->f) || exp_match_exp(sql, e1->f,
e2->f)))
return 1;
else if (e1->flag == e2->flag && get_cmp(e1) == cmp_or
&&
- exp_match_list(e1->l, e2->l) &&
- exp_match_list(e1->r, e2->r))
+ exp_match_list(sql, e1->l, e2->l) &&
+ exp_match_list(sql, e1->r, e2->r))
return 1;
else if (e1->flag == e2->flag &&
(e1->flag == cmp_in || e1->flag == cmp_notin) &&
- exp_match_exp(e1->l, e2->l) &&
- exp_match_list(e1->r, e2->r))
+ exp_match_exp(sql, e1->l, e2->l) &&
+ exp_match_list(sql, e1->r, e2->r))
return 1;
break;
case e_convert:
if (!subtype_cmp(exp_totype(e1), exp_totype(e2)) &&
!subtype_cmp(exp_fromtype(e1), exp_fromtype(e2)) &&
- exp_match_exp(e1->l, e2->l))
+ exp_match_exp(sql, e1->l, e2->l))
return 1;
break;
case e_aggr:
if (!subaggr_cmp(e1->f, e2->f) && /* equal aggregation*/
- exps_equal(e1->l, e2->l) &&
+ exps_equal(sql, e1->l, e2->l) &&
e1->flag == e2->flag)
return 1;
break;
case e_func:
if (!subfunc_cmp(e1->f, e2->f) && /* equal functions */
- exps_equal(e1->l, e2->l) &&
+ exps_equal(sql, e1->l, e2->l) &&
/* optional order by expressions */
- exps_equal(e1->r, e2->r)) {
+ exps_equal(sql, e1->r, e2->r)) {
sql_subfunc *f = e1->f;
if (!f->func->side_effect)
return 1;
@@ -1066,6 +1081,8 @@ exp_match_exp( sql_exp *e1, sql_exp *e2)
case e_atom:
if (e1->l && e2->l && !atom_cmp(e1->l, e2->l))
return 1;
+ else if (!e1->l && !e1->r && !e1->f && !e2->l && !e2->r
&& !e2->f && !atom_cmp(sql->args[e1->flag], sql->args[e2->flag]))
+ return 1;
break;
default:
break;
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
@@ -113,11 +113,12 @@ extern int exp_cmp( sql_exp *e1, sql_exp
extern int exp_equal( sql_exp *e1, sql_exp *e2);
extern int exp_refers( sql_exp *p, sql_exp *c);
extern int exp_match( sql_exp *e1, sql_exp *e2);
-extern sql_exp* exps_find_exp( list *l, sql_exp *e);
-extern int exp_match_exp( sql_exp *e1, sql_exp *e2);
+extern sql_exp* exps_find_exp( list *l, sql_exp *e); /* find the exact
expression in the list */
+extern sql_exp* exps_match_exp(mvc *sql, list *l, sql_exp *e); /* find a
matching expression in the list */
+extern int exp_match_exp(mvc *sql, sql_exp *e1, sql_exp *e2);
/* match just the column (cmp equality) expressions */
-extern int exp_match_col_exps( sql_exp *e, list *l);
-extern int exps_match_col_exps( sql_exp *e1, sql_exp *e2);
+extern int exp_match_col_exps(mvc *sql, sql_exp *e, list *l);
+extern int exps_match_col_exps(mvc *sql, sql_exp *e1, sql_exp *e2);
extern int exp_is_join(sql_exp *e, list *rels);
extern int exp_is_eqjoin(sql_exp *e);
extern int exp_is_correlation(sql_exp *e, sql_rel *r );
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
@@ -3517,7 +3517,7 @@ exps_cse( mvc *sql, list *oexps, list *l
for ( m = r->h, rc = 0; m; m = m->next, rc++) {
sql_exp *re = m->data;
- if (!ru[rc] && exp_match_exp(le,re)) {
+ if (!ru[rc] && exp_match_exp(sql, le, re)) {
lu[lc] = 1;
ru[rc] = 1;
match = 1;
@@ -3675,7 +3675,7 @@ rel_project_cse(int *changes, mvc *sql,
for (m=n->next; m; m = m->next){
sql_exp *e2 = m->data;
- if (exp_name(e2) && exp_match_exp(e1,
e2))
+ if (exp_name(e2) && exp_match_exp(sql,
e1, e2))
needed = 1;
}
}
@@ -3692,7 +3692,7 @@ rel_project_cse(int *changes, mvc *sql,
for (m=nexps->h; m; m = m->next){
sql_exp *e2 = m->data;
- if (exp_name(e2) && exp_match_exp(e1,
e2)) {
+ if (exp_name(e2) && exp_match_exp(sql,
e1, e2)) {
sql_exp *ne =
exp_alias(sql->sa, e1->rname, exp_name(e1), e2->rname, exp_name(e2),
exp_subtype(e2), e2->card, has_nil(e2), is_intern(e1));
if (e2->p)
ne->p =
prop_copy(sql->sa, e2->p);
@@ -3703,6 +3703,7 @@ rel_project_cse(int *changes, mvc *sql,
}
append(nexps, e1);
}
+ sql->caching = 0;
rel->exps = nexps;
}
return rel;
@@ -3749,7 +3750,7 @@ exps_merge_select_rse( mvc *sql, list *l
continue;
for (m = rexps->h; !fnd && m; m = m->next) {
re = m->data;
- if (exps_match_col_exps(le, re))
+ if (exps_match_col_exps(sql, le, re))
fnd = re;
}
/* cases
@@ -4307,7 +4308,7 @@ rel_push_groupby_down(int *changes, mvc
for (m = rel->exps->h; m; m = m->next) {
sql_exp *a = m->data;
- if (exp_match_exp(a, ge) ||
exp_refers(ge, a)) {
+ if (exp_match_exp(sql, a, ge) ||
exp_refers(ge, a)) {
a = exp_column(sql->sa,
exp_relname(ne), exp_name(ne), exp_subtype(ne), ne->card, has_nil(ne),
is_intern(ne));
exp_setname(sql->sa, a,
exp_relname(ne), exp_name(ne));
m->data = a;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list