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

  1. 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).
  2. Upgrade `wmill` — newer versions of `datatable serve` may support additional frontend message codes.
  3. Use a plain driver/connection that issues only simple Query or basic extended-query messages (Parse/Bind/Execute/Sync).
  4. 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

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


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/a0d5ec24777fd609. Report an issue: GitHub.