@@ -3414,9 +3414,16 @@ impl<'a> Parser<'a> {
3414
3414
}
3415
3415
Keyword :: VARCHAR => Ok ( DataType :: Varchar ( self . parse_optional_precision ( ) ?) ) ,
3416
3416
Keyword :: NVARCHAR => Ok ( DataType :: Nvarchar ( self . parse_optional_precision ( ) ?) ) ,
3417
- Keyword :: CHAR | Keyword :: CHARACTER => {
3417
+ Keyword :: CHARACTER => {
3418
3418
if self . parse_keyword ( Keyword :: VARYING ) {
3419
- Ok ( DataType :: Varchar ( self . parse_optional_precision ( ) ?) )
3419
+ Ok ( DataType :: CharacterVarying ( self . parse_optional_precision ( ) ?) )
3420
+ } else {
3421
+ Ok ( DataType :: Character ( self . parse_optional_precision ( ) ?) )
3422
+ }
3423
+ }
3424
+ Keyword :: CHAR => {
3425
+ if self . parse_keyword ( Keyword :: VARYING ) {
3426
+ Ok ( DataType :: CharVarying ( self . parse_optional_precision ( ) ?) )
3420
3427
} else {
3421
3428
Ok ( DataType :: Char ( self . parse_optional_precision ( ) ?) )
3422
3429
}
@@ -5288,80 +5295,88 @@ mod tests {
5288
5295
} ) ;
5289
5296
}
5290
5297
5291
- // TODO add tests for all data types? https://github.com/sqlparser-rs/sqlparser-rs/issues/2
5292
- // TODO when we have dialect validation by data type parsing, split test
5293
- #[ test]
5294
- fn test_parse_data_type ( ) {
5295
- // BINARY data type
5296
- test_parse_data_type ( "BINARY" , DataType :: Binary ( None ) , "BINARY" ) ;
5297
- test_parse_data_type ( "BINARY(20)" , DataType :: Binary ( Some ( 20 ) ) , "BINARY(20)" ) ;
5298
-
5299
- // BLOB data type
5300
- test_parse_data_type ( "BLOB" , DataType :: Blob ( None ) , "BLOB" ) ;
5301
- test_parse_data_type ( "BLOB(50)" , DataType :: Blob ( Some ( 50 ) ) , "BLOB(50)" ) ;
5302
-
5303
- // CLOB data type
5304
- test_parse_data_type ( "CLOB" , DataType :: Clob ( None ) , "CLOB" ) ;
5305
- test_parse_data_type ( "CLOB(50)" , DataType :: Clob ( Some ( 50 ) ) , "CLOB(50)" ) ;
5306
-
5307
- // Double data type
5308
- test_parse_data_type (
5309
- "DOUBLE PRECISION" ,
5310
- DataType :: DoublePrecision ,
5311
- "DOUBLE PRECISION" ,
5312
- ) ;
5313
- test_parse_data_type ( "DOUBLE" , DataType :: Double , "DOUBLE" ) ;
5314
-
5315
- // Time data type
5316
- test_parse_data_type ( "TIME" , DataType :: Time ( TimezoneInfo :: None ) , "TIME" ) ;
5317
- test_parse_data_type (
5318
- "TIME WITH TIME ZONE" ,
5319
- DataType :: Time ( TimezoneInfo :: WithTimeZone ) ,
5320
- "TIME WITH TIME ZONE" ,
5321
- ) ;
5322
- test_parse_data_type (
5323
- "TIME WITHOUT TIME ZONE" ,
5324
- DataType :: Time ( TimezoneInfo :: WithoutTimeZone ) ,
5325
- "TIME WITHOUT TIME ZONE" ,
5326
- ) ;
5327
- test_parse_data_type ( "TIMETZ" , DataType :: Time ( TimezoneInfo :: Tz ) , "TIMETZ" ) ;
5298
+ #[ cfg( test) ]
5299
+ mod test_parse_data_type {
5300
+ use crate :: ast:: { DataType , TimezoneInfo } ;
5301
+ use crate :: dialect:: { AnsiDialect , GenericDialect } ;
5302
+ use crate :: test_utils:: TestedDialects ;
5328
5303
5329
- // Timestamp data type
5330
- test_parse_data_type (
5331
- "TIMESTAMP" ,
5332
- DataType :: Timestamp ( TimezoneInfo :: None ) ,
5333
- "TIMESTAMP" ,
5334
- ) ;
5335
- test_parse_data_type (
5336
- "TIMESTAMP WITH TIME ZONE" ,
5337
- DataType :: Timestamp ( TimezoneInfo :: WithTimeZone ) ,
5338
- "TIMESTAMP WITH TIME ZONE" ,
5339
- ) ;
5340
- test_parse_data_type (
5341
- "TIMESTAMP WITHOUT TIME ZONE" ,
5342
- DataType :: Timestamp ( TimezoneInfo :: WithoutTimeZone ) ,
5343
- "TIMESTAMP WITHOUT TIME ZONE" ,
5344
- ) ;
5345
- test_parse_data_type (
5346
- "TIMESTAMPTZ" ,
5347
- DataType :: Timestamp ( TimezoneInfo :: Tz ) ,
5348
- "TIMESTAMPTZ" ,
5349
- ) ;
5304
+ macro_rules! test_parse_data_type {
5305
+ ( $dialect: expr, $input: expr, $expected_type: expr $( , ) ?) => { {
5306
+ $dialect. run_parser_method( & * $input, |parser| {
5307
+ let data_type = parser. parse_data_type( ) . unwrap( ) ;
5308
+ assert_eq!( data_type, $expected_type) ;
5309
+ assert_eq!( data_type. to_string( ) , $input. to_string( ) ) ;
5310
+ } ) ;
5311
+ } } ;
5312
+ }
5350
5313
5351
- // VARBINARY data type
5352
- test_parse_data_type ( "VARBINARY" , DataType :: Varbinary ( None ) , "VARBINARY" ) ;
5353
- test_parse_data_type (
5354
- "VARBINARY(20)" ,
5355
- DataType :: Varbinary ( Some ( 20 ) ) ,
5356
- "VARBINARY(20)" ,
5357
- ) ;
5314
+ #[ test]
5315
+ fn test_ansii_character_string_types ( ) {
5316
+ // Character string types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-string-type>
5317
+ let dialect = TestedDialects {
5318
+ dialects : vec ! [ Box :: new( GenericDialect { } ) , Box :: new( AnsiDialect { } ) ] ,
5319
+ } ;
5358
5320
5359
- fn test_parse_data_type ( input : & str , expected_type : DataType , expected_str : & str ) {
5360
- all_dialects ( ) . run_parser_method ( input, |parser| {
5361
- let data_type = parser. parse_data_type ( ) . unwrap ( ) ;
5362
- assert_eq ! ( data_type, expected_type) ;
5363
- assert_eq ! ( expected_type. to_string( ) , expected_str. to_string( ) ) ;
5364
- } ) ;
5321
+ test_parse_data_type ! ( dialect, "CHARACTER" , DataType :: Character ( None ) ) ;
5322
+
5323
+ test_parse_data_type ! ( dialect, "CHARACTER(20)" , DataType :: Character ( Some ( 20 ) ) ) ;
5324
+
5325
+ test_parse_data_type ! ( dialect, "CHAR" , DataType :: Char ( None ) ) ;
5326
+
5327
+ test_parse_data_type ! ( dialect, "CHAR(20)" , DataType :: Char ( Some ( 20 ) ) ) ;
5328
+
5329
+ test_parse_data_type ! (
5330
+ dialect,
5331
+ "CHARACTER VARYING(20)" ,
5332
+ DataType :: CharacterVarying ( Some ( 20 ) )
5333
+ ) ;
5334
+
5335
+ test_parse_data_type ! ( dialect, "CHAR VARYING(20)" , DataType :: CharVarying ( Some ( 20 ) ) ) ;
5336
+
5337
+ test_parse_data_type ! ( dialect, "VARCHAR(20)" , DataType :: Varchar ( Some ( 20 ) ) ) ;
5338
+ }
5339
+
5340
+ #[ test]
5341
+ fn test_ansii_datetime_types ( ) {
5342
+ // Datetime types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type>
5343
+ let dialect = TestedDialects {
5344
+ dialects : vec ! [ Box :: new( GenericDialect { } ) , Box :: new( AnsiDialect { } ) ] ,
5345
+ } ;
5346
+
5347
+ test_parse_data_type ! ( dialect, "DATE" , DataType :: Date ) ;
5348
+
5349
+ test_parse_data_type ! ( dialect, "TIME" , DataType :: Time ( TimezoneInfo :: None ) ) ;
5350
+
5351
+ test_parse_data_type ! (
5352
+ dialect,
5353
+ "TIME WITH TIME ZONE" ,
5354
+ DataType :: Time ( TimezoneInfo :: WithTimeZone )
5355
+ ) ;
5356
+
5357
+ test_parse_data_type ! (
5358
+ dialect,
5359
+ "TIME WITHOUT TIME ZONE" ,
5360
+ DataType :: Time ( TimezoneInfo :: WithoutTimeZone )
5361
+ ) ;
5362
+
5363
+ test_parse_data_type ! (
5364
+ dialect,
5365
+ "TIMESTAMP" ,
5366
+ DataType :: Timestamp ( TimezoneInfo :: None )
5367
+ ) ;
5368
+
5369
+ test_parse_data_type ! (
5370
+ dialect,
5371
+ "TIMESTAMP WITH TIME ZONE" ,
5372
+ DataType :: Timestamp ( TimezoneInfo :: WithTimeZone )
5373
+ ) ;
5374
+
5375
+ test_parse_data_type ! (
5376
+ dialect,
5377
+ "TIMESTAMP WITHOUT TIME ZONE" ,
5378
+ DataType :: Timestamp ( TimezoneInfo :: WithoutTimeZone )
5379
+ ) ;
5365
5380
}
5366
5381
}
5367
5382
0 commit comments