diff --git a/internal/db/error.go b/internal/db/error.go index f88d7ec5cc..49004ab5bf 100644 --- a/internal/db/error.go +++ b/internal/db/error.go @@ -58,3 +58,20 @@ func IsUniqueError(err error) bool { return false } + +// IsCheckConstraintError returns a boolean indicating whether the error is +// known to report a check constraint violation. +func IsCheckConstraintError(err error) bool { + if err == nil { + return false + } + + var pqError *pq.Error + if errors.As(err, &pqError) { + if pqError.Code.Name() == "check_violation" { + return true + } + } + + return false +} diff --git a/internal/db/error_test.go b/internal/db/error_test.go index b31b2f3762..efed0f6c74 100644 --- a/internal/db/error_test.go +++ b/internal/db/error_test.go @@ -26,7 +26,7 @@ func TestError_IsUnique(t *testing.T) { want: false, }, { - name: "postgres-is-unique2", + name: "postgres-is-unique", in: &pq.Error{ Code: pq.ErrorCode("23505"), }, @@ -43,3 +43,40 @@ func TestError_IsUnique(t *testing.T) { }) } } + +func TestError_IsCheckConstraint(t *testing.T) { + var tests = []struct { + name string + in error + want bool + }{ + { + name: "nil-error", + in: nil, + want: false, + }, + { + name: "postgres-not-check-constraint", + in: &pq.Error{ + Code: pq.ErrorCode("23505"), + }, + want: false, + }, + { + name: "postgres-is-check-constraint", + in: &pq.Error{ + Code: pq.ErrorCode("23514"), + }, + want: true, + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + assert := assert.New(t) + err := tt.in + got := IsCheckConstraintError(err) + assert.Equal(tt.want, got) + }) + } +}