# F0000 — config_file_error

> Source-backed full reference for PostgreSQL SQLSTATE F0000.
---

# F0000

## At a glance {#at-a-glance}

`F0000` is the configuration-file error condition, but its severity and recovery boundary depend on the owner. Fixed core paths include a recovery-target failure and OAuth HBA validation; the unaccent contrib dictionary has its own file-open and rule-parser paths.

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| Field | Value |
| --- | --- |
| SQLSTATE | `F0000` |
| Condition | `config_file_error` |
| Status | `active` |
| Known present by | `7.4` |
| Locked snapshots | `9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3` |
| Macros | `ERRCODE_CONFIG_FILE_ERROR` |
| Aliases | `—` |

<!-- source facts: data/errcodes/F0000.json -->
<!-- END SQLSTATE FACTS -->

## Meaning {#meaning}

The recovery path emits `FATAL` when archive recovery ends before a configured target is reached. OAuth validation calls `ereport(elevel)`: HBA parsing supplies the level, `load_hba()` logs parse errors while retaining the old rules on reload, and initial postmaster startup turns a failed HBA load into a separate `FATAL` that prevents startup. The unaccent loader reports an `ERROR` when it cannot open its rules file, while duplicate rules and malformed rule lines are `WARNING` conditions with this SQLSTATE.

These are configuration-owner-specific paths. A line number and file context belong to HBA parsing; `%m` belongs to the dictionary file-open operation; a recovery-target message has neither of those fields.

## Messages {#messages}

- **FATAL**, SQLSTATE `F0000`: `recovery ended before configured recovery target was reached`.
- **`elevel` selected by HBA loading**, with SQLSTATE `F0000`: `oauth_validator_libraries must be set for authentication method %s`; context `line %d of configuration file "%s"`.
- **`elevel` selected by HBA loading**: `invalid list syntax in parameter "%s"`.
- **`elevel` selected by HBA loading**: `authentication method "oauth" requires argument "validator" to be set when oauth_validator_libraries contains multiple options`; context `line %d of configuration file "%s"`.
- **ERROR**, SQLSTATE `F0000`: `could not open unaccent file "%s": %m`.
- **WARNING**, SQLSTATE `F0000`: `duplicate source strings, first one will be used`.
- **WARNING**, SQLSTATE `F0000`: `invalid syntax: more than two strings in unaccent rule` or `invalid syntax: unfinished quoted string in unaccent rule`.

The OAuth templates use `ereport(elevel)`, so the source function alone does not turn every HBA event into `ERROR` or `FATAL`; the startup/reload caller determines the operational boundary.

## Diagnosis {#diagnosis}

Keep the complete primary, detail, hint, context, file name, line number, subsystem, and phase. For recovery, inspect the configured target and available WAL/archive. For OAuth, inspect the HBA line and `oauth_validator_libraries` value; distinguish an empty list from list syntax and from a missing `validator` argument. For unaccent, check the resolved rules path, permissions, encoding, and rule format; a warning can leave the dictionary loaded with a first-rule-wins or skipped-line behavior.

## Response {#response}

Fix the named configuration using its owning format and keep a known-good copy. A recovery-target `FATAL` or initial HBA-load `FATAL` ends startup, so there is no client transaction to roll back; correct the target/configuration and restart, then use a new connection. An HBA reload parse failure is logged and the old rules remain active, so repair the file and reload again rather than assuming the new rules took effect. An unaccent `ERROR` inside an explicit client transaction requires `ROLLBACK` or an existing savepoint before continuing; warning paths do not require rollback, but their skipped or duplicate rules should be reviewed before relying on the dictionary.

## Versions {#versions}

The locked catalogue records this condition from 7.4; fixed source coverage is PostgreSQL 18.6. No startup, reload, or dictionary failure was induced for this source-only page.

## Related {#related}

[`58P01`](../58p01/), [`F0001`](../f0001/), [`57P03`](../57p03/)

## Sources {#sources}

[`src/backend/access/transam/xlogrecovery.c#L1921-L1931`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/access/transam/xlogrecovery.c#L1921)

[`src/backend/libpq/auth-oauth.c#L813-L870`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/libpq/auth-oauth.c#L813)

[`src/backend/libpq/hba.c#L2635-L2692`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/libpq/hba.c#L2635)

[`src/backend/postmaster/postmaster.c#L1327-L1338`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/postmaster/postmaster.c#L1327)

[`contrib/unaccent/unaccent.c#L65-L109`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/contrib/unaccent/unaccent.c#L65)

[`contrib/unaccent/unaccent.c#L260-L271`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/contrib/unaccent/unaccent.c#L260)

The structured [evidence record](../data/evidence/f0000.json) records the fixed message groups, caller-selected severity, and source/runtime boundary.
