Skip to content

Commit b170a8c

Browse files
authored
Add a test for more complex information schema queries (#208)
2 parents 5a2c3a1 + 40d12b4 commit b170a8c

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

tests/WP_SQLite_Driver_Tests.php

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5859,4 +5859,120 @@ public function testDropIndex(): void {
58595859
$result = $this->engine->execute_sqlite_query( "PRAGMA index_list('t')" )->fetchAll( PDO::FETCH_ASSOC );
58605860
$this->assertCount( 0, $result );
58615861
}
5862+
5863+
public function testComplexInformationSchemaQueries(): void {
5864+
$create_table_query = <<<END
5865+
CREATE TABLE `wp_users` (
5866+
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
5867+
`user_login` varchar(60) NOT NULL DEFAULT '',
5868+
`user_pass` varchar(255) NOT NULL DEFAULT '',
5869+
`user_nicename` varchar(50) NOT NULL DEFAULT '',
5870+
`user_email` varchar(100) NOT NULL DEFAULT '',
5871+
`user_url` varchar(100) NOT NULL DEFAULT '',
5872+
`user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
5873+
`user_activation_key` varchar(255) NOT NULL DEFAULT '',
5874+
`user_status` int(11) NOT NULL DEFAULT '0',
5875+
`display_name` varchar(250) NOT NULL DEFAULT '',
5876+
PRIMARY KEY (`ID`),
5877+
KEY `user_login_key` (`user_login`),
5878+
KEY `user_nicename` (`user_nicename`),
5879+
KEY `user_email` (`user_email`)
5880+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
5881+
END;
5882+
5883+
$this->assertQuery( $create_table_query );
5884+
5885+
// 1) JOIN multiple information schema tables.
5886+
$result = $this->assertQuery(
5887+
"SELECT
5888+
cols.DATA_TYPE,
5889+
stats.INDEX_NAME,
5890+
stats.COLUMN_NAME
5891+
FROM INFORMATION_SCHEMA.COLUMNS AS cols
5892+
JOIN INFORMATION_SCHEMA.STATISTICS AS stats
5893+
ON cols.TABLE_SCHEMA = stats.TABLE_SCHEMA
5894+
AND cols.TABLE_NAME = stats.TABLE_NAME
5895+
AND cols.COLUMN_NAME = stats.COLUMN_NAME
5896+
WHERE
5897+
cols.TABLE_SCHEMA = 'wp'
5898+
AND cols.TABLE_NAME = 'wp_users'
5899+
ORDER BY INDEX_NAME ASC"
5900+
);
5901+
5902+
$this->assertCount( 4, $result );
5903+
$this->assertEquals(
5904+
(object) array(
5905+
'DATA_TYPE' => 'bigint',
5906+
'INDEX_NAME' => 'PRIMARY',
5907+
'COLUMN_NAME' => 'ID',
5908+
),
5909+
$result[0]
5910+
);
5911+
$this->assertEquals(
5912+
(object) array(
5913+
'DATA_TYPE' => 'varchar',
5914+
'INDEX_NAME' => 'user_email',
5915+
'COLUMN_NAME' => 'user_email',
5916+
),
5917+
$result[1]
5918+
);
5919+
$this->assertEquals(
5920+
(object) array(
5921+
'DATA_TYPE' => 'varchar',
5922+
'INDEX_NAME' => 'user_login_key',
5923+
'COLUMN_NAME' => 'user_login',
5924+
),
5925+
$result[2]
5926+
);
5927+
$this->assertEquals(
5928+
(object) array(
5929+
'DATA_TYPE' => 'varchar',
5930+
'INDEX_NAME' => 'user_nicename',
5931+
'COLUMN_NAME' => 'user_nicename',
5932+
),
5933+
$result[3]
5934+
);
5935+
5936+
// 2) UNION, DISTINCT, and CTEs with information schema tables.
5937+
$result = $this->assertQuery(
5938+
"WITH
5939+
cols AS (
5940+
SELECT COLUMN_NAME AS column_name
5941+
FROM INFORMATION_SCHEMA.COLUMNS
5942+
WHERE TABLE_SCHEMA = 'wp' AND TABLE_NAME = 'wp_users'
5943+
),
5944+
indexes AS (
5945+
SELECT DISTINCT INDEX_NAME AS index_name
5946+
FROM INFORMATION_SCHEMA.STATISTICS
5947+
WHERE TABLE_SCHEMA = 'wp' AND TABLE_NAME = 'wp_users'
5948+
)
5949+
SELECT CONCAT(column_name, ' (column)') AS name
5950+
FROM cols
5951+
UNION ALL
5952+
SELECT CONCAT(index_name, ' (index)') AS name
5953+
FROM indexes
5954+
ORDER BY name"
5955+
);
5956+
5957+
$this->assertCount( 14, $result );
5958+
$this->assertEquals( 'ID (column)', $result[0]->name );
5959+
$this->assertEquals( 'PRIMARY (index)', $result[1]->name );
5960+
$this->assertEquals( 'display_name (column)', $result[2]->name );
5961+
$this->assertEquals( 'user_activation_key (column)', $result[3]->name );
5962+
$this->assertEquals( 'user_email (column)', $result[4]->name );
5963+
$this->assertEquals( 'user_email (index)', $result[5]->name );
5964+
$this->assertEquals( 'user_login (column)', $result[6]->name );
5965+
$this->assertEquals( 'user_login_key (index)', $result[7]->name );
5966+
$this->assertEquals( 'user_nicename (column)', $result[8]->name );
5967+
$this->assertEquals( 'user_nicename (index)', $result[9]->name );
5968+
$this->assertEquals( 'user_pass (column)', $result[10]->name );
5969+
$this->assertEquals( 'user_registered (column)', $result[11]->name );
5970+
$this->assertEquals( 'user_status (column)', $result[12]->name );
5971+
$this->assertEquals( 'user_url (column)', $result[13]->name );
5972+
5973+
// 3) SHOW CREATE TABLE should preserve all the CREATE TABLE metadata.
5974+
$result = $this->assertQuery( 'SHOW CREATE TABLE wp_users' );
5975+
$this->assertCount( 1, $result );
5976+
$this->assertEquals( $create_table_query, $result[0]->{'Create Table'} );
5977+
}
58625978
}

0 commit comments

Comments
 (0)