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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list