Source code for postgresql.exceptions
##
# .exceptions - Exception hierarchy for PostgreSQL database ERRORs.
##
"""
PostgreSQL exceptions and warnings with associated state codes.
The primary entry points of this module is the `ErrorLookup` function and the
`WarningLookup` function. Given an SQL state code, they give back the most
appropriate Error or Warning subclass.
For more information on error codes see:
http://www.postgresql.org/docs/current/static/errcodes-appendix.html
This module is executable via -m: python -m postgresql.exceptions.
It provides a convenient way to look up the exception object mapped to by the
given error code::
$ python -m postgresql.exceptions XX000
postgresql.exceptions.InternalError [XX000]
If the exact error code is not found, it will try to find the error class's
exception(The first two characters of the error code make up the class
identity)::
$ python -m postgresql.exceptions XX400
postgresql.exceptions.InternalError [XX000]
If that fails, it will return `postgresql.exceptions.Error`
"""
import sys
import os
from functools import partial
from operator import attrgetter
from .message import Message
from . import sys as pg_sys
PythonException = Exception
[docs]class Exception(Exception):
'Base PostgreSQL exception class'
pass
[docs]class LoadError(Exception):
'Failed to load a library'
[docs]class Disconnection(Exception):
'Exception identifying errors that result in disconnection'
class Warning(Message):
code = '01000'
_e_label = property(attrgetter('__class__.__name__'))
class DriverWarning(Warning):
code = '01-00'
source = 'CLIENT'
[docs]class IgnoredClientParameterWarning(DriverWarning):
'Warn the user of a valid, but ignored parameter.'
code = '01-CP'
[docs]class TypeConversionWarning(DriverWarning):
'Report a potential issue with a conversion.'
code = '01-TP'
class DeprecationWarning(Warning):
code = '01P01'
class DynamicResultSetsReturnedWarning(Warning):
code = '0100C'
class ImplicitZeroBitPaddingWarning(Warning):
code = '01008'
class NullValueEliminatedInSetFunctionWarning(Warning):
code = '01003'
class PrivilegeNotGrantedWarning(Warning):
code = '01007'
class PrivilegeNotRevokedWarning(Warning):
code = '01006'
class StringDataRightTruncationWarning(Warning):
code = '01004'
class NoDataWarning(Warning):
code = '02000'
class NoMoreSetsReturned(NoDataWarning):
code = '02001'
[docs]class Error(Message, Exception):
'A PostgreSQL Error'
_e_label = 'ERROR'
code = ''
def __str__(self):
'Call .sys.errformat(self)'
return pg_sys.errformat(self)
@property
def fatal(self):
f = self.details.get('severity')
return None if f is None else f in ('PANIC', 'FATAL')
[docs]class DriverError(Error):
"Errors originating in the driver's implementation."
source = 'CLIENT'
code = '--000'
[docs]class AuthenticationMethodError(DriverError, Disconnection):
"""
Server requested an authentication method that is not supported by the
driver.
"""
code = '--AUT'
[docs]class InsecurityError(DriverError, Disconnection):
"""
Error signifying a secure channel to a server cannot be established.
"""
code = '--SEC'
[docs]class ConnectTimeoutError(DriverError, Disconnection):
'Client was unable to esablish a connection in the given time'
code = '--TOE'
[docs]class TypeIOError(DriverError):
"""
Driver failed to pack or unpack a tuple.
"""
code = '--TIO'
class ParameterError(TypeIOError):
code = '--PIO'
class ColumnError(TypeIOError):
code = '--CIO'
class CompositeError(TypeIOError):
code = '--cIO'
[docs]class OperationError(DriverError):
"""
An invalid operation on an interface element.
"""
code = '--OPE'
class TransactionError(Error):
pass
class SQLNotYetCompleteError(Error):
code = '03000'
class ConnectionError(Error, Disconnection):
code = '08000'
[docs]class ConnectionDoesNotExistError(ConnectionError):
"""
The connection is closed or was never connected.
"""
code = '08003'
[docs]class ConnectionFailureError(ConnectionError):
'Raised when a connection is dropped'
code = '08006'
[docs]class ClientCannotConnectError(ConnectionError):
"""
Client was unable to establish a connection to the server.
"""
code = '08001'
class ConnectionRejectionError(ConnectionError):
code = '08004'
class TransactionResolutionUnknownError(ConnectionError):
code = '08007'
class ProtocolError(ConnectionError):
code = '08P01'
class TriggeredActionError(Error):
code = '09000'
[docs]class FeatureError(Error):
"Unsupported feature"
code = '0A000'
class TransactionInitiationError(TransactionError):
code = '0B000'
class LocatorError(Error):
code = '0F000'
class LocatorSpecificationError(LocatorError):
code = '0F001'
class GrantorError(Error):
code = '0L000'
class GrantorOperationError(GrantorError):
code = '0LP01'
class RoleSpecificationError(Error):
code = '0P000'
class CaseNotFoundError(Error):
code = '20000'
[docs]class CardinalityError(Error):
"Wrong number of rows returned"
code = '21000'
class TriggeredDataChangeViolation(Error):
code = '27000'
class AuthenticationSpecificationError(Error, Disconnection):
code = '28000'
[docs]class DPDSEError(Error):
"Dependent Privilege Descriptors Still Exist"
code = '2B000'
class DPDSEObjectError(DPDSEError):
code = '2BP01'
[docs]class SREError(Error):
"SQL Routine Exception"
code = '2F000'
class FunctionExecutedNoReturnStatementError(SREError):
code = '2F005'
class DataModificationProhibitedError(SREError):
code = '2F002'
class StatementProhibitedError(SREError):
code = '2F003'
class ReadingDataProhibitedError(SREError):
code = '2F004'
[docs]class EREError(Error):
"External Routine Exception"
code = '38000'
class ContainingSQLNotPermittedError(EREError):
code = '38001'
class ModifyingSQLDataNotPermittedError(EREError):
code = '38002'
class ProhibitedSQLStatementError(EREError):
code = '38003'
class ReadingSQLDataNotPermittedError(EREError):
code = '38004'
[docs]class ERIEError(Error):
"External Routine Invocation Exception"
code = '39000'
class InvalidSQLState(ERIEError):
code = '39001'
class NullValueNotAllowed(ERIEError):
code = '39004'
class TriggerProtocolError(ERIEError):
code = '39P01'
class SRFProtocolError(ERIEError):
code = '39P02'
[docs]class TRError(TransactionError):
"Transaction Rollback"
code = '40000'
class DeadlockError(TRError):
code = '40P01'
class IntegrityConstraintViolationError(TRError):
code = '40002'
class SerializationError(TRError):
code = '40001'
class StatementCompletionUnknownError(TRError):
code = '40003'
[docs]class ITSError(TransactionError):
"Invalid Transaction State"
code = '25000'
class ActiveTransactionError(ITSError):
code = '25001'
class BranchAlreadyActiveError(ITSError):
code = '25002'
class BadAccessModeForBranchError(ITSError):
code = '25003'
class BadIsolationForBranchError(ITSError):
code = '25004'
class NoActiveTransactionForBranchError(ITSError):
code = '25005'
[docs]class ReadOnlyTransactionError(ITSError):
"Occurs when an alteration occurs in a read-only transaction."
code = '25006'
[docs]class SchemaAndDataStatementsError(ITSError):
"Mixed schema and data statements not allowed."
code = '25007'
[docs]class InconsistentCursorIsolationError(ITSError):
"The held cursor requires the same isolation."
code = '25008'
class NoActiveTransactionError(ITSError):
code = '25P01'
[docs]class InFailedTransactionError(ITSError):
"Occurs when an action occurs in a failed transaction."
code = '25P02'
[docs]class SavepointError(TransactionError):
"Classification error designating errors that relate to savepoints."
code = '3B000'
class InvalidSavepointSpecificationError(SavepointError):
code = '3B001'
class TransactionTerminationError(TransactionError):
code = '2D000'
[docs]class IRError(Error):
"Insufficient Resource Error"
code = '53000'
class MemoryError(IRError, MemoryError):
code = '53200'
class DiskFullError(IRError):
code = '53100'
class TooManyConnectionsError(IRError):
code = '53300'
[docs]class PLEError(OverflowError):
"Program Limit Exceeded"
code = '54000'
class ComplexityOverflowError(PLEError):
code = '54001'
class ColumnOverflowError(PLEError):
code = '54011'
class ArgumentOverflowError(PLEError):
code = '54023'
[docs]class ONIPSError(Error):
"Object Not In Prerequisite State"
code = '55000'
class ObjectInUseError(ONIPSError):
code = '55006'
class ImmutableRuntimeParameterError(ONIPSError):
code = '55P02'
class UnavailableLockError(ONIPSError):
code = '55P03'
[docs]class SEARVError(Error):
"Syntax Error or Access Rule Violation"
code = '42000'
class SEARVNameError(SEARVError):
code = '42602'
class NameTooLongError(SEARVError):
code = '42622'
class ReservedNameError(SEARVError):
code = '42939'
class ForeignKeyCreationError(SEARVError):
code = '42830'
class InsufficientPrivilegeError(SEARVError):
code = '42501'
class GroupingError(SEARVError):
code = '42803'
class RecursionError(SEARVError):
code = '42P19'
class WindowError(SEARVError):
code = '42P20'
class SyntaxError(SEARVError):
code = '42601'
class TypeError(SEARVError):
pass
class CoercionError(TypeError):
code = '42846'
class TypeMismatchError(TypeError):
code = '42804'
class IndeterminateTypeError(TypeError):
code = '42P18'
class WrongObjectTypeError(TypeError):
code = '42809'
class UndefinedError(SEARVError):
pass
class UndefinedColumnError(UndefinedError):
code = '42703'
class UndefinedFunctionError(UndefinedError):
code = '42883'
class UndefinedTableError(UndefinedError):
code = '42P01'
class UndefinedParameterError(UndefinedError):
code = '42P02'
class UndefinedObjectError(UndefinedError):
code = '42704'
class DuplicateError(SEARVError):
pass
class DuplicateColumnError(DuplicateError):
code = '42701'
class DuplicateCursorError(DuplicateError):
code = '42P03'
class DuplicateDatabaseError(DuplicateError):
code = '42P04'
class DuplicateFunctionError(DuplicateError):
code = '42723'
class DuplicatePreparedStatementError(DuplicateError):
code = '42P05'
class DuplicateSchemaError(DuplicateError):
code = '42P06'
class DuplicateTableError(DuplicateError):
code = '42P07'
class DuplicateAliasError(DuplicateError):
code = '42712'
class DuplicateObjectError(DuplicateError):
code = '42710'
class AmbiguityError(SEARVError):
pass
class AmbiguousColumnError(AmbiguityError):
code = '42702'
class AmbiguousFunctionError(AmbiguityError):
code = '42725'
class AmbiguousParameterError(AmbiguityError):
code = '42P08'
class AmbiguousAliasError(AmbiguityError):
code = '42P09'
class ColumnReferenceError(SEARVError):
code = '42P10'
class DefinitionError(SEARVError):
pass
class ColumnDefinitionError(DefinitionError):
code = '42611'
class CursorDefinitionError(DefinitionError):
code = '42P11'
class DatabaseDefinitionError(DefinitionError):
code = '42P12'
class FunctionDefinitionError(DefinitionError):
code = '42P13'
class PreparedStatementDefinitionError(DefinitionError):
code = '42P14'
class SchemaDefinitionError(DefinitionError):
code = '42P15'
class TableDefinitionError(DefinitionError):
code = '42P16'
class ObjectDefinitionError(DefinitionError):
code = '42P17'
class CursorStateError(Error):
code = '24000'
class WithCheckOptionError(Error):
code = '44000'
class NameError(Error):
pass
class CatalogNameError(NameError):
code = '3D000'
class CursorNameError(NameError):
code = '34000'
class StatementNameError(NameError):
code = '26000'
class SchemaNameError(NameError):
code = '3F000'
[docs]class ICVError(Error):
"Integrity Contraint Violation"
code = '23000'
class RestrictError(ICVError):
code = '23001'
class NotNullError(ICVError):
code = '23502'
class ForeignKeyError(ICVError):
code = '23503'
class UniqueError(ICVError):
code = '23505'
class CheckError(ICVError):
code = '23514'
class DataError(Error):
code = '22000'
class StringRightTruncationError(DataError):
code = '22001'
class StringDataLengthError(DataError):
code = '22026'
class ZeroLengthString(DataError):
code = '2200F'
class EncodingError(DataError):
code = '22021'
class ArrayElementError(DataError):
code = '2202E'
class SpecificTypeMismatch(DataError):
code = '2200G'
class NullValueNotAllowedError(DataError):
code = '22004'
class NullValueNoIndicatorParameter(DataError):
code = '22002'
class ZeroDivisionError(DataError):
code = '22012'
class FloatingPointError(DataError):
code = '22P01'
class AssignmentError(DataError):
code = '22005'
class IndicatorOverflowError(DataError):
code = '22022'
class BadCopyError(DataError):
code = '22P04'
class TextRepresentationError(DataError):
code = '22P02'
class BinaryRepresentationError(DataError):
code = '22P03'
class UntranslatableCharacterError(DataError):
code = '22P05'
class NonstandardUseOfEscapeCharacterError(DataError):
code = '22P06'
class NotXMLError(DataError):
code = '2200L'
class XMLDocumentError(DataError):
code = '2200M'
class XMLContentError(DataError):
code = '2200N'
class XMLCommentError(DataError):
code = '2200S'
class XMLProcessingInstructionError(DataError):
code = '2200T'
class DateTimeFormatError(DataError):
code = '22007'
class TimeZoneDisplacementValueError(DataError):
code = '22009'
class DateTimeFieldOverflowError(DataError):
code = '22008'
class IntervalFieldOverflowError(DataError):
code = '22015'
class LogArgumentError(DataError):
code = '2201E'
class PowerFunctionArgumentError(DataError):
code = '2201F'
class WidthBucketFunctionArgumentError(DataError):
code = '2201G'
class CastCharacterValueError(DataError):
code = '22018'
class EscapeCharacterError(DataError):
code = '22019'
class EscapeOctetError(DataError):
code = '2200D'
class EscapeSequenceError(DataError):
code = '22025'
class EscapeCharacterConflictError(DataError):
code = '2200B'
[docs]class EscapeCharacterError(DataError):
"Invalid escape character"
code = '2200C'
class SubstringError(DataError):
code = '22011'
class TrimError(DataError):
code = '22027'
class IndicatorParameterValueError(DataError):
code = '22010'
class LimitValueError(DataError):
code = '2201W'
pg_code = '22020'
class OffsetValueError(DataError):
code = '2201X'
class ParameterValueError(DataError):
code = '22023'
class RegularExpressionError(DataError):
code = '2201B'
class NumericRangeError(DataError):
code = '22003'
class UnterminatedCStringError(DataError):
code = '22024'
class InternalError(Error):
code = 'XX000'
class DataCorruptedError(InternalError):
code = 'XX001'
class IndexCorruptedError(InternalError):
code = 'XX002'
[docs]class SIOError(Error):
"System I/O"
code = '58000'
class UndefinedFileError(SIOError):
code = '58P01'
class DuplicateFileError(SIOError):
code = '58P02'
[docs]class CFError(Error):
"Configuration File Error"
code = 'F0000'
class LockFileExistsError(CFError):
code = 'F0001'
[docs]class OIError(Error):
"Operator Intervention"
code = '57000'
class QueryCanceledError(OIError):
code = '57014'
class AdminShutdownError(OIError, Disconnection):
code = '57P01'
class CrashShutdownError(OIError, Disconnection):
code = '57P02'
[docs]class ServerNotReadyError(OIError, Disconnection):
'Thrown when a connection is established to a server that is still starting up.'
code = '57P03'
[docs]class PLPGSQLError(Error):
"Error raised by a PL/PgSQL procedural function"
code = 'P0000'
[docs]class PLPGSQLRaiseError(PLPGSQLError):
"Error raised by a PL/PgSQL RAISE statement."
code = 'P0001'
class PLPGSQLNoDataFoundError(PLPGSQLError):
code = 'P0002'
class PLPGSQLTooManyRowsError(PLPGSQLError):
code = 'P0003'
# Setup mapping to provide code based exception lookup.
code_to_error = {}
code_to_warning = {}
[docs]def map_errors_and_warnings(
objs : "A iterable of `Warning`s and `Error`'s",
error_container : "apply the code to error association to this object" = code_to_error,
warning_container : "apply the code to warning association to this object" = code_to_warning,
):
"""
Construct the code-to-error and code-to-warning associations.
"""
for obj in objs:
if not issubclass(type(obj), (type(Warning), type(Error))):
# It's not object of interest.
continue
code = getattr(obj, 'code', None)
if code is None:
# It has no code attribute, or the code was set to None.
# If it's code is None, we don't map it as it's a "container".
continue
if issubclass(obj, Error):
base = Error
container = error_container
elif issubclass(obj, Warning):
base = Warning
container = warning_container
else:
continue
cur_obj = container.get(code)
if cur_obj is None or issubclass(cur_obj, obj):
# There is no object yet, or the object at the code
# is not the most general class.
# The latter condition comes into play when
# there are sub-Class types that share the Class code
# with the most general type. (See TypeError)
container[code] = obj
if hasattr(obj, 'pg_code'):
# If there's a PostgreSQL version of the code,
# map it as well for older servers.
container[obj.pg_code] = obj
def code_lookup(
default : "The object to return when no code or class is found",
container : "where to look for the object associated with the code",
code : "the code to find the exception for"
):
obj = container.get(code)
if obj is None:
obj = container.get(code[:2] + "000", default)
return obj
map_errors_and_warnings(sys.modules[__name__].__dict__.values())
ErrorLookup = partial(code_lookup, Error, code_to_error)
WarningLookup = partial(code_lookup, Warning, code_to_warning)
if __name__ == '__main__':
for x in sys.argv[1:]:
if x.startswith('01'):
e = WarningLookup(x)
else:
e = ErrorLookup(x)
sys.stdout.write('postgresql.exceptions.%s [%s]%s%s' %(
e.__name__, e.code, os.linesep, (
e.__doc__ is not None and os.linesep.join([
' ' + x for x in (e.__doc__).split('\n')
]) + os.linesep or ''
)
)
)
##
# vim: ts=3:sw=3:noet: