in src/main/java/com/google/cloud/spanner/pgadapter/statements/VacuumStatement.java [156:226]
static ParsedVacuumStatement parse(String sql) {
Preconditions.checkNotNull(sql);
SimpleParser parser = new SimpleParser(sql);
ParsedVacuumStatement.Builder builder = new Builder();
if (!parser.eatKeyword("vacuum")) {
throw PGExceptionFactory.newPGException("not a valid VACUUM statement: " + sql);
}
if (parser.eatToken("(")) {
List<String> options = parser.parseExpressionList();
if (!parser.eatToken(")")) {
throw PGExceptionFactory.newPGException(
"missing closing parentheses for VACUUM options list");
}
for (String option : options) {
SimpleParser optionParser = new SimpleParser(option);
if (optionParser.eatKeyword("full")) {
builder.full = readOptionalBooleanValue("full", optionParser, true);
} else if (optionParser.eatKeyword("freeze")) {
builder.freeze = readOptionalBooleanValue("freeze", optionParser, true);
} else if (optionParser.eatKeyword("verbose")) {
builder.verbose = readOptionalBooleanValue("verbose", optionParser, true);
} else if (optionParser.eatKeyword("analyze")) {
builder.analyze = readOptionalBooleanValue("analyze", optionParser, true);
} else if (optionParser.eatKeyword("disable_page_skipping")) {
builder.disablePageSkipping =
readOptionalBooleanValue("disable_page_skipping", optionParser, true);
} else if (optionParser.eatKeyword("skip_locked")) {
builder.skipLocked = readOptionalBooleanValue("skip_locked", optionParser, true);
} else if (optionParser.eatKeyword("index_cleanup")) {
if (optionParser.eatKeyword("auto")) {
builder.indexCleanup = IndexCleanup.AUTO;
} else {
boolean value = readOptionalBooleanValue("index_cleanup", optionParser, true);
builder.indexCleanup = value ? IndexCleanup.ON : IndexCleanup.OFF;
}
} else if (optionParser.eatKeyword("process_toast")) {
builder.processToast = readOptionalBooleanValue("process_toast", optionParser, true);
} else if (optionParser.eatKeyword("truncate")) {
builder.truncate = readOptionalBooleanValue("truncate", optionParser, true);
} else if (optionParser.eatKeyword("parallel")) {
String value = optionParser.parseExpression();
builder.parallel = optionParser.parseInt(value);
} else {
throw PGExceptionFactory.newPGException("Unknown option: " + option);
}
}
} else {
builder.full = parser.eatKeyword("full");
builder.freeze = parser.eatKeyword("freeze");
builder.verbose = parser.eatKeyword("verbose");
builder.analyze = parser.eatKeyword("analyze");
}
while (parser.getPos() < parser.getSql().length()) {
TableOrIndexName table = parser.readTableOrIndexName();
if (table == null) {
throw PGExceptionFactory.newPGException("Invalid table name");
}
builder.tables.add(table);
List<TableOrIndexName> columns = parser.readColumnListInParentheses(table.toString(), false);
if (columns != null) {
builder.columns.put(table, ImmutableList.copyOf(columns));
}
if (!parser.eatToken(",")) {
break;
}
}
parser.throwIfHasMoreTokens();
return new ParsedVacuumStatement(builder);
}