srielau opened a new pull request, #55647:
URL: https://github.com/apache/spark/pull/55647

   ### What changes were proposed in this pull request?
   
   Address the open follow-ups from 
[SPARK-56681](https://issues.apache.org/jira/browse/SPARK-56681) (umbrella for 
PATH / SPARK-56605 cleanup) in a single cleanup PR. Items #1 and #2 were 
already wired by SPARK-56639; this PR covers the remainder.
   
   | # | Item | Resolution |
   |---|---|---|
   | #1 | `FunctionResolution.resolveProcedure` was dead code | Already wired 
by SPARK-56639 (no action). |
   | #2 | Frozen view / SQL-function PATH wiring unfinished | Already done by 
SPARK-56639 (no action). |
   | #3 | `AnalysisContext.resolutionPathEntries` threadlocal | Audit only: 
documented lifecycle and confirmed `withNewAnalysisContext` / `reset()` 
correctly clear it. Full removal needs a coordinated refactor to plumb the path 
through `RelationResolution`/`FunctionResolution` method calls; flagged as a 
follow-up in the docstring. |
   | #4 | `Analyzer.executeAndCheck` clobbers outer `SQLConf.withExistingConf` 
| Extracted `runWithSessionConf` helper, added `SQLConf.getExistingConfIfSet`. 
`executeAndCheck` and `executeSameContext` now share one path that yields to 
any outer scope. |
   | #5 | `VariableResolution.allowUnqualifiedSessionTempVariableLookup` 
force-loads default catalog | Short-circuit when PATH is not explicitly set 
(the default path always includes `system.session`). |
   | #6 | `DROP VARIABLE` PATH gate asymmetric with DECLARE/CREATE | Removed 
the gate. DDL on session variables (`DECLARE`/`CREATE`/`DROP`) always targets 
`system.session`; only DML (`SET VAR`, `SELECT @x`) goes through PATH. |
   | #7 | `lookupFunctionType` exception swallow too broad | Narrowed from 
`NonFatal` to the explicit not-found list (`NoSuchFunctionException`, 
`NoSuchNamespaceException`, `CatalogNotFoundException`, `FORBIDDEN_OPERATION`). 
Other exceptions propagate. |
   | #8 | `lookupFunctionType` fan-out had wasteful `system.*` candidates | 
Filtered them out -- `system.session` / `system.builtin` / `system.ai` are 
already resolved earlier in the same method. |
   | #9 | Three near-duplicate path-resolution helpers | Lifted into 
`CatalogManager.resolutionPathEntriesForAnalysis(pinnedEntries, 
viewCatalogAndNamespace)`. Relation, routine, and procedure resolution all 
route through it. |
   | #10 | Tests for the new error paths and gates | Added a DECLARE / SET VAR 
/ DROP cycle test under non-default PATH and rewrote the bonus test to assert 
the actual rendered search path. |
   | #11 | `ProtoToParsedPlanTestSuite.analyzerIsolationConf` was a bare 
`SQLConf` | Clone `spark.sessionState.conf` and only override 
`PATH_ENABLED=false`, so all `sparkConf` overrides (ANSI, alias config, ...) 
propagate automatically. |
   | Bonus | `ResolveSetVariable` hardcoded `SYSTEM.SESSION` regardless of 
actual PATH | Collapsed `unresolvedVariableError` into one method taking 
`Seq[Seq[String]]` path entries with optional `Origin`. `searchPath` now 
renders as `[entry1, entry2, ...]` -- byte-for-byte consistent with 
`UNRESOLVED_ROUTINE` and `TABLE_OR_VIEW_NOT_FOUND`. Unqualified `SET VAR` 
failures report the actual PATH consulted; qualified failures report 
`[``SYSTEM``.``SESSION``]`. |
   
   ### Why are the changes needed?
   
   These are the cleanup items called out on SPARK-56681 from the post-merge 
source review of SPARK-56605. They eliminate dead code paths, plug user-visible 
bugs (force-loading a misconfigured default catalog on column resolution; 
clobbering pinned session configs; swallowing real catalog errors as 
`UNRESOLVED_ROUTINE`), remove the asymmetry between DDL and DML on session 
variables, and make `UNRESOLVED_VARIABLE` self-consistent with the other "not 
found" errors.
   
   ### Does this PR introduce _any_ user-facing change?
   
   Yes.
   
   - `UNRESOLVED_VARIABLE.searchPath` is now rendered as a bracketed list (e.g. 
`` [`system`.`session`] ``), matching `UNRESOLVED_ROUTINE` and 
`TABLE_OR_VIEW_NOT_FOUND`. For unqualified `SET VAR` failures the list reflects 
the actual SQL PATH that was consulted instead of a hardcoded `SYSTEM.SESSION`. 
The error now also carries a `queryContext` pointing at the offending `SET VAR` 
since `ResolveSetVariable` passes the current origin.
   - `DROP TEMPORARY VARIABLE` no longer raises `UNRESOLVED_VARIABLE` when the 
SQL PATH does not contain `system.session`. DDL on session variables ignores 
PATH, matching the existing behaviour of `DECLARE OR REPLACE VARIABLE`.
   - `lookupFunctionType` no longer swallows non-`NotFound` errors. A catalog 
reporting `PERMISSION_DENIED` (or similar) for a function lookup now propagates 
instead of silently producing `UNRESOLVED_ROUTINE`.
   
   ### How was this patch tested?
   
   - Updated `SetPathSuite` (DECLARE / SET VAR / DROP cycle under a non-default 
PATH; bonus test asserts the actual rendered search path).
   - Updated `SqlScriptingExecutionSuite` (local-variable SET error 
expectation) and regenerated the `sql-session-variables.sql` golden files for 
the new bracketed `searchPath` format.
   - Added `resolutionPathEntriesForAnalysis` stubs to mocked `CatalogManager` 
instances in `PlanResolutionSuite`, `AlignAssignmentsSuiteBase`, and 
`TableLookupCacheSuite`.
   - Ran focused suites locally; all pass:
     - `build/sbt 'sql/testOnly *SetPathSuite *SqlScriptingExecutionSuite 
*ExecuteImmediateEndToEndSuite'`
     - `build/sbt 'sql/testOnly *SimpleSQLViewSuite *SQLFunctionSuite'`
     - `build/sbt 'sql/testOnly *PlanResolutionSuite 
*UpdateTableAlignAssignmentsSuite *MergeIntoTableAlignAssignmentsSuite'`
     - `build/sbt 'catalyst/testOnly *TableLookupCacheSuite *AnalysisSuite 
*AnalysisErrorSuite *LookupFunctionsSuite'`
     - `build/sbt 'sql/testOnly *FunctionQualificationSuite 
*RelationQualificationSuite *DataSourceV2FunctionSuite'`
     - `build/sbt 'sql/testOnly *SQLQuerySuite'`
     - `build/sbt 'connect/testOnly *ProtoToParsedPlanTestSuite'`
     - `build/sbt 'sql/testOnly *SQLQueryTestSuite -- -z 
sql-session-variables.sql'`
     - Full `org.apache.spark.sql.catalyst.analysis.*` and 
`org.apache.spark.sql.analysis.resolver.*` suites.
   - `scalastyle` clean across catalyst, sql, and connect modules.
   
   ### Was this patch authored or co-authored using generative AI tooling?
   
   Generated-by: Cursor Claude Opus 4.7


-- 
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