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