↑↓ select↵ open⌫ change scopeOpen full search

PG.CENTER connects PostgreSQL documentation, reference, and ecosystem knowledge. Maintained by Pigsty.

Wiki / SQLSTATE

42P08 — Ambiguous parameter type

42P08 (ambiguous_parameter) means a parameter marker exists, but parse analysis cannot make its type consistent or specific enough. The exact SQLSTATE and parser branch matter because similar primary text can be emitted by a different condition.

English manual coverage begins with PostgreSQL 8.1. Source history and runtime observations have their own recorded version boundaries.

Reading PG 18·Select a recorded version

aliases
Unknown
class name
Syntax Error or Access Rule Violation
condition name
ambiguous_parameter
lang
en
sqlstate
42P08

Definition PG 18

42P08 — Ambiguous parameter type

At a glance {#at-a-glance}

42P08 (ambiguous_parameter) means a parameter marker exists, but parse analysis cannot make its type consistent or specific enough. The exact SQLSTATE and parser branch matter because similar primary text can be emitted by a different condition.

Meaning {#meaning}

The variable-parameter coercion hook first records a target type for an unknown parameter. If a later context requests a different type, it raises ERROR inconsistent types deduced for parameter $%d with DETAIL %s versus %s. A later parameter-resolution walk raises ERROR could not determine data type of parameter $%d when the resolved parameter type does not match the externally supplied type array. These are two selected 42P08 guards, not one generic “bind failed” message.

The primary could not determine data type of parameter $%d also appears in the var-parameter completion check in postgres.c with ERRCODE_INDETERMINATE_DATATYPE (42P18). Read the SQLSTATE and source path together: 42P08 is the selected mismatch during parameter resolution, while 42P18 is an unresolved type after analysis; an out-of-range marker is 42P02.

Diagnosis {#diagnosis}

Record the parameter number, every expression context, and DETAIL. For the inconsistent-types branch, compare the two type names in DETAIL and find the contexts that imposed them. For the unresolved-type branch, inspect the PREPARE/extended-query parameter type array and the final inferred type. Keep missing markers (42P02), Bind count violations (08P01), and alias/column ambiguity separate from this type-resolution failure.

Response {#response}

Declare the parameter type in PREPARE or cast it at a deliberate expression boundary. If two contexts genuinely need different types, split the parameters; otherwise make the contexts agree. Do not cast to an arbitrary broad type: verify operators, indexes, null semantics, and serialization. If the ERROR occurred inside an explicit transaction, roll back to a suitable savepoint or roll back the transaction before retrying.

Messages {#messages}

The selected 42P08 variants are explicit ERRORs:

| Guard | Primary | DETAIL | | --- | --- | --- | | conflicting inferred target types | inconsistent types deduced for parameter $%d | %s versus %s | | final parameter type mismatch | could not determine data type of parameter $%d | none |

The same second primary can carry 42P18 when emitted by the separate unresolved-type completion guard; the SQLSTATE is part of the message identity.

Versions {#versions}

From 7.4 through 18.6 and 19beta3; that catalogue range is not a precise introduction claim. The selected two 42P08 guards and the nearby 42P18 boundary are fixed 18.6 source paths; no runtime parameter case was run.

Related {#related}

Sources {#sources}

  • src.errcodes.42P08.18.6 — src/backend/utils/errcodes.txt line 388, fixed at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba (source).

  • src.call.42P08.c2cfa81ed9389a1bddf8ec41 — src/backend/parser/parse_param.c lines 220-227, fixed at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 4aab2ecc770fcda619b26ac12beaf7e527542b56f55eb45879b72e92442e8a28 (source).

  • src.call.42P08.18ba6576d169dfdf614df72d — src/backend/parser/parse_param.c lines 308-312, fixed at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 4aab2ecc770fcda619b26ac12beaf7e527542b56f55eb45879b72e92442e8a28 (source).

  • src.call.42P08.unresolved-boundary — src/backend/tcop/postgres.c lines 725-736, fixed at 724edf9bde9d356724ad384a2e196edc3c9f80f7; SHA-256 9fb62275b1badf94d01ab351337b60410cd9b3ab1fe63fa9f23d6d2185a21061 (source).

  • src.calls.REL_18_6.42P08 — resolved core call groups; SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf.

  • authored evidence — source claims, message roles, and runtime boundary.

Compare versions

SQLSTATE evidence and recorded runtime versions

claims · identity.class-and-condition
{
  "claim_id": "identity.class-and-condition",
  "limits": "Identity does not enumerate all source branches or client failures.",
  "method": "Read fixed REL_18_6 errcodes.txt and locked facts.",
  "position": 0,
  "runtime": [],
  "sources": [
    "src.errcodes.42P08.18.6"
  ],
  "statement": "42P08 is the ambiguous_parameter condition in Class 42."
}
claims · mechanism.selected-source-path
{
  "claim_id": "mechanism.selected-source-path",
  "limits": "Representative confirmed core paths only; not exhaustive historical or extension coverage.",
  "method": "Read complete resolved REL_18_6 report groups and message roles.",
  "position": 1,
  "runtime": [],
  "sources": [
    "src.call.42P08.c2cfa81ed9389a1bddf8ec41",
    "src.call.42P08.18ba6576d169dfdf614df72d",
    "src.call.42P08.unresolved-boundary"
  ],
  "statement": "The selected 42P08 guards are conflicting inferred types, reporting `inconsistent types deduced for parameter $%d` with DETAIL `%s versus %s`, and a later parameter-resolution mismatch, reporting `could not determine data type of parameter $%d`; both are ERRORs. The same second primary is emitted with 42P18 by the separate var-parameter completion guard when a type remains unknown after analysis, while an out-of-range marker is 42P02."
}
claims · versions.catalogue-boundary
{
  "claim_id": "versions.catalogue-boundary",
  "limits": "First observed release is a lower bound, not precise behavioral introduction.",
  "method": "Read locked catalogue facts and definition snapshots.",
  "position": 2,
  "runtime": [],
  "sources": [
    "src.errcodes.42P08.18.6"
  ],
  "statement": "From 7.4 through 18.6 and 19beta3; this catalogue range is not a precise introduction claim. The selected two 42P08 guards and nearby 42P18 boundary are fixed 18.6 source paths and no runtime parameter case was run."
}
messages · message.variant-1
{
  "limits": "Placeholders remain dynamic source fields; no concrete runtime value is claimed.",
  "message_id": "message.variant-1",
  "path": "",
  "position": 0,
  "raw": {
    "detail_templates": [
      "%s versus %s"
    ],
    "hint_templates": [],
    "id": "message.variant-1",
    "limits": "Placeholders remain dynamic source fields; no concrete runtime value is claimed.",
    "primary_template": "inconsistent types deduced for parameter $%d",
    "roles": [
      {
        "role": "errmsg",
        "template": "inconsistent types deduced for parameter $%d"
      },
      {
        "role": "errdetail",
        "template": "%s versus %s"
      }
    ],
    "severity_source": "explicit ERROR",
    "sources": [
      "src.call.42P08.c2cfa81ed9389a1bddf8ec41"
    ],
    "sqlstate": "42P08"
  },
  "severity": "explicit ERROR",
  "sources": [
    "src.call.42P08.c2cfa81ed9389a1bddf8ec41"
  ],
  "templates": [
    {
      "kind": "primary",
      "literal": "inconsistent types deduced for parameter $",
      "position": 0,
      "role": "",
      "template": "inconsistent types deduced for parameter $%d"
    },
    {
      "kind": "detail",
      "literal": "versus",
      "position": 1,
      "role": "",
      "template": "%s versus %s"
    },
    {
      "kind": "primary",
      "literal": "versus",
      "position": 2,
      "role": "errdetail",
      "template": "%s versus %s"
    }
  ]
}
messages · message.variant-2
{
  "limits": "Placeholders remain dynamic source fields; no concrete runtime value is claimed.",
  "message_id": "message.variant-2",
  "path": "",
  "position": 1,
  "raw": {
    "detail_templates": [],
    "hint_templates": [],
    "id": "message.variant-2",
    "limits": "Placeholders remain dynamic source fields; no concrete runtime value is claimed.",
    "primary_template": "could not determine data type of parameter $%d",
    "roles": [
      {
        "role": "errmsg",
        "template": "could not determine data type of parameter $%d"
      }
    ],
    "severity_source": "explicit ERROR",
    "sources": [
      "src.call.42P08.18ba6576d169dfdf614df72d"
    ],
    "sqlstate": "42P08"
  },
  "severity": "explicit ERROR",
  "sources": [
    "src.call.42P08.18ba6576d169dfdf614df72d"
  ],
  "templates": [
    {
      "kind": "primary",
      "literal": "could not determine data type of parameter $",
      "position": 0,
      "role": "",
      "template": "could not determine data type of parameter $%d"
    }
  ]
}
sources · src.errcodes.42P08.18.6
{
  "commit": "724edf9bde9d356724ad384a2e196edc3c9f80f7",
  "docs_url": "",
  "kind": "upstream_source",
  "location": "line 388",
  "path": "src/backend/utils/errcodes.txt",
  "position": 0,
  "sha256": "6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba",
  "source_id": "src.errcodes.42P08.18.6",
  "tag": "REL_18_6",
  "url": "https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt#L388"
}
sources · src.call.42P08.c2cfa81ed9389a1bddf8ec41
{
  "commit": "724edf9bde9d356724ad384a2e196edc3c9f80f7",
  "docs_url": "",
  "kind": "upstream_source",
  "location": "lines 220-227",
  "path": "src/backend/parser/parse_param.c",
  "position": 1,
  "sha256": "4aab2ecc770fcda619b26ac12beaf7e527542b56f55eb45879b72e92442e8a28",
  "source_id": "src.call.42P08.c2cfa81ed9389a1bddf8ec41",
  "tag": "REL_18_6",
  "url": "https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/parse_param.c#L220-L227"
}
sources · src.call.42P08.18ba6576d169dfdf614df72d
{
  "commit": "724edf9bde9d356724ad384a2e196edc3c9f80f7",
  "docs_url": "",
  "kind": "upstream_source",
  "location": "lines 308-312",
  "path": "src/backend/parser/parse_param.c",
  "position": 2,
  "sha256": "4aab2ecc770fcda619b26ac12beaf7e527542b56f55eb45879b72e92442e8a28",
  "source_id": "src.call.42P08.18ba6576d169dfdf614df72d",
  "tag": "REL_18_6",
  "url": "https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/parse_param.c#L308-L312"
}
sources · src.call.42P08.unresolved-boundary
{
  "commit": "724edf9bde9d356724ad384a2e196edc3c9f80f7",
  "docs_url": "",
  "kind": "upstream_source",
  "location": "lines 725-736",
  "path": "src/backend/tcop/postgres.c",
  "position": 3,
  "sha256": "9fb62275b1badf94d01ab351337b60410cd9b3ab1fe63fa9f23d6d2185a21061",
  "source_id": "src.call.42P08.unresolved-boundary",
  "tag": "REL_18_6",
  "url": "https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/tcop/postgres.c#L725-L736"
}
sources · src.calls.REL_18_6.42P08
{
  "commit": "",
  "docs_url": "",
  "kind": "local_artifact",
  "location": "",
  "path": "raw/calls/REL_18_6.jsonl",
  "position": 4,
  "sha256": "9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf",
  "source_id": "src.calls.REL_18_6.42P08",
  "tag": "",
  "url": ""
}

Source references

Full definition and evidence JSON

Definition sources

center · PostgreSQL 18 · english-manuals:6ffa6b61afc02e941ff4b656ec7f118ce6739e4ba078946098c784c9176fe3c7

Text language: en · english-manuals:6ffa6b61afc02e941ff4b656ec7f118ce6739e4ba078946098c784c9176fe3c7