| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package migrate
- import (
- "database/sql"
- "path/filepath"
- "strings"
- "testing"
- _ "git.ycl.pub/yl32940/TsDB2/DB/driver"
- )
- // 现场复验: 59566B 的 TEXT param → 迁成 Blob → 驱动分页查询读回逐字节一致。
- func TestBlobPagingRepro(t *testing.T) {
- dir := t.TempDir()
- srcPath := filepath.Join(dir, "src.sqlite")
- src, err := OpenSQLite(srcPath, quiet())
- if err != nil {
- t.Fatal(err)
- }
- big := strings.Repeat("P", 59566)
- if _, err := src.db.Exec(`CREATE TABLE "sys_logs" ("id" INTEGER PRIMARY KEY, "param" TEXT, "msg" TEXT)`); err != nil {
- t.Fatal(err)
- }
- for i := 1; i <= 20; i++ {
- p := big
- if i == 7 {
- p = "small"
- }
- if _, err := src.db.Exec(`INSERT INTO "sys_logs" (id, param, msg) VALUES (?, ?, ?)`, i, p, "m"); err != nil {
- t.Fatal(err)
- }
- }
- src.Close()
- dstPath := filepath.Join(dir, "dst.db")
- s, _ := OpenSQLite(srcPath, quiet())
- d, _ := OpenVRTX(dstPath, quiet())
- if _, err := Run(s, d, quiet()); err != nil {
- t.Fatal(err)
- }
- d.Close()
- s.Close()
- // 分页查询形态 (LIMIT/OFFSET 翻页读完 20 行, 每页 7 行)
- vdb, err := sql.Open("vrtx", dstPath)
- if err != nil {
- t.Fatal(err)
- }
- defer vdb.Close()
- var got []string
- for page := 0; page < 3; page++ {
- rows, err := vdb.Query(`SELECT id, param FROM sys_logs ORDER BY id LIMIT 7 OFFSET ?`, page*7)
- if err != nil {
- t.Fatalf("分页查询: %v", err)
- }
- for rows.Next() {
- var id int
- var p []byte
- if err := rows.Scan(&id, &p); err != nil {
- t.Fatalf("读取 BLOB 列 param: %v", err)
- }
- got = append(got, string(p))
- }
- rows.Close()
- }
- if len(got) != 20 {
- t.Fatalf("行数 %d", len(got))
- }
- for i, g := range got {
- want := big
- if i == 6 {
- want = "small"
- }
- if g != want {
- t.Fatalf("第 %d 行 param 不一致 (len=%d want %d)", i+1, len(g), len(want))
- }
- }
- t.Logf("20 行分页读回全部逐字节一致 (含 59566B 大 blob ×19)")
- }
|