Changeset: 4219874a3be9 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4219874a3be9 Modified Files: sql/server/rel_select.c Branch: sciql Log Message:
Some progress again in Part 2 of SciQL GROUP BY Instead of using ATOMs, build sql_exp-s to dynamically compute the GROUP BY offsets diffs (190 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 @@ -3868,10 +3868,6 @@ rel_nop(mvc *sql, sql_rel **rel, symbol return sql_error(sql, 02, "SELECT: no such operator '%s'", fname); } -#define GET_DIM_SZ(tpe,sta,ste,sto) \ - ceil((*(tpe *)VALget(&sto->data) * 1.0 - *(tpe *)VALget(&sta->data)) / \ - *(tpe *)VALget(&ste->data)); - /* E.g.: * sql> plan select sum(v) from a group by a[x-1:x+2][y-1:y+2]; * @@ -3901,14 +3897,14 @@ static sql_exp * _rel_tiling_aggr(mvc *sql, sql_rel **rel, sql_rel *groupby, int distinct, char *aggrstr, symbol *sym, int f) { sql_exp *exp = NULL, **dim = NULL, **oss = NULL; - atom **os_sta = NULL, **os_ste = NULL, **os_sto = NULL; + 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); 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; - int i = 0, j = 0, cnt = 0, *nrep = NULL, *ngrp = NULL; - lng *dsize = NULL; + int i = 0, j = 0, *dsize = NULL; sql_column *sc = NULL; (void)distinct; @@ -3931,11 +3927,11 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel } dim = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims); - os_sta = SA_NEW_ARRAY(sql->sa, atom*, t->ndims); - os_ste = SA_NEW_ARRAY(sql->sa, atom*, t->ndims); - os_sto = SA_NEW_ARRAY(sql->sa, atom*, t->ndims); + os_sta = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims); + os_ste = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims); + os_sto = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims); oss = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims); - dsize = SA_NEW_ARRAY(sql->sa, lng, t->ndims); + dsize = SA_NEW_ARRAY(sql->sa, int, t->ndims); if (!dim || !os_sta || !os_ste || !os_sto || !oss || !dsize) { return sql_error(sql, 02, "SELECT: failed to allocate space"); } @@ -3945,10 +3941,9 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel atom *d_sta = NULL, *d_ste = NULL, *d_sto = NULL; dim[i] = cn->data; - /* TODO: check if os_st{a,e,o}[i]->{l,r,f} == NULL */ - os_sta[i] = sql_bind_arg(sql, ((sql_exp*)((list*)dim[i]->f)->h->data)->flag); - os_ste[i] = sql_bind_arg(sql, ((sql_exp*)((list*)dim[i]->f)->h->next->data)->flag); - os_sto[i] = sql_bind_arg(sql, ((sql_exp*)((list*)dim[i]->f)->h->next->next->data)->flag); + os_sta[i] = (sql_exp*)((list*)dim[i]->f)->h->data; + os_ste[i] = (sql_exp*)((list*)dim[i]->f)->h->next->data; + os_sto[i] = (sql_exp*)((list*)dim[i]->f)->h->next->next->data; /* immediately compute the |dim[i]| */ if (!(sc = get_dimension(sql, t, dim[i]->name))) { @@ -3960,23 +3955,23 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel d_sto = atom_general(sql->sa, &sc->type, sc->dim->stop); switch(d_sto->data.vtype){ case TYPE_bte: - dsize[i] = GET_DIM_SZ(bte, d_sta, d_ste, d_sto); + dsize[i] = ceil((*(bte *)VALget(&d_sto->data) * 1.0 - *(bte *)VALget(&d_sta->data)) / *(bte *)VALget(&d_ste->data)); break; case TYPE_sht: - dsize[i] = GET_DIM_SZ(sht, d_sta, d_ste, d_sto); + dsize[i] = ceil((*(sht *)VALget(&d_sto->data) * 1.0 - *(sht *)VALget(&d_sta->data)) / *(sht *)VALget(&d_ste->data)); break; case TYPE_int: - dsize[i] = GET_DIM_SZ(int, d_sta, d_ste, d_sto); + dsize[i] = ceil((*(int *)VALget(&d_sto->data) * 1.0 - *(int *)VALget(&d_sta->data)) / *(int *)VALget(&d_ste->data)); break; case TYPE_lng: - dsize[i] = GET_DIM_SZ(lng, d_sta, d_ste, d_sto); + dsize[i] = ceil((*(lng *)VALget(&d_sto->data) * 1.0 - *(lng *)VALget(&d_sta->data)) / *(lng *)VALget(&d_ste->data)); break; case TYPE_flt: - dsize[i] = GET_DIM_SZ(flt, d_sta, d_ste, d_sto); + dsize[i] = ceil((*(flt *)VALget(&d_sto->data) * 1.0 - *(flt *)VALget(&d_sta->data)) / *(flt *)VALget(&d_ste->data)); return sql_error(sql, 02, "SELECT: unsupported data type \"%s\" of tiling dimension", sc->type.type->sqlname); break; case TYPE_dbl: - dsize[i] = GET_DIM_SZ(dbl, d_sta, d_ste, d_sto); + dsize[i] = ceil((*(dbl *)VALget(&d_sto->data) * 1.0 - *(dbl *)VALget(&d_sta->data)) / *(dbl *)VALget(&d_ste->data)); return sql_error(sql, 02, "SELECT: unsupported data type \"%s\" of tiling dimension", sc->type.type->sqlname); break; default: /* should not reach here */ @@ -3984,40 +3979,44 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel } } - /* compute the repeatings, see the formula in rel_schema.c */ - nrep = SA_NEW_ARRAY(sql->sa, int, t->ndims); - ngrp = SA_NEW_ARRAY(sql->sa, int, t->ndims); + /* Compute the repeatings, see the formula in rel_schema.c. + * The parameters of array_series1() are dynamically computed by the sql_exp-s. + */ + nrep = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims); + ngrp = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims); if(!nrep || !ngrp) { return sql_error(sql, 02, "SELECT: failed to allocate space"); } - for(i = 0; i < t->ndims; i++) nrep[i] = ngrp[i] = 1; + sql_find_subtype(&st_int, "int", 9, 0); + sql_find_subtype(&st_flt, "double", 23, 0); + for(i = 0; i < t->ndims; i++) nrep[i] = ngrp[i] = exp_atom_int(sql->sa, 1); for (i = 0; i < t->ndims; i++){ - switch(os_sta[i]->data.vtype){ - case TYPE_bte: - cnt = GET_DIM_SZ(bte, os_sta[i], os_ste[i], os_sto[i]); - break; - case TYPE_sht: - cnt = GET_DIM_SZ(sht, os_sta[i], os_ste[i], os_sto[i]); - break; - case TYPE_int: - cnt = GET_DIM_SZ(int, os_sta[i], os_ste[i], os_sto[i]); - break; - case TYPE_lng: - cnt = GET_DIM_SZ(lng, os_sta[i], os_ste[i], os_sto[i]); - break; - case TYPE_flt: - cnt = GET_DIM_SZ(flt, os_sta[i], os_ste[i], os_sto[i]); - return sql_error(sql, 02, "SELECT: unsupported data type \"%s\" of tiling dimension", sc->type.type->sqlname); - break; - case TYPE_dbl: - cnt = GET_DIM_SZ(dbl, os_sta[i], os_ste[i], os_sto[i]); - return sql_error(sql, 02, "SELECT: unsupported data type \"%s\" of tiling dimension", sc->type.type->sqlname); - break; - default: /* should not reach here */ - return sql_error(sql, 02, "SELECT: unsupported data type \"%s\" of tiling dimension", sc->type.type->sqlname); + list *ceil_args = new_exp_list(sql->sa); + + exp = rel_check_type(sql, &st_flt, os_sto[i], type_cast); + if(!(sf = sql_bind_func(sql->sa, sql->session->schema, "sql_sub", exp_subtype(exp), exp_subtype(exp), F_FUNC))) + return sql_error(sql, 02, "failed to bind to the SQL function \"-\""); + /* FIXME: why do I need this extra rel_check_type? */ + append(ceil_args, exp_binop(sql->sa, exp, rel_check_type(sql, &st_flt, os_sta[i], type_cast), sf)); + + if(!(sf = sql_bind_func_(sql->sa, sql->session->schema, "ceil", exps_subtype(ceil_args), F_FUNC))) + return sql_error(sql, 02, "failed to bind to the SQL function \"ceil\""); + exp = rel_check_type(sql, &st_int, exp_op(sql->sa, ceil_args, sf), type_cast); + + if(!(sf = sql_bind_func(sql->sa, sql->session->schema, "sql_div", exp_subtype(exp), exp_subtype(os_ste[i]), F_FUNC))) + return sql_error(sql, 02, "failed to bind to the SQL function \"/\""); + exp = exp_binop(sql->sa, exp, os_ste[i], sf); + + for (j = 0; j < i; j++) { + if(!(sf = sql_bind_func(sql->sa, sql->session->schema, "sql_mul", exp_subtype(nrep[j]), exp_subtype(exp), F_FUNC))) + return sql_error(sql, 02, "failed to bind to the SQL function \"*\""); + nrep[j] = exp_binop(sql->sa, nrep[j], exp, sf); } - for (j = 0; j < i; j++) nrep[j] = nrep[j] * cnt; - for (j = t->ndims; j > i; j--) ngrp[j] = ngrp[j] * cnt; + for (j = t->ndims-1; j > i; j--) { + if(!(sf = sql_bind_func(sql->sa, sql->session->schema, "sql_mul", exp_subtype(ngrp[j]), exp_subtype(exp), F_FUNC))) + return sql_error(sql, 02, "failed to bind to the SQL function \"*\""); + ngrp[j] = exp_binop(sql->sa, ngrp[j], exp, sf); + } } /* finally, we build a list of args 'srs_args' with all parameters to * 'array_series1' to compute the materialised offsets 'oss' for each @@ -4025,17 +4024,17 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel * functions. */ for (i = 0; i < t->ndims; i++) { list *srs_args = new_exp_list(sql->sa); - append(srs_args, exp_atom(sql->sa, os_sta[i])); - append(srs_args, exp_atom(sql->sa, os_ste[i])); - append(srs_args, exp_atom(sql->sa, os_sto[i])); - append(srs_args, exp_atom_lng(sql->sa, nrep[i])); - append(srs_args, exp_atom_lng(sql->sa, ngrp[i])); + append(srs_args, os_sta[i]); + append(srs_args, os_ste[i]); + append(srs_args, os_sto[i]); + append(srs_args, nrep[i]); + append(srs_args, ngrp[i]); 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_lng(sql->sa, dsize[i])); + 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))) return sql_error(sql, 02, "failed to bind to the SQL function \"%s\"", aggrstr2); _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list