SSE: Localize/Contain Errors within an Expression (#73163)

Changes SSE to not always fail all queries when one fails. Now only the query itself, and nodes that depend on it will error.
---------

Co-authored-by: Gilles De Mey <gilles.de.mey@gmail.com>
This commit is contained in:
Kyle Brandt
2023-09-13 13:58:16 -04:00
committed by GitHub
co-authored by Gilles De Mey
parent 01755608db
commit 35e488b22b
25 changed files with 663 additions and 679 deletions
+36 -56
View File
@@ -23,16 +23,12 @@ func TestAbsFunc(t *testing.T) {
name: "abs on number",
expr: "abs($A)",
vars: Vars{
"A": Results{
[]Value{
makeNumber("", nil, float64Pointer(-7)),
},
},
"A": resultValuesNoErr(makeNumber("", nil, float64Pointer(-7))),
},
newErrIs: require.NoError,
execErrIs: require.NoError,
resultIs: require.Equal,
results: Results{[]Value{makeNumber("", nil, float64Pointer(7))}},
results: resultValuesNoErr(makeNumber("", nil, float64Pointer(7))),
},
{
name: "abs on scalar",
@@ -41,34 +37,30 @@ func TestAbsFunc(t *testing.T) {
newErrIs: require.NoError,
execErrIs: require.NoError,
resultIs: require.Equal,
results: Results{[]Value{NewScalar("", float64Pointer(1.0))}},
results: resultValuesNoErr(NewScalar("", float64Pointer(1.0))),
},
{
name: "abs on series",
expr: "abs($A)",
vars: Vars{
"A": Results{
[]Value{
makeSeries("", nil, tp{
time.Unix(5, 0), float64Pointer(-2),
}, tp{
time.Unix(10, 0), float64Pointer(-1),
}),
},
},
"A": resultValuesNoErr(
makeSeries("", nil, tp{
time.Unix(5, 0), float64Pointer(-2),
}, tp{
time.Unix(10, 0), float64Pointer(-1),
}),
),
},
newErrIs: require.NoError,
execErrIs: require.NoError,
resultIs: require.Equal,
results: Results{
[]Value{
makeSeries("", nil, tp{
time.Unix(5, 0), float64Pointer(2),
}, tp{
time.Unix(10, 0), float64Pointer(1),
}),
},
},
results: resultValuesNoErr(
makeSeries("", nil, tp{
time.Unix(5, 0), float64Pointer(2),
}, tp{
time.Unix(10, 0), float64Pointer(1),
}),
),
},
{
name: "abs on string - should error",
@@ -101,51 +93,39 @@ func TestIsNumberFunc(t *testing.T) {
name: "is_number on number type with real number value",
expr: "is_number($A)",
vars: Vars{
"A": Results{
[]Value{
makeNumber("", nil, float64Pointer(6)),
},
},
"A": resultValuesNoErr(makeNumber("", nil, float64Pointer(6))),
},
results: Results{[]Value{makeNumber("", nil, float64Pointer(1))}},
results: resultValuesNoErr(makeNumber("", nil, float64Pointer(1))),
},
{
name: "is_number on number type with null value",
expr: "is_number($A)",
vars: Vars{
"A": Results{
[]Value{
makeNumber("", nil, nil),
},
},
"A": resultValuesNoErr(makeNumber("", nil, nil)),
},
results: Results{[]Value{makeNumber("", nil, float64Pointer(0))}},
results: resultValuesNoErr(makeNumber("", nil, float64Pointer(0))),
},
{
name: "is_number on on series",
expr: "is_number($A)",
vars: Vars{
"A": Results{
[]Value{
makeSeries("", nil,
tp{time.Unix(5, 0), float64Pointer(5)},
tp{time.Unix(10, 0), nil},
tp{time.Unix(15, 0), float64Pointer(math.NaN())},
tp{time.Unix(20, 0), float64Pointer(math.Inf(-1))},
tp{time.Unix(25, 0), float64Pointer(math.Inf(0))}),
},
},
},
results: Results{
[]Value{
"A": resultValuesNoErr(
makeSeries("", nil,
tp{time.Unix(5, 0), float64Pointer(1)},
tp{time.Unix(10, 0), float64Pointer(0)},
tp{time.Unix(15, 0), float64Pointer(0)},
tp{time.Unix(20, 0), float64Pointer(0)},
tp{time.Unix(25, 0), float64Pointer(0)}),
},
tp{time.Unix(5, 0), float64Pointer(5)},
tp{time.Unix(10, 0), nil},
tp{time.Unix(15, 0), float64Pointer(math.NaN())},
tp{time.Unix(20, 0), float64Pointer(math.Inf(-1))},
tp{time.Unix(25, 0), float64Pointer(math.Inf(0))}),
),
},
results: resultValuesNoErr(
makeSeries("", nil,
tp{time.Unix(5, 0), float64Pointer(1)},
tp{time.Unix(10, 0), float64Pointer(0)},
tp{time.Unix(15, 0), float64Pointer(0)},
tp{time.Unix(20, 0), float64Pointer(0)},
tp{time.Unix(25, 0), float64Pointer(0)}),
),
},
}
for _, tt := range tests {