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