fix: add auto-increment field detection in smart-query import (#935)

This commit is contained in:
Jonathan Fishner
2025-09-28 17:09:02 +03:00
committed by GitHub
parent bb033091b1
commit 57b3b8777f
8 changed files with 45 additions and 7 deletions

View File

@@ -57,6 +57,9 @@ export const createFieldsFromMetadata = ({
...(col.precision?.scale ? { scale: col.precision.scale } : {}), ...(col.precision?.scale ? { scale: col.precision.scale } : {}),
...(col.default ? { default: col.default } : {}), ...(col.default ? { default: col.default } : {}),
...(col.collation ? { collation: col.collation } : {}), ...(col.collation ? { collation: col.collation } : {}),
...(col.is_identity !== undefined
? { increment: col.is_identity }
: {}),
createdAt: Date.now(), createdAt: Date.now(),
comments: col.comment ? col.comment : undefined, comments: col.comment ? col.comment : undefined,
}) })

View File

@@ -15,6 +15,7 @@ export interface ColumnInfo {
default?: string | null; // Default value for the column, nullable default?: string | null; // Default value for the column, nullable
collation?: string | null; collation?: string | null;
comment?: string | null; comment?: string | null;
is_identity?: boolean; // Indicates if the column is auto-increment/identity
} }
export const ColumnInfoSchema: z.ZodType<ColumnInfo> = z.object({ export const ColumnInfoSchema: z.ZodType<ColumnInfo> = z.object({
@@ -35,4 +36,5 @@ export const ColumnInfoSchema: z.ZodType<ColumnInfo> = z.object({
default: z.string().nullable().optional(), default: z.string().nullable().optional(),
collation: z.string().nullable().optional(), collation: z.string().nullable().optional(),
comment: z.string().nullable().optional(), comment: z.string().nullable().optional(),
is_identity: z.boolean().optional(),
}); });

View File

@@ -127,7 +127,13 @@ cols AS (
',"default":"', null, ',"default":"', null,
'","collation":"', COALESCE(cols.COLLATION_NAME::TEXT, ''), '","collation":"', COALESCE(cols.COLLATION_NAME::TEXT, ''),
'","comment":"', COALESCE(replace(replace(dsc.description::TEXT, '"', '\\"'), '\\x', '\\\\x'), ''), '","comment":"', COALESCE(replace(replace(dsc.description::TEXT, '"', '\\"'), '\\x', '\\\\x'), ''),
'"}')), ',') AS cols_metadata '","is_identity":', CASE
WHEN cols.is_identity = 'YES' THEN 'true'
WHEN cols.column_default IS NOT NULL AND cols.column_default LIKE 'nextval(%' THEN 'true'
WHEN cols.column_default LIKE 'unique_rowid()%' THEN 'true'
ELSE 'false'
END,
'}')), ',') AS cols_metadata
FROM information_schema.columns cols FROM information_schema.columns cols
LEFT JOIN pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_class c
ON c.relname = cols.table_name ON c.relname = cols.table_name

View File

@@ -69,7 +69,9 @@ SELECT CAST(CONCAT(
',"ordinal_position":', cols.ordinal_position, ',"ordinal_position":', cols.ordinal_position,
',"nullable":', IF(cols.is_nullable = 'YES', 'true', 'false'), ',"nullable":', IF(cols.is_nullable = 'YES', 'true', 'false'),
',"default":"', ${withExtras ? withDefault : withoutDefault}, ',"default":"', ${withExtras ? withDefault : withoutDefault},
'","collation":"', IFNULL(cols.collation_name, ''), '"}') '","collation":"', IFNULL(cols.collation_name, ''),
'","is_identity":', IF(cols.extra LIKE '%auto_increment%', 'true', 'false'),
'"}')
) FROM ( ) FROM (
SELECT cols.table_schema, SELECT cols.table_schema,
cols.table_name, cols.table_name,
@@ -81,7 +83,8 @@ SELECT CAST(CONCAT(
cols.ordinal_position, cols.ordinal_position,
cols.is_nullable, cols.is_nullable,
cols.column_default, cols.column_default,
cols.collation_name cols.collation_name,
cols.extra
FROM information_schema.columns cols FROM information_schema.columns cols
WHERE cols.table_schema = DATABASE() WHERE cols.table_schema = DATABASE()
) AS cols), ''), ) AS cols), ''),

View File

@@ -92,7 +92,9 @@ export const getMySQLQuery = (
',"ordinal_position":', cols.ordinal_position, ',"ordinal_position":', cols.ordinal_position,
',"nullable":', IF(cols.is_nullable = 'YES', 'true', 'false'), ',"nullable":', IF(cols.is_nullable = 'YES', 'true', 'false'),
',"default":"', ${withExtras ? withDefault : withoutDefault}, ',"default":"', ${withExtras ? withDefault : withoutDefault},
'","collation":"', IFNULL(cols.collation_name, ''), '"}' '","collation":"', IFNULL(cols.collation_name, ''),
'","is_identity":', IF(cols.extra LIKE '%auto_increment%', 'true', 'false'),
'}'
))))) )))))
), indexes as ( ), indexes as (
(SELECT (@indexes:=NULL), (SELECT (@indexes:=NULL),

View File

@@ -194,7 +194,12 @@ cols AS (
',"default":"', ${withExtras ? withDefault : withoutDefault}, ',"default":"', ${withExtras ? withDefault : withoutDefault},
'","collation":"', COALESCE(cols.COLLATION_NAME, ''), '","collation":"', COALESCE(cols.COLLATION_NAME, ''),
'","comment":"', ${withExtras ? withComments : withoutComments}, '","comment":"', ${withExtras ? withComments : withoutComments},
'"}')), ',') AS cols_metadata '","is_identity":', CASE
WHEN cols.is_identity = 'YES' THEN 'true'
WHEN cols.column_default IS NOT NULL AND cols.column_default LIKE 'nextval(%' THEN 'true'
ELSE 'false'
END,
'}')), ',') AS cols_metadata
FROM information_schema.columns cols FROM information_schema.columns cols
LEFT JOIN pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_class c
ON c.relname = cols.table_name ON c.relname = cols.table_name

View File

@@ -119,7 +119,13 @@ WITH fk_info AS (
END END
ELSE null ELSE null
END, END,
'default', ${withExtras ? withDefault : withoutDefault} 'default', ${withExtras ? withDefault : withoutDefault},
'is_identity',
CASE
WHEN p.pk = 1 AND LOWER(p.type) LIKE '%int%' THEN json('true')
WHEN LOWER((SELECT sql FROM sqlite_master WHERE name = m.name)) LIKE '%' || p.name || '%autoincrement%' THEN json('true')
ELSE json('false')
END
) )
) AS cols_metadata ) AS cols_metadata
FROM FROM
@@ -292,7 +298,13 @@ WITH fk_info AS (
END END
ELSE null ELSE null
END, END,
'default', ${withExtras ? withDefault : withoutDefault} 'default', ${withExtras ? withDefault : withoutDefault},
'is_identity',
CASE
WHEN p.pk = 1 AND LOWER(p.type) LIKE '%int%' THEN json('true')
WHEN LOWER((SELECT sql FROM sqlite_master WHERE name = m.name)) LIKE '%' || p.name || '%autoincrement%' THEN json('true')
ELSE json('false')
END
) )
) AS cols_metadata ) AS cols_metadata
FROM FROM

View File

@@ -91,6 +91,11 @@ cols AS (
WHEN cols.COLLATION_NAME IS NULL THEN 'null' WHEN cols.COLLATION_NAME IS NULL THEN 'null'
ELSE '"' + STRING_ESCAPE(cols.COLLATION_NAME, 'json') + '"' ELSE '"' + STRING_ESCAPE(cols.COLLATION_NAME, 'json') + '"'
END + END +
', "is_identity": ' + CASE
WHEN COLUMNPROPERTY(OBJECT_ID(cols.TABLE_SCHEMA + '.' + cols.TABLE_NAME), cols.COLUMN_NAME, 'IsIdentity') = 1
THEN 'true'
ELSE 'false'
END +
N'}') COLLATE DATABASE_DEFAULT N'}') COLLATE DATABASE_DEFAULT
), N',' ), N','
) + ) +