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]

Reply via email to