Skip to content

Commit 87b334c

Browse files
author
Bartłomiej Święcki
committed
test(embedded/sql): Add test for temporal queries with deleted rows
Signed-off-by: Bartłomiej Święcki <[email protected]>
1 parent 8d8b0fa commit 87b334c

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

embedded/sql/engine_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
54055487
func TestMultiDBCatalogQueries(t *testing.T) {
54065488
defer os.RemoveAll("multidb_catalog_queries")
54075489

0 commit comments

Comments
 (0)