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