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

zhangzc pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-gluten.git


The following commit(s) were added to refs/heads/main by this push:
     new 738b226264 [GLUTEN-8074][CH] Fix adjust output constant column (#8076)
738b226264 is described below

commit 738b226264a7030a844f6852b97a8d72c26abd5e
Author: Wenzheng Liu <[email protected]>
AuthorDate: Fri Nov 29 16:42:33 2024 +0800

    [GLUTEN-8074][CH] Fix adjust output constant column (#8076)
    
    * [GLUTEN-8074][CH] Fix adjust output constant column
---
 .../execution/GlutenClickHouseDecimalSuite.scala   | 12 +++++++++++
 .../local-engine/Parser/SerializedPlanParser.cpp   | 25 +++++++++++++++-------
 2 files changed, 29 insertions(+), 8 deletions(-)

diff --git 
a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseDecimalSuite.scala
 
b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseDecimalSuite.scala
index 2663a8fb81..9988d53729 100644
--- 
a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseDecimalSuite.scala
+++ 
b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseDecimalSuite.scala
@@ -404,6 +404,18 @@ class GlutenClickHouseDecimalSuite
     )
   }
 
+  test("GLUTEN-8074 Fix adjust output constant column") {
+    val sql =
+      s"""
+         |select bround(1002.5786, 3),
+         |       bround(-10.8, 0),
+         |       bround(13.888888888889, 5)
+         |from $decimalTable
+         |WHERE bround(cast(decimal_field as decimal(30, 2)), 1) > 0 LIMIT 2;
+         |""".stripMargin
+    runQueryAndCompare(sql)(_ => {})
+  }
+
   test("fix decimal32 with negative value") {
     val schema = StructType.apply(
       Seq(
diff --git a/cpp-ch/local-engine/Parser/SerializedPlanParser.cpp 
b/cpp-ch/local-engine/Parser/SerializedPlanParser.cpp
index 42541d9d92..95086121d4 100644
--- a/cpp-ch/local-engine/Parser/SerializedPlanParser.cpp
+++ b/cpp-ch/local-engine/Parser/SerializedPlanParser.cpp
@@ -160,20 +160,29 @@ void SerializedPlanParser::adjustOutput(const 
DB::QueryPlanPtr & query_plan, con
             else
             {
                 need_final_project = true;
-
                 bool need_const = origin_column.column && 
isColumnConst(*origin_column.column);
-                ColumnWithTypeAndName final_column(
-                    need_const ? final_type->createColumnConst(0, 
assert_cast<const ColumnConst &>(*origin_column.column).getField())
-                               : final_type->createColumn(),
-                    final_type,
-                    origin_column.name);
-                final_columns.emplace_back(std::move(final_column));
+                if (need_const)
+                {
+                    const DB::ContextPtr context = 
DB::CurrentThread::get().getQueryContext();
+                    const FunctionOverloadResolverPtr & cast_resolver = 
FunctionFactory::instance().get("CAST", context);
+                    const DataTypePtr string_type = 
std::make_shared<DataTypeString>();
+                    ColumnWithTypeAndName to_type_column = 
{string_type->createColumnConst(1, final_type->getName()), string_type, 
"__cast_const__"};
+                    FunctionBasePtr cast_function = 
cast_resolver->build({origin_column, to_type_column});
+                    ColumnPtr const_col = 
ColumnConst::create(cast_function->execute({origin_column, to_type_column}, 
final_type, 1), 1);
+                    ColumnWithTypeAndName final_column(const_col, final_type, 
origin_column.name);
+                    final_columns.emplace_back(std::move(final_column));
+                }
+                else
+                {
+                    ColumnWithTypeAndName 
final_column(final_type->createColumn(), final_type, origin_column.name);
+                    final_columns.emplace_back(std::move(final_column));
+                }
             }
         }
 
         if (need_final_project)
         {
-            ActionsDAG final_project = 
ActionsDAG::makeConvertingActions(origin_columns, final_columns, 
ActionsDAG::MatchColumnsMode::Position);
+            ActionsDAG final_project = 
ActionsDAG::makeConvertingActions(origin_columns, final_columns, 
ActionsDAG::MatchColumnsMode::Position, true);
             QueryPlanStepPtr final_project_step
                 = 
std::make_unique<ExpressionStep>(query_plan->getCurrentHeader(), 
std::move(final_project));
             final_project_step->setStepDescription("Project for output 
schema");


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to