fix(Postgres Node): Accommodate null values in query parameters for expressions (#13544)

This commit is contained in:
Dana
2025-02-27 16:39:08 +01:00
committed by GitHub
parent 0fb66076ba
commit 6c266acced
4 changed files with 59 additions and 3 deletions

View File

@@ -363,6 +363,26 @@ describe('Test PostgresV2, executeQuery operation', () => {
); );
}); });
it('should execute queries with null key/value pairs', async () => {
const nodeParameters: IDataObject = {
operation: 'executeQuery',
query: 'SELECT *\nFROM users\nWHERE username IN ($1, $2)',
options: {
queryReplacement: '"={{ betty }}, {{ null }}"',
},
};
const nodeOptions = nodeParameters.options as IDataObject;
expect(async () => {
await executeQuery.execute.call(
createMockExecuteFunction(nodeParameters),
runQueries,
items,
nodeOptions,
);
}).not.toThrow();
});
it('should execute queries with multiple json key/value pairs', async () => { it('should execute queries with multiple json key/value pairs', async () => {
const nodeParameters: IDataObject = { const nodeParameters: IDataObject = {
operation: 'executeQuery', operation: 'executeQuery',

View File

@@ -17,6 +17,7 @@ import {
isJSON, isJSON,
convertValuesToJsonWithPgp, convertValuesToJsonWithPgp,
hasJsonDataTypeInSchema, hasJsonDataTypeInSchema,
evaluateExpression,
} from '../../v2/helpers/utils'; } from '../../v2/helpers/utils';
const node: INode = { const node: INode = {
@@ -39,6 +40,25 @@ describe('Test PostgresV2, isJSON', () => {
}); });
}); });
describe('Test PostgresV2, evaluateExpression', () => {
it('should evaluate undefined to an empty string', () => {
expect(evaluateExpression(undefined)).toEqual('');
});
it('should evaluate null to a string with value null', () => {
expect(evaluateExpression(null)).toEqual('null');
});
it('should evaluate object to a string', () => {
expect(evaluateExpression({ key: '' })).toEqual('{"key":""}');
expect(evaluateExpression([])).toEqual('[]');
expect(evaluateExpression([1, 2, 4])).toEqual('[1,2,4]');
});
it('should evaluate everything else to a string', () => {
expect(evaluateExpression(1)).toEqual('1');
expect(evaluateExpression('string')).toEqual('string');
expect(evaluateExpression(true)).toEqual('true');
});
});
describe('Test PostgresV2, wrapData', () => { describe('Test PostgresV2, wrapData', () => {
it('should wrap object in json', () => { it('should wrap object in json', () => {
const data = { const data = {

View File

@@ -14,7 +14,12 @@ import type {
QueriesRunner, QueriesRunner,
QueryWithValues, QueryWithValues,
} from '../../helpers/interfaces'; } from '../../helpers/interfaces';
import { isJSON, replaceEmptyStringsByNulls, stringToArray } from '../../helpers/utils'; import {
evaluateExpression,
isJSON,
replaceEmptyStringsByNulls,
stringToArray,
} from '../../helpers/utils';
import { optionsCollection } from '../common.descriptions'; import { optionsCollection } from '../common.descriptions';
const properties: INodeProperties[] = [ const properties: INodeProperties[] = [
@@ -84,8 +89,9 @@ export async function execute(
const resolvables = getResolvables(rawValues); const resolvables = getResolvables(rawValues);
if (resolvables.length) { if (resolvables.length) {
for (const resolvable of resolvables) { for (const resolvable of resolvables) {
const evaluatedExpression = const evaluatedExpression = evaluateExpression(
this.evaluateExpression(`${resolvable}`, index)?.toString() ?? ''; this.evaluateExpression(`${resolvable}`, index),
);
const evaluatedValues = isJSON(evaluatedExpression) const evaluatedValues = isJSON(evaluatedExpression)
? [evaluatedExpression] ? [evaluatedExpression]
: stringToArray(evaluatedExpression); : stringToArray(evaluatedExpression);

View File

@@ -30,6 +30,16 @@ export function isJSON(str: string) {
} }
} }
export function evaluateExpression(expression: NodeParameterValueType) {
if (expression === undefined) {
return '';
} else if (expression === null) {
return 'null';
} else {
return typeof expression === 'object' ? JSON.stringify(expression) : expression.toString();
}
}
export function stringToArray(str: NodeParameterValueType | undefined) { export function stringToArray(str: NodeParameterValueType | undefined) {
if (str === undefined) return []; if (str === undefined) return [];
return String(str) return String(str)