Skip to content

PostgreSQL 18 generated virtual columns require STORED #2407

Description

@calebdw

Summary

PostgreSqlDialect rejects PostgreSQL 18 generated columns when the generated-column mode is omitted.

PostgreSQL 18 supports both stored and virtual generated columns. Per the PostgreSQL 18 docs, generated columns are virtual by default and VIRTUAL / STORED are optional explicit mode keywords:

https://www.postgresql.org/docs/current/ddl-generated-columns.html

Reproduction

Using sqlparser 0.62.0 with PostgreSqlDialect, parse:

CREATE TABLE users (
    first_name text NOT NULL,
    last_name text NOT NULL,
    name character varying(255)
        GENERATED ALWAYS AS (((first_name || ' '::text) || last_name))
        NOT NULL
);

Expected behavior

The statement parses successfully, with name represented as a generated virtual column. Since PostgreSQL 18 defaults generated columns to virtual, omitted mode should be accepted as virtual or at least accepted with no explicit mode.

Actual behavior

Parsing fails with:

sql parser error: Expected: STORED, found: NOT

This also affects PostgreSQL 18 pg_dump output, which emits generated virtual columns without an explicit VIRTUAL keyword, for example:

name character varying(255) GENERATED ALWAYS AS (((first_name || ' '::text) || last_name)) NOT NULL

Notes

GenericDialect can parse a variant when VIRTUAL is made explicit, but PostgreSqlDialect currently appears to require STORED after GENERATED ALWAYS AS (...).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions