Subject: [PATCH v1 1/2] libpq-oauth: collapse use_builtin_flow() into a single definition

From: "Jonathan Gonzalez V." <[email-masked]>
Date: Wed, 1 Jul 2026 12:31:55 +0200

There was three separated definition of the function making lcov v2.x fail
with an error.
---
 src/interfaces/libpq/fe-auth-oauth.c | 61 +++++++++++-----------------
 1 file changed, 24 insertions(+), 37 deletions(-)

diff --git a/src/interfaces/libpq/fe-auth-oauth.c b/src/interfaces/libpq/fe-auth-oauth.c
index 826f7461cb3..7a35647feb8 100644
--- a/src/interfaces/libpq/fe-auth-oauth.c
+++ b/src/interfaces/libpq/fe-auth-oauth.c
@@ -833,41 +833,42 @@ cleanup_oauth_flow(PGconn *conn)
  * failure, and positive indicates success.
  */
 
-#if !defined(USE_LIBCURL)
+#if defined(USE_LIBCURL) && defined(USE_DYNAMIC_OAUTH)
 
 /*
- * This configuration doesn't support the builtin flow.
+ * Use the builtin flow in the libpq-oauth plugin, which is loaded at runtime.
  */
 
-static int
-use_builtin_flow(PGconn *conn, fe_oauth_state *state, PGoauthBearerRequestV2 *request)
-{
-	return 0;
-}
+typedef char *(*libpq_gettext_func) (const char *msgid);
 
-#elif defined(USE_DYNAMIC_OAUTH)
+#elif defined(USE_LIBCURL)
 
 /*
- * Use the builtin flow in the libpq-oauth plugin, which is loaded at runtime.
+ * For static builds, we can just call pg_start_oauthbearer() directly. It's
+ * provided by libpq-oauth.a.
  */
+extern int	pg_start_oauthbearer(PGconn *conn, PGoauthBearerRequestV2 *request);
 
-typedef char *(*libpq_gettext_func) (const char *msgid);
+#endif
 
-/*
- * Loads the libpq-oauth plugin via dlopen(), initializes it, and plugs its
- * callbacks into the connection's async auth handlers.
- *
- * Failure to load here results in a relatively quiet connection error, to
- * handle the use case where the build supports loading a flow but a user does
- * not want to install it. Troubleshooting of linker/loader failures can be done
- * via PGOAUTHDEBUG.
- *
- * The lifetime of *request ends shortly after this call, so it must be copied
- * to longer-lived storage.
- */
 static int
 use_builtin_flow(PGconn *conn, fe_oauth_state *state, PGoauthBearerRequestV2 *request)
 {
+#if !defined(USE_LIBCURL)
+	return 0;
+#elif defined(USE_DYNAMIC_OAUTH)
+	/*
+	 * Load the libpq-oauth plugin via dlopen(), initialize it, and plug its
+	 * callbacks into the connection's async auth handlers.
+	 *
+	 * Failure to load here results in a relatively quiet connection error, to
+	 * handle the use case where the build supports loading a flow but a user
+	 * does not want to install it. Troubleshooting of linker/loader failures
+	 * can be done via PGOAUTHDEBUG.
+	 *
+	 * The lifetime of *request ends shortly after this call, so it must be
+	 * copied to longer-lived storage.
+	 */
 	static bool initialized = false;
 	static pthread_mutex_t init_mutex = PTHREAD_MUTEX_INITIALIZER;
 	int			lockerr;
@@ -976,24 +977,10 @@ use_builtin_flow(PGconn *conn, fe_oauth_state *state, PGoauthBearerRequestV2 *re
 	}
 
 	return (start_flow(conn, request) == 0) ? 1 : -1;
-}
-
 #else
-
-/*
- * For static builds, we can just call pg_start_oauthbearer() directly. It's
- * provided by libpq-oauth.a.
- */
-
-extern int	pg_start_oauthbearer(PGconn *conn, PGoauthBearerRequestV2 *request);
-
-static int
-use_builtin_flow(PGconn *conn, fe_oauth_state *state, PGoauthBearerRequestV2 *request)
-{
 	return (pg_start_oauthbearer(conn, request) == 0) ? 1 : -1;
-}
-
 #endif							/* USE_LIBCURL */
+}

 /*
-- 
2.53.0

--=-=-=
Content-Type: text/x-diff
Content-Disposition: attachment;
 filename=v1-0002-Collapse-SH_CREATE-into-a-single-definition.patch