[ 
https://issues.apache.org/jira/browse/CALCITE-4590?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17351724#comment-17351724
 ] 

duan xiong commented on CALCITE-4590:
-------------------------------------

sql:
{code:java}
// select * from (values (1, 'a'), (2, 'abc')) where EXPR$1 = 'a  ' or EXPR$1 = 
'ac'
{code}
When I try use the RelDataTypeSystem.shouldConvertRaggedUnionTypesToVarying() 
as false;
the code generation datasource values is
{code:java}
new Object[] {
 1,
 "a "},
new Object[] {
 2,
 "abc"}});{code}
and the code generation condition is
{code:java}
if (org.apache.calcite.runtime.SqlFunctions.toBoolean(!input_isNull && 
org.apache.calcite.runtime.SqlFunctions.eq(input_value, "a") || !input_isNull 
&& org.apache.calcite.runtime.SqlFunctions.eq(input_value, "ac"))) {
 return true;
}{code}
But when I use the RelDataTypeSystem.shouldConvertRaggedUnionTypesToVarying() 
as true;

the code generation datasource values is

 
{code:java}
new Object[] {
 1,
 "a"},
new Object[] {
 2,
 "abc"}});{code}




but the code generation condition become

```
{code:java}
if (org.apache.calcite.runtime.SqlFunctions.toBoolean(!input_isNull && 
org.apache.calcite.runtime.SqlFunctions.eq(input_value, "a ") || !input_isNull 
&& org.apache.calcite.runtime.SqlFunctions.eq(input_value, "ac"))) {
 return true;
}{code}

```

 

So I think this is bug. They should be do the same thing when we set this 
parameter is true or false;

> Incorrect query result with fixed-length string
> -----------------------------------------------
>
>                 Key: CALCITE-4590
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4590
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.26.0
>            Reporter: Roman Kondakov
>            Assignee: duan xiong
>            Priority: Major
>
> Query may return wrong result when fixed-length strings (CHAR(N)) are used in 
> OR/IN clause
> {code:java}
> @Test void test() {
>     // Passed.
>     CalciteAssert.that()
>         .query("select * from (values (1, 'a'), (2, 'abc')) where EXPR$1 = 
> 'a'")
>         .returns("EXPR$0=1; EXPR$1=a  \n");
>     // Failed. Only "EXPR$0=2; EXPR$1=abc\n" is returned
>     CalciteAssert.that()
>         .query("select * from (values (1, 'a'), (2, 'abc')) where EXPR$1 = 
> 'a' or EXPR$1 = 'abc'")
>         .returns("EXPR$0=1; EXPR$1=a  \n"
>             + "EXPR$0=2; EXPR$1=abc\n");
>   }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to