uros-b commented on code in PR #58119:
URL: https://github.com/apache/spark/pull/58119#discussion_r3813412638


##########
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/RewriteWithExpression.scala:
##########
@@ -66,6 +66,20 @@ object RewriteWithExpression extends Rule[LogicalPlan] {
     }
   }
 
+  /**
+   * Rewrites the `With` expressions in a single expression tree by inlining 
their common
+   * expressions. Uses `transformUp` to handle nested `With`.
+   */
+  def applyForExpression(expression: Expression): Expression = {

Review Comment:
   No tests are added for the five new applyForExpression entry points (in 
finishAnalysis.scala, RewriteWithExpression.scala). The plan-level behavior is 
unchanged and is covered by existing tests, but the expression-level API itself 
has zero direct test coverage. A minimal unit test (e.g. calling 
ComputeCurrentTime.applyForExpression on a CurrentDate() leaf expression and 
asserting it becomes a Literal) would provide a regression anchor before the 
single-pass analyzer adopts these entry points.



##########
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/finishAnalysis.scala:
##########
@@ -112,106 +112,128 @@ object EvalInlineTables extends Rule[LogicalPlan] with 
CastSupport {
  */
 object ComputeCurrentTime extends Rule[LogicalPlan] {
   def apply(plan: LogicalPlan): LogicalPlan = {
-    val instant = Instant.now()
-    val currentTimestampMicros = instantToMicros(instant)
-    val currentTime = Literal.create(currentTimestampMicros, TimestampType)
-    val currentTimeOfDayNanos = instantToNanosOfDay(instant, 
conf.sessionLocalTimeZone)
-    val timezone = Literal.create(conf.sessionLocalTimeZone, StringType)
+    val snapshot = new TimeSnapshot(Instant.now())
+    plan.transformDownWithSubqueriesAndPruning(transformCondition) {
+      case subQuery =>
+        subQuery.transformAllExpressionsWithPruning(transformCondition)(
+          expressionTransform(snapshot))
+    }
+  }
+
+  /** Rewrites the current date/time functions in a single expression tree. */
+  def applyForExpression(expression: Expression): Expression =
+    applyForExpression(expression, Instant.now())
+
+  /**
+   * Rewrites the current date/time functions in a single expression tree 
using `instant`. Callers
+   * reducing several expressions that must observe the same wall clock pass 
one shared instant.
+   */
+  def applyForExpression(expression: Expression, instant: Instant): Expression 
= {
+    val snapshot = new TimeSnapshot(instant)
+    
expression.transformWithPruning(transformCondition)(expressionTransform(snapshot))

Review Comment:
   ComputeCurrentTime.applyForExpression, 
ReplaceCurrentLike.applyForExpression, and 
SpecialDatetimeValues.applyForExpression all use 
`expression.transformWithPruning(...)`, which does not traverse into 
ScalarSubquery plan nodes embedded within expressions.
   
   The plan-level apply() counterparts use 
transformDownWithSubqueriesAndPruning / transformAllExpressionsWithPruning, 
both of which do cross subquery boundaries. A caller that passes an expression 
containing a ScalarSubquery (e.g. WHERE current_date() < (SELECT MIN(dt) FROM 
t)) would silently leave current_date() inside the subquery unrewritten.
   
   There are no callers in this PR so this is not an active bug, but the 
contract of applyForExpression should document this limitation explicitly so 
future callers (the single-pass analyzer) can account for it.



##########
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/RewriteWithExpression.scala:
##########
@@ -66,6 +66,20 @@ object RewriteWithExpression extends Rule[LogicalPlan] {
     }
   }
 
+  /**
+   * Rewrites the `With` expressions in a single expression tree by inlining 
their common
+   * expressions. Uses `transformUp` to handle nested `With`.
+   */
+  def applyForExpression(expression: Expression): Expression = {
+    expression.transformUpWithPruning(_.containsPattern(WITH_EXPRESSION)) {
+      case With(child, defs) =>
+        val refToExpr = defs.map(commonExprDef => commonExprDef.id -> 
commonExprDef.child).toMap
+        child.transformWithPruning(_.containsPattern(COMMON_EXPR_REF)) {
+          case ref: CommonExpressionRef => refToExpr(ref.id)

Review Comment:
   ```suggestion
             case ref: CommonExpressionRef if refToExpr.contains(ref.id) => 
refToExpr(ref.id)
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to