[jira] [Created] (CALCITE-3571) RelBuilder#shouldMergeProject throws an exception for JOIN with complex conditions

2019-12-05 Thread Kirill Kozlov (Jira)
Kirill Kozlov created CALCITE-3571:
--

 Summary: RelBuilder#shouldMergeProject throws an exception for 
JOIN with complex conditions
 Key: CALCITE-3571
 URL: https://issues.apache.org/jira/browse/CALCITE-3571
 Project: Calcite
  Issue Type: Bug
  Components: core
Affects Versions: 1.21.0
Reporter: Kirill Kozlov


Before joins are created left and right paths are pared first. For the 1st 
query above they are as follows:
{code:java}
Left:
LogicalProject with RecordType(VARBINARY id, VARCHAR fA1, VARCHAR fA1_2)
  LogicalTableScan with RecordType(VARBINARY id, VARCHAR fA1)

Right:
LogicalTableScan with RecordType(VARCHAR id, VARCHAR fB1){code}
As they are processed - they are registered as leaves (added to the Array).

 

When Join node is being created it knows what the `condition expressions` is:
{code:java}
=(TO_HEX($0), $3)
{code}
Since TO_HEX is not computed anywhere - it modifies the left input to be as 
follows (via RelOptUtil#pushDownJoinConditions) because 
RelBuilder#shouldMergeProject always return true.

 
{code:java}
LogicalProject with RecordType(VARBINARY id, VARCHAR fA1, VARCHAR fA1_2, 
VARCHAR $f3)
{code}
where `VARCHAR $f3` is a result of TO_HEX. Note that the list of leaves is not 
updated.

[https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java#L2571]

 

Finally, when identifier "query.fA1_2" is being converted (via 
SqlToRelConverter#convertIdentifier) for the top-most node
{code:java}
top-most node:
LogicalProject with RecordType(VARBINARY id, VARCHAR fA1, VARCHAR fA1_2, 
VARCHAR id0, VARCHAR fB1)
  LogicalJoin with RecordType(VARBINARY id, VARCHAR fA1, VARCHAR fA1_2, VARCHAR 
$f3, VARCHAR id0, VARCHAR fB1)
LogicalProject with RecordType(VARBINARY id, VARCHAR fA1, VARCHAR fA1_2, 
VARCHAR $f3)
  LogicalTableScan with RecordType(VARBINARY id, VARCHAR fA1)
LogicalTableScan with RecordType(VARCHAR id, VARCHAR fB1){code}
Blackboard perform a lookup (via SqlToRelConverter#lookupExp), in process of 
which LookupContext is created.

In a constructor, LookupContext performs flatten, which recursively traverses  
tree of nodes (from above codeblock) and checks the leaves to see if they 
contain such expression. When it does get to the modified left input of a join 
it does not get a match on it and continues further down to a TableScan.

When it finally flattens the result, TableScan's RecordType knows nothing about 
a duplicated field `fA1_2`, causing an error above.

 

I think a viable solution would be to modify Join creation to register a 
resulting join inputs as leaves (when they are modified). Alternative approach 
would be to not merge Projects when join needs to modify an input.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)


[jira] [Created] (CALCITE-3381) Add `getCastSpec` for BigQuerySqlDialect

2019-09-30 Thread Kirill Kozlov (Jira)
Kirill Kozlov created CALCITE-3381:
--

 Summary: Add `getCastSpec` for BigQuerySqlDialect
 Key: CALCITE-3381
 URL: https://issues.apache.org/jira/browse/CALCITE-3381
 Project: Calcite
  Issue Type: New Feature
  Components: core
Affects Versions: 1.21.0
Reporter: Kirill Kozlov


When using `SqlImplementor.SimpleContext#toSql` with BigQuerySqlDialect on Rel 
nodes containing `CAST` need to convert Calcite SqlTypeName to BigQuery 
supported types 
([https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types]).

Example: VARCHAR should become a STRING, BOOLEAN - BOOL, and so on.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)


[jira] [Created] (CALCITE-3355) SQLCase nullability check

2019-09-17 Thread Kirill Kozlov (Jira)
Kirill Kozlov created CALCITE-3355:
--

 Summary: SQLCase nullability check
 Key: CALCITE-3355
 URL: https://issues.apache.org/jira/browse/CALCITE-3355
 Project: Calcite
  Issue Type: Bug
  Components: core
Affects Versions: 1.20.0
Reporter: Kirill Kozlov


When executing queries like: 
"SELECT COALESCE(name, 'unknown') as name_out FROM PCOLLECTION"
(input 'name' is nullable)

There is a need to know whether the result is nullable or not (in this case - 
not). During validation stage "COALESCE" is being transformed (via 
SqlValidatorImpl.performUnconditionalRewrites) into a "CASE" statement, which 
currently does not determine nullability of a result.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)