diff --git a/apps/sim/lib/table/sql.ts b/apps/sim/lib/table/sql.ts index e21d6c68968..2fea3559b20 100644 --- a/apps/sim/lib/table/sql.ts +++ b/apps/sim/lib/table/sql.ts @@ -322,10 +322,15 @@ function buildComparisonClause( return sql`(${sql.raw(`${tableName}.data->>'${escapedField}'`)})::numeric ${sql.raw(operator)} ${value}` } +/** Escapes LIKE/ILIKE wildcard characters so they match literally */ +function escapeLikePattern(value: string): string { + return value.replace(/[\\%_]/g, '\\$&') +} + /** Builds case-insensitive pattern match: `data->>'field' ILIKE '%value%'` */ function buildContainsClause(tableName: string, field: string, value: string): SQL { const escapedField = field.replace(/'/g, "''") - return sql`${sql.raw(`${tableName}.data->>'${escapedField}'`)} ILIKE ${`%${value}%`}` + return sql`${sql.raw(`${tableName}.data->>'${escapedField}'`)} ILIKE ${`%${escapeLikePattern(value)}%`}` } /**