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