From 8b61709ec86171a49a5ce52b03b26d5c0295adda Mon Sep 17 00:00:00 2001 From: xueweizhang Date: Thu, 6 Apr 2023 12:06:10 +0800 Subject: [PATCH] [feature](multi-catalog) support select current_catalog(); (#18163) --- fe/fe-core/src/main/cup/sql_parser.cup | 5 ++ .../doris/analysis/InformationFunction.java | 3 ++ .../doris/catalog/BuiltinScalarFunctions.java | 2 + .../rewrite/rules/FoldConstantRuleOnFE.java | 7 +++ .../functions/scalar/CurrentCatalog.java | 54 +++++++++++++++++++ .../visitor/ScalarFunctionVisitor.java | 5 ++ fe/fe-core/src/main/jflex/sql_scanner.flex | 1 + .../test_mysql_jdbc_catalog.out | 9 ++++ .../test_mysql_jdbc_catalog.groovy | 4 ++ .../query_p0/system/test_query_sys.groovy | 1 + 10 files changed, 91 insertions(+) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentCatalog.java diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index d4db65f59b..bcd012b968 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -309,6 +309,7 @@ terminal String KW_CROSS, KW_CUBE, KW_CURRENT, + KW_CURRENT_CATALOG, KW_CURRENT_TIMESTAMP, KW_CURRENT_USER, KW_DATA, @@ -6271,6 +6272,8 @@ non_pred_expr ::= {: RESULT = new InformationFunction("USER"); :} | KW_CURRENT_USER LPAREN RPAREN {: RESULT = new InformationFunction("CURRENT_USER"); :} + | KW_CURRENT_CATALOG LPAREN RPAREN + {: RESULT = new InformationFunction("CURRENT_CATALOG"); :} | KW_CONNECTION_ID LPAREN RPAREN {: RESULT = new InformationFunction("CONNECTION_ID"); :} | KW_PASSWORD LPAREN STRING_LITERAL:text RPAREN @@ -7311,6 +7314,8 @@ keyword ::= {: RESULT = id; :} | KW_HISTOGRAM:id {: RESULT = id; :} + | KW_CURRENT_CATALOG:id + {: RESULT = id; :} ; // Identifier that contain keyword diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java index 6ae4588f5f..fba837ee66 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java @@ -74,6 +74,9 @@ public class InformationFunction extends Expr { type = Type.BIGINT; intValue = analyzer.getConnectId(); strValue = ""; + } else if (funcType.equalsIgnoreCase("CURRENT_CATALOG")) { + type = Type.VARCHAR; + strValue = ConnectContext.get().getDefaultCatalog(); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java index e952be58a1..7f12aabe1f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java @@ -90,6 +90,7 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.ConvertTo; import org.apache.doris.nereids.trees.expressions.functions.scalar.ConvertTz; import org.apache.doris.nereids.trees.expressions.functions.scalar.Cos; import org.apache.doris.nereids.trees.expressions.functions.scalar.CountEqual; +import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentCatalog; import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentDate; import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentTime; import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentUser; @@ -417,6 +418,7 @@ public class BuiltinScalarFunctions implements FunctionHelper { scalar(ConvertTz.class, "convert_tz"), scalar(Cos.class, "cos"), scalar(CountEqual.class, "countequal"), + scalar(CurrentCatalog.class, "current_catalog"), scalar(CurrentDate.class, "curdate", "current_date"), scalar(CurrentTime.class, "curtime", "current_time"), scalar(CurrentUser.class, "current_user"), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnFE.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnFE.java index 370a5ce864..0bcdc86f7d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnFE.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnFE.java @@ -47,6 +47,7 @@ import org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunctio import org.apache.doris.nereids.trees.expressions.functions.agg.NullableAggregateFunction; import org.apache.doris.nereids.trees.expressions.functions.scalar.Array; import org.apache.doris.nereids.trees.expressions.functions.scalar.ConnectionId; +import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentCatalog; import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentUser; import org.apache.doris.nereids.trees.expressions.functions.scalar.Database; import org.apache.doris.nereids.trees.expressions.functions.scalar.Date; @@ -192,6 +193,12 @@ public class FoldConstantRuleOnFE extends AbstractExpressionRewriteRule { return new VarcharLiteral(res); } + @Override + public Expression visitCurrentCatalog(CurrentCatalog currentCatalog, ExpressionRewriteContext context) { + String res = context.connectContext.get().getDefaultCatalog(); + return new VarcharLiteral(res); + } + @Override public Expression visitUser(User user, ExpressionRewriteContext context) { String res = context.connectContext.get().getUserIdentity().toString(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentCatalog.java new file mode 100644 index 0000000000..2614346852 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentCatalog.java @@ -0,0 +1,54 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.nereids.trees.expressions.functions.scalar; + +import org.apache.doris.catalog.FunctionSignature; +import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable; +import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.shape.LeafExpression; +import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.VarcharType; + +import com.google.common.collect.ImmutableList; + +import java.util.List; + +/** + * ScalarFunction 'CurrentCatalog'. + */ +public class CurrentCatalog extends ScalarFunction + implements LeafExpression, ExplicitlyCastableSignature, AlwaysNotNullable { + + public static final List SIGNATURES = ImmutableList.of( + FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args() + ); + + public CurrentCatalog() { + super("current_catalog", ImmutableList.of()); + } + + @Override + public List getSignatures() { + return SIGNATURES; + } + + @Override + public R accept(ExpressionVisitor visitor, C context) { + return visitor.visitCurrentCatalog(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java index e4ed308994..caa2738dd3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java @@ -93,6 +93,7 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.ConvertTo; import org.apache.doris.nereids.trees.expressions.functions.scalar.ConvertTz; import org.apache.doris.nereids.trees.expressions.functions.scalar.Cos; import org.apache.doris.nereids.trees.expressions.functions.scalar.CountEqual; +import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentCatalog; import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentDate; import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentTime; import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentUser; @@ -647,6 +648,10 @@ public interface ScalarFunctionVisitor { return visitScalarFunction(currentUser, context); } + default R visitCurrentCatalog(CurrentCatalog currentCatalog, C context) { + return visitScalarFunction(currentCatalog, context); + } + default R visitUser(User user, C context) { return visitScalarFunction(user, context); } diff --git a/fe/fe-core/src/main/jflex/sql_scanner.flex b/fe/fe-core/src/main/jflex/sql_scanner.flex index 1afb791773..1ab037e4af 100644 --- a/fe/fe-core/src/main/jflex/sql_scanner.flex +++ b/fe/fe-core/src/main/jflex/sql_scanner.flex @@ -162,6 +162,7 @@ import org.apache.doris.qe.SqlModeHelper; keywordMap.put("cross", new Integer(SqlParserSymbols.KW_CROSS)); keywordMap.put("cube", new Integer(SqlParserSymbols.KW_CUBE)); keywordMap.put("current", new Integer(SqlParserSymbols.KW_CURRENT)); + keywordMap.put("current_catalog", new Integer(SqlParserSymbols.KW_CURRENT_CATALOG)); keywordMap.put("current_timestamp", new Integer(SqlParserSymbols.KW_CURRENT_TIMESTAMP)); keywordMap.put("current_user", new Integer(SqlParserSymbols.KW_CURRENT_USER)); keywordMap.put("data", new Integer(SqlParserSymbols.KW_DATA)); diff --git a/regression-test/data/jdbc_catalog_p0/test_mysql_jdbc_catalog.out b/regression-test/data/jdbc_catalog_p0/test_mysql_jdbc_catalog.out index f7a959eead..b372579976 100644 --- a/regression-test/data/jdbc_catalog_p0/test_mysql_jdbc_catalog.out +++ b/regression-test/data/jdbc_catalog_p0/test_mysql_jdbc_catalog.out @@ -1,4 +1,13 @@ -- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +internal + +-- !sql -- +internal + +-- !sql -- +mysql_jdbc_catalog + -- !ex_tb0 -- 111 abc 112 abd diff --git a/regression-test/suites/jdbc_catalog_p0/test_mysql_jdbc_catalog.groovy b/regression-test/suites/jdbc_catalog_p0/test_mysql_jdbc_catalog.groovy index c588c182b2..92785baf80 100644 --- a/regression-test/suites/jdbc_catalog_p0/test_mysql_jdbc_catalog.groovy +++ b/regression-test/suites/jdbc_catalog_p0/test_mysql_jdbc_catalog.groovy @@ -16,6 +16,8 @@ // under the License. suite("test_mysql_jdbc_catalog", "p0") { + qt_sql """select current_catalog()""" + String enabled = context.config.otherConfigs.get("enableJdbcTest") if (enabled != null && enabled.equalsIgnoreCase("true")) { String resource_name = "jdbc_resource_catalog_mysql" @@ -73,7 +75,9 @@ suite("test_mysql_jdbc_catalog", "p0") { PROPERTIES("replication_num" = "1"); """ + qt_sql """select current_catalog()""" sql """switch ${catalog_name}""" + qt_sql """select current_catalog()""" sql """ use ${ex_db_name}""" order_qt_ex_tb0 """ select id, name from ${ex_tb0} order by id; """ diff --git a/regression-test/suites/query_p0/system/test_query_sys.groovy b/regression-test/suites/query_p0/system/test_query_sys.groovy index 6b99b3fd66..a87bad8094 100644 --- a/regression-test/suites/query_p0/system/test_query_sys.groovy +++ b/regression-test/suites/query_p0/system/test_query_sys.groovy @@ -29,6 +29,7 @@ suite("test_query_sys", "query,p0") { sql "select random(20);" sql "SELECT CONNECTION_ID();" sql "SELECT CURRENT_USER();" + sql "SELECT CURRENT_CATALOG();" // sql "select now();" sql "select localtime();" sql "select localtimestamp();"