This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 4b3dd6c10a6 branch-2.1: [feat](func) any function supports json #50311 
(#50484)
4b3dd6c10a6 is described below

commit 4b3dd6c10a6f8f3136a0928a9ef0af65bbe615b5
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Apr 29 19:11:25 2025 +0800

    branch-2.1: [feat](func) any function supports json #50311 (#50484)
    
    Cherry-picked from #50311
    
    Co-authored-by: lw112 <131352377+felixw...@users.noreply.github.com>
---
 .../aggregate_function_min_max.cpp                 |   2 +-
 .../vec/aggregate_functions/agg_min_max_test.cpp   |  29 ++++++
 .../data/jsonb_p0/test_jsonb_any_aggregate.out     | Bin 0 -> 539 bytes
 .../jsonb_p0/test_jsonb_any_aggregate.groovy       | 109 +++++++++++++++++++++
 4 files changed, 139 insertions(+), 1 deletion(-)

diff --git a/be/src/vec/aggregate_functions/aggregate_function_min_max.cpp 
b/be/src/vec/aggregate_functions/aggregate_function_min_max.cpp
index c1a72fd52bd..59a11984c38 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_min_max.cpp
+++ b/be/src/vec/aggregate_functions/aggregate_function_min_max.cpp
@@ -49,7 +49,7 @@ AggregateFunctionPtr 
create_aggregate_function_single_value(const String& name,
     const DataTypePtr& argument_type = remove_nullable(argument_types[0]);
     WhichDataType which(argument_type);
 
-    if (which.idx == TypeIndex::String) {
+    if (which.idx == TypeIndex::String || which.idx == TypeIndex::JSONB) {
         return creator_without_type::create<
                 
AggregateFunctionsSingleValue<Data<SingleValueDataString>>>(argument_types,
                                                                             
result_is_nullable);
diff --git a/be/test/vec/aggregate_functions/agg_min_max_test.cpp 
b/be/test/vec/aggregate_functions/agg_min_max_test.cpp
index fef91af4d1f..901f11ec39f 100644
--- a/be/test/vec/aggregate_functions/agg_min_max_test.cpp
+++ b/be/test/vec/aggregate_functions/agg_min_max_test.cpp
@@ -35,6 +35,7 @@
 #include "vec/core/field.h"
 #include "vec/core/types.h"
 #include "vec/data_types/data_type_decimal.h"
+#include "vec/data_types/data_type_jsonb.h"
 #include "vec/data_types/data_type_number.h"
 #include "vec/data_types/data_type_string.h"
 
@@ -155,6 +156,34 @@ TEST_P(AggMinMaxTest, min_max_string_test) {
     agg_function->destroy(place);
 }
 
+TEST_P(AggMinMaxTest, any_json_test) {
+    // Prepare test data with JSON
+    auto column_vector_json = ColumnString::create();
+    std::string json_data = "{}";
+    column_vector_json->insert_data(json_data.c_str(), json_data.length());
+
+    // Set up the any function with JSONB type
+    AggregateFunctionSimpleFactory factory;
+    register_aggregate_function_minmax(factory);
+    DataTypes data_types = {std::make_shared<DataTypeJsonb>()};
+    auto agg_function = factory.get("any", data_types, false, -1);
+
+    // Create and initialize place for aggregation
+    std::unique_ptr<char[]> memory(new char[agg_function->size_of_data()]);
+    AggregateDataPtr place = memory.get();
+    agg_function->create(place);
+
+    // Do aggregation
+    const IColumn* column[1] = {column_vector_json.get()};
+    agg_function->add(place, column, 0, nullptr);
+
+    // Verify result
+    ColumnString ans;
+    agg_function->insert_result_into(place, ans);
+    EXPECT_EQ(StringRef(json_data), ans.get_data_at(0));
+    agg_function->destroy(place);
+}
+
 INSTANTIATE_TEST_SUITE_P(Params, AggMinMaxTest,
                          ::testing::ValuesIn(std::vector<std::string> {"min", 
"max"}));
 
diff --git a/regression-test/data/jsonb_p0/test_jsonb_any_aggregate.out 
b/regression-test/data/jsonb_p0/test_jsonb_any_aggregate.out
new file mode 100644
index 00000000000..d6ffa674337
Binary files /dev/null and 
b/regression-test/data/jsonb_p0/test_jsonb_any_aggregate.out differ
diff --git a/regression-test/suites/jsonb_p0/test_jsonb_any_aggregate.groovy 
b/regression-test/suites/jsonb_p0/test_jsonb_any_aggregate.groovy
new file mode 100644
index 00000000000..4468b17ad01
--- /dev/null
+++ b/regression-test/suites/jsonb_p0/test_jsonb_any_aggregate.groovy
@@ -0,0 +1,109 @@
+// 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.
+
+suite("test_jsonb_any_aggregate", "p0") {
+    def tableName = "test_any_json"
+
+    sql "DROP TABLE IF EXISTS ${tableName}"
+
+    sql """
+    CREATE TABLE IF NOT EXISTS ${tableName} (
+        id INT,
+        group_id INT,
+        json_data JSON
+    )
+    DISTRIBUTED BY HASH(id) BUCKETS 3
+    PROPERTIES (
+        "replication_num" = "1"
+    )
+    """
+
+    sql """
+    INSERT INTO ${tableName} VALUES
+    (1, 1, '{"name": "Alice", "age": 25}'),
+    (2, 2, '{"name": "Bob", "age": 30}'),
+    (3, 3, '{"name": "Charlie", "age": 35}')
+    """
+
+    qt_sql """
+    SELECT group_id, ANY(json_data) as any_data
+    FROM ${tableName}
+    GROUP BY group_id
+    ORDER BY group_id
+    """
+
+    qt_sql """
+    SELECT group_id, ANY_VALUE(json_data) as any_value_data
+    FROM ${tableName}
+    GROUP BY group_id
+    ORDER BY group_id
+    """
+
+    qt_sql """
+    WITH t0 AS (
+      SELECT CAST(1 AS BIGINT) AS id, CAST('{}' AS JSON) AS attr
+    )
+    SELECT id, ANY(attr) FROM t0 GROUP BY id
+    """
+
+    qt_sql """
+    SELECT ANY(CAST('{}' AS JSON))
+    """
+
+    qt_sql """
+    SELECT ANY_VALUE(CAST('{}' AS JSON))
+    """
+
+    sql "TRUNCATE TABLE ${tableName}"
+
+    sql """
+    INSERT INTO ${tableName} VALUES
+    (1, 1, '{"info": {"address": {"city": "Beijing", "zipcode": 100000}, 
"contacts": [{"type": "phone", "value": "123456"}, {"type": "email", "value": 
"t...@example.com"}]}}')
+    """
+
+    qt_sql """
+    SELECT ANY(json_data) FROM ${tableName} WHERE id = 1
+    """
+
+    sql "TRUNCATE TABLE ${tableName}"
+    sql """
+    INSERT INTO ${tableName} VALUES
+    (1, 1, '{"value": 100}'),
+    (2, 1, '{"value": 100}'),
+    (3, 1, '{"value": 100}')
+    """
+
+    qt_sql """
+    SELECT group_id, ANY(json_data) as any_data
+    FROM ${tableName}
+    GROUP BY group_id
+    """
+
+    // testing for null values
+    sql "TRUNCATE TABLE ${tableName}"
+    sql """
+    INSERT INTO ${tableName}(id, group_id) VALUES
+    (1, 1),
+    (2, 1)
+    """
+
+    qt_sql """
+    SELECT group_id, ANY(json_data) as any_data
+    FROM ${tableName}
+    GROUP BY group_id
+    """
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to