Skip to content

Commit

Permalink
feat: allow creating and reading views with COPY GRANTS.
Browse files Browse the repository at this point in the history
  • Loading branch information
sfc-gh-ngaberel committed Mar 28, 2023
1 parent 6cd7cd9 commit fe4e4db
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 33 deletions.
31 changes: 23 additions & 8 deletions pkg/snowflake/view.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ import (

// ViewBuilder abstracts the creation of SQL queries for a Snowflake View.
type ViewBuilder struct {
name string
db string
schema string
secure bool
replace bool
comment string
statement string
tags []TagValue
name string
db string
schema string
secure bool
replace bool
copyGrants bool
comment string
statement string
tags []TagValue
}

// QualifiedName prepends the db and schema if set and escapes everything nicely.
Expand Down Expand Up @@ -49,6 +50,12 @@ func (vb *ViewBuilder) WithReplace() *ViewBuilder {
return vb
}

// WithCopyGrants adds the "COPY GRANTS" option to the ViewBuilder.
func (vb *ViewBuilder) WithCopyGrants() *ViewBuilder {
vb.copyGrants = true
return vb
}

// WithSchema adds the name of the schema to the ViewBuilder.
func (vb *ViewBuilder) WithSchema(s string) *ViewBuilder {
vb.schema = s
Expand Down Expand Up @@ -129,6 +136,10 @@ func (vb *ViewBuilder) Create() (string, error) {

q.WriteString(fmt.Sprintf(` VIEW %v`, qn))

if vb.copyGrants {
q.WriteString(" COPY GRANTS")
}

if vb.comment != "" {
q.WriteString(fmt.Sprintf(" COMMENT = '%v'", EscapeString(vb.comment)))
}
Expand Down Expand Up @@ -242,3 +253,7 @@ func ListViews(databaseName string, schemaName string, db *sql.DB) ([]View, erro
}
return dbs, nil
}

func (v *View) CopyGrants() bool {
return strings.Contains(v.Text.String, " COPY GRANTS ")
}
53 changes: 28 additions & 25 deletions pkg/snowflake/view_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,66 +13,69 @@ func TestView(t *testing.T) {
schema := "some_schema"
view := "test"

v := NewViewBuilder(view).WithDB(db).WithSchema(schema)
r.NotNil(v)
r.False(v.secure)
qn, err := v.QualifiedName()
vb := NewViewBuilder(view).WithDB(db).WithSchema(schema)
r.NotNil(vb)
r.False(vb.secure)
qn, err := vb.QualifiedName()
r.NoError(err)
r.Equal(fmt.Sprintf(`"%v"."%v"."%v"`, db, schema, view), qn)

v.WithSecure()
r.True(v.secure)
vb.WithSecure()
r.True(vb.secure)

vb.WithComment("great' comment")
vb.WithStatement("SELECT * FROM DUMMY LIMIT 1")
r.Equal("SELECT * FROM DUMMY LIMIT 1", vb.statement)

v.WithComment("great' comment")
v.WithStatement("SELECT * FROM DUMMY LIMIT 1")
r.Equal("SELECT * FROM DUMMY LIMIT 1", v.statement)
vb.WithCopyGrants()
r.True(vb.copyGrants)

v.WithStatement("SELECT * FROM DUMMY WHERE blah = 'blahblah' LIMIT 1")
vb.WithStatement("SELECT * FROM DUMMY WHERE blah = 'blahblah' LIMIT 1")

q, err := v.Create()
q, err := vb.Create()
r.NoError(err)
r.Equal(`CREATE SECURE VIEW "some_database"."some_schema"."test" COMMENT = 'great\' comment' AS SELECT * FROM DUMMY WHERE blah = 'blahblah' LIMIT 1`, q)
r.Equal(`CREATE SECURE VIEW "some_database"."some_schema"."test" COPY GRANTS COMMENT = 'great\' comment' AS SELECT * FROM DUMMY WHERE blah = 'blahblah' LIMIT 1`, q)

q, err = v.Secure()
q, err = vb.Secure()
r.NoError(err)
r.Equal(`ALTER VIEW "some_database"."some_schema"."test" SET SECURE`, q)

q, err = v.Unsecure()
q, err = vb.Unsecure()
r.NoError(err)
r.Equal(`ALTER VIEW "some_database"."some_schema"."test" UNSET SECURE`, q)

q, err = v.ChangeComment("bad' comment")
q, err = vb.ChangeComment("bad' comment")
r.NoError(err)
r.Equal(`ALTER VIEW "some_database"."some_schema"."test" SET COMMENT = 'bad\' comment'`, q)

q, err = v.RemoveComment()
q, err = vb.RemoveComment()
r.NoError(err)
r.Equal(`ALTER VIEW "some_database"."some_schema"."test" UNSET COMMENT`, q)

q, err = v.Drop()
q, err = vb.Drop()
r.NoError(err)
r.Equal(`DROP VIEW "some_database"."some_schema"."test"`, q)

q = v.Show()
q = vb.Show()
r.Equal(`SHOW VIEWS LIKE 'test' IN SCHEMA "some_database"."some_schema"`, q)

v.WithDB("mydb")
qn, err = v.QualifiedName()
vb.WithDB("mydb")
qn, err = vb.QualifiedName()
r.NoError(err)
r.Equal(`"mydb"."some_schema"."test"`, qn)

q, err = v.Create()
q, err = vb.Create()
r.NoError(err)
r.Equal(`CREATE SECURE VIEW "mydb"."some_schema"."test" COMMENT = 'great\' comment' AS SELECT * FROM DUMMY WHERE blah = 'blahblah' LIMIT 1`, q)
r.Equal(`CREATE SECURE VIEW "mydb"."some_schema"."test" COPY GRANTS COMMENT = 'great\' comment' AS SELECT * FROM DUMMY WHERE blah = 'blahblah' LIMIT 1`, q)

q, err = v.Secure()
q, err = vb.Secure()
r.NoError(err)
r.Equal(`ALTER VIEW "mydb"."some_schema"."test" SET SECURE`, q)

q = v.Show()
q = vb.Show()
r.Equal(`SHOW VIEWS LIKE 'test' IN SCHEMA "mydb"."some_schema"`, q)

q, err = v.Drop()
q, err = vb.Drop()
r.NoError(err)
r.Equal(`DROP VIEW "mydb"."some_schema"."test"`, q)
}
Expand Down

0 comments on commit fe4e4db

Please sign in to comment.