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]