Uploaded image for project: 'Calcite'
  1. Calcite
  2. CALCITE-2966

Problem with Code Generation

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Not A Problem
    • 1.20.0
    • 1.20.0
    • core
    • None

    Description

      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?

      Attachments

        Issue Links

          Activity

            People

              julian.feinauer Julian Feinauer
              danny0405 Danny Chen
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: