changeset 2989:c13333fcde5e

memory (sqlite): fixed order for last_stanza_id: "last_stanza_id" filter was ordered by "received_timestamp" instead of "timestamp", resulting in wrong message being used (and a bad MAM request).
author Goffi <goffi@goffi.org>
date Sat, 06 Jul 2019 15:50:55 +0200
parents b5f8cb26ef6f
children 6959c71ab8bf
files sat/memory/sqlite.py
diffstat 1 files changed, 6 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/sat/memory/sqlite.py	Sat Jul 06 12:22:25 2019 +0200
+++ b/sat/memory/sqlite.py	Sat Jul 06 15:50:55 2019 +0200
@@ -592,9 +592,6 @@
                 q.append(test_jid('dest', to_jid))
             query_parts.append(u"AND " + u" AND ".join(q))
 
-        # set to True if "ORDER BY" is already added
-        order = False
-
         if filters:
             if u'timestamp_start' in filters:
                 query_parts.append(u"AND timestamp>= ?")
@@ -618,20 +615,17 @@
                 # this request get the last message with a "stanza_id" that we
                 # have in history. This is mainly used to retrieve messages sent
                 # while we were offline, using MAM (XEP-0313).
-                # It must be set after all other filters, because it contains an ORDER BY
                 if (filters[u'last_stanza_id'] is not True
                     or limit != 1):
                     raise ValueError(u"Unexpected values for last_stanza_id filter")
-                query_parts.append(u"AND stanza_id IS NOT NULL ORDER BY history.received_timestamp DESC")
-                order = True
+                query_parts.append(u"AND stanza_id IS NOT NULL")
 
 
-        if not order:
-            # timestamp may be identical for 2 close messages (specially when delay is
-            # used) that's why we order ties by received_timestamp
-            # We'll reverse the order in sqliteHistoryToList
-            query_parts.append(u"ORDER BY timestamp DESC, history.received_timestamp DESC")
-                                                           # we use DESC here so LIMIT keep the last messages
+        # timestamp may be identical for 2 close messages (specially when delay is
+        # used) that's why we order ties by received_timestamp
+        # We'll reverse the order in sqliteHistoryToList
+        # we use DESC here so LIMIT keep the last messages
+        query_parts.append(u"ORDER BY timestamp DESC, history.received_timestamp DESC")
         if limit is not None:
             query_parts.append(u"LIMIT ?")
             values.append(limit)