Changeset: c0156b4f4fc6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c0156b4f4fc6
Modified Files:
sql/server/rel_exp.c
sql/server/sql_atom.c
sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.test
sql/test/SQLancer/Tests/sqlancer17.test
sql/test/SQLancer/Tests/sqlancer19.SQL.py
sql/test/mergetables/Tests/mergequery.test
sql/test/sys-schema/Tests/webExamplesComparisonFunctionsOperators.test
sql/test/sys-schema/Tests/webExamplesMathematicalFunctionsOperators.test
Branch: Jan2022
Log Message:
If the to be casted type is a subtype, it may be different, so do the cast
diffs (150 lines):
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
@@ -3049,7 +3049,6 @@ exp_convert_inplace(mvc *sql, sql_subtyp
if ((na = atom_cast(sql->sa, a, t))) {
exp->l = na;
- exp->tpe = *t;
return exp;
}
return NULL;
diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c
--- a/sql/server/sql_atom.c
+++ b/sql/server/sql_atom.c
@@ -697,8 +697,19 @@ atom_cast(sql_allocator *sa, atom *a, sq
atom *na = NULL;
sql_subtype *at = &a->tpe;
- if (subtype_cmp(at, tp) == 0)
+ if (subtype_cmp(at, tp) == 0) {
+ /* it may be a subtype, but still a different one */
+ if (at->type->base.id != tp->type->base.id ||
+ at->digits != tp->digits || at->scale != tp->scale) {
+ na = atom_create(sa);
+ SA_VALcopy(sa, &na->data, &a->data);
+ na->data.vtype = tp->type->localtype;
+ na->tpe = *tp;
+ na->isnull = a->isnull;
+ return na;
+ }
return a;
+ }
if (!a->isnull) {
/* need to do a cast, start simple is atom type a subtype of tp
*/
if ((at->type->eclass == tp->type->eclass ||
diff --git
a/sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.test
b/sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.test
---
a/sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.test
+++
b/sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.test
@@ -185,7 +185,7 @@ top N (
| | | | ) [ ("a3"."t3pkcol" HASHCOL ) = ("table1"."t1cold113") ],
| | | | table("sys"."table12") [ "table12"."t12cola1" ]
| | | ) [ ("table12"."t12cola1") = ("table1"."t1cola1") ]
-| | ) [ ((((((((((((((("table1"."t1cold1") FILTER "sys"."like"(clob "%a%",
clob "", boolean(1) "true")) or (("table1"."t1cola1") FILTER "sys"."like"(clob
"%a%", clob "", boolean(1) "true"))) or (("table1"."t1colb1") FILTER
"sys"."like"(clob "%a%", clob "", boolean(1) "true"))) or
(("table1"."t1cola11") FILTER "sys"."like"(clob "%business%", clob "",
boolean(1) "true"))) or (("table1"."t1colc91") >= (timestamp(7) "2016-03-21
05:00:00.000000"))) or (("table1"."t1cola101") = (tinyint(1) "1"))) or
(("table1"."t1cola12") FILTER "sys"."like"(clob "%Vijay%", clob "", boolean(1)
"true"))) or (("table2"."t2cola1") ! FILTER "sys"."like"(clob "%gmail%", clob
"", boolean(1) "true"), ("table2"."t2cola1") ! FILTER "sys"."like"(clob
"%yahoo%", clob "", boolean(1) "true"))) or (("table2"."t2cola1") FILTER
"sys"."like"(clob "%efequitygroup.com%", clob "", boolean(1) "true"))) or
(("table4"."t4cola1") = (clob "Customer"))) or (("table4"."t4cola2") ! * =
(clob NULL))) or (("table2"."t2cola81") >= (dat
e "2009-08-31"))) or (((("table5"."t5cola1") = (clob "BAT")) or
(("table5"."t5cola2") FILTER "sys"."like"(clob "%AUSTRALIA%", clob "",
boolean(1) "true"))) or (("table5"."t5cola2") FILTER "sys"."like"(clob
"%Monet%", clob "", boolean(1) "true"), ("table5"."t5cola3") = (clob
"Facebook"), ("table5"."t5cola5") = (clob "new"), ("table5"."t5cola81") > (date
"2015-07-30")))) or (((("table10"."t10cola1") != (clob "Completed"),
("table9"."t9cola1") = (clob "Tasks"), ("table9"."t9cola91") >= (timestamp(7)
"2012-01-01 04:32:27.000000"), ("table10"."t10cola91") <= (timestamp(7)
"2013-01-01 04:32:27.000000")) or (("table9"."t9cola1") = (clob "Events"),
(timestamp(7) "2012-01-01 04:32:27.000000") <= ("table11"."t11cola91") <=
(timestamp(7) "2013-01-01 04:32:27.000000"))) or (("table9"."t9cola1") = (clob
"Calls"), (timestamp(7) "2012-01-01 04:32:27.000000") <=
("table10"."t10cola91") <= (timestamp(7) "2013-01-01 04:32:27.000000"))),
("table1"."t1cold111") in (bigint(54) "15842000014793046", bigin
t(54) "15842000017701488", bigint(54) "15842000000024019", bigint(54)
"15842000000074007", bigint(54) "15842000009358096", bigint(54)
"15842000010487625", bigint(54) "15842000006731919", bigint(54)
"15842000002590112", bigint(54) "15842000000019001", bigint(54)
"15842000014923682", bigint(54) "15842000027547249")) or
(("table12"."t12cola1") in (clob[bigint(54) "15842000280111951"] NOT NULL,
clob[bigint(54) "15842000280163015"] NOT NULL)) ]
+| | ) [ ((((((((((((((("table1"."t1cold1") FILTER "sys"."like"(clob "%a%",
clob "", boolean(1) "true")) or (("table1"."t1cola1") FILTER "sys"."like"(clob
"%a%", clob "", boolean(1) "true"))) or (("table1"."t1colb1") FILTER
"sys"."like"(clob "%a%", clob "", boolean(1) "true"))) or
(("table1"."t1cola11") FILTER "sys"."like"(clob "%business%", clob "",
boolean(1) "true"))) or (("table1"."t1colc91") >= (timestamp(7) "2016-03-21
05:00:00.000000"))) or (("table1"."t1cola101") = (tinyint(1) "1"))) or
(("table1"."t1cola12") FILTER "sys"."like"(clob "%Vijay%", clob "", boolean(1)
"true"))) or (("table2"."t2cola1") ! FILTER "sys"."like"(clob "%gmail%", clob
"", boolean(1) "true"), ("table2"."t2cola1") ! FILTER "sys"."like"(clob
"%yahoo%", clob "", boolean(1) "true"))) or (("table2"."t2cola1") FILTER
"sys"."like"(clob "%efequitygroup.com%", clob "", boolean(1) "true"))) or
(("table4"."t4cola1") = (clob "Customer"))) or (("table4"."t4cola2") ! * =
(clob NULL))) or (("table2"."t2cola81") >= (dat
e "2009-08-31"))) or (((("table5"."t5cola1") = (clob "BAT")) or
(("table5"."t5cola2") FILTER "sys"."like"(clob "%AUSTRALIA%", clob "",
boolean(1) "true"))) or (("table5"."t5cola2") FILTER "sys"."like"(clob
"%Monet%", clob "", boolean(1) "true"), ("table5"."t5cola3") = (clob
"Facebook"), ("table5"."t5cola5") = (clob "new"), ("table5"."t5cola81") > (date
"2015-07-30")))) or (((("table10"."t10cola1") != (clob "Completed"),
("table9"."t9cola1") = (clob "Tasks"), ("table9"."t9cola91") >= (timestamp(7)
"2012-01-01 04:32:27.000000"), ("table10"."t10cola91") <= (timestamp(7)
"2013-01-01 04:32:27.000000")) or (("table9"."t9cola1") = (clob "Events"),
(timestamp(7) "2012-01-01 04:32:27.000000") <= ("table11"."t11cola91") <=
(timestamp(7) "2013-01-01 04:32:27.000000"))) or (("table9"."t9cola1") = (clob
"Calls"), (timestamp(7) "2012-01-01 04:32:27.000000") <=
("table10"."t10cola91") <= (timestamp(7) "2013-01-01 04:32:27.000000"))),
("table1"."t1cold111") in (bigint(64) "15842000014793046", bigin
t(64) "15842000017701488", bigint(64) "15842000000024019", bigint(64)
"15842000000074007", bigint(64) "15842000009358096", bigint(64)
"15842000010487625", bigint(64) "15842000006731919", bigint(64)
"15842000002590112", bigint(64) "15842000000019001", bigint(64)
"15842000014923682", bigint(64) "15842000027547249")) or
(("table12"."t12cola1") in (clob[bigint(54) "15842000280111951"] NOT NULL,
clob[bigint(54) "15842000280163015"] NOT NULL)) ]
| ) [ "table1"."t1pkcol" NOT NULL HASHCOL , "table1"."t1cola82",
"table2"."t2cola10", "table1"."t1cola1", "table1"."t1cola91", "a1"."t3cola1" ]
[ "table2"."t2cola82" NULLS LAST ]
) [ bigint(64) "10", bigint(64) "0" ]
diff --git a/sql/test/SQLancer/Tests/sqlancer17.test
b/sql/test/SQLancer/Tests/sqlancer17.test
--- a/sql/test/SQLancer/Tests/sqlancer17.test
+++ b/sql/test/SQLancer/Tests/sqlancer17.test
@@ -72,12 +72,12 @@ project (
| | | | project (
| | | | | select (
| | | | | | [ boolean(1) "true" ]
-| | | | | ) [ (tinyint(2) "2") ! <= (tinyint(1) "1") ! <= (tinyint(2) "2"),
(tinyint(2) "3") <= (tinyint(2) "2") <= (tinyint(3) "5") ]
+| | | | | ) [ (tinyint(2) "2") ! <= (tinyint(2) "1") ! <= (tinyint(2) "2"),
(tinyint(3) "3") <= (tinyint(2) "2") <= (tinyint(2) "5") ]
| | | | ) [ tinyint(2) "2" as "v0"."vc0" ],
| | | | project (
| | | | | select (
| | | | | | [ boolean(1) "true" ]
-| | | | | ) [ (tinyint(3) "4") ! <= (tinyint(1) "1") ! <= (tinyint(3) "4"),
(tinyint(2) "3") <= (tinyint(3) "4") <= (tinyint(3) "5") ]
+| | | | | ) [ (tinyint(3) "4") ! <= (tinyint(2) "1") ! <= (tinyint(3) "4"),
(tinyint(3) "3") <= (tinyint(3) "4") <= (tinyint(2) "5") ]
| | | | ) [ tinyint(3) "4" as "v0"."vc0" ]
| | | ) [ "v0"."vc0" NOT NULL ]
| | ) [ "sys"."sql_max"(tinyint(1) "1", tinyint(1) "1") NOT NULL as
"v20"."vc0" ]
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
@@ -166,6 +166,12 @@ with SQLTestCase() as cli:
.assertSucceeded().assertDataResultMatch([("d\\\x06VW",)])
cli.execute("SELECT U&'&+000064&+00005C&+000006&+000056&+000057' UESCAPE
'&' from rt3 where rt3.c0 = 1;") \
.assertSucceeded().assertDataResultMatch([("d\\\x06VW",)])
+ cli.execute("""SELECT 1 FROM t1 INNER JOIN (SELECT greatest('a', NULL),
INTERVAL '4' DAY FROM t3 where t3.c0 = 1) AS q(c0,c1) ON INTERVAL '3' DAY
+ BETWEEN sql_sub(CAST(INTERVAL '3' SECOND AS INTERVAL DAY),
INTERVAL '2' DAY) AND q.c1;""") \
+
.assertSucceeded().assertDataResultMatch([(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,)])
+ cli.execute("""SELECT 1 FROM t1 INNER JOIN (SELECT greatest('a', NULL),
INTERVAL '4' DAY FROM rt3 where rt3.c0 = 1) AS q(c0,c1) ON INTERVAL '3' DAY
+ BETWEEN sql_sub(CAST(INTERVAL '3' SECOND AS INTERVAL DAY),
INTERVAL '2' DAY) AND q.c1;""") \
+
.assertSucceeded().assertDataResultMatch([(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,)])
cli.execute("""
CREATE FUNCTION testremote(a int) RETURNS INT
BEGIN
diff --git a/sql/test/mergetables/Tests/mergequery.test
b/sql/test/mergetables/Tests/mergequery.test
--- a/sql/test/mergetables/Tests/mergequery.test
+++ b/sql/test/mergetables/Tests/mergequery.test
@@ -148,7 +148,7 @@ PLAN SELECT * FROM complete where x >= 1
project (
| select (
| | table("sys"."part1") [ "part1"."x" as "complete"."x", "part1"."y" as
"complete"."y", "part1"."z" as "complete"."z" ]
-| ) [ (double(53,1) "1") <= ("complete"."x") < (double(53,1) "2") ]
+| ) [ (double(53) "1") <= ("complete"."x") < (double(53) "2") ]
) [ "complete"."x", "complete"."y", "complete"."z" ]
query RRR rowsort
@@ -167,7 +167,7 @@ PLAN SELECT * FROM complete where x > 1.
project (
| select (
| | table("sys"."part2") [ "part2"."x" as "complete"."x", "part2"."y" as
"complete"."y", "part2"."z" as "complete"."z" ]
-| ) [ (double(53,1) "1") < ("complete"."x") <= (double(53,1) "2") ]
+| ) [ (double(53) "1") < ("complete"."x") <= (double(53) "2") ]
) [ "complete"."x", "complete"."y", "complete"."z" ]
query RRR rowsort
@@ -200,12 +200,12 @@ union (
| project (
| | select (
| | | table("sys"."part1") [ "part1"."x" as "complete"."x", "part1"."y" as
"complete"."y", "part1"."z" as "complete"."z" ]
-| | ) [ (double(53,1) "1") <= ("complete"."x") <= (double(53,1) "2") ]
+| | ) [ (double(53) "1") <= ("complete"."x") <= (double(53) "2") ]
| ) [ "complete"."x", "complete"."y", "complete"."z" ],
| project (
| | select (
| | | table("sys"."part2") [ "part2"."x" as "complete"."x", "part2"."y" as
"complete"."y", "part2"."z" as "complete"."z" ]
-| | ) [ (double(53,1) "1") <= ("complete"."x") <= (double(53,1) "2") ]
+| | ) [ (double(53) "1") <= ("complete"."x") <= (double(53) "2") ]
| ) [ "complete"."x", "complete"."y", "complete"."z" ]
) [ "complete"."x", "complete"."y", "complete"."z" ]
diff --git
a/sql/test/sys-schema/Tests/webExamplesComparisonFunctionsOperators.test
b/sql/test/sys-schema/Tests/webExamplesComparisonFunctionsOperators.test
--- a/sql/test/sys-schema/Tests/webExamplesComparisonFunctionsOperators.test
+++ b/sql/test/sys-schema/Tests/webExamplesComparisonFunctionsOperators.test
@@ -752,7 +752,7 @@ plan select CASE WHEN 9 = 9 THEN NULL EL
----
project (
| [ boolean(1) "true" ]
-) [ "sys"."case"("sys"."="(tinyint(4) "9", tinyint(4) "9") NOT NULL,
tinyint(8) NULL, tinyint(4) "9") ]
+) [ "sys"."case"("sys"."="(tinyint(4) "9", tinyint(4) "9") NOT NULL,
tinyint(8) NULL, tinyint(8) "9") ]
query I rowsort
select 'db' between 'abc' and 'db' as tru
diff --git
a/sql/test/sys-schema/Tests/webExamplesMathematicalFunctionsOperators.test
b/sql/test/sys-schema/Tests/webExamplesMathematicalFunctionsOperators.test
--- a/sql/test/sys-schema/Tests/webExamplesMathematicalFunctionsOperators.test
+++ b/sql/test/sys-schema/Tests/webExamplesMathematicalFunctionsOperators.test
@@ -108,7 +108,7 @@ plan select 1 << 4
----
project (
| [ boolean(1) "true" ]
-) [ "sys"."left_shift"(tinyint(1) "1", int(32) "4") NOT NULL ]
+) [ "sys"."left_shift"(tinyint(8) "1", int(32) "4") NOT NULL ]
query I rowsort
select left_shift(1, 4)
@@ -125,7 +125,7 @@ plan select 8 >> 2
----
project (
| [ boolean(1) "true" ]
-) [ "sys"."right_shift"(tinyint(4) "8", int(32) "2") NOT NULL ]
+) [ "sys"."right_shift"(tinyint(8) "8", int(32) "2") NOT NULL ]
query I rowsort
select right_shift(16, 2)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list