Thread

  1. 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