parseMultiplicativeExpression parses expressions with *, /, and % operators
()
| 174 | |
| 175 | // parseMultiplicativeExpression parses expressions with *, /, and % operators |
| 176 | func (p *Parser) parseMultiplicativeExpression() (ast.Expression, error) { |
| 177 | // Parse the left side using JSON operator expression (higher precedence) |
| 178 | left, err := p.parseJSONExpression() |
| 179 | if err != nil { |
| 180 | return nil, err |
| 181 | } |
| 182 | |
| 183 | // Handle *, /, and % operators (left-associative) |
| 184 | // Note: TokenTypeAsterisk is used for both * (SELECT) and multiplication |
| 185 | // We check context: after an expression, asterisk means multiplication |
| 186 | for p.isType(models.TokenTypeAsterisk) || p.isType(models.TokenTypeMul) || |
| 187 | p.isType(models.TokenTypeDiv) || p.isType(models.TokenTypeMod) { |
| 188 | opPos := p.currentLocation() |
| 189 | operator := p.currentToken.Token.Value |
| 190 | p.advance() // Consume operator |
| 191 | |
| 192 | right, err := p.parseJSONExpression() |
| 193 | if err != nil { |
| 194 | return nil, err |
| 195 | } |
| 196 | |
| 197 | left = &ast.BinaryExpression{ |
| 198 | Left: left, |
| 199 | Operator: operator, |
| 200 | Right: right, |
| 201 | Pos: opPos, |
| 202 | } |
| 203 | } |
| 204 | |
| 205 | return left, nil |
| 206 | } |
| 207 | |
| 208 | // parseJSONExpression parses JSON/JSONB operators (PostgreSQL) and type casting |
| 209 | // Handles: ->, ->>, #>, #>>, @>, <@, ?, ?|, ?&, #-, :: |
no test coverage detected