Changeset: 24d7939233f4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/24d7939233f4
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_rank.c
        sql/backends/monet5/sql_rank.h
        sql/common/sql_types.c
        sql/server/rel_optimizer.c
        sql/server/sql_semantic.c
Branch: scatter
Log Message:

use simple single function count(*) on basetables


diffs (120 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -5465,6 +5465,7 @@ static mel_func sql_init_funcs[] = {
  pattern("batsql", "min", SQLmin, false, "return the minimum of groups", 
args(1,7, 
batargany("",1),batargany("b",1),argany("p",0),argany("o",0),arg("t",int),argany("s",0),argany("e",0))),
  pattern("sql", "max", SQLmax, false, "return the maximum of groups", 
args(1,7, 
argany("",1),argany("b",1),arg("p",bit),arg("o",bit),arg("t",int),arg("s",oid),arg("e",oid))),
  pattern("batsql", "max", SQLmax, false, "return the maximum of 
groups",args(1,7, 
batargany("",1),batargany("b",1),argany("p",0),argany("o",0),arg("t",int),argany("s",0),argany("e",0))),
+ pattern("sql", "count", SQLbasecount, false, "return count of basetable", 
args(1,3, arg("",lng),arg("sname",str),arg("tname",str))),
  pattern("sql", "count", SQLcount, false, "return count of groups", args(1,8, 
arg("",lng),argany("b",1),arg("ignils",bit),arg("p",bit),arg("o",bit),arg("t",int),arg("s",oid),arg("e",oid))),
  pattern("batsql", "count", SQLcount, false,"return count of groups",args(1,8, 
batarg("",lng),batargany("b",1),arg("ignils",bit),argany("p",0),argany("o",0),arg("t",int),argany("s",0),argany("e",0))),
  pattern("sql", "sum", SQLsum, false, "return the sum of groups", args(1,7, 
arg("",lng),arg("b",bte),arg("p",bit),arg("o",bit),arg("t",int),arg("s",oid),arg("e",oid))),
diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -1202,6 +1202,30 @@ SQLmax(Client cntxt, MalBlkPtr mb, MalSt
 }
 
 str
+SQLbasecount(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       lng *res = getArgReference_lng(stk, pci, 0);
+       str sname = *getArgReference_str(stk, pci, 1);
+       str tname = *getArgReference_str(stk, pci, 2);
+       mvc *m = NULL;
+       str msg;
+
+       if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
+               return msg;
+       if ((msg = checkSQLContext(cntxt)) != NULL)
+               return msg;
+       sql_schema *s = mvc_bind_schema(m, sname);
+       sql_table *t = s?mvc_bind_table(m, s, tname):NULL;
+       if (!t || !isTable(t) || isMergeTable(t) || isReplicaTable(t))
+               return createException(SQL, "sql.count", SQLSTATE(HY005) 
"Cannot find table %s.%s", sname, tname);
+       sql_column *c = ol_first_node(t->columns)->data;
+       sqlstore *store = m->session->tr->store;
+
+       *res = store->storage_api.count_col(m->session->tr, c, 0) - 
store->storage_api.count_del(m->session->tr, t, 0);
+       return msg;
+}
+
+str
 SQLcount(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        BAT *r = NULL, *b = NULL, *p = NULL, *o = NULL, *s = NULL, *e = NULL;
diff --git a/sql/backends/monet5/sql_rank.h b/sql/backends/monet5/sql_rank.h
--- a/sql/backends/monet5/sql_rank.h
+++ b/sql/backends/monet5/sql_rank.h
@@ -32,6 +32,7 @@ extern str SQLnth_value(Client cntxt, Ma
 /* aggregates */
 extern str SQLmin(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 extern str SQLmax(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
+extern str SQLbasecount(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 extern str SQLcount(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 extern str SQLsum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 extern str SQLprod(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1050,6 +1050,7 @@ sqltypeinit( sql_allocator *sa)
 
        sql_create_aggr(sa, "count_no_nil", "aggr", "count_no_nil", TRUE, LNG, 
0);
        sql_create_aggr(sa, "count", "aggr", "count", TRUE, LNG, 1, ANY);
+       sql_create_func(sa, "cnt", "sql", "count", TRUE, FALSE, SCALE_FIX, 0, 
LNG, 2, STR, STR);
 
        for (t = strings; t < numerical; t++) {
                sql_create_aggr(sa, "listagg", "aggr", "str_group_concat", 
TRUE, *t, 1, *t);
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
@@ -9652,6 +9652,30 @@ rel_optimize_unions_topdown(visitor *v, 
 }
 
 static sql_rel *
+rel_basecount(visitor *v, sql_rel *rel)
+{
+       if (is_groupby(rel->op) && rel->l && !rel->r && list_length(rel->exps) 
== 1 && exp_aggr_is_count(rel->exps->h->data)) {
+               sql_rel *bt = rel->l;
+               sql_exp *e = rel->exps->h->data;
+               if (is_basetable(bt->op) && !e->l) { /* count(*) */
+                       /* change into select cnt('schema','table') */;
+                       sql_table *t = bt->l;
+                       sql_subfunc *cf = sql_bind_func(v->sql, "sys", "cnt", 
sql_bind_localtype("str"), sql_bind_localtype("str"), F_FUNC);
+                       list *exps = sa_list(v->sql->sa);
+                       append(exps, exp_atom_str(v->sql->sa, t->s->base.name, 
sql_bind_localtype("str")));
+                       append(exps, exp_atom_str(v->sql->sa, t->base.name, 
sql_bind_localtype("str")));
+                       sql_exp *ne = exp_op(v->sql->sa, exps, cf);
+
+                       ne = exp_propagate(v->sql->sa, ne, e);
+                       exp_setname(v->sql->sa, ne, exp_find_rel_name(e), 
exp_name(e));
+                       return rel_project(v->sql->sa, NULL, 
append(sa_list(v->sql->sa), ne));
+               }
+               return rel;
+       }
+       return rel;
+}
+
+static sql_rel *
 rel_optimize_projections(visitor *v, sql_rel *rel)
 {
        rel = rel_project_cse(v, rel);
@@ -9665,6 +9689,7 @@ rel_optimize_projections(visitor *v, sql
        rel = rel_reduce_groupby_exps(v, rel);
        rel = rel_groupby_distinct(v, rel);
        rel = rel_push_count_down(v, rel);
+       rel = rel_basecount(v, rel);
        return rel;
 }
 
diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -622,6 +622,7 @@ os_bind_func_result_internal(mvc *sql, s
        }
        return NULL;
 }
+
 #define sql_bind_func_result_extra \
        do { \
                if (!res && (res = sql_bind_func_result_internal(sql, funcs, 
name, type, ops, r_res))) /* search system wide functions first */ \
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to