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

Reply via email to