unique_cache_test.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package storage
  2. import (
  3. "errors"
  4. "fmt"
  5. "testing"
  6. )
  7. func TestUniqueCacheNotPublishedOnCompareConflict(t *testing.T) {
  8. _, _, schemas, tables := newTestSession(t)
  9. createTestTable(t, schemas, "t", []Column{{Name: "id", Type: "INTEGER", PrimaryKey: true}, {Name: "v", Type: "INTEGER"}})
  10. if err := tables.CreateUniqueIndex(&Index{Name: "unique_v", Table: "t", Unique: true, Columns: []IndexColumn{{Name: "v"}}}); err != nil {
  11. t.Fatal(err)
  12. }
  13. if err := tables.Insert("t", Row{"id": int64(1), "v": int64(1)}); err != nil {
  14. t.Fatal(err)
  15. }
  16. session := NewSession(schemas, tables)
  17. if err := session.Begin(); err != nil {
  18. t.Fatal(err)
  19. }
  20. if _, err := session.GetByPK("t", "1"); err != nil {
  21. t.Fatal(err)
  22. }
  23. if _, _, err := session.UpdateByPK("t", "1", func(Row) (Row, error) { return Row{"v": int64(2)}, nil }); err != nil {
  24. t.Fatal(err)
  25. }
  26. if _, _, err := tables.UpdateByPK("t", "1", func(Row) (Row, error) { return Row{"v": int64(3)}, nil }); err != nil {
  27. t.Fatal(err)
  28. }
  29. if err := session.Commit(); !errors.Is(err, ErrSerialization) {
  30. t.Fatalf("commit: %v", err)
  31. }
  32. if err := tables.Insert("t", Row{"id": int64(2), "v": int64(2)}); err != nil {
  33. t.Fatalf("failed commit claimed a value: %v", err)
  34. }
  35. if err := tables.Insert("t", Row{"id": int64(3), "v": int64(3)}); err == nil {
  36. t.Fatal("failed commit lost durable owner")
  37. }
  38. }
  39. func TestUniqueExpressionCacheDoesNotFreezeEvaluator(t *testing.T) {
  40. _, _, schemas, tables := newTestSession(t)
  41. createTestTable(t, schemas, "t", []Column{{Name: "id", Type: "INTEGER", PrimaryKey: true}, {Name: "v", Type: "TEXT"}})
  42. current := false
  43. tables.SetExpressionEvaluator(func(_ string, row Row) (interface{}, error) {
  44. if current {
  45. return "same", nil
  46. }
  47. return fmt.Sprint(row["v"]), nil
  48. })
  49. if err := tables.CreateUniqueIndex(&Index{Name: "expr", Table: "t", Unique: true, Columns: []IndexColumn{{Expression: "value(v)"}}}); err != nil {
  50. t.Fatal(err)
  51. }
  52. if err := tables.Insert("t", Row{"id": int64(1), "v": "a"}); err != nil {
  53. t.Fatal(err)
  54. }
  55. current = true
  56. if err := tables.Insert("t", Row{"id": int64(2), "v": "b"}); err == nil {
  57. t.Fatal("constraint froze expression evaluation")
  58. }
  59. if len(tables.uniqueCache) != 0 {
  60. t.Fatal("expression UNIQUE cache retained without determinism proof")
  61. }
  62. }