diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultQueryBuilder.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultQueryBuilder.java index 4977bc7c6463..360ac6e50b9d 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultQueryBuilder.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultQueryBuilder.java @@ -60,6 +60,8 @@ public class DefaultQueryBuilder private static final String ALWAYS_TRUE = "1=1"; private static final String ALWAYS_FALSE = "1=0"; + private static final Joiner SPACE_JOINER = Joiner.on(' '); + private final RemoteQueryModifier queryModifier; @Inject @@ -131,18 +133,18 @@ public PreparedQuery prepareJoinQuery( String leftRelationAlias = "l"; String rightRelationAlias = "r"; - String query = format( - "SELECT %s, %s FROM (%s) %s %s (%s) %s ON %s", - formatAssignments(client, leftRelationAlias, leftAssignments), + String query = SPACE_JOINER.join( + "SELECT", + formatAssignments(client, leftRelationAlias, leftAssignments) + ",", formatAssignments(client, rightRelationAlias, rightAssignments), - leftSource.getQuery(), - leftRelationAlias, + "FROM", + "(" + leftSource.getQuery() + ")", leftRelationAlias, formatJoinType(joinType), - rightSource.getQuery(), - rightRelationAlias, - joinConditions.stream() - .map(condition -> formatJoinCondition(client, leftRelationAlias, rightRelationAlias, condition)) - .collect(joining(" AND "))); + "(" + rightSource.getQuery() + ")", rightRelationAlias, + "ON", joinConditions.stream() + .map(condition -> formatJoinCondition(client, leftRelationAlias, rightRelationAlias, condition)) + .collect(joining(" AND "))); + List parameters = ImmutableList.builder() .addAll(leftSource.getParameters()) .addAll(rightSource.getParameters()) @@ -231,13 +233,10 @@ public CallableStatement callProcedure(JdbcClient client, ConnectorSession sessi protected String formatJoinCondition(JdbcClient client, String leftRelationAlias, String rightRelationAlias, JdbcJoinCondition condition) { - return format( - "%s.%s %s %s.%s", - leftRelationAlias, - buildJoinColumn(client, condition.getLeftColumn()), + return SPACE_JOINER.join( + leftRelationAlias + "." + buildJoinColumn(client, condition.getLeftColumn()), condition.getOperator().getValue(), - rightRelationAlias, - buildJoinColumn(client, condition.getRightColumn())); + rightRelationAlias + "." + buildJoinColumn(client, condition.getRightColumn())); } protected String buildJoinColumn(JdbcClient client, JdbcColumnHandle columnHandle) @@ -248,23 +247,18 @@ protected String buildJoinColumn(JdbcClient client, JdbcColumnHandle columnHandl protected String formatAssignments(JdbcClient client, String relationAlias, Map assignments) { return assignments.entrySet().stream() - .map(entry -> format("%s.%s AS %s", relationAlias, client.quoted(entry.getKey().getColumnName()), client.quoted(entry.getValue()))) + .map(entry -> SPACE_JOINER.join(relationAlias + "." + client.quoted(entry.getKey().getColumnName()), "AS", client.quoted(entry.getValue()))) .collect(joining(", ")); } protected String formatJoinType(JoinType joinType) { - switch (joinType) { - case INNER: - return "INNER JOIN"; - case LEFT_OUTER: - return "LEFT JOIN"; - case RIGHT_OUTER: - return "RIGHT JOIN"; - case FULL_OUTER: - return "FULL JOIN"; - } - throw new IllegalStateException("Unsupported join type: " + joinType); + return switch (joinType) { + case INNER -> "INNER JOIN"; + case LEFT_OUTER -> "LEFT JOIN"; + case RIGHT_OUTER -> "RIGHT JOIN"; + case FULL_OUTER -> "FULL JOIN"; + }; } protected String getRelation(JdbcClient client, RemoteTableName remoteTableName) @@ -285,7 +279,7 @@ protected String getProjection(JdbcClient client, List columns projections.add(columnAlias); } else { - projections.add(format("%s AS %s", expression.expression(), columnAlias)); + projections.add(SPACE_JOINER.join(expression.expression(), "AS", columnAlias)); expression.parameters().forEach(accumulator); } } @@ -345,7 +339,8 @@ protected String toPredicate(JdbcClient client, ConnectorSession session, Connec if (!domain.isNullAllowed()) { return predicate; } - return format("(%s OR %s IS NULL)", predicate, client.quoted(column.getColumnName())); + + return SPACE_JOINER.join("(" + predicate, "OR", client.quoted(column.getColumnName()), "IS NULL)"); } protected String toPredicate(JdbcClient client, ConnectorSession session, Connection connection, JdbcColumnHandle column, ValueSet valueSet, Consumer accumulator) @@ -355,7 +350,7 @@ protected String toPredicate(JdbcClient client, ConnectorSession session, Connec if (!valueSet.isDiscreteSet()) { ValueSet complement = valueSet.complement(); if (complement.isDiscreteSet()) { - return format("NOT (%s)", toPredicate(client, session, connection, column, complement, accumulator)); + return "NOT (" + toPredicate(client, session, connection, column, complement, accumulator) + ")"; } } @@ -411,7 +406,7 @@ else if (singleValues.size() > 1) { protected String toPredicate(JdbcClient client, ConnectorSession session, JdbcColumnHandle column, JdbcTypeHandle jdbcType, Type type, WriteFunction writeFunction, String operator, Object value, Consumer accumulator) { accumulator.accept(new QueryParameter(jdbcType, type, Optional.of(value))); - return format("%s %s %s", client.quoted(column.getColumnName()), operator, writeFunction.getBindExpression()); + return SPACE_JOINER.join(client.quoted(column.getColumnName()), operator, writeFunction.getBindExpression()); } protected String getGroupBy(JdbcClient client, Optional>> groupingSets)