Changeset: f3ca6fa4f188 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f3ca6fa4f188
Added Files:
sql/test/file_loader/Tests/All
sql/test/file_loader/Tests/file_loader_function.test
Modified Files:
sql/common/sql_types.c
sql/server/rel_file_loader.c
sql/server/rel_select.c
Branch: default
Log Message:
Added missing module name "files" to new system function: file_loader(str
filename).
For all sys.functions the mod column should have a none empty value. It didn't
for file_loader()
Add tests for calling new system function: file_loader(str filename) which
returns a table.
The test crashes the server (sql/server/rel_exp.c:697: exp_column: Assertion
`cname' failed.)
Added extra check on empty file name in file_loader_add_table_column_types().
This is apparently not enough to solve the server crash.
More fixes are needed, e.g. in rel_named_table_function().
diffs (143 lines):
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1540,7 +1540,7 @@ sqltypeinit( sql_allocator *sa)
f->varres = 1;
/* file_loader */
- f = sql_create_union(sa, "file_loader", "", "", FALSE, SCALE_FIX, 0,
TABLE, 1, STR);
+ f = sql_create_union(sa, "file_loader", "files", "", FALSE, SCALE_FIX,
0, TABLE, 1, STR);
f->varres = 1;
/* sys_update_schemas, sys_update_tables */
diff --git a/sql/server/rel_file_loader.c b/sql/server/rel_file_loader.c
--- a/sql/server/rel_file_loader.c
+++ b/sql/server/rel_file_loader.c
@@ -1,3 +1,12 @@
+/*
+ * SPDX-License-Identifier: MPL-2.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 - 2023 MonetDB B.V.
+ */
#include "monetdb_config.h"
#include "rel_file_loader.h"
@@ -8,7 +17,7 @@ static file_loader_t file_loaders[NR_FIL
void
fl_exit(void)
{
- for (int i = 0; i<NR_FILE_LOADERS; i++) {
+ for (int i = 0; i < NR_FILE_LOADERS; i++) {
if (file_loaders[i].name)
GDKfree(file_loaders[i].name);
}
@@ -18,10 +27,9 @@ void
fl_unregister(char *name)
{
file_loader_t *fl = fl_find(name);
-
if (fl) {
- GDKfree(fl->name);
- fl->name = NULL;
+ GDKfree(fl->name);
+ fl->name = NULL;
}
}
@@ -29,13 +37,13 @@ int
fl_register(char *name, fl_add_types_fptr add_types, fl_load_fptr load)
{
file_loader_t *fl = fl_find(name);
-
if (fl) {
printf("re-registering %s\n", name);
GDKfree(fl->name);
fl->name = NULL;
}
- for (int i = 0; i<NR_FILE_LOADERS; i++) {
+
+ for (int i = 0; i < NR_FILE_LOADERS; i++) {
if (file_loaders[i].name == NULL) {
file_loaders[i].name = GDKstrdup(name);
file_loaders[i].add_types = add_types;
@@ -43,7 +51,9 @@ fl_register(char *name, fl_add_types_fpt
return 0;
}
}
- return -1;
+
+ /* all file_loaders array locations are occupied */
+ return -1; /* could not register file_loader */
}
file_loader_t*
@@ -51,7 +61,7 @@ fl_find(char *name)
{
if (!name)
return NULL;
- for (int i = 0; i<NR_FILE_LOADERS; i++) {
+ for (int i = 0; i < NR_FILE_LOADERS; i++) {
if (file_loaders[i].name && strcmp(file_loaders[i].name, name)
== 0)
return file_loaders+i;
}
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
@@ -529,12 +529,16 @@ file_loader_add_table_column_types(mvc *
sql_exp *file = exps->h->data;
if (!exp_is_atom(file))
return "Filename missing";
+
atom *a = file->l;
if (a->data.vtype != TYPE_str || !a->data.val.sval)
return "Filename missing";
+
char *filename = a->data.val.sval;
+ if (strcmp(filename, "") == 0)
+ return "Filename missing";
+
char *ext = strrchr(filename, '.'), *ep = ext;
-
if (ext) {
ext=ext+1;
ext = mkLower(sa_strdup(sql->sa, ext));
@@ -563,7 +567,7 @@ file_loader_add_table_column_types(mvc *
sql_subtype *st = sql_bind_localtype("str");
sql_exp *ext_exp = exp_atom(sql->sa, atom_string(sql->sa, st, ext));
if (!ext_exp)
- return sql_error(sql, 02, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
append(exps, ext_exp);
return NULL;
}
diff --git a/sql/test/file_loader/Tests/All b/sql/test/file_loader/Tests/All
new file mode 100644
--- /dev/null
+++ b/sql/test/file_loader/Tests/All
@@ -0,0 +1,1 @@
+file_loader_function
diff --git a/sql/test/file_loader/Tests/file_loader_function.test
b/sql/test/file_loader/Tests/file_loader_function.test
new file mode 100644
--- /dev/null
+++ b/sql/test/file_loader/Tests/file_loader_function.test
@@ -0,0 +1,16 @@
+query TT rowsort
+select name, mod from sys.functions where mod is null or mod = '';
+----
+
+statement error 42000!Table expression without table name
+select * from file_loader('');
+
+statement error 42000!Table expression without table name
+select * from file_loader('filenotfound');
+
+statement error server crash
+select * from sys.file_loader('');
+
+statement error server crash
+select * from sys.file_loader('filenotfound');
+
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]