modernc.org/ql@v1.4.7/stmt.go (about) 1 // Copyright (c) 2014 ql Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package ql // import "modernc.org/ql" 6 7 import ( 8 "bytes" 9 "fmt" 10 "strings" 11 12 "sync" 13 14 "modernc.org/strutil" 15 ) 16 17 // NOTE: all stmt implementations must be safe for concurrent use by multiple 18 // goroutines. If the exec method requires any execution domain local data, 19 // they must be held out of the implementing instance. 20 var ( 21 _ stmt = (*alterTableAddStmt)(nil) 22 _ stmt = (*alterTableDropColumnStmt)(nil) 23 _ stmt = (*createIndexStmt)(nil) 24 _ stmt = (*createTableStmt)(nil) 25 _ stmt = (*deleteStmt)(nil) //TODO optimizer plan 26 _ stmt = (*dropIndexStmt)(nil) 27 _ stmt = (*dropTableStmt)(nil) 28 _ stmt = (*explainStmt)(nil) 29 _ stmt = (*insertIntoStmt)(nil) 30 _ stmt = (*selectStmt)(nil) 31 _ stmt = (*truncateTableStmt)(nil) 32 _ stmt = (*updateStmt)(nil) //TODO optimizer plan 33 _ stmt = beginTransactionStmt{} 34 _ stmt = commitStmt{} 35 _ stmt = rollbackStmt{} 36 ) 37 38 var ( 39 createColumn2 = mustCompile(` 40 create table if not exists __Column2 ( 41 TableName string, 42 Name string, 43 NotNull bool, 44 ConstraintExpr string, 45 DefaultExpr string, 46 ); 47 create index if not exists __Column2TableName on __Column2(TableName); 48 `) 49 50 insertColumn2 = mustCompile(`insert into __Column2 values($1, $2, $3, $4, $5)`) 51 52 selectColumn2 = MustCompile(` 53 select Name, NotNull, ConstraintExpr, DefaultExpr 54 from __Column2 55 where TableName == $1 56 `) 57 58 deleteColumn2 = mustCompile(` 59 delete from __Column2 60 where TableName == $1 && Name == $2 61 `) 62 63 createIndex2 = mustCompile(` 64 // Index register 2. 65 create table if not exists __Index2( 66 TableName string, 67 IndexName string, 68 IsUnique bool, 69 IsSimple bool, // Just a column name or id(). 70 Root int64, // BTree handle 71 ); 72 73 // Expressions for given index. Compared in order of id(__Index2_Expr). 74 create table if not exists __Index2_Expr( 75 Index2_ID int, 76 Expr string, 77 ); 78 79 create index if not exists __xIndex2_TableName on __Index2(TableName); 80 create unique index if not exists __xIndex2_IndexName on __Index2(IndexName); 81 create index if not exists __xIndex2_ID on __Index2(id()); 82 create index if not exists __xIndex2_Expr_Index2_ID on __Index2_Expr(Index2_ID); 83 `) 84 85 insertIndex2 = mustCompile("insert into __Index2 values($1, $2, $3, $4, $5)") 86 insertIndex2Expr = mustCompile("insert into __Index2_Expr values($1, $2)") 87 88 deleteIndex2ByIndexName = mustCompile(` 89 delete from __Index2_Expr 90 where Index2_ID in ( 91 select id() from __Index2 where IndexName == $1; 92 ); 93 94 delete from __Index2 95 where IndexName == $1; 96 `) 97 deleteIndex2ByTableName = mustCompile(` 98 delete from __Index2_Expr 99 where Index2_ID in ( 100 select id() from __Index2 where TableName == $1; 101 ); 102 103 delete from __Index2 104 where TableName == $1; 105 `) 106 ) 107 108 type stmt interface { 109 // never invoked for 110 // - beginTransactionStmt 111 // - commitStmt 112 // - rollbackStmt 113 exec(ctx *execCtx) (Recordset, error) 114 115 explain(ctx *execCtx, w strutil.Formatter) 116 117 // return value ignored for 118 // - beginTransactionStmt 119 // - commitStmt 120 // - rollbackStmt 121 isUpdating() bool 122 String() string 123 } 124 125 type execCtx struct { //LATER +shared temp 126 db *DB 127 arg []interface{} 128 cache map[interface{}]interface{} 129 mu sync.RWMutex 130 } 131 132 func newExecCtx(db *DB, arg []interface{}) *execCtx { 133 return &execCtx{ 134 db: db, 135 arg: arg, 136 cache: make(map[interface{}]interface{}), 137 } 138 } 139 140 type explainStmt struct { 141 s stmt 142 } 143 144 func (s *explainStmt) explain(ctx *execCtx, w strutil.Formatter) { 145 for { 146 x, ok := s.s.(*explainStmt) 147 if !ok { 148 s.s.explain(ctx, w) 149 return 150 } 151 152 s = x 153 } 154 } 155 156 func (s *explainStmt) String() string { 157 return "EXPLAIN " + s.s.String() 158 } 159 160 func (*explainStmt) isUpdating() bool { return false } 161 162 func (s *explainStmt) exec(ctx *execCtx) (_ Recordset, err error) { 163 return recordset{ctx, &explainDefaultPlan{s.s}, ctx.db.cc}, nil 164 } 165 166 type updateStmt struct { 167 tableName string 168 list []assignment 169 where expression 170 } 171 172 func (s *updateStmt) explain(ctx *execCtx, w strutil.Formatter) { 173 w.Format("%s\n", s) 174 } 175 176 func (s *updateStmt) String() string { 177 u := fmt.Sprintf("UPDATE %s", s.tableName) 178 a := make([]string, len(s.list)) 179 for i, v := range s.list { 180 a[i] = v.String() 181 } 182 w := "" 183 if s.where != nil { 184 w = fmt.Sprintf(" WHERE %s", s.where) 185 } 186 return fmt.Sprintf("%s %s%s;", u, strings.Join(a, ", "), w) 187 } 188 189 func (s *updateStmt) exec(ctx *execCtx) (_ Recordset, err error) { 190 t, ok := ctx.db.root.tables[s.tableName] 191 if !ok { 192 return nil, fmt.Errorf("UPDATE: table %s does not exist", s.tableName) 193 } 194 195 tcols := make([]*col, len(s.list)) 196 for i, asgn := range s.list { 197 col := findCol(t.cols, asgn.colName) 198 if col == nil { 199 return nil, fmt.Errorf("UPDATE: unknown column %s", asgn.colName) 200 } 201 tcols[i] = col 202 } 203 204 m := map[interface{}]interface{}{} 205 var nh int64 206 expr := s.where 207 blobCols := t.blobCols() 208 cc := ctx.db.cc 209 var old []interface{} 210 var touched []bool 211 if t.hasIndices() { 212 old = make([]interface{}, len(t.cols0)) 213 touched = make([]bool, len(t.cols0)) 214 } 215 for h := t.head; h != 0; h = nh { 216 // Read can return lazily expanded chunks 217 data, err := t.store.Read(nil, h, t.cols...) 218 if err != nil { 219 return nil, err 220 } 221 222 nh = data[0].(int64) 223 for _, col := range t.cols { 224 m[col.name] = data[2+col.index] 225 } 226 id := data[1].(int64) 227 m["$id"] = id 228 if expr != nil { 229 val, err := s.where.eval(ctx, m) 230 if err != nil { 231 return nil, err 232 } 233 234 if val == nil { 235 continue 236 } 237 238 x, ok := val.(bool) 239 if !ok { 240 return nil, fmt.Errorf("invalid WHERE expression %s (value of type %T)", val, val) 241 } 242 243 if !x { 244 continue 245 } 246 } 247 248 // hit 249 for _, ix := range t.indices2 { 250 vlist, err := ix.eval(ctx, t.cols, id, data[2:]) 251 if err != nil { 252 return nil, err 253 } 254 255 if err := ix.x.Delete(vlist, h); err != nil { 256 return nil, err 257 } 258 } 259 for i, asgn := range s.list { 260 val, err := asgn.expr.eval(ctx, m) 261 if err != nil { 262 return nil, err 263 } 264 265 colIndex := tcols[i].index 266 if t.hasIndices() { 267 old[colIndex] = data[2+colIndex] 268 touched[colIndex] = true 269 } 270 data[2+colIndex] = val 271 } 272 if err = typeCheck(data[2:], t.cols); err != nil { 273 return nil, err 274 } 275 276 if err = t.checkConstraintsAndDefaults(ctx, data[2:], m); err != nil { 277 return nil, err 278 } 279 280 for i, v := range t.indices { 281 if i == 0 { // id() N/A 282 continue 283 } 284 285 if v == nil || !touched[i-1] { 286 continue 287 } 288 289 if err = v.x.Delete([]interface{}{old[i-1]}, h); err != nil { 290 return nil, err 291 } 292 } 293 294 if err = t.store.UpdateRow(h, blobCols, data...); err != nil { //LATER detect which blobs are actually affected 295 return nil, err 296 } 297 298 for i, v := range t.indices { 299 if i == 0 { // id() N/A 300 continue 301 } 302 303 if v == nil || !touched[i-1] { 304 continue 305 } 306 307 if err = v.x.Create([]interface{}{data[2+i-1]}, h); err != nil { 308 return nil, err 309 } 310 } 311 for _, ix := range t.indices2 { 312 vlist, err := ix.eval(ctx, t.cols, id, data[2:]) 313 if err != nil { 314 return nil, err 315 } 316 317 if err := ix.x.Create(vlist, h); err != nil { 318 return nil, err 319 } 320 } 321 322 cc.RowsAffected++ 323 } 324 return 325 } 326 327 func (s *updateStmt) isUpdating() bool { return true } 328 329 type deleteStmt struct { 330 tableName string 331 where expression 332 } 333 334 func (s *deleteStmt) explain(ctx *execCtx, w strutil.Formatter) { 335 w.Format("%s\n", s) 336 } 337 338 func (s *deleteStmt) String() string { 339 switch { 340 case s.where == nil: 341 return fmt.Sprintf("DELETE FROM %s;", s.tableName) 342 default: 343 return fmt.Sprintf("DELETE FROM %s WHERE %s;", s.tableName, s.where) 344 } 345 } 346 347 func (s *deleteStmt) exec(ctx *execCtx) (_ Recordset, err error) { 348 t, ok := ctx.db.root.tables[s.tableName] 349 if !ok { 350 return nil, fmt.Errorf("DELETE FROM: table %s does not exist", s.tableName) 351 } 352 353 m := map[interface{}]interface{}{} 354 var ph, h, nh int64 355 var data []interface{} 356 blobCols := t.blobCols() 357 cc := ctx.db.cc 358 for h = t.head; h != 0; ph, h = h, nh { 359 for i, v := range data { 360 c, ok := v.(chunk) 361 if !ok { 362 continue 363 } 364 365 data[i] = c.b 366 } 367 // Read can return lazily expanded chunks 368 data, err = t.store.Read(nil, h, t.cols...) 369 if err != nil { 370 return nil, err 371 } 372 373 nh = data[0].(int64) 374 for _, col := range t.cols { 375 m[col.name] = data[2+col.index] 376 } 377 id := data[1].(int64) 378 m["$id"] = id 379 val, err := s.where.eval(ctx, m) 380 if err != nil { 381 return nil, err 382 } 383 384 if val == nil { 385 continue 386 } 387 388 x, ok := val.(bool) 389 if !ok { 390 return nil, fmt.Errorf("invalid WHERE expression %s (value of type %T)", val, val) 391 } 392 393 if !x { 394 continue 395 } 396 397 // hit 398 for i, v := range t.indices { 399 if v == nil { 400 continue 401 } 402 403 // overflow chunks left in place 404 if err = v.x.Delete([]interface{}{data[i+1]}, h); err != nil { 405 return nil, err 406 } 407 } 408 for _, ix := range t.indices2 { 409 vlist, err := ix.eval(ctx, t.cols, id, data[2:]) 410 if err != nil { 411 return nil, err 412 } 413 414 if err := ix.x.Delete(vlist, h); err != nil { 415 return nil, err 416 } 417 } 418 419 // overflow chunks freed here 420 if err = t.store.Delete(h, blobCols...); err != nil { 421 return nil, err 422 } 423 424 cc.RowsAffected++ 425 switch { 426 case ph == 0 && nh == 0: // "only" 427 fallthrough 428 case ph == 0 && nh != 0: // "first" 429 if err = t.store.Update(t.hhead, nh); err != nil { 430 return nil, err 431 } 432 433 t.head, h = nh, 0 434 case ph != 0 && nh == 0: // "last" 435 fallthrough 436 case ph != 0 && nh != 0: // "inner" 437 pdata, err := t.store.Read(nil, ph, t.cols...) 438 if err != nil { 439 return nil, err 440 } 441 442 for i, v := range pdata { 443 if x, ok := v.(chunk); ok { 444 pdata[i] = x.b 445 } 446 } 447 pdata[0] = nh 448 if err = t.store.Update(ph, pdata...); err != nil { 449 return nil, err 450 } 451 452 h = ph 453 } 454 } 455 456 return 457 } 458 459 func (s *deleteStmt) isUpdating() bool { return true } 460 461 type truncateTableStmt struct { 462 tableName string 463 } 464 465 func (s *truncateTableStmt) explain(ctx *execCtx, w strutil.Formatter) { 466 w.Format("%s\n", s) 467 } 468 469 func (s *truncateTableStmt) String() string { return fmt.Sprintf("TRUNCATE TABLE %s;", s.tableName) } 470 471 func (s *truncateTableStmt) exec(ctx *execCtx) (Recordset, error) { 472 t, ok := ctx.db.root.tables[s.tableName] 473 if !ok { 474 return nil, fmt.Errorf("TRUNCATE TABLE: table %s does not exist", s.tableName) 475 } 476 477 return nil, t.truncate() 478 } 479 480 func (s *truncateTableStmt) isUpdating() bool { return true } 481 482 type dropIndexStmt struct { 483 ifExists bool 484 indexName string 485 } 486 487 func (s *dropIndexStmt) explain(ctx *execCtx, w strutil.Formatter) { 488 w.Format("%s\n", s) 489 } 490 491 func (s *dropIndexStmt) String() string { return fmt.Sprintf("DROP INDEX %s;", s.indexName) } 492 493 func (s *dropIndexStmt) exec(ctx *execCtx) (Recordset, error) { 494 t, x := ctx.db.root.findIndexByName(s.indexName) 495 if x == nil { 496 if s.ifExists { 497 return nil, nil 498 } 499 500 return nil, fmt.Errorf("DROP INDEX: index %s does not exist", s.indexName) 501 } 502 503 if ctx.db.hasAllIndex2() { 504 if err := ctx.db.deleteIndex2ByIndexName(s.indexName); err != nil { 505 return nil, err 506 } 507 } 508 509 switch ix := x.(type) { 510 case *indexedCol: 511 for i, v := range t.indices { 512 if v == nil || v.name != s.indexName { 513 continue 514 } 515 516 return nil, t.dropIndex(i) 517 } 518 case *index2: 519 delete(t.indices2, s.indexName) 520 return nil, ix.x.Drop() 521 } 522 523 panic("internal error 058") 524 } 525 526 func (s *dropIndexStmt) isUpdating() bool { return true } 527 528 type dropTableStmt struct { 529 ifExists bool 530 tableName string 531 } 532 533 func (s *dropTableStmt) explain(ctx *execCtx, w strutil.Formatter) { 534 w.Format("%s\n", s) 535 } 536 537 func (s *dropTableStmt) String() string { return fmt.Sprintf("DROP TABLE %s;", s.tableName) } 538 539 func (s *dropTableStmt) exec(ctx *execCtx) (Recordset, error) { 540 t, ok := ctx.db.root.tables[s.tableName] 541 if !ok { 542 if s.ifExists { 543 return nil, nil 544 } 545 546 return nil, fmt.Errorf("DROP TABLE: table %s does not exist", s.tableName) 547 } 548 549 if ctx.db.hasAllIndex2() { 550 if err := ctx.db.deleteIndex2ByTableName(s.tableName); err != nil { 551 return nil, err 552 } 553 } 554 555 return nil, ctx.db.root.dropTable(t) 556 } 557 558 func (s *dropTableStmt) isUpdating() bool { return true } 559 560 type alterTableDropColumnStmt struct { 561 tableName, colName string 562 } 563 564 func (s *alterTableDropColumnStmt) explain(ctx *execCtx, w strutil.Formatter) { 565 w.Format("%s\n", s) 566 } 567 568 func (s *alterTableDropColumnStmt) String() string { 569 return fmt.Sprintf("ALTER TABLE %s DROP COLUMN %s;", s.tableName, s.colName) 570 } 571 572 func (s *alterTableDropColumnStmt) exec(ctx *execCtx) (Recordset, error) { 573 t, ok := ctx.db.root.tables[s.tableName] 574 if !ok { 575 return nil, fmt.Errorf("ALTER TABLE: table %s does not exist", s.tableName) 576 } 577 578 cols := t.cols 579 for _, c := range cols { 580 if c.name == s.colName { 581 if len(cols) == 1 { 582 return nil, fmt.Errorf("ALTER TABLE %s DROP COLUMN: cannot drop the only column: %s", s.tableName, s.colName) 583 } 584 585 if _, ok := ctx.db.root.tables["__Column2"]; ok { 586 if _, err := deleteColumn2.l[0].exec(newExecCtx(ctx.db, []interface{}{s.tableName, c.name})); err != nil { 587 return nil, err 588 } 589 } 590 591 c.name = "" 592 t.cols0[c.index].name = "" 593 if t.hasIndices() { 594 if len(t.indices) != 0 { 595 if v := t.indices[c.index+1]; v != nil { 596 if err := t.dropIndex(c.index + 1); err != nil { 597 return nil, err 598 } 599 600 if ctx.db.hasAllIndex2() { 601 if err := ctx.db.deleteIndex2ByIndexName(v.name); err != nil { 602 return nil, err 603 } 604 } 605 } 606 } 607 608 for nm, ix := range t.indices2 { 609 for _, e := range ix.exprList { 610 m := mentionedColumns(e) 611 if _, ok := m[s.colName]; ok { 612 if err := ctx.db.deleteIndex2ByIndexName(nm); err != nil { 613 return nil, err 614 } 615 616 if err := ix.x.Drop(); err != nil { 617 return nil, err 618 } 619 620 delete(t.indices2, nm) 621 break 622 } 623 } 624 } 625 } 626 if err := t.constraintsAndDefaults(ctx); err != nil { 627 return nil, err 628 } 629 630 return nil, t.updated() 631 } 632 } 633 634 return nil, fmt.Errorf("ALTER TABLE %s DROP COLUMN: column %s does not exist", s.tableName, s.colName) 635 } 636 637 func (s *alterTableDropColumnStmt) isUpdating() bool { return true } 638 639 type alterTableAddStmt struct { 640 tableName string 641 c *col 642 } 643 644 func (s *alterTableAddStmt) explain(ctx *execCtx, w strutil.Formatter) { 645 w.Format("%s\n", s) 646 } 647 648 func (s *alterTableAddStmt) String() string { 649 r := fmt.Sprintf("ALTER TABLE %s ADD %s %s", s.tableName, s.c.name, typeStr(s.c.typ)) 650 c := s.c 651 if x := c.constraint; x != nil { //TODO add (*col).String() 652 switch e := x.expr; { 653 case e != nil: 654 r += " " + e.String() 655 default: 656 r += " NOT NULL" 657 } 658 } 659 if x := c.dflt; x != nil { 660 r += " DEFAULT " + x.String() 661 } 662 return r + ";" 663 } 664 665 func (s *alterTableAddStmt) exec(ctx *execCtx) (Recordset, error) { 666 t, ok := ctx.db.root.tables[s.tableName] 667 if !ok { 668 return nil, fmt.Errorf("ALTER TABLE: table %s does not exist", s.tableName) 669 } 670 671 hasRecords := t.head != 0 672 c := s.c 673 if c.constraint != nil && hasRecords { 674 return nil, fmt.Errorf("ALTER TABLE %s ADD %s: cannot add constrained column to table with existing data", s.tableName, c.name) 675 } 676 677 cols := t.cols 678 for _, c := range cols { 679 nm := c.name 680 if nm == s.c.name { 681 return nil, fmt.Errorf("ALTER TABLE %s ADD: column %s exists", s.tableName, nm) 682 } 683 } 684 685 if len(t.indices) != 0 { 686 t.indices = append(t.indices, nil) 687 t.xroots = append(t.xroots, 0) 688 if err := t.store.Update(t.hxroots, t.xroots...); err != nil { 689 return nil, err 690 } 691 } 692 693 if c.constraint != nil || c.dflt != nil { 694 for _, s := range createColumn2.l { 695 _, err := s.exec(newExecCtx(ctx.db, nil)) 696 if err != nil { 697 return nil, err 698 } 699 } 700 notNull := c.constraint != nil && c.constraint.expr == nil 701 var co, d string 702 if c.constraint != nil && c.constraint.expr != nil { 703 co = c.constraint.expr.String() 704 } 705 if e := c.dflt; e != nil { 706 d = e.String() 707 } 708 if _, err := insertColumn2.l[0].exec(newExecCtx(ctx.db, []interface{}{s.tableName, c.name, notNull, co, d})); err != nil { 709 return nil, err 710 } 711 } 712 713 t.cols0 = append(t.cols0, s.c) 714 if err := t.constraintsAndDefaults(ctx); err != nil { 715 return nil, err 716 } 717 718 return nil, t.updated() 719 } 720 721 func (s *alterTableAddStmt) isUpdating() bool { return true } 722 723 type selectStmt struct { 724 distinct bool 725 flds []*fld 726 from *joinRset 727 group *groupByRset 728 hasAggregates bool 729 limit *limitRset 730 offset *offsetRset 731 order *orderByRset 732 where *whereRset 733 } 734 735 func (s *selectStmt) explain(ctx *execCtx, w strutil.Formatter) { 736 p, err := s.plan(ctx) 737 if err != nil { 738 w.Format("ERROR: %v\n", err) 739 return 740 } 741 742 p.explain(w) 743 } 744 745 func (s *selectStmt) String() string { 746 var b bytes.Buffer 747 b.WriteString("SELECT") 748 if s.distinct { 749 b.WriteString(" DISTINCT") 750 } 751 switch { 752 case len(s.flds) == 0: 753 b.WriteString(" *") 754 default: 755 a := make([]string, len(s.flds)) 756 for i, v := range s.flds { 757 s := v.expr.String() 758 if v.name != "" && v.name != s { 759 s += " AS " + v.name 760 } 761 a[i] = s 762 } 763 b.WriteString(" " + strings.Join(a, ", ")) 764 } 765 if s.from != nil { 766 if !s.from.isZero() { 767 b.WriteString(" FROM ") 768 b.WriteString(s.from.String()) 769 } 770 } 771 772 if s.where != nil { 773 b.WriteString(" WHERE ") 774 b.WriteString(s.where.String()) 775 } 776 if s.group != nil { 777 b.WriteString(" GROUP BY ") 778 b.WriteString(strings.Join(s.group.colNames, ", ")) 779 } 780 if s.order != nil { 781 b.WriteString(" ORDER BY ") 782 b.WriteString(s.order.String()) 783 } 784 if s.limit != nil { 785 b.WriteString(" LIMIT ") 786 b.WriteString(s.limit.expr.String()) 787 } 788 if s.offset != nil { 789 b.WriteString(" OFFSET ") 790 b.WriteString(s.offset.expr.String()) 791 } 792 b.WriteRune(';') 793 return b.String() 794 } 795 796 func (s *selectStmt) plan(ctx *execCtx) (plan, error) { //LATER overlapping goroutines/pipelines 797 var r plan 798 var err error 799 if s.from != nil { 800 r, err = s.from.plan(ctx) 801 if err != nil { 802 return nil, err 803 } 804 } 805 if r == nil { 806 return &selectDummyPlan{flds: s.flds}, nil 807 } 808 if w := s.where; w != nil { 809 if r, err = (&whereRset{expr: w.expr, src: r, sel: w.sel, exists: w.exists}).plan(ctx); err != nil { 810 return nil, err 811 } 812 } 813 switch { 814 case !s.hasAggregates && s.group == nil: // nop 815 case !s.hasAggregates && s.group != nil: 816 if r, err = (&groupByRset{colNames: s.group.colNames, src: r}).plan(ctx); err != nil { 817 return nil, err 818 } 819 case s.hasAggregates && s.group == nil: 820 if r, err = (&groupByRset{src: r}).plan(ctx); err != nil { 821 return nil, err 822 } 823 case s.hasAggregates && s.group != nil: 824 if r, err = (&groupByRset{colNames: s.group.colNames, src: r}).plan(ctx); err != nil { 825 return nil, err 826 } 827 } 828 if r, err = (&selectRset{flds: s.flds, src: r}).plan(ctx); err != nil { 829 return nil, err 830 } 831 832 if s.distinct { 833 if r, err = (&distinctRset{src: r}).plan(ctx); err != nil { 834 return nil, err 835 } 836 } 837 if s := s.order; s != nil { 838 if r, err = (&orderByRset{asc: s.asc, by: s.by, src: r}).plan(ctx); err != nil { 839 return nil, err 840 } 841 } 842 if s := s.offset; s != nil { 843 if r, err = (&offsetRset{s.expr, r}).plan(ctx); err != nil { 844 return nil, err 845 } 846 } 847 if s := s.limit; s != nil { 848 if r, err = (&limitRset{s.expr, r}).plan(ctx); err != nil { 849 return nil, err 850 } 851 } 852 return r, nil 853 } 854 855 func (s *selectStmt) exec(ctx *execCtx) (rs Recordset, err error) { 856 r, err := s.plan(ctx) 857 if err != nil { 858 return nil, err 859 } 860 861 return recordset{ctx, r, nil}, nil 862 } 863 864 func (s *selectStmt) isUpdating() bool { return false } 865 866 type insertIntoStmt struct { 867 colNames []string 868 lists [][]expression 869 sel *selectStmt 870 tableName string 871 872 ifNotExists bool 873 } 874 875 func (s *insertIntoStmt) explain(ctx *execCtx, w strutil.Formatter) { 876 w.Format("%s\n", s) 877 } 878 879 func (s *insertIntoStmt) String() string { 880 cn := "" 881 if len(s.colNames) != 0 { 882 cn = fmt.Sprintf(" (%s)", strings.Join(s.colNames, ", ")) 883 } 884 var ifNotExists string 885 if s.ifNotExists { 886 ifNotExists = " IF NOT EXISTS" 887 } 888 switch { 889 case s.sel != nil: 890 return fmt.Sprintf("INSERT INTO %s%s%s %s;", s.tableName, ifNotExists, cn, s.sel) 891 default: 892 a := make([]string, len(s.lists)) 893 for i, v := range s.lists { 894 b := make([]string, len(v)) 895 for i, v := range v { 896 b[i] = v.String() 897 } 898 a[i] = fmt.Sprintf("(%s)", strings.Join(b, ", ")) 899 } 900 return fmt.Sprintf("INSERT INTO %s%s%s VALUES %s;", s.tableName, ifNotExists, cn, strings.Join(a, ", ")) 901 } 902 } 903 904 func (s *insertIntoStmt) execSelect(t *table, cols []*col, ctx *execCtx) (_ Recordset, err error) { 905 //TODO missing rs column number eq check 906 r, err := s.sel.plan(ctx) 907 if err != nil { 908 return nil, err 909 } 910 911 h := t.head 912 data0 := make([]interface{}, len(t.cols0)+2) 913 cc := ctx.db.cc 914 m := map[interface{}]interface{}{} 915 if err = r.do(ctx, func(_ interface{}, data []interface{}) (more bool, err error) { 916 for i, d := range data { 917 data0[cols[i].index+2] = d 918 } 919 if err = typeCheck(data0[2:], cols); err != nil { 920 return 921 } 922 923 if err = t.checkConstraintsAndDefaults(ctx, data0[2:], m); err != nil { 924 return false, err 925 } 926 927 if s.ifNotExists { 928 id := int64(-1) 929 data0[1] = id 930 for i, v := range t.indices { 931 if v == nil { 932 continue 933 } 934 935 ok, err := v.x.Exists([]interface{}{data0[i+1]}) 936 if err != nil { 937 return false, err 938 } 939 940 if ok { 941 return true, nil 942 } 943 } 944 for _, ix := range t.indices2 { 945 vlist, err := ix.eval(ctx, t.cols, id, data0[2:]) 946 if err != nil { 947 return false, err 948 } 949 950 ok, err := ix.x.Exists(vlist) 951 if err != nil { 952 return false, err 953 } 954 955 if ok { 956 return true, nil 957 } 958 } 959 } 960 961 id, err := t.store.ID() 962 if err != nil { 963 return false, err 964 } 965 966 data0[0] = h 967 data0[1] = id 968 969 // Any overflow chunks are written here. 970 if h, err = t.store.Create(data0...); err != nil { 971 return false, err 972 } 973 974 for i, v := range t.indices { 975 if v == nil { 976 continue 977 } 978 979 // Any overflow chunks are shared with the BTree key 980 if err = v.x.Create([]interface{}{data0[i+1]}, h); err != nil { 981 return false, err 982 } 983 } 984 for _, ix := range t.indices2 { 985 vlist, err := ix.eval(ctx, t.cols, id, data0[2:]) 986 if err != nil { 987 return false, err 988 } 989 990 if err := ix.x.Create(vlist, h); err != nil { 991 return false, err 992 } 993 } 994 995 cc.RowsAffected++ 996 ctx.db.root.lastInsertID = id 997 return true, nil 998 }); err != nil { 999 return nil, err 1000 } 1001 1002 t.head = h 1003 return nil, t.store.Update(t.hhead, h) 1004 } 1005 1006 func (s *insertIntoStmt) exec(ctx *execCtx) (_ Recordset, err error) { 1007 root := ctx.db.root 1008 t, ok := root.tables[s.tableName] 1009 if !ok { 1010 return nil, fmt.Errorf("INSERT INTO %s: table does not exist", s.tableName) 1011 } 1012 1013 var cols []*col 1014 switch len(s.colNames) { 1015 case 0: 1016 cols = t.cols 1017 default: 1018 for _, colName := range s.colNames { 1019 if col := findCol(t.cols, colName); col != nil { 1020 cols = append(cols, col) 1021 continue 1022 } 1023 1024 return nil, fmt.Errorf("INSERT INTO %s: unknown column %s", s.tableName, colName) 1025 } 1026 } 1027 1028 if s.sel != nil { 1029 return s.execSelect(t, cols, ctx) 1030 } 1031 1032 for _, list := range s.lists { 1033 if g, e := len(list), len(cols); g != e { 1034 return nil, fmt.Errorf("INSERT INTO %s: expected %d value(s), have %d", s.tableName, e, g) 1035 } 1036 } 1037 1038 cc := ctx.db.cc 1039 r := make([]interface{}, len(t.cols0)) 1040 m := map[interface{}]interface{}{} 1041 for _, list := range s.lists { 1042 for i, expr := range list { 1043 val, err := expr.eval(ctx, m) 1044 if err != nil { 1045 return nil, err 1046 } 1047 1048 r[cols[i].index] = val 1049 } 1050 if err = typeCheck(r, cols); err != nil { 1051 return nil, err 1052 } 1053 1054 if err = t.checkConstraintsAndDefaults(ctx, r, m); err != nil { 1055 return nil, err 1056 } 1057 1058 id, err := t.addRecord(ctx, r, s.ifNotExists) 1059 if err != nil { 1060 return nil, err 1061 } 1062 1063 if id < 0 { 1064 continue 1065 } 1066 1067 cc.RowsAffected++ 1068 root.lastInsertID = id 1069 } 1070 return nil, nil 1071 } 1072 1073 func (s *insertIntoStmt) isUpdating() bool { return true } 1074 1075 type beginTransactionStmt struct{} 1076 1077 func (s beginTransactionStmt) explain(ctx *execCtx, w strutil.Formatter) { 1078 w.Format("%s\n", s) 1079 } 1080 1081 func (beginTransactionStmt) String() string { return "BEGIN TRANSACTION;" } 1082 func (beginTransactionStmt) exec(*execCtx) (Recordset, error) { 1083 panic("internal error 059") 1084 } 1085 func (beginTransactionStmt) isUpdating() bool { 1086 panic("internal error 060") 1087 } 1088 1089 type commitStmt struct{} 1090 1091 func (s commitStmt) explain(ctx *execCtx, w strutil.Formatter) { 1092 w.Format("%s\n", s) 1093 } 1094 1095 func (commitStmt) String() string { return "COMMIT;" } 1096 func (commitStmt) exec(*execCtx) (Recordset, error) { 1097 panic("internal error 061") 1098 } 1099 func (commitStmt) isUpdating() bool { 1100 panic("internal error 062") 1101 } 1102 1103 type rollbackStmt struct{} 1104 1105 func (s rollbackStmt) explain(ctx *execCtx, w strutil.Formatter) { 1106 w.Format("%s\n", s) 1107 } 1108 1109 func (rollbackStmt) String() string { return "ROLLBACK;" } 1110 func (rollbackStmt) exec(*execCtx) (Recordset, error) { 1111 panic("internal error 063") 1112 } 1113 func (rollbackStmt) isUpdating() bool { 1114 panic("internal error 064") 1115 } 1116 1117 type createIndexStmt struct { 1118 colName string // alt. "id()" for simple index on id() 1119 ifNotExists bool 1120 indexName string 1121 tableName string 1122 unique bool 1123 exprList []expression 1124 } 1125 1126 func (s *createIndexStmt) explain(ctx *execCtx, w strutil.Formatter) { 1127 w.Format("%s\n", s) 1128 } 1129 1130 func (s *createIndexStmt) isSimpleIndex() bool { return s.colName != "" } 1131 1132 func (s *createIndexStmt) String() string { 1133 u := "" 1134 if s.unique { 1135 u = "UNIQUE " 1136 } 1137 e := "" 1138 if s.ifNotExists { 1139 e = "IF NOT EXISTS " 1140 } 1141 expr := s.colName 1142 if !s.isSimpleIndex() { 1143 var a []string 1144 for _, v := range s.exprList { 1145 a = append(a, v.String()) 1146 } 1147 expr = strings.Join(a, ", ") 1148 } 1149 return fmt.Sprintf("CREATE %sINDEX %s%s ON %s (%s);", u, e, s.indexName, s.tableName, expr) 1150 } 1151 1152 func (s *createIndexStmt) exec(ctx *execCtx) (Recordset, error) { 1153 root := ctx.db.root 1154 if t, i := root.findIndexByName(s.indexName); i != nil { 1155 if s.ifNotExists { 1156 return nil, nil 1157 } 1158 1159 return nil, fmt.Errorf("CREATE INDEX: table %s already has an index named %s", t.name, s.indexName) 1160 } 1161 1162 if root.tables[s.indexName] != nil { 1163 return nil, fmt.Errorf("CREATE INDEX: index name collision with existing table: %s", s.indexName) 1164 } 1165 1166 t, ok := root.tables[s.tableName] 1167 if !ok { 1168 return nil, fmt.Errorf("CREATE INDEX: table does not exist %s", s.tableName) 1169 } 1170 1171 if findCol(t.cols, s.indexName) != nil { 1172 return nil, fmt.Errorf("CREATE INDEX: index name collision with existing column: %s", s.indexName) 1173 } 1174 1175 var h int64 1176 var err error 1177 switch { 1178 case s.isSimpleIndex(): 1179 colIndex := -1 1180 if s.colName != "id()" { 1181 c := findCol(t.cols, s.colName) 1182 if c == nil { 1183 return nil, fmt.Errorf("CREATE INDEX: column does not exist: %s", s.colName) 1184 } 1185 1186 colIndex = c.index 1187 } 1188 1189 if h, err = t.addIndex(s.unique, s.indexName, colIndex); err != nil { 1190 return nil, fmt.Errorf("CREATE INDEX: %v", err) 1191 } 1192 1193 if err = t.updated(); err != nil { 1194 return nil, err 1195 } 1196 default: 1197 for _, e := range s.exprList { 1198 m := mentionedColumns(e) 1199 for colName := range m { 1200 c := findCol(t.cols, colName) 1201 if c == nil { 1202 return nil, fmt.Errorf("CREATE INDEX: column does not exist: %s", colName) 1203 } 1204 } 1205 } 1206 if h, err = t.addIndex2(ctx, s.unique, s.indexName, s.exprList); err != nil { 1207 return nil, fmt.Errorf("CREATE INDEX: %v", err) 1208 } 1209 } 1210 1211 switch ctx.db.hasIndex2 { 1212 case 0: 1213 if err := ctx.db.createIndex2(); err != nil { 1214 return nil, err 1215 } 1216 1217 if s.isSimpleIndex() { 1218 return nil, nil 1219 } 1220 case 1: 1221 return nil, nil 1222 case 2: 1223 if s.isSimpleIndex() { 1224 return nil, ctx.db.insertIndex2(s.tableName, s.indexName, []string{s.colName}, s.unique, true, h) 1225 } 1226 default: 1227 panic("internal error 011") 1228 } 1229 1230 exprList := make([]string, 0, len(s.exprList)) 1231 for _, e := range s.exprList { 1232 exprList = append(exprList, e.String()) 1233 } 1234 return nil, ctx.db.insertIndex2(s.tableName, s.indexName, exprList, s.unique, false, h) 1235 } 1236 1237 func (s *createIndexStmt) isUpdating() bool { return true } 1238 1239 type createTableStmt struct { 1240 ifNotExists bool 1241 tableName string 1242 cols []*col 1243 } 1244 1245 func (s *createTableStmt) explain(ctx *execCtx, w strutil.Formatter) { 1246 w.Format("%s\n", s) 1247 } 1248 1249 func (s *createTableStmt) String() string { 1250 a := make([]string, len(s.cols)) 1251 for i, v := range s.cols { 1252 var c, d string 1253 if x := v.constraint; x != nil { 1254 switch e := x.expr; { 1255 case e != nil: 1256 c = " " + e.String() 1257 default: 1258 c = " NOT NULL" 1259 } 1260 } 1261 if x := v.dflt; x != nil { 1262 d = " DEFAULT " + x.String() 1263 } 1264 a[i] = fmt.Sprintf("%s %s%s%s", v.name, typeStr(v.typ), c, d) 1265 } 1266 e := "" 1267 if s.ifNotExists { 1268 e = "IF NOT EXISTS " 1269 } 1270 return fmt.Sprintf("CREATE TABLE %s%s (%s);", e, s.tableName, strings.Join(a, ", ")) 1271 } 1272 1273 func (s *createTableStmt) exec(ctx *execCtx) (_ Recordset, err error) { 1274 var cols []*col 1275 for _, v := range s.cols { 1276 cols = append(cols, v.clone()) 1277 } 1278 root := ctx.db.root 1279 if _, ok := root.tables[s.tableName]; ok { 1280 if s.ifNotExists { 1281 return nil, nil 1282 } 1283 1284 return nil, fmt.Errorf("CREATE TABLE: table exists %s", s.tableName) 1285 } 1286 1287 if t, x := root.findIndexByName(s.tableName); x != nil { 1288 return nil, fmt.Errorf("CREATE TABLE: table %s has index %s", t.name, s.tableName) 1289 } 1290 1291 m := map[string]bool{} 1292 mustCreateColumn2 := true 1293 for i, c := range cols { 1294 nm := c.name 1295 if m[nm] { 1296 return nil, fmt.Errorf("CREATE TABLE: duplicate column %s", nm) 1297 } 1298 1299 m[nm] = true 1300 c.index = i 1301 if c.constraint != nil || c.dflt != nil { 1302 if mustCreateColumn2 { 1303 for _, stmt := range createColumn2.l { 1304 _, err := stmt.exec(newExecCtx(ctx.db, nil)) 1305 if err != nil { 1306 return nil, err 1307 } 1308 } 1309 } 1310 1311 mustCreateColumn2 = false 1312 notNull := c.constraint != nil && c.constraint.expr == nil 1313 var co, d string 1314 if c.constraint != nil && c.constraint.expr != nil { 1315 co = c.constraint.expr.String() 1316 } 1317 if e := c.dflt; e != nil { 1318 d = e.String() 1319 } 1320 if _, err := insertColumn2.l[0].exec(newExecCtx(ctx.db, []interface{}{s.tableName, c.name, notNull, co, d})); err != nil { 1321 return nil, err 1322 } 1323 } 1324 } 1325 t, err := root.createTable(s.tableName, cols) 1326 if err != nil { 1327 return nil, err 1328 } 1329 1330 return nil, t.constraintsAndDefaults(ctx) 1331 } 1332 1333 func (s *createTableStmt) isUpdating() bool { return true }