Skip to content

Propagate column renames to FK and unique constraints in the table dialog (#9060)#10046

Open
dpage wants to merge 2 commits into
pgadmin-org:masterfrom
dpage:fix-9060-column-rename-fk-unique
Open

Propagate column renames to FK and unique constraints in the table dialog (#9060)#10046
dpage wants to merge 2 commits into
pgadmin-org:masterfrom
dpage:fix-9060-column-rename-fk-unique

Conversation

@dpage

@dpage dpage commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes #9060.

In the Create Table dialog, renaming a column already propagated to the primary key definition, but foreign key and unique constraint definitions kept referencing the old column name — producing wrong/broken DDL.

Fix: mirror the existing PK rename-propagation logic in the foreign_key and unique_constraint depChange handlers — on a column name SET_VALUE in a new table, rewrite the old name to the new name in each FK's columns[].local_column and each unique constraint's columns[].column. Also added 'columns' to the unique constraint's deps so its depChange fires on column edits (FK already had it).

Changes

  • table.ui.js (one file)

🤖 Generated with Claude Code

Summary by CodeRabbit

Bug Fixes

  • Fixed the Create Table dialog to properly propagate column renames to foreign key and unique constraint definitions. When renaming a column, all constraint references now correctly reflect the updated column name.

@coderabbitai

coderabbitai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 77fbfa2c-9077-43eb-b5ed-45aae741e853

📥 Commits

Reviewing files that changed from the base of the PR and between 1a8dcd8 and 0924f9c.

📒 Files selected for processing (3)
  • docs/en_US/release_notes_9_16.rst
  • web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js
  • web/regression/javascript/schema_ui_files/table.ui.spec.js

Walkthrough

This PR fixes a bug where renaming a column in the Create Table dialog failed to update references to that column within foreign key and unique constraint definitions. The implementation extends the depChange handlers to detect rename actions and propagate the new column name through all constraint references, with comprehensive tests validating the fix.

Changes

Column Rename Propagation in Constraints

Layer / File(s) Summary
Foreign Key and Unique Constraint depChange handlers
web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js
Extended depChange logic for both Foreign Key and Unique Constraint constraint collections. When a column name is changed, the handlers now detect the rename action and remap all constraint column references from the old name to the new name. Handlers receive additional source, topState, and actionObj parameters to support rename synchronization.
Test coverage for column rename propagation
web/regression/javascript/schema_ui_files/table.ui.spec.js
Added new Jest test case depChange column rename propagation that verifies renamed columns are correctly propagated through foreign key local_column references, unique constraint columns[*].column entries, and unique constraint INCLUDE lists in create-path scenarios.
Release notes documentation
docs/en_US/release_notes_9_16.rst
Added entry under Version 9.16 Bug Fixes documenting Issue #9060 fix for the Create Table dialog where renaming a column now updates it in foreign key and unique constraint definitions.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Suggested reviewers

  • adityatoshniwal
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title clearly and specifically describes the main change: propagating column renames to FK and unique constraints in the table dialog, with the related issue number.
Linked Issues check ✅ Passed The code changes implement all requirements from issue #9060: foreign key and unique constraint column references are now updated when a column is renamed in the Create Table dialog.
Out of Scope Changes check ✅ Passed All changes are directly scoped to issue #9060: table.ui.js implements the rename-propagation logic, table.ui.spec.js adds corresponding tests, and release_notes updates document the fix.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
⚔️ Resolve merge conflicts
  • Resolve merge conflict in branch fix-9060-column-rename-fk-unique

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@dpage dpage force-pushed the fix-9060-column-rename-fk-unique branch 2 times, most recently from 8c5f1c7 to eb9f462 Compare June 9, 2026 11:36
In the new-table dialog, the primary key already updated its column
references when a column was renamed, but foreign key and unique
constraint definitions did not, leaving them pointing at the old name.
Mirror the PK rename-propagation in the foreign_key and unique_constraint
depChange handlers (and add 'columns' to the unique constraint deps so it
fires on column changes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@dpage dpage force-pushed the fix-9060-column-rename-fk-unique branch from eb9f462 to c41ec7a Compare June 9, 2026 11:37
@asheshv asheshv requested a review from Copilot June 10, 2026 14:04

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes column-rename propagation in the Create Table dialog so constraint definitions don’t keep referencing stale column names (Issue #9060), preventing incorrect/broken generated DDL.

Changes:

  • Propagate renamed column names into foreign_key[].columns[].local_column when editing table columns in the Create Table dialog.
  • Propagate renamed column names into unique_constraint[].columns[].column and ensure the unique-constraint handler is triggered on table column edits by adding columns to deps.
  • Document the fix in the v9.16 release notes.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

File Description
web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js Adds rename-propagation logic for FK + unique constraints when a table column name changes.
docs/en_US/release_notes_9_16.rst Adds a bug-fix entry referencing Issue #9060.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +260 to +265
return {unique_constraint: state.unique_constraint.map((uc)=>({
...uc,
columns: uc.columns?.map((c)=>(
c.column === oldName ? {...c, column: newName} : c
)),
}))};
Comment on lines +207 to +220
/* If a column is renamed, sync the foreign key local column references. #9060 */
if(actionObj.type == SCHEMA_STATE_ACTIONS.SET_VALUE && actionObj.path[0] == 'columns' &&
actionObj.path[actionObj.path.length-1] == 'name' && state.oid === undefined &&
state.foreign_key?.length) {
let oldName = actionObj.oldState.columns[actionObj.path[1]]?.name,
newName = _.get(state, _.slice(actionObj.path, 0, -1))?.name;
if(oldName && newName && oldName !== newName) {
return {foreign_key: state.foreign_key.map((fk)=>({
...fk,
columns: fk.columns?.map((c)=>(
c.local_column === oldName ? {...c, local_column: newName} : c
)),
}))};
}
Comment thread docs/en_US/release_notes_9_16.rst Outdated
Bug fixes
*********

| `Issue #9060 <https://github.com/pgadmin-org/pgadmin4/issues/9060>`_ - Fixed an issue in the Create/Edit Table dialog where renaming a column did not update the column references in foreign key and unique constraint definitions for the new table.
- Remap unique constraint INCLUDE columns on rename. The INCLUDE list
  holds bare name strings (not {column} objects), so renaming an
  included column previously emitted stale DDL. Now mirrors the
  primary key INCLUDE handling.
- Add regression tests covering rename propagation in depChange for
  foreign_key and unique_constraint, including the unique constraint
  INCLUDE case.
- Correct the release note wording from "Create/Edit Table" to
  "Create Table"; the propagation only runs on the new-table path
  (state.oid === undefined).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Updating column name does not update it on the foreign key and unique constraint columns

2 participants