SQLStore: Align SQLite IsUniqueConstraintViolation() with other backend implementations (#69224)
* Add integration test for primary key and unique constrain violation * Align SQLite IsUniqueConstraintViolation implementation with other backends
This commit is contained in:
@@ -148,7 +148,7 @@ func (db *SQLite3) ErrorMessage(err error) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (db *SQLite3) IsUniqueConstraintViolation(err error) bool {
|
func (db *SQLite3) IsUniqueConstraintViolation(err error) bool {
|
||||||
return db.isThisError(err, int(sqlite3.ErrConstraintUnique))
|
return db.isThisError(err, int(sqlite3.ErrConstraintUnique)) || db.isThisError(err, int(sqlite3.ErrConstraintPrimaryKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *SQLite3) IsDeadlock(err error) bool {
|
func (db *SQLite3) IsDeadlock(err error) bool {
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
package sqlstore
|
package sqlstore
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"net/url"
|
"net/url"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/services/org"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -99,6 +103,54 @@ func TestIntegrationSQLConnectionString(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIntegrationIsUniqueConstraintViolation(t *testing.T) {
|
||||||
|
store := InitTestDB(t)
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
desc string
|
||||||
|
f func(*testing.T, *DBSession) error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
desc: "successfully detect primary key violations",
|
||||||
|
f: func(t *testing.T, sess *DBSession) error {
|
||||||
|
// Attempt to insert org with provided ID (primary key) twice
|
||||||
|
now := time.Now()
|
||||||
|
org := org.Org{Name: "test org primary key violation", Created: now, Updated: now, ID: 42}
|
||||||
|
err := sess.InsertId(&org, store.Dialect)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Provide a different name to avoid unique constraint violation
|
||||||
|
org.Name = "test org 2"
|
||||||
|
return sess.InsertId(&org, store.Dialect)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "successfully detect unique constrain violations",
|
||||||
|
f: func(t *testing.T, sess *DBSession) error {
|
||||||
|
// Attempt to insert org with reserved name
|
||||||
|
now := time.Now()
|
||||||
|
org := org.Org{Name: "test org unique constrain violation", Created: now, Updated: now, ID: 43}
|
||||||
|
err := sess.InsertId(&org, store.Dialect)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Provide a different ID to avoid primary key violation
|
||||||
|
org.ID = 44
|
||||||
|
return sess.InsertId(&org, store.Dialect)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.desc, func(t *testing.T) {
|
||||||
|
err := store.WithDbSession(context.Background(), func(sess *DBSession) error {
|
||||||
|
return tc.f(t, sess)
|
||||||
|
})
|
||||||
|
require.Error(t, err)
|
||||||
|
assert.True(t, store.Dialect.IsUniqueConstraintViolation(err))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func makeSQLStoreTestConfig(t *testing.T, dbType, host, dbURL string) *setting.Cfg {
|
func makeSQLStoreTestConfig(t *testing.T, dbType, host, dbURL string) *setting.Cfg {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user