| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package executor
- import (
- "reflect"
- "testing"
- "github.com/danfragoso/pizzasql-next/pkg/storage"
- "github.com/danfragoso/pizzasql-next/pkg/testkv"
- )
- func TestExclusiveCommitsMaintainWarmIndexesAndCounts(t *testing.T) {
- kv := testkv.New(t)
- pool := kv.Pool(8)
- defer pool.Close()
- schema := storage.NewSchemaManager(pool, "cache_commit")
- table := storage.NewTableManager(pool, schema, "cache_commit")
- e := newExec(schema, table)
- execMust(t, e, "CREATE TABLE t (pk TEXT PRIMARY KEY, v INTEGER, u INTEGER UNIQUE)")
- execMust(t, e, "CREATE INDEX idx_v ON t(v)")
- execMust(t, e, "INSERT INTO t VALUES ('a',1,10),('b',2,20)")
- execMust(t, e, "SELECT pk FROM t WHERE v=1")
- execMust(t, e, "SELECT pk FROM t WHERE u=10")
- execMust(t, e, "SELECT COUNT(*) FROM t")
- check := func(sql string, want [][]interface{}) {
- t.Helper()
- before := kv.RequestCount(10)
- got := execMust(t, e, sql).Rows
- if len(got) != len(want) || (len(got) > 0 && !reflect.DeepEqual(got, want)) {
- t.Fatalf("%s: got %v want %v", sql, got, want)
- }
- if pages := kv.RequestCount(10) - before; pages != 0 {
- t.Fatalf("%s rebuilt a warm cache (%d pages)", sql, pages)
- }
- }
- execMust(t, e, "INSERT INTO t VALUES ('c',3,30)")
- check("SELECT pk FROM t WHERE v=3", [][]interface{}{{"c"}})
- check("SELECT COUNT(*) FROM t", [][]interface{}{{int64(3)}})
- execMust(t, e, "UPDATE t SET v=4,u=40 WHERE pk='c'")
- check("SELECT pk FROM t WHERE v=3", nil)
- check("SELECT pk FROM t WHERE v=4", [][]interface{}{{"c"}})
- check("SELECT pk FROM t WHERE u=30", nil)
- check("SELECT pk FROM t WHERE u=40", [][]interface{}{{"c"}})
- execMust(t, e, "UPDATE t SET pk='z' WHERE pk='c'")
- check("SELECT pk FROM t WHERE v=4", [][]interface{}{{"z"}})
- check("SELECT pk FROM t WHERE u=40", [][]interface{}{{"z"}})
- execMust(t, e, "BEGIN")
- execMust(t, e, "DELETE FROM t WHERE pk='a'")
- execMust(t, e, "INSERT INTO t VALUES ('a',9,90)")
- execMust(t, e, "COMMIT")
- check("SELECT pk FROM t WHERE v=1", nil)
- check("SELECT pk FROM t WHERE v=9", [][]interface{}{{"a"}})
- check("SELECT COUNT(*) FROM t", [][]interface{}{{int64(3)}})
- execMust(t, e, "UPDATE t SET u=110-u WHERE pk IN ('a','b')")
- check("SELECT pk FROM t WHERE u=20", [][]interface{}{{"a"}})
- check("SELECT pk FROM t WHERE u=90", [][]interface{}{{"b"}})
- execMust(t, e, "BEGIN")
- execMust(t, e, "INSERT INTO t VALUES ('c',3,30)")
- execMust(t, e, "ROLLBACK")
- check("SELECT pk FROM t WHERE v=3", nil)
- execMust(t, e, "DELETE FROM t WHERE pk='b'")
- check("SELECT pk FROM t WHERE u=90", nil)
- check("SELECT COUNT(*) FROM t", [][]interface{}{{int64(2)}})
- execMust(t, e, "DELETE FROM t")
- check("SELECT pk FROM t WHERE v=4", nil)
- check("SELECT COUNT(*) FROM t", [][]interface{}{{int64(0)}})
- }
|