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 88a56793d65 Support registry user defined function and add operator 
for federation. (#22182)
88a56793d65 is described below

commit 88a56793d652e139123e71f80bea77edb6ee74f3
Author: Chuxin Chen <[email protected]>
AuthorDate: Tue Nov 15 17:57:12 2022 +0800

    Support registry user defined function and add operator for federation. 
(#22182)
---
 .../impl/BinaryOperationExpressionConverter.java   |  5 ++++
 .../optimizer/util/SQLFederationPlannerUtil.java   | 33 ++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
index ff9dd8f1aab..cc3a511df25 100644
--- 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
@@ -61,6 +61,7 @@ public final class BinaryOperationExpressionConverter 
implements SQLSegmentConve
         register(SqlStdOperatorTable.MULTIPLY);
         register(SqlStdOperatorTable.DIVIDE);
         register(SqlStdOperatorTable.LIKE);
+        register(SqlStdOperatorTable.NOT_LIKE);
     }
     
     private static void register(final SqlOperator sqlOperator) {
@@ -69,6 +70,10 @@ public final class BinaryOperationExpressionConverter 
implements SQLSegmentConve
     
     private static void registerAlias() {
         REGISTRY.put("!=", SqlStdOperatorTable.NOT_EQUALS);
+        REGISTRY.put("~", SqlStdOperatorTable.POSIX_REGEX_CASE_SENSITIVE);
+        REGISTRY.put("~*", 
SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_SENSITIVE);
+        REGISTRY.put("!~", 
SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_SENSITIVE);
+        REGISTRY.put("!~*", 
SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_INSENSITIVE);
     }
     
     @Override
diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationPlannerUtil.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationPlannerUtil.java
index 72f3c31ce1e..4d6b0eeffff 100644
--- 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationPlannerUtil.java
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationPlannerUtil.java
@@ -39,6 +39,8 @@ import org.apache.calcite.rel.rules.ProjectRemoveRule;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.schema.Schema;
+import org.apache.calcite.schema.SchemaPlus;
+import org.apache.calcite.schema.impl.ScalarFunctionImpl;
 import org.apache.calcite.sql.SqlOperatorTable;
 import org.apache.calcite.sql.fun.SqlLibrary;
 import org.apache.calcite.sql.fun.SqlLibraryOperatorTableFactory;
@@ -181,9 +183,40 @@ public final class SQLFederationPlannerUtil {
     public static CalciteCatalogReader createCatalogReader(final String 
schemaName, final Schema schema, final RelDataTypeFactory relDataTypeFactory, 
final CalciteConnectionConfig connectionConfig) {
         CalciteSchema rootSchema = CalciteSchema.createRootSchema(true);
         rootSchema.add(schemaName, schema);
+        registryUserDefinedFunction(schemaName, rootSchema.plus());
         return new CalciteCatalogReader(rootSchema, 
Collections.singletonList(schemaName), relDataTypeFactory, connectionConfig);
     }
     
+    private static void registryUserDefinedFunction(final String schemaName, 
final SchemaPlus schemaPlus) {
+        if (!"pg_catalog".equalsIgnoreCase(schemaName)) {
+            return;
+        }
+        schemaPlus.add("pg_catalog.pg_table_is_visible", 
ScalarFunctionImpl.create(SQLFederationPlannerUtil.class, "pgTableIsVisible"));
+        schemaPlus.add("pg_catalog.pg_get_userbyid", 
ScalarFunctionImpl.create(SQLFederationPlannerUtil.class, "pgGetUserById"));
+    }
+    
+    /**
+     * Mock pg_table_is_visible function.
+     *
+     * @param oid oid
+     * @return true
+     */
+    @SuppressWarnings("unused")
+    public static boolean pgTableIsVisible(final Long oid) {
+        return true;
+    }
+    
+    /**
+     * Mock pg_get_userbyid function.
+     * 
+     * @param oid oid
+     * @return user name
+     */
+    @SuppressWarnings("unused")
+    public static String pgGetUserById(final Long oid) {
+        return "mock user";
+    }
+    
     /**
      * Create sql validator.
      *

Reply via email to