Changeset: ec031454aebc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ec031454aebc
Modified Files:
        sql/server/rel_select.c
        
sql/test/BugTracker-2010/Tests/TypeException_with_missing_function.Bug-2674.stable.err
        
sql/test/BugTracker-2012/Tests/table_returning_func_returns_too_many_columns.Bug-3077.stable.err
        
sql/test/BugTracker-2013/Tests/psm_functions_and_accessrights.Bug-3300.stable.err
        sql/test/BugTracker-2016/Tests/invalidcolumns.Bug-3968.stable.err
        
sql/test/BugTracker-2017/Tests/udf_crash_subquery_scalar_paramters.Bug-6399.stable.err
        
sql/test/BugTracker-2018/Tests/crash-after-call-non-existing-loader.stable.err
        sql/test/Tests/drop-function-if-exists.stable.err
Branch: Nov2019
Log Message:

Improving error handeling for table returning functions


diffs (232 lines):

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
@@ -686,17 +686,21 @@ rel_named_table_function(sql_query *quer
        tl = sa_list(sql->sa);
        exps = new_exp_list(sql->sa);
        if (l->next) { /* table call with subquery */
-               if (l->next->type == type_symbol && l->next->data.sym->token == 
SQL_SELECT) {
-                       if (l->next->next != NULL)
-                               return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: '%s' requires a single sub query", fname);
-                       if (!(sq = rel_subquery(query, NULL, l->next->data.sym, 
ek)))
+               symtype next_sim = l->next->type;
+               if ((next_sim == type_symbol && l->next->data.sym->token == 
SQL_SELECT) || (next_sim == type_list && l->next->data.lval->h->data.sym->token 
== SQL_SELECT)) {
+                       dnode *nn = next_sim == type_symbol ? l->next->next : 
l->next->data.lval->h->next;
+                       symbol *nsym = next_sim == type_symbol ? 
l->next->data.sym : l->next->data.lval->h->data.sym;
+
+                       if (nn != NULL)
+                               return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: The input for the table returning function '%s' must be either a 
single sub query, or a list of values", fname);
+                       if (!(sq = rel_subquery(query, NULL, nsym, ek)))
                                return NULL;
-               } else if (l->next->type == type_symbol || l->next->type == 
type_list) {
+               } else if (next_sim == type_symbol || next_sim == type_list) {
                        dnode *n;
                        exp_kind iek = {type_value, card_column, TRUE};
-                       list *exps = sa_list (sql->sa);
-
-                       if (l->next->type == type_symbol)
+                       list *exps = sa_list(sql->sa);
+
+                       if (next_sim == type_symbol)
                                n = l->next;
                        else 
                                n = l->next->data.lval->h;
@@ -713,11 +717,8 @@ rel_named_table_function(sql_query *quer
                                set_dependent(sq);
                        }
                }
-               /* reset error */
-               sql->session->status = 0;
-               sql->errstr[0] = '\0';
                if (!sq || (!lateral && outer))
-                       return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no 
such operator '%s'", fname);
+                       return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no 
such table returning function '%s'", fname);
                for (en = sq->exps->h; en; en = en->next) {
                        sql_exp *e = en->data;
 
@@ -728,7 +729,7 @@ rel_named_table_function(sql_query *quer
 
        e = find_table_function(sql, s, fname, exps, tl);
        if (!e)
-               return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no such 
operator '%s'", fname);
+               return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no such 
table returning function '%s'", fname);
        rel = sq;
 
        if (ast->data.lval->h->next->data.sym)
@@ -738,10 +739,8 @@ rel_named_table_function(sql_query *quer
 
        /* column or table function */
        sf = e->f;
-       if (e->type != e_func || sf->func->type != F_UNION) {
-               (void) sql_error(sql, 02, SQLSTATE(42000) "SELECT: '%s' does 
not return a table", exp_func_name(e));
-               return NULL;
-       }
+       if (e->type != e_func || sf->func->type != F_UNION)
+               return sql_error(sql, 02, SQLSTATE(42000) "SELECT: '%s' does 
not return a table", exp_func_name(e));
 
        if (sq) {
                for (node *n = sq->exps->h, *m = sf->func->ops->h ; n && m ; n 
= n->next, m = m->next) {
@@ -6941,12 +6940,16 @@ rel_loader_function(sql_query *query, sy
        tl = sa_list(sql->sa);
        exps = new_exp_list(sql->sa);
        if (l->next) { /* table call with subquery */
-               if (l->next->type == type_symbol && l->next->data.sym->token == 
SQL_SELECT) {
-                       if (l->next->next != NULL)
-                               return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: '%s' requires a single sub query", fname);
-                       if (!(sq = rel_subquery(query, NULL, l->next->data.sym, 
ek)))
+               symtype next_sim = l->next->type;
+               if ((next_sim == type_symbol && l->next->data.sym->token == 
SQL_SELECT) || (next_sim == type_list && l->next->data.lval->h->data.sym->token 
== SQL_SELECT)) {
+                       dnode *nn = next_sim == type_symbol ? l->next->next : 
l->next->data.lval->h->next;
+                       symbol *nsym = next_sim == type_symbol ? 
l->next->data.sym : l->next->data.lval->h->data.sym;
+
+                       if (nn != NULL)
+                               return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: The input for the loader function '%s' must be either a single sub 
query, or a list of values", fname);
+                       if (!(sq = rel_subquery(query, NULL, nsym, ek)))
                                return NULL;
-               } else if (l->next->type == type_symbol || l->next->type == 
type_list) {
+               } else if (next_sim == type_symbol || next_sim == type_list) {
                        dnode *n;
                        exp_kind iek = {type_value, card_column, TRUE};
                        list *exps = sa_list (sql->sa);
@@ -6964,12 +6967,8 @@ rel_loader_function(sql_query *query, sy
                        }
                        sq = rel_project(sql->sa, NULL, exps);
                }
-
-               /* reset error */
-               sql->session->status = 0;
-               sql->errstr[0] = '\0';
                if (!sq)
-                       return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no 
such operator '%s'", fname);
+                       return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no 
such loader function '%s'", fname);
                for (en = sq->exps->h; en; en = en->next) {
                        sql_exp *e = en->data;
 
@@ -6980,7 +6979,7 @@ rel_loader_function(sql_query *query, sy
 
        e = find_table_function_type(sql, s, fname, exps, tl, F_LOADER, &sf);
        if (!e || !sf)
-               return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no such 
operator '%s'", fname);
+               return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no such 
loader function '%s'", fname);
 
        if (sq) {
                for (node *n = sq->exps->h, *m = sf->func->ops->h ; n && m ; n 
= n->next, m = m->next) {
diff --git 
a/sql/test/BugTracker-2010/Tests/TypeException_with_missing_function.Bug-2674.stable.err
 
b/sql/test/BugTracker-2010/Tests/TypeException_with_missing_function.Bug-2674.stable.err
--- 
a/sql/test/BugTracker-2010/Tests/TypeException_with_missing_function.Bug-2674.stable.err
+++ 
b/sql/test/BugTracker-2010/Tests/TypeException_with_missing_function.Bug-2674.stable.err
@@ -74,12 +74,12 @@ stderr of test 'TypeException_with_missi
 MAPI  = (monetdb) /var/tmp/mtest-27483/.s.monetdb.35395
 QUERY = select fDistanceArcMinEq(213.7849600 , -0.4932472, ra,"dec") as 
distance_arcmin
         from t2674, fGetNearbyObjAllEq(213.7849600 , -0.4932472 , 20.8897421 ) 
as N;
-ERROR = !SELECT: no such operator 'fgetnearbyobjalleq'
+ERROR = !SELECT: no such table returning function 'fgetnearbyobjalleq'
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-30274/.s.monetdb.37685
 QUERY = select fDistanceArcMinEq(213.7849600 , -0.4932472, ra,"dec") as 
distance_arcmin
         from t2674, fGetNearbyObjAllEq(213.7849600 , -0.4932472 , 20.8897421 ) 
as N;
-ERROR = !SELECT: no such operator 'fgetnearbyobjalleq'
+ERROR = !SELECT: no such table returning function 'fgetnearbyobjalleq'
 CODE  = 42000
 
 # 11:02:37 >  
diff --git 
a/sql/test/BugTracker-2012/Tests/table_returning_func_returns_too_many_columns.Bug-3077.stable.err
 
b/sql/test/BugTracker-2012/Tests/table_returning_func_returns_too_many_columns.Bug-3077.stable.err
--- 
a/sql/test/BugTracker-2012/Tests/table_returning_func_returns_too_many_columns.Bug-3077.stable.err
+++ 
b/sql/test/BugTracker-2012/Tests/table_returning_func_returns_too_many_columns.Bug-3077.stable.err
@@ -36,7 +36,7 @@ ERROR = !RETURN: number of columns do no
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-30274/.s.monetdb.37685
 QUERY = select * from t();
-ERROR = !SELECT: no such operator 't'
+ERROR = !SELECT: no such table returning function 't'
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-30274/.s.monetdb.37685
 QUERY = drop function t;
diff --git 
a/sql/test/BugTracker-2013/Tests/psm_functions_and_accessrights.Bug-3300.stable.err
 
b/sql/test/BugTracker-2013/Tests/psm_functions_and_accessrights.Bug-3300.stable.err
--- 
a/sql/test/BugTracker-2013/Tests/psm_functions_and_accessrights.Bug-3300.stable.err
+++ 
b/sql/test/BugTracker-2013/Tests/psm_functions_and_accessrights.Bug-3300.stable.err
@@ -40,15 +40,15 @@ stderr of test 'psm_functions_and_access
 
 MAPI  = (psm) /var/tmp/mtest-32127/.s.monetdb.34402
 QUERY = explain select * from storagemodel();
-ERROR = !SELECT: no such operator 'storagemodel'
+ERROR = !SELECT: no such table returning function 'storagemodel'
 CODE  = 42000
 MAPI  = (psm) /var/tmp/mtest-30274/.s.monetdb.37685
 QUERY = select * from storagemodel();
-ERROR = !SELECT: no such operator 'storagemodel'
+ERROR = !SELECT: no such table returning function 'storagemodel'
 CODE  = 42000
 MAPI  = (psm) /var/tmp/mtest-30274/.s.monetdb.37685
 QUERY = select * from storagemodel();
-ERROR = !SELECT: no such operator 'storagemodel'
+ERROR = !SELECT: no such table returning function 'storagemodel'
 CODE  = 42000
 
 # 18:51:04 >  
diff --git a/sql/test/BugTracker-2016/Tests/invalidcolumns.Bug-3968.stable.err 
b/sql/test/BugTracker-2016/Tests/invalidcolumns.Bug-3968.stable.err
--- a/sql/test/BugTracker-2016/Tests/invalidcolumns.Bug-3968.stable.err
+++ b/sql/test/BugTracker-2016/Tests/invalidcolumns.Bug-3968.stable.err
@@ -36,7 +36,7 @@ ERROR = !CREATE FUNC: identifier 'schema
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-30274/.s.monetdb.37685
 QUERY = select * from places3();
-ERROR = !SELECT: no such operator 'places3'
+ERROR = !SELECT: no such table returning function 'places3'
 CODE  = 42000
 
 # 12:37:42 >  
diff --git 
a/sql/test/BugTracker-2017/Tests/udf_crash_subquery_scalar_paramters.Bug-6399.stable.err
 
b/sql/test/BugTracker-2017/Tests/udf_crash_subquery_scalar_paramters.Bug-6399.stable.err
--- 
a/sql/test/BugTracker-2017/Tests/udf_crash_subquery_scalar_paramters.Bug-6399.stable.err
+++ 
b/sql/test/BugTracker-2017/Tests/udf_crash_subquery_scalar_paramters.Bug-6399.stable.err
@@ -33,15 +33,15 @@ stderr of test 'udf_crash_subquery_scala
 
 MAPI  = (monetdb) /var/tmp/mtest-41450/.s.monetdb.30991
 QUERY = select * from crash2((select idx from data), 2);
-ERROR = !SELECT: 'crash2' requires a single sub query
+ERROR = !SELECT: The input for the table returning function 'crash2' must be 
either a single sub query, or a list of values
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-41450/.s.monetdb.30991
 QUERY = select * from crash2(1, (select idx from data));
-ERROR = !SELECT: no such operator 'crash2'
+ERROR = !SELECT: no such table returning function 'crash2'
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-25976/.s.monetdb.36797
 QUERY = select * from crash3((select idx from data), 2, 3);
-ERROR = !SELECT: no such operator 'crash3'
+ERROR = !SELECT: The input for the table returning function 'crash3' must be 
either a single sub query, or a list of values
 CODE  = 42000
 
 # 18:08:38 >  
diff --git 
a/sql/test/BugTracker-2018/Tests/crash-after-call-non-existing-loader.stable.err
 
b/sql/test/BugTracker-2018/Tests/crash-after-call-non-existing-loader.stable.err
--- 
a/sql/test/BugTracker-2018/Tests/crash-after-call-non-existing-loader.stable.err
+++ 
b/sql/test/BugTracker-2018/Tests/crash-after-call-non-existing-loader.stable.err
@@ -32,7 +32,7 @@ stderr of test 'crash-after-call-non-exi
 
 MAPI  = (monetdb) /var/tmp/mtest-13619/.s.monetdb.33078
 QUERY = CREATE TABLE mytable FROM LOADER non_existing_loader();
-ERROR = !SELECT: no such operator 'non_existing_loader'
+ERROR = !SELECT: no such loader function 'non_existing_loader'
 CODE  = 42000
 
 # 16:24:03 >  
diff --git a/sql/test/Tests/drop-function-if-exists.stable.err 
b/sql/test/Tests/drop-function-if-exists.stable.err
--- a/sql/test/Tests/drop-function-if-exists.stable.err
+++ b/sql/test/Tests/drop-function-if-exists.stable.err
@@ -31,7 +31,7 @@ stderr of test 'drop-function-if-exists`
 
 MAPI  = (monetdb) /var/tmp/mtest-7281/.s.monetdb.34272
 QUERY = SELECT * FROM demof1(1); -- should fail
-ERROR = !SELECT: no such operator 'demof1'
+ERROR = !SELECT: no such table returning function 'demof1'
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-7281/.s.monetdb.34272
 QUERY = DROP FUNCTION demof(clob); -- should fail
@@ -39,7 +39,7 @@ ERROR = !DROP FUNCTION: no such function
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-7281/.s.monetdb.34272
 QUERY = SELECT * FROM demof('test'); -- should fail
-ERROR = !SELECT: no such operator 'demof'
+ERROR = !SELECT: no such table returning function 'demof'
 CODE  = 42000
 
 # 17:57:56 >  
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to