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

Jinfeng Ni commented on CALCITE-1150:
-------------------------------------

[~julianhyde], I revised the patch based on your comments.

* Move SqlSelect.expanded into the validator, maybe in SelectScope. It is best 
if validation does not mutate the parse tree. (Yes, I know expansion changes 
the select list but don't want to make that hole of technical debt any deeper.)
** Removed the code of SqlSelect.expanded. Previously, this flag is needed to 
avoid expanding select list multiple times. The new code will represent the 
static star and dynamic star field differently. This makes that code 
unnecessary. However, SqlValidatorImpl still has to expand select list, order 
by exp, where/join condition, and group by exp. In some sense, the expand is 
part of validation process : we validate and replace the original form with a 
"validated" form.  Validator's "originalExprs" is for the purpose of keeping 
track of the "original" vs "expanded" expression.
 
* RelDataTypes are immutable, and your DynamicRecordType is mutable. I know you 
need a "collector". I could accept using a mutable type just during validation, 
then switch to an immutable dynamic record type on sql-to-rel. But if the 
collector could be in a scope that would be even better.
** Per your suggestion, I use DynamicRecordType only in validation phase. In 
RelOptTable.toRel(), when the rowType is dynamicStruct, we switch to an 
immutable and regular record type. 

* Do you really need "" to be a field in the record type? Is it not sufficient 
for "" to be a field reference?
** I'm not sure if I understand the question. But I choose to use "**" as the 
dynamic star prefix, to differentiate from static star "". Also, introduce a 
new SqlTypeName for dynamic star field. This new SqlTypeName is useful to 
identify the dynamic star fields in the rowType. When the physical plan is 
built, we rely on such knowledge to prepare the dynamic expansion in execution 
time.  

* How do you plan to represent the row type of SELECT * FROM (SELECT * FROM 
t1), (SELECT * FROM t2))? There are unresolved stars on both sides.
** I added one unit test for such case. Basically, the top project will have 
two dynamic star fields. One is named as "**", the other one is named as "**0", 
due to naming conflict. The * column in outer query block is actually treated 
as a regular star column; it's expanded into two dynamic star fields in 
validation phase.   It will also resolve correctly for SELECT * FROM (SELECT *, 
col1 FROM t1), (SELECT *, col2 FROM t2)).  

* Given RelDataType t, I'd prefer t.isDynamicStruct() to t instanceof 
DynamicRecordType.
** Done. Add isDynamicStruct() to interface RelDataType.

* Minor nit-pick: use new ArrayList<>() rather than Lists.newArrayList() for 
new code.
** Done.

* Add a sql-to-rel test SELECT * FROM nonDynamicTable WHERE EXISTS (SELECT * 
FROM dynamicTable). The select clause of an EXISTS sub-query should always be 
ignored.
** Done. The select clause will be ignored, although the scan will return all 
the columns. That's the same behavior for the case where static table is used 
in the exist sub-query.

I also modify couple of expected error messages in SqlValidatorTest.  According 
to the code, the error message should use the original expression, in stead of 
expanded expression.


> Create the a new DynamicRecordType, avoiding star expansion when working with 
> this type
> ---------------------------------------------------------------------------------------
>
>                 Key: CALCITE-1150
>                 URL: https://issues.apache.org/jira/browse/CALCITE-1150
>             Project: Calcite
>          Issue Type: Improvement
>            Reporter: Jacques Nadeau
>            Assignee: Julian Hyde
>
> DynamicRecordType can be used to leverage user-provided field implications to 
> avoid schema analysis until execution.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to