blob_paging_test.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package migrate
  2. import (
  3. "database/sql"
  4. "path/filepath"
  5. "strings"
  6. "testing"
  7. _ "git.ycl.pub/yl32940/TsDB2/DB/driver"
  8. )
  9. // 现场复验: 59566B 的 TEXT param → 迁成 Blob → 驱动分页查询读回逐字节一致。
  10. func TestBlobPagingRepro(t *testing.T) {
  11. dir := t.TempDir()
  12. srcPath := filepath.Join(dir, "src.sqlite")
  13. src, err := OpenSQLite(srcPath, quiet())
  14. if err != nil {
  15. t.Fatal(err)
  16. }
  17. big := strings.Repeat("P", 59566)
  18. if _, err := src.db.Exec(`CREATE TABLE "sys_logs" ("id" INTEGER PRIMARY KEY, "param" TEXT, "msg" TEXT)`); err != nil {
  19. t.Fatal(err)
  20. }
  21. for i := 1; i <= 20; i++ {
  22. p := big
  23. if i == 7 {
  24. p = "small"
  25. }
  26. if _, err := src.db.Exec(`INSERT INTO "sys_logs" (id, param, msg) VALUES (?, ?, ?)`, i, p, "m"); err != nil {
  27. t.Fatal(err)
  28. }
  29. }
  30. src.Close()
  31. dstPath := filepath.Join(dir, "dst.db")
  32. s, _ := OpenSQLite(srcPath, quiet())
  33. d, _ := OpenVRTX(dstPath, quiet())
  34. if _, err := Run(s, d, quiet()); err != nil {
  35. t.Fatal(err)
  36. }
  37. d.Close()
  38. s.Close()
  39. // 分页查询形态 (LIMIT/OFFSET 翻页读完 20 行, 每页 7 行)
  40. vdb, err := sql.Open("vrtx", dstPath)
  41. if err != nil {
  42. t.Fatal(err)
  43. }
  44. defer vdb.Close()
  45. var got []string
  46. for page := 0; page < 3; page++ {
  47. rows, err := vdb.Query(`SELECT id, param FROM sys_logs ORDER BY id LIMIT 7 OFFSET ?`, page*7)
  48. if err != nil {
  49. t.Fatalf("分页查询: %v", err)
  50. }
  51. for rows.Next() {
  52. var id int
  53. var p []byte
  54. if err := rows.Scan(&id, &p); err != nil {
  55. t.Fatalf("读取 BLOB 列 param: %v", err)
  56. }
  57. got = append(got, string(p))
  58. }
  59. rows.Close()
  60. }
  61. if len(got) != 20 {
  62. t.Fatalf("行数 %d", len(got))
  63. }
  64. for i, g := range got {
  65. want := big
  66. if i == 6 {
  67. want = "small"
  68. }
  69. if g != want {
  70. t.Fatalf("第 %d 行 param 不一致 (len=%d want %d)", i+1, len(g), len(want))
  71. }
  72. }
  73. t.Logf("20 行分页读回全部逐字节一致 (含 59566B 大 blob ×19)")
  74. }