From 520ae2a05f427797edfdeaa4a16aabbc7f81b09e Mon Sep 17 00:00:00 2001 From: Maxence Lange Date: Wed, 11 Feb 2026 15:15:12 -0100 Subject: [PATCH] avoid desync with memberships Signed-off-by: Maxence Lange --- lib/Db/CircleRequest.php | 8 +++++++- lib/Db/CoreQueryBuilder.php | 10 +++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/Db/CircleRequest.php b/lib/Db/CircleRequest.php index 456dd1c45..e9e8873e9 100644 --- a/lib/Db/CircleRequest.php +++ b/lib/Db/CircleRequest.php @@ -296,6 +296,7 @@ private function buildProbeCircle( $aliasMembership = $qb->generateAlias(CoreQueryBuilder::CIRCLE, CoreQueryBuilder::MEMBERSHIPS); + $aliasInitiator = null; if (is_null($initiator)) { // to get unique result, enforce a limit on level=owner $limit = $qb->exprLimitInt('level', Member::LEVEL_OWNER, $aliasMembership); @@ -305,10 +306,15 @@ private function buildProbeCircle( $initiator->getSingleId(), $aliasMembership ); - $qb->completeProbeWithInitiator(CoreQueryBuilder::CIRCLE, 'single_id', $aliasMembership); + $aliasInitiator = $qb->completeProbeWithInitiator(CoreQueryBuilder::CIRCLE, 'single_id', $aliasMembership); } $qb->andWhere($limit); + if (!is_null($aliasInitiator)) { + // ensure initiator is not null (desync memberships/members) + $qb->filterNull('single_id', alias: $aliasInitiator); + } + $qb->resetSqlPath(); return $qb; diff --git a/lib/Db/CoreQueryBuilder.php b/lib/Db/CoreQueryBuilder.php index 62e1d4c5d..e8e5cd958 100644 --- a/lib/Db/CoreQueryBuilder.php +++ b/lib/Db/CoreQueryBuilder.php @@ -1268,15 +1268,15 @@ public function completeProbeWithInitiator( string $alias, string $field = 'single_id', string $helperAlias = '', - ): void { + ): ?string { if ($this->getType() !== QueryBuilder::SELECT) { - return; + return null; } try { $aliasInitiator = $this->generateAlias($alias, self::INITIATOR); } catch (RequestBuilderException $e) { - return; + return null; } $helperAlias = ($helperAlias === '') ? $alias : $helperAlias; @@ -1290,8 +1290,8 @@ public function completeProbeWithInitiator( $expr->eq($aliasInitiator . '.' . $field, $helperAlias . '.inheritance_first'), ) ); - // - // $this->leftJoinBasedOn($aliasInitiator); + + return $aliasInitiator; } /**