polardbxengine/mysql-test/suite/x/t/galaxy_crud_update_doc.test

382 lines
16 KiB
Plaintext

## Test document updates
--source include/xplugin_preamble.inc
--source include/xplugin_create_user.inc
## Test starts here
--let $xtest_file= $MYSQL_TMP_DIR/update_doc.tmp
--write_file $xtest_file
-->quiet
-->varlet %LITERAL% type: LITERAL literal
-->varlet %V_OCTETS% type: V_OCTETS v_octets
-->macro Insert %SCHEMA% %NAME% %ROW%
Mysqlx.Crud.Insert {
data_model: DOCUMENT
collection { name: '%NAME%' schema: '%SCHEMA%'}
row { field { %LITERAL% { %V_OCTETS% { value:'%ROW%' } } } }
}
-->recvresult be-quiet
-->endmacro
-->macro Setup %SCHEMA% %NAME% %ROW%
-->stmtadmin ensure_collection {"schema":"%SCHEMA%", "name":"%NAME%"}
-->recvresult be-quiet
-->stmtsql TRUNCATE `%SCHEMA%`.`%NAME%`
-->recvresult be-quiet
-->callmacro Insert %SCHEMA% %NAME% %ROW%
-->endmacro
-->macro Show %SCHEMA% %NAME%
Mysqlx.Crud.Find {
collection { name: "%NAME%" schema: "%SCHEMA%" }
data_model: DOCUMENT
}
-->recvresult
-->endmacro
-->macro Assert %SCHEMA% %NAME% %EXPECT%
Mysqlx.Crud.Find {
collection { name: "%NAME%" schema: "%SCHEMA%" }
data_model: DOCUMENT
}
-->recvtovar %RESULT% doc
-->varlet %QUOTED% %EXPECT%
-->assert_eq %QUOTED% %RESULT%
-->endmacro
-->macro Update_base %SCHEMA% %NAME% %CRITERIA% %CRITERIA_VALUE% %OPERATIONS% %ERROR%
Mysqlx.Crud.Update {
collection { schema: '%SCHEMA%' name: '%NAME%' }
data_model: DOCUMENT
criteria {
type: OPERATOR operator {
name: '%CRITERIA%'
param { type: IDENT identifier { name: '_id' } }
param { %LITERAL% { %V_OCTETS% { value: '%CRITERIA_VALUE%' } } }
}
}
%OPERATIONS%
}
-->expecterror %ERROR%
-->recvresult
-->endmacro
-->macro Update %SCHEMA% %NAME% %CRITERIA% %CRITERIA_VALUE% %OPERATION% %TARGET% %VALUE% %ERROR%
-->callmacro Update_base %SCHEMA% %NAME% %CRITERIA% %CRITERIA_VALUE% operation{operation:%OPERATION% source{%TARGET%} value{%VALUE%}} %ERROR%
-->endmacro
-->macro Update_two %SCHEMA% %NAME% %CRITERIA% %CRITERIA_VALUE% %OPERATION1% %TARGET1% %VALUE1% %OPERATION2% %TARGET2% %VALUE2% %ERROR%
-->callmacro Update_base %SCHEMA% %NAME% %CRITERIA% %CRITERIA_VALUE% operation{operation:%OPERATION1% source{%TARGET1%} value{%VALUE1%}} operation{operation:%OPERATION2% source{%TARGET2%} value{%VALUE2%}} %ERROR%
-->endmacro
-->macro Update_no_value %SCHEMA% %NAME% %CRITERIA% %CRITERIA_VALUE% %OPERATION% %TARGET% %ERROR%
-->callmacro Update_base %SCHEMA% %NAME% %CRITERIA% %CRITERIA_VALUE% operation{operation:%OPERATION% source{%TARGET%}} %ERROR%
-->endmacro
-->macro Update_two_no_value %SCHEMA% %NAME% %CRITERIA% %CRITERIA_VALUE% %OPERATION1% %TARGET1% %VALUE1% %OPERATION2% %TARGET2% %ERROR%
-->callmacro Update_base %SCHEMA% %NAME% %CRITERIA% %CRITERIA_VALUE% operation{operation:%OPERATION1% source{%TARGET1%} value{%VALUE1%}} operation{operation:%OPERATION2% source{%TARGET2%}} %ERROR%
-->endmacro
-->varlet %MEMBER_NAME% document_path { type: MEMBER value: 'name' }
-->varlet %LEMON% %LITERAL% { %V_OCTETS% { value: 'lemon' } }
-->title =Update by ARRAY_APPEND
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ARRAY_APPEND %MEMBER_NAME% %LEMON% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "name": ["banana", "lemon"], "price": 1.2}
-->varlet %MEMBER_ORIGIN% document_path { type: MEMBER value: 'origin' }
-->varlet %MEMBER_ORIGIN_1% %MEMBER_ORIGIN% document_path { type: ARRAY_INDEX index: 1 }
-->varlet %BRAZIL% %LITERAL% { %V_OCTETS% { value: 'brazil' } }
-->title =Update by ARRAY_INSERT
-->callmacro Setup xtest coll {"_id": "5", "name": "mango", "price": 0.90, "origin":["mexico", "philippines"]}
-->callmacro Update xtest coll == 5 ARRAY_INSERT %MEMBER_ORIGIN_1% %BRAZIL% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "5", "name": "mango", "price": 0.9, "origin": ["mexico", "brazil", "philippines"]}
-->title =Update by ARRAY_INSERT (invalid path)
-->callmacro Setup xtest coll {"_id": "5", "name": "mango", "price": 0.90, "origin":["mexico", "philippines"]}
-->callmacro Update xtest coll == 5 ARRAY_INSERT %MEMBER_ORIGIN% %BRAZIL% ER_INVALID_JSON_PATH_ARRAY_CELL
-->callmacro Assert xtest coll {"_id": "5", "name": "mango", "price": 0.9, "origin": ["mexico", "philippines"]}
-->title =Update by ITEM_REPLACE
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_REPLACE %MEMBER_NAME% %LEMON% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "name": "lemon", "price": 1.2}
-->varlet %MEMBER_LOCATION% document_path { type: MEMBER value: 'location' }
-->varlet %PINEAPPLE% %LITERAL% { %V_OCTETS% { value: 'pineapple' } }
-->title =Update by ITEM_REPLACE non-existing member
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_REPLACE %MEMBER_LOCATION% %PINEAPPLE% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->varlet %NULL% %LITERAL% { type: V_NULL }
-->title =ITEM_SET to NULL
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_SET %MEMBER_NAME% %NULL% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "name": null, "price": 1.2}
-->varlet %MEMBER_PRICE% document_path { type: MEMBER value: 'price' }
-->varlet %LEMON_FOR_FREE% %LITERAL% { %V_OCTETS% { value: 'lemon for free!' } }
-->title =Update by ITEM_SET twice
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update_two xtest coll == 1 ITEM_SET %MEMBER_NAME% %LEMON% ITEM_SET %MEMBER_PRICE% %LEMON_FOR_FREE% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "name": "lemon", "price": "lemon for free!"}
-->title =Update by ITEM_SET non-existing member
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_SET %MEMBER_LOCATION% %LEMON% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2, "location": "lemon"}
-->title =Update a valid document by _id (from field)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_SET %MEMBER_NAME% %LEMON% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "name": "lemon", "price": 1.2}
-->varlet %MEMBER_ID% document_path { type: MEMBER value: '_id' }
-->title =Update document with illegal _id change
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_SET %MEMBER_ID% %LEMON% ER_X_BAD_MEMBER_TO_UPDATE
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->title =Update non-existing document
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 666 ITEM_SET %MEMBER_NAME% %LEMON% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->title =Update multiple documents
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Insert xtest coll {"_id": "2", "name": "apple", "price": 0.25}
-->callmacro Insert xtest coll {"_id": "3", "name": "tomato", "price": 1.80}
-->callmacro Insert xtest coll {"_id": "4", "name": "mango", "price": 3.14}
-->callmacro Insert xtest coll {"_id": "5", "name": "mango", "price": 0.90, "origin":["mexico","philippines"]}
-->callmacro Show xtest coll
-->callmacro Update xtest coll < 5 ITEM_SET %MEMBER_NAME% %LEMON% ER_SUCCESS
-->callmacro Show xtest coll
-->title =Update on an invalid schema (bad)
-->stmtsql CREATE SCHEMA ytest
-->recvresult
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update ytest coll == 1 ITEM_SET %MEMBER_NAME% %LEMON% ER_NO_SUCH_TABLE
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->stmtsql DROP SCHEMA IF EXISTS ytest
-->recvresult
-->title =Update on an invalid collection (bad)
-->callmacro Update xtest no_coll == 1 ITEM_SET %MEMBER_NAME% %LEMON% ER_NO_SUCH_TABLE
-->varlet %MEMBER_NAME_COLUMN% %MEMBER_NAME% name:'xfield'
-->title =Update member with column (bad)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_SET %MEMBER_NAME_COLUMN% %LEMON% ER_X_BAD_COLUMN_TO_UPDATE
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->varlet %MEMBER_NAME_TABLE% %MEMBER_NAME% table_name: 'xtable'
-->title =Update member with table name (bad)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_SET %MEMBER_NAME_TABLE% %LEMON% ER_X_BAD_COLUMN_TO_UPDATE
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->varlet %MEMBER_NAME_SCHEMA% %MEMBER_NAME% schema_name: 'xschema'
-->title =Update member with schema name (bad)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_SET %MEMBER_NAME_SCHEMA% %LEMON% ER_X_BAD_COLUMN_TO_UPDATE
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->title =Update by SET (not allowed)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 SET %MEMBER_NAME% %LEMON% ER_X_BAD_TYPE_OF_UPDATE
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->title =Update by ITEM_REMOVE
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update_no_value xtest coll == 1 ITEM_REMOVE %MEMBER_NAME% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "price": 1.2}
-->title =Multiple chained operations
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update_two_no_value xtest coll == 1 ITEM_SET %MEMBER_NAME% %LEMON% ITEM_REMOVE %MEMBER_PRICE% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "name": "lemon"}
-->varlet %ROOT_EMPTY%
-->varlet %DOC_WITHOUT_ID% %LITERAL% { %V_OCTETS% { value: '{"one":1, "two":"foo"}' content_type: 2 } }
-->title =Merge with another document
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_MERGE %ROOT_EMPTY% %DOC_WITHOUT_ID% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "one": 1, "two": "foo", "name": "banana", "price": 1.2}
-->varlet %DOC_WITH_ID% %LITERAL% { %V_OCTETS% { value: '{"three":3, "four":"bar", "_id":"666"}' content_type: 2 } }
-->title =Merge with another document containing _id
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_MERGE %ROOT_EMPTY% %DOC_WITH_ID% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "four": "bar", "name": "banana", "price": 1.2, "three": 3}
-->varlet %ROOT_MEMBER% document_path { type: MEMBER }
-->title =Merge with another document containing _id (differ root)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_MERGE %ROOT_MEMBER% %DOC_WITH_ID% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "four": "bar", "name": "banana", "price": 1.2, "three": 3}
-->title =Set item and merge with another document
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update_two xtest coll == 1 ITEM_SET %MEMBER_NAME% %LEMON% ITEM_MERGE %ROOT_MEMBER% %DOC_WITHOUT_ID% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "one": 1, "two": "foo", "name": "lemon", "price": 1.2}
-->title =Merge with another document and set item
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update_two xtest coll == 1 ITEM_MERGE %ROOT_MEMBER% %DOC_WITHOUT_ID% ITEM_SET %MEMBER_NAME% %LEMON% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "one": 1, "two": "foo", "name": "lemon", "price": 1.2}
-->title =Merge with NULL
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_MERGE %ROOT_MEMBER% %NULL% ER_X_DOC_ID_MISSING
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->varlet %ARRAY% %LITERAL% { %V_OCTETS% { value: '[1,2,3]' } }
-->title =Merge with non-document
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_MERGE %ROOT_MEMBER% %ARRAY% ER_X_DOC_ID_MISSING
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->title =Merge with two documents
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Show xtest coll
-->callmacro Update_two xtest coll == 1 ITEM_MERGE %ROOT_EMPTY% %DOC_WITH_ID% ITEM_MERGE %ROOT_EMPTY% %DOC_WITHOUT_ID% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "one": 1, "two": "foo", "four": "bar", "name": "banana", "price": 1.2, "three": 3}
-->title =Merge with numeric literal
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_MERGE %ROOT_EMPTY% %LEMON% ER_X_BAD_UPDATE_DATA
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->title =Replace entire document (by empty source)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_REPLACE %ROOT_EMPTY% %DOC_WITH_ID% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "four": "bar", "three": 3}
-->title =Replace entire document (by member)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_REPLACE %ROOT_MEMBER% %DOC_WITH_ID% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "four": "bar", "three": 3}
-->title =Replace entire document, no _id (by member)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_REPLACE %ROOT_MEMBER% %DOC_WITHOUT_ID% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "one": 1, "two": "foo"}
-->title =Replace entire document by NULL
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_REPLACE %ROOT_MEMBER% %NULL% ER_X_DOC_ID_MISSING
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->title =Set entire document (by empty source)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_SET %ROOT_EMPTY% %DOC_WITH_ID% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "four": "bar", "three": 3}
-->title =Set entire document (by member)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_SET %ROOT_MEMBER% %DOC_WITH_ID% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "four": "bar", "three": 3}
-->title =Set entire document, no _id (by member)
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Show xtest coll
-->callmacro Update xtest coll == 1 ITEM_SET %ROOT_MEMBER% %DOC_WITHOUT_ID% ER_SUCCESS
-->callmacro Assert xtest coll {"_id": "1", "one": 1, "two": "foo"}
-->title =Set entire document to NULL
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_SET %ROOT_MEMBER% %NULL% ER_X_DOC_ID_MISSING
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->title =Merge literal to member
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_MERGE %MEMBER_NAME% %LEMON% ER_X_BAD_UPDATE_DATA
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->title =Merge document to sub-document
-->callmacro Setup xtest coll {"_id": "1", "name": {"one": 3.4}, "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_MERGE %MEMBER_NAME% %DOC_WITHOUT_ID% ER_X_BAD_UPDATE_DATA
-->callmacro Assert xtest coll {"_id": "1", "name": {"one": 3.4}, "price": 1.2}
-->title =Merge document to member
-->callmacro Setup xtest coll {"_id": "1", "name": "banana", "price": 1.20}
-->callmacro Update xtest coll == 1 ITEM_MERGE %MEMBER_NAME% %DOC_WITHOUT_ID% ER_X_BAD_UPDATE_DATA
-->callmacro Assert xtest coll {"_id": "1", "name": "banana", "price": 1.2}
-->title =Merge document to member of array
-->callmacro Setup xtest coll {"_id": "2", "origin": ["mexico", {"philippines": true}]}
-->callmacro Update xtest coll == 2 ITEM_MERGE %MEMBER_ORIGIN_1% %DOC_WITHOUT_ID% ER_X_BAD_UPDATE_DATA
-->callmacro Assert xtest coll {"_id": "2", "origin": ["mexico", {"philippines": true}]}
EOF
CREATE SCHEMA xtest;
--exec $MYSQLXTEST -ux_root --password='' --file=$xtest_file 2>&1
## Cleanup
DROP SCHEMA IF EXISTS xtest;
--remove_file $xtest_file
--source include/xplugin_drop_user.inc