Skip to content

Diagnostics and error codes

SQLBraid runtime/compiler errors expose a code where their error type defines one. Thin adapter capability errors use UnsupportedFeatureError with a stable BRAID_* code. Driver errors retain their original identity.

Binding construction failures (placeholder generation, hint mapping, typed request construction, or unsupported transport selection) happen at materialize, before lease acquisition or driver I/O. Driver/server/network failures remain driver. Materialization errors have executionStarted === false and executionCompleted === false.

The exported PUBLIC_ERROR_DEFINITIONS registry is the source of truth for this reference. Runtime-owned classes include DatabaseScopeError, DatabaseResultKindError, DatabaseResultValidationError, ResultExactnessError, and RoutineMappingError. Adapter capability failures use UnsupportedFeatureError; its feature identifies the capability and its code is stable. Driver errors are not wrapped, and an already-aborted AbortSignal rejects with its original reason. Adapter input/transport failures use the AdapterError (TypeError) class when they expose a stable bind code.

Code Meaning
BRAID_RESULT_EXACTNESS A result value could not be represented without loss.
BRAID_RESULT_KIND Declared result kind disagreed with the adapter result after execution.
BRAID_RESULT_SETS_UNSUPPORTED An ordinary query or stream returned an additional statement/result set; use db.call() for ordered routine sets.
BRAID_RESULT_VALIDATION Query-bound or execution-level Standard Schema validation failed.
BRAID_BATCH_ABORTED A batch item that had already announced query:ready was abandoned because another operation or shared batch phase failed. executionStarted and executionCompleted distinguish whether the item itself executed.
BRAID_CALL_UNSUPPORTED The adapter does not expose routine calls.
BRAID_STREAM_UNSUPPORTED The adapter does not expose a streaming protocol.
BRAID_CANCEL_UNSUPPORTED An active signal was supplied but the adapter cannot cancel the physical statement. Rejection occurs before I/O.
BRAID_SESSION_UNSUPPORTED The adapter/provider cannot pin a session lease.
BRAID_SESSION_SCOPE The root database escaped an active session scope.
BRAID_SESSION_CLOSED A session callback handle was used after its callback ended.
BRAID_TX_UNSUPPORTED The adapter cannot begin a transaction.
BRAID_TX_OPTIONS_INVALID Runtime transaction options are malformed (TypeError); validation occurs before lease acquisition.
BRAID_TX_OPTIONS_NESTED Explicit transaction options were supplied inside an active transaction.
BRAID_TX_OPTION_UNSUPPORTED A valid isolation/read-only option is not advertised; the feature identifies transaction.isolation.<level> or transaction.read-only.
BRAID_TX_SCOPE A root/parent/sibling transaction handle escaped the active scope.
BRAID_TX_CLOSED A scoped transaction handle was used after its callback ended.
BRAID_CONNECTION_POISONED Uncertain transaction control poisoned the physical resource.
BRAID_STREAM_SCOPE Streaming attempted overlapping or same-resource work.
BRAID_REENTRY A direct physical resource was re-entered concurrently.
BRAID_CALL_RESULT_SETS A tuple routine declared a different result-set count than the driver returned.
BRAID_CALL_MAP Routine output, return value, or result-set row mapping failed.
BRAID_CALL_CURSOR_TX_REQUIRED A PostgreSQL refcursor call needs an existing transaction-scoped database.
BRAID_CALL_CURSOR_UNSUPPORTED The adapter cannot expose the requested cursor output as an application result set.
BRAID_CALL_RETURN_UNSUPPORTED A return/status schema was requested but no driver return/status channel exists.
BRAID_CALL_OUT_UNSUPPORTED The adapter cannot expose the requested OUT or INOUT parameter carrier.
BRAID_CALL_LOB_UNSUPPORTED Oracle output did not expose the documented LOB carrier.
BRAID_RESOURCE_CLEANUP Driver close, drain, or cancel failed; the physical lease is not safely reusable.
BRAID_PREPARED_NAME A prepared query name is empty or duplicated.
BRAID_PREPARED_SHAPE A prepared query rendered a different logical shape.
BRAID_BIND_HINT_UNSUPPORTED The adapter cannot honor an explicit bind type/facet; rejection occurs before I/O.
BRAID_BIND_VALUE_UNSUPPORTED A value cannot be represented by the selected binding transport.
BRAID_BIND_TYPE_REQUIRED Driver inference is ambiguous, including untyped null in Oracle or SQL Server.
BRAID_INTEGER_MODE_UNSUPPORTED The adapter cannot enable the exact integer read mode required by its contract.
BRAID_BULK_UNSUPPORTED The adapter does not expose the required native bulk capability.
BRAID_DIALECT_MISMATCH A rendered statement belongs to a different selected adapter dialect.
BRAID_RESULT_KIND_AMBIGUOUS The adapter cannot distinguish an empty row result from a command result.
BRAID_EMPTY_LIST sql.list([]) was used without an explicit empty strategy.
BRAID_EMPTY_SET @braid set rendered no assignment.
BRAID_DIALECT A fragment belongs to a different dialect.
BRAID_ASYNC_CONTEXT Guarded lowering would change top-level await/yield evaluation context.
BRAID_DIRECTIVE_UNTERMINATED A directive comment is missing its closing */.
BRAID_DIRECTIVE An @braid directive is empty or unknown.
BRAID_CONDITION A guard does not contain exactly one interpolation with no additional text.
BRAID_ATTRIBUTES Directive attributes are unsupported, malformed, or duplicated.
BRAID_STRUCTURE Directive nesting or branch structure is invalid.
BRAID_HOLE_CONTEXT An interpolation appears inside a SQL literal or comment.
BRAID_SQL_LEX A SQL literal or comment is unterminated.
BRAID_DEPTH Template or rendered-fragment nesting exceeds its configured limit.
BRAID_STRUCTURE_LIMIT Rendered structural items exceed maxStructuralItems.
BRAID_SQL_LIMIT / BRAID_BIND_LIMIT Rendered output exceeds configured limits.

UnsupportedFeatureError has (feature, code, message, options?); its code is constrained to BRAID_${string}. An already-aborted signal rejects with its reason, not with BRAID_CANCEL_UNSUPPORTED. Do not catch an unsupported capability and replace it with buffering, a hidden transaction, guessed routine metadata, or ignored hints.

Compiler diagnostics include source range and severity. CLI JSON uses 1-based positions; LSP uses standard 0-based positions. Missing metadata is open-world evidence, not an invalid-SQL error.