Changeset: d5379c637ccd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d5379c637ccd
Modified Files:
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_select.c
sql/test/BugTracker-2016/Tests/storagemodel.test
sql/test/BugTracker-2022/Tests/create_func_with_case_and_in.test
Branch: default
Log Message:
fix problem with in in control flow
diffs (120 lines):
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
@@ -286,6 +286,40 @@ exp_in_func(mvc *sql, sql_exp *le, sql_e
}
sql_exp *
+exp_in_aggr(mvc *sql, sql_exp *le, sql_exp *vals, int anyequal, int is_tuple)
+{
+ sql_subfunc *a_func = NULL;
+ sql_exp *e = le;
+
+ if (is_tuple) {
+ list *l = exp_get_values(e);
+ e = l->h->data;
+ }
+ if (!(a_func = sql_bind_func(sql, "sys", anyequal ? "anyequal" :
"allnotequal", exp_subtype(e), exp_subtype(e), F_AGGR, true)))
+ return sql_error(sql, 02, SQLSTATE(42000) "(NOT) IN operator on
type %s missing", exp_subtype(e) ? exp_subtype(e)->type->base.name : "unknown");
+ e = exp_aggr2(sql->sa, le, vals, a_func, need_distinct(e),
need_no_nil(e), e->card, has_nil(e));
+ if (e) {
+ unsigned int exps_card = CARD_ATOM;
+
+ /* ignore the cardinalites of sub-relations */
+ if (vals->type == e_atom && vals->f) {
+ for (node *n = ((list*)vals->f)->h ; n ; n = n->next) {
+ sql_exp *next = n->data;
+
+ if (!exp_is_rel(next) && exps_card < next->card)
+ exps_card = next->card;
+ }
+ } else if (!exp_is_rel(vals))
+ exps_card = vals->card;
+
+ e->card = MAX(le->card, exps_card);
+ if (!has_nil(le) && !has_nil(vals))
+ set_has_no_nil(e);
+ }
+ return e;
+}
+
+sql_exp *
exp_compare_func(mvc *sql, sql_exp *le, sql_exp *re, const char *compareop,
int quantifier)
{
sql_subfunc *cmp_func = sql_bind_func(sql, "sys", compareop,
exp_subtype(le), exp_subtype(le), F_FUNC, true);
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
@@ -41,6 +41,7 @@ extern sql_exp *exp_filter(sql_allocator
extern sql_exp *exp_or(sql_allocator *sa, list *l, list *r, int anti);
extern sql_exp *exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype);
extern sql_exp *exp_in_func(mvc *sql, sql_exp *le, sql_exp *vals, int
anyequal, int is_tuple);
+extern sql_exp *exp_in_aggr(mvc *sql, sql_exp *le, sql_exp *vals, int
anyequal, int is_tuple);
extern sql_exp *exp_compare_func(mvc *sql, sql_exp *le, sql_exp *re, const
char *compareop, int quantifier);
#define exp_fromtype(e) ((list*)e->r)->h->data
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
@@ -2062,7 +2062,10 @@ rel_in_value_exp(sql_query *query, sql_r
if (!e) {
if (add_select && rel && *rel &&
!is_project((*rel)->op) && !is_select((*rel)->op) && !is_base((*rel)->op))
*rel = rel_select(sql->sa, *rel, NULL);
- e = exp_in_func(sql, le, values, (sc->token == SQL_IN),
is_tuple);
+ if ((rel && *rel) || exp_has_rel(le) ||
exp_has_rel(values))
+ e = exp_in_func(sql, le, values, (sc->token ==
SQL_IN), is_tuple);
+ else
+ e = exp_in_aggr(sql, le, values, (sc->token ==
SQL_IN), is_tuple);
}
}
return e;
diff --git a/sql/test/BugTracker-2016/Tests/storagemodel.test
b/sql/test/BugTracker-2016/Tests/storagemodel.test
--- a/sql/test/BugTracker-2016/Tests/storagemodel.test
+++ b/sql/test/BugTracker-2016/Tests/storagemodel.test
@@ -86,10 +86,10 @@ bug3923
i
int
10000
-10000
-8312
+40000
0
-2000
+0
+8000
0
1
NULL
@@ -192,10 +192,10 @@ bug3923
i
int
10000
-10000
-8312
+40000
0
-2000
+0
+8000
0
1
NULL
diff --git a/sql/test/BugTracker-2022/Tests/create_func_with_case_and_in.test
b/sql/test/BugTracker-2022/Tests/create_func_with_case_and_in.test
--- a/sql/test/BugTracker-2022/Tests/create_func_with_case_and_in.test
+++ b/sql/test/BugTracker-2022/Tests/create_func_with_case_and_in.test
@@ -6,4 +6,14 @@ END;
query T rowsort
select foo(10);
----
-'YES'
+YES
+
+statement ok
+CREATE FUNCTION nfoo(t INT) RETURNS STRING BEGIN
+RETURN CASE WHEN t NOT IN (10, 20, 30) THEN 'YES' ELSE 'NO' END;
+END;
+
+query T rowsort
+select nfoo(10);
+----
+NO
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]