cache_commit_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package executor
  2. import (
  3. "reflect"
  4. "testing"
  5. "github.com/danfragoso/pizzasql-next/pkg/storage"
  6. "github.com/danfragoso/pizzasql-next/pkg/testkv"
  7. )
  8. func TestExclusiveCommitsMaintainWarmIndexesAndCounts(t *testing.T) {
  9. kv := testkv.New(t)
  10. pool := kv.Pool(8)
  11. defer pool.Close()
  12. schema := storage.NewSchemaManager(pool, "cache_commit")
  13. table := storage.NewTableManager(pool, schema, "cache_commit")
  14. e := newExec(schema, table)
  15. execMust(t, e, "CREATE TABLE t (pk TEXT PRIMARY KEY, v INTEGER, u INTEGER UNIQUE)")
  16. execMust(t, e, "CREATE INDEX idx_v ON t(v)")
  17. execMust(t, e, "INSERT INTO t VALUES ('a',1,10),('b',2,20)")
  18. execMust(t, e, "SELECT pk FROM t WHERE v=1")
  19. execMust(t, e, "SELECT pk FROM t WHERE u=10")
  20. execMust(t, e, "SELECT COUNT(*) FROM t")
  21. check := func(sql string, want [][]interface{}) {
  22. t.Helper()
  23. before := kv.RequestCount(10)
  24. got := execMust(t, e, sql).Rows
  25. if len(got) != len(want) || (len(got) > 0 && !reflect.DeepEqual(got, want)) {
  26. t.Fatalf("%s: got %v want %v", sql, got, want)
  27. }
  28. if pages := kv.RequestCount(10) - before; pages != 0 {
  29. t.Fatalf("%s rebuilt a warm cache (%d pages)", sql, pages)
  30. }
  31. }
  32. execMust(t, e, "INSERT INTO t VALUES ('c',3,30)")
  33. check("SELECT pk FROM t WHERE v=3", [][]interface{}{{"c"}})
  34. check("SELECT COUNT(*) FROM t", [][]interface{}{{int64(3)}})
  35. execMust(t, e, "UPDATE t SET v=4,u=40 WHERE pk='c'")
  36. check("SELECT pk FROM t WHERE v=3", nil)
  37. check("SELECT pk FROM t WHERE v=4", [][]interface{}{{"c"}})
  38. check("SELECT pk FROM t WHERE u=30", nil)
  39. check("SELECT pk FROM t WHERE u=40", [][]interface{}{{"c"}})
  40. execMust(t, e, "UPDATE t SET pk='z' WHERE pk='c'")
  41. check("SELECT pk FROM t WHERE v=4", [][]interface{}{{"z"}})
  42. check("SELECT pk FROM t WHERE u=40", [][]interface{}{{"z"}})
  43. execMust(t, e, "BEGIN")
  44. execMust(t, e, "DELETE FROM t WHERE pk='a'")
  45. execMust(t, e, "INSERT INTO t VALUES ('a',9,90)")
  46. execMust(t, e, "COMMIT")
  47. check("SELECT pk FROM t WHERE v=1", nil)
  48. check("SELECT pk FROM t WHERE v=9", [][]interface{}{{"a"}})
  49. check("SELECT COUNT(*) FROM t", [][]interface{}{{int64(3)}})
  50. execMust(t, e, "UPDATE t SET u=110-u WHERE pk IN ('a','b')")
  51. check("SELECT pk FROM t WHERE u=20", [][]interface{}{{"a"}})
  52. check("SELECT pk FROM t WHERE u=90", [][]interface{}{{"b"}})
  53. execMust(t, e, "BEGIN")
  54. execMust(t, e, "INSERT INTO t VALUES ('c',3,30)")
  55. execMust(t, e, "ROLLBACK")
  56. check("SELECT pk FROM t WHERE v=3", nil)
  57. execMust(t, e, "DELETE FROM t WHERE pk='b'")
  58. check("SELECT pk FROM t WHERE u=90", nil)
  59. check("SELECT COUNT(*) FROM t", [][]interface{}{{int64(2)}})
  60. execMust(t, e, "DELETE FROM t")
  61. check("SELECT pk FROM t WHERE v=4", nil)
  62. check("SELECT COUNT(*) FROM t", [][]interface{}{{int64(0)}})
  63. }