Current Path : /usr/opt/mysql57/mysql-test/suite/x/t/ |
FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64 |
Current File : //usr/opt/mysql57/mysql-test/suite/x/t/insert_crud_1.test |
## =================================================================== ## ## CRUD INSERT SCENARIOS ## ## =================================================================== ## This test runs aims to run insert statementwith mysqlxtest client # ## Test covers # ## - Insert with crud calls # ## - Insert in normal and document table # ## - Insert NULL values # ## - Insert into parent-child(PK-FK) table # ## - Insert with transaction # ## - Insert with lock table # ## - Insert not allowed for user having read permission # ## - Try insert when table lock is acquired by other session(wait) # ## - Two session run insert in parallel # ## - Error case # ## - Try to Insert doc which do not have _id member # ## - Try to insert null for doc column # ## - Try non unique value for _id member # ## - Try projection for DOCUMENT TABLE # ## =================================================================== # Insert xmessage # Inserts a row or set of rows in the specified collection or table. # Arguments # schema and table # data_model - relational or document # projection - list of columns being inserted (for TABLE inserts) # rows - 1 or more rows with the data to be inserted # Results # rows_affected - number of rows that were affected by the operation # last_insert_id - last value used for the auto-increment field in # a TABLE INSERT operation (not set for DOCUMENT inserts) # Mapping # When inserting into a document collection, the generated INSERT # statement will look like: # INSERT INTO schema.table (doc, _id) VALUES (?, JSN_UNQUOTE(JSN_EXTRACT(doc, '$._id'))); # When inserting into a relational table, the generated INSERT will be as: # INSERT INTO schema.table (projection, ...) VALUES (?, ...); ## Preamble --source ../include/xplugin_preamble.inc create user readuser@localhost identified by 'readuser'; grant select on *.* to readuser@localhost; --write_file $MYSQL_TMP_DIR/mysqlx-insert_CRUD_1.tmp -- "Create relational TABLE " -->sql DROP SCHEMA if EXISTS xplugintest; CREATE SCHEMA xplugintest DEFAULT CHARSET='utf8'; USE xplugintest; CREATE TABLE categories ( categoryid int NOT NULL AUTO_INCREMENT, categoryname varchar(100), categorydescription varchar(200), categoryimei tinyint, categorydecimal decimal(5,2), categorybool bit(1), PRIMARY key (categoryid) ); -->endsql -->echo Insert multiple rows Mysqlx.Crud.Insert { collection { name: "categories" schema: "xplugintest" } data_model: TABLE projection { name: "categoryid" } projection { name: "categoryname" } projection { name: "categorydescription" } projection { name: "categoryimei" } projection { name: "categorydecimal" } projection { name: "categorybool" } row { field { type : LITERAL literal { type: V_SINT v_signed_int: 1 }} field { type: LITERAL literal { type: V_STRING v_string { value: "Sports" } }} field { type: LITERAL literal { type: V_STRING v_string { value: "Sports related category" } }} field { type : LITERAL literal { type: V_SINT v_signed_int: 1 }} field { type: LITERAL literal { type: V_DOUBLE v_double: 235.15 }} field { type : LITERAL literal { type: V_BOOL v_bool: false }} } row { field { type: LITERAL literal { type: V_SINT v_signed_int: 2 }} field { type: LITERAL literal { type: V_STRING v_string { value: "Entertaiment" } }} field { type : LITERAL literal { type: V_STRING v_string { value: "Entertaiment related category" } }} field { type: LITERAL literal { type: V_SINT v_signed_int: 2 }} field { type: LITERAL literal { type: V_DOUBLE v_double: 156.17 }} field { type: LITERAL literal { type: V_BOOL v_bool: true }} } row { field { type: LITERAL literal { type: V_SINT v_signed_int: 18 }} field { type: LITERAL literal { type: V_STRING v_string { value: "Cooking" } }} field { type: LITERAL literal { type: V_STRING v_string { value: "Cooking related category" } }} field { type: LITERAL literal { type: V_SINT v_signed_int: 18 }} field { type: LITERAL literal { type: V_DOUBLE v_double: 116.17 }} field { type: LITERAL literal { type: V_BOOL v_bool: true }} } } -- Mysqlx.Sql.StmtExecuteOk -->recvresult -->sql SELECT * FROM categories; -->endsql -->echo "No auto increment column mentioned in projection" Mysqlx.Crud.Insert { collection { name: "categories" schema: "xplugintest" } data_model: TABLE projection { name: "categoryname" } row { field { type: LITERAL literal { type: V_STRING v_string { value: "GROUND" } }} } } -->recvresult -->sql SELECT * FROM categories; -->endsql -->echo "Enter NULL values" Mysqlx.Crud.Insert { collection { name: "categories" schema: "xplugintest" } data_model: TABLE projection { name: "categoryname" } row { field { type: LITERAL literal { type: V_NULL }} } } -->recvresult -->sql SELECT * FROM categories; -->endsql -->sql CREATE TABLE categories_child( col1 INT , col2 JSON , FOREIGN KEY (col1) REFERENCES categories(categoryid)); -->endsql Mysqlx.Crud.Insert { collection { name: "categories_child" schema: "xplugintest" } data_model: TABLE projection { name: "col1" } row { field { type: LITERAL literal { type: V_SINT v_signed_int: 18 }} } } -->recvresult Mysqlx.Crud.Insert { collection { name: "categories_child" schema: "xplugintest" } data_model: TABLE projection { name: "col1" } row { field { type: LITERAL literal { type: V_SINT v_signed_int: 100 }} } } -->echo "Insert fails as referencing value not present in parent" -->recv -->sql SELECT * FROM categories_child; -->endsql -->echo "Column mismatch" Mysqlx.Crud.Insert { collection { name: "categories_child" schema: "xplugintest" } data_model: TABLE projection { name: "col1" } projection { name: "col2" } row { field { type: LITERAL literal { type: V_SINT v_signed_int: 18 }} } } -->expecterror ER_X_BAD_INSERT_DATA -->recvresult -->sql SELECT * FROM categories_child; DROP TABLE categories_child; -->endsql -- "Create DOCUMENT table " Mysqlx.Sql.StmtExecute { stmt: "create_collection" args { type: SCALAR scalar { type: V_STRING v_string { value: "xplugintest" } } } args { type: SCALAR scalar { type: V_STRING v_string { value: "maincollection" } } } namespace: "xplugin" } -->recvresult -->echo Insert multiple rows into a Document column Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"_id\": \"1\",\n \"name\": \"Omar Bras\", \"id\": \"1\"\n}" } } }} row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"_id\": \"2\",\n \"name\": \"Omar Mex\", \"id\": \"2\"\n}" } }} } } -->recvresult -->sql SELECT * FROM maincollection; -->endsql -->echo "Non unique value for _id member of `doc` " Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"_id\": \"3\",\n \"name\": \"Omar Bras\", \"id\": \"3\"\n}" } }} } row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"_id\": \"2\",\n \"name\": \"Omar Mex\", \"id\": \"4\"\n}" } }} } } -->recv -->echo "Error expected as non unique value for _id provided for member of JSON doc " -->sql SELECT * FROM maincollection; -->endsql -->echo "No _id member for JSON doc" Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"name\": \"Omar Bras\", \"id\": \"3\"\n}" } }} } } -->recv -->echo "Error expected as _id member is not provided for JSON doc " -->sql SELECT * FROM maincollection; -->endsql -->echo "projection is not allowed for DOCUMENT table" Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT projection { name: "doc" } row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"name\": \"Omar Bras\", \"id\": \"3\"\n}" } }} } } -->recv -->echo "Error expected as projection given for DOCUMENT table " -->sql SELECT * FROM maincollection; -->endsql -->echo "Error when inserting doc as null" Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT row { field { type: LITERAL literal { type: V_NULL }} } } -->expecterror ER_X_DOC_ID_MISSING -->recvresult -->sql SELECT * FROM maincollection; -->endsql -->echo "enter null value in doc member" Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"_id\": \"4\",\n \"name\": \"Jackson\", \"id\": null\n}" } }} } } -->recvresult -->sql SELECT * FROM maincollection; -->endsql -->echo "Insert using transaction" -->sql START TRANSACTION; -->endsql Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"_id\": \"5\",\n \"name\": \"Jimmy \", \"id\": null\n}" } }} } } -->recvresult -->sql SAVEPOINT A; -->endsql Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"_id\": \"6\",\n \"name\": \"Joe\", \"id\": null\n}" } } }} } -->recvresult -->sql SAVEPOINT B; -->endsql Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"_id\": \"7\",\n \"name\": \"Jacky\", \"id\": null\n}" } }} } } -->recvresult -->sql ROLLBACK TO SAVEPOINT A; COMMIT; -->endsql -->sql SELECT * FROM maincollection; -->endsql -- "Insert by acquiring lock" -->sql LOCK TABLES maincollection READ; -->endsql Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"_id\": \"7\",\n \"name\": \"Jacky\", \"id\": null\n}" } }} } } -->recv -->echo "Error as table is locked with read lock" -->sql SELECT * FROM maincollection; -->endsql -->sql UNLOCK TABLES; LOCK TABLES maincollection WRITE; -->endsql Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT row { field { type: LITERAL literal { type: V_STRING v_string { value: "\n{\n \"_id\": \"7\",\n \"name\": \"Jacky\", \"id\": null\n}" } }} } } -->recvresult -->sql SELECT * FROM maincollection; UNLOCK TABLES; -->endsql EOF --exec $MYSQLXTEST -u root --password='' --file=$MYSQL_TMP_DIR/mysqlx-insert_CRUD_1.tmp 2>&1 --remove_file $MYSQL_TMP_DIR/mysqlx-insert_CRUD_1.tmp # "Error : Insert when user has only select access " --write_file $MYSQL_TMP_DIR/mysqlx-insert_CRUD_1.tmp -->sql SET SESSION lock_wait_timeout= 3; -->endsql Mysqlx.Crud.Insert { collection { name: "categories" schema: "xplugintest" } data_model: TABLE projection { name: "categoryname" } row { field { type: LITERAL literal { type: V_STRING v_string { value: "Mountain" } }} } } -->expecterror ER_TABLEACCESS_DENIED_ERROR,ER_LOCK_WAIT_TIMEOUT -->recvresult -->expecterror ER_LOCK_WAIT_TIMEOUT -->sql SELECT * FROM xplugintest.categories; -->endsql EOF --exec $MYSQLXTEST -u readuser --password='readuser' --file=$MYSQL_TMP_DIR/mysqlx-insert_CRUD_1.tmp 2>&1 # Acquire lock on categories table from mysqltest client # and try to run insert from mysqlxtest (Error : timeout expected from mysqlxtest) LOCK TABLES xplugintest.categories WRITE; --exec $MYSQLXTEST -u root --password='' --file=$MYSQL_TMP_DIR/mysqlx-insert_CRUD_1.tmp 2>&1 --remove_file $MYSQL_TMP_DIR/mysqlx-insert_CRUD_1.tmp UNLOCK TABLES; # Try run insert from 2 mysqlxtest sessions DELETE FROM xplugintest.maincollection; perl; my $dir = $ENV{'MYSQL_TMP_DIR'}; open ( OUTPUT, ">$dir/mysqlx-in.tmp") ; $message = <<"END_MESSAGE"; Mysqlx.Crud.Insert { collection { name: "maincollection" schema: "xplugintest" } data_model: DOCUMENT row { field { type: LITERAL literal { type: V_STRING v_string { value: "insert_json_doc" } }} } } END_MESSAGE print OUTPUT "-->sql\n"; print OUTPUT "USE xplugintest;\n"; print OUTPUT "CREATE TABLE IF NOT EXISTS xplugintest.test_table ( col1 INT );\n"; print OUTPUT "-->endsql\n"; for ($i=1001;$i<=1030;$i++) { if ($i%5 == 0) { print OUTPUT "-->expecterror ER_SUCCESS,ER_DUP_ENTRY\n"; print OUTPUT "-->sql\n"; print OUTPUT "INSERT INTO maincollection(doc) VALUES ('".'{\"name\":\"name_'.$i.'\"'.' , \"_id\":'.$i."}') \n"; print OUTPUT "-->endsql\n"; }else { $str = $message; $replace = '{\"name\":\"name_'.$i.'\"'.' , \"_id\":'.$i.'}'; $find = "insert_json_doc"; $str =~ s/$find/$replace/g; print OUTPUT "$str\n"; print OUTPUT "-->expecterror ER_SUCCESS,ER_X_DOC_ID_DUPLICATE\n"; print OUTPUT "-->recvresult\n"; } } print OUTPUT "-->sql\n"; print OUTPUT "INSERT INTO xplugintest.test_table VALUES (1);\n"; print OUTPUT "-->endsql\n"; close (OUTPUT); EOF --exec $MYSQLXTEST -u root --password='' --file=$MYSQL_TMP_DIR/mysqlx-in.tmp >$MYSQL_TMP_DIR/mysqlx-out.tmp 2>&1 & --exec $MYSQLXTEST -u root --password='' --file=$MYSQL_TMP_DIR/mysqlx-in.tmp >$MYSQL_TMP_DIR/mysqlx-out2.tmp 2>&1 let $wait_condition= select count(*)=2 from xplugintest.test_table; --source include/wait_condition.inc SELECT COUNT(*) FROM xplugintest.maincollection; --remove_file $MYSQL_TMP_DIR/mysqlx-in.tmp --remove_file $MYSQL_TMP_DIR/mysqlx-out2.tmp --remove_file $MYSQL_TMP_DIR/mysqlx-out.tmp ## Postamble DROP SCHEMA if EXISTS xplugintest; DROP USER readuser@localhost; UNINSTALL PLUGIN mysqlx;