[ 
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)

Reply via email to