diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteResource.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteResource.java index 699ec60958b..91421978da4 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteResource.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteResource.java @@ -30,7 +30,7 @@ public interface IgniteResource { @Resources.BaseMessage("Illegal alias. {0} is reserved name") Resources.ExInst illegalAlias(String a0); - @Resources.BaseMessage("Cannot update field \"{0}\". You cannot update key, key fields or val field in case the val is a complex type") + @Resources.BaseMessage("Cannot update field \"{0}\". Primary key columns are not modifiable") Resources.ExInst cannotUpdateField(String field); @Resources.BaseMessage("Illegal aggregate function. {0} is unsupported at the moment") diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java index 1c3bb530f25..47b1d555170 100644 --- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java +++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java @@ -223,6 +223,36 @@ private static Stream basicStatements() { ); } + /** + * Tests that primary key columns are not modifiable. + */ + @ParameterizedTest + @MethodSource("updatePrimaryKey") + public void testDoNotAllowToModifyPrimaryKeyColumns(String query) { + TestTable test = TestBuilders.table() + .name("TEST") + .addKeyColumn("ID", NativeTypes.INT32) + .addColumn("VAL", NativeTypes.INT32) + .distribution(IgniteDistributions.single()) + .build(); + + IgniteSchema schema = createSchema(test); + + IgniteTestUtils.assertThrowsWithCause( + () -> physicalPlan(query, schema), + SqlValidatorException.class, + "Primary key columns are not modifiable" + ); + } + + private static Stream updatePrimaryKey() { + return Stream.of( + "UPDATE TEST SET ID = ID + 1", + "MERGE INTO test DST USING test SRC ON DST.VAL = SRC.VAL" + + " WHEN MATCHED THEN UPDATE SET ID = SRC.ID + 1" + ); + } + // Class name is fully-qualified because AbstractPlannerTest defines a class with the same name. private static TestTable newTestTable(String tableName, IgniteDistribution distribution) { return TestBuilders.table()