Hi,

Thanks in advance for looking into this. I have been experimenting some
proof of concept for my firm with Apache Calcite. I got into this issue
while I was creating a simple correlated query. My understanding may be
wrong here. Following code constructs correlated query:

final FrameworkConfig config = RelBuilderTest.config().build();
final RelBuilder builder = RelBuilder.create(config);
final Holder<RexCorrelVariable> v = Holder.of(null);

 builder.scan("EMP")
    .variable(v)
    .scan("DEPT")
    .filter(
        builder.equals(builder.field("DEPTNO"),
            builder.field(v.get(), "DEPTNO")))
    .project(builder.field("DEPT", "DNAME"), builder.field("DEPT", "LOC"))
    .correlate(
        JoinRelType.LEFT, v.get().id,
        builder.field(2, 0, "DEPTNO")
    );
RelDataType dataType = builder.peek().getRowType();
RelNode relNode = builder.project(builder.field("ENAME"),
builder.field("DNAME"))
    .build();
System.out.println(RelOptUtil.toString(relNode));
final RelToSqlConverter converter = new
RelToSqlConverter(AnsiSqlDialect.DEFAULT);
final SqlNode sqlNode = converter.visitRoot(relNode).asStatement();
final String sql = sqlNode.toSqlString(AnsiSqlDialect.DEFAULT).getSql();
System.out.println(sql);

RowType after correlation step is:
RecordType(SMALLINT EMPNO, VARCHAR(10) ENAME, VARCHAR(9) JOB, SMALLINT MGR,
DATE HIREDATE, DECIMAL(7, 2) SAL, DECIMAL(7, 2) COMM, TINYINT DEPTNO,
VARCHAR(14) DNAME, VARCHAR(13) LOC)

Projecting "ENAME" and "DNAME" should work fine. Relational Tree for the
query looks like this:
LogicalProject(EMPNO=[$0], DNAME=[$8])
  LogicalCorrelate(correlation=[$cor0], joinType=[left],
requiredColumns=[{7}])
    LogicalTableScan(table=[[scott, EMP]])
    LogicalProject(DNAME=[$1], LOC=[$2])
      LogicalFilter(condition=[=($0, $cor0.DEPTNO)])
        LogicalTableScan(table=[[scott, DEPT]])

while generated SQL from the query looks like this:
SELECT `$cor0`.`EMPNO`, `$cor0`.`DNAME`
FROM `scott`.`EMP` AS `$cor0`,
LATERAL (SELECT `DNAME`, `LOC`
FROM `scott`.`DEPT`
WHERE `DEPTNO` = `$cor0`.`DEPTNO`) AS `t0`

If I try to run this SQL directly through JDBC, then it fails with the
error "Column 'DNAME' not found in table '$cor0'". Wondering if there is an
error in RelToSqlConverter or am I missing anything here?

I will highly appreciate any help here.

Thanks,
~Bali

Reply via email to