Changeset: 5146fcde2ec8 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5146fcde2ec8
Modified Files:
        sql/server/rel_select.c
Branch: sciql
Log Message:

More controled hackes in Part 2 SciQL group by

- build the list of types of args to the array_t'AGGR' func "by hand", since 
the exp of 'array_series1' has as type "bat"
- wipe out more (all?) traces of the AGGR sql_rel


diffs (75 lines):

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
@@ -3893,6 +3893,7 @@ rel_nop(mvc *sql, sql_rel **rel, symbol 
  * | ) [ L6 ]                                                                  
                        |
  * 
+---------------------------------------------------------------------------------------------------+
  */
+#define new_subtype_list(sa) list_new(sa)
 static sql_exp *
 _rel_tiling_aggr(mvc *sql, sql_rel **rel, sql_rel *groupby, int distinct, char 
*aggrstr, symbol *sym, int f)
 {
@@ -3900,7 +3901,7 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel
        sql_exp **os_sta = NULL, **os_ste = NULL, **os_sto = NULL, **nrep = 
NULL, **ngrp = NULL;
        sql_subfunc *sf = NULL;
        sql_subtype st_int, st_flt;
-       list *arrg_args = new_exp_list(sql->sa);
+       list *aggr_args = new_exp_list(sql->sa), *aggr_types = 
new_subtype_list(sql->sa);
        char *aggrstr2 = SA_NEW_ARRAY(sql->sa, char, strlen("array_t") + 
strlen(aggrstr) + 1);
        node *cn = NULL;
        sql_table *t = (sql_table*)((sql_rel*)groupby->l)->l;
@@ -3923,7 +3924,9 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel
                if(sym->token != SQL_COLUMN) {
                        return sql_error(sql, 02, "SELECT: expressions other 
than <column name> not supported in tiling ranges");
                }
-               append(arrg_args, rel_column_ref(sql, rel, sym, f));
+               exp = rel_column_ref(sql, rel, sym, f);
+               append(aggr_args, exp);
+               append(aggr_types, exp_subtype(exp));
        }
 
        dim    = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims);
@@ -4020,7 +4023,7 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel
        }
        /* finally, we build a list of args 'srs_args' with all parameters to
         * 'array_series1' to compute the materialised offsets 'oss' for each
-        * dimension, then we append all args to 'arrg_ags' for the SciQL AGGR
+        * dimension, then we append all args to 'aggr_ags' for the SciQL AGGR
         * functions. */
        for (i = 0; i < t->ndims; i++) {
                list *srs_args = new_exp_list(sql->sa);
@@ -4032,16 +4035,27 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel
                if(!(sf = sql_bind_func_(sql->sa, sql->session->schema, 
"array_series1", exps_subtype(srs_args), F_FUNC)))
                        return sql_error(sql, 02, "failed to bind to the SQL 
function \"array_series1\"");
 
-               append(arrg_args, dim[i]);
-               append(arrg_args, exp_op(sql->sa, srs_args, sf));
-               append(arrg_args, exp_atom_int(sql->sa, dsize[i]));
-       }
-       if(!(sf = sql_bind_func_(sql->sa, sql->session->schema, aggrstr2, 
exps_subtype(arrg_args), F_FUNC)))
+               append(aggr_args, dim[i]);
+               append(aggr_types, exp_subtype(dim[i]));
+
+               /* have to build the list of types "by hand", since the call to
+                * 'array_series1' is of the type "bat", which causes the
+                * sql_bind_func_ below to fail */
+               append(aggr_args, exp_op(sql->sa, srs_args, sf));
+               append(aggr_types, exp_subtype(os_sta[i]));
+               
+               exp = exp_atom_int(sql->sa, dsize[i]);
+               append(aggr_args, exp);
+               append(aggr_types, exp_subtype(exp));
+       }
+       if(!(sf = sql_bind_func_(sql->sa, sql->session->schema, aggrstr2, 
aggr_types, F_FUNC)))
                return sql_error(sql, 02, "failed to bind to the SQL function 
\"%s\"", aggrstr2);
-       exp = exp_op(sql->sa, arrg_args, sf);
-       /* HACK: secretly change the groupby into a project */
+       exp = exp_op(sql->sa, aggr_args, sf);
+       /* HACK: secretly change the groupby into a project, and wipe out all 
traces of the AGGR */
        groupby->op = op_project;
        groupby->r = NULL;
+       groupby->card = CARD_MULTI;
+       (*rel)->card = CARD_MULTI;
        rel_project_add_exp(sql, groupby, exp);
        return exp;
 }
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to