mirror of
				https://github.com/matrix-org/synapse.git
				synced 2025-11-03 21:57:26 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									9738b1c497
								
							
						
					
					
						commit
						455ef04187
					
				
							
								
								
									
										1
									
								
								changelog.d/16609.bugfix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								changelog.d/16609.bugfix
									
									
									
									
									
										Normal file
									
								
							@ -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)
 | 
			
		||||
        # (This matches the order needed for the query)
 | 
			
		||||
        args = [tuple(x) + tuple(y) for x, y in zip(value_values, key_values)]
 | 
			
		||||
 | 
			
		||||
        for ks, vs in zip(key_values, value_values):
 | 
			
		||||
            args.append(tuple(vs) + tuple(ks))
 | 
			
		||||
        args = [tuple(vv) + tuple(kv) for vv, kv in zip(value_values, key_values)]
 | 
			
		||||
 | 
			
		||||
        # 'col1 = ?, col2 = ?, ...'
 | 
			
		||||
        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_txn,
 | 
			
		||||
                "UPDATE tablename SET col3 = ? WHERE col1 = ? AND col2 = ?",
 | 
			
		||||
                [("val3", "val1", "val2"), ("val3", "val1", "val2")],
 | 
			
		||||
                [("val3", "val1", "val2")],
 | 
			
		||||
            )
 | 
			
		||||
        else:
 | 
			
		||||
            self.mock_txn.executemany.assert_called_once_with(
 | 
			
		||||
                "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.
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user