From ab9f2d226f9ba2beef7478ff3ac3f6352a1ab951 Mon Sep 17 00:00:00 2001 From: libinfeng Date: Wed, 15 Mar 2023 19:56:49 +0800 Subject: [PATCH] Fix DORIS-3219: Add call once logic to analyze of function aes_decrypt --- .../apache/doris/analysis/FunctionCallExpr.java | 7 ++++++- .../test_encryption_function.groovy | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java index 30b40088dbfbe2..83db78312d463e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java @@ -64,6 +64,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; // TODO: for aggregations, we need to unify the code paths for builtins and UDAs. public class FunctionCallExpr extends Expr { @@ -78,6 +79,8 @@ public class FunctionCallExpr extends Expr { .add("round").add("round_bankers").add("ceil").add("floor") .add("truncate").add("dround").add("dceil").add("dfloor").build(); + private final AtomicBoolean addOnce = new AtomicBoolean(false); + static { java.util.function.BiFunction, Type, Type> sumRule = (children, returnType) -> { Preconditions.checkArgument(children != null && children.size() > 0); @@ -1016,7 +1019,9 @@ private void analyzeBuiltinAggFunction(Analyzer analyzer) throws AnalysisExcepti } } } - children.add(new StringLiteral(blockEncryptionMode)); + if (!blockEncryptionMode.equals(children.get(children.size() - 1))) { + children.add(new StringLiteral(blockEncryptionMode)); + } } } diff --git a/regression-test/suites/query_p0/sql_functions/encryption_digest/test_encryption_function.groovy b/regression-test/suites/query_p0/sql_functions/encryption_digest/test_encryption_function.groovy index 9ca126ef4cf1d3..b24f167f11a11f 100644 --- a/regression-test/suites/query_p0/sql_functions/encryption_digest/test_encryption_function.groovy +++ b/regression-test/suites/query_p0/sql_functions/encryption_digest/test_encryption_function.groovy @@ -16,6 +16,18 @@ // under the License. suite("test_encryption_function") { + def tableName = "dwd_candidates" + sql "DROP TABLE IF EXISTS ${tableName}" + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + c_int INT, + `name` varchar(65530) NULL COMMENT "" + ) + DISTRIBUTED BY HASH(c_int) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1" + ) + """ sql "set batch_size = 4096;" sql "set block_encryption_mode=\"AES_128_ECB\";" @@ -46,6 +58,10 @@ suite("test_encryption_function") { } qt_sql "SELECT AES_DECRYPT(FROM_BASE64('mvZT1KJw7N0RJf27aipUpg=='),'F3229A0B371ED2D9441B830D21A390C3', '0123456789');" qt_sql "SELECT AES_DECRYPT(FROM_BASE64('tsmK1HzbpnEdR2//WhO+MA=='),'F3229A0B371ED2D9441B830D21A390C3', '0123456789');" + explain { + sql "SELECT AES_DECRYPT(UNHEX(r_2_3.`name`), 'namePnhe3E0MWyfZivUnVzDy12caymnrKp', '0123456789') AS x0 FROM dwd_candidates AS r_2_3\n" + + "GROUP BY x0;" + } sql "set block_encryption_mode=\"SM4_128_CBC\";" test {