diff --git a/public/app/plugins/datasource/influxdb/influx_query_model.ts b/public/app/plugins/datasource/influxdb/influx_query_model.ts index 903bae11e64..78f69e666af 100644 --- a/public/app/plugins/datasource/influxdb/influx_query_model.ts +++ b/public/app/plugins/datasource/influxdb/influx_query_model.ts @@ -142,6 +142,7 @@ export default class InfluxQueryModel { } private renderTagCondition(tag: InfluxQueryTag, index: number, interpolate?: boolean) { + // FIXME: merge this function with query_builder/renderTagCondition let str = ''; let operator = tag.operator; let value = tag.value; diff --git a/public/app/plugins/datasource/influxdb/query_builder.ts b/public/app/plugins/datasource/influxdb/query_builder.ts index 0155c0910d0..49b8a0089d5 100644 --- a/public/app/plugins/datasource/influxdb/query_builder.ts +++ b/public/app/plugins/datasource/influxdb/query_builder.ts @@ -2,6 +2,7 @@ import { reduce } from 'lodash'; import kbn from 'app/core/utils/kbn'; function renderTagCondition(tag: { operator: any; value: string; condition: any; key: string }, index: number) { + // FIXME: merge this function with influx_query_model/renderTagCondition let str = ''; let operator = tag.operator; let value = tag.value; @@ -19,7 +20,7 @@ function renderTagCondition(tag: { operator: any; value: string; condition: any; // quote value unless regex or number, or if empty-string if (value === '' || (operator !== '=~' && operator !== '!~' && isNaN(+value))) { - value = "'" + value + "'"; + value = "'" + value.replace(/\\/g, '\\\\').replace(/\'/g, "\\'") + "'"; } return str + '"' + tag.key + '" ' + operator + ' ' + value; diff --git a/public/app/plugins/datasource/influxdb/specs/query_builder.test.ts b/public/app/plugins/datasource/influxdb/specs/query_builder.test.ts index 59b8e839e98..9c989f671b6 100644 --- a/public/app/plugins/datasource/influxdb/specs/query_builder.test.ts +++ b/public/app/plugins/datasource/influxdb/specs/query_builder.test.ts @@ -178,6 +178,24 @@ describe('InfluxQueryBuilder', () => { expect(query).toBe(`SHOW TAG KEYS WHERE "app" == 42`); }); + it('should handle tag-value-contains-backslash-character getting tag-keys', () => { + const builder = new InfluxQueryBuilder( + { measurement: undefined, tags: [{ key: 'app', value: 'lab\\el', operator: '==' }] }, + undefined + ); + const query = builder.buildExploreQuery('TAG_KEYS'); + expect(query).toBe(`SHOW TAG KEYS WHERE "app" == 'lab\\\\el'`); + }); + + it('should handle tag-value-contains-single-quote-character getting tag-keys', () => { + const builder = new InfluxQueryBuilder( + { measurement: undefined, tags: [{ key: 'app', value: "lab'el", operator: '==' }] }, + undefined + ); + const query = builder.buildExploreQuery('TAG_KEYS'); + expect(query).toBe(`SHOW TAG KEYS WHERE "app" == 'lab\\'el'`); + }); + it('should handle tag-value=emptry-string when getting measurements', () => { const builder = new InfluxQueryBuilder( { measurement: undefined, tags: [{ key: 'app', value: '', operator: '==' }] },