Changeset: 60a582f862fd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=60a582f862fd
Modified Files:
        sql/server/rel_select.c
Branch: SciQL-2
Log Message:

some checks + one fix

- give a meaningful error if a tiled dimension not exist
- check all tiling ranges are applied on one array
- fixed a crash in get_base_name: it's incorrect to initialise 'n' with
  'rel->exps->h', since 'rel->exps' doesn't always exist (e.g., when 'rel' is a
  join).


diffs (132 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
@@ -501,7 +501,7 @@ static char *
 get_base_name(sql_rel *rel, char *alias)
 {
        char *bnm = NULL;
-       node *n = rel->exps->h;
+       node *n = NULL;
 
        if (!rel || !alias)
                return NULL;
@@ -538,13 +538,12 @@ get_base_name(sql_rel *rel, char *alias)
                break;
        }
 
-       if (bnm)
-               return bnm;
-
-       for ( ; n; n = n->next) {
-               bnm = _get_base_name(n->data, alias);
-               if (bnm)
-                       return bnm;
+       if (!bnm && rel->exps) {
+               for (n = rel->exps->h; n; n = n->next) {
+                       bnm = _get_base_name(n->data, alias);
+                       if (bnm)
+                               return bnm;
+               }
        }
 
        return bnm;
@@ -2208,22 +2207,25 @@ rel_column_ref(mvc *sql, sql_rel **rel, 
 }
 
 static sql_exp *
-_get_tiled_dimension(mvc *sql, list *exps, symbol *dim_ref)
+_get_tiled_dimension(mvc *sql, list *exps, symbol *dim_ref, str aname)
 {
        sql_exp *e = NULL;
        node *n = exps->h;
+       str dname = dim_ref->data.lval->h->data.sval;
        
        if (dlist_length(dim_ref->data.lval) != 1)
                return sql_error(sql, 02, "SELECT: invalid dimension name with 
%d (!= 1) level(s)", dlist_length(dim_ref->data.lval));  
+       if (dname == NULL)
+               return sql_error(sql, 02, "SELECT: dimension name missing in 
tiling range");
 
        for ( ; n; n = n->next) {
                e = n->data;
                assert(e->type == e_column);
 
-               if (e->name && dim_ref->data.lval->h->data.sval && 
strcmp(exp_name(e), dim_ref->data.lval->h->data.sval) == 0)
+               if (e->name && strcmp(exp_name(e), dname) == 0)
                        return e;
        }
-       return NULL;
+       return sql_error(sql, 02, "SELECT: no such dimension \"%s.%s\"", aname, 
dname); 
 }
 
 static int
@@ -2252,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)
+rel_arraytiling(mvc *sql, sql_rel **rel, symbol *tile_def, int f, str *aname)
 {
        list *exps = new_exp_list(sql->sa), *offsets = NULL;
        node *n = NULL;
@@ -2292,9 +2294,17 @@ rel_arraytiling(mvc *sql, sql_rel **rel,
                return sql_error(sql, 02, "SELECT: no such array '%s.%s'", 
(cur_schema(sql))->base.name, aalias);
        }
        a = rbt->l;
+       if (a->valence == 0)
+               return sql_error(sql, 02, "SELECT: tiling over a relational 
table (\"%s\")not allowed", aalias);
        if (a->valence > ARRAY_TILING_MAX_DIMS)
                return sql_error(sql, 02, "TODO: tiling over arrays with >%d 
dimensions", ARRAY_TILING_MAX_DIMS);
 
+       if (*aname != NULL && strcmp(*aname, aalias) != 0) {
+               return sql_error(sql, 02, "SELECT: tiling over multiple arrays 
not supported (yet)");
+       } else {
+               *aname = aalias;
+       }
+
        idx_exps = tile_def->data.lval->h->next->data.lval;
        if (dlist_length(idx_exps) > a->valence)
                return sql_error(sql, 02, "SELECT: #dimensions (%d) in array 
tiling larger than #dimensions (%d) in the array", dlist_length(idx_exps), 
a->valence);
@@ -2330,7 +2340,7 @@ rel_arraytiling(mvc *sql, sql_rel **rel,
                 */
                switch (sym_tsta->token) {
                        case SQL_COLUMN: /* '<column>' */
-                               if (!(exp = _get_tiled_dimension(sql, exps, 
sym_tsta)))
+                               if (!(exp = _get_tiled_dimension(sql, exps, 
sym_tsta, aalias)))
                                        return NULL;
                                d_rng = 
list_length(((list*)exp->f)->h->next->data) ? ((list*)exp->f)->h->next->data : 
((list*)exp->f)->h->data;
 
@@ -2346,7 +2356,7 @@ rel_arraytiling(mvc *sql, sql_rel **rel,
                                opr = 
sym_tsta->data.lval->h->next->next->data.sym;
                                /* the <exp> could also be a SQL_COLUMN, but 
then opl->data.sym->data.lval->h->type == type_int */
                                if (opl->token == SQL_COLUMN && 
opl->data.lval->h->type == type_string) { /* '<column> +/- <exp>' */
-                                       if (!(exp = _get_tiled_dimension(sql, 
exps, opl)))
+                                       if (!(exp = _get_tiled_dimension(sql, 
exps, opl, aalias)))
                                                return NULL;
                                        d_rng = 
list_length(((list*)exp->f)->h->next->data) ? ((list*)exp->f)->h->next->data : 
((list*)exp->f)->h->data;
                                        st = exp_subtype(d_rng->h->data);
@@ -4904,6 +4914,7 @@ rel_group_by(mvc *sql, sql_rel *rel, sym
        dnode *o = groupby->data.lval->h;
        list *exps = new_exp_list(sql->sa);
        int found_ngb = 0, found_sgb = 0;
+       str aname = NULL;
 
        for (; o; o = o->next) {
                symbol *grp = o->data.sym;
@@ -4911,7 +4922,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)))
+                       if (!(es = rel_arraytiling(sql, &rel, grp, f, &aname)))
                                return NULL;
                        /* FIXME: shouldn't we do the same error checks as the 
case of normal GROUP BY below? */
                        exps = list_merge(exps, es, (fdup)NULL);
@@ -4948,8 +4959,6 @@ rel_group_by(mvc *sql, sql_rel *rel, sym
        }
        if (found_ngb && found_sgb)
                return sql_error(sql, 02, "SELECT: combination of normal SQL 
group by and SciQL array tiling not supported yet\n");
-       if (found_sgb > 1)
-               return sql_error(sql, 02, "SELECT: array tiling over multiple 
arrays not supported yet\n");
        return exps;
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to