Changeset: 423c6e9586ed for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=423c6e9586ed
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/server/rel_exp.c
        sql/server/rel_select.c
        sql/test/subquery/Tests/scalar.stable.out
        sql/test/subquery/Tests/subquery.sql
Branch: subquery
Log Message:

more subquery fixes, small corner cases


diffs (truncated from 309 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2133,6 +2133,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
                sql_subtype *lng = sql_bind_localtype("lng");
                stmt *nilcnt = NULL;
 
+               assert(0);
                for( en = rel->exps->h; en; en = en->next ) {
                        sql_exp *e = en->data, *r, *l;
                        stmt *s;
@@ -2196,7 +2197,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
                        stmt *s = NULL;
 
                        /* only handle simple joins here */             
-                       if (list_length(lje) && (idx || e->type != e_cmp || 
e->flag != cmp_equal))
+                       if (/*list_length(lje) &&*/ (idx || e->type != e_cmp || 
e->flag != cmp_equal))
                                break;
                        if ((exp_has_func(e) && get_cmp(e) != cmp_filter) ||
                            (get_cmp(e) == cmp_or)) { 
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1419,11 +1419,11 @@ stmt_uselect(backend *be, stmt *op1, stm
 
                switch (cmptype) {
                case mark_in:
+               case mark_notin:
                case cmp_equal:
                case cmp_equal_nil:
                        op = "=";
                        break;
-               case mark_notin:
                case cmp_notequal:
                        op = "!=";
                        break;
@@ -1479,10 +1479,10 @@ stmt_uselect(backend *be, stmt *op1, stm
                        q = pushArgument(mb, q, r);
                        switch (cmptype) {
                        case mark_in:
+                       case mark_notin: /* we use a anti join, todo handle 
null (not) in empty semantics */
                        case cmp_equal:
                                q = pushStr(mb, q, anti?"!=":"==");
                                break;
-                       case mark_notin:
                        case cmp_notequal:
                                q = pushStr(mb, q, anti?"==":"!=");
                                break;
@@ -1864,6 +1864,7 @@ stmt_join(backend *be, stmt *op1, stmt *
 
        switch (cmptype) {
        case mark_in:
+       case mark_notin: /* we use a anti join, todo handle null (not) in empty 
*/
        case cmp_equal:
                q = newStmt(mb, algebraRef, sjt);
                q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
@@ -1888,7 +1889,6 @@ stmt_join(backend *be, stmt *op1, stmt *
                if (q == NULL)
                        return NULL;
                break;
-       case mark_notin:
        case cmp_notequal:
                q = newStmt(mb, algebraRef, antijoinRef);
                q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1823,6 +1823,7 @@ char *
 compare_func( comp_type t, int anti )
 {
        switch(t) {
+       case mark_in:
        case cmp_equal:
                return anti?"<>":"=";
        case cmp_lt:
@@ -1833,6 +1834,7 @@ compare_func( comp_type t, int anti )
                return anti?"<=":">=";
        case cmp_gt:
                return anti?"<":">";
+       case mark_notin:
        case cmp_notequal:
                return anti?"=":"<>";
        default:
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
@@ -1980,6 +1980,8 @@ rel_in_value_exp(sql_query *query, sql_r
                                a = exp_aggr1(sql->sa, l, ea, 0, 0, CARD_ATOM, 
0);
                                append(a->l, r);
                                append(a->l, tid);
+                               if (!is_sql_sel(f))
+                                       set_intern(a);
                                r = rel_groupby_add_aggr(sql, left, a);
                                r = exp_ref(sql->sa, r);
 
@@ -1987,9 +1989,12 @@ rel_in_value_exp(sql_query *query, sql_r
                                        if (pexps)
                                                left = rel_project(sql->sa, 
left, pexps);
                                        reset_processed(left);
+#if 0
+                                       /* value exp ie no select */
                                } else {
                                        //rel_join_add_exp(sql->sa, left, r);
                                        left = rel_select(sql->sa, left, r);
+#endif
                                }
                                *rel = left;
                                return r;
@@ -2088,7 +2093,7 @@ rel_in_value_exp(sql_query *query, sql_r
                        if (pexps) {
                                if (!l_init)
                                        (*rel)->l = left;
-                               else if (l_used)
+                               else /*if (l_used)*/
                                        *rel = left;
                        } else {
                                *rel = left;
@@ -2641,8 +2646,6 @@ rel_in_exp(sql_query *query, sql_rel *re
                        l_outer=1;
                        l_is_value=0;
                }
-               //if (l && !exp_is_atom(l)) 
-                       //l_is_value=0;
 
                ek.card = card_set;
                append(ll, l);
@@ -2726,15 +2729,17 @@ rel_in_exp(sql_query *query, sql_rel *re
                                return rel;
                        } else if ((z || l_used) && r) { /* left is single 
value/column */
                                if (!is_sql_sel(f)) {
-                                       if (z)
+                                       if (z) {
+                                               if (exp_is_atom(r) && 
is_simple_project(z->op) && !z->l) 
+                                                       
rel_project_add_exp(sql, z, r);
                                                r = rel_lastexp(sql, z);
+                                       }
                                        if (rel_convert_types(sql, &l, &r, 1, 
type_equal_no_any) < 0) 
                                                return NULL;
-                                       //r = exp_compare(sql->sa, l, r, 
sc->token==SQL_IN?mark_in:mark_notin);
-                                       r = exp_compare(sql->sa, l, r, mark_in);
+                                       r = exp_compare(sql->sa, l, r, 
sc->token==SQL_IN?mark_in:mark_notin); 
                                        if (z) {
                                                /* TO BE removed once we have a 
mark join */
-                                               if (sc->token == SQL_NOT_IN && 
l->card != CARD_ATOM && has_nil(l)) {
+                                               if (0 && sc->token == 
SQL_NOT_IN && l->card != CARD_ATOM && has_nil(l) /* Should be:  NULL not in 
set, except when set is empty */) {
                                                        sql_exp *e = 
rel_unop_(query, l, NULL, "isnull", card_value);
                                                        left = 
rel_select(sql->sa, left, exp_compare(sql->sa, e, exp_atom_bool(sql->sa, 0), 
cmp_equal));
                                                }
diff --git a/sql/test/subquery/Tests/scalar.stable.out 
b/sql/test/subquery/Tests/scalar.stable.out
--- a/sql/test/subquery/Tests/scalar.stable.out
+++ b/sql/test/subquery/Tests/scalar.stable.out
@@ -65,8 +65,8 @@ Ready.
 # 22:16:07 >  
 
 #SELECT 1+(SELECT 1); -- 2
-% .L4 # table_name
-% L4 # name
+% .L2 # table_name
+% L2 # name
 % tinyint # type
 % 1 # length
 [ 2    ]
@@ -95,8 +95,8 @@ Ready.
 % 5 # length
 [ NULL ]
 #SELECT EXISTS(SELECT 1); -- true
-% .L4 # table_name
-% L4 # name
+% .L2 # table_name
+% L2 # name
 % boolean # type
 % 5 # length
 [ true ]
@@ -104,8 +104,8 @@ Ready.
 #INSERT INTO integers VALUES (1), (2), (3), (NULL);
 [ 4    ]
 #SELECT EXISTS(SELECT 1) FROM integers; -- true, true, true, true
-% .L4 # table_name
-% L4 # name
+% .L2 # table_name
+% L2 # name
 % boolean # type
 % 5 # length
 [ true ]
@@ -113,39 +113,39 @@ Ready.
 [ true ]
 [ true ]
 #SELECT EXISTS(SELECT * FROM integers); -- true
-% .L12 # table_name
-% L12 # name
+% .L4 # table_name
+% L4 # name
 % boolean # type
 % 5 # length
 [ true ]
 #SELECT EXISTS(SELECT * FROM integers WHERE i IS NULL); -- true
-% .L12 # table_name
-% L12 # name
+% .L4 # table_name
+% L4 # name
 % boolean # type
 % 5 # length
 [ true ]
 #DROP TABLE integers;
 #SELECT 1 IN (SELECT 1); -- true
-% .L5 # table_name
-% L5 # name
+% .L11 # table_name
+% L11 # name
 % boolean # type
 % 5 # length
 [ true ]
 #SELECT NULL IN (SELECT 1); -- NULL
-% .L5 # table_name
-% L5 # name
+% .L11 # table_name
+% L11 # name
 % boolean # type
 % 5 # length
 [ NULL ]
 #SELECT 1 IN (SELECT NULL); -- NULL
-% .L5 # table_name
-% L5 # name
+% .L11 # table_name
+% L11 # name
 % boolean # type
 % 5 # length
 [ NULL ]
 #SELECT 1 IN (SELECT 2); -- false
-% .L5 # table_name
-% L5 # name
+% .L11 # table_name
+% L11 # name
 % boolean # type
 % 5 # length
 [ false        ]
@@ -153,20 +153,20 @@ Ready.
 #INSERT INTO integers VALUES (1), (2), (3);
 [ 3    ]
 #SELECT 4 IN (SELECT * FROM integers); -- false
-% .L12 # table_name
-% L12 # name
+% .L14 # table_name
+% L14 # name
 % boolean # type
 % 5 # length
 [ false        ]
 #SELECT 1 IN (SELECT * FROM integers); -- true
-% .L12 # table_name
-% L12 # name
+% .L14 # table_name
+% L14 # name
 % boolean # type
 % 5 # length
 [ true ]
 #SELECT 1 IN (SELECT * FROM integers) FROM integers; -- true, true, true
-% .L11 # table_name
-% L11 # name
+% .L13 # table_name
+% L13 # name
 % boolean # type
 % 5 # length
 [ true ]
@@ -175,19 +175,19 @@ Ready.
 #INSERT INTO integers VALUES (NULL); 
 [ 1    ]
 #SELECT 4 IN (SELECT * FROM integers); -- NULL
-% .L12 # table_name
-% L12 # name
+% .L14 # table_name
+% L14 # name
 % boolean # type
 % 5 # length
 [ NULL ]
 #SELECT 1 IN (SELECT * FROM integers); -- true
-% .L12 # table_name
-% L12 # name
+% .L14 # table_name
+% L14 # name
 % boolean # type
 % 5 # length
 [ true ]
 #SELECT * FROM integers WHERE (4 IN (SELECT * FROM integers)) IS NULL ORDER BY 
1; -- NULL, 1, 2, 3
-% .integers # table_name
+% sys.integers # table_name
 % i # name
 % int # type
 % 1 # length
@@ -196,7 +196,7 @@ Ready.
 [ 2    ]
 [ 3    ]
 #SELECT * FROM integers WHERE (i IN (SELECT * FROM integers)) IS NULL ORDER BY 
1; -- NULL
-% .integers # table_name
+% sys.integers # table_name
 % i # name
 % int # type
 % 1 # length
diff --git a/sql/test/subquery/Tests/subquery.sql 
b/sql/test/subquery/Tests/subquery.sql
--- a/sql/test/subquery/Tests/subquery.sql
+++ b/sql/test/subquery/Tests/subquery.sql
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to