Version
1.30.0
What happened?
When sqlc generate replays a PostgreSQL schema containing DROP TABLE ... CASCADE, it appears to leave dependent views in its internal schema catalog.
In real Postgres, dropping a table with CASCADE drops views that depend on that table. In sqlc, the dependent view still appears to exist, so a later CREATE VIEW with the same name fails.
Minimal example (Example on play.sqlc.dev):
CREATE TABLE reference_rates (
id BIGSERIAL PRIMARY KEY,
data_ts TIMESTAMPTZ NOT NULL
);
CREATE VIEW vw_reference_rates AS
SELECT *
FROM reference_rates;
CREATE TABLE reference_rates_new (
id BIGSERIAL PRIMARY KEY,
data_ts TIMESTAMPTZ NOT NULL
);
DROP TABLE reference_rates CASCADE;
ALTER TABLE reference_rates_new RENAME TO reference_rates;
CREATE VIEW vw_reference_rates AS
SELECT *
FROM reference_rates;
I expected sqlc generate to succeed because this SQL is valid in Postgres. The DROP TABLE reference_rates CASCADE statement should remove vw_reference_rates, allowing the later CREATE VIEW vw_reference_rates to succeed.
Instead, sqlc fails with relation "vw_reference_rates" already exists.
This reproduces on v1.31.1. I also reproduced it on v1.30.0, and on v1.31.1 with SQLCEXPERIMENT=analyzerv2.
Relevant log output
# package db
schema.sql:1:1: relation "vw_reference_rates" already exists
Database schema
CREATE TABLE reference_rates (
id BIGSERIAL PRIMARY KEY,
data_ts TIMESTAMPTZ NOT NULL
);
CREATE VIEW vw_reference_rates AS
SELECT *
FROM reference_rates;
CREATE TABLE reference_rates_new (
id BIGSERIAL PRIMARY KEY,
data_ts TIMESTAMPTZ NOT NULL
);
DROP TABLE reference_rates CASCADE;
ALTER TABLE reference_rates_new RENAME TO reference_rates;
CREATE VIEW vw_reference_rates AS
SELECT *
FROM reference_rates;
SQL queries
-- name: ListReferenceRates :many
SELECT id, data_ts
FROM vw_reference_rates
ORDER BY id;
Configuration
{
"version": "2",
"sql": [
{
"engine": "postgresql",
"schema": "schema.sql",
"queries": "query.sql",
"gen": {
"go": {
"package": "db",
"out": "db"
}
}
}
]
}
Playground URL
https://play.sqlc.dev/p/77fea362bc83d66c4b8439685849e22d2a7e472774e3a6a386074477ecbf080e
What operating system are you using?
macOS
What database engines are you using?
PostgreSQL
What type of code are you generating?
Go
Version
1.30.0
What happened?
When
sqlc generatereplays a PostgreSQL schema containingDROP TABLE ... CASCADE, it appears to leave dependent views in its internal schema catalog.In real Postgres, dropping a table with
CASCADEdrops views that depend on that table. In sqlc, the dependent view still appears to exist, so a laterCREATE VIEWwith the same name fails.Minimal example (Example on play.sqlc.dev):
I expected
sqlc generateto succeed because this SQL is valid in Postgres. TheDROP TABLE reference_rates CASCADEstatement should removevw_reference_rates, allowing the laterCREATE VIEW vw_reference_ratesto succeed.Instead, sqlc fails with relation "vw_reference_rates" already exists.
This reproduces on
v1.31.1. I also reproduced it onv1.30.0, and onv1.31.1withSQLCEXPERIMENT=analyzerv2.Relevant log output
Database schema
SQL queries
Configuration
Playground URL
https://play.sqlc.dev/p/77fea362bc83d66c4b8439685849e22d2a7e472774e3a6a386074477ecbf080e
What operating system are you using?
macOS
What database engines are you using?
PostgreSQL
What type of code are you generating?
Go