@@ -20,6 +20,7 @@ const (
20
20
PrecedenceMulDivMod
21
21
PrecedenceBracket
22
22
PrecedenceArrow
23
+ PrecedenceDot
23
24
PrecedenceDoubleColon
24
25
)
25
26
@@ -56,6 +57,8 @@ func (p *Parser) getNextPrecedence() int {
56
57
return PrecedenceBracket
57
58
case p .matchTokenKind (opTypeCast ):
58
59
return PrecedenceDoubleColon
60
+ case p .matchTokenKind (TokenDot ):
61
+ return PrecedenceDot
59
62
case p .matchKeyword (KeywordBetween ), p .matchKeyword (KeywordLike ), p .matchKeyword (KeywordIlike ):
60
63
return PrecedenceBetweenLike
61
64
case p .matchKeyword (KeywordIn ):
@@ -106,7 +109,24 @@ func (p *Parser) parseInfix(expr Expr, precedence int) (Expr, error) {
106
109
Operation : "GLOBAL IN" ,
107
110
RightExpr : rightExpr ,
108
111
}, nil
109
-
112
+ case p .matchTokenKind (TokenDot ):
113
+ _ = p .lexer .consumeToken ()
114
+ // access column with dot notation
115
+ var rightExpr Expr
116
+ var err error
117
+ if p .matchTokenKind (TokenIdent ) {
118
+ rightExpr , err = p .parseIdent ()
119
+ } else {
120
+ rightExpr , err = p .parseDecimal (p .Pos ())
121
+ }
122
+ if err != nil {
123
+ return nil , err
124
+ }
125
+ return & IndexOperation {
126
+ LeftExpr : expr ,
127
+ Operation : TokenDot ,
128
+ Index : rightExpr ,
129
+ }, nil
110
130
case p .matchKeyword (KeywordNot ):
111
131
_ = p .lexer .consumeToken ()
112
132
switch {
@@ -331,6 +351,8 @@ func (p *Parser) parseColumnExpr(pos Pos) (Expr, error) { //nolint:funlen
331
351
return p .parseQueryParam (p .Pos ())
332
352
}
333
353
return p .parseMapLiteral (p .Pos ())
354
+ case p .matchTokenKind (TokenDot ):
355
+ return p .parseNumber (p .Pos ())
334
356
case p .matchTokenKind (opTypeQuery ):
335
357
// Placeholder `?`
336
358
_ = p .lexer .consumeToken ()
0 commit comments