diff --git a/.github/workflows/generate.yaml b/.github/workflows/generate.yaml new file mode 100644 index 0000000..fd56fd3 --- /dev/null +++ b/.github/workflows/generate.yaml @@ -0,0 +1,40 @@ +name: generate + +on: + schedule: + - cron: '0 0 * * *' + workflow_dispatch: + +jobs: + run: + runs-on: ubuntu-latest + + steps: + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.0' + + - name: Checkout + uses: actions/checkout@v2 + + - name: Generate + run: make + + - name: Count changes + id: changes + run: | + git add -N . + echo "::set-output name=count::$(git diff --name-only | wc -l)" + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v3 + with: + commit-message: Update Error Code + delete-branch: true + title: Update Error Code + body: | + Error codes have been updated. + + - https://github.com/postgres/postgres/blob/master/src/backend/utils/errcodes.txt + if: ${{ steps.changes.outputs.count > 0 }} diff --git a/src/PostgresError.php b/src/PostgresError.php index ce58b93..e7ad1e9 100644 --- a/src/PostgresError.php +++ b/src/PostgresError.php @@ -4,7 +4,10 @@ class PostgresError { + // Class 00 - Successful Completion const SUCCESSFUL_COMPLETION = '00000'; + + // Class 01 - Warning const WARNING = '01000'; const DYNAMIC_RESULT_SETS_RETURNED = '0100C'; const IMPLICIT_ZERO_BIT_PADDING = '01008'; @@ -13,9 +16,15 @@ class PostgresError const PRIVILEGE_NOT_REVOKED = '01006'; const STRING_DATA_RIGHT_TRUNCATION = '01004'; const DEPRECATED_FEATURE = '01P01'; + + // Class 02 - No Data (this is also a warning class per the SQL standard) const NO_DATA = '02000'; const NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED = '02001'; + + // Class 03 - SQL Statement Not Yet Complete const SQL_STATEMENT_NOT_YET_COMPLETE = '03000'; + + // Class 08 - Connection Exception const CONNECTION_EXCEPTION = '08000'; const CONNECTION_DOES_NOT_EXIST = '08003'; const CONNECTION_FAILURE = '08006'; @@ -23,18 +32,38 @@ class PostgresError const SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION = '08004'; const TRANSACTION_RESOLUTION_UNKNOWN = '08007'; const PROTOCOL_VIOLATION = '08P01'; + + // Class 09 - Triggered Action Exception const TRIGGERED_ACTION_EXCEPTION = '09000'; + + // Class 0A - Feature Not Supported const FEATURE_NOT_SUPPORTED = '0A000'; + + // Class 0B - Invalid Transaction Initiation const INVALID_TRANSACTION_INITIATION = '0B000'; + + // Class 0F - Locator Exception const LOCATOR_EXCEPTION = '0F000'; const INVALID_LOCATOR_SPECIFICATION = '0F001'; + + // Class 0L - Invalid Grantor const INVALID_GRANTOR = '0L000'; const INVALID_GRANT_OPERATION = '0LP01'; + + // Class 0P - Invalid Role Specification const INVALID_ROLE_SPECIFICATION = '0P000'; + + // Class 0Z - Diagnostics Exception const DIAGNOSTICS_EXCEPTION = '0Z000'; const STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER = '0Z002'; + + // Class 20 - Case Not Found const CASE_NOT_FOUND = '20000'; + + // Class 21 - Cardinality Violation const CARDINALITY_VIOLATION = '21000'; + + // Class 22 - Data Exception const DATA_EXCEPTION = '22000'; const ARRAY_SUBSCRIPT_ERROR = '2202E'; const CHARACTER_NOT_IN_REPERTOIRE = '22021'; @@ -102,6 +131,8 @@ class PostgresError const TOO_MANY_JSON_ARRAY_ELEMENTS = '2203D'; const TOO_MANY_JSON_OBJECT_MEMBERS = '2203E'; const SQL_JSON_SCALAR_REQUIRED = '2203F'; + + // Class 23 - Integrity Constraint Violation const INTEGRITY_CONSTRAINT_VIOLATION = '23000'; const RESTRICT_VIOLATION = '23001'; const NOT_NULL_VIOLATION = '23502'; @@ -109,7 +140,11 @@ class PostgresError const UNIQUE_VIOLATION = '23505'; const CHECK_VIOLATION = '23514'; const EXCLUSION_VIOLATION = '23P01'; + + // Class 24 - Invalid Cursor State const INVALID_CURSOR_STATE = '24000'; + + // Class 25 - Invalid Transaction State const INVALID_TRANSACTION_STATE = '25000'; const ACTIVE_SQL_TRANSACTION = '25001'; const BRANCH_TRANSACTION_ALREADY_ACTIVE = '25002'; @@ -122,39 +157,67 @@ class PostgresError const NO_ACTIVE_SQL_TRANSACTION = '25P01'; const IN_FAILED_SQL_TRANSACTION = '25P02'; const IDLE_IN_TRANSACTION_SESSION_TIMEOUT = '25P03'; + + // Class 26 - Invalid SQL Statement Name const INVALID_SQL_STATEMENT_NAME = '26000'; + + // Class 27 - Triggered Data Change Violation const TRIGGERED_DATA_CHANGE_VIOLATION = '27000'; + + // Class 28 - Invalid Authorization Specification const INVALID_AUTHORIZATION_SPECIFICATION = '28000'; const INVALID_PASSWORD = '28P01'; + + // Class 2B - Dependent Privilege Descriptors Still Exist const DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST = '2B000'; const DEPENDENT_OBJECTS_STILL_EXIST = '2BP01'; + + // Class 2D - Invalid Transaction Termination const INVALID_TRANSACTION_TERMINATION = '2D000'; + + // Class 2F - SQL Routine Exception const SQL_ROUTINE_EXCEPTION = '2F000'; const FUNCTION_EXECUTED_NO_RETURN_STATEMENT = '2F005'; const MODIFYING_SQL_DATA_NOT_PERMITTED = '2F002'; const PROHIBITED_SQL_STATEMENT_ATTEMPTED = '2F003'; const READING_SQL_DATA_NOT_PERMITTED = '2F004'; + + // Class 34 - Invalid Cursor Name const INVALID_CURSOR_NAME = '34000'; + + // Class 38 - External Routine Exception const EXTERNAL_ROUTINE_EXCEPTION = '38000'; const CONTAINING_SQL_NOT_PERMITTED = '38001'; const MODIFYING_SQL_DATA_NOT_PERMITTED_EXCEPTION = '38002'; const PROHIBITED_SQL_STATEMENT_ATTEMPTED_EXCEPTION = '38003'; const READING_SQL_DATA_NOT_PERMITTED_EXCEPTION = '38004'; + + // Class 39 - External Routine Invocation Exception const EXTERNAL_ROUTINE_INVOCATION_EXCEPTION = '39000'; const INVALID_SQLSTATE_RETURNED = '39001'; const NULL_VALUE_NOT_ALLOWED_EXCEPTION = '39004'; const TRIGGER_PROTOCOL_VIOLATED = '39P01'; const SRF_PROTOCOL_VIOLATED = '39P02'; const EVENT_TRIGGER_PROTOCOL_VIOLATED = '39P03'; + + // Class 3B - Savepoint Exception const SAVEPOINT_EXCEPTION = '3B000'; const INVALID_SAVEPOINT_SPECIFICATION = '3B001'; + + // Class 3D - Invalid Catalog Name const INVALID_CATALOG_NAME = '3D000'; + + // Class 3F - Invalid Schema Name const INVALID_SCHEMA_NAME = '3F000'; + + // Class 40 - Transaction Rollback const TRANSACTION_ROLLBACK = '40000'; const TRANSACTION_INTEGRITY_CONSTRAINT_VIOLATION = '40002'; const SERIALIZATION_FAILURE = '40001'; const STATEMENT_COMPLETION_UNKNOWN = '40003'; const DEADLOCK_DETECTED = '40P01'; + + // Class 42 - Syntax Error or Access Rule Violation const SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION = '42000'; const SYNTAX_ERROR = '42601'; const INSUFFICIENT_PRIVILEGE = '42501'; @@ -199,21 +262,31 @@ class PostgresError const INVALID_SCHEMA_DEFINITION = '42P15'; const INVALID_TABLE_DEFINITION = '42P16'; const INVALID_OBJECT_DEFINITION = '42P17'; + + // Class 44 - WITH CHECK OPTION Violation const WITH_CHECK_OPTION_VIOLATION = '44000'; + + // Class 53 - Insufficient Resources const INSUFFICIENT_RESOURCES = '53000'; const DISK_FULL = '53100'; const OUT_OF_MEMORY = '53200'; const TOO_MANY_CONNECTIONS = '53300'; const CONFIGURATION_LIMIT_EXCEEDED = '53400'; + + // Class 54 - Program Limit Exceeded const PROGRAM_LIMIT_EXCEEDED = '54000'; const STATEMENT_TOO_COMPLEX = '54001'; const TOO_MANY_COLUMNS = '54011'; const TOO_MANY_ARGUMENTS = '54023'; + + // Class 55 - Object Not In Prerequisite State const OBJECT_NOT_IN_PREREQUISITE_STATE = '55000'; const OBJECT_IN_USE = '55006'; const CANT_CHANGE_RUNTIME_PARAM = '55P02'; const LOCK_NOT_AVAILABLE = '55P03'; const UNSAFE_NEW_ENUM_VALUE_USAGE = '55P04'; + + // Class 57 - Operator Intervention const OPERATOR_INTERVENTION = '57000'; const QUERY_CANCELED = '57014'; const ADMIN_SHUTDOWN = '57P01'; @@ -221,13 +294,21 @@ class PostgresError const CANNOT_CONNECT_NOW = '57P03'; const DATABASE_DROPPED = '57P04'; const IDLE_SESSION_TIMEOUT = '57P05'; + + // Class 58 - System Error (errors external to PostgreSQL itself) const SYSTEM_ERROR = '58000'; const IO_ERROR = '58030'; const UNDEFINED_FILE = '58P01'; const DUPLICATE_FILE = '58P02'; + + // Class 72 - Snapshot Failure const SNAPSHOT_TOO_OLD = '72000'; + + // Class F0 - Configuration File Error const CONFIG_FILE_ERROR = 'F0000'; const LOCK_FILE_EXISTS = 'F0001'; + + // Class HV - Foreign Data Wrapper Error (SQL/MED) const FDW_ERROR = 'HV000'; const FDW_COLUMN_NAME_NOT_FOUND = 'HV005'; const FDW_DYNAMIC_PARAMETER_VALUE_NEEDED = 'HV002'; @@ -255,11 +336,15 @@ class PostgresError const FDW_UNABLE_TO_CREATE_EXECUTION = 'HV00L'; const FDW_UNABLE_TO_CREATE_REPLY = 'HV00M'; const FDW_UNABLE_TO_ESTABLISH_CONNECTION = 'HV00N'; + + // Class P0 - PL/pgSQL Error const PLPGSQL_ERROR = 'P0000'; const RAISE_EXCEPTION = 'P0001'; const NO_DATA_FOUND = 'P0002'; const TOO_MANY_ROWS = 'P0003'; const ASSERT_FAILURE = 'P0004'; + + // Class XX - Internal Error const INTERNAL_ERROR = 'XX000'; const DATA_CORRUPTED = 'XX001'; const INDEX_CORRUPTED = 'XX002'; diff --git a/tools/generator.php b/tools/generator.php index f61dd7c..db1ad2e 100644 --- a/tools/generator.php +++ b/tools/generator.php @@ -4,7 +4,10 @@ $const = array(); while ($row = fgets(STDIN)) { - if (preg_match('/^([0-9A-Z]{5}) +[SWE] +[^ ]+? +([a-z_]+)$/', $row, $matches)) { + if (preg_match('/^Section: (Class .*)$/', $row, $matches)) { + $const[] = ''; + $const[] = " // {$matches[1]}"; + } elseif (preg_match('/^([0-9A-Z]{5}) +[SWE] +[^ ]+? +([a-z_]+)$/', $row, $matches)) { $key = strtoupper($matches[2]); if (isset($codes[$key])) { $key .= '_EXCEPTION'; @@ -14,7 +17,7 @@ } } -$const = implode(PHP_EOL, $const); +$const = trim(implode(PHP_EOL, $const), PHP_EOL); echo <<