Skip to content

Commit d04234e

Browse files
committed
feat: fetch index information for columns
Signed-off-by: Muhammad Aaqil <[email protected]>
1 parent 9f21dee commit d04234e

File tree

1 file changed

+80
-27
lines changed

1 file changed

+80
-27
lines changed

lib/discovery.js

+80-27
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)