Changeset: 278c2a29f98d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=278c2a29f98d
Modified Files:
        sql/server/rel_psm.c
        sql/server/sql_parser.y
        sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err
        
sql/test/BugTracker-2012/Tests/table_function_with_column_subselects.Bug-3172.stable.err
        sql/test/Tests/comment-on.stable.err
Branch: statistics-analytics
Log Message:

Further cleanup, allow dropping user defined window functions


diffs (truncated from 408 to 300 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
@@ -16,6 +16,40 @@
 #include "rel_updates.h"
 #include "sql_privileges.h"
 
+#define FUNC_TYPE_STR \
+       switch (type) { \
+               case F_FUNC: \
+                       F = "FUNCTION"; \
+                       fn = "function"; \
+                       break; \
+               case F_PROC: \
+                       F = "PROCEDURE"; \
+                       fn = "procedure"; \
+                       break; \
+               case F_AGGR: \
+                       F = "AGGREGATE"; \
+                       fn = "aggregate"; \
+                       break; \
+               case F_FILT: \
+                       F = "FILTER FUNCTION"; \
+                       fn = "filter function"; \
+                       break; \
+               case F_UNION: \
+                       F = "UNION FUNCTION"; \
+                       fn = "union function"; \
+                       break; \
+               case F_ANALYTIC: \
+                       F = "WINDOW FUNCTION"; \
+                       fn = "window function"; \
+                       break; \
+               case F_LOADER: \
+                       F = "LOADER FUNCTION"; \
+                       fn = "loader function"; \
+                       break; \
+               default: \
+                       assert(0); \
+       }
+
 static list *sequential_block(sql_query *query, sql_subtype *restype, list 
*restypelist, dlist *blk, char *opt_name, int is_func);
 
 sql_rel *
@@ -789,45 +823,14 @@ rel_create_func(sql_query *query, dlist 
        int deps = (sql->emode == m_deps);
        int create = (!instantiate && !deps);
        bit vararg = FALSE;
-       char *F, *fn, is_func;
+       char *F = NULL, *fn = NULL, is_func;
 
        if (res && res->token == SQL_TABLE)
                type = F_UNION;
 
-       switch (type) {
-               case F_FUNC:
-                       F = "FUNCTION";
-                       fn = "function";
-                       break;
-               case F_PROC:
-                       F = "PROCEDURE";
-                       fn = "procedure";
-                       break;
-               case F_AGGR:
-                       F = "AGGREGATE";
-                       fn = "aggregate";
-                       break;
-               case F_FILT:
-                       F = "FILTER FUNCTION";
-                       fn = "filter function";
-                       break;
-               case F_UNION:
-                       F = "UNION FUNCTION";
-                       fn = "union function";
-                       break;
-               case F_ANALYTIC:
-                       F = "WINDOW FUNCTION";
-                       fn = "window function";
-                       break;
-               case F_LOADER:
-                       F = "LOADER FUNCTION";
-                       fn = "loader function";
-                       break;
-               default:
-                       assert(0);
-       }
+       FUNC_TYPE_STR
 
-       is_func = (type != F_PROC);
+       is_func = (type != F_PROC && type != F_LOADER);
        assert(lang != FUNC_LANG_INT);
 
        if (STORE_READONLY && create)
@@ -987,7 +990,7 @@ rel_create_func(sql_query *query, dlist 
                        if (is_func && restype && !has_return(b))
                                return sql_error(sql, 01, SQLSTATE(42000) 
"CREATE %s: missing return statement", F);
                        if (!is_func && !restype && has_return(b))
-                               return sql_error(sql, 01, SQLSTATE(42000) 
"CREATE %s: procedures cannot have return statements", F);
+                               return sql_error(sql, 01, SQLSTATE(42000) 
"CREATE %s: %ss cannot have return statements", F, fn);
                        /* in execute mode we instantiate the function */
                        if (instantiate || deps)
                                return rel_psm_block(sql->sa, b);
@@ -1056,14 +1059,11 @@ resolve_func( mvc *sql, sql_schema *s, c
 {
        sql_func *func = NULL;
        list *list_func = NULL, *type_list = NULL;
-       char is_aggr = (type == F_AGGR);
-       char is_func = (type != F_PROC && type != F_LOADER);
-       char *F = is_aggr?"AGGREGATE":(is_func?"FUNCTION":"PROCEDURE");
-       char *f = is_aggr?"aggregate":(is_func?"function":"procedure");
-       char *KF = type==F_FILT?"FILTER ": type==F_UNION?"UNION ": "";
-       char *kf = type==F_FILT?"filter ": type==F_UNION?"union ": "";
+       char is_func = (type != F_PROC && type != F_LOADER), *F = NULL, *fn = 
NULL;
 
-       if (typelist) { 
+       FUNC_TYPE_STR
+
+       if (typelist) {
                sql_subfunc *sub_func;
 
                type_list = create_type_list(sql, typelist, 0);
@@ -1080,7 +1080,7 @@ resolve_func( mvc *sql, sql_schema *s, c
                        list_func = schema_bind_func(sql,s,name, F_UNION);
                if (list_func && list_func->cnt > 1) {
                        list_destroy(list_func);
-                       return sql_error(sql, 02, SQLSTATE(42000) "%s %s%s: 
there are more than one %s%s called '%s', please use the full signature", op, 
KF, F, kf, f,name);
+                       return sql_error(sql, 02, SQLSTATE(42000) "%s %s: there 
are more than one %s called '%s', please use the full signature", op, F, fn, 
name);
                }
                if (list_func && list_func->cnt == 1)
                        func = (sql_func*) list_func->h->data;
@@ -1108,26 +1108,24 @@ resolve_func( mvc *sql, sql_schema *s, c
                                list_destroy(list_func);
                                list_destroy(type_list);
                                if(!if_exists)
-                                       e = sql_error(sql, 02, SQLSTATE(42000) 
"%s %s%s: no such %s%s '%s' (%s)", op, KF, F, kf, f, name, arg_list);
+                                       e = sql_error(sql, 02, SQLSTATE(42000) 
"%s %s: no such %s '%s' (%s)", op, F, fn, name, arg_list);
                                _DELETE(arg_list);
                                return e;
                        }
                        list_destroy(list_func);
                        list_destroy(type_list);
                        if(!if_exists)
-                               e = sql_error(sql, 02, SQLSTATE(42000) "%s 
%s%s: no such %s%s '%s' ()", op, KF, F, kf, f, name);
+                               e = sql_error(sql, 02, SQLSTATE(42000) "%s %s: 
no such %s '%s' ()", op, F, fn, name);
                        return e;
-
                } else {
                        if(!if_exists)
-                               e = sql_error(sql, 02, SQLSTATE(42000) "%s 
%s%s: no such %s%s '%s'", op, KF, F, kf, f, name);
+                               e = sql_error(sql, 02, SQLSTATE(42000) "%s %s: 
no such %s '%s'", op, F, fn, name);
                        return e;
                }
-       } else if (((is_func && type != F_FILT) && !func->res) || 
-                  (!is_func && func->res)) {
+       } else if (((is_func && type != F_FILT) && !func->res) || (!is_func && 
func->res)) {
                list_destroy(list_func);
                list_destroy(type_list);
-               return sql_error(sql, 02, SQLSTATE(42000) "%s %s%s: cannot drop 
%s '%s'", KF, F, is_func?"procedure":"function", op, name);
+               return sql_error(sql, 02, SQLSTATE(42000) "%s %s: cannot drop 
%s '%s'", op, F, fn, name);
        }
 
        list_destroy(list_func);
@@ -1142,14 +1140,13 @@ rel_drop_func(mvc *sql, dlist *qname, dl
        const char *sname = qname_schema(qname);
        sql_schema *s = NULL;
        sql_func *func = NULL;
+       char *F = NULL, *fn = NULL;
 
-       char is_aggr = (type == F_AGGR);
-       char is_func = (type != F_PROC);
-       char *F = is_aggr?"AGGREGATE":(is_func?"FUNCTION":"PROCEDURE");
-       char *KF = type==F_FILT?"FILTER ": type==F_UNION?"UNION ": "";
+       FUNC_TYPE_STR
+       (void) fn;
 
        if (sname && !(s = mvc_bind_schema(sql, sname)))
-               return sql_error(sql, 02, SQLSTATE(3F000) "DROP %s%s: no such 
schema '%s'", KF, F, sname);
+               return sql_error(sql, 02, SQLSTATE(3F000) "DROP %s: no such 
schema '%s'", F, sname);
 
        if (s == NULL) 
                s =  cur_schema(sql);
@@ -1161,7 +1158,7 @@ rel_drop_func(mvc *sql, dlist *qname, dl
        }
        if (func)
                return rel_drop_function(sql->sa, s->base.name, name, 
func->base.id, type, drop_action);
-       else if(if_exists && !sql->session->status)
+       else if (if_exists && !sql->session->status)
                return rel_drop_function(sql->sa, s->base.name, name, -2, type, 
drop_action);
        return NULL;
 }
@@ -1172,24 +1169,20 @@ rel_drop_all_func(mvc *sql, dlist *qname
        const char *name = qname_table(qname);
        const char *sname = qname_schema(qname);
        sql_schema *s = NULL;
-       list * list_func = NULL; 
+       list * list_func = NULL;
+       char *F = NULL, *fn = NULL;
 
-       char is_aggr = (type == F_AGGR);
-       char is_func = (type != F_PROC);
-       char *F = is_aggr?"AGGREGATE":(is_func?"FUNCTION":"PROCEDURE");
-       char *f = is_aggr?"aggregate":(is_func?"function":"procedure");
-       char *KF = type==F_FILT?"FILTER ": type==F_UNION?"UNION ": "";
-       char *kf = type==F_FILT?"filter ": type==F_UNION?"union ": "";
+       FUNC_TYPE_STR
 
        if (sname && !(s = mvc_bind_schema(sql, sname)))
-               return sql_error(sql, 02, SQLSTATE(3F000) "DROP %s%s: no such 
schema '%s'", KF, F, sname);
+               return sql_error(sql, 02, SQLSTATE(3F000) "DROP %s: no such 
schema '%s'", F, sname);
 
        if (s == NULL) 
                s =  cur_schema(sql);
        
        list_func = schema_bind_func(sql, s, name, type);
        if (!list_func) 
-               return sql_error(sql, 02, SQLSTATE(3F000) "DROP ALL %s%s: no 
such %s%s '%s'", KF, F, kf, f, name);
+               return sql_error(sql, 02, SQLSTATE(3F000) "DROP ALL %s: no such 
%s '%s'", F, fn, name);
        list_destroy(list_func);
        return rel_drop_function(sql->sa, s->base.name, name, -1, type, 
drop_action);
 }
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -519,7 +519,6 @@ int yydebug=1;
        window_frame_extent
        window_frame_between
        routine_designator
-       drop_routine_designator
        partition_list
        merge_when_list
        group_by_list
@@ -2588,73 +2587,11 @@ triggered_statement:
  ;
 
 routine_designator:
-       FUNCTION qname opt_typelist
-       { dlist *l = L();
-         append_list(l, $2 );  
-         append_list(l, $3 );
-         append_int(l, F_FUNC );
-         $$ = l; }
- |     FILTER FUNCTION qname opt_typelist
-       { dlist *l = L();
-         append_list(l, $3 );  
-         append_list(l, $4 );
-         append_int(l, F_FILT );
-         $$ = l; }
- |     AGGREGATE qname opt_typelist
-       { dlist *l = L();
-         append_list(l, $2 );  
-         append_list(l, $3 );
-         append_int(l, F_AGGR );
-         $$ = l; }
- |     PROCEDURE qname opt_typelist
-       { dlist *l = L();
-         append_list(l, $2 );  
-         append_list(l, $3 );
-         append_int(l, F_PROC );
-         $$ = l; }
- |     sqlLOADER qname opt_typelist
+       func_def_type qname opt_typelist
        { dlist *l = L();
          append_list(l, $2 );  
          append_list(l, $3 );
-         append_int(l, F_LOADER );
-         $$ = l; }
- ;
-
-drop_routine_designator:
-       FUNCTION if_exists qname opt_typelist
-       { dlist *l = L();
-         append_list(l, $3 );
-         append_list(l, $4 );
-         append_int(l, F_FUNC );
-         append_int(l, $2 );
-         $$ = l; }
- |     FILTER FUNCTION if_exists qname opt_typelist
-       { dlist *l = L();
-         append_list(l, $4 );
-         append_list(l, $5 );
-         append_int(l, F_FILT );
-         append_int(l, $3 );
-         $$ = l; }
- |     AGGREGATE if_exists qname opt_typelist
-       { dlist *l = L();
-         append_list(l, $3 );
-         append_list(l, $4 );
-         append_int(l, F_AGGR );
-         append_int(l, $2 );
-         $$ = l; }
- |     PROCEDURE if_exists qname opt_typelist
-       { dlist *l = L();
-         append_list(l, $3 );
-         append_list(l, $4 );
-         append_int(l, F_PROC );
-         append_int(l, $2 );
-         $$ = l; }
- |     sqlLOADER if_exists qname opt_typelist
-       { dlist *l = L();
-         append_list(l, $3 );
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to