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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to