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 -- [email protected]
To unsubscribe send an email to [email protected]