in tools/automatic_query_fixer/src/main/java/com/google/cloud/bigquery/utils/queryfixer/errors/NoMatchingSignatureError.java [60:99]
public static NoMatchingSignatureError parse(BigQueryException exception) {
String errorMessage = exception.getMessage();
List<String> contents = PatternMatcher.extract(errorMessage, ERROR_MESSAGE_REGEX);
if (contents == null) {
return null;
}
String functionName = contents.get(0);
List<ArgumentType> argumentTypes;
// Parse the actual input types. It should look like TYPE[, TYPE, ...]
if (contents.get(2) == null) {
// The function input is empty.
argumentTypes = ImmutableList.of();
} else {
Signature signature = parseArgumentTypes(contents.get(2));
// Cannot read the input arguments from the error message, so unable to generate the error.
if (signature == null) {
return null;
}
argumentTypes = signature.required;
}
List<Signature> signatures = new ArrayList<>();
for (String signatureStr : contents.get(3).split("; ")) {
String signatureBodyRegex = String.format("^%s\\((.*)\\)$", functionName);
List<String> matchedSignature = PatternMatcher.extract(signatureStr, signatureBodyRegex);
if (matchedSignature == null) {
return null;
}
// The regex guarantee matchedSignature.get(0) always exists.
String signatureBody = matchedSignature.get(0);
signatures.add(parseArgumentTypes(signatureBody));
}
Position position = PatternMatcher.extractPosition(contents.get(4));
return new NoMatchingSignatureError(
functionName, argumentTypes, signatures, position, exception);
}