diff --git a/src/internal/errors/codes.ts b/src/internal/errors/codes.ts index 30e947935..bde07db7b 100644 --- a/src/internal/errors/codes.ts +++ b/src/internal/errors/codes.ts @@ -1,4 +1,5 @@ import { IcebergError } from '@storage/protocols/iceberg/catalog/errors' +import { DatabaseError } from 'pg' import { StorageBackendError } from './storage-error' export enum ErrorCode { @@ -401,13 +402,20 @@ export const ERRORS = { originalError: e, }), - DatabaseSchemaMismatch: (e?: Error) => - new StorageBackendError({ - code: ErrorCode.DatabaseSchemaMismatch, - httpStatusCode: 503, - message: 'The database schema is out of sync. Please run migrations or contact support.', - originalError: e, - }), + DatabaseSchemaMismatch: (e: DatabaseError) => + e.internalQuery && e.internalPosition // originates in trigger or RLS + ? new StorageBackendError({ + code: ErrorCode.DatabaseSchemaMismatch, + httpStatusCode: 503, + message: 'There is a database schema mismatch in a trigger or RLS policy: ' + e.where, + originalError: e, + }) + : new StorageBackendError({ + code: ErrorCode.DatabaseSchemaMismatch, + httpStatusCode: 503, + message: 'The database schema is out of sync. Please run migrations or contact support.', + originalError: e, + }), ResourceLocked: (e?: Error) => new StorageBackendError({ diff --git a/src/storage/database/knex.ts b/src/storage/database/knex.ts index 354ef1fff..697355759 100644 --- a/src/storage/database/knex.ts +++ b/src/storage/database/knex.ts @@ -1145,7 +1145,9 @@ export class DBError extends StorageBackendError implements RenderableError { switch (pgError.code) { case '42501': return ERRORS.AccessDenied( - 'new row violates row-level security policy', + pgError.message.includes('row-level security') + ? 'new row violates row-level security policy' + : pgError.message, pgError ).withMetadata({ query,