diff --git a/test/cases/testdata/aggregates/test-aggregates-0028.yaml b/test/cases/testdata/aggregates/test-aggregates-0028.yaml new file mode 100644 index 0000000000..a80cd898ad --- /dev/null +++ b/test/cases/testdata/aggregates/test-aggregates-0028.yaml @@ -0,0 +1,29 @@ +cases: +- modules: + - | + package generated + + p = x { + count(input.foo, x) + } + note: aggregates/count error null + query: data.generated.p = x + input: + foo: null + strict_error: true + want_error_code: eval_type_error + want_error: 'operand 1 must be one of {array, object, set, string} but got null' +- modules: + - | + package generated + + p = x { + count(input.foo, x) + } + note: aggregates/count error number + query: data.generated.p = x + input: + foo: 5 + strict_error: true + want_error_code: eval_type_error + want_error: 'operand 1 must be one of {array, object, set, string} but got number' diff --git a/test/cases/testdata/objectfilter/test-objectfilter-0314.yaml b/test/cases/testdata/objectfilter/test-objectfilter-0314.yaml index 89efc74626..af808d8ebf 100644 --- a/test/cases/testdata/objectfilter/test-objectfilter-0314.yaml +++ b/test/cases/testdata/objectfilter/test-objectfilter-0314.yaml @@ -12,7 +12,6 @@ cases: } note: objectfilter/error invalid key param type string input query: data.generated.p = x - want_error: 'object.filter: operand 2 must be one of {object, string, array} but - got string' + want_error: 'object.filter: operand 2 must be one of {object, set, array} but got string' want_error_code: eval_type_error strict_error: true diff --git a/test/cases/testdata/objectfilter/test-objectfilter-0315.yaml b/test/cases/testdata/objectfilter/test-objectfilter-0315.yaml index 7e5ee7297f..b43d273919 100644 --- a/test/cases/testdata/objectfilter/test-objectfilter-0315.yaml +++ b/test/cases/testdata/objectfilter/test-objectfilter-0315.yaml @@ -12,7 +12,6 @@ cases: } note: objectfilter/error invalid key param type boolean input query: data.generated.p = x - want_error: 'object.filter: operand 2 must be one of {object, string, array} but - got boolean' + want_error: 'object.filter: operand 2 must be one of {object, set, array} but got boolean' want_error_code: eval_type_error strict_error: true diff --git a/test/cases/testdata/objectfilter/test-objectfilter-0316.yaml b/test/cases/testdata/objectfilter/test-objectfilter-0316.yaml index 43305dca96..b2b54243d7 100644 --- a/test/cases/testdata/objectfilter/test-objectfilter-0316.yaml +++ b/test/cases/testdata/objectfilter/test-objectfilter-0316.yaml @@ -12,7 +12,6 @@ cases: } note: objectfilter/error invalid key param type number input query: data.generated.p = x - want_error: 'object.filter: operand 2 must be one of {object, string, array} but - got number' + want_error: 'object.filter: operand 2 must be one of {object, set, array} but got number' want_error_code: eval_type_error strict_error: true diff --git a/test/cases/testdata/objectfilter/test-objectfilter-0317.yaml b/test/cases/testdata/objectfilter/test-objectfilter-0317.yaml index 4a4eb6e95c..8717b735a0 100644 --- a/test/cases/testdata/objectfilter/test-objectfilter-0317.yaml +++ b/test/cases/testdata/objectfilter/test-objectfilter-0317.yaml @@ -12,7 +12,6 @@ cases: } note: objectfilter/error invalid key param type nil input query: data.generated.p = x - want_error: 'object.filter: operand 2 must be one of {object, string, array} but - got null' + want_error: 'object.filter: operand 2 must be one of {object, set, array} but got null' want_error_code: eval_type_error strict_error: true diff --git a/test/cases/testdata/objectremove/test-objectremove-0294.yaml b/test/cases/testdata/objectremove/test-objectremove-0294.yaml index 918783e93a..946baac88b 100644 --- a/test/cases/testdata/objectremove/test-objectremove-0294.yaml +++ b/test/cases/testdata/objectremove/test-objectremove-0294.yaml @@ -12,7 +12,6 @@ cases: } note: objectremove/error invalid key param type string input query: data.generated.p = x - want_error: 'object.remove: operand 2 must be one of {object, string, array} but - got string' + want_error: 'object.remove: operand 2 must be one of {object, set, array} but got string' want_error_code: eval_type_error strict_error: true diff --git a/test/cases/testdata/objectremove/test-objectremove-0295.yaml b/test/cases/testdata/objectremove/test-objectremove-0295.yaml index e6bf64b323..2b1dce7e1b 100644 --- a/test/cases/testdata/objectremove/test-objectremove-0295.yaml +++ b/test/cases/testdata/objectremove/test-objectremove-0295.yaml @@ -12,7 +12,6 @@ cases: } note: objectremove/error invalid key param type boolean input query: data.generated.p = x - want_error: 'object.remove: operand 2 must be one of {object, string, array} but - got boolean' + want_error: 'object.remove: operand 2 must be one of {object, set, array} but got boolean' want_error_code: eval_type_error strict_error: true diff --git a/test/cases/testdata/objectremove/test-objectremove-0296.yaml b/test/cases/testdata/objectremove/test-objectremove-0296.yaml index d686ae8037..cf7811588e 100644 --- a/test/cases/testdata/objectremove/test-objectremove-0296.yaml +++ b/test/cases/testdata/objectremove/test-objectremove-0296.yaml @@ -12,7 +12,6 @@ cases: } note: objectremove/error invalid key param type number input query: data.generated.p = x - want_error: 'object.remove: operand 2 must be one of {object, string, array} but - got number' + want_error: 'object.remove: operand 2 must be one of {object, set, array} but got number' want_error_code: eval_type_error strict_error: true diff --git a/test/cases/testdata/objectremove/test-objectremove-0297.yaml b/test/cases/testdata/objectremove/test-objectremove-0297.yaml index 1e8ee4c06f..b23d47856c 100644 --- a/test/cases/testdata/objectremove/test-objectremove-0297.yaml +++ b/test/cases/testdata/objectremove/test-objectremove-0297.yaml @@ -12,7 +12,6 @@ cases: } note: objectremove/error invalid key param type nil input query: data.generated.p = x - want_error: 'object.remove: operand 2 must be one of {object, string, array} but - got null' + want_error: 'object.remove: operand 2 must be one of {object, set, array} but got null' want_error_code: eval_type_error strict_error: true diff --git a/topdown/aggregates.go b/topdown/aggregates.go index 63d60f56df..eba6db23dc 100644 --- a/topdown/aggregates.go +++ b/topdown/aggregates.go @@ -22,7 +22,7 @@ func builtinCount(a ast.Value) (ast.Value, error) { case ast.String: return ast.IntNumberTerm(len([]rune(a))).Value, nil } - return nil, builtins.NewOperandTypeErr(1, a, "array", "object", "set") + return nil, builtins.NewOperandTypeErr(1, a, "array", "object", "set", "string") } func builtinSum(a ast.Value) (ast.Value, error) { diff --git a/topdown/object.go b/topdown/object.go index 1eb28073de..8d366ddad0 100644 --- a/topdown/object.go +++ b/topdown/object.go @@ -8,7 +8,6 @@ import ( "github.com/open-policy-agent/opa/ast" "github.com/open-policy-agent/opa/internal/ref" "github.com/open-policy-agent/opa/topdown/builtins" - "github.com/open-policy-agent/opa/types" ) func builtinObjectUnion(_ BuiltinContext, operands []*ast.Term, iter func(*ast.Term) error) error { @@ -148,7 +147,7 @@ func getObjectKeysParam(arrayOrSet ast.Value) (ast.Set, error) { return nil }) default: - return nil, builtins.NewOperandTypeErr(2, arrayOrSet, ast.TypeName(types.Object{}), ast.TypeName(types.S), ast.TypeName(types.Array{})) + return nil, builtins.NewOperandTypeErr(2, arrayOrSet, "object", "set", "array") } return keys, nil