[
https://issues.apache.org/jira/browse/CALCITE-6040?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17772813#comment-17772813
]
Ran Tao commented on CALCITE-6040:
----------------------------------
I think i got the reason. if we call `select map[1, null];` the second
operand deduced to INTEGER, but if we call `select map[null, 1];`, the first
operand type is correct (just keep null).
because the SqlMapValueConstructor extends SqlMultisetValueConstructor but just
override the OperandTypeChecker and ReturnTypeInference, remain the
operandTypeInference to be FIRST_KNOWN, so the previous case will convert to
INTEGER.
IMHO, considering the map constructor, the key and value type of map should not
affect each other. Key and value can refer to the types of their respective
positions, which means we need to rewrite OperandTypeInference in
SqlMapValueConstructor.
> SqlOperatorFixture check result type failed for converted types
> ---------------------------------------------------------------
>
> Key: CALCITE-6040
> URL: https://issues.apache.org/jira/browse/CALCITE-6040
> Project: Calcite
> Issue Type: Bug
> Components: tests
> Affects Versions: 1.35.0
> Reporter: Ran Tao
> Priority: Major
>
> we have a simple test case:
> {code:java}
> f.checkScalar("map[1, null]", "{1=null}",
> "(INTEGER NOT NULL, NULL) MAP NOT NULL"); {code}
> The result is:
> {noformat}
> java.lang.AssertionError: Query: values (map[1, null])
> Expected: is "(INTEGER NOT NULL, NULL) MAP NOT NULL"
> but: was "(INTEGER NOT NULL, INTEGER) MAP NOT NULL"
> {noformat}
> however, the asserted actual result "(INTEGER NOT NULL, INTEGER) MAP NOT
> NULL" for this case is wrong. If we switch to this asserted actual result it
> throws another exception:
> {noformat}
> java.lang.AssertionError: Query: select map[p0, null] from (values (1)) as
> t(p0)
> Expected: is "(INTEGER NOT NULL, INTEGER) MAP NOT NULL"
> but: was "(INTEGER NOT NULL, NULL) MAP NOT NULL"
> {noformat}
> No matter how you write this result type in test case, it is wrong.
> by showing the plan, it seems the deduced value type has converted to INTEGER.
> {noformat}
> 0: jdbc:calcite:model=src/test/resources/mode> explain plan for select map[1,
> null];
> +------------------------------------------------------------------------------------------------------------+
> | PLAN
> |
> +------------------------------------------------------------------------------------------------------------+
> | EnumerableCalc(expr#0=[\{inputs}], expr#1=[1], expr#2=[null:INTEGER],
> expr#3=[MAP($t1, $t2)], EXPR$0=[$t3])
> EnumerableValues(tuples=[[\{ 0 }]])
> |
> +------------------------------------------------------------------------------------------------------------+
> {noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)