KYLIN-2394 merge CALCITE-1592
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/d34f2d3e Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/d34f2d3e Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/d34f2d3e Branch: refs/heads/master-cdh5.7 Commit: d34f2d3e2bf691c55077a9a76a89217ae915bbdd Parents: dfb5fac Author: Billy Liu <billy...@apache.org> Authored: Fri Jan 20 15:42:37 2017 +0800 Committer: Billy Liu <billy...@apache.org> Committed: Fri Jan 20 15:42:37 2017 +0800 ---------------------------------------------------------------------- .../calcite/sql2rel/SqlToRelConverter.java | 51 +++++++++----------- 1 file changed, 23 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/d34f2d3e/atopcalcite/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java ---------------------------------------------------------------------- diff --git a/atopcalcite/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/atopcalcite/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java index 171e299..cc9c9a1 100644 --- a/atopcalcite/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java +++ b/atopcalcite/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java @@ -935,19 +935,21 @@ public class SqlToRelConverter { /** * Push down all the NOT logical operators into any IN/NOT IN operators. * + * @param scope Scope where {@code sqlNode} occurs * @param sqlNode the root node from which to look for NOT operators * @return the transformed SqlNode representation with NOT pushed down. */ - private static SqlNode pushDownNotForIn(SqlNode sqlNode) { + private static SqlNode pushDownNotForIn(SqlValidatorScope scope, + SqlNode sqlNode) { if ((sqlNode instanceof SqlCall) && containsInOperator(sqlNode)) { SqlCall sqlCall = (SqlCall) sqlNode; if ((sqlCall.getOperator() == SqlStdOperatorTable.AND) || (sqlCall.getOperator() == SqlStdOperatorTable.OR)) { SqlNode[] sqlOperands = ((SqlBasicCall) sqlCall).operands; for (int i = 0; i < sqlOperands.length; i++) { - sqlOperands[i] = pushDownNotForIn(sqlOperands[i]); + sqlOperands[i] = pushDownNotForIn(scope, sqlOperands[i]); } - return sqlNode; + return reg(scope, sqlNode); } else if (sqlCall.getOperator() == SqlStdOperatorTable.NOT) { SqlNode childNode = sqlCall.operand(0); assert childNode instanceof SqlCall; @@ -956,48 +958,34 @@ public class SqlToRelConverter { SqlNode[] andOperands = childSqlCall.getOperands(); SqlNode[] orOperands = new SqlNode[andOperands.length]; for (int i = 0; i < orOperands.length; i++) { - orOperands[i] = - SqlStdOperatorTable.NOT.createCall( - SqlParserPos.ZERO, - andOperands[i]); + orOperands[i] = reg(scope, SqlStdOperatorTable.NOT.createCall(SqlParserPos.ZERO, andOperands[i])); } for (int i = 0; i < orOperands.length; i++) { - orOperands[i] = pushDownNotForIn(orOperands[i]); + orOperands[i] = pushDownNotForIn(scope, orOperands[i]); } - return SqlStdOperatorTable.OR.createCall(SqlParserPos.ZERO, - orOperands[0], orOperands[1]); + return reg(scope, SqlStdOperatorTable.OR.createCall(SqlParserPos.ZERO, orOperands[0], orOperands[1])); } else if (childSqlCall.getOperator() == SqlStdOperatorTable.OR) { SqlNode[] orOperands = childSqlCall.getOperands(); SqlNode[] andOperands = new SqlNode[orOperands.length]; for (int i = 0; i < andOperands.length; i++) { - andOperands[i] = - SqlStdOperatorTable.NOT.createCall( - SqlParserPos.ZERO, - orOperands[i]); + andOperands[i] = reg(scope, SqlStdOperatorTable.NOT.createCall(SqlParserPos.ZERO, orOperands[i])); } for (int i = 0; i < andOperands.length; i++) { - andOperands[i] = pushDownNotForIn(andOperands[i]); + andOperands[i] = pushDownNotForIn(scope, andOperands[i]); } - return SqlStdOperatorTable.AND.createCall(SqlParserPos.ZERO, - andOperands[0], andOperands[1]); + return reg(scope, SqlStdOperatorTable.AND.createCall(SqlParserPos.ZERO, andOperands[0], andOperands[1])); } else if (childSqlCall.getOperator() == SqlStdOperatorTable.NOT) { SqlNode[] notOperands = childSqlCall.getOperands(); assert notOperands.length == 1; - return pushDownNotForIn(notOperands[0]); + return pushDownNotForIn(scope, notOperands[0]); } else if (childSqlCall.getOperator() instanceof SqlInOperator) { SqlNode[] inOperands = childSqlCall.getOperands(); SqlInOperator inOp = (SqlInOperator) childSqlCall.getOperator(); if (inOp.isNotIn()) { - return SqlStdOperatorTable.IN.createCall( - SqlParserPos.ZERO, - inOperands[0], - inOperands[1]); + return reg(scope, SqlStdOperatorTable.IN.createCall(SqlParserPos.ZERO, inOperands[0], inOperands[1])); } else { - return SqlStdOperatorTable.NOT_IN.createCall( - SqlParserPos.ZERO, - inOperands[0], - inOperands[1]); + return reg(scope, SqlStdOperatorTable.NOT_IN.createCall(SqlParserPos.ZERO, inOperands[0], inOperands[1])); } } else { // childSqlCall is "leaf" node in a logical expression tree @@ -1015,6 +1003,13 @@ public class SqlToRelConverter { } } + /** Registers with the validator a {@link SqlNode} that has been created + * during the Sql-to-Rel process. */ + private static SqlNode reg(SqlValidatorScope scope, SqlNode e) { + scope.getValidator().deriveType(scope, e); + return e; + } + /** * Converts a WHERE clause. * @@ -1027,7 +1022,7 @@ public class SqlToRelConverter { if (where == null) { return; } - SqlNode newWhere = pushDownNotForIn(where); + SqlNode newWhere = pushDownNotForIn(bb.scope, where); replaceSubQueries(bb, newWhere, RelOptUtil.Logic.UNKNOWN_AS_FALSE); final RexNode convertedWhere = bb.convertExpression(newWhere); @@ -2667,7 +2662,7 @@ public class SqlToRelConverter { // Replace sub-queries in having here and modify having to use // the replaced expressions if (having != null) { - SqlNode newHaving = pushDownNotForIn(having); + SqlNode newHaving = pushDownNotForIn(bb.scope, having); replaceSubQueries(bb, newHaving, RelOptUtil.Logic.UNKNOWN_AS_FALSE); havingExpr = bb.convertExpression(newHaving); if (havingExpr.isAlwaysTrue()) {