Changeset: 6ff508039e05 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6ff508039e05
Modified Files:
sql/backends/monet5/sql_statement.c
Branch: Dec2016
Log Message:
Turn tail recursion into iteration.
diffs (170 lines):
diff --git a/sql/backends/monet5/sql_statement.c
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1022,86 +1022,93 @@ stmt_alias(sql_allocator *sa, stmt *op1,
sql_subtype *
tail_type(stmt *st)
{
- switch (st->type) {
- case st_const:
- return tail_type(st->op2);
+ for (;;) {
+ switch (st->type) {
+ case st_const:
+ st = st->op2;
+ continue;
- case st_uselect:
- case st_uselect2:
- case st_limit:
- case st_limit2:
- case st_sample:
- case st_tunion:
- case st_tdiff:
- case st_tinter:
- case st_append:
- case st_alias:
- case st_gen_group:
- case st_order:
- return tail_type(st->op1);
+ case st_uselect:
+ case st_uselect2:
+ case st_limit:
+ case st_limit2:
+ case st_sample:
+ case st_tunion:
+ case st_tdiff:
+ case st_tinter:
+ case st_append:
+ case st_alias:
+ case st_gen_group:
+ case st_order:
+ st = st->op1;
+ continue;
- case st_list:
- return tail_type(st->op4.lval->h->data);
+ case st_list:
+ st = st->op4.lval->h->data;
+ continue;
- case st_bat:
- return &st->op4.cval->type;
- case st_idxbat:
- if (hash_index(st->op4.idxval->type)) {
+ case st_bat:
+ return &st->op4.cval->type;
+ case st_idxbat:
+ if (hash_index(st->op4.idxval->type)) {
+ return sql_bind_localtype("lng");
+ } else if (st->op4.idxval->type == join_idx) {
+ return sql_bind_localtype("oid");
+ }
+ /* fall through */
+ case st_join:
+ case st_join2:
+ case st_joinN:
+ if (st->flag == cmp_project) {
+ st = st->op2;
+ continue;
+ }
+ /* fall through */
+ case st_reorder:
+ case st_group:
+ case st_result:
+ case st_tid:
+ case st_mirror:
+ return sql_bind_localtype("oid");
+ case st_table_clear:
return sql_bind_localtype("lng");
- } else if (st->op4.idxval->type == join_idx) {
- return sql_bind_localtype("oid");
+
+ case st_aggr: {
+ list *res = st->op4.aggrval->res;
+
+ if (res && list_length(res) == 1)
+ return res->h->data;
+
+ } return NULL;
+ case st_Nop: {
+ list *res = st->op4.funcval->res;
+
+ if (res && list_length(res) == 1)
+ return res->h->data;
+ return NULL;
}
- /* fall through */
- case st_join:
- case st_join2:
- case st_joinN:
- if (st->flag == cmp_project)
- return tail_type(st->op2);
- /* fall through */
- case st_reorder:
- case st_group:
- case st_result:
- case st_tid:
- case st_mirror:
- return sql_bind_localtype("oid");
- case st_table_clear:
- return sql_bind_localtype("lng");
-
- case st_aggr: {
- list *res = st->op4.aggrval->res;
-
- if (res && list_length(res) == 1)
- return res->h->data;
-
- } break;
- case st_Nop: {
- list *res = st->op4.funcval->res;
-
- if (res && list_length(res) == 1)
- return res->h->data;
- } break;
- case st_atom:
- return atom_type(st->op4.aval);
- case st_convert:
- return st->op4.lval->t->data;
- case st_temp:
- case st_single:
- case st_rs_column:
- return &st->op4.typeval;
- case st_var:
- if (st->op4.typeval.type)
+ case st_atom:
+ return atom_type(st->op4.aval);
+ case st_convert:
+ return st->op4.lval->t->data;
+ case st_temp:
+ case st_single:
+ case st_rs_column:
return &st->op4.typeval;
- /* fall through */
- case st_exception:
- return NULL;
- case st_table:
- return sql_bind_localtype("bat");
- default:
- fprintf(stderr, "missing tail type %u: %s\n", st->type,
st_type2string(st->type));
- assert(0);
- return NULL;
+ case st_var:
+ if (st->op4.typeval.type)
+ return &st->op4.typeval;
+ /* fall through */
+ case st_exception:
+ return NULL;
+ case st_table:
+ return sql_bind_localtype("bat");
+ default:
+ fprintf(stderr, "missing tail type %u: %s\n", st->type,
st_type2string(st->type));
+ assert(0);
+ return NULL;
+ }
}
- return NULL;
}
int
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list