guard numeric casts for postgres text fields

This commit is contained in:
Kevin Gatera 2026-03-02 18:20:58 -05:00
parent 15d2715a74
commit 8b3f67b7c9
No known key found for this signature in database
GPG key ID: F0D9F5932458CFB9
4 changed files with 42 additions and 25 deletions

View file

@ -61,6 +61,20 @@ function jsonPathNumber(columnExpression, pathSegments, sequelize) {
return `json_extract(${columnExpression}, '$.${[].concat(pathSegments).join('.')}')`
}
function safeTextToDoubleExpression(columnExpression, sequelize) {
if (isPostgres(sequelize)) {
return `CASE WHEN BTRIM(${columnExpression}) ~ '^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)$' THEN BTRIM(${columnExpression})::double precision ELSE NULL END`
}
return `CAST(${columnExpression} AS FLOAT)`
}
function safeTextToIntegerExpression(columnExpression, sequelize) {
if (isPostgres(sequelize)) {
return `CASE WHEN BTRIM(${columnExpression}) ~ '^[+-]?\\d+$' THEN BTRIM(${columnExpression})::integer ELSE NULL END`
}
return `CAST(${columnExpression} AS INTEGER)`
}
module.exports = {
getDialect,
isPostgres,
@ -71,5 +85,7 @@ module.exports = {
jsonArrayContainsValue,
jsonArrayExpand,
jsonPathText,
jsonPathNumber
jsonPathNumber,
safeTextToDoubleExpression,
safeTextToIntegerExpression
}