{"record":{"id":"a0d5ec24777fd609","repo":"windmill-labs/windmill","slug":"0a000","errorCode":"0A000","errorMessage":"Postgres message code 0x${code.toString(16).padStart(2, \"0\")} is not supported by 'wmill datatable serve'","messagePattern":"Postgres message code 0x(.+?) is not supported by 'wmill datatable serve'","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/src/commands/datatable/serve.ts","lineNumber":253,"sourceCode":"              data,\n              preparedStatements,\n              portals,\n              (query) => runQueryEnvelope(workspaceId, datatableName, query),\n            );\n          case FE_EXECUTE:\n            return await handleExecuteMessage(\n              data,\n              portals,\n              (query) => runQueryEnvelope(workspaceId, datatableName, query),\n            );\n          case FE_CLOSE:\n            return handleCloseMessage(data, preparedStatements, portals);\n          case FE_FLUSH:\n            return new Uint8Array(0);\n          case FE_SYNC:\n            return buildReadyForQuery(\"I\");\n          default:\n            throw createPgProtocolError(\n              `Postgres message code 0x${code.toString(16).padStart(2, \"0\")} is not supported by 'wmill datatable serve'`,\n              \"0A000\",\n            );\n        }\n      } catch (err) {\n        const includeReadyForQuery = code === FE_QUERY;\n        waitingForSyncAfterError = !includeReadyForQuery;\n        return buildPgErrorResponse(err, includeReadyForQuery);\n      }\n    },\n  });\n}\n\nconst FE_QUERY = 0x51; // 'Q'\nconst FE_PARSE = 0x50; // 'P'\nconst FE_BIND = 0x42; // 'B'\nconst FE_CLOSE = 0x43; // 'C'\nconst FE_DESCRIBE = 0x44; // 'D'","sourceCodeStart":235,"sourceCodeEnd":271,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/cli/src/commands/datatable/serve.ts#L235-L271","documentation":"`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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\npsql \"postgres://...\" -c \"\\copy tbl to 'out.csv'\"\n// after\npsql \"postgres://...?sslmode=disable\" -c \"SELECT * FROM tbl\" --csv > out.csv","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"let rows;\ntry {\n  rows = await client.query('SELECT * FROM tbl');\n} catch (err) {\n  if (err.code === '0A000' || /not supported by 'wmill datatable serve'/.test(err.message)) {\n    rows = await client.query(simpleEquivalentSql); // avoid COPY/extended features\n  } else {\n    throw err;\n  }\n}","preventionTips":["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."],"tags":["postgres","wire-protocol","cli","datatable","protocol"],"backgroundTag":"unsupported-protocol-message","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}