Skip to content

Commit

Permalink
[FIXED] SQLStore: Unable to run against MySQL 8.0.2+
Browse files Browse the repository at this point in the history
This is due to the use of a now reserved word. Need to be escaped
with the "`" character. This character is used only for mysql
driver, not postgres (otherwise, it would break).

Resolves #536
  • Loading branch information
kozlovic committed Mar 30, 2018
1 parent 339bd7a commit 3b80e99
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 5 deletions.
2 changes: 1 addition & 1 deletion server/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ func TestMain(m *testing.M) {
// Create the SQL Database once, the cleanup is simply deleting
// content from tables (so we don't have to recreate them).
if err := test.CreateSQLDatabase(testSQLDriver, testSQLSourceAdmin,
testSQLSource, testSQLDatabaseName+n); err != nil {
testSQLSource+n, testSQLDatabaseName+n); err != nil {
fmt.Printf("Error initializing SQL Datastore: %v", err)
os.Exit(2)
}
Expand Down
16 changes: 12 additions & 4 deletions stores/sqlstore.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,10 @@ var sqlStmts = []string{
"DELETE FROM Subscriptions WHERE id=? AND deleted=TRUE", // sqlDeleteSubMarkedAsDeleted
"DELETE FROM SubsPending WHERE subid=?", // sqlDeleteSubPendingMessages
"UPDATE Subscriptions SET lastsent=? WHERE id=? AND subid=?", // sqlSubUpdateLastSent
"INSERT INTO SubsPending (subid, row, seq) VALUES (?, ?, ?)", // sqlSubAddPending
"INSERT INTO SubsPending (subid, row, lastsent, pending, acks) VALUES (?, ?, ?, ?, ?)", // sqlSubAddPendingRow
"INSERT INTO SubsPending (subid, `row`, seq) VALUES (?, ?, ?)", // sqlSubAddPending
"INSERT INTO SubsPending (subid, `row`, lastsent, pending, acks) VALUES (?, ?, ?, ?, ?)", // sqlSubAddPendingRow
"DELETE FROM SubsPending WHERE subid=? AND seq=?", // sqlSubDeletePending
"DELETE FROM SubsPending WHERE subid=? AND row=?", // sqlSubDeletePendingRow
"DELETE FROM SubsPending WHERE subid=? AND `row`=?", // sqlSubDeletePendingRow
"SELECT id, proto, version FROM ServerInfo WHERE uniquerow=1", // sqlRecoverServerInfo
"SELECT id, hbinbox FROM Clients", // sqlRecoverClients
"SELECT COALESCE(MAX(id), 0) FROM Channels", // sqlRecoverMaxChannelID
Expand All @@ -130,7 +130,7 @@ var sqlStmts = []string{
"SELECT COUNT(seq), COALESCE(MIN(seq), 0), COALESCE(MAX(seq), 0), COALESCE(SUM(size), 0), COALESCE(MAX(timestamp), 0) FROM Messages WHERE id=?", // sqlRecoverChannelMsgs
"SELECT lastsent, proto FROM Subscriptions WHERE id=? AND deleted=FALSE", // sqlRecoverChannelSubs
"DELETE FROM SubsPending WHERE subid=? AND (seq > 0 AND seq<?)", // sqlRecoverDoPurgeSubsPending
"SELECT row, seq, lastsent, pending, acks FROM SubsPending WHERE subid=?", // sqlRecoverSubPending
"SELECT `row`, seq, lastsent, pending, acks FROM SubsPending WHERE subid=?", // sqlRecoverSubPending
"SELECT maxmsgs, maxbytes, maxage FROM Channels WHERE id=?", // sqlRecoverGetChannelLimits
"DELETE FROM Messages WHERE id=? AND timestamp<=?", // sqlRecoverDoExpireMsgs
"SELECT COUNT(seq) FROM Messages WHERE id=?", // sqlRecoverGetMessagesCount
Expand Down Expand Up @@ -690,6 +690,14 @@ func initSQLStmtsTable(driver string) {
})
sqlStmts[i] = stmt
}
// Replace `row` with row
reg = regexp.MustCompile("`row`")
for i, stmt := range sqlStmts {
stmt := reg.ReplaceAllStringFunc(stmt, func(string) string {
return "row"
})
sqlStmts[i] = stmt
}
}
}

Expand Down
7 changes: 7 additions & 0 deletions stores/sqlstore_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,13 @@ func TestSQLPostgresDriverInit(t *testing.T) {
t.Fatalf("Statement %q incorrect for Postgres driver", stmt)
}
}
// Make sure there is not `row` in the statements
reg = regexp.MustCompile("`row`")
for _, stmt := range sqlStmts {
if reg.FindString(stmt) != "" {
t.Fatalf("Statement %q incorrect for Postgres driver", stmt)
}
}
}

func TestSQLErrorOnNewStore(t *testing.T) {
Expand Down

0 comments on commit 3b80e99

Please sign in to comment.