in src/main/user-impl/java/com/mysql/cj/xdevapi/ExprParser.java [945:984]
Expr addSubIntervalExpr() {
Expr lhs = atomicExpr();
while ((currentTokenTypeEquals(TokenType.PLUS) || currentTokenTypeEquals(TokenType.MINUS)) && nextTokenTypeEquals(TokenType.INTERVAL)) {
Token op = this.tokens.get(this.tokenPos);
this.tokenPos++;
Operator.Builder builder = Operator.newBuilder().addParam(lhs);
// INTERVAL expression
consumeToken(TokenType.INTERVAL);
if (op.type == TokenType.PLUS) {
builder.setName("date_add");
} else {
builder.setName("date_sub");
}
builder.addParam(bitExpr()); // amount
// ensure next token is an interval unit
if (currentTokenTypeEquals(TokenType.MICROSECOND) || currentTokenTypeEquals(TokenType.SECOND) || currentTokenTypeEquals(TokenType.MINUTE)
|| currentTokenTypeEquals(TokenType.HOUR) || currentTokenTypeEquals(TokenType.DAY) || currentTokenTypeEquals(TokenType.WEEK)
|| currentTokenTypeEquals(TokenType.MONTH) || currentTokenTypeEquals(TokenType.QUARTER) || currentTokenTypeEquals(TokenType.YEAR)
|| currentTokenTypeEquals(TokenType.SECOND_MICROSECOND) || currentTokenTypeEquals(TokenType.MINUTE_MICROSECOND)
|| currentTokenTypeEquals(TokenType.MINUTE_SECOND) || currentTokenTypeEquals(TokenType.HOUR_MICROSECOND)
|| currentTokenTypeEquals(TokenType.HOUR_SECOND) || currentTokenTypeEquals(TokenType.HOUR_MINUTE)
|| currentTokenTypeEquals(TokenType.DAY_MICROSECOND) || currentTokenTypeEquals(TokenType.DAY_SECOND)
|| currentTokenTypeEquals(TokenType.DAY_MINUTE) || currentTokenTypeEquals(TokenType.DAY_HOUR)
|| currentTokenTypeEquals(TokenType.YEAR_MONTH)) {
} else {
throw new WrongArgumentException("Expected interval units at " + this.tokenPos);
}
// xplugin demands that intervals be sent uppercase
// TODO: we need to propagate the appropriate encoding here? it's ascii but it might not *always* be a superset encoding??
builder.addParam(ExprUtil.buildLiteralScalar(this.tokens.get(this.tokenPos).value.toUpperCase().getBytes()));
this.tokenPos++;
lhs = Expr.newBuilder().setType(Expr.Type.OPERATOR).setOperator(builder.build()).build();
}
return lhs;
}