Skip to content
This repository was archived by the owner on Mar 1, 2026. It is now read-only.

Commit 8e478d1

Browse files
committed
fix(cli): ensure MySQL column and index ordering
Wraps JSON_ARRAYAGG calls in subqueries with explicit ORDER BY clauses to maintain correct metadata ordering. This addresses a limitation in MySQL versions prior to 8.0.21, where ORDER BY is not supported directly within the JSON_ARRAYAGG function, ensuring consistent introspection results across different database versions.
1 parent 472b377 commit 8e478d1

1 file changed

Lines changed: 38 additions & 33 deletions

File tree

  • packages/cli/src/actions/pull/provider

packages/cli/src/actions/pull/provider/mysql.ts

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ export const mysql: IntrospectionProvider = {
264264
};
265265

266266
function 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 `
268270
SELECT
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\`
350355
FROM INFORMATION_SCHEMA.TABLES t
351356
LEFT JOIN INFORMATION_SCHEMA.VIEWS v

0 commit comments

Comments
 (0)