@@ -62,11 +62,11 @@ func (d *driver) Assemble(ctx context.Context) (*DBInfo, error) {
6262 var dbinfo * DBInfo
6363 var err error
6464
65- if d .config .Dsn == "" {
65+ if d .config .Config . Dsn == "" {
6666 return nil , fmt .Errorf ("database dsn is not set" )
6767 }
6868
69- config , err := mysql .ParseDSN (d .config .Dsn )
69+ config , err := mysql .ParseDSN (d .config .Config . Dsn )
7070 if err != nil {
7171 return nil , err
7272 }
@@ -76,15 +76,15 @@ func (d *driver) Assemble(ctx context.Context) (*DBInfo, error) {
7676 }
7777 d .dbName = config .DBName
7878
79- d .conn , err = sql .Open ("mysql" , d .config .Dsn )
79+ d .conn , err = sql .Open ("mysql" , d .config .Config . Dsn )
8080 if err != nil {
8181 return nil , fmt .Errorf ("failed to connect to database: %w" , err )
8282 }
8383 defer d .conn .Close ()
8484
8585 dbinfo = & DBInfo {Driver : "github.com/go-sql-driver/mysql" }
8686
87- dbinfo .Tables , err = drivers .BuildDBInfo [any ](ctx , d , d .config .Concurrency , d .config .Only , d .config .Except )
87+ dbinfo .Tables , err = drivers .BuildDBInfo [any ](ctx , d , d .config .Concurrency , d .config .Config . Only , d .config . Config .Except )
8888 if err != nil {
8989 return nil , err
9090 }
@@ -94,7 +94,7 @@ func (d *driver) Assemble(ctx context.Context) (*DBInfo, error) {
9494 return dbinfo .Enums [i ].Type < dbinfo .Enums [j ].Type
9595 })
9696
97- dbinfo .QueryFolders , err = parser .New (dbinfo .Tables ).ParseFolders (ctx , d .config .Queries ... )
97+ dbinfo .QueryFolders , err = parser .New (dbinfo .Tables ).ParseFolders (ctx , d .config .Config . Queries ... )
9898 if err != nil {
9999 return nil , fmt .Errorf ("parse query folders: %w" , err )
100100 }
@@ -268,9 +268,9 @@ func (d *driver) Constraints(ctx context.Context, _ drivers.ColumnFilter) (drive
268268 referenced_table_name AS foreign_table,
269269 referenced_column_name AS foreign_column
270270 FROM information_schema.table_constraints AS tc
271- LEFT JOIN information_schema.key_column_usage AS kcu
272- ON kcu.table_name = tc.table_name
273- AND kcu.table_schema = tc.table_schema
271+ LEFT JOIN information_schema.key_column_usage AS kcu
272+ ON kcu.table_name = tc.table_name
273+ AND kcu.table_schema = tc.table_schema
274274 AND kcu.constraint_name = tc.constraint_name
275275 WHERE tc.constraint_type IN ('PRIMARY KEY', 'UNIQUE', 'FOREIGN KEY') AND tc.table_schema = ?
276276 ORDER BY tc.table_name, tc.constraint_name, tc.constraint_type, kcu.ordinal_position`
@@ -338,18 +338,36 @@ func (d *driver) Constraints(ctx context.Context, _ drivers.ColumnFilter) (drive
338338func (d * driver ) Indexes (ctx context.Context ) (drivers.DBIndexes [any ], error ) {
339339 ret := drivers.DBIndexes [any ]{}
340340
341- query := `SELECT
341+ // Check if expression column exists (MySQL 8.0.13+, not in MariaDB)
342+ var hasExpression bool
343+ checkQuery := `SELECT COUNT(*)
344+ FROM information_schema.columns
345+ WHERE table_schema = 'information_schema'
346+ AND table_name = 'STATISTICS'
347+ AND column_name = 'EXPRESSION'`
348+ var count int
349+ if err := d .conn .QueryRowContext (ctx , checkQuery ).Scan (& count ); err == nil {
350+ hasExpression = count > 0
351+ }
352+
353+ // Build query with conditional expression column
354+ expressionColumn := "NULL"
355+ if hasExpression {
356+ expressionColumn = "s.expression"
357+ }
358+
359+ query := fmt .Sprintf (`SELECT
342360 s.table_name AS table_name,
343361 s.index_name AS index_name,
344362 s.column_name AS column_name,
345- s.expression AS expression,
363+ %s AS expression,
346364 NOT s.non_unique AS is_unique,
347365 s.collation = 'D' AS descending,
348366 s.index_type as type,
349367 s.index_comment as comment
350368 FROM information_schema.statistics s
351369 WHERE s.table_schema = ?
352- ORDER BY s.table_name, s.index_name, s.seq_in_index`
370+ ORDER BY s.table_name, s.index_name, s.seq_in_index` , expressionColumn )
353371
354372 type indexColumn struct {
355373 TableName string
0 commit comments