fix(Postgres Node): Enable non-numeric comparisons for WHERE clause operators (#18544)

This commit is contained in:
荻升
2026-02-05 09:10:38 +00:00
committed by GitHub
parent c7d84d6825
commit 7d51406656
2 changed files with 115 additions and 16 deletions
@@ -217,6 +217,116 @@ describe('Test PostgresV2, addWhereClauses', () => {
);
expect(updatedValues).toEqual(['public', 'my_table', 'id', '1', 'foo', 'select 2']);
});
it('should handle numeric comparison operators', () => {
const query = 'SELECT * FROM $1:name.$2:name';
const values = ['public', 'my_table'];
const whereClauses = [
{ column: 'age', condition: '>', value: '25' },
{ column: 'salary', condition: '>=', value: '50000' },
];
const [updatedQuery, updatedValues] = addWhereClauses(
node,
0,
query,
whereClauses,
values,
'AND',
);
expect(updatedQuery).toEqual(
'SELECT * FROM $1:name.$2:name WHERE $3:name > $4 AND $5:name >= $6',
);
// Values should be converted to numbers
expect(updatedValues).toEqual(['public', 'my_table', 'age', 25, 'salary', 50000]);
});
it('should handle date comparison operators', () => {
const query = 'SELECT * FROM $1:name.$2:name';
const values = ['public', 'my_table'];
const whereClauses = [
{ column: 'created_at', condition: '>=', value: '2025-04-28T00:00:00.000Z' },
{ column: 'updated_at', condition: '<', value: '2025-05-01' },
];
const [updatedQuery, updatedValues] = addWhereClauses(
node,
0,
query,
whereClauses,
values,
'AND',
);
expect(updatedQuery).toEqual(
'SELECT * FROM $1:name.$2:name WHERE $3:name >= $4 AND $5:name < $6',
);
// Date strings should remain as strings
expect(updatedValues).toEqual([
'public',
'my_table',
'created_at',
'2025-04-28T00:00:00.000Z',
'updated_at',
'2025-05-01',
]);
});
it('should handle string comparison operators', () => {
const query = 'SELECT * FROM $1:name.$2:name';
const values = ['public', 'my_table'];
const whereClauses = [
{ column: 'name', condition: '>', value: 'M' },
{ column: 'category', condition: '<=', value: 'Electronics' },
];
const [updatedQuery, updatedValues] = addWhereClauses(
node,
0,
query,
whereClauses,
values,
'AND',
);
expect(updatedQuery).toEqual(
'SELECT * FROM $1:name.$2:name WHERE $3:name > $4 AND $5:name <= $6',
);
// Text strings should remain as strings
expect(updatedValues).toEqual(['public', 'my_table', 'name', 'M', 'category', 'Electronics']);
});
it('should not convert empty strings or whitespace-only strings to numbers', () => {
const query = 'SELECT * FROM $1:name.$2:name';
const values = ['public', 'my_table'];
const whereClauses = [
{ column: 'empty_field', condition: '>', value: '' },
{ column: 'whitespace_field', condition: '>=', value: ' ' },
];
const [updatedQuery, updatedValues] = addWhereClauses(
node,
0,
query,
whereClauses,
values,
'AND',
);
expect(updatedQuery).toEqual(
'SELECT * FROM $1:name.$2:name WHERE $3:name > $4 AND $5:name >= $6',
);
// These should NOT be converted to numbers
expect(updatedValues).toEqual([
'public',
'my_table',
'empty_field',
'',
'whitespace_field',
' ',
]);
});
});
describe('Test PostgresV2, addSortRules', () => {
@@ -128,8 +128,8 @@ export function parsePostgresError(
}
export function addWhereClauses(
node: INode,
itemIndex: number,
_node: INode,
_itemIndex: number,
query: string,
clauses: WhereClause[],
replacements: QueryValues,
@@ -153,21 +153,10 @@ export function addWhereClauses(
clause.condition = '=';
}
if (['>', '<', '>=', '<='].includes(clause.condition)) {
const value = Number(clause.value);
if (Number.isNaN(value)) {
throw new NodeOperationError(
node,
`Operator in entry ${index + 1} of 'Select Rows' works with numbers, but value ${
clause.value
} is not a number`,
{
itemIndex,
},
);
const numericValue = Number(clause.value);
if (String(clause.value).trim() !== '' && !Number.isNaN(numericValue)) {
clause.value = numericValue;
}
clause.value = value;
}
const columnReplacement = `$${replacementIndex}:name`;
values.push(clause.column);