FIX (databases): Improve support of minor DBs versions

This commit is contained in:
Rostislav Dugin
2025-12-21 18:19:55 +03:00
parent 7a5654a80a
commit da9b279e8b
2 changed files with 68 additions and 30 deletions

View File

@@ -345,6 +345,7 @@ func (m *MariadbDatabase) buildDSN(password string, database string) string {
// detectMariadbVersion parses VERSION() output to detect MariaDB version
// MariaDB returns strings like "10.11.6-MariaDB" or "11.4.2-MariaDB-1:11.4.2+maria~ubu2204"
// Minor versions are mapped to the closest supported version (e.g., 12.1 → 12.0)
func detectMariadbVersion(ctx context.Context, db *sql.DB) (tools.MariadbVersion, error) {
var versionStr string
err := db.QueryRowContext(ctx, "SELECT VERSION()").Scan(&versionStr)
@@ -367,39 +368,58 @@ func detectMariadbVersion(ctx context.Context, db *sql.DB) (tools.MariadbVersion
major := matches[1]
minor := matches[2]
versionKey := fmt.Sprintf("%s.%s", major, minor)
switch versionKey {
case "5.5":
return mapMariadbVersion(major, minor)
}
func mapMariadbVersion(major, minor string) (tools.MariadbVersion, error) {
switch major {
case "5":
return tools.MariadbVersion55, nil
case "10.1":
return tools.MariadbVersion101, nil
case "10.2":
return tools.MariadbVersion102, nil
case "10.3":
return tools.MariadbVersion103, nil
case "10.4":
return tools.MariadbVersion104, nil
case "10.5":
return tools.MariadbVersion105, nil
case "10.6":
return tools.MariadbVersion106, nil
case "10.11":
return tools.MariadbVersion1011, nil
case "11.4":
return tools.MariadbVersion114, nil
case "11.8":
return tools.MariadbVersion118, nil
case "12.0":
case "10":
return mapMariadb10xVersion(minor)
case "11":
return mapMariadb11xVersion(minor)
case "12":
return tools.MariadbVersion120, nil
default:
return "", fmt.Errorf(
"unsupported MariaDB version: %s (supported: 5.5, 10.1-10.6, 10.11, 11.4, 11.8, 12.0)",
versionKey,
"unsupported MariaDB major version: %s (supported: 5.x, 10.x, 11.x, 12.x)",
major,
)
}
}
func mapMariadb10xVersion(minor string) (tools.MariadbVersion, error) {
switch minor {
case "1":
return tools.MariadbVersion101, nil
case "2":
return tools.MariadbVersion102, nil
case "3":
return tools.MariadbVersion103, nil
case "4":
return tools.MariadbVersion104, nil
case "5":
return tools.MariadbVersion105, nil
case "6", "7", "8", "9", "10":
return tools.MariadbVersion106, nil
default:
return tools.MariadbVersion1011, nil
}
}
func mapMariadb11xVersion(minor string) (tools.MariadbVersion, error) {
switch minor {
case "0", "1", "2", "3", "4":
return tools.MariadbVersion114, nil
case "5", "6", "7", "8":
return tools.MariadbVersion118, nil
default:
return tools.MariadbVersion118, nil
}
}
func decryptPasswordIfNeeded(
password string,
encryptor encryption.FieldEncryptor,

View File

@@ -342,6 +342,8 @@ func (m *MysqlDatabase) buildDSN(password string, database string) string {
)
}
// detectMysqlVersion parses VERSION() output to detect MySQL version
// Minor versions are mapped to the closest supported version (e.g., 8.1 → 8.0, 8.4+ → 8.4)
func detectMysqlVersion(ctx context.Context, db *sql.DB) (tools.MysqlVersion, error) {
var versionStr string
err := db.QueryRowContext(ctx, "SELECT VERSION()").Scan(&versionStr)
@@ -358,15 +360,31 @@ func detectMysqlVersion(ctx context.Context, db *sql.DB) (tools.MysqlVersion, er
major := matches[1]
minor := matches[2]
switch {
case major == "5" && minor == "7":
return mapMysqlVersion(major, minor)
}
func mapMysqlVersion(major, minor string) (tools.MysqlVersion, error) {
switch major {
case "5":
return tools.MysqlVersion57, nil
case major == "8" && minor == "0":
return tools.MysqlVersion80, nil
case major == "8" && minor == "4":
case "8":
return mapMysql8xVersion(minor), nil
case "9":
return tools.MysqlVersion84, nil
default:
return "", fmt.Errorf("unsupported MySQL version: %s.%s", major, minor)
return "", fmt.Errorf(
"unsupported MySQL major version: %s (supported: 5.x, 8.x, 9.x)",
major,
)
}
}
func mapMysql8xVersion(minor string) tools.MysqlVersion {
switch minor {
case "0", "1", "2", "3":
return tools.MysqlVersion80
default:
return tools.MysqlVersion84
}
}