WordPress.org

Make WordPress Core

Changeset 30587


Ignore:
Timestamp:
11/27/2014 10:59:10 AM (6 years ago)
Author:
pento
Message:

WPDB: Remove the addition of STRICT_ALL_TABLES, added in [30400]. This proved to be incompatible with too many plugins, as well as being incompatible with MySQL 5.7.

See #21212.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/wp-db.php

    r30546 r30587  
    567567     * @var array
    568568     */
    569     protected $incompatible_modes = array( 'NO_ZERO_DATE', 'ONLY_FULL_GROUP_BY', 'TRADITIONAL' );
    570 
    571     /**
    572      * A list of required SQL modes.
    573      *
    574      * @since 4.1.0
    575      * @access protected
    576      * @var array
    577      */
    578     protected $required_modes = array( 'STRICT_ALL_TABLES' );
     569    protected $incompatible_modes = array( 'NO_ZERO_DATE', 'ONLY_FULL_GROUP_BY',
     570        'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'TRADITIONAL' );
    579571
    580572    /**
     
    787779    public function set_sql_mode( $modes = array() ) {
    788780        if ( empty( $modes ) ) {
    789             $modes = $this->get_var( "SELECT @@SESSION.sql_mode" );
    790             if ( $modes ) {
    791                 $modes = $original_modes = explode( ',', $modes );
     781            if ( $this->use_mysqli ) {
     782                $res = mysqli_query( $this->dbh, 'SELECT @@SESSION.sql_mode' );
    792783            } else {
    793                 $modes = $original_modes = array();
    794             }
     784                $res = mysql_query( 'SELECT @@SESSION.sql_mode', $this->dbh );
     785            }
     786
     787            if ( empty( $res ) ) {
     788                return;
     789            }
     790
     791            if ( $this->use_mysqli ) {
     792                $modes_array = mysqli_fetch_array( $res );
     793                if ( empty( $modes_array[0] ) ) {
     794                    return;
     795                }
     796                $modes_str = $modes_array[0];
     797            } else {
     798                $modes_str = mysql_result( $res, 0 );
     799            }
     800
     801            if ( empty( $modes_str ) ) {
     802                return;
     803            }
     804
     805            $modes = explode( ',', $modes_str );
    795806        }
    796807
     
    806817        $incompatible_modes = (array) apply_filters( 'incompatible_sql_modes', $this->incompatible_modes );
    807818
    808         /**
    809          * Filter the list of required SQL modes to include.
    810          *
    811          * @since 4.1.0
    812          *
    813          * @param array $required_modes An array of required modes.
    814          */
    815         $required_modes = (array) apply_filters( 'required_sql_modes', $this->required_modes );
    816 
    817         $modes = array_diff( $modes, $incompatible_modes );
    818         $modes = array_unique( array_merge( $modes, $required_modes ) );
    819 
    820         // Don't run SET SESSION if we have nothing to change.
    821         if ( isset( $original_modes ) ) {
    822             sort( $original_modes );
    823             sort( $modes );
    824             if ( $original_modes === $modes ) {
    825                 return;
     819        foreach( $modes as $i => $mode ) {
     820            if ( in_array( $mode, $incompatible_modes ) ) {
     821                unset( $modes[ $i ] );
    826822            }
    827823        }
     
    829825        $modes_str = implode( ',', $modes );
    830826
    831         $this->query( "SET SESSION sql_mode='$modes_str'" );
    832         if ( $this->last_error ) {
    833             dead_db();
     827        if ( $this->use_mysqli ) {
     828            mysqli_query( $this->dbh, "SET SESSION sql_mode='$modes_str'" );
     829        } else {
     830            mysql_query( "SET SESSION sql_mode='$modes_str'", $this->dbh );
    834831        }
    835832    }
  • trunk/tests/phpunit/tests/db.php

    r30528 r30587  
    282282        $current_modes = $wpdb->get_var( 'SELECT @@SESSION.sql_mode;' );
    283283
    284         $new_modes = $expected_modes = array( 'IGNORE_SPACE', 'NO_AUTO_CREATE_USER' );
    285         $expected_modes[] = 'STRICT_ALL_TABLES';
     284        $new_modes = array( 'IGNORE_SPACE', 'NO_AUTO_CREATE_USER' );
    286285
    287286        $wpdb->set_sql_mode( $new_modes );
    288287
    289288        $check_new_modes = $wpdb->get_var( 'SELECT @@SESSION.sql_mode;' );
    290         $this->assertEqualSets( $expected_modes, explode( ',', $check_new_modes ) );
     289        $this->assertEqualSets( $new_modes, explode( ',', $check_new_modes ) );
    291290
    292291        $wpdb->set_sql_mode( explode( ',', $current_modes ) );
     
    341340        unset( $modes[ $pos ] );
    342341        return $modes;
    343     }
    344 
    345     /**
    346      * @ticket 21212
    347      */
    348     function test_set_sql_mode_strict() {
    349         global $wpdb;
    350         $wpdb->set_sql_mode();
    351         $sql_modes = $wpdb->get_var( 'SELECT @@SESSION.sql_mode;' );
    352         $this->assertContains( 'STRICT_ALL_TABLES', explode( ',', $sql_modes ) );
    353     }
    354 
    355     /**
    356      * @ticket 21212
    357      */
    358     function test_strict_mode_numeric_strings() {
    359         global $wpdb;
    360         $post_id = $this->factory->post->create();
    361         $wpdb->update( $wpdb->posts, array( 'post_parent' => 4 ), array( 'ID' => $post_id ), array( '%s' ) );
    362         $this->assertContains( "`post_parent` = '4'", $wpdb->last_query );
    363         $this->assertEmpty( $wpdb->last_error );
    364     }
    365 
    366     /**
    367      * @ticket 21212
    368      */
    369     function test_strict_mode_numeric_strings_using_query() {
    370         global $wpdb;
    371         $post_id = $this->factory->post->create();
    372         $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_parent = %s WHERE ID = %s", '4', $post_id ) );
    373         $this->assertEmpty( $wpdb->last_error );
    374     }
    375 
    376     /**
    377      * @ticket 21212
    378      */
    379     function test_strict_mode_nan() {
    380         global $wpdb;
    381         $post_id = $this->factory->post->create();
    382         $suppress = $wpdb->suppress_errors( true );
    383         $wpdb->update( $wpdb->posts, array( 'post_parent' => 'foo' ), array( 'ID' => $post_id ), array( '%s' ) );
    384         $this->assertContains( "`post_parent` = 'foo'", $wpdb->last_query );
    385         $this->assertContains( 'Incorrect integer value', $wpdb->last_error );
    386         $wpdb->suppress_errors( $suppress );
    387     }
    388 
    389     /**
    390      * @ticket 21212
    391      */
    392     function test_strict_mode_nan_using_query() {
    393         global $wpdb;
    394         $post_id = $this->factory->post->create();
    395         $suppress = $wpdb->suppress_errors( true );
    396         $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_parent = %s WHERE ID = %s", 'foo', $post_id ) );
    397         $this->assertContains( 'Incorrect integer value', $wpdb->last_error );
    398         $wpdb->suppress_errors( $suppress );
    399     }
    400 
    401     /**
    402      * @ticket 21212
    403      */
    404     function test_strict_mode_number_start_of_string() {
    405         global $wpdb;
    406         $post_id = $this->factory->post->create();
    407         $suppress = $wpdb->suppress_errors( true );
    408         $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_parent = %s WHERE ID = %s", '4foo', $post_id ) );
    409         $this->assertContains( "Data truncated for column 'post_parent'", $wpdb->last_error );
    410         $wpdb->suppress_errors( $suppress );
    411     }
    412 
    413     /**
    414      * @ticket 21212
    415      */
    416     function test_strict_mode_booleans_true() {
    417         global $wpdb;
    418         $user_id = $this->factory->user->create();
    419         $wpdb->query( "UPDATE $wpdb->users SET user_status = true WHERE ID = $user_id" );
    420         $this->assertEmpty( $wpdb->last_error );
    421         $user = get_userdata( $user_id );
    422         $this->assertSame( '1', $user->user_status );
    423     }
    424 
    425     /**
    426      * @ticket 21212
    427      */
    428     function test_strict_mode_booleans_false() {
    429         global $wpdb;
    430         $user_id = $this->factory->user->create();
    431         $wpdb->query( "UPDATE $wpdb->users SET user_status = false WHERE ID = $user_id" );
    432         $this->assertEmpty( $wpdb->last_error );
    433         $user = get_userdata( $user_id );
    434         $this->assertEquals( '0', $user->user_status );
    435     }
    436 
    437     /**
    438      * @ticket 21212
    439      */
    440     function test_strict_mode_zero_date_is_valid() {
    441         global $wpdb;
    442         $user_id = $this->factory->user->create();
    443         $wpdb->query( "UPDATE $wpdb->users SET user_registered = '0000-00-00' WHERE ID = $user_id" );
    444         $this->assertEmpty( $wpdb->last_error );
    445         $user = get_userdata( $user_id );
    446         $this->assertEquals( '0000-00-00 00:00:00', $user->user_registered );
    447     }
    448 
    449     /**
    450      * @ticket 21212
    451      */
    452     function test_strict_mode_zero_datetime_is_valid() {
    453         global $wpdb;
    454         $user_id = $this->factory->user->create();
    455         $wpdb->query( "UPDATE $wpdb->users SET user_registered = '0000-00-00 00:00:00' WHERE ID = $user_id" );
    456         $this->assertEmpty( $wpdb->last_error );
    457         $user = get_userdata( $user_id );
    458         $this->assertEquals( '0000-00-00 00:00:00', $user->user_registered );
    459     }
    460 
    461     /**
    462      * @ticket 21212
    463      */
    464     function test_strict_mode_invalid_dates_are_invalid() {
    465         global $wpdb;
    466         $user_id = $this->factory->user->create();
    467         $suppress = $wpdb->suppress_errors( true );
    468         $wpdb->query( "UPDATE $wpdb->users SET user_registered = '2014-02-29 00:00:00' WHERE ID = $user_id" );
    469         $this->assertContains( 'Incorrect datetime value', $wpdb->last_error );
    470         $wpdb->suppress_errors( $suppress );
    471     }
    472 
    473     /**
    474      * @ticket 21212
    475      */
    476     function test_strict_mode_nulls_are_invalid() {
    477         global $wpdb;
    478         $user_id = $this->factory->user->create();
    479         $suppress = $wpdb->suppress_errors( true );
    480         $wpdb->query( "UPDATE $wpdb->users SET user_nicename = NULL WHERE ID = $user_id" );
    481         $this->assertContains( 'cannot be null', $wpdb->last_error );
    482         $wpdb->suppress_errors( $suppress );
    483342    }
    484343
Note: See TracChangeset for help on using the changeset viewer.