File tree 4 files changed +37
-5
lines changed
4 files changed +37
-5
lines changed Original file line number Diff line number Diff line change @@ -77,8 +77,10 @@ pub enum DataType {
77
77
Time ,
78
78
/// Datetime
79
79
Datetime ,
80
- /// Timestamp
80
+ /// Timestamp [Without Time Zone]
81
81
Timestamp ,
82
+ /// Timestamp With Time Zone
83
+ TimestampTz ,
82
84
/// Interval
83
85
Interval ,
84
86
/// Regclass used in postgresql serial
@@ -157,6 +159,7 @@ impl fmt::Display for DataType {
157
159
DataType :: Time => write ! ( f, "TIME" ) ,
158
160
DataType :: Datetime => write ! ( f, "DATETIME" ) ,
159
161
DataType :: Timestamp => write ! ( f, "TIMESTAMP" ) ,
162
+ DataType :: TimestampTz => write ! ( f, "TIMESTAMPTZ" ) ,
160
163
DataType :: Interval => write ! ( f, "INTERVAL" ) ,
161
164
DataType :: Regclass => write ! ( f, "REGCLASS" ) ,
162
165
DataType :: Text => write ! ( f, "TEXT" ) ,
Original file line number Diff line number Diff line change @@ -505,6 +505,7 @@ define_keywords!(
505
505
TIES ,
506
506
TIME ,
507
507
TIMESTAMP ,
508
+ TIMESTAMPTZ ,
508
509
TIMEZONE ,
509
510
TIMEZONE_HOUR ,
510
511
TIMEZONE_MINUTE ,
Original file line number Diff line number Diff line change @@ -3119,12 +3119,17 @@ impl<'a> Parser<'a> {
3119
3119
Keyword :: DATE => Ok ( DataType :: Date ) ,
3120
3120
Keyword :: DATETIME => Ok ( DataType :: Datetime ) ,
3121
3121
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 ) {
3124
3123
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 )
3125
3130
}
3126
- Ok ( DataType :: Timestamp )
3127
3131
}
3132
+ Keyword :: TIMESTAMPTZ => Ok ( DataType :: TimestampTz ) ,
3128
3133
Keyword :: TIME => {
3129
3134
// TBD: we throw away "with/without timezone" information
3130
3135
if self . parse_keyword ( Keyword :: WITH ) || self . parse_keyword ( Keyword :: WITHOUT ) {
Original file line number Diff line number Diff line change @@ -2854,7 +2854,7 @@ fn parse_literal_datetime() {
2854
2854
}
2855
2855
2856
2856
#[ test]
2857
- fn parse_literal_timestamp ( ) {
2857
+ fn parse_literal_timestamp_without_time_zone ( ) {
2858
2858
let sql = "SELECT TIMESTAMP '1999-01-01 01:23:34'" ;
2859
2859
let select = verified_only_select ( sql) ;
2860
2860
assert_eq ! (
@@ -2864,6 +2864,29 @@ fn parse_literal_timestamp() {
2864
2864
} ,
2865
2865
expr_from_projection( only( & select. projection) ) ,
2866
2866
) ;
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
+ ) ;
2867
2890
}
2868
2891
2869
2892
#[ test]
You can’t perform that action at this time.
0 commit comments