Avoid updating the same rows multiple times with simple_update_many_txn. (#16609)
simple_update_many_txn had a bug in it which would cause each update to be applied twice.pull/13918/merge
parent
9738b1c497
commit
455ef04187
|
@ -0,0 +1 @@
|
||||||
|
Fix a long-standing bug where some queries updated the same row twice. Introduced in Synapse 1.57.0.
|
|
@ -2060,10 +2060,7 @@ class DatabasePool:
|
||||||
|
|
||||||
# List of tuples of (value values, then key values)
|
# List of tuples of (value values, then key values)
|
||||||
# (This matches the order needed for the query)
|
# (This matches the order needed for the query)
|
||||||
args = [tuple(x) + tuple(y) for x, y in zip(value_values, key_values)]
|
args = [tuple(vv) + tuple(kv) for vv, kv in zip(value_values, key_values)]
|
||||||
|
|
||||||
for ks, vs in zip(key_values, value_values):
|
|
||||||
args.append(tuple(vs) + tuple(ks))
|
|
||||||
|
|
||||||
# 'col1 = ?, col2 = ?, ...'
|
# 'col1 = ?, col2 = ?, ...'
|
||||||
set_clause = ", ".join(f"{n} = ?" for n in value_names)
|
set_clause = ", ".join(f"{n} = ?" for n in value_names)
|
||||||
|
|
|
@ -363,12 +363,12 @@ class SQLBaseStoreTestCase(unittest.TestCase):
|
||||||
self.mock_execute_batch.assert_called_once_with(
|
self.mock_execute_batch.assert_called_once_with(
|
||||||
self.mock_txn,
|
self.mock_txn,
|
||||||
"UPDATE tablename SET col3 = ? WHERE col1 = ? AND col2 = ?",
|
"UPDATE tablename SET col3 = ? WHERE col1 = ? AND col2 = ?",
|
||||||
[("val3", "val1", "val2"), ("val3", "val1", "val2")],
|
[("val3", "val1", "val2")],
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self.mock_txn.executemany.assert_called_once_with(
|
self.mock_txn.executemany.assert_called_once_with(
|
||||||
"UPDATE tablename SET col3 = ? WHERE col1 = ? AND col2 = ?",
|
"UPDATE tablename SET col3 = ? WHERE col1 = ? AND col2 = ?",
|
||||||
[("val3", "val1", "val2"), ("val3", "val1", "val2")],
|
[("val3", "val1", "val2")],
|
||||||
)
|
)
|
||||||
|
|
||||||
# key_values and value_values must be the same length.
|
# key_values and value_values must be the same length.
|
||||||
|
|
Loading…
Reference in New Issue