@@ -1229,14 +1229,26 @@ impl<'a> Tokenizer<'a> {
12291229 // operators
12301230 '-' => {
12311231 chars. next ( ) ; // consume the '-'
1232+
12321233 match chars. peek ( ) {
12331234 Some ( '-' ) => {
1234- chars. next ( ) ; // consume the second '-', starting a single-line comment
1235- let comment = self . tokenize_single_line_comment ( chars) ;
1236- Ok ( Some ( Token :: Whitespace ( Whitespace :: SingleLineComment {
1237- prefix : "--" . to_owned ( ) ,
1238- comment,
1239- } ) ) )
1235+ let mut is_comment = true ;
1236+ if self . dialect . requires_single_line_comment_whitespace ( ) {
1237+ is_comment = Some ( ' ' ) == chars. peekable . clone ( ) . nth ( 1 ) ;
1238+ }
1239+
1240+ if is_comment {
1241+ chars. next ( ) ; // consume second '-'
1242+ let comment = self . tokenize_single_line_comment ( chars) ;
1243+ return Ok ( Some ( Token :: Whitespace (
1244+ Whitespace :: SingleLineComment {
1245+ prefix : "--" . to_owned ( ) ,
1246+ comment,
1247+ } ,
1248+ ) ) ) ;
1249+ }
1250+
1251+ self . start_binop ( chars, "-" , Token :: Minus )
12401252 }
12411253 Some ( '>' ) => {
12421254 chars. next ( ) ;
@@ -3685,4 +3697,85 @@ mod tests {
36853697 ] ,
36863698 ) ;
36873699 }
3700+
3701+ #[ test]
3702+ fn test_whitespace_required_after_single_line_comment ( ) {
3703+ all_dialects_where ( |dialect| dialect. requires_single_line_comment_whitespace ( ) )
3704+ . tokenizes_to (
3705+ "SELECT --'abc'" ,
3706+ vec ! [
3707+ Token :: make_keyword( "SELECT" ) ,
3708+ Token :: Whitespace ( Whitespace :: Space ) ,
3709+ Token :: Minus ,
3710+ Token :: Minus ,
3711+ Token :: SingleQuotedString ( "abc" . to_string( ) ) ,
3712+ ] ,
3713+ ) ;
3714+
3715+ all_dialects_where ( |dialect| dialect. requires_single_line_comment_whitespace ( ) )
3716+ . tokenizes_to (
3717+ "SELECT -- 'abc'" ,
3718+ vec ! [
3719+ Token :: make_keyword( "SELECT" ) ,
3720+ Token :: Whitespace ( Whitespace :: Space ) ,
3721+ Token :: Whitespace ( Whitespace :: SingleLineComment {
3722+ prefix: "--" . to_string( ) ,
3723+ comment: " 'abc'" . to_string( ) ,
3724+ } ) ,
3725+ ] ,
3726+ ) ;
3727+
3728+ all_dialects_where ( |dialect| dialect. requires_single_line_comment_whitespace ( ) )
3729+ . tokenizes_to (
3730+ "SELECT --" ,
3731+ vec ! [
3732+ Token :: make_keyword( "SELECT" ) ,
3733+ Token :: Whitespace ( Whitespace :: Space ) ,
3734+ Token :: Minus ,
3735+ Token :: Minus ,
3736+ ] ,
3737+ ) ;
3738+ }
3739+
3740+ #[ test]
3741+ fn test_whitespace_not_required_after_single_line_comment ( ) {
3742+ all_dialects_where ( |dialect| !dialect. requires_single_line_comment_whitespace ( ) )
3743+ . tokenizes_to (
3744+ "SELECT --'abc'" ,
3745+ vec ! [
3746+ Token :: make_keyword( "SELECT" ) ,
3747+ Token :: Whitespace ( Whitespace :: Space ) ,
3748+ Token :: Whitespace ( Whitespace :: SingleLineComment {
3749+ prefix: "--" . to_string( ) ,
3750+ comment: "'abc'" . to_string( ) ,
3751+ } ) ,
3752+ ] ,
3753+ ) ;
3754+
3755+ all_dialects_where ( |dialect| !dialect. requires_single_line_comment_whitespace ( ) )
3756+ . tokenizes_to (
3757+ "SELECT -- 'abc'" ,
3758+ vec ! [
3759+ Token :: make_keyword( "SELECT" ) ,
3760+ Token :: Whitespace ( Whitespace :: Space ) ,
3761+ Token :: Whitespace ( Whitespace :: SingleLineComment {
3762+ prefix: "--" . to_string( ) ,
3763+ comment: " 'abc'" . to_string( ) ,
3764+ } ) ,
3765+ ] ,
3766+ ) ;
3767+
3768+ all_dialects_where ( |dialect| !dialect. requires_single_line_comment_whitespace ( ) )
3769+ . tokenizes_to (
3770+ "SELECT --" ,
3771+ vec ! [
3772+ Token :: make_keyword( "SELECT" ) ,
3773+ Token :: Whitespace ( Whitespace :: Space ) ,
3774+ Token :: Whitespace ( Whitespace :: SingleLineComment {
3775+ prefix: "--" . to_string( ) ,
3776+ comment: "" . to_string( ) ,
3777+ } ) ,
3778+ ] ,
3779+ ) ;
3780+ }
36883781}
0 commit comments