@@ -5859,4 +5859,120 @@ public function testDropIndex(): void {
5859
5859
$ result = $ this ->engine ->execute_sqlite_query ( "PRAGMA index_list('t') " )->fetchAll ( PDO ::FETCH_ASSOC );
5860
5860
$ this ->assertCount ( 0 , $ result );
5861
5861
}
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
+ }
5862
5978
}
0 commit comments