/** * Consider using {@link #createExpression(String, ParsingOptions)} */ @Deprecated public Expression createExpression(String expression) { return createExpression(expression, new ParsingOptions()); }
@Override public Node visitDecimalLiteral(SqlBaseParser.DecimalLiteralContext context) { switch (parsingOptions.getDecimalLiteralTreatment()) { case AS_DOUBLE: return new DoubleLiteral(getLocation(context), context.getText()); case AS_DECIMAL: return new DecimalLiteral(getLocation(context), context.getText()); case REJECT: throw new ParsingException("Unexpected decimal literal: " + context.getText()); } throw new AssertionError("Unreachable"); }
@Override public Node visitDecimalLiteral(SqlBaseParser.DecimalLiteralContext context) { switch (parsingOptions.getDecimalLiteralTreatment()) { case AS_DOUBLE: return new DoubleLiteral(getLocation(context), context.getText()); case AS_DECIMAL: return new DecimalLiteral(getLocation(context), context.getText()); case REJECT: throw new ParsingException("Unexpected decimal literal: " + context.getText()); } throw new AssertionError("Unreachable"); }
/** * Consider using {@link #createExpression(String, ParsingOptions)} */ @Deprecated public Expression createExpression(String expression) { return createExpression(expression, new ParsingOptions()); }
public static void assertFormattedSql(SqlParser sqlParser, Node expected) { ParsingOptions parsingOptions = new ParsingOptions(AS_DOUBLE /* anything */); assertFormattedSql(sqlParser, parsingOptions, expected); }
public PathSpecification createPathSpecification(String expression) { return (PathSpecification) invokeParser("path specification", expression, SqlBaseParser::standalonePathSpecification, new ParsingOptions()); }
public static ParsingOptions createParsingOptions(Session session) { return new ParsingOptions(isParseDecimalLiteralsAsDouble(session) ? AS_DOUBLE : AS_DECIMAL); }
/** * Consider using {@link #createStatement(String, ParsingOptions)} */ @Deprecated public Statement createStatement(String sql) { return createStatement(sql, new ParsingOptions()); }
public static void assertFormattedSql(SqlParser sqlParser, Node expected) { ParsingOptions parsingOptions = new ParsingOptions(AS_DOUBLE /* anything */); assertFormattedSql(sqlParser, parsingOptions, expected); }
public static ParsingOptions createParsingOptions(Session session) { return new ParsingOptions(isParseDecimalLiteralsAsDouble(session) ? AS_DOUBLE : AS_DECIMAL); }
public PathSpecification createPathSpecification(String expression) { return (PathSpecification) invokeParser("path specification", expression, SqlBaseParser::standalonePathSpecification, new ParsingOptions()); }
/** * Consider using {@link #createStatement(String, ParsingOptions)} */ @Deprecated public Statement createStatement(String sql) { return createStatement(sql, new ParsingOptions()); }
static QueryType statementToQueryType(SqlParser parser, String sql) { try { return statementToQueryType(parser.createStatement(sql, new ParsingOptions(AS_DOUBLE /* anything */))); } catch (RuntimeException e) { throw new UnsupportedOperationException(); } }
private static Map<String, String> parsePreparedStatementsHeaders(HttpServletRequest servletRequest) { ImmutableMap.Builder<String, String> preparedStatements = ImmutableMap.builder(); for (String header : splitSessionHeader(servletRequest.getHeaders(PRESTO_PREPARED_STATEMENT))) { List<String> nameValue = Splitter.on('=').limit(2).trimResults().splitToList(header); assertRequest(nameValue.size() == 2, "Invalid %s header", PRESTO_PREPARED_STATEMENT); String statementName; String sqlString; try { statementName = urlDecode(nameValue.get(0)); sqlString = urlDecode(nameValue.get(1)); } catch (IllegalArgumentException e) { throw badRequest(format("Invalid %s header: %s", PRESTO_PREPARED_STATEMENT, e.getMessage())); } // Validate statement SqlParser sqlParser = new SqlParser(); try { sqlParser.createStatement(sqlString, new ParsingOptions(AS_DOUBLE /* anything */)); } catch (ParsingException e) { throw badRequest(format("Invalid %s header: %s", PRESTO_PREPARED_STATEMENT, e.getMessage())); } preparedStatements.put(statementName, sqlString); } return preparedStatements.build(); }
private static Map<String, String> parsePreparedStatementsHeaders(HttpServletRequest servletRequest) { ImmutableMap.Builder<String, String> preparedStatements = ImmutableMap.builder(); for (String header : splitSessionHeader(servletRequest.getHeaders(PRESTO_PREPARED_STATEMENT))) { List<String> nameValue = Splitter.on('=').limit(2).trimResults().splitToList(header); assertRequest(nameValue.size() == 2, "Invalid %s header", PRESTO_PREPARED_STATEMENT); String statementName; String sqlString; try { statementName = urlDecode(nameValue.get(0)); sqlString = urlDecode(nameValue.get(1)); } catch (IllegalArgumentException e) { throw badRequest(format("Invalid %s header: %s", PRESTO_PREPARED_STATEMENT, e.getMessage())); } // Validate statement SqlParser sqlParser = new SqlParser(); try { sqlParser.createStatement(sqlString, new ParsingOptions(AS_DOUBLE /* anything */)); } catch (ParsingException e) { throw badRequest(format("Invalid %s header: %s", PRESTO_PREPARED_STATEMENT, e.getMessage())); } preparedStatements.put(statementName, sqlString); } return preparedStatements.build(); }
private static void assertSqlFormatter(String expression, String formatted) { Expression originalExpression = SQL_PARSER.createExpression(expression, new ParsingOptions()); String real = SqlFormatter.formatSql(originalExpression, Optional.empty()); assertEquals(real, formatted); }
private void assetQuery(String query) { SqlParser parser = new SqlParser(); Statement statement = parser.createStatement(query, new ParsingOptions()); String formattedQuery = getFormattedSql(statement, parser, Optional.empty()); assertEquals(formattedQuery, query); } }
public Query shadowQuery(Query query) throws QueryRewriteException, SQLException { if (statementToQueryType(parser, query.getQuery()) == READ) { return query; } if (!query.getPreQueries().isEmpty()) { throw new QueryRewriteException("Cannot rewrite queries that use pre-queries"); } if (!query.getPostQueries().isEmpty()) { throw new QueryRewriteException("Cannot rewrite queries that use post-queries"); } Statement statement = parser.createStatement(query.getQuery(), new ParsingOptions(AS_DOUBLE /* anything */)); try (Connection connection = DriverManager.getConnection(gatewayUrl, usernameOverride.orElse(query.getUsername()), passwordOverride.orElse(query.getPassword()))) { trySetConnectionProperties(query, connection); if (statement instanceof CreateTableAsSelect) { return rewriteCreateTableAsSelect(connection, query, (CreateTableAsSelect) statement); } else if (statement instanceof Insert) { return rewriteInsertQuery(connection, query, (Insert) statement); } } throw new QueryRewriteException("Unsupported query type: " + statement.getClass()); }
public static String getFormattedSql(Statement statement, SqlParser sqlParser, Optional<List<Expression>> parameters) { String sql = SqlFormatter.formatSql(statement, parameters); // verify round-trip Statement parsed; try { ParsingOptions parsingOptions = new ParsingOptions(REJECT /* formatted SQL should be unambiguous */); parsed = sqlParser.createStatement(sql, parsingOptions); } catch (ParsingException e) { throw new PrestoException(GENERIC_INTERNAL_ERROR, "Formatted query does not parse: " + statement); } if (!statement.equals(parsed)) { throw new PrestoException(GENERIC_INTERNAL_ERROR, "Query does not round-trip: " + statement); } return sql; } }
public static String getFormattedSql(Statement statement, SqlParser sqlParser, Optional<List<Expression>> parameters) { String sql = SqlFormatter.formatSql(statement, parameters); // verify round-trip Statement parsed; try { ParsingOptions parsingOptions = new ParsingOptions(REJECT /* formatted SQL should be unambiguous */); parsed = sqlParser.createStatement(sql, parsingOptions); } catch (ParsingException e) { throw new PrestoException(GENERIC_INTERNAL_ERROR, "Formatted query does not parse: " + statement); } if (!statement.equals(parsed)) { throw new PrestoException(GENERIC_INTERNAL_ERROR, "Query does not round-trip: " + statement); } return sql; } }