PostgreSQL
Error codes
Every ARX error code, what it means, whether it is safe to retry, and the PostgreSQL errors it comes from.
Handling errors
Every error an ARX call throws is an ArxException with a stable Code: the same number and name in every provider. Its message starts with it (ARX3001 UniqueViolation: …), and the thousands digit is its Category. Catch by code, by category, or by IsTransient to retry, always on the base class: catch (ArxException e) when (e.Code == ArxErrorCode.RecordNotFound). Some codes come as a subclass (ArxValidationException before the database, ArxDatabaseException from it), but not every one, so a catch of a subclass can miss an error. A misuse found while you build the schema catalog at startup (a table declared twice, a key of a table that isn't declared) is an ArgumentException, as .NET builders report one, and a null argument an ArgumentNullException. The Errors in practice guide covers retries, HTTP statuses and a first connection's errors. The database's own error stays on the exception: SqlState, and the driver's exception as InnerException.
- Catch an error by its codeCreate
- Turn ARX error codes into messages for the userCreate
- Catch an SQL injection attempt on createCreate
- Turn update errors into messagesUpdate
- Catch an SQL injection attempt on updateUpdate
- Catch an SQL injection attempt on deleteDelete
- Turn read errors into messagesRetrieveMultiple
- Catch an SQL injection attempt on a searchRetrieveMultiple
- Business errors raised by a procedureExecute
- Handle Execute errorsExecute
- Catch an SQL injection attempt on ExecuteExecute
ARX1xxx Validation
ARX refused the call before sending it: invalid input, a misused connection, transaction or batch scope, or a name that looks like SQL injection.
| Code | Meaning | Retry | From PostgreSQL |
|---|---|---|---|
ARX1001InvalidArgument | Invalid input not covered by a more specific code. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1002MissingEntityName | The entity name is null or blank. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1003InvalidIdentifier | An entity or attribute name fails the identifier rules. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1004DuplicateAttribute | The same attribute appears more than once (names are case-insensitive). No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1005InvalidLookup | A lookup ( No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1006InvalidSelectionSet | A selection set value has no option set name. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1007UnsupportedValueType | An attribute value has a type the provider can't write. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1008InvalidConnection | The connection or transaction is of the wrong driver type, or the service has no connection string. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1009TransactionMismatch | The transaction belongs to a different connection. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1010TransactionCompleted | The transaction has already been committed, rolled back or disposed. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1011SelectionSetValueNotAllowed | A selection set value isn't allowed by its set in the catalog: not one of its options, of the wrong kind, a retired option, several values for a single-choice set, a duplicate, or a value the set's storage can't hold. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1012UnknownSelectionSet | A selection set value names a set that isn't in the catalog, or no catalog was supplied. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1013InvalidDateTimeValue | A date or time value that would be stored as something else than the caller meant: default(DateTime), default(DateTimeOffset) or default(DateOnly) (no real date: a database would store a sentinel or refuse it), or an array mixing UTC and Unspecified DateTime values. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1014BatchScopeBusy | A batch scope was called while another call on it was still running. A scope holds one connection, which runs one command at a time: await each call before the next. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1015TransactionAborted | A call or a commit on a transaction that an earlier failed call has aborted. The database has already discarded the transaction's work; it can only be rolled back. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1016IdNotDeclared | The entity's table isn't declared in the service's schema catalog, and the entity doesn't declare its own id column. A service with a catalog uses only what is declared: ARX doesn't guess an id column. A service created without a catalog reads the table's primary key instead (where the provider can), and raises No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1017SuspectedInjection | A name (entity, attribute, match column or type) contains SQL syntax: a quote, a statement separator, a comment marker, a bracket, an operator or an SQL keyword after a space. That is the shape of an SQL injection attempt, not of a typo, so it gets its own code to alert on. Refused before the database: nothing was sent. Values are never checked for this: they are always parameters, and any text is stored as typed. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1018NotPreloaded | The service is No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX1019TableNotResolvable | A service without a schema catalog resolves each table from the database, and this table has no id the call can use: no primary key, a primary key of several columns, or one of a type ARX can't use as an id. Refused before anything is sent, only for a call that needs the id (Create, Retrieve, Update or Delete by id). Declare the table in a schema catalog ( No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX2xxx NotFound
The rows the call addressed weren't found as asked: none, several where one was required, or one at another version than the call carried (ARX2004). Nothing was changed.
| Code | Meaning | Retry | From PostgreSQL |
|---|---|---|---|
ARX2002RecordNotFound | The record addressed by key doesn't exist. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX2003MultipleRecordsMatched | An update or delete with No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX2004RecordChanged | The record was changed since it was read: an Update or Delete carried a version (optimistic concurrency) that isn't the record's any more. Nothing was changed: read it again, and apply the change to what is there now. No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX3xxx Constraint
The database refused the change because of a rule: a unique key, a foreign key, NOT NULL, CHECK, or a routine's own error.
| Code | Meaning | Retry | From PostgreSQL |
|---|---|---|---|
ARX3001UniqueViolation | A unique constraint or key was violated. | No |
|
ARX3002ForeignKeyViolation | A referenced record is missing, or a record is still referenced. | No |
|
ARX3003NotNullViolation | A required attribute has no value. | No |
|
ARX3004CheckViolation | A check constraint or validation rule failed. | No |
|
ARX3005RaisedByDatabase | A routine the database runs (a procedure or function) refused the call on purpose (PostgreSQL | No |
|
ARX4xxx Data
A value doesn't fit its column: out of range, too long, in the wrong format or of the wrong type.
| Code | Meaning | Retry | From PostgreSQL |
|---|---|---|---|
ARX4001ValueOutOfRange | A number is outside the column's range. | No |
|
ARX4002ValueTooLong | Text or binary data is longer than the column allows. | No |
|
ARX4003InvalidValueFormat | A value can't be parsed for its column (for example invalid JSON, dates or encoding). | No |
|
ARX4004DataTypeMismatch | A value's type doesn't fit the column. | No |
|
ARX5xxx Schema
A table or column doesn't exist, or a declaration in the schema catalog doesn't match the table.
| Code | Meaning | Retry | From PostgreSQL |
|---|---|---|---|
ARX5001UndefinedEntity | The table or collection doesn't exist. | No |
|
ARX5002UndefinedAttribute | The column doesn't exist or can't be written. | No |
|
ARX5003SchemaMismatch | A declaration in the schema catalog doesn't match the table: the database returned an id of another type, or No PostgreSQL error maps to it: ARX raises it itself, from its own checks (before the call, or from what the database returned). | No | ARX |
ARX6xxx Permission
The database user isn't allowed to do it.
| Code | Meaning | Retry | From PostgreSQL |
|---|---|---|---|
ARX6001PermissionDenied | The database user lacks the required permission. | No |
|
ARX7xxx Transient
A temporary failure: a deadlock, a conflict, a timeout, throttling or a lost connection. Safe to retry the whole operation (IsTransient is true).
| Code | Meaning | Retry | From PostgreSQL |
|---|---|---|---|
ARX7001Deadlock | The operation was chosen as a deadlock victim. Safe to retry. | Safe to retry |
|
ARX7002SerializationFailure | The operation conflicted with a concurrent transaction. Safe to retry. | Safe to retry |
|
ARX7003Timeout | The command or a lock wait timed out. Safe to retry. | Safe to retry |
|
ARX7004Throttled | The server is rate-limiting or out of connections. Safe to retry later. | Safe to retry |
|
ARX7005ConnectionFailure | The database couldn't be reached, or the connection dropped. Safe to retry. | Safe to retry |
|
ARX8xxx NotSupported
The provider can't do what was asked, and refuses it rather than ignoring part of it.
| Code | Meaning | Retry | From PostgreSQL |
|---|---|---|---|
ARX8001NotSupported | The provider doesn't support the requested operation or feature. | No |
|
ARX9xxx Provider
A database error ARX doesn't map; the exception keeps its native code and SQLSTATE.
| Code | Meaning | Retry | From PostgreSQL |
|---|---|---|---|
ARX9001ProviderError | A native error the provider doesn't map; see NativeCode and SqlState. | No |
|