Skip to content

::schema.type cast syntax produces invalid SQL interpreted as CAST(... AS SCHEMA).type #17

@d-tietjen

Description

@d-tietjen

When parsing PostgreSQL's schema-qualified cast syntax 'value'::schema.type, polyglot-sql misinterprets the expression. Instead of treating schema.type as a single qualified type name, it parses ::schema as a cast to the type SCHEMA and .type as a field/member access on the result.

Input:

CREATE TABLE "app"."users" (
    "id" bigint NOT NULL,
    "status" app.status_enum NOT NULL DEFAULT 'active'::app.status_enum,
    PRIMARY KEY ("id")
)

Expected output (PostgreSQL dialect):

CREATE TABLE "app"."users" (
    "id" BIGINT NOT NULL,
    "status" app.status_enum NOT NULL DEFAULT 'active'::app.status_enum,
    PRIMARY KEY ("id")
)

Actual output:

CREATE TABLE "app"."users" (
    "id" BIGINT NOT NULL,
    "status" app.status_enum NOT NULL DEFAULT CAST('active' AS APP).status_enum,
    PRIMARY KEY ("id")
)

The generated CAST('active' AS APP).status_enum is invalid PostgreSQL. CAST returns a scalar value, and .status_enum is not a valid field access on it. This causes the DDL to fail when executed.

Reproduction:

use polyglot_sql::{parse_one, DialectType};

let sql = r#"CREATE TABLE "app"."users" ("status" app.status_enum NOT NULL DEFAULT 'active'::app.status_enum, PRIMARY KEY ("id"))"#;
let expr = parse_one(sql, DialectType::PostgreSQL).unwrap();
let output = expr.sql_for(DialectType::PostgreSQL);
// output contains: CAST('active' AS APP).status_enum

Impact: Any column default referencing a type in a non-public schema (enums, domains, composite types) produces invalid DDL after roundtripping through polyglot-sql.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions