Changeset: 2f5e9233e51a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2f5e9233e51a
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err
        sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.out
Branch: Feb2013
Log Message:

fixed bug 3339, we do not allow multiple values /rows as arguments for table 
returning functions.


diffs (182 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
@@ -1253,7 +1253,7 @@ static stmt *
 rel2bin_table( mvc *sql, sql_rel *rel, list *refs)
 {
        list *l; 
-       stmt *sub = NULL;
+       stmt *sub = NULL, *osub = NULL;
        node *en, *n;
        sql_exp *op = rel->r;
 
@@ -1285,11 +1285,10 @@ rel2bin_table( mvc *sql, sql_rel *rel, l
                        assert(0);
                        return NULL;    
                }
-               sub = psub;
                l = sa_list(sql->sa);
                for(i = 0, n = t->columns.set->h; n; n = n->next, i++ ) {
                        sql_column *c = n->data;
-                       stmt *s = stmt_rs_column(sql->sa, sub, i, &c->type); 
+                       stmt *s = stmt_rs_column(sql->sa, psub, i, &c->type); 
                        char *nme = c->base.name;
                        char *rnme = exp_find_rel_name(op);
 
@@ -1297,6 +1296,10 @@ rel2bin_table( mvc *sql, sql_rel *rel, l
                        s = stmt_alias(sql->sa, s, rnme, sa_strdup(sql->sa, 
nme));
                        list_append(l, s);
                }
+               if (sub && sub->nrcols) { /* add sub */
+                       list_merge(l, sub->op4.lval, NULL);
+                       osub = sub;
+               }
                sub = stmt_list(sql->sa, l);
        } else if (rel->l) {
                int i, argc;
@@ -1357,6 +1360,8 @@ rel2bin_table( mvc *sql, sql_rel *rel, l
                s = stmt_alias(sql->sa, s, rnme, sa_strdup(sql->sa, exp->name));
                list_append(l, s);
        }
+       if (osub && osub->nrcols) 
+               list_merge(l, osub->op4.lval, NULL);
        sub = stmt_list(sql->sa, l);
        return sub;
 }
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -3816,6 +3816,10 @@ rel_reduce_groupby_exps(int *changes, mv
                }
                if (i) { /* forall tables find pkey and 
                                remove useless other columns */
+                       /* TODO also remove group by columns which are related 
to
+                        * the other columns using a foreign-key join (n->1), 
ie 1
+                        * on the to be removed side.
+                        */
                        for(j = 0; j < i; j++) {
                                int l, nr = 0, cnr = 0;
 
@@ -5671,6 +5675,7 @@ rel_rename(mvc *sql, sql_rel *rel, list 
                nme = number2name(name, 16, ++sql->label);
                /* label + put aliases list into aliases */
                nrel->l = rel->l;
+               nrel->r = rel->r;
                nrel->exps = new_exp_list(sql->sa);
                for (n = rel->exps->h; n; n = n->next) {
                        sql_exp *e = n->data, *ne, *a;
@@ -5743,7 +5748,10 @@ rel_apply_rename(mvc *sql, sql_rel *rel)
                return rel;
        switch(rel->op) {
        case op_basetable:
+               return rel;
        case op_table:
+               if (rel->l)
+                       rel->l = rel_apply_rename(sql, rel->l);
                return rel;
        case op_project:
        case op_select: 
@@ -5848,6 +5856,18 @@ rel_apply_rewrite(int *changes, mvc *sql
                (*changes)++;
                return nrel;
        }
+       /* table function (TODO should output any input cols) */
+       if (r->op == op_table && r->l) {
+               /*
+               int used = rel_uses_exps(r->l, rel->exps);
+
+               if (used) {
+               */
+                       /* ugh */
+                       r->l = rel->l;
+                       return r;
+               //}
+       } 
        if (r->op == op_table || r->op == op_basetable) {
                if (rel->flag == APPLY_LOJ)
                        rel->op = op_left;
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
@@ -3219,6 +3219,11 @@ rel_unop_(mvc *sql, sql_exp *e, sql_sche
                        f->res.digits = t->digits;
                        f->res.scale = t->scale;
                }
+               if (card == card_relation && e->card > CARD_ATOM) {
+                       sql_subaggr *zero_or_one = sql_bind_aggr(sql->sa, 
sql->session->schema, "zero_or_one", exp_subtype(e));
+
+                       e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, CARD_ATOM, 
0);
+               }
                return exp_unop(sql->sa, e, f);
        } else if (e) {
                char *type = exp_subtype(e)->type->sqlname;
@@ -3336,6 +3341,16 @@ rel_binop_(mvc *sql, sql_exp *l, sql_exp
                } else if (f->func->fix_scale == DIGITS_ADD) {
                        f->res.digits = (t1->digits && t2->digits)?t1->digits + 
t2->digits:0;
                }
+               if (card == card_relation && l->card > CARD_ATOM) {
+                       sql_subaggr *zero_or_one = sql_bind_aggr(sql->sa, 
sql->session->schema, "zero_or_one", exp_subtype(l));
+
+                       l = exp_aggr1(sql->sa, l, zero_or_one, 0, 0, CARD_ATOM, 
0);
+               }
+               if (card == card_relation && r->card > CARD_ATOM) {
+                       sql_subaggr *zero_or_one = sql_bind_aggr(sql->sa, 
sql->session->schema, "zero_or_one", exp_subtype(r));
+
+                       r = exp_aggr1(sql->sa, r, zero_or_one, 0, 0, CARD_ATOM, 
0);
+               }
                return exp_binop(sql->sa, l, r, f);
        } else {
                sql_exp *ol = l;
@@ -3545,6 +3560,11 @@ rel_nop(mvc *sql, sql_rel **rel, symbol 
                                nexps = NULL;
                                break;
                        }
+                       if (table_func && e->card > CARD_ATOM) {
+                               sql_subaggr *zero_or_one = 
sql_bind_aggr(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(e));
+
+                               e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, 
CARD_ATOM, 0);
+                       }
                        append(nexps, e);
                }
                if (nexps) 
diff --git a/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err 
b/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err
--- a/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err
+++ b/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err
@@ -25,16 +25,16 @@ stderr of test 'create_function.Bug-3172
 # cmdline opt  gdk_dbname = mTests_test_BugTracker-2012
 # cmdline opt  mal_listing = 0
 
+# 16:07:20 >  
+# 16:07:20 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-27661" "--port=38365"
+# 16:07:20 >  
 
+MAPI  = (monetdb) /var/tmp/mtest-27661/.s.monetdb.38365
+QUERY = select * from x((select id from _tables), (select schema_id from 
_tables));
+ERROR = !TypeException:user.s0_1[41]:'mal.multiplex' undefined in: 
(_56:bat[:oid,:int], _59:bat[:oid,:int]) := mal.multiplex(_57:str, _58:str, 
_50:bat[:oid,:int], _53:bat[:oid,:int])
+        !program contains errors
 
+# 16:07:20 >  
+# 16:07:20 >  "Done."
+# 16:07:20 >  
 
-# 13:24:28 >  
-# 13:24:28 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=lodz" 
"--port=38620"
-# 13:24:28 >  
-
-Needs a proper error message!
-
-# 13:24:29 >  
-# 13:24:29 >  "Done."
-# 13:24:29 >  
-
diff --git a/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.out 
b/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.out
--- a/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.out
+++ b/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.out
@@ -18,7 +18,6 @@ stdout of test 'create_function.Bug-3172
 # MonetDB/JAQL module loaded
 # MonetDB/SQL module loaded
 
-Needs a proper error message!
 Ready.
 # SQL catalog created, loading sql scripts once
 # loading sql script: 09_like.sql
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to