sparse_rows_test.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package vrtxsql
  2. import "testing"
  3. // 稀疏行复现: 同表两行 NULL 模式不同, SELECT * 曾经因列名→下标映射
  4. // 按第一行复用而错位/越界 panic。
  5. func TestSparseRowsSelect(t *testing.T) {
  6. db := openTestDB(t)
  7. if _, err := db.Exec(`CREATE TABLE t (id BIGINT PRIMARY KEY, a VARCHAR(32), b INT, c VARCHAR(32))`); err != nil {
  8. t.Fatal(err)
  9. }
  10. // 行1: a/b 有值, c NULL; 行2: a NULL, b/c 有值 — 稀疏形状不同
  11. if _, err := db.Exec(`INSERT INTO t (id, a, b) VALUES (1, 'x', 10)`); err != nil {
  12. t.Fatal(err)
  13. }
  14. if _, err := db.Exec(`INSERT INTO t (id, b, c) VALUES (2, 20, 'y')`); err != nil {
  15. t.Fatal(err)
  16. }
  17. rows, err := db.Query(`SELECT id, a, b, c FROM t ORDER BY id`)
  18. if err != nil {
  19. t.Fatal(err)
  20. }
  21. defer rows.Close()
  22. type rec struct {
  23. id int64
  24. a []byte
  25. b int64
  26. c []byte
  27. }
  28. var got []rec
  29. for rows.Next() {
  30. var r rec
  31. var a, c []byte
  32. if err := rows.Scan(&r.id, &a, &r.b, &c); err != nil {
  33. t.Fatalf("scan: %v", err)
  34. }
  35. r.a, r.c = a, c
  36. got = append(got, r)
  37. }
  38. if len(got) != 2 {
  39. t.Fatalf("行数 %d", len(got))
  40. }
  41. // 行1: a=x b=10 c=NULL
  42. if string(got[0].a) != "x" || got[0].b != 10 || got[0].c != nil {
  43. t.Fatalf("行1 错位: %+v", got[0])
  44. }
  45. // 行2: a=NULL b=20 c=y
  46. if got[1].a != nil || got[1].b != 20 || string(got[1].c) != "y" {
  47. t.Fatalf("行2 错位: %+v", got[1])
  48. }
  49. }