From ad6f71e6d00ecf9f7334fdfc502eff71148f6ae7 Mon Sep 17 00:00:00 2001 From: Greg Lindhorst Date: Thu, 19 Mar 2026 18:31:11 -0700 Subject: [PATCH 1/2] Updates --- .../Microsoft.PowerFx.Core/Binding/Binder.cs | 2 +- .../Functions/TexlFunction.cs | 3 + .../Functions/SetFunction.cs | 7 +- .../MutationFunctionsTests.cs | 332 +++++++++--------- 4 files changed, 175 insertions(+), 169 deletions(-) diff --git a/src/libraries/Microsoft.PowerFx.Core/Binding/Binder.cs b/src/libraries/Microsoft.PowerFx.Core/Binding/Binder.cs index d4fe0a140a..d227233a7f 100644 --- a/src/libraries/Microsoft.PowerFx.Core/Binding/Binder.cs +++ b/src/libraries/Microsoft.PowerFx.Core/Binding/Binder.cs @@ -4987,7 +4987,7 @@ private bool IsIncorrectlySideEffectful(CallNode node, out ErrorResourceKey erro if (ancestorFunc != null && ancestorScopeInfo != null && ancestorScopeInfo.HasNondeterministicOperationOrder && - !func.AllowedWithinNondeterministicOperationOrder) + !func.AllowedWithinNondeterministicOperationOrderWithFeatures(_features)) { errorKey = TexlStrings.ErrFunctionDisallowedWithinNondeterministicOperationOrder; badAncestor = ancestorScope.Call; diff --git a/src/libraries/Microsoft.PowerFx.Core/Functions/TexlFunction.cs b/src/libraries/Microsoft.PowerFx.Core/Functions/TexlFunction.cs index d066f619ef..2cfa13466c 100644 --- a/src/libraries/Microsoft.PowerFx.Core/Functions/TexlFunction.cs +++ b/src/libraries/Microsoft.PowerFx.Core/Functions/TexlFunction.cs @@ -127,6 +127,9 @@ internal abstract class TexlFunction : IFunction // that have a nondeterministic operation order (due to multiple async calls). public virtual bool AllowedWithinNondeterministicOperationOrder => true; + // Allows override for functions for which this depends on enalbed features, in particular EnhancedIterationFunctionChecks. + public virtual bool AllowedWithinNondeterministicOperationOrderWithFeatures(Features features) => AllowedWithinNondeterministicOperationOrder; + /// /// Whether the function always produces a visible error if CheckTypes returns invalid. /// This can be used to prevent the overall "Function has invalid arguments" error. diff --git a/src/libraries/Microsoft.PowerFx.Interpreter/Functions/SetFunction.cs b/src/libraries/Microsoft.PowerFx.Interpreter/Functions/SetFunction.cs index 18323d4797..ac077e1b3a 100644 --- a/src/libraries/Microsoft.PowerFx.Interpreter/Functions/SetFunction.cs +++ b/src/libraries/Microsoft.PowerFx.Interpreter/Functions/SetFunction.cs @@ -30,7 +30,10 @@ internal class RecalcEngineSetFunction : TexlFunction public override bool IsSelfContained => false; // Set() of a simple identifier is not a mutation through a reference (a mutate), but rather changing the reference (a true set). - public override bool MutatesArg(int argIndex, TexlNode arg) => argIndex == 0 && arg.Kind != NodeKind.FirstName; + public override bool MutatesArg(int argIndex, TexlNode arg) => argIndex == 0 && arg.Kind != NodeKind.FirstName; + + // If enhanced checks are enabled, overrides default true to block Set() from being used in iterator functions. + public override bool AllowedWithinNondeterministicOperationOrderWithFeatures(Features features) => !features.EnhancedIterationChecks; public override IEnumerable GetSignatures() { @@ -48,7 +51,7 @@ public RecalcEngineSetFunction() 0, // no lambdas 2, 2) - { + { } public override bool CheckTypes(CheckTypesContext context, TexlNode[] args, DType[] argTypes, IErrorContainer errors, out DType returnType, out Dictionary nodeToCoercedTypeMap) diff --git a/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/MutationFunctionsTests.cs b/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/MutationFunctionsTests.cs index 86fffe8f32..a2bc986d85 100644 --- a/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/MutationFunctionsTests.cs +++ b/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/MutationFunctionsTests.cs @@ -555,28 +555,28 @@ public void MutationSuggestionTests(string expression, bool allowSideEffects, pa [InlineData("RenameColumns(DS, Name, Remove(DS, {}); NewName ) ", " IdentName", " IdentName", " IdentName", " IdentName", " IdentName", " IdentName")] [InlineData("RenameColumns(DS, Remove(DS, {}); Name, NewName ) ", " IdentName", " IdentName", " IdentName", " IdentName", " IdentName", " IdentName")] - // Untyped objects can be iterated only by ForAll dynamic DS - - [InlineData("ForAll(DynVar, Set(DynVar, TblDynVar)) ", " Ok")] - [InlineData("ForAll(DynVar, Set(First(DynVar), TblDynVar)) ", " Immutable")] - [InlineData("ForAll(DynVar, Clear(TblVar)) ", " Unordered")] - [InlineData("ForAll(DynVar, Collect(DynVar, {Id:1})) ", "InvalidArg")] - [InlineData("ForAll(DynVar, Clear(DynVar)) ", "BadTypeExp")] - - [InlineData("Filter(DynVar, Set(DynVar, TblDynVar); 1=1) ", " BadType")] - [InlineData("LookUp(DynVar, Set(DynVar, TblDynVar); 1=1) ", " BadType")] - [InlineData("CountIf(DynVar, Set(DynVar, TblDynVar); 1=1) ", " BadType")] - [InlineData("AddColumns(DynVar, Num, Set(DynVar, TblDynVar); 2) ", " BadType")] - [InlineData("Concat(DynVar, Set(DynVar, TblDynVar); Text(Id)) ", " BadType")] - [InlineData("Distinct(DynVar, Set(DynVar, TblDynVar); Id) ", " BadType")] - [InlineData("Sum(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped")] - [InlineData("Average(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped")] - [InlineData("Min(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped")] - [InlineData("Max(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped")] - [InlineData("VarP(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped")] - [InlineData("StdevP(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped")] - [InlineData("Search(DynVar, Set(DynVar, TblDynVar); \"b\", Name) ", " BadType")] - [InlineData("With(First(DynVar), Set(DynVar, TblDynVar)) ", " BadType")] + // Untyped objects can be iterated only by ForAll dynamic DS, enhanced + + [InlineData("ForAll(DynVar, Set(DynVar, TblDynVar)) ", " Ok", " Unordered")] + [InlineData("ForAll(DynVar, Set(First(DynVar), TblDynVar)) ", " Immutable", " Immutable")] + [InlineData("ForAll(DynVar, Clear(TblVar)) ", " Unordered", " Unordered")] + [InlineData("ForAll(DynVar, Collect(DynVar, {Id:1})) ", "InvalidArg", "InvalidArg")] + [InlineData("ForAll(DynVar, Clear(DynVar)) ", "BadTypeExp", "BadTypeExp")] + + [InlineData("Filter(DynVar, Set(DynVar, TblDynVar); 1=1) ", " BadType", " BadType")] + [InlineData("LookUp(DynVar, Set(DynVar, TblDynVar); 1=1) ", " BadType", " BadType")] + [InlineData("CountIf(DynVar, Set(DynVar, TblDynVar); 1=1) ", " BadType", " BadType")] + [InlineData("AddColumns(DynVar, Num, Set(DynVar, TblDynVar); 2) ", " BadType", " BadType")] + [InlineData("Concat(DynVar, Set(DynVar, TblDynVar); Text(Id)) ", " BadType", " BadType")] + [InlineData("Distinct(DynVar, Set(DynVar, TblDynVar); Id) ", " BadType", " BadType")] + [InlineData("Sum(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("Average(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("Min(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("Max(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("VarP(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("StdevP(DynVar, Set(DynVar, TblDynVar); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("Search(DynVar, Set(DynVar, TblDynVar); \"b\", Name) ", " BadType", " BadType")] + [InlineData("With(First(DynVar), Set(DynVar, TblDynVar)) ", " BadType", " BadType")] // Deep mutations are not supported on the iterated record delegable DS, enhanced , non-del DS, enhanced , variable DS, enhanced @@ -613,168 +613,168 @@ public void MutationSuggestionTests(string expression, bool allowSideEffects, pa // Set non self modifying delegable DS, enhanced , non-del DS, enhanced , variable DS, enhanced - [InlineData("ForAll(DS, Set(TblVar, [{Id:1,Name:\"a\"}])) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] - [InlineData("ForAll(DS, Set(First(TblVar).Id, 3)) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] - [InlineData("AddColumns(DS, Num, Set(TblVar, [{Id:1,Name:\"a\"}]); 2) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] - [InlineData("AddColumns(DS, Num, Set(First(TblVar).Id, 3); 2) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] - [InlineData("Concat(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Text(Id)) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] - [InlineData("Distinct(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] - [InlineData("Sum(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Ok")] - [InlineData("Average(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Ok")] - [InlineData("Min(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Ok")] - [InlineData("Max(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Ok")] - [InlineData("VarP(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] - [InlineData("StdevP(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] - [InlineData("Concat(DS, Set(First(TblVar).Id, 3); Text(Id)) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] - [InlineData("Distinct(DS, Set(First(TblVar).Id, 3); Id) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] - [InlineData("Sum(DS, Set(First(TblVar).Id, 3); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Ok")] - [InlineData("Average(DS, Set(First(TblVar).Id, 3); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Ok")] - [InlineData("Min(DS, Set(First(TblVar).Id, 3); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Ok")] - [InlineData("Max(DS, Set(First(TblVar).Id, 3); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Ok")] - [InlineData("VarP(DS, Set(First(TblVar).Id, 3); Id) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] - [InlineData("StdevP(DS, Set(First(TblVar).Id, 3); Id) ", " Ok", " Ok", " Ok", " Ok", " Ok", " Ok")] + [InlineData("ForAll(DS, Set(TblVar, [{Id:1,Name:\"a\"}])) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] + [InlineData("ForAll(DS, Set(First(TblVar).Id, 3)) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] + [InlineData("AddColumns(DS, Num, Set(TblVar, [{Id:1,Name:\"a\"}]); 2) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] + [InlineData("AddColumns(DS, Num, Set(First(TblVar).Id, 3); 2) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] + [InlineData("Concat(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Text(Id)) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] + [InlineData("Distinct(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] + [InlineData("Sum(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Unordered")] + [InlineData("Average(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Unordered")] + [InlineData("Min(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Unordered")] + [InlineData("Max(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Unordered")] + [InlineData("VarP(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] + [InlineData("StdevP(DS, Set(TblVar, [{Id:1,Name:\"a\"}]); Id) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] + [InlineData("Concat(DS, Set(First(TblVar).Id, 3); Text(Id)) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] + [InlineData("Distinct(DS, Set(First(TblVar).Id, 3); Id) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] + [InlineData("Sum(DS, Set(First(TblVar).Id, 3); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Unordered")] + [InlineData("Average(DS, Set(First(TblVar).Id, 3); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Unordered")] + [InlineData("Min(DS, Set(First(TblVar).Id, 3); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Unordered")] + [InlineData("Max(DS, Set(First(TblVar).Id, 3); Id) ", "NonDelWarn", "NonDelWarn", "NonDelWnOp", "NonDelWnOp", " Ok", " Unordered")] + [InlineData("VarP(DS, Set(First(TblVar).Id, 3); Id) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] + [InlineData("StdevP(DS, Set(First(TblVar).Id, 3); Id) ", " Ok", " Unordered", " Ok", " Unordered", " Ok", " Unordered")] // Set self modifying, direct DS delegable DS, enhanced , non-del DS, enhanced , variable DS, enhanced - [InlineData("ForAll(DS, Set(DS, [{Id:1,Name:\"a\"}])) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("ForAll(DS, Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("ForAll(DS, If(ThisRecord.Id>1, Set(DS, [{Id:1,Name:\"a\"}]))) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("ForAll(DS, If(Id>1, Set(DS, [{Id:1,Name:\"a\"}]))) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("AddColumns(DS, Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("AddColumns(DS, Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("AddColumns(DS, Num, If(ThisRecord.Id>1,Set(DS, [{Id:1,Name:\"a\"}]); 2)) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("AddColumns(DS, Num, If(Id>1,Set(DS, [{Id:1,Name:\"a\"}]); 2)) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("Concat(DS, Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("Distinct(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("Sum(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("Average(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("Min(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("Max(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("VarP(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("StdevP(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Ok")] - [InlineData("Concat(DS, Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Distinct(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Sum(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Average(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Min(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Max(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("VarP(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("StdevP(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] + [InlineData("ForAll(DS, Set(DS, [{Id:1,Name:\"a\"}])) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("ForAll(DS, Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("ForAll(DS, If(ThisRecord.Id>1, Set(DS, [{Id:1,Name:\"a\"}]))) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("ForAll(DS, If(Id>1, Set(DS, [{Id:1,Name:\"a\"}]))) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("AddColumns(DS, Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("AddColumns(DS, Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("AddColumns(DS, Num, If(ThisRecord.Id>1,Set(DS, [{Id:1,Name:\"a\"}]); 2)) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("AddColumns(DS, Num, If(Id>1,Set(DS, [{Id:1,Name:\"a\"}]); 2)) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("Concat(DS, Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("Distinct(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("Sum(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("Average(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("Min(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("Max(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("VarP(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("StdevP(DS, Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " SelfMod", " SelfMod", " Ok", " Unordered")] + [InlineData("Concat(DS, Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Distinct(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Sum(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Average(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Min(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Max(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("VarP(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("StdevP(DS, Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] // Set self modifying, Filter of DS delegable DS, enhanced , non-del DS, enhanced , variable DS, enhanced - [InlineData("ForAll(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}])) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("ForAll(Filter(DS,1=1), Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("AddColumns(Filter(DS,1=1), Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("AddColumns(Filter(DS,1=1), Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Concat(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Distinct(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Sum(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Average(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Min(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Max(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("VarP(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("StdevP(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Concat(Filter(DS,1=1), Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Distinct(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Sum(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Average(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Min(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Max(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("VarP(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("StdevP(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] + [InlineData("ForAll(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}])) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("ForAll(Filter(DS,1=1), Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("AddColumns(Filter(DS,1=1), Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("AddColumns(Filter(DS,1=1), Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Concat(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Distinct(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Sum(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Average(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Min(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Max(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("VarP(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("StdevP(Filter(DS,1=1), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Concat(Filter(DS,1=1), Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Distinct(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Sum(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Average(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Min(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Max(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("VarP(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("StdevP(Filter(DS,1=1), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] // Set self modifying, Sort DS delegable DS, enhanced , non-del DS, enhanced , variable DS, enhanced - [InlineData("ForAll(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}])) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("ForAll(Sort(DS,Id), Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("AddColumns(Sort(DS,Id), Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("AddColumns(Sort(DS,Id), Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Concat(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Distinct(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Sum(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Average(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Min(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Max(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("VarP(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("StdevP(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Concat(Sort(DS,Id), Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Distinct(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Sum(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Average(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Min(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Max(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("VarP(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("StdevP(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] + [InlineData("ForAll(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}])) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("ForAll(Sort(DS,Id), Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("AddColumns(Sort(DS,Id), Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("AddColumns(Sort(DS,Id), Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Concat(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Distinct(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Sum(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Average(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Min(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Max(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("VarP(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("StdevP(Sort(DS,Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Concat(Sort(DS,Id), Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Distinct(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Sum(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Average(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Min(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Max(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("VarP(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("StdevP(Sort(DS,Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] // Set self modifying, Sort composed with Filter DS delegable DS, enhanced , non-del DS, enhanced , variable DS, enhanced - [InlineData("ForAll(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}])) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("ForAll(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("AddColumns(Sort(Filter(DS,1=1),Id), Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("AddColumns(Sort(Filter(DS,1=1),Id), Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Concat(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Distinct(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Sum(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Average(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Min(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Max(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("VarP(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("StdevP(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Concat(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Distinct(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Sum(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Average(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Min(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Max(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("VarP(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("StdevP(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] + [InlineData("ForAll(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}])) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("ForAll(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("AddColumns(Sort(Filter(DS,1=1),Id), Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("AddColumns(Sort(Filter(DS,1=1),Id), Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Concat(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Distinct(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Sum(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Average(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Min(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Max(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("VarP(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("StdevP(Sort(Filter(DS,1=1),Id), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " SelfMod", " SelfMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Concat(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Distinct(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Sum(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Average(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Min(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Max(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("VarP(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("StdevP(Sort(Filter(DS,1=1),Id), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] // Set self modifying, SortByColumns DS, non-delegable delegable DS, enhanced , non-del DS, enhanced , variable DS, enhanced - [InlineData("ForAll(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}])) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("ForAll(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("AddColumns(SortByColumns(DS,\"Id\"), Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("AddColumns(SortByColumns(DS,\"Id\"), Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Concat(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Distinct(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Sum(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Average(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Min(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Max(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("VarP(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("StdevP(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Concat(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Distinct(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Sum(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Average(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Min(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Max(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("VarP(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("StdevP(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] + [InlineData("ForAll(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}])) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("ForAll(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("AddColumns(SortByColumns(DS,\"Id\"), Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("AddColumns(SortByColumns(DS,\"Id\"), Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Concat(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Distinct(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Sum(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Average(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Min(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Max(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("VarP(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("StdevP(SortByColumns(DS,\"Id\"), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Concat(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Distinct(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Sum(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Average(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Min(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Max(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("VarP(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("StdevP(SortByColumns(DS,\"Id\"), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] // Set self modifying, FirstN DS, non delegable delegable DS, enhanced , non-del DS, enhanced , variable DS, enhanced - [InlineData("ForAll(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}])) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("ForAll(FirstN(DS,10), Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("AddColumns(FirstN(DS,10), Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("AddColumns(FirstN(DS,10), Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Concat(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Distinct(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Sum(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Average(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Min(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Max(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("VarP(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("StdevP(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Ok")] - [InlineData("Concat(FirstN(DS,10), Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Distinct(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Sum(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Average(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Min(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("Max(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("VarP(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] - [InlineData("StdevP(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Ok")] + [InlineData("ForAll(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}])) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("ForAll(FirstN(DS,10), Set(First(DS).Id, 3)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("AddColumns(FirstN(DS,10), Num, Set(DS, [{Id:1,Name:\"a\"}]); 2) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("AddColumns(FirstN(DS,10), Num, Set(First(DS).Id, 3); 2) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Concat(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Text(Id)) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Distinct(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Sum(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Average(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Min(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Max(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("VarP(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("StdevP(FirstN(DS,10), Set(DS, [{Id:1,Name:\"a\"}]); Id) ", " CantMod", " CantMod", " CantMod", " CantMod", " Ok", " Unordered")] + [InlineData("Concat(FirstN(DS,10), Set(First(DS).Id, 3); Text(Id)) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Distinct(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Sum(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Average(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Min(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("Max(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("VarP(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] + [InlineData("StdevP(FirstN(DS,10), Set(First(DS).Id, 3); Id) ", " Immutable", " Immutable", " Immutable", " Immutable", " Ok", " Unordered")] // Remove non self modifying delegable DS, enhanced , non-del DS, enhanced , variable DS, enhanced From 8b2bb303f2ad3e349d6eb594b046ad0dcae7947b Mon Sep 17 00:00:00 2001 From: Greg Lindhorst Date: Thu, 19 Mar 2026 18:53:48 -0700 Subject: [PATCH 2/2] update --- .../TexlTests.cs | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/tests/Microsoft.PowerFx.Core.Tests.Shared/TexlTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/TexlTests.cs index 35447fab30..342fef48f0 100644 --- a/src/tests/Microsoft.PowerFx.Core.Tests.Shared/TexlTests.cs +++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/TexlTests.cs @@ -4590,27 +4590,27 @@ public void TexlFunctionTypeSemanticsTable_PageableInputs(string script, string [InlineData("RenameColumns(DS, Name, Clear(DS); NewName ) ", " IdentName", " IdentName", " IdentName", " IdentName", " IdentName", " IdentName")] [InlineData("RenameColumns(DS, Clear(DS); Name, NewName ) ", " IdentName", " IdentName", " IdentName", " IdentName", " IdentName", " IdentName")] - // Untyped objects can be iterated only by ForAll dynamic DS - - [InlineData("ForAll(DynVar, Collect(TblVar, {Id:1})) ", " Ok")] - [InlineData("ForAll(DynVar, Clear(TblVar)) ", " Unordered")] - [InlineData("ForAll(DynVar, Collect(DynVar, {Id:1})) ", "InvalidArg")] - [InlineData("ForAll(DynVar, Clear(DynVar)) ", "BadTypeExp")] - - [InlineData("Filter(DynVar, Collect(TblVar, {Id:1}); 1=1) ", " BadType")] - [InlineData("LookUp(DynVar, Collect(TblVar, {Id:1}); 1=1) ", " BadType")] - [InlineData("CountIf(DynVar, Collect(TblVar, {Id:1}); 1=1) ", " BadType")] - [InlineData("AddColumns(DynVar, Num, Collect(TblVar, {Id:1}); 2) ", " BadType")] - [InlineData("Concat(DynVar, Collect(TblVar, {Id:1}); Text(Id)) ", " BadType")] - [InlineData("Distinct(DynVar, Collect(TblVar, {Id:1}); Id) ", " BadType")] - [InlineData("Sum(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped")] - [InlineData("Average(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped")] - [InlineData("Min(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped")] - [InlineData("Max(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped")] - [InlineData("VarP(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped")] - [InlineData("StdevP(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped")] - [InlineData("Search(DynVar, Clear(TblVar); \"b\", Name) ", " BadType")] - [InlineData("With(First(DynVar), Collect(TblVar, {Id:1})) ", " BadType")] + // Untyped objects can be iterated only by ForAll dynamic DS, enhanced + + [InlineData("ForAll(DynVar, Collect(TblVar, {Id:1})) ", " Ok", " Ok")] + [InlineData("ForAll(DynVar, Clear(TblVar)) ", " Unordered", " Unordered")] + [InlineData("ForAll(DynVar, Collect(DynVar, {Id:1})) ", "InvalidArg", "InvalidArg")] + [InlineData("ForAll(DynVar, Clear(DynVar)) ", "BadTypeExp", "BadTypeExp")] + + [InlineData("Filter(DynVar, Collect(TblVar, {Id:1}); 1=1) ", " BadType", " BadType")] + [InlineData("LookUp(DynVar, Collect(TblVar, {Id:1}); 1=1) ", " BadType", " BadType")] + [InlineData("CountIf(DynVar, Collect(TblVar, {Id:1}); 1=1) ", " BadType", " BadType")] + [InlineData("AddColumns(DynVar, Num, Collect(TblVar, {Id:1}); 2) ", " BadType", " BadType")] + [InlineData("Concat(DynVar, Collect(TblVar, {Id:1}); Text(Id)) ", " BadType", " BadType")] + [InlineData("Distinct(DynVar, Collect(TblVar, {Id:1}); Id) ", " BadType", " BadType")] + [InlineData("Sum(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("Average(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("Min(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("Max(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("VarP(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("StdevP(DynVar, Collect(TblVar, {Id:1}); Id) ", " NoUntyped", " NoUntyped")] + [InlineData("Search(DynVar, Clear(TblVar); \"b\", Name) ", " BadType", " BadType")] + [InlineData("With(First(DynVar), Collect(TblVar, {Id:1})) ", " BadType", " BadType")] // non self modifying delegable DS, enhanced , non-del DS, enhanced , variable DS, enhanced