@@ -4,11 +4,11 @@ import (
44 "database/sql"
55 "flag"
66 "fmt"
7- "strings"
87 "testing"
98
109 "github.com/go-mysql-org/go-mysql/client"
1110 _ "github.com/go-mysql-org/go-mysql/driver"
11+ "github.com/go-mysql-org/go-mysql/mysql"
1212 "github.com/go-mysql-org/go-mysql/test_util"
1313 "github.com/stretchr/testify/require"
1414 "github.com/stretchr/testify/suite"
@@ -176,49 +176,121 @@ func (s *schemaTestSuite) TestSchemaWithMultiValueIndex() {
176176 require .Equal (s .T (), ta , taSqlDb )
177177}
178178
179- // func (s *schemaTestSuite) TestSchemaWithInvisibleIndex() {
180- // _, err := s.conn.Execute(`DROP TABLE IF EXISTS invisible_idx_test`)
181- // require.NoError(s.T(), err)
182-
183- // // Check MySQL version
184- // hasInvisibleIndex := false
185- // if eq, err := s.conn.CompareServerVersion("8.0.0"); err == nil && eq >= 0 {
186- // hasInvisibleIndex = true
187- // }
188-
189- // str := `
190- // CREATE TABLE IF NOT EXISTS invisible_idx_test (
191- // id INT,
192- // name VARCHAR(256),
193- // PRIMARY KEY(id),
194- // INDEX name_idx (name)
195- // ) ENGINE = INNODB;
196- // `
197-
198- // // Add INVISIBLE keyword only for MySQL 8.0+
199- // if hasInvisibleIndex {
200- // str = strings.Replace(str, "INDEX name_idx (name)", "INDEX name_idx (name) INVISIBLE", 1)
201- // }
202-
203- // _, err = s.conn.Execute(str)
204- // require.NoError(s.T(), err)
205-
206- // ta, err := NewTable(s.conn, *schema, "invisible_idx_test")
207- // require.NoError(s.T(), err)
208-
209- // require.Len(s.T(), ta.Indexes, 2)
210- // require.Equal(s.T(), "PRIMARY", ta.Indexes[0].Name)
211- // require.True(s.T(), ta.Indexes[0].Visible)
212- // require.Equal(s.T(), "name_idx", ta.Indexes[1].Name)
213-
214- // if hasInvisibleIndex {
215- // require.False(s.T(), ta.Indexes[1].Visible)
216- // } else {
217- // require.True(s.T(), ta.Indexes[1].Visible)
218- // }
219-
220- // taSqlDb, err := NewTableFromSqlDB(s.sqlDB, *schema, "invisible_idx_test")
221- // require.NoError(s.T(), err)
222-
223- // require.Equal(s.T(), ta, taSqlDb)
224- // }
179+ func (s * schemaTestSuite ) TestSchemaWithInvisibleIndex () {
180+ _ , err := s .conn .Execute (`DROP TABLE IF EXISTS invisible_idx_test` )
181+ require .NoError (s .T (), err )
182+
183+ // Check MySQL version
184+ hasInvisibleIndex := false
185+ versionQuery := "SELECT VERSION()"
186+ r , err := s .conn .Execute (versionQuery )
187+ require .NoError (s .T (), err )
188+
189+ if r .RowNumber () > 0 {
190+ version , _ := r .GetString (0 , 0 )
191+ if eq , err := mysql .CompareServerVersions (version , "8.0.0" ); err == nil && eq >= 0 {
192+ hasInvisibleIndex = true
193+ }
194+ }
195+
196+ str := `
197+ CREATE TABLE IF NOT EXISTS invisible_idx_test (
198+ id INT,
199+ name VARCHAR(256),
200+ email VARCHAR(256),
201+ PRIMARY KEY(id),
202+ INDEX name_idx (name),
203+ INDEX email_idx (email)
204+ ) ENGINE = INNODB;
205+ `
206+
207+ _ , err = s .conn .Execute (str )
208+ require .NoError (s .T (), err )
209+
210+ // Add INVISIBLE keyword only for MySQL 8.0+
211+ if hasInvisibleIndex {
212+ _ , err = s .conn .Execute (`ALTER TABLE invisible_idx_test ALTER INDEX name_idx INVISIBLE` )
213+ require .NoError (s .T (), err )
214+ }
215+
216+ ta , err := NewTable (s .conn , * schema , "invisible_idx_test" )
217+ require .NoError (s .T (), err )
218+
219+ require .Len (s .T (), ta .Indexes , 3 )
220+
221+ // PRIMARY key should always be visible
222+ require .Equal (s .T (), "PRIMARY" , ta .Indexes [0 ].Name )
223+ require .True (s .T (), ta .Indexes [0 ].Visible )
224+
225+ // Find name_idx and email_idx (order may vary)
226+ var nameIdx , emailIdx * Index
227+ for _ , idx := range ta .Indexes {
228+ if idx .Name == "name_idx" {
229+ nameIdx = idx
230+ } else if idx .Name == "email_idx" {
231+ emailIdx = idx
232+ }
233+ }
234+
235+ require .NotNil (s .T (), nameIdx )
236+ require .NotNil (s .T (), emailIdx )
237+
238+ // email_idx should always be visible (default)
239+ require .True (s .T (), emailIdx .Visible )
240+
241+ // name_idx visibility depends on MySQL version
242+ if hasInvisibleIndex {
243+ require .False (s .T (), nameIdx .Visible , "name_idx should be invisible in MySQL 8.0+" )
244+ } else {
245+ require .True (s .T (), nameIdx .Visible , "name_idx should be visible in MySQL <8.0" )
246+ }
247+
248+ taSqlDb , err := NewTableFromSqlDB (s .sqlDB , * schema , "invisible_idx_test" )
249+ require .NoError (s .T (), err )
250+
251+ require .Equal (s .T (), ta , taSqlDb )
252+ }
253+
254+ func TestIndexVisibilityDefault (t * testing.T ) {
255+ // Test that NewIndex creates visible indexes by default
256+ idx := NewIndex ("test_index" )
257+ require .True (t , idx .Visible )
258+
259+ // Test AddIndex creates visible indexes by default
260+ ta := & Table {Schema : "test" , Name : "test_table" }
261+ addedIdx := ta .AddIndex ("added_index" )
262+ require .True (t , addedIdx .Visible )
263+ }
264+
265+ func (s * schemaTestSuite ) TestVisibleFieldInSchema () {
266+ _ , err := s .conn .Execute (`DROP TABLE IF EXISTS visible_field_test` )
267+ require .NoError (s .T (), err )
268+
269+ str := `
270+ CREATE TABLE IF NOT EXISTS visible_field_test (
271+ id INT,
272+ name VARCHAR(256),
273+ PRIMARY KEY(id),
274+ INDEX name_idx (name)
275+ ) ENGINE = INNODB;
276+ `
277+
278+ _ , err = s .conn .Execute (str )
279+ require .NoError (s .T (), err )
280+
281+ ta , err := NewTable (s .conn , * schema , "visible_field_test" )
282+ require .NoError (s .T (), err )
283+
284+ // All indexes should be visible by default
285+ for _ , idx := range ta .Indexes {
286+ require .True (s .T (), idx .Visible , "Index %s should be visible by default" , idx .Name )
287+ }
288+
289+ // Test with SQL DB connection as well
290+ taSqlDb , err := NewTableFromSqlDB (s .sqlDB , * schema , "visible_field_test" )
291+ require .NoError (s .T (), err )
292+
293+ for _ , idx := range taSqlDb .Indexes {
294+ require .True (s .T (), idx .Visible , "Index %s should be visible by default (SQL DB)" , idx .Name )
295+ }
296+ }
0 commit comments