-
Notifications
You must be signed in to change notification settings - Fork 29
Open
Description
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.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels