export interface QualifiedName { schema: string; name: string; } export declare function unquoteIdent(ident: string): string; export declare function formatQualified(name: QualifiedName): string; /** `pg_restore -f - -L <只含 SCHEMA 条目的清单>` 的输出 → 按出现顺序的 schema 名。 */ export declare function parseCreateSchemas(sql: string): string[]; export interface ForeignKeyDef { constraint: string; table: QualifiedName; columns: string[]; references: QualifiedName; referencedColumns: string[]; /** * ADD CONSTRAINT 时会不会校验已有的行。NOT VALID(源库就没校验过)和 PG18 的 NOT ENFORCED * 都不校验,恢复不会因为缺行而失败,所以不用查。 */ validatesRows: boolean; /** MATCH FULL:有一列为空、另一列不空的行同样违反约束(默认 MATCH SIMPLE 只查全非空的行) */ matchFull: boolean; /** 不带 ONLY 的 ALTER TABLE = 分区父表上的外键 */ onPartitionedTable: boolean; /** pg_dump 写出的整条语句,原样可执行 */ statement: string; } /** * pg_dump 的外键语句(dumpConstraint): * ALTER [FOREIGN ]TABLE [ONLY ]<表>\n ADD CONSTRAINT <名> FOREIGN KEY (<列>) REFERENCES <表>(<列>)<选项>; * 分区父表上的外键没有 ONLY。认不出的形态(如 PG18 的 PERIOD 时态外键)不返回, * 调用方拿条目数对账,差多少就如实报多少条没检查。 */ export declare function parseForeignKeys(sql: string): ForeignKeyDef[]; /** pg_dump 的建表语句(dumpTableSchema)建的表:CREATE [UNLOGGED ]TABLE <表> (…) / OF <类型>… */ export declare function parseCreatedTables(sql: string): QualifiedName[]; /** pg_dump 的挂分区语句(dumpTableAttach):ALTER TABLE ONLY <父> ATTACH PARTITION <子> <边界>; */ export declare function parsePartitionAttachments(sql: string): Array<{ parent: QualifiedName; child: QualifiedName; }>; /** * pg_dump 的建表语句(dumpTableSchema)里每列的类型,按表(schema\0name)→ 列 → 类型。 * CREATE [UNLOGGED ]TABLE <表> (\n <列> <类型>[ COLLATE …][ DEFAULT …][ NOT NULL],\n CONSTRAINT …\n)…; * 类型是 format_type 的输出,本身不含 COLLATE/DEFAULT/NOT NULL/GENERATED 这些词,读到它们为止。 * 带引号的列名可以跨行,所以按位置往下读,不按行切。 */ export declare function parseTableColumns(sql: string): Map>; /** * 建表语句里的生成列(`GENERATED ALWAYS AS (…)`,STORED 和 PG 18 的 VIRTUAL 都算),按表 → 列名集合。 * pg_dump 不导出生成列的数据,恢复时由目标自己算:数据段的列 = 建表语句的列减去这些。 * 和 parseTableColumns 同样按位置读列,只是每列再看一眼这一行剩下的部分 */ export declare function parseGeneratedColumns(sql: string): Map>; /** 一个 COPY 头最长读这么多字符;超过就当作读不了,免得坏归档把内存吃满。 */ export declare const MAX_COPY_HEADER = 100000; /** * 数据段的 COPY 头(dumpTableData_copy):"COPY <表> <列清单> FROM stdin;"。没有列的表列清单是空串, * 所以那一行中间是两个空格,返回空列表。 */ export declare function parseCopyHeader(line: string): { table: QualifiedName; columns: string[]; } | null; /** * COPY 文本格式的一个字段 → 值(\N = NULL)。转义规则照 PostgreSQL 文档 "COPY / Text Format": * \b \f \n \r \t \v \\,\ 加 1–3 位八进制,\x 加 1–2 位十六进制,其余 \c 就是 c 本身。 */ export declare function decodeCopyField(field: string): string | null;