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 a6f267c4798 [pick](Variant) fix element_at should return nullable if 
result type is nullable (#39846)
a6f267c4798 is described below

commit a6f267c4798b708212680aab4a9b1b9543a0b231
Author: lihangyu <15605149...@163.com>
AuthorDate: Sat Aug 24 09:22:03 2024 +0800

    [pick](Variant) fix element_at should return nullable if result type is 
nullable (#39846)
    
    #39732
---
 be/src/vec/functions/function_variant_element.cpp  | 24 ++++++++++++++--
 .../data/variant_p0/element_function.out           |  4 +++
 .../suites/variant_p0/element_function.groovy      | 32 ++++++++++++++++++++++
 3 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/be/src/vec/functions/function_variant_element.cpp 
b/be/src/vec/functions/function_variant_element.cpp
index 22bf45beb5e..0fc148f0616 100644
--- a/be/src/vec/functions/function_variant_element.cpp
+++ b/be/src/vec/functions/function_variant_element.cpp
@@ -57,7 +57,7 @@ public:
     // Get function name.
     String get_name() const override { return name; }
 
-    bool use_default_implementation_for_nulls() const override { return true; }
+    bool use_default_implementation_for_nulls() const override { return false; 
}
 
     size_t get_number_of_arguments() const override { return 2; }
 
@@ -77,10 +77,27 @@ public:
         return make_nullable(std::make_shared<DataTypeObject>());
     }
 
+    // wrap variant column with nullable
+    // 1. if variant is null root(empty or nothing as root), then nullable map 
is all null
+    // 2. if variant is scalar variant, then use the root's nullable map
+    // 3. if variant is hierarchical variant, then create a nullable map with 
all none null
+    ColumnPtr wrap_variant_nullable(ColumnPtr col) const {
+        const auto& var = assert_cast<const ColumnObject&>(*col);
+        if (var.is_null_root()) {
+            return make_nullable(col, true);
+        }
+        if (var.is_scalar_variant() && var.get_root()->is_nullable()) {
+            const auto* nullable = assert_cast<const 
ColumnNullable*>(var.get_root().get());
+            return ColumnNullable::create(
+                    col, 
nullable->get_null_map_column_ptr()->clone_resized(col->size()));
+        }
+        return make_nullable(col);
+    }
+
     Status execute_impl(FunctionContext* context, Block& block, const 
ColumnNumbers& arguments,
                         size_t result, size_t input_rows_count) const override 
{
         const auto* variant_col = check_and_get_column<ColumnObject>(
-                block.get_by_position(arguments[0]).column.get());
+                
remove_nullable(block.get_by_position(arguments[0]).column).get());
         if (!variant_col) {
             return Status::RuntimeError(
                     fmt::format("unsupported types for function {}({}, {})", 
get_name(),
@@ -95,6 +112,9 @@ public:
         auto index_column = block.get_by_position(arguments[1]).column;
         ColumnPtr result_column;
         RETURN_IF_ERROR(get_element_column(*variant_col, index_column, 
&result_column));
+        if (block.get_by_position(result).type->is_nullable()) {
+            result_column = wrap_variant_nullable(result_column);
+        }
         block.replace_by_position(result, result_column);
         return Status::OK();
     }
diff --git a/regression-test/data/variant_p0/element_function.out 
b/regression-test/data/variant_p0/element_function.out
new file mode 100644
index 00000000000..095c7b20356
--- /dev/null
+++ b/regression-test/data/variant_p0/element_function.out
@@ -0,0 +1,4 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !sql --
+1
+
diff --git a/regression-test/suites/variant_p0/element_function.groovy 
b/regression-test/suites/variant_p0/element_function.groovy
new file mode 100644
index 00000000000..7b5e55ea53b
--- /dev/null
+++ b/regression-test/suites/variant_p0/element_function.groovy
@@ -0,0 +1,32 @@
+// 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("regression_test_variant_element_at", "p0")  {
+      sql """
+        CREATE TABLE IF NOT EXISTS element_fn_test(
+            k bigint,
+            v variant,
+            v1 variant not null,
+        )
+        UNIQUE KEY(`k`)
+        DISTRIBUTED BY HASH(k) BUCKETS 4
+        properties("replication_num" = "1");
+    """
+
+    sql """insert into element_fn_test values (1, '{"arr1" : [1, 2, 3]}', 
'{"arr2" : [4, 5, 6]}')"""
+    qt_sql """select array_first((x,y) -> (x - y) < 0, cast(v['arr1'] as 
array<int>), cast(v1['arr2'] as array<int>)) from element_fn_test"""
+}
\ 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