Changeset: 1bda00b05bbc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1bda00b05bbc
Branch: dict
Log Message:
merged with default
diffs (283 lines):
diff --git a/sql/backends/monet5/sql_execute.c
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -771,7 +771,7 @@ RAstatement(Client c, MalBlkPtr mb, MalS
refs = sa_list(m->sa);
rel = rel_read(m, *expr, &pos, refs);
if (*opt && rel)
- rel = sql_processrelation(m, rel, 0, 1, 1);
+ rel = sql_processrelation(m, rel, 0, 0, 0);
if (!rel) {
if (strlen(m->errstr) > 6 && m->errstr[5] == '!')
msg = createException(SQL, "RAstatement", "%s",
m->errstr);
@@ -967,7 +967,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
refs = sa_list(m->sa);
rel = rel_read(m, expr, &pos, refs);
if (rel)
- rel = sql_processrelation(m, rel, 0, 1, 1);
+ rel = sql_processrelation(m, rel, 0, 0, 0);
if (!rel) {
if (strlen(m->errstr) > 6 && m->errstr[5] == '!')
msg = createException(SQL, "RAstatement2", "%s",
m->errstr);
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
@@ -565,12 +565,12 @@ exp_value(mvc *sql, sql_exp *e)
return e->l;
} else if (e->r) { /* param (ie not set) */
sql_var_name *vname = (sql_var_name*) e->r;
- sql_var *var;
assert(e->flag != 0 || vname->sname); /* global variables must
have a schema */
- if (e->flag == 0 && (var = find_global_var(sql,
mvc_bind_schema(sql, vname->sname), vname->name))) /* global variable */
+ sql_var *var = e->flag == 0 ? find_global_var(sql,
mvc_bind_schema(sql, vname->sname), vname->name) :
+
stack_find_var_at_level(sql, vname->name, e->flag);
+ if (var)
return &(var->var);
- return NULL;
}
return NULL;
}
@@ -2837,37 +2837,6 @@ exp_copy(mvc *sql, sql_exp * e)
return ne;
}
-atom *
-exp_flatten(mvc *sql, sql_exp *e)
-{
- if (e->type == e_atom) {
- return exp_value(sql, e);
- } else if (e->type == e_convert) {
- atom *v = exp_flatten(sql, e->l);
-
- if (v)
- return atom_cast(sql->sa, v, exp_subtype(e));
- } else if (e->type == e_func) {
- sql_subfunc *f = e->f;
- list *l = e->l;
- sql_arg *res = (f->func->res)?(f->func->res->h->data):NULL;
-
- /* TODO handle date + x months */
- if (!f->func->s && strcmp(f->func->base.name, "sql_add") == 0
&& list_length(l) == 2 && res && EC_NUMBER(res->type.type->eclass)) {
- atom *l1 = exp_flatten(sql, l->h->data);
- atom *l2 = exp_flatten(sql, l->h->next->data);
- if (l1 && l2)
- return atom_add(sql->sa, l1, l2);
- } else if (!f->func->s && strcmp(f->func->base.name, "sql_sub")
== 0 && list_length(l) == 2 && res && EC_NUMBER(res->type.type->eclass)) {
- atom *l1 = exp_flatten(sql, l->h->data);
- atom *l2 = exp_flatten(sql, l->h->next->data);
- if (l1 && l2)
- return atom_sub(sql->sa, l1, l2);
- }
- }
- return NULL;
-}
-
sql_exp *
exp_scale_algebra(mvc *sql, sql_subfunc *f, sql_rel *rel, sql_exp *l, sql_exp
*r)
{
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
@@ -193,8 +193,6 @@ extern sql_exp *exps_find_one_multi_exp(
extern const char *compare_func( comp_type t, int anti );
extern int is_identity( sql_exp *e, sql_rel *r);
-extern atom *exp_flatten(mvc *sql, sql_exp *e);
-
extern sql_exp *exp_scale_algebra(mvc *sql, sql_subfunc *f, sql_rel *rel,
sql_exp *l, sql_exp *r);
extern void exp_sum_scales(sql_subfunc *f, sql_exp *l, sql_exp *r);
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
@@ -3036,8 +3036,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
}
*/
if (exp_is_atom(le) && exp_is_atom(re)) {
- atom *la = exp_flatten(sql, le);
- atom *ra = exp_flatten(sql, re);
+ atom *la = exp_flatten(sql, true, le);
+ atom *ra = exp_flatten(sql, true, re);
if (la && ra && subtype_cmp(atom_type(la),
atom_type(ra)) == 0 && subtype_cmp(atom_type(la), exp_subtype(e)) == 0) {
atom *a = atom_mul(sql->sa, la, ra);
@@ -3144,8 +3144,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
return le;
}
if (exp_is_atom(le) && exp_is_atom(re)) {
- atom *la = exp_flatten(sql, le);
- atom *ra = exp_flatten(sql, re);
+ atom *la = exp_flatten(sql, true, le);
+ atom *ra = exp_flatten(sql, true, re);
if (la && ra) {
atom *a = atom_add(sql->sa, la, ra);
@@ -3211,8 +3211,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
sql_exp *re = l->h->next->data;
if (exp_is_atom(le) && exp_is_atom(re)) {
- atom *la = exp_flatten(sql, le);
- atom *ra = exp_flatten(sql, re);
+ atom *la = exp_flatten(sql, true, le);
+ atom *ra = exp_flatten(sql, true, re);
if (la && ra) {
atom *a = atom_sub(sql->sa, la, ra);
@@ -9102,8 +9102,8 @@ rel_merge_table_rewrite(visitor *v, sql_
if (flag == cmp_gt || flag == cmp_gte
|| flag == cmp_lte || flag == cmp_lt || flag == cmp_equal) {
sql_exp *l = e->r, *h = e->f;
- atom *lval =
exp_flatten(v->sql, l);
- atom *hval = h ?
exp_flatten(v->sql, h) : lval;
+ atom *lval =
exp_flatten(v->sql, v->value_based_opt, l);
+ atom *hval = h ?
exp_flatten(v->sql, v->value_based_opt, h) : lval;
if (lval && hval) {
range_limit *next =
SA_NEW(v->sql->sa, range_limit);
@@ -9125,7 +9125,7 @@ rel_merge_table_rewrite(visitor *v, sql_
node *m = NULL;
for (m = vals->h; m; m =
m->next) {
sql_exp *l = m->data;
- atom *lval =
exp_flatten(v->sql, l);
+ atom *lval =
exp_flatten(v->sql, v->value_based_opt, l);
if (!lval)
break;
@@ -9368,8 +9368,8 @@ exp_is_zero_rows(visitor *v, sql_rel *re
sql_exp *l = e->r;
sql_exp *h = e->f;
- atom *lval = exp_flatten(v->sql, l);
- atom *hval = h ? exp_flatten(v->sql, h)
: lval;
+ atom *lval = exp_flatten(v->sql,
v->value_based_opt, l);
+ atom *hval = h ? exp_flatten(v->sql,
v->value_based_opt, h) : lval;
if (lval && hval) {
sql_rel *bt;
sql_column *col =
name_find_column(sel, exp_relname(c), exp_name(c), -2, &bt);
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -839,8 +839,6 @@ rel_project(sql_allocator *sa, sql_rel *
rel->nrcols = l->nrcols;
rel->single = is_single(l);
}
- if (rel->card == CARD_AGGR)
- rel->card = CARD_MULTI;
if (e && !list_empty(e)) {
set_processed(rel);
rel->nrcols = list_length(e);
diff --git a/sql/server/rel_rewriter.c b/sql/server/rel_rewriter.c
--- a/sql/server/rel_rewriter.c
+++ b/sql/server/rel_rewriter.c
@@ -215,3 +215,34 @@ rewrite_reset_used(visitor *v, sql_rel *
rel->used = 0;
return rel;
}
+
+atom *
+exp_flatten(mvc *sql, bool value_based_opt, sql_exp *e)
+{
+ if (e->type == e_atom) {
+ return value_based_opt ? exp_value(sql, e) : (atom *) e->l;
+ } else if (e->type == e_convert) {
+ atom *v = exp_flatten(sql, value_based_opt, e->l);
+
+ if (v)
+ return atom_cast(sql->sa, v, exp_subtype(e));
+ } else if (e->type == e_func) {
+ sql_subfunc *f = e->f;
+ list *l = e->l;
+ sql_arg *res = (f->func->res)?(f->func->res->h->data):NULL;
+
+ /* TODO handle date + x months */
+ if (!f->func->s && strcmp(f->func->base.name, "sql_add") == 0
&& list_length(l) == 2 && res && EC_NUMBER(res->type.type->eclass)) {
+ atom *l1 = exp_flatten(sql, value_based_opt,
l->h->data);
+ atom *l2 = exp_flatten(sql, value_based_opt,
l->h->next->data);
+ if (l1 && l2)
+ return atom_add(sql->sa, l1, l2);
+ } else if (!f->func->s && strcmp(f->func->base.name, "sql_sub")
== 0 && list_length(l) == 2 && res && EC_NUMBER(res->type.type->eclass)) {
+ atom *l1 = exp_flatten(sql, value_based_opt,
l->h->data);
+ atom *l2 = exp_flatten(sql, value_based_opt,
l->h->next->data);
+ if (l1 && l2)
+ return atom_sub(sql->sa, l1, l2);
+ }
+ }
+ return NULL;
+}
diff --git a/sql/server/rel_rewriter.h b/sql/server/rel_rewriter.h
--- a/sql/server/rel_rewriter.h
+++ b/sql/server/rel_rewriter.h
@@ -40,4 +40,6 @@ try_remove_empty_select(visitor *v, sql_
extern sql_rel *rewrite_reset_used(visitor *v, sql_rel *rel);
+extern atom *exp_flatten(mvc *sql, bool value_based_opt, sql_exp *e);
+
#endif /*_REL_REWRITER_H_*/
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -1996,11 +1996,8 @@ exp_reset_card_and_freevar_set_physical_
}
if (is_simple_project(rel->op) && need_distinct(rel)) /* Need distinct,
all expressions should have CARD_AGGR at max */
e->card = MIN(e->card, CARD_AGGR);
- if (!is_set(rel->op) && (!is_groupby(rel->op) || !list_empty(rel->r))){
/* global groupings have atomic cardinality */
+ if (!is_set(rel->op) && (!is_groupby(rel->op) || !list_empty(rel->r)))
/* global groupings have atomic cardinality */
rel->card = MAX(e->card, rel->card); /* the relation
cardinality may get updated too */
- if (!is_groupby(rel->op) && rel->card == CARD_AGGR)
- rel->card = CARD_MULTI;
- }
return e;
}
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -268,6 +268,7 @@ extern void stack_pop_until(mvc *sql, in
/* find variable in the stack */
extern sql_var *stack_find_var_frame(mvc *sql, const char *name, int *level);
+extern sql_var *stack_find_var_at_level(mvc *sql, const char *name, int level);
extern sql_table *stack_find_table(mvc *sql, const char *name);
extern sql_table *frame_find_table(mvc *sq, const char *name);
extern sql_rel *stack_find_rel_view(mvc *sql, const char *name);
diff --git a/sql/server/sql_query.c b/sql/server/sql_query.c
--- a/sql/server/sql_query.c
+++ b/sql/server/sql_query.c
@@ -102,7 +102,7 @@ query_outer_used_exp(sql_query *q, int i
sq->last_used = e;
sq->used_card = sq->rel->card;
- assert( (!is_sql_aggr(f) && sq->grouped == 0 && e->card != CARD_AGGR)
|| /* outer is a none grouped relation */
+ assert( (!is_sql_aggr(f) && sq->grouped == 0) || /* outer is a none
grouped relation */
(!is_sql_aggr(f) && sq->grouped == 1 && e->card <= CARD_AGGR)
|| /* outer is groupbed, ie only return aggregations or groupby cols */
(is_sql_aggr(f) && !is_sql_farg(f) && !sq->grouped && e->card
!= CARD_AGGR) || /* a column/constant to be aggregated */
(is_sql_aggr(f) && !is_sql_farg(f) && sq->grouped && e->card !=
CARD_AGGR) || /* a column/constant to be aggregated */
diff --git a/sql/server/sql_var.c b/sql/server/sql_var.c
--- a/sql/server/sql_var.c
+++ b/sql/server/sql_var.c
@@ -596,6 +596,23 @@ stack_find_var_frame(mvc *sql, const cha
return NULL;
}
+sql_var*
+stack_find_var_at_level(mvc *sql, const char *name, int level)
+{
+ for (int i = sql->topframes-1; i >= 0; i--) {
+ sql_frame *f = sql->frames[i];
+ if (f->frame_number == level && f->vars) {
+ for (node *n = f->vars->h; n ; n = n->next) {
+ sql_var *var = (sql_var*) n->data;
+ assert(var->name);
+ if (!strcmp(var->name, name))
+ return var;
+ }
+ }
+ }
+ return NULL;
+}
+
int
stack_has_frame(mvc *sql, const char *name)
{
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list