Skip to content

Commit a015734

Browse files
committed
Merge branch 'main' into for_json
2 parents dbb7c33 + ff8312b commit a015734

File tree

5 files changed

+63
-39
lines changed

5 files changed

+63
-39
lines changed

src/ast/data_type.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -518,18 +518,29 @@ impl fmt::Display for ExactNumberInfo {
518518
#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
519519
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
520520
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
521-
pub struct CharacterLength {
522-
/// Default (if VARYING) or maximum (if not VARYING) length
523-
pub length: u64,
524-
/// Optional unit. If not informed, the ANSI handles it as CHARACTERS implicitly
525-
pub unit: Option<CharLengthUnits>,
521+
pub enum CharacterLength {
522+
IntegerLength {
523+
/// Default (if VARYING) or maximum (if not VARYING) length
524+
length: u64,
525+
/// Optional unit. If not informed, the ANSI handles it as CHARACTERS implicitly
526+
unit: Option<CharLengthUnits>,
527+
},
528+
/// VARCHAR(MAX) or NVARCHAR(MAX), used in T-SQL (Miscrosoft SQL Server)
529+
Max,
526530
}
527531

528532
impl fmt::Display for CharacterLength {
529533
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
530-
write!(f, "{}", self.length)?;
531-
if let Some(unit) = &self.unit {
532-
write!(f, " {unit}")?;
534+
match self {
535+
CharacterLength::IntegerLength { length, unit } => {
536+
write!(f, "{}", length)?;
537+
if let Some(unit) = unit {
538+
write!(f, " {unit}")?;
539+
}
540+
}
541+
CharacterLength::Max => {
542+
write!(f, "MAX")?;
543+
}
533544
}
534545
Ok(())
535546
}

src/parser/mod.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5617,6 +5617,9 @@ impl<'a> Parser<'a> {
56175617
}
56185618

56195619
pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
5620+
if self.parse_keyword(Keyword::MAX) {
5621+
return Ok(CharacterLength::Max);
5622+
}
56205623
let length = self.parse_literal_uint()?;
56215624
let unit = if self.parse_keyword(Keyword::CHARACTERS) {
56225625
Some(CharLengthUnits::Characters)
@@ -5625,8 +5628,7 @@ impl<'a> Parser<'a> {
56255628
} else {
56265629
None
56275630
};
5628-
5629-
Ok(CharacterLength { length, unit })
5631+
Ok(CharacterLength::IntegerLength { length, unit })
56305632
}
56315633

56325634
pub fn parse_optional_precision_scale(
@@ -8222,7 +8224,7 @@ mod tests {
82228224
test_parse_data_type!(
82238225
dialect,
82248226
"CHARACTER(20)",
8225-
DataType::Character(Some(CharacterLength {
8227+
DataType::Character(Some(CharacterLength::IntegerLength {
82268228
length: 20,
82278229
unit: None
82288230
}))
@@ -8231,7 +8233,7 @@ mod tests {
82318233
test_parse_data_type!(
82328234
dialect,
82338235
"CHARACTER(20 CHARACTERS)",
8234-
DataType::Character(Some(CharacterLength {
8236+
DataType::Character(Some(CharacterLength::IntegerLength {
82358237
length: 20,
82368238
unit: Some(CharLengthUnits::Characters)
82378239
}))
@@ -8240,7 +8242,7 @@ mod tests {
82408242
test_parse_data_type!(
82418243
dialect,
82428244
"CHARACTER(20 OCTETS)",
8243-
DataType::Character(Some(CharacterLength {
8245+
DataType::Character(Some(CharacterLength::IntegerLength {
82448246
length: 20,
82458247
unit: Some(CharLengthUnits::Octets)
82468248
}))
@@ -8251,7 +8253,7 @@ mod tests {
82518253
test_parse_data_type!(
82528254
dialect,
82538255
"CHAR(20)",
8254-
DataType::Char(Some(CharacterLength {
8256+
DataType::Char(Some(CharacterLength::IntegerLength {
82558257
length: 20,
82568258
unit: None
82578259
}))
@@ -8260,7 +8262,7 @@ mod tests {
82608262
test_parse_data_type!(
82618263
dialect,
82628264
"CHAR(20 CHARACTERS)",
8263-
DataType::Char(Some(CharacterLength {
8265+
DataType::Char(Some(CharacterLength::IntegerLength {
82648266
length: 20,
82658267
unit: Some(CharLengthUnits::Characters)
82668268
}))
@@ -8269,7 +8271,7 @@ mod tests {
82698271
test_parse_data_type!(
82708272
dialect,
82718273
"CHAR(20 OCTETS)",
8272-
DataType::Char(Some(CharacterLength {
8274+
DataType::Char(Some(CharacterLength::IntegerLength {
82738275
length: 20,
82748276
unit: Some(CharLengthUnits::Octets)
82758277
}))
@@ -8278,7 +8280,7 @@ mod tests {
82788280
test_parse_data_type!(
82798281
dialect,
82808282
"CHARACTER VARYING(20)",
8281-
DataType::CharacterVarying(Some(CharacterLength {
8283+
DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
82828284
length: 20,
82838285
unit: None
82848286
}))
@@ -8287,7 +8289,7 @@ mod tests {
82878289
test_parse_data_type!(
82888290
dialect,
82898291
"CHARACTER VARYING(20 CHARACTERS)",
8290-
DataType::CharacterVarying(Some(CharacterLength {
8292+
DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
82918293
length: 20,
82928294
unit: Some(CharLengthUnits::Characters)
82938295
}))
@@ -8296,7 +8298,7 @@ mod tests {
82968298
test_parse_data_type!(
82978299
dialect,
82988300
"CHARACTER VARYING(20 OCTETS)",
8299-
DataType::CharacterVarying(Some(CharacterLength {
8301+
DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
83008302
length: 20,
83018303
unit: Some(CharLengthUnits::Octets)
83028304
}))
@@ -8305,7 +8307,7 @@ mod tests {
83058307
test_parse_data_type!(
83068308
dialect,
83078309
"CHAR VARYING(20)",
8308-
DataType::CharVarying(Some(CharacterLength {
8310+
DataType::CharVarying(Some(CharacterLength::IntegerLength {
83098311
length: 20,
83108312
unit: None
83118313
}))
@@ -8314,7 +8316,7 @@ mod tests {
83148316
test_parse_data_type!(
83158317
dialect,
83168318
"CHAR VARYING(20 CHARACTERS)",
8317-
DataType::CharVarying(Some(CharacterLength {
8319+
DataType::CharVarying(Some(CharacterLength::IntegerLength {
83188320
length: 20,
83198321
unit: Some(CharLengthUnits::Characters)
83208322
}))
@@ -8323,7 +8325,7 @@ mod tests {
83238325
test_parse_data_type!(
83248326
dialect,
83258327
"CHAR VARYING(20 OCTETS)",
8326-
DataType::CharVarying(Some(CharacterLength {
8328+
DataType::CharVarying(Some(CharacterLength::IntegerLength {
83278329
length: 20,
83288330
unit: Some(CharLengthUnits::Octets)
83298331
}))
@@ -8332,7 +8334,7 @@ mod tests {
83328334
test_parse_data_type!(
83338335
dialect,
83348336
"VARCHAR(20)",
8335-
DataType::Varchar(Some(CharacterLength {
8337+
DataType::Varchar(Some(CharacterLength::IntegerLength {
83368338
length: 20,
83378339
unit: None
83388340
}))

tests/sqlparser_common.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2382,7 +2382,7 @@ fn parse_create_table() {
23822382
vec![
23832383
ColumnDef {
23842384
name: "name".into(),
2385-
data_type: DataType::Varchar(Some(CharacterLength {
2385+
data_type: DataType::Varchar(Some(CharacterLength::IntegerLength {
23862386
length: 100,
23872387
unit: None,
23882388
})),
@@ -2932,7 +2932,7 @@ fn parse_create_external_table() {
29322932
vec![
29332933
ColumnDef {
29342934
name: "name".into(),
2935-
data_type: DataType::Varchar(Some(CharacterLength {
2935+
data_type: DataType::Varchar(Some(CharacterLength::IntegerLength {
29362936
length: 100,
29372937
unit: None,
29382938
})),
@@ -3003,7 +3003,7 @@ fn parse_create_or_replace_external_table() {
30033003
columns,
30043004
vec![ColumnDef {
30053005
name: "name".into(),
3006-
data_type: DataType::Varchar(Some(CharacterLength {
3006+
data_type: DataType::Varchar(Some(CharacterLength::IntegerLength {
30073007
length: 100,
30083008
unit: None,
30093009
})),

tests/sqlparser_mssql.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ fn parse_create_procedure() {
128128
value: "@bar".into(),
129129
quote_style: None
130130
},
131-
data_type: DataType::Varchar(Some(CharacterLength {
131+
data_type: DataType::Varchar(Some(CharacterLength::IntegerLength {
132132
length: 256,
133133
unit: None
134134
}))
@@ -470,6 +470,11 @@ fn parse_for_json_expect_ast() {
470470
);
471471
}
472472

473+
#[test]
474+
fn parse_cast_varchar_max() {
475+
ms_and_generic().verified_expr("CAST('foo' AS VARCHAR(MAX))");
476+
}
477+
473478
#[test]
474479
fn parse_similar_to() {
475480
fn chk(negated: bool) {

tests/sqlparser_postgres.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -349,10 +349,12 @@ fn parse_create_table_with_defaults() {
349349
},
350350
ColumnDef {
351351
name: "first_name".into(),
352-
data_type: DataType::CharacterVarying(Some(CharacterLength {
353-
length: 45,
354-
unit: None
355-
})),
352+
data_type: DataType::CharacterVarying(Some(
353+
CharacterLength::IntegerLength {
354+
length: 45,
355+
unit: None
356+
}
357+
)),
356358
collation: None,
357359
options: vec![ColumnOptionDef {
358360
name: None,
@@ -361,10 +363,12 @@ fn parse_create_table_with_defaults() {
361363
},
362364
ColumnDef {
363365
name: "last_name".into(),
364-
data_type: DataType::CharacterVarying(Some(CharacterLength {
365-
length: 45,
366-
unit: None
367-
})),
366+
data_type: DataType::CharacterVarying(Some(
367+
CharacterLength::IntegerLength {
368+
length: 45,
369+
unit: None
370+
}
371+
)),
368372
collation: Some(ObjectName(vec![Ident::with_quote('"', "es_ES")])),
369373
options: vec![ColumnOptionDef {
370374
name: None,
@@ -373,10 +377,12 @@ fn parse_create_table_with_defaults() {
373377
},
374378
ColumnDef {
375379
name: "email".into(),
376-
data_type: DataType::CharacterVarying(Some(CharacterLength {
377-
length: 50,
378-
unit: None
379-
})),
380+
data_type: DataType::CharacterVarying(Some(
381+
CharacterLength::IntegerLength {
382+
length: 50,
383+
unit: None
384+
}
385+
)),
380386
collation: None,
381387
options: vec![],
382388
},

0 commit comments

Comments
 (0)