Hi all,

I'm trying to rewrite a query of a table (ala Table#toRel) to join a set of
dynamic (sub-)tables on a couple of known columns but am getting stuck
building the condition. The sub-tables are not part of the original query,
but rather selected on-the-fly at logical query time.

I can't use UNION-ALL because, outside of a couple of known columns, the
remainder are completely dynamic.

Using RelBuilder I can construct the join via a series of scans and then
joins on the known fields[1]. However, this only creates RelInputRefs which
are not at all associated with the current ref numbering because the the
sub-tables are not present in the original query. Thus, we get conditions
like:
(=($1,$1), which looks appears TRUE but actually should reference the
left/right tables' fields.

I tried playing around with RelRangeRef and manually managing the field
offsets in query (similar to BlackBoard), but that call gets translated
into an actually ALWAYS-TRUE condition and also fails the
JoinUtil#checkCartesianJoin case.

If I construct the query via standard SQL at the top level (using known
tables), everything works fine, I think because of the ref-numbering to
which I cannot get access in #toRel().

Any thoughts on the right way to go about this?

Thanks much,
Jesse Yates


[1] Actually, this meant digging into RelBuilder
<https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/tools/RelBuilder.java#L309>
since dynamic tables require the field names to already be set and then
uses the column name from the list to get the field index

Reply via email to