diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java index 3b1ee8815dc6..00941a869b3e 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java @@ -247,7 +247,7 @@ public JdbcTableHandle getTableHandle(ConnectorSession session, PreparedQuery pr { ImmutableList.Builder columns = ImmutableList.builder(); try (Connection connection = connectionFactory.openConnection(session); - PreparedStatement preparedStatement = queryBuilder.prepareStatement(this, session, connection, preparedQuery)) { + PreparedStatement preparedStatement = queryBuilder.prepareStatement(this, session, connection, preparedQuery, Optional.empty())) { ResultSetMetaData metadata = preparedStatement.getMetaData(); if (metadata == null) { throw new UnsupportedOperationException("Query not supported: ResultSetMetaData not available for query: " + preparedQuery.getQuery()); @@ -456,7 +456,7 @@ public PreparedStatement buildSql(ConnectorSession session, Connection connectio throws SQLException { PreparedQuery preparedQuery = prepareQuery(session, connection, table, Optional.empty(), columns, ImmutableMap.of(), Optional.of(split)); - return queryBuilder.prepareStatement(this, session, connection, preparedQuery); + return queryBuilder.prepareStatement(this, session, connection, preparedQuery, Optional.of(columns.size())); } protected PreparedQuery prepareQuery( @@ -1060,7 +1060,7 @@ public Connection getConnection(ConnectorSession session, JdbcOutputTableHandle } @Override - public PreparedStatement getPreparedStatement(Connection connection, String sql) + public PreparedStatement getPreparedStatement(Connection connection, String sql, Optional columnCount) throws SQLException { return connection.prepareStatement(sql); @@ -1292,7 +1292,7 @@ public OptionalLong delete(ConnectorSession session, JdbcTableHandle handle) handle.getRequiredNamedRelation(), handle.getConstraint(), getAdditionalPredicate(handle.getConstraintExpressions(), Optional.empty())); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(this, session, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(this, session, connection, preparedQuery, Optional.empty())) { return OptionalLong.of(preparedStatement.executeUpdate()); } } diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java index 3dc3a6ab087d..e5f316bd659a 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java @@ -380,10 +380,10 @@ public Connection getConnection(ConnectorSession session, JdbcOutputTableHandle } @Override - public PreparedStatement getPreparedStatement(Connection connection, String sql) + public PreparedStatement getPreparedStatement(Connection connection, String sql, Optional columnCount) throws SQLException { - return delegate.getPreparedStatement(connection, sql); + return delegate.getPreparedStatement(connection, sql, columnCount); } @Override 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 c6b382fe886f..d91e1c80ee39 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 @@ -171,12 +171,13 @@ public PreparedStatement prepareStatement( JdbcClient client, ConnectorSession session, Connection connection, - PreparedQuery preparedQuery) + PreparedQuery preparedQuery, + Optional columnCount) throws SQLException { String modifiedQuery = queryModifier.apply(session, preparedQuery.getQuery()); log.debug("Preparing query: %s", modifiedQuery); - PreparedStatement statement = client.getPreparedStatement(connection, modifiedQuery); + PreparedStatement statement = client.getPreparedStatement(connection, modifiedQuery, columnCount); List parameters = preparedQuery.getParameters(); for (int i = 0; i < parameters.size(); i++) { diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java index 531353a15dd4..f15cc5e519dc 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java @@ -240,10 +240,10 @@ public Connection getConnection(ConnectorSession session, JdbcOutputTableHandle } @Override - public PreparedStatement getPreparedStatement(Connection connection, String sql) + public PreparedStatement getPreparedStatement(Connection connection, String sql, Optional columnCount) throws SQLException { - return delegate().getPreparedStatement(connection, sql); + return delegate().getPreparedStatement(connection, sql, columnCount); } @Override diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java index d5e683d8c4bc..699b47fd1891 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java @@ -177,7 +177,7 @@ default void setTableProperties(ConnectorSession session, JdbcTableHandle handle Connection getConnection(ConnectorSession session, JdbcOutputTableHandle handle) throws SQLException; - PreparedStatement getPreparedStatement(Connection connection, String sql) + PreparedStatement getPreparedStatement(Connection connection, String sql, Optional columnCount) throws SQLException; /** diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/QueryBuilder.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/QueryBuilder.java index d934c1d9387e..de98462e26c5 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/QueryBuilder.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/QueryBuilder.java @@ -61,6 +61,7 @@ PreparedStatement prepareStatement( JdbcClient client, ConnectorSession session, Connection connection, - PreparedQuery preparedQuery) + PreparedQuery preparedQuery, + Optional columnCount) throws SQLException; } diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java index 0e26d23bd741..c19b62117427 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java @@ -320,10 +320,10 @@ public Connection getConnection(ConnectorSession session, JdbcOutputTableHandle } @Override - public PreparedStatement getPreparedStatement(Connection connection, String sql) + public PreparedStatement getPreparedStatement(Connection connection, String sql, Optional columnCount) throws SQLException { - return stats.getGetPreparedStatement().wrap(() -> delegate().getPreparedStatement(connection, sql)); + return stats.getGetPreparedStatement().wrap(() -> delegate().getPreparedStatement(connection, sql, columnCount)); } @Override diff --git a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestDefaultJdbcQueryBuilder.java b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestDefaultJdbcQueryBuilder.java index 2302c390ec9c..e339b66ee379 100644 --- a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestDefaultJdbcQueryBuilder.java +++ b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestDefaultJdbcQueryBuilder.java @@ -233,7 +233,7 @@ public void testNormalBuildSql() Connection connection = database.getConnection(); PreparedQuery preparedQuery = queryBuilder.prepareSelectQuery(jdbcClient, SESSION, connection, TEST_TABLE, Optional.empty(), columns, Map.of(), tupleDomain, Optional.empty()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.of(columns.size()))) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT \"col_0\", \"col_1\", \"col_2\", \"col_3\", \"col_4\", \"col_5\", " + "\"col_6\", \"col_7\", \"col_8\", \"col_9\", \"col_10\", \"col_11\" " + @@ -284,7 +284,7 @@ public void testBuildSqlWithDomainComplement() Map.of(), tupleDomain, Optional.empty()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.of(3))) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT \"col_0\", \"col_3\", \"col_9\" " + "FROM \"test_table\" " + @@ -316,7 +316,7 @@ public void testBuildSqlWithFloat() Connection connection = database.getConnection(); PreparedQuery preparedQuery = queryBuilder.prepareSelectQuery(jdbcClient, SESSION, connection, TEST_TABLE, Optional.empty(), columns, Map.of(), tupleDomain, Optional.empty()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.of(columns.size()))) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT \"col_0\", \"col_1\", \"col_2\", \"col_3\", \"col_4\", \"col_5\", " + "\"col_6\", \"col_7\", \"col_8\", \"col_9\", \"col_10\", \"col_11\" " + @@ -350,7 +350,7 @@ public void testBuildSqlWithVarchar() Connection connection = database.getConnection(); PreparedQuery preparedQuery = queryBuilder.prepareSelectQuery(jdbcClient, SESSION, connection, TEST_TABLE, Optional.empty(), columns, Map.of(), tupleDomain, Optional.empty()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.of(columns.size()))) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT \"col_0\", \"col_1\", \"col_2\", \"col_3\", \"col_4\", \"col_5\", " + "\"col_6\", \"col_7\", \"col_8\", \"col_9\", \"col_10\", \"col_11\" " + @@ -386,7 +386,7 @@ public void testBuildSqlWithChar() Connection connection = database.getConnection(); PreparedQuery preparedQuery = queryBuilder.prepareSelectQuery(jdbcClient, SESSION, connection, TEST_TABLE, Optional.empty(), columns, Map.of(), tupleDomain, Optional.empty()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.of(columns.size()))) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT \"col_0\", \"col_1\", \"col_2\", \"col_3\", \"col_4\", \"col_5\", " + "\"col_6\", \"col_7\", \"col_8\", \"col_9\", \"col_10\", \"col_11\" " + @@ -432,7 +432,7 @@ public void testBuildSqlWithDateTime() Connection connection = database.getConnection(); PreparedQuery preparedQuery = queryBuilder.prepareSelectQuery(jdbcClient, SESSION, connection, TEST_TABLE, Optional.empty(), columns, Map.of(), tupleDomain, Optional.empty()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.of(columns.size()))) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT \"col_0\", \"col_1\", \"col_2\", \"col_3\", \"col_4\", \"col_5\", " + "\"col_6\", \"col_7\", \"col_8\", \"col_9\", \"col_10\", \"col_11\" " + @@ -473,7 +473,7 @@ public void testBuildSqlWithTimestamp() Connection connection = database.getConnection(); PreparedQuery preparedQuery = queryBuilder.prepareSelectQuery(jdbcClient, SESSION, connection, TEST_TABLE, Optional.empty(), columns, Map.of(), tupleDomain, Optional.empty()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.of(columns.size()))) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT \"col_0\", \"col_1\", \"col_2\", \"col_3\", \"col_4\", \"col_5\", " + "\"col_6\", \"col_7\", \"col_8\", \"col_9\", \"col_10\", \"col_11\" " + @@ -513,7 +513,7 @@ public void testBuildJoinSql() List.of(new JdbcJoinCondition(columns.get(7), JoinCondition.Operator.EQUAL, columns.get(8))), Map.of(columns.get(2), "name1"), Map.of(columns.get(3), "name2")); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.empty())) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT l.\"col_2\" AS \"name1\", r.\"col_3\" AS \"name2\" FROM " + "(SELECT * FROM \"test_table\") l " + @@ -539,7 +539,7 @@ public void testBuildSqlWithLimit() PreparedQuery preparedQuery = queryBuilder.prepareSelectQuery(jdbcClient, SESSION, connection, TEST_TABLE, Optional.empty(), columns, Map.of(), TupleDomain.all(), Optional.empty()); preparedQuery = preparedQuery.transformQuery(function); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.of(columns.size()))) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT \"col_0\", \"col_1\", \"col_2\", \"col_3\", \"col_4\", \"col_5\", " + "\"col_6\", \"col_7\", \"col_8\", \"col_9\", \"col_10\", \"col_11\" " + @@ -566,7 +566,7 @@ public void testEmptyBuildSql() Connection connection = database.getConnection(); PreparedQuery preparedQuery = queryBuilder.prepareSelectQuery(jdbcClient, SESSION, connection, TEST_TABLE, Optional.empty(), columns, Map.of(), tupleDomain, Optional.empty()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.of(columns.size()))) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT \"col_0\", \"col_1\", \"col_2\", \"col_3\", \"col_4\", \"col_5\", " + "\"col_6\", \"col_7\", \"col_8\", \"col_9\", \"col_10\", \"col_11\" " + @@ -602,7 +602,7 @@ public void testAggregation() Map.of("s", "sum(\"col_0\")"), TupleDomain.all(), Optional.empty()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.empty())) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT \"col_2\", sum(\"col_0\") AS \"s\" " + "FROM \"test_table\" " + @@ -645,7 +645,7 @@ public void testAggregationWithFilter() Map.of("s", "sum(\"col_0\")"), tupleDomain, Optional.empty()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(jdbcClient, SESSION, connection, preparedQuery, Optional.empty())) { assertThat(preparedQuery.getQuery()).isEqualTo("" + "SELECT \"col_2\", sum(\"col_0\") AS \"s\" " + "FROM \"test_table\" " + diff --git a/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClient.java b/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClient.java index 7423209b93b6..3171e130e021 100644 --- a/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClient.java +++ b/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClient.java @@ -294,7 +294,7 @@ public void abortReadConnection(Connection connection, ResultSet resultSet) } @Override - public PreparedStatement getPreparedStatement(Connection connection, String sql) + public PreparedStatement getPreparedStatement(Connection connection, String sql, Optional columnCount) throws SQLException { PreparedStatement statement = connection.prepareStatement(sql); diff --git a/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java b/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java index aa155f66da10..0b36b4111100 100644 --- a/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java +++ b/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java @@ -250,11 +250,15 @@ protected boolean filterSchema(String schemaName) } @Override - public PreparedStatement getPreparedStatement(Connection connection, String sql) + public PreparedStatement getPreparedStatement(Connection connection, String sql, Optional columnCount) throws SQLException { PreparedStatement statement = connection.prepareStatement(sql); - statement.setFetchSize(1000); + // This is a heuristic, not exact science. A better formula can perhaps be found with measurements. + // Column count is not known for non-SELECT queries. Not setting fetch size for these. + if (columnCount.isPresent()) { + statement.setFetchSize(Math.min(100_000 / columnCount.get(), 1_000)); + } return statement; } diff --git a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java index b772a8b47379..4b8b0289240c 100644 --- a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java +++ b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java @@ -302,7 +302,7 @@ public PreparedStatement prepareStatement( columns, ImmutableMap.of(), split); - return queryBuilder.prepareStatement(this, session, connection, preparedQuery); + return queryBuilder.prepareStatement(this, session, connection, preparedQuery, Optional.of(columns.size())); } @Override diff --git a/plugin/trino-postgresql/src/main/java/io/trino/plugin/postgresql/PostgreSqlClient.java b/plugin/trino-postgresql/src/main/java/io/trino/plugin/postgresql/PostgreSqlClient.java index e6c1e2c2e93d..81ee141a07ba 100644 --- a/plugin/trino-postgresql/src/main/java/io/trino/plugin/postgresql/PostgreSqlClient.java +++ b/plugin/trino-postgresql/src/main/java/io/trino/plugin/postgresql/PostgreSqlClient.java @@ -378,13 +378,17 @@ protected void renameTable(ConnectorSession session, Connection connection, Stri } @Override - public PreparedStatement getPreparedStatement(Connection connection, String sql) + public PreparedStatement getPreparedStatement(Connection connection, String sql, Optional columnCount) throws SQLException { // fetch-size is ignored when connection is in auto-commit connection.setAutoCommit(false); PreparedStatement statement = connection.prepareStatement(sql); - statement.setFetchSize(1000); + // This is a heuristic, not exact science. A better formula can perhaps be found with measurements. + // Column count is not known for non-SELECT queries. Not setting fetch size for these. + if (columnCount.isPresent()) { + statement.setFetchSize(Math.min(100_000 / columnCount.get(), 1_000)); + } return statement; } @@ -843,7 +847,7 @@ public OptionalLong delete(ConnectorSession session, JdbcTableHandle handle) handle.getRequiredNamedRelation(), handle.getConstraint(), getAdditionalPredicate(handle.getConstraintExpressions(), Optional.empty())); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(this, session, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(this, session, connection, preparedQuery, Optional.empty())) { int affectedRowsCount = preparedStatement.executeUpdate(); // In getPreparedStatement we set autocommit to false so here we need an explicit commit connection.commit(); diff --git a/plugin/trino-redshift/src/main/java/io/trino/plugin/redshift/RedshiftClient.java b/plugin/trino-redshift/src/main/java/io/trino/plugin/redshift/RedshiftClient.java index 61975c21a47d..516ad683d0dc 100644 --- a/plugin/trino-redshift/src/main/java/io/trino/plugin/redshift/RedshiftClient.java +++ b/plugin/trino-redshift/src/main/java/io/trino/plugin/redshift/RedshiftClient.java @@ -404,7 +404,7 @@ protected void renameTable(ConnectorSession session, Connection connection, Stri } @Override - public PreparedStatement getPreparedStatement(Connection connection, String sql) + public PreparedStatement getPreparedStatement(Connection connection, String sql, Optional columnCount) throws SQLException { // In PostgreSQL, fetch-size is ignored when connection is in auto-commit. Redshift JDBC documentation does not state this requirement @@ -412,7 +412,11 @@ public PreparedStatement getPreparedStatement(Connection connection, String sql) // that. connection.setAutoCommit(false); PreparedStatement statement = connection.prepareStatement(sql); - statement.setFetchSize(1000); + // This is a heuristic, not exact science. A better formula can perhaps be found with measurements. + // Column count is not known for non-SELECT queries. Not setting fetch size for these. + if (columnCount.isPresent()) { + statement.setFetchSize(Math.min(100_000 / columnCount.get(), 1_000)); + } return statement; } @@ -425,7 +429,7 @@ public OptionalLong delete(ConnectorSession session, JdbcTableHandle handle) try (Connection connection = connectionFactory.openConnection(session)) { verify(connection.getAutoCommit()); PreparedQuery preparedQuery = queryBuilder.prepareDeleteQuery(this, session, connection, handle.getRequiredNamedRelation(), handle.getConstraint(), Optional.empty()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(this, session, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(this, session, connection, preparedQuery, Optional.empty())) { int affectedRowsCount = preparedStatement.executeUpdate(); // connection.getAutoCommit() == true is not enough to make DELETE effective and explicit commit is required connection.commit(); diff --git a/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java b/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java index 4d666570add2..e17462a4afac 100644 --- a/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java +++ b/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java @@ -441,7 +441,7 @@ protected Map getCaseSensitivityForColumns(ConnectorSes } PreparedQuery preparedQuery = new PreparedQuery(format("SELECT * FROM %s", quoted(tableHandle.asPlainTable().getRemoteTableName())), ImmutableList.of()); - try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(this, session, connection, preparedQuery)) { + try (PreparedStatement preparedStatement = queryBuilder.prepareStatement(this, session, connection, preparedQuery, Optional.empty())) { ResultSetMetaData metadata = preparedStatement.getMetaData(); ImmutableMap.Builder columns = ImmutableMap.builder(); for (int column = 1; column <= metadata.getColumnCount(); column++) {