[
https://issues.apache.org/jira/browse/CALCITE-7829?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Tomasz Gawęda updated CALCITE-7829:
-----------------------------------
Description:
In Hazelcast we have a test called RowAssignmentTypeCoercionTest. When trying
to upgrade to Calcite 1.42 we've noticed, that some cases fail (despite working
previously).
For example, queries:
{code:sql}
CREATE MAPPING m type IMap OPTIONS('keyFormat'='int', 'valueFormat'='java',
'valueJavaClass'='com.hazelcast.jet.sql.impl.support.expressions.ExpressionValue$ObjectVal')
SINK INTO m VALUES(0, cast('01:42:00' as time), 0)
{code}
translate to:
{code:java}
LogicalTableSink(table=[[hazelcast, public, m[projects=[$0, $1, $2, $3]]]],
operation=[INSERT], flattened=[false])
LogicalCalc(expr#0=[\{inputs}], expr#1=[0], expr#2=[6120000],
expr#3=[CAST($t2):OBJECT], expr#4=[null:OBJECT], __key=[$t1], field1=[$t3],
key=[$t1], this=[$t4])
LogicalValues(tuples=[[\{ 0 }]])
{code}
As you can see, `01:42:00` was translated to 6120000. This integer value is
then written to a field of type OBJECT.
Previously, in 1.39 dates and times landed in "object" field with their real
types, not converted to integer, which makes me believe, that RexSimplify
tries. to simplify a bit too much.
(cast(cast('01:42:00' as time) as object) = time written to object column, not
integer value.
More from trace logs from this test:
{code:java}
16:13:53,549 TRACE |test_insertValues[TestParams{id=2014, srcType=TIME,
targetType=OBJECT, srcValue=01:42}]| - [parser] test_insertValues - After
unconditional rewrite: SINK INTO `m`
VALUES ROW(0, CAST('01:42:00' AS TIME), 0)
16:13:53,576 TRACE |test_insertValues[TestParams{id=2014, srcType=TIME,
targetType=OBJECT, srcValue=01:42}]| - [parser] test_insertValues - After
validation: SINK INTO `hazelcast`.`public`.`m` (`__key`, `field1`, `key`)
VALUES ROW(CAST(0 AS INTEGER), CAST('01:42:00' AS TIME), CAST(0 AS INTEGER))
16:13:53,759 DEBUG |test_insertValues[TestParams{id=2014, srcType=TIME,
targetType=OBJECT, srcValue=01:42}]| - [sql2rel] test_insertValues - Plan after
converting SqlNode to RelNode
LogicalTableSink(table=[[hazelcast, public, m[projects=[$0, $1, $2, $3]]]],
operation=[INSERT], flattened=[false])
LogicalProject(__key=[0], field1=[CAST(6120000):OBJECT], key=[0],
this=[null:OBJECT])
LogicalValues(tuples=[[{ 0 }]])
{code}
was:
In Hazelcast we have a test called RowAssignmentTypeCoercionTest. When trying
to upgrade to Calcite 1.42 we've noticed, that some cases fail (despite working
previously).
For example, queries:
CREATE MAPPING m type IMap OPTIONS('keyFormat'='int', 'valueFormat'='java',
'valueJavaClass'='com.hazelcast.jet.sql.impl.support.expressions.ExpressionValue$ObjectVal')
SINK INTO m VALUES(0, cast('01:42:00' as time), 0)
translate to:
```
LogicalTableSink(table=[[hazelcast, public, m[projects=[$0, $1, $2, $3]]]],
operation=[INSERT], flattened=[false])
LogicalCalc(expr#0=[\{inputs}], expr#1=[0], expr#2=[6120000],
expr#3=[CAST($t2):OBJECT], expr#4=[null:OBJECT], __key=[$t1], field1=[$t3],
key=[$t1], this=[$t4])
LogicalValues(tuples=[[\{ 0 }]])
```
As you can see, `01:42:00` was translated to 6120000. This integer value is
then written to a field of type OBJECT.
Previously, in 1.39 dates and times landed in "object" field with their real
types, not converted to integer, which makes me believe, that RexSimplify
tries. to simplify a bit too much.
(cast(cast('01:42:00' as time) as object) = time written to object column, not
integer value.
> RexSimplify rewrites Date to int
> --------------------------------
>
> Key: CALCITE-7829
> URL: https://issues.apache.org/jira/browse/CALCITE-7829
> Project: Calcite
> Issue Type: Bug
> Reporter: Tomasz Gawęda
> Priority: Major
>
> In Hazelcast we have a test called RowAssignmentTypeCoercionTest. When trying
> to upgrade to Calcite 1.42 we've noticed, that some cases fail (despite
> working previously).
>
> For example, queries:
> {code:sql}
> CREATE MAPPING m type IMap OPTIONS('keyFormat'='int', 'valueFormat'='java',
> 'valueJavaClass'='com.hazelcast.jet.sql.impl.support.expressions.ExpressionValue$ObjectVal')
> SINK INTO m VALUES(0, cast('01:42:00' as time), 0)
> {code}
> translate to:
> {code:java}
> LogicalTableSink(table=[[hazelcast, public, m[projects=[$0, $1, $2, $3]]]],
> operation=[INSERT], flattened=[false])
> LogicalCalc(expr#0=[\{inputs}], expr#1=[0], expr#2=[6120000],
> expr#3=[CAST($t2):OBJECT], expr#4=[null:OBJECT], __key=[$t1], field1=[$t3],
> key=[$t1], this=[$t4])
> LogicalValues(tuples=[[\{ 0 }]])
> {code}
> As you can see, `01:42:00` was translated to 6120000. This integer value is
> then written to a field of type OBJECT.
> Previously, in 1.39 dates and times landed in "object" field with their real
> types, not converted to integer, which makes me believe, that RexSimplify
> tries. to simplify a bit too much.
> (cast(cast('01:42:00' as time) as object) = time written to object column,
> not integer value.
> More from trace logs from this test:
> {code:java}
> 16:13:53,549 TRACE |test_insertValues[TestParams{id=2014, srcType=TIME,
> targetType=OBJECT, srcValue=01:42}]| - [parser] test_insertValues - After
> unconditional rewrite: SINK INTO `m`
> VALUES ROW(0, CAST('01:42:00' AS TIME), 0)
> 16:13:53,576 TRACE |test_insertValues[TestParams{id=2014, srcType=TIME,
> targetType=OBJECT, srcValue=01:42}]| - [parser] test_insertValues - After
> validation: SINK INTO `hazelcast`.`public`.`m` (`__key`, `field1`, `key`)
> VALUES ROW(CAST(0 AS INTEGER), CAST('01:42:00' AS TIME), CAST(0 AS INTEGER))
> 16:13:53,759 DEBUG |test_insertValues[TestParams{id=2014, srcType=TIME,
> targetType=OBJECT, srcValue=01:42}]| - [sql2rel] test_insertValues - Plan
> after converting SqlNode to RelNode
> LogicalTableSink(table=[[hazelcast, public, m[projects=[$0, $1, $2, $3]]]],
> operation=[INSERT], flattened=[false])
> LogicalProject(__key=[0], field1=[CAST(6120000):OBJECT], key=[0],
> this=[null:OBJECT])
> LogicalValues(tuples=[[{ 0 }]])
> {code}
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)