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]

Reply via email to