diff --git a/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/go/models.go b/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/go/models.go index 13bb73ee38..5d1cea7bf6 100644 --- a/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/go/models.go +++ b/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/go/models.go @@ -58,3 +58,8 @@ type FooBar struct { // this is the baz column Baz string } + +// this is the bat view +type FooBat struct { + Baz string +} diff --git a/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/go/query.sql.go b/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/go/query.sql.go index 4a3c99c44e..94331604cc 100644 --- a/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/go/query.sql.go +++ b/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/go/query.sql.go @@ -32,3 +32,27 @@ func (q *Queries) ListBar(ctx context.Context) ([]string, error) { } return items, nil } + +const listBat = `-- name: ListBat :many +SELECT baz FROM foo.bat +` + +func (q *Queries) ListBat(ctx context.Context) ([]string, error) { + rows, err := q.db.Query(ctx, listBat) + if err != nil { + return nil, err + } + defer rows.Close() + var items []string + for rows.Next() { + var baz string + if err := rows.Scan(&baz); err != nil { + return nil, err + } + items = append(items, baz) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/query.sql b/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/query.sql index d2f15b3726..d3d24a1ea5 100644 --- a/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/query.sql +++ b/internal/endtoend/testdata/comment_on/postgresql/pgx/v4/query.sql @@ -4,12 +4,18 @@ CREATE TABLE foo.bar ( baz text NOT NULL ); +CREATE VIEW foo.bat AS SELECT * FROM foo.bar; + CREATE TYPE foo.mood AS ENUM ('sad', 'ok', 'happy'); COMMENT ON SCHEMA foo IS 'this is the foo schema'; COMMENT ON TYPE foo.mood IS 'this is the mood type'; COMMENT ON TABLE foo.bar IS 'this is the bar table'; COMMENT ON COLUMN foo.bar.baz IS 'this is the baz column'; +COMMENT ON VIEW foo.bat IS 'this is the bat view '; -- name: ListBar :many SELECT * FROM foo.bar; + +-- name: ListBat :many +SELECT * FROM foo.bat; diff --git a/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/go/models.go b/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/go/models.go index 13bb73ee38..5d1cea7bf6 100644 --- a/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/go/models.go +++ b/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/go/models.go @@ -58,3 +58,8 @@ type FooBar struct { // this is the baz column Baz string } + +// this is the bat view +type FooBat struct { + Baz string +} diff --git a/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/go/query.sql.go b/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/go/query.sql.go index 4a3c99c44e..94331604cc 100644 --- a/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/go/query.sql.go +++ b/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/go/query.sql.go @@ -32,3 +32,27 @@ func (q *Queries) ListBar(ctx context.Context) ([]string, error) { } return items, nil } + +const listBat = `-- name: ListBat :many +SELECT baz FROM foo.bat +` + +func (q *Queries) ListBat(ctx context.Context) ([]string, error) { + rows, err := q.db.Query(ctx, listBat) + if err != nil { + return nil, err + } + defer rows.Close() + var items []string + for rows.Next() { + var baz string + if err := rows.Scan(&baz); err != nil { + return nil, err + } + items = append(items, baz) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/query.sql b/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/query.sql index d2f15b3726..d3d24a1ea5 100644 --- a/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/query.sql +++ b/internal/endtoend/testdata/comment_on/postgresql/pgx/v5/query.sql @@ -4,12 +4,18 @@ CREATE TABLE foo.bar ( baz text NOT NULL ); +CREATE VIEW foo.bat AS SELECT * FROM foo.bar; + CREATE TYPE foo.mood AS ENUM ('sad', 'ok', 'happy'); COMMENT ON SCHEMA foo IS 'this is the foo schema'; COMMENT ON TYPE foo.mood IS 'this is the mood type'; COMMENT ON TABLE foo.bar IS 'this is the bar table'; COMMENT ON COLUMN foo.bar.baz IS 'this is the baz column'; +COMMENT ON VIEW foo.bat IS 'this is the bat view '; -- name: ListBar :many SELECT * FROM foo.bar; + +-- name: ListBat :many +SELECT * FROM foo.bat; diff --git a/internal/endtoend/testdata/comment_on/postgresql/stdlib/go/models.go b/internal/endtoend/testdata/comment_on/postgresql/stdlib/go/models.go index 13bb73ee38..5d1cea7bf6 100644 --- a/internal/endtoend/testdata/comment_on/postgresql/stdlib/go/models.go +++ b/internal/endtoend/testdata/comment_on/postgresql/stdlib/go/models.go @@ -58,3 +58,8 @@ type FooBar struct { // this is the baz column Baz string } + +// this is the bat view +type FooBat struct { + Baz string +} diff --git a/internal/endtoend/testdata/comment_on/postgresql/stdlib/go/query.sql.go b/internal/endtoend/testdata/comment_on/postgresql/stdlib/go/query.sql.go index 67dc8ed663..9c94402a1d 100644 --- a/internal/endtoend/testdata/comment_on/postgresql/stdlib/go/query.sql.go +++ b/internal/endtoend/testdata/comment_on/postgresql/stdlib/go/query.sql.go @@ -35,3 +35,30 @@ func (q *Queries) ListBar(ctx context.Context) ([]string, error) { } return items, nil } + +const listBat = `-- name: ListBat :many +SELECT baz FROM foo.bat +` + +func (q *Queries) ListBat(ctx context.Context) ([]string, error) { + rows, err := q.db.QueryContext(ctx, listBat) + if err != nil { + return nil, err + } + defer rows.Close() + var items []string + for rows.Next() { + var baz string + if err := rows.Scan(&baz); err != nil { + return nil, err + } + items = append(items, baz) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/comment_on/postgresql/stdlib/query.sql b/internal/endtoend/testdata/comment_on/postgresql/stdlib/query.sql index d2f15b3726..d3d24a1ea5 100644 --- a/internal/endtoend/testdata/comment_on/postgresql/stdlib/query.sql +++ b/internal/endtoend/testdata/comment_on/postgresql/stdlib/query.sql @@ -4,12 +4,18 @@ CREATE TABLE foo.bar ( baz text NOT NULL ); +CREATE VIEW foo.bat AS SELECT * FROM foo.bar; + CREATE TYPE foo.mood AS ENUM ('sad', 'ok', 'happy'); COMMENT ON SCHEMA foo IS 'this is the foo schema'; COMMENT ON TYPE foo.mood IS 'this is the mood type'; COMMENT ON TABLE foo.bar IS 'this is the bar table'; COMMENT ON COLUMN foo.bar.baz IS 'this is the baz column'; +COMMENT ON VIEW foo.bat IS 'this is the bat view '; -- name: ListBar :many SELECT * FROM foo.bar; + +-- name: ListBat :many +SELECT * FROM foo.bat; diff --git a/internal/engine/postgresql/parse.go b/internal/engine/postgresql/parse.go index 7ee35cb589..9aab5708bd 100644 --- a/internal/engine/postgresql/parse.go +++ b/internal/engine/postgresql/parse.go @@ -361,6 +361,16 @@ func translate(node *nodes.Node) (ast.Node, error) { Comment: makeString(n.Comment), }, nil + case nodes.ObjectType_OBJECT_VIEW: + rel, err := parseRelation(n.Object) + if err != nil { + return nil, fmt.Errorf("COMMENT ON VIEW: %w", err) + } + return &ast.CommentOnViewStmt{ + View: rel.TableName(), + Comment: makeString(n.Comment), + }, nil + } return nil, errSkip diff --git a/internal/sql/ast/comment_on_view_stmt.go b/internal/sql/ast/comment_on_view_stmt.go new file mode 100644 index 0000000000..2648d87918 --- /dev/null +++ b/internal/sql/ast/comment_on_view_stmt.go @@ -0,0 +1,10 @@ +package ast + +type CommentOnViewStmt struct { + View *TableName + Comment *string +} + +func (n *CommentOnViewStmt) Pos() int { + return 0 +} diff --git a/internal/sql/astutils/rewrite.go b/internal/sql/astutils/rewrite.go index 9a70eb46db..221e62a804 100644 --- a/internal/sql/astutils/rewrite.go +++ b/internal/sql/astutils/rewrite.go @@ -164,6 +164,9 @@ func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast. case *ast.CommentOnTypeStmt: a.apply(n, "Type", nil, n.Type) + case *ast.CommentOnViewStmt: + a.apply(n, "View", nil, n.View) + case *ast.CreateTableStmt: a.apply(n, "Name", nil, n.Name) diff --git a/internal/sql/astutils/walk.go b/internal/sql/astutils/walk.go index 8628b776fc..60110c46c3 100644 --- a/internal/sql/astutils/walk.go +++ b/internal/sql/astutils/walk.go @@ -77,6 +77,11 @@ func Walk(f Visitor, node ast.Node) { Walk(f, n.Type) } + case *ast.CommentOnViewStmt: + if n.View != nil { + Walk(f, n.View) + } + case *ast.CompositeTypeStmt: if n.TypeName != nil { Walk(f, n.TypeName) diff --git a/internal/sql/catalog/catalog.go b/internal/sql/catalog/catalog.go index 5b2b6b8a8d..7417f60a8b 100644 --- a/internal/sql/catalog/catalog.go +++ b/internal/sql/catalog/catalog.go @@ -76,6 +76,9 @@ func (c *Catalog) Update(stmt ast.Statement, colGen columnGenerator) error { case *ast.CommentOnTypeStmt: err = c.commentOnType(n) + case *ast.CommentOnViewStmt: + err = c.commentOnView(n) + case *ast.CompositeTypeStmt: err = c.createCompositeType(n) diff --git a/internal/sql/catalog/comment_on.go b/internal/sql/catalog/comment_on.go index 21bc91bb7c..7251398f81 100644 --- a/internal/sql/catalog/comment_on.go +++ b/internal/sql/catalog/comment_on.go @@ -61,3 +61,16 @@ func (c *Catalog) commentOnType(stmt *ast.CommentOnTypeStmt) error { } return nil } + +func (c *Catalog) commentOnView(stmt *ast.CommentOnViewStmt) error { + _, t, err := c.getTable(stmt.View) + if err != nil { + return err + } + if stmt.Comment != nil { + t.Comment = *stmt.Comment + } else { + t.Comment = "" + } + return nil +}