e72fff9cef
This avoids the performance overhead of the function call every time `dirname( __FILE__ )` was used instead of `__DIR__`. This commit also includes: * Removing unnecessary parentheses from `include`/`require` statements. These are language constructs, not function calls. * Replacing `include` statements for several files with `require_once`, for consistency: * `wp-admin/admin-header.php` * `wp-admin/admin-footer.php` * `wp-includes/version.php` Props ayeshrajans, desrosj, valentinbora, jrf, joostdevalk, netweb. Fixes #48082. git-svn-id: https://develop.svn.wordpress.org/trunk@47198 602fd350-edb4-49c9-b593-d223f7449a82
1073 lines
27 KiB
PHP
1073 lines
27 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Test dbDelta()
|
|
*
|
|
* @group upgrade
|
|
* @group dbdelta
|
|
*/
|
|
class Tests_dbDelta extends WP_UnitTestCase {
|
|
|
|
/**
|
|
* The maximum size of an index with utf8mb4 collation and charset with a standard
|
|
* byte limit of 767. floor(767/4) = 191 characters.
|
|
*/
|
|
protected $max_index_length = 191;
|
|
|
|
/**
|
|
* Database engine used for creating tables.
|
|
*
|
|
* Prior to MySQL 5.7, InnoDB did not support FULLTEXT indexes, so MyISAM is used instead.
|
|
*/
|
|
protected $db_engine = '';
|
|
|
|
/**
|
|
* Display width for BIGINT data type.
|
|
*
|
|
* Prior to MySQL 8.0.17, default width of 20 digits was used: BIGINT(20).
|
|
* Since MySQL 8.0.17, display width for integer data types is no longer supported.
|
|
*/
|
|
protected $bigint_display_width = '';
|
|
|
|
/**
|
|
* Make sure the upgrade code is loaded before the tests are run.
|
|
*/
|
|
public static function setUpBeforeClass() {
|
|
|
|
parent::setUpBeforeClass();
|
|
|
|
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
|
|
}
|
|
|
|
/**
|
|
* Create a custom table to be used in each test.
|
|
*/
|
|
public function setUp() {
|
|
|
|
global $wpdb;
|
|
|
|
$db_version = $wpdb->db_version();
|
|
|
|
if ( version_compare( $db_version, '5.7', '<' ) ) {
|
|
// Prior to MySQL 5.7, InnoDB did not support FULLTEXT indexes, so MyISAM is used instead.
|
|
$this->db_engine = 'ENGINE=MyISAM';
|
|
}
|
|
|
|
if ( version_compare( $db_version, '8.0.17', '<' ) ) {
|
|
// Prior to MySQL 8.0.17, default width of 20 digits was used: BIGINT(20).
|
|
$this->bigint_display_width = '(20)';
|
|
}
|
|
|
|
$wpdb->query(
|
|
$wpdb->prepare(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (" .
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
|
"id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1(%d)),
|
|
KEY compound_key (id,column_1(%d)),
|
|
FULLTEXT KEY fulltext_key (column_1)" .
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
|
") {$this->db_engine}
|
|
",
|
|
$this->max_index_length,
|
|
$this->max_index_length
|
|
)
|
|
);
|
|
|
|
parent::setUp();
|
|
}
|
|
|
|
/**
|
|
* Delete the custom table on teardown.
|
|
*/
|
|
public function tearDown() {
|
|
|
|
global $wpdb;
|
|
|
|
parent::tearDown();
|
|
|
|
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}dbdelta_test" );
|
|
}
|
|
|
|
/**
|
|
* Test table creation.
|
|
*/
|
|
public function test_creating_a_table() {
|
|
|
|
remove_filter( 'query', array( $this, '_create_temporary_tables' ) );
|
|
remove_filter( 'query', array( $this, '_drop_temporary_tables' ) );
|
|
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"CREATE TABLE {$wpdb->prefix}dbdelta_create_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
PRIMARY KEY (id)
|
|
);"
|
|
);
|
|
|
|
$expected = array(
|
|
"{$wpdb->prefix}dbdelta_create_test" => "Created table {$wpdb->prefix}dbdelta_create_test",
|
|
);
|
|
|
|
$this->assertEquals( $expected, $updates );
|
|
|
|
$this->assertEquals(
|
|
"{$wpdb->prefix}dbdelta_create_test",
|
|
$wpdb->get_var(
|
|
$wpdb->prepare(
|
|
'SHOW TABLES LIKE %s',
|
|
$wpdb->esc_like( "{$wpdb->prefix}dbdelta_create_test" )
|
|
)
|
|
)
|
|
);
|
|
|
|
$wpdb->query( "DROP TABLE {$wpdb->prefix}dbdelta_create_test" );
|
|
}
|
|
|
|
/**
|
|
* Test that it does nothing for an existing table.
|
|
*/
|
|
public function test_existing_table() {
|
|
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id,column_1($this->max_index_length))
|
|
)
|
|
"
|
|
);
|
|
|
|
$this->assertEquals( array(), $updates );
|
|
}
|
|
|
|
/**
|
|
* Test the column type is updated.
|
|
*/
|
|
public function test_column_type_change() {
|
|
|
|
global $wpdb;
|
|
|
|
// id: bigint => int(11)
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id int(11) NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id,column_1($this->max_index_length))
|
|
)
|
|
"
|
|
);
|
|
|
|
$this->assertEquals(
|
|
array(
|
|
"{$wpdb->prefix}dbdelta_test.id"
|
|
=> "Changed type of {$wpdb->prefix}dbdelta_test.id from bigint{$this->bigint_display_width} to int(11)",
|
|
),
|
|
$updates
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Test new column added.
|
|
*/
|
|
public function test_column_added() {
|
|
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
extra_col longtext,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id,column_1($this->max_index_length))
|
|
)
|
|
"
|
|
);
|
|
|
|
$this->assertEquals(
|
|
array(
|
|
"{$wpdb->prefix}dbdelta_test.extra_col"
|
|
=> "Added column {$wpdb->prefix}dbdelta_test.extra_col",
|
|
),
|
|
$updates
|
|
);
|
|
|
|
$this->assertTableHasColumn( 'column_1', $wpdb->prefix . 'dbdelta_test' );
|
|
$this->assertTableHasPrimaryKey( 'id', $wpdb->prefix . 'dbdelta_test' );
|
|
}
|
|
|
|
/**
|
|
* Test that it does nothing when a column is removed.
|
|
*
|
|
* @ticket 26801
|
|
*/
|
|
public function test_columns_arent_removed() {
|
|
|
|
global $wpdb;
|
|
|
|
// No column column_1.
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id,column_1($this->max_index_length))
|
|
)
|
|
"
|
|
);
|
|
|
|
$this->assertEquals( array(), $updates );
|
|
|
|
$this->assertTableHasColumn( 'column_1', $wpdb->prefix . 'dbdelta_test' );
|
|
}
|
|
|
|
/**
|
|
* Test that nothing happens with $execute is false.
|
|
*/
|
|
public function test_no_execution() {
|
|
|
|
global $wpdb;
|
|
|
|
// Added column extra_col.
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
extra_col longtext,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1({$this->max_index_length})),
|
|
KEY compound_key (id,column_1($this->max_index_length))
|
|
)
|
|
",
|
|
false // Don't execute.
|
|
);
|
|
|
|
$this->assertEquals(
|
|
array(
|
|
"{$wpdb->prefix}dbdelta_test.extra_col"
|
|
=> "Added column {$wpdb->prefix}dbdelta_test.extra_col",
|
|
),
|
|
$updates
|
|
);
|
|
|
|
$this->assertTableHasNotColumn( 'extra_col', $wpdb->prefix . 'dbdelta_test' );
|
|
}
|
|
|
|
/**
|
|
* Test inserting into the database
|
|
*/
|
|
public function test_insert_into_table() {
|
|
global $wpdb;
|
|
|
|
$insert = dbDelta(
|
|
"INSERT INTO {$wpdb->prefix}dbdelta_test (column_1) VALUES ('wcphilly2015')"
|
|
);
|
|
|
|
$this->assertEquals(
|
|
array(),
|
|
$insert
|
|
);
|
|
|
|
$this->assertTableRowHasValue( 'column_1', 'wcphilly2015', $wpdb->prefix . 'dbdelta_test' );
|
|
|
|
}
|
|
|
|
/**
|
|
* Test that FULLTEXT indexes are detected.
|
|
*
|
|
* @ticket 14445
|
|
*/
|
|
public function test_fulltext_index() {
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
)
|
|
",
|
|
false
|
|
);
|
|
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
//
|
|
// Assertions.
|
|
//
|
|
|
|
/**
|
|
* Assert that a table has a row with a value in a field.
|
|
*
|
|
* @param string $column The field name.
|
|
* @param string $value The field value.
|
|
* @param string $table The database table name.
|
|
*/
|
|
protected function assertTableRowHasValue( $column, $value, $table ) {
|
|
global $wpdb;
|
|
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
|
$table_row = $wpdb->get_row( "select $column from {$table} where $column = '$value'" );
|
|
|
|
$expected = (object) array(
|
|
$column => $value,
|
|
);
|
|
|
|
$this->assertEquals( $expected, $table_row );
|
|
}
|
|
|
|
/**
|
|
* Assert that a table has a column.
|
|
*
|
|
* @param string $column The field name.
|
|
* @param string $table The database table name.
|
|
*/
|
|
protected function assertTableHasColumn( $column, $table ) {
|
|
global $wpdb;
|
|
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
|
$table_fields = $wpdb->get_results( "DESCRIBE $table" );
|
|
|
|
$this->assertCount( 1, wp_list_filter( $table_fields, array( 'Field' => $column ) ) );
|
|
}
|
|
|
|
/**
|
|
* Assert that a table has a primary key.
|
|
*
|
|
* Checks for single-column primary keys. May not work for multi-column primary keys.
|
|
*
|
|
* @param string $column The column for the primary key.
|
|
* @param string $table The database table name.
|
|
*/
|
|
protected function assertTableHasPrimaryKey( $column, $table ) {
|
|
global $wpdb;
|
|
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
|
$table_indices = $wpdb->get_results( "SHOW INDEX FROM $table" );
|
|
|
|
$this->assertCount(
|
|
1,
|
|
wp_list_filter(
|
|
$table_indices,
|
|
array(
|
|
'Key_name' => 'PRIMARY',
|
|
'Column_name' => $column,
|
|
),
|
|
'AND'
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Assert that a table doesn't have a column.
|
|
*
|
|
* @param string $column The field name.
|
|
* @param string $table The database table name.
|
|
*/
|
|
protected function assertTableHasNotColumn( $column, $table ) {
|
|
|
|
global $wpdb;
|
|
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
|
$table_fields = $wpdb->get_results( "DESCRIBE $table" );
|
|
|
|
$this->assertCount( 0, wp_list_filter( $table_fields, array( 'Field' => $column ) ) );
|
|
}
|
|
|
|
/**
|
|
* @ticket 31869
|
|
*/
|
|
function test_truncated_index() {
|
|
global $wpdb;
|
|
|
|
if ( ! $wpdb->has_cap( 'utf8mb4' ) ) {
|
|
$this->markTestSkipped( 'This test requires utf8mb4 support in MySQL.' );
|
|
}
|
|
|
|
// This table needs to be actually created.
|
|
remove_filter( 'query', array( $this, '_create_temporary_tables' ) );
|
|
remove_filter( 'query', array( $this, '_drop_temporary_tables' ) );
|
|
|
|
$table_name = "{$wpdb->prefix}test_truncated_index";
|
|
|
|
$create = "
|
|
CREATE TABLE $table_name (
|
|
a varchar(255) COLLATE utf8mb4_unicode_ci,
|
|
KEY a_key (a)
|
|
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC";
|
|
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
|
$wpdb->query( $create );
|
|
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
|
$index = $wpdb->get_row( "SHOW INDEXES FROM $table_name WHERE Key_name='a_key';" );
|
|
|
|
$actual = dbDelta( $create, false );
|
|
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
|
$wpdb->query( "DROP TABLE IF EXISTS $table_name;" );
|
|
|
|
if ( 191 !== $index->Sub_part ) {
|
|
$this->markTestSkipped( 'This test requires the index to be truncated.' );
|
|
}
|
|
|
|
$this->assertSame( array(), $actual );
|
|
}
|
|
|
|
/**
|
|
* @ticket 36748
|
|
*/
|
|
function test_dont_downsize_text_fields() {
|
|
global $wpdb;
|
|
|
|
$result = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 tinytext,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1({$this->max_index_length})),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
",
|
|
false
|
|
);
|
|
|
|
$this->assertSame( array(), $result );
|
|
}
|
|
|
|
/**
|
|
* @ticket 36748
|
|
*/
|
|
function test_dont_downsize_blob_fields() {
|
|
global $wpdb;
|
|
|
|
$result = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 tinyblob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1({$this->max_index_length})),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
",
|
|
false
|
|
);
|
|
|
|
$this->assertSame( array(), $result );
|
|
}
|
|
|
|
/**
|
|
* @ticket 36748
|
|
*/
|
|
function test_upsize_text_fields() {
|
|
global $wpdb;
|
|
|
|
$result = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 bigtext,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1({$this->max_index_length})),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
",
|
|
false
|
|
);
|
|
|
|
$this->assertSame(
|
|
array(
|
|
"{$wpdb->prefix}dbdelta_test.column_2"
|
|
=> "Changed type of {$wpdb->prefix}dbdelta_test.column_2 from text to bigtext",
|
|
),
|
|
$result
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @ticket 36748
|
|
*/
|
|
function test_upsize_blob_fields() {
|
|
global $wpdb;
|
|
|
|
$result = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 mediumblob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1({$this->max_index_length})),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
",
|
|
false
|
|
);
|
|
|
|
$this->assertSame(
|
|
array(
|
|
"{$wpdb->prefix}dbdelta_test.column_3"
|
|
=> "Changed type of {$wpdb->prefix}dbdelta_test.column_3 from blob to mediumblob",
|
|
),
|
|
$result
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @ticket 20263
|
|
*/
|
|
function test_query_with_backticks_does_not_throw_an_undefined_index_warning() {
|
|
global $wpdb;
|
|
|
|
$schema = "
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test2 (
|
|
`id` bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
`column_1` varchar(255) NOT NULL,
|
|
PRIMARY KEY (id),
|
|
KEY compound_key (id,column_1($this->max_index_length))
|
|
)
|
|
";
|
|
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
|
$wpdb->query( $schema );
|
|
|
|
$updates = dbDelta( $schema, false );
|
|
|
|
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}dbdelta_test2" );
|
|
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 36948
|
|
*/
|
|
function test_spatial_indices() {
|
|
global $wpdb;
|
|
|
|
$db_version = $wpdb->db_version();
|
|
|
|
if ( version_compare( $db_version, '5.4', '<' ) ) {
|
|
$this->markTestSkipped( 'Spatial indices require MySQL 5.4 and above.' );
|
|
}
|
|
|
|
$geomcollection_name = 'geomcollection';
|
|
|
|
if ( version_compare( $db_version, '8.0.11', '<' ) ) {
|
|
// Prior to MySQL 8.0.11, GeometryCollection data type name was used.
|
|
$geomcollection_name = 'geometrycollection';
|
|
}
|
|
|
|
$schema =
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}spatial_index_test (
|
|
non_spatial bigint{$this->bigint_display_width} unsigned NOT NULL,
|
|
spatial_value {$geomcollection_name} NOT NULL,
|
|
KEY non_spatial (non_spatial),
|
|
SPATIAL KEY spatial_key (spatial_value)
|
|
) {$this->db_engine};
|
|
";
|
|
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
|
$wpdb->query( $schema );
|
|
|
|
$updates = dbDelta( $schema, false );
|
|
|
|
$this->assertEmpty( $updates );
|
|
|
|
$schema =
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}spatial_index_test (
|
|
non_spatial bigint{$this->bigint_display_width} unsigned NOT NULL,
|
|
spatial_value {$geomcollection_name} NOT NULL,
|
|
spatial_value2 {$geomcollection_name} NOT NULL,
|
|
KEY non_spatial (non_spatial),
|
|
SPATIAL KEY spatial_key (spatial_value)
|
|
SPATIAL KEY spatial_key2 (spatial_value2)
|
|
) {$this->db_engine};
|
|
";
|
|
|
|
$updates = dbDelta( $schema, false );
|
|
|
|
$this->assertSame(
|
|
array(
|
|
"{$wpdb->prefix}spatial_index_test.spatial_value2" => "Added column {$wpdb->prefix}spatial_index_test.spatial_value2",
|
|
"Added index {$wpdb->prefix}spatial_index_test SPATIAL KEY `spatial_key2` (`spatial_value2`)",
|
|
),
|
|
$updates
|
|
);
|
|
|
|
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}spatial_index_test" );
|
|
}
|
|
|
|
/**
|
|
* @ticket 20263
|
|
*/
|
|
function test_query_with_backticks_does_not_cause_a_query_to_alter_all_columns_and_indices_to_run_even_if_none_have_changed() {
|
|
global $wpdb;
|
|
|
|
$schema = "
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test2 (
|
|
`id` bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
`references` varchar(255) NOT NULL,
|
|
PRIMARY KEY (`id`),
|
|
KEY `compound_key` (`id`,`references`($this->max_index_length))
|
|
)
|
|
";
|
|
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
|
$wpdb->query( $schema );
|
|
|
|
$updates = dbDelta( $schema );
|
|
|
|
$table_indices = $wpdb->get_results( "SHOW INDEX FROM {$wpdb->prefix}dbdelta_test2" );
|
|
$compound_key_index = wp_list_filter( $table_indices, array( 'Key_name' => 'compound_key' ) );
|
|
|
|
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}dbdelta_test2" );
|
|
|
|
$this->assertCount( 2, $compound_key_index );
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 20263
|
|
*/
|
|
function test_index_with_a_reserved_keyword_can_be_created() {
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
`references` varchar(255) NOT NULL,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id , column_1($this->max_index_length)),
|
|
KEY compound_key2 (id,`references`($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
"
|
|
);
|
|
|
|
$table_indices = $wpdb->get_results( "SHOW INDEX FROM {$wpdb->prefix}dbdelta_test" );
|
|
|
|
$this->assertCount( 2, wp_list_filter( $table_indices, array( 'Key_name' => 'compound_key2' ), 'AND' ) );
|
|
|
|
$this->assertSame(
|
|
array(
|
|
"{$wpdb->prefix}dbdelta_test.references" => "Added column {$wpdb->prefix}dbdelta_test.references",
|
|
0 => "Added index {$wpdb->prefix}dbdelta_test KEY `compound_key2` (`id`,`references`($this->max_index_length))",
|
|
),
|
|
$updates
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @ticket 20263
|
|
*/
|
|
function test_wp_get_db_schema_does_no_alter_queries_on_existing_install() {
|
|
$updates = dbDelta( wp_get_db_schema() );
|
|
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 20263
|
|
*/
|
|
function test_key_and_index_and_fulltext_key_and_fulltext_index_and_unique_key_and_unique_index_indicies() {
|
|
global $wpdb;
|
|
|
|
$schema = "
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1),
|
|
INDEX key_2 (column_1($this->max_index_length)),
|
|
UNIQUE KEY key_3 (column_1($this->max_index_length)),
|
|
UNIQUE INDEX key_4 (column_1($this->max_index_length)),
|
|
FULLTEXT INDEX key_5 (column_1),
|
|
) {$this->db_engine}
|
|
";
|
|
|
|
$creates = dbDelta( $schema );
|
|
$this->assertSame(
|
|
array(
|
|
0 => "Added index {$wpdb->prefix}dbdelta_test KEY `key_2` (`column_1`($this->max_index_length))",
|
|
1 => "Added index {$wpdb->prefix}dbdelta_test UNIQUE KEY `key_3` (`column_1`($this->max_index_length))",
|
|
2 => "Added index {$wpdb->prefix}dbdelta_test UNIQUE KEY `key_4` (`column_1`($this->max_index_length))",
|
|
3 => "Added index {$wpdb->prefix}dbdelta_test FULLTEXT KEY `key_5` (`column_1`)",
|
|
),
|
|
$creates
|
|
);
|
|
|
|
$updates = dbDelta( $schema );
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 20263
|
|
*/
|
|
function test_index_and_key_are_synonyms_and_do_not_recreate_indices() {
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
INDEX key_1 (column_1($this->max_index_length)),
|
|
INDEX compound_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT INDEX fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
"
|
|
);
|
|
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 20263
|
|
*/
|
|
function test_indices_with_prefix_limits_are_created_and_do_not_recreate_indices() {
|
|
global $wpdb;
|
|
|
|
$schema = "
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1),
|
|
KEY key_2 (column_1(10)),
|
|
KEY key_3 (column_2(100),column_1(10)),
|
|
) {$this->db_engine}
|
|
";
|
|
|
|
$creates = dbDelta( $schema );
|
|
$this->assertSame(
|
|
array(
|
|
0 => "Added index {$wpdb->prefix}dbdelta_test KEY `key_2` (`column_1`(10))",
|
|
1 => "Added index {$wpdb->prefix}dbdelta_test KEY `key_3` (`column_2`(100),`column_1`(10))",
|
|
),
|
|
$creates
|
|
);
|
|
|
|
$updates = dbDelta( $schema );
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 34959
|
|
*/
|
|
function test_index_col_names_with_order_do_not_recreate_indices() {
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length) DESC),
|
|
KEY compound_key (id,column_1($this->max_index_length) ASC),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
"
|
|
);
|
|
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 34873
|
|
*/
|
|
function test_primary_key_with_single_space_does_not_recreate_index() {
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
"
|
|
);
|
|
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 34869
|
|
*/
|
|
function test_index_definitions_with_spaces_do_not_recreate_indices() {
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 ( column_1($this->max_index_length)),
|
|
KEY compound_key (id, column_1($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
"
|
|
);
|
|
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 34871
|
|
*/
|
|
function test_index_types_are_not_case_sensitive_and_do_not_recreate_indices() {
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
key key_1 (column_1($this->max_index_length)),
|
|
key compound_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
"
|
|
);
|
|
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 34874
|
|
*/
|
|
function test_key_names_are_not_case_sensitive_and_do_not_recreate_indices() {
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY KEY_1 (column_1($this->max_index_length)),
|
|
KEY compOUND_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT KEY FULLtext_kEY (column_1)
|
|
) {$this->db_engine}
|
|
",
|
|
false
|
|
);
|
|
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 34870
|
|
*/
|
|
function test_unchanged_key_lengths_do_not_recreate_index() {
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1({$this->max_index_length})),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
",
|
|
false
|
|
);
|
|
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 34870
|
|
*/
|
|
function test_changed_key_lengths_do_not_recreate_index() {
|
|
global $wpdb;
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
KEY changing_key_length (column_1(20)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
"
|
|
);
|
|
|
|
$this->assertSame(
|
|
array(
|
|
"Added index {$wpdb->prefix}dbdelta_test KEY `changing_key_length` (`column_1`(20))",
|
|
),
|
|
$updates
|
|
);
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
KEY changing_key_length (column_1(50)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
"
|
|
);
|
|
|
|
$this->assertEmpty( $updates );
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1($this->max_index_length)),
|
|
KEY compound_key (id,column_1($this->max_index_length)),
|
|
KEY changing_key_length (column_1(1)),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
"
|
|
);
|
|
|
|
$this->assertEmpty( $updates );
|
|
|
|
$updates = dbDelta(
|
|
"
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test (
|
|
id bigint{$this->bigint_display_width} NOT NULL AUTO_INCREMENT,
|
|
column_1 varchar(255) NOT NULL,
|
|
column_2 text,
|
|
column_3 blob,
|
|
PRIMARY KEY (id),
|
|
KEY key_1 (column_1),
|
|
KEY compound_key (id,column_1),
|
|
KEY changing_key_length (column_1),
|
|
FULLTEXT KEY fulltext_key (column_1)
|
|
) {$this->db_engine}
|
|
"
|
|
);
|
|
|
|
$this->assertEmpty( $updates );
|
|
}
|
|
|
|
/**
|
|
* @ticket 31679
|
|
*/
|
|
function test_column_type_change_with_hyphens_in_name() {
|
|
global $wpdb;
|
|
|
|
$schema = "
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test2 (
|
|
`foo-bar` varchar(255) DEFAULT NULL
|
|
)
|
|
";
|
|
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
|
$wpdb->query( $schema );
|
|
|
|
$schema_update = "
|
|
CREATE TABLE {$wpdb->prefix}dbdelta_test2 (
|
|
`foo-bar` text DEFAULT NULL
|
|
)
|
|
";
|
|
|
|
$updates = dbDelta( $schema_update );
|
|
|
|
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}dbdelta_test2" );
|
|
|
|
$this->assertSame(
|
|
array(
|
|
"{$wpdb->prefix}dbdelta_test2.foo-bar" => "Changed type of {$wpdb->prefix}dbdelta_test2.foo-bar from varchar(255) to text",
|
|
),
|
|
$updates
|
|
);
|
|
}
|
|
}
|