mirror of
https://mau.dev/maunium/synapse.git
synced 2024-12-14 14:13:51 +01:00
SYN-163: Add an order by rowid to selects.
This should fix the bug where the edges of the graph get returned in a different order than they were inserted in, and so no get_event no longer returned the exact same JSON as was inserted. This meant that signature checks failed.
This commit is contained in:
parent
ae8ad55cb8
commit
a46e5ef621
2 changed files with 18 additions and 9 deletions
|
@ -246,7 +246,10 @@ class SQLBaseStore(object):
|
||||||
raise StoreError(404, "No row found")
|
raise StoreError(404, "No row found")
|
||||||
|
|
||||||
def _simple_select_onecol_txn(self, txn, table, keyvalues, retcol):
|
def _simple_select_onecol_txn(self, txn, table, keyvalues, retcol):
|
||||||
sql = "SELECT %(retcol)s FROM %(table)s WHERE %(where)s" % {
|
sql = (
|
||||||
|
"SELECT %(retcol)s FROM %(table)s WHERE %(where)s "
|
||||||
|
"ORDER BY rowid asc"
|
||||||
|
) % {
|
||||||
"retcol": retcol,
|
"retcol": retcol,
|
||||||
"table": table,
|
"table": table,
|
||||||
"where": " AND ".join("%s = ?" % k for k in keyvalues.keys()),
|
"where": " AND ".join("%s = ?" % k for k in keyvalues.keys()),
|
||||||
|
@ -299,7 +302,7 @@ class SQLBaseStore(object):
|
||||||
keyvalues : dict of column names and values to select the rows with
|
keyvalues : dict of column names and values to select the rows with
|
||||||
retcols : list of strings giving the names of the columns to return
|
retcols : list of strings giving the names of the columns to return
|
||||||
"""
|
"""
|
||||||
sql = "SELECT %s FROM %s WHERE %s" % (
|
sql = "SELECT %s FROM %s WHERE %s ORDER BY rowid asc" % (
|
||||||
", ".join(retcols),
|
", ".join(retcols),
|
||||||
table,
|
table,
|
||||||
" AND ".join("%s = ?" % (k, ) for k in keyvalues)
|
" AND ".join("%s = ?" % (k, ) for k in keyvalues)
|
||||||
|
@ -334,7 +337,7 @@ class SQLBaseStore(object):
|
||||||
retcols=None, allow_none=False):
|
retcols=None, allow_none=False):
|
||||||
""" Combined SELECT then UPDATE."""
|
""" Combined SELECT then UPDATE."""
|
||||||
if retcols:
|
if retcols:
|
||||||
select_sql = "SELECT %s FROM %s WHERE %s" % (
|
select_sql = "SELECT %s FROM %s WHERE %s ORDER BY rowid asc" % (
|
||||||
", ".join(retcols),
|
", ".join(retcols),
|
||||||
table,
|
table,
|
||||||
" AND ".join("%s = ?" % (k) for k in keyvalues)
|
" AND ".join("%s = ?" % (k) for k in keyvalues)
|
||||||
|
@ -461,7 +464,7 @@ class SQLBaseStore(object):
|
||||||
def _get_events_txn(self, txn, event_ids):
|
def _get_events_txn(self, txn, event_ids):
|
||||||
# FIXME (erikj): This should be batched?
|
# FIXME (erikj): This should be batched?
|
||||||
|
|
||||||
sql = "SELECT * FROM events WHERE event_id = ?"
|
sql = "SELECT * FROM events WHERE event_id = ? ORDER BY rowid asc"
|
||||||
|
|
||||||
event_rows = []
|
event_rows = []
|
||||||
for e_id in event_ids:
|
for e_id in event_ids:
|
||||||
|
@ -478,7 +481,9 @@ class SQLBaseStore(object):
|
||||||
def _parse_events_txn(self, txn, rows):
|
def _parse_events_txn(self, txn, rows):
|
||||||
events = [self._parse_event_from_row(r) for r in rows]
|
events = [self._parse_event_from_row(r) for r in rows]
|
||||||
|
|
||||||
select_event_sql = "SELECT * FROM events WHERE event_id = ?"
|
select_event_sql = (
|
||||||
|
"SELECT * FROM events WHERE event_id = ? ORDER BY rowid asc"
|
||||||
|
)
|
||||||
|
|
||||||
for i, ev in enumerate(events):
|
for i, ev in enumerate(events):
|
||||||
signatures = self._get_event_signatures_txn(
|
signatures = self._get_event_signatures_txn(
|
||||||
|
|
|
@ -84,7 +84,8 @@ class SQLBaseStoreTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertEquals("Value", value)
|
self.assertEquals("Value", value)
|
||||||
self.mock_txn.execute.assert_called_with(
|
self.mock_txn.execute.assert_called_with(
|
||||||
"SELECT retcol FROM tablename WHERE keycol = ?",
|
"SELECT retcol FROM tablename WHERE keycol = ? "
|
||||||
|
"ORDER BY rowid asc",
|
||||||
["TheKey"]
|
["TheKey"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -101,7 +102,8 @@ class SQLBaseStoreTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertEquals({"colA": 1, "colB": 2, "colC": 3}, ret)
|
self.assertEquals({"colA": 1, "colB": 2, "colC": 3}, ret)
|
||||||
self.mock_txn.execute.assert_called_with(
|
self.mock_txn.execute.assert_called_with(
|
||||||
"SELECT colA, colB, colC FROM tablename WHERE keycol = ?",
|
"SELECT colA, colB, colC FROM tablename WHERE keycol = ? "
|
||||||
|
"ORDER BY rowid asc",
|
||||||
["TheKey"]
|
["TheKey"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -135,7 +137,8 @@ class SQLBaseStoreTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertEquals([{"colA": 1}, {"colA": 2}, {"colA": 3}], ret)
|
self.assertEquals([{"colA": 1}, {"colA": 2}, {"colA": 3}], ret)
|
||||||
self.mock_txn.execute.assert_called_with(
|
self.mock_txn.execute.assert_called_with(
|
||||||
"SELECT colA FROM tablename WHERE keycol = ?",
|
"SELECT colA FROM tablename WHERE keycol = ? "
|
||||||
|
"ORDER BY rowid asc",
|
||||||
["A set"]
|
["A set"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -184,7 +187,8 @@ class SQLBaseStoreTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertEquals({"columname": "Old Value"}, ret)
|
self.assertEquals({"columname": "Old Value"}, ret)
|
||||||
self.mock_txn.execute.assert_has_calls([
|
self.mock_txn.execute.assert_has_calls([
|
||||||
call('SELECT columname FROM tablename WHERE keycol = ?',
|
call('SELECT columname FROM tablename WHERE keycol = ? '
|
||||||
|
'ORDER BY rowid asc',
|
||||||
['TheKey']),
|
['TheKey']),
|
||||||
call("UPDATE tablename SET columname = ? WHERE keycol = ?",
|
call("UPDATE tablename SET columname = ? WHERE keycol = ?",
|
||||||
["New Value", "TheKey"])
|
["New Value", "TheKey"])
|
||||||
|
|
Loading…
Reference in a new issue