From e4dc11d022fd0bfe3b03fa0e40b3baeb51dd7afb Mon Sep 17 00:00:00 2001 From: Zoe Wang <33073555+zoewangg@users.noreply.github.com> Date: Fri, 31 Oct 2025 15:53:04 -0700 Subject: [PATCH] The DynamoDB Enhanced Client now correctly handles version attribute names containing special characters (hyphens, dots, colons, etc.) when using optimistic locking. Previously, these would fail with an ExpressionAttributeValues contains invalid key error. --- .../next-release/bugfix-DynamoDBEnhancedClient-2a54d62.json | 6 ++++++ .../dynamodb/extensions/VersionedRecordExtension.java | 4 +++- .../VersionedRecordWithSpecialCharactersTest.java | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 .changes/next-release/bugfix-DynamoDBEnhancedClient-2a54d62.json diff --git a/.changes/next-release/bugfix-DynamoDBEnhancedClient-2a54d62.json b/.changes/next-release/bugfix-DynamoDBEnhancedClient-2a54d62.json new file mode 100644 index 000000000000..681a7407f5c8 --- /dev/null +++ b/.changes/next-release/bugfix-DynamoDBEnhancedClient-2a54d62.json @@ -0,0 +1,6 @@ +{ + "type": "bugfix", + "category": "DynamoDB Enhanced Client", + "contributor": "", + "description": "The DynamoDB Enhanced Client now properly sanitizes version attribute names when building conditional expressions for optimistic locking. Version attributes with special characters in their names will now work correctly. See [#3279](https://github.com/aws/aws-sdk-java-v2/issues/3279)" +} diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/VersionedRecordExtension.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/VersionedRecordExtension.java index b603fe03faa7..5f5cdb02c354 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/VersionedRecordExtension.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/VersionedRecordExtension.java @@ -15,6 +15,7 @@ package software.amazon.awssdk.enhanced.dynamodb.extensions; +import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.cleanAttributeName; import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.isNullAttributeValue; import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.keyRef; @@ -58,7 +59,8 @@ @SdkPublicApi @ThreadSafe public final class VersionedRecordExtension implements DynamoDbEnhancedClientExtension { - private static final Function VERSIONED_RECORD_EXPRESSION_VALUE_KEY_MAPPER = key -> ":old_" + key + "_value"; + private static final Function VERSIONED_RECORD_EXPRESSION_VALUE_KEY_MAPPER = + key -> ":old_" + cleanAttributeName(key) + "_value"; private static final String CUSTOM_METADATA_KEY = "VersionedRecordExtension:VersionAttribute"; private static final VersionAttribute VERSION_ATTRIBUTE = new VersionAttribute(); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/functionaltests/VersionedRecordWithSpecialCharactersTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/functionaltests/VersionedRecordWithSpecialCharactersTest.java index 39d377007197..83f4cec02e62 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/functionaltests/VersionedRecordWithSpecialCharactersTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/functionaltests/VersionedRecordWithSpecialCharactersTest.java @@ -97,7 +97,7 @@ public int hashCode() { .addAttribute(String.class, a -> a.name("_attribute") .getter(Record::get_attribute) .setter(Record::set_attribute)) - .addAttribute(Integer.class, a -> a.name("_version") + .addAttribute(Integer.class, a -> a.name("_my-:.version") .getter(Record::get_version) .setter(Record::set_version) .tags(versionAttribute()))