Skip to content

Commit 367889d

Browse files
authored
feat(postgresql): Add materialized view support (#1509)
1 parent 3d20d04 commit 367889d

File tree

17 files changed

+246
-1
lines changed

17 files changed

+246
-1
lines changed

internal/endtoend/testdata/create_materialized_view/postgresql/go/db.go

+29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/create_materialized_view/postgresql/go/models.go

+13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/create_materialized_view/postgresql/go/query.sql.go

+35
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-- name: GetFirst :many
2+
SELECT * FROM mat_first_view;
3+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
CREATE TABLE foo (val text not null);
2+
3+
CREATE MATERIALIZED VIEW mat_first_view AS SELECT * FROM foo;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"engine": "postgresql",
6+
"path": "go",
7+
"name": "querytest",
8+
"schema": "schema.sql",
9+
"queries": "query.sql"
10+
}
11+
]
12+
}

internal/endtoend/testdata/create_table_as/postgresql/go/db.go

+29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/create_table_as/postgresql/go/models.go

+13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/create_table_as/postgresql/go/query.sql.go

+35
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-- name: GetFirst :many
2+
SELECT * FROM second_table;
3+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
CREATE TABLE foo (val text not null);
2+
3+
CREATE TABLE second_table AS SELECT * FROM foo;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"engine": "postgresql",
6+
"path": "go",
7+
"name": "querytest",
8+
"schema": "schema.sql",
9+
"queries": "query.sql"
10+
}
11+
]
12+
}

internal/endtoend/testdata/materialized_views/postgresql/pgx/go/models.go

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/materialized_views/postgresql/stdlib/go/models.go

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/engine/postgresql/convert.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -1264,13 +1264,14 @@ func convertCreateTableAsStmt(n *pg.CreateTableAsStmt) *ast.CreateTableAsStmt {
12641264
if n == nil {
12651265
return nil
12661266
}
1267-
return &ast.CreateTableAsStmt{
1267+
res := &ast.CreateTableAsStmt{
12681268
Query: convertNode(n.Query),
12691269
Into: convertIntoClause(n.Into),
12701270
Relkind: ast.ObjectType(n.Relkind),
12711271
IsSelectInto: n.IsSelectInto,
12721272
IfNotExists: n.IfNotExists,
12731273
}
1274+
return res
12741275
}
12751276

12761277
func convertCreateTableSpaceStmt(n *pg.CreateTableSpaceStmt) *ast.CreateTableSpaceStmt {

internal/sql/catalog/catalog.go

+4
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ func (c *Catalog) Update(stmt ast.Statement, colGen columnGenerator) error {
288288
}
289289
var err error
290290
switch n := stmt.Raw.Stmt.(type) {
291+
291292
case *ast.AlterTableStmt:
292293
err = c.alterTable(n)
293294

@@ -330,6 +331,9 @@ func (c *Catalog) Update(stmt ast.Statement, colGen columnGenerator) error {
330331
case *ast.CreateTableStmt:
331332
err = c.createTable(n)
332333

334+
case *ast.CreateTableAsStmt:
335+
err = c.createTableAs(n, colGen)
336+
333337
case *ast.ViewStmt:
334338
err = c.createView(n, colGen)
335339

internal/sql/catalog/table.go

+42
Original file line numberDiff line numberDiff line change
@@ -247,3 +247,45 @@ func (c *Catalog) renameTable(stmt *ast.RenameTableStmt) error {
247247
}
248248
return nil
249249
}
250+
251+
func (c *Catalog) createTableAs(stmt *ast.CreateTableAsStmt, colGen columnGenerator) error {
252+
cols, err := colGen.OutputColumns(stmt.Query)
253+
if err != nil {
254+
return err
255+
}
256+
257+
catName := ""
258+
if stmt.Into.Rel.Catalogname != nil {
259+
catName = *stmt.Into.Rel.Catalogname
260+
}
261+
schemaName := ""
262+
if stmt.Into.Rel.Schemaname != nil {
263+
schemaName = *stmt.Into.Rel.Schemaname
264+
}
265+
266+
tbl := Table{
267+
Rel: &ast.TableName{
268+
Catalog: catName,
269+
Schema: schemaName,
270+
Name: *stmt.Into.Rel.Relname,
271+
},
272+
Columns: cols,
273+
}
274+
275+
ns := tbl.Rel.Schema
276+
if ns == "" {
277+
ns = c.DefaultSchema
278+
}
279+
schema, err := c.getSchema(ns)
280+
if err != nil {
281+
return err
282+
}
283+
_, _, err = schema.getTable(tbl.Rel)
284+
if err == nil {
285+
return sqlerr.RelationExists(tbl.Rel.Name)
286+
}
287+
288+
schema.Tables = append(schema.Tables, &tbl)
289+
290+
return nil
291+
}

0 commit comments

Comments
 (0)