GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — fix(postgres): a sequence a column owns but no default uses is created by jasdeepkhalsa · Pull Request #293 · DBDiff/DBDiff

Conversation

@jasdeepkhalsa

@jasdeepkhalsa jasdeepkhalsa commented Nov 9, 2026

Copy link
Copy Markdown
Member

Two more sequence shapes from GitLab's schema. Both still differed after copying GitLab's schema to an empty database with the previous release.

What was wrong

A sequence counted as a serial column's own if it fed at most one default. A sequence that feeds no default fell through both paths:

  • Its table didn't create it: with no default, there was nothing to write as bigserial.

  • The sequence kind didn't create it either, because it treats serials as belonging to their table.

  • zoekt_tasks fills its id from a trigger (NEW.id := nextval('zoekt_tasks_id_seq')). The column has no default but owns the sequence. The copy had no sequence, so the trigger failed on the first insert. GitLab has ten tables like this.

  • p_sent_notifications owns p_sent_notifications_id_seq, which nothing uses, while its default draws on sent_notifications_id_seq. The column was written bigserial, so the copy's default drew on the owned sequence instead.

The fix

  • OwnedSequences::serialShaped now requires a serial's sequence to feed exactly one default. One that feeds none is standalone: it is created with its options, and its OWNED BY is set once the table exists.
  • This changes how a serial whose default was dropped is classified: it is standalone on one side and a serial on the other. The corpus case serial_default_dropped caught that, so two follow-ups keep it working:
    • The sequence kind compares a standalone sequence against the other side's sequence of the same name, even when that one is a serial's. It no longer creates a sequence that already exists, or drops one still in use.
    • A column's OWNED BY change only counts a sequence the other side doesn't own at all, so a serial isn't disowned.

Tests

RealWorldShapesPostgresTest gains both shapes, using GitLab's DDL verbatim. Each runs with the pg_dump renderer and with the built-in one. All 4 runs fail on master.

Locally:

  • Postgres suite: 357 tests, OK on PostgreSQL 17 and 18.
  • Corpus: 169 tests, OK on both, including serial_default_dropped in both directions.

PostgreSQL only. MySQL and SQLite have no sequence objects of this kind, and their code paths are untouched.

🤖 Generated with Claude Code

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@jasdeepkhalsa @claude
fix(postgres): a sequence a column owns but no default uses is created
934c421
A sequence counted as a serial column's own if it fed at most one
default, so one feeding none was neither created by its table (no
default to write bigserial for) nor by the sequence kind. GitLab's
zoekt_tasks fills its id from a trigger and lost its sequence; its
p_sent_notifications owns one nothing uses while its default draws on
another, and was written bigserial with the wrong sequence.

A serial's sequence now feeds exactly one default. A serial whose
default was dropped is then standalone on one side and a serial on the
other: the sequence kind compares it against the other side's sequence
of the same name rather than creating or dropping it, and an OWNED BY
change only counts a sequence the other side does not own at all.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@github-actions github-actions Bot added bug mysql Related to Mysql php Pull requests that update php code postgres Related to Postgres sqlite Related to Sqlite labels Nov 9, 2026
@sonarqubecloud

sonarqubecloud Bot commented Nov 9, 2026

Copy link
Copy Markdown

Quality Gate Passed Quality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
0.0% Coverage on New Code
0.0% Duplication on New Code

See analysis details on SonarQube Cloud

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jasdeepkhalsa
jasdeepkhalsa merged commit 9782486 into master Nov 9, 2026
84 of 85 checks passed

Uh oh!

There was an error while loading. Please reload this page.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

No reviews

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

bug mysql Related to Mysql php Pull requests that update php code postgres Related to Postgres sqlite Related to Sqlite

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

1 participant

@jasdeepkhalsa
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.