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