From 5a8afa608be0e5ce319adb502b3a8d4a8624b864 Mon Sep 17 00:00:00 2001 From: Vijay Soni Date: Sat, 28 Dec 2024 00:13:25 +0530 Subject: [PATCH 1/2] Add affectedRows for COPY command Related to #480 --- packages/pglite/src/parse.ts | 2 ++ .../tests/targets/runtimes/node-fs.test.js | 32 +++++++++++++++++++ .../targets/runtimes/node-memory.test.js | 32 +++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/packages/pglite/src/parse.ts b/packages/pglite/src/parse.ts index 4d44f9660..c32e78256 100644 --- a/packages/pglite/src/parse.ts +++ b/packages/pglite/src/parse.ts @@ -90,6 +90,8 @@ function retrieveRowCount(msg: CommandCompleteMessage): number { case 'UPDATE': case 'DELETE': return parseInt(parts[1], 10) + case 'COPY': + return parseInt(parts[1], 10) default: return 0 } diff --git a/packages/pglite/tests/targets/runtimes/node-fs.test.js b/packages/pglite/tests/targets/runtimes/node-fs.test.js index 004861daf..152fc99ce 100644 --- a/packages/pglite/tests/targets/runtimes/node-fs.test.js +++ b/packages/pglite/tests/targets/runtimes/node-fs.test.js @@ -1,3 +1,35 @@ import { tests } from './base.js' tests('node', './pgdata-test', 'node.fs') + +describe('COPY command affectedRows', () => { + let db + + beforeAll(async () => { + db = new PGlite('./pgdata-test-copy') + await db.waitReady + await db.query(` + CREATE TABLE IF NOT EXISTS test_copy ( + id SERIAL PRIMARY KEY, + name TEXT + ); + `) + }) + + afterAll(async () => { + await db.close() + }) + + it('should return affectedRows for COPY command', async () => { + const csvData = '1,test1\n2,test2\n' + const blob = new Blob([csvData]) + + const copyResult = await db.query("COPY test_copy FROM '/dev/blob' WITH (FORMAT csv);", [], { + blob, + }) + + expect(copyResult).toMatchObject({ + affectedRows: 2, + }) + }) +}) diff --git a/packages/pglite/tests/targets/runtimes/node-memory.test.js b/packages/pglite/tests/targets/runtimes/node-memory.test.js index e48925f3f..e191bd102 100644 --- a/packages/pglite/tests/targets/runtimes/node-memory.test.js +++ b/packages/pglite/tests/targets/runtimes/node-memory.test.js @@ -1,3 +1,35 @@ import { tests } from './base.js' tests('node', 'memory://', 'node.memory') + +describe('COPY command affectedRows', () => { + let db + + beforeAll(async () => { + db = new PGlite('memory://') + await db.waitReady + await db.query(` + CREATE TABLE IF NOT EXISTS test_copy ( + id SERIAL PRIMARY KEY, + name TEXT + ); + `) + }) + + afterAll(async () => { + await db.close() + }) + + it('should return affectedRows for COPY command', async () => { + const csvData = '1,test1\n2,test2\n' + const blob = new Blob([csvData]) + + const copyResult = await db.query("COPY test_copy FROM '/dev/blob' WITH (FORMAT csv);", [], { + blob, + }) + + expect(copyResult).toMatchObject({ + affectedRows: 2, + }) + }) +}) From 2400b43a20c4a9d3df73d74ac48109f9889202d3 Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Mon, 13 Jan 2025 18:00:33 +0000 Subject: [PATCH 2/2] Fix tests and add a changeset --- .changeset/soft-starfishes-stare.md | 5 ++ packages/pglite/src/parse.ts | 1 - packages/pglite/tests/basic.test.js | 60 ++++++++++++------- .../tests/targets/runtimes/node-fs.test.js | 32 ---------- .../targets/runtimes/node-memory.test.js | 32 ---------- 5 files changed, 42 insertions(+), 88 deletions(-) create mode 100644 .changeset/soft-starfishes-stare.md diff --git a/.changeset/soft-starfishes-stare.md b/.changeset/soft-starfishes-stare.md new file mode 100644 index 000000000..74d711c1f --- /dev/null +++ b/.changeset/soft-starfishes-stare.md @@ -0,0 +1,5 @@ +--- +'@electric-sql/pglite': patch +--- + +Add affectedRows for COPY command diff --git a/packages/pglite/src/parse.ts b/packages/pglite/src/parse.ts index c32e78256..114c99f95 100644 --- a/packages/pglite/src/parse.ts +++ b/packages/pglite/src/parse.ts @@ -89,7 +89,6 @@ function retrieveRowCount(msg: CommandCompleteMessage): number { return parseInt(parts[2], 10) case 'UPDATE': case 'DELETE': - return parseInt(parts[1], 10) case 'COPY': return parseInt(parts[1], 10) default: diff --git a/packages/pglite/tests/basic.test.js b/packages/pglite/tests/basic.test.js index 3ff580205..bb9666b07 100644 --- a/packages/pglite/tests/basic.test.js +++ b/packages/pglite/tests/basic.test.js @@ -468,32 +468,46 @@ await testEsmAndCjs(async (importType) => { it('copy to/from blob', async () => { const db = new PGlite() await db.exec(` - CREATE TABLE IF NOT EXISTS test ( - id SERIAL PRIMARY KEY, - test TEXT - ); - INSERT INTO test (test) VALUES ('test'), ('test2'); - `) + CREATE TABLE IF NOT EXISTS test ( + id SERIAL PRIMARY KEY, + test TEXT + ); + INSERT INTO test (test) VALUES ('test'), ('test2'); + `) // copy to - const ret = await db.query("COPY test TO '/dev/blob' WITH (FORMAT csv);") - const csv = await ret.blob.text() + const copyToRet = await db.query( + "COPY test TO '/dev/blob' WITH (FORMAT csv);", + ) + + // Check that the copy command returns the number of rows affected + expect(copyToRet.affectedRows).toBe(2) + + const csv = await copyToRet.blob.text() expect(csv).toBe('1,test\n2,test2\n') // copy from const blob2 = new Blob([csv]) await db.exec(` - CREATE TABLE IF NOT EXISTS test2 ( - id SERIAL PRIMARY KEY, - test TEXT - ); - `) - await db.query("COPY test2 FROM '/dev/blob' WITH (FORMAT csv);", [], { - blob: blob2, - }) + CREATE TABLE IF NOT EXISTS test2 ( + id SERIAL PRIMARY KEY, + test TEXT + ); + `) + const copyFromRet = await db.query( + "COPY test2 FROM '/dev/blob' WITH (FORMAT csv);", + [], + { + blob: blob2, + }, + ) + + // Check that the copy command returns the number of rows affected + expect(copyFromRet.affectedRows).toBe(2) + const res = await db.query(` - SELECT * FROM test2; - `) + SELECT * FROM test2; + `) expect(res).toEqual({ rows: [ { @@ -522,11 +536,11 @@ await testEsmAndCjs(async (importType) => { it('close', async () => { const db = new PGlite() await db.query(` - CREATE TABLE IF NOT EXISTS test ( - id SERIAL PRIMARY KEY, - name TEXT - ); - `) + CREATE TABLE IF NOT EXISTS test ( + id SERIAL PRIMARY KEY, + name TEXT + ); + `) await db.query("INSERT INTO test (name) VALUES ('test');") await db.close() await expectToThrowAsync(async () => { diff --git a/packages/pglite/tests/targets/runtimes/node-fs.test.js b/packages/pglite/tests/targets/runtimes/node-fs.test.js index 152fc99ce..004861daf 100644 --- a/packages/pglite/tests/targets/runtimes/node-fs.test.js +++ b/packages/pglite/tests/targets/runtimes/node-fs.test.js @@ -1,35 +1,3 @@ import { tests } from './base.js' tests('node', './pgdata-test', 'node.fs') - -describe('COPY command affectedRows', () => { - let db - - beforeAll(async () => { - db = new PGlite('./pgdata-test-copy') - await db.waitReady - await db.query(` - CREATE TABLE IF NOT EXISTS test_copy ( - id SERIAL PRIMARY KEY, - name TEXT - ); - `) - }) - - afterAll(async () => { - await db.close() - }) - - it('should return affectedRows for COPY command', async () => { - const csvData = '1,test1\n2,test2\n' - const blob = new Blob([csvData]) - - const copyResult = await db.query("COPY test_copy FROM '/dev/blob' WITH (FORMAT csv);", [], { - blob, - }) - - expect(copyResult).toMatchObject({ - affectedRows: 2, - }) - }) -}) diff --git a/packages/pglite/tests/targets/runtimes/node-memory.test.js b/packages/pglite/tests/targets/runtimes/node-memory.test.js index e191bd102..e48925f3f 100644 --- a/packages/pglite/tests/targets/runtimes/node-memory.test.js +++ b/packages/pglite/tests/targets/runtimes/node-memory.test.js @@ -1,35 +1,3 @@ import { tests } from './base.js' tests('node', 'memory://', 'node.memory') - -describe('COPY command affectedRows', () => { - let db - - beforeAll(async () => { - db = new PGlite('memory://') - await db.waitReady - await db.query(` - CREATE TABLE IF NOT EXISTS test_copy ( - id SERIAL PRIMARY KEY, - name TEXT - ); - `) - }) - - afterAll(async () => { - await db.close() - }) - - it('should return affectedRows for COPY command', async () => { - const csvData = '1,test1\n2,test2\n' - const blob = new Blob([csvData]) - - const copyResult = await db.query("COPY test_copy FROM '/dev/blob' WITH (FORMAT csv);", [], { - blob, - }) - - expect(copyResult).toMatchObject({ - affectedRows: 2, - }) - }) -})