Changeset: c1243b2c1bbc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c1243b2c1bbc
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/vaults/csv/csv.c
sql/server/rel_file_loader.h
sql/server/rel_optimize_others.c
Branch: default
Log Message:
push limit down file_loader
diffs (85 lines):
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
@@ -1335,7 +1335,10 @@ exp2bin_file_loader(backend *be, sql_exp
atom *fa = fexp->l;
assert(fa->data.vtype == TYPE_str);
char *filename = fa->data.val.sval;
- return (stmt*)fl->load(be, f, filename);
+ sql_exp *topn = NULL;
+ if (list_length(arg_list) == 3)
+ topn = list_fetch(arg_list, 2);
+ return (stmt*)fl->load(be, f, filename, topn);
}
stmt *
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
@@ -423,7 +423,7 @@ csv_relation(mvc *sql, sql_subfunc *f, c
}
static void *
-csv_load(void *BE, sql_subfunc *f, char *filename)
+csv_load(void *BE, sql_subfunc *f, char *filename, sql_exp *topn)
{
backend *be = (backend*)BE;
mvc *sql = be->mvc;
@@ -474,7 +474,7 @@ csv_load(void *BE, sql_subfunc *f, char
append(
append(
append(
- append(args,
+ append(args, topn?topn:
exp_atom_lng(sql->sa, -1)),
exp_atom_lng(sql->sa,
r->has_header?2:1)),
exp_atom_int(sql->sa, 0)),
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"
typedef str (*fl_add_types_fptr)(mvc *sql, sql_subfunc *f, char *filename,
list *res_exps, char *name);
-typedef void *(*fl_load_fptr)(void *be, sql_subfunc *f, char *filename); /*
use void * as both return type and be
+typedef void *(*fl_load_fptr)(void *be, sql_subfunc *f, char *filename,
sql_exp *topn); /* use void * as both return type and be
argument are unknown types at this layer */
typedef struct file_loader_t {
diff --git a/sql/server/rel_optimize_others.c b/sql/server/rel_optimize_others.c
--- a/sql/server/rel_optimize_others.c
+++ b/sql/server/rel_optimize_others.c
@@ -1087,6 +1087,33 @@ rel_push_topn_and_sample_down_(visitor *
{
sql_rel *rp = NULL, *r = rel->l, *rpp = NULL;
+ if (is_topn(rel->op) && !rel_is_ref(rel) &&
+ r && r->op == op_table && r->flag != TRIGGER_WRAPPER &&
!rel_is_ref(r) && r->r) {
+ sql_exp *op = r->r;
+ sql_subfunc *f = op->f;
+
+ if (is_func(op->type) && strcmp(f->func->base.name,
"file_loader") == 0 && !sql_func_mod(f->func)[0] && !sql_func_imp(f->func)[0]) {
+ /* push limit, to arguments of file_loader */
+ list *args = op->l;
+ if (list_length(args) == 2) {
+ sql_exp *topN = rel->exps->h->data;
+ sql_exp *offset = rel->exps->h->next?
rel->exps->h->next->data:NULL;
+ atom *topn = topN->l;
+ if (offset) {
+ atom *b1 = (atom *)offset->l,
*c = atom_add(v->sql->sa, b1, topn);
+
+ if (!c)
+ return rel;
+ if (atom_cmp(c, topn) < 0) /*
overflow */
+ return rel;
+ topn = c;
+ }
+ append(args, exp_atom(v->sql->sa, topn));
+ v->changes++;
+ }
+ }
+ }
+
if ((is_topn(rel->op) || is_sample(rel->op)) &&
topn_sample_safe_exps(rel->exps, true)) {
sql_rel *(*func) (sql_allocator *, sql_rel *, list *) =
is_topn(rel->op) ? rel_topn : rel_sample;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]