From 29b553bf5f333f97412d03bb933d314d846062ec Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Tue, 13 Oct 2026 23:19:21 -0700 Subject: [PATCH] Fixes reading tables from system.tables - more safe way. --- .github/workflows/test_head.yml | 5 ++++- .../jdbc/metadata/DatabaseMetaDataImpl.java | 11 +++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test_head.yml b/.github/workflows/test_head.yml index a7012ec2c..cc5cb2ca3 100644 --- a/.github/workflows/test_head.yml +++ b/.github/workflows/test_head.yml @@ -37,11 +37,14 @@ jobs: java-version: '17' distribution: 'temurin' architecture: x64 + - name: Build + run: | + mvn --also-make --batch-mode --no-transfer-progress --projects ${{ matrix.project }} -Dmaven.javadoc.skip=true -DskipTests=true clean install - name: Test Java client env: TEST_CLICKHOUSE_IMAGE_VERSION: ${{ env.CH_VERSION }} run: | - mvn --also-make --batch-mode --no-transfer-progress --projects ${{ matrix.project }} -Dmaven.javadoc.skip=true clean install + mvn --batch-mode --no-transfer-progress --projects ${{ matrix.project }} -Dmaven.javadoc.skip=true clean install - name: Upload test results uses: actions/upload-artifact@v4 if: failure() diff --git a/jdbc-v2/src/main/java/com/clickhouse/jdbc/metadata/DatabaseMetaDataImpl.java b/jdbc-v2/src/main/java/com/clickhouse/jdbc/metadata/DatabaseMetaDataImpl.java index 079c8a074..268f892b0 100644 --- a/jdbc-v2/src/main/java/com/clickhouse/jdbc/metadata/DatabaseMetaDataImpl.java +++ b/jdbc-v2/src/main/java/com/clickhouse/jdbc/metadata/DatabaseMetaDataImpl.java @@ -1033,10 +1033,14 @@ private ResultSet getTablesImpl(String schemaPattern, String tableNamePattern, S filterConditions.add("(t.is_temporary = 1)"); } - String engineFilter = filterConditions.isEmpty() ? "" : " AND ( " + String.join(" OR ", filterConditions) + ")"; + List tableConditions = new ArrayList<>(); + tableConditions.add("t.name LIKE ?"); + if (!filterConditions.isEmpty()) { + tableConditions.add("(" + String.join(" OR ", filterConditions) + ")"); + } // Exclude temporary tables when not requested (they would otherwise match engine-based conditions) if (!requestedTypes.contains(TableType.TEMPORARY_TABLE.getTypeName())) { - engineFilter += " AND (t.is_temporary = 0)"; + tableConditions.add("t.is_temporary = 0"); } String sql = "SELECT " + @@ -1053,8 +1057,7 @@ private ResultSet getTablesImpl(String schemaPattern, String tableNamePattern, S " FROM system.tables t" + " JOIN system.databases d ON system.tables.database = system.databases.name" + " WHERE t.database LIKE ?" + - " AND t.name LIKE ?" - + engineFilter; + " AND (" + String.join(" AND ", tableConditions) + ")"; try (PreparedStatement stmt = prepareStatement(sql)) { stmt.setString(1, (schemaPattern == null ? "%" : schemaPattern));