mirror of https://github.com/grafana/grafana.git
Support Spanner's UNION syntax, which needs to be UNION DISTINCT or UNION ALL. (#101768)
* Support Spanner's UNION syntax, which needs to be UNION DISTINCT or UNION ALL.
This commit is contained in:
parent
607d39b573
commit
fd6a4908f1
|
|
@ -72,7 +72,7 @@ func (sb *SQLBuilder) WriteDashboardPermissionFilter(user identity.Requester, pe
|
||||||
leftJoin string
|
leftJoin string
|
||||||
)
|
)
|
||||||
|
|
||||||
filterRBAC := permissions.NewAccessControlDashboardPermissionFilter(user, permission, queryType, sb.features, sb.recursiveQueriesAreSupported)
|
filterRBAC := permissions.NewAccessControlDashboardPermissionFilter(user, permission, queryType, sb.features, sb.recursiveQueriesAreSupported, sb.dialect)
|
||||||
leftJoin = filterRBAC.LeftJoin()
|
leftJoin = filterRBAC.LeftJoin()
|
||||||
sql, params = filterRBAC.Where()
|
sql, params = filterRBAC.Where()
|
||||||
recQry, recQryParams = filterRBAC.With()
|
recQry, recQryParams = filterRBAC.With()
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,10 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/db"
|
"github.com/grafana/grafana/pkg/infra/db"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"go.opentelemetry.io/otel"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var tracer = otel.Tracer("github.com/grafana/grafana/pkg/services/accesscontrol/database")
|
var tracer = otel.Tracer("github.com/grafana/grafana/pkg/services/accesscontrol/database")
|
||||||
|
|
@ -58,7 +59,7 @@ func (s *AccessControlStore) GetUserPermissions(ctx context.Context, query acces
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
filter, params := accesscontrol.UserRolesFilter(query.OrgID, query.UserID, query.TeamIDs, query.Roles)
|
filter, params := accesscontrol.UserRolesFilter(query.OrgID, query.UserID, query.TeamIDs, query.Roles, s.sql.GetDialect())
|
||||||
|
|
||||||
q := `
|
q := `
|
||||||
SELECT
|
SELECT
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/apimachinery/identity"
|
"github.com/grafana/grafana/pkg/apimachinery/identity"
|
||||||
|
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||||
)
|
)
|
||||||
|
|
||||||
var sqlIDAcceptList = map[string]struct{}{
|
var sqlIDAcceptList = map[string]struct{}{
|
||||||
|
|
@ -127,7 +128,7 @@ func SetAcceptListForTest(list map[string]struct{}) func() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func UserRolesFilter(orgID, userID int64, teamIDs []int64, roles []string) (string, []any) {
|
func UserRolesFilter(orgID, userID int64, teamIDs []int64, roles []string, dialect migrator.Dialect) (string, []any) {
|
||||||
var params []any
|
var params []any
|
||||||
builder := strings.Builder{}
|
builder := strings.Builder{}
|
||||||
|
|
||||||
|
|
@ -145,7 +146,7 @@ func UserRolesFilter(orgID, userID int64, teamIDs []int64, roles []string) (stri
|
||||||
|
|
||||||
if len(teamIDs) > 0 {
|
if len(teamIDs) > 0 {
|
||||||
if builder.Len() > 0 {
|
if builder.Len() > 0 {
|
||||||
builder.WriteString("UNION")
|
builder.WriteString(dialect.UnionDistinct())
|
||||||
}
|
}
|
||||||
builder.WriteString(`
|
builder.WriteString(`
|
||||||
SELECT tr.role_id FROM team_role as tr
|
SELECT tr.role_id FROM team_role as tr
|
||||||
|
|
@ -160,7 +161,7 @@ func UserRolesFilter(orgID, userID int64, teamIDs []int64, roles []string) (stri
|
||||||
|
|
||||||
if len(roles) != 0 {
|
if len(roles) != 0 {
|
||||||
if builder.Len() > 0 {
|
if builder.Len() > 0 {
|
||||||
builder.WriteString("UNION")
|
builder.WriteString(dialect.UnionDistinct())
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.WriteString(`
|
builder.WriteString(`
|
||||||
|
|
|
||||||
|
|
@ -121,7 +121,7 @@ func (authz *AuthService) dashboardsWithVisibleAnnotations(ctx context.Context,
|
||||||
}
|
}
|
||||||
|
|
||||||
filters := []any{
|
filters := []any{
|
||||||
permissions.NewAccessControlDashboardPermissionFilter(query.SignedInUser, dashboardaccess.PERMISSION_VIEW, filterType, authz.features, recursiveQueriesSupported),
|
permissions.NewAccessControlDashboardPermissionFilter(query.SignedInUser, dashboardaccess.PERMISSION_VIEW, filterType, authz.features, recursiveQueriesSupported, authz.db.GetDialect()),
|
||||||
searchstore.OrgFilter{OrgId: query.OrgID},
|
searchstore.OrgFilter{OrgId: query.OrgID},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1002,7 +1002,7 @@ func (d *dashboardStore) FindDashboards(ctx context.Context, query *dashboards.F
|
||||||
}
|
}
|
||||||
|
|
||||||
if !query.SkipAccessControlFilter {
|
if !query.SkipAccessControlFilter {
|
||||||
filters = append(filters, permissions.NewAccessControlDashboardPermissionFilter(query.SignedInUser, query.Permission, query.Type, d.features, recursiveQueriesAreSupported))
|
filters = append(filters, permissions.NewAccessControlDashboardPermissionFilter(query.SignedInUser, query.Permission, query.Type, d.features, recursiveQueriesAreSupported, d.store.GetDialect()))
|
||||||
}
|
}
|
||||||
|
|
||||||
filters = append(filters, searchstore.DeletedFilter{Deleted: query.IsDeleted})
|
filters = append(filters, searchstore.DeletedFilter{Deleted: query.IsDeleted})
|
||||||
|
|
|
||||||
|
|
@ -455,7 +455,9 @@ func (l *LibraryElementService) getAllLibraryElements(c context.Context, signedI
|
||||||
writeSearchStringSQL(query, l.SQLStore, &builder)
|
writeSearchStringSQL(query, l.SQLStore, &builder)
|
||||||
writeExcludeSQL(query, &builder)
|
writeExcludeSQL(query, &builder)
|
||||||
writeTypeFilterSQL(typeFilter, &builder)
|
writeTypeFilterSQL(typeFilter, &builder)
|
||||||
builder.Write(" UNION ")
|
builder.Write(" ")
|
||||||
|
builder.Write(l.SQLStore.GetDialect().UnionDistinct())
|
||||||
|
builder.Write(" ")
|
||||||
}
|
}
|
||||||
builder.Write(selectLibraryElementDTOWithMeta)
|
builder.Write(selectLibraryElementDTOWithMeta)
|
||||||
builder.Write(", le.folder_uid as folder_uid ")
|
builder.Write(", le.folder_uid as folder_uid ")
|
||||||
|
|
@ -544,7 +546,9 @@ func (l *LibraryElementService) getAllLibraryElements(c context.Context, signedI
|
||||||
writeSearchStringSQL(query, l.SQLStore, &countBuilder)
|
writeSearchStringSQL(query, l.SQLStore, &countBuilder)
|
||||||
writeExcludeSQL(query, &countBuilder)
|
writeExcludeSQL(query, &countBuilder)
|
||||||
writeTypeFilterSQL(typeFilter, &countBuilder)
|
writeTypeFilterSQL(typeFilter, &countBuilder)
|
||||||
countBuilder.Write(" UNION ")
|
countBuilder.Write(" ")
|
||||||
|
countBuilder.Write(l.SQLStore.GetDialect().UnionDistinct())
|
||||||
|
countBuilder.Write(" ")
|
||||||
}
|
}
|
||||||
countBuilder.Write(selectLibraryElementDTOWithMeta)
|
countBuilder.Write(selectLibraryElementDTOWithMeta)
|
||||||
countBuilder.Write(getFromLibraryElementDTOWithMeta(l.SQLStore.GetDialect()))
|
countBuilder.Write(getFromLibraryElementDTOWithMeta(l.SQLStore.GetDialect()))
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,8 @@ type Dialect interface {
|
||||||
BooleanStr(bool) string
|
BooleanStr(bool) string
|
||||||
DateTimeFunc(string) string
|
DateTimeFunc(string) string
|
||||||
BatchSize() int
|
BatchSize() int
|
||||||
|
UnionDistinct() string // this is the default UNION type
|
||||||
|
UnionAll() string
|
||||||
|
|
||||||
OrderBy(order string) string
|
OrderBy(order string) string
|
||||||
|
|
||||||
|
|
@ -467,3 +469,11 @@ func (b *BaseDialect) Update(ctx context.Context, tx *session.SessionTx, tableNa
|
||||||
func (b *BaseDialect) Concat(strs ...string) string {
|
func (b *BaseDialect) Concat(strs ...string) string {
|
||||||
return fmt.Sprintf("CONCAT(%s)", strings.Join(strs, ", "))
|
return fmt.Sprintf("CONCAT(%s)", strings.Join(strs, ", "))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *BaseDialect) UnionDistinct() string {
|
||||||
|
return "UNION"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BaseDialect) UnionAll() string {
|
||||||
|
return "UNION ALL"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -325,3 +325,7 @@ func confToClientOptions(connectorConfig spannerdriver.ConnectorConfig) []option
|
||||||
}
|
}
|
||||||
return opts
|
return opts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SpannerDialect) UnionDistinct() string {
|
||||||
|
return "UNION DISTINCT"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import (
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||||
"github.com/grafana/grafana/pkg/services/folder"
|
"github.com/grafana/grafana/pkg/services/folder"
|
||||||
"github.com/grafana/grafana/pkg/services/login"
|
"github.com/grafana/grafana/pkg/services/login"
|
||||||
|
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||||
"github.com/grafana/grafana/pkg/services/sqlstore/searchstore"
|
"github.com/grafana/grafana/pkg/services/sqlstore/searchstore"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -44,14 +45,14 @@ type PermissionsFilter interface {
|
||||||
With() (string, []any)
|
With() (string, []any)
|
||||||
Where() (string, []any)
|
Where() (string, []any)
|
||||||
|
|
||||||
buildClauses()
|
buildClauses(dialect migrator.Dialect)
|
||||||
nestedFoldersSelectors(permSelector string, permSelectorArgs []any, leftTable string, Col string, rightTableCol string, orgID int64) (string, []any)
|
nestedFoldersSelectors(permSelector string, permSelectorArgs []any, leftTable string, Col string, rightTableCol string, orgID int64) (string, []any)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewAccessControlDashboardPermissionFilter creates a new AccessControlDashboardPermissionFilter that is configured with specific actions calculated based on the dashboardaccess.PermissionType and query type
|
// NewAccessControlDashboardPermissionFilter creates a new AccessControlDashboardPermissionFilter that is configured with specific actions calculated based on the dashboardaccess.PermissionType and query type
|
||||||
// The filter is configured to use the new permissions filter (without subqueries) if the feature flag is enabled
|
// The filter is configured to use the new permissions filter (without subqueries) if the feature flag is enabled
|
||||||
// The filter is configured to use the old permissions filter (with subqueries) if the feature flag is disabled
|
// The filter is configured to use the old permissions filter (with subqueries) if the feature flag is disabled
|
||||||
func NewAccessControlDashboardPermissionFilter(user identity.Requester, permissionLevel dashboardaccess.PermissionType, queryType string, features featuremgmt.FeatureToggles, recursiveQueriesAreSupported bool) PermissionsFilter {
|
func NewAccessControlDashboardPermissionFilter(user identity.Requester, permissionLevel dashboardaccess.PermissionType, queryType string, features featuremgmt.FeatureToggles, recursiveQueriesAreSupported bool, dialect migrator.Dialect) PermissionsFilter {
|
||||||
needEdit := permissionLevel > dashboardaccess.PERMISSION_VIEW
|
needEdit := permissionLevel > dashboardaccess.PERMISSION_VIEW
|
||||||
|
|
||||||
var folderAction string
|
var folderAction string
|
||||||
|
|
@ -129,7 +130,7 @@ func NewAccessControlDashboardPermissionFilter(user identity.Requester, permissi
|
||||||
features: features, recursiveQueriesAreSupported: recursiveQueriesAreSupported,
|
features: features, recursiveQueriesAreSupported: recursiveQueriesAreSupported,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f.buildClauses()
|
f.buildClauses(dialect)
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -157,7 +158,7 @@ func (f *accessControlDashboardPermissionFilter) hasRequiredActions() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *accessControlDashboardPermissionFilter) buildClauses() {
|
func (f *accessControlDashboardPermissionFilter) buildClauses(dialect migrator.Dialect) {
|
||||||
if f.user == nil || f.user.IsNil() || !f.hasRequiredActions() {
|
if f.user == nil || f.user.IsNil() || !f.hasRequiredActions() {
|
||||||
f.where = clause{string: "(1 = 0)"}
|
f.where = clause{string: "(1 = 0)"}
|
||||||
return
|
return
|
||||||
|
|
@ -171,7 +172,7 @@ func (f *accessControlDashboardPermissionFilter) buildClauses() {
|
||||||
}
|
}
|
||||||
|
|
||||||
orgID := f.user.GetOrgID()
|
orgID := f.user.GetOrgID()
|
||||||
filter, params := accesscontrol.UserRolesFilter(orgID, userID, f.user.GetTeams(), accesscontrol.GetOrgRoles(f.user))
|
filter, params := accesscontrol.UserRolesFilter(orgID, userID, f.user.GetTeams(), accesscontrol.GetOrgRoles(f.user), dialect)
|
||||||
rolesFilter := " AND role_id IN(SELECT id FROM role " + filter + ") "
|
rolesFilter := " AND role_id IN(SELECT id FROM role " + filter + ") "
|
||||||
var args []any
|
var args []any
|
||||||
builder := strings.Builder{}
|
builder := strings.Builder{}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||||
"github.com/grafana/grafana/pkg/services/folder"
|
"github.com/grafana/grafana/pkg/services/folder"
|
||||||
"github.com/grafana/grafana/pkg/services/login"
|
"github.com/grafana/grafana/pkg/services/login"
|
||||||
|
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type accessControlDashboardPermissionFilterNoFolderSubquery struct {
|
type accessControlDashboardPermissionFilterNoFolderSubquery struct {
|
||||||
|
|
@ -25,7 +26,7 @@ func (f *accessControlDashboardPermissionFilterNoFolderSubquery) LeftJoin() stri
|
||||||
return " dashboard AS folder ON dashboard.org_id = folder.org_id AND dashboard.folder_id = folder.id"
|
return " dashboard AS folder ON dashboard.org_id = folder.org_id AND dashboard.folder_id = folder.id"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *accessControlDashboardPermissionFilterNoFolderSubquery) buildClauses() {
|
func (f *accessControlDashboardPermissionFilterNoFolderSubquery) buildClauses(dialect migrator.Dialect) {
|
||||||
if f.user == nil || f.user.IsNil() || len(f.user.GetPermissions()) == 0 {
|
if f.user == nil || f.user.IsNil() || len(f.user.GetPermissions()) == 0 {
|
||||||
f.where = clause{string: "(1 = 0)"}
|
f.where = clause{string: "(1 = 0)"}
|
||||||
return
|
return
|
||||||
|
|
@ -39,7 +40,7 @@ func (f *accessControlDashboardPermissionFilterNoFolderSubquery) buildClauses()
|
||||||
}
|
}
|
||||||
|
|
||||||
orgID := f.user.GetOrgID()
|
orgID := f.user.GetOrgID()
|
||||||
filter, params := accesscontrol.UserRolesFilter(orgID, userID, f.user.GetTeams(), accesscontrol.GetOrgRoles(f.user))
|
filter, params := accesscontrol.UserRolesFilter(orgID, userID, f.user.GetTeams(), accesscontrol.GetOrgRoles(f.user), dialect)
|
||||||
rolesFilter := " AND role_id IN(SELECT id FROM role " + filter + ") "
|
rolesFilter := " AND role_id IN(SELECT id FROM role " + filter + ") "
|
||||||
var args []any
|
var args []any
|
||||||
builder := strings.Builder{}
|
builder := strings.Builder{}
|
||||||
|
|
|
||||||
|
|
@ -183,7 +183,7 @@ func TestIntegration_DashboardPermissionFilter(t *testing.T) {
|
||||||
keys = append(keys, k)
|
keys = append(keys, k)
|
||||||
}
|
}
|
||||||
t.Run(tt.desc+" with features "+strings.Join(keys, ","), func(t *testing.T) {
|
t.Run(tt.desc+" with features "+strings.Join(keys, ","), func(t *testing.T) {
|
||||||
filter := permissions.NewAccessControlDashboardPermissionFilter(usr, tt.permission, tt.queryType, features, recursiveQueriesAreSupported)
|
filter := permissions.NewAccessControlDashboardPermissionFilter(usr, tt.permission, tt.queryType, features, recursiveQueriesAreSupported, store.GetDialect())
|
||||||
|
|
||||||
var result int
|
var result int
|
||||||
err = store.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
err = store.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
||||||
|
|
@ -355,7 +355,7 @@ func TestIntegration_DashboardPermissionFilter_WithSelfContainedPermissions(t *t
|
||||||
keys = append(keys, k)
|
keys = append(keys, k)
|
||||||
}
|
}
|
||||||
t.Run(tt.desc+" with features "+strings.Join(keys, ","), func(t *testing.T) {
|
t.Run(tt.desc+" with features "+strings.Join(keys, ","), func(t *testing.T) {
|
||||||
filter := permissions.NewAccessControlDashboardPermissionFilter(usr, tt.permission, tt.queryType, features, recursiveQueriesAreSupported)
|
filter := permissions.NewAccessControlDashboardPermissionFilter(usr, tt.permission, tt.queryType, features, recursiveQueriesAreSupported, store.GetDialect())
|
||||||
|
|
||||||
var result int
|
var result int
|
||||||
err = store.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
err = store.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
||||||
|
|
@ -470,7 +470,7 @@ func TestIntegration_DashboardNestedPermissionFilter(t *testing.T) {
|
||||||
db := setupNestedTest(t, usr, tc.permissions, orgID, features)
|
db := setupNestedTest(t, usr, tc.permissions, orgID, features)
|
||||||
recursiveQueriesAreSupported, err := db.RecursiveQueriesAreSupported()
|
recursiveQueriesAreSupported, err := db.RecursiveQueriesAreSupported()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
filter := permissions.NewAccessControlDashboardPermissionFilter(usr, tc.permission, tc.queryType, features, recursiveQueriesAreSupported)
|
filter := permissions.NewAccessControlDashboardPermissionFilter(usr, tc.permission, tc.queryType, features, recursiveQueriesAreSupported, db.GetDialect())
|
||||||
var result []string
|
var result []string
|
||||||
err = db.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
err = db.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
||||||
q, params := filter.Where()
|
q, params := filter.Where()
|
||||||
|
|
@ -588,7 +588,7 @@ func TestIntegration_DashboardNestedPermissionFilter_WithSelfContainedPermission
|
||||||
db := setupNestedTest(t, helperUser, []accesscontrol.Permission{}, orgID, features)
|
db := setupNestedTest(t, helperUser, []accesscontrol.Permission{}, orgID, features)
|
||||||
recursiveQueriesAreSupported, err := db.RecursiveQueriesAreSupported()
|
recursiveQueriesAreSupported, err := db.RecursiveQueriesAreSupported()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
filter := permissions.NewAccessControlDashboardPermissionFilter(usr, tc.permission, tc.queryType, features, recursiveQueriesAreSupported)
|
filter := permissions.NewAccessControlDashboardPermissionFilter(usr, tc.permission, tc.queryType, features, recursiveQueriesAreSupported, db.GetDialect())
|
||||||
var result []string
|
var result []string
|
||||||
err = db.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
err = db.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
||||||
q, params := filter.Where()
|
q, params := filter.Where()
|
||||||
|
|
@ -707,7 +707,7 @@ func TestIntegration_DashboardNestedPermissionFilter_WithActionSets(t *testing.T
|
||||||
db := setupNestedTest(t, usr, tc.signedInUserPermissions, orgID, features)
|
db := setupNestedTest(t, usr, tc.signedInUserPermissions, orgID, features)
|
||||||
recursiveQueriesAreSupported, err := db.RecursiveQueriesAreSupported()
|
recursiveQueriesAreSupported, err := db.RecursiveQueriesAreSupported()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
filter := permissions.NewAccessControlDashboardPermissionFilter(usr, tc.permission, tc.queryType, features, recursiveQueriesAreSupported)
|
filter := permissions.NewAccessControlDashboardPermissionFilter(usr, tc.permission, tc.queryType, features, recursiveQueriesAreSupported, db.GetDialect())
|
||||||
var result []string
|
var result []string
|
||||||
err = db.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
err = db.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
||||||
q, params := filter.Where()
|
q, params := filter.Where()
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ func benchmarkDashboardPermissionFilter(b *testing.B, numUsers, numDashboards, n
|
||||||
|
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
filter := permissions.NewAccessControlDashboardPermissionFilter(&usr, dashboardaccess.PERMISSION_VIEW, "", features, recursiveQueriesAreSupported)
|
filter := permissions.NewAccessControlDashboardPermissionFilter(&usr, dashboardaccess.PERMISSION_VIEW, "", features, recursiveQueriesAreSupported, store.GetDialect())
|
||||||
var result int
|
var result int
|
||||||
err := store.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
err := store.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error {
|
||||||
q, params := filter.Where()
|
q, params := filter.Where()
|
||||||
|
|
|
||||||
|
|
@ -334,6 +334,7 @@ func TestBuilder_RBAC(t *testing.T) {
|
||||||
"",
|
"",
|
||||||
tc.features,
|
tc.features,
|
||||||
recursiveQueriesAreSupported,
|
recursiveQueriesAreSupported,
|
||||||
|
store.GetDialect(),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
Dialect: store.GetDialect(),
|
Dialect: store.GetDialect(),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue