Changeset: 125dacdd084d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=125dacdd084d
Modified Files:
sql/server/rel_unnest.c
sql/test/BugTracker-2012/Tests/querycache.Bug-3212.stable.out
sql/test/mergetables/Tests/sqlsmith-exists.stable.out
Branch: default
Log Message:
fixed handling of latest sqlsmith-exits problem (ie right join/semijoin rewrite)
diffs (124 lines):
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
@@ -1061,7 +1061,6 @@ push_up_join(mvc *sql, sql_rel *rel, lis
/* left of rel should be a set */
if (d && is_distinct_set(sql, d, ad) && j && (is_join(j->op) ||
is_semi(j->op))) {
- int crossproduct = 0;
sql_rel *jl = j->l, *jr = j->r;
/* op_join if F(jl) intersect A(D) = empty -> jl join
(D djoin jr)
* F(jr) intersect A(D) = empty -> (D djoin
jl) join jr
@@ -1074,7 +1073,6 @@ push_up_join(mvc *sql, sql_rel *rel, lis
rel->r = j = push_up_select_l(sql, j);
return rel; /* ie try again */
}
- crossproduct = list_empty(j->exps);
rd = (j->op != op_full && j->op !=
op_right)?rel_dependent_var(sql, d, jr):(list*)1;
ld = ((j->op == op_join || j->op ==
op_right))?rel_dependent_var(sql, d, jl):(list*)1;
@@ -1135,37 +1133,16 @@ push_up_join(mvc *sql, sql_rel *rel, lis
move_join_exps(sql, j, rel);
return j;
}
- if (/* DISABLES CODE */ (0) && !ld && is_left(rel->op)
&& crossproduct) {
- sql_exp *l = exp_atom_int(sql->sa, 1);
- sql_exp *r = exp_atom_int(sql->sa, 1);
- rel->r = jr;
- j->l = rel;
- j->r = jl;
-
- assert(!rel_is_ref(j));
- if (!is_simple_project(jr->op))
- rel->r = jr = rel_project(sql->sa, jr,
rel_projections(sql, jr, NULL, 1, 1));
- if (!is_simple_project(jl->op))
- j->r = jl = rel_project(sql->sa, jl,
rel_projections(sql, jl, NULL, 1, 1));
- l = exp_label(sql->sa, l, ++sql->label);
- r = exp_label(sql->sa, r, ++sql->label);
- append(jl->exps, l);
- append(jr->exps, r);
- l = exp_ref(sql->sa, l);
- r = exp_ref(sql->sa, r);
- l = exp_compare(sql->sa, r, l, cmp_equal_nil);
- j->op = rel->op;
- move_join_exps(sql, j, rel);
- if (!j->exps)
- j->exps = sa_list(sql->sa);
- append(j->exps, l);
- return j;
- } else if (!ld) {
+ if (!ld) {
rel->r = rel_dup(jr);
sql_rel *nj = rel_crossproduct(sql->sa,
rel_dup(jl), rel, j->op);
nj->exps = exps_copy(sql, j->exps);
rel_destroy(j);
j = nj;
+ if (is_semi(rel->op)) {
+ //assert(!is_semi(rel->op));
+ rel->op = op_left;
+ }
move_join_exps(sql, j, rel);
return j;
}
diff --git a/sql/test/BugTracker-2012/Tests/querycache.Bug-3212.stable.out
b/sql/test/BugTracker-2012/Tests/querycache.Bug-3212.stable.out
--- a/sql/test/BugTracker-2012/Tests/querycache.Bug-3212.stable.out
+++ b/sql/test/BugTracker-2012/Tests/querycache.Bug-3212.stable.out
@@ -49,12 +49,12 @@ stdout of test 'querycache.Bug-3212` in
% .%1, .%1 # table_name
% query, count # name
% clob, int # type
-% 78, 1 # length
+% 70, 1 # length
[ "select * from querycache();", 1 ]
-[ "select i, s from qrys where i = 3 and s = \\'new\\';", 1 ]
-[ "select i, s from qrys where i = 2 and s = \\'brave\\';", 1 ]
-[ "select i, s from qrys where i = 1 and s = \\'hello\\';", 1 ]
-[ "insert into qrys values
(1,\\'hello\\'),(2,\\'brave\\'),(3,\\'new\\'),(4,\\'world\\');", 1 ]
+[ "select i, s from qrys where i = 3 and s = 'new';", 1 ]
+[ "select i, s from qrys where i = 2 and s = 'brave';", 1 ]
+[ "select i, s from qrys where i = 1 and s = 'hello';", 1 ]
+[ "insert into qrys values (1,'hello'),(2,'brave'),(3,'new'),(4,'world');",
1 ]
#drop table qrys;
# 04:47:44 >
diff --git a/sql/test/mergetables/Tests/sqlsmith-exists.stable.out
b/sql/test/mergetables/Tests/sqlsmith-exists.stable.out
--- a/sql/test/mergetables/Tests/sqlsmith-exists.stable.out
+++ b/sql/test/mergetables/Tests/sqlsmith-exists.stable.out
@@ -492,6 +492,37 @@ stdout of test 'sqlsmith-exists` in dire
% c0, c1, c2, c3, c4 # name
% int, int, int, int, int # type
% 1, 1, 1, 1, 1 # length
+#select
+# 34 as c0,
+# ref_7.col1 as c1
+#from
+# (select
+# cast(nullif(ref_1.bb,
+# ref_0.col1) as int) as c0,
+# ref_1.bb as c1,
+# ref_0.col2 as c2,
+# ref_1.bb as c3,
+# ref_0.col2 as c4,
+# cast(nullif(ref_0.col0,
+# ref_1.bb) as int) as c5,
+# ref_0.col1 as c6,
+# ref_1.bb as c7,
+# ref_0.col2 as c8,
+# ref_0.col0 as c9,
+# ref_1.cc as c10,
+# ref_0.col0 as c11,
+# ref_1.aa as c12
+# from
+# tab0 as ref_0
+# inner join analytics as ref_1
+# on (((ref_1.aa is null)
+# or ((ref_1.bb is null)
+# or ((63 is null)
+# or ((ref_1.bb is not null)
+% ., . # table_name
+% c0, c1 # name
+% tinyint, int # type
+% 1, 1 # length
#ROLLBACK;
# 19:56:32 >
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list