mirror of
https://github.com/grafana/grafana.git
synced 2025-09-23 18:52:33 +08:00
add compatibility code to handle pre 5.3 usage
This commit is contained in:
@ -30,6 +30,23 @@ func (m *postgresMacroEngine) Interpolate(query *tsdb.Query, timeRange *tsdb.Tim
|
|||||||
var macroError error
|
var macroError error
|
||||||
|
|
||||||
sql = replaceAllStringSubmatchFunc(rExp, sql, func(groups []string) string {
|
sql = replaceAllStringSubmatchFunc(rExp, sql, func(groups []string) string {
|
||||||
|
|
||||||
|
// detect if $__timeGroup is supposed to add AS time for pre 5.3 compatibility
|
||||||
|
// if there is a ',' directly after the macro call $__timeGroup is probably used
|
||||||
|
// in the old way. Inside window function ORDER BY $__timeGroup will be followed
|
||||||
|
// by ')'
|
||||||
|
if groups[1] == "__timeGroup" {
|
||||||
|
if index := strings.Index(sql, groups[0]); index >= 0 {
|
||||||
|
index += len(groups[0])
|
||||||
|
if len(sql) > index {
|
||||||
|
// check for character after macro expression
|
||||||
|
if sql[index] == ',' {
|
||||||
|
groups[1] = "__timeGroupAlias"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
args := strings.Split(groups[2], ",")
|
args := strings.Split(groups[2], ",")
|
||||||
for i, arg := range args {
|
for i, arg := range args {
|
||||||
args[i] = strings.Trim(arg, " ")
|
args[i] = strings.Trim(arg, " ")
|
||||||
|
@ -48,14 +48,27 @@ func TestMacroEngine(t *testing.T) {
|
|||||||
So(sql, ShouldEqual, fmt.Sprintf("select '%s'", from.Format(time.RFC3339)))
|
So(sql, ShouldEqual, fmt.Sprintf("select '%s'", from.Format(time.RFC3339)))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Convey("interpolate __timeGroup function pre 5.3 compatibility", func() {
|
||||||
|
|
||||||
|
sql, err := engine.Interpolate(query, timeRange, "SELECT $__timeGroup(time_column,'5m'), value")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
So(sql, ShouldEqual, "SELECT floor(extract(epoch from time_column)/300)*300 AS \"time\", value")
|
||||||
|
|
||||||
|
sql, err = engine.Interpolate(query, timeRange, "SELECT $__timeGroup(time_column,'5m') as time, value")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
So(sql, ShouldEqual, "SELECT floor(extract(epoch from time_column)/300)*300 as time, value")
|
||||||
|
})
|
||||||
|
|
||||||
Convey("interpolate __timeGroup function", func() {
|
Convey("interpolate __timeGroup function", func() {
|
||||||
|
|
||||||
sql, err := engine.Interpolate(query, timeRange, "$__timeGroup(time_column,'5m')")
|
sql, err := engine.Interpolate(query, timeRange, "SELECT $__timeGroup(time_column,'5m')")
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
sql2, err := engine.Interpolate(query, timeRange, "$__timeGroupAlias(time_column,'5m')")
|
sql2, err := engine.Interpolate(query, timeRange, "SELECT $__timeGroupAlias(time_column,'5m')")
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
So(sql, ShouldEqual, "floor(extract(epoch from time_column)/300)*300")
|
So(sql, ShouldEqual, "SELECT floor(extract(epoch from time_column)/300)*300")
|
||||||
So(sql2, ShouldEqual, sql+" AS \"time\"")
|
So(sql2, ShouldEqual, sql+" AS \"time\"")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user