diff --git a/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts b/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts index 07f9a874d85..f9508866d47 100644 --- a/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts +++ b/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts @@ -76,6 +76,36 @@ describe('buildVisualQueryFromString', () => { ); }); + it('parses query with line filter and escaped quote', () => { + expect(buildVisualQueryFromString('{app="frontend"} |= "\\"line"')).toEqual( + noErrors({ + labels: [ + { + op: '=', + value: 'frontend', + label: 'app', + }, + ], + operations: [{ id: LokiOperationId.LineContains, params: ['"line'] }], + }) + ); + }); + + it('parses query with label filter and escaped quote', () => { + expect(buildVisualQueryFromString('{app="frontend"} | bar="\\"baz"')).toEqual( + noErrors({ + labels: [ + { + op: '=', + value: 'frontend', + label: 'app', + }, + ], + operations: [{ id: LokiOperationId.LabelFilter, params: ['bar', '=', '"baz'] }], + }) + ); + }); + it('returns error for query with ip matching line filter', () => { const context = buildVisualQueryFromString('{app="frontend"} |= ip("192.168.4.5/16") | logfmt'); expect(context).toEqual( @@ -320,7 +350,7 @@ describe('buildVisualQueryFromString', () => { }); it('parses query with with decolorize and other operations', () => { - expect(buildVisualQueryFromString('{app="frontend"} | logfmt | decolorize | __error__="')).toEqual( + expect(buildVisualQueryFromString('{app="frontend"} | logfmt | decolorize | __error__=""')).toEqual( noErrors({ labels: [ { diff --git a/public/app/plugins/datasource/loki/querybuilder/parsing.ts b/public/app/plugins/datasource/loki/querybuilder/parsing.ts index 82cec32dbfc..cf2983a6d98 100644 --- a/public/app/plugins/datasource/loki/querybuilder/parsing.ts +++ b/public/app/plugins/datasource/loki/querybuilder/parsing.ts @@ -599,7 +599,10 @@ function isIntervalVariableError(node: SyntaxNode) { function handleQuotes(string: string) { if (string[0] === `"` && string[string.length - 1] === `"`) { - return string.replace(/"/g, '').replace(/\\\\/g, '\\'); + return string + .substring(1, string.length - 1) + .replace(/\\"/g, '"') + .replace(/\\\\/g, '\\'); } return string.replace(/`/g, ''); }