Skip to content

Commit 036a412

Browse files
authored
Support triple quoted strings (apache#1262)
1 parent e3692f4 commit 036a412

File tree

6 files changed

+594
-64
lines changed

6 files changed

+594
-64
lines changed

src/ast/value.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ pub enum Value {
4242
SingleQuotedString(String),
4343
// $<tag_name>$string value$<tag_name>$ (postgres syntax)
4444
DollarQuotedString(DollarQuotedString),
45+
/// Triple single quoted strings: Example '''abc'''
46+
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_literals)
47+
TripleSingleQuotedString(String),
48+
/// Triple double quoted strings: Example """abc"""
49+
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_literals)
50+
TripleDoubleQuotedString(String),
4551
/// e'string value' (postgres extension)
4652
/// See [Postgres docs](https://www.postgresql.org/docs/8.3/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS)
4753
/// for more details.
@@ -50,9 +56,24 @@ pub enum Value {
5056
SingleQuotedByteStringLiteral(String),
5157
/// B"string value"
5258
DoubleQuotedByteStringLiteral(String),
53-
/// R'string value' or r'string value' or r"string value"
54-
/// <https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_literals>
55-
RawStringLiteral(String),
59+
/// Triple single quoted literal with byte string prefix. Example `B'''abc'''`
60+
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_literals)
61+
TripleSingleQuotedByteStringLiteral(String),
62+
/// Triple double quoted literal with byte string prefix. Example `B"""abc"""`
63+
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_literals)
64+
TripleDoubleQuotedByteStringLiteral(String),
65+
/// Single quoted literal with raw string prefix. Example `R'abc'`
66+
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_literals)
67+
SingleQuotedRawStringLiteral(String),
68+
/// Double quoted literal with raw string prefix. Example `R"abc"`
69+
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_literals)
70+
DoubleQuotedRawStringLiteral(String),
71+
/// Triple single quoted literal with raw string prefix. Example `R'''abc'''`
72+
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_literals)
73+
TripleSingleQuotedRawStringLiteral(String),
74+
/// Triple double quoted literal with raw string prefix. Example `R"""abc"""`
75+
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_literals)
76+
TripleDoubleQuotedRawStringLiteral(String),
5677
/// N'string value'
5778
NationalStringLiteral(String),
5879
/// X'hex value'
@@ -73,14 +94,25 @@ impl fmt::Display for Value {
7394
Value::Number(v, l) => write!(f, "{}{long}", v, long = if *l { "L" } else { "" }),
7495
Value::DoubleQuotedString(v) => write!(f, "\"{}\"", escape_double_quote_string(v)),
7596
Value::SingleQuotedString(v) => write!(f, "'{}'", escape_single_quote_string(v)),
97+
Value::TripleSingleQuotedString(v) => {
98+
write!(f, "'''{v}'''")
99+
}
100+
Value::TripleDoubleQuotedString(v) => {
101+
write!(f, r#""""{v}""""#)
102+
}
76103
Value::DollarQuotedString(v) => write!(f, "{v}"),
77104
Value::EscapedStringLiteral(v) => write!(f, "E'{}'", escape_escaped_string(v)),
78105
Value::NationalStringLiteral(v) => write!(f, "N'{v}'"),
79106
Value::HexStringLiteral(v) => write!(f, "X'{v}'"),
80107
Value::Boolean(v) => write!(f, "{v}"),
81108
Value::SingleQuotedByteStringLiteral(v) => write!(f, "B'{v}'"),
82109
Value::DoubleQuotedByteStringLiteral(v) => write!(f, "B\"{v}\""),
83-
Value::RawStringLiteral(v) => write!(f, "R'{v}'"),
110+
Value::TripleSingleQuotedByteStringLiteral(v) => write!(f, "B'''{v}'''"),
111+
Value::TripleDoubleQuotedByteStringLiteral(v) => write!(f, r#"B"""{v}""""#),
112+
Value::SingleQuotedRawStringLiteral(v) => write!(f, "R'{v}'"),
113+
Value::DoubleQuotedRawStringLiteral(v) => write!(f, "R\"{v}\""),
114+
Value::TripleSingleQuotedRawStringLiteral(v) => write!(f, "R'''{v}'''"),
115+
Value::TripleDoubleQuotedRawStringLiteral(v) => write!(f, r#"R"""{v}""""#),
84116
Value::Null => write!(f, "NULL"),
85117
Value::Placeholder(v) => write!(f, "{v}"),
86118
}

src/dialect/bigquery.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ impl Dialect for BigQueryDialect {
3030
ch.is_ascii_lowercase() || ch.is_ascii_uppercase() || ch.is_ascii_digit() || ch == '_'
3131
}
3232

33+
/// See [doc](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_literals)
34+
fn supports_triple_quoted_string(&self) -> bool {
35+
true
36+
}
37+
3338
/// See [doc](https://cloud.google.com/bigquery/docs/reference/standard-sql/navigation_functions#first_value)
3439
fn supports_window_function_null_treatment_arg(&self) -> bool {
3540
true

src/dialect/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,11 @@ pub trait Dialect: Debug + Any {
231231
fn convert_type_before_value(&self) -> bool {
232232
false
233233
}
234+
/// Returns true if the dialect supports triple quoted string
235+
/// e.g. `"""abc"""`
236+
fn supports_triple_quoted_string(&self) -> bool {
237+
false
238+
}
234239
/// Dialect-specific prefix parser override
235240
fn parse_prefix(&self, _parser: &mut Parser) -> Option<Result<Expr, ParserError>> {
236241
// return None to fall back to the default behavior

src/parser/mod.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,10 +1187,17 @@ impl<'a> Parser<'a> {
11871187
Token::Number(_, _)
11881188
| Token::SingleQuotedString(_)
11891189
| Token::DoubleQuotedString(_)
1190+
| Token::TripleSingleQuotedString(_)
1191+
| Token::TripleDoubleQuotedString(_)
11901192
| Token::DollarQuotedString(_)
11911193
| Token::SingleQuotedByteStringLiteral(_)
11921194
| Token::DoubleQuotedByteStringLiteral(_)
1193-
| Token::RawStringLiteral(_)
1195+
| Token::TripleSingleQuotedByteStringLiteral(_)
1196+
| Token::TripleDoubleQuotedByteStringLiteral(_)
1197+
| Token::SingleQuotedRawStringLiteral(_)
1198+
| Token::DoubleQuotedRawStringLiteral(_)
1199+
| Token::TripleSingleQuotedRawStringLiteral(_)
1200+
| Token::TripleDoubleQuotedRawStringLiteral(_)
11941201
| Token::NationalStringLiteral(_)
11951202
| Token::HexStringLiteral(_) => {
11961203
self.prev_token();
@@ -6425,14 +6432,37 @@ impl<'a> Parser<'a> {
64256432
},
64266433
Token::SingleQuotedString(ref s) => Ok(Value::SingleQuotedString(s.to_string())),
64276434
Token::DoubleQuotedString(ref s) => Ok(Value::DoubleQuotedString(s.to_string())),
6435+
Token::TripleSingleQuotedString(ref s) => {
6436+
Ok(Value::TripleSingleQuotedString(s.to_string()))
6437+
}
6438+
Token::TripleDoubleQuotedString(ref s) => {
6439+
Ok(Value::TripleDoubleQuotedString(s.to_string()))
6440+
}
64286441
Token::DollarQuotedString(ref s) => Ok(Value::DollarQuotedString(s.clone())),
64296442
Token::SingleQuotedByteStringLiteral(ref s) => {
64306443
Ok(Value::SingleQuotedByteStringLiteral(s.clone()))
64316444
}
64326445
Token::DoubleQuotedByteStringLiteral(ref s) => {
64336446
Ok(Value::DoubleQuotedByteStringLiteral(s.clone()))
64346447
}
6435-
Token::RawStringLiteral(ref s) => Ok(Value::RawStringLiteral(s.clone())),
6448+
Token::TripleSingleQuotedByteStringLiteral(ref s) => {
6449+
Ok(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
6450+
}
6451+
Token::TripleDoubleQuotedByteStringLiteral(ref s) => {
6452+
Ok(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
6453+
}
6454+
Token::SingleQuotedRawStringLiteral(ref s) => {
6455+
Ok(Value::SingleQuotedRawStringLiteral(s.clone()))
6456+
}
6457+
Token::DoubleQuotedRawStringLiteral(ref s) => {
6458+
Ok(Value::DoubleQuotedRawStringLiteral(s.clone()))
6459+
}
6460+
Token::TripleSingleQuotedRawStringLiteral(ref s) => {
6461+
Ok(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
6462+
}
6463+
Token::TripleDoubleQuotedRawStringLiteral(ref s) => {
6464+
Ok(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
6465+
}
64366466
Token::NationalStringLiteral(ref s) => Ok(Value::NationalStringLiteral(s.to_string())),
64376467
Token::EscapedStringLiteral(ref s) => Ok(Value::EscapedStringLiteral(s.to_string())),
64386468
Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.to_string())),

0 commit comments

Comments
 (0)