Skip to content

Commit 2da019f

Browse files
Support CREATE EXTENSION ... CASCADE (#108)
1 parent fa2eb0e commit 2da019f

File tree

3 files changed

+70
-5
lines changed

3 files changed

+70
-5
lines changed

postgresql/resource_postgresql_extension.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ import (
1313
)
1414

1515
const (
16-
extNameAttr = "name"
17-
extSchemaAttr = "schema"
18-
extVersionAttr = "version"
19-
extDatabaseAttr = "database"
20-
extDropCascadeAttr = "drop_cascade"
16+
extNameAttr = "name"
17+
extSchemaAttr = "schema"
18+
extVersionAttr = "version"
19+
extDatabaseAttr = "database"
20+
extDropCascadeAttr = "drop_cascade"
21+
extCreateCascadeAttr = "create_cascade"
2122
)
2223

2324
func resourcePostgreSQLExtension() *schema.Resource {
@@ -62,6 +63,12 @@ func resourcePostgreSQLExtension() *schema.Resource {
6263
Default: false,
6364
Description: "When true, will also drop all the objects that depend on the extension, and in turn all objects that depend on those objects",
6465
},
66+
extCreateCascadeAttr: {
67+
Type: schema.TypeBool,
68+
Optional: true,
69+
Default: false,
70+
Description: "When true, will also create any extensions that this extension depends on that are not already installed",
71+
},
6572
},
6673
}
6774
}
@@ -88,6 +95,10 @@ func resourcePostgreSQLExtensionCreate(db *DBConnection, d *schema.ResourceData)
8895
fmt.Fprint(b, " VERSION ", pq.QuoteIdentifier(v.(string)))
8996
}
9097

98+
if d.Get(extCreateCascadeAttr).(bool) {
99+
fmt.Fprint(b, " CASCADE")
100+
}
101+
91102
txn, err := startTransaction(db.client, databaseName)
92103
if err != nil {
93104
return err

postgresql/resource_postgresql_extension_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,59 @@ func testAccCreateExtensionDependency(tableName string) resource.TestCheckFunc {
258258
}
259259
}
260260

261+
func TestAccPostgresqlExtension_CreateCascade(t *testing.T) {
262+
skipIfNotAcc(t)
263+
264+
var testAccPostgresqlExtensionConfig = `
265+
resource "postgresql_extension" "cascade" {
266+
name = "earthdistance"
267+
create_cascade = true
268+
}
269+
`
270+
resource.Test(t, resource.TestCase{
271+
PreCheck: func() {
272+
testAccPreCheck(t)
273+
testCheckCompatibleVersion(t, featureExtension)
274+
testSuperuserPreCheck(t)
275+
},
276+
Providers: testAccProviders,
277+
CheckDestroy: testAccCheckPostgresqlExtensionDestroy,
278+
Steps: []resource.TestStep{
279+
{
280+
Config: testAccPostgresqlExtensionConfig,
281+
Check: resource.ComposeTestCheckFunc(
282+
testAccCheckPostgresqlExtensionExists("postgresql_extension.cascade"),
283+
resource.TestCheckResourceAttr("postgresql_extension.cascade", "name", "earthdistance"),
284+
// The cube extension should be installed as a dependency of earthdistance.
285+
testAccCheckExtensionDependency("cube"),
286+
),
287+
},
288+
},
289+
})
290+
}
291+
292+
func testAccCheckExtensionDependency(extName string) resource.TestCheckFunc {
293+
return func(s *terraform.State) error {
294+
295+
client := testAccProvider.Meta().(*Client)
296+
txn, err := startTransaction(client, client.databaseName)
297+
if err != nil {
298+
return err
299+
}
300+
defer deferredRollback(txn)
301+
302+
exists, err := checkExtensionExists(txn, extName)
303+
if err != nil {
304+
return fmt.Errorf("Error checking extension %s", err)
305+
}
306+
if !exists {
307+
return fmt.Errorf("Extension %s not found", extName)
308+
}
309+
310+
return nil
311+
}
312+
}
313+
261314
var testAccPostgresqlExtensionConfig = `
262315
resource "postgresql_extension" "myextension" {
263316
name = "pg_trgm"

website/docs/r/postgresql_extension.html.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@ resource "postgresql_extension" "my_extension" {
2727
* `version` - (Optional) Sets the version number of the extension.
2828
* `database` - (Optional) Which database to create the extension on. Defaults to provider database.
2929
* `drop_cascade` - (Optional) When true, will also drop all the objects that depend on the extension, and in turn all objects that depend on those objects. (Default: false)
30+
* `create_cascade` - (Optional) When true, will also create any extensions that this extension depends on that are not already installed. (Default: false)

0 commit comments

Comments
 (0)