Changeset: f21e366c7274 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f21e366c7274
Modified Files:
sql/rel.txt
sql/server/rel_dump.c
sql/server/rel_optimizer.c
sql/server/rel_rel.c
sql/server/rel_rel.h
sql/server/rel_select.c
sql/server/rel_select.h
Branch: default
Log Message:
cleanup deadcode removal for table functions
diffs (179 lines):
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -5,12 +5,14 @@ BASETABLE
-> l (sql_table)
TABLE (card MULTI)
- -> flags (1) TABLE query
- (2) RELATIONAL subquery (ie wrap function around
subquery)
+ -> flags 0 or 1 (1 has input relation)
+ cases
+ TABLE producing function
+ RELATIONAL subquery which is dynamically wrapped
+ into function call (needed of remote calls)
-> exps is list of column expressions (also used for aliases)
-> l optional input relation
- -> r (1) table function expression
- (2) list of input expressions
+ -> r table function expression
/* Wrapping relational operator, is a big complex top level only
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -360,7 +360,7 @@ rel_print_(mvc *sql, stream *fout, sql_
if (rel->r)
exp_print(sql, fout, rel->r, depth, 1, 0);
if (rel->l)
- rel_print_(sql, fout, rel->l, 0, refs, decorate);
+ rel_print_(sql, fout, rel->l, depth+1, refs, decorate);
if (rel->exps)
exps_print(sql, fout, rel->exps, depth, 1, 0);
break;
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
@@ -5348,18 +5348,26 @@ exps_mark_used(sql_allocator *sa, sql_re
}
}
+static void exps_used(list *l);
+
+static void
+exp_used(sql_exp *e)
+{
+ if (e) {
+ e->used = 1;
+ if ((e->type == e_func || e->type == e_aggr) && e->l)
+ exps_used(e->l);
+ }
+}
+
static void
exps_used(list *l)
{
- node *n;
-
if (l) {
- for (n = l->h; n; n = n->next) {
- sql_exp *e = n->data;
-
- if (e)
- e->used = 1;
- }
+ node *n;
+
+ for (n = l->h; n; n = n->next)
+ exp_used(n->data);
}
}
@@ -5374,6 +5382,8 @@ rel_used(sql_rel *rel)
} else if (is_topn(rel->op) || is_select(rel->op) ||
is_sample(rel->op)) {
rel_used(rel->l);
rel = rel->l;
+ } else if (rel->op == op_table && rel->r) {
+ exp_used(rel->r);
}
if (rel->exps) {
exps_used(rel->exps);
@@ -5393,6 +5403,13 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
switch(rel->op) {
case op_basetable:
case op_table:
+
+ if (rel->op == op_table && rel->l) {
+ rel_used(rel);
+ if (rel->r)
+ exp_mark_used(rel->l, rel->r);
+ rel_mark_used(sql, rel->l, proj);
+ }
break;
case op_topn:
@@ -5603,6 +5620,8 @@ rel_dce_down(mvc *sql, sql_rel *rel, lis
case op_basetable:
case op_table:
+ if (skip_proj && rel->l && rel->op == op_table)
+ rel->l = rel_dce_down(sql, rel->l, refs, 0);
if (!skip_proj)
rel_dce_sub(sql, rel, refs);
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -715,6 +715,21 @@ rel_relational_func(sql_allocator *sa, s
return rel;
}
+sql_rel *
+rel_table_func(sql_allocator *sa, sql_rel *l, sql_exp *f, list *exps, int kind)
+{
+ sql_rel *rel = rel_create(sa);
+
+ rel->flag = kind;
+ rel->l = l; /* relation before call */
+ rel->r = f; /* expression (table func call) */
+ rel->op = op_table;
+ rel->exps = exps;
+ rel->card = CARD_MULTI;
+ rel->nrcols = list_length(exps);
+ return rel;
+}
+
static void
exps_has_nil(list *exps)
{
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -61,6 +61,8 @@ extern sql_rel *rel_groupby(mvc *sql, sq
extern sql_rel *rel_project(sql_allocator *sa, sql_rel *l, list *e);
extern sql_rel *rel_relational_func(sql_allocator *sa, sql_rel *l, list *exps);
+extern sql_rel *rel_table_func(sql_allocator *sa, sql_rel *l, sql_exp *f, list
*exps, int kind);
+
extern list *rel_projections(mvc *sql, sql_rel *rel, const char *tname, int
settname , int intern);
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
@@ -101,21 +101,6 @@ rel_table_projections( mvc *sql, sql_rel
}
}
-sql_rel *
-rel_table_func(sql_allocator *sa, sql_rel *l, sql_exp *f, list *exps, int kind)
-{
- sql_rel *rel = rel_create(sa);
-
- rel->flag = kind;
- rel->l = l; /* relation before call */
- rel->r = f; /* expression (table func call) */
- rel->op = op_table;
- rel->exps = exps;
- rel->card = CARD_MULTI;
- rel->nrcols = list_length(exps);
- return rel;
-}
-
static sql_rel*
rel_project_exp(sql_allocator *sa, sql_exp *e)
{
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -19,9 +19,6 @@ extern sql_rel * rel_logical_exp(mvc *sq
extern sql_exp * rel_logical_value_exp(mvc *sql, sql_rel **rel, symbol *sc,
int f);
extern sql_exp *rel_column_exp(mvc *sql, sql_rel **rel, symbol *column_e, int
f);
-
-extern sql_rel *rel_table_func(sql_allocator *sa, sql_rel *l, sql_exp *f, list
*exps, int kind);
-
extern sql_exp * rel_value_exp(mvc *sql, sql_rel **rel, symbol *se, int f,
exp_kind ek);
extern sql_exp * rel_value_exp2(mvc *sql, sql_rel **rel, symbol *se, int f,
exp_kind ek, int *is_last);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list