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