Changeset: 2b7c4f2db0a4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2b7c4f2db0a4
Removed Files:
        sql/scripts/11_times.sql
Modified Files:
        monetdb5/mal/mal_module.c
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_gencode.c
        sql/scripts/Makefile.ag
        sql/server/rel_psm.c
        sql/server/rel_schema.c
        sql/server/sql_parser.y
        sql/test/miscellaneous/Tests/select_groupby.sql
        sql/test/miscellaneous/Tests/select_groupby.stable.err
Branch: Apr2019
Log Message:

When creating a SQL function with MAL implementation check if the respective 
MAL implementation does exist.

I had to remove the 11_times.sql script because, as the sys.times procedure 
doesn't exist, new databases can't be created. It's mal implementation is not 
available.


diffs (200 lines):

diff --git a/monetdb5/mal/mal_module.c b/monetdb5/mal/mal_module.c
--- a/monetdb5/mal/mal_module.c
+++ b/monetdb5/mal/mal_module.c
@@ -113,15 +113,12 @@ static void addModuleToIndex(Module cur)
        moduleIndex[index] = cur;
 }
 
-
 Module getModule(str name) {
        int index = getModuleIndex(name);
        Module m = moduleIndex[index];
        while(m) {
-               //if (strcmp(name, m->name) == 0) {
-               if (name == m->name) {
+               if (strcmp(name, m->name) == 0)
                        return m;
-               }
                m = m->link;
        }
        return NULL;
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -765,11 +765,16 @@ create_func(mvc *sql, char *sname, char 
        if (!s)
                s = cur_schema(sql);
        nf = mvc_create_func(sql, NULL, s, f->base.name, f->ops, f->res, 
f->type, f->lang, f->mod, f->imp, f->query, f->varres, f->vararg, f->system);
-       if (nf && nf->query && nf->lang <= FUNC_LANG_SQL) {
+       assert(nf);
+       if (nf->lang == FUNC_LANG_INT || nf->lang == FUNC_LANG_MAL) { /* 
FUNC_LANG_INT shouldn't be reachable, but leave it here */
+               if (!backend_resolve_function(sql, nf))
+                       throw(SQL,"sql.create_func", SQLSTATE(3F000) "CREATE 
%s%s: external name %s.%s not bound", KF, F, nf->mod, nf->base.name);
+       } else if (nf->lang == FUNC_LANG_SQL) {
                char *buf;
                sql_rel *r = NULL;
                sql_allocator *sa = sql->sa;
 
+               assert(nf->query);
                sql->sa = sa_create();
                if(!sql->sa)
                        throw(SQL, "sql.catalog",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
@@ -803,9 +808,6 @@ create_func(mvc *sql, char *sname, char 
                }
                sa_destroy(sql->sa);
                sql->sa = sa;
-       } else if (nf->lang == FUNC_LANG_MAL) {
-               if (!backend_resolve_function(sql, nf))
-                       throw(SQL,"sql.create_func", SQLSTATE(3F000) "CREATE 
%s%s: external name %s.%s not bound", KF, F, nf->mod, nf->base.name);
        }
        return MAL_SUCCEED;
 }
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -860,17 +860,9 @@ backend_call(backend *be, Client c, cq *
 int
 monet5_resolve_function(ptr M, sql_func *f)
 {
-       mvc *sql = (mvc *) M;
-       Client c = MCgetClient(sql->clientid);
-       Module m;
+       (void) M;
 
-       /*
-          fails to search outer modules!
-          if (!findSymbol(c->usermodule, f->mod, f->imp))
-          return 0;
-        */
-
-       for (m = findModule(c->usermodule, f->mod); m; m = m->link) {
+       for (Module m = getModule(f->mod); m; m = m->link) {
                if (strcmp(m->name, f->mod) == 0) {
                        Symbol s = m->space[(int) (getSymbolIndex(f->imp))];
                        for (; s; s = s->peer) {
diff --git a/sql/scripts/11_times.sql b/sql/scripts/11_times.sql
deleted file mode 100644
--- a/sql/scripts/11_times.sql
+++ /dev/null
@@ -1,13 +0,0 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0.  If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
---
--- Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V.
-
--- Provide a simple equivalent for the UNIX times command
--- times 0 ms user 0 ms system 0 ms 0 reads 0 writes
-
-create procedure times()
-external name sql.times;
-
-grant execute on procedure times to public;
diff --git a/sql/scripts/Makefile.ag b/sql/scripts/Makefile.ag
--- a/sql/scripts/Makefile.ag
+++ b/sql/scripts/Makefile.ag
@@ -11,7 +11,6 @@ headers_sql = {
        DIR = libdir/monetdb5/createdb
        SOURCES = 09_like.sql \
                10_math.sql \
-               11_times.sql \
                12_url.sql \
                13_date.sql \
                14_inet.sql \
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
@@ -931,7 +931,7 @@ rel_create_func(mvc *sql, dlist *qname, 
                        if (instantiate || deps) {
                                return rel_psm_block(sql->sa, b);
                        }
-               } else {
+               } else { /* MAL implementation */
                        char *fmod = qname_module(ext_name);
                        char *fnme = qname_fname(ext_name);
 
@@ -950,7 +950,7 @@ rel_create_func(mvc *sql, dlist *qname, 
                                        f->mod = _STRDUP(fmod);
                                if (!f->imp || strcmp(f->imp, fnme)) 
                                        f->imp = (f->sa)?sa_strdup(f->sa, 
fnme):_STRDUP(fnme);
-                               if(!f->mod || !f->imp) {
+                               if (!f->mod || !f->imp) {
                                        _DELETE(f->mod);
                                        _DELETE(f->imp);
                                        return sql_error(sql, 02, 
SQLSTATE(HY001) "CREATE %s%s: could not allocate space", KF, F);
@@ -958,6 +958,11 @@ rel_create_func(mvc *sql, dlist *qname, 
                                f->sql = 0; /* native */
                                f->lang = FUNC_LANG_INT;
                        }
+                       if (!f)
+                               f = sf->func;
+                       assert(f);
+                       if (!backend_resolve_function(sql, f))
+                               return sql_error(sql, 01, SQLSTATE(3F000) 
"CREATE %s%s: external name %s.%s not bound (%s.%s)", KF, F, fmod, fnme, 
s->base.name, fname );
                }
        }
        return rel_create_function(sql->sa, s->base.name, f);
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -922,7 +922,7 @@ table_element(mvc *sql, symbol *s, sql_s
                                }
                        }
                }
-               if(mvc_drop_column(sql, t, col, drop_action)) {
+               if (mvc_drop_column(sql, t, col, drop_action)) {
                        sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: %s\n", 
MAL_MALLOC_FAIL);
                        return SQL_ERR;
                }
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
@@ -2066,13 +2066,11 @@ external_function_name:
        ident '.' ident { $$ = append_string(append_string(L(), $1), $3); }
  ;
 
-
 function_body:
        X_BODY
 |      string
 ;
 
-
 func_def:
     create_or_replace FUNCTION qname
        '(' opt_paramlist ')'
diff --git a/sql/test/miscellaneous/Tests/select_groupby.sql 
b/sql/test/miscellaneous/Tests/select_groupby.sql
--- a/sql/test/miscellaneous/Tests/select_groupby.sql
+++ b/sql/test/miscellaneous/Tests/select_groupby.sql
@@ -1,4 +1,3 @@
-start transaction;
 create schema "myschema";
 create sequence "myschema"."myseq";
 create table myschema.mytable
@@ -108,4 +107,7 @@ WHERE ("first" = ? AND "eleventh" = ? AN
 GROUP BY "first-projection", "twentieth", "twentieth-seventh", 
"twentieth-third", "twentieth-second" LIMIT ?;
 exec ** ('a', 'b', 923, 51, 942, 544);
 
-rollback;
+create function "sys"."dummy"("col1" blob, "col2" blob, "col3" integer) 
returns boolean external name "unknown"."idontexist"; --error, MAL 
implementation of sys.dummy doesn't exist.
+SELECT "sys"."dummy"("fortieth-second", blob '', '0') AS "alias1", 
"fortieth-third" FROM "myschema"."mytable"; --error, function doesn't exist
+
+drop schema "myschema" cascade;
diff --git a/sql/test/miscellaneous/Tests/select_groupby.stable.err 
b/sql/test/miscellaneous/Tests/select_groupby.stable.err
--- a/sql/test/miscellaneous/Tests/select_groupby.stable.err
+++ b/sql/test/miscellaneous/Tests/select_groupby.stable.err
@@ -26,6 +26,14 @@ stderr of test 'select_groupby` in direc
 # 13:54:02 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-18773" "--port=35668"
 # 13:54:02 >  
 
+MAPI  = (monetdb) /var/tmp/mtest-155076/.s.monetdb.39205
+QUERY = create function "sys"."dummy"("col1" blob, "col2" blob, "col3" 
integer) returns boolean external name "unknown"."idontexist"; --error, MAL 
implementation of sys.dummy doesn't exist.
+ERROR = !CREATE FUNCTION: external name unknown.idontexist not bound 
(sys.dummy)
+CODE  = 3F000
+MAPI  = (monetdb) /var/tmp/mtest-155076/.s.monetdb.39205
+QUERY = SELECT "sys"."dummy"("fortieth-second", blob '', '0') AS "alias1", 
"fortieth-third" FROM "myschema"."mytable"; --error, function doesn't exist
+ERROR = !SELECT: no such operator 'dummy'
+CODE  = 42000
 
 # 13:54:02 >  
 # 13:54:02 >  "Done."
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to