Danny Chan created CALCITE-2966:
-----------------------------------

             Summary: Problem with Code Generation
                 Key: CALCITE-2966
                 URL: https://issues.apache.org/jira/browse/CALCITE-2966
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.20.0
            Reporter: Danny Chan
            Assignee: Danny Chan
             Fix For: 1.20.0


>From the mailing list:

Hi all,

I have some problems with the code generation from Linq4j which I'm unable to 
resolve myself.

Basically, I want to translate a condition from Rex to a Linq4j expression to 
use it in generated code.

In my example the Condition is from Match Recognize and in SQL is: 
`up."commission" > prev(up."commission")`.

 

```

RexBuilder rexBuilder = new RexBuilder(implementor.getTypeFactory());

RexProgramBuilder rexProgramBuilder = new 
RexProgramBuilder(physType.getRowType(), rexBuilder);

 

rexProgramBuilder.addCondition(entry.getValue());

 

final Expression condition = 
RexToLixTranslator.translateCondition(rexProgramBuilder.getProgram(),

          (JavaTypeFactory) getCluster().getTypeFactory(),

          builder2,

          inputGetter1,

          implementor.allCorrelateVariables,

          implementor.getConformance());

 

builder2.add(Expressions.return_(null, condition));

```

 

Here, the condition seems okay, it is: ">(PREV(UP.$4, 0), PREV(UP.$4, 1))",  so 
it should be a comparison of two variables (I rewrite the PREV with a custom 
Input Getter".

But, the generated code (for Janino) is:

 

```

Object p1 = row_.get($L4J$C$0_1);

org.apache.calcite.test.JdbcTest.Employee p0 = 
(org.apache.calcite.test.JdbcTest.Employee) p1;

Object p3 = row_.get($L4J$C$1_1);

org.apache.calcite.test.JdbcTest.Employee p2 = 
(org.apache.calcite.test.JdbcTest.Employee) p3;

Object p5 = row_.get($L4J$C$0_1);

org.apache.calcite.test.JdbcTest.Employee p4 = 
(org.apache.calcite.test.JdbcTest.Employee) p5;

Object p7 = row_.get($L4J$C$1_1);

org.apache.calcite.test.JdbcTest.Employee p6 = 
(org.apache.calcite.test.JdbcTest.Employee) p7;

return p0.commission && p2.commission && p4.commission > p6.commission;

```

 

This confuses me a lot as I do not know where the check for p0.commission and 
p2.commission comes from.

It seems that Linq4j adds them as it expects these variables to be nullable, 
but I have no idea on how to avoid this.

These fields are Numeric so I always get a compilation exception.

 

Can someone help me with this issue?



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to