Fix: add alias to subqueries for mysql database (#52576)

(cherry picked from commit 8073502701b172f23a4dfa09a7195217cb4007aa)
This commit is contained in:
Eric Leijonmarck
2022-07-21 09:03:10 +01:00
committed by GitHub
parent 795e2d0a48
commit 1f44da3d83
3 changed files with 26 additions and 7 deletions
@@ -6,14 +6,15 @@ import (
"github.com/grafana/grafana/pkg/services/sqlstore"
)
type loginStats struct {
type LoginStats struct {
DuplicateUserEntries int `xorm:"duplicate_user_entries"`
}
func (s *AuthInfoStore) GetLoginStats(ctx context.Context) (loginStats, error) {
var stats loginStats
func (s *AuthInfoStore) GetLoginStats(ctx context.Context) (LoginStats, error) {
var stats LoginStats
outerErr := s.sqlStore.WithDbSession(ctx, func(dbSession *sqlstore.DBSession) error {
rawSQL := `SELECT COUNT(*) as duplicate_user_entries FROM (` + s.duplicateUserEntriesSQL(ctx) + `)`
rawSQL := `SELECT COUNT(*) as duplicate_user_entries FROM (` + s.duplicateUserEntriesSQL(ctx) + `) AS d
WHERE (d.dup_login IS NOT NULL OR d.dup_email IS NOT NULL)`
_, err := dbSession.SQL(rawSQL).Get(&stats)
return err
})
@@ -49,8 +50,6 @@ func (s *AuthInfoStore) duplicateUserEntriesSQL(ctx context.Context) string {
sqlQuery := `SELECT
(SELECT login from ` + userDialect + ` WHERE (LOWER(login) = LOWER(u.login)) AND (login != u.login)) AS dup_login,
(SELECT email from ` + userDialect + ` WHERE (LOWER(email) = LOWER(u.email)) AND (email != u.email)) AS dup_email
FROM ` + userDialect + ` AS u
WHERE (dup_login IS NOT NULL OR dup_email IS NOT NULL)
`
FROM ` + userDialect + ` AS u`
return sqlQuery
}
@@ -370,6 +370,24 @@ func TestUserAuth(t *testing.T) {
require.Nil(t, user)
})
t.Run("should be able to run query in all dbs", func(t *testing.T) {
// Restore after destructive operation
sqlStore = sqlstore.InitTestDB(t)
for i := 0; i < 5; i++ {
cmd := models.CreateUserCommand{
Email: fmt.Sprint("user", i, "@test.com"),
Name: fmt.Sprint("user", i),
Login: fmt.Sprint("loginuser", i),
OrgId: 1,
}
_, err := sqlStore.CreateUser(context.Background(), cmd)
require.Nil(t, err)
}
_, err := srv.authInfoStore.GetLoginStats(context.Background())
require.Nil(t, err)
})
t.Run("calculate metrics on duplicate userstats", func(t *testing.T) {
// Restore after destructive operation
sqlStore = sqlstore.InitTestDB(t)
+2
View File
@@ -4,6 +4,7 @@ import (
"context"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/login/authinfoservice/database"
)
type UserProtectionService interface {
@@ -21,4 +22,5 @@ type Store interface {
GetUserByLogin(ctx context.Context, login string) (*models.User, error)
GetUserByEmail(ctx context.Context, email string) (*models.User, error)
CollectLoginStats(ctx context.Context) (map[string]interface{}, error)
GetLoginStats(ctx context.Context) (database.LoginStats, error)
}