Changeset: 58bf720e8e67 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=58bf720e8e67 Modified Files: sql/rel.txt sql/server/rel_select.c sql/server/sql_parser.y Branch: SciQL-2 Log Message:
Fixed 'head of offset BAT ... is not aligned with head of offset BAT ...' error given for tiles with pattern like 'GROUP BY a[x][y:y+1]' (i.e., one of the dimension ranges has a single value) With the implementation of non-rectangular tiles, the offset of the 'x' dimension is generated using 'offsets()' producing a single offset, while the offsets of the 'y' dimension is generated using 'array_series1()' producing a list of offsets. Thus, the two BATs are not aligned. The currently solution is to detect if there is only one range spec., then use 'array_series1()' to generate a list of offsets for dimension 'x'. rel.txt: document the extended use of e_column->f sql_parser.y: removed the syntax for DISTINCT tiles (since we have decided to use HAVING instead), so that we can rely on the length of the data.lval of a GROUPBY symbol to detect the number of tile-range specs. diffs (122 lines): diff --git a/sql/rel.txt b/sql/rel.txt --- a/sql/rel.txt +++ b/sql/rel.txt @@ -142,12 +142,17 @@ e_column -> l optional relation name -> r expression name -> f only used by the dimensional columns of the arrays - a list of four lists, with each of them containing three expressions denoting the [start:step:stop] values + a list of four lists, with each of them containing three or more + expressions denoting the [start:step:stop] values ->h->data: the initial range of the array - ->h->next->data: for unbounded arrays, the range of the _current_ bounding box. - The same as ->h->data in case of fixed arrays. - ->h->next->next->data: the slicing range, is empty if there has been no slicing - ->h->next->next->next->data: the tiling ranges, is empty if there has been no tiling + ->h->next->data: the slicing range, is empty if there has been no slicing + ->h->next->next->data: the tiling ranges, is empty if there has been no tiling + for rectangular tiles, this is a list of three nodes, and there is no next + for non-rectangular tiles, this is a list of one node + (i.e., the single dimention value); + more point-ranges are appended after this one + (i.e., ->h->next->next->...->data), + and they are all lists of one node. -> type 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 @@ -2254,7 +2254,7 @@ static int #define ARRAY_TILING_MAX_DIMS 3 static list * -rel_arraytiling(mvc *sql, sql_rel **rel, symbol *tile_def, int f, str *aname) +rel_arraytiling(mvc *sql, sql_rel **rel, symbol *tile_def, int f, str *aname, int oneRange) { list *exps = new_exp_list(sql->sa), *offsets = NULL; node *n = NULL; @@ -2386,10 +2386,21 @@ rel_arraytiling(mvc *sql, sql_rel **rel, st = exp_subtype(d_rng->h->data); /* If a step is specified, we don't care what it exactly is, just treat - * it as an expression; otherwise get the step value from the dimension range */ - exp_os_ste = (dlist_length(dn->data.lval) == 3) ? - rel_check_type(sql, exp_subtype(d_rng->h->next->data), rel_value_exp(sql, rel, dn->data.lval->h->next->data.sym, sql_where, ek), type_cast) : - (dlist_length(dn->data.lval) == 2)? exp_copy(sql->sa, d_rng->h->next->data) : NULL; + * it as an expression; + * otherwise get the step value from the dimension range for tiling + * spec. with only one range definition. + * That is, for tiling group by such as: + * SELECT x, y, SUM(v) FROM a GROUP BY a[x][y:y+2]; + * We want to use 'array_series1' to generate a list of offsets for 'x', + * instead of using 'offsets' to generate a single value. + * This is because the impl. of tiled AGGR requires that the offsets + * lists of all columns to be aligned (i.e., have the same length). + */ + if (dlist_length(dn->data.lval) == 3) { + exp_os_ste = rel_check_type(sql, exp_subtype(d_rng->h->next->data), rel_value_exp(sql, rel, dn->data.lval->h->next->data.sym, sql_where, ek), type_cast); + } else if (dlist_length(dn->data.lval) == 2 || oneRange) { + exp_os_ste = exp_copy(sql->sa, d_rng->h->next->data); + } /* array tiling range stop, which, in case of a single <index_term>, is * just 'start+step' to make the range only include '0'. @@ -2401,7 +2412,10 @@ rel_arraytiling(mvc *sql, sql_rel **rel, * an exp_atom with "0" if not specified (case SQL_COLUMN), and * append it to 'offsets'. */ - if (dlist_length(dn->data.lval) > 1) { + if (dlist_length(dn->data.lval) == 1 && oneRange) { + exp_os_sto = exp_binop(sql->sa, exp_copy(sql->sa, exp_os_sta), exp_copy(sql->sa, exp_os_ste), + sql_bind_func(sql->sa, sql->session->schema, "sql_add", st, st, F_FUNC)); + } else if (dlist_length(dn->data.lval) > 1) { sym_tsto = (dlist_length(dn->data.lval) == 2) ? dn->data.lval->h->next->data.sym : dn->data.lval->h->next->next->data.sym; switch (sym_tsto->token) { case SQL_COLUMN: /* '<column>' */ @@ -4930,7 +4944,8 @@ add_tiling_ranges(mvc *sql, list *l, lis for (nl = l->h, nr = r->h; nl && nr; nl = nl->next, nr = nr->next) { sql_exp *cl = nl->data, *cr = nr->data; - assert(cl->type == e_column && cl->f && cr->type == e_column && cr->f); + assert(cl->type == e_column && cl->f && cr->type == e_column && cr->f && strcmp(cl->name, cr->name) ==0); + if (list_length(((list*)cr->f)->h->next->next->data) > 1) { return sql_error(sql, 02, "SELECT: array tiles with mixed point range and interval range not supported yet\n"); } @@ -4958,7 +4973,7 @@ rel_group_by(mvc *sql, sql_rel *rel, sym list *es = NULL; if (grp->token == SQL_ARRAY_DIM_SLICE) { - if (!(es = rel_arraytiling(sql, &rel, grp, f, &aname))) + if (!(es = rel_arraytiling(sql, &rel, grp, f, &aname, dlist_length(groupby->data.lval) ==1))) return NULL; /* FIXME: shouldn't we do the same error checks as the case of normal GROUP BY below? */ if (list_length(exps) == 0) { @@ -4967,13 +4982,6 @@ rel_group_by(mvc *sql, sql_rel *rel, sym exps = add_tiling_ranges(sql, exps, es); } found_sgb += 1; - if (o->next->type == type_int) { - if (o->next->data.i_val) { - /* TODO: how do we pass this information? */ - return sql_error(sql, 02, "SELECT: DISTINCT array tiles not supported yet\n"); - } - o = o->next; /* skip the node containing the DISTINCT information */ - } } else { e = rel_column_ref(sql, &rel, grp, f); diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y --- a/sql/server/sql_parser.y +++ b/sql/server/sql_parser.y @@ -3152,8 +3152,7 @@ table_name: opt_group_by_clause: /* empty */ { $$ = NULL; } | sqlGROUP BY column_ref_commalist { $$ = _symbol_create_list( SQL_GROUPBY, $3 );} - | sqlGROUP BY tiling_commalist { $$ = _symbol_create_list( SQL_GROUPBY, append_int($3,0) );} - | sqlGROUP BY DISTINCT tiling_commalist { $$ = _symbol_create_list( SQL_GROUPBY, append_int($4,1) );} + | sqlGROUP BY tiling_commalist { $$ = _symbol_create_list( SQL_GROUPBY, $3 );} ; tiling_commalist: _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list