diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java index a3b1790..bc53f49 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java @@ -50,6 +50,7 @@ import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.Pair; import org.apache.calcite.util.Util; +import org.apache.hadoop.hive.ql.lib.Node; import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveJoin; import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveProject; import org.apache.hadoop.hive.ql.parse.ASTNode; @@ -87,13 +88,25 @@ } public static boolean validateASTForUnsupportedTokens(ASTNode ast) { - String astTree = ast.toStringTree(); + List fringe = new ArrayList<>(); // if any of following tokens are present in AST, bail out - String[] tokens = { "TOK_CHARSETLITERAL", "TOK_TABLESPLITSAMPLE" }; - for (String token : tokens) { - if (astTree.contains(token)) { + @SuppressWarnings("serial") + Set unsupportedTokens = new HashSet() { + { + add("TOK_CHARSETLITERAL"); + add("TOK_TABLESPLITSAMPLE"); + } + }; + fringe.add(ast); + while (!fringe.isEmpty()) { + ASTNode current = fringe.get(0); + fringe.remove(0); + if (unsupportedTokens.contains(current.getText())) { return false; } + for (Node child : current.getChildren()) { + fringe.add((ASTNode) child); + } } return true; }