diff --git a/data/test/vtexplain/comments-output.json b/data/test/vtexplain/comments-output.json deleted file mode 100644 index d3d71229af9..00000000000 --- a/data/test/vtexplain/comments-output.json +++ /dev/null @@ -1,490 +0,0 @@ -[ - { - "SQL": "SELECT * from user", - "Plans": [ - { - "Original": "select * from user", - "Instructions": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select * from user", - "FieldQuery": "select * from user where 1 != 1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user limit 10001" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user limit 10001" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user limit 10001" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user limit 10001" - } - ] - } - } - }, - { - "SQL": "select /* ; */ 1 from user", - "Plans": [ - { - "Original": "select /* ; */ :vtg1 from user", - "Instructions": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select /* ; */ :vtg1 from user", - "FieldQuery": "select :vtg1 from user where 1 != 1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select /* ; */ :vtg1 from user", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select /* ; */ 1 from user limit 10001" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select /* ; */ :vtg1 from user", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select /* ; */ 1 from user limit 10001" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select /* ; */ :vtg1 from user", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select /* ; */ 1 from user limit 10001" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select /* ; */ :vtg1 from user", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select /* ; */ 1 from user limit 10001" - } - ] - } - } - }, - { - "SQL": "select 1 from user where x=';'", - "Plans": [ - { - "Original": "select :vtg1 from user where x = :vtg2", - "Instructions": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select :vtg1 from user where x = :vtg2", - "FieldQuery": "select :vtg1 from user where 1 != 1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "';'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = ';' limit 10001" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "';'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = ';' limit 10001" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "';'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = ';' limit 10001" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "';'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = ';' limit 10001" - } - ] - } - } - }, - { - "SQL": "select 1 from user where x='/* hello */'", - "Plans": [ - { - "Original": "select :vtg1 from user where x = :vtg2", - "Instructions": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select :vtg1 from user where x = :vtg2", - "FieldQuery": "select :vtg1 from user where 1 != 1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'/* hello */'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = '/* hello */' limit 10001" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'/* hello */'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = '/* hello */' limit 10001" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'/* hello */'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = '/* hello */' limit 10001" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'/* hello */'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = '/* hello */' limit 10001" - } - ] - } - } - }, - { - "SQL": "select 1 from user where x='/* ; */'", - "Plans": [ - { - "Original": "select :vtg1 from user where x = :vtg2", - "Instructions": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select :vtg1 from user where x = :vtg2", - "FieldQuery": "select :vtg1 from user where 1 != 1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'/* ; */'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = '/* ; */' limit 10001" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'/* ; */'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = '/* ; */' limit 10001" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'/* ; */'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = '/* ; */' limit 10001" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1 from user where x = :vtg2", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'/* ; */'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1 from user where x = '/* ; */' limit 10001" - } - ] - } - } - } -] diff --git a/data/test/vtexplain/deletesharded-output.json b/data/test/vtexplain/deletesharded-output.json deleted file mode 100644 index 83648cf10ab..00000000000 --- a/data/test/vtexplain/deletesharded-output.json +++ /dev/null @@ -1,283 +0,0 @@ -[ - { - "SQL": "delete from user where id=10", - "Plans": [ - { - "Original": "delete from name_user_map where name = :name and user_id = :user_id", - "Instructions": { - "Opcode": "DeleteEqual", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "delete from name_user_map where name = :name and user_id = :user_id", - "Vindex": "md5", - "Values": [ - ":name" - ], - "Table": "name_user_map" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "delete from user where id = :vtg1", - "Instructions": { - "Opcode": "DeleteEqual", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "delete from user where id = :vtg1", - "Vindex": "hash", - "Values": [ - ":vtg1" - ], - "Table": "user", - "Subquery": "select name from user where id = :vtg1 for update" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 2, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select name from user where id = :vtg1 for update", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "10" - } - }, - { - "Time": 3, - "SQL": "delete from user where id = :vtg1 /* vtgate:: keyspace_id:594764e1a2b2d98e */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "10" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "select name from user where id = 10 limit 10001 for update" - }, - { - "Time": 3, - "SQL": "delete from user where id in (10) /* vtgate:: keyspace_id:594764e1a2b2d98e */" - }, - { - "Time": 4, - "SQL": "commit" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 2, - "SQL": "delete from name_user_map where name = :name and user_id = :user_id /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */", - "BindVars": { - "#maxLimit": "10001", - "name": "'name_val_1'", - "user_id": "10" - } - } - ], - "MysqlQueries": [ - { - "Time": 2, - "SQL": "begin" - }, - { - "Time": 2, - "SQL": "delete from name_user_map where (name = 'name_val_1' and user_id = 10) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */" - }, - { - "Time": 5, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "delete from user where name='billy'", - "Plans": [ - { - "Original": "delete from name_user_map where name = :name and user_id = :user_id", - "Instructions": { - "Opcode": "DeleteEqual", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "delete from name_user_map where name = :name and user_id = :user_id", - "Vindex": "md5", - "Values": [ - ":name" - ], - "Table": "name_user_map" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "select user_id from name_user_map where name = :name", - "Instructions": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select user_id from name_user_map where name = :name", - "FieldQuery": "select user_id from name_user_map where 1 != 1", - "Vindex": "md5", - "Values": [ - ":name" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "delete from user where name = :vtg1", - "Instructions": { - "Opcode": "DeleteEqual", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "delete from user where name = :vtg1", - "Vindex": "name_user_map", - "Values": [ - ":vtg1" - ], - "Table": "user", - "Subquery": "select name from user where name = :vtg1 for update" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 2, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 2, - "SQL": "select name from user where name = :vtg1 for update", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "'billy'" - } - }, - { - "Time": 4, - "SQL": "delete from user where name = :vtg1 /* vtgate:: keyspace_id:166b40b44aba4bd6 */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "'billy'" - } - } - ], - "MysqlQueries": [ - { - "Time": 2, - "SQL": "begin" - }, - { - "Time": 2, - "SQL": "select name from user where name = 'billy' limit 10001 for update" - }, - { - "Time": 4, - "SQL": "delete from user where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */" - }, - { - "Time": 4, - "SQL": "select id from user where name = 'billy' limit 10001 for update /* vtgate:: keyspace_id:166b40b44aba4bd6 */" - }, - { - "Time": 6, - "SQL": "commit" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 3, - "SQL": "delete from name_user_map where name = :name and user_id = :user_id /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */", - "BindVars": { - "#maxLimit": "10001", - "name": "'name_val_1'", - "user_id": "1" - } - } - ], - "MysqlQueries": [ - { - "Time": 3, - "SQL": "begin" - }, - { - "Time": 3, - "SQL": "delete from name_user_map where (name = 'name_val_1' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */" - }, - { - "Time": 7, - "SQL": "commit" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select user_id from name_user_map where name = :name", - "BindVars": { - "#maxLimit": "10001", - "name": "'billy'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "select user_id from name_user_map where name = 'billy' limit 10001" - }, - { - "Time": 5, - "SQL": "commit" - } - ] - } - } - } -] diff --git a/data/test/vtexplain/deletesharded-queries.sql b/data/test/vtexplain/deletesharded-queries.sql index 5ec654b1000..7876ef62259 100644 --- a/data/test/vtexplain/deletesharded-queries.sql +++ b/data/test/vtexplain/deletesharded-queries.sql @@ -1,4 +1,9 @@ -delete from user where id=10; +delete from music_extra where id=1; +delete from music_extra where id=1 and extra='abc'; + +/* with lookup index by pk */ +delete from user where id=1; +/* with lookup index by other field */ delete from user where name='billy'; /* not supported - multi-shard delete */ diff --git a/data/test/vtexplain/insertsharded-output.json b/data/test/vtexplain/insertsharded-output.json deleted file mode 100644 index 8ce4ba62b5b..00000000000 --- a/data/test/vtexplain/insertsharded-output.json +++ /dev/null @@ -1,895 +0,0 @@ -[ - { - "SQL": "insert into user (id, name) values(1, 'alice')", - "Plans": [ - { - "Original": "insert into name_user_map(name, user_id) values (:name0, :user_id0)", - "Instructions": { - "Opcode": "InsertSharded", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert into name_user_map(name, user_id) values (:_name0, :user_id0)", - "Values": [ - [ - [ - ":name0" - ] - ] - ], - "Table": "name_user_map", - "Prefix": "insert into name_user_map(name, user_id) values ", - "Mid": [ - "(:_name0, :user_id0)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "insert into user(id, name) values (:vtg1, :vtg2)", - "Instructions": { - "Opcode": "InsertSharded", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert into user(id, name) values (:_id0, :_name0)", - "Values": [ - [ - [ - ":vtg1" - ] - ], - [ - [ - ":vtg2" - ] - ] - ], - "Table": "user", - "Prefix": "insert into user(id, name) values ", - "Mid": [ - "(:_id0, :_name0)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 2, - "SQL": "insert into user(id, name) values (:_id0, :_name0) /* vtgate:: keyspace_id:166b40b44aba4bd6 */", - "BindVars": { - "#maxLimit": "10001", - "_id0": "1", - "_name0": "'alice'", - "vtg1": "1", - "vtg2": "'alice'" - } - } - ], - "MysqlQueries": [ - { - "Time": 2, - "SQL": "begin" - }, - { - "Time": 2, - "SQL": "insert into user(id, name) values (1, 'alice') /* vtgate:: keyspace_id:166b40b44aba4bd6 */" - }, - { - "Time": 4, - "SQL": "commit" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "insert into name_user_map(name, user_id) values (:_name0, :user_id0) /* vtgate:: keyspace_id:475e26c086f437f36bd72ecd883504a7 */", - "BindVars": { - "#maxLimit": "10001", - "_name0": "'alice'", - "name0": "'alice'", - "user_id0": "1" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "insert into name_user_map(name, user_id) values ('alice', 1) /* vtgate:: keyspace_id:475e26c086f437f36bd72ecd883504a7 */" - }, - { - "Time": 3, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "insert into user (id, name) values(2, 'bob')", - "Plans": [ - { - "Original": "insert into name_user_map(name, user_id) values (:name0, :user_id0)", - "Instructions": { - "Opcode": "InsertSharded", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert into name_user_map(name, user_id) values (:_name0, :user_id0)", - "Values": [ - [ - [ - ":name0" - ] - ] - ], - "Table": "name_user_map", - "Prefix": "insert into name_user_map(name, user_id) values ", - "Mid": [ - "(:_name0, :user_id0)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "insert into user(id, name) values (:vtg1, :vtg2)", - "Instructions": { - "Opcode": "InsertSharded", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert into user(id, name) values (:_id0, :_name0)", - "Values": [ - [ - [ - ":vtg1" - ] - ], - [ - [ - ":vtg2" - ] - ] - ], - "Table": "user", - "Prefix": "insert into user(id, name) values ", - "Mid": [ - "(:_id0, :_name0)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 2, - "SQL": "insert into user(id, name) values (:_id0, :_name0) /* vtgate:: keyspace_id:06e7ea22ce92708f */", - "BindVars": { - "#maxLimit": "10001", - "_id0": "2", - "_name0": "'bob'", - "vtg1": "2", - "vtg2": "'bob'" - } - } - ], - "MysqlQueries": [ - { - "Time": 2, - "SQL": "begin" - }, - { - "Time": 2, - "SQL": "insert into user(id, name) values (2, 'bob') /* vtgate:: keyspace_id:06e7ea22ce92708f */" - }, - { - "Time": 4, - "SQL": "commit" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "insert into name_user_map(name, user_id) values (:_name0, :user_id0) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */", - "BindVars": { - "#maxLimit": "10001", - "_name0": "'bob'", - "name0": "'bob'", - "user_id0": "2" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "insert into name_user_map(name, user_id) values ('bob', 2) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */" - }, - { - "Time": 3, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "insert ignore into user (id, name) values(2, 'bob')", - "Plans": [ - { - "Original": "select name from name_user_map where name = :name and user_id = :user_id", - "Instructions": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select name from name_user_map where name = :name and user_id = :user_id", - "FieldQuery": "select name from name_user_map where 1 != 1", - "Vindex": "md5", - "Values": [ - ":name" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "insert ignore into name_user_map(name, user_id) values (:name0, :user_id0)", - "Instructions": { - "Opcode": "InsertShardedIgnore", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert ignore into name_user_map(name, user_id) values (:_name0, :user_id0)", - "Values": [ - [ - [ - ":name0" - ] - ] - ], - "Table": "name_user_map", - "Prefix": "insert ignore into name_user_map(name, user_id) values ", - "Mid": [ - "(:_name0, :user_id0)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "insert ignore into user(id, name) values (:vtg1, :vtg2)", - "Instructions": { - "Opcode": "InsertShardedIgnore", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert ignore into user(id, name) values (:_id0, :_name0)", - "Values": [ - [ - [ - ":vtg1" - ] - ], - [ - [ - ":vtg2" - ] - ] - ], - "Table": "user", - "Prefix": "insert ignore into user(id, name) values ", - "Mid": [ - "(:_id0, :_name0)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 3, - "SQL": "insert ignore into user(id, name) values (:_id0, :_name0) /* vtgate:: keyspace_id:06e7ea22ce92708f */", - "BindVars": { - "#maxLimit": "10001", - "_id0": "2", - "_name0": "'bob'", - "vtg1": "2", - "vtg2": "'bob'" - } - } - ], - "MysqlQueries": [ - { - "Time": 3, - "SQL": "begin" - }, - { - "Time": 3, - "SQL": "insert ignore into user(id, name) values (2, 'bob') /* vtgate:: keyspace_id:06e7ea22ce92708f */" - }, - { - "Time": 5, - "SQL": "commit" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "insert ignore into name_user_map(name, user_id) values (:_name0, :user_id0) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */", - "BindVars": { - "#maxLimit": "10001", - "_name0": "'bob'", - "name0": "'bob'", - "user_id0": "2" - } - }, - { - "Time": 2, - "SQL": "select name from name_user_map where name = :name and user_id = :user_id", - "BindVars": { - "#maxLimit": "10001", - "name": "'bob'", - "user_id": "2" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "insert ignore into name_user_map(name, user_id) values ('bob', 2) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */" - }, - { - "Time": 2, - "SQL": "select name from name_user_map where name = 'bob' and user_id = 2 limit 10001" - }, - { - "Time": 4, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "insert ignore into user (id, name, nickname) values(2, 'bob', 'bob')", - "Plans": [ - { - "Original": "select name from name_user_map where name = :name and user_id = :user_id", - "Instructions": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select name from name_user_map where name = :name and user_id = :user_id", - "FieldQuery": "select name from name_user_map where 1 != 1", - "Vindex": "md5", - "Values": [ - ":name" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "insert ignore into name_user_map(name, user_id) values (:name0, :user_id0)", - "Instructions": { - "Opcode": "InsertShardedIgnore", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert ignore into name_user_map(name, user_id) values (:_name0, :user_id0)", - "Values": [ - [ - [ - ":name0" - ] - ] - ], - "Table": "name_user_map", - "Prefix": "insert ignore into name_user_map(name, user_id) values ", - "Mid": [ - "(:_name0, :user_id0)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "insert ignore into user(id, name, nickname) values (:vtg1, :vtg2, :vtg3)", - "Instructions": { - "Opcode": "InsertShardedIgnore", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert ignore into user(id, name, nickname) values (:_id0, :_name0, :vtg3)", - "Values": [ - [ - [ - ":vtg1" - ] - ], - [ - [ - ":vtg2" - ] - ] - ], - "Table": "user", - "Prefix": "insert ignore into user(id, name, nickname) values ", - "Mid": [ - "(:_id0, :_name0, :vtg3)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 3, - "SQL": "insert ignore into user(id, name, nickname) values (:_id0, :_name0, :vtg3) /* vtgate:: keyspace_id:06e7ea22ce92708f */", - "BindVars": { - "#maxLimit": "10001", - "_id0": "2", - "_name0": "'bob'", - "vtg1": "2", - "vtg2": "'bob'", - "vtg3": "'bob'" - } - } - ], - "MysqlQueries": [ - { - "Time": 3, - "SQL": "begin" - }, - { - "Time": 3, - "SQL": "insert ignore into user(id, name, nickname) values (2, 'bob', 'bob') /* vtgate:: keyspace_id:06e7ea22ce92708f */" - }, - { - "Time": 5, - "SQL": "commit" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "insert ignore into name_user_map(name, user_id) values (:_name0, :user_id0) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */", - "BindVars": { - "#maxLimit": "10001", - "_name0": "'bob'", - "name0": "'bob'", - "user_id0": "2" - } - }, - { - "Time": 2, - "SQL": "select name from name_user_map where name = :name and user_id = :user_id", - "BindVars": { - "#maxLimit": "10001", - "name": "'bob'", - "user_id": "2" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "insert ignore into name_user_map(name, user_id) values ('bob', 2) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */" - }, - { - "Time": 2, - "SQL": "select name from name_user_map where name = 'bob' and user_id = 2 limit 10001" - }, - { - "Time": 4, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "insert into user (id, name, nickname) values(2, 'bob', 'bobby') on duplicate key update nickname='bobby'", - "Plans": [ - { - "Original": "select name from name_user_map where name = :name and user_id = :user_id", - "Instructions": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select name from name_user_map where name = :name and user_id = :user_id", - "FieldQuery": "select name from name_user_map where 1 != 1", - "Vindex": "md5", - "Values": [ - ":name" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "insert ignore into name_user_map(name, user_id) values (:name0, :user_id0)", - "Instructions": { - "Opcode": "InsertShardedIgnore", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert ignore into name_user_map(name, user_id) values (:_name0, :user_id0)", - "Values": [ - [ - [ - ":name0" - ] - ] - ], - "Table": "name_user_map", - "Prefix": "insert ignore into name_user_map(name, user_id) values ", - "Mid": [ - "(:_name0, :user_id0)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "insert into user(id, name, nickname) values (:vtg1, :vtg2, :vtg3) on duplicate key update nickname = :vtg4", - "Instructions": { - "Opcode": "InsertShardedIgnore", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert into user(id, name, nickname) values (:_id0, :_name0, :vtg3) on duplicate key update nickname = :vtg4", - "Values": [ - [ - [ - ":vtg1" - ] - ], - [ - [ - ":vtg2" - ] - ] - ], - "Table": "user", - "Prefix": "insert into user(id, name, nickname) values ", - "Mid": [ - "(:_id0, :_name0, :vtg3)" - ], - "Suffix": " on duplicate key update nickname = :vtg4" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 3, - "SQL": "insert into user(id, name, nickname) values (:_id0, :_name0, :vtg3) on duplicate key update nickname = :vtg4 /* vtgate:: keyspace_id:06e7ea22ce92708f */", - "BindVars": { - "#maxLimit": "10001", - "_id0": "2", - "_name0": "'bob'", - "vtg1": "2", - "vtg2": "'bob'", - "vtg3": "'bobby'", - "vtg4": "'bobby'" - } - } - ], - "MysqlQueries": [ - { - "Time": 3, - "SQL": "begin" - }, - { - "Time": 3, - "SQL": "insert into user(id, name, nickname) values (2, 'bob', 'bobby') on duplicate key update nickname = 'bobby' /* vtgate:: keyspace_id:06e7ea22ce92708f */" - }, - { - "Time": 5, - "SQL": "commit" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "insert ignore into name_user_map(name, user_id) values (:_name0, :user_id0) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */", - "BindVars": { - "#maxLimit": "10001", - "_name0": "'bob'", - "name0": "'bob'", - "user_id0": "2" - } - }, - { - "Time": 2, - "SQL": "select name from name_user_map where name = :name and user_id = :user_id", - "BindVars": { - "#maxLimit": "10001", - "name": "'bob'", - "user_id": "2" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "insert ignore into name_user_map(name, user_id) values ('bob', 2) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */" - }, - { - "Time": 2, - "SQL": "select name from name_user_map where name = 'bob' and user_id = 2 limit 10001" - }, - { - "Time": 4, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "insert into user (id, name, nickname, address) values(2, 'bob', 'bobby', '123 main st') on duplicate key update nickname=values(nickname), address=values(address)", - "Plans": [ - { - "Original": "select name from name_user_map where name = :name and user_id = :user_id", - "Instructions": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select name from name_user_map where name = :name and user_id = :user_id", - "FieldQuery": "select name from name_user_map where 1 != 1", - "Vindex": "md5", - "Values": [ - ":name" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "insert ignore into name_user_map(name, user_id) values (:name0, :user_id0)", - "Instructions": { - "Opcode": "InsertShardedIgnore", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert ignore into name_user_map(name, user_id) values (:_name0, :user_id0)", - "Values": [ - [ - [ - ":name0" - ] - ] - ], - "Table": "name_user_map", - "Prefix": "insert ignore into name_user_map(name, user_id) values ", - "Mid": [ - "(:_name0, :user_id0)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "insert into user(id, name, nickname, address) values (:vtg1, :vtg2, :vtg3, :vtg4) on duplicate key update nickname = values(nickname), address = values(address)", - "Instructions": { - "Opcode": "InsertShardedIgnore", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert into user(id, name, nickname, address) values (:_id0, :_name0, :vtg3, :vtg4) on duplicate key update nickname = values(nickname), address = values(address)", - "Values": [ - [ - [ - ":vtg1" - ] - ], - [ - [ - ":vtg2" - ] - ] - ], - "Table": "user", - "Prefix": "insert into user(id, name, nickname, address) values ", - "Mid": [ - "(:_id0, :_name0, :vtg3, :vtg4)" - ], - "Suffix": " on duplicate key update nickname = values(nickname), address = values(address)" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 3, - "SQL": "insert into user(id, name, nickname, address) values (:_id0, :_name0, :vtg3, :vtg4) on duplicate key update nickname = values(nickname), address = values(address) /* vtgate:: keyspace_id:06e7ea22ce92708f */", - "BindVars": { - "#maxLimit": "10001", - "_id0": "2", - "_name0": "'bob'", - "vtg1": "2", - "vtg2": "'bob'", - "vtg3": "'bobby'", - "vtg4": "'123 main st'" - } - } - ], - "MysqlQueries": [ - { - "Time": 3, - "SQL": "begin" - }, - { - "Time": 3, - "SQL": "insert into user(id, name, nickname, address) values (2, 'bob', 'bobby', '123 main st') on duplicate key update nickname = values(nickname), address = values(address) /* vtgate:: keyspace_id:06e7ea22ce92708f */" - }, - { - "Time": 5, - "SQL": "commit" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "insert ignore into name_user_map(name, user_id) values (:_name0, :user_id0) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */", - "BindVars": { - "#maxLimit": "10001", - "_name0": "'bob'", - "name0": "'bob'", - "user_id0": "2" - } - }, - { - "Time": 2, - "SQL": "select name from name_user_map where name = :name and user_id = :user_id", - "BindVars": { - "#maxLimit": "10001", - "name": "'bob'", - "user_id": "2" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "insert ignore into name_user_map(name, user_id) values ('bob', 2) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */" - }, - { - "Time": 2, - "SQL": "select name from name_user_map where name = 'bob' and user_id = 2 limit 10001" - }, - { - "Time": 4, - "SQL": "commit" - } - ] - } - } - } -] diff --git a/data/test/vtexplain/comments-output.txt b/data/test/vtexplain/multi-output/comments-output.txt similarity index 100% rename from data/test/vtexplain/comments-output.txt rename to data/test/vtexplain/multi-output/comments-output.txt diff --git a/data/test/vtexplain/deletesharded-output.txt b/data/test/vtexplain/multi-output/deletesharded-output.txt similarity index 51% rename from data/test/vtexplain/deletesharded-output.txt rename to data/test/vtexplain/multi-output/deletesharded-output.txt index b7689364974..52b6d862319 100644 --- a/data/test/vtexplain/deletesharded-output.txt +++ b/data/test/vtexplain/multi-output/deletesharded-output.txt @@ -1,12 +1,27 @@ ---------------------------------------------------------------------- -delete from user where id=10 +delete from music_extra where id=1 -1 ks_sharded/40-80: begin -1 ks_sharded/40-80: select name from user where id = 10 limit 10001 for update +1 ks_sharded/-40: begin +1 ks_sharded/-40: delete from music_extra where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +2 ks_sharded/-40: commit + +---------------------------------------------------------------------- +delete from music_extra where id=1 and extra='abc' + +1 ks_sharded/-40: begin +1 ks_sharded/-40: select id from music_extra where id = 1 and extra = 'abc' limit 10001 for update /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +1 ks_sharded/-40: delete from music_extra where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +2 ks_sharded/-40: commit + +---------------------------------------------------------------------- +delete from user where id=1 + +1 ks_sharded/-40: begin +1 ks_sharded/-40: select name from user where id = 1 limit 10001 for update 2 ks_sharded/80-c0: begin -2 ks_sharded/80-c0: delete from name_user_map where (name = 'name_val_1' and user_id = 10) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */ -3 ks_sharded/40-80: delete from user where id in (10) /* vtgate:: keyspace_id:594764e1a2b2d98e */ -4 ks_sharded/40-80: commit +2 ks_sharded/80-c0: delete from name_user_map where (name = 'name_val_1' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */ +3 ks_sharded/-40: delete from user where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +4 ks_sharded/-40: commit 5 ks_sharded/80-c0: commit ---------------------------------------------------------------------- @@ -18,8 +33,8 @@ delete from user where name='billy' 2 ks_sharded/-40: select name from user where name = 'billy' limit 10001 for update 3 ks_sharded/80-c0: begin 3 ks_sharded/80-c0: delete from name_user_map where (name = 'name_val_1' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */ -4 ks_sharded/-40: delete from user where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ 4 ks_sharded/-40: select id from user where name = 'billy' limit 10001 for update /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +4 ks_sharded/-40: delete from user where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ 5 ks_sharded/c0-: commit 6 ks_sharded/-40: commit 7 ks_sharded/80-c0: commit diff --git a/data/test/vtexplain/insertsharded-output.txt b/data/test/vtexplain/multi-output/insertsharded-output.txt similarity index 100% rename from data/test/vtexplain/insertsharded-output.txt rename to data/test/vtexplain/multi-output/insertsharded-output.txt diff --git a/data/test/vtexplain/options-output.txt b/data/test/vtexplain/multi-output/options-output.txt similarity index 100% rename from data/test/vtexplain/options-output.txt rename to data/test/vtexplain/multi-output/options-output.txt diff --git a/data/test/vtexplain/selectsharded-output.txt b/data/test/vtexplain/multi-output/selectsharded-output.txt similarity index 100% rename from data/test/vtexplain/selectsharded-output.txt rename to data/test/vtexplain/multi-output/selectsharded-output.txt diff --git a/data/test/vtexplain/unsharded-output.txt b/data/test/vtexplain/multi-output/unsharded-output.txt similarity index 100% rename from data/test/vtexplain/unsharded-output.txt rename to data/test/vtexplain/multi-output/unsharded-output.txt diff --git a/data/test/vtexplain/multi-output/updatesharded-output.txt b/data/test/vtexplain/multi-output/updatesharded-output.txt new file mode 100644 index 00000000000..62b02b7bea9 --- /dev/null +++ b/data/test/vtexplain/multi-output/updatesharded-output.txt @@ -0,0 +1,58 @@ +---------------------------------------------------------------------- +update user set nickname='alice' where id=1 + +1 ks_sharded/-40: begin +1 ks_sharded/-40: update user set nickname = 'alice' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +2 ks_sharded/-40: commit + +---------------------------------------------------------------------- +update user set nickname='alice' where name='alice' + +1 ks_sharded/40-80: begin +1 ks_sharded/40-80: select user_id from name_user_map where name = 'alice' limit 10001 +2 ks_sharded/-40: begin +2 ks_sharded/-40: select id from user where name = 'alice' limit 10001 for update /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +2 ks_sharded/-40: update user set nickname = 'alice' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +3 ks_sharded/40-80: commit +4 ks_sharded/-40: commit + +---------------------------------------------------------------------- +update user set pet='fido' where id=1 + +1 ks_sharded/-40: begin +1 ks_sharded/-40: update user set pet = 'fido' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +2 ks_sharded/-40: commit + +---------------------------------------------------------------------- +update user set name='alicia' where id=1 + +1 ks_sharded/-40: begin +1 ks_sharded/-40: select name from user where id = 1 limit 10001 for update +2 ks_sharded/80-c0: begin +2 ks_sharded/80-c0: delete from name_user_map where (name = 'name_val_1' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */ +3 ks_sharded/c0-: begin +3 ks_sharded/c0-: insert into name_user_map(name, user_id) values ('alicia', 1) /* vtgate:: keyspace_id:e2821261367fbee90bb5cf72955146c6 */ +4 ks_sharded/-40: update user set name = 'alicia' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +5 ks_sharded/-40: commit +6 ks_sharded/80-c0: commit +7 ks_sharded/c0-: commit + +---------------------------------------------------------------------- +update user set name='alicia' where name='alice' + +1 ks_sharded/40-80: begin +1 ks_sharded/40-80: select user_id from name_user_map where name = 'alice' limit 10001 +2 ks_sharded/-40: begin +2 ks_sharded/-40: select name from user where name = 'alice' limit 10001 for update +3 ks_sharded/80-c0: begin +3 ks_sharded/80-c0: delete from name_user_map where (name = 'name_val_1' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */ +4 ks_sharded/c0-: begin +4 ks_sharded/c0-: insert into name_user_map(name, user_id) values ('alicia', 1) /* vtgate:: keyspace_id:e2821261367fbee90bb5cf72955146c6 */ +5 ks_sharded/-40: select id from user where name = 'alice' limit 10001 for update /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +5 ks_sharded/-40: update user set name = 'alicia' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +6 ks_sharded/40-80: commit +7 ks_sharded/-40: commit +8 ks_sharded/80-c0: commit +9 ks_sharded/c0-: commit + +---------------------------------------------------------------------- diff --git a/data/test/vtexplain/options-output.json b/data/test/vtexplain/options-output.json deleted file mode 100644 index 923891e624b..00000000000 --- a/data/test/vtexplain/options-output.json +++ /dev/null @@ -1,308 +0,0 @@ -[ - { - "SQL": "select * from user where email='null@void.com'", - "Plans": [ - { - "Original": "select * from user where email='null@void.com'", - "Instructions": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select * from user where email = 'null@void.com'", - "FieldQuery": "select * from user where 1 != 1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where email = 'null@void.com'", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where email = 'null@void.com' limit 10001" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where email = 'null@void.com'", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where email = 'null@void.com' limit 10001" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where email = 'null@void.com'", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where email = 'null@void.com' limit 10001" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where email = 'null@void.com'", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where email = 'null@void.com' limit 10001" - } - ] - } - } - }, - { - "SQL": "select * from user where id in (1,2,3,4,5,6,7,8)", - "Plans": [ - { - "Original": "select * from user where id in (1,2,3,4,5,6,7,8)", - "Instructions": { - "Opcode": "SelectIN", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select * from user where id in ::__vals", - "FieldQuery": "select * from user where 1 != 1", - "Vindex": "hash", - "Values": [ - [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8 - ] - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 3, - "Rows": 3, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where id in ::__vals", - "BindVars": { - "#maxLimit": "10001", - "__vals": "(1, 2)" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where id in (1, 2) limit 10001" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where id in ::__vals", - "BindVars": { - "#maxLimit": "10001", - "__vals": "(3, 5)" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where id in (3, 5) limit 10001" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where id in ::__vals", - "BindVars": { - "#maxLimit": "10001", - "__vals": "(4, 6, 7, 8)" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where id in (4, 6, 7, 8) limit 10001" - } - ] - } - } - }, - { - "SQL": "insert into user (id, name) values(2, 'bob')", - "Plans": [ - { - "Original": "insert into name_user_map(name, user_id) values(:name0, :user_id0)", - "Instructions": { - "Opcode": "InsertSharded", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert into name_user_map(name, user_id) values (:_name0, :user_id0)", - "Values": [ - [ - [ - ":name0" - ] - ] - ], - "Table": "name_user_map", - "Prefix": "insert into name_user_map(name, user_id) values ", - "Mid": [ - "(:_name0, :user_id0)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "insert into user (id, name) values(2, 'bob')", - "Instructions": { - "Opcode": "InsertSharded", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "insert into user(id, name) values (:_id0, :_name0)", - "Values": [ - [ - [ - 2 - ] - ], - [ - [ - "bob" - ] - ] - ], - "Table": "user", - "Prefix": "insert into user(id, name) values ", - "Mid": [ - "(:_id0, :_name0)" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 2, - "SQL": "insert into user(id, name) values (:_id0, :_name0) /* vtgate:: keyspace_id:06e7ea22ce92708f */", - "BindVars": { - "#maxLimit": "10001", - "_id0": "2", - "_name0": "'bob'" - } - } - ], - "MysqlQueries": [ - { - "Time": 2, - "SQL": "begin" - }, - { - "Time": 2, - "SQL": "insert into user(id, name) values (2, 'bob') /* _stream user (id ) (2 ); */ /* vtgate:: keyspace_id:06e7ea22ce92708f */" - }, - { - "Time": 4, - "SQL": "commit" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "insert into name_user_map(name, user_id) values (:_name0, :user_id0) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */", - "BindVars": { - "#maxLimit": "10001", - "_name0": "'bob'", - "name0": "'bob'", - "user_id0": "2" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "insert into name_user_map(name, user_id) values ('bob', 2) /* _stream name_user_map (name user_id ) ('Ym9i' 2 ); */ /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */" - }, - { - "Time": 3, - "SQL": "commit" - } - ] - } - } - } -] diff --git a/data/test/vtexplain/selectsharded-output.json b/data/test/vtexplain/selectsharded-output.json deleted file mode 100644 index 791a0eef402..00000000000 --- a/data/test/vtexplain/selectsharded-output.json +++ /dev/null @@ -1,1132 +0,0 @@ -[ - { - "SQL": "select * from user /* scatter */", - "Plans": [ - { - "Original": "select * from user", - "Instructions": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select * from user", - "FieldQuery": "select * from user where 1 != 1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user /* scatter */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user limit 10001 /* scatter */" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user /* scatter */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user limit 10001 /* scatter */" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user /* scatter */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user limit 10001 /* scatter */" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user /* scatter */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user limit 10001 /* scatter */" - } - ] - } - } - }, - { - "SQL": "select * from user where id = 1 /* equal unique */", - "Plans": [ - { - "Original": "select * from user where id = :vtg1", - "Instructions": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select * from user where id = :vtg1", - "FieldQuery": "select * from user where 1 != 1", - "Vindex": "hash", - "Values": [ - ":vtg1" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where id = :vtg1 /* equal unique */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where id = 1 limit 10001 /* equal unique */" - } - ] - } - } - }, - { - "SQL": "select * from user where id > 100 /* scatter range */", - "Plans": [ - { - "Original": "select * from user where id > :vtg1", - "Instructions": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select * from user where id > :vtg1", - "FieldQuery": "select * from user where 1 != 1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where id > :vtg1 /* scatter range */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "100" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where id > 100 limit 10001 /* scatter range */" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where id > :vtg1 /* scatter range */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "100" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where id > 100 limit 10001 /* scatter range */" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where id > :vtg1 /* scatter range */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "100" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where id > 100 limit 10001 /* scatter range */" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where id > :vtg1 /* scatter range */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "100" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where id > 100 limit 10001 /* scatter range */" - } - ] - } - } - }, - { - "SQL": "select * from user where name = 'bob' /* vindex lookup */", - "Plans": [ - { - "Original": "select user_id from name_user_map where name = :name", - "Instructions": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select user_id from name_user_map where name = :name", - "FieldQuery": "select user_id from name_user_map where 1 != 1", - "Vindex": "md5", - "Values": [ - ":name" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "select * from user where name = :vtg1", - "Instructions": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select * from user where name = :vtg1", - "FieldQuery": "select * from user where 1 != 1", - "Vindex": "name_user_map", - "Values": [ - ":vtg1" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 2, - "SQL": "select * from user where name = :vtg1 /* vindex lookup */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "'bob'" - } - } - ], - "MysqlQueries": [ - { - "Time": 2, - "SQL": "select * from user where name = 'bob' limit 10001 /* vindex lookup */" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select user_id from name_user_map where name = :name /* vindex lookup */", - "BindVars": { - "#maxLimit": "10001", - "name": "'bob'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select user_id from name_user_map where name = 'bob' limit 10001 /* vindex lookup */" - } - ] - } - } - }, - { - "SQL": "select * from user where name = 'bob' or nickname = 'bob' /* vindex lookup */", - "Plans": [ - { - "Original": "select * from user where name = :vtg1 or nickname = :vtg1", - "Instructions": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select * from user where (name = :vtg1 or nickname = :vtg1)", - "FieldQuery": "select * from user where 1 != 1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where (name = :vtg1 or nickname = :vtg1) /* vindex lookup */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "'bob'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where (name = 'bob' or nickname = 'bob') limit 10001 /* vindex lookup */" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where (name = :vtg1 or nickname = :vtg1) /* vindex lookup */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "'bob'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where (name = 'bob' or nickname = 'bob') limit 10001 /* vindex lookup */" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where (name = :vtg1 or nickname = :vtg1) /* vindex lookup */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "'bob'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where (name = 'bob' or nickname = 'bob') limit 10001 /* vindex lookup */" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from user where (name = :vtg1 or nickname = :vtg1) /* vindex lookup */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "'bob'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from user where (name = 'bob' or nickname = 'bob') limit 10001 /* vindex lookup */" - } - ] - } - } - }, - { - "SQL": "select u.id, u.name, u.nickname, n.info from user u join name_info n on u.name = n.name /* join on varchar */", - "Plans": [ - { - "Original": "select u.id, u.name, u.nickname, n.info from user as u join name_info as n on u.name = n.name", - "Instructions": { - "Opcode": "Join", - "Left": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select u.id, u.name, u.nickname from user as u", - "FieldQuery": "select u.id, u.name, u.nickname from user as u where 1 != 1" - }, - "Right": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select n.info from name_info as n where n.name = :u_name", - "FieldQuery": "select n.info from name_info as n where 1 != 1", - "Vindex": "md5", - "Values": [ - ":u_name" - ], - "JoinVars": { - "u_name": {} - } - }, - "Cols": [ - -1, - -2, - -3, - 1 - ], - "Vars": { - "u_name": 1 - } - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 8, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select u.id, u.name, u.nickname from user as u /* join on varchar */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select u.id, u.name, u.nickname from user as u limit 10001 /* join on varchar */" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select u.id, u.name, u.nickname from user as u /* join on varchar */", - "BindVars": { - "#maxLimit": "10001" - } - }, - { - "Time": 2, - "SQL": "select n.info from name_info as n where n.name = :u_name /* join on varchar */", - "BindVars": { - "#maxLimit": "10001", - "u_name": "'name_val_2'" - } - }, - { - "Time": 3, - "SQL": "select n.info from name_info as n where n.name = :u_name /* join on varchar */", - "BindVars": { - "#maxLimit": "10001", - "u_name": "'name_val_2'" - } - }, - { - "Time": 4, - "SQL": "select n.info from name_info as n where n.name = :u_name /* join on varchar */", - "BindVars": { - "#maxLimit": "10001", - "u_name": "'name_val_2'" - } - }, - { - "Time": 5, - "SQL": "select n.info from name_info as n where n.name = :u_name /* join on varchar */", - "BindVars": { - "#maxLimit": "10001", - "u_name": "'name_val_2'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select u.id, u.name, u.nickname from user as u limit 10001 /* join on varchar */" - }, - { - "Time": 2, - "SQL": "select n.info from name_info as n where n.name = 'name_val_2' limit 10001 /* join on varchar */" - }, - { - "Time": 3, - "SQL": "select n.info from name_info as n where n.name = 'name_val_2' limit 10001 /* join on varchar */" - }, - { - "Time": 4, - "SQL": "select n.info from name_info as n where n.name = 'name_val_2' limit 10001 /* join on varchar */" - }, - { - "Time": 5, - "SQL": "select n.info from name_info as n where n.name = 'name_val_2' limit 10001 /* join on varchar */" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select u.id, u.name, u.nickname from user as u /* join on varchar */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select u.id, u.name, u.nickname from user as u limit 10001 /* join on varchar */" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select u.id, u.name, u.nickname from user as u /* join on varchar */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select u.id, u.name, u.nickname from user as u limit 10001 /* join on varchar */" - } - ] - } - } - }, - { - "SQL": "select m.id, m.song, e.extra from music m join music_extra e on m.id = e.id where m.user_id = 100 /* join on int */", - "Plans": [ - { - "Original": "select m.id, m.song, e.extra from music as m join music_extra as e on m.id = e.id where m.user_id = :vtg1", - "Instructions": { - "Opcode": "Join", - "Left": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select m.id, m.song from music as m where m.user_id = :vtg1", - "FieldQuery": "select m.id, m.song from music as m where 1 != 1", - "Vindex": "hash", - "Values": [ - ":vtg1" - ] - }, - "Right": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select e.extra from music_extra as e where e.id = :m_id", - "FieldQuery": "select e.extra from music_extra as e where 1 != 1", - "Vindex": "hash", - "Values": [ - ":m_id" - ], - "JoinVars": { - "m_id": {} - } - }, - "Cols": [ - -1, - -2, - 1 - ], - "Vars": { - "m_id": 0 - } - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 2, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 2, - "SQL": "select e.extra from music_extra as e where e.id = :m_id /* join on int */", - "BindVars": { - "#maxLimit": "10001", - "m_id": "1", - "vtg1": "100" - } - } - ], - "MysqlQueries": [ - { - "Time": 2, - "SQL": "select e.extra from music_extra as e where e.id = 1 limit 10001 /* join on int */" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select m.id, m.song from music as m where m.user_id = :vtg1 /* join on int */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "100" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select m.id, m.song from music as m where m.user_id = 100 limit 10001 /* join on int */" - } - ] - } - } - }, - { - "SQL": "select count(*) from user where id = 1 /* point aggregate */", - "Plans": [ - { - "Original": "select count(*) from user where id = :vtg1", - "Instructions": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select count(*) from user where id = :vtg1", - "FieldQuery": "select count(*) from user where 1 != 1", - "Vindex": "hash", - "Values": [ - ":vtg1" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select count(*) from user where id = :vtg1 /* point aggregate */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select count(*) from user where id = 1 limit 10001 /* point aggregate */" - } - ] - } - } - }, - { - "SQL": "select count(*) from user where name in ('alice','bob') /* scatter aggregate */", - "Plans": [ - { - "Original": "select user_id from name_user_map where name = :name", - "Instructions": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select user_id from name_user_map where name = :name", - "FieldQuery": "select user_id from name_user_map where 1 != 1", - "Vindex": "md5", - "Values": [ - ":name" - ] - }, - "ExecCount": 2, - "ExecTime": 0, - "ShardQueries": 2, - "Rows": 2, - "Errors": 0 - }, - { - "Original": "select count(*) from user where name in ::vtg1", - "Instructions": { - "Aggregates": [ - { - "Opcode": "count", - "Col": 0 - } - ], - "Keys": null, - "Input": { - "Opcode": "SelectIN", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select count(*) from user where name in ::__vals", - "FieldQuery": "select count(*) from user where 1 != 1", - "Vindex": "name_user_map", - "Values": [ - "::vtg1" - ] - } - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 3, - "SQL": "select count(*) from user where name in ::__vals /* scatter aggregate */", - "BindVars": { - "#maxLimit": "10001", - "__vals": "('alice', 'bob')", - "vtg1": "('alice', 'bob')" - } - } - ], - "MysqlQueries": [ - { - "Time": 3, - "SQL": "select count(*) from user where name in ('alice', 'bob') limit 10001 /* scatter aggregate */" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select user_id from name_user_map where name = :name /* scatter aggregate */", - "BindVars": { - "#maxLimit": "10001", - "name": "'alice'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select user_id from name_user_map where name = 'alice' limit 10001 /* scatter aggregate */" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 2, - "SQL": "select user_id from name_user_map where name = :name /* scatter aggregate */", - "BindVars": { - "#maxLimit": "10001", - "name": "'bob'" - } - } - ], - "MysqlQueries": [ - { - "Time": 2, - "SQL": "select user_id from name_user_map where name = 'bob' limit 10001 /* scatter aggregate */" - } - ] - } - } - }, - { - "SQL": "select name, count(*) from user group by name /* scatter aggregate */", - "Plans": [ - { - "Original": "select name, count(*) from user group by name", - "Instructions": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select name, count(*) from user group by name", - "FieldQuery": "select name, count(*) from user where 1 != 1 group by name" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select name, count(*) from user group by name /* scatter aggregate */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select name, count(*) from user group by name limit 10001 /* scatter aggregate */" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select name, count(*) from user group by name /* scatter aggregate */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select name, count(*) from user group by name limit 10001 /* scatter aggregate */" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select name, count(*) from user group by name /* scatter aggregate */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select name, count(*) from user group by name limit 10001 /* scatter aggregate */" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select name, count(*) from user group by name /* scatter aggregate */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select name, count(*) from user group by name limit 10001 /* scatter aggregate */" - } - ] - } - } - }, - { - "SQL": "select 1, \"hello\", 3.14 from user limit 10 /* select constant sql values */", - "Plans": [ - { - "Original": "select :vtg1, :vtg2, :vtg3 from user limit :vtg4", - "Instructions": { - "Opcode": "Limit", - "Count": ":vtg4", - "Input": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select :vtg1, :vtg2, :vtg3 from user limit :vtg4", - "FieldQuery": "select :vtg1, :vtg2, :vtg3 from user where 1 != 1" - } - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 4, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1, :vtg2, :vtg3 from user limit :vtg4 /* select constant sql values */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'hello'", - "vtg3": "3.14", - "vtg4": "10" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1, 'hello', 3.14 from user limit 10 /* select constant sql values */" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1, :vtg2, :vtg3 from user limit :vtg4 /* select constant sql values */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'hello'", - "vtg3": "3.14", - "vtg4": "10" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1, 'hello', 3.14 from user limit 10 /* select constant sql values */" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1, :vtg2, :vtg3 from user limit :vtg4 /* select constant sql values */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'hello'", - "vtg3": "3.14", - "vtg4": "10" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1, 'hello', 3.14 from user limit 10 /* select constant sql values */" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select :vtg1, :vtg2, :vtg3 from user limit :vtg4 /* select constant sql values */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "'hello'", - "vtg3": "3.14", - "vtg4": "10" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select 1, 'hello', 3.14 from user limit 10 /* select constant sql values */" - } - ] - } - } - }, - { - "SQL": "select * from (select id from user) s /* scatter paren select */", - "Plans": [ - { - "Original": "select * from (select id from user) as s", - "Instructions": { - "Opcode": "SelectScatter", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select * from (select id from user) as s", - "FieldQuery": "select * from (select id from user where 1 != 1) as s where 1 != 1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 4, - "Rows": 0, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from (select id from user) as s /* scatter paren select */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from (select id from user) as s limit 10001 /* scatter paren select */" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from (select id from user) as s /* scatter paren select */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from (select id from user) as s limit 10001 /* scatter paren select */" - } - ] - }, - "ks_sharded/80-c0": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from (select id from user) as s /* scatter paren select */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from (select id from user) as s limit 10001 /* scatter paren select */" - } - ] - }, - "ks_sharded/c0-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from (select id from user) as s /* scatter paren select */", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from (select id from user) as s limit 10001 /* scatter paren select */" - } - ] - } - } - } -] diff --git a/data/test/vtexplain/twopc-output/comments-output.txt b/data/test/vtexplain/twopc-output/comments-output.txt new file mode 100644 index 00000000000..922dec1543a --- /dev/null +++ b/data/test/vtexplain/twopc-output/comments-output.txt @@ -0,0 +1,41 @@ +---------------------------------------------------------------------- +SELECT * from user + +1 ks_sharded/-40: select * from user limit 10001 +1 ks_sharded/40-80: select * from user limit 10001 +1 ks_sharded/80-c0: select * from user limit 10001 +1 ks_sharded/c0-: select * from user limit 10001 + +---------------------------------------------------------------------- +select /* ; */ 1 from user + +1 ks_sharded/-40: select /* ; */ 1 from user limit 10001 +1 ks_sharded/40-80: select /* ; */ 1 from user limit 10001 +1 ks_sharded/80-c0: select /* ; */ 1 from user limit 10001 +1 ks_sharded/c0-: select /* ; */ 1 from user limit 10001 + +---------------------------------------------------------------------- +select 1 from user where x=';' + +1 ks_sharded/-40: select 1 from user where x = ';' limit 10001 +1 ks_sharded/40-80: select 1 from user where x = ';' limit 10001 +1 ks_sharded/80-c0: select 1 from user where x = ';' limit 10001 +1 ks_sharded/c0-: select 1 from user where x = ';' limit 10001 + +---------------------------------------------------------------------- +select 1 from user where x='/* hello */' + +1 ks_sharded/-40: select 1 from user where x = '/* hello */' limit 10001 +1 ks_sharded/40-80: select 1 from user where x = '/* hello */' limit 10001 +1 ks_sharded/80-c0: select 1 from user where x = '/* hello */' limit 10001 +1 ks_sharded/c0-: select 1 from user where x = '/* hello */' limit 10001 + +---------------------------------------------------------------------- +select 1 from user where x='/* ; */' + +1 ks_sharded/-40: select 1 from user where x = '/* ; */' limit 10001 +1 ks_sharded/40-80: select 1 from user where x = '/* ; */' limit 10001 +1 ks_sharded/80-c0: select 1 from user where x = '/* ; */' limit 10001 +1 ks_sharded/c0-: select 1 from user where x = '/* ; */' limit 10001 + +---------------------------------------------------------------------- diff --git a/data/test/vtexplain/twopc-output/deletesharded-output.txt b/data/test/vtexplain/twopc-output/deletesharded-output.txt new file mode 100644 index 00000000000..9270d59f3ac --- /dev/null +++ b/data/test/vtexplain/twopc-output/deletesharded-output.txt @@ -0,0 +1,78 @@ +---------------------------------------------------------------------- +delete from music_extra where id=1 + +1 ks_sharded/-40: begin +1 ks_sharded/-40: delete from music_extra where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +2 ks_sharded/-40: commit + +---------------------------------------------------------------------- +delete from music_extra where id=1 and extra='abc' + +1 ks_sharded/-40: begin +1 ks_sharded/-40: select id from music_extra where id = 1 and extra = 'abc' limit 10001 for update /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +1 ks_sharded/-40: delete from music_extra where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +2 ks_sharded/-40: commit + +---------------------------------------------------------------------- +delete from user where id=1 + +1 ks_sharded/-40: begin +1 ks_sharded/-40: select name from user where id = 1 limit 10001 for update +2 ks_sharded/80-c0: begin +2 ks_sharded/80-c0: delete from name_user_map where (name = 'name_val_1' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */ +3 ks_sharded/-40: delete from user where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +4 ks_sharded/-40: begin +4 ks_sharded/-40: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:-40:1515392388787015722', 1, 1515392388898391433) +4 ks_sharded/-40: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:-40:1515392388787015722', 1, 'ks_sharded', '80-c0') +4 ks_sharded/-40: commit +5 ks_sharded/80-c0: begin +5 ks_sharded/80-c0: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:-40:1515392388787015722', 1, 1515392388909259045) +5 ks_sharded/80-c0: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:-40:1515392388787015722', 1, 'delete from name_user_map where (name = \'name_val_1\' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */') +5 ks_sharded/80-c0: commit +6 ks_sharded/-40: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:-40:1515392388787015722' and state = 1 +6 ks_sharded/-40: commit +7 ks_sharded/80-c0: delete from `_vt`.redo_state where dtid = 'ks_sharded:-40:1515392388787015722' +7 ks_sharded/80-c0: delete from `_vt`.redo_statement where dtid = 'ks_sharded:-40:1515392388787015722' +7 ks_sharded/80-c0: commit +8 ks_sharded/-40: begin +8 ks_sharded/-40: delete from `_vt`.dt_state where dtid = 'ks_sharded:-40:1515392388787015722' +8 ks_sharded/-40: delete from `_vt`.dt_participant where dtid = 'ks_sharded:-40:1515392388787015722' +8 ks_sharded/-40: commit + +---------------------------------------------------------------------- +delete from user where name='billy' + +1 ks_sharded/c0-: begin +1 ks_sharded/c0-: select user_id from name_user_map where name = 'billy' limit 10001 +2 ks_sharded/-40: begin +2 ks_sharded/-40: select name from user where name = 'billy' limit 10001 for update +3 ks_sharded/80-c0: begin +3 ks_sharded/80-c0: delete from name_user_map where (name = 'name_val_1' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */ +4 ks_sharded/-40: select id from user where name = 'billy' limit 10001 for update /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +4 ks_sharded/-40: delete from user where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +5 ks_sharded/c0-: begin +5 ks_sharded/c0-: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392388798209886', 1, 1515392389009197532) +5 ks_sharded/c0-: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:c0-:1515392388798209886', 1, 'ks_sharded', '-40'), ('ks_sharded:c0-:1515392388798209886', 2, 'ks_sharded', '80-c0') +5 ks_sharded/c0-: commit +6 ks_sharded/-40: begin +6 ks_sharded/-40: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392388798209886', 1, 1515392389021902468) +6 ks_sharded/-40: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:c0-:1515392388798209886', 1, 'delete from user where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */') +6 ks_sharded/-40: commit +6 ks_sharded/80-c0: begin +6 ks_sharded/80-c0: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392388798209886', 1, 1515392389021902697) +6 ks_sharded/80-c0: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:c0-:1515392388798209886', 1, 'delete from name_user_map where (name = \'name_val_1\' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */') +6 ks_sharded/80-c0: commit +7 ks_sharded/c0-: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:c0-:1515392388798209886' and state = 1 +7 ks_sharded/c0-: commit +8 ks_sharded/-40: delete from `_vt`.redo_state where dtid = 'ks_sharded:c0-:1515392388798209886' +8 ks_sharded/-40: delete from `_vt`.redo_statement where dtid = 'ks_sharded:c0-:1515392388798209886' +8 ks_sharded/-40: commit +8 ks_sharded/80-c0: delete from `_vt`.redo_state where dtid = 'ks_sharded:c0-:1515392388798209886' +8 ks_sharded/80-c0: delete from `_vt`.redo_statement where dtid = 'ks_sharded:c0-:1515392388798209886' +8 ks_sharded/80-c0: commit +9 ks_sharded/c0-: begin +9 ks_sharded/c0-: delete from `_vt`.dt_state where dtid = 'ks_sharded:c0-:1515392388798209886' +9 ks_sharded/c0-: delete from `_vt`.dt_participant where dtid = 'ks_sharded:c0-:1515392388798209886' +9 ks_sharded/c0-: commit + +---------------------------------------------------------------------- diff --git a/data/test/vtexplain/twopc-output/insertsharded-output.txt b/data/test/vtexplain/twopc-output/insertsharded-output.txt new file mode 100644 index 00000000000..79e5cec378c --- /dev/null +++ b/data/test/vtexplain/twopc-output/insertsharded-output.txt @@ -0,0 +1,159 @@ +---------------------------------------------------------------------- +insert into user (id, name) values(1, 'alice') + +1 ks_sharded/40-80: begin +1 ks_sharded/40-80: insert into name_user_map(name, user_id) values ('alice', 1) /* vtgate:: keyspace_id:475e26c086f437f36bd72ecd883504a7 */ +2 ks_sharded/-40: begin +2 ks_sharded/-40: insert into user(id, name) values (1, 'alice') /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +3 ks_sharded/40-80: begin +3 ks_sharded/40-80: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:40-80:1515392387046738470', 1, 1515392387090538997) +3 ks_sharded/40-80: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:40-80:1515392387046738470', 1, 'ks_sharded', '-40') +3 ks_sharded/40-80: commit +4 ks_sharded/-40: begin +4 ks_sharded/-40: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:40-80:1515392387046738470', 1, 1515392387101086738) +4 ks_sharded/-40: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:40-80:1515392387046738470', 1, 'insert into user(id, name) values (1, \'alice\') /* vtgate:: keyspace_id:166b40b44aba4bd6 */') +4 ks_sharded/-40: commit +5 ks_sharded/40-80: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:40-80:1515392387046738470' and state = 1 +5 ks_sharded/40-80: commit +6 ks_sharded/-40: delete from `_vt`.redo_state where dtid = 'ks_sharded:40-80:1515392387046738470' +6 ks_sharded/-40: delete from `_vt`.redo_statement where dtid = 'ks_sharded:40-80:1515392387046738470' +6 ks_sharded/-40: commit +7 ks_sharded/40-80: begin +7 ks_sharded/40-80: delete from `_vt`.dt_state where dtid = 'ks_sharded:40-80:1515392387046738470' +7 ks_sharded/40-80: delete from `_vt`.dt_participant where dtid = 'ks_sharded:40-80:1515392387046738470' +7 ks_sharded/40-80: commit + +---------------------------------------------------------------------- +insert into user (id, name) values(2, 'bob') + +1 ks_sharded/c0-: begin +1 ks_sharded/c0-: insert into name_user_map(name, user_id) values ('bob', 2) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */ +2 ks_sharded/-40: begin +2 ks_sharded/-40: insert into user(id, name) values (2, 'bob') /* vtgate:: keyspace_id:06e7ea22ce92708f */ +3 ks_sharded/c0-: begin +3 ks_sharded/c0-: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392387053859424', 1, 1515392387171740872) +3 ks_sharded/c0-: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:c0-:1515392387053859424', 1, 'ks_sharded', '-40') +3 ks_sharded/c0-: commit +4 ks_sharded/-40: begin +4 ks_sharded/-40: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392387053859424', 1, 1515392387182475610) +4 ks_sharded/-40: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:c0-:1515392387053859424', 1, 'insert into user(id, name) values (2, \'bob\') /* vtgate:: keyspace_id:06e7ea22ce92708f */') +4 ks_sharded/-40: commit +5 ks_sharded/c0-: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:c0-:1515392387053859424' and state = 1 +5 ks_sharded/c0-: commit +6 ks_sharded/-40: delete from `_vt`.redo_state where dtid = 'ks_sharded:c0-:1515392387053859424' +6 ks_sharded/-40: delete from `_vt`.redo_statement where dtid = 'ks_sharded:c0-:1515392387053859424' +6 ks_sharded/-40: commit +7 ks_sharded/c0-: begin +7 ks_sharded/c0-: delete from `_vt`.dt_state where dtid = 'ks_sharded:c0-:1515392387053859424' +7 ks_sharded/c0-: delete from `_vt`.dt_participant where dtid = 'ks_sharded:c0-:1515392387053859424' +7 ks_sharded/c0-: commit + +---------------------------------------------------------------------- +insert ignore into user (id, name) values(2, 'bob') + +1 ks_sharded/c0-: begin +1 ks_sharded/c0-: insert ignore into name_user_map(name, user_id) values ('bob', 2) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */ +2 ks_sharded/c0-: select name from name_user_map where name = 'bob' and user_id = 2 limit 10001 +3 ks_sharded/-40: begin +3 ks_sharded/-40: insert ignore into user(id, name) values (2, 'bob') /* vtgate:: keyspace_id:06e7ea22ce92708f */ +4 ks_sharded/c0-: begin +4 ks_sharded/c0-: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392387053859427', 1, 1515392387263209422) +4 ks_sharded/c0-: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:c0-:1515392387053859427', 1, 'ks_sharded', '-40') +4 ks_sharded/c0-: commit +5 ks_sharded/-40: begin +5 ks_sharded/-40: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392387053859427', 1, 1515392387274980027) +5 ks_sharded/-40: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:c0-:1515392387053859427', 1, 'insert ignore into user(id, name) values (2, \'bob\') /* vtgate:: keyspace_id:06e7ea22ce92708f */') +5 ks_sharded/-40: commit +6 ks_sharded/c0-: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:c0-:1515392387053859427' and state = 1 +6 ks_sharded/c0-: commit +7 ks_sharded/-40: delete from `_vt`.redo_state where dtid = 'ks_sharded:c0-:1515392387053859427' +7 ks_sharded/-40: delete from `_vt`.redo_statement where dtid = 'ks_sharded:c0-:1515392387053859427' +7 ks_sharded/-40: commit +8 ks_sharded/c0-: begin +8 ks_sharded/c0-: delete from `_vt`.dt_state where dtid = 'ks_sharded:c0-:1515392387053859427' +8 ks_sharded/c0-: delete from `_vt`.dt_participant where dtid = 'ks_sharded:c0-:1515392387053859427' +8 ks_sharded/c0-: commit + +---------------------------------------------------------------------- +insert ignore into user (id, name, nickname) values(2, 'bob', 'bob') + +1 ks_sharded/c0-: begin +1 ks_sharded/c0-: insert ignore into name_user_map(name, user_id) values ('bob', 2) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */ +2 ks_sharded/c0-: select name from name_user_map where name = 'bob' and user_id = 2 limit 10001 +3 ks_sharded/-40: begin +3 ks_sharded/-40: insert ignore into user(id, name, nickname) values (2, 'bob', 'bob') /* vtgate:: keyspace_id:06e7ea22ce92708f */ +4 ks_sharded/c0-: begin +4 ks_sharded/c0-: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392387053859430', 1, 1515392387360777113) +4 ks_sharded/c0-: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:c0-:1515392387053859430', 1, 'ks_sharded', '-40') +4 ks_sharded/c0-: commit +5 ks_sharded/-40: begin +5 ks_sharded/-40: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392387053859430', 1, 1515392387372890757) +5 ks_sharded/-40: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:c0-:1515392387053859430', 1, 'insert ignore into user(id, name, nickname) values (2, \'bob\', \'bob\') /* vtgate:: keyspace_id:06e7ea22ce92708f */') +5 ks_sharded/-40: commit +6 ks_sharded/c0-: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:c0-:1515392387053859430' and state = 1 +6 ks_sharded/c0-: commit +7 ks_sharded/-40: delete from `_vt`.redo_state where dtid = 'ks_sharded:c0-:1515392387053859430' +7 ks_sharded/-40: delete from `_vt`.redo_statement where dtid = 'ks_sharded:c0-:1515392387053859430' +7 ks_sharded/-40: commit +8 ks_sharded/c0-: begin +8 ks_sharded/c0-: delete from `_vt`.dt_state where dtid = 'ks_sharded:c0-:1515392387053859430' +8 ks_sharded/c0-: delete from `_vt`.dt_participant where dtid = 'ks_sharded:c0-:1515392387053859430' +8 ks_sharded/c0-: commit + +---------------------------------------------------------------------- +insert into user (id, name, nickname) values(2, 'bob', 'bobby') on duplicate key update nickname='bobby' + +1 ks_sharded/c0-: begin +1 ks_sharded/c0-: insert ignore into name_user_map(name, user_id) values ('bob', 2) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */ +2 ks_sharded/c0-: select name from name_user_map where name = 'bob' and user_id = 2 limit 10001 +3 ks_sharded/-40: begin +3 ks_sharded/-40: insert into user(id, name, nickname) values (2, 'bob', 'bobby') on duplicate key update nickname = 'bobby' /* vtgate:: keyspace_id:06e7ea22ce92708f */ +4 ks_sharded/c0-: begin +4 ks_sharded/c0-: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392387053859433', 1, 1515392387454561857) +4 ks_sharded/c0-: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:c0-:1515392387053859433', 1, 'ks_sharded', '-40') +4 ks_sharded/c0-: commit +5 ks_sharded/-40: begin +5 ks_sharded/-40: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392387053859433', 1, 1515392387467658995) +5 ks_sharded/-40: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:c0-:1515392387053859433', 1, 'insert into user(id, name, nickname) values (2, \'bob\', \'bobby\') on duplicate key update nickname = \'bobby\' /* vtgate:: keyspace_id:06e7ea22ce92708f */') +5 ks_sharded/-40: commit +6 ks_sharded/c0-: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:c0-:1515392387053859433' and state = 1 +6 ks_sharded/c0-: commit +7 ks_sharded/-40: delete from `_vt`.redo_state where dtid = 'ks_sharded:c0-:1515392387053859433' +7 ks_sharded/-40: delete from `_vt`.redo_statement where dtid = 'ks_sharded:c0-:1515392387053859433' +7 ks_sharded/-40: commit +8 ks_sharded/c0-: begin +8 ks_sharded/c0-: delete from `_vt`.dt_state where dtid = 'ks_sharded:c0-:1515392387053859433' +8 ks_sharded/c0-: delete from `_vt`.dt_participant where dtid = 'ks_sharded:c0-:1515392387053859433' +8 ks_sharded/c0-: commit + +---------------------------------------------------------------------- +insert into user (id, name, nickname, address) values(2, 'bob', 'bobby', '123 main st') on duplicate key update nickname=values(nickname), address=values(address) + +1 ks_sharded/c0-: begin +1 ks_sharded/c0-: insert ignore into name_user_map(name, user_id) values ('bob', 2) /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */ +2 ks_sharded/c0-: select name from name_user_map where name = 'bob' and user_id = 2 limit 10001 +3 ks_sharded/-40: begin +3 ks_sharded/-40: insert into user(id, name, nickname, address) values (2, 'bob', 'bobby', '123 main st') on duplicate key update nickname = values(nickname), address = values(address) /* vtgate:: keyspace_id:06e7ea22ce92708f */ +3 ks_sharded/-40: select count(*) from `_vt`.redo_state where time_created < 1515392382546684649 +3 ks_sharded/-40: select dtid, time_created from `_vt`.dt_state where time_created < 1515392386546990720 +4 ks_sharded/c0-: begin +4 ks_sharded/c0-: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392387053859436', 1, 1515392387549507151) +4 ks_sharded/c0-: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:c0-:1515392387053859436', 1, 'ks_sharded', '-40') +4 ks_sharded/c0-: commit +4 ks_sharded/c0-: select count(*) from `_vt`.redo_state where time_created < 1515392382555938983 +4 ks_sharded/c0-: select dtid, time_created from `_vt`.dt_state where time_created < 1515392386556481105 +5 ks_sharded/-40: begin +5 ks_sharded/-40: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392387053859436', 1, 1515392387561241013) +5 ks_sharded/-40: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:c0-:1515392387053859436', 1, 'insert into user(id, name, nickname, address) values (2, \'bob\', \'bobby\', \'123 main st\') on duplicate key update nickname = values(nickname), address = values(address) /* vtgate:: keyspace_id:06e7ea22ce92708f */') +5 ks_sharded/-40: commit +6 ks_sharded/c0-: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:c0-:1515392387053859436' and state = 1 +6 ks_sharded/c0-: commit +7 ks_sharded/-40: delete from `_vt`.redo_state where dtid = 'ks_sharded:c0-:1515392387053859436' +7 ks_sharded/-40: delete from `_vt`.redo_statement where dtid = 'ks_sharded:c0-:1515392387053859436' +7 ks_sharded/-40: commit +8 ks_sharded/c0-: begin +8 ks_sharded/c0-: delete from `_vt`.dt_state where dtid = 'ks_sharded:c0-:1515392387053859436' +8 ks_sharded/c0-: delete from `_vt`.dt_participant where dtid = 'ks_sharded:c0-:1515392387053859436' +8 ks_sharded/c0-: commit + +---------------------------------------------------------------------- diff --git a/data/test/vtexplain/twopc-output/options-output.txt b/data/test/vtexplain/twopc-output/options-output.txt new file mode 100644 index 00000000000..b5c914b3df6 --- /dev/null +++ b/data/test/vtexplain/twopc-output/options-output.txt @@ -0,0 +1,41 @@ +---------------------------------------------------------------------- +select * from user where email='null@void.com' + +1 ks_sharded/-40: select * from user where email = 'null@void.com' limit 10001 +1 ks_sharded/40-80: select * from user where email = 'null@void.com' limit 10001 +1 ks_sharded/80-c0: select * from user where email = 'null@void.com' limit 10001 +1 ks_sharded/c0-: select * from user where email = 'null@void.com' limit 10001 + +---------------------------------------------------------------------- +select * from user where id in (1,2,3,4,5,6,7,8) + +1 ks_sharded/-40: select * from user where id in (1, 2) limit 10001 +1 ks_sharded/40-80: select * from user where id in (3, 5) limit 10001 +1 ks_sharded/c0-: select * from user where id in (4, 6, 7, 8) limit 10001 + +---------------------------------------------------------------------- +insert into user (id, name) values(2, 'bob') + +1 ks_sharded/c0-: begin +1 ks_sharded/c0-: insert into name_user_map(name, user_id) values ('bob', 2) /* _stream name_user_map (name user_id ) ('Ym9i' 2 ); */ /* vtgate:: keyspace_id:da8a82595aa28154c17717955ffeed8b */ +2 ks_sharded/-40: begin +2 ks_sharded/-40: insert into user(id, name) values (2, 'bob') /* _stream user (id ) (2 ); */ /* vtgate:: keyspace_id:06e7ea22ce92708f */ +3 ks_sharded/c0-: begin +3 ks_sharded/c0-: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392389222930664', 1, 1515392389285958816) +3 ks_sharded/c0-: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:c0-:1515392389222930664', 1, 'ks_sharded', '-40') +3 ks_sharded/c0-: commit +4 ks_sharded/-40: begin +4 ks_sharded/-40: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:c0-:1515392389222930664', 1, 1515392389297064830) +4 ks_sharded/-40: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:c0-:1515392389222930664', 1, 'insert into user(id, name) values (2, \'bob\') /* _stream user (id ) (2 ); */ /* vtgate:: keyspace_id:06e7ea22ce92708f */') +4 ks_sharded/-40: commit +5 ks_sharded/c0-: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:c0-:1515392389222930664' and state = 1 +5 ks_sharded/c0-: commit +6 ks_sharded/-40: delete from `_vt`.redo_state where dtid = 'ks_sharded:c0-:1515392389222930664' +6 ks_sharded/-40: delete from `_vt`.redo_statement where dtid = 'ks_sharded:c0-:1515392389222930664' +6 ks_sharded/-40: commit +7 ks_sharded/c0-: begin +7 ks_sharded/c0-: delete from `_vt`.dt_state where dtid = 'ks_sharded:c0-:1515392389222930664' +7 ks_sharded/c0-: delete from `_vt`.dt_participant where dtid = 'ks_sharded:c0-:1515392389222930664' +7 ks_sharded/c0-: commit + +---------------------------------------------------------------------- diff --git a/data/test/vtexplain/twopc-output/selectsharded-output.txt b/data/test/vtexplain/twopc-output/selectsharded-output.txt new file mode 100644 index 00000000000..cbbeff52f70 --- /dev/null +++ b/data/test/vtexplain/twopc-output/selectsharded-output.txt @@ -0,0 +1,90 @@ +---------------------------------------------------------------------- +select * from user /* scatter */ + +1 ks_sharded/-40: select * from user limit 10001 /* scatter */ +1 ks_sharded/40-80: select * from user limit 10001 /* scatter */ +1 ks_sharded/80-c0: select * from user limit 10001 /* scatter */ +1 ks_sharded/c0-: select * from user limit 10001 /* scatter */ + +---------------------------------------------------------------------- +select * from user where id = 1 /* equal unique */ + +1 ks_sharded/-40: select * from user where id = 1 limit 10001 /* equal unique */ + +---------------------------------------------------------------------- +select * from user where id > 100 /* scatter range */ + +1 ks_sharded/-40: select * from user where id > 100 limit 10001 /* scatter range */ +1 ks_sharded/40-80: select * from user where id > 100 limit 10001 /* scatter range */ +1 ks_sharded/80-c0: select * from user where id > 100 limit 10001 /* scatter range */ +1 ks_sharded/c0-: select * from user where id > 100 limit 10001 /* scatter range */ + +---------------------------------------------------------------------- +select * from user where name = 'bob' /* vindex lookup */ + +1 ks_sharded/c0-: select user_id from name_user_map where name = 'bob' limit 10001 /* vindex lookup */ +2 ks_sharded/-40: select * from user where name = 'bob' limit 10001 /* vindex lookup */ + +---------------------------------------------------------------------- +select * from user where name = 'bob' or nickname = 'bob' /* vindex lookup */ + +1 ks_sharded/-40: select * from user where (name = 'bob' or nickname = 'bob') limit 10001 /* vindex lookup */ +1 ks_sharded/40-80: select * from user where (name = 'bob' or nickname = 'bob') limit 10001 /* vindex lookup */ +1 ks_sharded/80-c0: select * from user where (name = 'bob' or nickname = 'bob') limit 10001 /* vindex lookup */ +1 ks_sharded/c0-: select * from user where (name = 'bob' or nickname = 'bob') limit 10001 /* vindex lookup */ + +---------------------------------------------------------------------- +select u.id, u.name, u.nickname, n.info from user u join name_info n on u.name = n.name /* join on varchar */ + +1 ks_sharded/-40: select u.id, u.name, u.nickname from user as u limit 10001 /* join on varchar */ +1 ks_sharded/40-80: select u.id, u.name, u.nickname from user as u limit 10001 /* join on varchar */ +1 ks_sharded/80-c0: select u.id, u.name, u.nickname from user as u limit 10001 /* join on varchar */ +1 ks_sharded/c0-: select u.id, u.name, u.nickname from user as u limit 10001 /* join on varchar */ +2 ks_sharded/40-80: select n.info from name_info as n where n.name = 'name_val_2' limit 10001 /* join on varchar */ +3 ks_sharded/40-80: select n.info from name_info as n where n.name = 'name_val_2' limit 10001 /* join on varchar */ +4 ks_sharded/40-80: select n.info from name_info as n where n.name = 'name_val_2' limit 10001 /* join on varchar */ +5 ks_sharded/40-80: select n.info from name_info as n where n.name = 'name_val_2' limit 10001 /* join on varchar */ + +---------------------------------------------------------------------- +select m.id, m.song, e.extra from music m join music_extra e on m.id = e.id where m.user_id = 100 /* join on int */ + +1 ks_sharded/80-c0: select m.id, m.song from music as m where m.user_id = 100 limit 10001 /* join on int */ +2 ks_sharded/-40: select e.extra from music_extra as e where e.id = 1 limit 10001 /* join on int */ + +---------------------------------------------------------------------- +select count(*) from user where id = 1 /* point aggregate */ + +1 ks_sharded/-40: select count(*) from user where id = 1 limit 10001 /* point aggregate */ + +---------------------------------------------------------------------- +select count(*) from user where name in ('alice','bob') /* scatter aggregate */ + +1 ks_sharded/40-80: select user_id from name_user_map where name = 'alice' limit 10001 /* scatter aggregate */ +2 ks_sharded/c0-: select user_id from name_user_map where name = 'bob' limit 10001 /* scatter aggregate */ +3 ks_sharded/-40: select count(*) from user where name in ('alice', 'bob') limit 10001 /* scatter aggregate */ + +---------------------------------------------------------------------- +select name, count(*) from user group by name /* scatter aggregate */ + +1 ks_sharded/-40: select name, count(*) from user group by name limit 10001 /* scatter aggregate */ +1 ks_sharded/40-80: select name, count(*) from user group by name limit 10001 /* scatter aggregate */ +1 ks_sharded/80-c0: select name, count(*) from user group by name limit 10001 /* scatter aggregate */ +1 ks_sharded/c0-: select name, count(*) from user group by name limit 10001 /* scatter aggregate */ + +---------------------------------------------------------------------- +select 1, "hello", 3.14 from user limit 10 /* select constant sql values */ + +1 ks_sharded/-40: select 1, 'hello', 3.14 from user limit 10 /* select constant sql values */ +1 ks_sharded/40-80: select 1, 'hello', 3.14 from user limit 10 /* select constant sql values */ +1 ks_sharded/80-c0: select 1, 'hello', 3.14 from user limit 10 /* select constant sql values */ +1 ks_sharded/c0-: select 1, 'hello', 3.14 from user limit 10 /* select constant sql values */ + +---------------------------------------------------------------------- +select * from (select id from user) s /* scatter paren select */ + +1 ks_sharded/-40: select * from (select id from user) as s limit 10001 /* scatter paren select */ +1 ks_sharded/40-80: select * from (select id from user) as s limit 10001 /* scatter paren select */ +1 ks_sharded/80-c0: select * from (select id from user) as s limit 10001 /* scatter paren select */ +1 ks_sharded/c0-: select * from (select id from user) as s limit 10001 /* scatter paren select */ + +---------------------------------------------------------------------- diff --git a/data/test/vtexplain/twopc-output/unsharded-output.txt b/data/test/vtexplain/twopc-output/unsharded-output.txt new file mode 100644 index 00000000000..4b6af782c14 --- /dev/null +++ b/data/test/vtexplain/twopc-output/unsharded-output.txt @@ -0,0 +1,43 @@ +---------------------------------------------------------------------- +select * from t1 + +1 ks_unsharded/-: select * from t1 limit 10001 + +---------------------------------------------------------------------- +insert into t1 (id,intval,floatval) values (1,2,3.14) + +1 ks_unsharded/-: begin +1 ks_unsharded/-: insert into t1(id, intval, floatval) values (1, 2, 3.14) +2 ks_unsharded/-: commit + +---------------------------------------------------------------------- +update t1 set intval = 10 + +1 ks_unsharded/-: begin +1 ks_unsharded/-: select id from t1 limit 10001 for update +1 ks_unsharded/-: update t1 set intval = 10 where id in (1) +2 ks_unsharded/-: commit + +---------------------------------------------------------------------- +update t1 set floatval = 9.99 + +1 ks_unsharded/-: begin +1 ks_unsharded/-: select id from t1 limit 10001 for update +1 ks_unsharded/-: update t1 set floatval = 9.99 where id in (1) +2 ks_unsharded/-: commit + +---------------------------------------------------------------------- +delete from t1 where id = 100 + +1 ks_unsharded/-: begin +1 ks_unsharded/-: delete from t1 where id in (100) +2 ks_unsharded/-: commit + +---------------------------------------------------------------------- +insert into t1 (id,intval,floatval) values (1,2,3.14) on duplicate key update intval=3, floatval=3.14 + +1 ks_unsharded/-: begin +1 ks_unsharded/-: insert into t1(id, intval, floatval) values (1, 2, 3.14) on duplicate key update intval = 3, floatval = 3.14 +2 ks_unsharded/-: commit + +---------------------------------------------------------------------- diff --git a/data/test/vtexplain/twopc-output/updatesharded-output.txt b/data/test/vtexplain/twopc-output/updatesharded-output.txt new file mode 100644 index 00000000000..e5b3a9f8b59 --- /dev/null +++ b/data/test/vtexplain/twopc-output/updatesharded-output.txt @@ -0,0 +1,121 @@ +---------------------------------------------------------------------- +update user set nickname='alice' where id=1 + +1 ks_sharded/-40: begin +1 ks_sharded/-40: update user set nickname = 'alice' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +2 ks_sharded/-40: commit + +---------------------------------------------------------------------- +update user set nickname='alice' where name='alice' + +1 ks_sharded/40-80: begin +1 ks_sharded/40-80: select user_id from name_user_map where name = 'alice' limit 10001 +2 ks_sharded/-40: begin +2 ks_sharded/-40: select id from user where name = 'alice' limit 10001 for update /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +2 ks_sharded/-40: update user set nickname = 'alice' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +3 ks_sharded/40-80: begin +3 ks_sharded/40-80: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:40-80:1515392388086929116', 1, 1515392388148775408) +3 ks_sharded/40-80: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:40-80:1515392388086929116', 1, 'ks_sharded', '-40') +3 ks_sharded/40-80: commit +4 ks_sharded/-40: begin +4 ks_sharded/-40: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:40-80:1515392388086929116', 1, 1515392388159901825) +4 ks_sharded/-40: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:40-80:1515392388086929116', 1, 'update user set nickname = \'alice\' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */') +4 ks_sharded/-40: commit +5 ks_sharded/40-80: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:40-80:1515392388086929116' and state = 1 +5 ks_sharded/40-80: commit +6 ks_sharded/-40: delete from `_vt`.redo_state where dtid = 'ks_sharded:40-80:1515392388086929116' +6 ks_sharded/-40: delete from `_vt`.redo_statement where dtid = 'ks_sharded:40-80:1515392388086929116' +6 ks_sharded/-40: commit +7 ks_sharded/40-80: begin +7 ks_sharded/40-80: delete from `_vt`.dt_state where dtid = 'ks_sharded:40-80:1515392388086929116' +7 ks_sharded/40-80: delete from `_vt`.dt_participant where dtid = 'ks_sharded:40-80:1515392388086929116' +7 ks_sharded/40-80: commit + +---------------------------------------------------------------------- +update user set pet='fido' where id=1 + +1 ks_sharded/-40: begin +1 ks_sharded/-40: update user set pet = 'fido' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +2 ks_sharded/-40: commit + +---------------------------------------------------------------------- +update user set name='alicia' where id=1 + +1 ks_sharded/-40: begin +1 ks_sharded/-40: select name from user where id = 1 limit 10001 for update +2 ks_sharded/80-c0: begin +2 ks_sharded/80-c0: delete from name_user_map where (name = 'name_val_1' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */ +3 ks_sharded/c0-: begin +3 ks_sharded/c0-: insert into name_user_map(name, user_id) values ('alicia', 1) /* vtgate:: keyspace_id:e2821261367fbee90bb5cf72955146c6 */ +4 ks_sharded/-40: update user set name = 'alicia' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +5 ks_sharded/-40: begin +5 ks_sharded/-40: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:-40:1515392388084762368', 1, 1515392388286298317) +5 ks_sharded/-40: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:-40:1515392388084762368', 1, 'ks_sharded', '80-c0'), ('ks_sharded:-40:1515392388084762368', 2, 'ks_sharded', 'c0-') +5 ks_sharded/-40: commit +6 ks_sharded/80-c0: begin +6 ks_sharded/80-c0: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:-40:1515392388084762368', 1, 1515392388298778400) +6 ks_sharded/80-c0: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:-40:1515392388084762368', 1, 'delete from name_user_map where (name = \'name_val_1\' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */') +6 ks_sharded/80-c0: commit +6 ks_sharded/c0-: begin +6 ks_sharded/c0-: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:-40:1515392388084762368', 1, 1515392388298735516) +6 ks_sharded/c0-: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:-40:1515392388084762368', 1, 'insert into name_user_map(name, user_id) values (\'alicia\', 1) /* vtgate:: keyspace_id:e2821261367fbee90bb5cf72955146c6 */') +6 ks_sharded/c0-: commit +7 ks_sharded/-40: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:-40:1515392388084762368' and state = 1 +7 ks_sharded/-40: commit +8 ks_sharded/80-c0: delete from `_vt`.redo_state where dtid = 'ks_sharded:-40:1515392388084762368' +8 ks_sharded/80-c0: delete from `_vt`.redo_statement where dtid = 'ks_sharded:-40:1515392388084762368' +8 ks_sharded/80-c0: commit +8 ks_sharded/c0-: delete from `_vt`.redo_state where dtid = 'ks_sharded:-40:1515392388084762368' +8 ks_sharded/c0-: delete from `_vt`.redo_statement where dtid = 'ks_sharded:-40:1515392388084762368' +8 ks_sharded/c0-: commit +9 ks_sharded/-40: begin +9 ks_sharded/-40: delete from `_vt`.dt_state where dtid = 'ks_sharded:-40:1515392388084762368' +9 ks_sharded/-40: delete from `_vt`.dt_participant where dtid = 'ks_sharded:-40:1515392388084762368' +9 ks_sharded/-40: commit + +---------------------------------------------------------------------- +update user set name='alicia' where name='alice' + +1 ks_sharded/40-80: begin +1 ks_sharded/40-80: select user_id from name_user_map where name = 'alice' limit 10001 +2 ks_sharded/-40: begin +2 ks_sharded/-40: select name from user where name = 'alice' limit 10001 for update +3 ks_sharded/80-c0: begin +3 ks_sharded/80-c0: delete from name_user_map where (name = 'name_val_1' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */ +4 ks_sharded/c0-: begin +4 ks_sharded/c0-: insert into name_user_map(name, user_id) values ('alicia', 1) /* vtgate:: keyspace_id:e2821261367fbee90bb5cf72955146c6 */ +5 ks_sharded/-40: select id from user where name = 'alice' limit 10001 for update /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +5 ks_sharded/-40: update user set name = 'alicia' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ +6 ks_sharded/40-80: begin +6 ks_sharded/40-80: insert into `_vt`.dt_state(dtid, state, time_created) values ('ks_sharded:40-80:1515392388086929119', 1, 1515392388407716332) +6 ks_sharded/40-80: insert into `_vt`.dt_participant(dtid, id, keyspace, shard) values ('ks_sharded:40-80:1515392388086929119', 1, 'ks_sharded', '-40'), ('ks_sharded:40-80:1515392388086929119', 2, 'ks_sharded', '80-c0'), ('ks_sharded:40-80:1515392388086929119', 3, 'ks_sharded', 'c0-') +6 ks_sharded/40-80: commit +7 ks_sharded/-40: begin +7 ks_sharded/-40: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:40-80:1515392388086929119', 1, 1515392388418784416) +7 ks_sharded/-40: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:40-80:1515392388086929119', 1, 'update user set name = \'alicia\' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */') +7 ks_sharded/-40: commit +7 ks_sharded/80-c0: begin +7 ks_sharded/80-c0: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:40-80:1515392388086929119', 1, 1515392388418767663) +7 ks_sharded/80-c0: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:40-80:1515392388086929119', 1, 'delete from name_user_map where (name = \'name_val_1\' and user_id = 1) /* vtgate:: keyspace_id:a6e89b54b129c33051b76db219595660 */') +7 ks_sharded/80-c0: commit +7 ks_sharded/c0-: begin +7 ks_sharded/c0-: insert into `_vt`.redo_state(dtid, state, time_created) values ('ks_sharded:40-80:1515392388086929119', 1, 1515392388418767689) +7 ks_sharded/c0-: insert into `_vt`.redo_statement(dtid, id, statement) values ('ks_sharded:40-80:1515392388086929119', 1, 'insert into name_user_map(name, user_id) values (\'alicia\', 1) /* vtgate:: keyspace_id:e2821261367fbee90bb5cf72955146c6 */') +7 ks_sharded/c0-: commit +8 ks_sharded/40-80: update `_vt`.dt_state set state = 2 where dtid = 'ks_sharded:40-80:1515392388086929119' and state = 1 +8 ks_sharded/40-80: commit +9 ks_sharded/-40: delete from `_vt`.redo_state where dtid = 'ks_sharded:40-80:1515392388086929119' +9 ks_sharded/-40: delete from `_vt`.redo_statement where dtid = 'ks_sharded:40-80:1515392388086929119' +9 ks_sharded/-40: commit +9 ks_sharded/80-c0: delete from `_vt`.redo_state where dtid = 'ks_sharded:40-80:1515392388086929119' +9 ks_sharded/80-c0: delete from `_vt`.redo_statement where dtid = 'ks_sharded:40-80:1515392388086929119' +9 ks_sharded/80-c0: commit +9 ks_sharded/c0-: delete from `_vt`.redo_state where dtid = 'ks_sharded:40-80:1515392388086929119' +9 ks_sharded/c0-: delete from `_vt`.redo_statement where dtid = 'ks_sharded:40-80:1515392388086929119' +9 ks_sharded/c0-: commit +10 ks_sharded/40-80: begin +10 ks_sharded/40-80: delete from `_vt`.dt_state where dtid = 'ks_sharded:40-80:1515392388086929119' +10 ks_sharded/40-80: delete from `_vt`.dt_participant where dtid = 'ks_sharded:40-80:1515392388086929119' +10 ks_sharded/40-80: commit + +---------------------------------------------------------------------- diff --git a/data/test/vtexplain/unsharded-output.json b/data/test/vtexplain/unsharded-output.json deleted file mode 100644 index b421c5aaecb..00000000000 --- a/data/test/vtexplain/unsharded-output.json +++ /dev/null @@ -1,304 +0,0 @@ -[ - { - "SQL": "select * from t1", - "Plans": [ - { - "Original": "select * from t1", - "Instructions": { - "Opcode": "SelectUnsharded", - "Keyspace": { - "Name": "ks_unsharded", - "Sharded": false - }, - "Query": "select * from t1", - "FieldQuery": "select * from t1 where 1 != 1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_unsharded/-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select * from t1", - "BindVars": { - "#maxLimit": "10001" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "select * from t1 limit 10001" - } - ] - } - } - }, - { - "SQL": "insert into t1 (id,intval,floatval) values (1,2,3.14)", - "Plans": [ - { - "Original": "insert into t1(id, intval, floatval) values (:vtg1, :vtg2, :vtg3)", - "Instructions": { - "Opcode": "InsertUnsharded", - "Keyspace": { - "Name": "ks_unsharded", - "Sharded": false - }, - "Query": "insert into t1(id, intval, floatval) values (:vtg1, :vtg2, :vtg3)", - "Table": "t1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_unsharded/-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "insert into t1(id, intval, floatval) values (:vtg1, :vtg2, :vtg3)", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "2", - "vtg3": "3.14" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "insert into t1(id, intval, floatval) values (1, 2, 3.14)" - }, - { - "Time": 2, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "update t1 set intval = 10", - "Plans": [ - { - "Original": "update t1 set intval = :vtg1", - "Instructions": { - "Opcode": "UpdateUnsharded", - "Keyspace": { - "Name": "ks_unsharded", - "Sharded": false - }, - "Query": "update t1 set intval = :vtg1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_unsharded/-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "update t1 set intval = :vtg1", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "10" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "select id from t1 limit 10001 for update" - }, - { - "Time": 1, - "SQL": "update t1 set intval = 10 where id in (1)" - }, - { - "Time": 2, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "update t1 set floatval = 9.99", - "Plans": [ - { - "Original": "update t1 set floatval = :vtg1", - "Instructions": { - "Opcode": "UpdateUnsharded", - "Keyspace": { - "Name": "ks_unsharded", - "Sharded": false - }, - "Query": "update t1 set floatval = :vtg1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_unsharded/-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "update t1 set floatval = :vtg1", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "9.99" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "select id from t1 limit 10001 for update" - }, - { - "Time": 1, - "SQL": "update t1 set floatval = 9.99 where id in (1)" - }, - { - "Time": 2, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "delete from t1 where id = 100", - "Plans": [ - { - "Original": "delete from t1 where id = :vtg1", - "Instructions": { - "Opcode": "DeleteUnsharded", - "Keyspace": { - "Name": "ks_unsharded", - "Sharded": false - }, - "Query": "delete from t1 where id = :vtg1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_unsharded/-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "delete from t1 where id = :vtg1", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "100" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "delete from t1 where id in (100)" - }, - { - "Time": 2, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "insert into t1 (id,intval,floatval) values (1,2,3.14) on duplicate key update intval=3, floatval=3.14", - "Plans": [ - { - "Original": "insert into t1(id, intval, floatval) values (:vtg1, :vtg2, :vtg3) on duplicate key update intval = :vtg4, floatval = :vtg5", - "Instructions": { - "Opcode": "InsertUnsharded", - "Keyspace": { - "Name": "ks_unsharded", - "Sharded": false - }, - "Query": "insert into t1(id, intval, floatval) values (:vtg1, :vtg2, :vtg3) on duplicate key update intval = :vtg4, floatval = :vtg5", - "Table": "t1" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_unsharded/-": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "insert into t1(id, intval, floatval) values (:vtg1, :vtg2, :vtg3) on duplicate key update intval = :vtg4, floatval = :vtg5", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "1", - "vtg2": "2", - "vtg3": "3.14", - "vtg4": "3", - "vtg5": "3.14" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "insert into t1(id, intval, floatval) values (1, 2, 3.14) on duplicate key update intval = 3, floatval = 3.14" - }, - { - "Time": 2, - "SQL": "commit" - } - ] - } - } - } -] diff --git a/data/test/vtexplain/updatesharded-output.json b/data/test/vtexplain/updatesharded-output.json deleted file mode 100644 index 686cb235b2e..00000000000 --- a/data/test/vtexplain/updatesharded-output.json +++ /dev/null @@ -1,218 +0,0 @@ -[ - { - "SQL": "update user set nickname='alice' where id=1", - "Plans": [ - { - "Original": "update user set nickname = :vtg1 where id = :vtg2", - "Instructions": { - "Opcode": "UpdateEqual", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "update user set nickname = :vtg1 where id = :vtg2", - "Vindex": "hash", - "Values": [ - ":vtg2" - ], - "Table": "user" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "update user set nickname = :vtg1 where id = :vtg2 /* vtgate:: keyspace_id:166b40b44aba4bd6 */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "'alice'", - "vtg2": "1" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "update user set nickname = 'alice' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */" - }, - { - "Time": 2, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "update user set nickname='alice' where name='alice'", - "Plans": [ - { - "Original": "select user_id from name_user_map where name = :name", - "Instructions": { - "Opcode": "SelectEqualUnique", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "select user_id from name_user_map where name = :name", - "FieldQuery": "select user_id from name_user_map where 1 != 1", - "Vindex": "md5", - "Values": [ - ":name" - ] - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - }, - { - "Original": "update user set nickname = :vtg1 where name = :vtg2", - "Instructions": { - "Opcode": "UpdateEqual", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "update user set nickname = :vtg1 where name = :vtg2", - "Vindex": "name_user_map", - "Values": [ - ":vtg2" - ], - "Table": "user" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 2, - "SQL": "update user set nickname = :vtg1 where name = :vtg2 /* vtgate:: keyspace_id:166b40b44aba4bd6 */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "'alice'", - "vtg2": "'alice'" - } - } - ], - "MysqlQueries": [ - { - "Time": 2, - "SQL": "begin" - }, - { - "Time": 2, - "SQL": "select id from user where name = 'alice' limit 10001 for update /* vtgate:: keyspace_id:166b40b44aba4bd6 */" - }, - { - "Time": 2, - "SQL": "update user set nickname = 'alice' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */" - }, - { - "Time": 4, - "SQL": "commit" - } - ] - }, - "ks_sharded/40-80": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "select user_id from name_user_map where name = :name", - "BindVars": { - "#maxLimit": "10001", - "name": "'alice'" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "select user_id from name_user_map where name = 'alice' limit 10001" - }, - { - "Time": 3, - "SQL": "commit" - } - ] - } - } - }, - { - "SQL": "update user set pet='fido' where id=1", - "Plans": [ - { - "Original": "update user set pet = :vtg1 where id = :vtg2", - "Instructions": { - "Opcode": "UpdateEqual", - "Keyspace": { - "Name": "ks_sharded", - "Sharded": true - }, - "Query": "update user set pet = :vtg1 where id = :vtg2", - "Vindex": "hash", - "Values": [ - ":vtg2" - ], - "Table": "user" - }, - "ExecCount": 1, - "ExecTime": 0, - "ShardQueries": 1, - "Rows": 1, - "Errors": 0 - } - ], - "TabletActions": { - "ks_sharded/-40": { - "TabletQueries": [ - { - "Time": 1, - "SQL": "update user set pet = :vtg1 where id = :vtg2 /* vtgate:: keyspace_id:166b40b44aba4bd6 */", - "BindVars": { - "#maxLimit": "10001", - "vtg1": "'fido'", - "vtg2": "1" - } - } - ], - "MysqlQueries": [ - { - "Time": 1, - "SQL": "begin" - }, - { - "Time": 1, - "SQL": "update user set pet = 'fido' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */" - }, - { - "Time": 2, - "SQL": "commit" - } - ] - } - } - } -] diff --git a/data/test/vtexplain/updatesharded-output.txt b/data/test/vtexplain/updatesharded-output.txt deleted file mode 100644 index 0a4c28ba564..00000000000 --- a/data/test/vtexplain/updatesharded-output.txt +++ /dev/null @@ -1,26 +0,0 @@ ----------------------------------------------------------------------- -update user set nickname='alice' where id=1 - -1 ks_sharded/-40: begin -1 ks_sharded/-40: update user set nickname = 'alice' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ -2 ks_sharded/-40: commit - ----------------------------------------------------------------------- -update user set nickname='alice' where name='alice' - -1 ks_sharded/40-80: begin -1 ks_sharded/40-80: select user_id from name_user_map where name = 'alice' limit 10001 -2 ks_sharded/-40: begin -2 ks_sharded/-40: select id from user where name = 'alice' limit 10001 for update /* vtgate:: keyspace_id:166b40b44aba4bd6 */ -2 ks_sharded/-40: update user set nickname = 'alice' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ -3 ks_sharded/40-80: commit -4 ks_sharded/-40: commit - ----------------------------------------------------------------------- -update user set pet='fido' where id=1 - -1 ks_sharded/-40: begin -1 ks_sharded/-40: update user set pet = 'fido' where id in (1) /* vtgate:: keyspace_id:166b40b44aba4bd6 */ -2 ks_sharded/-40: commit - ----------------------------------------------------------------------- diff --git a/data/test/vtexplain/updatesharded-queries.sql b/data/test/vtexplain/updatesharded-queries.sql index bcf0b927a9f..ef1b9764115 100644 --- a/data/test/vtexplain/updatesharded-queries.sql +++ b/data/test/vtexplain/updatesharded-queries.sql @@ -2,5 +2,9 @@ update user set nickname='alice' where id=1; update user set nickname='alice' where name='alice'; update user set pet='fido' where id=1; +/* update secondary vindex value */ +update user set name='alicia' where id=1; +update user set name='alicia' where name='alice'; + /* not supported - multi-shard update */ -- update user set pet='rover' where name='alice'; diff --git a/go/cmd/vtexplain/vtexplain.go b/go/cmd/vtexplain/vtexplain.go index 3cac092947f..0a2056c329a 100644 --- a/go/cmd/vtexplain/vtexplain.go +++ b/go/cmd/vtexplain/vtexplain.go @@ -37,6 +37,7 @@ var ( vschemaFlag = flag.String("vschema", "", "Identifies the VTGate routing schema") vschemaFileFlag = flag.String("vschema-file", "", "Identifies the VTGate routing schema file") numShards = flag.Int("shards", 2, "Number of shards per keyspace") + executionMode = flag.String("execution-mode", "multi", "The execution mode to simulate -- must be set to multi, legacy-autocommit, or twopc") replicationMode = flag.String("replication-mode", "ROW", "The replication mode to simulate -- must be set to either ROW or STATEMENT") normalize = flag.Bool("normalize", false, "Whether to enable vtgate normalization") outputMode = flag.String("output-mode", "text", "Output in human-friendly text or json") @@ -161,6 +162,7 @@ func parseAndRun() error { } opts := &vtexplain.Options{ + ExecutionMode: *executionMode, ReplicationMode: *replicationMode, NumShards: *numShards, Normalize: *normalize, diff --git a/go/vt/vtexplain/vtexplain.go b/go/vt/vtexplain/vtexplain.go index af3f7f4abb4..2635e7da491 100644 --- a/go/vt/vtexplain/vtexplain.go +++ b/go/vt/vtexplain/vtexplain.go @@ -36,6 +36,17 @@ import ( querypb "github.com/youtube/vitess/go/vt/proto/query" ) +// ExecutorMode controls the mode of operation for the vtexplain simulator +type ExecutorMode string + +const ( + // ModeMulti is the default mode with autocommit implemented at vtgate + ModeMulti = "multi" + + // ModeTwoPC enables the twopc feature + ModeTwoPC = "twopc" +) + // Options to control the explain process type Options struct { // NumShards indicates the number of shards in the topology @@ -47,6 +58,9 @@ type Options struct { // Normalize controls whether or not vtgate does query normalization Normalize bool + + // ExecutionMode must be set to one of the modes above + ExecutionMode string } // TabletQuery defines a query that was sent to a given tablet and how it was @@ -93,55 +107,13 @@ func (tq *TabletQuery) MarshalJSON() ([]byte, error) { }) } -// TabletQueries is a collection of queries -type TabletQueries []*TabletQuery - -// Len is part of the sort interface -func (tq TabletQueries) Len() int { - return len(tq) -} - -// Less is part of the sort interface -func (tq TabletQueries) Less(i, j int) bool { - if tq[i].Time == tq[j].Time { - return tq[i].SQL < tq[j].SQL - } - return tq[i].Time < tq[j].Time -} - -// Swap is part of the sort interface -func (tq TabletQueries) Swap(i, j int) { - tq[i], tq[j] = tq[j], tq[i] -} - -// MysqlQueries is a collection of queries -type MysqlQueries []*MysqlQuery - -// Len is part of the sort interface -func (mq MysqlQueries) Len() int { - return len(mq) -} - -// Less is part of the sort interface -func (mq MysqlQueries) Less(i, j int) bool { - if mq[i].Time == mq[j].Time { - return mq[i].SQL < mq[j].SQL - } - return mq[i].Time < mq[j].Time -} - -// Swap is part of the sort interface -func (mq MysqlQueries) Swap(i, j int) { - mq[i], mq[j] = mq[j], mq[i] -} - // TabletActions contains the set of operations done by a given tablet type TabletActions struct { // Queries sent from vtgate to the tablet - TabletQueries TabletQueries + TabletQueries []*TabletQuery // Queries that were run on mysql - MysqlQueries MysqlQueries + MysqlQueries []*MysqlQuery } // Explain defines how vitess will execute a given sql query, including the vtgate diff --git a/go/vt/vtexplain/vtexplain_flaky_test.go b/go/vt/vtexplain/vtexplain_flaky_test.go index bd3248c411a..8b0eb18c878 100644 --- a/go/vt/vtexplain/vtexplain_flaky_test.go +++ b/go/vt/vtexplain/vtexplain_flaky_test.go @@ -17,6 +17,7 @@ limitations under the License. package vtexplain import ( + "encoding/json" "fmt" "io/ioutil" "os/exec" @@ -37,7 +38,7 @@ func defaultTestOpts() *Options { } } -func initTest(opts *Options, t *testing.T) { +func initTest(mode string, opts *Options, t *testing.T) { schema, err := ioutil.ReadFile(testfiles.Locate("vtexplain/test-schema.sql")) if err != nil { t.Fatalf("error: %v", err) @@ -48,24 +49,39 @@ func initTest(opts *Options, t *testing.T) { t.Fatalf("error: %v", err) } + opts.ExecutionMode = mode err = Init(string(vSchema), string(schema), opts) if err != nil { t.Fatalf("vtexplain Init error: %v", err) } - } func testExplain(testcase string, opts *Options, t *testing.T) { - initTest(opts, t) + modes := []string{ + ModeMulti, + + // TwoPC mode is functional, but the output isn't stable for + // tests since there are timestamps in the value rows + // ModeTwoPC, + } + + for _, mode := range modes { + runTestCase(testcase, mode, opts, t) + } +} + +func runTestCase(testcase, mode string, opts *Options, t *testing.T) { + t.Logf("vtexplain test: %s mode: %s", testcase, mode) + initTest(mode, opts, t) sqlFile := testfiles.Locate(fmt.Sprintf("vtexplain/%s-queries.sql", testcase)) sql, err := ioutil.ReadFile(sqlFile) + if err != nil { + t.Fatalf("vtexplain error: %v", err) + } - jsonOutFile := testfiles.Locate(fmt.Sprintf("vtexplain/%s-output.json", testcase)) - jsonOut, err := ioutil.ReadFile(jsonOutFile) - - textOutFile := testfiles.Locate(fmt.Sprintf("vtexplain/%s-output.txt", testcase)) - textOut, err := ioutil.ReadFile(textOutFile) + textOutFile := testfiles.Locate(fmt.Sprintf("vtexplain/%s-output/%s-output.txt", mode, testcase)) + textOut, _ := ioutil.ReadFile(textOutFile) explains, err := Run(string(sql)) if err != nil { @@ -75,28 +91,6 @@ func testExplain(testcase string, opts *Options, t *testing.T) { t.Fatalf("vtexplain error running %s: no explain", string(sql)) } - explainJSON := ExplainsAsJSON(explains) - if strings.TrimSpace(string(explainJSON)) != strings.TrimSpace(string(jsonOut)) { - // Print the json that was actually returned and also dump to a - // temp file to be able to diff the results. - t.Errorf("json output did not match") - if testOutputTempDir == "" { - testOutputTempDir, err = ioutil.TempDir("", "vtexplain_output") - if err != nil { - t.Fatalf("error getting tempdir: %v", err) - } - } - gotFile := fmt.Sprintf("%s/%s-output.json", testOutputTempDir, testcase) - ioutil.WriteFile(gotFile, []byte(explainJSON), 0644) - - command := exec.Command("diff", "-u", jsonOutFile, gotFile) - out, _ := command.CombinedOutput() - t.Logf("diff:\n%s\n", out) - - t.Logf("run the following command to update the expected output:") - t.Logf("cp %s/* %s", testOutputTempDir, path.Dir(jsonOutFile)) - } - explainText := ExplainsAsText(explains) if strings.TrimSpace(string(explainText)) != strings.TrimSpace(string(textOut)) { // Print the Text that was actually returned and also dump to a @@ -155,7 +149,7 @@ func TestComments(t *testing.T) { } func TestErrors(t *testing.T) { - initTest(defaultTestOpts(), t) + initTest(ModeMulti, defaultTestOpts(), t) tests := []struct { SQL string @@ -163,22 +157,22 @@ func TestErrors(t *testing.T) { }{ { SQL: "INVALID SQL", - Err: "vtexplain execute error: unrecognized statement: INVALID SQL in INVALID SQL", + Err: "vtexplain execute error in 'INVALID SQL': unrecognized statement: INVALID SQL", }, { SQL: "SELECT * FROM THIS IS NOT SQL", - Err: "vtexplain execute error: syntax error at position 22 near 'is' in SELECT * FROM THIS IS NOT SQL", + Err: "vtexplain execute error in 'SELECT * FROM THIS IS NOT SQL': syntax error at position 22 near 'is'", }, { SQL: "SELECT * FROM table_not_in_vschema", - Err: "vtexplain execute error: table table_not_in_vschema not found in SELECT * FROM table_not_in_vschema", + Err: "vtexplain execute error in 'SELECT * FROM table_not_in_vschema': table table_not_in_vschema not found", }, { SQL: "SELECT * FROM table_not_in_schema", - Err: "vtexplain execute error: target: ks_unsharded.-.master, used tablet: explainCell-0 (ks_unsharded/-), table table_not_in_schema not found in schema in SELECT * FROM table_not_in_schema", + Err: "vtexplain execute error in 'SELECT * FROM table_not_in_schema': target: ks_unsharded.-.master, used tablet: explainCell-0 (ks_unsharded/-), table table_not_in_schema not found in schema", }, } @@ -189,3 +183,74 @@ func TestErrors(t *testing.T) { } } } + +func TestJSONOutput(t *testing.T) { + sql := "select 1 from user where id = 1" + explains, err := Run(sql) + if err != nil { + t.Fatalf("vtexplain error: %v", err) + } + if explains == nil { + t.Fatalf("vtexplain error running %s: no explain", string(sql)) + } + + explainJSON := ExplainsAsJSON(explains) + + var data interface{} + err = json.Unmarshal([]byte(explainJSON), &data) + if err != nil { + t.Errorf("error unmarshaling json: %v", err) + } + + array, ok := data.([]interface{}) + if !ok || len(array) != 1 { + t.Errorf("expected single-element top-level array, got:\n%s", explainJSON) + } + + explain, ok := array[0].(map[string]interface{}) + if !ok { + t.Errorf("expected explain map, got:\n%s", explainJSON) + } + + if explain["SQL"] != sql { + t.Errorf("expected SQL, got:\n%s", explainJSON) + } + + plans, ok := explain["Plans"].([]interface{}) + if !ok || len(plans) != 1 { + t.Errorf("expected single-element plans array, got:\n%s", explainJSON) + } + + actions, ok := explain["TabletActions"].(map[string]interface{}) + if !ok { + t.Errorf("expected TabletActions map, got:\n%s", explainJSON) + } + + actionsJSON, err := json.MarshalIndent(actions, "", " ") + if err != nil { + t.Errorf("error in json marshal: %v", err) + } + wantJSON := `{ + "ks_sharded/-40": { + "MysqlQueries": [ + { + "SQL": "select 1 from user where id = 1 limit 10001", + "Time": 1 + } + ], + "TabletQueries": [ + { + "BindVars": { + "#maxLimit": "10001", + "vtg1": "1" + }, + "SQL": "select :vtg1 from user where id = :vtg1", + "Time": 1 + } + ] + } +}` + if string(actionsJSON) != wantJSON { + t.Errorf("TabletActions mismatch: got:\n%v\nwant:\n%v\n", string(actionsJSON), wantJSON) + } +} diff --git a/go/vt/vtexplain/vtexplain_vtgate.go b/go/vt/vtexplain/vtexplain_vtgate.go index 1a57a2f45ab..308b9d9b106 100644 --- a/go/vt/vtexplain/vtexplain_vtgate.go +++ b/go/vt/vtexplain/vtexplain_vtgate.go @@ -22,7 +22,6 @@ package vtexplain import ( "encoding/json" "fmt" - "sort" log "github.com/golang/glog" "golang.org/x/net/context" @@ -56,9 +55,9 @@ func initVtgateExecutor(vSchemaStr string, opts *Options) error { explainTopo = &ExplainTopo{NumShards: opts.NumShards} healthCheck = discovery.NewFakeHealthCheck() - resolver := newFakeResolver(healthCheck, explainTopo, vtexplainCell) + resolver := newFakeResolver(opts, healthCheck, explainTopo, vtexplainCell) - err := buildTopology(vSchemaStr, opts.NumShards) + err := buildTopology(opts, vSchemaStr, opts.NumShards) if err != nil { return err } @@ -70,15 +69,20 @@ func initVtgateExecutor(vSchemaStr string, opts *Options) error { return nil } -func newFakeResolver(hc discovery.HealthCheck, serv srvtopo.Server, cell string) *vtgate.Resolver { +func newFakeResolver(opts *Options, hc discovery.HealthCheck, serv srvtopo.Server, cell string) *vtgate.Resolver { gw := gateway.GetCreator()(hc, nil, serv, cell, 3) gw.WaitForTablets(context.Background(), []topodatapb.TabletType{topodatapb.TabletType_REPLICA}) - tc := vtgate.NewTxConn(gw, vtgatepb.TransactionMode_MULTI) + + txMode := vtgatepb.TransactionMode_MULTI + if opts.ExecutionMode == ModeTwoPC { + txMode = vtgatepb.TransactionMode_TWOPC + } + tc := vtgate.NewTxConn(gw, txMode) sc := vtgate.NewScatterConn("", tc, gw, hc) return vtgate.NewResolver(serv, cell, sc) } -func buildTopology(vschemaStr string, numShardsPerKeyspace int) error { +func buildTopology(opts *Options, vschemaStr string, numShardsPerKeyspace int) error { explainTopo.Lock.Lock() defer explainTopo.Lock.Unlock() @@ -104,7 +108,7 @@ func buildTopology(vschemaStr string, numShardsPerKeyspace int) error { log.Infof("registering test tablet %s for keyspace %s shard %s", hostname, ks, shard) tablet := healthCheck.AddFakeTablet(vtexplainCell, hostname, 1, ks, shard, topodatapb.TabletType_MASTER, true, 1, nil, func(t *topodatapb.Tablet) queryservice.QueryService { - return newTablet(t) + return newTablet(opts, t) }) explainTopo.TabletConns[hostname] = tablet.(*explainTablet) } @@ -114,14 +118,21 @@ func buildTopology(vschemaStr string, numShardsPerKeyspace int) error { } func vtgateExecute(sql string) ([]*engine.Plan, map[string]*TabletActions, error) { + // use the plan cache to get the set of plans used for this query, then + // clear afterwards for the next run + planCache := vtgateExecutor.Plans() + _, err := vtgateExecutor.Execute(context.Background(), "VtexplainExecute", vtgate.NewSafeSession(vtgateSession), sql, nil) if err != nil { - return nil, nil, fmt.Errorf("vtexplain execute error: %v in %s", err, sql) + for _, tc := range explainTopo.TabletConns { + tc.tabletQueries = nil + tc.mysqlQueries = nil + } + planCache.Clear() + + return nil, nil, fmt.Errorf("vtexplain execute error in '%s': %v", sql, err) } - // use the plan cache to get the set of plans used for this query, then - // clear afterwards for the next run - planCache := vtgateExecutor.Plans() var plans []*engine.Plan for _, item := range planCache.Items() { plan := item.Value.(*engine.Plan) @@ -136,17 +147,13 @@ func vtgateExecute(sql string) ([]*engine.Plan, map[string]*TabletActions, error continue } - actions := &TabletActions{ + tabletActions[shard] = &TabletActions{ TabletQueries: tc.tabletQueries, MysqlQueries: tc.mysqlQueries, } tc.tabletQueries = nil tc.mysqlQueries = nil - - sort.Sort(actions.TabletQueries) - sort.Sort(actions.MysqlQueries) - tabletActions[shard] = actions } return plans, tabletActions, nil diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index 2b0ebefdb4c..52696d7db05 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -71,11 +71,18 @@ type explainTablet struct { currentTime int } -func newTablet(t *topodatapb.Tablet) *explainTablet { +func newTablet(opts *Options, t *topodatapb.Tablet) *explainTablet { db := fakesqldb.New(nil) + config := tabletenv.DefaultQsConfig + if opts.ExecutionMode == ModeTwoPC { + config.TwoPCCoordinatorAddress = "XXX" + config.TwoPCAbandonAge = 1.0 + config.TwoPCEnable = true + } + // XXX much of this is cloned from the tabletserver tests - tsv := tabletserver.NewTabletServerWithNilTopoServer(tabletenv.DefaultQsConfig) + tsv := tabletserver.NewTabletServerWithNilTopoServer(config) tablet := explainTablet{db: db, tsv: tsv} db.Handler = &tablet @@ -153,6 +160,62 @@ func (t *explainTablet) Execute(ctx context.Context, target *querypb.Target, sql return t.tsv.Execute(ctx, target, sql, bindVariables, transactionID, options) } +// Prepare is part of the QueryService interface. +func (t *explainTablet) Prepare(ctx context.Context, target *querypb.Target, transactionID int64, dtid string) (err error) { + t.mu.Lock() + t.currentTime = batchTime.Wait() + t.mu.Unlock() + return t.tsv.Prepare(ctx, target, transactionID, dtid) +} + +// CommitPrepared commits the prepared transaction. +func (t *explainTablet) CommitPrepared(ctx context.Context, target *querypb.Target, dtid string) (err error) { + t.mu.Lock() + t.currentTime = batchTime.Wait() + t.mu.Unlock() + return t.tsv.CommitPrepared(ctx, target, dtid) +} + +// CreateTransaction is part of the QueryService interface. +func (t *explainTablet) CreateTransaction(ctx context.Context, target *querypb.Target, dtid string, participants []*querypb.Target) (err error) { + t.mu.Lock() + t.currentTime = batchTime.Wait() + t.mu.Unlock() + return t.tsv.CreateTransaction(ctx, target, dtid, participants) +} + +// StartCommit is part of the QueryService interface. +func (t *explainTablet) StartCommit(ctx context.Context, target *querypb.Target, transactionID int64, dtid string) (err error) { + t.mu.Lock() + t.currentTime = batchTime.Wait() + t.mu.Unlock() + return t.tsv.StartCommit(ctx, target, transactionID, dtid) +} + +// SetRollback is part of the QueryService interface. +func (t *explainTablet) SetRollback(ctx context.Context, target *querypb.Target, dtid string, transactionID int64) (err error) { + t.mu.Lock() + t.currentTime = batchTime.Wait() + t.mu.Unlock() + return t.tsv.SetRollback(ctx, target, dtid, transactionID) +} + +// ConcludeTransaction is part of the QueryService interface. +func (t *explainTablet) ConcludeTransaction(ctx context.Context, target *querypb.Target, dtid string) (err error) { + t.mu.Lock() + t.currentTime = batchTime.Wait() + t.mu.Unlock() + return t.tsv.ConcludeTransaction(ctx, target, dtid) +} + +// ReadTransaction is part of the QueryService interface. +func (t *explainTablet) ReadTransaction(ctx context.Context, target *querypb.Target, dtid string) (metadata *querypb.TransactionMetadata, err error) { + t.mu.Lock() + t.currentTime = batchTime.Wait() + t.mu.Unlock() + return t.tsv.ReadTransaction(ctx, target, dtid) +} + // BeginExecute is part of the QueryService interface. func (t *explainTablet) BeginExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, error) { t.mu.Lock() @@ -215,6 +278,77 @@ func initTabletEnvironment(ddls []*sqlparser.DDL, opts *Options) error { sqltypes.NewVarBinary(opts.ReplicationMode), }}, }, + "set @@session.sql_log_bin = 0": { + Fields: []*querypb.Field{{ + Type: sqltypes.Uint64, + }}, + RowsAffected: 0, + Rows: [][]sqltypes.Value{}, + }, + "create database if not exists `_vt`": { + Fields: []*querypb.Field{{ + Type: sqltypes.Uint64, + }}, + RowsAffected: 0, + Rows: [][]sqltypes.Value{}, + }, + "drop table if exists `_vt`.redo_log_transaction": { + Fields: []*querypb.Field{{ + Type: sqltypes.Uint64, + }}, + RowsAffected: 0, + Rows: [][]sqltypes.Value{}, + }, + "drop table if exists `_vt`.redo_log_statement": { + Fields: []*querypb.Field{{ + Type: sqltypes.Uint64, + }}, + RowsAffected: 0, + Rows: [][]sqltypes.Value{}, + }, + "drop table if exists `_vt`.transaction": { + Fields: []*querypb.Field{{ + Type: sqltypes.Uint64, + }}, + RowsAffected: 0, + Rows: [][]sqltypes.Value{}, + }, + "drop table if exists `_vt`.participant": { + Fields: []*querypb.Field{{ + Type: sqltypes.Uint64, + }}, + RowsAffected: 0, + Rows: [][]sqltypes.Value{}, + }, + "create table if not exists `_vt`.redo_state(\n dtid varbinary(512),\n state bigint,\n time_created bigint,\n primary key(dtid)\n\t) engine=InnoDB": { + Fields: []*querypb.Field{{ + Type: sqltypes.Uint64, + }}, + RowsAffected: 0, + Rows: [][]sqltypes.Value{}, + }, + "create table if not exists `_vt`.redo_statement(\n dtid varbinary(512),\n id bigint,\n statement mediumblob,\n primary key(dtid, id)\n\t) engine=InnoDB": { + Fields: []*querypb.Field{{ + Type: sqltypes.Uint64, + }}, + RowsAffected: 0, + Rows: [][]sqltypes.Value{}, + }, + "create table if not exists `_vt`.dt_state(\n dtid varbinary(512),\n state bigint,\n time_created bigint,\n primary key(dtid)\n\t) engine=InnoDB": { + Fields: []*querypb.Field{{ + Type: sqltypes.Uint64, + }}, + RowsAffected: 0, + Rows: [][]sqltypes.Value{}, + }, + "create table if not exists `_vt`.dt_participant(\n dtid varbinary(512),\n\tid bigint,\n\tkeyspace varchar(256),\n\tshard varchar(256),\n primary key(dtid, id)\n\t) engine=InnoDB": { + + Fields: []*querypb.Field{{ + Type: sqltypes.Uint64, + }}, + RowsAffected: 0, + Rows: [][]sqltypes.Value{}, + }, } showTableRows := make([][]sqltypes.Value, 0, 4) diff --git a/go/vt/vtexplain/vtexplain_vttablet_test.go b/go/vt/vtexplain/vtexplain_vttablet_test.go index 4e6325394e4..b86224071ee 100644 --- a/go/vt/vtexplain/vtexplain_vttablet_test.go +++ b/go/vt/vtexplain/vtexplain_vttablet_test.go @@ -42,7 +42,7 @@ create table t2 ( } initTabletEnvironment(ddls, defaultTestOpts()) - tablet := newTablet(&topodatapb.Tablet{ + tablet := newTablet(defaultTestOpts(), &topodatapb.Tablet{ Keyspace: "test_keyspace", Shard: "-80", })