@@ -5402,6 +5402,88 @@ func TestTemporalQueriesEdgeCases(t *testing.T) {
54025402 }
54035403}
54045404
5405+ func TestTemporalQueriesDeletedRows (t * testing.T ) {
5406+ defer os .RemoveAll ("temporal_queries_deleted_rows" )
5407+
5408+ st , err := store .Open ("temporal_queries_deleted_rows" , store .DefaultOptions ())
5409+ require .NoError (t , err )
5410+ defer closeStore (t , st )
5411+
5412+ engine , err := NewEngine (st , DefaultOptions ().WithPrefix (sqlPrefix ))
5413+ require .NoError (t , err )
5414+
5415+ _ , _ , err = engine .Exec ("CREATE DATABASE db1" , nil , nil )
5416+ require .NoError (t , err )
5417+
5418+ err = engine .SetCurrentDatabase ("db1" )
5419+ require .NoError (t , err )
5420+
5421+ _ , _ , err = engine .Exec ("CREATE TABLE table1(id INTEGER, title VARCHAR[50], PRIMARY KEY id)" , nil , nil )
5422+ require .NoError (t , err )
5423+
5424+ for i := 0 ; i < 10 ; i ++ {
5425+ _ , tx1 , err := engine .Exec (
5426+ "INSERT INTO table1(id, title) VALUES(@id, @title)" ,
5427+ map [string ]interface {}{
5428+ "id" : i ,
5429+ "title" : fmt .Sprintf ("title%d" , i ),
5430+ },
5431+ nil ,
5432+ )
5433+ require .NoError (t , err )
5434+ require .Len (t , tx1 , 1 )
5435+ }
5436+
5437+ _ , tx2 , err := engine .Exec ("DELETE FROM table1 WHERE id = 5" , nil , nil )
5438+ require .NoError (t , err )
5439+ require .Len (t , tx2 , 1 )
5440+
5441+ // Update value that is topologically before the deleted entry when scanning primary index
5442+ _ , _ , err = engine .Exec ("UPDATE table1 SET title = 'updated_title2' WHERE id = 2" , nil , nil )
5443+ require .NoError (t , err )
5444+
5445+ // Update value that is topologically after the deleted entry when scanning primary index
5446+ _ , _ , err = engine .Exec ("UPDATE table1 SET title = 'updated_title8' WHERE id = 8" , nil , nil )
5447+ require .NoError (t , err )
5448+
5449+ // Reinsert deleted entry
5450+ _ , tx3 , err := engine .Exec ("INSERT INTO table1(id, title) VALUES(5, 'title5')" , nil , nil )
5451+ require .NoError (t , err )
5452+ require .Len (t , tx3 , 1 )
5453+
5454+ // The sequence of operations is:
5455+ // Crate table
5456+ // tx1: INSERT id=0..9
5457+ // tx2: DELETE id=5 \
5458+ // UPDATE id=2 >- temporal query over the range
5459+ // UPDATE id=8 /
5460+ // tx3: INSERT id=5
5461+
5462+ res , err := engine .Query (
5463+ "SELECT id FROM table1 SINCE TX @since BEFORE TX @before" ,
5464+ map [string ]interface {}{
5465+ "since" : tx2 [0 ].txHeader .ID ,
5466+ "before" : tx3 [0 ].txHeader .ID ,
5467+ },
5468+ nil ,
5469+ )
5470+ require .NoError (t , err )
5471+
5472+ row , err := res .Read ()
5473+ require .NoError (t , err )
5474+ require .EqualValues (t , 2 , row .ValuesByPosition [0 ].Value ())
5475+
5476+ row , err = res .Read ()
5477+ require .NoError (t , err )
5478+ require .EqualValues (t , 8 , row .ValuesByPosition [0 ].Value ())
5479+
5480+ _ , err = res .Read ()
5481+ require .ErrorIs (t , err , ErrNoMoreRows )
5482+
5483+ err = res .Close ()
5484+ require .NoError (t , err )
5485+ }
5486+
54055487func TestMultiDBCatalogQueries (t * testing.T ) {
54065488 defer os .RemoveAll ("multidb_catalog_queries" )
54075489
0 commit comments