From 0720a4ad4bb5f9b9342c0eb54cc21b5b23598fcf Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Thu, 9 Feb 2023 03:28:08 -0500 Subject: [PATCH] [v9.3.x] Fix MSSQL queries failing because of bad interpolation (#63171) Fix MSSQL queries failing because of bad interpolation (#63167) fix failing mssql queries (cherry picked from commit 62b078e4e4cad882e9e9a01f36cc8df4aa084eab) Co-authored-by: Victor Marin <36818606+mdvictor@users.noreply.github.com> --- pkg/tsdb/mssql/macros.go | 8 ++++++-- pkg/tsdb/mssql/macros_test.go | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/pkg/tsdb/mssql/macros.go b/pkg/tsdb/mssql/macros.go index a0c060c5b14..3bb35a80939 100644 --- a/pkg/tsdb/mssql/macros.go +++ b/pkg/tsdb/mssql/macros.go @@ -49,9 +49,13 @@ func (m *msSQLMacroEngine) Interpolate(query *backend.DataQuery, timeRange backe // TODO: Return any error rExp, _ := regexp.Compile(sExpr) var macroError error - formattedSql, fctCallArgsMap := replaceFunctionCallArgsWithPlaceholders(sql) + var fctCallArgsMap map[string]string - sql = m.ReplaceAllStringSubmatchFunc(rExp, formattedSql, func(groups []string) string { + if rExp.FindAllSubmatchIndex([]byte(sql), -1) != nil { + sql, fctCallArgsMap = replaceFunctionCallArgsWithPlaceholders(sql) + } + + sql = m.ReplaceAllStringSubmatchFunc(rExp, sql, func(groups []string) string { args := strings.Split(groups[2], ",") for i, arg := range args { args[i] = strings.Trim(arg, " ") diff --git a/pkg/tsdb/mssql/macros_test.go b/pkg/tsdb/mssql/macros_test.go index 5e14a9a0b6d..7966a08a963 100644 --- a/pkg/tsdb/mssql/macros_test.go +++ b/pkg/tsdb/mssql/macros_test.go @@ -349,6 +349,20 @@ func TestMacroEngine(t *testing.T) { require.NotNil(t, err) } }) + + t.Run("should return unmodified sql if there are no macros present", func(t *testing.T) { + sqls := []string{ + "select * from table", + "select count(val) from table", + "select col1, col2,col3, col4 from table where col1 = 'val1' and col2 = 'val2' order by col1 asc", + } + + for _, sql := range sqls { + actual, err := engine.Interpolate(query, timeRange, sql) + require.Nil(t, err) + require.Equal(t, sql, actual) + } + }) }) }