@@ -10,14 +10,14 @@ import (
1010
1111func discoverAlias (cursor * parsly.Cursor ) string {
1212 pos := cursor .Pos
13- match := cursor .MatchAfterOptional (whitespaceMatcher , exceptKeywordMatcher , asKeywordMatcher , onKeywordMatcher , fromKeywordMatcher , joinToken , whereKeywordMatcher , groupByMatcher , havingKeywordMatcher , orderByKeywordMatcher , windowMatcher , identifierMatcher )
13+ match := cursor .MatchAfterOptional (whitespaceMatcher , exceptKeywordMatcher , asKeywordMatcher , onKeywordMatcher , fromKeywordMatcher , joinMatcher , whereKeywordMatcher , groupByMatcher , havingKeywordMatcher , orderByKeywordMatcher , windowMatcher , identifierMatcher )
1414 switch match .Code {
1515 case asKeyword :
1616 match := cursor .MatchAfterOptional (whitespaceMatcher , identifierMatcher )
1717 return match .Text (cursor )
1818 case identifierCode :
1919 return match .Text (cursor )
20- case exceptKeyword , fromKeyword , onKeyword , orderByKeyword , joinTokenCode , whereKeyword , groupByKeyword , havingKeyword , windowTokenCode :
20+ case exceptKeyword , fromKeyword , onKeyword , orderByKeyword , joinToken , whereKeyword , groupByKeyword , havingKeyword , windowTokenCode :
2121 cursor .Pos = pos
2222 }
2323 return ""
@@ -33,7 +33,7 @@ func expectOperand(cursor *parsly.Cursor) (node.Node, error) {
3333 orderByKeywordMatcher ,
3434 asKeywordMatcher ,
3535 exceptKeywordMatcher ,
36- onKeywordMatcher , fromKeywordMatcher , whereKeywordMatcher , joinToken , groupByMatcher , havingKeywordMatcher , windowMatcher , nextMatcher ,
36+ onKeywordMatcher , fromKeywordMatcher , whereKeywordMatcher , joinMatcher , groupByMatcher , havingKeywordMatcher , windowMatcher , nextMatcher ,
3737 parenthesesMatcher ,
3838 caseBlockMatcher ,
3939 starTokenMatcher ,
@@ -59,16 +59,9 @@ func expectOperand(cursor *parsly.Cursor) (node.Node, error) {
5959 switch match .Code {
6060 case parenthesesCode :
6161 raw := match .Text (cursor )
62- var args []node.Node
63- if len (raw ) > 0 {
64- argCursor := parsly .NewCursor (cursor .Path , []byte (raw [1 :len (raw )- 1 ]), pos )
65- list := query.List {}
66- if err := parseOrderByListItem (argCursor , & list ); err != nil {
67- return nil , err
68- }
69- for i := range list {
70- args = append (args , list [i ].Expr )
71- }
62+ args , err := parseCallArguments (cursor , raw , pos )
63+ if err != nil {
64+ return nil , err
7265 }
7366 return & expr.Call {X : selector , Raw : raw , Args : args }, nil
7467
@@ -113,12 +106,47 @@ func expectOperand(cursor *parsly.Cursor) (node.Node, error) {
113106 }
114107 return unary , nil
115108
116- case asKeyword , orderByKeyword , onKeyword , fromKeyword , whereKeyword , joinTokenCode , groupByKeyword , havingKeyword , windowTokenCode , nextCode , commentBlock :
109+ case asKeyword , orderByKeyword , onKeyword , fromKeyword , whereKeyword , joinToken , groupByKeyword , havingKeyword , windowTokenCode , nextCode , commentBlock :
117110 cursor .Pos -= pos
118111 }
119112 return nil , nil
120113}
121114
115+ func parseCallArguments (cursor * parsly.Cursor , raw string , pos int ) ([]node.Node , error ) {
116+ var args []node.Node
117+ if len (raw ) > 0 {
118+ argCursor := parsly .NewCursor (cursor .Path , []byte (raw [1 :len (raw )- 1 ]), pos )
119+ list := query.List {}
120+ if err := parseCallArgs (argCursor , & list ); err != nil {
121+ return nil , err
122+ }
123+ for i := range list {
124+ args = append (args , list [i ].Expr )
125+ }
126+ }
127+ return args , nil
128+ }
129+
130+ func ParseCallExpr (rawExpr string ) (* expr.Call , error ) {
131+ cursor := parsly .NewCursor ("" , []byte (rawExpr ), 0 )
132+ match := cursor .MatchAfterOptional (whitespaceMatcher , selectorMatcher )
133+ if match .Code != selectorTokenCode {
134+ return nil , cursor .NewError (selectorMatcher )
135+ }
136+ selector := expr .NewSelector (match .Text (cursor ))
137+ pos := cursor .Pos
138+ match = cursor .MatchAfterOptional (whitespaceMatcher , parenthesesMatcher )
139+ if match .Code != parenthesesCode {
140+ return nil , cursor .NewError (parenthesesMatcher )
141+ }
142+ raw := match .Text (cursor )
143+ args , err := parseCallArguments (cursor , raw , pos )
144+ if err != nil {
145+ return nil , err
146+ }
147+ return & expr.Call {X : selector , Raw : rawExpr , Args : args }, nil
148+ }
149+
122150func parseStarExpr (cursor * parsly.Cursor , selRaw string , selector node.Node ) (node.Node , error ) {
123151 star := expr .NewStar (selector , "" )
124152 if ! strings .HasSuffix (selRaw , "*" ) {
0 commit comments