From ffcb4c18aeca266a08e2a60bc9abbc8c1e16e6d2 Mon Sep 17 00:00:00 2001 From: Jorge Fuentes Date: Fri, 3 Oct 2025 11:10:06 +0200 Subject: [PATCH 1/5] Improve escapeIdentifier performance on long strings by 47x --- packages/pg/lib/utils.js | 37 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index e23a55e9a..4b82af0a7 100644 --- a/packages/pg/lib/utils.js +++ b/packages/pg/lib/utils.js @@ -173,35 +173,22 @@ const escapeIdentifier = function (str) { } const escapeLiteral = function (str) { - let hasBackslash = false - let escaped = "'" - - if (str == null) { - return "''" - } - if (typeof str !== 'string') { return "''" } - - for (let i = 0; i < str.length; i++) { - const c = str[i] - if (c === "'") { - escaped += c + c - } else if (c === '\\') { - escaped += c + c - hasBackslash = true - } else { - escaped += c - } - } - - escaped += "'" - - if (hasBackslash === true) { - escaped = ' E' + escaped + let hasBackslash = false + let escaped = str + .replace(/\\/g, () => { + hasBackslash = true + return '\\\\' + }) + .replace(/'/g, "''") + + if (hasBackslash) { + escaped = ` E'${escaped}'` + } else { + escaped = `'${escaped}'` } - return escaped } From b0db0c15854469623f1b04dd7e69a38d45036b77 Mon Sep 17 00:00:00 2001 From: Jorge Fuentes Date: Fri, 3 Oct 2025 11:25:21 +0200 Subject: [PATCH 2/5] Use both escape versions depending on string length --- packages/pg/lib/utils.js | 41 +++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index 4b82af0a7..6af4eb098 100644 --- a/packages/pg/lib/utils.js +++ b/packages/pg/lib/utils.js @@ -177,19 +177,42 @@ const escapeLiteral = function (str) { return "''" } let hasBackslash = false - let escaped = str - .replace(/\\/g, () => { + if (str.length < 15) { + let escaped = "'" + + for (let i = 0; i < str.length; i++) { + const c = str[i] + if (c === "'") { + escaped += c + c + } else if (c === '\\') { + escaped += c + c hasBackslash = true - return '\\\\' - }) - .replace(/'/g, "''") + } else { + escaped += c + } + } + + escaped += "'" - if (hasBackslash) { - escaped = ` E'${escaped}'` + if (hasBackslash === true) { + escaped = ' E' + escaped + } + return escaped } else { - escaped = `'${escaped}'` + let escaped = str + .replace(/\\/g, () => { + hasBackslash = true + return '\\\\' + }) + .replace(/'/g, "''") + + if (hasBackslash) { + escaped = ` E'${escaped}'` + } else { + escaped = `'${escaped}'` + } + return escaped } - return escaped } module.exports = { From 6896bc9d8edb964937b1c40106caf8cc819ccacb Mon Sep 17 00:00:00 2001 From: Jorge Fuentes Date: Fri, 3 Oct 2025 11:32:52 +0200 Subject: [PATCH 3/5] Reduce the short string cap --- packages/pg/lib/utils.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index 6af4eb098..78296443e 100644 --- a/packages/pg/lib/utils.js +++ b/packages/pg/lib/utils.js @@ -177,7 +177,8 @@ const escapeLiteral = function (str) { return "''" } let hasBackslash = false - if (str.length < 15) { + if (str.length < 13) { + // This methid is a bit faster for short strings let escaped = "'" for (let i = 0; i < str.length; i++) { From 6683d7582645b871f5bc95526b0fd5bdbe70bd4d Mon Sep 17 00:00:00 2001 From: Jorge Fuentes Date: Mon, 6 Oct 2025 22:06:46 +0200 Subject: [PATCH 4/5] Simplify escapeLiteral and remove trailing spaces --- packages/pg/lib/utils.js | 46 ++++++++++------------------------------ 1 file changed, 11 insertions(+), 35 deletions(-) diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index 78296443e..2db330c1f 100644 --- a/packages/pg/lib/utils.js +++ b/packages/pg/lib/utils.js @@ -177,43 +177,19 @@ const escapeLiteral = function (str) { return "''" } let hasBackslash = false - if (str.length < 13) { - // This methid is a bit faster for short strings - let escaped = "'" - - for (let i = 0; i < str.length; i++) { - const c = str[i] - if (c === "'") { - escaped += c + c - } else if (c === '\\') { - escaped += c + c - hasBackslash = true - } else { - escaped += c - } - } - - escaped += "'" - - if (hasBackslash === true) { - escaped = ' E' + escaped - } - return escaped + let escaped = str + .replace(/\\/g, () => { + hasBackslash = true + return '\\\\' + }) + .replace(/'/g, "''") + + if (hasBackslash) { + escaped = ` E'${escaped}'` } else { - let escaped = str - .replace(/\\/g, () => { - hasBackslash = true - return '\\\\' - }) - .replace(/'/g, "''") - - if (hasBackslash) { - escaped = ` E'${escaped}'` - } else { - escaped = `'${escaped}'` - } - return escaped + escaped = `'${escaped}'` } + return escaped } module.exports = { From 864827904444e882db840b976704e7cee16ff28f Mon Sep 17 00:00:00 2001 From: Jorge Fuentes Date: Mon, 6 Oct 2025 23:13:31 +0200 Subject: [PATCH 5/5] Simplify escapeLiteral --- packages/pg/lib/utils.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index 2db330c1f..18a3c6f2d 100644 --- a/packages/pg/lib/utils.js +++ b/packages/pg/lib/utils.js @@ -183,13 +183,7 @@ const escapeLiteral = function (str) { return '\\\\' }) .replace(/'/g, "''") - - if (hasBackslash) { - escaped = ` E'${escaped}'` - } else { - escaped = `'${escaped}'` - } - return escaped + return hasBackslash ? ` E'${escaped}'` : `'${escaped}'` } module.exports = {