vacuum_blob_test.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package core
  2. import (
  3. "bytes"
  4. "strings"
  5. "testing"
  6. "git.ycl.pub/yl32940/TsDB2/DB/core/page"
  7. "git.ycl.pub/yl32940/TsDB2/DB/core/types"
  8. )
  9. func TestVacuumBlobChain(t *testing.T) {
  10. db := fixOpenDB(t)
  11. tbl, err := db.CreateTable("docs", []types.FieldInfo{
  12. {FieldType: types.FieldType_Uint64, FieldName: []byte("id")},
  13. {FieldType: types.FieldType_Blob, FieldName: []byte("body")},
  14. })
  15. if err != nil {
  16. t.Fatal(err)
  17. }
  18. if _, err := tbl.CreateIndex("pk", page.IndexTypePrimary, []byte{0}); err != nil {
  19. t.Fatal(err)
  20. }
  21. big := strings.Repeat("V", 60000)
  22. if _, err := tbl.InsertRowWithID(1, []types.FieldValue{
  23. {FieldName: []byte("id"), Value: uint64(1)},
  24. {FieldName: []byte("body"), Value: []byte(big)},
  25. }); err != nil {
  26. t.Fatal(err)
  27. }
  28. db.Commit()
  29. if _, err := db.VACUUM(); err != nil {
  30. t.Fatal(err)
  31. }
  32. tbl2, ok := db.FindTable("docs")
  33. if !ok {
  34. t.Fatal("vacuum 后表丢失")
  35. }
  36. vals, err := tbl2.FindByPK(1)
  37. if err != nil {
  38. t.Fatalf("VACUUM 后读取: %v", err)
  39. }
  40. var ref types.BlobRef
  41. found := false
  42. for _, fv := range vals {
  43. if string(fv.FieldName) == "body" {
  44. ref, found = fv.Value.(types.BlobRef)
  45. }
  46. }
  47. if !found || ref.Empty() {
  48. t.Fatalf("body 列丢失或引用为空 (found=%v ref=%+v)", found, ref)
  49. }
  50. body, err := tbl2.BlobRead(ref, types.CompressNone)
  51. if err != nil {
  52. t.Fatalf("BlobRead (驱动物化同路径): %v", err)
  53. }
  54. if !bytes.Equal(body, []byte(big)) {
  55. t.Fatalf("VACUUM 后 body 不一致: got %d B want %d B", len(body), len(big))
  56. }
  57. t.Logf("VACUUM 后 blob 链完整可读 (%d B)", len(body))
  58. }