private static TVFRelation inferTVFOutputSchema()

in zetasql-toolkit-bigquery/src/main/java/com/google/zetasql/toolkit/catalog/bigquery/FunctionResultTypeResolver.java [210:253]


  private static TVFRelation inferTVFOutputSchema(
      TVFInfo tvfInfo, LanguageOptions languageOptions, SimpleCatalog catalog) {

    String fullFunctionName = String.join(".", tvfInfo.getNamePath());
    String argumentDefinitions =
        tvfInfo.getSignature().getFunctionArgumentList().stream()
            .map(
                functionArgument ->
                    String.format(
                        "%s %s",
                        functionArgument.getOptions().getArgumentName(),
                        functionArgument.getType()))
            .collect(Collectors.joining(", "));

    String body =
        tvfInfo.getBody().orElseThrow(() -> new MissingFunctionResultType(fullFunctionName));

    String createStmt =
        String.format(
            "CREATE TABLE FUNCTION `%s`(%s) AS (%s)", fullFunctionName, argumentDefinitions, body);

    AnalyzerOptions analyzerOptions = new AnalyzerOptions();
    analyzerOptions.setLanguageOptions(languageOptions);

    try {
      ResolvedCreateTableFunctionStmt analyzedStatement =
          (ResolvedCreateTableFunctionStmt)
              Analyzer.analyzeStatement(createStmt, analyzerOptions, catalog);

      List<Column> outputSchemaColumns =
          analyzedStatement.getOutputColumnList().stream()
              .map(
                  resolvedOutputColumn ->
                      Column.create(
                          resolvedOutputColumn.getName(),
                          resolvedOutputColumn.getColumn().getType()))
              .collect(Collectors.toList());

      return TVFRelation.createColumnBased(outputSchemaColumns);
    } catch (SqlException sqlException) {
      throw new CouldNotInferFunctionReturnType(
          tvfInfo.getSignature(), "Failed to infer TVF output schema", sqlException);
    }
  }