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

jianglongtao 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 742b65b  Support pgAdmin. (#13692)
742b65b is described below

commit 742b65ba4c9517815d787111ff51db7df772c9f0
Author: lanchengx <[email protected]>
AuthorDate: Fri Nov 19 02:56:53 2021 -0600

    Support pgAdmin. (#13692)
    
    * Support pgAdmin.
    
    * Rename method.
    
    * Support to get the table Name of the subquery.
---
 .../postgresql/PostgreSQLAdminExecutorFactory.java | 26 +++++++++++++++++++---
 .../executor/SelectDatabaseExecutor.java           | 22 +++++++++++++++++-
 .../postgresql/executor/SelectTableExecutor.java   |  6 ++++-
 .../src/main/antlr4/imports/postgresql/BaseRule.g4 |  1 +
 4 files changed, 50 insertions(+), 5 deletions(-)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
index 7ad3603..7768bef 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
@@ -24,11 +24,14 @@ import 
org.apache.shardingsphere.proxy.backend.text.admin.postgresql.executor.Se
 import 
org.apache.shardingsphere.proxy.backend.text.admin.postgresql.executor.SelectTableExecutor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.extractor.TableExtractor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
@@ -41,7 +44,13 @@ public final class PostgreSQLAdminExecutorFactory implements 
DatabaseAdminExecut
     
     private static final String PG_DATABASE = "pg_database";
     
-    private static final String PG_NAMESPACE = "pg_namespace";
+    private static final String PG_TRIGGER = "pg_trigger";
+    
+    private static final String PG_INHERITS = "pg_inherits";
+    
+    private static final String PG_CLASS = "pg_class";
+    
+    private static final String PG_PREFIX = "pg_";
     
     @Override
     public Optional<DatabaseAdminExecutor> newInstance(final SQLStatement 
sqlStatement) {
@@ -55,19 +64,30 @@ public final class PostgreSQLAdminExecutorFactory 
implements DatabaseAdminExecut
             if (selectedTableNames.contains(PG_DATABASE)) {
                 return Optional.of(new 
SelectDatabaseExecutor((SelectStatement) sqlStatement, sql));
             }
-            if (selectedTableNames.contains(PG_TABLESPACE)) {
+            if (isQueryPgTable(selectedTableNames)) {
                 return Optional.of(new SelectTableExecutor(sql));
             }
-            if (selectedTableNames.contains(PG_NAMESPACE)) {
+            if (selectedTableNames.stream().anyMatch(each -> 
each.startsWith(PG_PREFIX))) {
                 return Optional.of(new DefaultDatabaseMetadataExecutor(sql));
             }
         }
         return Optional.empty();
     }
     
+    private boolean isQueryPgTable(final Collection<String> 
selectedTableNames) {
+        boolean isComplexQueryTable = selectedTableNames.contains(PG_CLASS) && 
selectedTableNames.contains(PG_TRIGGER) && 
selectedTableNames.contains(PG_INHERITS);
+        return selectedTableNames.contains(PG_TABLESPACE) || 
isComplexQueryTable;
+    }
+    
     private Collection<String> getSelectedTableNames(final SelectStatement 
sqlStatement) {
         TableExtractor extractor = new TableExtractor();
         extractor.extractTablesFromSelect(sqlStatement);
+        List<TableSegment> subQueryTableSegment = 
extractor.getTableContext().stream().filter(each -> each instanceof 
SubqueryTableSegment).map(each -> {
+            TableExtractor subExtractor = new TableExtractor();
+            subExtractor.extractTablesFromSelect(((SubqueryTableSegment) 
each).getSubquery().getSelect());
+            return subExtractor.getTableContext();
+        }).flatMap(Collection::stream).collect(Collectors.toList());
+        extractor.getTableContext().addAll(subQueryTableSegment);
         return extractor.getTableContext().stream().filter(each -> each 
instanceof SimpleTableSegment)
                 .map(each -> ((SimpleTableSegment) 
each).getTableName().getIdentifier().getValue()).collect(Collectors.toCollection(LinkedList::new));
     }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutor.java
index eaea1ee..eeff69f 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutor.java
@@ -41,12 +41,18 @@ public final class SelectDatabaseExecutor extends 
DefaultDatabaseMetadataExecuto
     
     private static final String DATABASE_NAME = "databasename";
     
+    private static final String DATNAME = "datname";
+    
+    private static final String NAME = "name";
+    
     private final Set<String> columnNames = new LinkedHashSet<>();
     
     private final SelectStatement sqlStatement;
     
     private String databaseNameAlias = DATABASE_NAME;
     
+    private boolean isQueryDatabase;
+    
     public SelectDatabaseExecutor(final SelectStatement sqlStatement, final 
String sql) {
         super(sql);
         this.sqlStatement = sqlStatement;
@@ -54,11 +60,24 @@ public final class SelectDatabaseExecutor extends 
DefaultDatabaseMetadataExecuto
     
     @Override
     protected void createPreProcessing() {
+        removeDuplicatedRow();
+        addDefaultRow();
+    }
+    
+    private void addDefaultRow() {
         LinkedList<String> schemaWithoutDataSource = 
ProxyContext.getInstance().getAllSchemaNames().stream()
                 .filter(each -> 
!hasDatasource(each)).collect(Collectors.toCollection(LinkedList::new));
         schemaWithoutDataSource.forEach(each -> 
getRows().addLast(getDefaultRowData(each)));
     }
     
+    private void removeDuplicatedRow() {
+        if (isQueryDatabase) {
+            List<Map<String, Object>> toBeRemovedRow = 
getRows().stream().collect(Collectors.groupingBy(each -> 
each.get(databaseNameAlias), Collectors.toCollection(LinkedList::new)))
+                    .values().stream().filter(each -> each.size() > 
1).map(LinkedList::getLast).collect(Collectors.toList());
+            toBeRemovedRow.forEach(each -> getRows().remove(each));
+        }
+    }
+    
     @Override
     protected List<String> getSchemaNames() {
         Collection<String> schemaNames = 
ProxyContext.getInstance().getAllSchemaNames();
@@ -70,8 +89,9 @@ public final class SelectDatabaseExecutor extends 
DefaultDatabaseMetadataExecuto
         buildColumnNames(aliasMap);
         ShardingSphereResource resource = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(schemaName).getResource();
         Set<String> catalogs = 
resource.getDataSources().keySet().stream().map(each -> 
resource.getDataSourcesMetaData().getDataSourceMetaData(each).getCatalog()).collect(Collectors.toSet());
-        databaseNameAlias = aliasMap.getOrDefault(DATABASE_NAME, "");
+        databaseNameAlias = aliasMap.getOrDefault(DATABASE_NAME, 
aliasMap.getOrDefault(DATNAME, aliasMap.getOrDefault(NAME, "")));
         String rowValue = rowMap.getOrDefault(databaseNameAlias, 
"").toString();
+        isQueryDatabase = !rowValue.isEmpty();
         if (catalogs.contains(rowValue)) {
             rowMap.replace(databaseNameAlias, schemaName);
         } else {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectTableExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectTableExecutor.java
index 366774d..d28914b 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectTableExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectTableExecutor.java
@@ -35,8 +35,12 @@ public final class SelectTableExecutor extends 
DefaultDatabaseMetadataExecutor {
     
     private static final String REL_NAME = "relname";
     
+    private static final String REF_NAME = "refname";
+    
     private static final String TABLE_NAME = "tablename";
     
+    private static final String NAME = "name";
+    
     private String actualTableName = "";
     
     private List<String> tableNames;
@@ -59,7 +63,7 @@ public final class SelectTableExecutor extends 
DefaultDatabaseMetadataExecutor {
     @Override
     protected void rowPostProcessing(final String schemaName, final 
Map<String, Object> rowMap, final Map<String, String> aliasMap) {
         if (actualTableName.isEmpty()) {
-            actualTableName = aliasMap.getOrDefault(REL_NAME, 
aliasMap.getOrDefault(TABLE_NAME, ""));
+            actualTableName = aliasMap.getOrDefault(REL_NAME, 
aliasMap.getOrDefault(TABLE_NAME, aliasMap.getOrDefault(NAME, 
aliasMap.getOrDefault(REF_NAME, ""))));
         }
     }
     
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
index 8e09e61..7afb2d9 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
@@ -421,6 +421,7 @@ unreservedWord
     | ZONE
     | JSON
     | PARAM
+    | TABLE
     ;
 
 typeFuncNameKeyword

Reply via email to