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'
[docs] class Warning(Message): code = '01000' _e_label = property(attrgetter('__class__.__name__'))
[docs] 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'
[docs] class DeprecationWarning(Warning): code = '01P01'
[docs] class DynamicResultSetsReturnedWarning(Warning): code = '0100C'
[docs] class ImplicitZeroBitPaddingWarning(Warning): code = '01008'
[docs] class NullValueEliminatedInSetFunctionWarning(Warning): code = '01003'
[docs] class PrivilegeNotGrantedWarning(Warning): code = '01007'
[docs] class PrivilegeNotRevokedWarning(Warning): code = '01006'
[docs] class StringDataRightTruncationWarning(Warning): code = '01004'
[docs] class NoDataWarning(Warning): code = '02000'
[docs] 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'
[docs] class ParameterError(TypeIOError): code = '--PIO'
[docs] class ColumnError(TypeIOError): code = '--CIO'
[docs] class CompositeError(TypeIOError): code = '--cIO'
[docs] class OperationError(DriverError): """ An invalid operation on an interface element. """ code = '--OPE'
[docs] class TransactionError(Error): pass
[docs] class SQLNotYetCompleteError(Error): code = '03000'
[docs] 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'
[docs] class ConnectionRejectionError(ConnectionError): code = '08004'
[docs] class TransactionResolutionUnknownError(ConnectionError): code = '08007'
[docs] class ProtocolError(ConnectionError): code = '08P01'
[docs] class TriggeredActionError(Error): code = '09000'
[docs] class FeatureError(Error): "Unsupported feature" code = '0A000'
[docs] class TransactionInitiationError(TransactionError): code = '0B000'
[docs] class LocatorError(Error): code = '0F000'
[docs] class LocatorSpecificationError(LocatorError): code = '0F001'
[docs] class GrantorError(Error): code = '0L000'
[docs] class GrantorOperationError(GrantorError): code = '0LP01'
[docs] class RoleSpecificationError(Error): code = '0P000'
[docs] class CaseNotFoundError(Error): code = '20000'
[docs] class CardinalityError(Error): "Wrong number of rows returned" code = '21000'
[docs] class TriggeredDataChangeViolation(Error): code = '27000'
[docs] class AuthenticationSpecificationError(Error, Disconnection): code = '28000'
[docs] class DPDSEError(Error): "Dependent Privilege Descriptors Still Exist" code = '2B000'
[docs] class DPDSEObjectError(DPDSEError): code = '2BP01'
[docs] class SREError(Error): "SQL Routine Exception" code = '2F000'
[docs] class FunctionExecutedNoReturnStatementError(SREError): code = '2F005'
[docs] class DataModificationProhibitedError(SREError): code = '2F002'
[docs] class StatementProhibitedError(SREError): code = '2F003'
[docs] class ReadingDataProhibitedError(SREError): code = '2F004'
[docs] class EREError(Error): "External Routine Exception" code = '38000'
[docs] class ContainingSQLNotPermittedError(EREError): code = '38001'
[docs] class ModifyingSQLDataNotPermittedError(EREError): code = '38002'
[docs] class ProhibitedSQLStatementError(EREError): code = '38003'
[docs] class ReadingSQLDataNotPermittedError(EREError): code = '38004'
[docs] class ERIEError(Error): "External Routine Invocation Exception" code = '39000'
[docs] class InvalidSQLState(ERIEError): code = '39001'
[docs] class NullValueNotAllowed(ERIEError): code = '39004'
[docs] class TriggerProtocolError(ERIEError): code = '39P01'
[docs] class SRFProtocolError(ERIEError): code = '39P02'
[docs] class TRError(TransactionError): "Transaction Rollback" code = '40000'
[docs] class DeadlockError(TRError): code = '40P01'
[docs] class IntegrityConstraintViolationError(TRError): code = '40002'
[docs] class SerializationError(TRError): code = '40001'
[docs] class StatementCompletionUnknownError(TRError): code = '40003'
[docs] class ITSError(TransactionError): "Invalid Transaction State" code = '25000'
[docs] class ActiveTransactionError(ITSError): code = '25001'
[docs] class BranchAlreadyActiveError(ITSError): code = '25002'
[docs] class BadAccessModeForBranchError(ITSError): code = '25003'
[docs] class BadIsolationForBranchError(ITSError): code = '25004'
[docs] 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'
[docs] 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'
[docs] class InvalidSavepointSpecificationError(SavepointError): code = '3B001'
[docs] class TransactionTerminationError(TransactionError): code = '2D000'
[docs] class IRError(Error): "Insufficient Resource Error" code = '53000'
[docs] class MemoryError(IRError, MemoryError): code = '53200'
[docs] class DiskFullError(IRError): code = '53100'
[docs] class TooManyConnectionsError(IRError): code = '53300'
[docs] class PLEError(OverflowError): "Program Limit Exceeded" code = '54000'
[docs] class ComplexityOverflowError(PLEError): code = '54001'
[docs] class ColumnOverflowError(PLEError): code = '54011'
[docs] class ArgumentOverflowError(PLEError): code = '54023'
[docs] class ONIPSError(Error): "Object Not In Prerequisite State" code = '55000'
[docs] class ObjectInUseError(ONIPSError): code = '55006'
[docs] class ImmutableRuntimeParameterError(ONIPSError): code = '55P02'
[docs] class UnavailableLockError(ONIPSError): code = '55P03'
[docs] class SEARVError(Error): "Syntax Error or Access Rule Violation" code = '42000'
[docs] class SEARVNameError(SEARVError): code = '42602'
[docs] class NameTooLongError(SEARVError): code = '42622'
[docs] class ReservedNameError(SEARVError): code = '42939'
[docs] class ForeignKeyCreationError(SEARVError): code = '42830'
[docs] class InsufficientPrivilegeError(SEARVError): code = '42501'
[docs] class GroupingError(SEARVError): code = '42803'
[docs] class RecursionError(SEARVError): code = '42P19'
[docs] class WindowError(SEARVError): code = '42P20'
[docs] class SyntaxError(SEARVError): code = '42601'
[docs] class TypeError(SEARVError): pass
[docs] class CoercionError(TypeError): code = '42846'
[docs] class TypeMismatchError(TypeError): code = '42804'
[docs] class IndeterminateTypeError(TypeError): code = '42P18'
[docs] class WrongObjectTypeError(TypeError): code = '42809'
[docs] class UndefinedError(SEARVError): pass
[docs] class UndefinedColumnError(UndefinedError): code = '42703'
[docs] class UndefinedFunctionError(UndefinedError): code = '42883'
[docs] class UndefinedTableError(UndefinedError): code = '42P01'
[docs] class UndefinedParameterError(UndefinedError): code = '42P02'
[docs] class UndefinedObjectError(UndefinedError): code = '42704'
[docs] class DuplicateError(SEARVError): pass
[docs] class DuplicateColumnError(DuplicateError): code = '42701'
[docs] class DuplicateCursorError(DuplicateError): code = '42P03'
[docs] class DuplicateDatabaseError(DuplicateError): code = '42P04'
[docs] class DuplicateFunctionError(DuplicateError): code = '42723'
[docs] class DuplicatePreparedStatementError(DuplicateError): code = '42P05'
[docs] class DuplicateSchemaError(DuplicateError): code = '42P06'
[docs] class DuplicateTableError(DuplicateError): code = '42P07'
[docs] class DuplicateAliasError(DuplicateError): code = '42712'
[docs] class DuplicateObjectError(DuplicateError): code = '42710'
[docs] class AmbiguityError(SEARVError): pass
[docs] class AmbiguousColumnError(AmbiguityError): code = '42702'
[docs] class AmbiguousFunctionError(AmbiguityError): code = '42725'
[docs] class AmbiguousParameterError(AmbiguityError): code = '42P08'
[docs] class AmbiguousAliasError(AmbiguityError): code = '42P09'
[docs] class ColumnReferenceError(SEARVError): code = '42P10'
[docs] class DefinitionError(SEARVError): pass
[docs] class ColumnDefinitionError(DefinitionError): code = '42611'
[docs] class CursorDefinitionError(DefinitionError): code = '42P11'
[docs] class DatabaseDefinitionError(DefinitionError): code = '42P12'
[docs] class FunctionDefinitionError(DefinitionError): code = '42P13'
[docs] class PreparedStatementDefinitionError(DefinitionError): code = '42P14'
[docs] class SchemaDefinitionError(DefinitionError): code = '42P15'
[docs] class TableDefinitionError(DefinitionError): code = '42P16'
[docs] class ObjectDefinitionError(DefinitionError): code = '42P17'
[docs] class CursorStateError(Error): code = '24000'
[docs] class WithCheckOptionError(Error): code = '44000'
[docs] class NameError(Error): pass
[docs] class CatalogNameError(NameError): code = '3D000'
[docs] class CursorNameError(NameError): code = '34000'
[docs] class StatementNameError(NameError): code = '26000'
[docs] class SchemaNameError(NameError): code = '3F000'
[docs] class ICVError(Error): "Integrity Contraint Violation" code = '23000'
[docs] class RestrictError(ICVError): code = '23001'
[docs] class NotNullError(ICVError): code = '23502'
[docs] class ForeignKeyError(ICVError): code = '23503'
[docs] class UniqueError(ICVError): code = '23505'
[docs] class CheckError(ICVError): code = '23514'
[docs] class DataError(Error): code = '22000'
[docs] class StringRightTruncationError(DataError): code = '22001'
[docs] class StringDataLengthError(DataError): code = '22026'
[docs] class ZeroLengthString(DataError): code = '2200F'
[docs] class EncodingError(DataError): code = '22021'
[docs] class ArrayElementError(DataError): code = '2202E'
[docs] class SpecificTypeMismatch(DataError): code = '2200G'
[docs] class NullValueNotAllowedError(DataError): code = '22004'
[docs] class NullValueNoIndicatorParameter(DataError): code = '22002'
[docs] class ZeroDivisionError(DataError): code = '22012'
[docs] class FloatingPointError(DataError): code = '22P01'
[docs] class AssignmentError(DataError): code = '22005'
[docs] class IndicatorOverflowError(DataError): code = '22022'
[docs] class BadCopyError(DataError): code = '22P04'
[docs] class TextRepresentationError(DataError): code = '22P02'
[docs] class BinaryRepresentationError(DataError): code = '22P03'
[docs] class UntranslatableCharacterError(DataError): code = '22P05'
[docs] class NonstandardUseOfEscapeCharacterError(DataError): code = '22P06'
[docs] class NotXMLError(DataError): code = '2200L'
[docs] class XMLDocumentError(DataError): code = '2200M'
[docs] class XMLContentError(DataError): code = '2200N'
[docs] class XMLCommentError(DataError): code = '2200S'
[docs] class XMLProcessingInstructionError(DataError): code = '2200T'
[docs] class DateTimeFormatError(DataError): code = '22007'
[docs] class TimeZoneDisplacementValueError(DataError): code = '22009'
[docs] class DateTimeFieldOverflowError(DataError): code = '22008'
[docs] class IntervalFieldOverflowError(DataError): code = '22015'
[docs] class LogArgumentError(DataError): code = '2201E'
[docs] class PowerFunctionArgumentError(DataError): code = '2201F'
[docs] class WidthBucketFunctionArgumentError(DataError): code = '2201G'
[docs] class CastCharacterValueError(DataError): code = '22018'
class EscapeCharacterError(DataError): code = '22019'
[docs] class EscapeOctetError(DataError): code = '2200D'
[docs] class EscapeSequenceError(DataError): code = '22025'
[docs] class EscapeCharacterConflictError(DataError): code = '2200B'
[docs] class EscapeCharacterError(DataError): "Invalid escape character" code = '2200C'
[docs] class SubstringError(DataError): code = '22011'
[docs] class TrimError(DataError): code = '22027'
[docs] class IndicatorParameterValueError(DataError): code = '22010'
[docs] class LimitValueError(DataError): code = '2201W' pg_code = '22020'
[docs] class OffsetValueError(DataError): code = '2201X'
[docs] class ParameterValueError(DataError): code = '22023'
[docs] class RegularExpressionError(DataError): code = '2201B'
[docs] class NumericRangeError(DataError): code = '22003'
[docs] class UnterminatedCStringError(DataError): code = '22024'
[docs] class InternalError(Error): code = 'XX000'
[docs] class DataCorruptedError(InternalError): code = 'XX001'
[docs] class IndexCorruptedError(InternalError): code = 'XX002'
[docs] class SIOError(Error): "System I/O" code = '58000'
[docs] class UndefinedFileError(SIOError): code = '58P01'
[docs] class DuplicateFileError(SIOError): code = '58P02'
[docs] class CFError(Error): "Configuration File Error" code = 'F0000'
[docs] class LockFileExistsError(CFError): code = 'F0001'
[docs] class OIError(Error): "Operator Intervention" code = '57000'
[docs] class QueryCanceledError(OIError): code = '57014'
[docs] class AdminShutdownError(OIError, Disconnection): code = '57P01'
[docs] 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'
[docs] class PLPGSQLNoDataFoundError(PLPGSQLError): code = 'P0002'
[docs] 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: