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));
+ }
+ }
}