Thread
-
Support named (destination) portals in extended proto for psql meta commands.
Kirill Reshke <reshkekirill@gmail.com> — 2025-12-13T08:55:45Z
I am a big fan of psql extended proto meta commands feature [0], and I frequently use these psql commands for testing purposes while developing [1] & [2]. Recently I had to support and test some more named portals (cursor) use-cases for [1]. And I faced a problem, that there is no way to test extended query bind commands for non-empty destination portal. So, I propose to add a psql meta command just for that purpose. Something like \bind_cursor CURSOR_NAME STMT_NAME [params..] Per doc [3] ``` The Bind message gives the name of the source prepared statement (empty string denotes the unnamed prepared statement), the name of the destination portal (empty string denotes the unnamed portal), and the values to use for any parameter placeholders present in the prepared statement. ``` I did actually start to implement this, but I faced the issue with libpq. The thing is, PQsendQueryParams does not support non-unnamed portal (cursor) case, and its workhorse, PQsendQueryGuts also. In fact, in PQsendQueryGuts we always send empty portal name ``` /* Construct the Bind message */ if (pqPutMsgStart(PqMsg_Bind, conn) < 0 || pqPuts("", conn) < 0 || pqPuts(stmtName, conn) < 0) goto sendFailed; ``` Per [4] the first string is the name of the destination portal and PQsendQueryGuts always send empty strings. I did some archeology only to find that the PQsendQueryParams declaration did not change since [5]. So, sending non-empty portal names was never supported in libpq? It makes me think there was a good reason for that. Can somebody please clarify on that? If that's ok, I will proceed with sending patches for libpq and psql to support $subj, if no complains. [0] https://git.postgresql.org/cgit/postgresql.git/commit/?id=d55322b0da60a8798ffdb8b78ef90db0fb5be18e [1] https://github.com/pg-sharding/spqr/pulls [2] https://github.com/yandex/odyssey [3] https://www.postgresql.org/docs/current/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY [4] https://www.postgresql.org/docs/current/protocol-message-formats.html [5] https://git.postgresql.org/cgit/postgresql.git/commit/?id=efc3a25bb02a -- Best regards, Kirill Reshke