Changeset: 04d3646c6fb7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=04d3646c6fb7
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/include/sql_catalog.h
        sql/server/rel_optimizer.c
        
sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out.single
Branch: unlock
Log Message:

merged


diffs (truncated from 1933 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -733,7 +733,7 @@ static stmt*
 exp2bin_coalesce(backend *be, sql_exp *fe, stmt *left, stmt *right, stmt 
*isel, int depth)
 {
        stmt *res = NULL, *sel = NULL, *osel = NULL, *ncond = NULL, *ocond = 
NULL;
-       int single_value = (fe->card <= CARD_ATOM);
+       int single_value = (fe->card <= CARD_ATOM && (!left || !left->nrcols));
        char name[16], *nme = NULL;
        sql_subtype *bt = sql_bind_localtype("bit");
        sql_subfunc *and = sql_bind_func(be->mvc->sa, NULL, "and", bt, bt, 
F_FUNC);
diff --git a/sql/benchmarks/tpcds/Tests/09.stable.out 
b/sql/benchmarks/tpcds/Tests/09.stable.out
--- a/sql/benchmarks/tpcds/Tests/09.stable.out
+++ b/sql/benchmarks/tpcds/Tests/09.stable.out
@@ -42,7 +42,7 @@ stdout of test '09` in directory 'sql/be
 % .,   .,      .,      .,      . # table_name
 % bucket1,     bucket2,        bucket3,        bucket4,        bucket5 # name
 % decimal,     decimal,        decimal,        decimal,        decimal # type
-% 11,  11,     11,     11,     11 # length
+% 40,  40,     40,     40,     40 # length
 [ 39.65,       115.90, 191.63, 267.19, 341.99  ]
 
 # 11:36:53 >  
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -305,6 +305,8 @@ typedef enum sql_class {
 #define EC_VARCHAR(e)          (e==EC_CHAR||e==EC_STRING)
 #define EC_INTERVAL(e)         (e==EC_MONTH||e==EC_SEC)
 #define EC_NUMBER(e)           
(e==EC_POS||e==EC_NUM||EC_INTERVAL(e)||e==EC_DEC||e==EC_FLT)
+#define EC_EXACTNUM(e)         (e==EC_NUM||e==EC_DEC)
+#define EC_APPNUM(e)           (e==EC_FLT)
 #define EC_COMPUTE(e)          (e==EC_NUM||e==EC_FLT)
 #define EC_BOOLEAN(e)          (e==EC_BIT||e==EC_NUM||e==EC_FLT)
 #define EC_TEMP_TZ(e)          (e==EC_TIME_TZ||e==EC_TIMESTAMP_TZ)
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
@@ -224,10 +224,19 @@ sql_exp *
 exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype)
 {
        sql_exp *e = exp_create(sa, e_cmp);
+       unsigned int exps_card = CARD_ATOM;
 
        if (e == NULL)
                return NULL;
-       e->card = l->card;
+
+       /* ignore the cardinalites of sub-relations */
+       for (node *n = r->h; n ; n = n->next) {
+               sql_exp *next = n->data;
+
+               if (!exp_is_rel(next) && exps_card < next->card)
+                       exps_card = next->card;
+       }
+       e->card = MAX(l->card, exps_card);
        e->l = l;
        e->r = r;
        assert( cmptype == cmp_in || cmptype == cmp_notin);
@@ -245,16 +254,26 @@ exp_in_func(mvc *sql, sql_exp *le, sql_e
                list *l = exp_get_values(e);
                e = l->h->data;
        }
-       if (anyequal)
-               a_func = sql_bind_func(sql->sa, sql->session->schema, 
"sql_anyequal", exp_subtype(e), exp_subtype(e), F_FUNC);
-       else
-               a_func = sql_bind_func(sql->sa, sql->session->schema, 
"sql_not_anyequal", exp_subtype(e), exp_subtype(e), F_FUNC);
-
+       a_func = sql_bind_func(sql->sa, sql->session->schema, anyequal ? 
"sql_anyequal" : "sql_not_anyequal", exp_subtype(e), exp_subtype(e), F_FUNC);
        if (!a_func)
                return sql_error(sql, 02, SQLSTATE(42000) "(NOT) IN operator on 
type %s missing", exp_subtype(le)->type->sqlname);
        e = exp_binop(sql->sa, le, vals, a_func);
-       if (e)
-               e->card = le->card;
+       if (e) {
+               unsigned int exps_card = CARD_ATOM;
+
+               /* ignore the cardinalites of sub-relations */
+               if (vals->type == e_atom && vals->f) {
+                       for (node *n = ((list*)vals->f)->h ; n ; n = n->next) {
+                               sql_exp *next = n->data;
+
+                               if (!exp_is_rel(next) && exps_card < next->card)
+                                       exps_card = next->card;
+                       }
+               } else if (!exp_is_rel(vals))
+                       exps_card = vals->card;
+
+               e->card = MAX(le->card, exps_card);
+       }
        return e;
 }
 
@@ -268,10 +287,8 @@ exp_compare_func(mvc *sql, sql_exp *le, 
        e = exp_binop(sql->sa, le, re, cmp_func);
        if (e) {
                e->flag = quantifier;
-               if (quantifier)
-                       e->card = le->card; /* At ANY and ALL operators, the 
cardinality on the right side is ignored */
-               else
-                       e->card = MAX(le->card, re->card);
+               /* At ANY and ALL operators, the cardinality on the right side 
is ignored if it is a sub-relation */
+               e->card = quantifier && exp_is_rel(re) ? le->card : 
MAX(le->card, re->card);
        }
        return e;
 }
@@ -2943,18 +2960,15 @@ exp_set_type_recurse(mvc *sql, sql_subty
                                exp_set_type_recurse(sql, type, e->l, relname, 
expname);
                        }
                } break;
+               case e_aggr:
                case e_func: {
-                       for(node *n = ((list*)e->l)->h ; n ; n = n->next)
-                               exp_set_type_recurse(sql, type, (sql_exp*) 
n->data, relname, expname);
-                       if (e->r)
-                               for(node *n = ((list*)e->r)->h ; n ; n = 
n->next)
-                                       exp_set_type_recurse(sql, type, 
(sql_exp*) n->data, relname, expname);
-               }       break;
-               case e_aggr: {
                        if (e->l)
                                for(node *n = ((list*)e->l)->h ; n ; n = 
n->next)
                                        exp_set_type_recurse(sql, type, 
(sql_exp*) n->data, relname, expname);
-               }       break;
+                       if (e->type == e_func && e->r)
+                               for(node *n = ((list*)e->r)->h ; n ; n = 
n->next)
+                                       exp_set_type_recurse(sql, type, 
(sql_exp*) n->data, relname, expname);
+               } break;
                case e_cmp: {
                        if (e->flag == cmp_in || e->flag == cmp_notin) {
                                exp_set_type_recurse(sql, type, e->l, relname, 
expname);
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
@@ -9157,6 +9157,8 @@ static void replace_column_references_wi
 
 static void
 replace_column_references_with_nulls_1(mvc *sql, list* crefs, list* exps) {
+    if (list_empty(exps))
+        return;
     for(node* n = exps->h; n; n=n->next) {
         sql_exp* e = n->data;
         replace_column_references_with_nulls_2(sql, crefs, e);
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -458,18 +458,15 @@ exp_change_column_table(mvc *sql, sql_ex
                } break;
                case e_atom:
                        break;
+               case e_aggr:
                case e_func: {
-                       for (node *n = ((list*)e->l)->h ; n ; n = n->next)
-                               n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
-                       if (e->r)
-                               for (node *n = ((list*)e->r)->h ; n ; n = 
n->next)
-                                       n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
-               }       break;
-               case e_aggr: {
                        if (e->l)
                                for (node *n = ((list*)e->l)->h ; n ; n = 
n->next)
                                        n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
-               }       break;
+                       if (e->type == e_func && e->r)
+                               for (node *n = ((list*)e->r)->h ; n ; n = 
n->next)
+                                       n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
+               } break;
                case e_column: {
                        if (!strcmp(e->l, oldt->base.name))
                                e->l = sa_strdup(sql->sa, newt->base.name);
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
@@ -197,15 +197,14 @@ rel_table_optname(mvc *sql, sql_rel *sq,
                        ne = sq->exps->h;
                        for (; ne; ne = ne->next) {
                                sql_exp *e = ne->data;
-
-                               /*
-                               if (exp_name(e) && exps_bind_column2(l, tname, 
exp_name(e)))
-                                       return sql_error(sql, ERR_AMBIGUOUS, 
SQLSTATE(42000) "SELECT: Duplicate column name '%s.%s'", tname, exp_name(e));
-                                       */
-                               noninternexp_setname(sql->sa, e, tname, NULL );
-                               if (!is_intern(e))
+                               char *name = NULL;
+
+                               if (!is_intern(e)) {
+                                       if (!exp_name(e))
+                                               name = make_label(sql->sa, 
++sql->label);
+                                       noninternexp_setname(sql->sa, e, tname, 
name);
                                        set_basecol(e);
-                               append(l, e);
+                               }
                        }
                }
        } else {
@@ -252,19 +251,19 @@ rel_with_query(sql_query *query, symbol 
        for (d = d->data.lval->h; d; d = d->next) {
                symbol *sym = d->data.sym;
                dnode *dn = sym->data.lval->h;
-               char *name = qname_schema_object(dn->data.lval);
+               char *rname = qname_schema_object(dn->data.lval);
                sql_rel *nrel;
 
-               if (frame_find_rel_view(sql, name)) {
+               if (frame_find_rel_view(sql, rname)) {
                        stack_pop_frame(sql);
-                       return sql_error(sql, 01, SQLSTATE(42000) "View '%s' 
already declared", name);
+                       return sql_error(sql, 01, SQLSTATE(42000) "View '%s' 
already declared", rname);
                }
                nrel = rel_semantic(query, sym);
                if (!nrel) {
                        stack_pop_frame(sql);
                        return NULL;
                }
-               if (!stack_push_rel_view(sql, name, nrel)) {
+               if (!stack_push_rel_view(sql, rname, nrel)) {
                        stack_pop_frame(sql);
                        return sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                }
@@ -282,10 +281,14 @@ rel_with_query(sql_query *query, symbol 
 
                        for (; ne; ne = ne->next) {
                                sql_exp *e = ne->data;
-
-                               noninternexp_setname(sql->sa, e, name, NULL );
-                               if (!is_intern(e))
+                               char *name = NULL;
+
+                               if (!is_intern(e)) {
+                                       if (!exp_name(e))
+                                               name = make_label(sql->sa, 
++sql->label);
+                                       noninternexp_setname(sql->sa, e, rname, 
name);
                                        set_basecol(e);
+                               }
                        }
                }
        }
@@ -437,6 +440,49 @@ score_func( sql_subfunc *sf, list *tl)
        return score;
 }
 
+static list *
+check_arguments_and_find_largest_any_type(mvc *sql, sql_rel *rel, list* exps, 
sql_subfunc *sf, int maybe_zero_or_one)
+{
+       list *nexps = new_exp_list(sql->sa);
+       sql_subtype *atp = NULL;
+       sql_arg *aa = NULL;
+
+       /* find largest any type argument */
+       for (node *n = exps->h, *m = sf->func->ops->h; n && m; n = n->next, m = 
m->next) {
+               sql_arg *a = m->data;
+               sql_exp *e = n->data;
+               sql_subtype *t = exp_subtype(e);
+
+               if (!aa && a->type.type->eclass == EC_ANY) {
+                       atp = t;
+                       aa = a;
+               }
+               if (aa && a->type.type->eclass == EC_ANY && t && atp && 
t->type->localtype > atp->type->localtype) {
+                       atp = t;
+                       aa = a;
+               }
+       }
+       for (node *n = exps->h, *m = sf->func->ops->h; n && m; n = n->next, m = 
m->next) {
+               sql_arg *a = m->data;
+               sql_exp *e = n->data;
+               sql_subtype *ntp = &a->type;
+
+               if (a->type.type->eclass == EC_ANY && atp)
+                       ntp = sql_create_subtype(sql->sa, atp->type, 
atp->digits, atp->scale);
+               if (!(e = exp_check_type(sql, ntp, rel, e, type_equal)))
+                       return NULL;
+               if (maybe_zero_or_one && e->card > CARD_ATOM) {
+                       sql_subfunc *zero_or_one = sql_bind_func(sql->sa, 
sql->session->schema, "zero_or_one", exp_subtype(e), NULL, F_AGGR);
+                       e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, CARD_ATOM, 
has_nil(e));
+               }
+               append(nexps, e);
+       }
+       /* dirty hack */
+       if (sf->func->type != F_UNION && sf->func->type != F_LOADER && sf->res 
&& aa && atp)
+               sf->res->h->data = sql_create_subtype(sql->sa, atp->type, 
atp->digits, atp->scale);
+       return nexps;
+}
+
 static sql_exp *
 find_table_function_type(mvc *sql, sql_schema *s, char *fname, list *exps, 
list *tl, sql_ftype type, sql_subfunc **sf)
 {
@@ -470,45 +516,7 @@ find_table_function_type(mvc *sql, sql_s
                if ((*sf)->func->vararg) {
                        e = exp_op(sql->sa, exps, *sf);
                } else {
-                       node *n, *m;
-                       list *nexps = new_exp_list(sql->sa);
-                       sql_subtype *atp = NULL;
-                       sql_arg *aa = NULL;
-
-                       /* find largest any type argument */
-                       for (n = exps->h, m = (*sf)->func->ops->h; n && m; n = 
n->next, m = m->next) {
-                               sql_arg *a = m->data;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to