Skip to content

Commit

Permalink
fix: rename a sequence related to generated primary key when a table …
Browse files Browse the repository at this point in the history
…is renamed (#5406)

* rename a sequence related to generated primary key when a table is renamed

* fix lint error on the test code

* put an additional condition to target to 'increment' strategy only

* fix test failure for renaming a table

* improved test

Co-authored-by: Heath Hwang <heath.supergene@gmail.com>
Co-authored-by: AlexMesser <dmzt08@gmail.com>
  • Loading branch information
3 people committed Mar 29, 2021
1 parent 9abf727 commit 25b457f
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 4 deletions.
14 changes: 14 additions & 0 deletions src/driver/postgres/PostgresQueryRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,20 @@ export class PostgresQueryRunner extends BaseQueryRunner implements QueryRunner
downQueries.push(new Query(`ALTER TABLE ${this.escapePath(newTable)} RENAME CONSTRAINT "${newPkName}" TO "${oldPkName}"`));
}

// rename sequences
newTable.columns.map(col => {
if (col.isGenerated && col.generationStrategy === "increment") {
const seqName = this.buildSequenceName(oldTable, col.name, undefined, true, true);
const newSeqName = this.buildSequenceName(newTable, col.name, undefined, true, true);

const up = schemaName ? `ALTER SEQUENCE "${schemaName}"."${seqName}" RENAME TO "${newSeqName}"` : `ALTER SEQUENCE "${seqName}" RENAME TO "${newSeqName}"`;
const down = schemaName ? `ALTER SEQUENCE "${schemaName}"."${newSeqName}" RENAME TO "${seqName}"` : `ALTER SEQUENCE "${newSeqName}" RENAME TO "${seqName}"`;

upQueries.push(new Query(up));
downQueries.push(new Query(down));
}
});

// rename unique constraints
newTable.uniques.forEach(unique => {
// build new constraint name
Expand Down
38 changes: 34 additions & 4 deletions test/functional/query-runner/rename-table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,51 @@ describe("query runner > rename table", () => {

const queryRunner = connection.createQueryRunner();

let table = await queryRunner.getTable("post");
// check if sequence "faculty_id_seq" exist
if (connection.driver instanceof PostgresDriver) {
const facultySeq = await queryRunner.query(`SELECT COUNT(*) FROM "pg_class" "c" WHERE "c"."relkind" = 'S' and "c"."relname" = 'faculty_id_seq'`);
facultySeq[0].count.should.be.equal("1");
}

let table = await queryRunner.getTable("faculty");

await queryRunner.renameTable(table!, "question");
table = await queryRunner.getTable("question");
table!.should.be.exist;

await queryRunner.renameTable("question", "user");
table = await queryRunner.getTable("user");
// check if sequence "faculty_id_seq" was renamed to "question_id_seq"
if (connection.driver instanceof PostgresDriver) {
const facultySeq = await queryRunner.query(`SELECT COUNT(*) FROM "pg_class" "c" WHERE "c"."relkind" = 'S' and "c"."relname" = 'faculty_id_seq'`);
const questionSeq = await queryRunner.query(`SELECT COUNT(*) FROM "pg_class" "c" WHERE "c"."relkind" = 'S' and "c"."relname" = 'question_id_seq'`);
facultySeq[0].count.should.be.equal("0");
questionSeq[0].count.should.be.equal("1");
}

await queryRunner.renameTable("question", "answer");
table = await queryRunner.getTable("answer");
table!.should.be.exist;

// check if sequence "question_id_seq" was renamed to "answer_id_seq"
if (connection.driver instanceof PostgresDriver) {
const questionSeq = await queryRunner.query(`SELECT COUNT(*) FROM "pg_class" "c" WHERE "c"."relkind" = 'S' and "c"."relname" = 'question_id_seq'`);
const answerSeq = await queryRunner.query(`SELECT COUNT(*) FROM "pg_class" "c" WHERE "c"."relkind" = 'S' and "c"."relname" = 'answer_id_seq'`);
questionSeq[0].count.should.be.equal("0");
answerSeq[0].count.should.be.equal("1");
}

await queryRunner.executeMemoryDownSql();

table = await queryRunner.getTable("post");
table = await queryRunner.getTable("faculty");
table!.should.be.exist;

// check if sequence "answer_id_seq" was renamed to "faculty_id_seq"
if (connection.driver instanceof PostgresDriver) {
const answerSeq = await queryRunner.query(`SELECT COUNT(*) FROM "pg_class" "c" WHERE "c"."relkind" = 'S' and "c"."relname" = 'answer_id_seq'`);
const facultySeq = await queryRunner.query(`SELECT COUNT(*) FROM "pg_class" "c" WHERE "c"."relkind" = 'S' and "c"."relname" = 'faculty_id_seq'`);
answerSeq[0].count.should.be.equal("0");
facultySeq[0].count.should.be.equal("1");
}

await queryRunner.release();
})));

Expand Down

0 comments on commit 25b457f

Please sign in to comment.