Skip to content

Commit c34a0ac

Browse files
tonyxiaoclaude
andcommitted
fix: handle multi-statement DDL in PGlite adapter
PGlite's query() rejects multiple SQL statements in a single call. Fall back to exec() when the "multiple commands" error is detected. This fixes destination setup which uses buildCreateTableDDL (returns a DO block + standalone DO blocks). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Committed-By-Agent: claude
1 parent 4aac5ab commit c34a0ac

1 file changed

Lines changed: 30 additions & 15 deletions

File tree

packages/destination-postgres/src/client.ts

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,38 @@ export async function pgliteClient(
4545
const dataSource = config.url ?? config.data_dir
4646
const db = await PGlite.create(dataSource)
4747

48+
function adaptResult(result: { rows: unknown[]; affectedRows?: number; fields?: { name: string; dataTypeID: number }[] }): pg.QueryResult {
49+
return {
50+
rows: result.rows as Record<string, unknown>[],
51+
rowCount: result.affectedRows ?? null,
52+
command: '',
53+
oid: 0,
54+
fields: result.fields?.map((f) => ({
55+
...f,
56+
tableID: 0,
57+
columnID: 0,
58+
dataTypeSize: 0,
59+
dataTypeModifier: 0,
60+
format: 'text' as const,
61+
})) ?? [],
62+
} as pg.QueryResult
63+
}
64+
4865
return {
4966
async query(text: string, values?: unknown[]) {
50-
const result = await db.query(text, values)
51-
return {
52-
rows: result.rows as Record<string, unknown>[],
53-
rowCount: result.affectedRows ?? null,
54-
command: '',
55-
oid: 0,
56-
fields: result.fields?.map((f) => ({
57-
...f,
58-
tableID: 0,
59-
columnID: 0,
60-
dataTypeSize: 0,
61-
dataTypeModifier: 0,
62-
format: 'text' as const,
63-
})) ?? [],
64-
} as pg.QueryResult
67+
if (values && values.length > 0) {
68+
return adaptResult(await db.query(text, values))
69+
}
70+
// PGlite's query() rejects multiple statements; use exec() as fallback
71+
try {
72+
return adaptResult(await db.query(text))
73+
} catch (err) {
74+
if (err instanceof Error && err.message.includes('multiple commands')) {
75+
await db.exec(text)
76+
return adaptResult({ rows: [], affectedRows: 0, fields: [] })
77+
}
78+
throw err
79+
}
6580
},
6681
async close() {
6782
await db.close()

0 commit comments

Comments
 (0)