@@ -696,85 +696,100 @@ func UpdateReactionsMigrationsByType(ctx context.Context, gitServiceType api.Git
696696
697697// DeleteIssuesByRepoID deletes issues by repositories id
698698func DeleteIssuesByRepoID (ctx context.Context , repoID int64 ) (attachmentPaths []string , err error ) {
699- deleteCond := builder . Select ( "id" ). From ( "issue" ). Where (builder. Eq { "issue.repo_id" : repoID })
700-
699+ // MariaDB has a performance bug: https://jira.mariadb.org/browse/MDEV-16289
700+ // so here it uses "DELETE ... WHERE IN" with pre-queried IDs.
701701 sess := db .GetEngine (ctx )
702- // Delete content histories
703- if _ , err = sess .In ("issue_id" , deleteCond ).
704- Delete (& ContentHistory {}); err != nil {
705- return nil , err
706- }
707702
708- // Delete comments and attachments
709- if _ , err = sess .In ("issue_id" , deleteCond ).
710- Delete (& Comment {}); err != nil {
711- return nil , err
712- }
703+ for {
704+ issueIDs := make ([]int64 , 0 , db .DefaultMaxInSize )
713705
714- // Dependencies for issues in this repository
715- if _ , err = sess .In ("issue_id" , deleteCond ).
716- Delete (& IssueDependency {}); err != nil {
717- return nil , err
718- }
706+ err := sess .Table (& Issue {}).Where ("repo_id = ?" , repoID ).OrderBy ("id" ).Limit (db .DefaultMaxInSize ).Cols ("id" ).Find (& issueIDs )
707+ if err != nil {
708+ return nil , err
709+ }
719710
720- // Delete dependencies for issues in other repositories
721- if _ , err = sess .In ("dependency_id" , deleteCond ).
722- Delete (& IssueDependency {}); err != nil {
723- return nil , err
724- }
711+ if len (issueIDs ) == 0 {
712+ break
713+ }
725714
726- if _ , err = sess .In ("issue_id" , deleteCond ).
727- Delete (& IssueUser {}); err != nil {
728- return nil , err
729- }
715+ // Delete content histories
716+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& ContentHistory {})
717+ if err != nil {
718+ return nil , err
719+ }
730720
731- if _ , err = sess .In ("issue_id" , deleteCond ).
732- Delete (& Reaction {}); err != nil {
733- return nil , err
734- }
721+ // Delete comments and attachments
722+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& Comment {})
723+ if err != nil {
724+ return nil , err
725+ }
735726
736- if _ , err = sess .In ("issue_id" , deleteCond ).
737- Delete (& IssueWatch {}); err != nil {
738- return nil , err
739- }
727+ // Dependencies for issues in this repository
728+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& IssueDependency {})
729+ if err != nil {
730+ return nil , err
731+ }
740732
741- if _ , err = sess .In ("issue_id" , deleteCond ).
742- Delete (& Stopwatch {}); err != nil {
743- return nil , err
744- }
733+ // Delete dependencies for issues in other repositories
734+ _ , err = sess .In ("dependency_id" , issueIDs ).Delete (& IssueDependency {})
735+ if err != nil {
736+ return nil , err
737+ }
745738
746- if _ , err = sess .In ("issue_id" , deleteCond ).
747- Delete ( & TrackedTime {}); err != nil {
748- return nil , err
749- }
739+ _ , err = sess .In ("issue_id" , issueIDs ). Delete ( & IssueUser {})
740+ if err != nil {
741+ return nil , err
742+ }
750743
751- if _ , err = sess .In ("issue_id" , deleteCond ).
752- Delete ( & project_model. ProjectIssue {}); err != nil {
753- return nil , err
754- }
744+ _ , err = sess .In ("issue_id" , issueIDs ). Delete ( & Reaction {})
745+ if err != nil {
746+ return nil , err
747+ }
755748
756- if _ , err = sess .In ("dependent_issue_id " , deleteCond ).
757- Delete ( & Comment {}); err != nil {
758- return nil , err
759- }
749+ _ , err = sess .In ("issue_id " , issueIDs ). Delete ( & IssueWatch {})
750+ if err != nil {
751+ return nil , err
752+ }
760753
761- var attachments []* repo_model.Attachment
762- if err = sess .In ("issue_id" , deleteCond ).
763- Find (& attachments ); err != nil {
764- return nil , err
765- }
754+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& Stopwatch {})
755+ if err != nil {
756+ return nil , err
757+ }
766758
767- for j := range attachments {
768- attachmentPaths = append (attachmentPaths , attachments [j ].RelativePath ())
769- }
759+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& TrackedTime {})
760+ if err != nil {
761+ return nil , err
762+ }
770763
771- if _ , err = sess .In ("issue_id" , deleteCond ).
772- Delete ( & repo_model. Attachment {}); err != nil {
773- return nil , err
774- }
764+ _ , err = sess .In ("issue_id" , issueIDs ). Delete ( & project_model. ProjectIssue {})
765+ if err != nil {
766+ return nil , err
767+ }
775768
776- if _ , err = db .DeleteByBean (ctx , & Issue {RepoID : repoID }); err != nil {
777- return nil , err
769+ _ , err = sess .In ("dependent_issue_id" , issueIDs ).Delete (& Comment {})
770+ if err != nil {
771+ return nil , err
772+ }
773+
774+ var attachments []* repo_model.Attachment
775+ err = sess .In ("issue_id" , issueIDs ).Find (& attachments )
776+ if err != nil {
777+ return nil , err
778+ }
779+
780+ for j := range attachments {
781+ attachmentPaths = append (attachmentPaths , attachments [j ].RelativePath ())
782+ }
783+
784+ _ , err = sess .In ("issue_id" , issueIDs ).Delete (& repo_model.Attachment {})
785+ if err != nil {
786+ return nil , err
787+ }
788+
789+ _ , err = sess .In ("id" , issueIDs ).Delete (& Issue {})
790+ if err != nil {
791+ return nil , err
792+ }
778793 }
779794
780795 return attachmentPaths , err
0 commit comments