Skip to content

Commit

Permalink
DDB-Enhanced: Bug fix for handling special characters '#' and ':' in …
Browse files Browse the repository at this point in the history
…attribute names
bmaizels committed May 1, 2020

Verified

This commit was signed with the committer’s verified signature.
a1994sc Allen Conlon
1 parent c798ab4 commit 40927e7
Showing 4 changed files with 26 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "bugfix",
"category": "Amazon DynamoDB Enhanced Client",
"description": "Bugfix for handling special characters ':' and '#' in attribute names"
}
Original file line number Diff line number Diff line change
@@ -50,7 +50,11 @@ public static String cleanAttributeName(String key) {
char[] chars = key.toCharArray();

for (int i = 0; i < chars.length; ++i) {
if (chars[i] == '*' || chars[i] == '.' || chars[i] == '-') {
if (chars[i] == '*'
|| chars[i] == '.'
|| chars[i] == '-'
|| chars[i] == '#'
|| chars[i] == ':') {
chars[i] = '_';
somethingChanged = true;
}
Original file line number Diff line number Diff line change
@@ -45,6 +45,8 @@
import software.amazon.awssdk.services.dynamodb.model.ProjectionType;

public class BasicCrudTest extends LocalDynamoDbSyncTestBase {
private static final String ATTRIBUTE_NAME_WITH_SPECIAL_CHARACTERS = "a*t:t.r-i#bute3";

private static class Record {
private String id;
private String sort;
@@ -181,7 +183,7 @@ public int hashCode() {
.getter(Record::getAttribute2)
.setter(Record::setAttribute2)
.tags(secondaryPartitionKey("gsi_1")))
.addAttribute(String.class, a -> a.name("attribute3")
.addAttribute(String.class, a -> a.name(ATTRIBUTE_NAME_WITH_SPECIAL_CHARACTERS)
.getter(Record::getAttribute3)
.setter(Record::setAttribute3)
.tags(secondarySortKey("gsi_1")))
@@ -350,7 +352,7 @@ public void putWithConditionThatSucceeds() {
Expression conditionExpression = Expression.builder()
.expression("#key = :value OR #key1 = :value1")
.putExpressionName("#key", "attribute")
.putExpressionName("#key1", "attribute3")
.putExpressionName("#key1", ATTRIBUTE_NAME_WITH_SPECIAL_CHARACTERS)
.putExpressionValue(":value", stringValue("wrong"))
.putExpressionValue(":value1", stringValue("three"))
.build();
@@ -378,7 +380,7 @@ public void putWithConditionThatFails() {
Expression conditionExpression = Expression.builder()
.expression("#key = :value OR #key1 = :value1")
.putExpressionName("#key", "attribute")
.putExpressionName("#key1", "attribute3")
.putExpressionName("#key1", ATTRIBUTE_NAME_WITH_SPECIAL_CHARACTERS)
.putExpressionValue(":value", stringValue("wrong"))
.putExpressionValue(":value1", stringValue("wrong"))
.build();
@@ -409,7 +411,7 @@ public void deleteWithConditionThatSucceeds() {
Expression conditionExpression = Expression.builder()
.expression("#key = :value OR #key1 = :value1")
.putExpressionName("#key", "attribute")
.putExpressionName("#key1", "attribute3")
.putExpressionName("#key1", ATTRIBUTE_NAME_WITH_SPECIAL_CHARACTERS)
.putExpressionValue(":value", stringValue("wrong"))
.putExpressionValue(":value1", stringValue("three"))
.build();
@@ -435,7 +437,7 @@ public void deleteWithConditionThatFails() {
Expression conditionExpression = Expression.builder()
.expression("#key = :value OR #key1 = :value1")
.putExpressionName("#key", "attribute")
.putExpressionName("#key1", "attribute3")
.putExpressionName("#key1", ATTRIBUTE_NAME_WITH_SPECIAL_CHARACTERS)
.putExpressionValue(":value", stringValue("wrong"))
.putExpressionValue(":value1", stringValue("wrong"))
.build();
@@ -598,7 +600,7 @@ public void updateWithConditionThatSucceeds() {
Expression conditionExpression = Expression.builder()
.expression("#key = :value OR #key1 = :value1")
.putExpressionName("#key", "attribute")
.putExpressionName("#key1", "attribute3")
.putExpressionName("#key1", ATTRIBUTE_NAME_WITH_SPECIAL_CHARACTERS)
.putExpressionValue(":value", stringValue("wrong"))
.putExpressionValue(":value1", stringValue("three"))
.build();
@@ -627,7 +629,7 @@ public void updateWithConditionThatFails() {
Expression conditionExpression = Expression.builder()
.expression("#key = :value OR #key1 = :value1")
.putExpressionName("#key", "attribute")
.putExpressionName("#key1", "attribute3")
.putExpressionName("#key1", ATTRIBUTE_NAME_WITH_SPECIAL_CHARACTERS)
.putExpressionValue(":value", stringValue("wrong"))
.putExpressionValue(":value1", stringValue("wrong"))
.build();
Original file line number Diff line number Diff line change
@@ -57,4 +57,11 @@ public void createKeyFromMap_partitionAndSort() {
assertThat(key.partitionKeyValue()).isEqualTo(PARTITION_VALUE);
assertThat(key.sortKeyValue()).isEqualTo(Optional.of(SORT_VALUE));
}

@Test
public void cleanAttributeName_cleansSpecialCharacters() {
String result = EnhancedClientUtils.cleanAttributeName("a*b.c-d:e#f");

assertThat(result).isEqualTo("a_b_c_d_e_f");
}
}

0 comments on commit 40927e7

Please sign in to comment.