Changeset: ac93c378055c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ac93c378055c
Added Files:
        sql/test/SQLancer/Tests/sqlancer24.test
Modified Files:
        monetdb5/mal/mal_client.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_select.c
        sql/server/rel_unnest.c
        sql/server/rel_unnest.h
        sql/server/sql_semantic.h
        sql/storage/store.c
        sql/test/SQLancer/Tests/All
        sql/test/SQLancer/Tests/sqlancer19.test.in
        sql/test/SQLancer/Tests/sqlancer20.test.in
Branch: default
Log Message:
manual merge of subqueryfun branch.

Fixed some more subquery problems, related to not binding variables.


diffs (truncated from 426 to 300 lines):

diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -378,7 +378,6 @@ MCcloseClient(Client c)
        c->promptlength = -1;
        if (c->errbuf) {
                /* no client threads in embedded mode */
-               //if (!GDKembedded())
                GDKsetbuf(NULL);
                if (c->father == NULL)
                        GDKfree(c->errbuf);
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
@@ -3039,18 +3039,6 @@ check_distinct_exp_names(mvc *sql, list 
        return exps;
 }
 
-void
-exps_reset_freevar(list *exps)
-{
-       if (exps)
-               for(node *n=exps->h; n; n=n->next) {
-                       sql_exp *e = n->data;
-
-                       /*later use case per type */
-                       reset_freevar(e);
-               }
-}
-
 static int rel_find_parameter(mvc *sql, sql_subtype *type, sql_rel *rel, const 
char *relname, const char *expname);
 
 static int
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
@@ -207,7 +207,6 @@ extern void exp_sum_scales(sql_subfunc *
 
 extern int exp_aggr_is_count(sql_exp *e);
 extern list *check_distinct_exp_names(mvc *sql, list *exps);
-extern void exps_reset_freevar(list *exps);
 
 extern sql_exp *exp_check_type(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp 
*exp, check_type tpe);
 extern int rel_set_type_param(mvc *sql, sql_subtype *type, sql_rel *rel, 
sql_exp *rel_exp, int upcast);
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
@@ -4116,7 +4116,7 @@ static sql_exp *
                if (!group && !all_freevar)
                        return e;
                if (all_freevar) {
-                       exps_reset_freevar(exps);
+                       rel_bind_vars(sql, groupby->l, exps);
                        assert(!is_simple_project(res->op));
                        e->card = CARD_ATOM;
                        set_freevar(e, all_freevar-1);
@@ -5438,7 +5438,9 @@ rel_value_exp2(sql_query *query, sql_rel
                        r = rel_values(query, se, NULL);
                } else {
                        assert(se->token == SQL_SELECT);
-                       r = rel_subquery(query, se, ek);
+                       exp_kind nek = ek;
+                       nek.aggr = is_sql_aggr(f);
+                       r = rel_subquery(query, se, nek);
                }
                if (rel && *rel) {
                        *rel = query_pop_outer(query);
@@ -5977,7 +5979,7 @@ rel_select_exp(sql_query *query, sql_rel
                 * and rel_table_exp.
                 */
                list *te = NULL;
-               sql_exp *ce = rel_column_exp(query, &inner, n->data.sym, 
sql_sel | group_totals);
+               sql_exp *ce = rel_column_exp(query, &inner, n->data.sym, 
sql_sel | group_totals | (ek.aggr?sql_aggr:0));
 
                if (ce) {
                        pexps = append(pexps, ce);
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
@@ -290,20 +290,23 @@ freevar_equal( sql_exp *e1, sql_exp *e2)
 }
 
 static list *
-merge_freevar(list *l, list *r)
+merge_freevar(list *l, list *r, bool all)
 {
        if (!l)
                return r;
        if (!r)
                return l;
-       return list_distinct(list_merge(l, r, (fdup)NULL), (fcmp)freevar_equal, 
(fdup)NULL);
+       r  = list_merge(l, r, (fdup)NULL);
+       if (all)
+               return r;
+       return list_distinct(r, (fcmp)freevar_equal, (fdup)NULL);
 }
 
 static list * exps_freevar(mvc *sql, list *exps);
 static list * rel_freevar(mvc *sql, sql_rel *rel);
 
 static list *
-exp_freevar(mvc *sql, sql_exp *e)
+exp_freevar(mvc *sql, sql_exp *e, bool all)
 {
        if (mvc_highwater(sql))
                return sql_error(sql, 10, SQLSTATE(42000) "Query too complex: 
running out of stack space");
@@ -314,7 +317,7 @@ exp_freevar(mvc *sql, sql_exp *e)
                        return append(sa_list(sql->sa), e);
                break;
        case e_convert:
-               return exp_freevar(sql, e->l);
+               return exp_freevar(sql, e->l, all);
        case e_aggr:
        case e_func:
                if (e->l)
@@ -324,18 +327,18 @@ exp_freevar(mvc *sql, sql_exp *e)
                if (e->flag == cmp_or || e->flag == cmp_filter) {
                        list *l = exps_freevar(sql, e->l);
                        list *r = exps_freevar(sql, e->r);
-                       return merge_freevar(l, r);
+                       return merge_freevar(l, r, all);
                } else if (e->flag == cmp_in || e->flag == cmp_notin) {
-                       list *l = exp_freevar(sql, e->l);
+                       list *l = exp_freevar(sql, e->l, all);
                        list *r = exps_freevar(sql, e->r);
-                       return merge_freevar(l, r);
+                       return merge_freevar(l, r, all);
                } else {
-                       list *l = exp_freevar(sql, e->l);
-                       list *r = exp_freevar(sql, e->r);
-                       l = merge_freevar(l, r);
+                       list *l = exp_freevar(sql, e->l, all);
+                       list *r = exp_freevar(sql, e->r, all);
+                       l = merge_freevar(l, r, all);
                        if (e->f) {
-                               r = exp_freevar(sql, e->f);
-                               return merge_freevar(l, r);
+                               r = exp_freevar(sql, e->f, all);
+                               return merge_freevar(l, r, all);
                        }
                        return l;
                }
@@ -367,9 +370,9 @@ exps_freevar(mvc *sql, list *exps)
                return NULL;
        for (n = exps->h; n; n = n->next) {
                sql_exp *e = n->data;
-               list *var = exp_freevar(sql, e);
-
-               c = merge_freevar(c,var);
+               list *var = exp_freevar(sql, e, false);
+
+               c = merge_freevar(c,var, false);
        }
        return c;
 }
@@ -391,8 +394,8 @@ rel_freevar(mvc *sql, sql_rel *rel)
                exps = exps_freevar(sql, rel->exps);
                lexps = rel_freevar(sql, rel->l);
                rexps = rel_freevar(sql, rel->r);
-               lexps = merge_freevar(lexps, rexps);
-               exps = merge_freevar(exps, lexps);
+               lexps = merge_freevar(lexps, rexps, false);
+               exps = merge_freevar(exps, lexps, false);
                return exps;
 
        case op_basetable:
@@ -402,7 +405,7 @@ rel_freevar(mvc *sql, sql_rel *rel)
                if (rel->flag != TRIGGER_WRAPPER && rel->l)
                        lexps = rel_freevar(sql, rel->l);
                exps = (rel->flag != TRIGGER_WRAPPER && call)?exps_freevar(sql, 
call->l):NULL;
-               return merge_freevar(exps, lexps);
+               return merge_freevar(exps, lexps, false);
        }
        case op_union:
        case op_except:
@@ -410,8 +413,8 @@ rel_freevar(mvc *sql, sql_rel *rel)
                exps = exps_freevar(sql, rel->exps);
                lexps = rel_freevar(sql, rel->l);
                rexps = rel_freevar(sql, rel->r);
-               lexps = merge_freevar(lexps, rexps);
-               exps = merge_freevar(exps, lexps);
+               lexps = merge_freevar(lexps, rexps, false);
+               exps = merge_freevar(exps, lexps, false);
                return exps;
        case op_ddl:
        case op_semi:
@@ -430,9 +433,9 @@ rel_freevar(mvc *sql, sql_rel *rel)
                                rexps = exps_freevar(sql, rel->r);
                        else
                                rexps = rel_freevar(sql, rel->r);
-                       lexps = merge_freevar(lexps, rexps);
+                       lexps = merge_freevar(lexps, rexps, false);
                }
-               exps = merge_freevar(exps, lexps);
+               exps = merge_freevar(exps, lexps, false);
                return exps;
        default:
                return NULL;
@@ -476,7 +479,7 @@ rel_dependent_var(mvc *sql, sql_rel *l, 
 void
 rel_bind_var(mvc *sql, sql_rel *rel, sql_exp *e)
 {
-       list *fvs = exp_freevar(sql, e);
+       list *fvs = exp_freevar(sql, e, true);
 
        if (fvs) {
                node *n;
@@ -490,7 +493,7 @@ rel_bind_var(mvc *sql, sql_rel *rel, sql
        }
 }
 
-static void
+void
 rel_bind_vars(mvc *sql, sql_rel *rel, list *exps)
 {
        if (list_empty(exps))
@@ -1723,7 +1726,7 @@ rel_unnest_dependent(mvc *sql, sql_rel *
                                return rel_unnest_dependent(sql, rel);
                        }
 
-                       if (r && is_set(r->op) && !is_left(rel->op) && 
is_distinct_set(sql, l, ad)) {
+                       if (r && is_set(r->op) && !is_left(rel->op) && rel->op 
!= op_anti && is_distinct_set(sql, l, ad)) {
                                rel = push_up_set(sql, rel, ad);
                                return rel_unnest_dependent(sql, rel);
                        }
diff --git a/sql/server/rel_unnest.h b/sql/server/rel_unnest.h
--- a/sql/server/rel_unnest.h
+++ b/sql/server/rel_unnest.h
@@ -21,6 +21,7 @@ extern int rel_has_freevar(mvc *sql, sql
 extern void exp_only_freevar(sql_query *query, sql_exp *e, bool 
*arguments_correlated, bool *found_one_freevar, list **ungrouped_cols);
 extern void exps_set_freevar(mvc *sql, list *exps, sql_rel *r);
 extern void rel_bind_var(mvc *sql, sql_rel *rel, sql_exp *e);
+extern void rel_bind_vars(mvc *sql, sql_rel *rel, list *exps);
 
 extern sql_rel *rel_unnest(mvc *sql, sql_rel *rel);
 
diff --git a/sql/server/sql_semantic.h b/sql/server/sql_semantic.h
--- a/sql/server/sql_semantic.h
+++ b/sql/server/sql_semantic.h
@@ -19,6 +19,7 @@ typedef struct exp_kind_t {
        bte type;
        bte card;
        bit reduce;
+       bit aggr;       /* passed from outer query */
 } exp_kind;
 
 extern sql_schema *cur_schema(mvc *sql);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -6740,6 +6740,7 @@ sql_trans_create_idx(sql_idx **i, sql_tr
        sql_table *sysidx = find_sql_table(tr, syss, "idxs");
        int res = LOG_OK;
 
+       assert(it != oph_idx && it != no_idx && it != new_idx_types);
        assert(name);
        base_init(NULL, &ni->base, next_oid(tr->store), true, name);
        ni->type = it;
diff --git a/sql/test/SQLancer/Tests/All b/sql/test/SQLancer/Tests/All
--- a/sql/test/SQLancer/Tests/All
+++ b/sql/test/SQLancer/Tests/All
@@ -21,3 +21,4 @@ sqlancer20
 sqlancer21
 sqlancer22
 sqlancer23
+sqlancer24
diff --git a/sql/test/SQLancer/Tests/sqlancer19.test.in 
b/sql/test/SQLancer/Tests/sqlancer19.test.in
--- a/sql/test/SQLancer/Tests/sqlancer19.test.in
+++ b/sql/test/SQLancer/Tests/sqlancer19.test.in
@@ -1101,6 +1101,17 @@ SELECT 1 FROM rt3 LEFT OUTER JOIN (SELEC
 ----
 1
 
+query T nosort
+SELECT splitpart(CAST('c' AS STRING(12)), 'a', length('c')) FROM t3 where 
t3.c0 = 1
+----
+c
+
+# disabled for now...
+#query T nosort
+#SELECT splitpart(CAST('c' AS STRING(12)), 'a', length('c')) FROM rt3 where 
rt3.c0 = 1
+#----
+#c
+
 query TTT nosort
 (SELECT greatest(JSON '"5mTevdOzH5brfkMv"', JSON '0.4'),CASE WHEN FALSE THEN 
NULL END, greatest(BLOB 'c0', BLOB '') FROM t3) INTERSECT ALL (SELECT JSON 
'0.2', JSON '-3', BLOB '30' FROM t3)
 ----
diff --git a/sql/test/SQLancer/Tests/sqlancer20.test.in 
b/sql/test/SQLancer/Tests/sqlancer20.test.in
--- a/sql/test/SQLancer/Tests/sqlancer20.test.in
+++ b/sql/test/SQLancer/Tests/sqlancer20.test.in
@@ -252,3 +252,63 @@ TRUNCATE TABLE tmp.tt2
 statement ok
 DROP TABLE tmp.tt2
 
+statement ok
+START TRANSACTION;
+
+statement ok
+CREATE MERGE TABLE "mt0" ("c1" DECIMAL(18,3));
+
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to