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

501 lines
24 KiB
Plaintext

## Varius tests related to overlaps operator
## 1. Using 'overlaps' operator with literals
## 1.1 with literal array
## 1.2 with literal object
## 2. Using 'overlaps' operator with idetifiers
## 2.1 with document member array
## 2.1 with document member object
## 3. Using 'overlaps' operator with operators
## 4. Using 'overlaps' operator with function calls
## 5. Validating number of 'overlaps' arguments
## Preamble
--source include/xplugin_preamble.inc
--source include/xplugin_create_user.inc
## Test starts here
--let $xtest_file= $MYSQL_TMP_DIR/crud_overlaps_expr.xpl
--write_file $xtest_file
-->quiet
-->macro Error_on_overlaps %PARAM0% %PARAM1% %ERROR%
Mysqlx.Crud.Find {
collection { name: "xtable" schema: "xtest" }
data_model: TABLE
projection {
alias: "overlaps"
source {
type: OPERATOR operator {
name: "overlaps"
param { %PARAM0% }
param { %PARAM1% }
}
}
}
}
-->expecterror %ERROR%
-->recvresult
-->endmacro
-->macro Assert_overlaps %OPERATOR% %PARAM0% %PARAM1% %EXPECT%
Mysqlx.Crud.Find {
collection { name: "xtable" schema: "xtest" }
data_model: TABLE
projection {
alias: "%OPERATOR%"
source {
type: OPERATOR operator {
name: "%OPERATOR%"
param { %PARAM0% }
param { %PARAM1% }
}
}
}
}
-->recvtovar %OPERATOR_RESULT% %OPERATOR%
-->echo Verify [Operator "%OPERATOR%" returns value %EXPECT%]
-->assert_eq %EXPECT% %OPERATOR_RESULT%
-->endmacro
-->macro Overlaps_positive %POSITIVE% %WHERE%
-->callmacro Assert_overlaps overlaps %POSITIVE% %WHERE% 1
-->callmacro Assert_overlaps not_overlaps %POSITIVE% %WHERE% 0
-->endmacro
-->macro Overlaps_negative %NEGATIVE% %WHERE%
-->callmacro Assert_overlaps overlaps %NEGATIVE% %WHERE% 0
-->callmacro Assert_overlaps not_overlaps %NEGATIVE% %WHERE% 1
-->endmacro
-->varlet %LITERAL% type: LITERAL literal
-->varlet %V_SINT% type: V_SINT v_signed_int
-->varlet %V_BOOL% type: V_BOOL v_bool
-->varlet %V_STRING% type: V_STRING v_string
-->varlet %V_FLOAT% type: V_FLOAT v_float
-->varlet %V_OCTETS% type: V_OCTETS v_octets
-->varlet %ARRAY% type: ARRAY array
-->varlet %IDENT% type: IDENT identifier
-->varlet %MEMBER% type: MEMBER value
-->varlet %OBJECT% type: OBJECT object
-->varlet %OPERATOR% type: OPERATOR operator
-->varlet %FUNC_CALL% type: FUNC_CALL function_call
-->varlet %DOCUMENT_PATH% name: 'doc' document_path
-->varlet %LITERAL_10% %LITERAL% {%V_SINT%: 10}
-->varlet %LITERAL_20% %LITERAL% {%V_SINT%: 20}
-->varlet %LITERAL_30% %LITERAL% {%V_SINT%: 30}
-->varlet %LITERAL_40% %LITERAL% {%V_SINT%: 40}
-->varlet %LITERAL_TRUE% %LITERAL% {%V_BOOL%: true}
-->varlet %LITERAL_FALSE% %LITERAL% {%V_BOOL%: false}
-->varlet %LITERAL_NULL% %LITERAL% {type: V_NULL}
-->varlet %LITERAL_RED% %LITERAL% {%V_STRING% {value:'red'}}
-->varlet %LITERAL_GREEN% %LITERAL% {%V_STRING% {value:'green'}}
-->varlet %LITERAL_BLUE% %LITERAL% {%V_STRING% {value:'blue'}}
-->varlet %LITERAL_WHITE% %LITERAL% {%V_STRING% {value:'white'}}
-->varlet %LITERAL_APPLE% %LITERAL% {%V_OCTETS% {value:'apple' content_type:0}}
-->varlet %LITERAL_PEAR% %LITERAL% {%V_OCTETS% {value:'pear' content_type:0}}
-->varlet %LITERAL_PLUM% %LITERAL% {%V_OCTETS% {value:'plum' content_type:0}}
-->varlet %LITERAL_BANANA% %LITERAL% {%V_OCTETS% {value:'banana' content_type:0}}
-->varlet %LITERAL_ARRAY_10_20_30% %ARRAY% {value {%LITERAL_10%} value {%LITERAL_20%} value {%LITERAL_30%}}
-->varlet %LITERAL_ARRAY_10% %ARRAY% {value {%LITERAL_10%}}
-->varlet %LITERAL_ARRAY_40% %ARRAY% {value {%LITERAL_40%}}
-->varlet %LITERAL_ARRAY_20% %ARRAY% {value {%LITERAL_20%}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.1 with literal array (numeric)
-->callmacro Overlaps_positive %LITERAL_ARRAY_10% %LITERAL_ARRAY_10_20_30%
-->callmacro Overlaps_negative %LITERAL_ARRAY_40% %LITERAL_ARRAY_10_20_30%
-->varlet %LITERAL_ARRAY_RED_GREEN_BLUE% %ARRAY% {value {%LITERAL_RED%} value {%LITERAL_GREEN%} value {%LITERAL_BLUE%}}
-->varlet %LITERAL_ARRAY_RED% %ARRAY% {value {%LITERAL_RED%}}
-->varlet %LITERAL_ARRAY_WHITE% %ARRAY% {value {%LITERAL_WHITE%}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.1 with literal array (string)
-->callmacro Overlaps_positive %LITERAL_ARRAY_RED% %LITERAL_ARRAY_RED_GREEN_BLUE%
-->callmacro Overlaps_negative %LITERAL_ARRAY_WHITE% %LITERAL_ARRAY_RED_GREEN_BLUE%
-->varlet %LITERAL_ARRAY_TRUE_TRUE% %ARRAY% {value {%LITERAL_TRUE%} value {%LITERAL_TRUE%}}
-->varlet %LITERAL_ARRAY_FALSE_FALSE% %ARRAY% {value {%LITERAL_FALSE%} value {%LITERAL_FALSE%}}
-->varlet %LITERAL_ARRAY_TRUE% %ARRAY% {value {%LITERAL_TRUE%}}
-->varlet %LITERAL_ARRAY_FALSE% %ARRAY% {value {%LITERAL_FALSE%}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.1 with literal array (bool)
-->callmacro Overlaps_positive %LITERAL_ARRAY_TRUE% %LITERAL_ARRAY_TRUE_TRUE%
-->callmacro Overlaps_negative %LITERAL_ARRAY_FALSE% %LITERAL_ARRAY_TRUE_TRUE%
-->callmacro Overlaps_positive %LITERAL_ARRAY_FALSE% %LITERAL_ARRAY_FALSE_FALSE%
-->callmacro Overlaps_negative %LITERAL_ARRAY_TRUE% %LITERAL_ARRAY_FALSE_FALSE%
-->varlet %LITERAL_ARRAY_APPLE_PEAR_PLUM% %ARRAY% {value {%LITERAL_APPLE%} value {%LITERAL_PEAR%} value {%LITERAL_PLUM%}}
-->varlet %LITERAL_ARRAY_APPLE% %ARRAY% {value {%LITERAL_APPLE%}}
-->varlet %LITERAL_ARRAY_BANANA% %ARRAY% {value {%LITERAL_BANANA%}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.1 with literal array (plain octets string)
-->callmacro Overlaps_positive %LITERAL_ARRAY_APPLE% %LITERAL_ARRAY_APPLE_PEAR_PLUM%
-->callmacro Overlaps_negative %LITERAL_ARRAY_BANANA% %LITERAL_ARRAY_APPLE_PEAR_PLUM%
-->varlet %JSON_OCTETS_ARRAY_10_20_30% %LITERAL% {%V_OCTETS% {value:'[10, 20, 30]' content_type:2}}
-->varlet %JSON_OCTETS_ARRAY_10% %LITERAL% {%V_OCTETS% {value:'[10]' content_type:2}}
-->varlet %JSON_OCTETS_ARRAY_40% %LITERAL% {%V_OCTETS% {value:'[40]' content_type:2}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.1 with literal array (numeric octets)
-->callmacro Overlaps_positive %JSON_OCTETS_ARRAY_10% %JSON_OCTETS_ARRAY_10_20_30%
-->callmacro Overlaps_negative %JSON_OCTETS_ARRAY_40% %JSON_OCTETS_ARRAY_10_20_30%
-->varlet %JSON_OCTETS_ARRAY_RED_GREEN_BLUE% %LITERAL% {%V_OCTETS% {value:'["red", "green", "blue"]' content_type:2}}
-->varlet %JSON_OCTETS_ARRAY_RED% %LITERAL% {%V_OCTETS% {value:'["red"]' content_type:2}}
-->varlet %JSON_OCTETS_ARRAY_WHITE% %LITERAL% {%V_OCTETS% {value:'["white"]' content_type:2}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.1 with literal array (string octets)
-->callmacro Overlaps_positive %JSON_OCTETS_ARRAY_RED% %JSON_OCTETS_ARRAY_RED_GREEN_BLUE%
-->callmacro Overlaps_negative %JSON_OCTETS_ARRAY_WHITE% %JSON_OCTETS_ARRAY_RED_GREEN_BLUE%
-->varlet %JSON_OCTETS_ARRAY_TRUE_TRUE% %LITERAL% {%V_OCTETS% {value:'[true, true]' content_type:2}}
-->varlet %JSON_OCTETS_ARRAY_TRUE% %LITERAL% {%V_OCTETS% {value:'[true]' content_type:2}}
-->varlet %JSON_OCTETS_ARRAY_FALSE_FALSE% %LITERAL% {%V_OCTETS% {value:'[false, false]' content_type:2}}
-->varlet %JSON_OCTETS_ARRAY_FALSE% %LITERAL% {%V_OCTETS% {value:'[false]' content_type:2}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.1 with literal array (bool octets)
-->callmacro Overlaps_positive %JSON_OCTETS_ARRAY_TRUE% %JSON_OCTETS_ARRAY_TRUE_TRUE%
-->callmacro Overlaps_negative %JSON_OCTETS_ARRAY_FALSE% %JSON_OCTETS_ARRAY_TRUE_TRUE%
-->callmacro Overlaps_positive %JSON_OCTETS_ARRAY_FALSE% %JSON_OCTETS_ARRAY_FALSE_FALSE%
-->callmacro Overlaps_negative %JSON_OCTETS_ARRAY_TRUE% %JSON_OCTETS_ARRAY_FALSE_FALSE%
-->varlet %MEMBER_ARRAY_10% %IDENT% {%DOCUMENT_PATH% {%MEMBER%: 'array_10'}}
-->varlet %MEMBER_ARRAY_40% %IDENT% {%DOCUMENT_PATH% {%MEMBER%: 'array_40'}}
-->varlet %MEMBER_ARRAY_10_20_30% %IDENT% {%DOCUMENT_PATH% {%MEMBER%: 'array_10_20_30'}}
-->echo ## 2. Using 'overlaps' operator with idetifiers
-->echo ## 2.1 with document member array (numeric)
-->callmacro Overlaps_positive %LITERAL_ARRAY_10% %MEMBER_ARRAY_10_20_30%
-->callmacro Overlaps_negative %LITERAL_ARRAY_40% %MEMBER_ARRAY_10_20_30%
-->callmacro Overlaps_positive %MEMBER_ARRAY_10% %LITERAL_ARRAY_10_20_30%
-->callmacro Overlaps_negative %MEMBER_ARRAY_40% %LITERAL_ARRAY_10_20_30%
-->varlet %MEMBER_ARRAY_TRUE_TRUE% %IDENT% {%DOCUMENT_PATH% {%MEMBER%: 'array_true_true'}}
-->varlet %MEMBER_ARRAY_FALSE% %IDENT% {%DOCUMENT_PATH% {%MEMBER%: 'array_false'}}
-->echo ## 2. Using 'overlaps' operator with idetifiers
-->echo ## 2.1 with document member array (bool)
-->callmacro Overlaps_positive %LITERAL_ARRAY_TRUE% %MEMBER_ARRAY_TRUE_TRUE%
-->callmacro Overlaps_negative %LITERAL_ARRAY_FALSE% %MEMBER_ARRAY_TRUE_TRUE%
-->callmacro Overlaps_positive %MEMBER_ARRAY_FALSE% %LITERAL_ARRAY_FALSE_FALSE%
-->callmacro Overlaps_negative %LITERAL_ARRAY_TRUE% %LITERAL_ARRAY_FALSE_FALSE%
-->varlet %MEMBER_ARRAY_RED% %IDENT% {%DOCUMENT_PATH% {%MEMBER%: 'array_red'}}
-->varlet %MEMBER_ARRAY_BANANA% %IDENT% {%DOCUMENT_PATH% {%MEMBER%: 'array_banana'}}
-->varlet %MEMBER_ARRAY_RED_GREEN_PEAR% %IDENT% {%DOCUMENT_PATH% {%MEMBER%: 'array_red_green_pear'}}
-->echo ## 2. Using 'overlaps' operator with idetifiers
-->echo ## 2.1 with document member array (string)
-->callmacro Overlaps_positive %LITERAL_ARRAY_RED% %MEMBER_ARRAY_RED_GREEN_PEAR%
-->callmacro Overlaps_negative %LITERAL_ARRAY_WHITE% %MEMBER_ARRAY_RED_GREEN_PEAR%
-->callmacro Overlaps_positive %MEMBER_ARRAY_RED% %MEMBER_ARRAY_RED_GREEN_PEAR%
-->callmacro Overlaps_negative %MEMBER_ARRAY_BANANA% %MEMBER_ARRAY_RED_GREEN_PEAR%
-->callmacro Overlaps_positive %MEMBER_ARRAY_RED% %LITERAL_ARRAY_RED_GREEN_BLUE%
-->callmacro Overlaps_negative %MEMBER_ARRAY_BANANA% %LITERAL_ARRAY_RED_GREEN_BLUE%
# objects
-->varlet %LITERAL_OBJECT_10% %OBJECT% {fld {key:'ten' value {%LITERAL_10%}}}
-->varlet %LITERAL_OBJECT_40% %OBJECT% {fld {key:'forty' value {%LITERAL_40%}}}
-->varlet %LITERAL_OBJECT_10_20_30% %OBJECT% {fld {key:'ten' value {%LITERAL_10%}} fld {key:'twenty' value {%LITERAL_20%}} fld {key:'thirty' value {%LITERAL_30%}}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.2 with literal object (numeric)
-->callmacro Overlaps_positive %LITERAL_OBJECT_10% %LITERAL_OBJECT_10_20_30%
-->callmacro Overlaps_negative %LITERAL_OBJECT_40% %LITERAL_OBJECT_10_20_30%
-->varlet %LITERAL_OBJECT_RED% %OBJECT% {fld {key:'red' value {%LITERAL_RED%}}}
-->varlet %LITERAL_OBJECT_WHITE% %OBJECT% {fld {key:'white' value {%LITERAL_WHITE%}}}
-->varlet %LITERAL_OBJECT_RED_GREEN_BLUE% %OBJECT% {fld {key:'red' value {%LITERAL_RED%}} fld {key:'green' value {%LITERAL_GREEN%}} fld {key:'blue' value {%LITERAL_BLUE%}}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.2 with literal object (string)
-->callmacro Overlaps_positive %LITERAL_OBJECT_RED% %LITERAL_OBJECT_RED_GREEN_BLUE%
-->callmacro Overlaps_negative %LITERAL_OBJECT_WHITE% %LITERAL_OBJECT_RED_GREEN_BLUE%
-->varlet %JSON_OCTETS_OBJECT_10% %LITERAL% {%V_OCTETS% {value:'{"ten":10}' content_type:2}}
-->varlet %JSON_OCTETS_OBJECT_40% %LITERAL% {%V_OCTETS% {value:'{"forty":40}' content_type:2}}
-->varlet %JSON_OCTETS_OBJECT_10_20_30% %LITERAL% {%V_OCTETS% {value:'{"ten":10, "twenty":20, "thirty":30}' content_type:2}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.2 with literal object (numeric octets)
-->callmacro Overlaps_positive %JSON_OCTETS_OBJECT_10% %JSON_OCTETS_OBJECT_10_20_30%
-->callmacro Overlaps_negative %JSON_OCTETS_OBJECT_40% %JSON_OCTETS_OBJECT_10_20_30%
-->varlet %JSON_OCTETS_OBJECT_RED% %LITERAL% {%V_OCTETS% {value:'{"red":"red"}' content_type:2}}
-->varlet %JSON_OCTETS_OBJECT_WHITE% %LITERAL% {%V_OCTETS% {value:'{"white":"white"}' content_type:2}}
-->varlet %JSON_OCTETS_OBJECT_RED_GREEN_BLUE% %LITERAL% {%V_OCTETS% {value:'{"red":"red", "green":"green", "blue":"blue"}' content_type:2}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.2 with literal object (string octets)
-->callmacro Overlaps_positive %JSON_OCTETS_OBJECT_RED% %JSON_OCTETS_OBJECT_RED_GREEN_BLUE%
-->callmacro Overlaps_negative %JSON_OCTETS_OBJECT_WHITE% %JSON_OCTETS_OBJECT_RED_GREEN_BLUE%
-->varlet %DOCUMENT_ROOT% %IDENT% {%DOCUMENT_PATH% {type: MEMBER}}
-->echo ## 2. Using 'overlaps' operator with idetifiers
-->echo ## 2.1 with document member array (document root)
-->callmacro Overlaps_positive %LITERAL_OBJECT_RED% %DOCUMENT_ROOT%
-->callmacro Overlaps_negative %LITERAL_OBJECT_WHITE% %DOCUMENT_ROOT%
-->echo ## 2. Using 'overlaps' operator with idetifiers
-->echo ## 2.2 with document member object (document root)
-->callmacro Overlaps_positive %JSON_OCTETS_OBJECT_RED% %DOCUMENT_ROOT%
-->callmacro Overlaps_negative %JSON_OCTETS_OBJECT_WHITE% %DOCUMENT_ROOT%
-->varlet %MEMBER_OBJECT_NUMERIC_10% %IDENT% {%DOCUMENT_PATH% {%MEMBER%: 'numeric_10'}}
-->varlet %MEMBER_OBJECT_NUMERIC_40% %IDENT% {%DOCUMENT_PATH% {%MEMBER%: 'numeric_40'}}
-->echo ## 2. Using 'overlaps' operator with idetifiers
-->echo ## 2.2 with document member object
-->callmacro Overlaps_positive %MEMBER_OBJECT_NUMERIC_10% %LITERAL_OBJECT_10_20_30%
-->callmacro Overlaps_negative %MEMBER_OBJECT_NUMERIC_40% %LITERAL_OBJECT_10_20_30%
# operators
-->varlet %ADD_OPERATOR% %OPERATOR% {name: '+' param{ %LITERAL_10%} param{ %LITERAL_20%} }
-->varlet %CAST_TO_JSON_OPERATOR% %OPERATOR% {name: 'cast' param{%LITERAL% {%V_STRING% {value:'["red"]'}}} param{%LITERAL% {%V_OCTETS% {value:'JSON'}}}}
-->echo ## 3. Using 'overlaps' operator with operators (not supported operator)
-->callmacro Error_on_overlaps %ADD_OPERATOR% %LITERAL_ARRAY_10_20_30% ER_X_EXPR_BAD_VALUE
-->echo ## 3. Using 'overlaps' operator with operators (cast to json)
-->callmacro Assert_overlaps overlaps %CAST_TO_JSON_OPERATOR% %LITERAL_ARRAY_RED_GREEN_BLUE% 1
# null
-->varlet %LITERAL_ARRAY_NULL% %ARRAY% {value {%LITERAL_NULL%}}
-->varlet %LITERAL_ARRAY_10_NULL_30% %ARRAY% {value {%LITERAL_10%} value {%LITERAL_NULL%} value {%LITERAL_30%}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.1 with literal array (null)
-->callmacro Assert_overlaps overlaps %LITERAL_ARRAY_10% %LITERAL_ARRAY_10_NULL_30% 1
-->callmacro Assert_overlaps overlaps %LITERAL_ARRAY_NULL% %LITERAL_ARRAY_10_NULL_30% 1
-->callmacro Assert_overlaps not_overlaps %LITERAL_ARRAY_NULL% %LITERAL_ARRAY_10_20_30% 1
-->callmacro Assert_overlaps not_overlaps %LITERAL_ARRAY_40% %LITERAL_ARRAY_10_NULL_30% 1
-->varlet %LITERAL_OBJECT_NULL% %OBJECT% {fld {key:'zero' value {%LITERAL_NULL%}}}
-->varlet %LITERAL_OBJECT_10_NULL_30% %OBJECT% {fld {key:'zero' value {%LITERAL_NULL%}} fld {key:'ten' value {%LITERAL_10%}} fld {key:'thirty' value {%LITERAL_30%}}}
-->echo ## 1. Using 'overlaps' operator with literals
-->echo ## 1.2 with literal object (null)
-->callmacro Assert_overlaps overlaps %LITERAL_OBJECT_10% %LITERAL_OBJECT_10_NULL_30% 1
-->callmacro Assert_overlaps overlaps %LITERAL_OBJECT_NULL% %LITERAL_OBJECT_10_NULL_30% 1
-->callmacro Assert_overlaps not_overlaps %LITERAL_OBJECT_NULL% %LITERAL_OBJECT_10_20_30% 1
-->callmacro Assert_overlaps not_overlaps %LITERAL_OBJECT_40% %LITERAL_OBJECT_10_NULL_30% 1
# function
-->varlet %FUNCTION_CONCAT% %FUNC_CALL% {name{name: 'concat'} param{%LITERAL% {%V_STRING% {value:'["'}}} param{%LITERAL_RED%} param{%LITERAL% {%V_STRING% {value:'"]'}}}}
-->echo ## 4. Using 'overlaps' operator with function calls (not supported function)
-->callmacro Error_on_overlaps %LITERAL_ARRAY_RED% %FUNCTION_CONCAT% ER_X_EXPR_BAD_VALUE
-->echo ## 4. Using 'overlaps' operator with function calls (supported functions)
-->title -JSON_ARRAY - Create JSON array
-->varlet %FUNCTION_JSON_ARRAY% %FUNC_CALL% {name{name: 'json_array'} param{%LITERAL_10%} param{%LITERAL_RED%} param{%LITERAL_TRUE%}}
-->callmacro Overlaps_positive %LITERAL_ARRAY_RED% %FUNCTION_JSON_ARRAY%
-->callmacro Overlaps_negative %LITERAL_ARRAY_WHITE% %FUNCTION_JSON_ARRAY%
-->title -JSON_ARRAY_APPEND - Append data to JSON document
-->varlet %ROOT_POINT% %LITERAL% {%V_OCTETS% {value:'$'}}
-->varlet %FUNCTION_JSON_ARRAY_APPEND% %FUNC_CALL% {name{name: 'json_array_append'} param{%LITERAL_ARRAY_10_20_30%} param{%ROOT_POINT%} param{%LITERAL_RED%}}
-->callmacro Overlaps_positive %LITERAL_ARRAY_RED% %FUNCTION_JSON_ARRAY_APPEND%
-->callmacro Overlaps_negative %LITERAL_ARRAY_WHITE% %FUNCTION_JSON_ARRAY_APPEND%
-->title -JSON_ARRAY_INSERT - Insert into JSON array
-->varlet %ARRAY_POINT% %LITERAL% {%V_OCTETS% {value:'$[1]'}}
-->varlet %FUNCTION_JSON_ARRAY_INSERT% %FUNC_CALL% {name{name: 'json_array_insert'} param{%LITERAL_ARRAY_10_20_30%} param{%ARRAY_POINT%} param{%LITERAL_RED%}}
-->callmacro Overlaps_positive %LITERAL_ARRAY_RED% %FUNCTION_JSON_ARRAY_INSERT%
-->callmacro Overlaps_negative %LITERAL_ARRAY_WHITE% %FUNCTION_JSON_ARRAY_INSERT%
-->title -JSON_CONTAINS - Whether JSON document contains specific object at path
-->varlet %FUNCTION_JSON_CONTAINS% %FUNC_CALL% {name{name: 'json_contains'} param{%LITERAL_ARRAY_10_20_30%} param{%LITERAL_RED%}}
-->callmacro Error_on_overlaps %LITERAL_ARRAY_RED% %FUNCTION_JSON_CONTAINS% ER_X_EXPR_BAD_VALUE
-->title -JSON_CONTAINS_PATH - Whether JSON document contains any data at path
-->varlet %FUNCTION_JSON_CONTAINS_PATH% %FUNC_CALL% {name{name: 'json_contains_path'} param{%LITERAL_ARRAY_10_20_30%} param{%ARRAY_POINT%}}
-->callmacro Error_on_overlaps %LITERAL_ARRAY_RED% %FUNCTION_JSON_CONTAINS_PATH% ER_X_EXPR_BAD_VALUE
-->title -JSON_DEPTH - Maximum depth of JSON document
-->varlet %FUNCTION_JSON_DEPTH% %FUNC_CALL% {name{name: 'json_depth'} param{%LITERAL_ARRAY_10_20_30%}}
-->callmacro Error_on_overlaps %LITERAL_ARRAY_RED% %FUNCTION_JSON_DEPTH% ER_X_EXPR_BAD_VALUE
-->title -JSON_EXTRACT - Return data from JSON document
-->varlet %FUNCTION_JSON_EXTRACT% %FUNC_CALL% {name{name: 'json_extract'} param{%MEMBER_ARRAY_10_20_30%} param{%ROOT_POINT%}}
-->callmacro Overlaps_positive %LITERAL_ARRAY_10% %FUNCTION_JSON_EXTRACT%
-->callmacro Overlaps_negative %LITERAL_ARRAY_40% %FUNCTION_JSON_EXTRACT%
-->title -JSON_INSERT - Insert data into JSON document
-->varlet %FUNCTION_JSON_INSERT% %FUNC_CALL% {name{name: 'json_insert'} param{%LITERAL_ARRAY_RED%} param{%ARRAY_POINT%}, param{%LITERAL_10%}}
-->callmacro Overlaps_positive %LITERAL_ARRAY_10% %FUNCTION_JSON_INSERT%
-->callmacro Overlaps_negative %LITERAL_ARRAY_40% %FUNCTION_JSON_INSERT%
-->title -JSON_KEYS - Array of keys from JSON document
-->varlet %FUNCTION_JSON_KEYS% %FUNC_CALL% {name{name: 'json_keys'} param{%DOCUMENT_ROOT%}}
-->callmacro Overlaps_positive %LITERAL_ARRAY_10% %FUNCTION_JSON_INSERT%
-->callmacro Overlaps_negative %LITERAL_ARRAY_40% %FUNCTION_JSON_INSERT%
-->title -JSON_LENGTH - Number of elements in JSON document
-->varlet %FUNCTION_JSON_LENGTH% %FUNC_CALL% {name{name: 'json_length'} param{%DOCUMENT_ROOT%}}
-->callmacro Error_on_overlaps %LITERAL_ARRAY_RED% %FUNCTION_JSON_LENGTH% ER_X_EXPR_BAD_VALUE
-->title -JSON_MERGE - Merge JSON documents
-->varlet %FUNCTION_JSON_MERGE% %FUNC_CALL% {name{name: 'json_merge'} param{%LITERAL_OBJECT_10%} param{%LITERAL_OBJECT_RED%}}
-->callmacro Overlaps_positive %LITERAL_OBJECT_10% %FUNCTION_JSON_MERGE%
-->callmacro Overlaps_negative %LITERAL_OBJECT_40% %FUNCTION_JSON_MERGE%
-->title -JSON_OBJECT - Create JSON object
-->varlet %KEY_10% %LITERAL% {%V_OCTETS% {value:'ten'}}
-->varlet %FUNCTION_JSON_OBJECT% %FUNC_CALL% {name{name: 'json_object'} param{%KEY_10%} param{%LITERAL_10%}}
-->callmacro Overlaps_positive %LITERAL_OBJECT_10% %FUNCTION_JSON_OBJECT%
-->callmacro Overlaps_negative %LITERAL_OBJECT_40% %FUNCTION_JSON_OBJECT%
#-->title -JSON_QUOTE - Quote JSON document
#-->varlet %FUNCTION_JSON_QUOTE% %FUNC_CALL% {name{name: 'json_quote'} param{%LITERAL_RED%}}
# no good test scenario
-->title -JSON_REMOVE - Remove data from JSON document
-->varlet %FUNCTION_JSON_REMOVE% %FUNC_CALL% {name{name: 'json_remove'} param{%LITERAL_ARRAY_10_20_30%} param{%ARRAY_POINT%}}
-->callmacro Overlaps_positive %LITERAL_ARRAY_10% %FUNCTION_JSON_REMOVE%
-->callmacro Overlaps_negative %LITERAL_ARRAY_20% %FUNCTION_JSON_REMOVE%
-->title -JSON_REPLACE - Replace values in JSON document
-->varlet %FUNCTION_JSON_REPLACE% %FUNC_CALL% {name{name: 'json_replace'} param{%LITERAL_ARRAY_10_20_30%} param{%ARRAY_POINT%} param{%LITERAL_40%}}
-->callmacro Overlaps_positive %LITERAL_ARRAY_40% %FUNCTION_JSON_REPLACE%
-->callmacro Overlaps_negative %LITERAL_ARRAY_20% %FUNCTION_JSON_REPLACE%
-->title -JSON_SEARCH - Path to value within JSON document
-->varlet %FUNCTION_JSON_SEARCH% %FUNC_CALL% {name{name: 'json_search'} param{%LITERAL_ARRAY_RED_GREEN_BLUE%} param{%LITERAL% {%V_OCTETS% {value:'one'}}} param{%LITERAL_GREEN%}}
-->callmacro Overlaps_positive %ARRAY% {value {%ARRAY_POINT%}} %FUNCTION_JSON_SEARCH%
-->callmacro Overlaps_negative %LITERAL_ARRAY_WHITE% %FUNCTION_JSON_SEARCH%
-->title -JSON_SET - Insert data into JSON document
-->varlet %FUNCTION_JSON_SET% %FUNC_CALL% {name{name: 'json_set'} param{%LITERAL_ARRAY_RED_GREEN_BLUE%} param{%ARRAY_POINT%} param{%LITERAL_10%}}
-->callmacro Overlaps_positive %LITERAL_ARRAY_10% %FUNCTION_JSON_SET%
-->callmacro Overlaps_negative %LITERAL_ARRAY_20% %FUNCTION_JSON_SET%
-->title -JSON_TYPE - Type of JSON value
-->varlet %FUNCTION_JSON_TYPE% %FUNC_CALL% {name{name: 'json_type'} param{%LITERAL_OBJECT_RED%}}
-->callmacro Error_on_overlaps %LITERAL_ARRAY_RED% %FUNCTION_JSON_TYPE% ER_X_EXPR_BAD_VALUE
#-->title -JSON_UNQUOTE - Unquote JSON value
#-->varlet %FUNCTION_JSON_UNQUOTE% %FUNC_CALL% {name{name: 'json_unquote'} param{%MEMBER_SCALAR_RED%}}
# no good test scenario
-->title -JSON_VALID - Whether JSON value is valid
-->varlet %FUNCTION_JSON_VALID% %FUNC_CALL% {name{name: 'json_valid'} param{%LITERAL_OBJECT_RED%}}
-->callmacro Error_on_overlaps %LITERAL_ARRAY_RED% %FUNCTION_JSON_VALID% ER_X_EXPR_BAD_VALUE
# parameters
-->macro Overlaps_params %PARAMS% %ERROR%
Mysqlx.Crud.Find {
collection { name: "xtable" schema: "xtest" }
data_model: TABLE
projection {
alias: "overlaps"
source {
type: OPERATOR operator {
name: "overlaps"
%PARAMS%
}
}
}
}
-->expecterror %ERROR%
-->recvresult
-->endmacro
-->echo ## 5. Validating number of 'overlaps' arguments
-->callmacro Overlaps_params ER_X_EXPR_BAD_NUM_ARGS
-->callmacro Overlaps_params param{ %LITERAL_ARRAY_10%} ER_X_EXPR_BAD_NUM_ARGS
-->callmacro Overlaps_params param{ %LITERAL_ARRAY_10%} param{ %LITERAL_ARRAY_20%} ER_SUCCESS
-->callmacro Overlaps_params param{ %LITERAL_ARRAY_10%} param{ %LITERAL_ARRAY_20%} param{ %LITERAL_ARRAY_40%} ER_X_EXPR_BAD_NUM_ARGS
-->echo # Some extra scenarios
-->varlet %LITERAL_EMPTY_STRING% %LITERAL% {%V_STRING% {value:''}}
-->varlet %LITERAL_STRING_10% %LITERAL% {%V_STRING% {value:'10'}}
-->varlet %LITERAL_DATE% %LITERAL% {%V_STRING% {value:'2018:10:10'}}
-->varlet %LITERAL_78_67% %LITERAL% {%V_FLOAT%: 78.67}
-->varlet %LITERAL_ARRAY_EMPTY% %ARRAY% {}
-->varlet %LITERAL_ARRAY_EMPTY_STRING% %ARRAY% {value {%LITERAL_EMPTY_STRING%}}
-->varlet %LITERAL_ARRAY_STRING_10% %ARRAY% {value {%LITERAL_STRING_10%}}
-->varlet %LITERAL_ARRAY_MIX% %ARRAY% {value {%LITERAL_RED%} value {%LITERAL_10%} value {%LITERAL_STRING_10%} value {%LITERAL_NULL%} value {%LITERAL_78_67%} value {%LITERAL_DATE%}}
-->varlet %LITERAL_OBJECT_EMPTY_ARRAY% %OBJECT% {fld {key:'empty' value {%LITERAL_ARRAY_EMPTY%}}}
-->varlet %LITERAL_OBJECT_EMPTY_STRING% %OBJECT% {fld {key:'empty' value {%LITERAL_EMPTY_STRING%}}}
-->callmacro Overlaps_negative %LITERAL_ARRAY_EMPTY% %LITERAL_ARRAY_RED_GREEN_BLUE%
-->callmacro Overlaps_negative %LITERAL_ARRAY_EMPTY_STRING% %LITERAL_ARRAY_RED%
-->callmacro Overlaps_negative %LITERAL_OBJECT_EMPTY_STRING% %LITERAL_OBJECT_EMPTY_ARRAY%
-->callmacro Overlaps_positive %LITERAL_ARRAY_MIX% %LITERAL_ARRAY_STRING_10%
-->callmacro Overlaps_positive %LITERAL_ARRAY_MIX% %LITERAL_ARRAY_NULL%
-->callmacro Overlaps_negative %LITERAL_ARRAY_MIX% %LITERAL_ARRAY_WHITE%
-->callmacro Overlaps_positive %LITERAL_ARRAY_MIX% %LITERAL_78_67%
EOF
CREATE SCHEMA xtest;
CREATE TABLE xtest.xtable (doc JSON);
INSERT INTO xtest.xtable (doc) VALUES
('{"array_10":[10],
"array_40":[40],
"array_10_20_30":[10,20,30],
"array_red":["red"],
"array_banana":["banana"],
"array_true_true":[true, true],
"array_false":[false],
"array_red_green_pear":["red","green","pear"],
"numeric_10":{"ten":10},
"numeric_40":{"forty":40},
"red":"red"}');
--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