Changeset: b2a0e04a707f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b2a0e04a707f
Modified Files:
sql/backends/monet5/vaults/parquet/parquet.c
sql/server/rel_dump.c
sql/server/rel_file_loader.h
sql/server/rel_select.c
sql/server/rel_select.h
Branch: parquet
Log Message:
small steps
op_table needs
a table functions expression (->r)
and a output expression list in ->exps
These are now handled both by fl_add_types (needs cleanup)
(refactor of table returning functions needed as well)
diffs (274 lines):
diff --git a/sql/backends/monet5/vaults/parquet/parquet.c
b/sql/backends/monet5/vaults/parquet/parquet.c
--- a/sql/backends/monet5/vaults/parquet/parquet.c
+++ b/sql/backends/monet5/vaults/parquet/parquet.c
@@ -5,6 +5,7 @@
#include "monetdb_config.h"
#include "rel_file_loader.h"
+#include "rel_exp.h"
#include "parquet.h"
#include "mal_instruction.h"
@@ -75,7 +76,7 @@ static char* parquet_type_map(GArrowType
return "DOUBLE";
case GARROW_TYPE_STRING:
- return "STRING";
+ return "varchar";
case GARROW_TYPE_BINARY:
case GARROW_TYPE_FIXED_SIZE_BINARY:
@@ -126,51 +127,56 @@ static char* parquet_type_map(GArrowType
}
static str
-parquet_add_types(mvc *sql, sql_subfunc *f, char *filename)
+parquet_add_types(mvc *sql, sql_subfunc *f, char *filename, list *res_exps,
char *tname)
{
- parquet_file *file = parquet_open_file(filename);
+ parquet_file *file = parquet_open_file(filename);
if(file->reader == NULL) {
- throw(SQL, SQLSTATE(42000), "parquet" RUNTIME_FILE_NOT_FOUND);
+ throw(SQL, SQLSTATE(42000), "parquet" RUNTIME_FILE_NOT_FOUND);
+ }
+
+ GError *table_error = NULL;
+ GArrowTable *table =
gparquet_arrow_file_reader_read_table(file->reader, &table_error);
+
+ if(table_error) {
+ throw(SQL, SQLSTATE(42000), "parquet" RUNTIME_LOAD_ERROR); //
TODO: different error.
}
- GError *table_error = NULL;
- GArrowTable *table = gparquet_arrow_file_reader_read_table(file->reader,
&table_error);
+ guint n_columns = garrow_table_get_n_columns(table);
- if(table_error) {
- throw(SQL, SQLSTATE(42000), "parquet" RUNTIME_LOAD_ERROR); // TODO:
different error.
- }
+ list *types = sa_list(sql->sa);
+ list *col_names = sa_list(sql->sa);
+
+ if (!tname)
+ tname = "parquet";
- guint n_columns = garrow_table_get_n_columns(table);
-
- list *types = sa_list(sql->sa);
- list *col_names = sa_list(sql->sa);
+ for(int col = 0; col < (int)n_columns; col++) {
+ GArrowChunkedArray *array = garrow_table_get_column_data(table,
col);
+ GArrowType type = garrow_chunked_array_get_value_type(array);
+ char *name = "column name";
+ char* st = parquet_type_map(type);
- for(int col = 0; col < (int)n_columns; col++) {
- GArrowChunkedArray *array = garrow_table_get_column_data(table, col);
- GArrowType type = garrow_chunked_array_get_value_type(array);
- char* st = parquet_type_map(type);
+ printf("%s\n", st);
- printf("%s\n", st);
-
- if(st) {
- sql_subtype *t = sql_bind_subtype(sql->sa, st, 8, 0);
+ if(st) {
+ sql_subtype *t = sql_bind_subtype(sql->sa, st, 0, 0);
- sa_list_append(sql->sa, types, t);
- }
- else {
- throw(SQL, SQLSTATE(42000), "parquet" RUNTIME_LOAD_ERROR); // TODO:
this should throw a 'unsupported column type' error.
- }
- }
+ list_append(types, t);
+ list_append(res_exps, exp_column(sql->sa, tname, name,
t, CARD_MULTI, 1, 0, 0));
+ }
+ else {
+ throw(SQL, SQLSTATE(42000), "parquet"
RUNTIME_LOAD_ERROR); // TODO: this should throw a 'unsupported column type'
error.
+ }
+ }
- (void)table;
+ (void)table;
/* cleanup tbl */
- f->res = types;
- f->colnames = col_names;
+ f->res = types;
+ f->colnames = col_names;
/* close file */
GDKfree(file);
- return "";
+ return MAL_SUCCEED;
}
static int
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -1930,7 +1930,7 @@ rel_read(mvc *sql, char *r, int *pos, li
if (!mvc_bind_schema(sql, sname))
return sql_error(sql, ERR_NOTFOUND,
SQLSTATE(3F000) "No such schema '%s'\n", sname);
- if (!(tudf = find_table_function(sql, sname,
tname, list_empty(inputs) ? NULL : inputs, list_empty(inputs) ? NULL :
exp_types(sql->sa, inputs), F_UNION)))
+ if (!(tudf = find_table_function(sql, sname,
tname, list_empty(inputs) ? NULL : inputs, list_empty(inputs) ? NULL :
exp_types(sql->sa, inputs), F_UNION, NULL, NULL)))
return NULL;
sf = tudf->f;
if (tudf->type != e_func || sf->func->type !=
F_UNION)
diff --git a/sql/server/rel_file_loader.h b/sql/server/rel_file_loader.h
--- a/sql/server/rel_file_loader.h
+++ b/sql/server/rel_file_loader.h
@@ -13,7 +13,7 @@
#include "sql_mvc.h"
/* TODO think of set of file names */
-typedef str (*fl_add_types_fptr)(mvc *sql, sql_subfunc *f, char *filename);
+typedef str (*fl_add_types_fptr)(mvc *sql, sql_subfunc *f, char *filename,
list *res_exps, char *name);
typedef int (*fl_load_fptr)(mvc *sql, sql_subfunc *f, char *filename);
typedef struct file_loader_t {
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
@@ -532,7 +532,7 @@ nary_function_arg_types_2str(mvc *sql, l
*/
static char *
-file_loader_add_table_column_types(mvc *sql, sql_subfunc *f, sql_exp *e)
+file_loader_add_table_column_types(mvc *sql, sql_subfunc *f, sql_exp *e, list
*res_exps, char *tname)
{
if (!exp_is_atom(e))
return "Filename missing";
@@ -548,7 +548,7 @@ file_loader_add_table_column_types(mvc *
file_loader_t *fl = fl_find(ext);
/* TODO add errors on missing file loader */
if (fl) {
- str err = fl->add_types(sql, f, filename); /* TODO check for
errors */
+ str err = fl->add_types(sql, f, filename, res_exps, tname); /*
TODO check for errors */
if (err)
return err;
}
@@ -556,7 +556,7 @@ file_loader_add_table_column_types(mvc *
}
sql_exp *
-find_table_function(mvc *sql, char *sname, char *fname, list *exps, list *tl,
sql_ftype type)
+find_table_function(mvc *sql, char *sname, char *fname, list *exps, list *tl,
sql_ftype type, sql_rel **rel, char *tname)
{
bool found = false;
list *ff = NULL;
@@ -567,13 +567,17 @@ find_table_function(mvc *sql, char *snam
if ((f = bind_func_(sql, sname, fname, tl, type, false, &found))) {
list *nexps = exps;
if (list_empty(tl) || f->func->vararg || (nexps =
check_arguments_and_find_largest_any_type(sql, NULL, exps, f, 1))) {
+ list *res_exps = sa_list(sql->sa);
if (list_length(exps) == 1 && f && f->func->varres &&
strlen(f->func->mod) == 0 && strlen(f->func->imp) == 0 && strcmp(fname,
"file_loader") == 0) {
sql_exp *file = exps->h->data;
- char *err =
file_loader_add_table_column_types(sql, f, file);
+ char *err =
file_loader_add_table_column_types(sql, f, file, res_exps, tname);
if (err)
return sql_error(sql, ERR_NOTFOUND,
SQLSTATE(42000) "SELECT: file_loader function type resolutions failed '%s'",
err);
}
- return exp_op(sql->sa, nexps, f);
+ sql_exp *e = exp_op(sql->sa, nexps, f);
+ *rel = rel_table_func(sql->sa, NULL, e, res_exps,
TABLE_PROD_FUNC);
+ *rel = rel_project(sql->sa, *rel, res_exps);
+ return e;
}
found = false;
}
@@ -698,39 +702,43 @@ rel_named_table_function(sql_query *quer
}
}
- if (!(e = find_table_function(sql, sname, fname, list_empty(exps) ?
NULL : exps, tl, F_UNION)))
- return NULL;
- rel = sq;
-
+ rel = NULL;
if (ast->data.lval->t->type == type_symbol &&
ast->data.lval->t->data.sym)
tname = ast->data.lval->t->data.sym->data.lval->h->data.sval;
else
tname = make_label(sql->sa, ++sql->label);
- /* column or table function */
- sf = e->f;
- if (e->type != e_func || sf->func->type != F_UNION)
- return sql_error(sql, 02, SQLSTATE(42000) "SELECT: '%s' does
not return a table", exp_func_name(e));
-
- if (sq) {
- for (node *n = sq->exps->h, *m = sf->func->ops->h ; n && m ; n
= n->next, m = m->next) {
- sql_exp *e = (sql_exp*) n->data;
- sql_arg *a = (sql_arg*) m->data;
- if (!exp_subtype(e) && rel_set_type_param(sql,
&(a->type), sq, e, 0) < 0)
- return NULL;
- }
- }
-
- /* for each column add table.column name */
- exps = new_exp_list(sql->sa);
- for (m = sf->func->res->h; m; m = m->next) {
- sql_arg *a = m->data;
- sql_exp *e = exp_column(sql->sa, tname, a->name, &a->type,
CARD_MULTI, 1, 0, 0);
-
- set_basecol(e);
- append(exps, e);
- }
- rel = rel_table_func(sql->sa, rel, e, exps,
(sq)?TABLE_FROM_RELATION:TABLE_PROD_FUNC);
+ if (!(e = find_table_function(sql, sname, fname, list_empty(exps) ?
NULL : exps, tl, F_UNION, &rel, tname)))
+ return NULL;
+
+ if (!rel) {
+ rel = sq;
+
+ /* column or table function */
+ sf = e->f;
+ if (e->type != e_func || sf->func->type != F_UNION)
+ return sql_error(sql, 02, SQLSTATE(42000) "SELECT: '%s'
does not return a table", exp_func_name(e));
+
+ if (sq) {
+ for (node *n = sq->exps->h, *m = sf->func->ops->h ; n
&& m ; n = n->next, m = m->next) {
+ sql_exp *e = (sql_exp*) n->data;
+ sql_arg *a = (sql_arg*) m->data;
+ if (!exp_subtype(e) && rel_set_type_param(sql,
&(a->type), sq, e, 0) < 0)
+ return NULL;
+ }
+ }
+
+ /* for each column add table.column name */
+ exps = new_exp_list(sql->sa);
+ for (m = sf->func->res->h; m; m = m->next) {
+ sql_arg *a = m->data;
+ sql_exp *e = exp_column(sql->sa, tname, a->name,
&a->type, CARD_MULTI, 1, 0, 0);
+
+ set_basecol(e);
+ append(exps, e);
+ }
+ rel = rel_table_func(sql->sa, rel, e, exps,
(sq)?TABLE_FROM_RELATION:TABLE_PROD_FUNC);
+ }
if (ast->data.lval->t->type == type_symbol &&
ast->data.lval->t->data.sym &&
ast->data.lval->t->data.sym->data.lval->h->next->data.lval) {
rel = rel_table_optname(sql, rel, ast->data.lval->t->data.sym,
refs);
} else if (refs) { /* if this relation is under a FROM clause, check
for duplicate names */
@@ -6322,7 +6330,7 @@ rel_loader_function(sql_query *query, sy
}
sql_exp *e = NULL;
- if (!(e = find_table_function(sql, sname, fname, exps, tl, F_LOADER)))
+ if (!(e = find_table_function(sql, sname, fname, exps, tl, F_LOADER,
NULL, NULL)))
return NULL;
sql_subfunc *sf = e->f;
if (sq) {
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -30,7 +30,7 @@ extern sql_exp *rel_binop_(mvc *sql, sql
extern sql_exp *rel_nop_(mvc *sql, sql_rel *rel, sql_exp *l, sql_exp *r,
sql_exp *r2, sql_exp *r3, char *sname, char *fname, int card);
extern sql_rel *rel_with_query(sql_query *query, symbol *q);
extern sql_rel *table_ref(sql_query *query, symbol *tableref, int lateral,
list *refs);
-extern sql_exp *find_table_function(mvc *sql, char *sname, char *fname, list
*exps, list *tl, sql_ftype type);
+extern sql_exp *find_table_function(mvc *sql, char *sname, char *fname, list
*exps, list *tl, sql_ftype type, sql_rel **rel, char *tname);
extern sql_rel *rel_loader_function(sql_query* query, symbol* s, list *fexps,
sql_subfunc **loader_function);
extern list *check_arguments_and_find_largest_any_type(mvc *sql, sql_rel *rel,
list *exps, sql_subfunc *sf, int maybe_zero_or_one);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]