From db00dcf8afbd80e8087364deba67086d23ca28fc Mon Sep 17 00:00:00 2001
From: avallete <andrew.valleteau@supabase.io>
Date: Wed, 9 Apr 2025 15:03:07 +0200
Subject: [PATCH] fix: add a maximum query time limit

---
 src/server/constants.ts | 2 ++
 src/server/utils.ts     | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/src/server/constants.ts b/src/server/constants.ts
index 298f372e..4d1965f9 100644
--- a/src/server/constants.ts
+++ b/src/server/constants.ts
@@ -16,6 +16,7 @@ const PG_META_DB_PASSWORD = (await getSecret('PG_META_DB_PASSWORD')) || 'postgre
 const PG_META_DB_SSL_MODE = process.env.PG_META_DB_SSL_MODE || 'disable'
 
 const PG_CONN_TIMEOUT_SECS = Number(process.env.PG_CONN_TIMEOUT_SECS || 15)
+const PG_QUERY_TIMEOUT_SECS = Number(process.env.PG_QUERY_TIMEOUT_SECS || 55)
 
 export let PG_CONNECTION = process.env.PG_META_DB_URL
 if (!PG_CONNECTION) {
@@ -58,6 +59,7 @@ export const PG_META_MAX_RESULT_SIZE = process.env.PG_META_MAX_RESULT_SIZE_MB
 export const DEFAULT_POOL_CONFIG: PoolConfig = {
   max: 1,
   connectionTimeoutMillis: PG_CONN_TIMEOUT_SECS * 1000,
+  query_timeout: PG_QUERY_TIMEOUT_SECS * 1000,
   ssl: PG_META_DB_SSL_ROOT_CERT ? { ca: PG_META_DB_SSL_ROOT_CERT } : undefined,
   application_name: `postgres-meta ${pkg.version}`,
   maxResultSize: PG_META_MAX_RESULT_SIZE,
diff --git a/src/server/utils.ts b/src/server/utils.ts
index 00888335..cc8de839 100644
--- a/src/server/utils.ts
+++ b/src/server/utils.ts
@@ -29,6 +29,8 @@ export function translateErrorToResponseCode(
     return 504
   } else if (error.message === 'sorry, too many clients already') {
     return 503
+  } else if (error.message === 'Query read timeout') {
+    return 408
   }
   return defaultResponseCode
 }