static SetStatement parseSetStatement()

in src/main/java/com/google/cloud/spanner/pgadapter/statements/SessionStatementParser.java [288:341]


  static SetStatement parseSetStatement(SimpleParser parser) {
    SetStatement.Builder builder = new Builder();
    if (parser.eatKeyword("local")) {
      builder.setLocal();
    } else {
      // Ignore, this is the default.
      parser.eatKeyword("session");
    }
    TableOrIndexName name;
    boolean isAliasStatement = false;
    if (parser.eatKeyword("time", "zone")) {
      name = new TableOrIndexName("TIMEZONE");
      isAliasStatement = true;
    } else if (parser.eatKeyword("names")) {
      name = new TableOrIndexName("CLIENT_ENCODING");
      isAliasStatement = true;
    } else {
      name = parser.readTableOrIndexName();
    }
    if (name == null) {
      throw SpannerExceptionFactory.newSpannerException(
          ErrorCode.INVALID_ARGUMENT,
          "Invalid SET statement: " + parser.getSql() + ". Expected configuration parameter name.");
    }
    builder.setName(name);
    if (!isAliasStatement && !(parser.eatKeyword("to") || parser.eatToken("="))) {
      throw SpannerExceptionFactory.newSpannerException(
          ErrorCode.INVALID_ARGUMENT,
          "Invalid SET statement: " + parser.getSql() + ". Expected TO or =.");
    }
    String value = parser.parseExpression();
    if (value == null) {
      throw SpannerExceptionFactory.newSpannerException(
          ErrorCode.INVALID_ARGUMENT,
          "Invalid SET statement: " + parser.getSql() + ". Expected value.");
    }
    if ("default".equalsIgnoreCase(value)
        || (isAliasStatement && "local".equalsIgnoreCase(value))) {
      builder.setValue(null);
    } else {
      builder.setValue(value);
    }
    String remaining = parser.parseExpression();
    if (!Strings.isNullOrEmpty(remaining)) {
      throw SpannerExceptionFactory.newSpannerException(
          ErrorCode.INVALID_ARGUMENT,
          "Invalid SET statement: "
              + parser.getSql()
              + ". Expected end of statement after "
              + value);
    }

    return builder.build();
  }