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