diff --git a/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteClient.java b/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteClient.java index ba28654ac057..86ed1ee3ef8e 100644 --- a/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteClient.java +++ b/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteClient.java @@ -483,22 +483,20 @@ public Map getTableProperties(Connection connection, JdbcTableHa { ImmutableMap.Builder properties = ImmutableMap.builder(); SchemaTableName schemaTableName = tableHandle.asPlainTable().getSchemaTableName(); + String schemaName = requireNonNull(schemaTableName.getSchemaName(), "Ignite schema name can not be null").toUpperCase(ENGLISH); String tableName = requireNonNull(schemaTableName.getTableName(), "Ignite table name can not be null").toUpperCase(ENGLISH); - String sql = "SELECT idx.CACHE_ID, " + - "(SELECT COLUMNS FROM sys.indexes WHERE SCHEMA_NAME = 'PUBLIC' AND TABLE_NAME = ? AND INDEX_NAME = '_key_PK') AS PKS," + - "(SELECT COLUMNS FROM sys.indexes WHERE SCHEMA_NAME = 'PUBLIC' AND TABLE_NAME = ? AND INDEX_NAME = 'AFFINITY_KEY') AS AFK FROM sys.indexes as idx " + - "JOIN sys.caches che ON idx.CACHE_ID = che.CACHE_ID WHERE idx.SCHEMA_NAME = 'PUBLIC' AND idx.TABLE_NAME = ? LIMIT 1"; + // Get primary keys from 'sys.indexes' because DatabaseMetaData.getPrimaryKeys doesn't work well while table being concurrent modified + String sql = "SELECT COLUMNS FROM sys.indexes WHERE SCHEMA_NAME = ? AND TABLE_NAME = ? AND INDEX_NAME = '_key_PK' LIMIT 1"; try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) { - preparedStatement.setString(1, tableName); + preparedStatement.setString(1, schemaName); preparedStatement.setString(2, tableName); - preparedStatement.setString(3, tableName); try (ResultSet resultSet = preparedStatement.executeQuery()) { if (!resultSet.next()) { return ImmutableMap.of(); } - List primaryKeys = extractColumnNamesFromOrderingScheme(resultSet.getString("PKS")); + List primaryKeys = extractColumnNamesFromOrderingScheme(resultSet.getString("COLUMNS")); checkArgument(!primaryKeys.isEmpty(), "Ignite table should has at least one primary key"); properties.put(PRIMARY_KEY_PROPERTY, primaryKeys); }