MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
explain_utils.inc
1 # This file is a collection of utility tests
2 # for WL#4897: Add EXPLAIN INSERT/UPDATE/DELETE.
3 #
4 # Since MTR doesn't have functions, we use this file instead
5 # including it many times.
6 #
7 # Parameters:
8 #
9 # $query: INSERT/REPLACE/UPDATE/DELETE query to explain
10 # NOTE: this file resets this variable
11 #
12 # $select: may be empty; the SELECT query similar to $query
13 # We use it to compare:
14 # 1) table data before and after EXPLAIN $query evaluation;
15 # 2) EXPLAIN $query and EXPLAIN $select output and
16 # handler/filesort statistics
17 # NOTE: this file resets this variable
18 # $innodb: take $no_rows parameter into account if not 0;
19 # $no_rows: filter out "rows" and "filtered" columns of EXPLAIN if not 0;
20 # it may be necessary for InnoDB tables since InnoDB's table row
21 # counter can't return precise and repeatable values;
22 # NOTE: ANALYZE TABLE doesn't help
23 # NOTE: this file resets this variable
24 
25 --echo #
26 --echo # query: $query
27 --echo # select: $select
28 --echo #
29 
30 if ($select) {
31 --disable_query_log
32 --eval $select INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/before_explain.txt'
33 --enable_query_log
34 }
35 
36 if ($innodb) {
37  if ($no_rows) {
38 --replace_column 9 X
39  }
40 }
41 --eval EXPLAIN $query
42 if (`SELECT ROW_COUNT() > 0`) {
43 --echo # Erroneous query: EXPLAIN $query
44 --die Unexpected ROW_COUNT() <> 0
45 }
46 
47 FLUSH STATUS;
48 FLUSH TABLES;
49 if ($innodb) {
50  if ($no_rows) {
51 --replace_column 9 X 10 X
52  }
53 }
54 --eval EXPLAIN EXTENDED $query
55 if (`SELECT ROW_COUNT() > 0`) {
56 --echo # Erroneous query: EXPLAIN EXTENDED $query
57 --die Unexpected ROW_COUNT() <> 0
58 }
59 --echo # Status of EXPLAIN EXTENDED query
60 --disable_query_log
61 SHOW STATUS WHERE (Variable_name LIKE 'Sort%' OR
62  Variable_name LIKE 'Handler_read_%' OR
63  Variable_name = 'Handler_write' OR
64  Variable_name = 'Handler_update' OR
65  Variable_name = 'Handler_delete') AND Value <> 0;
66 --enable_query_log
67 
68 if ($json) {
69 if ($innodb) {
70  if ($no_rows) {
71 --replace_regex /"rows": [0-9]+/"rows": "X"/ /"filtered": [0-9.]+/"filtered": "X"/
72  }
73 }
74 --eval EXPLAIN FORMAT=JSON $query;
75 if ($validation) {
76 --disable_query_log
77 --replace_result $MASTER_MYSOCK MASTER_MYSOCK
78 --exec $MYSQL -S $MASTER_MYSOCK -u root -r test -e "EXPLAIN FORMAT=JSON $query;" > $MYSQLTEST_VARDIR/tmp/explain.json
79 --replace_regex /[-]*// /FILE.[\/\\:_\.0-9A-Za-z]*/Validation:/
80 --exec python $MYSQL_TEST_DIR/suite/opt_trace/validate_json.py $MYSQLTEST_VARDIR/tmp/explain.json
81 --remove_file '$MYSQLTEST_VARDIR/tmp/explain.json'
82 --enable_query_log
83 }
84 }
85 
86 if ($select) {
87 FLUSH STATUS;
88 FLUSH TABLES;
89 if ($innodb) {
90  if ($no_rows) {
91 --replace_column 9 X 10 X
92  }
93 }
94 --eval EXPLAIN EXTENDED $select
95 --echo # Status of EXPLAIN EXTENDED "equivalent" SELECT query execution
96 --disable_query_log
97 SHOW STATUS WHERE (Variable_name LIKE 'Sort%' OR
98  Variable_name LIKE 'Handler_read_%' OR
99  Variable_name = 'Handler_write' OR
100  Variable_name = 'Handler_update' OR
101  Variable_name = 'Handler_delete') AND Value <> 0;
102 --enable_query_log
103 if ($json) {
104 if ($innodb) {
105  if ($no_rows) {
106 --replace_regex /"rows": [0-9]+/"rows": "X"/ /"filtered": [0-9.]+/"filtered": "X"/
107  }
108 }
109 --eval EXPLAIN FORMAT=JSON $select;
110 if ($validation) {
111 --disable_query_log
112 --replace_result $MASTER_MYSOCK MASTER_MYSOCK
113 --exec $MYSQL -S $MASTER_MYSOCK -u root -r test -e "EXPLAIN FORMAT=JSON $select;" > $MYSQLTEST_VARDIR/tmp/explain.json
114 --replace_regex /[-]*// /FILE.[\/\\:_\.0-9A-Za-z]*/Validation:/
115 --exec python $MYSQL_TEST_DIR/suite/opt_trace/validate_json.py $MYSQLTEST_VARDIR/tmp/explain.json
116 --remove_file '$MYSQLTEST_VARDIR/tmp/explain.json'
117 --enable_query_log
118 }
119 }
120 }
121 
122 --disable_query_log
123 
124 if ($select) {
125 --eval $select INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/after_explain.txt'
126 --diff_files '$MYSQLTEST_VARDIR/tmp/before_explain.txt' '$MYSQLTEST_VARDIR/tmp/after_explain.txt'
127 --remove_file '$MYSQLTEST_VARDIR/tmp/before_explain.txt'
128 --remove_file '$MYSQLTEST_VARDIR/tmp/after_explain.txt'
129 }
130 
131 FLUSH STATUS;
132 FLUSH TABLES;
133 if ($select) {
134 --disable_result_log
135 --eval $select
136 --enable_result_log
137 --echo # Status of "equivalent" SELECT query execution:
138 SHOW STATUS WHERE (Variable_name LIKE 'Sort%' OR
139  Variable_name LIKE 'Handler_read_%' OR
140  Variable_name = 'Handler_write' OR
141  Variable_name = 'Handler_update' OR
142  Variable_name = 'Handler_delete') AND Value <> 0;
143 }
144 
145 FLUSH STATUS;
146 FLUSH TABLES;
147 --eval $query
148 --echo # Status of testing query execution:
149 SHOW STATUS WHERE (Variable_name LIKE 'Sort%' OR
150  Variable_name LIKE 'Handler_read_%' OR
151  Variable_name = 'Handler_write' OR
152  Variable_name = 'Handler_update' OR
153  Variable_name = 'Handler_delete') AND Value <> 0;
154 
155 --let $query=
156 --let $select=
157 --let $no_rows=
158 
159 --enable_query_log
160 
161 --echo