Changeset: 9289f7e123de for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9289f7e123de
Modified Files:
sql/server/rel_rel.c
sql/server/rel_unnest.c
sql/test/astro/Tests/astro.test
sql/test/subquery/Tests/subquery4.test
Branch: default
Log Message:
fixed marking freevars during rel_union_exps
improved marking of single joins
diffs (108 lines):
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -691,9 +691,6 @@ rel_crossproduct(sql_allocator *sa, sql_
rel->exps = NULL;
rel->card = CARD_MULTI;
rel->nrcols = l->nrcols + r->nrcols;
- rel->single = is_single(r);
- if (is_single(r))
- reset_single(r);
return rel;
}
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -1117,6 +1117,7 @@ push_up_select(mvc *sql, sql_rel *rel, l
rel->r = rel_dup(r->l);
rel = rel_select(sql->sa, rel, NULL);
rel->exps = !cp?exps:exps_copy(sql, exps);
+ rel_bind_vars(sql, rel, rel->exps);
set_processed(rel);
rel_destroy(r);
}
@@ -1366,18 +1367,19 @@ push_up_join(mvc *sql, sql_rel *rel, lis
list *inner_exps = exps_copy(sql, j->exps);
list *outer_exps = exps_copy(sql, rel->exps);
list *attr = j->attr;
+ int single = is_single(j);
rel->r = rel_dup(jl);
rel->exps = sa_list(sql->sa);
nj = rel_crossproduct(sql->sa, rel_dup(d),
rel_dup(jr), j->op);
- if (is_single(j))
- set_single(nj);
set_processed(nj);
rel_destroy(j);
j = nj;
set_dependent(j);
n = rel_crossproduct(sql->sa, rel, j, j->op);
n->exps = outer_exps;
+ if (single)
+ set_single(n);
if (!n->exps)
n->exps = inner_exps;
else
@@ -2704,7 +2706,6 @@ rel_union_exps(mvc *sql, sql_exp **l, li
{
sql_rel *u = NULL;
list *exps = NULL;
- int freevar = 0;
if (mvc_highwater(sql))
return sql_error(sql, 10, SQLSTATE(42000) "Query too complex:
running out of stack space");
@@ -2712,6 +2713,7 @@ rel_union_exps(mvc *sql, sql_exp **l, li
for (node *n=vals->h; n; n = n->next) {
sql_exp *ve = n->data, *r, *s;
sql_rel *sq = NULL;
+ int freevar = 0;
exp_label(sql->sa, ve, ++sql->label); /* an alias is needed */
if (exp_has_rel(ve)) {
@@ -2900,10 +2902,12 @@ rewrite_anyequal(visitor *v, sql_rel *re
(void)rewrite_inner(sql, rel, lsq,
op_left, &rewrite);
exp_reset_props(rewrite, le,
is_left(rewrite->op));
join =
(is_full(rel->op)||is_left(rel->op))?rel->r:rel->l;
+ rel_bind_var(sql, join, le);
}
if (rsq) {
(void)rewrite_inner(sql, rel, rsq,
op_left, &join);
exp_reset_props(join, re,
is_left(join->op));
+ rel_bind_var(sql, join, re);
}
assert(join && is_join(join->op));
if (join && !join->exps)
diff --git a/sql/test/astro/Tests/astro.test b/sql/test/astro/Tests/astro.test
--- a/sql/test/astro/Tests/astro.test
+++ b/sql/test/astro/Tests/astro.test
@@ -67,7 +67,7 @@ plan UPDATE fluxz
update(
| table("sys"."fluxz") [ "fluxz"."filter" NOT NULL, "fluxz"."f_datapoints" NOT
NULL, "fluxz"."avg_flux" NOT NULL, "fluxz"."avg_fluxsq" NOT NULL,
"fluxz"."avg_w" NOT NULL, "fluxz"."avg_wflux" NOT NULL, "fluxz"."avg_wfluxsq"
NOT NULL, "fluxz"."avg_dec_zone_deg" NOT NULL, "fluxz"."%TID%" NOT NULL UNIQUE ]
| project (
-| | single left outer join (
+| | left outer join (
| | | semijoin (
| | | | table("sys"."fluxz") [ "fluxz"."runcat" NOT NULL, "fluxz"."filter" NOT
NULL, "fluxz"."%TID%" NOT NULL UNIQUE ],
| | | | project (
@@ -76,7 +76,7 @@ update(
| | | | | ) [ ("cm_flux"."active" NOT NULL) = (boolean(1) "true"),
("cm_flux"."filter" NOT NULL) = (char(1) "g") ]
| | | | ) [ "cm_flux"."runcat" NOT NULL, "cm_flux"."filter" NOT NULL as
"%11"."%11" ]
| | | ) [ ("cm_flux"."runcat" NOT NULL) = ("fluxz"."runcat" NOT NULL),
("%11"."%11" NOT NULL) = ("fluxz"."filter" NOT NULL) ],
-| | | project (
+| | | single project (
| | | | select (
| | | | | table("sys"."cm_flux") [ "cm_flux"."runcat" NOT NULL,
"cm_flux"."filter" NOT NULL, "cm_flux"."f_datapoints" NOT NULL,
"cm_flux"."active" NOT NULL, "cm_flux"."avg_flux" NOT NULL,
"cm_flux"."avg_fluxsq" NOT NULL, "cm_flux"."avg_w" NOT NULL,
"cm_flux"."avg_wflux" NOT NULL, "cm_flux"."avg_wfluxsq" NOT NULL,
"cm_flux"."avg_dec_zone_deg" NOT NULL ]
| | | | ) [ ("cm_flux"."active" NOT NULL) = (boolean(1) "true"),
("cm_flux"."filter" NOT NULL) = (char(1) "g") ]
diff --git a/sql/test/subquery/Tests/subquery4.test
b/sql/test/subquery/Tests/subquery4.test
--- a/sql/test/subquery/Tests/subquery4.test
+++ b/sql/test/subquery/Tests/subquery4.test
@@ -454,7 +454,7 @@ 555
10
5555
-statement error GDK reported error: BATsubcross: more than one match
+statement error 21000!Cardinality violation, scalar value expected
UPDATE another_T SET (col7, col8) = (SELECT 1,2 UNION ALL SELECT 1,2)
statement error 42000!UPDATE: The number of specified columns between the SET
clause and the right side don't match (2 != 1)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]