Changeset: 9c9853d55ee6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9c9853d55ee6
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/SQLancer/Tests/sqlancer19.SQL.py
Branch: default
Log Message:

Do the TODOs


diffs (148 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
@@ -2999,6 +2999,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                        if (exp_is_atom(le) && exp_is_zero(le) && 
exp_is_atom(re) && exp_is_not_null(re)) {
                                (*changes)++;
                                le = exp_zero(sql->sa, et);
+                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(le)) != 0)
+                                       le = exp_convert(sql->sa, le, 
exp_subtype(le), exp_subtype(e));
                                if (exp_name(e))
                                        exp_prop_alias(sql->sa, le, e);
                                return le;
@@ -3007,6 +3009,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                        if (exp_is_atom(re) && exp_is_zero(re) && 
exp_is_atom(le) && exp_is_not_null(le)) {
                                (*changes)++;
                                re = exp_zero(sql->sa, et);
+                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(re)) != 0)
+                                       re = exp_convert(sql->sa, re, 
exp_subtype(re), exp_subtype(e));
                                if (exp_name(e))
                                        exp_prop_alias(sql->sa, re, e);
                                return re;
@@ -3014,6 +3018,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                        /* 1*a = a
                        if (exp_is_atom(le) && exp_is_one(le)) {
                                (*changes)++;
+                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(re)) != 0)
+                                       re = exp_convert(sql->sa, re, 
exp_subtype(re), exp_subtype(e));
                                if (exp_name(e))
                                        exp_prop_alias(sql->sa, re, e);
                                return re;
@@ -3022,6 +3028,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                        /* a*1 = a
                        if (exp_is_atom(re) && exp_is_one(re)) {
                                (*changes)++;
+                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(le)) != 0)
+                                       le = exp_convert(sql->sa, le, 
exp_subtype(le), exp_subtype(e));
                                if (exp_name(e))
                                        exp_prop_alias(sql->sa, le, e);
                                return le;
@@ -3031,12 +3039,13 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                                atom *la = exp_flatten(sql, le);
                                atom *ra = exp_flatten(sql, re);
 
-                               /* TODO check if output type is larger then 
input */
                                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(la, ra);
 
                                        if (a && atom_cast(sql->sa, a, 
exp_subtype(e))) {
                                                sql_exp *ne = exp_atom(sql->sa, 
a);
+                                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(ne)) != 0)
+                                                       ne = 
exp_convert(sql->sa, ne, exp_subtype(ne), exp_subtype(e));
                                                (*changes)++;
                                                if (exp_name(e))
                                                        exp_prop_alias(sql->sa, 
ne, e);
@@ -3060,6 +3069,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                                append(l, re);
                                (*changes)++;
                                ne = exp_op(sql->sa, l, pow);
+                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(ne)) != 0)
+                                       ne = exp_convert(sql->sa, ne, 
exp_subtype(ne), exp_subtype(e));
                                if (exp_name(e))
                                        exp_prop_alias(sql->sa, ne, e);
                                return ne;
@@ -3074,6 +3085,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                                        sql_exp *lre = l->h->next->data;
                                        if (exp_equal(re, lle)==0) {
                                                if (atom_inc(exp_value(sql, 
lre))) {
+                                                       if 
(subtype_cmp(exp_subtype(e), exp_subtype(le)) != 0)
+                                                               le = 
exp_convert(sql->sa, le, exp_subtype(le), exp_subtype(e));
                                                        (*changes)++;
                                                        if (exp_name(e))
                                                                
exp_prop_alias(sql->sa, le, e);
@@ -3112,12 +3125,16 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                        sql_exp *le = l->h->data;
                        sql_exp *re = l->h->next->data;
                        if (exp_is_atom(le) && exp_is_zero(le)) {
+                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(re)) != 0)
+                                       re = exp_convert(sql->sa, re, 
exp_subtype(re), exp_subtype(e));
                                (*changes)++;
                                if (exp_name(e))
                                        exp_prop_alias(sql->sa, re, e);
                                return re;
                        }
                        if (exp_is_atom(re) && exp_is_zero(re)) {
+                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(le)) != 0)
+                                       le = exp_convert(sql->sa, le, 
exp_subtype(le), exp_subtype(e));
                                (*changes)++;
                                if (exp_name(e))
                                        exp_prop_alias(sql->sa, le, e);
@@ -3132,6 +3149,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
 
                                        if (a) {
                                                sql_exp *ne = exp_atom(sql->sa, 
a);
+                                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(ne)) != 0)
+                                                       ne = 
exp_convert(sql->sa, ne, exp_subtype(ne), exp_subtype(e));
                                                (*changes)++;
                                                if (exp_name(e))
                                                        exp_prop_alias(sql->sa, 
ne, e);
@@ -3197,6 +3216,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
 
                                        if (a) {
                                                sql_exp *ne = exp_atom(sql->sa, 
a);
+                                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(ne)) != 0)
+                                                       ne = 
exp_convert(sql->sa, ne, exp_subtype(ne), exp_subtype(e));
                                                (*changes)++;
                                                if (exp_name(e))
                                                        exp_prop_alias(sql->sa, 
ne, e);
@@ -3216,6 +3237,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                                        return e;
                                }
                                ne = exp_atom(sql->sa, a);
+                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(ne)) != 0)
+                                       ne = exp_convert(sql->sa, ne, 
exp_subtype(ne), exp_subtype(e));
                                (*changes)++;
                                if (exp_name(e))
                                        exp_prop_alias(sql->sa, ne, e);
@@ -3229,6 +3252,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                                        sql_exp *lre = ll->h->next->data;
                                        if (exp_equal(re, lre) == 0) {
                                                /* (x+a)-a = x*/
+                                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(lle)) != 0)
+                                                       lle = 
exp_convert(sql->sa, lle, exp_subtype(lle), exp_subtype(e));
                                                if (exp_name(e))
                                                        exp_prop_alias(sql->sa, 
lle, e);
                                                (*changes)++;
@@ -3269,7 +3294,7 @@ exp_simplify_math( mvc *sql, sql_exp *e,
        }
        if (e->type == e_convert)
                if (!(e->l = exp_simplify_math(sql, e->l, changes)))
-                               return NULL;
+                       return NULL;
        return e;
 }
 
diff --git a/sql/test/SQLancer/Tests/sqlancer19.SQL.py 
b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
--- a/sql/test/SQLancer/Tests/sqlancer19.SQL.py
+++ b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
@@ -95,6 +95,10 @@ with SQLTestCase() as cli:
         .assertSucceeded().assertDataResultMatch([(Decimal('0.02000'),)])
     cli.execute("SELECT CAST(2 AS DECIMAL) * 0.010 FROM rt3 where rt3.c0 = 
1;") \
         .assertSucceeded().assertDataResultMatch([(Decimal('0.02000'),)])
+    cli.execute("SELECT sql_min(4, 7 - 0.5207499) FROM t3 where t3.c0 = 1;") \
+        .assertSucceeded().assertDataResultMatch([(Decimal('4.0000000'),)])
+    cli.execute("SELECT sql_min(4, 7 - 0.5207499) FROM rt3 where rt3.c0 = 1;") 
\
+        .assertSucceeded().assertDataResultMatch([(Decimal('4.0000000'),)])
     cli.execute("SELECT \"insert\"('99', 5, 8, '10S') FROM t3 where t3.c0 = 
1;") \
         .assertSucceeded().assertDataResultMatch([("9910S",)])
     cli.execute("SELECT \"insert\"('99', 5, 8, '10S') FROM rt3 where rt3.c0 = 
1;") \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to