Skip to content

fix: reuse table constraints for MySQL ALTER TABLE - #2654

Merged
manticore-projects merged 1 commit into
JSQLParser:masterfrom
minleejae:fix/mysql-alter-constraint-reuse
Sep 21, 2026
Merged

manticore-projects merged 1 commit into
JSQLParser:masterfrom
minleejae:fix/mysql-alter-constraint-reuse

Conversation

@minleejae

Copy link
Copy Markdown
Contributor

MySQL ALTER TABLE ADD rejects constraint definitions that already work in CREATE TABLE, including CONSTRAINT uq UNIQUE KEY idx (id) and unnamed CHECK constraints. With Dialect.MYSQL, both paths now use the existing table-constraint parser and preserve the constraint symbol and index name separately.

Reuse NamedConstraint/CheckConstraint instead of extending the legacy ALTER branches. Keep named-index options on their AST, preserve legacy key accessors, and require one CHECK expression. Tests cover quoted and omitted names, KEY/INDEX variants, enforcement, multiple ALTER actions, AST edits, and custom expression deparsing; the existing PostgreSQL, Informix, and SQL Server tests also pass.

Syntax reference: MySQL 8.4 ALTER TABLE.

Validation:

  • Java 17 Gradle check: 7,826 XML-reported tests, 0 failures/errors, 25 skipped; formatting, grammar ambiguity, Checkstyle, PMD, and JMH compilation passed. Formatting was checked against upstream/master using a local Spotless ratchet override.
  • Actual MySQL 8.4.11 server: 12 accepted and 4 rejected SQL cases matched the expected behavior.
  • Executed both AST and StatementDeParser output for the accepted cases on the same server: 24 successful executions.

Signed-off-by: minleejae <mmj9808@gmail.com>
@manticore-projects
manticore-projects merged commit 4d6bbf3 into JSQLParser:master Sep 21, 2026
10 checks passed
@manticore-projects

Copy link
Copy Markdown
Contributor

I am really grateful for this consolidation and cleanup, thank you!

manticore-projects pushed a commit that referenced this pull request Oct 24, 2026
)

* fix: reuse table constraints for ALTER TABLE ADD in every dialect

ALTER TABLE ADD parsed table constraints with the shared CREATE TABLE
production only for the MySQL and PostgreSQL dialects (#2612, #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 <mmj9808@gmail.com>

* fix: parse VALIDATE CONSTRAINT as a structured action in every dialect

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 <mmj9808@gmail.com>

* refactor: keep the ALTER constraint lookahead in the grammar

Move AlterConstraintLookahead from its own file into the grammar as a
private nested class, as done for TokenNesting in #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 <mmj9808@gmail.com>

---------

Signed-off-by: minleejae <mmj9808@gmail.com>
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.

2 participants