diff --git a/pkg/expr/nodes.go b/pkg/expr/nodes.go index 6506b1b6691..22502b4a6cf 100644 --- a/pkg/expr/nodes.go +++ b/pkg/expr/nodes.go @@ -28,6 +28,10 @@ func (e QueryError) Error() string { return fmt.Sprintf("failed to execute query %s: %s", e.RefID, e.Err) } +func (e QueryError) Unwrap() error { + return e.Err +} + // baseNode includes common properties used across DPNodes. type baseNode struct { id int64 diff --git a/pkg/expr/nodes_test.go b/pkg/expr/nodes_test.go index a30130f1d6d..9661a663302 100644 --- a/pkg/expr/nodes_test.go +++ b/pkg/expr/nodes_test.go @@ -7,10 +7,36 @@ import ( "github.com/stretchr/testify/assert" ) -func TestQueryError(t *testing.T) { +type expectedError struct{} + +func (e expectedError) Error() string { + return "expected" +} + +func TestQueryError_Error(t *testing.T) { e := QueryError{ RefID: "A", Err: errors.New("this is an error message"), } assert.EqualError(t, e, "failed to execute query A: this is an error message") } + +func TestQueryError_Unwrap(t *testing.T) { + t.Run("errors.Is", func(t *testing.T) { + expectedIsErr := errors.New("expected") + e := QueryError{ + RefID: "A", + Err: expectedIsErr, + } + assert.True(t, errors.Is(e, expectedIsErr)) + }) + + t.Run("errors.As", func(t *testing.T) { + e := QueryError{ + RefID: "A", + Err: expectedError{}, + } + var expectedAsError expectedError + assert.True(t, errors.As(e, &expectedAsError)) + }) +}