public SqlNode visit(SqlNodeList list) { SqlNodeList copy = new SqlNodeList(list.getParserPosition()); for (SqlNode node : list) { copy.add(node.accept(this)); } return copy; }
public static SqlNode[] cloneArray(SqlNode[] nodes) { SqlNode[] clones = (SqlNode[]) nodes.clone(); for (int i = 0; i < clones.length; i++) { SqlNode node = clones[i]; if (node != null) { clones[i] = (SqlNode) node.clone(); } } return clones; }
public SqlNode findAgg(List<SqlNode> nodes) { try { for (SqlNode node : nodes) { node.accept(this); } return null; } catch (Util.FoundOne e) { Util.swallow(e, null); return (SqlNode) e.getNode(); } }
boolean containsAnd(SqlNode node) { try { node.accept(this); return false; } catch (AndFinder.Found e) { return true; } }
/** * Returns whether two nodes are equal (using {@link #equalsDeep(SqlNode,boolean)}) or are both * null. * * @param node1 First expression * @param node2 Second expression * @param fail Whether to throw {@link AssertionError} if expressions are not equal */ public static boolean equalDeep(SqlNode node1, SqlNode node2, boolean fail) { if (node1 == null) { return node2 == null; } else if (node2 == null) { return false; } else { return node1.equalsDeep(node2, fail); } }
/** * Derives an alias for a node, and invents a mangled identifier if it cannot. * * <p>Examples: * * <ul> * <li>Alias: "1 + 2 as foo" yields "foo" * <li>Identifier: "foo.bar.baz" yields "baz" * <li>Anything else yields "expr$<i>ordinal</i>" * </ul> * * @return An alias, if one can be derived; or a synthetic alias "expr$<i>ordinal</i>" if ordinal * >= 0; otherwise null */ public static String getAlias(SqlNode node, int ordinal) { switch (node.getKind()) { case AS: // E.g. "1 + 2 as foo" --> "foo" return ((SqlCall) node).getOperands()[1].toString(); case OVER: // E.g. "bids over w" --> "bids" return getAlias(((SqlCall) node).getOperands()[0], ordinal); case IDENTIFIER: // E.g. "foo.bar" --> "bar" return Util.last(((SqlIdentifier) node).names); default: if (ordinal < 0) { return null; } else { return SqlUtil.deriveAliasFromOrdinal(ordinal); } } }
/** Converts an expression "expr" into "expr AS alias". */ public static SqlNode addAlias(SqlNode expr, String alias) { final SqlParserPos pos = expr.getParserPosition(); final SqlIdentifier id = new SqlIdentifier(alias, pos); return SqlStdOperatorTable.AS.createCall(pos, expr, id); }