Skip to content

Commit 3570db0

Browse files
fix: strip double quotes from measurement names in v2/delete (#25407) (#25477)
When searching for a measurement in the v2/delete API, remove any quotes put on the measurement name (e.g. to alllow special characters) before string comparisons. closes #25406 (cherry picked from commit e3e9232) closes #25476
1 parent c9bd5f3 commit 3570db0

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

services/httpd/handler.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,7 @@ func (h *Handler) serveDeleteV2(w http.ResponseWriter, r *http.Request, user met
10171017
case influxql.EQ:
10181018
tag, ok := e.LHS.(*influxql.VarRef)
10191019
if ok && tag.Val == measurement {
1020-
srcs = append(srcs, &influxql.Measurement{Name: e.RHS.String()})
1020+
srcs = append(srcs, &influxql.Measurement{Name: strings.Trim(e.RHS.String(), `"`)})
10211021
return true, nil
10221022
}
10231023
// Not permitted in V2 API DELETE predicates

services/httpd/handler_test.go

+27-2
Original file line numberDiff line numberDiff line change
@@ -1715,6 +1715,7 @@ func TestHandler_Write_V2_Precision(t *testing.T) {
17151715
}
17161716

17171717
func TestHandler_Delete_V2(t *testing.T) {
1718+
var errUnexpectedMeasurement = errors.New("unexpected measurement")
17181719
type test struct {
17191720
url string
17201721
body httpd.DeleteBody
@@ -1742,7 +1743,7 @@ func TestHandler_Delete_V2(t *testing.T) {
17421743
},
17431744
&test{
17441745
url: "/api/v2/delete?org=bar&bucket=mydb/myrp",
1745-
body: httpd.DeleteBody{Stop: "2022-03-23T20:56:06Z", Start: "2022-03-23T22:56:06Z", Predicate: "_measurement='baz' AND t1=tagOne"},
1746+
body: httpd.DeleteBody{Stop: "2022-03-23T20:56:06Z", Start: "2022-03-23T22:56:06Z", Predicate: "_measurement=\"mymeasure\" AND t1=tagOne"},
17461747
status: http.StatusOK,
17471748
errMsg: ``,
17481749
},
@@ -1782,11 +1783,28 @@ func TestHandler_Delete_V2(t *testing.T) {
17821783
body: httpd.DeleteBody{Stop: "2022-03-23T20:56:06Z", Start: "2022-03-23T18:56:06Z", Predicate: `_measurement = "mymeasure" AND "tag0" = "value1"`},
17831784
status: http.StatusOK,
17841785
},
1786+
&test{
1787+
url: "/api/v2/delete?org=bar&bucket=mydb/myrp",
1788+
body: httpd.DeleteBody{Stop: "2022-03-23T20:56:06Z", Start: "2022-03-23T18:56:06Z", Predicate: `_measurement = mymeasure AND "tag0" = "value1"`},
1789+
status: http.StatusOK,
1790+
},
17851791
&test{
17861792
url: "/api/v2/delete?org=bar&bucket=mydb/myrp",
17871793
body: httpd.DeleteBody{Stop: "2022-03-23T20:56:06Z", Start: "2022-03-23T18:56:06Z", Predicate: `_measurement = "mymeasure" AND "tag0" = "value1" AND tag1 = value3`},
17881794
status: http.StatusOK,
17891795
},
1796+
&test{
1797+
url: "/api/v2/delete?org=bar&bucket=mydb/myrp",
1798+
body: httpd.DeleteBody{Stop: "2022-03-23T20:56:06Z", Start: "2022-03-23T18:56:06Z", Predicate: `_measurement = "bad_measurement" AND "tag0" = "value1" AND tag1 = value3`},
1799+
status: http.StatusBadRequest,
1800+
errMsg: "delete - database: \"mydb\", retention policy: \"myrp\", start: \"2022-03-23T18:56:06Z\", stop: \"2022-03-23T20:56:06Z\", predicate: \"_measurement = \\\"bad_measurement\\\" AND \\\"tag0\\\" = \\\"value1\\\" AND tag1 = value3\", error: unexpected measurement",
1801+
},
1802+
&test{
1803+
url: "/api/v2/delete?org=bar&bucket=mydb/myrp",
1804+
body: httpd.DeleteBody{Stop: "2022-03-23T20:56:06Z", Start: "2022-03-23T18:56:06Z", Predicate: `_measurement = bad_measurement AND "tag0" = "value1" AND tag1 = value3`},
1805+
status: http.StatusBadRequest,
1806+
errMsg: "delete - database: \"mydb\", retention policy: \"myrp\", start: \"2022-03-23T18:56:06Z\", stop: \"2022-03-23T20:56:06Z\", predicate: \"_measurement = bad_measurement AND \\\"tag0\\\" = \\\"value1\\\" AND tag1 = value3\", error: unexpected measurement",
1807+
},
17901808
&test{
17911809
url: "/api/v2/delete?org=bar&bucket=mydb/myrp",
17921810
body: httpd.DeleteBody{Stop: "2022-03-23T20:56:06Z", Start: "2022-03-23T18:56:06Z", Predicate: `_measurement = "mymeasure" AND "tag0" != "value1" AND tag1 = value3`},
@@ -1796,7 +1814,14 @@ func TestHandler_Delete_V2(t *testing.T) {
17961814
}
17971815

17981816
h := NewHandler(false)
1799-
h.Store.DeleteFn = func(database string, sources []influxql.Source, condition influxql.Expr) error { return nil }
1817+
h.Store.DeleteFn = func(database string, sources []influxql.Source, condition influxql.Expr) error {
1818+
if len(sources) > 0 {
1819+
if m, ok := sources[0].(*influxql.Measurement); ok && m.Name != "mymeasure" {
1820+
return errUnexpectedMeasurement
1821+
}
1822+
}
1823+
return nil
1824+
}
18001825
h.MetaClient = &internal.MetaClientMock{
18011826
DatabaseFn: func(name string) *meta.DatabaseInfo {
18021827
if name == "mydb" {

0 commit comments

Comments
 (0)