Changeset: 0f5126f9edfd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0f5126f9edfd
Modified Files:
        clients/Tests/exports.stable.out
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/vaults/csv/csv.c
        sql/common/sql_string.h
        sql/server/rel_select.c
Branch: default
Log Message:

output error (instead of crash) on misisng file's, incorrect extentions (ie 
misisng file_loaders).
Some initial description.


diffs (118 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1597,6 +1597,7 @@ void res_tables_destroy(res_table *resul
 void *sa_alloc(sql_allocator *sa, size_t sz);
 sql_allocator *sa_create(sql_allocator *pa);
 list *sa_list(sql_allocator *sa);
+char *sa_message(sql_allocator *sa, _In_z_ _Printf_format_string_ const char 
*format, ...) __attribute__((__format__(__printf__, 2, 3)));
 sql_allocator *sa_reset(sql_allocator *sa);
 char *sa_strdup(sql_allocator *sa, const char *s);
 void *sa_zalloc(sql_allocator *sa, size_t sz);
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1293,6 +1293,8 @@ exp2bin_file_loader(backend *be, sql_exp
        else
                return NULL;
        file_loader_t *fl = fl_find(ext);
+       if (!fl)
+               return NULL;
        return (stmt*)fl->load(be, f, filename);
 }
 
diff --git a/sql/backends/monet5/vaults/csv/csv.c 
b/sql/backends/monet5/vaults/csv/csv.c
--- a/sql/backends/monet5/vaults/csv/csv.c
+++ b/sql/backends/monet5/vaults/csv/csv.c
@@ -348,6 +348,15 @@ typedef struct csv_t {
        bool has_header;
 } csv_t;
 
+/*
+ * returns an error string (static or via tmp sa_allocator allocated), NULL on 
success
+ *
+ * Extend the subfunc f with result columns, ie.
+       f->res = typelist;
+       f->coltypes = typelist;
+       f->colnames = nameslist; use tname if passed, for the relation name
+ * Fill the list res_exps, with one result expressions per resulting column.
+ */
 static str
 csv_relation(mvc *sql, sql_subfunc *f, char *filename, list *res_exps, char 
*tname)
 {
@@ -355,7 +364,7 @@ csv_relation(mvc *sql, sql_subfunc *f, c
        char buf[8196+1];
 
        if(file == NULL)
-               throw(SQL, SQLSTATE(42000), "csv" RUNTIME_FILE_NOT_FOUND);
+               return RUNTIME_FILE_NOT_FOUND;
 
        /*
         * detect delimiter ;|,\t  using quote \" or \' or none TODO escape 
\"\'\\ or none
@@ -365,7 +374,7 @@ csv_relation(mvc *sql, sql_subfunc *f, c
        ssize_t l = fread(buf, 1, 8196, file);
        fclose(file);
        if (l<0)
-               throw(SQL, SQLSTATE(42000), "csv" RUNTIME_LOAD_ERROR);
+               return RUNTIME_LOAD_ERROR;
        buf[l] = 0;
        bool has_header = false;
        int nr_fields = 0;
@@ -394,8 +403,9 @@ csv_relation(mvc *sql, sql_subfunc *f, c
                        list_append(typelist, t);
                        list_append(res_exps, exp_column(sql->sa, NULL, name, 
t, CARD_MULTI, 1, 0, 0));
                } else {
+                       /* shouldn't be possible, we fallback to strings */
                        GDKfree(types);
-                       throw(SQL, SQLSTATE(42000), "csv" RUNTIME_LOAD_ERROR); 
// TODO: this should throw a 'unsupported column type' error.
+                       assert(0);
                }
        }
        GDKfree(types);
diff --git a/sql/common/sql_string.h b/sql/common/sql_string.h
--- a/sql/common/sql_string.h
+++ b/sql/common/sql_string.h
@@ -25,7 +25,7 @@ extern char *sql_strdup(char *s);
 extern const char *sql_escape_ident(sql_allocator *sa, const char *s);
 extern char *sql_message(_In_z_ _Printf_format_string_ const char *format, ...)
        __attribute__((__format__(__printf__, 1, 2)));
-extern char *sa_message(sql_allocator *sa, _In_z_ _Printf_format_string_ const 
char *format, ...)
+sql_export char *sa_message(sql_allocator *sa, _In_z_ _Printf_format_string_ 
const char *format, ...)
        __attribute__((__format__(__printf__, 2, 3)));
 
 #endif /*_SQL_STRING_H_*/
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
@@ -533,16 +533,16 @@ file_loader_add_table_column_types(mvc *
                return "Filename missing";
        char *filename = a->data.val.sval;
        char *ext = strrchr(filename, '.');
+
        if (ext)
                ext=ext+1;
 
        file_loader_t *fl = fl_find(ext);
-       /* TODO add errors on missing file loader */
-       if (fl) {
-                str err = fl->add_types(sql, f, filename, res_exps, tname); /* 
TODO check for errors */
-                if (err)
-                       return err;
-       }
+       if (!fl)
+               return sa_message(sql->ta, "extension '%s' mising", ext?ext:"");
+       str err = fl->add_types(sql, f, filename, res_exps, tname);
+       if (err)
+               return err;
        return NULL;
 }
 
@@ -716,6 +716,8 @@ rel_named_table_function(sql_query *quer
 
        if (!sname && strcmp(fname, "file_loader") == 0) {
                rel = rel_file_loader(sql, exps, tl, tname);
+               if (!rel)
+                       return NULL;
        } else if (!(e = find_table_function(sql, sname, fname, 
list_empty(exps) ? NULL : exps, tl, F_UNION)))
                return NULL;
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to