windmill-labs/windmill · error
0A000
0A000
Error message
Postgres message code 0x${code.toString(16).padStart(2, "0")} is not supported by 'wmill datatable serve' What it means
`wmill datatable serve` implements a Postgres wire-protocol server, and this error is thrown by `handleConnection` when the client sends a frontend message code the emulator does not implement. The SQLSTATE `0A000` (feature_not_supported) plus the message is returned to the client so the driver reports which message code was unsupported.
Source
Thrown at cli/src/commands/datatable/serve.ts:253
data,
preparedStatements,
portals,
(query) => runQueryEnvelope(workspaceId, datatableName, query),
);
case FE_EXECUTE:
return await handleExecuteMessage(
data,
portals,
(query) => runQueryEnvelope(workspaceId, datatableName, query),
);
case FE_CLOSE:
return handleCloseMessage(data, preparedStatements, portals);
case FE_FLUSH:
return new Uint8Array(0);
case FE_SYNC:
return buildReadyForQuery("I");
default:
throw createPgProtocolError(
`Postgres message code 0x${code.toString(16).padStart(2, "0")} is not supported by 'wmill datatable serve'`,
"0A000",
);
}
} catch (err) {
const includeReadyForQuery = code === FE_QUERY;
waitingForSyncAfterError = !includeReadyForQuery;
return buildPgErrorResponse(err, includeReadyForQuery);
}
},
});
}
const FE_QUERY = 0x51; // 'Q'
const FE_PARSE = 0x50; // 'P'
const FE_BIND = 0x42; // 'B'
const FE_CLOSE = 0x43; // 'C'
const FE_DESCRIBE = 0x44; // 'D'View on GitHub (pinned to e474e8803c)
Solutions
- Identify the client tool/driver from the hex code in the message and avoid the feature (e.g. drop `\copy`, use plain SELECT and export client-side).
- Upgrade `wmill` — newer versions of `datatable serve` may support additional frontend message codes.
- Use a plain driver/connection that issues only simple Query or basic extended-query messages (Parse/Bind/Execute/Sync).
- If the code arrives at connection start, ensure any SSL/GSS negotiation wrapper is disabled (e.g. `sslmode=disable`) so negotiation bytes are not parsed as a message code.
Example fix
// before psql "postgres://..." -c "\copy tbl to 'out.csv'" // after psql "postgres://...?sslmode=disable" -c "SELECT * FROM tbl" --csv > out.csv
Defensive patterns
Strategy: fallback
Try / catch
let rows;
try {
rows = await client.query('SELECT * FROM tbl');
} catch (err) {
if (err.code === '0A000' || /not supported by 'wmill datatable serve'/.test(err.message)) {
rows = await client.query(simpleEquivalentSql); // avoid COPY/extended features
} else {
throw err;
}
} Prevention
- Use only standard SELECT queries against `wmill datatable serve`.
- Avoid psql meta-commands like \copy and server-side COPY.
- Connect with sslmode=disable so negotiation bytes are not misread as protocol messages.
- Keep wmill up to date so newly supported message codes are available.
When it happens
Trigger: A Postgres client/driver sends a frontend protocol message outside the supported set (only Query/Parse/Bind/Describe/Execute/Close/Sync/Flush/Terminate-style handling exists). Examples: drivers that use extended-protocol features like CopyData/CopyFail during COPY, CancelRequest-style messages on the data connection, FunctionCall, or GSS/SSL negotiation bytes interpreted as a message code.
Common situations: Using `psql` meta-commands or `\copy` that trigger COPY sub-protocol; connecting with a driver that negotiates advanced features (SCRAM channel binding, streaming replication) against the emulator; tools like pg_dump that send FunctionCall or specialized messages.
Related errors
- 26000
- Datatable '${dtName}' already exists in this workspace
- Workspace already has datatable(s): ${existing.map((d) => d.
- unknown replication message byte `{}`
- unknown replica identity byte `{}`
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/a0d5ec24777fd609.
Report an issue: GitHub.