diff --git a/lib/gat/configs/pgbouncer/config.go b/lib/gat/configs/pgbouncer/config.go
index 1fb11220bf87ff730aa4776e6449f78f2db8b1bc..6873b34007b9f633a918b9d408a57f57103c8e02 100644
--- a/lib/gat/configs/pgbouncer/config.go
+++ b/lib/gat/configs/pgbouncer/config.go
@@ -292,6 +292,10 @@ func (T *Config) ListenAndServe(pooler *gat.Pooler) error {
 				continue
 			}
 
+			if db.DBName != "" {
+				dbname = db.DBName
+			}
+
 			var poolMode PoolMode
 			if user.PoolMode != "" {
 				poolMode = user.PoolMode
@@ -344,7 +348,7 @@ func (T *Config) ListenAndServe(pooler *gat.Pooler) error {
 
 				// connect over tcp
 				recipe := gat.TCPRecipe{
-					Database:          db.DBName,
+					Database:          dbname,
 					Address:           address,
 					Credentials:       creds,
 					MinConnections:    db.MinPoolSize,
diff --git a/lib/gat/recipe.go b/lib/gat/recipe.go
index 8735fde0517f651c6d5069b49b77acde96744c61..65438046a478e7cd3f06b5f407a4c61830cad925 100644
--- a/lib/gat/recipe.go
+++ b/lib/gat/recipe.go
@@ -37,8 +37,11 @@ func (T TCPRecipe) Connect() (zap.ReadWriter, map[string]string, error) {
 	rw := zap.WrapIOReadWriter(conn)
 
 	parameterStatus := maps.Clone(T.StartupParameters)
+	if parameterStatus == nil {
+		parameterStatus = make(map[string]string)
+	}
 
-	err = backends.Accept(rw, T.Credentials, T.Database, T.StartupParameters)
+	err = backends.Accept(rw, T.Credentials, T.Database, parameterStatus)
 	if err != nil {
 		return nil, nil, err
 	}
diff --git a/lib/util/maps/clone.go b/lib/util/maps/clone.go
index d74c7429cff93dda0a5e395a2687d695950970b1..88e44381dcdb05fa429b6481efa6ac3ccd85c297 100644
--- a/lib/util/maps/clone.go
+++ b/lib/util/maps/clone.go
@@ -1,6 +1,9 @@
 package maps
 
 func Clone[K comparable, V any](value map[K]V) map[K]V {
+	if value == nil {
+		return nil
+	}
 	m := make(map[K]V, len(value))
 	for k, v := range value {
 		m[k] = v