in zetasql-toolkit-bigquery/src/main/java/com/google/zetasql/toolkit/catalog/bigquery/FunctionResultTypeResolver.java [119:158]
private static FunctionSignature resolveReturnTypeForFunctionSignature(
FunctionSignature signature,
FunctionInfo function,
LanguageOptions languageOptions,
SimpleCatalog catalog) {
FunctionArgumentType originalReturn = signature.getResultType();
boolean returnIsArbitrary =
originalReturn.getKind().equals(SignatureArgumentKind.ARG_TYPE_ARBITRARY);
boolean returnIsFixed = originalReturn.getKind().equals(SignatureArgumentKind.ARG_TYPE_FIXED);
boolean returnTypeIsNull = originalReturn.getType() == null;
boolean returnIsUnknown = returnIsFixed && returnTypeIsNull;
boolean shouldInferReturnType = returnIsArbitrary || returnIsUnknown;
if (!shouldInferReturnType) {
return signature;
}
// The return type in unknown, try to infer it
FunctionInfo.Language language =
function.getLanguage().orElse(FunctionInfo.Language.LANGUAGE_UNSPECIFIED);
if (!language.equals(FunctionInfo.Language.SQL)) {
throw new MissingFunctionResultType(function.getNamePath());
}
String body =
function.getBody().orElseThrow(() -> new MissingFunctionResultType(function.getNamePath()));
try {
FunctionArgumentType inferredReturnType =
FunctionResultTypeResolver.inferFunctionReturnType(
signature, body, languageOptions, catalog);
return new FunctionSignature(
inferredReturnType, signature.getFunctionArgumentList(), signature.getContextId());
} catch (CouldNotInferFunctionReturnType err) {
throw new MissingFunctionResultType(function.getNamePath(), err);
}
}