From 6387a13693ed74b3ba4007d49b4c93f33234c2bf Mon Sep 17 00:00:00 2001 From: Ed Mitchell Date: Thu, 14 Oct 2021 01:26:28 -0500 Subject: [PATCH 1/3] fix(8273) Adding @Generated('uuid') will now generate a migration to add the DEFAULT value --- src/driver/postgres/PostgresQueryRunner.ts | 32 ++++++++++++------- test/github-issues/8273/entity/User.ts | 15 +++++++++ .../8273/issue-8273-add-generated.ts | 31 ++++++++++++++++++ .../8273/issue-8273-remove-generated.ts | 31 ++++++++++++++++++ 4 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 test/github-issues/8273/entity/User.ts create mode 100644 test/github-issues/8273/issue-8273-add-generated.ts create mode 100644 test/github-issues/8273/issue-8273-remove-generated.ts diff --git a/src/driver/postgres/PostgresQueryRunner.ts b/src/driver/postgres/PostgresQueryRunner.ts index baae949bc9..21def7b7cb 100644 --- a/src/driver/postgres/PostgresQueryRunner.ts +++ b/src/driver/postgres/PostgresQueryRunner.ts @@ -963,20 +963,30 @@ export class PostgresQueryRunner extends BaseQueryRunner implements QueryRunner } } - if (oldColumn.isGenerated !== newColumn.isGenerated && newColumn.generationStrategy !== "uuid") { - if (newColumn.isGenerated === true) { - upQueries.push(new Query(`CREATE SEQUENCE IF NOT EXISTS ${this.escapePath(this.buildSequencePath(table, newColumn))} OWNED BY ${this.escapePath(table)}."${newColumn.name}"`)); - downQueries.push(new Query(`DROP SEQUENCE ${this.escapePath(this.buildSequencePath(table, newColumn))}`)); + if (oldColumn.isGenerated !== newColumn.isGenerated) { + if (newColumn.generationStrategy === "uuid") { + if (newColumn.isGenerated === true) { + upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" SET DEFAULT ${this.driver.uuidGenerator}`)) + downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" DROP DEFAULT`)); + } else { + upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" DROP DEFAULT`)); + downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" SET DEFAULT ${this.driver.uuidGenerator}`)) + } + } else { + if (newColumn.isGenerated === true) { + upQueries.push(new Query(`CREATE SEQUENCE IF NOT EXISTS ${this.escapePath(this.buildSequencePath(table, newColumn))} OWNED BY ${this.escapePath(table)}."${newColumn.name}"`)); + downQueries.push(new Query(`DROP SEQUENCE ${this.escapePath(this.buildSequencePath(table, newColumn))}`)); - upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" SET DEFAULT nextval('${this.escapePath(this.buildSequencePath(table, newColumn))}')`)); - downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" DROP DEFAULT`)); + upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" SET DEFAULT nextval('${this.escapePath(this.buildSequencePath(table, newColumn))}')`)); + downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" DROP DEFAULT`)); - } else { - upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" DROP DEFAULT`)); - downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" SET DEFAULT nextval('${this.escapePath(this.buildSequencePath(table, newColumn))}')`)); + } else { + upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" DROP DEFAULT`)); + downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" SET DEFAULT nextval('${this.escapePath(this.buildSequencePath(table, newColumn))}')`)); - upQueries.push(new Query(`DROP SEQUENCE ${this.escapePath(this.buildSequencePath(table, newColumn))}`)); - downQueries.push(new Query(`CREATE SEQUENCE IF NOT EXISTS ${this.escapePath(this.buildSequencePath(table, newColumn))} OWNED BY ${this.escapePath(table)}."${newColumn.name}"`)); + upQueries.push(new Query(`DROP SEQUENCE ${this.escapePath(this.buildSequencePath(table, newColumn))}`)); + downQueries.push(new Query(`CREATE SEQUENCE IF NOT EXISTS ${this.escapePath(this.buildSequencePath(table, newColumn))} OWNED BY ${this.escapePath(table)}."${newColumn.name}"`)); + } } } diff --git a/test/github-issues/8273/entity/User.ts b/test/github-issues/8273/entity/User.ts new file mode 100644 index 0000000000..75ed0928d7 --- /dev/null +++ b/test/github-issues/8273/entity/User.ts @@ -0,0 +1,15 @@ +import { Entity, PrimaryColumn, Column, Generated } from "../../../../src"; + +@Entity() +export class User { + + @PrimaryColumn() + id: number; + + @Column({ type: "uuid" }) + uuid: string; + + @Column({ type: "uuid" }) + @Generated() + uuidWithGenerated: string; +} diff --git a/test/github-issues/8273/issue-8273-add-generated.ts b/test/github-issues/8273/issue-8273-add-generated.ts new file mode 100644 index 0000000000..eb4a668c39 --- /dev/null +++ b/test/github-issues/8273/issue-8273-add-generated.ts @@ -0,0 +1,31 @@ +import "reflect-metadata"; +import {Connection} from "../../../src"; +import {createTestingConnections, closeTestingConnections} from "../../utils/test-utils"; +import {User} from "./entity/User"; + +describe("github issues > #8273 Adding @Generated('uuid') doesn't update column default. PostgreSQL", () => { + let connections: Connection[]; + before(async () => connections = await createTestingConnections({ + migrations: [], + enabledDrivers: ["postgres"], + schemaCreate: false, + dropSchema: true, + entities: [User], + })); + after(() => closeTestingConnections(connections)); + + it("changes default when generated is added", () => Promise.all(connections.map(async connection => { + await connection.driver.createSchemaBuilder().build(); + + const queryRunner = connection.createQueryRunner(); + let table = await queryRunner.getTable("user"); + const column = table!.findColumnByName("uuid")!; + const newColumn = column.clone(); + newColumn.isGenerated = true; + newColumn.generationStrategy = "uuid"; + + const sqlInMemory = await connection.driver.createSchemaBuilder().log(); + sqlInMemory.upQueries.length.should.be.greaterThan(0); + sqlInMemory.downQueries.length.should.be.greaterThan(0); + }))); +}); diff --git a/test/github-issues/8273/issue-8273-remove-generated.ts b/test/github-issues/8273/issue-8273-remove-generated.ts new file mode 100644 index 0000000000..2633f9767e --- /dev/null +++ b/test/github-issues/8273/issue-8273-remove-generated.ts @@ -0,0 +1,31 @@ +import "reflect-metadata"; +import {Connection} from "../../../src"; +import {createTestingConnections, closeTestingConnections} from "../../utils/test-utils"; +import {User} from "./entity/User"; + +describe("github issues > #8273 Adding @Generated('uuid') doesn't update column default. PostgreSQL", () => { + let connections: Connection[]; + before(async () => connections = await createTestingConnections({ + migrations: [], + enabledDrivers: ["postgres"], + schemaCreate: false, + dropSchema: true, + entities: [User], + })); + after(() => closeTestingConnections(connections)); + + it("changes default when generated is removed", () => Promise.all(connections.map(async connection => { + await connection.driver.createSchemaBuilder().build(); + + const queryRunner = connection.createQueryRunner(); + let table = await queryRunner.getTable("user"); + const column = table!.findColumnByName("uuidWithGenerated")!; + const newColumn = column.clone(); + newColumn.isGenerated = false; + newColumn.generationStrategy = undefined; + + const sqlInMemory = await connection.driver.createSchemaBuilder().log(); + sqlInMemory.upQueries.length.should.be.greaterThan(0); + sqlInMemory.downQueries.length.should.be.greaterThan(0); + }))); +}); From fb3002435fe5b9468e1fdbdd99fe9c9f855e47c3 Mon Sep 17 00:00:00 2001 From: Dmitry Zotov Date: Sat, 12 Feb 2022 18:49:41 +0500 Subject: [PATCH 2/3] implemented fix for "increment" generation type; implemented fix for generation removal; improved tests; --- src/driver/postgres/PostgresQueryRunner.ts | 15 +++ test/github-issues/8273/entity/User.ts | 9 +- .../8273/issue-8273-add-generated.ts | 31 ----- .../8273/issue-8273-remove-generated.ts | 31 ----- test/github-issues/8273/issue-8273.ts | 107 ++++++++++++++++++ 5 files changed, 130 insertions(+), 63 deletions(-) delete mode 100644 test/github-issues/8273/issue-8273-add-generated.ts delete mode 100644 test/github-issues/8273/issue-8273-remove-generated.ts create mode 100644 test/github-issues/8273/issue-8273.ts diff --git a/src/driver/postgres/PostgresQueryRunner.ts b/src/driver/postgres/PostgresQueryRunner.ts index 7cc8e1d746..69ff292459 100644 --- a/src/driver/postgres/PostgresQueryRunner.ts +++ b/src/driver/postgres/PostgresQueryRunner.ts @@ -1021,6 +1021,21 @@ export class PostgresQueryRunner extends BaseQueryRunner implements QueryRunner } if (oldColumn.isGenerated !== newColumn.isGenerated) { + // if old column was "generated", we should clear defaults + if (oldColumn.isGenerated) { + if (oldColumn.generationStrategy === "uuid") { + upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${oldColumn.name}" DROP DEFAULT`)); + downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${oldColumn.name}" SET DEFAULT ${this.driver.uuidGenerator}`)) + + } else if (oldColumn.generationStrategy === "increment") { + upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" DROP DEFAULT`)); + downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" SET DEFAULT nextval('${this.escapePath(this.buildSequencePath(table, newColumn))}')`)); + + upQueries.push(new Query(`DROP SEQUENCE ${this.escapePath(this.buildSequencePath(table, newColumn))}`)); + downQueries.push(new Query(`CREATE SEQUENCE IF NOT EXISTS ${this.escapePath(this.buildSequencePath(table, newColumn))} OWNED BY ${this.escapePath(table)}."${newColumn.name}"`)); + } + } + if (newColumn.generationStrategy === "uuid") { if (newColumn.isGenerated === true) { upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" SET DEFAULT ${this.driver.uuidGenerator}`)) diff --git a/test/github-issues/8273/entity/User.ts b/test/github-issues/8273/entity/User.ts index 75ed0928d7..22e23d29ee 100644 --- a/test/github-issues/8273/entity/User.ts +++ b/test/github-issues/8273/entity/User.ts @@ -10,6 +10,13 @@ export class User { uuid: string; @Column({ type: "uuid" }) - @Generated() + @Generated("uuid") uuidWithGenerated: string; + + @Column() + increment: number; + + @Column() + @Generated("increment") + incrementWithGenerated: number; } diff --git a/test/github-issues/8273/issue-8273-add-generated.ts b/test/github-issues/8273/issue-8273-add-generated.ts deleted file mode 100644 index eb4a668c39..0000000000 --- a/test/github-issues/8273/issue-8273-add-generated.ts +++ /dev/null @@ -1,31 +0,0 @@ -import "reflect-metadata"; -import {Connection} from "../../../src"; -import {createTestingConnections, closeTestingConnections} from "../../utils/test-utils"; -import {User} from "./entity/User"; - -describe("github issues > #8273 Adding @Generated('uuid') doesn't update column default. PostgreSQL", () => { - let connections: Connection[]; - before(async () => connections = await createTestingConnections({ - migrations: [], - enabledDrivers: ["postgres"], - schemaCreate: false, - dropSchema: true, - entities: [User], - })); - after(() => closeTestingConnections(connections)); - - it("changes default when generated is added", () => Promise.all(connections.map(async connection => { - await connection.driver.createSchemaBuilder().build(); - - const queryRunner = connection.createQueryRunner(); - let table = await queryRunner.getTable("user"); - const column = table!.findColumnByName("uuid")!; - const newColumn = column.clone(); - newColumn.isGenerated = true; - newColumn.generationStrategy = "uuid"; - - const sqlInMemory = await connection.driver.createSchemaBuilder().log(); - sqlInMemory.upQueries.length.should.be.greaterThan(0); - sqlInMemory.downQueries.length.should.be.greaterThan(0); - }))); -}); diff --git a/test/github-issues/8273/issue-8273-remove-generated.ts b/test/github-issues/8273/issue-8273-remove-generated.ts deleted file mode 100644 index 2633f9767e..0000000000 --- a/test/github-issues/8273/issue-8273-remove-generated.ts +++ /dev/null @@ -1,31 +0,0 @@ -import "reflect-metadata"; -import {Connection} from "../../../src"; -import {createTestingConnections, closeTestingConnections} from "../../utils/test-utils"; -import {User} from "./entity/User"; - -describe("github issues > #8273 Adding @Generated('uuid') doesn't update column default. PostgreSQL", () => { - let connections: Connection[]; - before(async () => connections = await createTestingConnections({ - migrations: [], - enabledDrivers: ["postgres"], - schemaCreate: false, - dropSchema: true, - entities: [User], - })); - after(() => closeTestingConnections(connections)); - - it("changes default when generated is removed", () => Promise.all(connections.map(async connection => { - await connection.driver.createSchemaBuilder().build(); - - const queryRunner = connection.createQueryRunner(); - let table = await queryRunner.getTable("user"); - const column = table!.findColumnByName("uuidWithGenerated")!; - const newColumn = column.clone(); - newColumn.isGenerated = false; - newColumn.generationStrategy = undefined; - - const sqlInMemory = await connection.driver.createSchemaBuilder().log(); - sqlInMemory.upQueries.length.should.be.greaterThan(0); - sqlInMemory.downQueries.length.should.be.greaterThan(0); - }))); -}); diff --git a/test/github-issues/8273/issue-8273.ts b/test/github-issues/8273/issue-8273.ts new file mode 100644 index 0000000000..3c6f084719 --- /dev/null +++ b/test/github-issues/8273/issue-8273.ts @@ -0,0 +1,107 @@ +import "reflect-metadata"; +import {expect} from "chai"; +import {Connection, QueryRunner} from "../../../src"; +import {createTestingConnections, closeTestingConnections} from "../../utils/test-utils"; +import {User} from "./entity/User"; + +describe("github issues > #8273 Adding @Generated('uuid') doesn't update column default in PostgreSQL", () => { + let connections: Connection[]; + const getColumnDefault = async (queryRunner: QueryRunner, columnName: string): Promise => { + const query = `SELECT "column_default"`+ + ` FROM "information_schema"."columns"`+ + ` WHERE "table_schema" = 'public' AND "table_name" = 'user' AND "column_name" = '${columnName}'` + const res = await queryRunner.query(query) + return res.length ? res[0]["column_default"] : null + } + before(async () => connections = await createTestingConnections({ + enabledDrivers: ["postgres"], + schemaCreate: true, + dropSchema: true, + entities: [User], + })); + after(() => closeTestingConnections(connections)); + + it("should add DEFAULT value when @Generated('increment') is added", () => Promise.all(connections.map(async connection => { + const queryRunner = connection.createQueryRunner(); + let table = await queryRunner.getTable("user"); + const column = table!.findColumnByName("increment")!; + const newColumn = column.clone(); + newColumn.isGenerated = true; + newColumn.generationStrategy = "increment"; + + await queryRunner.changeColumn(table!, column, newColumn) + + let columnDefault = await getColumnDefault(queryRunner, "increment") + expect(columnDefault).to.equal("nextval('user_increment_seq'::regclass)") + + await queryRunner.executeMemoryDownSql(); + + columnDefault = await getColumnDefault(queryRunner, "uuid") + expect(columnDefault).to.null + + await queryRunner.release() + }))); + + it("should remove DEFAULT value when @Generated('increment') is removed", () => Promise.all(connections.map(async connection => { + const queryRunner = connection.createQueryRunner(); + let table = await queryRunner.getTable("user"); + const column = table!.findColumnByName("incrementWithGenerated")!; + const newColumn = column.clone(); + newColumn.isGenerated = false; + newColumn.generationStrategy = undefined; + + await queryRunner.changeColumn(table!, column, newColumn) + + let columnDefault = await getColumnDefault(queryRunner, "incrementWithGenerated") + expect(columnDefault).to.null + + await queryRunner.executeMemoryDownSql(); + + columnDefault = await getColumnDefault(queryRunner, "incrementWithGenerated") + expect(columnDefault).to.equal(`nextval('"user_incrementWithGenerated_seq"'::regclass)`) + + await queryRunner.release() + }))); + + it("should add DEFAULT value when @Generated('uuid') is added", () => Promise.all(connections.map(async connection => { + const queryRunner = connection.createQueryRunner(); + let table = await queryRunner.getTable("user"); + const column = table!.findColumnByName("uuid")!; + const newColumn = column.clone(); + newColumn.isGenerated = true; + newColumn.generationStrategy = "uuid"; + + await queryRunner.changeColumn(table!, column, newColumn) + + let columnDefault = await getColumnDefault(queryRunner, "uuid") + expect(columnDefault).to.equal("uuid_generate_v4()") + + await queryRunner.executeMemoryDownSql(); + + columnDefault = await getColumnDefault(queryRunner, "uuid") + expect(columnDefault).to.null + + await queryRunner.release() + }))); + + it("should remove DEFAULT value when @Generated('uuid') is removed", () => Promise.all(connections.map(async connection => { + const queryRunner = connection.createQueryRunner(); + let table = await queryRunner.getTable("user"); + const column = table!.findColumnByName("uuidWithGenerated")!; + const newColumn = column.clone(); + newColumn.isGenerated = false; + newColumn.generationStrategy = undefined; + + await queryRunner.changeColumn(table!, column, newColumn) + + let columnDefault = await getColumnDefault(queryRunner, "uuidWithGenerated") + expect(columnDefault).to.null + + await queryRunner.executeMemoryDownSql(); + + columnDefault = await getColumnDefault(queryRunner, "uuidWithGenerated") + expect(columnDefault).to.equal("uuid_generate_v4()") + + await queryRunner.release() + }))); +}); From e42cef51f2b3949909164183a0498099e6b25c48 Mon Sep 17 00:00:00 2001 From: Dmitry Zotov Date: Sat, 12 Feb 2022 19:57:10 +0500 Subject: [PATCH 3/3] added test for #5898 --- test/github-issues/5898/entity/Album.ts | 11 +++ test/github-issues/5898/entity/Document.ts | 12 +++ test/github-issues/5898/entity/Photo.ts | 12 +++ test/github-issues/5898/entity/User.ts | 11 +++ test/github-issues/5898/issue-5898.ts | 110 +++++++++++++++++++++ test/github-issues/8273/issue-8273.ts | 2 +- 6 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 test/github-issues/5898/entity/Album.ts create mode 100644 test/github-issues/5898/entity/Document.ts create mode 100644 test/github-issues/5898/entity/Photo.ts create mode 100644 test/github-issues/5898/entity/User.ts create mode 100644 test/github-issues/5898/issue-5898.ts diff --git a/test/github-issues/5898/entity/Album.ts b/test/github-issues/5898/entity/Album.ts new file mode 100644 index 0000000000..05e3ed4957 --- /dev/null +++ b/test/github-issues/5898/entity/Album.ts @@ -0,0 +1,11 @@ +import {Entity, OneToMany, PrimaryGeneratedColumn} from "../../../../src"; +import {Photo} from "./Photo"; + +@Entity() +export class Album { + @PrimaryGeneratedColumn() + id: string + + @OneToMany(() => Photo, (photo) => photo.album, { onDelete: "CASCADE" }) + photos: Photo[] +} diff --git a/test/github-issues/5898/entity/Document.ts b/test/github-issues/5898/entity/Document.ts new file mode 100644 index 0000000000..36fa910b1e --- /dev/null +++ b/test/github-issues/5898/entity/Document.ts @@ -0,0 +1,12 @@ +import {Entity, JoinColumn, ManyToOne, PrimaryColumn} from "../../../../src"; +import {User} from "./User"; + +@Entity() +export class Document { + @PrimaryColumn("uuid") + id: string + + @ManyToOne(() => User, (user) => user.docs, {onDelete: "CASCADE"}) + @JoinColumn({name: "ownerId"}) + owner: User +} diff --git a/test/github-issues/5898/entity/Photo.ts b/test/github-issues/5898/entity/Photo.ts new file mode 100644 index 0000000000..ae0b9d6011 --- /dev/null +++ b/test/github-issues/5898/entity/Photo.ts @@ -0,0 +1,12 @@ +import {Entity, JoinColumn, ManyToOne, PrimaryColumn} from "../../../../src"; +import {Album} from "./Album"; + +@Entity() +export class Photo { + @PrimaryColumn() + id: string + + @ManyToOne(() => Album, (album) => album.photos, {onDelete: "CASCADE"}) + @JoinColumn({name: "albumId"}) + album: Album +} diff --git a/test/github-issues/5898/entity/User.ts b/test/github-issues/5898/entity/User.ts new file mode 100644 index 0000000000..eec549973c --- /dev/null +++ b/test/github-issues/5898/entity/User.ts @@ -0,0 +1,11 @@ +import {Entity, OneToMany, PrimaryGeneratedColumn} from "../../../../src"; +import {Document} from "./Document"; + +@Entity() +export class User { + @PrimaryGeneratedColumn("uuid") + id: string + + @OneToMany(() => Document, (doc) => doc.owner, { onDelete: "CASCADE" }) + docs: Document[] +} diff --git a/test/github-issues/5898/issue-5898.ts b/test/github-issues/5898/issue-5898.ts new file mode 100644 index 0000000000..fc1c0fab0d --- /dev/null +++ b/test/github-issues/5898/issue-5898.ts @@ -0,0 +1,110 @@ +import "reflect-metadata"; +import {expect} from "chai"; +import {Connection, QueryRunner} from "../../../src"; +import {createTestingConnections, closeTestingConnections} from "../../utils/test-utils"; +import {User} from "./entity/User"; +import {Document} from "./entity/Document"; +import {Album} from "./entity/Album"; +import {Photo} from "./entity/Photo"; + +describe("github issues > #5898 Postgres primary key of type uuid: default value migration/sync not working", () => { + let connections: Connection[]; + const getColumnDefault = async (queryRunner: QueryRunner, tableName: string, columnName: string): Promise => { + const query = `SELECT "column_default"` + + ` FROM "information_schema"."columns"` + + ` WHERE "table_schema" = 'public' AND "table_name" = '${tableName}' AND "column_name" = '${columnName}'` + const res = await queryRunner.query(query) + return res.length ? res[0]["column_default"] : null + } + before(async () => connections = await createTestingConnections({ + enabledDrivers: ["postgres"], + schemaCreate: true, + dropSchema: true, + entities: [User, Document, Album, Photo], + })); + after(() => closeTestingConnections(connections)); + + it("should add DEFAULT value when @PrimaryGeneratedColumn('increment') is added", () => Promise.all(connections.map(async connection => { + const queryRunner = connection.createQueryRunner(); + let table = await queryRunner.getTable("photo"); + const column = table!.findColumnByName("id")!; + const newColumn = column.clone(); + newColumn.isGenerated = true; + newColumn.generationStrategy = "increment"; + + await queryRunner.changeColumn(table!, column, newColumn) + + let columnDefault = await getColumnDefault(queryRunner, "photo", "id") + expect(columnDefault).to.equal("nextval('photo_id_seq'::regclass)") + + await queryRunner.executeMemoryDownSql(); + + columnDefault = await getColumnDefault(queryRunner, "photo", "id") + expect(columnDefault).to.null + + await queryRunner.release() + }))); + + it("should remove DEFAULT value when @PrimaryGeneratedColumn('increment') is removed", () => Promise.all(connections.map(async connection => { + const queryRunner = connection.createQueryRunner(); + let table = await queryRunner.getTable("album"); + const column = table!.findColumnByName("id")!; + const newColumn = column.clone(); + newColumn.isGenerated = false; + newColumn.generationStrategy = undefined; + + await queryRunner.changeColumn(table!, column, newColumn) + + let columnDefault = await getColumnDefault(queryRunner, "album", "id") + expect(columnDefault).to.null + + await queryRunner.executeMemoryDownSql(); + + columnDefault = await getColumnDefault(queryRunner, "album", "id") + expect(columnDefault).to.equal(`nextval('album_id_seq'::regclass)`) + + await queryRunner.release() + }))); + + it("should add DEFAULT value when @PrimaryGeneratedColumn('uuid') is added", () => Promise.all(connections.map(async connection => { + const queryRunner = connection.createQueryRunner(); + let table = await queryRunner.getTable("document"); + const column = table!.findColumnByName("id")!; + const newColumn = column.clone(); + newColumn.isGenerated = true; + newColumn.generationStrategy = "uuid"; + + await queryRunner.changeColumn(table!, column, newColumn) + + let columnDefault = await getColumnDefault(queryRunner, "document", "id") + expect(columnDefault).to.equal("uuid_generate_v4()") + + await queryRunner.executeMemoryDownSql(); + + columnDefault = await getColumnDefault(queryRunner, "document", "id") + expect(columnDefault).to.null + + await queryRunner.release() + }))); + + it("should remove DEFAULT value when @PrimaryGeneratedColumn('uuid') is removed", () => Promise.all(connections.map(async connection => { + const queryRunner = connection.createQueryRunner(); + let table = await queryRunner.getTable("user"); + const column = table!.findColumnByName("id")!; + const newColumn = column.clone(); + newColumn.isGenerated = false; + newColumn.generationStrategy = undefined; + + await queryRunner.changeColumn(table!, column, newColumn) + + let columnDefault = await getColumnDefault(queryRunner, "user", "id") + expect(columnDefault).to.null + + await queryRunner.executeMemoryDownSql(); + + columnDefault = await getColumnDefault(queryRunner, "user", "id") + expect(columnDefault).to.equal("uuid_generate_v4()") + + await queryRunner.release() + }))); +}); diff --git a/test/github-issues/8273/issue-8273.ts b/test/github-issues/8273/issue-8273.ts index 3c6f084719..212e651622 100644 --- a/test/github-issues/8273/issue-8273.ts +++ b/test/github-issues/8273/issue-8273.ts @@ -36,7 +36,7 @@ describe("github issues > #8273 Adding @Generated('uuid') doesn't update column await queryRunner.executeMemoryDownSql(); - columnDefault = await getColumnDefault(queryRunner, "uuid") + columnDefault = await getColumnDefault(queryRunner, "increment") expect(columnDefault).to.null await queryRunner.release()