@@ -3349,28 +3349,40 @@ function getUnreadByConversationAndMarkRead(
33493349 return db . transaction ( ( ) => {
33503350 const expirationStartTimestamp = Math . min ( now , readAt ?? Infinity ) ;
33513351
3352- const expirationJsonPatch = JSON . stringify ( { expirationStartTimestamp } ) ;
3353-
3354- const [ updateExpirationQuery , updateExpirationParams ] = sql `
3352+ const updateExpirationFragment = sqlFragment `
33553353 UPDATE messages
3356- INDEXED BY expiring_message_by_conversation_and_received_at
33573354 SET
3358- expirationStartTimestamp = ${ expirationStartTimestamp } ,
3359- json = json_patch(json, ${ expirationJsonPatch } )
3355+ expirationStartTimestamp = ${ expirationStartTimestamp }
33603356 WHERE
33613357 conversationId = ${ conversationId } AND
33623358 (${ _storyIdPredicate ( storyId , includeStoryReplies ) } ) AND
3363- isStory IS 0 AND
3364- type IS 'incoming' AND
3365- (
3366- expirationStartTimestamp IS NULL OR
3367- expirationStartTimestamp > ${ expirationStartTimestamp }
3368- ) AND
3369- expireTimer > 0 AND
3370- received_at <= ${ readMessageReceivedAt } ;
3359+ type IN ('incoming', 'poll-terminate') AND
3360+ hasExpireTimer IS 1 AND
3361+ received_at <= ${ readMessageReceivedAt }
33713362 ` ;
33723363
3373- db . prepare ( updateExpirationQuery ) . run ( updateExpirationParams ) ;
3364+ // 1. Update expirationStartTimestamps for messages without an
3365+ // expirationStartTimestamp
3366+ const [ updateNullEpirationStartQuery , updateNullExpirationStartParams ] =
3367+ sql `
3368+ ${ updateExpirationFragment } AND
3369+ expirationStartTimestamp IS NULL;
3370+ ` ;
3371+ db . prepare ( updateNullEpirationStartQuery ) . run (
3372+ updateNullExpirationStartParams
3373+ ) ;
3374+
3375+ // 2. Update expirationStartTimestamps for messages with a later
3376+ // expirationStartTimestamp. These are run in two separate queries to allow
3377+ // each to use the index on expirationStartTimestamp
3378+ const [ updateLateExpirationStartQuery , updateLateExpirationStartParams ] =
3379+ sql `
3380+ ${ updateExpirationFragment } AND
3381+ expirationStartTimestamp > ${ expirationStartTimestamp } ;
3382+ ` ;
3383+ db . prepare ( updateLateExpirationStartQuery ) . run (
3384+ updateLateExpirationStartParams
3385+ ) ;
33743386
33753387 const [ selectQuery , selectParams ] = sql `
33763388 SELECT
@@ -5497,7 +5509,8 @@ function getMessagesUnexpectedlyMissingExpirationStartTimestamp(
54975509 readStatus = ${ ReadStatus . Read } OR
54985510 readStatus = ${ ReadStatus . Viewed } OR
54995511 readStatus IS NULL
5500- ))
5512+ )) OR
5513+ (type IS 'poll-terminate')
55015514 );
55025515 `
55035516 )
0 commit comments