From 29f7c895b816d7d2eadf31ce4fd33d3b9c491466 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Thu, 24 Apr 2025 21:29:09 +0530 Subject: [PATCH] MM-63878: Fix INSERT IGNORE in saveChannelT (#30850) INSERT IGNORE will ignore ALL errors in the INSERT statement. This is not what was intended. The right way is to do a redundant update on duplicate key. It's not great, but that's how MySQL wants us to do it. https://mattermost.atlassian.net/browse/MM-63878 ```release-note NONE ``` --- server/channels/store/sqlstore/channel_store.go | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/server/channels/store/sqlstore/channel_store.go b/server/channels/store/sqlstore/channel_store.go index e1da7ac075..684c0d31a9 100644 --- a/server/channels/store/sqlstore/channel_store.go +++ b/server/channels/store/sqlstore/channel_store.go @@ -742,19 +742,14 @@ func (s SqlChannelStore) saveChannelT(transaction *sqlxTxWrapper, channel *model } } - var insert sq.InsertBuilder + insert := s.getQueryBuilder(). + Insert("Channels"). + Columns(channelSliceColumns()...). + Values(channelToSlice(channel)...) if s.DriverName() == model.DatabaseDriverMysql { - insert = s.getQueryBuilder(). - Insert("Channels"). - Options("IGNORE"). - Columns(channelSliceColumns()...). - Values(channelToSlice(channel)...) + insert = insert.SuffixExpr(sq.Expr("ON DUPLICATE KEY UPDATE Id=Id")) } else { - insert = s.getQueryBuilder(). - Insert("Channels"). - Columns(channelSliceColumns()...). - Values(channelToSlice(channel)...). - SuffixExpr(sq.Expr("ON CONFLICT (TeamId, Name) DO NOTHING")) + insert = insert.SuffixExpr(sq.Expr("ON CONFLICT (TeamId, Name) DO NOTHING")) } query, params, err := insert.ToSql()