| 1 | <?php |
|---|
| 2 | |
|---|
| 3 | /** |
|---|
| 4 | These changes fix the following issues with dbDelta: |
|---|
| 5 | |
|---|
| 6 | - Can't add an AUTO_INCREMENT column to a table that already exists |
|---|
| 7 | - Can't change which column is the primary key |
|---|
| 8 | - Can't change key definitions |
|---|
| 9 | */ |
|---|
| 10 | |
|---|
| 11 | require_once( __DIR__ . '/wp-load.php' ); |
|---|
| 12 | require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); |
|---|
| 13 | global $wpdb; |
|---|
| 14 | |
|---|
| 15 | $tables = array(); |
|---|
| 16 | |
|---|
| 17 | |
|---|
| 18 | $tables[ "col1(PK), col2" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 19 | col1 varchar(100), |
|---|
| 20 | col2 varchar(100), |
|---|
| 21 | PRIMARY KEY (col1) |
|---|
| 22 | )"; |
|---|
| 23 | |
|---|
| 24 | $tables[ "col1, col2(PK)" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 25 | col1 varchar(100), |
|---|
| 26 | col2 varchar(100), |
|---|
| 27 | PRIMARY KEY (col2) |
|---|
| 28 | )"; |
|---|
| 29 | |
|---|
| 30 | $tables[ "col1, col2, col3(AI/PK)" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 31 | col1 varchar(100), |
|---|
| 32 | col2 varchar(100), |
|---|
| 33 | col3 int(255) NOT NULL AUTO_INCREMENT, |
|---|
| 34 | PRIMARY KEY (col3) |
|---|
| 35 | )"; |
|---|
| 36 | |
|---|
| 37 | $tables[ "col1(PK), col2, col3(AI)" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 38 | col1 varchar(100), |
|---|
| 39 | col2 varchar(100), |
|---|
| 40 | col3 int(100) NOT NULL AUTO_INCREMENT, |
|---|
| 41 | UNIQUE KEY thename (col3), |
|---|
| 42 | PRIMARY KEY (col1) |
|---|
| 43 | )"; |
|---|
| 44 | |
|---|
| 45 | $tables[ "col1(PK(50)), col2" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 46 | col1 varchar(100), |
|---|
| 47 | col2 varchar(100), |
|---|
| 48 | PRIMARY KEY (col1(50)) |
|---|
| 49 | )"; |
|---|
| 50 | |
|---|
| 51 | $tables[ "col1(PK(75), col2" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 52 | col1 varchar(100), |
|---|
| 53 | col2 varchar(100), |
|---|
| 54 | PRIMARY KEY (col1(75)) |
|---|
| 55 | )"; |
|---|
| 56 | |
|---|
| 57 | $tables[ "col1, col2, col3(PK)" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 58 | col1 varchar(100), |
|---|
| 59 | col2 varchar(100), |
|---|
| 60 | col3 int(255) NOT NULL, |
|---|
| 61 | PRIMARY KEY (col3) |
|---|
| 62 | )"; |
|---|
| 63 | |
|---|
| 64 | $tables[ "col1(PK), col2(FULLTEXT)" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 65 | col1 varchar(100), |
|---|
| 66 | col2 varchar(100), |
|---|
| 67 | PRIMARY KEY (col1), |
|---|
| 68 | FULLTEXT KEY myidx (col2) |
|---|
| 69 | )"; |
|---|
| 70 | |
|---|
| 71 | $tables[ "col1(PK), col2(BTREE)" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 72 | col1 varchar(100), |
|---|
| 73 | col2 varchar(100), |
|---|
| 74 | PRIMARY KEY (col1), |
|---|
| 75 | KEY myidx (col2) |
|---|
| 76 | )"; |
|---|
| 77 | |
|---|
| 78 | $tables[ "col1(PK), col2(UNIQUE)" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 79 | col1 varchar(100), |
|---|
| 80 | col2 varchar(100), |
|---|
| 81 | PRIMARY KEY (col1), |
|---|
| 82 | UNIQUE KEY myidx (col2) |
|---|
| 83 | )"; |
|---|
| 84 | |
|---|
| 85 | $tables[ "col1(PK), col2, Index(col2,col1)" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 86 | col1 varchar(100), |
|---|
| 87 | col2 varchar(100), |
|---|
| 88 | PRIMARY KEY (col1), |
|---|
| 89 | KEY myidx (col2,col1) |
|---|
| 90 | )"; |
|---|
| 91 | |
|---|
| 92 | $tables[ "col1(PK), col2, Index(col1,col2)" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 93 | col1 varchar(100), |
|---|
| 94 | col2 varchar(100), |
|---|
| 95 | PRIMARY KEY (col1), |
|---|
| 96 | INDEX myidx (col1,col2) |
|---|
| 97 | )"; |
|---|
| 98 | |
|---|
| 99 | $tables[ "col1(PK), col2, PK(col1,col2)" ] = "CREATE TABLE dbdelta_tests ( |
|---|
| 100 | col1 varchar(100), |
|---|
| 101 | col2 varchar(100), |
|---|
| 102 | PRIMARY KEY (col1,col2) |
|---|
| 103 | )"; |
|---|
| 104 | |
|---|
| 105 | |
|---|
| 106 | |
|---|
| 107 | |
|---|
| 108 | /** |
|---|
| 109 | * Test dbDelta. |
|---|
| 110 | * |
|---|
| 111 | * 1) Delete the table |
|---|
| 112 | * 2) Create the table (and make sure it worked) |
|---|
| 113 | * 3) dbDelta the table (and make sure nothing happens) |
|---|
| 114 | * 4) dbDelta the new table def (and make sure something happens) |
|---|
| 115 | * 4) dbDelta the new table def (and make sure nothing happens) |
|---|
| 116 | */ |
|---|
| 117 | function dbDelta_test( $test_name, $table1, $table2 ) { |
|---|
| 118 | global $wpdb; |
|---|
| 119 | $wpdb->query("DROP TABLE IF EXISTS dbdelta_tests"); |
|---|
| 120 | |
|---|
| 121 | $res1 = dbDelta( $table1 ); |
|---|
| 122 | |
|---|
| 123 | if ( empty( $res1 ) ) { |
|---|
| 124 | return -1; // "Couldn't create table 1\n"; |
|---|
| 125 | } |
|---|
| 126 | |
|---|
| 127 | $res2 = dbDelta( $table1 ); |
|---|
| 128 | |
|---|
| 129 | if ( !empty( $res2 ) ) { |
|---|
| 130 | error_log(print_r($res2,true)); |
|---|
| 131 | return -2; // "Table 1 changes were incomplete\n"; |
|---|
| 132 | } |
|---|
| 133 | |
|---|
| 134 | $res3 = dbDelta( $table2 ); |
|---|
| 135 | |
|---|
| 136 | if ( empty( $res3 ) && $table1 !== $table2 ) { |
|---|
| 137 | return -3; // "Couldn't apply table 2 changes\n"; |
|---|
| 138 | } |
|---|
| 139 | |
|---|
| 140 | $res4 = dbDelta( $table2 ); |
|---|
| 141 | |
|---|
| 142 | if ( !empty( $res4 ) ) { |
|---|
| 143 | error_log(print_r($res4,true)); |
|---|
| 144 | return -4; // "Table 2 changes were incomplete\n"; |
|---|
| 145 | } |
|---|
| 146 | |
|---|
| 147 | return 0; // "OK!\n"; |
|---|
| 148 | } |
|---|
| 149 | |
|---|
| 150 | |
|---|
| 151 | /** |
|---|
| 152 | * Command line handling / run tests. |
|---|
| 153 | */ |
|---|
| 154 | |
|---|
| 155 | $testId = 0; |
|---|
| 156 | $keys = array_keys( $tables ); |
|---|
| 157 | $colwidth = 25; |
|---|
| 158 | |
|---|
| 159 | /** |
|---|
| 160 | * These are test numbers where the second table is a subset of the first, so there are no changes to be made. |
|---|
| 161 | * |
|---|
| 162 | * Unfortunately, adding additional tests breaks these numbers. |
|---|
| 163 | */ |
|---|
| 164 | $non_zero_expected_results = array( |
|---|
| 165 | 4 => -3, |
|---|
| 166 | 5 => -3, |
|---|
| 167 | 39 => -3, |
|---|
| 168 | 43 => -3, |
|---|
| 169 | 44 => -3, |
|---|
| 170 | 52 => -3, |
|---|
| 171 | 57 => -3, |
|---|
| 172 | 65 => -3, |
|---|
| 173 | 69 => -3, |
|---|
| 174 | 91 => -3, |
|---|
| 175 | 95 => -3, |
|---|
| 176 | 96 => -3, |
|---|
| 177 | 104 => -3, |
|---|
| 178 | 108 => -3, |
|---|
| 179 | 109 => -3, |
|---|
| 180 | 117 => -3, |
|---|
| 181 | 121 => -3, |
|---|
| 182 | 122 => -3, |
|---|
| 183 | 130 => -3, |
|---|
| 184 | 134 => -3, |
|---|
| 185 | 135 => -3, |
|---|
| 186 | 143 => -3, |
|---|
| 187 | 147 => -3, |
|---|
| 188 | 148 => -3, |
|---|
| 189 | ); |
|---|
| 190 | |
|---|
| 191 | $results_map = array( |
|---|
| 192 | -1 => "Couldn't create table 1", |
|---|
| 193 | -2 => "Table 1 changes were incomplete", |
|---|
| 194 | -3 => "Couldn't apply table 2 changes", |
|---|
| 195 | -4 => "Table 2 changes were incomplete", |
|---|
| 196 | 'OK' => 'OK', |
|---|
| 197 | ); |
|---|
| 198 | |
|---|
| 199 | print "Usage: php ./test.php [test number]\n"; |
|---|
| 200 | print "Results meanings:\n"; |
|---|
| 201 | |
|---|
| 202 | foreach( $results_map as $k => $res ) { |
|---|
| 203 | print "$k : $res\n"; |
|---|
| 204 | } |
|---|
| 205 | |
|---|
| 206 | print "\n"; |
|---|
| 207 | |
|---|
| 208 | foreach( $keys as $from) { |
|---|
| 209 | foreach( $keys as $to) { |
|---|
| 210 | if ( !isset( $argv[1] ) || $argv[1] == $testId ) { |
|---|
| 211 | |
|---|
| 212 | print str_pad( $testId,3,' ', STR_PAD_RIGHT); |
|---|
| 213 | print ': '; |
|---|
| 214 | print str_pad( "$from => $to", 80, ' ', STR_PAD_RIGHT); |
|---|
| 215 | |
|---|
| 216 | |
|---|
| 217 | print ': '; |
|---|
| 218 | $res = dbDelta_test( '', $tables[$from], $tables[$to] ); |
|---|
| 219 | $res = ( $res === 0 || (isset($non_zero_expected_results[ $testId ]) && $res === $non_zero_expected_results[ $testId ] ) ) ? 'OK' : $res; |
|---|
| 220 | print $res; |
|---|
| 221 | print "\n"; |
|---|
| 222 | } |
|---|
| 223 | |
|---|
| 224 | $testId++; |
|---|
| 225 | } |
|---|
| 226 | } |
|---|
| 227 | |
|---|
| 228 | print "\n"; |
|---|