This is an automated email from the ASF dual-hosted git repository.
lgbo 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 f572839729 rewrite get_json_object in explode (#10912)
f572839729 is described below
commit f572839729c41c89006bce7f9f25117383145e35
Author: lgbo <[email protected]>
AuthorDate: Tue Oct 21 16:34:41 2025 +0800
rewrite get_json_object in explode (#10912)
---
.../execution/GlutenFunctionValidateSuite.scala | 10 ++++++++++
.../Parser/RelParsers/ProjectRelParser.cpp | 5 ++++-
cpp-ch/local-engine/Rewriter/ExpressionRewriter.h | 23 ++++++++++++++++++----
3 files changed, 33 insertions(+), 5 deletions(-)
diff --git
a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenFunctionValidateSuite.scala
b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenFunctionValidateSuite.scala
index d08501674d..d2429a2192 100644
---
a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenFunctionValidateSuite.scala
+++
b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenFunctionValidateSuite.scala
@@ -381,6 +381,16 @@ class GlutenFunctionValidateSuite extends
GlutenClickHouseWholeStageTransformerS
}
}
+ test("Test get_json_object 13") {
+ val sql =
+ """
+ |SELECT
+ | explode(array(get_json_object(get_json_object('{"a":
"{\\\"b\\\":1}"}', '$.a'), '$.b')))
+ | from range(1)
+ |""".stripMargin
+ runQueryAndCompare(sql) { df => }
+ }
+
test("GLUTEN-8557: Optimize nested and/or") {
def checkFlattenedFunctions(plan: SparkPlan, functionName: String, argNum:
Int): Boolean = {
diff --git a/cpp-ch/local-engine/Parser/RelParsers/ProjectRelParser.cpp
b/cpp-ch/local-engine/Parser/RelParsers/ProjectRelParser.cpp
index d9d2e55f34..97b41661ee 100644
--- a/cpp-ch/local-engine/Parser/RelParsers/ProjectRelParser.cpp
+++ b/cpp-ch/local-engine/Parser/RelParsers/ProjectRelParser.cpp
@@ -116,7 +116,10 @@ DB::QueryPlanPtr
ProjectRelParser::parseReplicateRows(DB::QueryPlanPtr query_pla
DB::QueryPlanPtr
ProjectRelParser::parseGenerate(DB::QueryPlanPtr query_plan, const
substrait::Rel & rel, std::list<const substrait::Rel *> & /*rel_stack_*/)
{
- const auto & generate_rel = rel.generate();
+ ExpressionsRewriter rewriter(parser_context);
+ substrait::Rel final_rel = rel;
+ rewriter.rewrite(final_rel);
+ const auto & generate_rel = final_rel.generate();
if (isReplicateRows(generate_rel))
{
return parseReplicateRows(std::move(query_plan), generate_rel);
diff --git a/cpp-ch/local-engine/Rewriter/ExpressionRewriter.h
b/cpp-ch/local-engine/Rewriter/ExpressionRewriter.h
index 8d4fcaca44..ba44b7925f 100644
--- a/cpp-ch/local-engine/Rewriter/ExpressionRewriter.h
+++ b/cpp-ch/local-engine/Rewriter/ExpressionRewriter.h
@@ -38,10 +38,6 @@ public:
void rewrite(substrait::Rel & rel) override
{
- if (!rel.has_filter() && !rel.has_project())
- {
- return;
- }
prepare(rel);
rewriteImpl(rel);
}
@@ -64,6 +60,14 @@ private:
prepareOnExpression(expr);
}
}
+ if (rel.has_generate())
+ {
+ for (auto & expr : rel.generate().child_output())
+ {
+ prepareOnExpression(expr);
+ }
+ prepareOnExpression(rel.generate().generator());
+ }
}
void rewriteImpl(substrait::Rel & rel)
@@ -84,6 +88,17 @@ private:
rewriteExpression(*expr);
}
}
+ if (rel.has_generate())
+ {
+ auto * generate = rel.mutable_generate();
+ auto * child_outputs = generate->mutable_child_output();
+ for (int i = 0; i < child_outputs->size(); ++i)
+ {
+ auto * expr = child_outputs->Mutable(i);
+ rewriteExpression(*expr);
+ }
+ rewriteExpression(*generate->mutable_generator());
+ }
}
void prepareOnExpression(const substrait::Expression & expr)
{
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]