Skip to content

Commit c538c38

Browse files
committed
Disable Returning for mariadb < 10.5, close go-gorm#93
1 parent bf5c03d commit c538c38

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

mysql.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"database/sql"
66
"fmt"
77
"math"
8+
"regexp"
9+
"strconv"
810
"strings"
911
"time"
1012

@@ -119,7 +121,9 @@ func (dialector Dialector) Initialize(db *gorm.DB) (err error) {
119121
dialector.Config.DontSupportRenameColumn = true
120122
dialector.Config.DontSupportForShareClause = true
121123
dialector.Config.DontSupportNullAsDefaultValue = true
122-
withReturning = true
124+
if checkVersion(dialector.ServerVersion, "10.5") {
125+
withReturning = true
126+
}
123127
} else if strings.HasPrefix(dialector.ServerVersion, "5.6.") {
124128
dialector.Config.DontSupportRenameIndex = true
125129
dialector.Config.DontSupportRenameColumn = true
@@ -454,3 +458,29 @@ func (dialector Dialector) SavePoint(tx *gorm.DB, name string) error {
454458
func (dialector Dialector) RollbackTo(tx *gorm.DB, name string) error {
455459
return tx.Exec("ROLLBACK TO SAVEPOINT " + name).Error
456460
}
461+
462+
var versionTrimerRegexp = regexp.MustCompile(`^(\d+).*$`)
463+
464+
// checkVersion newer or equal returns true, old returns false
465+
func checkVersion(newVersion, oldVersion string) bool {
466+
if newVersion == oldVersion {
467+
return true
468+
}
469+
470+
newVersions := strings.Split(newVersion, ".")
471+
oldVersions := strings.Split(oldVersion, ".")
472+
for idx, nv := range newVersions {
473+
if len(oldVersions) <= idx {
474+
return true
475+
}
476+
477+
nvi, _ := strconv.Atoi(versionTrimerRegexp.ReplaceAllString(nv, "$1"))
478+
ovi, _ := strconv.Atoi(versionTrimerRegexp.ReplaceAllString(oldVersions[idx], "$1"))
479+
if nvi == ovi {
480+
continue
481+
}
482+
return nvi > ovi
483+
}
484+
485+
return false
486+
}

mysql_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,20 @@ func BenchmarkDialector_QuoteTo(b *testing.B) {
5858
buf.Reset()
5959
}
6060
}
61+
62+
func TestCheckVersion(t *testing.T) {
63+
versions := map[string]string{
64+
"5.6.1": "5.6",
65+
"5.10.2": "5.6",
66+
"5.10": "5.6",
67+
"10.6.26-MariaDB-1:10.4.26+maria~ubu2004": "10.6",
68+
"10.6.26-MariaDB-1:10.4.26+maria~ubu2005": "10.6.3",
69+
"10.4.26-MariaDB-1:10.4.26+maria~ubu2004": "5.6",
70+
}
71+
72+
for k, v := range versions {
73+
if !checkVersion(k, v) || checkVersion(v, k) {
74+
t.Fatalf("returns %v when comparing %v, %v", checkVersion(k, v), k, v)
75+
}
76+
}
77+
}

0 commit comments

Comments
 (0)