Repository navigation
Expand file tree
/
Copy pathmor_join_restart_test.go
More file actions
156 lines (132 loc) · 4.33 KB
/
Copy pathmor_join_restart_test.go
File metadata and controls
156 lines (132 loc) · 4.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package test
import (
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/yyun543/minidb/internal/catalog"
"github.com/yyun543/minidb/internal/executor"
"github.com/yyun543/minidb/internal/optimizer"
"github.com/yyun543/minidb/internal/parser"
"github.com/yyun543/minidb/internal/session"
"github.com/yyun543/minidb/internal/storage"
)
// TestMoRJoinAfterRestart tests the bug where JOIN fails after server restart with MoR delta files
func TestMoRJoinAfterRestart(t *testing.T) {
testDir := "./test_data/mor_join_restart"
os.RemoveAll(testDir)
defer os.RemoveAll(testDir)
// Phase 1: Create tables, insert data, perform UPDATE/DELETE (creates delta files)
t.Log("Phase 1: Creating data and delta files")
{
engine, err := storage.NewParquetEngine(testDir)
require.NoError(t, err)
err = engine.Open()
require.NoError(t, err)
cat := catalog.NewCatalog()
cat.SetStorageEngine(engine)
err = cat.Init()
require.NoError(t, err)
sessMgr, err := session.NewSessionManager()
require.NoError(t, err)
sess := sessMgr.CreateSession()
sess.CurrentDB = "testdb"
opt := optimizer.NewOptimizer()
exec := executor.NewExecutor(cat)
execSQL := func(sql string) error {
stmt, err := parser.Parse(sql)
if err != nil {
return err
}
plan, err := opt.Optimize(stmt)
if err != nil {
return err
}
_, err = exec.Execute(plan, sess)
return err
}
// Create database and tables
err = execSQL("CREATE DATABASE testdb")
require.NoError(t, err)
err = execSQL("CREATE TABLE users (id INT, name VARCHAR, age INT)")
require.NoError(t, err)
err = execSQL("CREATE TABLE orders (id INT, user_id INT, amount INT)")
require.NoError(t, err)
// Insert data
err = execSQL("INSERT INTO users VALUES (1, 'John', 25)")
require.NoError(t, err)
err = execSQL("INSERT INTO users VALUES (2, 'Jane', 30)")
require.NoError(t, err)
err = execSQL("INSERT INTO users VALUES (3, 'Bob', 35)")
require.NoError(t, err)
err = execSQL("INSERT INTO orders VALUES (1, 1, 100)")
require.NoError(t, err)
err = execSQL("INSERT INTO orders VALUES (2, 2, 250)")
require.NoError(t, err)
err = execSQL("INSERT INTO orders VALUES (3, 1, 150)")
require.NoError(t, err)
// Perform UPDATE (creates delta file for users)
err = execSQL("UPDATE users SET name = 'John Doe' WHERE id = 1")
require.NoError(t, err)
// Perform DELETE (creates delta file for orders)
err = execSQL("DELETE FROM orders WHERE amount < 50")
require.NoError(t, err)
// Test JOIN before restart - should work
stmt, err := parser.Parse(`
SELECT u.name, COUNT(o.id) as order_count, SUM(o.amount) as total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.name
HAVING order_count > 1
ORDER BY total DESC
`)
require.NoError(t, err)
plan, err := opt.Optimize(stmt)
require.NoError(t, err)
result, err := exec.Execute(plan, sess)
require.NoError(t, err)
require.NotNil(t, result)
t.Log("✓ JOIN query works BEFORE restart")
err = engine.Close()
require.NoError(t, err)
}
// Phase 2: Restart and test the same JOIN query
t.Log("Phase 2: Restarting and testing JOIN with delta files")
{
engine, err := storage.NewParquetEngine(testDir)
require.NoError(t, err)
err = engine.Open()
require.NoError(t, err)
defer engine.Close()
cat := catalog.NewCatalog()
cat.SetStorageEngine(engine)
err = cat.Init()
require.NoError(t, err)
sessMgr, err := session.NewSessionManager()
require.NoError(t, err)
sess := sessMgr.CreateSession()
sess.CurrentDB = "testdb"
opt := optimizer.NewOptimizer()
exec := executor.NewExecutor(cat)
// Test simple JOIN after restart - this is where the bug occurs
stmt, err := parser.Parse(`
SELECT *
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
`)
require.NoError(t, err)
plan, err := opt.Optimize(stmt)
require.NoError(t, err)
// This should NOT panic (the original bug was here)
result, err := exec.Execute(plan, sess)
require.NoError(t, err, "Simple JOIN query should work AFTER restart with delta files")
require.NotNil(t, result)
// Verify result
totalRows := int64(0)
for _, batch := range result.Batches() {
totalRows += batch.NumRows()
}
assert.Greater(t, totalRows, int64(0), "Should have at least 1 result row from JOIN")
t.Log("✓ Simple JOIN query works AFTER restart")
}
}