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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to