WPDB: When deciding if a query needs extra sanity checking based on collation, we can quickly return if it's a query that will never return user data.

Fixes #32029.



git-svn-id: https://develop.svn.wordpress.org/trunk@32232 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Gary Pendergast 2015-04-21 05:10:11 +00:00
parent 9a4b6405bc
commit 0fe5a64e56
2 changed files with 25 additions and 2 deletions

View File

@ -2399,20 +2399,32 @@ class wpdb {
return true;
}
// We don't need to check the collation for queries that don't read data.
$query = ltrim( $query, "\r\n\t (" );
if ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN)\s/i', $query ) ) {
return true;
}
$table = $this->get_table_from_query( $query );
if ( ! $table ) {
return false;
}
$this->checking_collation = true;
$this->get_table_charset( $table );
$collation = $this->get_table_charset( $table );
$this->checking_collation = false;
// Tables with no collation, or latin1 only, don't need extra checking.
if ( false === $collation || 'latin1' === $collation ) {
return true;
}
$table = strtolower( $table );
if ( empty( $this->col_meta[ $table ] ) ) {
return false;
}
// If any of the columns don't have one of these collations, it needs more sanity checking.
foreach( $this->col_meta[ $table ] as $col ) {
if ( empty( $col->Collation ) ) {
continue;

View File

@ -505,6 +505,12 @@ class Tests_DB_Charset extends WP_UnitTestCase {
$value[0] = "CREATE TABLE $this_table_name {$value[0]}";
$value[2] = "SELECT * FROM $this_table_name";
$value[3] = "DROP TABLE IF EXISTS $this_table_name";
$value[4] = array(
"SHOW FULL TABLES LIKE $this_table_name",
"DESCRIBE $this_table_name",
"DESC $this_table_name",
"EXPLAIN SELECT * FROM $this_table_name",
);
}
unset( $value );
@ -516,7 +522,7 @@ class Tests_DB_Charset extends WP_UnitTestCase {
* @dataProvider data_table_collation_check
* @ticket 21212
*/
function test_table_collation_check( $create, $expected, $query, $drop ) {
function test_table_collation_check( $create, $expected, $query, $drop, $always_true ) {
self::$_wpdb->query( $drop );
self::$_wpdb->query( $create );
@ -524,6 +530,11 @@ class Tests_DB_Charset extends WP_UnitTestCase {
$return = self::$_wpdb->check_safe_collation( $query );
$this->assertEquals( $expected, $return );
foreach( $always_true as $true_query ) {
$return = self::$_wpdb->check_safe_collation( $true_query );
$this->assertTrue( $return );
}
self::$_wpdb->query( $drop );
}
}