Skip to content

Commit ccf204b

Browse files
authored
Handle null index column names in sql.DB loader (#904)
For developers using multi-value indexes, the column name as reported by `show index...` is null.
1 parent 24fbb5b commit ccf204b

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

schema/schema.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,8 @@ func (ta *Table) fetchIndexesViaSqlDB(conn *sql.DB) error {
354354
var unusedVal interface{}
355355

356356
for r.Next() {
357-
var indexName, colName string
357+
var indexName string
358+
var colName sql.NullString
358359
var noneUnique uint64
359360
var cardinality interface{}
360361
cols, err := r.Columns()
@@ -387,7 +388,12 @@ func (ta *Table) fetchIndexesViaSqlDB(conn *sql.DB) error {
387388
}
388389

389390
c := toUint64(cardinality)
390-
currentIndex.AddColumn(colName, c)
391+
// If colName is a null string, switch to ""
392+
if colName.Valid {
393+
currentIndex.AddColumn(colName.String, c)
394+
} else {
395+
currentIndex.AddColumn("", c)
396+
}
391397
currentIndex.NoneUnique = noneUnique
392398
}
393399

schema/schema_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,41 @@ func (s *schemaTestSuite) TestQuoteSchema() {
134134

135135
require.Equal(s.T(), "a.b", ta.Columns[0].Name)
136136
}
137+
138+
func (s *schemaTestSuite) TestSchemaWithMultiValueIndex() {
139+
_, err := s.conn.Execute(`DROP TABLE IF EXISTS multi_value_idx_test`)
140+
require.NoError(s.T(), err)
141+
142+
str := `
143+
CREATE TABLE IF NOT EXISTS multi_value_idx_test (
144+
id INT,
145+
entries json,
146+
PRIMARY KEY(id)
147+
) ENGINE = INNODB;
148+
`
149+
150+
_, err = s.conn.Execute(str)
151+
require.NoError(s.T(), err)
152+
153+
str = `CREATE INDEX idx_entries ON multi_value_idx_test((CAST((entries->'$') AS CHAR(64))));`
154+
_, err = s.conn.Execute(str)
155+
require.NoError(s.T(), err)
156+
157+
ta, err := NewTable(s.conn, *schema, "multi_value_idx_test")
158+
require.NoError(s.T(), err)
159+
160+
require.Len(s.T(), ta.Indexes, 2)
161+
162+
require.Equal(s.T(), "PRIMARY", ta.Indexes[0].Name)
163+
require.Len(s.T(), ta.Indexes[0].Columns, 1)
164+
require.Equal(s.T(), "id", ta.Indexes[0].Columns[0])
165+
166+
require.Equal(s.T(), "idx_entries", ta.Indexes[1].Name)
167+
require.Len(s.T(), ta.Indexes[1].Columns, 1)
168+
require.Equal(s.T(), "", ta.Indexes[1].Columns[0])
169+
170+
taSqlDb, err := NewTableFromSqlDB(s.sqlDB, *schema, "multi_value_idx_test")
171+
require.NoError(s.T(), err)
172+
173+
require.Equal(s.T(), ta, taSqlDb)
174+
}

0 commit comments

Comments
 (0)