add with/without time zone (#589)

This commit is contained in:
Wei-Ting Kuo 2022-08-27 05:11:21 +08:00 committed by GitHub
parent 72559e9b62
commit 95fbb55f2c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 5 deletions

View file

@ -77,8 +77,10 @@ pub enum DataType {
Time, Time,
/// Datetime /// Datetime
Datetime, Datetime,
/// Timestamp /// Timestamp [Without Time Zone]
Timestamp, Timestamp,
/// Timestamp With Time Zone
TimestampTz,
/// Interval /// Interval
Interval, Interval,
/// Regclass used in postgresql serial /// Regclass used in postgresql serial
@ -157,6 +159,7 @@ impl fmt::Display for DataType {
DataType::Time => write!(f, "TIME"), DataType::Time => write!(f, "TIME"),
DataType::Datetime => write!(f, "DATETIME"), DataType::Datetime => write!(f, "DATETIME"),
DataType::Timestamp => write!(f, "TIMESTAMP"), DataType::Timestamp => write!(f, "TIMESTAMP"),
DataType::TimestampTz => write!(f, "TIMESTAMPTZ"),
DataType::Interval => write!(f, "INTERVAL"), DataType::Interval => write!(f, "INTERVAL"),
DataType::Regclass => write!(f, "REGCLASS"), DataType::Regclass => write!(f, "REGCLASS"),
DataType::Text => write!(f, "TEXT"), DataType::Text => write!(f, "TEXT"),

View file

@ -505,6 +505,7 @@ define_keywords!(
TIES, TIES,
TIME, TIME,
TIMESTAMP, TIMESTAMP,
TIMESTAMPTZ,
TIMEZONE, TIMEZONE,
TIMEZONE_HOUR, TIMEZONE_HOUR,
TIMEZONE_MINUTE, TIMEZONE_MINUTE,

View file

@ -3119,12 +3119,17 @@ impl<'a> Parser<'a> {
Keyword::DATE => Ok(DataType::Date), Keyword::DATE => Ok(DataType::Date),
Keyword::DATETIME => Ok(DataType::Datetime), Keyword::DATETIME => Ok(DataType::Datetime),
Keyword::TIMESTAMP => { Keyword::TIMESTAMP => {
// TBD: we throw away "with/without timezone" information if self.parse_keyword(Keyword::WITH) {
if self.parse_keyword(Keyword::WITH) || self.parse_keyword(Keyword::WITHOUT) {
self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?; self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
Ok(DataType::TimestampTz)
} else if self.parse_keyword(Keyword::WITHOUT) {
self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
Ok(DataType::Timestamp)
} else {
Ok(DataType::Timestamp)
} }
Ok(DataType::Timestamp)
} }
Keyword::TIMESTAMPTZ => Ok(DataType::TimestampTz),
Keyword::TIME => { Keyword::TIME => {
// TBD: we throw away "with/without timezone" information // TBD: we throw away "with/without timezone" information
if self.parse_keyword(Keyword::WITH) || self.parse_keyword(Keyword::WITHOUT) { if self.parse_keyword(Keyword::WITH) || self.parse_keyword(Keyword::WITHOUT) {

View file

@ -2854,7 +2854,7 @@ fn parse_literal_datetime() {
} }
#[test] #[test]
fn parse_literal_timestamp() { fn parse_literal_timestamp_without_time_zone() {
let sql = "SELECT TIMESTAMP '1999-01-01 01:23:34'"; let sql = "SELECT TIMESTAMP '1999-01-01 01:23:34'";
let select = verified_only_select(sql); let select = verified_only_select(sql);
assert_eq!( assert_eq!(
@ -2864,6 +2864,29 @@ fn parse_literal_timestamp() {
}, },
expr_from_projection(only(&select.projection)), expr_from_projection(only(&select.projection)),
); );
one_statement_parses_to(
"SELECT TIMESTAMP WITHOUT TIME ZONE '1999-01-01 01:23:34'",
sql,
);
}
#[test]
fn parse_literal_timestamp_with_time_zone() {
let sql = "SELECT TIMESTAMPTZ '1999-01-01 01:23:34Z'";
let select = verified_only_select(sql);
assert_eq!(
&Expr::TypedString {
data_type: DataType::TimestampTz,
value: "1999-01-01 01:23:34Z".into()
},
expr_from_projection(only(&select.projection)),
);
one_statement_parses_to(
"SELECT TIMESTAMP WITH TIME ZONE '1999-01-01 01:23:34Z'",
sql,
);
} }
#[test] #[test]