fix: include asExpression columns in returning clause (#10632)

* fix: include asExpression columns in returning clause

Closes: #8450

* test: add test for issue #8450
This commit is contained in:
Maarten Sijmkens 2024-01-26 06:41:58 +01:00 committed by GitHub
parent 8aa8690f94
commit f232ba7808
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 61 additions and 1 deletions

View File

@ -1127,6 +1127,7 @@ export class EntityMetadata {
return this.columns.filter((column) => {
return (
column.default !== undefined ||
column.asExpression !== undefined ||
column.isGenerated ||
column.isCreateDate ||
column.isUpdateDate ||

View File

@ -274,7 +274,11 @@ export class ReturningResultsEntityUpdator {
getUpdationReturningColumns(): ColumnMetadata[] {
return this.expressionMap.mainAlias!.metadata.columns.filter(
(column) => {
return column.isUpdateDate || column.isVersion
return (
column.asExpression !== undefined ||
column.isUpdateDate ||
column.isVersion
)
},
)
}
@ -286,6 +290,7 @@ export class ReturningResultsEntityUpdator {
return this.expressionMap.mainAlias!.metadata.columns.filter(
(column) => {
return (
column.asExpression !== undefined ||
column.isUpdateDate ||
column.isVersion ||
column.isDeleteDate

View File

@ -0,0 +1,16 @@
import { Entity } from "../../../../src/decorator/entity/Entity"
import { PrimaryColumn } from "../../../../src/decorator/columns/PrimaryColumn"
import { Column } from "../../../../src/decorator/columns/Column"
@Entity("user")
export class UserEntity {
@PrimaryColumn("int")
id: number
@Column({
type: "int",
generatedType: "STORED",
asExpression: "id * 2",
})
generated: number
}

View File

@ -0,0 +1,38 @@
import "reflect-metadata"
import {
closeTestingConnections,
createTestingConnections,
reloadTestingDatabases,
} from "../../utils/test-utils"
import { UserEntity } from "./entity/UserEntity"
import { expect } from "chai"
import { DataSource } from "../../../src"
describe("github issues > #8450 Generated column not in RETURNING clause on save", () => {
let connections: DataSource[]
before(
async () =>
(connections = await createTestingConnections({
entities: [__dirname + "/entity/*{.js,.ts}"],
enabledDrivers: ["postgres", "mysql"],
})),
)
beforeEach(() => reloadTestingDatabases(connections))
after(() => closeTestingConnections(connections))
it("should populate an object with generated column values after saving", () =>
Promise.all(
connections.map(async (connection) => {
const user = new UserEntity()
user.id = 100
expect(user.generated).to.be.undefined
await connection.manager.save(user)
expect(user.generated).to.be.a("number")
expect(user.generated).to.be.equal(user.id * 2)
}),
))
})