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

Reply via email to