Changeset: 9dde3a2eeefb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9dde3a2eeefb
Modified Files:
        sql/server/rel_select.c
        sql/server/rel_unnest.c
        sql/server/sql_query.c
        sql/server/sql_query.h
        sql/test/subquery/Tests/subquery6.stable.out
Branch: Jun2020
Log Message:

fixed small problem when we remove from-less selects


diffs (135 lines):

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
@@ -5375,7 +5375,6 @@ rel_value_exp2(sql_query *query, sql_rel
        }
 }
 
-
 static int exps_has_rank(list *exps);
 
 static int
@@ -5404,8 +5403,8 @@ exps_has_rank(list *exps)
        for(node *n = exps->h; n; n=n->next){
                sql_exp *e = n->data;
 
-       if (exp_has_rank(e))
-               return 1;
+               if (exp_has_rank(e))
+                       return 1;
        }
        return 0;
 }
@@ -5413,7 +5412,7 @@ exps_has_rank(list *exps)
 sql_exp *
 rel_value_exp(sql_query *query, sql_rel **rel, symbol *se, int f, exp_kind ek)
 {
-       SelectNode*sn = NULL;
+       SelectNode *sn = NULL;
        sql_exp *e;
        if (!se)
                return NULL;
@@ -5431,11 +5430,21 @@ rel_value_exp(sql_query *query, sql_rel 
        if (exp_has_rel(e) && sn && !sn->from && !sn->where && (ek.card < 
card_set || ek.card == card_exists) && ek.type != type_relation) {
                sql_rel *r = exp_rel_get_rel(query->sql->sa, e);
                sql_rel *l = r->l;
- 
+
                if (r && is_simple_project(r->op) && l && 
is_simple_project(l->op) && !l->l && !exps_has_rank(r->exps) && 
list_length(r->exps) == 1) { /* should be a simple column or value */
-                       e = r->exps->h->data;
-                       if (*rel && !exp_has_rel(e))
-                               rel_bind_var(query->sql, *rel, e);
+                       if (list_length(r->exps) > 1) { /* Todo make sure the 
in handling can handle a list ( value lists), instead of just a list of 
relations */
+                               e = exp_values(query->sql->sa, r->exps);
+                       } else {
+                               e = r->exps->h->data;
+                               if (*rel && !exp_has_rel(e)) {
+                                       rel_bind_var(query->sql, *rel, e);
+                                       if (exp_has_freevar(query->sql, e) && 
is_sql_aggr(f)) {
+                                               sql_rel *outer = 
query_fetch_outer(query, exp_has_freevar(query->sql, e)-1);
+                                               
query_outer_pop_last_used(query, exp_has_freevar(query->sql, e)-1);
+                                               reset_outer(outer);
+                                       }
+                               }
+                       }
                }
        }
        return e;
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
@@ -95,7 +95,7 @@ exp_has_freevar(mvc *sql, sql_exp *e)
        }
 
        if (is_freevar(e))
-               return 1;
+               return is_freevar(e);
        switch(e->type) {
        case e_cmp:
                if (e->flag == cmp_or || e->flag == cmp_filter) {
@@ -139,9 +139,10 @@ exps_have_freevar(mvc *sql, list *exps)
        if (!exps)
                return 0;
        for (node *n = exps->h; n; n = n->next) {
+               int vf = 0;
                sql_exp *e = n->data;
-               if (exp_has_freevar(sql, e))
-                       return 1;
+               if ((vf =exp_has_freevar(sql, e)) != 0)
+                       return vf;
        }
        return 0;
 }
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
@@ -111,6 +111,16 @@ query_outer_used_exp(sql_query *q, int i
        return 0;
 }
 
+void
+query_outer_pop_last_used(sql_query *q, int i)
+{
+       stacked_query *sq = sql_stack_fetch(q->outer, i);
+
+       sq->last_used = NULL;
+       sq->used_card = 0;
+       sq->sql_state = 0;
+}
+
 int
 query_outer_aggregated(sql_query *q, int i, sql_exp *e)
 {
diff --git a/sql/server/sql_query.h b/sql/server/sql_query.h
--- a/sql/server/sql_query.h
+++ b/sql/server/sql_query.h
@@ -36,6 +36,7 @@ extern void query_update_outer(sql_query
 extern int query_has_outer(sql_query *q); /* returns number of outer relations 
*/
 
 extern int query_outer_used_exp(sql_query *q, int i, sql_exp *e, int f);
+extern void query_outer_pop_last_used(sql_query *q, int i);
 extern int query_outer_aggregated(sql_query *q, int i, sql_exp *e);
 extern int query_outer_used_card(sql_query *q, int i);
 extern sql_exp *query_outer_last_used(sql_query *q, int i);
diff --git a/sql/test/subquery/Tests/subquery6.stable.out 
b/sql/test/subquery/Tests/subquery6.stable.out
--- a/sql/test/subquery/Tests/subquery6.stable.out
+++ b/sql/test/subquery/Tests/subquery6.stable.out
@@ -86,6 +86,18 @@ stdout of test 'subquery6` in directory 
 % bigint # type
 % 4 # length
 [ 3702 ]
+#SELECT CAST((SELECT SUM((SELECT col1))) AS BIGINT) FROM another_t;
+% sys.%2 # table_name
+% %2 # name
+% bigint # type
+% 4 # length
+[ 1234 ]
+#SELECT CAST((SELECT SUM((SELECT col1 + col2))) AS BIGINT) FROM another_t;
+% sys.%2 # table_name
+% %2 # name
+% bigint # type
+% 4 # length
+[ 3702 ]
 #DROP TABLE tbl_ProductSales;
 #DROP TABLE another_T;
 #DROP TABLE integers;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to