Skip to content

Commit f054cc2

Browse files
Merge pull request #7225 from ABartelt/fix/mysql-error-1093-user-deletion
fix: resolve MySQL Error 1093 when deleting users from boards
2 parents 1afc5cd + bffa4d0 commit f054cc2

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

AUTHORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
- Adrian Missy <[email protected]>
88
- Alexandru Puiu <[email protected]>
9+
- Arne Bartelt <[email protected]>
910
- Chandi Langecker <[email protected]>
1011
- Christoph Wurst <[email protected]>
1112
- Gary Kim <[email protected]>

lib/Db/AssignmentMapper.php

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,18 +77,33 @@ public function findByParticipant(string $participant, $type = Assignment::TYPE_
7777
}
7878

7979
public function deleteByParticipantOnBoard(string $participant, int $boardId, $type = Assignment::TYPE_USER) {
80-
$qb = $this->db->getQueryBuilder();
80+
// Step 1: Get all card IDs for the board that have assignments for this participant
81+
// This avoids MySQL Error 1093 by separating the SELECT from the DELETE operation
8182
$cardIdQuery = $this->db->getQueryBuilder();
8283
$cardIdQuery->select('a.card_id')
8384
->from('deck_assigned_users', 'a')
8485
->innerJoin('a', 'deck_cards', 'c', 'c.id = a.card_id')
8586
->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id')
86-
->where($cardIdQuery->expr()->eq('a.participant', $qb->createNamedParameter($participant, IQueryBuilder::PARAM_STR)))
87-
->andWhere($cardIdQuery->expr()->eq('s.board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
88-
->andWhere($cardIdQuery->expr()->eq('a.type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT)));
89-
$qb->delete('deck_assigned_users')
90-
->where($qb->expr()->in('card_id', $qb->createFunction($cardIdQuery->getSQL()), IQueryBuilder::PARAM_INT_ARRAY));
91-
$qb->executeStatement();
87+
->where($cardIdQuery->expr()->eq('a.participant', $cardIdQuery->createNamedParameter($participant, IQueryBuilder::PARAM_STR)))
88+
->andWhere($cardIdQuery->expr()->eq('s.board_id', $cardIdQuery->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
89+
->andWhere($cardIdQuery->expr()->eq('a.type', $cardIdQuery->createNamedParameter($type, IQueryBuilder::PARAM_INT)));
90+
91+
$result = $cardIdQuery->executeQuery();
92+
$cardIds = [];
93+
while ($row = $result->fetch()) {
94+
$cardIds[] = $row['card_id'];
95+
}
96+
$result->closeCursor();
97+
98+
// Step 2: If we have card IDs, delete the assignments
99+
if (!empty($cardIds)) {
100+
$deleteQuery = $this->db->getQueryBuilder();
101+
$deleteQuery->delete('deck_assigned_users')
102+
->where($deleteQuery->expr()->eq('participant', $deleteQuery->createNamedParameter($participant, IQueryBuilder::PARAM_STR)))
103+
->andWhere($deleteQuery->expr()->eq('type', $deleteQuery->createNamedParameter($type, IQueryBuilder::PARAM_INT)))
104+
->andWhere($deleteQuery->expr()->in('card_id', $deleteQuery->createNamedParameter($cardIds, IQueryBuilder::PARAM_INT_ARRAY)));
105+
$deleteQuery->executeStatement();
106+
}
92107
}
93108

94109

0 commit comments

Comments
 (0)