WordPress.org

Make WordPress Core

Ticket #20263: 20263.6.diff

File 20263.6.diff, 11.3 KB (added by ocean90, 19 months 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}