mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
MSSQL/MySQL: Fix variable interpolation (#56879)
* MSSQL/MySQL: Fix variable interpolation * Escape string vars
This commit is contained in:
parent
e819ed0f51
commit
902a230867
@ -55,10 +55,9 @@ export abstract class SqlDatasource extends DataSourceWithBackend<SQLQuery, SQLO
|
|||||||
interpolateVariable = (value: string | string[] | number, variable: VariableWithMultiSupport) => {
|
interpolateVariable = (value: string | string[] | number, variable: VariableWithMultiSupport) => {
|
||||||
if (typeof value === 'string') {
|
if (typeof value === 'string') {
|
||||||
if (variable.multi || variable.includeAll) {
|
if (variable.multi || variable.includeAll) {
|
||||||
const result = this.getQueryModel().quoteLiteral(value);
|
return this.getQueryModel().quoteLiteral(value);
|
||||||
return result;
|
|
||||||
} else {
|
} else {
|
||||||
return value;
|
return String(value).replace(/'/g, "''");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,20 +97,14 @@ export abstract class SqlDatasource extends DataSourceWithBackend<SQLQuery, SQLO
|
|||||||
target: SQLQuery,
|
target: SQLQuery,
|
||||||
scopedVars: ScopedVars
|
scopedVars: ScopedVars
|
||||||
): Record<string, string | DataSourceRef | SQLQuery['format']> {
|
): Record<string, string | DataSourceRef | SQLQuery['format']> {
|
||||||
const queryModel = this.getQueryModel(target, this.templateSrv, scopedVars);
|
|
||||||
const rawSql = this.clean(queryModel.interpolate());
|
|
||||||
return {
|
return {
|
||||||
refId: target.refId,
|
refId: target.refId,
|
||||||
datasource: this.getRef(),
|
datasource: this.getRef(),
|
||||||
rawSql,
|
rawSql: this.templateSrv.replace(target.rawSql, scopedVars, this.interpolateVariable),
|
||||||
format: target.format,
|
format: target.format,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
clean(value: string) {
|
|
||||||
return value.replace(/''/g, "'");
|
|
||||||
}
|
|
||||||
|
|
||||||
async metricFindQuery(query: string, optionalOptions?: MetricFindQueryOptions): Promise<MetricFindValue[]> {
|
async metricFindQuery(query: string, optionalOptions?: MetricFindQueryOptions): Promise<MetricFindValue[]> {
|
||||||
const rawSql = this.templateSrv.replace(
|
const rawSql = this.templateSrv.replace(
|
||||||
query,
|
query,
|
||||||
|
@ -166,7 +166,6 @@ export interface ValidationResults {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface SqlQueryModel {
|
export interface SqlQueryModel {
|
||||||
interpolate: () => string;
|
|
||||||
quoteLiteral: (v: string) => string;
|
quoteLiteral: (v: string) => string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@ import { ScopedVars } from '@grafana/data';
|
|||||||
import { TemplateSrv } from '@grafana/runtime';
|
import { TemplateSrv } from '@grafana/runtime';
|
||||||
import { applyQueryDefaults } from 'app/features/plugins/sql/defaults';
|
import { applyQueryDefaults } from 'app/features/plugins/sql/defaults';
|
||||||
import { SQLQuery, SqlQueryModel } from 'app/features/plugins/sql/types';
|
import { SQLQuery, SqlQueryModel } from 'app/features/plugins/sql/types';
|
||||||
import { FormatRegistryID } from 'app/features/templating/formatRegistry';
|
|
||||||
|
|
||||||
export class MSSqlQueryModel implements SqlQueryModel {
|
export class MSSqlQueryModel implements SqlQueryModel {
|
||||||
target: SQLQuery;
|
target: SQLQuery;
|
||||||
@ -15,10 +14,6 @@ export class MSSqlQueryModel implements SqlQueryModel {
|
|||||||
this.scopedVars = scopedVars;
|
this.scopedVars = scopedVars;
|
||||||
}
|
}
|
||||||
|
|
||||||
interpolate() {
|
|
||||||
return this.templateSrv?.replace(this.target.rawSql, this.scopedVars, FormatRegistryID.sqlString) || '';
|
|
||||||
}
|
|
||||||
|
|
||||||
quoteLiteral(value: string) {
|
quoteLiteral(value: string) {
|
||||||
return "'" + value.replace(/'/g, "''") + "'";
|
return "'" + value.replace(/'/g, "''") + "'";
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
import { map } from 'lodash';
|
|
||||||
|
|
||||||
import { ScopedVars } from '@grafana/data';
|
import { ScopedVars } from '@grafana/data';
|
||||||
import { TemplateSrv } from '@grafana/runtime';
|
import { TemplateSrv } from '@grafana/runtime';
|
||||||
|
|
||||||
@ -33,28 +31,6 @@ export default class MySQLQueryModel {
|
|||||||
return "'" + value.replace(/'/g, "''") + "'";
|
return "'" + value.replace(/'/g, "''") + "'";
|
||||||
}
|
}
|
||||||
|
|
||||||
escapeLiteral(value: string) {
|
|
||||||
return String(value).replace(/'/g, "''");
|
|
||||||
}
|
|
||||||
|
|
||||||
format = (value: string, variable: { multi: boolean; includeAll: boolean }) => {
|
|
||||||
// if no multi or include all do not regexEscape
|
|
||||||
if (!variable.multi && !variable.includeAll) {
|
|
||||||
return this.escapeLiteral(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof value === 'string') {
|
|
||||||
return this.quoteLiteral(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
const escapedValues = map(value, this.quoteLiteral);
|
|
||||||
return escapedValues.join(',');
|
|
||||||
};
|
|
||||||
|
|
||||||
interpolate() {
|
|
||||||
return this.templateSrv!.replace(this.target.rawSql, this.scopedVars, this.format);
|
|
||||||
}
|
|
||||||
|
|
||||||
getDatabase() {
|
getDatabase() {
|
||||||
return this.target.dataset;
|
return this.target.dataset;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user