(pos Pos)
| 1799 | } |
| 1800 | |
| 1801 | func (p *Parser) parseAssignmentValues(pos Pos) (*AssignmentValues, error) { |
| 1802 | if err := p.expectTokenKind(TokenKindLParen); err != nil { |
| 1803 | return nil, err |
| 1804 | } |
| 1805 | |
| 1806 | var value Expr |
| 1807 | var err error |
| 1808 | values := make([]Expr, 0) |
| 1809 | for !p.lexer.isEOF() && p.tryConsumeTokenKind(TokenKindRParen) == nil { |
| 1810 | switch { |
| 1811 | case p.matchTokenKind(TokenKindLParen): |
| 1812 | value, err = p.parseAssignmentValues(p.Pos()) |
| 1813 | case p.matchTokenKind(TokenKindLBrace): |
| 1814 | // placeholder with type, e.g. {a :Int32}, {b :DateTime(6)} |
| 1815 | value, err = p.parseTypedPlaceholder(p.Pos()) |
| 1816 | default: |
| 1817 | value, err = p.parseExpr(p.Pos()) |
| 1818 | } |
| 1819 | if err != nil { |
| 1820 | return nil, err |
| 1821 | } |
| 1822 | values = append(values, value) |
| 1823 | if p.tryConsumeTokenKind(TokenKindComma) == nil { |
| 1824 | break |
| 1825 | } |
| 1826 | } |
| 1827 | rightParenPos := p.Pos() |
| 1828 | if err := p.expectTokenKind(TokenKindRParen); err != nil { |
| 1829 | return nil, err |
| 1830 | } |
| 1831 | |
| 1832 | return &AssignmentValues{ |
| 1833 | LeftParenPos: pos, |
| 1834 | RightParenPos: rightParenPos, |
| 1835 | Values: values, |
| 1836 | }, nil |
| 1837 | } |
| 1838 | |
| 1839 | func (p *Parser) parseInsertStmt(pos Pos) (*InsertStmt, error) { |
| 1840 | if err := p.expectKeyword(KeywordInsert); err != nil { |
no test coverage detected