From 1f44da3d83d2d8d57eaf4996d6b92614e84b118b Mon Sep 17 00:00:00 2001 From: Eric Leijonmarck Date: Thu, 21 Jul 2022 09:03:10 +0100 Subject: [PATCH] Fix: add alias to subqueries for mysql database (#52576) (cherry picked from commit 8073502701b172f23a4dfa09a7195217cb4007aa) --- .../authinfoservice/database/usagestats.go | 13 ++++++------- .../login/authinfoservice/user_auth_test.go | 18 ++++++++++++++++++ pkg/services/login/userprotection.go | 2 ++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/pkg/services/login/authinfoservice/database/usagestats.go b/pkg/services/login/authinfoservice/database/usagestats.go index 6ab134a1b2a..0bcdfd1319b 100644 --- a/pkg/services/login/authinfoservice/database/usagestats.go +++ b/pkg/services/login/authinfoservice/database/usagestats.go @@ -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 } diff --git a/pkg/services/login/authinfoservice/user_auth_test.go b/pkg/services/login/authinfoservice/user_auth_test.go index 44dd4adfc22..483791eb650 100644 --- a/pkg/services/login/authinfoservice/user_auth_test.go +++ b/pkg/services/login/authinfoservice/user_auth_test.go @@ -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) diff --git a/pkg/services/login/userprotection.go b/pkg/services/login/userprotection.go index 0a36fd3b900..e400091b229 100644 --- a/pkg/services/login/userprotection.go +++ b/pkg/services/login/userprotection.go @@ -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) }