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: reuse table constraints for ALTER TABLE ADD in every dialect by minleejae · Pull Request #2847 · JSQLParser/JSqlParser

Conversation

@minleejae

@minleejae minleejae commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

ALTER TABLE ADD parses table constraints with the CREATE TABLE production only for Dialect.MYSQL and Dialect.POSTGRESQL (#2612, #2654). Without either dialect, the generic ALTER branches reject forms that CREATE TABLE accepts in every dialect:

  • ALTER TABLE t ADD CHECK (c > 0)
  • ALTER TABLE t ADD CONSTRAINT ck CHECK (c > 0) NOT VALID
  • ALTER TABLE t ADD FOREIGN KEY (id) REFERENCES parent (id) DEFERRABLE INITIALLY DEFERRED
  • ALTER TABLE t ADD CONSTRAINT pk PRIMARY KEY (id) DEFERRABLE INITIALLY DEFERRED
  • ALTER TABLE t ADD CONSTRAINT ex EXCLUDE USING gist (r WITH &&)

An ADD now uses the shared production in every dialect when it contains a form that only that production accepts: an unnamed CHECK, FOREIGN KEY, EXCLUDE, or INITIALLY IMMEDIATE|DEFERRED, NOT VALID or ENFORCED outside a CHECK. Statements that already parsed keep their generic representation, accessors and output. The PostgreSQL-only UNIQUE USING INDEX and NOT NULL constraints still require Dialect.POSTGRESQL. The scan lives in the package-private AlterConstraintLookahead, like RoutineBodyBoundary, so that it adds little to CCJSqlParser.

The second commit makes VALIDATE CONSTRAINT a structured RelationAlterAction in every dialect. Outside PostgreSQL it was an UNSPECIFIC expression, so its constraint name was not accessible. Its output is unchanged.

Existing parser result classes and public method signatures are retained.

Syntax reference: PostgreSQL 18 ALTER TABLE.

Validation:

  • AlterAddTableConstraintTest compares CREATE TABLE and ALTER ADD for eight definitions without a dialect and with ANSI_SQL, ORACLE, SQLSERVER and H2, and pins the representation of forms that already parsed. 10 of its 13 cases fail on master. PostgreSqlRelationAlterTest covers VALIDATE CONSTRAINT without the PostgreSQL dialect.
  • Removing the dialect test from the gate instead failed 24 existing tests (Oracle constraint states, USING INDEX, legacy key accessors), so only forms that do not parse today are rerouted.
  • Java 17 Gradle check: 12,091 tests, 0 failures, 25 skipped; grammar ambiguity, formatting (Spotless ratchet against upstream/master), Checkstyle, PMD, SpotBugs and JaCoCo pass.
  • PostgreSQL 18.3: the statements above, VALIDATE CONSTRAINT and the PR's other cases (17 statements) give the same results for the original SQL and for the SQL rendered without a dialect and with Dialect.POSTGRESQL.

Sorry, something went wrong.

Uh oh!

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

All reactions
minleejae added 3 commits October 23, 2026 13:45
@minleejae
fix: reuse table constraints for ALTER TABLE ADD in every dialect
f257070
ALTER TABLE ADD parsed table constraints with the shared CREATE TABLE
production only for the MySQL and PostgreSQL dialects (JSQLParser#2612, JSQLParser#2654).
Without one of them, the generic ALTER branches rejected forms that
CREATE TABLE accepts in every dialect: an unnamed CHECK (c > 0),
NOT VALID, DEFERRABLE INITIALLY DEFERRED, an unnamed FOREIGN KEY with
attributes and EXCLUDE.

Route an ADD to the shared production in every dialect when it uses a
form that only that production accepts: an unnamed CHECK, FOREIGN KEY,
EXCLUDE, or INITIALLY IMMEDIATE|DEFERRED, NOT VALID or ENFORCED outside
a CHECK before the end of the action. Forms that already parsed keep
their generic representation, accessors and output; the PostgreSQL-only
UNIQUE USING INDEX and NOT NULL constraints still need that dialect.

The scan lives in the package-private AlterConstraintLookahead, like
RoutineBodyBoundary, because the generated CCJSqlParser class is close
to the size JaCoCo can still instrument.

Signed-off-by: minleejae <[email protected]>
@minleejae
fix: parse VALIDATE CONSTRAINT as a structured action in every dialect
95dc95b
ALTER TABLE t VALIDATE CONSTRAINT ck was a structured RelationAlterAction
only with the PostgreSQL dialect. Elsewhere the remaining text became
an UNSPECIFIC expression, so the constraint name could not be read and
the action could not follow an ADD that now parses in every dialect.

VALIDATE CONSTRAINT starts no other ALTER TABLE action, so recognise it
in every dialect. Its output is unchanged.

Signed-off-by: minleejae <[email protected]>
@minleejae
refactor: keep the ALTER constraint lookahead in the grammar
0d91757
Move AlterConstraintLookahead from its own file into the grammar as a
private nested class, as done for TokenNesting in JSQLParser#2849. Split
needsSharedTableConstraint into a check for the forms only the shared
production accepts and a scan for constraint attributes. Codacy's PMD
reported an NPath complexity of 440 for the combined method; the
largest part is now 14. The nested class keeps its branches out of
CCJSqlParser.class. Behaviour does not change.

Signed-off-by: minleejae <[email protected]>
@manticore-projects
manticore-projects merged commit cec9fb8 into JSQLParser:master Oct 24, 2026
10 checks passed

Uh oh!

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

@manticore-projects

manticore-projects commented Oct 24, 2026

Copy link
Copy Markdown
Contributor

Thank you!

All reactions

Sorry, something went wrong.

Uh oh!

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

@minleejae minleejae mentioned this pull request Oct 28, 2026
JaCoCo instrumentation of CCJSqlParser is approaching the constant-pool limit #2866
Open
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

None yet

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.

2 participants

@minleejae @manticore-projects
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.