Skip to content

Commit 95fbb55

Browse files
authored
add with/without time zone (#589)
1 parent 72559e9 commit 95fbb55

File tree

4 files changed

+37
-5
lines changed

4 files changed

+37
-5
lines changed

src/ast/data_type.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,10 @@ pub enum DataType {
7777
Time,
7878
/// Datetime
7979
Datetime,
80-
/// Timestamp
80+
/// Timestamp [Without Time Zone]
8181
Timestamp,
82+
/// Timestamp With Time Zone
83+
TimestampTz,
8284
/// Interval
8385
Interval,
8486
/// Regclass used in postgresql serial
@@ -157,6 +159,7 @@ impl fmt::Display for DataType {
157159
DataType::Time => write!(f, "TIME"),
158160
DataType::Datetime => write!(f, "DATETIME"),
159161
DataType::Timestamp => write!(f, "TIMESTAMP"),
162+
DataType::TimestampTz => write!(f, "TIMESTAMPTZ"),
160163
DataType::Interval => write!(f, "INTERVAL"),
161164
DataType::Regclass => write!(f, "REGCLASS"),
162165
DataType::Text => write!(f, "TEXT"),

src/keywords.rs

+1
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,7 @@ define_keywords!(
505505
TIES,
506506
TIME,
507507
TIMESTAMP,
508+
TIMESTAMPTZ,
508509
TIMEZONE,
509510
TIMEZONE_HOUR,
510511
TIMEZONE_MINUTE,

src/parser.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -3119,12 +3119,17 @@ impl<'a> Parser<'a> {
31193119
Keyword::DATE => Ok(DataType::Date),
31203120
Keyword::DATETIME => Ok(DataType::Datetime),
31213121
Keyword::TIMESTAMP => {
3122-
// TBD: we throw away "with/without timezone" information
3123-
if self.parse_keyword(Keyword::WITH) || self.parse_keyword(Keyword::WITHOUT) {
3122+
if self.parse_keyword(Keyword::WITH) {
31243123
self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
3124+
Ok(DataType::TimestampTz)
3125+
} else if self.parse_keyword(Keyword::WITHOUT) {
3126+
self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
3127+
Ok(DataType::Timestamp)
3128+
} else {
3129+
Ok(DataType::Timestamp)
31253130
}
3126-
Ok(DataType::Timestamp)
31273131
}
3132+
Keyword::TIMESTAMPTZ => Ok(DataType::TimestampTz),
31283133
Keyword::TIME => {
31293134
// TBD: we throw away "with/without timezone" information
31303135
if self.parse_keyword(Keyword::WITH) || self.parse_keyword(Keyword::WITHOUT) {

tests/sqlparser_common.rs

+24-1
Original file line numberDiff line numberDiff line change
@@ -2854,7 +2854,7 @@ fn parse_literal_datetime() {
28542854
}
28552855

28562856
#[test]
2857-
fn parse_literal_timestamp() {
2857+
fn parse_literal_timestamp_without_time_zone() {
28582858
let sql = "SELECT TIMESTAMP '1999-01-01 01:23:34'";
28592859
let select = verified_only_select(sql);
28602860
assert_eq!(
@@ -2864,6 +2864,29 @@ fn parse_literal_timestamp() {
28642864
},
28652865
expr_from_projection(only(&select.projection)),
28662866
);
2867+
2868+
one_statement_parses_to(
2869+
"SELECT TIMESTAMP WITHOUT TIME ZONE '1999-01-01 01:23:34'",
2870+
sql,
2871+
);
2872+
}
2873+
2874+
#[test]
2875+
fn parse_literal_timestamp_with_time_zone() {
2876+
let sql = "SELECT TIMESTAMPTZ '1999-01-01 01:23:34Z'";
2877+
let select = verified_only_select(sql);
2878+
assert_eq!(
2879+
&Expr::TypedString {
2880+
data_type: DataType::TimestampTz,
2881+
value: "1999-01-01 01:23:34Z".into()
2882+
},
2883+
expr_from_projection(only(&select.projection)),
2884+
);
2885+
2886+
one_statement_parses_to(
2887+
"SELECT TIMESTAMP WITH TIME ZONE '1999-01-01 01:23:34Z'",
2888+
sql,
2889+
);
28672890
}
28682891

28692892
#[test]

0 commit comments

Comments
 (0)