Changeset: 22e26f2548f2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=22e26f2548f2
Removed Files:
sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.sql
sql/test/SQLancer/Tests/sqlancer11.sql
Modified Files:
clients/mapiclient/dump.c
gdk/gdk_subquery.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_select.c
sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.test
sql/test/SQLancer/Tests/sqlancer11.test
sql/test/testdb-upgrade-hge/Tests/dump.stable.out
sql/test/testdb-upgrade/Tests/dump.stable.out
sql/test/testdb/Tests/dump-nogeom.stable.out
sql/test/testdb/Tests/dump.stable.out
Branch: default
Log Message:
Merged with Oct2020
diffs (truncated from 495 to 300 lines):
diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -1256,7 +1256,11 @@ describe_table(Mapi mid, const char *sch
goto bailout;
while (mapi_fetch_row(hdl) != 0)
expr = mapi_fetch_field(hdl, 0);
- mnstr_printf(toConsole, " PARTITION BY %s %s
(%s)", phow, pusing, expr);
+ mnstr_printf(toConsole, " PARTITION BY %s %s
(", phow, pusing);
+ if (column)
+ dquoted_print(toConsole, expr, ")");
+ else
+ mnstr_printf(toConsole, "%s)", expr);
mapi_close_handle(hdl);
}
}
diff --git a/gdk/gdk_subquery.c b/gdk/gdk_subquery.c
--- a/gdk/gdk_subquery.c
+++ b/gdk/gdk_subquery.c
@@ -574,7 +574,6 @@ alloc_fail:
ret[gid] = VAL2; \
} else if (is_##TYPE##_nil(vals1[i]) ||
is_##TYPE##_nil(vals2[i])) { \
ret[gid] = bit_nil; \
- hasnil = 1; \
} else if (vals1[i] == vals2[i]) { \
ret[gid] = VAL1; \
} \
@@ -671,7 +670,6 @@ BATanyequal_grp2(BAT *l, BAT *r, BAT *ri
const void *rv =
BUNtail(ri, i);
if (ocmp(lv, nilp) == 0
|| ocmp(rv, nilp) == 0) {
ret[gid] =
bit_nil;
- hasnil = 1;
} else if (ocmp(lv, rv)
== 0)
ret[gid] = TRUE;
}
@@ -680,6 +678,8 @@ BATanyequal_grp2(BAT *l, BAT *r, BAT *ri
}
}
}
+ for (BUN i = 0 ; i < ngrp ; i++)
+ hasnil |= ret[i] == bit_nil;
BATsetcount(res, ngrp);
res->tkey = BATcount(res) <= 1;
res->tsorted = BATcount(res) <= 1;
@@ -790,7 +790,6 @@ BATallnotequal_grp2(BAT *l, BAT *r, BAT
const void *rv =
BUNtail(ri, i);
if (ocmp(lv, nilp) == 0
|| ocmp(rv, nilp) == 0) {
ret[gid] =
bit_nil;
- hasnil = 1;
} else if (ocmp(lv, rv)
== 0)
ret[gid] =
FALSE;
}
@@ -799,6 +798,8 @@ BATallnotequal_grp2(BAT *l, BAT *r, BAT
}
}
}
+ for (BUN i = 0 ; i < ngrp ; i++)
+ hasnil |= ret[i] == bit_nil;
BATsetcount(res, ngrp);
res->tkey = BATcount(res) <= 1;
res->tsorted = BATcount(res) <= 1;
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
@@ -228,26 +228,6 @@ exp_or(sql_allocator *sa, list *l, list
return e;
}
-static int /* if the quantifier has to be upcasted, ignore the upper
conversion for the cardinalilty */
-quantifier_has_rel(sql_exp *e)
-{
- if (!e)
- return 0;
- switch(e->type){
- case e_convert:
- return quantifier_has_rel(e->l);
- case e_psm:
- return exp_is_rel(e);
- case e_atom:
- case e_column:
- case e_func:
- case e_aggr:
- case e_cmp:
- return 0;
- }
- return 0;
-}
-
sql_exp *
exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype)
{
@@ -261,7 +241,7 @@ exp_in(sql_allocator *sa, sql_exp *l, li
for (node *n = r->h; n ; n = n->next) {
sql_exp *next = n->data;
- if (!quantifier_has_rel(next) && exps_card < next->card)
+ if (!exp_is_rel(next) && exps_card < next->card)
exps_card = next->card;
}
e->card = MAX(l->card, exps_card);
@@ -296,10 +276,10 @@ exp_in_func(mvc *sql, sql_exp *le, sql_e
for (node *n = ((list*)vals->f)->h ; n ; n = n->next) {
sql_exp *next = n->data;
- if (!quantifier_has_rel(next) && exps_card <
next->card)
+ if (!exp_is_rel(next) && exps_card < next->card)
exps_card = next->card;
}
- } else if (!quantifier_has_rel(vals))
+ } else if (!exp_is_rel(vals))
exps_card = vals->card;
e->card = MAX(le->card, exps_card);
@@ -320,7 +300,7 @@ exp_compare_func(mvc *sql, sql_exp *le,
if (e) {
e->flag = quantifier;
/* At ANY and ALL operators, the cardinality on the right side
is ignored if it is a sub-relation */
- e->card = quantifier && quantifier_has_rel(re) ? le->card :
MAX(le->card, re->card);
+ e->card = quantifier && exp_is_rel(re) ? le->card :
MAX(le->card, re->card);
if (!has_nil(le) && !has_nil(re))
set_has_no_nil(e);
}
@@ -1919,7 +1899,28 @@ exp_is_null(sql_exp *e )
int
exp_is_rel( sql_exp *e )
{
- return (e && e->type == e_psm && e->flag == PSM_REL && e->l);
+ if (e) {
+ switch(e->type){
+ case e_convert:
+ return exp_is_rel(e->l);
+ case e_psm:
+ return e->flag == PSM_REL && e->l;
+ default:
+ return 0;
+ }
+ }
+ return 0;
+}
+
+int
+exps_one_is_rel(list *exps)
+{
+ if (list_empty(exps))
+ return 0;
+ for(node *n = exps->h ; n ; n = n->next)
+ if (exp_is_rel(n->data))
+ return 1;
+ return 0;
}
int
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -152,6 +152,7 @@ extern int exp_is_zero(sql_exp *e);
extern int exp_is_not_null(sql_exp *e);
extern int exp_is_null(sql_exp *e);
extern int exp_is_rel(sql_exp *e);
+extern int exps_one_is_rel(list *exps);
extern int exp_has_rel(sql_exp *e);
extern int exps_have_rel_exp(list *exps);
extern int exps_have_func(list *exps);
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
@@ -1504,6 +1504,8 @@ rel_filter(mvc *sql, sql_rel *rel, list
return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "SELECT: no
such FILTER function %s%s%s'%s'", sname ? "'":"", sname ? sname : "", sname ?
"'.":"", filter_op);
e = exp_filter(sql->sa, l, r, f, anti);
+ if (exps_one_is_rel(l) || exps_one_is_rel(r)) /* uncorrelated subquery
case */
+ return rel_select(sql->sa, rel, e);
/* atom or row => select */
if (exps_card(l) > rel->card) {
sql_exp *ls = l->h->data;
@@ -1550,9 +1552,10 @@ rel_select_push_exp_down(mvc *sql, sql_r
{
if (!is_join(rel->op) && !is_select(rel->op))
return rel_select(sql->sa, rel, e);
- if (rs->card <= CARD_ATOM && (exp_is_atom(rs) || exp_has_freevar(sql,
rs) || exp_has_freevar(sql, ls)) &&
- (!rs2 || (rs2->card <= CARD_ATOM && (exp_is_atom(rs2) ||
exp_has_freevar(sql, rs2))))) {
- if ((ls->card == rs->card && (!rs2 || ls->card == rs2->card))
|| rel->processed) /* bin compare op */
+ if ((rs->card <= CARD_ATOM || (rs2 && ls->card <= CARD_ATOM)) &&
+ (exp_is_atom(rs) || (rs2 && exp_is_atom(ls)) ||
exp_has_freevar(sql, rs) || exp_has_freevar(sql, ls)) &&
+ (!rs2 || (rs2->card <= CARD_ATOM && (exp_is_atom(rs2) ||
exp_has_freevar(sql, rs2))))) {
+ if ((ls->card == rs->card && (!rs2 || ls->card == rs2->card ||
rs->card == rs2->card)) || rel->processed) /* bin compare op */
return rel_select(sql->sa, rel, e);
return push_select_exp(sql, rel, e, ls, L, f);
@@ -1568,7 +1571,7 @@ rel_compare_exp_(sql_query *query, sql_r
mvc *sql = query->sql;
sql_exp *e = NULL;
- if (quantifier || exp_is_rel(ls) || exp_is_rel(rs)) {
+ if (quantifier || exp_is_rel(ls) || exp_is_rel(rs) || (rs2 &&
exp_is_rel(rs2))) {
if (rs2) {
e = exp_compare2(sql->sa, ls, rs, rs2, type);
if (anti)
diff --git a/sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.test
b/sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.test
--- a/sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.test
+++ b/sql/test/BugTracker-2020/Tests/integers-intervals.Bug-6979.test
@@ -1,8 +1,9 @@
query IIII rowsort
-select extract(second from interval '3600' second), extract(hour from interval
'3600' second), extract(epoch from interval '3600' second), extract(epoch from
now() - now())
+select extract(second from interval '3600' second), extract(hour from interval
'3600' second), extract(epoch from interval '3600' second), extract(epoch from
timestamp '2010-10-01 10:00:00' - timestamp '2010-10-01 10:00:00')
----
0
1
3600000
0
+
diff --git a/sql/test/SQLancer/Tests/sqlancer11.test
b/sql/test/SQLancer/Tests/sqlancer11.test
--- a/sql/test/SQLancer/Tests/sqlancer11.test
+++ b/sql/test/SQLancer/Tests/sqlancer11.test
@@ -49,4 +49,123 @@ DROP TABLE t1
statement ok
DROP TABLE t0
+statement ok
+CREATE TABLE "sys"."t0" ("c0" BOOLEAN,"c1" DECIMAL(14,3))
+statement ok
+COPY 7 RECORDS INTO "sys"."t0" FROM stdin USING DELIMITERS E'\t',E'\n','"'
+<COPY_INTO_DATA>
+false 0.458
+true 4.112
+false 0.201
+false 0.347
+true 0.420
+false 0.127
+false 0.502
+
+statement ok
+CREATE TABLE "sys"."t1" ("c0" BOOLEAN,"c1" DECIMAL(14,3))
+
+statement ok
+COPY 10 RECORDS INTO "sys"."t1" FROM stdin USING DELIMITERS E'\t',E'\n','"'
+<COPY_INTO_DATA>
+NULL 0.000
+false 0.187
+false 0.000
+false NULL
+false NULL
+true NULL
+NULL 0.325
+NULL 0.374
+true NULL
+true NULL
+
+statement error
+select 1 from t1, t0 where cast(t1.c1 as clob) not like ((select 'A' from t0,
t1) except all (select 'B' from t0))
+
+statement error
+select 1 from t1, t0 where (select 1 from t1) like cast(t1.c1 as clob)
+
+statement error
+select 1 from t1, t0 where cast(t1.c1 as clob) between 'b' and ((select 'A'
from t0))
+
+statement error
+select 1 from t1, t0 where ((select 'A' from t0)) between cast(t1.c1 as clob)
and 'a'
+
+statement error
+select 1 from t1, t0 where cast(t1.c1 as clob) between ((select 1 from t0))
and 'c'
+
+statement ok
+drop table t0
+
+statement ok
+drop table t1
+
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE "t0" ("c0" DOUBLE PRECISION,"c2" BIGINT)
+
+statement ok
+INSERT INTO "t0" VALUES (NULL, 4), (NULL, 6), (NULL, 0), (NULL, 2), (NULL, 1)
+
+statement ok
+CREATE TABLE "t2" ("c0" DOUBLE PRECISION,"c1" bigint,"c2" BIGINT,"c4" REAL)
+
+statement ok
+INSERT INTO "t2" VALUES (4, 0, 6, NULL),(0.692789052132086, -1, 9, NULL),(2,
0, 6, NULL),(0.9469594820593024, 1, NULL, NULL),(NULL, 0, 6, NULL),
+(0.39272912837466945, 8, NULL, NULL),(NULL, NULL, 4, NULL),(2, 0, 6,
NULL),(-1596101049, 0, 6, NULL),(-1951243968, 0, 6, NULL),(NULL, 0, 6, NULL),
+(NULL, 0, 6, NULL),(NULL, 0, 6, NULL),(NULL, 0, 6, NULL)
+
+query T rowsort
+SELECT 4 = ANY(SELECT t2.c2 FROM t2) FROM t0
+----
+True
+True
+True
+True
+True
+
+statement ok
+ROLLBACK
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list