kazuyukitanimura commented on a change in pull request #33930:
URL: https://github.com/apache/spark/pull/33930#discussion_r744995201
##########
File path:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/expressions.scala
##########
@@ -813,6 +860,39 @@ object NullPropagation extends Rule[LogicalPlan] {
}
+/**
+ * Unwrap the input of IsNull/IsNotNull if the input is NullIntolerant
+ * E.g. IsNull(Not(null)) == IsNull(null)
+ */
+object NullDownPropagation extends Rule[LogicalPlan] {
+ // Return true iff the expression returns non-null result for all non-null
inputs.
+ // Not all `NullIntolerant` can be propagated. E.g. `Cast` is
`NullIntolerant`; however,
+ // cast('Infinity' as integer) is null. Hence, `Cast` is not supported
`NullIntolerant`.
+ // `ExtractValue` is also not supported. E.g. the planner may resolve column
`a` to `a#123`,
+ // then IsNull(a#123) cannot be optimized.
+ // Applying to `EqualTo` is too disruptive for [SPARK-32290] optimization,
not supported for now.
+ // If e has multiple children, the deterministic check is required because
optimizing
+ // IsNull(a > b) to Or(IsNull(a), IsNull(b)), for example, may cause
skipping the evaluation of b
+ private def supportedNullIntolerant(e: NullIntolerant): Boolean = (e match {
+ case _: Not => true
+ case _: GreaterThan | _: GreaterThanOrEqual | _: LessThan | _:
LessThanOrEqual
+ if e.deterministic => true
+ case _ => false
+ }) && e.children.nonEmpty
+
+ def apply(plan: LogicalPlan): LogicalPlan = plan.transformWithPruning(
+ _.containsPattern(NULL_CHECK), ruleId) {
+ case q: LogicalPlan => q.transformExpressionsDownWithPruning(
+ _.containsPattern(NULL_CHECK), ruleId) {
+ case IsNull(e: NullIntolerant) if supportedNullIntolerant(e) =>
Review comment:
Thanks. It gets into the inner field in pre-order if I understood your
question correctly. Actually `supportedNullIntolerant(e)` checks whether `e`
has children.
--
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]