Changeset: dd6849174818 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dd6849174818
Branch: default
Log Message:
merged
diffs (270 lines):
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
@@ -13,6 +13,7 @@
#include "rel_exp.h"
#include "rel_prop.h"
#include "rel_dump.h"
+#include "rel_select.h"
#include "rel_planner.h"
#include "rel_propagate.h"
#include "rel_rewriter.h"
@@ -26,8 +27,6 @@ typedef struct global_props {
has_mergetable:1;
} global_props;
-static sql_subfunc *find_func(mvc *sql, char *name, list *exps);
-
static int
find_member_pos(list *l, sql_table *t)
{
@@ -1616,7 +1615,7 @@ rel_push_count_down(visitor *v, sql_rel
sql_rel *gbl, *gbr; /* Group By */
sql_rel *cp; /* Cross Product */
sql_subfunc *mult;
- list *args;
+ list *args, *types;
sql_rel *srel;
oce = rel->exps->h->data;
@@ -1650,9 +1649,12 @@ rel_push_count_down(visitor *v, sql_rel
append(args, cnt);
}
- mult = find_func(v->sql, "sql_mul", args);
cp = rel_crossproduct(v->sql->sa, gbl, gbr, op_join);
+ types = sa_list(v->sql->sa);
+ for(node *n = args->h; n; n = n->next)
+ list_append(types, exp_subtype(n->data));
+ mult = sql_bind_func_(v->sql, "sys", "sql_mul", types, F_FUNC);
nce = exp_op(v->sql->sa, args, mult);
if (exp_name(oce))
exp_prop_alias(v->sql->sa, nce, oce);
@@ -2939,17 +2941,6 @@ rel_merge_projects(visitor *v, sql_rel *
return rel;
}
-static sql_subfunc *
-find_func( mvc *sql, char *name, list *exps )
-{
- list * l = sa_list(sql->sa);
- node *n;
-
- for(n = exps->h; n; n = n->next)
- append(l, exp_subtype(n->data));
- return sql_bind_func_(sql, "sys", name, l, F_FUNC);
-}
-
static inline int
str_ends_with(const char *s, const char *suffix)
{
@@ -3107,27 +3098,25 @@ exp_simplify_math( mvc *sql, sql_exp *e,
sql_exp *lle = l->h->data;
sql_exp *lre = l->h->next->data;
if (!exp_is_atom(lle) &&
exp_is_atom(lre) && exp_is_atom(re)) {
- sql_subtype et =
*exp_subtype(e);
/* (x*c1)*c2 -> x * (c1*c2) */
- list *l = sa_list(sql->sa);
-
- /* lre and re may have
different types, so compute supertype */
- if (rel_convert_types(sql,
NULL, NULL, &lre, &re, 1, type_equal) < 0)
- return NULL;
- append(l, lre);
- append(l, re);
- le->l = l;
- le->f = sql_bind_func(sql,
"sys", "sql_mul", exp_subtype(lre), exp_subtype(re), F_FUNC);
- exp_sum_scales(le->f, lre, re);
- l = e->l;
- l->h->data = lle;
- l->h->next->data = le;
- e->f = sql_bind_func(sql,
"sys", "sql_mul", exp_subtype(lle), exp_subtype(le), F_FUNC);
- exp_sum_scales(e->f, lle, le);
- if (subtype_cmp(&et,
exp_subtype(e)) != 0)
- e =
exp_convert(sql->sa, e, exp_subtype(e), &et);
+ sql_exp *ne = NULL;
+
+ if (!(le = rel_binop_(sql,
NULL, lre, re, "sys", "sql_mul", card_value))) {
+ sql->session->status =
0;
+ sql->errstr[0] = '\0';
+ return e; /* error,
fallback to original expression */
+ }
+ if (!(ne = rel_binop_(sql,
NULL, lle, le, "sys", "sql_mul", card_value))) {
+ sql->session->status =
0;
+ sql->errstr[0] = '\0';
+ return e; /* error,
fallback to original expression */
+ }
+ if (subtype_cmp(exp_subtype(e),
exp_subtype(ne)) != 0)
+ ne =
exp_convert(sql->sa, ne, exp_subtype(ne), exp_subtype(e));
(*changes)++;
- return e;
+ if (exp_name(e))
+ exp_prop_alias(sql->sa,
ne, e);
+ return ne;
}
}
}
@@ -3925,14 +3914,18 @@ exps_merge_select_rse( mvc *sql, list *l
fnd = exp_in(sql->sa, le->l, exps, cmp_in);
} else if (le->f && re->f && /* merge ranges */
le->flag == re->flag && le->flag <= cmp_lt) {
- sql_subfunc *min = sql_bind_func(sql, "sys",
"sql_min", exp_subtype(le->r), exp_subtype(re->r), F_FUNC);
- sql_subfunc *max = sql_bind_func(sql, "sys",
"sql_max", exp_subtype(le->f), exp_subtype(re->f), F_FUNC);
- sql_exp *mine, *maxe;
-
- if (!min || !max)
+ sql_exp *mine = NULL, *maxe = NULL;
+
+ if (!(mine = rel_binop_(sql, NULL, le->r,
re->r, "sys", "sql_min", card_value))) {
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
continue;
- mine = exp_binop(sql->sa, le->r, re->r, min);
- maxe = exp_binop(sql->sa, le->f, re->f, max);
+ }
+ if (!(maxe = rel_binop_(sql, NULL, le->f,
re->f, "sys", "sql_max", card_value))) {
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ continue;
+ }
fnd = exp_compare2(sql->sa, le->l, mine, maxe,
CMP_BETWEEN|le->flag);
lmerged = false;
}
@@ -5460,11 +5453,12 @@ find_candidate_join2semi(sql_rel *rel, b
if (ok) {
ok = false;
- /* if all join expressions can be pushed down, then it
cannot be rewritten into a semijoin */
+ /* if all join expressions can be pushed down or have
function calls, then it cannot be rewritten into a semijoin */
for (node *n=rel->exps->h; n && !ok; n = n->next) {
sql_exp *e = n->data;
- ok |= !rel_has_cmp_exp(l, e) &&
!rel_has_cmp_exp(r, e);
+ ok |= e->type == e_cmp && (e->flag == cmp_equal
|| e->flag == mark_in) &&
+ !exp_has_func(e) &&
!rel_has_cmp_exp(l, e) && !rel_has_cmp_exp(r, e);
}
}
@@ -8479,6 +8473,7 @@ rel_reduce_casts(visitor *v, sql_rel *re
atom *a;
if (fst->scale && fst->scale ==
ft->scale && (a = exp_value(v->sql, ce)) != NULL) {
+ sql_exp *arg1, *arg2;
#ifdef HAVE_HGE
hge val = 1;
#else
@@ -8490,19 +8485,21 @@ rel_reduce_casts(visitor *v, sql_rel *re
scale -= rs;
- args =
new_exp_list(v->sql->sa);
while(scale > 0) {
scale--;
val *= 10;
}
- append(args, re);
+ arg1 = re;
#ifdef HAVE_HGE
- append(args,
exp_atom_hge(v->sql->sa, val));
+ arg2 =
exp_atom_hge(v->sql->sa, val);
#else
- append(args,
exp_atom_lng(v->sql->sa, val));
+ arg2 =
exp_atom_lng(v->sql->sa, val);
#endif
- f = find_func(v->sql,
"scale_down", args);
- nre =
exp_op(v->sql->sa, args, f);
+ if (!(nre =
rel_binop_(v->sql, NULL, arg1, arg2, "sys", "scale_down", card_value))) {
+
v->sql->session->status = 0;
+
v->sql->errstr[0] = '\0';
+ continue;
+ }
e =
exp_compare(v->sql->sa, le->l, nre, e->flag);
v->changes++;
}
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
@@ -2519,7 +2519,7 @@ rewrite_anyequal(visitor *v, sql_rel *re
if (!lsq && !is_tuple && is_values(re) &&
!exps_have_rel_exp(re->f)) { /* exp_values */
list *vals = re->f;
- if (is_select(rel->op)) {
+ if (depth == 0 && is_select(rel->op)) {
v->changes++;
return exp_in_compare(sql, &le, vals,
is_anyequal(sf));
} else {
diff --git a/sql/test/SQLancer/Tests/sqlancer13.test
b/sql/test/SQLancer/Tests/sqlancer13.test
--- a/sql/test/SQLancer/Tests/sqlancer13.test
+++ b/sql/test/SQLancer/Tests/sqlancer13.test
@@ -345,3 +345,71 @@ THEN + (3) WHEN NOT (TRUE) THEN least(5,
statement ok
ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE "t0" ("c0" DOUBLE PRECISION NOT NULL,"c2" VARCHAR(64))
+
+statement ok
+INSERT INTO "t0" VALUES (-0, ''),(0.9006985362687353,
'-698480774'),(0.48543984754620684, 'w(冒'),(3.9612322048489266,
'8'),(0.5616282788859702, NULL),
+(3.6391771849823393, NULL),(9, NULL),(2, NULL),(0.1798248731156511, '2')
+
+statement ok
+CREATE TABLE "t1" ("c0" DOUBLE PRECISION)
+
+statement ok
+INSERT INTO "t1" VALUES
(0.6521791858367552),(0.08122328703285808),(NULL),(0.346309674594371),(-172200039.77765536),(1)
+
+statement ok
+CREATE TABLE "t2" ("c1" DOUBLE PRECISION,"c2" BOOLEAN,"c3" BOOLEAN,CONSTRAINT
"t2_c1_unique" UNIQUE ("c1"))
+
+statement ok
+INSERT INTO "t2" VALUES (0.7020559018817172, false, NULL),(0.6236223127320935,
false, false),(7, true, true),(NULL, true, true)
+
+query I rowsort
+SELECT 1 FROM t0, t1 CROSS JOIN (SELECT DISTINCT t1.c0 > 4 FROM t1, t2 WHERE
t2.c2) AS sub0
+----
+108 values hashing to ff26cf0928970b7e2ae36570fa1cf383
+
+query I rowsort
+SELECT SUM(agg0) FROM (SELECT 1 as agg0 FROM t0, t1 CROSS JOIN (SELECT
DISTINCT t1.c0 > 4 FROM t1, t2
+WHERE t2.c2) AS sub0 WHERE ('Bw') NOT IN (least(t0.c2, t0.c2), CAST(t1.c0 AS
VARCHAR(64)))
+UNION ALL
+SELECT 1 as agg0 FROM t0, t1 CROSS JOIN (SELECT DISTINCT t1.c0 > 4 FROM t1, t2
+WHERE t2.c2) AS sub0 WHERE NOT (('Bw') NOT IN (least(t0.c2, t0.c2), CAST(t1.c0
AS VARCHAR(64))))
+UNION ALL
+SELECT 1 as agg0 FROM t0, t1 CROSS JOIN (SELECT DISTINCT t1.c0 > 4 FROM t1, t2
+WHERE t2.c2) AS sub0 WHERE (('Bw') NOT IN (least(t0.c2, t0.c2), CAST(t1.c0 AS
VARCHAR(64)))) IS NULL) as asdf
+----
+108
+
+query I rowsort
+SELECT 1 FROM t0, t1 CROSS JOIN (SELECT DISTINCT t1.c0 > 4 FROM t1, t2 WHERE
t2.c2) AS sub0 WHERE (('Bw') NOT IN (least(t0.c2, t0.c2), CAST(t1.c0 AS
VARCHAR(64)))) IS NULL
+----
+58 values hashing to 8fdc0683e1f7f9ff9590af46dca75282
+
+statement ok
+ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE "sys"."t1" ("c3" BOOLEAN)
+
+query T rowsort
+select (345*(case when t1.c3 then 0 else 578153020054067.9 end))*3 from t1
+union all
+select (345*(case when t1.c3 then 0 else 578153020054067.9 end))*3 from t1
+----
+
+query T rowsort
+select (1118551465*(case when t1.c3 then 0 else 0.5781530200540679 end))*3
from t1
+union all
+select (1118551465*(case when t1.c3 then 0 else 0.5781530200540679 end))*3
from t1
+----
+
+statement ok
+ROLLBACK
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list