@@ -264,6 +264,8 @@ export const mysql: IntrospectionProvider = {
264264} ;
265265
266266function getTableIntrospectionQuery ( databaseName : string ) {
267+ // Note: We use subqueries with ORDER BY before JSON_ARRAYAGG to ensure ordering
268+ // since MySQL < 8.0.21 doesn't support ORDER BY inside JSON_ARRAYAGG
267269 return `
268270SELECT
269271 t.TABLE_SCHEMA AS \`schema\`,
@@ -278,8 +280,9 @@ SELECT
278280 ELSE NULL
279281 END AS \`definition\`,
280282 (
281- SELECT JSON_ARRAYAGG(
282- JSON_OBJECT(
283+ SELECT JSON_ARRAYAGG(col_json)
284+ FROM (
285+ SELECT JSON_OBJECT(
283286 'name', c.COLUMN_NAME,
284287 'datatype', c.DATA_TYPE,
285288 'datatype_schema', c.TABLE_SCHEMA,
@@ -298,24 +301,25 @@ SELECT
298301 'foreign_key_name', kcu_fk.CONSTRAINT_NAME,
299302 'foreign_key_on_update', rc.UPDATE_RULE,
300303 'foreign_key_on_delete', rc.DELETE_RULE
301- )
302- )
303- FROM INFORMATION_SCHEMA.COLUMNS c
304- LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu_fk
305- ON c.TABLE_SCHEMA = kcu_fk.TABLE_SCHEMA
306- AND c.TABLE_NAME = kcu_fk.TABLE_NAME
307- AND c.COLUMN_NAME = kcu_fk.COLUMN_NAME
308- AND kcu_fk.REFERENCED_TABLE_NAME IS NOT NULL
309- LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
310- ON kcu_fk.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA
311- AND kcu_fk.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
312- WHERE c.TABLE_SCHEMA = t.TABLE_SCHEMA
313- AND c.TABLE_NAME = t.TABLE_NAME
314- ORDER BY c.ORDINAL_POSITION
304+ ) AS col_json
305+ FROM INFORMATION_SCHEMA.COLUMNS c
306+ LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu_fk
307+ ON c.TABLE_SCHEMA = kcu_fk.TABLE_SCHEMA
308+ AND c.TABLE_NAME = kcu_fk.TABLE_NAME
309+ AND c.COLUMN_NAME = kcu_fk.COLUMN_NAME
310+ AND kcu_fk.REFERENCED_TABLE_NAME IS NOT NULL
311+ LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
312+ ON kcu_fk.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA
313+ AND kcu_fk.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
314+ WHERE c.TABLE_SCHEMA = t.TABLE_SCHEMA
315+ AND c.TABLE_NAME = t.TABLE_NAME
316+ ORDER BY c.ORDINAL_POSITION
317+ ) AS cols_ordered
315318 ) AS \`columns\`,
316319 (
317- SELECT JSON_ARRAYAGG(
318- JSON_OBJECT(
320+ SELECT JSON_ARRAYAGG(idx_json)
321+ FROM (
322+ SELECT JSON_OBJECT(
319323 'name', s.INDEX_NAME,
320324 'method', s.INDEX_TYPE,
321325 'unique', s.NON_UNIQUE = 0,
@@ -325,27 +329,28 @@ SELECT
325329 'partial', FALSE,
326330 'predicate', NULL,
327331 'columns', (
328- SELECT JSON_ARRAYAGG(
329- JSON_OBJECT(
332+ SELECT JSON_ARRAYAGG(idx_col_json)
333+ FROM (
334+ SELECT JSON_OBJECT(
330335 'name', s2.COLUMN_NAME,
331336 'expression', NULL,
332337 'order', CASE s2.COLLATION WHEN 'A' THEN 'ASC' WHEN 'D' THEN 'DESC' ELSE NULL END,
333338 'nulls', NULL
334- )
339+ ) AS idx_col_json
340+ FROM INFORMATION_SCHEMA.STATISTICS s2
341+ WHERE s2.TABLE_SCHEMA = s.TABLE_SCHEMA
342+ AND s2.TABLE_NAME = s.TABLE_NAME
343+ AND s2.INDEX_NAME = s.INDEX_NAME
335344 ORDER BY s2.SEQ_IN_INDEX
336- )
337- FROM INFORMATION_SCHEMA.STATISTICS s2
338- WHERE s2.TABLE_SCHEMA = s.TABLE_SCHEMA
339- AND s2.TABLE_NAME = s.TABLE_NAME
340- AND s2.INDEX_NAME = s.INDEX_NAME
345+ ) AS idx_cols_ordered
341346 )
342- )
343- )
344- FROM (
345- SELECT DISTINCT INDEX_NAME, INDEX_TYPE, NON_UNIQUE, TABLE_SCHEMA, TABLE_NAME
346- FROM INFORMATION_SCHEMA.STATISTICS
347- WHERE TABLE_SCHEMA = t.TABLE_SCHEMA AND TABLE_NAME = t.TABLE_NAME
348- ) s
347+ ) AS idx_json
348+ FROM (
349+ SELECT DISTINCT INDEX_NAME, INDEX_TYPE, NON_UNIQUE, TABLE_SCHEMA, TABLE_NAME
350+ FROM INFORMATION_SCHEMA.STATISTICS
351+ WHERE TABLE_SCHEMA = t.TABLE_SCHEMA AND TABLE_NAME = t.TABLE_NAME
352+ ) s
353+ ) AS idxs_ordered
349354 ) AS \`indexes\`
350355FROM INFORMATION_SCHEMA.TABLES t
351356LEFT JOIN INFORMATION_SCHEMA.VIEWS v
0 commit comments