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]