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

Reply via email to