Changeset: 6d89d06e10d4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6d89d06e10d4
Modified Files:
sql/server/rel_psm.c
sql/test/BugTracker/Tests/coalesce_equal_coalesce.SF-1907905.stable.err
sql/test/subquery/Tests/subquery5.sql
sql/test/subquery/Tests/subquery5.stable.err
Branch: Jun2020
Log Message:
Small bugfixes.
- Disallow TABLE return on non union functions.
- Check number of columns match on returns from union functions.
diffs (96 lines):
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -431,6 +431,8 @@ rel_psm_return( sql_query *query, sql_su
if (restypelist)
ek.card = card_relation;
+ else if (return_sym->token == SQL_TABLE)
+ return sql_error(sql, 02, SQLSTATE(42000) "RETURN: TABLE return
not allowed for non table returning functions");
res = rel_value_exp2(query, &rel, return_sym, sql_sel, ek);
if (!res)
return NULL;
@@ -451,6 +453,8 @@ rel_psm_return( sql_query *query, sql_su
oexps_rel = l;
oexps = l->exps;
}
+ if (list_length(oexps) != list_length(restypelist))
+ return sql_error(sql, 02, SQLSTATE(42000) "RETURN:
number of columns do not match");
for (n = oexps->h, m = restypelist->h; n && m; n = n->next, m =
m->next) {
sql_exp *e = n->data;
sql_arg *ce = m->data;
@@ -467,11 +471,11 @@ rel_psm_return( sql_query *query, sql_su
append(exps, e);
}
if (isproject)
- rel -> exps = exps;
+ rel->exps = exps;
else
rel = rel_project(sql->sa, rel, exps);
res = exp_rel(sql, rel);
- } else if (rel && restypelist){ /* handle return table-var */
+ } else if (rel && restypelist) { /* handle return table-var */
list *exps = sa_list(sql->sa);
sql_table *t = rel_ddl_table_get(rel);
node *n, *m;
diff --git
a/sql/test/BugTracker/Tests/coalesce_equal_coalesce.SF-1907905.stable.err
b/sql/test/BugTracker/Tests/coalesce_equal_coalesce.SF-1907905.stable.err
--- a/sql/test/BugTracker/Tests/coalesce_equal_coalesce.SF-1907905.stable.err
+++ b/sql/test/BugTracker/Tests/coalesce_equal_coalesce.SF-1907905.stable.err
@@ -24,7 +24,7 @@ QUERY = CREATE FUNCTION fDocColumnsWithR
coalesce(d."AUTO_INCREMENT",0) =
coalesce(ColumnProperty (c.id,
c.nme,'IsIdentity'),0) );
END;
-ERROR = !SELECT: no such operator 'columnproperty'
+ERROR = !RETURN: TABLE return not allowed for non table returning functions
CODE = 42000
MAPI = (monetdb) /var/tmp/mtest-30274/.s.monetdb.37685
QUERY = drop function fDocColumnsWithRank;
diff --git a/sql/test/subquery/Tests/subquery5.sql
b/sql/test/subquery/Tests/subquery5.sql
--- a/sql/test/subquery/Tests/subquery5.sql
+++ b/sql/test/subquery/Tests/subquery5.sql
@@ -32,7 +32,13 @@ FROM another_T;
-- 1234 40
-- 1234 40
-CREATE FUNCTION evilfunction(input INT) RETURNS INT
+CREATE OR REPLACE FUNCTION evilfunction(input INT) RETURNS TABLE (outt INT)
BEGIN RETURN SELECT 1,2; END; --error, number of projections don't match
+
+CREATE OR REPLACE FUNCTION evilfunction(input INT) RETURNS INT BEGIN RETURN
TABLE(SELECT input, 2); END; --error, TABLE return not allowed for non table
returning functions
+
+CREATE OR REPLACE FUNCTION evilfunction(input INT) RETURNS INT BEGIN RETURN
SELECT input, 2; END; --error, more than 1 return
+
+CREATE OR REPLACE FUNCTION evilfunction(input INT) RETURNS INT
BEGIN
RETURN SELECT input WHERE FALSE;
END;
@@ -56,7 +62,7 @@ SELECT evilfunction(1);
SELECT evilfunction(1), 1;
--error, more than one row returned by a subquery used as an expression
-DROP FUNCTION evilfunction(input INT)
+DROP FUNCTION evilfunction(INT);
DROP TABLE tbl_ProductSales;
DROP TABLE another_T;
DROP TABLE integers;
diff --git a/sql/test/subquery/Tests/subquery5.stable.err
b/sql/test/subquery/Tests/subquery5.stable.err
--- a/sql/test/subquery/Tests/subquery5.stable.err
+++ b/sql/test/subquery/Tests/subquery5.stable.err
@@ -18,6 +18,18 @@ QUERY = SELECT
FROM another_T GROUP BY col2; --error, aggregate function calls cannot
be nested
ERROR = !SELECT: aggregate function calls cannot be nested
CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-371889/.s.monetdb.35765
+QUERY = CREATE OR REPLACE FUNCTION evilfunction(input INT) RETURNS TABLE (outt
INT) BEGIN RETURN SELECT 1,2; END; --error, number of projections don't match
+ERROR = !RETURN: number of columns do not match
+CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-371889/.s.monetdb.35765
+QUERY = CREATE OR REPLACE FUNCTION evilfunction(input INT) RETURNS INT BEGIN
RETURN TABLE(SELECT input, 2); END; --error, TABLE return not allowed for non
table returning functions
+ERROR = !RETURN: TABLE return not allowed for non table returning functions
+CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-371889/.s.monetdb.35765
+QUERY = CREATE OR REPLACE FUNCTION evilfunction(input INT) RETURNS INT BEGIN
RETURN SELECT input, 2; END; --error, more than 1 return
+ERROR = !SELECT: subquery must return only one column
+CODE = 42000
# 08:41:39 >
# 08:41:39 > "Done."
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list