cloud-fan commented on code in PR #49445:
URL: https://github.com/apache/spark/pull/49445#discussion_r1926988202
##########
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala:
##########
@@ -139,6 +139,9 @@ object FakeV2SessionCatalog extends TableCatalog with
FunctionCatalog with Suppo
* even if a temp view `t` has been created.
* @param outerPlan The query plan from the outer query that can be used to
resolve star
* expressions in a subquery.
+ * @param isExecuteImmediate Whether the current plan is created by EXECUTE
IMMEDIATE. Used when
+ * resolving variables, as SQL Scripting local
variables should not be
+ * visible from EXECUTE IMMEDIATE.
Review Comment:
`AnalysisContext` is a singleton instance and it's very hacky and fragile to
update a global bool flag to implement this fix. I think the key problem here
is still passing around state, and I have a new idea:
In `SubstituteExecuteImmediate`, after we parse the query body, we tag all
`UnresolvedAttribute`s within the query to indicate that they are inside
EXECUTE IMMEDIATE and they should not be resolved to local variables. Something
like this
```
val EXEC_IMMEDIATE_TAG = new TreeNodeTag[Unit]("inside_execute_immediate")
def tagVariables(plan: LogicalPlan): Unit = {
plan.expressions.foreach(_.foreach {
case u: UnresolvedAttribute =>
u.setTagValue(PARAM_QUERY_TAG, ())
})
plan.subqueries.foreach(tagVariables)
plan.children.foreach(tagVariables)
}
val executeImmediateQuery = ...
tagVariables(executeImmediateQuery)
```
In the places that match `UnresolvedAttribute` and try to look up variables,
we skip local variables if the tag is present.
In the new single-pass analyzer, we can have a better way to pass around
states: when we top-down traverse the plan tree and see
`ExecuteImmediateQuery`, we set a flag in the scope to indicate it's under
`ExecuteImmediateQuery` and keep traversing.
cc @vladimirg-db
--
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]