From d95d0dd792aa4f081773a56423f5c5f81b6e4a00 Mon Sep 17 00:00:00 2001 From: sravan27 Date: Thu, 21 May 2026 09:56:46 +0530 Subject: [PATCH] Fix Sync Streams iif arity validation --- .changeset/fix-sync-streams-iif-arity.md | 5 +++++ packages/sync-rules/src/sync_plan/expression.ts | 2 +- .../sync-rules/test/src/compiler/sqlite.test.ts | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 .changeset/fix-sync-streams-iif-arity.md diff --git a/.changeset/fix-sync-streams-iif-arity.md b/.changeset/fix-sync-streams-iif-arity.md new file mode 100644 index 000000000..6b5e48cc6 --- /dev/null +++ b/.changeset/fix-sync-streams-iif-arity.md @@ -0,0 +1,5 @@ +--- +'@powersync/service-sync-rules': patch +--- + +Validate `iif()` calls with the same three-argument arity used by the sync stream evaluator. diff --git a/packages/sync-rules/src/sync_plan/expression.ts b/packages/sync-rules/src/sync_plan/expression.ts index 9997bf5aa..ddce6db1d 100644 --- a/packages/sync-rules/src/sync_plan/expression.ts +++ b/packages/sync-rules/src/sync_plan/expression.ts @@ -143,7 +143,7 @@ export const supportedFunctions: Record = { hex: 1, ifnull: { min: 2 }, //if: { min: 2 }, - iif: { min: 2 }, + iif: 3, instr: 2, length: 1, // TODO: Establish defaults for case sensitivity, changing escape characters, ICU support. diff --git a/packages/sync-rules/test/src/compiler/sqlite.test.ts b/packages/sync-rules/test/src/compiler/sqlite.test.ts index 8c873d3d1..8f7eea9f0 100644 --- a/packages/sync-rules/test/src/compiler/sqlite.test.ts +++ b/packages/sync-rules/test/src/compiler/sqlite.test.ts @@ -85,6 +85,22 @@ describe('sqlite conversion', () => { ]); }); + test('iif requires exactly three args', () => { + expect(translate('iif(1, 2)')[1]).toStrictEqual([ + { + message: 'Expected at least 3 arguments', + source: 'iif(1, 2)' + } + ]); + + expect(translate('iif(1, 2, 3, 4)')[1]).toStrictEqual([ + { + message: 'Expected at most 3 arguments', + source: 'iif(1, 2, 3, 4)' + } + ]); + }); + test.skip('must be even', () => { expect(translate("json_object('foo')")[1]).toStrictEqual([ {