| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- package vrtxsql
- import "testing"
- // 稀疏行复现: 同表两行 NULL 模式不同, SELECT * 曾经因列名→下标映射
- // 按第一行复用而错位/越界 panic。
- func TestSparseRowsSelect(t *testing.T) {
- db := openTestDB(t)
- if _, err := db.Exec(`CREATE TABLE t (id BIGINT PRIMARY KEY, a VARCHAR(32), b INT, c VARCHAR(32))`); err != nil {
- t.Fatal(err)
- }
- // 行1: a/b 有值, c NULL; 行2: a NULL, b/c 有值 — 稀疏形状不同
- if _, err := db.Exec(`INSERT INTO t (id, a, b) VALUES (1, 'x', 10)`); err != nil {
- t.Fatal(err)
- }
- if _, err := db.Exec(`INSERT INTO t (id, b, c) VALUES (2, 20, 'y')`); err != nil {
- t.Fatal(err)
- }
- rows, err := db.Query(`SELECT id, a, b, c FROM t ORDER BY id`)
- if err != nil {
- t.Fatal(err)
- }
- defer rows.Close()
- type rec struct {
- id int64
- a []byte
- b int64
- c []byte
- }
- var got []rec
- for rows.Next() {
- var r rec
- var a, c []byte
- if err := rows.Scan(&r.id, &a, &r.b, &c); err != nil {
- t.Fatalf("scan: %v", err)
- }
- r.a, r.c = a, c
- got = append(got, r)
- }
- if len(got) != 2 {
- t.Fatalf("行数 %d", len(got))
- }
- // 行1: a=x b=10 c=NULL
- if string(got[0].a) != "x" || got[0].b != 10 || got[0].c != nil {
- t.Fatalf("行1 错位: %+v", got[0])
- }
- // 行2: a=NULL b=20 c=y
- if got[1].a != nil || got[1].b != 20 || string(got[1].c) != "y" {
- t.Fatalf("行2 错位: %+v", got[1])
- }
- }
|