Changeset: 3a14d4e37e81 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3a14d4e37e81
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_rel.c
sql/server/rel_rel.h
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/server/rel_updates.c
sql/server/sql_query.c
sql/server/sql_query.h
sql/test/subquery/Tests/correlated.sql
sql/test/subquery/Tests/correlated.stable.err
Branch: sq2
Log Message:
more correlated fixes
diffs (truncated from 400 to 300 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -3095,7 +3095,7 @@ rel2bin_groupby(backend *be, sql_rel *re
therefore we pass the group by columns too
*/
if (!aggrstmt)
- aggrstmt = exp_bin(be, aggrexp, sub, cursub, NULL,
NULL, NULL, NULL);
+ aggrstmt = exp_bin(be, aggrexp, sub, cursub, grp, ext,
cnt, NULL);
if (!aggrstmt) {
assert(0);
return NULL;
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -306,7 +306,7 @@ rel_bind_column2( mvc *sql, sql_rel *rel
/* in case of orderby we should also lookup the column in group
by list (and use existing references) */
if (!list_empty(rel->exps)) {
e = exps_bind_column2(rel->exps, tname, cname);
- if (!e && (is_sql_orderby(f) || (0 && is_sql_outer(f)))
&& is_groupby(rel->op) && rel->r) {
+ if (!e && (1 || is_sql_orderby(f) || (0 &&
is_sql_outer(f))) && is_groupby(rel->op) && rel->r) {
e = exps_bind_alias(rel->r, tname, cname);
if (e) {
if (exp_relname(e))
@@ -662,7 +662,7 @@ exps_match(sql_exp *m, sql_exp *e)
return NULL;
}
-static sql_exp *
+sql_exp *
exps_find_match_exp(list *l, sql_exp *e)
{
node *n;
@@ -837,7 +837,6 @@ rel_groupby(mvc *sql, sql_rel *l, list *
groupbyexps = gexps;
}
-#if 0
if (groupbyexps) {
rel->card = CARD_AGGR;
for (en = groupbyexps->h; en; en = en->next) {
@@ -852,6 +851,8 @@ rel_groupby(mvc *sql, sql_rel *l, list *
append(aggrs, ne);
}
}
+#if 0
+
#endif
rel->l = l;
rel->r = groupbyexps;
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -102,5 +102,6 @@ extern sql_exp * rel_find_column( sql_al
extern int rel_in_rel(sql_rel *super, sql_rel *sub);
extern list *rel_dependencies(mvc *sql, sql_rel *r);
+extern sql_exp * exps_find_match_exp(list *l, sql_exp *e);
#endif /* _REL_REL_H_ */
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
@@ -1070,6 +1070,8 @@ rel_column_ref(sql_query *query, sql_rel
sql_rel *outer;
for (i=0; !exp && (outer = query_fetch_outer(query,i));
i++) {
+ int sql_state =
query_fetch_outer_state(query,i);
+
exp = rel_bind_column(sql, outer, name, f);
if (!exp && (is_sql_having(f) ||
is_sql_aggr(f)) && is_groupby(outer->op)) {
exp = rel_bind_column(sql, outer->l,
name, f);
@@ -1077,13 +1079,20 @@ rel_column_ref(sql_query *query, sql_rel
if (exp && is_simple_project(outer->op) &&
!rel_find_exp(outer, exp)) {
exp = rel_project_add_exp(sql, outer,
exp);
}
+ if (exp && is_sql_aggr(f) &&
is_sql_aggr(sql_state)) {
+ return sql_error(sql, 05,
SQLSTATE(42000) "SELECT: aggregate function calls cannot be nested");
+ }
}
if (exp && outer && outer->card <= CARD_AGGR &&
exp->card > CARD_AGGR && !is_sql_aggr(f))
return sql_error(sql, 05, SQLSTATE(42000)
"SELECT: cannot use non GROUP BY column '%s' in query results without an
aggregate function", name);
if (exp) {
- exp->card = CARD_ATOM;
- if (is_groupby(outer->op) && !is_sql_aggr(f))
+ if (is_groupby(outer->op) && !is_sql_aggr(f)) {
exp = rel_groupby_add_aggr(sql, outer,
exp);
+ exp->card = CARD_ATOM;
+ } else if (is_groupby(outer->op) &&
is_sql_aggr(f) && exps_find_match_exp(outer->exps, exp))
+ exp = exp_ref(sql->sa, exp);
+ else
+ exp->card = CARD_ATOM;
set_freevar(exp);
}
}
@@ -1138,6 +1147,8 @@ rel_column_ref(sql_query *query, sql_rel
sql_rel *outer;
for (i=0; !exp && (outer = query_fetch_outer(query,i));
i++) {
+ int sql_state =
query_fetch_outer_state(query,i);
+
exp = rel_bind_column2(sql, outer, tname,
cname, f | sql_outer);
if (!exp && (is_sql_having(f) ||
is_sql_aggr(f)) && is_groupby(outer->op)) {
exp = rel_bind_column2(sql, outer->l,
tname, cname, f);
@@ -1145,13 +1156,20 @@ rel_column_ref(sql_query *query, sql_rel
if (exp && is_simple_project(outer->op) &&
!rel_find_exp(outer, exp)) {
exp = rel_project_add_exp(sql, outer,
exp);
}
+ if (exp && is_sql_aggr(f) &&
is_sql_aggr(sql_state)) {
+ return sql_error(sql, 05,
SQLSTATE(42000) "SELECT: aggregate function calls cannot be nested");
+ }
}
if (exp && outer && outer->card <= CARD_AGGR &&
exp->card > CARD_AGGR && !is_sql_aggr(f))
return sql_error(sql, 05, SQLSTATE(42000)
"SELECT: cannot use non GROUP BY column '%s.%s' in query results without an
aggregate function", tname, cname);
if (exp) {
- exp->card = CARD_ATOM;
- if (is_groupby(outer->op) && !is_sql_aggr(f))
+ if (is_groupby(outer->op) && !is_sql_aggr(f)) {
exp = rel_groupby_add_aggr(sql, outer,
exp);
+ exp->card = CARD_ATOM;
+ } else if (is_groupby(outer->op) &&
is_sql_aggr(f) && exps_find_match_exp(outer->exps, exp))
+ exp = exp_ref(sql->sa, exp);
+ else
+ exp->card = CARD_ATOM;
set_freevar(exp);
}
}
@@ -1873,7 +1891,7 @@ rel_compare(sql_query *query, sql_rel *r
/* reset error */
sql->session->status = 0;
sql->errstr[0] = 0;
- query_push_outer(query, rel);
+ query_push_outer(query, rel, f);
r = rel_subquery(query, NULL, ro, ek);
rel = query_pop_outer(query);
@@ -2221,7 +2239,7 @@ rel_in_value_exp(sql_query *query, sql_r
sql->session->status = 0;
sql->errstr[0] = 0;
- query_push_outer(query, left);
+ query_push_outer(query, left, f);
r = rel_value_exp(query, &z, n->data.sym, f /*
ie no result project */, ek);
left = query_pop_outer(query);
/*
@@ -2396,7 +2414,7 @@ rel_exists_value_exp(sql_query *query, s
sql->session->status = 0;
sql->errstr[0] = 0;
- query_push_outer(query, *rel);
+ query_push_outer(query, *rel, f);
sq = rel_subquery(query, NULL, lo, ek);
*rel = query_pop_outer(query);
@@ -2631,7 +2649,7 @@ rel_logical_value_exp(sql_query *query,
sql->session->status = 0;
sql->errstr[0] = 0;
- query_push_outer(query, *rel);
+ query_push_outer(query, *rel, f);
r = rel_subquery(query, NULL, ro, ek);
*rel = query_pop_outer(query);
@@ -3008,7 +3026,7 @@ rel_in_exp(sql_query *query, sql_rel *re
sql->session->status = 0;
sql->errstr[0] = 0;
- query_push_outer(query, left);
+ query_push_outer(query, left, f);
r = rel_value_exp(query, &z, n->data.sym, f /*
ie no result project */, ek);
left = query_pop_outer(query);
if (!r)
@@ -3372,7 +3390,7 @@ rel_logical_exp(sql_query *query, sql_re
sql->session->status = 0;
sql->errstr[0] = '\0';
- query_push_outer(query, rel);
+ query_push_outer(query, rel, f);
sq = rel_subquery(query, NULL, lo, ek);
rel = query_pop_outer(query);
@@ -4208,7 +4226,8 @@ static sql_exp *
}
if (all_freevar) { //* case 2, ie use outer
- assert(query->outer->top == 1);
+ //assert(query->outer->top == 1);
+ /* TODO find proper relation */
res = groupby = query_fetch_outer(query, 0);
}
@@ -4291,7 +4310,7 @@ static sql_exp *
return NULL;
if (all_freevar) {
- query->outer->values [0] = res;
+ query_update_outer(query, res, 0);
} else {
*rel = res;
}
@@ -5930,10 +5949,11 @@ rel_value_exp2(sql_query *query, sql_rel
sql->session->status = 0;
sql->errstr[0] = '\0';
- query_push_outer(query, *rel);
+ query_push_outer(query, *rel, f);
r = rel_subquery(query, NULL, se, ek);
*rel = query_pop_outer(query);
if (r) {
+ set_subquery(r);
rs = _rel_lastexp(sql, r);
if (ek.card <= card_set && is_project(r->op) &&
list_length(r->exps) > 1)
@@ -6518,7 +6538,7 @@ rel_query(sql_query *query, sql_rel *rel
sql->session->status = 0;
sql->errstr[0] = 0;
- query_push_outer(query, res);
+ query_push_outer(query, res, sql_from);
fnd = table_ref(query, NULL, n->data.sym,
lateral);
res = query_pop_outer(query);
}
@@ -6592,7 +6612,7 @@ rel_setquery(sql_query *query, sql_rel *
/* reset error */
sql->session->status = 0;
sql->errstr[0] = 0;
- query_push_outer(query, rel);
+ query_push_outer(query, rel, sql_from);
t1 = table_ref(query, NULL, tab_ref1, 0);
rel = query_pop_outer(query);
}
@@ -6605,7 +6625,7 @@ rel_setquery(sql_query *query, sql_rel *
/* reset error */
sql->session->status = 0;
sql->errstr[0] = 0;
- query_push_outer(query, rel);
+ query_push_outer(query, rel, sql_from);
t2 = table_ref(query, NULL, tab_ref2, 0);
rel = query_pop_outer(query);
}
@@ -6691,7 +6711,7 @@ rel_joinquery_(sql_query *query, sql_rel
sql->session->status = 0;
sql->errstr[0] = 0;
- query_push_outer(query, t1);
+ query_push_outer(query, t1, sql_from);
t2 = table_ref(query, NULL, tab2, 0);
t1 = query_pop_outer(query);
}
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -578,7 +578,7 @@ push_up_project(mvc *sql, sql_rel *rel,
if (exp_has_freevar(sql, e))
rel_bind_var(sql, rel->l, e);
}
- e = exp_rewrite(sql, r->l, e, ad,
is_left(rel->op));
+ e = exp_rewrite(sql, r->l, e, ad,
is_left(rel->op)|is_semi(rel->op));
append(n->exps, e);
}
if (r->r) {
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -1022,7 +1022,7 @@ update_generate_assignments(sql_query *q
if (single) {
v = rel_value_exp(query, &r, a,
sql_sel, ek);
} else if (!rel_val && r) {
- query_push_outer(query, r);
+ query_push_outer(query, r, sql_sel);
rel_val = rel_subquery(query, NULL, a,
ek);
r = query_pop_outer(query);
if (/* DISABLES CODE */ (0) && r) {
diff --git a/sql/server/sql_query.c b/sql/server/sql_query.c
--- a/sql/server/sql_query.c
+++ b/sql/server/sql_query.c
@@ -9,6 +9,17 @@
#include "monetdb_config.h"
#include "sql_query.h"
+static stacked_query *
+sq_create( sql_allocator *sa, sql_rel *rel, int sql_state)
+{
+ stacked_query *q = SA_NEW(sa, stacked_query);
+
+ assert(rel);
+ q->rel = rel;
+ q->sql_state = sql_state;
+ return q;
+}
+
sql_query *
query_create( mvc *sql)
{
@@ -20,23 +31,44 @@ query_create( mvc *sql)
}
void
-query_push_outer(sql_query *q, sql_rel *r)
+query_push_outer(sql_query *q, sql_rel *r, int sql_state)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list