in samza-sql/src/main/java/org/apache/samza/sql/planner/SamzaSqlValidator.java [341:401]
public static String formatErrorString(String query, Exception e) {
Pattern pattern = Pattern.compile("line [0-9]+, column [0-9]+");
Matcher matcher = pattern.matcher(e.getMessage());
String[] queryLines = query.split("\\n");
StringBuilder result = new StringBuilder();
int startColIdx;
int endColIdx;
int startLineIdx;
int endLineIdx;
try {
if (matcher.find()) {
String match = matcher.group();
LOG.info(match);
startLineIdx = getIdxFromString(match, "line ");
startColIdx = getIdxFromString(match, "column ");
if (matcher.find()) {
match = matcher.group();
LOG.info(match);
endLineIdx = getIdxFromString(match, "line ");
endColIdx = getIdxFromString(match, "column ");
} else {
endColIdx = startColIdx;
endLineIdx = startLineIdx;
}
int lineLen = endLineIdx - startLineIdx;
int colLen = endColIdx - startColIdx + 1;
// Error spanning across multiple lines is not supported yet.
if (lineLen > 0) {
throw new SamzaException("lineLen formatting validation error: error cannot span across multiple lines.");
}
int lineIdx = 0;
for (String line : queryLines) {
result.append(line)
.append("\n");
if (lineIdx == startLineIdx) {
String lineStr = getStringWithRepeatedChars('-', line.length() - 1);
String pointerStr = getStringWithRepeatedChars('^', colLen);
String errorMarkerStr =
new StringBuilder(lineStr).replace(startColIdx, endColIdx, pointerStr).toString();
result.append(errorMarkerStr)
.append("\n");
}
lineIdx++;
}
}
String[] errorMsgParts = e.getMessage().split("Exception:");
result.append("\n")
.append(errorMsgParts[errorMsgParts.length - 1].trim());
return String.format("Sql syntax error:\n\n%s\n",
result);
} catch (Exception ex) {
// Ignore any formatting errors.
LOG.error("Formatting error (Not the actual error. Look for the logs for actual error)", ex);
return String.format("Failed with formatting exception (not the actual error) for the following sql"
+ " statement:\n\"%s\"\n\n%s", query, e.getMessage());
}
}