Make WordPress Core

Ticket #27272: 27272.diff

File 27272.diff, 3.0 KB (added by wonderboymusic, 11 years ago)
  • src/wp-includes/meta.php

     
    833833                                $meta_value = trim( $meta_value );
    834834                        }
    835835
     836                        if ( in_array( $meta_type, array( 'SIGNED', 'UNSIGNED' ) ) ) {
     837                                $cast_string = "CAST(%s AS $meta_type)";
     838                        } else {
     839                                $cast_string = '%s';
     840                        }
     841                        $meta_compare_string = $cast_string;
     842
    836843                        if ( 'IN' == substr( $meta_compare, -2) ) {
    837                                 $meta_compare_string = '(' . substr( str_repeat( ',%s', count( $meta_value ) ), 1 ) . ')';
     844                                $meta_compare_string = '(' . substr( str_repeat( ", $cast_string", count( $meta_value ) ), 1 ) . ')';
    838845                        } elseif ( 'BETWEEN' == substr( $meta_compare, -7) ) {
    839846                                $meta_value = array_slice( $meta_value, 0, 2 );
    840                                 $meta_compare_string = '%s AND %s';
     847                                $meta_compare_string = "$cast_string AND $cast_string";
    841848                        } elseif ( 'LIKE' == substr( $meta_compare, -4 ) ) {
    842849                                $meta_value = '%' . like_escape( $meta_value ) . '%';
    843                                 $meta_compare_string = '%s';
    844                         } else {
    845                                 $meta_compare_string = '%s';
    846850                        }
    847851
    848852                        if ( ! empty( $where[$k] ) )
  • tests/phpunit/tests/meta/query.php

     
    117117                ) );
    118118                $sql = $query->get_sql( 'post', $wpdb->posts, 'ID', $this );
    119119
    120                 $this->assertEquals( 1, substr_count( $sql['where'], "CAST($wpdb->postmeta.meta_value AS CHAR) = '')" ) );
     120                $this->assertEquals( 1, substr_count( $sql['where'], "CAST($wpdb->postmeta.meta_value AS CHAR) = ''" ) );
    121121        }
    122122
    123123        /**
     
    194194                $this->assertContains( "{$wpdb->postmeta}.meta_key = 'exclude'\nOR", $sql['where'] );
    195195                $this->assertNotContains( "{$wpdb->postmeta}.post_id IS NULL", $sql['where'] );
    196196        }
     197
     198        function test_cast_both_sides() {
     199                global $wpdb;
     200
     201                $query = new WP_Meta_Query( array(
     202                        array(
     203                                'key'       => 'number_string',
     204                                'value'     => '1000000',
     205                                'compare'   => '<=',
     206                                'type'      => 'NUMERIC',
     207                        ),
     208                ) );
     209
     210                $sql = $query->get_sql( 'post', $wpdb->posts, 'ID', $this );
     211                $this->assertNotContains( "CAST({$wpdb->postmeta}.meta_value AS SIGNED) <= '1000000'", $sql['where'] );
     212                $this->assertContains( "CAST({$wpdb->postmeta}.meta_value AS SIGNED) <= CAST('1000000' AS SIGNED)", $sql['where'] );
     213        }
    197214}
  • tests/phpunit/tests/meta.php

     
    180180                ) );
    181181
    182182                $this->assertEquals( array( $post_id2, $post_id1 ), $posts->posts );
    183                 $this->assertEquals( 2, substr_count( $posts->request, 'CAST(' ) );
     183                $this->assertNotContains( "> '0'", $posts->request );
     184                $this->assertContains( "> CAST('0' AS UNSIGNED)", $posts->request );
     185                $this->assertEquals( 3, substr_count( $posts->request, 'CAST(' ) );
    184186        }
    185187
    186188        function test_meta_cache_order_asc() {