private static FunctionSignature resolveReturnTypeForFunctionSignature()

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);
    }
  }