Commit Graph

251 Commits

Author SHA1 Message Date
pvbouwel
e6b51a28ee Enable AST Validation
This commit puts AST validation on the execution path. This means updates get
validated prior to being executed. There were quite a few tests that were not
working against Amazon DDB. These tests I considered broken and as such this
commit adapts them such that they pass against Amazon DDB.

test_update_item_on_map()
=> One of the SET actions would try to set a nested element by specifying the nesting on the path
   rather than by putting a map as a value for a non-existent key. This got changed.

test_item_size_is_under_400KB
=> Used the keyword "item" which DDB doesn't like. Change to cont in order to keep the same sizings.
=> Secondly the size error messages differs a bit depending whether it is part of the update or part
   of a put_item. For an update it should be:
   Item size to update has exceeded the maximum allowed size
   otherwise it is
   Item size has exceeded the maximum allowed size'

test_remove_top_level_attribute
=> Used a keyword item.  Use ExpressionAttributeNames

test_update_item_double_nested_remove
=> Used keywords name & first. Migrated to non-deprecated API and use ExpressionAttributeNames

test_update_item_set &
test_boto3_update_item_conditions_pass &
test_boto3_update_item_conditions_pass_because_expect_not_exists &
test_boto3_update_item_conditions_pass_because_expect_not_exists_by_compare_to_null &
test_boto3_update_item_conditions_pass_because_expect_exists_by_compare_to_not_null &
test_boto3_update_item_conditions_fail &
test_boto3_update_item_conditions_fail_because_expect_not_exists &
test_boto3_update_item_conditions_fail_because_expect_not_exists_by_compare_to_null
=> Were broken tests which had string literal instead of value placeholder
2020-04-19 16:58:46 +01:00
pvbouwel
fc4d88401d Improve DDB expressions support3: AST Validation
Part of structured approach for UpdateExpressions:
 1) Expression gets parsed into a tokenlist (tokenized)
 2) Tokenlist get transformed to expression tree (AST)
 3) The AST gets validated (full semantic correctness) -> this commit
 4) AST gets processed to perform the update

This commit uses the AST to perform validation.  Validation makes sure the
nodes encounterd have valid values and they will also resolve values for
references that refer to item state or values passed into the expression.
2020-04-19 16:58:07 +01:00
pvbouwel
9ed613e197 Better DDB expressions support2: ExpressionTree
Part of structured approach for UpdateExpressions:
 1) Expression gets parsed into a tokenlist (tokenized)
 2) Tokenlist get transformed to expression tree (AST) -> This commit
 3) The AST gets validated (full semantic correctness)
 4) AST gets processed to perform the update

This commit uses the tokenlist to build an expression tree. This tree is not
yet used. Still it allows to raise additional Validation Exceptions which
previously were missed silently therefore it allows tests to catch these type of
ValidationException. For that reason DDB UpdateExpressions will be parsed
already. It also makes sure we won't break existing tests.

One of the existing tests had to be changed in order to still pass:
 - test_dynamodb_table_with_range_key.test_update_item_with_expression

This test passed in a numeric literal which is not supported by DynamoDB
and with the current tokenization it would get the same error as in AWS
DynamoDB.
2020-04-18 09:19:03 +01:00
pvbouwel
7ea419dd54 Better DDB expressions support1: TokenizationDDB
Currently the mock for DynamoDB has adhoc code to implement
its updateExpression functionality.  This series will
transform the logic such that Update Expressions are processed
as follows:
 1) Expression gets parsed into a tokenlist (tokenized) -> This commit
 2) Tokenlist get transformed to expression tree (AST)
 3) The AST gets validated (full semantic correctness)
 4) AST gets processed to perform the update

This alows for a more realistic mocking. It will throw exceptions much
more aggressively avoiding situations where a test passes against the
mock but fails with an exception when running against AWS.

Introduction of step 3 also allows to have the update expression as an
atomic unit of work. So updates at the start of the expression cannot
be performed if there is an error further down the expression.

This specific commit will tokenize expressions but the tokenlist is not
yet used. It is purely to keep clear boundaries.  It does do a minor
refactoring of the exceptions to allow more re-use and to ease testing.

This series of changes is to aid providing a long-term solution for
https://github.com/spulec/moto/issues/2806.
2020-04-18 09:16:23 +01:00
Bert Blommers
870b34ba76 Spacing 2020-04-16 07:09:50 +01:00
Bert Blommers
47d80621f9 Merge branch 'master' into feature/dynamodb_item_limit 2020-04-16 07:07:59 +01:00
Bert Blommers
a6902e8713
Update tests/test_dynamodb2/test_dynamodb.py
Co-Authored-By: Guilherme Martins Crocetti <gmcrocetti@gmail.com>
2020-04-15 07:26:09 +01:00
Bert Blommers
c2b4c397f2 DDB test - Fix KeySchema, and set BillingMode for easier online testing 2020-04-14 07:53:15 +01:00
Bert Blommers
54f51fc7c1 DynamoDB - TransactWriteItems implementation 2020-04-08 10:49:58 +01:00
Andrea Amorosi
349b381390 Fixed dynamodb2 put_item ValidationException 2020-03-28 17:59:42 +00:00
Bert Blommers
e82e1e3f39 DynamoDB - Add 1MB item size check 2020-03-21 12:20:09 +00:00
Bert Blommers
b1da99aeda #2797 - DynamoDB - Allow case insensitive AND in KeyConditionExpression 2020-03-20 12:29:04 +00:00
Steve Pulec
14b2811157
Merge pull request #2819 from bblommers/dynamodb_global_index_ordering
Dynamodb - Global index ordering
2020-03-19 19:39:09 -05:00
Steve Pulec
78f5541953
Merge pull request #2817 from bblommers/dynamodb_add_index_status
DynamoDB - Add status to Global Indexes
2020-03-19 19:37:49 -05:00
Bert Blommers
71bf314a0f
Merge pull request #2799 from ImFlog/fix_dynamodb_updated_new
Fix UPDATED_NEW return values differences
2020-03-18 08:21:01 +00:00
Bert Blommers
aead80c392
Add missing region 2020-03-17 17:11:35 +00:00
Bert Blommers
67c7fce85e #2760 - DynamoDB - Ensure proper ordering for Numeric sort keys 2020-03-17 16:28:49 +00:00
Bert Blommers
b7da6b9481 #2813 - DynamoDB - Add Global Index Status 2020-03-17 15:41:50 +00:00
Steve Pulec
77b1cc2321
Merge pull request #2809 from bblommers/feature/dynamodb-transact-get-items
Feature - DynamoDB: transact_get_items
2020-03-15 16:45:03 -05:00
ImFlog
7f6c6660aa Add some new update_new tests 2020-03-13 09:37:50 +01:00
Bert Blommers
71d3941daf Linting 2020-03-12 14:26:23 +00:00
Bert Blommers
caebe222d7 DynamoDB - Transact_get_items - Remove error condition 2020-03-12 14:24:53 +00:00
Tomoya Iwata
b74625db0c add support for dynamodb transact_get_items 2020-03-12 14:15:13 +00:00
ImFlog
ba1bf09474 Fix UPDATED_NEW return values differences between moto and dynamoDB 2020-03-10 18:22:54 +01:00
Bert Blommers
315ac32f09
Add region to test case 2020-03-10 14:28:12 +00:00
Bert Blommers
6ba00d9ad1 #1054 - DynamoDB - Improve error handling for put_item without keys 2020-03-10 13:25:40 +00:00
heyder.dias
f5080e539d fix lint check 2020-03-05 18:39:20 -03:00
heyder.dias
fa7f83bc2f add test to nested if_not_exists and property already exists 2020-03-05 17:05:00 -03:00
Bert Blommers
2bd93a76fc Add region to DDB tests 2020-02-09 11:58:41 +00:00
Bert Blommers
936d686392 #2580 - DynamoDB update_item: Allow list_append and if_not_exists-functions in one expression 2020-02-09 11:47:02 +00:00
Nikita Antonenkov
d4caf14b61 Fixed UnboundLocalError in dynamodb2.query when no filters are passed 2020-02-07 23:39:31 +01:00
Steve Pulec
663d7c289b
Merge pull request #2675 from bblommers/bugfix/#2674
DynamoDB - ListAppend should also work when adding maps to a list
2020-01-22 20:01:53 -06:00
Bert Blommers
7ff7ee4e8e Test fix - Region must be specified 2020-01-22 11:42:06 +00:00
Bert Blommers
6f02782624 #2627 - Change comparison to differentiate between 0 and None 2020-01-22 11:30:17 +00:00
Bert Blommers
8c920cce10 Specify region in tests 2020-01-12 12:20:55 +00:00
Bert Blommers
9ce1ee49d7 #2626 - DynamoDB - FilterExpression should ignore items with non-existent attribute 2020-01-12 12:05:08 +00:00
Bert Blommers
5f59cb7fb0 #2674 - ListAppend should also work when adding maps to a list 2020-01-06 08:16:09 +00:00
Asher Foa
7d4c15d53e skip part of the test in server mode. 2019-12-24 11:01:54 -08:00
Asher Foa
299e7851d6 Add assertions. 2019-12-24 10:23:46 -08:00
Asher Foa
5bd3827b26 run black 2019-12-20 18:55:58 -08:00
Asher Foa
a6f14eee3f Add test to repo stream issue 2019-12-20 18:55:58 -08:00
Ilya Shmygol
704a12146b Improve error reporting for missing index 2019-12-12 10:49:07 +01:00
Ilya Shmygol
3a42079ec7 Merge remote master 2019-12-11 16:17:21 +01:00
Ilya Shmygol
be5986c0b5 Test query by non exists index 2019-12-11 15:08:45 +01:00
Mike Grima
4d5bf1c5c6
Merge pull request #2605 from bblommers/dynamodb_add_nested_stringsets
Dynamodb - DELETE/ADD item from/to nested sets
2019-12-09 14:14:56 -08:00
Bert Blommers
e41bc9fc58 DynamoDB - DELETE item from nested sets 2019-11-28 13:22:20 +00:00
Bert Blommers
6d7ad717df DynamoDB - ADD item to nested sets 2019-11-27 12:36:42 +00:00
Bert Blommers
21a1d4d604 DynamoDB - list_append operation can be made in a nested map 2019-11-25 15:19:22 +00:00
Steve Pulec
72da9e96c2 Lint. 2019-11-21 17:53:58 -05:00
Mike Grima
bd777cad44 Fix for moto not unmocking.
- Fixes #2575
- Also upgraded Travis CI to make use of Bionic instead of Xenial
- This may also address concerns raised in #1793
2019-11-18 15:28:31 -08:00
Bert Blommers
993819bd41 #2562 - DynamoDB - allow updates to be of a different type 2019-11-15 15:54:21 +00:00
Bert Blommers
eaa23800bd Linting 2019-11-03 07:33:27 -08:00
Bert Blommers
5876dc0186 Fix test - List order does not matter for projectionexpression 2019-11-03 07:14:19 -08:00
Bert Blommers
6a601d7d5c #2527 - DynamoDB - Allow nested attributes in ProjectionExpressions 2019-11-03 14:09:27 +00:00
Asher Foa
96e5b1993d Run black on moto & test directories. 2019-10-31 10:36:05 -07:00
Bert Blommers
997177e43e #847 - Fix tests to be compatible with python3 2019-10-23 02:26:26 -07:00
Bert Blommers
730c4be1a3 #847 - DynamoDB - Implement list_append feature when updating 2019-10-23 09:12:03 +01:00
Bert Blommers
64cf1fc2c9 Refactor DynamoDB update expressions (#2497)
* Refactor DynamoDB.update to use recursive method for nested updates

* Simplify DynamoDB.update_item logic
2019-10-22 12:40:41 -07:00
Bert Blommers
db206e994b #250 - DynamoDB - Add check for valid query keyconditionexpression 2019-10-18 09:58:09 +01:00
Bert Blommers
009a97db85 Merge branch 'master' into bugfix/1823 2019-10-14 10:02:22 +01:00
Bert Blommers
106692ed88 #1823 - Add support to delete items from a nested list 2019-10-14 09:59:52 +01:00
Mike Grima
893f0d4f83
Merge pull request #2463 from gruebel/fix-dynamodb-get-item-ProjectionExpression
Add ProjectionExpression & ExpressionAttributeNames to DynamoDB get_it…
2019-10-13 10:47:25 -07:00
gruebel
97c4174f30 Extract projection_expression adjustment 2019-10-11 14:30:25 +02:00
Steve Pulec
34d4379b9f
Merge branch 'master' into bugfix/2384 2019-10-10 17:02:59 -05:00
Bert Blommers
cf899eecff #2384 - Add test case 2019-10-10 09:33:11 +01:00
Bert Blommers
afb8f71e9f #1822 - DynamoDB: Add List index operations 2019-10-09 17:30:42 +01:00
Bert Blommers
e759b565da #1874 - Change tests to use resource/client when appropriate 2019-10-09 10:02:40 +01:00
Bert Blommers
1fb844972f Merge branch 'master' into bugfix/1874 2019-10-09 08:33:53 +01:00
gruebel
cb43796daf Add ProjectionExpression & ExpressionAttributeNames o DynamoDB get_item & batch_get_item 2019-10-08 22:30:14 +02:00
Bert Blommers
c9348bc45c #1874 - Add tests for more complex items 2019-10-08 15:51:46 +01:00
gruebel
c9d69681ec Add evaluation of ConditionExpression to DynamoDB2 delete_item 2019-10-06 16:49:02 +02:00
Bert Blommers
dc89b47b40 #1874 - Count item size based on contents of actual dictionary 2019-10-06 14:08:58 +01:00
Bert Blommers
4dec187d80 #1834 - Check item size in DynamoDB 2019-10-05 15:20:43 +01:00
Bert Blommers
d86dcb2ee9
Merge pull request #4 from ZoidBB/master
Initial work by ZoidBB
2019-10-05 10:18:17 +01:00
Mike Grima
60183b29c1
Merge pull request #2447 from bblommers/bugfix/2445
#2445 - DynamoDB - Add validation for AttributeDefinitions
2019-10-03 11:52:29 -07:00
Bert Blommers
c783b8721f #2445 - DynamoDB - Fix tests after adding AttributeDefinitions-validation 2019-10-03 11:57:14 +01:00
Bert Blommers
6005b19ac2 #2445 - DynamoDB - Add validation for AttributeDefinitions 2019-10-03 10:54:10 +01:00
Steve Pulec
cbe1ff1974
Merge pull request #2422 from kiyonori-matsumoto/dynamodb-and-order
fix: raises ValueError on conditional and operator
2019-09-23 21:35:08 -05:00
Kiyonori Matsumoto
7ee35a8510 fix: raises ValueError on conditional and operator
if lhs evaluates to false, rhs must be ignored, but rhs was evaluated then ValueError is occurred.
2019-09-16 23:33:52 +09:00
Julian Graham
f4df7a48ee Prevent overlapping expr name prefixes from corrupting projection expr
h/t @beheh. This patch handles the case when ProjectionExpression looks
like "#1, ..., #10" - the previous code used `replace`, which would make
the resulting projection into "foo, ..., foo0".
2019-09-09 19:08:16 -04:00
Bert Blommers
956592d615 2380 - Validate parameter-list for duplicates in dynamodb.batch_get_item 2019-08-22 16:12:48 +01:00
PND
a2aefc49b4 Fixed update_item of DynamoDB to deal with the list type. 2019-07-22 01:42:20 +09:00
Garrett Heel
0093a7992f dynamodb2: Defer evaluation of the OR RHS in condition expr 2019-07-11 08:29:07 -04:00
Steve Pulec
6a13d54616
Merge pull request #2266 from garrettheel/feat/dynamodb-expressions
Improve DynamoDB condition expression support
2019-07-09 18:22:55 -05:00
IVIURRAY
4ce0e6bbcb add extra test for ProjectionExpression using scan with ExpressionAttributes 2019-06-27 19:37:46 +01:00
IVIURRAY
949637a14c remove debug 2019-06-27 19:12:53 +01:00
IVIURRAY
b60097fab2 improve test case 2019-06-27 19:08:32 +01:00
Garrett Heel
467f669c1e add test for attr doesn't exist 2019-06-27 11:49:08 -04:00
Matthew Stevens
83082df4d9 Adding update_item and attribute_not_exists test 2019-06-26 23:22:07 +01:00
Matthew Stevens
8a90971ba1 Adding test cases for #1587 2019-06-26 23:20:55 +01:00
Matthew Stevens
6fd47f843f Test case for #1819 2019-06-26 23:20:55 +01:00
Matthew Stevens
57b668c832 Using Ops for dynamodb condition expressions 2019-06-26 23:20:55 +01:00
Matthew Stevens
1a2fc66f84 Adding dynamodb2 expression parser and fixing test cases 2019-06-26 23:20:16 +01:00
IVIURRAY
e50ce7287d ProjectionExpression works with table.scan() 2019-06-26 21:54:48 +01:00
Ber Zoidberg
6717cba286 test name fix 2019-06-12 08:12:15 -07:00
Ber Zoidberg
997556f7bb improve test coverage 2019-06-12 08:06:37 -07:00
Ber Zoidberg
26ae13b715 Fix copypasta error in comment 2019-06-11 22:41:56 -07:00
Ber Zoidberg
96c2506fd4 Fix DynamoDB UpdateExpression support for REMOVE on nested maps 2019-06-11 22:38:15 -07:00
Ber Zoidberg
1088c421d2 #2212 add support for delete on update_with_attribute_updates (#2213)
* add support for delete on update_with_attribute_updates
2019-05-22 10:47:02 +01:00
cm-iwata
9bf8fd3417 fix #2011 (#2012)
add support for Scan method using LSI or GSI
2019-05-21 17:45:30 +01:00