Expression readDateTimeIntervalLiteral() { int pos = getPosition(); switch (token.tokenType) { case Tokens.DATE: { read(); if (token.tokenType != Tokens.X_VALUE || token.dataType.typeCode != Types.SQL_CHAR) { break; } String s = token.tokenString; read(); Object date = scanner.newDate(s); return new ExpressionValue(date, Type.SQL_DATE); } case Tokens.TIME: { read(); if (token.tokenType != Tokens.X_VALUE || token.dataType.typeCode != Types.SQL_CHAR) { break; } String s = token.tokenString; read(); TimeData value = scanner.newTime(s); Type dataType = scanner.dateTimeType; return new ExpressionValue(value, dataType); } case Tokens.TIMESTAMP: { read(); if (token.tokenType != Tokens.X_VALUE || token.dataType.typeCode != Types.SQL_CHAR) { break; } String s = token.tokenString; read(); Object date = scanner.newTimestamp(s); Type dataType = scanner.dateTimeType; return new ExpressionValue(date, dataType); } case Tokens.INTERVAL: { boolean minus = false; read(); if (token.tokenType == Tokens.MINUS) { read(); minus = true; } else if (token.tokenType == Tokens.PLUS) { read(); } if (token.tokenType != Tokens.X_VALUE || token.dataType.typeCode != Types.SQL_CHAR) { break; } String s = token.tokenString; read(); IntervalType dataType = readIntervalType(); Object interval = scanner.newInterval(s, dataType); dataType = (IntervalType) scanner.dateTimeType; if (minus) { interval = dataType.negate(interval); } return new ExpressionValue(interval, dataType); } default: throw Error.runtimeError(ErrorCode.U_S0500, "Parser"); } rewind(pos); return null; }