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

Reply via email to