@Override public Node visitUnicodeStringLiteral(SqlBaseParser.UnicodeStringLiteralContext context) { return new StringLiteral(getLocation(context), decodeUnicodeLiteral(context)); }
@Override public Node visitArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext context) { return new ArithmeticBinaryExpression( getLocation(context.operator), getArithmeticBinaryOperator(context.operator), (Expression) visit(context.left), (Expression) visit(context.right)); }
@Override public Node visitBoundedFrame(SqlBaseParser.BoundedFrameContext context) { return new FrameBound(getLocation(context), getBoundedFrameBoundType(context.boundType), (Expression) visit(context.expression())); }
@Override public Node visitWindowFrame(SqlBaseParser.WindowFrameContext context) { return new WindowFrame( getLocation(context), getFrameType(context.frameType), (FrameBound) visit(context.start), visitIfPresent(context.end, FrameBound.class)); }
Optional<Expression> filter = visitIfPresent(context.filter(), Expression.class); Optional<Window> window = visitIfPresent(context.over(), Window.class); orderBy = Optional.of(new OrderBy(visit(context.sortItem(), SortItem.class))); QualifiedName name = getQualifiedName(context.qualifiedName()); boolean distinct = isDistinct(context.setQuantifier()); check(context.expression().size() == 2 || context.expression().size() == 3, "Invalid number of arguments for 'if' function", context); check(!window.isPresent(), "OVER clause not valid for 'if' function", context); check(!distinct, "DISTINCT not valid for 'if' function", context); check(!filter.isPresent(), "FILTER not valid for 'if' function", context); elseExpression = (Expression) visit(context.expression(2)); getLocation(context), (Expression) visit(context.expression(0)), (Expression) visit(context.expression(1)), elseExpression); check(context.expression().size() == 2, "Invalid number of arguments for 'nullif' function", context); check(!window.isPresent(), "OVER clause not valid for 'nullif' function", context); check(!distinct, "DISTINCT not valid for 'nullif' function", context); check(!filter.isPresent(), "FILTER not valid for 'nullif' function", context); getLocation(context), (Expression) visit(context.expression(0)), (Expression) visit(context.expression(1)));
@Override public Node visitRevokeRoles(SqlBaseParser.RevokeRolesContext context) { return new RevokeRoles( getLocation(context), ImmutableSet.copyOf(getIdentifiers(context.roles().identifier())), ImmutableSet.copyOf(getPrincipalSpecifications(context.principal())), context.OPTION() != null, getGrantorSpecificationIfPresent(context.grantor())); }
String escapeString = unquote(context.STRING().getText()); check(!escapeString.isEmpty(), "Empty Unicode escape character", context); check(escapeString.length() == 1, "Invalid Unicode escape character: " + escapeString, context); escape = escapeString.charAt(0); check(isValidUnicodeEscape(escape), "Invalid Unicode escape character: " + escapeString, context); String rawContent = unquote(context.UNICODE_STRING().getText().substring(2)); StringBuilder unicodeStringBuilder = new StringBuilder(); StringBuilder escapedCharacterBuilder = new StringBuilder(); else if (isHexDigit(ch)) { state = UnicodeDecodeState.UNICODE_SEQUENCE; charactersNeeded = 4; throw parseError("Invalid hexadecimal digit: " + ch, context); check(isHexDigit(ch), "Incomplete escape sequence: " + escapedCharacterBuilder.toString(), context); escapedCharacterBuilder.append(ch); if (charactersNeeded == escapedCharacterBuilder.length()) { escapedCharacterBuilder.setLength(0); int codePoint = Integer.parseInt(currentEscapedCode, 16); check(Character.isValidCodePoint(codePoint), "Invalid escaped character: " + currentEscapedCode, context); if (Character.isSupplementaryCodePoint(codePoint)) { unicodeStringBuilder.appendCodePoint(codePoint); check(!Character.isSurrogate(currentCodePoint), format("Invalid escaped character: %s. Escaped character is a surrogate. Use '\\+123456' instead.", currentEscapedCode), context); unicodeStringBuilder.append(currentCodePoint);
@Override public Node visitQuantifiedComparison(SqlBaseParser.QuantifiedComparisonContext context) { return new QuantifiedComparisonExpression( getLocation(context.comparisonOperator()), getComparisonOperator(((TerminalNode) context.comparisonOperator().getChild(0)).getSymbol()), getComparisonQuantifier(((TerminalNode) context.comparisonQuantifier().getChild(0)).getSymbol()), (Expression) visit(context.value), new SubqueryExpression(getLocation(context.query()), (Query) visit(context.query()))); }
@Override public Node visitCreateRole(SqlBaseParser.CreateRoleContext context) { return new CreateRole( getLocation(context), (Identifier) visit(context.name), getGrantorSpecificationIfPresent(context.grantor())); }
@Override public Node visitComparison(SqlBaseParser.ComparisonContext context) { return new ComparisonExpression( getLocation(context.comparisonOperator()), getComparisonOperator(((TerminalNode) context.comparisonOperator().getChild(0)).getSymbol()), (Expression) visit(context.value), (Expression) visit(context.right)); }
@Override public Node visitSpecialDateTimeFunction(SqlBaseParser.SpecialDateTimeFunctionContext context) { CurrentTime.Function function = getDateTimeFunctionType(context.name); if (context.precision != null) { return new CurrentTime(getLocation(context), function, Integer.parseInt(context.precision.getText())); } return new CurrentTime(getLocation(context), function); }
return new AstBuilder(parsingOptions).visit(tree);
Optional<Expression> filter = visitIfPresent(context.filter(), Expression.class); Optional<Window> window = visitIfPresent(context.over(), Window.class); orderBy = Optional.of(new OrderBy(visit(context.sortItem(), SortItem.class))); QualifiedName name = getQualifiedName(context.qualifiedName()); boolean distinct = isDistinct(context.setQuantifier()); check(context.expression().size() == 2 || context.expression().size() == 3, "Invalid number of arguments for 'if' function", context); check(!window.isPresent(), "OVER clause not valid for 'if' function", context); check(!distinct, "DISTINCT not valid for 'if' function", context); check(!filter.isPresent(), "FILTER not valid for 'if' function", context); elseExpression = (Expression) visit(context.expression(2)); getLocation(context), (Expression) visit(context.expression(0)), (Expression) visit(context.expression(1)), elseExpression); check(context.expression().size() == 2, "Invalid number of arguments for 'nullif' function", context); check(!window.isPresent(), "OVER clause not valid for 'nullif' function", context); check(!distinct, "DISTINCT not valid for 'nullif' function", context); check(!filter.isPresent(), "FILTER not valid for 'nullif' function", context); getLocation(context), (Expression) visit(context.expression(0)), (Expression) visit(context.expression(1)));
@Override public Node visitRevokeRoles(SqlBaseParser.RevokeRolesContext context) { return new RevokeRoles( getLocation(context), ImmutableSet.copyOf(getIdentifiers(context.roles().identifier())), ImmutableSet.copyOf(getPrincipalSpecifications(context.principal())), context.OPTION() != null, getGrantorSpecificationIfPresent(context.grantor())); }
String escapeString = unquote(context.STRING().getText()); check(!escapeString.isEmpty(), "Empty Unicode escape character", context); check(escapeString.length() == 1, "Invalid Unicode escape character: " + escapeString, context); escape = escapeString.charAt(0); check(isValidUnicodeEscape(escape), "Invalid Unicode escape character: " + escapeString, context); String rawContent = unquote(context.UNICODE_STRING().getText().substring(2)); StringBuilder unicodeStringBuilder = new StringBuilder(); StringBuilder escapedCharacterBuilder = new StringBuilder(); else if (isHexDigit(ch)) { state = UnicodeDecodeState.UNICODE_SEQUENCE; charactersNeeded = 4; throw parseError("Invalid hexadecimal digit: " + ch, context); check(isHexDigit(ch), "Incomplete escape sequence: " + escapedCharacterBuilder.toString(), context); escapedCharacterBuilder.append(ch); if (charactersNeeded == escapedCharacterBuilder.length()) { escapedCharacterBuilder.setLength(0); int codePoint = Integer.parseInt(currentEscapedCode, 16); check(Character.isValidCodePoint(codePoint), "Invalid escaped character: " + currentEscapedCode, context); if (Character.isSupplementaryCodePoint(codePoint)) { unicodeStringBuilder.appendCodePoint(codePoint); check(!Character.isSurrogate(currentCodePoint), format("Invalid escaped character: %s. Escaped character is a surrogate. Use '\\+123456' instead.", currentEscapedCode), context); unicodeStringBuilder.append(currentCodePoint);
@Override public Node visitQuantifiedComparison(SqlBaseParser.QuantifiedComparisonContext context) { return new QuantifiedComparisonExpression( getLocation(context.comparisonOperator()), getComparisonOperator(((TerminalNode) context.comparisonOperator().getChild(0)).getSymbol()), getComparisonQuantifier(((TerminalNode) context.comparisonQuantifier().getChild(0)).getSymbol()), (Expression) visit(context.value), new SubqueryExpression(getLocation(context.query()), (Query) visit(context.query()))); }
@Override public Node visitWindowFrame(SqlBaseParser.WindowFrameContext context) { return new WindowFrame( getLocation(context), getFrameType(context.frameType), (FrameBound) visit(context.start), visitIfPresent(context.end, FrameBound.class)); }
@Override public Node visitCreateRole(SqlBaseParser.CreateRoleContext context) { return new CreateRole( getLocation(context), (Identifier) visit(context.name), getGrantorSpecificationIfPresent(context.grantor())); }
@Override public Node visitComparison(SqlBaseParser.ComparisonContext context) { return new ComparisonExpression( getLocation(context.comparisonOperator()), getComparisonOperator(((TerminalNode) context.comparisonOperator().getChild(0)).getSymbol()), (Expression) visit(context.value), (Expression) visit(context.right)); }
@Override public Node visitSpecialDateTimeFunction(SqlBaseParser.SpecialDateTimeFunctionContext context) { CurrentTime.Function function = getDateTimeFunctionType(context.name); if (context.precision != null) { return new CurrentTime(getLocation(context), function, Integer.parseInt(context.precision.getText())); } return new CurrentTime(getLocation(context), function); }