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