stmt.go 28 KB

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