Make WordPress Core

Ticket #20263: 20263.6.diff

File 20263.6.diff, 11.3 KB (added by ocean90, 8 years ago)

moar tests

  • src/wp-admin/includes/upgrade.php

     
    21852185
    21862186                // For every field line specified in the query.
    21872187                foreach ($flds as $fld) {
     2188                        $fld = trim( $fld );
     2189                        $fld = trim( $fld , ", \n" );
    21882190
    21892191                        // Extract the field name.
    2190                         preg_match("|^([^ ]*)|", trim($fld), $fvals);
     2192                        preg_match("|^([^ ]*)|", $fld, $fvals);
    21912193                        $fieldname = trim( $fvals[1], '`' );
    21922194                        $fieldname_lowercased = strtolower( $fieldname );
    21932195
     
    22012203                                case 'unique':
    22022204                                case 'key':
    22032205                                        $validfield = false;
    2204                                         $indices[] = trim(trim($fld), ", \n");
     2206
     2207                                        // Normalize the index so it matches the table index structure from the database.
     2208                                        preg_match( '/^(?P<index_type>PRIMARY\s+KEY|UNIQUE\s+(?:KEY|INDEX)|FULLTEXT\s+(?:KEY|INDEX)|KEY|INDEX)\s+(?:`?(?P<index_name>\w+)`?\s+)*\((?P<column_names>.+?)\)$/im', $fld, $index_matches );
     2209                                        $index_type = strtoupper( preg_replace( '/\s+/', ' ', trim( $index_matches['index_type'] ) ) );
     2210                                        $index_type = str_replace( 'INDEX', 'KEY', $index_type );
     2211                                        $index_name = ( 'PRIMARY KEY' == $index_matches['index_type'] ) ? '' : '`' . $index_matches['index_name'] . '`';
     2212                                        $index_columns = array_map( 'trim', explode( ',', $index_matches['column_names'] ) );
     2213                                        foreach ( $index_columns as &$index_column ) {
     2214                                                preg_match( '/`?(?P<column_name>\w+)`?(?:\s*\(\s*(?P<sub_part>\d+)\s*\))?/i', $index_column, $index_column_matches );
     2215                                                $index_column = '`' . $index_column_matches['column_name'] . '`';
     2216                                                if ( isset( $index_column_matches['sub_part'] ) ) {
     2217                                                        $index_column .= '(' . $index_column_matches['sub_part'] . ')';
     2218                                                }
     2219                                        }
     2220
     2221                                        $indices[] = "{$index_type} {$index_name} (" . implode( ',', $index_columns ) . ")";
    22052222                                        break;
    22062223                        }
    2207                         $fld = trim( $fld );
    22082224
    22092225                        // If it's a valid field, add it to the field array.
    22102226                        if ( $validfield ) {
    2211                                 $cfields[ $fieldname_lowercased ] = trim( $fld, ", \n" );
     2227                                $cfields[ $fieldname_lowercased ] = $fld;
    22122228                        }
    22132229                }
    22142230
     
    22422258
    22432259                                        if ( $do_change ) {
    22442260                                                // Add a query to change the column type.
    2245                                                 $cqueries[] = "ALTER TABLE {$table} CHANGE COLUMN {$tablefield->Field} " . $cfields[ $tablefield_field_lowercased ];
     2261                                                $cqueries[] = "ALTER TABLE {$table} CHANGE COLUMN `{$tablefield->Field}` " . $cfields[ $tablefield_field_lowercased ];
    22462262                                                $for_update[$table.'.'.$tablefield->Field] = "Changed type of {$table}.{$tablefield->Field} from {$tablefield->Type} to {$fieldtype}";
    22472263                                        }
    22482264                                }
     
    22522268                                        $default_value = $matches[1];
    22532269                                        if ($tablefield->Default != $default_value) {
    22542270                                                // Add a query to change the column's default value
    2255                                                 $cqueries[] = "ALTER TABLE {$table} ALTER COLUMN {$tablefield->Field} SET DEFAULT '{$default_value}'";
     2271                                                $cqueries[] = "ALTER TABLE {$table} ALTER COLUMN `{$tablefield->Field}` SET DEFAULT '{$default_value}'";
    22562272                                                $for_update[$table.'.'.$tablefield->Field] = "Changed default value of {$table}.{$tablefield->Field} from {$tablefield->Default} to {$default_value}";
    22572273                                        }
    22582274                                }
     
    23022318                                        $index_string .= 'FULLTEXT ';
    23032319                                }
    23042320                                $index_string .= 'KEY ';
    2305                                 if ($index_name != 'PRIMARY') {
    2306                                         $index_string .= $index_name;
     2321                                if ( $index_name != 'PRIMARY' ) {
     2322                                        $index_string .= '`' . $index_name . '`';
    23072323                                }
    23082324                                $index_columns = '';
    23092325
    23102326                                // For each column in the index.
    23112327                                foreach ($index_data['columns'] as $column_data) {
    2312                                         if ($index_columns != '') $index_columns .= ',';
     2328                                        if ( $index_columns != '' ) {
     2329                                                $index_columns .= ',';
     2330                                        }
    23132331
    23142332                                        // Add the field to the column list string.
    2315                                         $index_columns .= $column_data['fieldname'];
     2333                                        $index_columns .= '`' . $column_data['fieldname'] . '`';
    23162334                                        if ($column_data['subpart'] != '') {
    23172335                                                $index_columns .= '('.$column_data['subpart'].')';
    23182336                                        }
  • tests/phpunit/tests/dbdelta.php

     
    488488
    489489                $this->assertEmpty( $updates );
    490490        }
     491
     492        /**
     493         * @ticket 20263
     494         */
     495        function test_query_with_backticks_does_not_cause_a_query_to_alter_all_columns_and_indices_to_run_even_if_none_have_changed() {
     496                global $wpdb;
     497
     498                $schema = "
     499                        CREATE TABLE {$wpdb->prefix}dbdelta_test2 (
     500                                `id` bigint(20) NOT NULL AUTO_INCREMENT,
     501                                `references` varchar(255) NOT NULL,
     502                                PRIMARY KEY  (`id`),
     503                                KEY `compound_key` (`id`,`references`)
     504                        )
     505                ";
     506
     507                $wpdb->query( $schema );
     508
     509                $updates = dbDelta( $schema );
     510
     511                $table_indices = $wpdb->get_results( "SHOW INDEX FROM {$wpdb->prefix}dbdelta_test2" );
     512                $compound_key_index = wp_list_filter( $table_indices, array( 'Key_name' => 'compound_key' ) );
     513
     514                $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}dbdelta_test2" );
     515
     516                $this->assertCount( 2, $compound_key_index );
     517                $this->assertEmpty( $updates );
     518        }
     519
     520        /**
     521         * @ticket 20263
     522         */
     523        function test_index_with_reserved_keywords_can_be_created() {
     524                global $wpdb;
     525
     526                $updates = dbDelta(
     527                        "
     528                        CREATE TABLE {$wpdb->prefix}dbdelta_test (
     529                                id bigint(20) NOT NULL AUTO_INCREMENT,
     530                                column_1 varchar(255) NOT NULL,
     531                                column_2 text,
     532                                column_3 blob,
     533                                `references` varchar(255) NOT NULL,
     534                                PRIMARY KEY  (id),
     535                                KEY key_1 (column_1),
     536                                KEY compound_key (id , column_1),
     537                                KEY compound_key2 (id,`references`),
     538                                FULLTEXT KEY fulltext_key (column_1)
     539                        ) ENGINE=MyISAM
     540                        "
     541                );
     542
     543                $table_indices = $wpdb->get_results( "SHOW INDEX FROM {$wpdb->prefix}dbdelta_test" );
     544
     545                $this->assertCount( 2, wp_list_filter( $table_indices, array( 'Key_name' => 'compound_key2' ) , 'AND' ) );
     546
     547                $this->assertSame(
     548                        array(
     549                                "{$wpdb->prefix}dbdelta_test.references" => "Added column {$wpdb->prefix}dbdelta_test.references",
     550                                0 => "Added index {$wpdb->prefix}dbdelta_test KEY `compound_key2` (`id`,`references`)",
     551                        ),
     552                        $updates
     553                );
     554        }
     555
     556        /**
     557         * @ticket 20263
     558         */
     559        function test_wp_get_db_schema_does_no_alter_queries_on_existing_install() {
     560                $updates = dbDelta( wp_get_db_schema() );
     561
     562                $this->assertEmpty( $updates );
     563        }
     564
     565        /**
     566         * @ticket 20263
     567         */
     568        function test_all_possible_index_types_are_supported() {
     569                global $wpdb;
     570
     571                $schema = "
     572                        CREATE TABLE {$wpdb->prefix}dbdelta_test (
     573                                id bigint(20) NOT NULL AUTO_INCREMENT,
     574                                column_1 varchar(255) NOT NULL,
     575                                column_2 text,
     576                                column_3 blob,
     577                                PRIMARY KEY  (id),
     578                                KEY key_1 (column_1),
     579                                KEY compound_key (id,column_1),
     580                                FULLTEXT KEY fulltext_key (column_1),
     581                                INDEX key_2 (column_1),
     582                                UNIQUE KEY key_3 (column_1),
     583                                UNIQUE INDEX key_4 (column_1),
     584                                FULLTEXT INDEX key_5 (column_1),
     585                        ) ENGINE=MyISAM
     586                ";
     587
     588                $creates = dbDelta( $schema );
     589                $this->assertSame(
     590                        array(
     591                                0 => "Added index {$wpdb->prefix}dbdelta_test KEY `key_2` (`column_1`)",
     592                                1 => "Added index {$wpdb->prefix}dbdelta_test UNIQUE KEY `key_3` (`column_1`)",
     593                                2 => "Added index {$wpdb->prefix}dbdelta_test UNIQUE KEY `key_4` (`column_1`)",
     594                                3 => "Added index {$wpdb->prefix}dbdelta_test FULLTEXT KEY `key_5` (`column_1`)",
     595                        ),
     596                        $creates
     597                );
     598
     599                $updates = dbDelta( $schema );
     600                $this->assertEmpty( $updates );
     601        }
     602
     603        /**
     604         * @ticket 20263
     605         */
     606        function test_index_and_key_is_the_same_and_does_not_recreate_index() {
     607                global $wpdb;
     608
     609                $updates = dbDelta(
     610                        "
     611                        CREATE TABLE {$wpdb->prefix}dbdelta_test (
     612                                id bigint(20) NOT NULL AUTO_INCREMENT,
     613                                column_1 varchar(255) NOT NULL,
     614                                column_2 text,
     615                                column_3 blob,
     616                                PRIMARY KEY  (id),
     617                                INDEX key_1 (column_1),
     618                                INDEX compound_key (id,column_1),
     619                                FULLTEXT INDEX fulltext_key (column_1)
     620                        ) ENGINE=MyISAM
     621                        "
     622                );
     623
     624                $this->assertEmpty( $updates );
     625        }
     626
     627        /**
     628         * @ticket 20263
     629         */
     630        function test_indices_with_prefix_limits_are_created_and_do_not_cause_an_index_recreate() {
     631                global $wpdb;
     632
     633                $schema = "
     634                        CREATE TABLE {$wpdb->prefix}dbdelta_test (
     635                                id bigint(20) NOT NULL AUTO_INCREMENT,
     636                                column_1 varchar(255) NOT NULL,
     637                                column_2 text,
     638                                column_3 blob,
     639                                PRIMARY KEY  (id),
     640                                KEY key_1 (column_1),
     641                                KEY compound_key (id,column_1),
     642                                FULLTEXT KEY fulltext_key (column_1),
     643                                KEY key_2 (column_1(10)),
     644                                KEY key_3 (column_2(100),column_1(10)),
     645                        ) ENGINE=MyISAM
     646                ";
     647
     648                $creates = dbDelta( $schema );
     649                $this->assertSame(
     650                        array(
     651                                0 => "Added index {$wpdb->prefix}dbdelta_test KEY `key_2` (`column_1`(10))",
     652                                1 => "Added index {$wpdb->prefix}dbdelta_test KEY `key_3` (`column_2`(100),`column_1`(10))",
     653                        ),
     654                        $creates
     655                );
     656
     657                $updates = dbDelta( $schema );
     658                $this->assertEmpty( $updates );
     659        }
     660
     661        /**
     662         * @ticket 34959
     663         */
     664        function test_index_col_name_with_order_does_not_recreate_index() {
     665                global $wpdb;
     666
     667                $updates = dbDelta(
     668                        "
     669                        CREATE TABLE {$wpdb->prefix}dbdelta_test (
     670                                id bigint(20) NOT NULL AUTO_INCREMENT,
     671                                column_1 varchar(255) NOT NULL,
     672                                column_2 text,
     673                                column_3 blob,
     674                                PRIMARY KEY  (id),
     675                                KEY key_1 (column_1 DESC),
     676                                KEY compound_key (id,column_1 ASC),
     677                                FULLTEXT KEY fulltext_key (column_1)
     678                        ) ENGINE=MyISAM
     679                        "
     680                );
     681
     682                $this->assertEmpty( $updates );
     683        }
     684
     685        /**
     686         * @ticket 34873
     687         */
     688        function test_primary_key_with_single_space_does_not_recreate_index() {
     689                global $wpdb;
     690
     691                $updates = dbDelta(
     692                        "
     693                        CREATE TABLE {$wpdb->prefix}dbdelta_test (
     694                                id bigint(20) NOT NULL AUTO_INCREMENT,
     695                                column_1 varchar(255) NOT NULL,
     696                                column_2 text,
     697                                column_3 blob,
     698                                PRIMARY KEY (id),
     699                                KEY key_1 (column_1),
     700                                KEY compound_key (id,column_1),
     701                                FULLTEXT KEY fulltext_key (column_1)
     702                        ) ENGINE=MyISAM
     703                        "
     704                );
     705
     706                $this->assertEmpty( $updates );
     707        }
     708
     709        /**
     710         * @ticket 34869
     711         */
     712        function test_index_definitions_with_spaces_do_not_recreate_indices() {
     713                global $wpdb;
     714
     715                $updates = dbDelta(
     716                        "
     717                        CREATE TABLE {$wpdb->prefix}dbdelta_test (
     718                                id bigint(20) NOT NULL AUTO_INCREMENT,
     719                                column_1 varchar(255) NOT NULL,
     720                                column_2 text,
     721                                column_3 blob,
     722                                PRIMARY KEY  (id),
     723                                KEY key_1 (column_1),
     724                                KEY compound_key (id,      column_1),
     725                                FULLTEXT KEY fulltext_key (column_1)
     726                        ) ENGINE=MyISAM
     727                        "
     728                );
     729
     730                $this->assertEmpty( $updates );
     731        }
     732
     733        /**
     734         * @ticket 34871
     735         */
     736        function test_index_types_are_not_case_sensitive_and_do_not_recreate_indices() {
     737                global $wpdb;
     738
     739                $updates = dbDelta(
     740                        "
     741                        CREATE TABLE {$wpdb->prefix}dbdelta_test (
     742                                id bigint(20) NOT NULL AUTO_INCREMENT,
     743                                column_1 varchar(255) NOT NULL,
     744                                column_2 text,
     745                                column_3 blob,
     746                                PRIMARY KEY  (id),
     747                                key key_1 (column_1),
     748                                key compound_key (id,column_1),
     749                                FULLTEXT KEY fulltext_key (column_1)
     750                        ) ENGINE=MyISAM
     751                        "
     752                );
     753
     754                $this->assertEmpty( $updates );
     755        }
     756
     757        /**
     758         * @ticket 34874
     759         */
     760        function test_index_names_are_not_case_sensitive_and_do_not_recreate_indices() {
     761                $this->markTestSkipped();
     762                global $wpdb;
     763
     764                $updates = dbDelta(
     765                        "
     766                        CREATE TABLE {$wpdb->prefix}dbdelta_test (
     767                                id bigint(20) NOT NULL AUTO_INCREMENT,
     768                                column_1 varchar(255) NOT NULL,
     769                                column_2 text,
     770                                column_3 blob,
     771                                PRIMARY KEY  (id),
     772                                KEY key_1 (column_1),
     773                                KEY COMPOUND_KEY (id,column_1),
     774                                FULLTEXT KEY fulltext_key (column_1)
     775                        ) ENGINE=MyISAM
     776                        "
     777                );
     778
     779                $this->assertEmpty( $updates );
     780        }
    491781}