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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list