@@ -3412,22 +3412,27 @@ impl<'a> Parser<'a> {
3412
3412
Keyword :: TIMESTAMP => {
3413
3413
if self . parse_keyword ( Keyword :: WITH ) {
3414
3414
self . expect_keywords ( & [ Keyword :: TIME , Keyword :: ZONE ] ) ?;
3415
- Ok ( DataType :: TimestampTz )
3415
+ Ok ( DataType :: Timestamp ( TimezoneInfo :: WithTimeZone ) )
3416
3416
} else if self . parse_keyword ( Keyword :: WITHOUT ) {
3417
3417
self . expect_keywords ( & [ Keyword :: TIME , Keyword :: ZONE ] ) ?;
3418
- Ok ( DataType :: Timestamp )
3418
+ Ok ( DataType :: Timestamp ( TimezoneInfo :: WithoutTimeZone ) )
3419
3419
} else {
3420
- Ok ( DataType :: Timestamp )
3420
+ Ok ( DataType :: Timestamp ( TimezoneInfo :: None ) )
3421
3421
}
3422
3422
}
3423
- Keyword :: TIMESTAMPTZ => Ok ( DataType :: TimestampTz ) ,
3423
+ Keyword :: TIMESTAMPTZ => Ok ( DataType :: Timestamp ( TimezoneInfo :: Tz ) ) ,
3424
3424
Keyword :: TIME => {
3425
- // TBD: we throw away "with/without timezone" information
3426
- if self . parse_keyword ( Keyword :: WITH ) || self . parse_keyword ( Keyword :: WITHOUT ) {
3425
+ if self . parse_keyword ( Keyword :: WITH ) {
3426
+ self . expect_keywords ( & [ Keyword :: TIME , Keyword :: ZONE ] ) ?;
3427
+ Ok ( DataType :: Time ( TimezoneInfo :: WithTimeZone ) )
3428
+ } else if self . parse_keyword ( Keyword :: WITHOUT ) {
3427
3429
self . expect_keywords ( & [ Keyword :: TIME , Keyword :: ZONE ] ) ?;
3430
+ Ok ( DataType :: Time ( TimezoneInfo :: WithoutTimeZone ) )
3431
+ } else {
3432
+ Ok ( DataType :: Time ( TimezoneInfo :: None ) )
3428
3433
}
3429
- Ok ( DataType :: Time )
3430
3434
}
3435
+ Keyword :: TIMETZ => Ok ( DataType :: Time ( TimezoneInfo :: Tz ) ) ,
3431
3436
// Interval types can be followed by a complicated interval
3432
3437
// qualifier that we don't currently support. See
3433
3438
// parse_interval for a taste.
@@ -5265,23 +5270,78 @@ mod tests {
5265
5270
}
5266
5271
5267
5272
// TODO add tests for all data types? https://github.com/sqlparser-rs/sqlparser-rs/issues/2
5273
+ // TODO when we have dialect validation by data type parsing, split test
5268
5274
#[ test]
5269
5275
fn test_parse_data_type ( ) {
5270
- test_parse_data_type ( "BLOB" , "BLOB" ) ;
5271
- test_parse_data_type ( "BLOB(50)" , "BLOB(50)" ) ;
5272
- test_parse_data_type ( "CLOB" , "CLOB" ) ;
5273
- test_parse_data_type ( "CLOB(50)" , "CLOB(50)" ) ;
5274
- test_parse_data_type ( "DOUBLE PRECISION" , "DOUBLE PRECISION" ) ;
5275
- test_parse_data_type ( "DOUBLE" , "DOUBLE" ) ;
5276
- test_parse_data_type ( "VARBINARY" , "VARBINARY" ) ;
5277
- test_parse_data_type ( "VARBINARY(20)" , "VARBINARY(20)" ) ;
5278
- test_parse_data_type ( "BINARY" , "BINARY" ) ;
5279
- test_parse_data_type ( "BINARY(20)" , "BINARY(20)" ) ;
5280
-
5281
- fn test_parse_data_type ( input : & str , expected : & str ) {
5276
+ // BINARY data type
5277
+ test_parse_data_type ( "BINARY" , DataType :: Binary ( None ) , "BINARY" ) ;
5278
+ test_parse_data_type ( "BINARY(20)" , DataType :: Binary ( Some ( 20 ) ) , "BINARY(20)" ) ;
5279
+
5280
+ // BLOB data type
5281
+ test_parse_data_type ( "BLOB" , DataType :: Blob ( None ) , "BLOB" ) ;
5282
+ test_parse_data_type ( "BLOB(50)" , DataType :: Blob ( Some ( 50 ) ) , "BLOB(50)" ) ;
5283
+
5284
+ // CLOB data type
5285
+ test_parse_data_type ( "CLOB" , DataType :: Clob ( None ) , "CLOB" ) ;
5286
+ test_parse_data_type ( "CLOB(50)" , DataType :: Clob ( Some ( 50 ) ) , "CLOB(50)" ) ;
5287
+
5288
+ // Double data type
5289
+ test_parse_data_type (
5290
+ "DOUBLE PRECISION" ,
5291
+ DataType :: DoublePrecision ,
5292
+ "DOUBLE PRECISION" ,
5293
+ ) ;
5294
+ test_parse_data_type ( "DOUBLE" , DataType :: Double , "DOUBLE" ) ;
5295
+
5296
+ // Time data type
5297
+ test_parse_data_type ( "TIME" , DataType :: Time ( TimezoneInfo :: None ) , "TIME" ) ;
5298
+ test_parse_data_type (
5299
+ "TIME WITH TIME ZONE" ,
5300
+ DataType :: Time ( TimezoneInfo :: WithTimeZone ) ,
5301
+ "TIME WITH TIME ZONE" ,
5302
+ ) ;
5303
+ test_parse_data_type (
5304
+ "TIME WITHOUT TIME ZONE" ,
5305
+ DataType :: Time ( TimezoneInfo :: WithoutTimeZone ) ,
5306
+ "TIME WITHOUT TIME ZONE" ,
5307
+ ) ;
5308
+ test_parse_data_type ( "TIMETZ" , DataType :: Time ( TimezoneInfo :: Tz ) , "TIMETZ" ) ;
5309
+
5310
+ // Timestamp data type
5311
+ test_parse_data_type (
5312
+ "TIMESTAMP" ,
5313
+ DataType :: Timestamp ( TimezoneInfo :: None ) ,
5314
+ "TIMESTAMP" ,
5315
+ ) ;
5316
+ test_parse_data_type (
5317
+ "TIMESTAMP WITH TIME ZONE" ,
5318
+ DataType :: Timestamp ( TimezoneInfo :: WithTimeZone ) ,
5319
+ "TIMESTAMP WITH TIME ZONE" ,
5320
+ ) ;
5321
+ test_parse_data_type (
5322
+ "TIMESTAMP WITHOUT TIME ZONE" ,
5323
+ DataType :: Timestamp ( TimezoneInfo :: WithoutTimeZone ) ,
5324
+ "TIMESTAMP WITHOUT TIME ZONE" ,
5325
+ ) ;
5326
+ test_parse_data_type (
5327
+ "TIMESTAMPTZ" ,
5328
+ DataType :: Timestamp ( TimezoneInfo :: Tz ) ,
5329
+ "TIMESTAMPTZ" ,
5330
+ ) ;
5331
+
5332
+ // VARBINARY data type
5333
+ test_parse_data_type ( "VARBINARY" , DataType :: Varbinary ( None ) , "VARBINARY" ) ;
5334
+ test_parse_data_type (
5335
+ "VARBINARY(20)" ,
5336
+ DataType :: Varbinary ( Some ( 20 ) ) ,
5337
+ "VARBINARY(20)" ,
5338
+ ) ;
5339
+
5340
+ fn test_parse_data_type ( input : & str , expected_type : DataType , expected_str : & str ) {
5282
5341
all_dialects ( ) . run_parser_method ( input, |parser| {
5283
- let data_type = parser. parse_data_type ( ) . unwrap ( ) . to_string ( ) ;
5284
- assert_eq ! ( data_type, expected) ;
5342
+ let data_type = parser. parse_data_type ( ) . unwrap ( ) ;
5343
+ assert_eq ! ( data_type, expected_type) ;
5344
+ assert_eq ! ( expected_type. to_string( ) , expected_str. to_string( ) ) ;
5285
5345
} ) ;
5286
5346
}
5287
5347
}
0 commit comments