From f424c6ac05673830925ec0e77a7972e54d4b275a Mon Sep 17 00:00:00 2001 From: Cole Peters Date: Wed, 5 Apr 2023 09:30:19 -0500 Subject: [PATCH] DynamoDB:query() KeyConditionExpression now allows enclosing the sort key condition in brackets (#6178) --- .../parsing/key_condition_expression.py | 4 +++- .../test_key_condition_expression_parser.py | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/moto/dynamodb/parsing/key_condition_expression.py b/moto/dynamodb/parsing/key_condition_expression.py index 3e8a9c10c..1ecd15fce 100644 --- a/moto/dynamodb/parsing/key_condition_expression.py +++ b/moto/dynamodb/parsing/key_condition_expression.py @@ -160,8 +160,10 @@ def parse_expression( if crnt_char == "(": # hashkey = :id and begins_with( sortkey, :sk) # ^ --> ^ + # (hash_key = :id) and (sortkey = :sk) + # ^ if current_stage in [EXPRESSION_STAGES.INITIAL_STAGE]: - if current_phrase != "begins_with": + if current_phrase not in ["begins_with", ""]: raise MockValidationException( f"Invalid KeyConditionExpression: Invalid function name; function: {current_phrase}" ) diff --git a/tests/test_dynamodb/models/test_key_condition_expression_parser.py b/tests/test_dynamodb/models/test_key_condition_expression_parser.py index 0c924ebf9..2ceb2a5d9 100644 --- a/tests/test_dynamodb/models/test_key_condition_expression_parser.py +++ b/tests/test_dynamodb/models/test_key_condition_expression_parser.py @@ -179,6 +179,24 @@ class TestHashAndRangeKey: ) desired_hash_key.should.equal("pk") + @pytest.mark.parametrize( + "expr", + [ + "(job_id = :id) and start_date = :sk", + "job_id = :id and (start_date = :sk)", + "(job_id = :id) and (start_date = :sk)", + ], + ) + def test_brackets(self, expr): + eav = {":id": "pk", ":sk1": "19", ":sk2": "21"} + desired_hash_key, comparison, range_values = parse_expression( + expression_attribute_values=eav, + key_condition_expression=expr, + schema=self.schema, + expression_attribute_names=dict(), + ) + desired_hash_key.should.equal("pk") + class TestNamesAndValues: schema = [{"AttributeName": "job_id", "KeyType": "HASH"}]