This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 6c04da18be2 Support save index columns in metadata for postgres 
(#28424)
6c04da18be2 is described below

commit 6c04da18be2b80a4aac1f3ebcecf00dc673fdc27
Author: zhaojinchao <[email protected]>
AuthorDate: Wed Sep 13 09:55:05 2023 +0800

    Support save index columns in metadata for postgres (#28424)
    
    * Support save index columns in metadata for postgres
    
    * Fix unit test
---
 .../metadata/data/loader/PostgreSQLMetaDataLoader.java           | 9 ++++++---
 .../metadata/data/loader/PostgreSQLMetaDataLoaderTest.java       | 9 ++++++---
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git 
a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java
 
b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java
index dc52dcadb8b..6c987b3cf08 100644
--- 
a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java
+++ 
b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java
@@ -67,9 +67,10 @@ public final class PostgreSQLMetaDataLoader implements 
DialectMetaDataLoader {
     
     private static final String BASIC_INDEX_META_DATA_SQL = "SELECT tablename, 
indexname, schemaname FROM pg_indexes WHERE schemaname IN (%s)";
     
-    private static final String ADVANCE_INDEX_META_DATA_SQL = "SELECT 
idx.relname as index_name, insp.nspname as index_schema, tbl.relname as 
table_name, pgi.indisunique as is_unique"
-            + " FROM pg_index pgi JOIN pg_class idx ON idx.oid = 
pgi.indexrelid JOIN pg_namespace insp ON insp.oid = idx.relnamespace JOIN 
pg_class tbl ON tbl.oid = pgi.indrelid"
-            + " JOIN pg_namespace tnsp ON tnsp.oid = tbl.relnamespace WHERE 
tnsp.nspname IN (%s)";
+    private static final String ADVANCE_INDEX_META_DATA_SQL =
+            "SELECT idx.relname as index_name, insp.nspname as index_schema, 
tbl.relname as table_name, att.attname AS column_name, pgi.indisunique as 
is_unique"
+                    + " FROM pg_index pgi JOIN pg_class idx ON idx.oid = 
pgi.indexrelid JOIN pg_namespace insp ON insp.oid = idx.relnamespace JOIN 
pg_class tbl ON tbl.oid = pgi.indrelid"
+                    + " JOIN pg_namespace tnsp ON tnsp.oid = tbl.relnamespace 
JOIN pg_attribute att ON att.attrelid = tbl.oid AND att.attnum = 
ANY(pgi.indkey) WHERE tnsp.nspname IN (%s)";
     
     private static final String LOAD_ALL_ROLE_TABLE_GRANTS_SQL = "SELECT 
table_name FROM information_schema.role_table_grants";
     
@@ -108,6 +109,7 @@ public final class PostgreSQLMetaDataLoader implements 
DialectMetaDataLoader {
             while (resultSet.next()) {
                 String schemaName = resultSet.getString("index_schema");
                 String tableName = resultSet.getString("table_name");
+                String columnName = resultSet.getString("column_name");
                 String indexName = resultSet.getString("index_name");
                 boolean isUnique = resultSet.getBoolean("is_unique");
                 Collection<IndexMetaData> indexMetaDatas = 
result.getOrDefault(schemaName, LinkedHashMultimap.create()).get(tableName);
@@ -117,6 +119,7 @@ public final class PostgreSQLMetaDataLoader implements 
DialectMetaDataLoader {
                 Optional<IndexMetaData> indexMetaData = 
indexMetaDatas.stream().filter(each -> 
each.getName().equals(indexName)).findFirst();
                 if (indexMetaData.isPresent()) {
                     indexMetaData.get().setUnique(isUnique);
+                    indexMetaData.get().getColumns().add(columnName);
                 }
             }
         }
diff --git 
a/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoaderTest.java
 
b/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoaderTest.java
index 297d518022f..3b8d7960f84 100644
--- 
a/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoaderTest.java
+++ 
b/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoaderTest.java
@@ -60,9 +60,10 @@ class PostgreSQLMetaDataLoaderTest {
     
     private static final String BASIC_INDEX_META_DATA_SQL = "SELECT tablename, 
indexname, schemaname FROM pg_indexes WHERE schemaname IN ('public')";
     
-    private static final String ADVANCE_INDEX_META_DATA_SQL = "SELECT 
idx.relname as index_name, insp.nspname as index_schema, tbl.relname as 
table_name, pgi.indisunique as is_unique"
-            + " FROM pg_index pgi JOIN pg_class idx ON idx.oid = 
pgi.indexrelid JOIN pg_namespace insp ON insp.oid = idx.relnamespace JOIN 
pg_class tbl ON tbl.oid = pgi.indrelid"
-            + " JOIN pg_namespace tnsp ON tnsp.oid = tbl.relnamespace WHERE 
tnsp.nspname IN ('public')";
+    private static final String ADVANCE_INDEX_META_DATA_SQL =
+            "SELECT idx.relname as index_name, insp.nspname as index_schema, 
tbl.relname as table_name, att.attname AS column_name, pgi.indisunique as 
is_unique"
+                    + " FROM pg_index pgi JOIN pg_class idx ON idx.oid = 
pgi.indexrelid JOIN pg_namespace insp ON insp.oid = idx.relnamespace JOIN 
pg_class tbl ON tbl.oid = pgi.indrelid"
+                    + " JOIN pg_namespace tnsp ON tnsp.oid = tbl.relnamespace 
JOIN pg_attribute att ON att.attrelid = tbl.oid AND att.attnum = 
ANY(pgi.indkey) WHERE tnsp.nspname IN ('public')";
     
     private static final String BASIC_CONSTRAINT_META_DATA_SQL = "SELECT 
tc.table_schema,tc.table_name,tc.constraint_name,pgo.relname refer_table_name 
FROM information_schema.table_constraints tc "
             + "JOIN pg_constraint pgc ON tc.constraint_name = pgc.conname AND 
contype='f' "
@@ -176,6 +177,7 @@ class PostgreSQLMetaDataLoaderTest {
         ResultSet result = mock(ResultSet.class);
         when(result.next()).thenReturn(true, false);
         when(result.getString("table_name")).thenReturn("tbl");
+        when(result.getString("column_name")).thenReturn("id");
         when(result.getString("index_name")).thenReturn("id");
         when(result.getString("index_schema")).thenReturn("public");
         when(result.getBoolean("is_unique")).thenReturn(true);
@@ -209,6 +211,7 @@ class PostgreSQLMetaDataLoaderTest {
         Iterator<IndexMetaData> indexesIterator = 
actualTableMetaData.getIndexes().iterator();
         IndexMetaData indexMetaData = new IndexMetaData("id");
         indexMetaData.setUnique(true);
+        indexMetaData.getColumns().add("id");
         assertThat(indexesIterator.next(), is(indexMetaData));
         assertThat(actualTableMetaData.getConstraints().size(), is(1));
         Iterator<ConstraintMetaData> constrainsIterator = 
actualTableMetaData.getConstraints().iterator();

Reply via email to