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