@@ -157,34 +157,87 @@ function mixinDiscovery(MySQL, mysql) {
157157  MySQL . prototype . buildQueryColumns  =  function ( schema ,  table ,  options  =  { } )  { 
158158    let  sql  =  null ; 
159159    if  ( schema )  { 
160-       sql  =  paginateSQL ( 'SELECT table_schema AS "owner",'  + 
161-         ' table_name AS "tableName",'  + 
162-         ' column_name AS "columnName",'  + 
163-         ' data_type AS "dataType",'  + 
164-         ' character_maximum_length AS "dataLength",'  + 
165-         ' numeric_precision AS "dataPrecision",'  + 
166-         ' numeric_scale AS "dataScale",'  + 
167-         ' column_type AS "columnType",'  + 
168-         ' is_nullable = \'YES\' AS "nullable",'  + 
169-         ' CASE WHEN extra LIKE \'%auto_increment%\' THEN 1 ELSE 0 END AS "generated"'  + 
170-         ' FROM information_schema.columns'  + 
171-         ' WHERE table_schema='  +  mysql . escape ( schema )  + 
172-         ( table  ? ' AND table_name='  +  mysql . escape ( table )  : '' ) , 
173-       'table_name, ordinal_position' ,  { } ) ; 
160+       sql  =  paginateSQL ( 
161+         `SELECT  
162+             c.table_schema AS "owner", 
163+             c.table_name AS "tableName", 
164+             c.column_name AS "columnName", 
165+             c.data_type AS "dataType", 
166+             c.character_maximum_length AS "dataLength", 
167+             c.numeric_precision AS "dataPrecision", 
168+             c.numeric_scale AS "dataScale", 
169+             c.column_type AS "columnType", 
170+             c.is_nullable = 'YES' AS "nullable", 
171+             CASE WHEN c.extra LIKE '%auto_increment%' THEN 1 ELSE 0 END AS "generated", 
172+             s.index_name AS "indexName", 
173+             s.non_unique AS "nonUnique", 
174+             s.seq_in_index AS "seqInIndex", 
175+             s.cardinality AS "cardinality", 
176+             s.index_type AS "indexType", 
177+             CASE WHEN fk.column_name IS NOT NULL THEN 1 ELSE 0 END AS "isForeignKey"  -- Flag for foreign key 
178+          FROM  
179+             information_schema.columns c 
180+          LEFT JOIN  
181+             information_schema.statistics s  
182+          ON  
183+             c.table_schema = s.table_schema  
184+             AND c.table_name = s.table_name  
185+             AND c.column_name = s.column_name 
186+          LEFT JOIN  
187+             information_schema.KEY_COLUMN_USAGE fk  
188+          ON  
189+             c.table_schema = fk.table_schema  
190+             AND c.table_name = fk.table_name  
191+             AND c.column_name = fk.column_name  
192+             AND fk.referenced_table_name IS NOT NULL  -- Ensure it's a foreign key 
193+          WHERE  
194+             c.table_schema = ${ mysql . escape ( schema ) }  
195+             ${ table  ? ' AND c.table_name = '  +  mysql . escape ( table )  : '' }  
196+         ` , 
197+         'c.table_name, c.ordinal_position' , 
198+         { } , 
199+       ) ; 
174200    }  else  { 
175-       sql  =  paginateSQL ( 'SELECT table_schema AS "owner",'  + 
176-         ' table_name AS "tableName",'  + 
177-         ' column_name AS "columnName",'  + 
178-         ' data_type AS "dataType",'  + 
179-         ' character_maximum_length AS "dataLength",'  + 
180-         ' numeric_precision AS "dataPrecision",'  + 
181-         ' numeric_scale AS "dataScale",'  + 
182-         ' column_type AS "columnType",'  + 
183-         ' is_nullable = \'YES\' AS "nullable",'  + 
184-         ' CASE WHEN extra LIKE \'%auto_increment%\' THEN 1 ELSE 0 END AS "generated"'  + 
185-         ' FROM information_schema.columns'  + 
186-         ( table  ? ' WHERE table_name='  +  mysql . escape ( table )  : '' ) , 
187-       'table_name, ordinal_position' ,  { } ) ; 
201+       sql  =  paginateSQL ( 
202+         `SELECT  
203+             columns.table_schema AS "owner", 
204+             columns.table_name AS "tableName", 
205+             columns.column_name AS "columnName", 
206+             columns.data_type AS "dataType", 
207+             columns.character_maximum_length AS "dataLength", 
208+             columns.numeric_precision AS "dataPrecision", 
209+             columns.numeric_scale AS "dataScale", 
210+             columns.column_type AS "columnType", 
211+             columns.is_nullable = 'YES' AS "nullable", 
212+             CASE WHEN columns.extra LIKE '%auto_increment%' THEN 1 ELSE 0 END AS "generated", 
213+             indexes.index_name AS "indexName", 
214+             indexes.seq_in_index AS "indexColumnOrder", 
215+             indexes.non_unique AS "nonUnique", 
216+             indexes.cardinality AS "cardinality",      -- Cardinality of the index 
217+             indexes.index_type AS "indexType",         -- Type of the index 
218+             CASE WHEN fk.column_name IS NOT NULL THEN 1 ELSE 0 END AS "isForeignKey"  -- Flag for foreign key 
219+          FROM  
220+             information_schema.columns AS columns 
221+          LEFT JOIN  
222+             information_schema.statistics AS indexes  
223+          ON  
224+             columns.table_schema = indexes.table_schema  
225+             AND columns.table_name = indexes.table_name  
226+             AND columns.column_name = indexes.column_name 
227+          LEFT JOIN  
228+             information_schema.KEY_COLUMN_USAGE AS fk  
229+          ON  
230+             columns.table_schema = fk.table_schema  
231+             AND columns.table_name = fk.table_name  
232+             AND columns.column_name = fk.column_name  
233+             AND fk.referenced_table_name IS NOT NULL  -- Ensure it's a foreign key 
234+          WHERE  
235+             columns.table_schema = ${ mysql . escape ( schema ) }  
236+             ${ table  ? ' AND columns.table_name = '  +  mysql . escape ( table )  : '' }  
237+         ` , 
238+         'columns.table_name, columns.ordinal_position' , 
239+         { } , 
240+       ) ; 
188241    } 
189242    if  ( options . orderBy )  { 
190243      sql  +=  ' ORDER BY '  +  options . orderBy ; 
0 commit comments