From c084dde32860485f6d63872effcaa76b2d35aed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ad=C3=A1mek?= Date: Sun, 6 Nov 2022 00:43:07 +0100 Subject: [PATCH] fix(knex): always skip virtual properties in returning clause (#3699) Co-authored-by: Matheus Leonardo --- packages/knex/src/AbstractSqlDriver.ts | 2 +- packages/knex/src/query/QueryBuilderHelper.ts | 2 +- tests/QueryBuilder.test.ts | 4 ++-- tests/issues/GH1626.test.ts | 3 +++ 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/knex/src/AbstractSqlDriver.ts b/packages/knex/src/AbstractSqlDriver.ts index d17761c5bb18..929f3fd5a08b 100644 --- a/packages/knex/src/AbstractSqlDriver.ts +++ b/packages/knex/src/AbstractSqlDriver.ts @@ -356,7 +356,7 @@ export abstract class AbstractSqlDriver prop.primary || prop.defaultRaw); + const returningProps = meta!.hydrateProps.filter(prop => prop.persist !== false && (prop.primary || prop.defaultRaw)); const returningFields = Utils.flatten(returningProps.map(prop => prop.fieldNames)); /* istanbul ignore next */ sql += returningFields.length > 0 ? ` returning ${returningFields.map(field => this.platform.quoteIdentifier(field)).join(', ')}` : ''; diff --git a/packages/knex/src/query/QueryBuilderHelper.ts b/packages/knex/src/query/QueryBuilderHelper.ts index 699230f07730..350a72ece1aa 100644 --- a/packages/knex/src/query/QueryBuilderHelper.ts +++ b/packages/knex/src/query/QueryBuilderHelper.ts @@ -571,7 +571,7 @@ export class QueryBuilderHelper { const useReturningStatement = type === QueryType.INSERT && this.platform.usesReturningStatement() && meta && !meta.compositePK; if (useReturningStatement) { - const returningProps = meta!.hydrateProps.filter(prop => prop.primary || prop.defaultRaw); + const returningProps = meta!.hydrateProps.filter(prop => prop.persist !== false && (prop.primary || prop.defaultRaw)); qb.returning(Utils.flatten(returningProps.map(prop => prop.fieldNames))); } } diff --git a/tests/QueryBuilder.test.ts b/tests/QueryBuilder.test.ts index 5cb7367802b6..161b7fd7a012 100644 --- a/tests/QueryBuilder.test.ts +++ b/tests/QueryBuilder.test.ts @@ -2480,7 +2480,7 @@ describe('QueryBuilder', () => { const qb9 = pg.em.createQueryBuilder(Author2); qb9.insert({ email: 'ignore@example.com', name: 'John Doe' }).onConflict('email').ignore(); - expect(qb9.getQuery()).toEqual('insert into "author2" ("email", "name") values ($1, $2) on conflict ("email") do nothing returning "id", "hook_test", "created_at", "updated_at", "age", "terms_accepted"'); + expect(qb9.getQuery()).toEqual('insert into "author2" ("email", "name") values ($1, $2) on conflict ("email") do nothing returning "id", "created_at", "updated_at", "age", "terms_accepted"'); expect(qb9.getParams()).toEqual(['ignore@example.com', 'John Doe']); const timestamp = new Date(); @@ -2498,7 +2498,7 @@ describe('QueryBuilder', () => { }) .where({ updatedAt: { $lt: timestamp } }); - expect(qb10.getQuery()).toEqual('insert into "author2" ("created_at", "email", "name", "updated_at") values ($1, $2, $3, $4) on conflict ("email") do update set "name" = $5,"updated_at" = $6 where "updated_at" < $7 returning "id", "hook_test", "created_at", "updated_at", "age", "terms_accepted"'); + expect(qb10.getQuery()).toEqual('insert into "author2" ("created_at", "email", "name", "updated_at") values ($1, $2, $3, $4) on conflict ("email") do update set "name" = $5,"updated_at" = $6 where "updated_at" < $7 returning "id", "created_at", "updated_at", "age", "terms_accepted"'); expect(qb10.getParams()).toEqual([timestamp, 'ignore@example.com', 'John Doe', timestamp, 'John Doe', timestamp, timestamp]); const qb11 = pg.em.createQueryBuilder(Book2).where({ meta: { foo: 123 } }); diff --git a/tests/issues/GH1626.test.ts b/tests/issues/GH1626.test.ts index 245ef7397833..f6d9153d7c1f 100644 --- a/tests/issues/GH1626.test.ts +++ b/tests/issues/GH1626.test.ts @@ -34,6 +34,9 @@ export class Author { return this.name ?? '~'; } + @Property({ persist: false }) + foo?: string = '123'; + } describe('GH issue 1626', () => {