Changeset: c6b8abe442a5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c6b8abe442a5
Modified Files:
        sql/server/rel_exp.c
        sql/test/Tests/keys.stable.out
Branch: Oct2020
Log Message:

Propagate no 'has_no_nil' property where possible and added defensive lines


diffs (269 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
@@ -169,6 +169,8 @@ exp_compare(sql_allocator *sa, sql_exp *
        e->l = l;
        e->r = r;
        e->flag = cmptype;
+       if (!has_nil(l) && !has_nil(r))
+               set_has_no_nil(e);
        return e;
 }
 
@@ -184,6 +186,8 @@ exp_compare2(sql_allocator *sa, sql_exp 
        e->r = r;
        e->f = f;
        e->flag = cmptype;
+       if (!has_nil(l) && !has_nil(r) && !has_nil(f))
+               set_has_no_nil(e);
        return e;
 }
 
@@ -201,6 +205,8 @@ exp_filter(sql_allocator *sa, list *l, l
        e->flag = cmp_filter;
        if (anti)
                set_anti(e);
+       if (!have_nil(l) && !have_nil(r))
+               set_has_no_nil(e);
        return e;
 }
 
@@ -217,6 +223,8 @@ exp_or(sql_allocator *sa, list *l, list 
        e->flag = cmp_or;
        if (anti)
                set_anti(e);
+       if (!have_nil(l) && !have_nil(r))
+               set_has_no_nil(e);
        return e;
 }
 
@@ -241,6 +249,8 @@ exp_in(sql_allocator *sa, sql_exp *l, li
        e->r = r;
        assert( cmptype == cmp_in || cmptype == cmp_notin);
        e->flag = cmptype;
+       if (!has_nil(l) && !have_nil(r))
+               set_has_no_nil(e);
        return e;
 }
 
@@ -273,6 +283,8 @@ exp_in_func(mvc *sql, sql_exp *le, sql_e
                        exps_card = vals->card;
 
                e->card = MAX(le->card, exps_card);
+               if (!has_nil(le) && !has_nil(vals))
+                       set_has_no_nil(e);
        }
        return e;
 }
@@ -289,6 +301,8 @@ exp_compare_func(mvc *sql, sql_exp *le, 
                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 && exp_is_rel(re) ? le->card : 
MAX(le->card, re->card);
+               if (!has_nil(le) && !has_nil(re))
+                       set_has_no_nil(e);
        }
        return e;
 }
@@ -331,6 +345,8 @@ exp_op( sql_allocator *sa, list *l, sql_
        e->l = l;
        e->f = f;
        e->semantics = f->func->semantics;
+       if (!e->semantics && l && !have_nil(l))
+               set_has_no_nil(e);
        return e;
 }
 
@@ -590,10 +606,10 @@ list *
 exp_types(sql_allocator *sa, list *exps)
 {
        list *l = sa_list(sa);
-       node *n;
-
-       for ( n = exps->h; n; n = n->next)
-               append(l, exp_subtype(n->data));
+
+       if (exps)
+               for (node *n = exps->h; n; n = n->next)
+                       list_append(l, exp_subtype(n->data));
        return l;
 }
 
@@ -601,12 +617,12 @@ int
 have_nil(list *exps)
 {
        int has_nil = 0;
-       node *n;
-
-       for ( n = exps->h; n && !has_nil; n = n->next) {
-               sql_exp *e = n->data;
-               has_nil |= has_nil(e);
-       }
+
+       if (exps)
+               for (node *n = exps->h; n && !has_nil; n = n->next) {
+                       sql_exp *e = n->data;
+                       has_nil |= has_nil(e);
+               }
        return has_nil;
 }
 
@@ -1343,14 +1359,13 @@ exps_any_match(list *l, sql_exp *e)
 static int
 exps_are_joins( list *l )
 {
-       node *n;
-
-       for (n = l->h; n; n = n->next) {
-               sql_exp *e = n->data;
-
-               if (exp_is_join_exp(e))
-                       return -1;
-       }
+       if (l)
+               for (node *n = l->h; n; n = n->next) {
+                       sql_exp *e = n->data;
+
+                       if (exp_is_join_exp(e))
+                               return -1;
+               }
        return 0;
 }
 
@@ -2095,11 +2110,10 @@ exp_rel_label(mvc *sql, sql_exp *e)
 int
 exps_are_atoms( list *exps)
 {
-       node *n;
        int atoms = 1;
-
-       for(n=exps->h; n && atoms; n=n->next)
-               atoms &= exp_is_atom(n->data);
+       if (exps)
+               for(node *n=exps->h; n && atoms; n=n->next)
+                       atoms &= exp_is_atom(n->data);
        return atoms;
 }
 
@@ -2398,9 +2412,8 @@ exps_card( list *l )
 void
 exps_fix_card( list *exps, unsigned int card)
 {
-       node *n;
-
-       for (n = exps->h; n; n = n->next) {
+       if (exps)
+               for (node *n = exps->h; n; n = n->next) {
                sql_exp *e = n->data;
 
                if (e && e->card > card)
@@ -2411,27 +2424,25 @@ exps_fix_card( list *exps, unsigned int 
 void
 exps_setcard( list *exps, unsigned int card)
 {
-       node *n;
-
-       for (n = exps->h; n; n = n->next) {
-               sql_exp *e = n->data;
-
-               if (e && e->card != CARD_ATOM)
-                       e->card = card;
-       }
+       if (exps)
+               for (node *n = exps->h; n; n = n->next) {
+                       sql_exp *e = n->data;
+
+                       if (e && e->card != CARD_ATOM)
+                               e->card = card;
+               }
 }
 
 int
 exps_intern(list *exps)
 {
-       node *n;
-
-       for (n=exps->h; n; n = n->next) {
-               sql_exp *e = n->data;
-
-               if (is_intern(e))
-                       return 1;
-       }
+       if (exps)
+               for (node *n=exps->h; n; n = n->next) {
+                       sql_exp *e = n->data;
+
+                       if (is_intern(e))
+                               return 1;
+               }
        return 0;
 }
 
@@ -2485,16 +2496,16 @@ is_identity( sql_exp *e, sql_rel *r)
 list *
 exps_alias(mvc *sql, list *exps)
 {
-       node *n;
        list *nl = new_exp_list(sql->sa);
 
-       for (n = exps->h; n; n = n->next) {
-               sql_exp *e = n->data, *ne;
-
-               assert(exp_name(e));
-               ne = exp_ref(sql, e);
-               append(nl, ne);
-       }
+       if (exps)
+               for (node *n = exps->h; n; n = n->next) {
+                       sql_exp *e = n->data, *ne;
+
+                       assert(exp_name(e));
+                       ne = exp_ref(sql, e);
+                       append(nl, ne);
+               }
        return nl;
 }
 
@@ -2707,14 +2718,13 @@ exp_aggr_is_count(sql_exp *e)
 void
 exps_reset_freevar(list *exps)
 {
-       node *n;
-
-       for(n=exps->h; n; n=n->next) {
-               sql_exp *e = n->data;
-
-               /*later use case per type */
-               reset_freevar(e);
-       }
+       if (exps)
+               for(node *n=exps->h; n; n=n->next) {
+                       sql_exp *e = n->data;
+
+                       /*later use case per type */
+                       reset_freevar(e);
+               }
 }
 
 int
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
@@ -166,14 +166,14 @@ project (
 % .plan # table_name
 % rel # name
 % clob # type
-% 67 # length
+% 80 # length
 project (
 | group by (
 | | project (
 | | | table(sys.dummyme) [ "dummyme"."a" NOT NULL HASHCOL  ] COUNT 
-| | ) [ sys.abs("dummyme"."a" NOT NULL HASHCOL ) as "%2"."%2" ]
-| ) [  ] [ sys.count unique  no nil ("%2"."%2") as "%1"."%1" ]
-) [ "%1"."%1" ]
+| | ) [ sys.abs("dummyme"."a" NOT NULL HASHCOL ) NOT NULL as "%2"."%2" ]
+| ) [  ] [ sys.count unique  no nil ("%2"."%2" NOT NULL) NOT NULL as "%1"."%1" 
]
+) [ "%1"."%1" NOT NULL ]
 #ROLLBACK;
 
 # 15:20:15 >  
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to