Fixed
- A statement
sql.beginsends after its ownCOMMITorROLLBACKis rejected (#1320). A statement the callback did not await, sent between the transaction'sCOMMITorROLLBACKand the release of its connection, ran outside the transaction, and after a rollback its write was kept. It now rejects withUNSAFE_TRANSACTION, as a statement after the transaction has ended does. - A command after a select in a multi-statement simple query has no columns (#1321). In
sql.unsafe('select …; rollback')theROLLBACKresult had the columns of theSELECTbefore it. - A query queued behind one with an untyped string or boolean parameter resolves on Cloudflare Hyperdrive (#1319). Such a query is described first, and 4.1.0 sent its Bind, Execute and Sync together with the next query, which never resolved through Hyperdrive. On Cloudflare Workers the next query now waits until the described one is done, as in 3.4.9. Other runtimes still pipeline it.
.cursor()yields the rows ofSHOW,EXPLAINand other commands without a row count. Their last batch was only passed on when the command tag had a count, so a cursor over them yielded nothing.PGSSLMODEis kept when a url hassslrootcert,sslcertorsslkey. Such a url without ansslmodeusedrequireeven ifPGSSLMODEwas set, soPGSSLMODE=verify-fulldropped the host name check andPGSSLMODE=disableused TLS.- A connection error without a
stackrejects the waiting queries (#1312). Adding the calling line to such an error threw, so the queries waiting for a connection never settled and the pool stopped retrying. On Bun a DNS error such asEAI_AGAINhas nostack, so a query to a host that doesn't resolve hung forever. - A canceled
sql.batchno longer keeps the process alive forcancel_timeout(#1317, #1318). The timer that waits for the cancel to be answered was left running after the batch rejected, so the process stayed up for 5 seconds aftersql.end(). - A JSON key ending with
_no longer makestoCamelandtoPascalthrow (#1313). Withtransform: postgres.camel, such a key made the whole query throw. The trailing_is now kept, soa_staysa_, and an empty key stays empty instead of becomingundefined.