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]

Reply via email to