Skip to content

Commit 84d3be6

Browse files
authored
fix: compatibility with PG16 (#479)
cf #407
1 parent e3b3fe3 commit 84d3be6

File tree

5 files changed

+39
-10
lines changed

5 files changed

+39
-10
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212

1313
strategy:
1414
matrix:
15-
pgversion: [15, 14, 13, 12, 11]
15+
pgversion: [16, 15, 14, 13, 12, 11]
1616

1717
env:
1818
PGVERSION: ${{ matrix.pgversion }}

postgresql/config.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ const (
4444
featurePubWithoutTruncate
4545
featureFunction
4646
featureServer
47+
featureCreateRoleSelfGrant
4748
)
4849

4950
var (
@@ -115,6 +116,10 @@ var (
115116
featureServer: semver.MustParseRange(">=10.0.0"),
116117

117118
featureDatabaseOwnerRole: semver.MustParseRange(">=15.0.0"),
119+
120+
// New privileges rules in version 16
121+
// https://www.postgresql.org/docs/16/release-16.html#RELEASE-16-PRIVILEGES
122+
featureCreateRoleSelfGrant: semver.MustParseRange(">=16.0.0"),
118123
}
119124
)
120125

postgresql/helpers.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,25 @@ func pqQuoteLiteral(in string) string {
5656

5757
func isMemberOfRole(db QueryAble, role, member string) (bool, error) {
5858
var _rez int
59+
setOption := true
60+
5961
err := db.QueryRow(
60-
"SELECT 1 FROM pg_auth_members WHERE pg_get_userbyid(roleid) = $1 AND pg_get_userbyid(member) = $2",
61-
role, member,
62+
"SELECT 1 FROM information_schema.columns WHERE table_name='pg_auth_members' AND column_name = 'set_option'",
6263
).Scan(&_rez)
6364

65+
switch {
66+
case err == sql.ErrNoRows:
67+
setOption = false
68+
case err != nil:
69+
return false, fmt.Errorf("could not read setOption column: %w", err)
70+
}
71+
72+
query := "SELECT 1 FROM pg_auth_members WHERE pg_get_userbyid(roleid) = $1 AND pg_get_userbyid(member) = $2"
73+
if setOption {
74+
query += " AND set_option"
75+
}
76+
77+
err = db.QueryRow(query, role, member).Scan(&_rez)
6478
switch {
6579
case err == sql.ErrNoRows:
6680
return false, nil

postgresql/resource_postgresql_database_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -346,17 +346,18 @@ func checkUserMembership(
346346
t *testing.T, dsn, member, role string, shouldHaveRole bool,
347347
) resource.TestCheckFunc {
348348
return func(s *terraform.State) error {
349-
db, err := sql.Open("postgres", dsn)
349+
client := testAccProvider.Meta().(*Client)
350+
db, err := client.Connect()
350351
if err != nil {
351352
t.Fatalf("could to create connection pool: %v", err)
352353
}
353-
defer db.Close()
354354

355355
var _rez int
356-
err = db.QueryRow(`
357-
SELECT 1 FROM pg_auth_members
358-
WHERE pg_get_userbyid(roleid) = $1 AND pg_get_userbyid(member) = $2
359-
`, role, member).Scan(&_rez)
356+
query := "SELECT 1 FROM pg_auth_members WHERE pg_get_userbyid(roleid) = $1 AND pg_get_userbyid(member) = $2"
357+
if db.featureSupported(featureCreateRoleSelfGrant) {
358+
query += " AND (set_option OR inherit_option)"
359+
}
360+
err = db.QueryRow(query, role, member).Scan(&_rez)
360361

361362
switch {
362363
case err == sql.ErrNoRows:

postgresql/resource_postgresql_role_test.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,16 @@ resource "postgresql_role" "test_role" {
212212
resource.Test(t, resource.TestCase{
213213
PreCheck: func() {
214214
testAccPreCheck(t)
215-
testCheckCompatibleVersion(t, featurePrivileges)
215+
client := testAccProvider.Meta().(*Client)
216+
db, err := client.Connect()
217+
if err != nil {
218+
t.Fatalf("could connect to database: %v", err)
219+
}
220+
// Requires >= 9 and <16
221+
// We disable this test for >= pg16 as it makes no sense with the new createRoleSelfGrant feature
222+
if !db.featureSupported(featurePrivileges) || db.featureSupported(featureCreateRoleSelfGrant) {
223+
t.Skipf("Skip extension tests for Postgres %s", db.version)
224+
}
216225
},
217226
Providers: testAccProviders,
218227
CheckDestroy: testAccCheckPostgresqlRoleDestroy,

0 commit comments

Comments
 (0)