Make WordPress Core

Changeset 37594

Timestamp:
05/30/2016 04:35:16 AM (8 years ago)
Author:
boonebgorges
Message:

In WP_Meta_Query, don't cast meta_value to CHAR.

CHAR is redundant, since the meta_value column is LONGTEXT. Meanwhile,
use of CAST() causes MySQL to ignore any index that the administrator may
have added to the column.

A number of automated tests were doing searches for CAST in the SQL strings
generated by WP_Meta_Query (for reasons unrelated to the CAST() behavior).
These tests have been updated to expect the new query format.

Props ericlewis.
Fixes #36625.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-meta-query.php

    r37492 r37594  
    633633
    634634            if ( $where ) {
    635                 $sql_chunks['where'][] = "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}";
     635                if ( 'CHAR' === $meta_type ) {
     636                    $sql_chunks['where'][] = "$alias.meta_value {$meta_compare} {$where}";
     637                } else {
     638                    $sql_chunks['where'][] = "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}";
     639                }
    636640            }
    637641        }
  • trunk/tests/phpunit/tests/meta/query.php

    r32713 r37594  
    494494        $sql = $query->get_sql( 'post', $wpdb->posts, 'ID', $this );
    495495
    496         $this->assertEquals( 1, substr_count( $sql['where'], "CAST($wpdb->postmeta.meta_value AS CHAR) = ''" ) );
     496        $this->assertEquals( 1, substr_count( $sql['where'], " = ''" ) );
    497497    }
    498498
     
    602602        $sql = $query->get_sql( 'post', $wpdb->posts, 'ID', $this );
    603603
    604         $this->assertSame( 1, substr_count( $sql['where'], "CAST($wpdb->postmeta.meta_value AS CHAR) = ''" ) );
     604        $this->assertSame( 1, substr_count( $sql['where'], " = ''" ) );
    605605    }
    606606
     
    633633        $sql = $query->get_sql( 'post', $wpdb->posts, 'ID', $this );
    634634
    635         $this->assertSame( 1, substr_count( $sql['where'], "CAST($wpdb->postmeta.meta_value AS CHAR) IN" ) );
     635        $this->assertSame( 1, substr_count( $sql['where'], " IN" ) );
    636636    }
    637637
     
    648648        $sql = $query->get_sql( 'post', $wpdb->posts, 'ID', $this );
    649649
    650         $this->assertSame( 1, substr_count( $sql['where'], "CAST($wpdb->postmeta.meta_value AS CHAR) =" ) );
     650        $this->assertSame( 1, substr_count( $sql['where'], " =" ) );
    651651    }
    652652
     
    664664        $sql = $query->get_sql( 'post', $wpdb->posts, 'ID', $this );
    665665
    666         $this->assertSame( 1, substr_count( $sql['where'], "CAST($wpdb->postmeta.meta_value AS CHAR) =" ) );
     666        $this->assertSame( 1, substr_count( $sql['where'], " =" ) );
    667667    }
    668668
     
    761761        $sql = $query->get_sql( 'post', $wpdb->posts, 'ID', $this );
    762762
    763         $this->assertSame( 1, substr_count( $sql['where'], "CAST($wpdb->postmeta.meta_value AS CHAR) = 'bar'" ) );
     763        $this->assertSame( 1, substr_count( $sql['where'], " = 'bar'" ) );
    764764    }
    765765
Note: See TracChangeset for help on using the changeset viewer.