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()))