You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/11/15 09:57:18 UTC

[shardingsphere] branch master updated: Support registry user defined function and add operator for federation. (#22182)

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 <ch...@qq.com>
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.
      *