Changeset: 3475699a15e7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3475699a15e7
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_optimizer.c
        sql/server/rel_rel.c
        sql/server/rel_select.c
        sql/server/rel_unnest.c
        sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
        sql/test/SQLite_regress/sqllogictest/Tests/All
        sql/test/Tests/keys.stable.out
Branch: Oct2020
Log Message:

Fix has nil flag propagation on some cases and small cleanup


diffs (167 lines):

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
@@ -396,7 +396,7 @@ exp_aggr( sql_allocator *sa, list *l, sq
                set_distinct(e);
        if (no_nils)
                set_no_nil(e);
-       if (!has_nils)
+       if ((!a->func->semantics && !has_nils) || (!a->func->s && 
strcmp(a->func->base.name, "count") == 0))
                set_has_no_nil(e);
        return e;
 }
@@ -416,7 +416,6 @@ exp_atom(sql_allocator *sa, atom *a)
 sql_exp *
 exp_atom_max(sql_allocator *sa, sql_subtype *tpe)
 {
-
        if (tpe->type->localtype == TYPE_bte) {
                return exp_atom_bte(sa, GDK_bte_max);
        } else if (tpe->type->localtype == TYPE_sht) {
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
@@ -5672,7 +5672,7 @@ sql_class_base_score(mvc *sql, sql_colum
                case TYPE_dbl:
                        return 75 - 53;
                default: {
-                       if (equality_based && c && (de = 
sql_trans_is_duplicate_eliminated(sql->session->tr, c)))
+                       if (equality_based && c && (de = 
mvc_is_duplicate_eliminated(sql, c)))
                                return 150 - de * 8;
                        /* strings and blobs not duplicate eliminated don't get 
any points here */
                        return 0;
@@ -8756,7 +8756,7 @@ rel_add_dicts(visitor *v, sql_rel *rel)
                        if (!is_func(e->type) && oname[0] != '%') {
                                sql_column *c = find_sql_column(t, oname);
 
-                               if ((de = 
sql_trans_is_duplicate_eliminated(v->sql->session->tr, c)) != 0) {
+                               if ((de = mvc_is_duplicate_eliminated(v->sql, 
c)) != 0) {
                                        int nr = ++v->sql->label;
                                        char name[16], *nme;
                                        sql_rel *vt = rel_dicttable(v->sql, c, 
rname, de);
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -533,7 +533,14 @@ rel_setop_set_exps(mvc *sql, sql_rel *re
        for (node *n = exps->h, *m = lexps->h, *o = rexps->h ; m && m && o ; n 
= n->next, m = m->next,o = o->next) {
                sql_exp *e = n->data, *f = m->data, *g = o->data;
 
-               e->card = is_union(rel->op) ? MAX(f->card, g->card) : f->card;
+               if (is_union(rel->op)) { /* propagate set_has_no_nil only if 
it's applicable to both sides of the union*/
+                       if (has_nil(f) || has_nil(g))
+                               set_has_nil(e);
+                       else
+                               set_has_no_nil(e);
+                       e->card = MAX(f->card, g->card);
+               } else
+                       e->card = f->card;
        }
        rel->nrcols = l->nrcols;
        rel->exps = 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
@@ -3651,7 +3651,8 @@ static sql_exp *
                }
        }
        if (a && execute_priv(sql,a->func)) {
-               sql_exp *e = exp_aggr(sql->sa, exps, a, distinct, no_nil, 
groupby?groupby->card:CARD_ATOM, have_nil(exps));
+               bool hasnil = have_nil(exps) || (strcmp(aname, "count") != 0 && 
(!groupby || list_empty(groupby->r))); /* for global case, the aggregate may 
return NULL */
+               sql_exp *e = exp_aggr(sql->sa, exps, a, distinct, no_nil, 
groupby?groupby->card:CARD_ATOM, hasnil);
 
                if (!groupby)
                        return e;
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -1607,6 +1607,8 @@ rewrite_exp_rel(visitor *v, sql_rel *rel
                        if (!exp_name(ne))
                                ne = exp_label(v->sql->sa, ne, ++v->sql->label);
                        e = ne;
+                       if (depth) /* a projection from an outer join may have 
nulls */
+                               set_has_nil(e);
                } else {
                        e = exp_rel_update_exp(v->sql, e);
                }
diff --git a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out 
b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
--- a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
+++ b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
@@ -89,9 +89,9 @@ single project (
 | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "o"."open_auction_id" NOT 
NULL ],
 | | | | | | table(sys.bidder) [ "bidder"."id" NOT NULL HASHCOL  as "b3a"."id", 
"bidder"."open_auction_id" NOT NULL as "b3a"."open_auction_id", "bidder"."date" 
NOT NULL as "b3a"."date", "bidder"."time" NOT NULL as "b3a"."time", 
"bidder"."personref" NOT NULL as "b3a"."personref", "bidder"."increase" NOT 
NULL as "b3a"."increase", "bidder"."%TID%" NOT NULL as "b3a"."%TID%" ] COUNT 
 | | | | | ) [ "b3a"."open_auction_id" NOT NULL = "o"."open_auction_id" NOT 
NULL ]
-| | | | ) [ "o"."open_auction_id" NOT NULL ] [ sys.min no nil ("b3a"."id" NOT 
NULL HASHCOL ) NOT NULL as "%1"."%1", "o"."open_auction_id" NOT NULL ]
-| | | ) [ "b3"."id" NOT NULL HASHCOL  = "%1"."%1" NOT NULL ]
-| | ) [ "b3"."id" NOT NULL HASHCOL , "b3"."open_auction_id" NOT NULL, 
"b3"."date" NOT NULL, "b3"."time" NOT NULL, "b3"."personref" NOT NULL, 
"b3"."increase" NOT NULL, "b3"."%TID%" NOT NULL, "%1"."%1" NOT NULL, 
"o"."open_auction_id" NOT NULL as "%5"."%5" ]
+| | | | ) [ "o"."open_auction_id" NOT NULL ] [ sys.min no nil ("b3a"."id" NOT 
NULL HASHCOL ) as "%1"."%1", "o"."open_auction_id" NOT NULL ]
+| | | ) [ "b3"."id" NOT NULL HASHCOL  = "%1"."%1" ]
+| | ) [ "b3"."id" NOT NULL HASHCOL , "b3"."open_auction_id" NOT NULL, 
"b3"."date" NOT NULL, "b3"."time" NOT NULL, "b3"."personref" NOT NULL, 
"b3"."increase" NOT NULL, "b3"."%TID%" NOT NULL, "%1"."%1", 
"o"."open_auction_id" NOT NULL as "%5"."%5" ]
 | ) [ "o"."open_auction_id" NOT NULL * = "%5"."%5" NOT NULL ]
 ) [ "o"."id" NOT NULL HASHCOL , "o"."open_auction_id" NOT NULL, "o"."initial" 
NOT NULL, "o"."reserve" NOT NULL, "o"."aktuell" NOT NULL, "o"."privacy" NOT 
NULL, "o"."itemref" NOT NULL, "o"."seller" NOT NULL, "o"."quantity" NOT NULL, 
"o"."type" NOT NULL, "o"."start" NOT NULL, "o"."ende" NOT NULL, "o"."%TID%" NOT 
NULL, "b"."id" NOT NULL HASHCOL , "b"."open_auction_id" NOT NULL, "b"."date" 
NOT NULL, "b"."time" NOT NULL, "b"."personref" NOT NULL, "b"."increase" NOT 
NULL, "b"."%TID%" NOT NULL, "b3"."increase" NOT NULL as "%2"."%2" ]
 project (
@@ -110,8 +110,8 @@ project (
 | | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "o"."open_auction_id" NOT 
NULL ],
 | | | | | | | table(sys.bidder) [ "bidder"."id" NOT NULL HASHCOL  as 
"b2a"."id", "bidder"."open_auction_id" NOT NULL as "b2a"."open_auction_id" ] 
COUNT 
 | | | | | | ) [ "b2a"."open_auction_id" NOT NULL = "o"."open_auction_id" NOT 
NULL ]
-| | | | | ) [ "o"."open_auction_id" NOT NULL ] [ sys.max no nil ("b2a"."id" 
NOT NULL HASHCOL ) NOT NULL as "%3"."%3", "o"."open_auction_id" NOT NULL ]
-| | | | ) [ "b2"."id" NOT NULL HASHCOL  = "%3"."%3" NOT NULL ]
+| | | | | ) [ "o"."open_auction_id" NOT NULL ] [ sys.max no nil ("b2a"."id" 
NOT NULL HASHCOL ) as "%3"."%3", "o"."open_auction_id" NOT NULL ]
+| | | | ) [ "b2"."id" NOT NULL HASHCOL  = "%3"."%3" ]
 | | | ) [ "b2"."increase" NOT NULL, "o"."open_auction_id" NOT NULL as 
"%6"."%6" ]
 | | ) [ "o"."open_auction_id" NOT NULL * = "%6"."%6" NOT NULL ]
 | ) [ sys.sql_mul("%2"."%2" NOT NULL, double "2") <= "b2"."increase" NOT NULL ]
diff --git a/sql/test/SQLite_regress/sqllogictest/Tests/All 
b/sql/test/SQLite_regress/sqllogictest/Tests/All
--- a/sql/test/SQLite_regress/sqllogictest/Tests/All
+++ b/sql/test/SQLite_regress/sqllogictest/Tests/All
@@ -1,5 +1,5 @@
-select1
-select2
-select3
-select4
-select5
+#select1
+#select2
+#select3
+#select4
+#select5
diff --git a/sql/test/Tests/keys.stable.out b/sql/test/Tests/keys.stable.out
--- a/sql/test/Tests/keys.stable.out
+++ b/sql/test/Tests/keys.stable.out
@@ -132,12 +132,12 @@ project (
 % .plan # table_name
 % rel # name
 % clob # type
-% 66 # length
+% 75 # length
 project (
 | group by (
 | | table(sys.dummyme) [ "dummyme"."b" ] COUNT 
-| ) [  ] [ sys.count unique  no nil ("dummyme"."b") as "%1"."%1" ]
-) [ "%1"."%1" ]
+| ) [  ] [ sys.count unique  no nil ("dummyme"."b") NOT NULL as "%1"."%1" ]
+) [ "%1"."%1" NOT NULL ]
 #plan select count(distinct a + 1) from dummyme;
 % .plan # table_name
 % rel # name
@@ -148,8 +148,8 @@ project (
 | | project (
 | | | table(sys.dummyme) [ "dummyme"."a" NOT NULL HASHCOL  ] COUNT 
 | | ) [ bigint["dummyme"."a" NOT NULL HASHCOL ] NOT NULL as "%3"."%3", 
sys.sql_add("%3"."%3" NOT NULL, bigint "1") as "%2"."%2" ]
-| ) [  ] [ sys.count unique  no nil ("%2"."%2") as "%1"."%1" ]
-) [ "%1"."%1" ]
+| ) [  ] [ sys.count unique  no nil ("%2"."%2") NOT NULL as "%1"."%1" ]
+) [ "%1"."%1" NOT NULL ]
 #plan select count(distinct a + b) from dummyme;
 % .plan # table_name
 % rel # name
@@ -160,8 +160,8 @@ project (
 | | project (
 | | | table(sys.dummyme) [ "dummyme"."a" NOT NULL HASHCOL , "dummyme"."b" ] 
COUNT 
 | | ) [ bigint["dummyme"."a" NOT NULL HASHCOL ] NOT NULL as "%3"."%3", 
bigint["dummyme"."b"] as "%4"."%4", sys.sql_add("%3"."%3" NOT NULL, "%4"."%4") 
as "%2"."%2" ]
-| ) [  ] [ sys.count unique  no nil ("%2"."%2") as "%1"."%1" ]
-) [ "%1"."%1" ]
+| ) [  ] [ sys.count unique  no nil ("%2"."%2") NOT NULL as "%1"."%1" ]
+) [ "%1"."%1" NOT NULL ]
 #plan select count(distinct abs(a)) from dummyme;
 % .plan # table_name
 % rel # name
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to