Class SqlToRelConverter
- java.lang.Object
-
- org.apache.calcite.sql2rel.SqlToRelConverter
-
public class SqlToRelConverter extends java.lang.Object
Converts a SQL parse tree (consisting ofSqlNode
objects) into a relational algebra expression (consisting ofRelNode
objects).The public entry points are:
convertQuery(org.apache.calcite.sql.SqlNode, boolean, boolean)
,convertExpression(SqlNode)
.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected class
SqlToRelConverter.AggConverter
Converts expressions to aggregates.private static class
SqlToRelConverter.AggregateFinder
Visitor that collects all aggregate functions in aSqlNode
tree.protected class
SqlToRelConverter.Blackboard
Workspace for translating an individual SELECT statement (or sub-SELECT).static interface
SqlToRelConverter.Config
Interface to define the configuration for a SqlToRelConverter.static class
SqlToRelConverter.ConfigBuilder
Builder for aSqlToRelConverter.Config
.private static class
SqlToRelConverter.ConfigImpl
Implementation ofSqlToRelConverter.Config
.private static class
SqlToRelConverter.CorrelationUse
Use of a row as a correlating variable by a given relational expression.private static class
SqlToRelConverter.DeferredLookup
Deferred lookup.private class
SqlToRelConverter.HistogramShuttle
Shuttle which walks over a tree ofRexNode
s and applies 'over' to all agg functions.private static class
SqlToRelConverter.LookupContext
Context to find a relational expression to a field offset.private class
SqlToRelConverter.NoOpSubQueryConverter
A default implementation of SubQueryConverter that does no conversion.private static class
SqlToRelConverter.SubQuery
A sub-query, whether it needs to be translated using 2- or 3-valued logic.
-
Field Summary
Fields Modifier and Type Field Description protected Prepare.CatalogReader
catalogReader
protected RelOptCluster
cluster
SqlToRelConverter.Config
config
private java.util.Deque<java.lang.String>
datasetStack
Stack of names of datasets requested by theTABLE(SAMPLE(<datasetName>, <query>))
construct.static int
DEFAULT_IN_SUB_QUERY_THRESHOLD
Size of the smallest IN list that will be converted to a semijoin to a static table.static int
DEFAULT_IN_SUBQUERY_THRESHOLD
Deprecated.private java.util.List<SqlDynamicParam>
dynamicParamSqlNodes
private int
explainParamCount
private SqlNodeToRexConverter
exprConverter
protected java.util.List<RelNode>
leaves
private java.util.Map<SqlNode,RexNode>
mapConvertedNonCorrSubqs
Mapping of non-correlated sub-queries that have been converted to their equivalent constants.private java.util.Map<CorrelationId,SqlToRelConverter.DeferredLookup>
mapCorrelToDeferred
Fields used in name resolution for correlated sub-queries.private SqlOperatorTable
opTab
private RelBuilder
relBuilder
protected RexBuilder
rexBuilder
protected static org.slf4j.Logger
SQL2REL_LOGGER
private SubQueryConverter
subQueryConverter
private static java.math.BigDecimal
TWO
protected RelDataTypeFactory
typeFactory
protected SqlValidator
validator
RelOptTable.ViewExpander
viewExpander
-
Constructor Summary
Constructors Constructor Description SqlToRelConverter(RelOptTable.ViewExpander viewExpander, SqlValidator validator, Prepare.CatalogReader catalogReader, RelOptCluster cluster, SqlRexConvertletTable convertletTable)
Deprecated.SqlToRelConverter(RelOptTable.ViewExpander viewExpander, SqlValidator validator, Prepare.CatalogReader catalogReader, RelOptCluster cluster, SqlRexConvertletTable convertletTable, SqlToRelConverter.Config config)
SqlToRelConverter(RelOptTable.ViewExpander viewExpander, SqlValidator validator, Prepare.CatalogReader catalogReader, RelOptPlanner planner, RexBuilder rexBuilder, SqlRexConvertletTable convertletTable)
Deprecated.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description void
addConvertedNonCorrSubqs(java.util.Map<SqlNode,RexNode> alreadyConvertedNonCorrSubqs)
Adds to the current map of non-correlated converted sub-queries the elements from another map that contains non-correlated sub-queries that have been converted by another SqlToRelConverter.protected RexNode
adjustInputRef(SqlToRelConverter.Blackboard bb, RexInputRef inputRef)
Adjusts the type of a reference to an input field to account for nulls introduced by outer joins; and adjusts the offset to match the physical implementation.protected void
afterTableFunction(SqlToRelConverter.Blackboard bb, SqlCall call, LogicalTableFunctionScan callRel)
private boolean
all(SqlCall call)
private RexNode
castNullLiteralIfNeeded(RexNode node, RelDataType type)
private void
checkConvertedType(SqlNode query, RelNode result)
protected void
collectInsertTargets(SqlInsert call, RexNode sourceRef, java.util.List<java.lang.String> targetColumnNames, java.util.List<RexNode> columnExprs)
Given an INSERT statement, collects the list of names to be populated and the expressions to put in them.static SqlToRelConverter.ConfigBuilder
configBuilder()
Creates a builder for aSqlToRelConverter.Config
.private static boolean
containsInOperator(SqlNode node)
Returns whether a given node contains aSqlInOperator
.private static boolean
containsNullLiteral(SqlNodeList valueList)
protected void
convertAgg(SqlToRelConverter.Blackboard bb, SqlSelect select, java.util.List<SqlNode> orderExprList)
Converts the SELECT, GROUP BY and HAVING clauses of an aggregate query.protected void
convertCollectionTable(SqlToRelConverter.Blackboard bb, SqlCall call)
protected RelNode
convertColumnList(SqlInsert call, RelNode source)
Creates a source for an INSERT statement.private RelNode
convertCursor(SqlToRelConverter.Blackboard bb, SqlToRelConverter.SubQuery subQuery)
private RelNode
convertDelete(SqlDelete call)
RexDynamicParam
convertDynamicParam(SqlDynamicParam dynamicParam)
private RelOptUtil.Exists
convertExists(SqlNode seek, RelOptUtil.SubQueryType subQueryType, RelOptUtil.Logic logic, boolean notIn, RelDataType targetDataType)
Converts an EXISTS or IN predicate into a join.RexNode
convertExpression(SqlNode node)
RexNode
convertExpression(SqlNode node, java.util.Map<java.lang.String,RexNode> nameToNodeMap)
protected RexNode
convertExtendedExpression(SqlNode node, SqlToRelConverter.Blackboard bb)
Converts a non-standard expression.protected void
convertFrom(SqlToRelConverter.Blackboard bb, SqlNode from)
Converts a FROM clause into a relational expression.private RexNode
convertIdentifier(SqlToRelConverter.Blackboard bb, SqlIdentifier identifier)
Converts an identifier into an expression in a given scope.private void
convertIdentifier(SqlToRelConverter.Blackboard bb, SqlIdentifier id, SqlNodeList extendedColumns)
protected RelNode
convertInsert(SqlInsert call)
private RexNode
convertInToOr(SqlToRelConverter.Blackboard bb, java.util.List<RexNode> leftKeys, SqlNodeList valuesList, SqlInOperator op)
Converts "x IN (1, 2, ...)" to "x=1 OR x=2 OR ...".private RexNode
convertJoinCondition(SqlToRelConverter.Blackboard bb, SqlValidatorNamespace leftNamespace, SqlValidatorNamespace rightNamespace, SqlNode condition, JoinConditionType conditionType, RelNode leftRel, RelNode rightRel)
private static JoinRelType
convertJoinType(JoinType joinType)
private RexLiteral
convertLiteralInValuesList(SqlNode sqlNode, SqlToRelConverter.Blackboard bb, RelDataType rowType, int iField)
protected void
convertMatchRecognize(SqlToRelConverter.Blackboard bb, SqlCall call)
private RelNode
convertMerge(SqlMerge call)
private RelNode
convertMultisets(java.util.List<SqlNode> operands, SqlToRelConverter.Blackboard bb)
private boolean
convertNonCorrelatedSubQuery(SqlToRelConverter.SubQuery subQuery, SqlToRelConverter.Blackboard bb, RelNode converted, boolean isExists)
Determines if a sub-query is non-correlated and if so, converts it to a constant.protected void
convertOrder(SqlSelect select, SqlToRelConverter.Blackboard bb, RelCollation collation, java.util.List<SqlNode> orderExprList, SqlNode offset, SqlNode fetch)
Converts a query's ORDER BY clause, if any.protected RelFieldCollation
convertOrderItem(SqlSelect select, SqlNode orderItem, java.util.List<SqlNode> extraExprs, RelFieldCollation.Direction direction, RelFieldCollation.NullDirection nullDirection)
private RexNode
convertOver(SqlToRelConverter.Blackboard bb, SqlNode node)
RelRoot
convertQuery(SqlNode query, boolean needsValidation, boolean top)
Converts an unvalidated query's parse tree into a relational expression.private RelNode
convertQueryOrInList(SqlToRelConverter.Blackboard bb, SqlNode seek, RelDataType targetRowType)
protected RelRoot
convertQueryRecursive(SqlNode query, boolean top, RelDataType targetRowType)
Recursively converts a query to a relational expression.private RelNode
convertRowConstructor(SqlToRelConverter.Blackboard bb, SqlCall rowConstructor)
Converts a row constructor into a relational expression.private RelNode
convertRowValues(SqlToRelConverter.Blackboard bb, SqlNode rowList, java.util.Collection<SqlNode> rows, boolean allowLiteralsOnly, RelDataType targetRowType)
RelNode
convertSelect(SqlSelect select, boolean top)
Converts a SELECT statement's parse tree into a relational expression.protected void
convertSelectImpl(SqlToRelConverter.Blackboard bb, SqlSelect select)
Implementation ofconvertSelect(SqlSelect, boolean)
; derived class may override.private void
convertSelectList(SqlToRelConverter.Blackboard bb, SqlSelect select, java.util.List<SqlNode> orderList)
protected RelNode
convertSetOp(SqlCall call)
Converts a set operation (UNION, INTERSECT, MINUS) into relational expressions.RelNode
convertToSingleValueSubq(SqlNode query, RelNode plan)
Converts the RelNode tree for a select statement to a select that produces a single value.private RelNode
convertUpdate(SqlUpdate call)
private RexNode
convertUsing(SqlValidatorNamespace leftNamespace, SqlValidatorNamespace rightNamespace, java.util.List<java.lang.String> nameList)
Returns an expression for matching columns of a USING clause or inferred from NATURAL JOIN.RelNode
convertValues(SqlCall values, RelDataType targetRowType)
Converts a SELECT statement's parse tree into a relational expression.private void
convertValuesImpl(SqlToRelConverter.Blackboard bb, SqlCall values, RelDataType targetRowType)
Converts a values clause (as in "INSERT INTO T(x,y) VALUES (1,2)") into a relational expression.private void
convertWhere(SqlToRelConverter.Blackboard bb, SqlNode where)
Converts a WHERE clause.RelRoot
convertWith(SqlWith with, boolean top)
Converts a WITH sub-query into a relational expression.protected void
createAggImpl(SqlToRelConverter.Blackboard bb, SqlToRelConverter.AggConverter aggConverter, SqlNodeList selectList, SqlNodeList groupList, SqlNode having, java.util.List<SqlNode> orderExprList)
protected RelNode
createAggregate(SqlToRelConverter.Blackboard bb, ImmutableBitSet groupSet, com.google.common.collect.ImmutableList<ImmutableBitSet> groupSets, java.util.List<AggregateCall> aggCalls)
Creates an Aggregate.protected SqlToRelConverter.Blackboard
createBlackboard(SqlValidatorScope scope, java.util.Map<java.lang.String,RexNode> nameToNodeMap, boolean top)
Factory method for creating translation workspace.private SqlToRelConverter.Blackboard
createInsertBlackboard(RelOptTable targetTable, RexNode sourceRef, java.util.List<java.lang.String> targetColumnNames)
Creates a blackboard for translating the expressions of generated columns in an INSERT statement.protected RelNode
createJoin(SqlToRelConverter.Blackboard bb, RelNode leftRel, RelNode rightRel, RexNode joinCond, JoinRelType joinType)
private RelNode
createModify(RelOptTable targetTable, RelNode source)
Creates a relational expression to modify a table or modifiable view.private RelNode
createSource(RelOptTable targetTable, RelNode source, ModifiableView modifiableView, RelDataType delegateRowType)
Wraps a relational expression in the projects and filters implied by aModifiableView
.private RelOptTable.ToRelContext
createToRelContext()
RelNode
decorrelate(SqlNode query, RelNode rootRel)
If sub-query is correlated and decorrelation is enabled, performs decorrelation.protected RelNode
decorrelateQuery(RelNode rootRel)
private java.lang.String
deriveAlias(SqlNode node, java.util.Collection<java.lang.String> aliases, int ordinal)
private static boolean
desc(RelFieldCollation.Direction direction)
private void
distinctify(SqlToRelConverter.Blackboard bb, boolean checkForDupExprs)
Having translated 'SELECT ...protected boolean
enableDecorrelation()
Deprecated.private RexNode
ensureSqlType(RelDataType type, RexNode node)
Ensures that an expression has a givenSqlTypeName
, applying a cast if necessary.protected void
extraSelectItems(SqlToRelConverter.Blackboard bb, SqlSelect select, java.util.List<RexNode> exprList, java.util.List<java.lang.String> nameList, java.util.Collection<java.lang.String> aliasList, java.util.List<SqlMonotonicity> columnMonotonicityList)
Adds extra select items.private void
findSubQueries(SqlToRelConverter.Blackboard bb, SqlNode node, RelOptUtil.Logic logic, boolean registerOnlyScalarSubQueries)
Builds a list of allIN
orEXISTS
operators inside SQL parse tree.RelNode
flattenTypes(RelNode rootRel, boolean restructure)
protected void
gatherOrderExprs(SqlToRelConverter.Blackboard bb, SqlSelect select, SqlNodeList orderList, java.util.List<SqlNode> extraOrderExprs, java.util.List<RelFieldCollation> collationList)
Creates a list of collations required to implement the ORDER BY clause, if there is one.RelOptCluster
getCluster()
private java.util.Set<RelColumnMapping>
getColumnMappings(SqlOperator op)
private SqlToRelConverter.CorrelationUse
getCorrelationUse(SqlToRelConverter.Blackboard bb, RelNode r0)
int
getDynamicParamCount()
Returns the number of dynamic parameters encountered during translation; this must only be called afterconvertQuery(org.apache.calcite.sql.SqlNode, boolean, boolean)
.int
getDynamicParamCountInExplain(boolean increment)
Returns the current count of the number of dynamic parameters in an EXPLAIN PLAN statement.RelDataType
getDynamicParamType(int index)
Returns the type inferred for a dynamic parameter.private InitializerExpressionFactory
getInitializerFactory(SqlValidatorTable validatorTable)
protected int
getInSubqueryThreshold()
Deprecated.java.util.Map<SqlNode,RexNode>
getMapConvertedNonCorrSubqs()
RexBuilder
getRexBuilder()
Returns the row-expression builder.protected java.util.List<RelDataTypeField>
getSystemFields()
Returns a list of fields to be prefixed to each relational expression.protected RelOptTable
getTargetTable(SqlNode call)
static boolean
isOrdered(SqlNode query)
private boolean
isRowConstructor(SqlNode node)
private static boolean
isStream(SqlNode query)
private boolean
isSubQueryNonCorrelated(RelNode subq, SqlToRelConverter.Blackboard bb)
Determines whether a sub-query is non-correlated.boolean
isTrimUnusedFields()
Deprecated.private SqlQuantifyOperator
negate(SqlQuantifyOperator operator)
protected RelFieldTrimmer
newFieldTrimmer()
Creates a RelFieldTrimmer.private static SqlNode
pushDownNotForIn(SqlValidatorScope scope, SqlNode sqlNode)
Push down all the NOT logical operators into any IN/NOT IN operators.private static SqlNode
reg(SqlValidatorScope scope, SqlNode e)
Registers with the validator aSqlNode
that has been created during the Sql-to-Rel process.private void
replaceSubQueries(SqlToRelConverter.Blackboard bb, SqlNode expr, RelOptUtil.Logic logic)
private RelCollation
requiredCollation(RelNode r)
void
setDynamicParamCountInExplain(int explainParamCount)
Sets the number of dynamic parameters in the current EXPLAIN PLAN statement.void
setSubQueryConverter(SubQueryConverter converter)
Sets a new SubQueryConverter.private void
substituteSubQuery(SqlToRelConverter.Blackboard bb, SqlToRelConverter.SubQuery subQuery)
RelNode
toRel(RelOptTable table)
private RexNode
translateIn(RelOptUtil.Logic logic, RelNode root, RexNode rex)
RelNode
trimUnusedFields(boolean ordered, RelNode rootRel)
Walks over a tree of relational expressions, replacing eachRelNode
with a 'slimmed down' relational expression that projects only the fields required by its consumer.private static <T> T
unwrap(java.lang.Object o, java.lang.Class<T> clazz)
-
-
-
Field Detail
-
SQL2REL_LOGGER
protected static final org.slf4j.Logger SQL2REL_LOGGER
-
TWO
private static final java.math.BigDecimal TWO
-
DEFAULT_IN_SUB_QUERY_THRESHOLD
public static final int DEFAULT_IN_SUB_QUERY_THRESHOLD
Size of the smallest IN list that will be converted to a semijoin to a static table.- See Also:
- Constant Field Values
-
DEFAULT_IN_SUBQUERY_THRESHOLD
@Deprecated public static final int DEFAULT_IN_SUBQUERY_THRESHOLD
Deprecated.- See Also:
- Constant Field Values
-
validator
protected final SqlValidator validator
-
rexBuilder
protected final RexBuilder rexBuilder
-
catalogReader
protected final Prepare.CatalogReader catalogReader
-
cluster
protected final RelOptCluster cluster
-
subQueryConverter
private SubQueryConverter subQueryConverter
-
leaves
protected final java.util.List<RelNode> leaves
-
dynamicParamSqlNodes
private final java.util.List<SqlDynamicParam> dynamicParamSqlNodes
-
opTab
private final SqlOperatorTable opTab
-
typeFactory
protected final RelDataTypeFactory typeFactory
-
exprConverter
private final SqlNodeToRexConverter exprConverter
-
explainParamCount
private int explainParamCount
-
config
public final SqlToRelConverter.Config config
-
relBuilder
private final RelBuilder relBuilder
-
mapCorrelToDeferred
private final java.util.Map<CorrelationId,SqlToRelConverter.DeferredLookup> mapCorrelToDeferred
Fields used in name resolution for correlated sub-queries.
-
datasetStack
private final java.util.Deque<java.lang.String> datasetStack
Stack of names of datasets requested by theTABLE(SAMPLE(<datasetName>, <query>))
construct.
-
mapConvertedNonCorrSubqs
private final java.util.Map<SqlNode,RexNode> mapConvertedNonCorrSubqs
Mapping of non-correlated sub-queries that have been converted to their equivalent constants. Used to avoid re-evaluating the sub-query if it's already been evaluated.
-
viewExpander
public final RelOptTable.ViewExpander viewExpander
-
-
Constructor Detail
-
SqlToRelConverter
@Deprecated public SqlToRelConverter(RelOptTable.ViewExpander viewExpander, SqlValidator validator, Prepare.CatalogReader catalogReader, RelOptPlanner planner, RexBuilder rexBuilder, SqlRexConvertletTable convertletTable)
Deprecated.Creates a converter.- Parameters:
viewExpander
- Preparing statementvalidator
- ValidatorcatalogReader
- Schemaplanner
- PlannerrexBuilder
- Rex builderconvertletTable
- Expression converter
-
SqlToRelConverter
@Deprecated public SqlToRelConverter(RelOptTable.ViewExpander viewExpander, SqlValidator validator, Prepare.CatalogReader catalogReader, RelOptCluster cluster, SqlRexConvertletTable convertletTable)
Deprecated.
-
SqlToRelConverter
public SqlToRelConverter(RelOptTable.ViewExpander viewExpander, SqlValidator validator, Prepare.CatalogReader catalogReader, RelOptCluster cluster, SqlRexConvertletTable convertletTable, SqlToRelConverter.Config config)
-
-
Method Detail
-
getCluster
public RelOptCluster getCluster()
- Returns:
- the RelOptCluster in use.
-
getRexBuilder
public RexBuilder getRexBuilder()
Returns the row-expression builder.
-
getDynamicParamCount
public int getDynamicParamCount()
Returns the number of dynamic parameters encountered during translation; this must only be called afterconvertQuery(org.apache.calcite.sql.SqlNode, boolean, boolean)
.- Returns:
- number of dynamic parameters
-
getDynamicParamType
public RelDataType getDynamicParamType(int index)
Returns the type inferred for a dynamic parameter.- Parameters:
index
- 0-based index of dynamic parameter- Returns:
- inferred type, never null
-
getDynamicParamCountInExplain
public int getDynamicParamCountInExplain(boolean increment)
Returns the current count of the number of dynamic parameters in an EXPLAIN PLAN statement.- Parameters:
increment
- if true, increment the count- Returns:
- the current count before the optional increment
-
getMapConvertedNonCorrSubqs
public java.util.Map<SqlNode,RexNode> getMapConvertedNonCorrSubqs()
- Returns:
- mapping of non-correlated sub-queries that have been converted to the constants that they evaluate to
-
addConvertedNonCorrSubqs
public void addConvertedNonCorrSubqs(java.util.Map<SqlNode,RexNode> alreadyConvertedNonCorrSubqs)
Adds to the current map of non-correlated converted sub-queries the elements from another map that contains non-correlated sub-queries that have been converted by another SqlToRelConverter.- Parameters:
alreadyConvertedNonCorrSubqs
- the other map
-
setSubQueryConverter
public void setSubQueryConverter(SubQueryConverter converter)
Sets a new SubQueryConverter. To have any effect, this must be called before any convert method.- Parameters:
converter
- new SubQueryConverter
-
setDynamicParamCountInExplain
public void setDynamicParamCountInExplain(int explainParamCount)
Sets the number of dynamic parameters in the current EXPLAIN PLAN statement.- Parameters:
explainParamCount
- number of dynamic parameters in the statement
-
decorrelate
public RelNode decorrelate(SqlNode query, RelNode rootRel)
If sub-query is correlated and decorrelation is enabled, performs decorrelation.- Parameters:
query
- QueryrootRel
- Root relational expression- Returns:
- New root relational expression after decorrelation
-
trimUnusedFields
public RelNode trimUnusedFields(boolean ordered, RelNode rootRel)
Walks over a tree of relational expressions, replacing eachRelNode
with a 'slimmed down' relational expression that projects only the fields required by its consumer.This may make things easier for the optimizer, by removing crud that would expand the search space, but is difficult for the optimizer itself to do it, because optimizer rules must preserve the number and type of fields. Hence, this transform that operates on the entire tree, similar to the
type-flattening transform
.Currently this functionality is disabled in farrago/luciddb; the default implementation of this method does nothing.
- Parameters:
ordered
- Whether the relational expression must produce results in a particular order (typically because it has an ORDER BY at top level)rootRel
- Relational expression that is at the root of the tree- Returns:
- Trimmed relational expression
-
newFieldTrimmer
protected RelFieldTrimmer newFieldTrimmer()
Creates a RelFieldTrimmer.- Returns:
- Field trimmer
-
convertQuery
public RelRoot convertQuery(SqlNode query, boolean needsValidation, boolean top)
Converts an unvalidated query's parse tree into a relational expression.- Parameters:
query
- Query to convertneedsValidation
- Whether to validate the query before converting;false
if the query has already been validated.top
- Whether the query is top-level, say if its result will become a JDBC result set;false
if the query will be part of a view.
-
isStream
private static boolean isStream(SqlNode query)
-
isOrdered
public static boolean isOrdered(SqlNode query)
-
requiredCollation
private RelCollation requiredCollation(RelNode r)
-
convertSelect
public RelNode convertSelect(SqlSelect select, boolean top)
Converts a SELECT statement's parse tree into a relational expression.
-
createBlackboard
protected SqlToRelConverter.Blackboard createBlackboard(SqlValidatorScope scope, java.util.Map<java.lang.String,RexNode> nameToNodeMap, boolean top)
Factory method for creating translation workspace.
-
convertSelectImpl
protected void convertSelectImpl(SqlToRelConverter.Blackboard bb, SqlSelect select)
Implementation ofconvertSelect(SqlSelect, boolean)
; derived class may override.
-
distinctify
private void distinctify(SqlToRelConverter.Blackboard bb, boolean checkForDupExprs)
Having translated 'SELECT ... FROM ... [GROUP BY ...] [HAVING ...]', adds a relational expression to make the results unique.If the SELECT clause contains duplicate expressions, adds
LogicalProject
s so that we are grouping on the minimal set of keys. The performance gain isn't huge, but it is difficult to detect these duplicate expressions later.- Parameters:
bb
- BlackboardcheckForDupExprs
- Check for duplicate expressions
-
convertOrder
protected void convertOrder(SqlSelect select, SqlToRelConverter.Blackboard bb, RelCollation collation, java.util.List<SqlNode> orderExprList, SqlNode offset, SqlNode fetch)
Converts a query's ORDER BY clause, if any.- Parameters:
select
- Querybb
- Blackboardcollation
- Collation listorderExprList
- Method populates this list with orderBy expressions not present in selectListoffset
- Expression for number of rows to discard before returning first rowfetch
- Expression for number of rows to fetch
-
containsInOperator
private static boolean containsInOperator(SqlNode node)
Returns whether a given node contains aSqlInOperator
.- Parameters:
node
- a RexNode tree
-
pushDownNotForIn
private static SqlNode pushDownNotForIn(SqlValidatorScope scope, SqlNode sqlNode)
Push down all the NOT logical operators into any IN/NOT IN operators.- Parameters:
scope
- Scope wheresqlNode
occurssqlNode
- the root node from which to look for NOT operators- Returns:
- the transformed SqlNode representation with NOT pushed down.
-
reg
private static SqlNode reg(SqlValidatorScope scope, SqlNode e)
Registers with the validator aSqlNode
that has been created during the Sql-to-Rel process.
-
convertWhere
private void convertWhere(SqlToRelConverter.Blackboard bb, SqlNode where)
Converts a WHERE clause.- Parameters:
bb
- Blackboardwhere
- WHERE clause, may be null
-
replaceSubQueries
private void replaceSubQueries(SqlToRelConverter.Blackboard bb, SqlNode expr, RelOptUtil.Logic logic)
-
substituteSubQuery
private void substituteSubQuery(SqlToRelConverter.Blackboard bb, SqlToRelConverter.SubQuery subQuery)
-
translateIn
private RexNode translateIn(RelOptUtil.Logic logic, RelNode root, RexNode rex)
-
containsNullLiteral
private static boolean containsNullLiteral(SqlNodeList valueList)
-
convertNonCorrelatedSubQuery
private boolean convertNonCorrelatedSubQuery(SqlToRelConverter.SubQuery subQuery, SqlToRelConverter.Blackboard bb, RelNode converted, boolean isExists)
Determines if a sub-query is non-correlated and if so, converts it to a constant.- Parameters:
subQuery
- the call that references the sub-querybb
- blackboard used to convert the sub-queryconverted
- RelNode tree corresponding to the sub-queryisExists
- true if the sub-query is part of an EXISTS expression- Returns:
- Whether the sub-query can be converted to a constant
-
convertToSingleValueSubq
public RelNode convertToSingleValueSubq(SqlNode query, RelNode plan)
Converts the RelNode tree for a select statement to a select that produces a single value.- Parameters:
query
- the queryplan
- the original RelNode tree corresponding to the statement- Returns:
- the converted RelNode tree
-
convertInToOr
private RexNode convertInToOr(SqlToRelConverter.Blackboard bb, java.util.List<RexNode> leftKeys, SqlNodeList valuesList, SqlInOperator op)
Converts "x IN (1, 2, ...)" to "x=1 OR x=2 OR ...".- Parameters:
leftKeys
- LHSvaluesList
- RHSop
- The operator (IN, NOT IN, > SOME, ...)- Returns:
- converted expression
-
ensureSqlType
private RexNode ensureSqlType(RelDataType type, RexNode node)
Ensures that an expression has a givenSqlTypeName
, applying a cast if necessary. If the expression already has the right type family, returns the expression unchanged.
-
getInSubqueryThreshold
@Deprecated protected int getInSubqueryThreshold()
Deprecated.Gets the list size threshold under whichconvertInToOr(org.apache.calcite.sql2rel.SqlToRelConverter.Blackboard, java.util.List<org.apache.calcite.rex.RexNode>, org.apache.calcite.sql.SqlNodeList, org.apache.calcite.sql.fun.SqlInOperator)
is used. Lists of this size or greater will instead be converted to use a join against an inline table (LogicalValues
) rather than a predicate. A threshold of 0 forces usage of an inline table in all cases; a threshold of Integer.MAX_VALUE forces usage of OR in all cases- Returns:
- threshold, default
DEFAULT_IN_SUB_QUERY_THRESHOLD
-
convertExists
private RelOptUtil.Exists convertExists(SqlNode seek, RelOptUtil.SubQueryType subQueryType, RelOptUtil.Logic logic, boolean notIn, RelDataType targetDataType)
Converts an EXISTS or IN predicate into a join. For EXISTS, the sub-query produces an indicator variable, and the result is a relational expression which outer joins that indicator to the original query. After performing the outer join, the condition will be TRUE if the EXISTS condition holds, NULL otherwise.- Parameters:
seek
- A query, for example 'select * from emp' or 'values (1,2,3)' or '('Foo', 34)'.subQueryType
- Whether sub-query is IN, EXISTS or scalarlogic
- Whether the answer needs to be in full 3-valued logic (TRUE, FALSE, UNKNOWN) will be required, or whether we can accept an approximation (say representing UNKNOWN as FALSE)notIn
- Whether the operation is NOT IN- Returns:
- join expression
-
convertQueryOrInList
private RelNode convertQueryOrInList(SqlToRelConverter.Blackboard bb, SqlNode seek, RelDataType targetRowType)
-
convertRowValues
private RelNode convertRowValues(SqlToRelConverter.Blackboard bb, SqlNode rowList, java.util.Collection<SqlNode> rows, boolean allowLiteralsOnly, RelDataType targetRowType)
-
convertLiteralInValuesList
private RexLiteral convertLiteralInValuesList(SqlNode sqlNode, SqlToRelConverter.Blackboard bb, RelDataType rowType, int iField)
-
isRowConstructor
private boolean isRowConstructor(SqlNode node)
-
findSubQueries
private void findSubQueries(SqlToRelConverter.Blackboard bb, SqlNode node, RelOptUtil.Logic logic, boolean registerOnlyScalarSubQueries)
Builds a list of allIN
orEXISTS
operators inside SQL parse tree. Does not traverse inside queries.- Parameters:
bb
- blackboardnode
- the SQL parse treelogic
- Whether the answer needs to be in full 3-valued logic (TRUE, FALSE, UNKNOWN) will be required, or whether we can accept an approximation (say representing UNKNOWN as FALSE)registerOnlyScalarSubQueries
- if set to true and the parse tree corresponds to a variation of a select node, only register it if it's a scalar sub-query
-
convertExpression
public RexNode convertExpression(SqlNode node)
- Parameters:
node
- Expression to translate- Returns:
- Converted expression
-
convertExpression
public RexNode convertExpression(SqlNode node, java.util.Map<java.lang.String,RexNode> nameToNodeMap)
Converts an expression fromSqlNode
toRexNode
format, mapping identifier references to predefined expressions.- Parameters:
node
- Expression to translatenameToNodeMap
- map from String toRexNode
; when anSqlIdentifier
is encountered, it is used as a key and translated to the corresponding value from this map- Returns:
- Converted expression
-
convertExtendedExpression
protected RexNode convertExtendedExpression(SqlNode node, SqlToRelConverter.Blackboard bb)
Converts a non-standard expression.This method is an extension-point that derived classes can override. If this method returns a null result, the normal expression translation process will proceed. The default implementation always returns null.
- Parameters:
node
- Expressionbb
- Blackboard- Returns:
- null to proceed with the usual expression translation process
-
convertOver
private RexNode convertOver(SqlToRelConverter.Blackboard bb, SqlNode node)
-
convertFrom
protected void convertFrom(SqlToRelConverter.Blackboard bb, SqlNode from)
Converts a FROM clause into a relational expression.- Parameters:
bb
- Scope within which to resolve identifiersfrom
- FROM clause of a query. Examples include:- a single table ("SALES.EMP"),
- an aliased table ("EMP AS E"),
- a list of tables ("EMP, DEPT"),
- an ANSI Join expression ("EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO"),
- a VALUES clause ("VALUES ('Fred', 20)"),
- a query ("(SELECT * FROM EMP WHERE GENDER = 'F')"),
- or any combination of the above.
-
convertMatchRecognize
protected void convertMatchRecognize(SqlToRelConverter.Blackboard bb, SqlCall call)
-
convertIdentifier
private void convertIdentifier(SqlToRelConverter.Blackboard bb, SqlIdentifier id, SqlNodeList extendedColumns)
-
convertCollectionTable
protected void convertCollectionTable(SqlToRelConverter.Blackboard bb, SqlCall call)
-
afterTableFunction
protected void afterTableFunction(SqlToRelConverter.Blackboard bb, SqlCall call, LogicalTableFunctionScan callRel)
-
getColumnMappings
private java.util.Set<RelColumnMapping> getColumnMappings(SqlOperator op)
-
createJoin
protected RelNode createJoin(SqlToRelConverter.Blackboard bb, RelNode leftRel, RelNode rightRel, RexNode joinCond, JoinRelType joinType)
-
getCorrelationUse
private SqlToRelConverter.CorrelationUse getCorrelationUse(SqlToRelConverter.Blackboard bb, RelNode r0)
-
isSubQueryNonCorrelated
private boolean isSubQueryNonCorrelated(RelNode subq, SqlToRelConverter.Blackboard bb)
Determines whether a sub-query is non-correlated. Note that a non-correlated sub-query can contain correlated references, provided those references do not reference select statements that are parents of the sub-query.- Parameters:
subq
- the sub-querybb
- blackboard used while converting the sub-query, i.e., the blackboard of the parent query of this sub-query- Returns:
- true if the sub-query is non-correlated
-
getSystemFields
protected java.util.List<RelDataTypeField> getSystemFields()
Returns a list of fields to be prefixed to each relational expression.- Returns:
- List of system fields
-
convertJoinCondition
private RexNode convertJoinCondition(SqlToRelConverter.Blackboard bb, SqlValidatorNamespace leftNamespace, SqlValidatorNamespace rightNamespace, SqlNode condition, JoinConditionType conditionType, RelNode leftRel, RelNode rightRel)
-
convertUsing
@Nonnull private RexNode convertUsing(SqlValidatorNamespace leftNamespace, SqlValidatorNamespace rightNamespace, java.util.List<java.lang.String> nameList)
Returns an expression for matching columns of a USING clause or inferred from NATURAL JOIN. "a JOIN b USING (x, y)" becomes "a.x = b.x AND a.y = b.y". Returns null if the column list is empty.- Parameters:
leftNamespace
- Namespace of left input to joinrightNamespace
- Namespace of right input to joinnameList
- List of column names to join on- Returns:
- Expression to match columns from name list, or true if name list is empty
-
convertJoinType
private static JoinRelType convertJoinType(JoinType joinType)
-
convertAgg
protected void convertAgg(SqlToRelConverter.Blackboard bb, SqlSelect select, java.util.List<SqlNode> orderExprList)
Converts the SELECT, GROUP BY and HAVING clauses of an aggregate query.This method extracts SELECT, GROUP BY and HAVING clauses, and creates an
SqlToRelConverter.AggConverter
, then delegates tocreateAggImpl(org.apache.calcite.sql2rel.SqlToRelConverter.Blackboard, org.apache.calcite.sql2rel.SqlToRelConverter.AggConverter, org.apache.calcite.sql.SqlNodeList, org.apache.calcite.sql.SqlNodeList, org.apache.calcite.sql.SqlNode, java.util.List<org.apache.calcite.sql.SqlNode>)
. Derived class may override this method to change any of those clauses or specify a differentSqlToRelConverter.AggConverter
.- Parameters:
bb
- Scope within which to resolve identifiersselect
- QueryorderExprList
- Additional expressions needed to implement ORDER BY
-
createAggImpl
protected final void createAggImpl(SqlToRelConverter.Blackboard bb, SqlToRelConverter.AggConverter aggConverter, SqlNodeList selectList, SqlNodeList groupList, SqlNode having, java.util.List<SqlNode> orderExprList)
-
createAggregate
protected RelNode createAggregate(SqlToRelConverter.Blackboard bb, ImmutableBitSet groupSet, com.google.common.collect.ImmutableList<ImmutableBitSet> groupSets, java.util.List<AggregateCall> aggCalls)
Creates an Aggregate.In case the aggregate rel changes the order in which it projects fields, the
groupExprProjection
parameter is provided, and the implementation of this method may modify it.The
sortedCount
parameter is the number of expressions known to be monotonic. These expressions must be on the leading edge of the grouping keys. The default implementation of this method ignores this parameter.- Parameters:
bb
- BlackboardgroupSet
- Bit set of ordinals of grouping columnsgroupSets
- Grouping setsaggCalls
- Array of calls to aggregate functions- Returns:
- LogicalAggregate
-
convertDynamicParam
public RexDynamicParam convertDynamicParam(SqlDynamicParam dynamicParam)
-
gatherOrderExprs
protected void gatherOrderExprs(SqlToRelConverter.Blackboard bb, SqlSelect select, SqlNodeList orderList, java.util.List<SqlNode> extraOrderExprs, java.util.List<RelFieldCollation> collationList)
Creates a list of collations required to implement the ORDER BY clause, if there is one. PopulatesextraOrderExprs
with any sort expressions which are not in the select clause.- Parameters:
bb
- Scope within which to resolve identifiersselect
- Select clause. Never null, because we invent a dummy SELECT if ORDER BY is applied to a set operation (UNION etc.)orderList
- Order by clause, may be nullextraOrderExprs
- Sort expressions which are not in the select clause (output)collationList
- List of collations (output)
-
convertOrderItem
protected RelFieldCollation convertOrderItem(SqlSelect select, SqlNode orderItem, java.util.List<SqlNode> extraExprs, RelFieldCollation.Direction direction, RelFieldCollation.NullDirection nullDirection)
-
desc
private static boolean desc(RelFieldCollation.Direction direction)
-
enableDecorrelation
@Deprecated protected boolean enableDecorrelation()
Deprecated.
-
isTrimUnusedFields
@Deprecated public boolean isTrimUnusedFields()
Deprecated.Returns whether to trim unused fields as part of the conversion process.- Returns:
- Whether to trim unused fields
-
convertQueryRecursive
protected RelRoot convertQueryRecursive(SqlNode query, boolean top, RelDataType targetRowType)
Recursively converts a query to a relational expression.- Parameters:
query
- Querytop
- Whether this query is the top-level query of the statementtargetRowType
- Target row type, or null- Returns:
- Relational expression
-
convertSetOp
protected RelNode convertSetOp(SqlCall call)
Converts a set operation (UNION, INTERSECT, MINUS) into relational expressions.- Parameters:
call
- Call to set operator- Returns:
- Relational expression
-
all
private boolean all(SqlCall call)
-
createModify
private RelNode createModify(RelOptTable targetTable, RelNode source)
Creates a relational expression to modify a table or modifiable view.
-
createSource
private RelNode createSource(RelOptTable targetTable, RelNode source, ModifiableView modifiableView, RelDataType delegateRowType)
Wraps a relational expression in the projects and filters implied by aModifiableView
.The input relational expression is suitable for inserting into the view, and the returned relational expression is suitable for inserting into its delegate table.
In principle, the delegate table of a view might be another modifiable view, and if so, the process can be repeated.
-
createToRelContext
private RelOptTable.ToRelContext createToRelContext()
-
toRel
public RelNode toRel(RelOptTable table)
-
getTargetTable
protected RelOptTable getTargetTable(SqlNode call)
-
convertColumnList
protected RelNode convertColumnList(SqlInsert call, RelNode source)
Creates a source for an INSERT statement.If the column list is not specified, source expressions match target columns in order.
If the column list is specified, Source expressions are mapped to target columns by name via targetColumnList, and may not cover the entire target table. So, we'll make up a full row, using a combination of default values and the source expressions provided.
- Parameters:
call
- Insert expressionsource
- Source relational expression- Returns:
- Converted INSERT statement
-
createInsertBlackboard
private SqlToRelConverter.Blackboard createInsertBlackboard(RelOptTable targetTable, RexNode sourceRef, java.util.List<java.lang.String> targetColumnNames)
Creates a blackboard for translating the expressions of generated columns in an INSERT statement.
-
getInitializerFactory
private InitializerExpressionFactory getInitializerFactory(SqlValidatorTable validatorTable)
-
unwrap
private static <T> T unwrap(java.lang.Object o, java.lang.Class<T> clazz)
-
castNullLiteralIfNeeded
private RexNode castNullLiteralIfNeeded(RexNode node, RelDataType type)
-
collectInsertTargets
protected void collectInsertTargets(SqlInsert call, RexNode sourceRef, java.util.List<java.lang.String> targetColumnNames, java.util.List<RexNode> columnExprs)
Given an INSERT statement, collects the list of names to be populated and the expressions to put in them.- Parameters:
call
- Insert statementsourceRef
- Expression representing a row from the source relational expressiontargetColumnNames
- List of target column names, to be populatedcolumnExprs
- List of expressions, to be populated
-
convertIdentifier
private RexNode convertIdentifier(SqlToRelConverter.Blackboard bb, SqlIdentifier identifier)
Converts an identifier into an expression in a given scope. For example, the "empno" in "select empno from emp join dept" becomes "emp.empno".
-
adjustInputRef
protected RexNode adjustInputRef(SqlToRelConverter.Blackboard bb, RexInputRef inputRef)
Adjusts the type of a reference to an input field to account for nulls introduced by outer joins; and adjusts the offset to match the physical implementation.- Parameters:
bb
- BlackboardinputRef
- Input ref- Returns:
- Adjusted input ref
-
convertRowConstructor
private RelNode convertRowConstructor(SqlToRelConverter.Blackboard bb, SqlCall rowConstructor)
Converts a row constructor into a relational expression.- Parameters:
bb
- BlackboardrowConstructor
- Row constructor expression- Returns:
- Relational expression which returns a single row.
-
convertCursor
private RelNode convertCursor(SqlToRelConverter.Blackboard bb, SqlToRelConverter.SubQuery subQuery)
-
convertMultisets
private RelNode convertMultisets(java.util.List<SqlNode> operands, SqlToRelConverter.Blackboard bb)
-
convertSelectList
private void convertSelectList(SqlToRelConverter.Blackboard bb, SqlSelect select, java.util.List<SqlNode> orderList)
-
extraSelectItems
protected void extraSelectItems(SqlToRelConverter.Blackboard bb, SqlSelect select, java.util.List<RexNode> exprList, java.util.List<java.lang.String> nameList, java.util.Collection<java.lang.String> aliasList, java.util.List<SqlMonotonicity> columnMonotonicityList)
Adds extra select items. The default implementation adds nothing; derived classes may add columns to exprList, nameList, aliasList and columnMonotonicityList.- Parameters:
bb
- Blackboardselect
- Select statement being translatedexprList
- List of expressions in select clausenameList
- List of names, one per columnaliasList
- Collection of aliases that have been used alreadycolumnMonotonicityList
- List of monotonicity, one per column
-
deriveAlias
private java.lang.String deriveAlias(SqlNode node, java.util.Collection<java.lang.String> aliases, int ordinal)
-
convertWith
public RelRoot convertWith(SqlWith with, boolean top)
Converts a WITH sub-query into a relational expression.
-
convertValues
public RelNode convertValues(SqlCall values, RelDataType targetRowType)
Converts a SELECT statement's parse tree into a relational expression.
-
convertValuesImpl
private void convertValuesImpl(SqlToRelConverter.Blackboard bb, SqlCall values, RelDataType targetRowType)
Converts a values clause (as in "INSERT INTO T(x,y) VALUES (1,2)") into a relational expression.- Parameters:
bb
- Blackboardvalues
- Call to SQL VALUES operatortargetRowType
- Target row type
-
negate
private SqlQuantifyOperator negate(SqlQuantifyOperator operator)
-
configBuilder
public static SqlToRelConverter.ConfigBuilder configBuilder()
Creates a builder for aSqlToRelConverter.Config
.
-
-