static ParsedVacuumStatement parse()

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