From 544338dd4601406f878f1314428f4c8a31d38893 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Tue, 18 Oct 2022 00:37:04 +0000 Subject: [PATCH 1/2] chore: Enforce PostgreSQL >=13 Fixes #4608. --- cli/server.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cli/server.go b/cli/server.go index b9861bf141f42..5a5d69bbd0ab2 100644 --- a/cli/server.go +++ b/cli/server.go @@ -33,6 +33,7 @@ import ( "github.com/spf13/afero" "github.com/spf13/cobra" "go.opentelemetry.io/otel/trace" + "golang.org/x/mod/semver" "golang.org/x/oauth2" xgithub "golang.org/x/oauth2/github" "golang.org/x/sync/errgroup" @@ -389,6 +390,22 @@ func Server(dflags *codersdk.DeploymentFlags, newAPI func(context.Context, *code return xerrors.Errorf("dial postgres: %w", err) } defer sqlDB.Close() + // Ensure the PostgreSQL version is >=13.0.0! + version, err := sqlDB.QueryContext(ctx, "SHOW server_version;") + if err != nil { + return xerrors.Errorf("get postgres version: %w", err) + } + if !version.Next() { + return xerrors.Errorf("no rows returned for version select") + } + var versionStr string + err = version.Scan(&versionStr) + if err != nil { + return xerrors.Errorf("scan version: %w", err) + } + if semver.Compare("v"+versionStr, "v13") < 0 { + return xerrors.New("PostgreSQL version must be v13.0.0 or higher!") + } err = sqlDB.Ping() if err != nil { From 46ebc86b4bdf764082c52a9e25e4fe3fc56acc74 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Tue, 18 Oct 2022 00:46:46 +0000 Subject: [PATCH 2/2] Fix version string parsing --- cli/server.go | 1 + cli/server_test.go | 3 +++ 2 files changed, 4 insertions(+) diff --git a/cli/server.go b/cli/server.go index 5a5d69bbd0ab2..25b435ed6c673 100644 --- a/cli/server.go +++ b/cli/server.go @@ -403,6 +403,7 @@ func Server(dflags *codersdk.DeploymentFlags, newAPI func(context.Context, *code if err != nil { return xerrors.Errorf("scan version: %w", err) } + versionStr = strings.Split(versionStr, " ")[0] if semver.Compare("v"+versionStr, "v13") < 0 { return xerrors.New("PostgreSQL version must be v13.0.0 or higher!") } diff --git a/cli/server_test.go b/cli/server_test.go index fe71da93094bb..d91e2e8889352 100644 --- a/cli/server_test.go +++ b/cli/server_test.go @@ -60,6 +60,9 @@ func TestServer(t *testing.T) { "--postgres-url", connectionURL, "--cache-dir", t.TempDir(), ) + pty := ptytest.New(t) + root.SetOutput(pty.Output()) + root.SetErr(pty.Output()) errC := make(chan error, 1) go func() { errC <- root.ExecuteContext(ctx)