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.
*