From 2d08e306ae7dd3951ca44cd55f636b4cff6dfcff Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Wed, 26 Aug 2026 01:58:27 -0700 Subject: [PATCH] fix: prevent crash when relation query constraint contains null Signed-off-by: Sai Asish Y --- spec/RestQuery.spec.js | 27 +++++++++++++++++++++++++++ src/Controllers/DatabaseController.js | 6 +++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/spec/RestQuery.spec.js b/spec/RestQuery.spec.js index 3438febf76..837ab5c6fe 100644 --- a/spec/RestQuery.spec.js +++ b/spec/RestQuery.spec.js @@ -589,6 +589,33 @@ describe('RestQuery.each', () => { expect(resultsTwo.length).toBe(1); }); + it('should not throw when a relation query constraint contains null', async () => { + const objectA = new Parse.Object('Letter', { value: 'A' }); + const object1 = new Parse.Object('Number', { value: '1' }); + await object1.save(); + objectA.relation('numbers').add(object1); + await objectA.save(); + + const config = Config.get('test'); + + for (const [restWhere, expectedCount] of [ + [{ numbers: { $in: [null] } }, 0], + [{ numbers: { $nin: [null] } }, 1], + [{ numbers: { $ne: null, $in: [] } }, 0], + ]) { + const query = await RestQuery({ + method: RestQuery.Method.find, + config, + auth: auth.master(config), + className: 'Letter', + restWhere, + }); + const results = []; + await query.each(result => results.push(result)); + expect(results.length).toBe(expectedCount); + } + }); + it('test afterSave response object is return', done => { Parse.Cloud.beforeSave('TestObject2', function (req) { req.object.set('tobeaddbefore', true); diff --git a/src/Controllers/DatabaseController.js b/src/Controllers/DatabaseController.js index d598cacac5..8ca19a88b5 100644 --- a/src/Controllers/DatabaseController.js +++ b/src/Controllers/DatabaseController.js @@ -1095,13 +1095,13 @@ class DatabaseController { if (constraintKey === 'objectId') { relatedIds = [query[key].objectId]; } else if (constraintKey == '$in') { - relatedIds = query[key]['$in'].map(r => r.objectId); + relatedIds = query[key]['$in'].map(r => r?.objectId); } else if (constraintKey == '$nin') { isNegation = true; - relatedIds = query[key]['$nin'].map(r => r.objectId); + relatedIds = query[key]['$nin'].map(r => r?.objectId); } else if (constraintKey == '$ne') { isNegation = true; - relatedIds = [query[key]['$ne'].objectId]; + relatedIds = [query[key]['$ne']?.objectId]; } else { return; }