(pos Pos)
| 1837 | } |
| 1838 | |
| 1839 | func (p *Parser) parseInsertStmt(pos Pos) (*InsertStmt, error) { |
| 1840 | if err := p.expectKeyword(KeywordInsert); err != nil { |
| 1841 | return nil, err |
| 1842 | } |
| 1843 | if err := p.expectKeyword(KeywordInto); err != nil { |
| 1844 | return nil, err |
| 1845 | } |
| 1846 | |
| 1847 | insertExpr := &InsertStmt{InsertPos: pos} |
| 1848 | insertExpr.HasTableKeyword = p.tryConsumeKeywords(KeywordTable) |
| 1849 | |
| 1850 | var table Expr |
| 1851 | var err error |
| 1852 | if p.tryConsumeKeywords(KeywordFunction) { |
| 1853 | table, err = p.parseFunctionExpr(p.Pos()) |
| 1854 | } else { |
| 1855 | table, err = p.parseTableIdentifier(p.Pos()) |
| 1856 | } |
| 1857 | if err != nil { |
| 1858 | return nil, err |
| 1859 | } |
| 1860 | insertExpr.Table = table |
| 1861 | |
| 1862 | if p.matchTokenKind(TokenKindLParen) { |
| 1863 | // parse column names |
| 1864 | insertExpr.ColumnNames, err = p.parseColumnNamesExpr(p.Pos()) |
| 1865 | if err != nil { |
| 1866 | return nil, err |
| 1867 | } |
| 1868 | } |
| 1869 | |
| 1870 | switch { |
| 1871 | case p.matchKeyword(KeywordFormat): |
| 1872 | insertExpr.Format, err = p.parseFormat(p.Pos()) |
| 1873 | case p.matchKeyword(KeywordValues): |
| 1874 | // consume VALUES keyword |
| 1875 | _ = p.lexer.consumeToken() |
| 1876 | values := make([]*AssignmentValues, 0) |
| 1877 | for !p.lexer.isEOF() { |
| 1878 | value, err := p.parseAssignmentValues(p.Pos()) |
| 1879 | if err != nil { |
| 1880 | return nil, err |
| 1881 | } |
| 1882 | values = append(values, value) |
| 1883 | if p.tryConsumeTokenKind(TokenKindComma) == nil { |
| 1884 | break |
| 1885 | } |
| 1886 | } |
| 1887 | insertExpr.Values = values |
| 1888 | case p.matchKeyword(KeywordSelect): |
| 1889 | insertExpr.SelectExpr, err = p.parseSelectQuery(p.Pos()) |
| 1890 | default: |
| 1891 | // do nothing |
| 1892 | } |
| 1893 | |
| 1894 | if err != nil { |
| 1895 | return nil, err |
| 1896 | } |
no test coverage detected