srielau commented on code in PR #49445: URL: https://github.com/apache/spark/pull/49445#discussion_r1913307900
########## 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: Local variables can only be qualified by a label. Label's themselves are non qualified. parameters can be qualified by the procedure name. Procedure names can be qualified. -- 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