Skip to content

Commit af92724

Browse files
committed
add materialized view support
1 parent 0897308 commit af92724

File tree

12 files changed

+185
-1
lines changed

12 files changed

+185
-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/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

+16-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 {
@@ -2842,6 +2843,20 @@ func convertViewStmt(n *pg.ViewStmt) *ast.ViewStmt {
28422843
}
28432844
}
28442845

2846+
// func convertMatViewStmt(n *pg.ViewStmt) *ast.MatViewStmt {
2847+
// if n == nil {
2848+
// return nil
2849+
// }
2850+
// return &ast.MatViewStmt{
2851+
// MatView: convertRangeVar(n.View),
2852+
// Aliases: convertSlice(n.Aliases),
2853+
// Query: convertNode(n.Query),
2854+
// Replace: n.Replace,
2855+
// Options: convertSlice(n.Options),
2856+
// WithCheckOption: ast.ViewCheckOption(n.WithCheckOption),
2857+
// }
2858+
// }
2859+
28452860
func convertWindowClause(n *pg.WindowClause) *ast.WindowClause {
28462861
if n == nil {
28472862
return nil

internal/sql/ast/matview_stmt.go

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package ast
2+
3+
type MatViewStmt struct {
4+
MatView *RangeVar
5+
Aliases *List
6+
Query Node
7+
Replace bool
8+
Options *List
9+
WithCheckOption ViewCheckOption
10+
}
11+
12+
func (n *MatViewStmt) Pos() int {
13+
return 0
14+
}

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+
return c.createTableAs(n, colGen)
336+
333337
case *ast.ViewStmt:
334338
err = c.createView(n, colGen)
335339

internal/sql/catalog/table.go

+48
Original file line numberDiff line numberDiff line change
@@ -247,3 +247,51 @@ 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+
// if stmt.Replace && err == nil {
291+
// schema.Tables[existingIdx] = &tbl
292+
// } else {
293+
// schema.Tables = append(schema.Tables, &tbl)
294+
// }
295+
296+
return nil
297+
}

0 commit comments

Comments
 (0)