Skip to content

Commit

Permalink
Merge pull request #56 from tomrom-pomelo/master
Browse files Browse the repository at this point in the history
Basic support for views
  • Loading branch information
daichirata committed Feb 3, 2024
2 parents cd53fc6 + daaf779 commit 9de2d7a
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 1 deletion.
48 changes: 47 additions & 1 deletion internal/hammer/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ func NewDatabase(ddl DDL) (*Database, error) {
var (
tables []*Table
changeStreams []*ChangeStream
views []*View
alterDatabaseOptions *spansql.AlterDatabase
options spansql.SetDatabaseOptions
)
Expand Down Expand Up @@ -78,6 +79,9 @@ func NewDatabase(ddl DDL) (*Database, error) {
} else {
changeStreams = append(changeStreams, &ChangeStream{CreateChangeStream: stmt})
}
case *spansql.CreateView:
v := &View{CreateView: stmt}
views = append(views, v)
default:
return nil, fmt.Errorf("unexpected ddl statement: %v", stmt)
}
Expand All @@ -92,12 +96,13 @@ func NewDatabase(ddl DDL) (*Database, error) {
}
}

return &Database{tables: tables, changeStreams: changeStreams, alterDatabaseOptions: alterDatabaseOptions, options: options}, nil
return &Database{tables: tables, changeStreams: changeStreams, views: views, alterDatabaseOptions: alterDatabaseOptions, options: options}, nil
}

type Database struct {
tables []*Table
changeStreams []*ChangeStream
views []*View

alterDatabaseOptions *spansql.AlterDatabase
options spansql.SetDatabaseOptions
Expand All @@ -111,6 +116,10 @@ type Table struct {
changeStreams []*ChangeStream
}

type View struct {
*spansql.CreateView
}

type ChangeStream struct {
*spansql.CreateChangeStream
}
Expand Down Expand Up @@ -201,6 +210,20 @@ func (g *Generator) GenerateDDL() DDL {

ddl.AppendDDL(g.generateDDLForAlterChangeStream(fromChangeStream, cs))
}
// for views
for _, toView := range g.to.views {
_, exists := g.findViewByName(g.from.views, toView.Name)
if !exists {
ddl.Append(toView)
continue
}
ddl.AppendDDL(g.generateDDLForReplaceView(toView))
}
for _, fromView := range g.from.views {
if _, exists := g.findViewByName(g.to.views, fromView.Name); !exists {
ddl.AppendDDL(g.generateDDLForDropView(fromView))
}
}
return ddl
}

Expand Down Expand Up @@ -815,3 +838,26 @@ func (g *Generator) generateDDLForDropChangeStream(changeStream *ChangeStream) D
ddl.Append(spansql.DropChangeStream{Name: changeStream.Name})
return ddl
}

func (g *Generator) findViewByName(views []*View, name spansql.ID) (view *View, exists bool) {
for _, v := range views {
if v.Name == name {
view = v
exists = true
break
}
}
return
}

func (g *Generator) generateDDLForReplaceView(view *View) DDL {
ddl := DDL{}
ddl.Append(spansql.CreateView{Name: view.Name, Position: view.Position, Query: view.Query, OrReplace: true})
return ddl
}

func (g *Generator) generateDDLForDropView(view *View) DDL {
ddl := DDL{}
ddl.Append(spansql.DropView{Name: view.Name})
return ddl
}
64 changes: 64 additions & 0 deletions internal/hammer/diff_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1380,6 +1380,70 @@ CREATE TABLE Nonces (
`ALTER TABLE Nonces ALTER COLUMN expires TIMESTAMP NOT NULL DEFAULT (TIMESTAMP '2000-01-01 12:00:00.000000+00:00')`,
},
},
{
name: "drop view",
from: `
CREATE TABLE t1 (
t1_1 INT64 NOT NULL,
) PRIMARY KEY(t1_1);
CREATE VIEW v1
SQL SECURITY INVOKER
AS SELECT * FROM t1;
`,
to: `
CREATE TABLE t1 (
t1_1 INT64 NOT NULL,
) PRIMARY KEY(t1_1);
`,
expected: []string{
`DROP VIEW v1`,
},
},
{
name: "create view",
from: `
CREATE TABLE t1 (
t1_1 INT64 NOT NULL,
) PRIMARY KEY(t1_1);
`,
to: `
CREATE TABLE t1 (
t1_1 INT64 NOT NULL,
) PRIMARY KEY(t1_1);
CREATE VIEW v1
SQL SECURITY INVOKER
AS SELECT * FROM t1;
`,
expected: []string{
`CREATE VIEW v1 SQL SECURITY INVOKER AS SELECT * FROM t1`,
},
},
{
name: "replace view",
from: `
CREATE TABLE t1 (
t1_1 INT64 NOT NULL,
) PRIMARY KEY(t1_1);
CREATE VIEW v1
SQL SECURITY INVOKER
AS SELECT * FROM t1 WHERE t1_1 > 0;
`,
to: `
CREATE TABLE t1 (
t1_1 INT64 NOT NULL,
) PRIMARY KEY(t1_1);
CREATE VIEW v1
SQL SECURITY INVOKER
AS SELECT * FROM t1;
`,
expected: []string{
`CREATE OR REPLACE VIEW v1 SQL SECURITY INVOKER AS SELECT * FROM t1`,
},
},
}
for _, v := range values {
t.Run(v.name, func(t *testing.T) {
Expand Down

0 comments on commit 9de2d7a

Please sign in to comment.