Thinking about this a little more I have reached the conclusion that this is 
indeed a bug in Calcite. But it does affect multiple functions, not just UPPER.

Mihai
________________________________
From: stanilovsky evgeny <estanilovs...@gridgain.com>
Sent: Tuesday, January 16, 2024 9:29 PM
To: dev@calcite.apache.org <dev@calcite.apache.org>
Subject: Re: [Question] Derived type from string expression with NULL parameter

got it, thanks for clarifications.

> There is no clear spec of what the type should be, so it's hard to say
> whether this is a bug. The NULL type that is inferred can be interpreted
> as correct given the context, that expression indeed will evaluate to
> NULL. It is more specific than VARCHAR, though. But if this function is
> wrong, many other functions are wrong.
>
> Mihai
> ________________________________
> From: stanilovsky evgeny <estanilovs...@gridgain.com>
> Sent: Sunday, January 14, 2024 11:57 PM
> To: dev@calcite.apache.org <dev@calcite.apache.org>
> Subject: Re: [Question] Derived type from string expression with NULL
> parameter
>
> Thanks for reply, so can i interpret it as a bug and fill an issue ?
>
>> So maybe the bug is in the fact that UPPER uses the constructor for
>> SqlFunction (well, almost a constructor) which doesn't supply an operand
>> type inference argument.
>>
>> Still, if the operand type checker requires a CHARACTER family, why is a
>> NULL literal always accepted?
>>
>> Mihai
>>
>> ________________________________
>> From: Julian Hyde <jhyde.apa...@gmail.com>
>> Sent: Friday, January 12, 2024 11:52 AM
>> To: dev@calcite.apache.org <dev@calcite.apache.org>
>> Subject: Re: [Question] Derived type from string expression with NULL
>> parameter
>>
>> OperandTypeChecker just makes sure that arguments of known type are
>> compatible; another interface, SqlOperandTypeInference, infers the types
>> of arguments of unknown type.
>>
>> Hopefully it’s now a little less mysterious.
>>
>>> On Jan 12, 2024, at 11:12 AM, Mihai Budiu <mbu...@gmail.com> wrote:
>>>
>>> inference in Calcite is still mysterious to me.
>>> Here it infers the type of the argument of UPPER to be NULL instead of
>>> VARCHAR.
>>> That's why the result type of UPPER is also NULL.
>>> The fact that UPPER has an OperandTypeChecker of
>>> "OperandTypes.CHARACTER" is completely ignored:
>>>
>>> public static final SqlFunction UPPER =
>>>      SqlBasicFunction.create("UPPER",
>>>          ReturnTypes.ARG0_NULLABLE,
>>>          OperandTypes.CHARACTER,
>>>          SqlFunctionCategory.STRING);
>>>
>>> Mihai
>>> ________________________________
>>> From: stanilovsky evgeny <estanilovs...@gridgain.com>
>>> Sent: Friday, January 12, 2024 4:23 AM
>>> To: dev@calcite.apache.org <dev@calcite.apache.org>
>>> Subject: [Question] Derived type from string expression with NULL
>>> parameter
>>>
>>> Plz help me to understand is it a bug ?
>>> From standard:
>>> 6.18 <string value function>
>>> ...cut...
>>> <fold> ::= { UPPER | LOWER } <left paren> <character value expression>
>>> <right paren>
>>>
>>> 6)If <fold> is specified, then:
>>> a) The declared type of the result of <fold> is the declared type of
>>> the
>>> !!!<character value expression>!!!.
>>>
>>> thus i expect that return type from: SELECT UPPER(null) will be VARCHAR
>>> but calcite show :
>>> SqlValidatorTest
>>>
>>>   @Test void testTypeOfUpper() {
>>>     sql("SELECT UPPER(NULL)")
>>>         .columnType("???");
>>>   }
>>>
>>> Expected: is "???"
>>>      but: was "NULL"
>>>
>>> I think it need to be fixed ?
>>>
>>> Thanks !

Reply via email to