@@ -174,3 +174,175 @@ func (s *schemaTestSuite) TestSchemaWithMultiValueIndex() {
174174
175175 require .Equal (s .T (), ta , taSqlDb )
176176}
177+
178+ func (s * schemaTestSuite ) TestSchemaWithInvisibleIndex () {
179+ _ , err := s .conn .Execute (`DROP TABLE IF EXISTS invisible_idx_test` )
180+ require .NoError (s .T (), err )
181+
182+ // Create table first to check invisible index support via column presence
183+ str := `
184+ CREATE TABLE IF NOT EXISTS invisible_idx_test (
185+ id INT,
186+ name VARCHAR(256),
187+ email VARCHAR(256),
188+ PRIMARY KEY(id),
189+ INDEX name_idx (name),
190+ INDEX email_idx (email)
191+ ) ENGINE = INNODB;
192+ `
193+
194+ _ , err = s .conn .Execute (str )
195+ require .NoError (s .T (), err )
196+
197+ // Check if invisible index support exists by checking SHOW INDEX columns
198+ r , err := s .conn .Execute (fmt .Sprintf ("SHOW INDEX FROM `%s`.`%s`" , * schema , "invisible_idx_test" ))
199+ require .NoError (s .T (), err )
200+ hasInvisibleIndex := hasInvisibleIndexSupportFromResult (r )
201+
202+ // Add INVISIBLE keyword only if database supports it
203+ if hasInvisibleIndex {
204+ _ , err = s .conn .Execute (`ALTER TABLE invisible_idx_test ALTER INDEX name_idx INVISIBLE` )
205+ require .NoError (s .T (), err )
206+ }
207+
208+ ta , err := NewTable (s .conn , * schema , "invisible_idx_test" )
209+ require .NoError (s .T (), err )
210+
211+ require .Len (s .T (), ta .Indexes , 3 )
212+
213+ // PRIMARY key should always be visible
214+ require .Equal (s .T (), "PRIMARY" , ta .Indexes [0 ].Name )
215+ require .True (s .T (), ta .Indexes [0 ].Visible )
216+
217+ // Find name_idx and email_idx (order may vary)
218+ var nameIdx , emailIdx * Index
219+ for _ , idx := range ta .Indexes {
220+ switch idx .Name {
221+ case "name_idx" :
222+ nameIdx = idx
223+ case "email_idx" :
224+ emailIdx = idx
225+ }
226+ }
227+
228+ require .NotNil (s .T (), nameIdx )
229+ require .NotNil (s .T (), emailIdx )
230+
231+ // email_idx should always be visible (default)
232+ require .True (s .T (), emailIdx .Visible )
233+
234+ // name_idx visibility depends on database support for invisible indexes
235+ if hasInvisibleIndex {
236+ require .False (s .T (), nameIdx .Visible , "name_idx should be invisible when database supports invisible indexes" )
237+ } else {
238+ require .True (s .T (), nameIdx .Visible , "name_idx should be visible when database doesn't support invisible indexes" )
239+ }
240+
241+ taSqlDb , err := NewTableFromSqlDB (s .sqlDB , * schema , "invisible_idx_test" )
242+ require .NoError (s .T (), err )
243+
244+ require .Equal (s .T (), ta , taSqlDb )
245+ }
246+
247+ func (s * schemaTestSuite ) TestInvisibleIndexColumnDetection () {
248+ _ , err := s .conn .Execute (`DROP TABLE IF EXISTS column_detection_test` )
249+ require .NoError (s .T (), err )
250+
251+ str := `
252+ CREATE TABLE IF NOT EXISTS column_detection_test (
253+ id INT PRIMARY KEY,
254+ name VARCHAR(256),
255+ INDEX name_idx (name)
256+ ) ENGINE = INNODB;
257+ `
258+
259+ _ , err = s .conn .Execute (str )
260+ require .NoError (s .T (), err )
261+
262+ // Test both detection functions work consistently
263+ r , err := s .conn .Execute (fmt .Sprintf ("SHOW INDEX FROM `%s`.`%s`" , * schema , "column_detection_test" ))
264+ require .NoError (s .T (), err )
265+
266+ hasInvisibleFromResult := hasInvisibleIndexSupportFromResult (r )
267+
268+ // Get columns and test the other detection function
269+ cols , err := s .sqlDB .Query (fmt .Sprintf ("SHOW INDEX FROM `%s`.`%s`" , * schema , "column_detection_test" ))
270+ require .NoError (s .T (), err )
271+ defer cols .Close ()
272+
273+ columnNames , err := cols .Columns ()
274+ require .NoError (s .T (), err )
275+ hasInvisibleFromColumns := hasInvisibleIndexSupportFromColumns (columnNames )
276+
277+ // Both detection methods should agree
278+ require .Equal (s .T (), hasInvisibleFromResult , hasInvisibleFromColumns , "Detection methods should be consistent" )
279+
280+ // Test that both connection types work identically
281+ ta1 , err := NewTable (s .conn , * schema , "column_detection_test" )
282+ require .NoError (s .T (), err )
283+
284+ ta2 , err := NewTableFromSqlDB (s .sqlDB , * schema , "column_detection_test" )
285+ require .NoError (s .T (), err )
286+
287+ require .Equal (s .T (), ta1 , ta2 , "Both connection types should produce identical results" )
288+ }
289+
290+ func TestInvisibleIndexLogic (t * testing.T ) {
291+ // Test MySQL-style visibility logic
292+ require .True (t , isIndexInvisible ("NO" ), "Visible=NO should be invisible" )
293+ require .False (t , isIndexInvisible ("YES" ), "Visible=YES should be visible" )
294+
295+ // Test case insensitivity
296+ require .True (t , isIndexInvisible ("no" ), "Should be case insensitive" )
297+ require .True (t , isIndexInvisible ("No" ), "Should be case insensitive" )
298+ require .False (t , isIndexInvisible ("yes" ), "Should be case insensitive" )
299+ require .False (t , isIndexInvisible ("YES" ), "Should be case insensitive" )
300+
301+ // Test other values default to visible
302+ require .False (t , isIndexInvisible ("" ), "Empty string should default to visible" )
303+ require .False (t , isIndexInvisible ("UNKNOWN" ), "Unknown value should default to visible" )
304+ }
305+
306+ func TestIndexVisibilityDefault (t * testing.T ) {
307+ // Test that NewIndex creates visible indexes by default
308+ idx := NewIndex ("test_index" )
309+ require .True (t , idx .Visible )
310+
311+ // Test AddIndex creates visible indexes by default
312+ ta := & Table {Schema : "test" , Name : "test_table" }
313+ addedIdx := ta .AddIndex ("added_index" )
314+ require .True (t , addedIdx .Visible )
315+ }
316+
317+ func (s * schemaTestSuite ) TestVisibleFieldInSchema () {
318+ _ , err := s .conn .Execute (`DROP TABLE IF EXISTS visible_field_test` )
319+ require .NoError (s .T (), err )
320+
321+ str := `
322+ CREATE TABLE IF NOT EXISTS visible_field_test (
323+ id INT,
324+ name VARCHAR(256),
325+ PRIMARY KEY(id),
326+ INDEX name_idx (name)
327+ ) ENGINE = INNODB;
328+ `
329+
330+ _ , err = s .conn .Execute (str )
331+ require .NoError (s .T (), err )
332+
333+ ta , err := NewTable (s .conn , * schema , "visible_field_test" )
334+ require .NoError (s .T (), err )
335+
336+ // All indexes should be visible by default
337+ for _ , idx := range ta .Indexes {
338+ require .True (s .T (), idx .Visible , "Index %s should be visible by default" , idx .Name )
339+ }
340+
341+ // Test with SQL DB connection as well
342+ taSqlDb , err := NewTableFromSqlDB (s .sqlDB , * schema , "visible_field_test" )
343+ require .NoError (s .T (), err )
344+
345+ for _ , idx := range taSqlDb .Indexes {
346+ require .True (s .T (), idx .Visible , "Index %s should be visible by default (SQL DB)" , idx .Name )
347+ }
348+ }
0 commit comments