-
Notifications
You must be signed in to change notification settings - Fork 28.9k
[SPARK-20329][SQL] Make timezone aware expression without timezone unresolved #17641
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Test build #75816 has finished for PR 17641 at commit
|
| trait TimeZoneAwareExpression extends Expression { | ||
| /** The expression is only resolved when the time zone has been set. */ | ||
| override lazy val resolved: Boolean = | ||
| childrenResolved && checkInputDataTypes().isSuccess && timeZoneId.isDefined |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The implementation may have some custom resolution logic, how about super.resolved && timeZoneId.isDefined?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I tried doing this. Scala does not allow you to call super.resolved in resolved :(....
| case e: TimeZoneAwareExpression if e.timeZoneId.isEmpty => | ||
| e.withTimeZone(conf.sessionLocalTimeZone) | ||
| }.eval() | ||
| castedExpr.eval() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If there are nested expressions which are timezone aware, I think we still need to attach time zone to them?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess now that TimeZoneAwareExpression is resolved if it has timeZoneId, so we don't need to transform children.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
oh, right. I saw the changes to TimeZoneAwareExpression. :-)
|
Test build #75898 has finished for PR 17641 at commit
|
|
Test build #75901 has finished for PR 17641 at commit
|
| e | ||
| } else { | ||
| Cast(e, targetType) | ||
| Cast(e, targetType, Some(conf.sessionLocalTimeZone)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ResolveInlineTables can be CastSupport and we should use cast of it here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
| e | ||
| } else { | ||
| Cast(e, targetType) | ||
| Cast(e, targetType, Some(conf.sessionLocalTimeZone)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
also make ResolveInlineTables mix-in CastSupport?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
| } | ||
| } | ||
|
|
||
| private def castWithDefaultTZ(v: Any, targetType: DataType): Cast = { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
shall we just change the default value of timeZoneId parameter in def cast to GMT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
| val partValue = potentialSpecs.head._2 | ||
| Some(Alias(Cast(Literal(partValue), field.dataType), field.name)()) | ||
| Some(Alias(cast(Literal(partValue), field.dataType), | ||
| field.name)()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: this can be put in the previous line
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
| override val postHocResolutionRules: Seq[Rule[LogicalPlan]] = | ||
| PreprocessTableCreation(session) +: | ||
| PreprocessTableInsertion(conf) +: | ||
| ResolveTimeZone(conf) +: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why run this rule again? it's already in the resolution batch
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
|
Test build #75979 has finished for PR 17641 at commit
|
|
Test build #75981 has finished for PR 17641 at commit
|
|
LGTM, merging to master/2.2 |
…resolved ## What changes were proposed in this pull request? A cast expression with a resolved time zone is not equal to a cast expression without a resolved time zone. The `ResolveAggregateFunction` assumed that these expression were the same, and would fail to resolve `HAVING` clauses which contain a `Cast` expression. This is in essence caused by the fact that a `TimeZoneAwareExpression` can be resolved without a set time zone. This PR fixes this, and makes a `TimeZoneAwareExpression` unresolved as long as it has no TimeZone set. ## How was this patch tested? Added a regression test to the `SQLQueryTestSuite.having` file. Author: Herman van Hovell <[email protected]> Closes #17641 from hvanhovell/SPARK-20329. (cherry picked from commit 760c8d0) Signed-off-by: Wenchen Fan <[email protected]>
…resolved ## What changes were proposed in this pull request? A cast expression with a resolved time zone is not equal to a cast expression without a resolved time zone. The `ResolveAggregateFunction` assumed that these expression were the same, and would fail to resolve `HAVING` clauses which contain a `Cast` expression. This is in essence caused by the fact that a `TimeZoneAwareExpression` can be resolved without a set time zone. This PR fixes this, and makes a `TimeZoneAwareExpression` unresolved as long as it has no TimeZone set. ## How was this patch tested? Added a regression test to the `SQLQueryTestSuite.having` file. Author: Herman van Hovell <[email protected]> Closes apache#17641 from hvanhovell/SPARK-20329.
What changes were proposed in this pull request?
A cast expression with a resolved time zone is not equal to a cast expression without a resolved time zone. The
ResolveAggregateFunctionassumed that these expression were the same, and would fail to resolveHAVINGclauses which contain aCastexpression.This is in essence caused by the fact that a
TimeZoneAwareExpressioncan be resolved without a set time zone. This PR fixes this, and makes aTimeZoneAwareExpressionunresolved as long as it has no TimeZone set.How was this patch tested?
Added a regression test to the
SQLQueryTestSuite.havingfile.