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: