Skip to content

Commit 422c26b

Browse files
authored
Revert "Make TypedString preserve quote style (apache#1679)"
This reverts commit 56f4b82.
1 parent 123e119 commit 422c26b

File tree

7 files changed

+55
-132
lines changed

7 files changed

+55
-132
lines changed

src/ast/mod.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -898,18 +898,14 @@ pub enum Expr {
898898
/// <https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html>
899899
IntroducedString {
900900
introducer: String,
901-
/// The value of the constant.
902-
/// Hint: you can unwrap the string value using `value.into_string()`.
903901
value: Value,
904902
},
905903
/// A constant of form `<data_type> 'value'`.
906904
/// This can represent ANSI SQL `DATE`, `TIME`, and `TIMESTAMP` literals (such as `DATE '2020-01-01'`),
907905
/// as well as constants of other types (a non-standard PostgreSQL extension).
908906
TypedString {
909907
data_type: DataType,
910-
/// The value of the constant.
911-
/// Hint: you can unwrap the string value using `value.into_string()`.
912-
value: Value,
908+
value: String,
913909
},
914910
/// Scalar function call e.g. `LEFT(foo, 5)`
915911
Function(Function),
@@ -1626,7 +1622,7 @@ impl fmt::Display for Expr {
16261622
Expr::IntroducedString { introducer, value } => write!(f, "{introducer} {value}"),
16271623
Expr::TypedString { data_type, value } => {
16281624
write!(f, "{data_type}")?;
1629-
write!(f, " {value}")
1625+
write!(f, " '{}'", &value::escape_single_quote_string(value))
16301626
}
16311627
Expr::Function(fun) => write!(f, "{fun}"),
16321628
Expr::Method(method) => write!(f, "{method}"),

src/ast/spans.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1266,7 +1266,7 @@ impl Spanned for AssignmentTarget {
12661266
/// f.e. `IS NULL <expr>` reports as `<expr>::span`.
12671267
///
12681268
/// Missing spans:
1269-
/// - [Expr::TypedString] # missing span for data_type
1269+
/// - [Expr::TypedString]
12701270
/// - [Expr::MatchAgainst] # MySQL specific
12711271
/// - [Expr::RLike] # MySQL specific
12721272
/// - [Expr::Struct] # BigQuery specific
@@ -1362,7 +1362,7 @@ impl Spanned for Expr {
13621362
.union(&union_spans(collation.0.iter().map(|i| i.span()))),
13631363
Expr::Nested(expr) => expr.span(),
13641364
Expr::Value(value) => value.span(),
1365-
Expr::TypedString { value, .. } => value.span(),
1365+
Expr::TypedString { .. } => Span::empty(),
13661366
Expr::Function(function) => function.span(),
13671367
Expr::GroupingSets(vec) => {
13681368
union_spans(vec.iter().flat_map(|i| i.iter().map(|k| k.span())))

src/ast/value.rs

-26
Original file line numberDiff line numberDiff line change
@@ -97,32 +97,6 @@ pub enum Value {
9797
Placeholder(String),
9898
}
9999

100-
impl Value {
101-
/// If the underlying literal is a string, regardless of quote style, returns the associated string value
102-
pub fn into_string(self) -> Option<String> {
103-
match self {
104-
Value::SingleQuotedString(s)
105-
| Value::DoubleQuotedString(s)
106-
| Value::TripleSingleQuotedString(s)
107-
| Value::TripleDoubleQuotedString(s)
108-
| Value::SingleQuotedByteStringLiteral(s)
109-
| Value::DoubleQuotedByteStringLiteral(s)
110-
| Value::TripleSingleQuotedByteStringLiteral(s)
111-
| Value::TripleDoubleQuotedByteStringLiteral(s)
112-
| Value::SingleQuotedRawStringLiteral(s)
113-
| Value::DoubleQuotedRawStringLiteral(s)
114-
| Value::TripleSingleQuotedRawStringLiteral(s)
115-
| Value::TripleDoubleQuotedRawStringLiteral(s)
116-
| Value::EscapedStringLiteral(s)
117-
| Value::UnicodeStringLiteral(s)
118-
| Value::NationalStringLiteral(s)
119-
| Value::HexStringLiteral(s) => Some(s),
120-
Value::DollarQuotedString(s) => Some(s.value),
121-
_ => None,
122-
}
123-
}
124-
}
125-
126100
impl fmt::Display for Value {
127101
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
128102
match self {

src/parser/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1316,7 +1316,7 @@ impl<'a> Parser<'a> {
13161316
DataType::Custom(..) => parser_err!("dummy", loc),
13171317
data_type => Ok(Expr::TypedString {
13181318
data_type,
1319-
value: parser.parse_value()?,
1319+
value: parser.parse_literal_string()?,
13201320
}),
13211321
}
13221322
})?;

tests/sqlparser_bigquery.rs

+36-64
Original file line numberDiff line numberDiff line change
@@ -39,45 +39,43 @@ fn parse_literal_string() {
3939
r#"'''triple-single'unescaped''', "#,
4040
r#""double\"escaped", "#,
4141
r#""""triple-double\"escaped""", "#,
42-
r#""""triple-double"unescaped""", "#,
43-
r#""""triple-double'unescaped""", "#,
44-
r#"'''triple-single"unescaped'''"#,
42+
r#""""triple-double"unescaped""""#,
4543
);
4644
let dialect = TestedDialects::new_with_options(
4745
vec![Box::new(BigQueryDialect {})],
4846
ParserOptions::new().with_unescape(false),
4947
);
5048
let select = dialect.verified_only_select(sql);
51-
assert_eq!(12, select.projection.len());
49+
assert_eq!(10, select.projection.len());
5250
assert_eq!(
53-
&Expr::Value(Value::SingleQuotedString("single".into())),
51+
&Expr::Value(Value::SingleQuotedString("single".to_string())),
5452
expr_from_projection(&select.projection[0])
5553
);
5654
assert_eq!(
57-
&Expr::Value(Value::DoubleQuotedString("double".into())),
55+
&Expr::Value(Value::DoubleQuotedString("double".to_string())),
5856
expr_from_projection(&select.projection[1])
5957
);
6058
assert_eq!(
61-
&Expr::Value(Value::TripleSingleQuotedString("triple-single".into())),
59+
&Expr::Value(Value::TripleSingleQuotedString("triple-single".to_string())),
6260
expr_from_projection(&select.projection[2])
6361
);
6462
assert_eq!(
65-
&Expr::Value(Value::TripleDoubleQuotedString("triple-double".into())),
63+
&Expr::Value(Value::TripleDoubleQuotedString("triple-double".to_string())),
6664
expr_from_projection(&select.projection[3])
6765
);
6866
assert_eq!(
69-
&Expr::Value(Value::SingleQuotedString(r#"single\'escaped"#.into())),
67+
&Expr::Value(Value::SingleQuotedString(r#"single\'escaped"#.to_string())),
7068
expr_from_projection(&select.projection[4])
7169
);
7270
assert_eq!(
7371
&Expr::Value(Value::TripleSingleQuotedString(
74-
r#"triple-single\'escaped"#.into()
72+
r#"triple-single\'escaped"#.to_string()
7573
)),
7674
expr_from_projection(&select.projection[5])
7775
);
7876
assert_eq!(
7977
&Expr::Value(Value::TripleSingleQuotedString(
80-
r#"triple-single'unescaped"#.into()
78+
r#"triple-single'unescaped"#.to_string()
8179
)),
8280
expr_from_projection(&select.projection[6])
8381
);
@@ -97,18 +95,6 @@ fn parse_literal_string() {
9795
)),
9896
expr_from_projection(&select.projection[9])
9997
);
100-
assert_eq!(
101-
&Expr::Value(Value::TripleDoubleQuotedString(
102-
r#"triple-double'unescaped"#.to_string()
103-
)),
104-
expr_from_projection(&select.projection[10])
105-
);
106-
assert_eq!(
107-
&Expr::Value(Value::TripleSingleQuotedString(
108-
r#"triple-single"unescaped"#.to_string()
109-
)),
110-
expr_from_projection(&select.projection[11])
111-
);
11298
}
11399

114100
#[test]
@@ -602,7 +588,7 @@ fn parse_tuple_struct_literal() {
602588
&Expr::Tuple(vec![
603589
Expr::Value(number("1")),
604590
Expr::Value(number("1.0")),
605-
Expr::Value(Value::SingleQuotedString("123".into())),
591+
Expr::Value(Value::SingleQuotedString("123".to_string())),
606592
Expr::Value(Value::Boolean(true))
607593
]),
608594
expr_from_projection(&select.projection[1])
@@ -630,7 +616,7 @@ fn parse_typeless_struct_syntax() {
630616

631617
assert_eq!(
632618
&Expr::Struct {
633-
values: vec![Expr::Value(Value::SingleQuotedString("abc".into())),],
619+
values: vec![Expr::Value(Value::SingleQuotedString("abc".to_string())),],
634620
fields: Default::default()
635621
},
636622
expr_from_projection(&select.projection[1])
@@ -653,7 +639,7 @@ fn parse_typeless_struct_syntax() {
653639
name: Ident::from("a")
654640
},
655641
Expr::Named {
656-
expr: Expr::Value(Value::SingleQuotedString("abc".into())).into(),
642+
expr: Expr::Value(Value::SingleQuotedString("abc".to_string())).into(),
657643
name: Ident::from("b")
658644
},
659645
],
@@ -818,7 +804,9 @@ fn parse_typed_struct_syntax_bigquery() {
818804
assert_eq!(4, select.projection.len());
819805
assert_eq!(
820806
&Expr::Struct {
821-
values: vec![Expr::Value(Value::DoubleQuotedString("2011-05-05".into())),],
807+
values: vec![Expr::Value(Value::DoubleQuotedString(
808+
"2011-05-05".to_string()
809+
)),],
822810
fields: vec![StructField {
823811
field_name: None,
824812
field_type: DataType::Date
@@ -830,7 +818,7 @@ fn parse_typed_struct_syntax_bigquery() {
830818
&Expr::Struct {
831819
values: vec![Expr::TypedString {
832820
data_type: DataType::Datetime(None),
833-
value: Value::SingleQuotedString("1999-01-01 01:23:34.45".into())
821+
value: "1999-01-01 01:23:34.45".to_string()
834822
},],
835823
fields: vec![StructField {
836824
field_name: None,
@@ -866,7 +854,7 @@ fn parse_typed_struct_syntax_bigquery() {
866854
assert_eq!(
867855
&Expr::Struct {
868856
values: vec![Expr::Interval(Interval {
869-
value: Box::new(Expr::Value(Value::SingleQuotedString("2".into()))),
857+
value: Box::new(Expr::Value(Value::SingleQuotedString("2".to_string()))),
870858
leading_field: Some(DateTimeField::Hour),
871859
leading_precision: None,
872860
last_field: None,
@@ -883,9 +871,7 @@ fn parse_typed_struct_syntax_bigquery() {
883871
&Expr::Struct {
884872
values: vec![Expr::TypedString {
885873
data_type: DataType::JSON,
886-
value: Value::SingleQuotedString(
887-
r#"{"class" : {"students" : [{"name" : "Jane"}]}}"#.into()
888-
)
874+
value: r#"{"class" : {"students" : [{"name" : "Jane"}]}}"#.to_string()
889875
},],
890876
fields: vec![StructField {
891877
field_name: None,
@@ -900,7 +886,7 @@ fn parse_typed_struct_syntax_bigquery() {
900886
assert_eq!(3, select.projection.len());
901887
assert_eq!(
902888
&Expr::Struct {
903-
values: vec![Expr::Value(Value::DoubleQuotedString("foo".into())),],
889+
values: vec![Expr::Value(Value::DoubleQuotedString("foo".to_string())),],
904890
fields: vec![StructField {
905891
field_name: None,
906892
field_type: DataType::String(Some(42))
@@ -912,7 +898,7 @@ fn parse_typed_struct_syntax_bigquery() {
912898
&Expr::Struct {
913899
values: vec![Expr::TypedString {
914900
data_type: DataType::Timestamp(None, TimezoneInfo::None),
915-
value: Value::SingleQuotedString("2008-12-25 15:30:00 America/Los_Angeles".into())
901+
value: "2008-12-25 15:30:00 America/Los_Angeles".to_string()
916902
},],
917903
fields: vec![StructField {
918904
field_name: None,
@@ -926,7 +912,7 @@ fn parse_typed_struct_syntax_bigquery() {
926912
&Expr::Struct {
927913
values: vec![Expr::TypedString {
928914
data_type: DataType::Time(None, TimezoneInfo::None),
929-
value: Value::SingleQuotedString("15:30:00".into())
915+
value: "15:30:00".to_string()
930916
},],
931917
fields: vec![StructField {
932918
field_name: None,
@@ -943,7 +929,7 @@ fn parse_typed_struct_syntax_bigquery() {
943929
&Expr::Struct {
944930
values: vec![Expr::TypedString {
945931
data_type: DataType::Numeric(ExactNumberInfo::None),
946-
value: Value::SingleQuotedString("1".into())
932+
value: "1".to_string()
947933
},],
948934
fields: vec![StructField {
949935
field_name: None,
@@ -956,7 +942,7 @@ fn parse_typed_struct_syntax_bigquery() {
956942
&Expr::Struct {
957943
values: vec![Expr::TypedString {
958944
data_type: DataType::BigNumeric(ExactNumberInfo::None),
959-
value: Value::SingleQuotedString("1".into())
945+
value: "1".to_string()
960946
},],
961947
fields: vec![StructField {
962948
field_name: None,
@@ -1133,7 +1119,9 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
11331119
assert_eq!(4, select.projection.len());
11341120
assert_eq!(
11351121
&Expr::Struct {
1136-
values: vec![Expr::Value(Value::SingleQuotedString("2011-05-05".into())),],
1122+
values: vec![Expr::Value(Value::SingleQuotedString(
1123+
"2011-05-05".to_string()
1124+
)),],
11371125
fields: vec![StructField {
11381126
field_name: None,
11391127
field_type: DataType::Date
@@ -1145,7 +1133,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
11451133
&Expr::Struct {
11461134
values: vec![Expr::TypedString {
11471135
data_type: DataType::Datetime(None),
1148-
value: Value::SingleQuotedString("1999-01-01 01:23:34.45".into())
1136+
value: "1999-01-01 01:23:34.45".to_string()
11491137
},],
11501138
fields: vec![StructField {
11511139
field_name: None,
@@ -1181,7 +1169,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
11811169
assert_eq!(
11821170
&Expr::Struct {
11831171
values: vec![Expr::Interval(Interval {
1184-
value: Box::new(Expr::Value(Value::SingleQuotedString("1".into()))),
1172+
value: Box::new(Expr::Value(Value::SingleQuotedString("1".to_string()))),
11851173
leading_field: Some(DateTimeField::Month),
11861174
leading_precision: None,
11871175
last_field: None,
@@ -1198,9 +1186,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
11981186
&Expr::Struct {
11991187
values: vec![Expr::TypedString {
12001188
data_type: DataType::JSON,
1201-
value: Value::SingleQuotedString(
1202-
r#"{"class" : {"students" : [{"name" : "Jane"}]}}"#.into()
1203-
)
1189+
value: r#"{"class" : {"students" : [{"name" : "Jane"}]}}"#.to_string()
12041190
},],
12051191
fields: vec![StructField {
12061192
field_name: None,
@@ -1215,7 +1201,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
12151201
assert_eq!(3, select.projection.len());
12161202
assert_eq!(
12171203
&Expr::Struct {
1218-
values: vec![Expr::Value(Value::SingleQuotedString("foo".into())),],
1204+
values: vec![Expr::Value(Value::SingleQuotedString("foo".to_string())),],
12191205
fields: vec![StructField {
12201206
field_name: None,
12211207
field_type: DataType::String(Some(42))
@@ -1227,7 +1213,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
12271213
&Expr::Struct {
12281214
values: vec![Expr::TypedString {
12291215
data_type: DataType::Timestamp(None, TimezoneInfo::None),
1230-
value: Value::SingleQuotedString("2008-12-25 15:30:00 America/Los_Angeles".into())
1216+
value: "2008-12-25 15:30:00 America/Los_Angeles".to_string()
12311217
},],
12321218
fields: vec![StructField {
12331219
field_name: None,
@@ -1241,7 +1227,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
12411227
&Expr::Struct {
12421228
values: vec![Expr::TypedString {
12431229
data_type: DataType::Time(None, TimezoneInfo::None),
1244-
value: Value::SingleQuotedString("15:30:00".into())
1230+
value: "15:30:00".to_string()
12451231
},],
12461232
fields: vec![StructField {
12471233
field_name: None,
@@ -1258,7 +1244,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
12581244
&Expr::Struct {
12591245
values: vec![Expr::TypedString {
12601246
data_type: DataType::Numeric(ExactNumberInfo::None),
1261-
value: Value::SingleQuotedString("1".into())
1247+
value: "1".to_string()
12621248
},],
12631249
fields: vec![StructField {
12641250
field_name: None,
@@ -1271,7 +1257,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
12711257
&Expr::Struct {
12721258
values: vec![Expr::TypedString {
12731259
data_type: DataType::BigNumeric(ExactNumberInfo::None),
1274-
value: Value::SingleQuotedString("1".into())
1260+
value: "1".to_string()
12751261
},],
12761262
fields: vec![StructField {
12771263
field_name: None,
@@ -1299,7 +1285,7 @@ fn parse_typed_struct_with_field_name_bigquery() {
12991285
);
13001286
assert_eq!(
13011287
&Expr::Struct {
1302-
values: vec![Expr::Value(Value::DoubleQuotedString("foo".into())),],
1288+
values: vec![Expr::Value(Value::DoubleQuotedString("foo".to_string())),],
13031289
fields: vec![StructField {
13041290
field_name: Some(Ident::from("y")),
13051291
field_type: DataType::String(None)
@@ -1346,7 +1332,7 @@ fn parse_typed_struct_with_field_name_bigquery_and_generic() {
13461332
);
13471333
assert_eq!(
13481334
&Expr::Struct {
1349-
values: vec![Expr::Value(Value::SingleQuotedString("foo".into())),],
1335+
values: vec![Expr::Value(Value::SingleQuotedString("foo".to_string())),],
13501336
fields: vec![StructField {
13511337
field_name: Some(Ident::from("y")),
13521338
field_type: DataType::String(None)
@@ -2248,20 +2234,6 @@ fn test_select_as_value() {
22482234
assert_eq!(Some(ValueTableMode::AsValue), select.value_table_mode);
22492235
}
22502236

2251-
#[test]
2252-
fn test_triple_quote_typed_strings() {
2253-
bigquery().verified_expr(r#"JSON '''{"foo":"bar's"}'''"#);
2254-
2255-
let expr = bigquery().verified_expr(r#"JSON """{"foo":"bar's"}""""#);
2256-
assert_eq!(
2257-
Expr::TypedString {
2258-
data_type: DataType::JSON,
2259-
value: Value::TripleDoubleQuotedString(r#"{"foo":"bar's"}"#.into())
2260-
},
2261-
expr
2262-
);
2263-
}
2264-
22652237
#[test]
22662238
fn test_array_agg() {
22672239
bigquery_and_generic().verified_expr("ARRAY_AGG(state)");

0 commit comments

Comments
 (0)