Skip to content

Commit 3916cea

Browse files
authored
Merge pull request #614 from dumdev25/main
gen mysql driver includes a check for mariaDB compatibility
2 parents 4f2e761 + 2097e8c commit 3916cea

File tree

2 files changed

+30
-11
lines changed

2 files changed

+30
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313
- MySQL support for insert queries executing loaders (e.g., `InsertThenLoad`, `InsertThenLoadCount`). (thanks @jacobmolby)
1414
- Added overwritable hooks that are run before the exec or scanning test of generated queries. This allows seeding data before the test runs.
1515
- Added `bob.Each` function to iterate over query results (range-over-func). (thanks @toqueteos)
16+
- Added MariaDB compatibility check in gen/bobgen-mysql (thanks @dumdev25)
1617

1718
### Fixed
1819

gen/bobgen-mysql/driver/mysql.go

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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
338338
func (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

Comments
 (0)