Alerting: fix ngalert alertmanager SQL Syntax Errors (#40827)

* test kvstore in intregration tests with different databases

* escape 'key' in delete query

* export quote and use it in kvstore
This commit is contained in:
Jean-Philippe Quéméner 2021-10-25 11:53:41 +02:00 committed by GitHub
parent 889d4683a1
commit d1aefa1792
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 2 deletions

View File

@ -1,3 +1,6 @@
//go:build integration
// +build integration
package kvstore
import (

View File

@ -2,6 +2,7 @@ package kvstore
import (
"context"
"fmt"
"time"
"github.com/grafana/grafana/pkg/infra/log"
@ -88,7 +89,8 @@ func (kv *kvStoreSQL) Set(ctx context.Context, orgId int64, namespace string, ke
// Del deletes an item from the store.
func (kv *kvStoreSQL) Del(ctx context.Context, orgId int64, namespace string, key string) error {
err := kv.sqlStore.WithDbSession(ctx, func(dbSession *sqlstore.DBSession) error {
_, err := dbSession.Exec("DELETE FROM kv_store WHERE org_id=? and namespace=? and key=?", orgId, namespace, key)
query := fmt.Sprintf("DELETE FROM kv_store WHERE org_id=? and namespace=? and %s=?", kv.sqlStore.Quote("key"))
_, err := dbSession.Exec(query, orgId, namespace, key)
return err
})
return err
@ -99,7 +101,7 @@ func (kv *kvStoreSQL) Del(ctx context.Context, orgId int64, namespace string, ke
func (kv *kvStoreSQL) Keys(ctx context.Context, orgId int64, namespace string, keyPrefix string) ([]Key, error) {
var keys []Key
err := kv.sqlStore.WithDbSession(ctx, func(dbSession *sqlstore.DBSession) error {
query := dbSession.Where("namespace = ?", namespace).And("\"key\" LIKE ?", keyPrefix+"%")
query := dbSession.Where("namespace = ?", namespace).And(fmt.Sprintf("%s LIKE ?", kv.sqlStore.Quote("key")), keyPrefix+"%")
if orgId != AllOrganizations {
query.And("org_id = ?", orgId)
}

View File

@ -161,6 +161,11 @@ func (ss *SQLStore) Reset() error {
return ss.ensureMainOrgAndAdminUser()
}
// Quote quotes the value in the used SQL dialect
func (ss *SQLStore) Quote(value string) string {
return ss.engine.Quote(value)
}
func (ss *SQLStore) ensureMainOrgAndAdminUser() error {
ctx := context.Background()
err := ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error {