Skip to content

Commit e74f2dd

Browse files
committed
Solved comments to return out of bound errors
1 parent 4954198 commit e74f2dd

File tree

2 files changed

+52
-53
lines changed

2 files changed

+52
-53
lines changed

pkg/ottl/ottlfuncs/func_delete.go

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,10 @@ func createDeleteFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (
2929
return nil, errors.New("DeleteFactory args must be of type *DeleteArguments[K]")
3030
}
3131

32-
return deleteFrom(args.Target, args.Index, args.Length)
32+
return deleteFrom(args.Target, args.Index, args.Length), nil
3333
}
3434

35-
func deleteFrom[K any](target ottl.GetSetter[K], indexGetter ottl.IntGetter[K], lengthGetter ottl.Optional[ottl.IntGetter[K]]) (ottl.ExprFunc[K], error) {
36-
if indexGetter == nil {
37-
return nil, errors.New("indexGetter cannot be nil for delete function")
38-
}
39-
35+
func deleteFrom[K any](target ottl.GetSetter[K], indexGetter ottl.IntGetter[K], lengthGetter ottl.Optional[ottl.IntGetter[K]]) ottl.ExprFunc[K] {
4036
return func(ctx context.Context, tCtx K) (any, error) {
4137
t, err := target.Get(ctx, tCtx)
4238
if err != nil {
@@ -57,14 +53,6 @@ func deleteFrom[K any](target ottl.GetSetter[K], indexGetter ottl.IntGetter[K],
5753
return nil, err
5854
}
5955

60-
if index == -1 {
61-
// If we get -1 as index, do nothing and return nil.
62-
// Example: If we execute 'delete(attributes["tags"], Index(attributes["tags"], "error"))' statement
63-
// and 'error' is not found in tags, Index func will return -1, To avoid errors on this scenario,
64-
// in this case delete function will be a no-op.
65-
return nil, target.Set(ctx, tCtx, t)
66-
}
67-
6856
length := int64(1)
6957
if !lengthGetter.IsEmpty() {
7058
length, err = lengthGetter.Get().Get(ctx, tCtx)
@@ -74,17 +62,14 @@ func deleteFrom[K any](target ottl.GetSetter[K], indexGetter ottl.IntGetter[K],
7462
}
7563

7664
sliceLen := int64(targetSlice.Len())
77-
if index < -1 || index >= sliceLen {
78-
return nil, fmt.Errorf("index %d out of bounds for slice of length %d", index, sliceLen)
79-
}
80-
81-
if length <= 0 {
82-
return nil, fmt.Errorf("length must be positive, got %d", length)
65+
endIndex, err := validateBounds(index, length, sliceLen)
66+
if err != nil {
67+
return nil, err
8368
}
8469

85-
endIndex := index + length
86-
if endIndex > sliceLen {
87-
endIndex = sliceLen
70+
if index == 0 && endIndex == sliceLen {
71+
// If deleting all elements, return an empty slice without looping
72+
return nil, target.Set(ctx, tCtx, pcommon.NewSlice())
8873
}
8974

9075
resSlice := pcommon.NewSlice()
@@ -96,5 +81,21 @@ func deleteFrom[K any](target ottl.GetSetter[K], indexGetter ottl.IntGetter[K],
9681
}
9782

9883
return nil, target.Set(ctx, tCtx, resSlice)
99-
}, nil
84+
}
85+
}
86+
87+
func validateBounds(index, length, sliceLen int64) (endIndex int64, err error) {
88+
if index < 0 || index >= sliceLen {
89+
return 0, fmt.Errorf("index %d out of bounds for slice of length %d", index, sliceLen)
90+
}
91+
92+
if length <= 0 {
93+
return 0, fmt.Errorf("length must be positive, got %d", length)
94+
}
95+
96+
endIndex = index + length
97+
if endIndex > sliceLen {
98+
return 0, fmt.Errorf("deletion range [%d:%d] out of bounds for slice of length %d", index, endIndex, sliceLen)
99+
}
100+
return endIndex, nil
100101
}

pkg/ottl/ottlfuncs/func_delete_test.go

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -247,18 +247,6 @@ func TestDelete(t *testing.T) {
247247
[]float64{1.1, 2.2, 3.3},
248248
}),
249249
},
250-
{
251-
name: "delete with index -1 does nothing",
252-
target: ottl.StandardGetSetter[any]{
253-
Getter: func(_ context.Context, _ any) (any, error) {
254-
return getSlice(t, []any{0, 1, 2, 3, 4, 5}), nil
255-
},
256-
Setter: setter,
257-
},
258-
index: getIntGetter(-1),
259-
length: nilOptional,
260-
expected: getSlice(t, []any{0, 1, 2, 3, 4, 5}),
261-
},
262250
{
263251
name: "delete all elements",
264252
target: ottl.StandardGetSetter[any]{
@@ -271,18 +259,6 @@ func TestDelete(t *testing.T) {
271259
length: ottl.NewTestingOptional(getIntGetter(5)),
272260
expected: getSlice(t, []any{}),
273261
},
274-
{
275-
name: "endIndex exceeds slice length",
276-
target: ottl.StandardGetSetter[any]{
277-
Getter: func(_ context.Context, _ any) (any, error) {
278-
return getSlice(t, []any{0, 1, 2, 3}), nil
279-
},
280-
Setter: setter,
281-
},
282-
index: getIntGetter(1),
283-
length: ottl.NewTestingOptional(getIntGetter(5)),
284-
expected: getSlice(t, []any{0}),
285-
},
286262
{
287263
name: "target is pcommon.Value slice",
288264
target: ottl.StandardGetSetter[any]{
@@ -305,8 +281,7 @@ func TestDelete(t *testing.T) {
305281

306282
for _, tc := range testCases {
307283
t.Run(tc.name, func(t *testing.T) {
308-
exprFunc, err := deleteFrom(tc.target, tc.index, tc.length)
309-
assert.NoError(t, err)
284+
exprFunc := deleteFrom(tc.target, tc.index, tc.length)
310285

311286
res := pcommon.NewSlice()
312287
result, err := exprFunc(t.Context(), res)
@@ -418,14 +393,37 @@ func TestDelete_Errors(t *testing.T) {
418393
length: ottl.NewTestingOptional(getIntGetter(0)),
419394
expectedErr: "length must be positive, got 0",
420395
},
396+
{
397+
name: "deletion range out of bounds",
398+
target: ottl.StandardGetSetter[any]{
399+
Getter: func(_ context.Context, _ any) (any, error) {
400+
return getSlice(t, []any{0, 1, 2, 3}), nil
401+
},
402+
Setter: setter,
403+
},
404+
index: getIntGetter(2),
405+
length: ottl.NewTestingOptional(getIntGetter(5)),
406+
expectedErr: "deletion range [2:7] out of bounds",
407+
},
408+
{
409+
name: "negative index",
410+
target: ottl.StandardGetSetter[any]{
411+
Getter: func(_ context.Context, _ any) (any, error) {
412+
return getSlice(t, []any{0, 1, 2, 3}), nil
413+
},
414+
Setter: setter,
415+
},
416+
index: getIntGetter(-1),
417+
length: nilOptional,
418+
expectedErr: "index -1 out of bounds",
419+
},
421420
}
422421
for _, etc := range errorTestCases {
423422
t.Run(etc.name, func(t *testing.T) {
424-
exprFunc, err := deleteFrom(etc.target, etc.index, etc.length)
425-
assert.NoError(t, err)
423+
exprFunc := deleteFrom(etc.target, etc.index, etc.length)
426424

427425
res := pcommon.NewSlice()
428-
_, err = exprFunc(t.Context(), res)
426+
_, err := exprFunc(t.Context(), res)
429427
assert.ErrorContains(t, err, etc.expectedErr)
430428
})
431429
}

0 commit comments

Comments
 (0)