@@ -8,7 +8,7 @@ use winnow::prelude::*;
88use winnow:: token:: { any, one_of, rest, take, take_until, take_while} ;
99use winnow:: Result ;
1010
11- use crate :: FormatOptions ;
11+ use crate :: { Dialect , FormatOptions } ;
1212
1313pub ( crate ) fn tokenize < ' a > (
1414 mut input : & ' a str ,
@@ -32,6 +32,7 @@ pub(crate) fn tokenize<'a>(
3232 last_reserved_token. clone ( ) ,
3333 last_reserved_top_level_token. clone ( ) ,
3434 named_placeholders,
35+ options. dialect ,
3536 ) {
3637 match result. kind {
3738 TokenKind :: Reserved => {
@@ -124,13 +125,14 @@ fn get_next_token<'a>(
124125 last_reserved_token : Option < Token < ' a > > ,
125126 last_reserved_top_level_token : Option < Token < ' a > > ,
126127 named_placeholders : bool ,
128+ dialect : Dialect ,
127129) -> Result < Token < ' a > > {
128130 alt ( (
129131 get_comment_token,
130132 |input : & mut _ | get_type_specifier_token ( input, previous_token. clone ( ) ) ,
131- get_string_token,
132- get_open_paren_token,
133- get_close_paren_token,
133+ | input : & mut _ | get_string_token ( input , dialect ) ,
134+ | input : & mut _ | get_open_paren_token ( input , dialect ) ,
135+ | input : & mut _ | get_close_paren_token ( input , dialect ) ,
134136 get_number_token,
135137 |input : & mut _ | {
136138 get_reserved_word_token (
@@ -141,7 +143,7 @@ fn get_next_token<'a>(
141143 )
142144 } ,
143145 get_operator_token,
144- |input : & mut _ | get_placeholder_token ( input, named_placeholders) ,
146+ |input : & mut _ | get_placeholder_token ( input, named_placeholders, dialect ) ,
145147 get_word_token,
146148 get_any_other_char,
147149 ) )
@@ -238,10 +240,10 @@ pub fn take_till_escaping<'a>(
238240// 4. single quoted string using '' or \' to escape
239241// 5. national character quoted string using N'' or N\' to escape
240242// 6. hex(blob literal) does not need to escape
241- fn get_string_token < ' i > ( input : & mut & ' i str ) -> Result < Token < ' i > > {
243+ fn get_string_token < ' i > ( input : & mut & ' i str , dialect : Dialect ) -> Result < Token < ' i > > {
242244 dispatch ! { any;
243245 '`' => ( take_till_escaping( '`' , & [ '`' ] ) , any) . void( ) ,
244- '[' => ( take_till_escaping( ']' , & [ ']' ] ) , any) . void( ) ,
246+ '[' if dialect == Dialect :: SQLServer => ( take_till_escaping( ']' , & [ ']' ] ) , any) . void( ) ,
245247 '"' => ( take_till_escaping( '"' , & [ '"' , '\\' ] ) , any) . void( ) ,
246248 '\'' => ( take_till_escaping( '\'' , & [ '\'' , '\\' ] ) , any) . void( ) ,
247249 'N' => ( '\'' , take_till_escaping( '\'' , & [ '\'' , '\\' ] ) , any) . void( ) ,
@@ -261,10 +263,10 @@ fn get_string_token<'i>(input: &mut &'i str) -> Result<Token<'i>> {
261263}
262264
263265// Like above but it doesn't replace double quotes
264- fn get_placeholder_string_token < ' i > ( input : & mut & ' i str ) -> Result < Token < ' i > > {
266+ fn get_placeholder_string_token < ' i > ( input : & mut & ' i str , dialect : Dialect ) -> Result < Token < ' i > > {
265267 dispatch ! { any;
266268 '`' =>( take_till_escaping( '`' , & [ '`' ] ) , any) . void( ) ,
267- '[' =>( take_till_escaping( ']' , & [ ']' ] ) , any) . void( ) ,
269+ '[' if dialect == Dialect :: SQLServer =>( take_till_escaping( ']' , & [ ']' ] ) , any) . void( ) ,
268270 '"' =>( take_till_escaping( '"' , & [ '\\' ] ) , any) . void( ) ,
269271 '\'' =>( take_till_escaping( '\'' , & [ '\\' ] ) , any) . void( ) ,
270272 'N' =>( '\'' , take_till_escaping( '\'' , & [ '\\' ] ) , any) . void( ) ,
@@ -280,44 +282,57 @@ fn get_placeholder_string_token<'i>(input: &mut &'i str) -> Result<Token<'i>> {
280282 } )
281283}
282284
283- fn get_open_paren_token < ' i > ( input : & mut & ' i str ) -> Result < Token < ' i > > {
284- alt ( ( "(" , terminated ( Caseless ( "CASE" ) , end_of_word) ) )
285- . parse_next ( input)
286- . map ( |token| Token {
287- kind : TokenKind :: OpenParen ,
288- value : token,
289- key : None ,
290- alias : token,
291- } )
285+ fn get_open_paren_token < ' i > ( input : & mut & ' i str , dialect : Dialect ) -> Result < Token < ' i > > {
286+ let case = terminated ( Caseless ( "CASE" ) , end_of_word) ;
287+ let open_paren = if dialect == Dialect :: PostgreSql {
288+ ( "(" , "[" , case)
289+ } else {
290+ ( "(" , "(" , case)
291+ } ;
292+
293+ alt ( open_paren) . parse_next ( input) . map ( |token| Token {
294+ kind : TokenKind :: OpenParen ,
295+ value : token,
296+ key : None ,
297+ alias : token,
298+ } )
292299}
293300
294- fn get_close_paren_token < ' i > ( input : & mut & ' i str ) -> Result < Token < ' i > > {
295- alt ( ( ")" , terminated ( Caseless ( "END" ) , end_of_word) ) )
296- . parse_next ( input)
297- . map ( |token| Token {
298- kind : TokenKind :: CloseParen ,
299- value : token,
300- key : None ,
301- alias : token,
302- } )
301+ fn get_close_paren_token < ' i > ( input : & mut & ' i str , dialect : Dialect ) -> Result < Token < ' i > > {
302+ let end = terminated ( Caseless ( "END" ) , end_of_word) ;
303+ let close_paren = if dialect == Dialect :: PostgreSql {
304+ ( ")" , "]" , end)
305+ } else {
306+ ( ")" , ")" , end)
307+ } ;
308+ alt ( close_paren) . parse_next ( input) . map ( |token| Token {
309+ kind : TokenKind :: CloseParen ,
310+ value : token,
311+ key : None ,
312+ alias : token,
313+ } )
303314}
304315
305- fn get_placeholder_token < ' i > ( input : & mut & ' i str , named_placeholders : bool ) -> Result < Token < ' i > > {
316+ fn get_placeholder_token < ' i > (
317+ input : & mut & ' i str ,
318+ named_placeholders : bool ,
319+ dialect : Dialect ,
320+ ) -> Result < Token < ' i > > {
306321 // The precedence changes based on 'named_placeholders' but not the exhaustiveness.
307322 // This is to ensure the formatting is the same even if parameters aren't used.
308323
309324 if named_placeholders {
310325 alt ( (
311326 get_ident_named_placeholder_token,
312- get_string_named_placeholder_token,
327+ | input : & mut _ | get_string_named_placeholder_token ( input , dialect ) ,
313328 get_indexed_placeholder_token,
314329 ) )
315330 . parse_next ( input)
316331 } else {
317332 alt ( (
318333 get_indexed_placeholder_token,
319334 get_ident_named_placeholder_token,
320- get_string_named_placeholder_token,
335+ | input : & mut _ | get_string_named_placeholder_token ( input , dialect ) ,
321336 ) )
322337 . parse_next ( input)
323338 }
@@ -366,8 +381,13 @@ fn get_ident_named_placeholder_token<'i>(input: &mut &'i str) -> Result<Token<'i
366381 } )
367382}
368383
369- fn get_string_named_placeholder_token < ' i > ( input : & mut & ' i str ) -> Result < Token < ' i > > {
370- ( one_of ( ( '@' , ':' ) ) , get_placeholder_string_token)
384+ fn get_string_named_placeholder_token < ' i > (
385+ input : & mut & ' i str ,
386+ dialect : Dialect ,
387+ ) -> Result < Token < ' i > > {
388+ ( one_of ( ( '@' , ':' ) ) , |input : & mut _ | {
389+ get_placeholder_string_token ( input, dialect)
390+ } )
371391 . take ( )
372392 . parse_next ( input)
373393 . map ( |token| {
0 commit comments