Honor explicit default_query_exec_mode; no forced simple_protocol#144
Honor explicit default_query_exec_mode; no forced simple_protocol#144btipling wants to merge 2 commits into
Conversation
Inject default_query_exec_mode=simple_protocol for postgres scheme URLs in buildConnectionURL so transaction-mode poolers (PgBouncer, Supabase) do not hit SQLSTATE 42P05 prepared-statement conflicts. Explicit DSN/Params values still win; non-postgres schemes unchanged. Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
Connector PR Review: Honor explicit default_query_exec_mode; no forced simple_protocolBlocking Issues: 0 | Suggestions: 0 | Threads Resolved: 0 Review Summary Security Issues: None found. Correctness Issues: None found. Suggestions: None. |
Forced injection broke existing postgres connectors that rely on pgx default cache_statement. Leave the URL unchanged when unset; honor explicit DSN or connect.params values (including simple_protocol for poolers). Update tests, README pooler opt-in guidance, and redshift example caveat. Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
Summary
Postgres/pgx defaults to prepared-statement caching (
cache_statement). Transaction-mode poolers (PgBouncer, Supabase pooler on 6543) needdefault_query_exec_mode=simple_protocolto avoid SQLSTATE 42P05 (prepared statement "stmtcache_*" already exists).This PR is non-breaking. baton-sql does not inject
simple_protocolwhen the mode is unset. Callers that need pooler-safe behavior set the param explicitly.default_query_exec_modeunset (no DSN query key, noconnect.paramskey)connect.paramssimple_protocol,cache_statement,exec, etc.)Pooler opt-in
Or via DSN:
?default_query_exec_mode=simple_protocol.Changes
pkg/database/database.gosimple_protocolwhen unset (removed forced default)pkg/database/database_test.goREADME.mdexamples/redshift-test.ymlTests
Both exit 0.
Context
ds-n4f4Checklist
default_query_exec_modeconnect.paramsstill honored