Changeset: cb072f9b954e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cb072f9b954e
Modified Files:
clients/mapilib/mapi.c
sql/server/rel_dump.c
sql/server/rel_optimizer.c
sql/server/rel_select.c
sql/test/BugTracker-2016/Tests/concat_2_integers.Bug-4058.stable.out
Branch: Jun2016
Log Message:
fixes for both bug 4058 and bug 4064
In both cases the same expression (pointer) was used, which isn't correct.
Because with rewrites both uses change. They are now correctly referencing
a single projection column
diffs (135 lines):
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -2175,6 +2175,8 @@ mapi_destroy(Mapi mid)
free(mid->password);
if (mid->language)
free(mid->language);
+ if (mid->motd)
+ free(mid->motd);
if (mid->database)
free(mid->database);
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -72,6 +72,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
(void)sql;
if (!e)
return;
+ //mnstr_printf(fout, " %p ", e);
switch(e->type) {
case e_psm: {
if (e->flag & PSM_SET) {
@@ -319,6 +320,8 @@ rel_print_(mvc *sql, stream *fout, sql_
mnstr_printf(fout, "\n%cREF %d (%d)", decorate?'=':' ', nr,
cnt);
}
+
+ //mnstr_printf(fout, " %p ", rel);
switch (rel->op) {
case op_basetable: {
sql_table *t = rel->l;
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
@@ -5331,6 +5331,8 @@ exps_used(list *l)
static void
rel_used(sql_rel *rel)
{
+ if (!rel)
+ return;
if (is_join(rel->op) || is_set(rel->op) || is_semi(rel->op)) {
if (rel->l)
rel_used(rel->l);
@@ -5340,7 +5342,7 @@ rel_used(sql_rel *rel)
rel_used(rel->l);
rel = rel->l;
}
- if (rel->exps) {
+ if (rel && rel->exps) {
exps_used(rel->exps);
if (rel->r && (rel->op == op_project || rel->op == op_groupby))
exps_used(rel->r);
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
@@ -2111,6 +2111,7 @@ rel_logical_exp(mvc *sql, sql_rel *rel,
list *vals = NULL, *ll = sa_list(sql->sa);
int correlated = 0;
int l_is_value = 1, r_is_rel = 0;
+ list *pexps = NULL;
/* complex case */
if (dl->h->type == type_list) { /* (a,b..) in (.. ) */
@@ -2140,12 +2141,18 @@ rel_logical_exp(mvc *sql, sql_rel *rel,
/* first remove the NULLs */
if (sc->token == SQL_NOT_IN &&
l->card != CARD_ATOM && has_nil(l)) {
+ sql_exp *ol;
+
+ rel = rel_project(sql->sa, rel,
rel_projections(sql, rel, NULL, 1, 1));
+ pexps = rel_projections(sql, rel, NULL, 1, 1);
+ l = exp_label(sql->sa, l, ++sql->label);
+ append(rel->exps, l);
+ ol = l;
+ l = exp_column(sql->sa, exp_relname(ol),
exp_name(ol), exp_subtype(ol), ol->card, has_nil(ol), is_intern(ol));
e = rel_unop_(sql, l, NULL, "isnull",
card_value);
e = exp_compare(sql->sa, e,
exp_atom_bool(sql->sa, 0), cmp_equal);
- if (!is_select(rel->op) || rel_is_ref(rel))
- left = rel = rel_select(sql->sa, rel,
e);
- else
- rel_select_add_exp(sql->sa, rel, e);
+ left = rel = rel_select(sql->sa, rel, e);
+ l = exp_column(sql->sa, exp_relname(ol),
exp_name(ol), exp_subtype(ol), ol->card, has_nil(ol), is_intern(ol));
}
append(ll, l);
@@ -2191,7 +2198,10 @@ rel_logical_exp(mvc *sql, sql_rel *rel,
list_append(nvals, r);
}
e = exp_in(sql->sa, l, nvals,
sc->token==SQL_NOT_IN?cmp_notin:cmp_in);
- return rel_select(sql->sa, rel, e);
+ rel = rel_select(sql->sa, rel, e);
+ if (pexps)
+ rel = rel_project(sql->sa, rel, pexps);
+ return rel;
} else { /* complex case */
vals = new_exp_list(sql->sa);
n = dl->h->next;
@@ -2225,12 +2235,6 @@ rel_logical_exp(mvc *sql, sql_rel *rel,
z = rel;
correlated = 1;
}
- /*
- if (!r || !(r=rel_check_type(sql, st,
r, type_equal))) {
- rel_destroy(right);
- return NULL;
- }
- */
if (!r) {
rel_destroy(right);
return NULL;
@@ -2315,7 +2319,7 @@ rel_logical_exp(mvc *sql, sql_rel *rel,
rel = rel_select(sql->sa, rel, e);
}
if (!correlated && l_is_value && outer)
- rel = rel_crossproduct(sql->sa, outer, rel,
op_join);
+ rel = rel_crossproduct(sql->sa, rel_dup(outer),
rel, op_join);
rel = rel_project(sql->sa, rel, rel_projections(sql,
outer, NULL, 1, 1));
set_processed(rel);
return rel;
diff --git
a/sql/test/BugTracker-2016/Tests/concat_2_integers.Bug-4058.stable.out
b/sql/test/BugTracker-2016/Tests/concat_2_integers.Bug-4058.stable.out
--- a/sql/test/BugTracker-2016/Tests/concat_2_integers.Bug-4058.stable.out
+++ b/sql/test/BugTracker-2016/Tests/concat_2_integers.Bug-4058.stable.out
@@ -128,8 +128,8 @@ Ready.
[ 682, 1402, "V", true ]
[ 796, 1507, "V", true ]
[ 743, 1505, "V", true ]
-#sselect * from "sys"."test_bug4058" where f3='V' AND f4=true AND f1||f2 NOT
IN (select f1||f2 from "sys"."test_bug4058_tmp");
-% sys.tmp, sys.tmp, sys.tmp, sys.tmp # table_name
+#select * from "sys"."test_bug4058" where f3='V' AND f4=true AND f1||f2 NOT IN
(select f1||f2 from "sys"."test_bug4058_tmp");
+% sys.test_bug4058, sys.test_bug4058, sys.test_bug4058,
sys.test_bug4058 # table_name
% f1, f2, f3, f4 # name
% int, int, clob, boolean # type
% 3, 4, 1, 5 # length
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list