Skip to content

Commit 07a8e96

Browse files
committed
add materialized view support
1 parent 0897308 commit 07a8e96

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
@@ -1237,13 +1237,14 @@ func convertCreateTableAsStmt(n *pg.CreateTableAsStmt) *ast.CreateTableAsStmt {
12371237
if n == nil {
12381238
return nil
12391239
}
1240-
return &ast.CreateTableAsStmt{
1240+
res := &ast.CreateTableAsStmt{
12411241
Query: convertNode(n.Query),
12421242
Into: convertIntoClause(n.Into),
12431243
Relkind: ast.ObjectType(n.Relkind),
12441244
IsSelectInto: n.IsSelectInto,
12451245
IfNotExists: n.IfNotExists,
12461246
}
1247+
return res
12471248
}
12481249

12491250
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)