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

panjuan 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 f92c8408d85 Implements openGauss password related functions by calcite 
(#19393)
f92c8408d85 is described below

commit f92c8408d859347664498b1b7a75c7b6df8b0499
Author: 吴伟杰 <[email protected]>
AuthorDate: Wed Jul 20 19:42:20 2022 +0800

    Implements openGauss password related functions by calcite (#19393)
    
    * Implements openGauss password related functions by calcite
    
    * Complete OpenGaussSystemCatalogAdminQueryExecutorTest
    
    * Add final modifier to parameter
---
 .../opengauss/OpenGaussAdminExecutorCreator.java   | 12 +++++++-
 .../OpenGaussSystemCatalogAdminQueryExecutor.java  | 35 +++++++++++++++++++++-
 ...enGaussSystemCatalogAdminQueryExecutorTest.java | 34 +++++++++++++++++++++
 3 files changed, 79 insertions(+), 2 deletions(-)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussAdminExecutorCreator.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussAdminExecutorCreator.java
index 2afe36b65c0..37f50dbcce5 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussAdminExecutorCreator.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussAdminExecutorCreator.java
@@ -27,12 +27,22 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectState
 
 import java.util.Collection;
 import java.util.Optional;
+import java.util.Set;
+import java.util.TreeSet;
 
 /**
  * Database admin executor creator for openGauss.
  */
 public final class OpenGaussAdminExecutorCreator implements 
DatabaseAdminExecutorCreator {
     
+    private static final Set<String> SYSTEM_CATALOG_QUERY_EXPRESSIONS = new 
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
+    
+    static {
+        SYSTEM_CATALOG_QUERY_EXPRESSIONS.add("VERSION()");
+        
SYSTEM_CATALOG_QUERY_EXPRESSIONS.add("intervaltonum(gs_password_deadline())");
+        SYSTEM_CATALOG_QUERY_EXPRESSIONS.add("gs_password_notifytime()");
+    }
+    
     private static final String OG_DATABASE = "pg_database";
     
     private final PostgreSQLAdminExecutorCreator delegated = new 
PostgreSQLAdminExecutorCreator();
@@ -60,7 +70,7 @@ public final class OpenGaussAdminExecutorCreator implements 
DatabaseAdminExecuto
         SelectStatement selectStatement = (SelectStatement) 
sqlStatementContext.getSqlStatement();
         Collection<ProjectionSegment> projections = 
selectStatement.getProjections().getProjections();
         return 1 == projections.size() && projections.iterator().next() 
instanceof ExpressionProjectionSegment
-                && "VERSION()".equalsIgnoreCase(((ExpressionProjectionSegment) 
projections.iterator().next()).getText());
+                && 
SYSTEM_CATALOG_QUERY_EXPRESSIONS.contains(((ExpressionProjectionSegment) 
projections.iterator().next()).getText());
     }
     
     @Override
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSystemCatalogAdminQueryExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSystemCatalogAdminQueryExecutor.java
index 990cdce90bc..2595d435092 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSystemCatalogAdminQueryExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSystemCatalogAdminQueryExecutor.java
@@ -44,6 +44,7 @@ import java.util.Collections;
 /**
  * Select database executor for openGauss.
  */
+@SuppressWarnings("unused")
 public final class OpenGaussSystemCatalogAdminQueryExecutor implements 
DatabaseAdminQueryExecutor {
     
     private static final String PG_CATALOG = "pg_catalog";
@@ -67,6 +68,9 @@ public final class OpenGaussSystemCatalogAdminQueryExecutor 
implements DatabaseA
         try (CalciteConnection connection = 
DriverManager.getConnection("jdbc:calcite:caseSensitive=false").unwrap(CalciteConnection.class))
 {
             connection.getRootSchema().add(PG_CATALOG, new 
ReflectiveSchema(constructOgCatalog()));
             connection.getRootSchema().add("version", 
ScalarFunctionImpl.create(getClass(), "version"));
+            connection.getRootSchema().add("gs_password_deadline", 
ScalarFunctionImpl.create(getClass(), "gsPasswordDeadline"));
+            connection.getRootSchema().add("intervaltonum", 
ScalarFunctionImpl.create(getClass(), "intervalToNum"));
+            connection.getRootSchema().add("gs_password_notifyTime", 
ScalarFunctionImpl.create(getClass(), "gsPasswordNotifyTime"));
             connection.setSchema(PG_CATALOG);
             try (Statement statement = connection.createStatement(); ResultSet 
resultSet = statement.executeQuery(sql)) {
                 queryResultMetaData = new 
JDBCQueryResultMetaData(resultSet.getMetaData());
@@ -90,8 +94,37 @@ public final class OpenGaussSystemCatalogAdminQueryExecutor 
implements DatabaseA
      *
      * @return version message
      */
-    @SuppressWarnings("unused")
     public static String version() {
         return "ShardingSphere-Proxy " + ShardingSphereVersion.VERSION + ("-" 
+ ShardingSphereVersion.BUILD_GIT_COMMIT_ID_ABBREV) + 
(ShardingSphereVersion.BUILD_GIT_DIRTY ? "-dirty" : "");
     }
+    
+    /**
+     * The type interval is not supported in standard JDBC.
+     * Indicates the number of remaining days before the password of the 
current user expires.
+     *
+     * @return 90 days
+     */
+    public static int gsPasswordDeadline() {
+        return 90;
+    }
+    
+    /**
+     * The type interval is not supported in standard JDBC.
+     * Convert interval to num.
+     *
+     * @param result result
+     * @return result
+     */
+    public static int intervalToNum(final int result) {
+        return result;
+    }
+    
+    /**
+     * Specifies the number of days prior to password expiration that a user 
will receive a reminder.
+     *
+     * @return 7 days
+     */
+    public static int gsPasswordNotifyTime() {
+        return 7;
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSystemCatalogAdminQueryExecutorTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSystemCatalogAdminQueryExecutorTest.java
index 54770bbb16d..4c16a66488c 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSystemCatalogAdminQueryExecutorTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSystemCatalogAdminQueryExecutorTest.java
@@ -76,4 +76,38 @@ public final class 
OpenGaussSystemCatalogAdminQueryExecutorTest {
             assertThat((String) actualResult.getValue(1, String.class), 
containsString("ShardingSphere-Proxy"));
         }
     }
+    
+    @Test
+    public void assertExecuteSelectGsPasswordDeadlineAndIntervalToNum() throws 
SQLException {
+        try (MockedStatic<ProxyContext> mockedStatic = 
mockStatic(ProxyContext.class)) {
+            
mockedStatic.when(ProxyContext::getInstance).thenReturn(mock(ProxyContext.class,
 RETURNS_DEEP_STUBS));
+            OpenGaussSystemCatalogAdminQueryExecutor executor = new 
OpenGaussSystemCatalogAdminQueryExecutor("select 
intervaltonum(gs_password_deadline())");
+            ConnectionSession connectionSession = 
mock(ConnectionSession.class);
+            when(connectionSession.getDatabaseType()).thenReturn(new 
OpenGaussDatabaseType());
+            executor.execute(connectionSession);
+            QueryResultMetaData actualMetaData = 
executor.getQueryResultMetaData();
+            assertThat(actualMetaData.getColumnCount(), is(1));
+            assertThat(actualMetaData.getColumnType(1), is(Types.INTEGER));
+            MergedResult actualResult = executor.getMergedResult();
+            assertTrue(actualResult.next());
+            assertThat(actualResult.getValue(1, Integer.class), is(90));
+        }
+    }
+    
+    @Test
+    public void assertExecuteSelectGsPasswordNotifyTime() throws SQLException {
+        try (MockedStatic<ProxyContext> mockedStatic = 
mockStatic(ProxyContext.class)) {
+            
mockedStatic.when(ProxyContext::getInstance).thenReturn(mock(ProxyContext.class,
 RETURNS_DEEP_STUBS));
+            OpenGaussSystemCatalogAdminQueryExecutor executor = new 
OpenGaussSystemCatalogAdminQueryExecutor("select gs_password_notifytime()");
+            ConnectionSession connectionSession = 
mock(ConnectionSession.class);
+            when(connectionSession.getDatabaseType()).thenReturn(new 
OpenGaussDatabaseType());
+            executor.execute(connectionSession);
+            QueryResultMetaData actualMetaData = 
executor.getQueryResultMetaData();
+            assertThat(actualMetaData.getColumnCount(), is(1));
+            assertThat(actualMetaData.getColumnType(1), is(Types.INTEGER));
+            MergedResult actualResult = executor.getMergedResult();
+            assertTrue(actualResult.next());
+            assertThat(actualResult.getValue(1, Integer.class), is(7));
+        }
+    }
 }

Reply via email to