Changeset: edfb0c2cc965 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=edfb0c2cc965
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_select.c
Branch: properties
Log Message:

Optimize count(nonil) -> count(*) window function


diffs (36 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
@@ -380,6 +380,8 @@ exp_rank_op( sql_allocator *sa, list *l,
        e->l = l;
        e->r = append(append(sa_list(sa), gbe), obe);
        e->f = f;
+       if (!f->func->s && strcmp(f->func->base.name, "count") == 0)
+               set_has_no_nil(e);
        return e;
 }
 
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
@@ -4755,13 +4755,19 @@ rel_rankop(sql_query *query, sql_rel **r
                                append(fargs, exp_atom_bool(sql->sa, 1)); /* 
ignore nills */
                }
 
-               if (!nfargs) { /* count(*) */
+               /* count(*), also optimize count(nonil) -> count(*) */
+               if (!nfargs || (strcmp(aname, "count") == 0 && !distinct && 
nfargs == 1 && !has_nil((sql_exp*)fargs->h->data))) {
                        if (window_function->token == SQL_AGGR && strcmp(aname, 
"count") != 0) {
                                char *uaname = SA_NEW_ARRAY(sql->ta, char, 
strlen(aname) + 1);
                                return sql_error(sql, 02, SQLSTATE(42000) "%s: 
unable to perform '%s(*)'", toUpperCopy(uaname, aname), aname);
                        }
                        sql_subfunc *star = sql_bind_func(sql->sa, s, "star", 
NULL, NULL, F_FUNC);
                        in = exp_op(sql->sa, NULL, star);
+                       if (nfargs) { /* doing count(nonil) -> count(*) 
optimization, remove the current argument list */
+                               assert(list_length(fargs) == 2);
+                               list_remove_node(fargs, fargs->h);
+                               list_remove_node(fargs, fargs->h);
+                       }
                        append(fargs, in);
                        append(fargs, exp_atom_bool(sql->sa, 0)); /* don't 
ignore nills */
                }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to