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