mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-09-26 15:39:12 +00:00
add with/without time zone (#589)
This commit is contained in:
parent
72559e9b62
commit
95fbb55f2c
4 changed files with 37 additions and 5 deletions
|
@ -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"),
|
||||||
|
|
|
@ -505,6 +505,7 @@ define_keywords!(
|
||||||
TIES,
|
TIES,
|
||||||
TIME,
|
TIME,
|
||||||
TIMESTAMP,
|
TIMESTAMP,
|
||||||
|
TIMESTAMPTZ,
|
||||||
TIMEZONE,
|
TIMEZONE,
|
||||||
TIMEZONE_HOUR,
|
TIMEZONE_HOUR,
|
||||||
TIMEZONE_MINUTE,
|
TIMEZONE_MINUTE,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue