@@ -462,17 +462,21 @@ pub enum Token<'input> {
462
462
463
463
// unquoted identifiers
464
464
#[ regex( "[a-zA-Z_$][a-zA-Z0-9_$]*" , |lex| lex. slice( ) ) ]
465
+ UnquotedIdent ( & ' input str ) ,
466
+
465
467
// quoted identifiers (quoted with double quotes)
466
468
#[ regex( r#""([^"\\]|\\t|\\u|\\n|\\")*""# ,
467
469
|lex| lex. slice( ) . trim_matches( '"' ) ) ]
468
- Identifier ( & ' input str ) ,
470
+ QuotedIdent ( & ' input str ) ,
469
471
470
472
// unquoted @identifiers
471
473
#[ regex( "@[a-zA-Z_$][a-zA-Z0-9_$]*" , |lex| & lex. slice( ) [ 1 ..] ) ]
474
+ UnquotedAtIdentifier ( & ' input str ) ,
475
+
472
476
// quoted @identifiers (quoted with double quotes)
473
477
#[ regex( r#"@"([^"\\]|\\t|\\u|\\n|\\")*""# ,
474
478
|lex| lex. slice( ) [ 1 ..] . trim_matches( '"' ) ) ]
475
- AtIdentifier ( & ' input str ) ,
479
+ QuotedAtIdentifier ( & ' input str ) ,
476
480
477
481
#[ regex( "[0-9]+" , |lex| lex. slice( ) ) ]
478
482
Int ( & ' input str ) ,
@@ -645,8 +649,10 @@ impl<'input> fmt::Display for Token<'input> {
645
649
Token :: Caret => write ! ( f, "^" ) ,
646
650
Token :: Period => write ! ( f, "." ) ,
647
651
Token :: DblPipe => write ! ( f, "||" ) ,
648
- Token :: Identifier ( id) => write ! ( f, "<{}:IDENT>" , id) ,
649
- Token :: AtIdentifier ( id) => write ! ( f, "<{}:@IDENT>" , id) ,
652
+ Token :: UnquotedIdent ( id) => write ! ( f, "<{}:UNQUOTED_IDENT>" , id) ,
653
+ Token :: QuotedIdent ( id) => write ! ( f, "<{}:QUOTED_IDENT>" , id) ,
654
+ Token :: UnquotedAtIdentifier ( id) => write ! ( f, "<{}:UNQUOTED_ATIDENT>" , id) ,
655
+ Token :: QuotedAtIdentifier ( id) => write ! ( f, "<{}:QUOTED_ATIDENT>" , id) ,
650
656
Token :: Int ( txt) => write ! ( f, "<{}:INT>" , txt) ,
651
657
Token :: ExpReal ( txt) => write ! ( f, "<{}:REAL>" , txt) ,
652
658
Token :: Real ( txt) => write ! ( f, "<{}:REAL>" , txt) ,
@@ -730,7 +736,7 @@ mod tests {
730
736
fn display ( ) -> Result < ( ) , ParseError < ' static , BytePosition > > {
731
737
let symbols =
732
738
"( [ { } ] ) << >> ; , < > <= >= != <> = == - + * % / ^ . || : --foo /*block*/" ;
733
- let primitives = "ident @atident" ;
739
+ let primitives = r#"unquoted_ident "quoted_ident" @unquoted_atident @"quoted_atident""# ;
734
740
let keywords =
735
741
"WiTH Where Value uSiNg Unpivot UNION True Select right Preserve pivoT Outer Order Or \
736
742
On Offset Nulls Null Not Natural Missing Limit Like Left Lateral Last Join \
@@ -753,10 +759,11 @@ mod tests {
753
759
"PIVOT" , ">" , "OUTER" , "<=" , "ORDER" , ">=" , "OR" , "!=" , "ON" , "<>" , "OFFSET" ,
754
760
"=" , "NULLS" , "==" , "NULL" , "-" , "NOT" , "+" , "NATURAL" , "*" , "MISSING" , "%" ,
755
761
"LIMIT" , "/" , "LIKE" , "^" , "LEFT" , "." , "LATERAL" , "||" , "LAST" , ":" , "JOIN" ,
756
- "--" , "INTERSECT" , "/**/" , "IS" , "<ident:IDENT>" , "INNER" , "<atident:@IDENT>" , "IN" ,
757
- "HAVING" , "GROUP" , "FROM" , "FULL" , "FIRST" , "FALSE" , "EXCEPT" , "ESCAPE" , "DESC" ,
758
- "CROSS" , "BY" , "BETWEEN" , "AT" , "AS" , "AND" , "ASC" , "ALL" , "VALUES" , "CASE" , "WHEN" ,
759
- "THEN" , "ELSE" , "END" ,
762
+ "--" , "INTERSECT" , "/**/" , "IS" , "<unquoted_ident:UNQUOTED_IDENT>" , "INNER" ,
763
+ "<quoted_ident:QUOTED_IDENT>" , "IN" , "<unquoted_atident:UNQUOTED_ATIDENT>" , "HAVING" ,
764
+ "<quoted_atident:QUOTED_ATIDENT>" , "GROUP" , "FROM" , "FULL" , "FIRST" , "FALSE" , "EXCEPT" ,
765
+ "ESCAPE" , "DESC" , "CROSS" , "BY" , "BETWEEN" , "AT" , "AS" , "AND" , "ASC" , "ALL" , "VALUES" ,
766
+ "CASE" , "WHEN" , "THEN" , "ELSE" , "END" ,
760
767
] ;
761
768
let displayed = toks
762
769
. into_iter ( )
@@ -840,20 +847,22 @@ mod tests {
840
847
841
848
#[ test]
842
849
fn select ( ) -> Result < ( ) , ParseError < ' static , BytePosition > > {
843
- let query = "SELECT g\n FROM data\n GROUP BY a" ;
850
+ let query = r#"SELECT g
851
+ FROM "data"
852
+ GROUP BY a"# ;
844
853
let mut offset_tracker = LineOffsetTracker :: default ( ) ;
845
854
let lexer = PartiqlLexer :: new ( query, & mut offset_tracker) ;
846
855
let toks: Vec < _ > = lexer. collect :: < Result < _ , _ > > ( ) ?;
847
856
848
857
assert_eq ! (
849
858
vec![
850
859
Token :: Select ,
851
- Token :: Identifier ( "g" ) ,
860
+ Token :: UnquotedIdent ( "g" ) ,
852
861
Token :: From ,
853
- Token :: Identifier ( "data" ) ,
862
+ Token :: QuotedIdent ( "data" ) ,
854
863
Token :: Group ,
855
864
Token :: By ,
856
- Token :: Identifier ( "a" )
865
+ Token :: UnquotedIdent ( "a" )
857
866
] ,
858
867
toks. into_iter( ) . map( |( _s, t, _e) | t) . collect:: <Vec <_>>( )
859
868
) ;
@@ -873,7 +882,7 @@ mod tests {
873
882
) ;
874
883
assert_eq ! (
875
884
LineAndColumn :: from( offset_tracker. at( query, 19 . into( ) ) . unwrap( ) ) ,
876
- LineAndColumn :: new( 3 , 1 ) . unwrap( )
885
+ LineAndColumn :: new( 2 , 11 ) . unwrap( )
877
886
) ;
878
887
879
888
let offset_r_a = query. rfind ( 'a' ) . unwrap ( ) ;
@@ -900,12 +909,12 @@ mod tests {
900
909
assert_eq ! (
901
910
vec![
902
911
Token :: Select ,
903
- Token :: Identifier ( "🐈" ) ,
912
+ Token :: QuotedIdent ( "🐈" ) ,
904
913
Token :: From ,
905
- Token :: Identifier ( "❤ℝ" ) ,
914
+ Token :: QuotedIdent ( "❤ℝ" ) ,
906
915
Token :: Group ,
907
916
Token :: By ,
908
- Token :: Identifier ( "🧸" )
917
+ Token :: QuotedIdent ( "🧸" )
909
918
] ,
910
919
toks. into_iter( ) . map( |( _s, t, _e) | t) . collect:: <Vec <_>>( )
911
920
) ;
@@ -981,9 +990,9 @@ mod tests {
981
990
vec![
982
991
Token :: Select ,
983
992
Token :: CommentLine ( "--comment" ) ,
984
- Token :: AtIdentifier ( "g" ) ,
993
+ Token :: UnquotedAtIdentifier ( "g" ) ,
985
994
Token :: From ,
986
- Token :: AtIdentifier ( "foo" ) ,
995
+ Token :: QuotedAtIdentifier ( "foo" ) ,
987
996
] ,
988
997
toks. into_iter( ) . map( |( _s, t, _e) | t) . collect:: <Vec <_>>( )
989
998
) ;
@@ -1002,7 +1011,7 @@ mod tests {
1002
1011
vec![
1003
1012
Token :: Select ,
1004
1013
Token :: CommentBlock ( "/*comment*/" ) ,
1005
- Token :: Identifier ( "g" ) ,
1014
+ Token :: UnquotedIdent ( "g" ) ,
1006
1015
] ,
1007
1016
toks. into_iter( ) . map( |( _s, t, _e) | t) . collect:: <Vec <_>>( )
1008
1017
) ;
0 commit comments