davidm-db commented on code in PR #49445: URL: https://github.com/apache/spark/pull/49445#discussion_r1913293308
########## sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveCatalogs.scala: ########## @@ -73,28 +93,39 @@ class ResolveCatalogs(val catalogManager: CatalogManager) } } - private def resolveVariableName(nameParts: Seq[String]): ResolvedIdentifier = { - def ident: Identifier = Identifier.of(Array(CatalogManager.SESSION_NAMESPACE), nameParts.last) - if (nameParts.length == 1) { + private def resolveCreateVariableName(nameParts: Seq[String]): ResolvedIdentifier = { + val ident = catalogManager.scriptingLocalVariableManager + .getOrElse(catalogManager.tempVariableManager) + .createIdentifier(nameParts.last) + + resolveVariableName(nameParts, ident) + } + + private def resolveDropVariableName(nameParts: Seq[String]): ResolvedIdentifier = { + // Only session variables can be dropped, so catalogManager.scriptingLocalVariableManager + // is not checked in the case of DropVariable. + val ident = catalogManager.tempVariableManager.createIdentifier(nameParts.last) + resolveVariableName(nameParts, ident) + } + + private def resolveVariableName( + nameParts: Seq[String], + ident: Identifier): ResolvedIdentifier = nameParts.length match { + case 1 => ResolvedIdentifier(FakeSystemCatalog, ident) + + // On declare variable, local variables support only unqualified names. + // On drop variable, local variables are not supported at all. + case 2 if nameParts.head.equalsIgnoreCase(CatalogManager.SESSION_NAMESPACE) => ResolvedIdentifier(FakeSystemCatalog, ident) - } else if (nameParts.length == 2) { - if (nameParts.head.equalsIgnoreCase(CatalogManager.SESSION_NAMESPACE)) { - ResolvedIdentifier(FakeSystemCatalog, ident) - } else { - throw QueryCompilationErrors.unresolvedVariableError( - nameParts, Seq(CatalogManager.SYSTEM_CATALOG_NAME, CatalogManager.SESSION_NAMESPACE)) - } - } else if (nameParts.length == 3) { - if (nameParts(0).equalsIgnoreCase(CatalogManager.SYSTEM_CATALOG_NAME) && - nameParts(1).equalsIgnoreCase(CatalogManager.SESSION_NAMESPACE)) { - ResolvedIdentifier(FakeSystemCatalog, ident) - } else { - throw QueryCompilationErrors.unresolvedVariableError( - nameParts, Seq(CatalogManager.SYSTEM_CATALOG_NAME, CatalogManager.SESSION_NAMESPACE)) - } - } else { + + // When there are 3 nameParts the variable must be a fully qualified session variable + // i.e. "system.session.<varName>" + case 3 if nameParts(0).equalsIgnoreCase(CatalogManager.SYSTEM_CATALOG_NAME) && + nameParts(1).equalsIgnoreCase(CatalogManager.SESSION_NAMESPACE) => + ResolvedIdentifier(FakeSystemCatalog, ident) + + case _ => throw QueryCompilationErrors.unresolvedVariableError( - nameParts, Seq(CatalogManager.SYSTEM_CATALOG_NAME, CatalogManager.SESSION_NAMESPACE)) - } + nameParts, Seq(CatalogManager.SYSTEM_CATALOG_NAME, ident.namespace().head)) Review Comment: Let's check if it makes sense to throw error like this (with `SYSTEM_CATALOG_NAME`) in the case of local vars or should we create a similar error, but specific to scripting? This might imply that you can access the local var in `system.<label>.<varName>` format which is not correct. -- 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: reviews-unsubscr...@spark.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org For additional commands, e-mail: reviews-h...@spark.apache.org