Changeset: 9c4d86d2983d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9c4d86d2983d
Modified Files:
        clients/mapilib/mapi.c
        configure.ag
        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: default
Log Message:

Merge with Jun2016 branch.


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
@@ -5545,6 +5545,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);
@@ -5556,7 +5558,7 @@ rel_used(sql_rel *rel)
        } else if (rel->op == op_table && rel->r) {
                exp_used(rel->r);
        }
-       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
@@ -2360,6 +2360,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 (.. ) */
@@ -2389,12 +2390,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);
@@ -2440,7 +2447,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;
@@ -2474,12 +2484,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;
@@ -2564,7 +2568,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

Reply via email to