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 — Parse PostgreSQL ALTER DATABASE and share typed database options by minleejae · Pull Request #2811 · JSQLParser/JSqlParser

Conversation

@minleejae

@minleejae minleejae commented Oct 14, 2026 •
edited
Loading

Uh oh!

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

Copy link
Copy Markdown
Contributor

Purpose

Fix a regression from #2700: every PostgreSQL ALTER DATABASE now throws a ParseException, for example ALTER DATABASE mydb OWNER TO app or ALTER DATABASE mydb SET search_path TO app, public. JSqlParser 5.4 returned an UnsupportedStatement for them. Without a dialect, MySQL's ALTER SCHEMA db DEFAULT ENCRYPTION = 'Y' regressed the same way.

While here, give the database options the same typed treatment as the MySQL ones:

  • PostgreSQL CREATE DATABASE options are one opaque OTHER option.
  • The MySQL CHARSET spelling is not recognized, and CREATE SCHEMA db DEFAULT CHARSET = utf8mb4 fails.
  • Every parsed CREATE DATABASE ends with an empty raw option, which adds a trailing space to toString().

Current design (As-is)

  • Alter() sends every ALTER DATABASE to AlterDatabase(), which accepts only MySQL options. Without the MySQL dialect, ALTER SCHEMA goes to the PostgreSQL AlterSchema(), which accepts only RENAME and OWNER.
  • AlterRole stores PostgreSQL's SET/RESET of a configuration parameter in six fields: action, parameter, values, useEquals, fromCurrent and useDefault. FROM CURRENT and DEFAULT can both be set; rendering picks the first.
  • CreateDatabase keeps two representations: the option nodes, and a flat token list computed when the options are set. captureRest() always appends a raw option, even an empty one.

Target design (To-be)

  • Add ConfigurationParameterChange in net.sf.jsqlparser.statement for SET p {TO|=} values|DEFAULT, SET p FROM CURRENT and RESET p|ALL:
    • Action (SET, RESET), the parameter name, ValueKind (VALUES, DEFAULT, FROM_CURRENT), useEquals and a mutable ExpressionList of values;
    • one grammar production, used by ALTER ROLE and ALTER DATABASE; ALTER FUNCTION/PROCEDURE can reuse both.
  • AlterRole stores a ConfigurationParameterChange. Its existing parameter getters and setters remain and read or edit that change.
  • AlterDatabase gains an Action: OPTIONS (the default), RENAME, OWNER, SET_TABLESPACE, REFRESH_COLLATION_VERSION and CONFIGURATION_PARAMETER, each with its own payload. OPTIONS takes PostgreSQL's [WITH] ALLOW_CONNECTIONS | CONNECTION LIMIT | IS_TEMPLATE ... as well as the MySQL options. PostgreSQL forms require a database name; MySQL options may still omit it.
  • DatabaseOption gets one kind per PostgreSQL option: OWNER, TEMPLATE, ENCODING, STRATEGY, LOCALE, LC_COLLATE, LC_CTYPE, BUILTIN_LOCALE, ICU_LOCALE, ICU_RULES, LOCALE_PROVIDER, COLLATION_VERSION, TABLESPACE, ALLOW_CONNECTIONS, CONNECTION_LIMIT, IS_TEMPLATE and OID. Values keep their SQL text. CREATE DATABASE and ALTER DATABASE share the production for these options.
  • MySQL CHARACTER SET, CHAR SET and CHARSET are all CHARACTER_SET; getName() keeps the spelling. This also fixes CREATE SCHEMA ... DEFAULT CHARSET.
  • CreateDatabase keeps one live option list and an isUseWith() flag. Other option text remains one raw option, appended only if present. getDatabaseOptions() is derived from the options.
  • Dispatch:
    • With Dialect.MYSQL, ALTER DATABASE/SCHEMA always parses as AlterDatabase, as before.
    • Otherwise, a syntactic lookahead selects AlterDatabase only for forms it models. Other ALTER DATABASE forms, such as SQL Server's SET RECOVERY SIMPLE, return to UnsupportedStatement as in 5.4.
    • ALTER SCHEMA followed by MySQL options parses as AlterDatabase in every dialect. PostgreSQL's ALTER SCHEMA ... RENAME/OWNER remains an AlterSchema.
  • No new reserved words; option words are matched as identifiers.
  • Wire the changes into StatementDeParser (SET values go through the expression deparser) and into validation: StatementValidator checks the new Feature.alterDatabase. The MySQL, MariaDB and PostgreSQL capabilities now enable createDatabase and alterDatabase; no capability enabled createDatabase before. Document the API in the usage guide.

Compatibility

  • AlterRole keeps all public accessors, and its SQL output is unchanged. FROM CURRENT and DEFAULT are now mutually exclusive: setFromCurrent(false) and setUseDefault(false) return to the explicit values.
  • CreateDatabase.getOptions() is never null and returns the live list; setOptions copies its argument.
  • getDatabaseOptions() is now an unmodifiable snapshot that includes WITH, and still null without options. Previously, edits to it were silently ignored for parsed statements. addDatabaseOptions now appends a raw option instead of turning every option into raw tokens.
  • The empty raw option and the trailing space are gone.

Validation

  • New and extended tests (65 cases) cover:
    • parse, toString, deparse and reparse with Dialect.POSTGRESQL, with Dialect.MYSQL and without a dialect, plus statement boundaries in scripts;
    • the AST of every action and option kind, including signed, boolean, string and DEFAULT values;
    • CHARSET as an option keyword and as a database name;
    • unmodelled forms: UnsupportedStatement without a dialect and with PostgreSQL, an error with MySQL; PostgreSQL ALTER SCHEMA unchanged;
    • AlterRole and AlterDatabase sharing one ConfigurationParameterChange, and the legacy AlterRole accessors and setters;
    • CreateDatabase list ownership and the legacy token methods;
    • validation features and statement feature analysis.
  • Java 17 offline Gradle spotlessApply check: 10,425 tests, 10,400 passed, 25 skipped, zero failures/errors. The grammar choice conflict check passes.
  • Compared with master (bdf8ac31) on a corpus of 635 MySQL 8.4 and PostgreSQL 18 DDL/DCL statements, each accepted by the server, plus variants:
    • Fixed with Dialect.POSTGRESQL and without a dialect: ALTER DATABASE ... SET/RENAME TO/OWNER TO/RESET ALL/WITH ALLOW_CONNECTIONS, SET work_mem = '64MB' and OWNER TO CURRENT_USER.
    • FIXED: MySQL CREATE SCHEMA ... DEFAULT CHARSET and, without a dialect, ALTER SCHEMA ... DEFAULT ENCRYPTION.
    • No regressions; no other parse results change.
    • In the AST, PostgreSQL CREATE DATABASE options and DEFAULT CHARSET are typed, the empty raw option is gone, and ALTER ROLE SET/RESET moves into parameterChange. Rendered SQL is unchanged except for the removed trailing space.
  • MySQL 8.4 and PostgreSQL 18.3: every corpus statement this branch parses ran as written on one server and as rendered by toString() on a second, identical server, in the same order. All 206 MySQL and 332 PostgreSQL statements give the same result (success, or the same error).

Integration validation

Applied #2806–#2819 together on master (bdf8ac31), with the stacked PRs on top of their bases (#2806 → #2807 → #2808, #2806 → #2809 → #2810 and #2811 → #2812).

  • Each branch merges cleanly into master. Between the branches, conflicts are limited to adjacent additions (README/index rows, usage sections, imports, visitor and feature lists, one enum line and one alias guard).
  • The integrated build passes Java 17 offline Gradle spotlessApply check: 11,494 tests, 11,469 passed, 25 skipped, zero failures/errors. The grammar choice conflict check passes.
  • On a corpus of 635 MySQL 8.4 and PostgreSQL 18 DDL/DCL statements, each accepted by the server, the integrated build parses 265 of 271 MySQL statements (master: 206) and 363 of 364 PostgreSQL statements (master: 328). Every MySQL 8.4 non-reserved word and PostgreSQL 18 unreserved or column-name keyword parses as a column and table name.
  • On paired MySQL 8.4 and PostgreSQL 18.3 servers, all 263 MySQL and 362 PostgreSQL statements rendered by the integrated build give the same results as the originals.

Sorry, something went wrong.

Uh oh!

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

All reactions
@minleejae
fix: parse PostgreSQL ALTER DATABASE and share typed database options
74ce2df
Since JSQLParser#2700, every PostgreSQL ALTER DATABASE fails to parse, while 5.4
returned an UnsupportedStatement. Model RENAME TO, OWNER TO, SET
TABLESPACE, REFRESH COLLATION VERSION, the [WITH] options and SET/RESET
of configuration parameters. Outside the MySQL dialect, other ALTER
DATABASE forms are unsupported statements again, and ALTER SCHEMA with
MySQL options no longer requires that dialect.

Extract the SET/RESET state of AlterRole into ConfigurationParameterChange,
which ALTER DATABASE shares; AlterRole keeps its accessors. Type each
PostgreSQL CREATE DATABASE option, accept the CHAR SET and CHARSET
spellings, keep CreateDatabase options in one list and drop the empty raw
option that added a trailing space.

Signed-off-by: minleejae <[email protected]>
This was referenced Oct 14, 2026
Parse ALTER FUNCTION, PROCEDURE and TRIGGER actions and MySQL routine definers #2812
Merged
Share MySQL account names across CREATE USER and DEFINER #2806
Merged
Parse MySQL GRANT and REVOKE privilege levels, privileges and accounts #2807
Merged
Parse MySQL ALTER USER, RENAME USER and role statements with shared user options #2808
Merged
Keep routine signatures and owning tables in DROP statements #2809
Merged
Share typed MySQL index options across CREATE INDEX and table definitions #2810
Merged
Model MySQL column positions and attributes #2813
Merged
Model PostgreSQL ON COMMIT, access method and DROP behavior #2814
Merged
Allow more MySQL and PostgreSQL keywords as unquoted identifiers #2815
Merged
Extend PostgreSQL COMMENT ON targets #2816
Merged
Parse MySQL and PostgreSQL CREATE and ALTER TABLESPACE #2817
Merged
Parse PostgreSQL event triggers, REINDEX, SECURITY LABEL and schema elements #2818
Merged
Render single spaces in ALTER visibility, FORCE and row level security actions #2819
Merged
Model MySQL CREATE FUNCTION and PROCEDURE characteristics #2823
Merged
Parse PostgreSQL Unicode escape string constants #2820
Merged
Expose MySQL table and partition comments as string values #2821
Merged
Parse COMMENT ON operators, operator classes, text search objects and large objects #2822
Merged
Parse MySQL SHOW FULL COLUMNS, SHOW TABLE STATUS and SHOW CREATE statements #2824
Merged
@manticore-projects
manticore-projects merged commit bdf705e into JSQLParser:master Oct 17, 2026
10 checks passed

Uh oh!

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

@manticore-projects

manticore-projects commented Oct 17, 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.

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.