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