diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/ASTNode.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/ASTNode.java index 62f9d14..833c3b1 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/ASTNode.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/ASTNode.java @@ -22,7 +22,9 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; +import java.util.LinkedList; import java.util.List; +import java.util.Queue; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; @@ -258,6 +260,10 @@ public void addChildren(List kids) { @Override public void setChild(int i, Tree t) { + Tree currChild = getChild(i); + if (currChild != null) { + clearRootNodeForSubTree(currChild); + } super.setChild(i, t); resetRootInformation(); } @@ -347,4 +353,25 @@ private String toStringTree(ASTNode rootNode) { return rootNode.getMemoizedSubString(startIndx, endIndx); } + private static void clearRootNodeForSubTree(final Tree tree) { + if (tree == null) { + return; + } + + Queue queue = new LinkedList<>(); + queue.add(tree); + while (!queue.isEmpty()) { + Tree node = queue.remove(); + if (node instanceof ASTNode) { + ((ASTNode) node).rootNode = null; + } + for (int i = 0; i < node.getChildCount(); i++) { + Tree child = node.getChild(i); + if (child != null) { + queue.add(child); + } + } + } + } + }