Changeset: 4b2f8b433f71 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4b2f8b433f71
Modified Files:
        sql/rel.txt
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimizer.c
        sql/server/rel_psm.c
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/rel_updates.c
Branch: sciql
Log Message:

Extended SQL expressions of the type e_column to store (original, sliced and 
tiled) ranges of an array dimension in e->f.
See rel.txt for structure of e->f.
This extension is needed to support not persistently stored arrays, e.g., 
arrays created by subqueries, WITH clause and maybe also array returning 
functions.


diffs (truncated from 969 to 300 lines):

diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -132,10 +132,11 @@ e_column
                l,r names of refered expression
        -> l    optional relation name 
        -> r    expression name
-       -> f    only used by SciQL group by.
-                       If an array tiling involves this column, ->f is a list 
of
-                       three expressions to denote respectively the start, 
step and stop
-                       of the tiles.
+       -> f    a list of three lists of range expressions for a dimensional 
column
+                       ->h->data: a list of [orig_start:orig_step:orig_stop]
+                       ->h->next->data: a list of 
[sliced_start:sliced_step:sliced_stop],
+                               is an empty list if there is no slicing but 
structured group by.
+                       ->h->next->next->data: a list of 
[grpby_start:grpby_step:grpby_stop]
        -> type 
 
        
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -149,6 +149,21 @@ exp_print(mvc *sql, stream *fout, sql_ex
                        alias = 0;
                if (!e->rname && e->name && strcmp(e->name, e->r)==0)
                        alias = 0;
+               if (e->f) { /* the dimension constraints */
+                       /* If a slicing has been applied on this dimension, 
print the sliced range; otherwise the original range */
+                       list *range = 
((list*)e->f)->h->next?((list*)e->f)->h->next->data:((list*)e->f)->h->data;
+                       mnstr_printf(fout, "[");
+#define PRINT_DIM_CONSTRAINT(EXP, C) \
+                       if (EXP->data) \
+                         exp_print(sql, fout, (sql_exp*)EXP->data, depth, 
alias, 1); \
+                       else \
+                               mnstr_printf(fout, "*"); \
+                       mnstr_printf(fout, C);
+
+                       PRINT_DIM_CONSTRAINT(range->h, ":"); /* start */
+                       PRINT_DIM_CONSTRAINT(range->h->next, ":"); /* step */
+                       PRINT_DIM_CONSTRAINT(range->h->next->next, "]"); /* 
stop */
+               }
                break;
        case e_cmp: 
                if (e->flag == cmp_in || e->flag == cmp_notin) {
@@ -737,7 +752,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        if (!exp && rrel)
                                exp = rel_bind_column2(sql, rrel, tname, cname, 
0);
                } else {
-                       exp = exp_column(sql->sa, tname, cname, NULL, 
CARD_ATOM, 1, (strchr(cname,'%') != NULL));
+                       exp = exp_column(sql->sa, tname, cname, NULL, 
CARD_ATOM, 1, (strchr(cname,'%') != NULL), NULL);
                }
                *e = old;
                break;
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -335,7 +335,7 @@ have_nil(list *exps)
 }
 
 sql_exp * 
-exp_alias(sql_allocator *sa, char *arname, char *acname, char *org_rname, char 
*org_cname, sql_subtype *t, int card, int has_nils, int intern) 
+exp_alias(sql_allocator *sa, char *arname, char *acname, char *org_rname, char 
*org_cname, sql_subtype *t, int card, int has_nils, int intern, list *drngs) 
 {
        sql_exp *e = exp_create(sa, e_column);
 
@@ -351,11 +351,19 @@ exp_alias(sql_allocator *sa, char *arnam
                set_has_no_nil(e);
        if (intern)
                set_intern(e);
+       if (drngs) { /* dimension ranges */
+               node *n = NULL;
+
+               e->f = sa_list(sa);
+               for (n = drngs->h; n; n = n->next) {
+                       list_append(e->f, exps_copy(sa, n->data));
+               }
+       }
        return e;
 }
 
 sql_exp * 
-exp_column(sql_allocator *sa, char *rname, char *cname, sql_subtype *t, int 
card, int has_nils, int intern) 
+exp_column(sql_allocator *sa, char *rname, char *cname, sql_subtype *t, int 
card, int has_nils, int intern, list *drngs) 
 {
        sql_exp *e = exp_create(sa, e_column);
 
@@ -370,6 +378,14 @@ exp_column(sql_allocator *sa, char *rnam
                set_has_no_nil(e);
        if (intern)
                set_intern(e);
+       if (drngs) { /* dimension range */
+               node *n = NULL;
+
+               e->f = sa_list(sa);
+               for (n = drngs->h; n; n = n->next) {
+                       list_append(e->f, exps_copy(sa, n->data));
+               }
+       }
        return e;
 }
 
@@ -1265,7 +1281,7 @@ exp_copy( sql_allocator *sa, sql_exp * e
 
        switch(e->type){
        case e_column:
-               ne = exp_column(sa, e->l, e->r, exp_subtype(e), e->card, 
has_nil(e), is_intern(e));
+               ne = exp_column(sa, e->l, e->r, exp_subtype(e), e->card, 
has_nil(e), is_intern(e), e->f);
                ne->flag = e->flag;
                break;
        case e_cmp:
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -65,8 +65,8 @@ extern sql_exp * exp_values(sql_allocato
 extern list * exp_types(sql_allocator *sa, list *exps);
 extern int have_nil(list *exps);
 
-extern sql_exp * exp_column(sql_allocator *sa, char *rname, char *name, 
sql_subtype *t, int card, int has_nils, int intern);
-extern sql_exp * exp_alias(sql_allocator *sa, char *arname, char *acname, char 
*org_rname, char *org_cname, sql_subtype *t, int card, int has_nils, int 
intern);
+extern sql_exp * exp_column(sql_allocator *sa, char *rname, char *name, 
sql_subtype *t, int card, int has_nils, int intern, list *drngs);
+extern sql_exp * exp_alias(sql_allocator *sa, char *arname, char *acname, char 
*org_rname, char *org_cname, sql_subtype *t, int card, int has_nils, int 
intern, list *drngs);
 extern sql_exp * exp_set(sql_allocator *sa, char *name, sql_exp *val, int 
level);
 extern sql_exp * exp_var(sql_allocator *sa, char *name, sql_subtype *type, int 
level);
 extern sql_exp * exp_return(sql_allocator *sa, sql_exp *val, int level);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1379,7 +1379,7 @@ rel_push_func_down(int *changes, mvc *sq
                                                        append(r->exps, ne);
                                                else
                                                        append(l->exps, ne);
-                                               ne = exp_column(sql->sa, 
exp_relname(ne), exp_name(ne), exp_subtype(ne), ne->card, has_nil(ne), 
is_intern(ne));
+                                               ne = exp_column(sql->sa, 
exp_relname(ne), exp_name(ne), exp_subtype(ne), ne->card, has_nil(ne), 
is_intern(ne), ne->type == e_column?ne->f:NULL);
                                        }
                                        e->l = ne;
 
@@ -1392,7 +1392,7 @@ rel_push_func_down(int *changes, mvc *sq
                                                        append(r->exps, ne);
                                                else
                                                        append(l->exps, ne);
-                                               ne = exp_column(sql->sa, 
exp_relname(ne), exp_name(ne), exp_subtype(ne), ne->card, has_nil(ne), 
is_intern(ne));
+                                               ne = exp_column(sql->sa, 
exp_relname(ne), exp_name(ne), exp_subtype(ne), ne->card, has_nil(ne), 
is_intern(ne), ne->type == e_column?ne->f:NULL);
                                        }
                                        e->r = ne;
 
@@ -1406,7 +1406,7 @@ rel_push_func_down(int *changes, mvc *sq
                                                                append(r->exps, 
ne);
                                                        else
                                                                append(l->exps, 
ne);
-                                                       ne = 
exp_column(sql->sa, exp_relname(ne), exp_name(ne), exp_subtype(ne), ne->card, 
has_nil(ne), is_intern(ne));
+                                                       ne = 
exp_column(sql->sa, exp_relname(ne), exp_name(ne), exp_subtype(ne), ne->card, 
has_nil(ne), is_intern(ne), ne->type == e_column?ne->f:NULL);
                                                }
                                                e->f = ne;
                                        }
@@ -1509,7 +1509,7 @@ rel_push_count_down(int *changes, mvc *s
                        sql_exp *cnt, *e = exp_aggr(sql->sa, NULL, cf, 
need_distinct(oce), need_no_nil(oce), oce->card, 0);
 
                        exp_label(sql->sa, e, ++sql->label);
-                       cnt = exp_column(sql->sa, NULL, exp_name(e), 
exp_subtype(e), e->card, has_nil(e), is_intern(e));
+                       cnt = exp_column(sql->sa, NULL, exp_name(e), 
exp_subtype(e), e->card, has_nil(e), is_intern(e), NULL);
                        gbl = rel_groupby(sql->sa, rel_dup(srel), NULL);
                        rel_groupby_add_aggr(sql, gbl, e);
                        append(args, cnt);
@@ -1521,7 +1521,7 @@ rel_push_count_down(int *changes, mvc *s
                        sql_exp *cnt, *e = exp_aggr(sql->sa, NULL, cf, 
need_distinct(oce), need_no_nil(oce), oce->card, 0);
 
                        exp_label(sql->sa, e, ++sql->label);
-                       cnt = exp_column(sql->sa, NULL, exp_name(e), 
exp_subtype(e), e->card, has_nil(e), is_intern(e));
+                       cnt = exp_column(sql->sa, NULL, exp_name(e), 
exp_subtype(e), e->card, has_nil(e), is_intern(e), NULL);
                        gbr = rel_groupby(sql->sa, rel_dup(srel), NULL);
                        rel_groupby_add_aggr(sql, gbr, e);
                        append(args, cnt);
@@ -1788,7 +1788,7 @@ exp_push_down_prj(mvc *sql, sql_exp *e, 
                if (ne->type == e_atom) 
                        e = exp_copy(sql->sa, ne);
                else
-                       e = exp_alias(sql->sa, e->rname, exp_name(e), ne->l, 
ne->r, exp_subtype(e), e->card, has_nil(e), is_intern(e));
+                       e = exp_alias(sql->sa, e->rname, exp_name(e), ne->l, 
ne->r, exp_subtype(e), e->card, has_nil(e), is_intern(e), e->type == 
e_column?e->f:NULL);
                return e;
        case e_cmp: 
                if (e->flag == cmp_or) {
@@ -2329,7 +2329,7 @@ rel_project_cse(int *changes, mvc *sql, 
                                        sql_exp *e2 = m->data;
                                
                                        if (exp_name(e2) && exp_match_exp(e1, 
e2)) {
-                                               sql_exp *ne = 
exp_alias(sql->sa, e1->rname, exp_name(e1), e2->rname, exp_name(e2), 
exp_subtype(e2), e2->card, has_nil(e2), is_intern(e1));
+                                               sql_exp *ne = 
exp_alias(sql->sa, e1->rname, exp_name(e1), e2->rname, exp_name(e2), 
exp_subtype(e2), e2->card, has_nil(e2), is_intern(e1), NULL);
                                                e1 = ne;
                                                break;
                                        }
@@ -2600,7 +2600,7 @@ rel_push_aggr_down(int *changes, mvc *sq
 
                                ne = list_find_exp( u->exps, e);
                                assert(ne);
-                               ne = exp_column(sql->sa, exp_find_rel_name(ne), 
exp_name(ne), exp_subtype(ne), ne->card, has_nil(ne), is_intern(ne));
+                               ne = exp_column(sql->sa, exp_find_rel_name(ne), 
exp_name(ne), exp_subtype(ne), ne->card, has_nil(ne), is_intern(ne), ne->type 
== e_column?ne->f:NULL);
                                append(gbe, ne);
                        }
                }
@@ -2617,10 +2617,10 @@ rel_push_aggr_down(int *changes, mvc *sq
                                /* union of aggr result may have nils 
                                 * because sum/count of empty set */
                                set_has_nil(e);
-                               e = exp_column(sql->sa, exp_find_rel_name(e), 
exp_name(e), exp_subtype(e), e->card, has_nil(e), is_intern(e));
+                               e = exp_column(sql->sa, exp_find_rel_name(e), 
exp_name(e), exp_subtype(e), e->card, has_nil(e), is_intern(e), e->type == 
e_column?e->f:NULL);
                                ne = exp_aggr1(sql->sa, e, a, need_distinct(e), 
1, e->card, 1);
                        } else {
-                               ne = exp_column(sql->sa, exp_find_rel_name(e), 
exp_name(e), exp_subtype(e), e->card, has_nil(e), is_intern(e));
+                               ne = exp_column(sql->sa, exp_find_rel_name(e), 
exp_name(e), exp_subtype(e), e->card, has_nil(e), is_intern(e), e->type == 
e_column?e->f:NULL);
                        }
                        exp_setname(sql->sa, ne, exp_find_rel_name(oa), 
exp_name(oa));
                        append(exps, ne);
@@ -3487,7 +3487,7 @@ rel_find_aggr_exp(sql_allocator *sa, sql
                                    strcmp(aae->l, eae->l) == 0)) &&
                                    (aae->r && eae->r &&
                                    strcmp(aae->r, eae->r) == 0)) 
-                                       return exp_column(sa, a->rname, 
exp_name(a), exp_subtype(a), a->card, has_nil(a), is_intern(a));
+                                       return exp_column(sa, a->rname, 
exp_name(a), exp_subtype(a), a->card, has_nil(a), is_intern(a), e->type == 
e_column?e->f:NULL);
                        }
                }
        }
@@ -3546,7 +3546,7 @@ rel_avg2sum_count(int *changes, mvc *sql
 
                                exp_label(sql->sa, e, ++sql->label);
                                append(nexps, e);
-                               cnt = exp_column(sql->sa, NULL, exp_name(e), 
exp_subtype(e), e->card, has_nil(e), is_intern(e));
+                               cnt = exp_column(sql->sa, NULL, exp_name(e), 
exp_subtype(e), e->card, has_nil(e), is_intern(e), NULL);
                        }
                        if (!sum) {
                                list *l = avg->l;
@@ -3555,7 +3555,7 @@ rel_avg2sum_count(int *changes, mvc *sql
 
                                exp_label(sql->sa, e, ++sql->label);
                                append(nexps, e);
-                               sum = exp_column(sql->sa, NULL, exp_name(e), 
exp_subtype(e), e->card, has_nil(e), is_intern(e));
+                               sum = exp_column(sql->sa, NULL, exp_name(e), 
exp_subtype(e), e->card, has_nil(e), is_intern(e), NULL);
                        }
                        /* create new sum/cnt exp */
 
@@ -3608,7 +3608,7 @@ rel_avg2sum_count(int *changes, mvc *sql
                        if (e->type == e_column && !rel_find_exp(rel->l, e))  
                                append(pexps, e);
                        else 
-                               append(pexps, exp_column(sql->sa, 
exp_find_rel_name(e), exp_name(e), exp_subtype(e), e->card, has_nil(e), 
is_intern(e)));
+                               append(pexps, exp_column(sql->sa, 
exp_find_rel_name(e), exp_name(e), exp_subtype(e), e->card, has_nil(e), 
is_intern(e), e->type == e_column?e->f:NULL));
                }
                rel->exps = nexps;
                rel = rel_project(sql->sa, rel, pexps);
@@ -3772,7 +3772,7 @@ rel_reduce_groupby_exps(int *changes, mv
                                                if (scores[l] == 1) {
                                                        sql_column *c = 
exp_find_column_(rel, e, -2, &bt);
                                                        
-                                                       sql_exp *rs = 
exp_column(sql->sa, rnme, c->base.name, exp_subtype(e), rel->card, has_nil(e), 
is_intern(e));
+                                                       sql_exp *rs = 
exp_column(sql->sa, rnme, c->base.name, exp_subtype(e), rel->card, has_nil(e), 
is_intern(e), e->type == e_column?e->f:NULL);
                                                        append(r->exps, rs);
 
                                                        e = 
exp_compare(sql->sa, e, rs, cmp_equal);
@@ -3792,7 +3792,7 @@ rel_reduce_groupby_exps(int *changes, mv
 
                                                        if (scores[l] == -1 && 
exp_match_exp(e,gb)) {
                                                                sql_column *c = 
exp_find_column_(rel, e, -2, &bt);
-                                                               sql_exp *rs = 
exp_column(sql->sa, rnme, c->base.name, exp_subtype(e), rel->card, has_nil(e), 
is_intern(e));
+                                                               sql_exp *rs = 
exp_column(sql->sa, rnme, c->base.name, exp_subtype(e), rel->card, has_nil(e), 
is_intern(e), e->type == e_column?e->f:NULL);
                                                                
exp_setname(sql->sa, rs, exp_find_rel_name(e), exp_name(e));
                                                                append(r->exps, 
rs);
                                                                fnd = 1;
@@ -3846,7 +3846,7 @@ split_aggr_and_project(mvc *sql, list *a
                        e->rname = e->name;
                }
                list_append(aexps, e);
-               return exp_column(sql->sa, exp_find_rel_name(e), exp_name(e), 
exp_subtype(e), e->card, has_nil(e), is_intern(e));
+               return exp_column(sql->sa, exp_find_rel_name(e), exp_name(e), 
exp_subtype(e), e->card, has_nil(e), is_intern(e), NULL);
        case e_cmp:
                /* e_cmp's shouldn't exist in an aggr expression list */
                assert(0);
@@ -4039,7 +4039,7 @@ rel_push_project_up(int *changes, mvc *s
                                break;
                        default: /* simple alias */
                                list_append(aexps, e);
-                               ne = exp_column(sql->sa, exp_find_rel_name(e), 
exp_name(e), exp_subtype(e), e->card, has_nil(e), is_intern(e));
+                               ne = exp_column(sql->sa, exp_find_rel_name(e), 
exp_name(e), exp_subtype(e), e->card, has_nil(e), is_intern(e), e->type == 
e_column?e->f:NULL);
                                list_append(pexps, ne);
                                break;
                        }
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -393,7 +393,8 @@ rel_psm_return( mvc *sql, sql_subtype *r
                        if (!cname)
                                cname = number2name(name, 16, ++sql->label);
                        if (!isproject) 
-                               e = exp_column(sql->sa, exp_relname(e), cname, 
exp_subtype(e), exp_card(e), has_nil(e), is_intern(e));
+                               /* FIXME: should we retrieve the dimension 
range from ce? */
+                               e = exp_column(sql->sa, exp_relname(e), cname, 
exp_subtype(e), exp_card(e), has_nil(e), is_intern(e), e->type == 
e_column?e->f:NULL);
                        e = rel_check_type(sql, &ce->type, e, type_equal);
                        if (!e)
                                return NULL;
@@ -414,7 +415,17 @@ rel_psm_return( mvc *sql, sql_subtype *r
                for (n = t->columns.set->h, m = 
restype->comp_type->columns.set->h; n && m; n = n->next, m = m->next) {
                        sql_column *c = n->data;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to