Skip to content

Commit a71d038

Browse files
waitingkuoovr
authored andcommitted
add with/without time zone (apache#589)
1 parent a65390c commit a71d038

File tree

5 files changed

+43
-10
lines changed

5 files changed

+43
-10
lines changed

src/ast/data_type.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@ pub enum DataType {
5353
Date,
5454
/// Time
5555
Time,
56-
/// Timestamp
56+
/// Timestamp [Without Time Zone]
5757
Timestamp,
58+
/// Timestamp With Time Zone
59+
TimestampTz,
5860
/// Interval
5961
Interval,
6062
/// Regclass used in postgresql serial
@@ -100,6 +102,7 @@ impl fmt::Display for DataType {
100102
DataType::Date => write!(f, "DATE"),
101103
DataType::Time => write!(f, "TIME"),
102104
DataType::Timestamp => write!(f, "TIMESTAMP"),
105+
DataType::TimestampTz => write!(f, "TIMESTAMPTZ"),
103106
DataType::Interval => write!(f, "INTERVAL"),
104107
DataType::Regclass => write!(f, "REGCLASS"),
105108
DataType::Text => write!(f, "TEXT"),

src/dialect/keywords.rs

+2
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,8 @@ define_keywords!(
445445
TIES,
446446
TIME,
447447
TIMESTAMP,
448+
TIMESTAMPTZ,
449+
TIMEZONE,
448450
TIMEZONE_HOUR,
449451
TIMEZONE_MINUTE,
450452
TO,

src/parser.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -2024,12 +2024,17 @@ impl<'a> Parser<'a> {
20242024
Keyword::UUID => Ok(DataType::Uuid),
20252025
Keyword::DATE => Ok(DataType::Date),
20262026
Keyword::TIMESTAMP => {
2027-
// TBD: we throw away "with/without timezone" information
2028-
if self.parse_keyword(Keyword::WITH) || self.parse_keyword(Keyword::WITHOUT) {
2027+
if self.parse_keyword(Keyword::WITH) {
20292028
self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
2029+
Ok(DataType::TimestampTz)
2030+
} else if self.parse_keyword(Keyword::WITHOUT) {
2031+
self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
2032+
Ok(DataType::Timestamp)
2033+
} else {
2034+
Ok(DataType::Timestamp)
20302035
}
2031-
Ok(DataType::Timestamp)
20322036
}
2037+
Keyword::TIMESTAMPTZ => Ok(DataType::TimestampTz),
20332038
Keyword::TIME => {
20342039
// TBD: we throw away "with/without timezone" information
20352040
if self.parse_keyword(Keyword::WITH) || self.parse_keyword(Keyword::WITHOUT) {

src/tokenizer.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ impl<'a> Tokenizer<'a> {
616616
'r' => s.push('\r'),
617617
't' => s.push('\t'),
618618
'Z' => s.push('\x1a'),
619-
x => s.push(x)
619+
x => s.push(x),
620620
}
621621
}
622622
}

tests/sqlparser_common.rs

+28-5
Original file line numberDiff line numberDiff line change
@@ -1893,7 +1893,7 @@ fn parse_literal_time() {
18931893
}
18941894

18951895
#[test]
1896-
fn parse_literal_timestamp() {
1896+
fn parse_literal_timestamp_without_time_zone() {
18971897
let sql = "SELECT TIMESTAMP '1999-01-01 01:23:34'";
18981898
let select = verified_only_select(sql);
18991899
assert_eq!(
@@ -1903,6 +1903,29 @@ fn parse_literal_timestamp() {
19031903
},
19041904
expr_from_projection(only(&select.projection)),
19051905
);
1906+
1907+
one_statement_parses_to(
1908+
"SELECT TIMESTAMP WITHOUT TIME ZONE '1999-01-01 01:23:34'",
1909+
sql,
1910+
);
1911+
}
1912+
1913+
#[test]
1914+
fn parse_literal_timestamp_with_time_zone() {
1915+
let sql = "SELECT TIMESTAMPTZ '1999-01-01 01:23:34Z'";
1916+
let select = verified_only_select(sql);
1917+
assert_eq!(
1918+
&Expr::TypedString {
1919+
data_type: DataType::TimestampTz,
1920+
value: "1999-01-01 01:23:34Z".into()
1921+
},
1922+
expr_from_projection(only(&select.projection)),
1923+
);
1924+
1925+
one_statement_parses_to(
1926+
"SELECT TIMESTAMP WITH TIME ZONE '1999-01-01 01:23:34Z'",
1927+
sql,
1928+
);
19061929
}
19071930

19081931
#[test]
@@ -2715,10 +2738,10 @@ fn parse_scalar_subqueries() {
27152738
assert_matches!(
27162739
verified_expr(sql),
27172740
Expr::BinaryOp {
2718-
op: BinaryOperator::Plus, ..
2719-
//left: box Subquery { .. },
2720-
//right: box Subquery { .. },
2721-
}
2741+
op: BinaryOperator::Plus,
2742+
.. //left: box Subquery { .. },
2743+
//right: box Subquery { .. },
2744+
}
27222745
);
27232746
}
27242747

0 commit comments

Comments
 (0)