First keyword was INSERT, REPLACE
()
| 279 | |
| 280 | // First keyword was INSERT, REPLACE |
| 281 | func (m *Sqlbridge) parseSqlInsert() (*SqlInsert, error) { |
| 282 | |
| 283 | // insert into mytable (id, str) values (0, "a") |
| 284 | req := NewSqlInsert() |
| 285 | req.kw = m.Cur().T |
| 286 | m.Next() // Consume Insert or Replace |
| 287 | |
| 288 | // INTO |
| 289 | if m.Cur().T != lex.TokenInto { |
| 290 | return nil, fmt.Errorf("expected INTO but got: %v", m.Cur()) |
| 291 | } |
| 292 | m.Next() // Consume INTO |
| 293 | |
| 294 | // table name |
| 295 | switch m.Cur().T { |
| 296 | case lex.TokenTable: |
| 297 | req.Table = m.Cur().V |
| 298 | m.Next() |
| 299 | default: |
| 300 | return nil, fmt.Errorf("expected table name but got : %v", m.Cur().V) |
| 301 | } |
| 302 | |
| 303 | // list of fields |
| 304 | cols, err := m.parseFieldList() |
| 305 | if err != nil { |
| 306 | return nil, err |
| 307 | } |
| 308 | req.Columns = cols |
| 309 | |
| 310 | m.Next() // left paren starts lisf of values |
| 311 | switch m.Cur().T { |
| 312 | case lex.TokenValues: |
| 313 | m.Next() // Consume Values keyword |
| 314 | case lex.TokenSelect: |
| 315 | sel, err := m.parseSqlSelect() |
| 316 | if err != nil { |
| 317 | return nil, err |
| 318 | } |
| 319 | if len(sel.From) == 0 { |
| 320 | return nil, m.ErrMsg("Expected FROM <sources>") |
| 321 | } |
| 322 | req.Select = sel |
| 323 | return req, nil |
| 324 | default: |
| 325 | return nil, m.ErrMsg("expected INSERT (columns) VALUES <values>") |
| 326 | } |
| 327 | |
| 328 | colVals, err := m.parseValueList() |
| 329 | if err != nil { |
| 330 | return nil, err |
| 331 | } |
| 332 | req.Rows = colVals |
| 333 | return req, nil |
| 334 | } |
| 335 | |
| 336 | // First keyword was UPDATE |
| 337 | func (m *Sqlbridge) parseSqlUpdate() (*SqlUpdate, error) { |
no test coverage detected