Repository navigation
Expand file tree
/
Copy pathunknown_plan_type_test.go
More file actions
129 lines (110 loc) · 4.36 KB
/
Copy pathunknown_plan_type_test.go
File metadata and controls
129 lines (110 loc) · 4.36 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
package test
import (
"strings"
"testing"
"github.com/stretchr/testify/assert"
"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"
)
// TestUnknownPlanTypeIssue 测试导致"不支持的计划节点类型: Unknown"错误的查询
func TestUnknownPlanTypeIssue(t *testing.T) {
storageEngine, err := storage.NewParquetEngine(SetupTestDir(t, "unknown_plan_test.wal"))
assert.NoError(t, err)
defer storageEngine.Close()
err = storageEngine.Open()
assert.NoError(t, err)
cat := catalog.NewCatalog()
cat.SetStorageEngine(storageEngine)
err = cat.Init()
if err != nil {
t.Fatalf("Failed to initialize catalog: %v", err)
}
sessMgr, err := session.NewSessionManager()
assert.NoError(t, err)
sess := sessMgr.CreateSession()
opt := optimizer.NewOptimizer()
exec := executor.NewExecutor(cat)
execSQL := func(sql string) (string, error) {
t.Logf("Executing SQL: %s", sql)
stmt, err := parser.Parse(sql)
if err != nil {
return "", err
}
t.Logf("✓ Parsing successful")
plan, err := opt.Optimize(stmt)
if err != nil {
return "", err
}
t.Logf("✓ Optimization successful, plan type: %v", plan.Type)
_, err = exec.Execute(plan, sess)
if err != nil {
return "", err
}
t.Logf("✓ Execution successful")
return "success", nil
}
// 设置测试环境
_, err = execSQL("CREATE DATABASE test_unknown_plan")
assert.NoError(t, err)
sess.CurrentDB = "test_unknown_plan"
_, err = execSQL("CREATE TABLE sales (id INTEGER, product VARCHAR(50), amount FLOAT, region VARCHAR(50))")
assert.NoError(t, err)
_, err = execSQL("INSERT INTO sales (id, product, amount, region) VALUES (1, 'Widget A', 100.0, 'North')")
assert.NoError(t, err)
_, err = execSQL("INSERT INTO sales (id, product, amount, region) VALUES (2, 'Widget B', 200.0, 'South')")
assert.NoError(t, err)
// 测试可能导致"Unknown"错误的复杂查询
// 1. 测试带HAVING子句的GROUP BY查询
t.Log("Testing GROUP BY with HAVING clause...")
result1, err := execSQL("SELECT region, SUM(amount) FROM sales GROUP BY region HAVING SUM(amount) > 150")
if err != nil {
if strings.Contains(err.Error(), "不支持的计划节点类型: Unknown") || strings.Contains(err.Error(), "unsupported plan node type: Unknown") {
t.Logf("✗ Found 'Unknown plan type' error in GROUP BY HAVING: %v", err)
} else {
t.Logf("Different error in GROUP BY HAVING: %v", err)
}
} else {
t.Logf("✓ GROUP BY HAVING executed successfully: %s", result1)
}
// 2. 测试复合查询
t.Log("Testing compound query...")
result2, err := execSQL("SELECT * FROM sales WHERE id IN (SELECT id FROM sales WHERE amount > 150)")
if err != nil {
if strings.Contains(err.Error(), "不支持的计划节点类型: Unknown") || strings.Contains(err.Error(), "unsupported plan node type: Unknown") {
t.Logf("✗ Found 'Unknown plan type' error in subquery: %v", err)
} else {
t.Logf("Different error in subquery: %v", err)
}
} else {
t.Logf("✓ Subquery executed successfully: %s", result2)
}
// 3. 测试窗口函数(如果支持)
t.Log("Testing window function...")
result3, err := execSQL("SELECT id, amount, ROW_NUMBER() OVER (ORDER BY amount DESC) FROM sales")
if err != nil {
if strings.Contains(err.Error(), "不支持的计划节点类型: Unknown") || strings.Contains(err.Error(), "unsupported plan node type: Unknown") {
t.Logf("✗ Found 'Unknown plan type' error in window function: %v", err)
} else {
t.Logf("Different error in window function: %v", err)
}
} else {
t.Logf("✓ Window function executed successfully: %s", result3)
}
// 4. 测试CTE(公用表表达式)
t.Log("Testing CTE...")
result4, err := execSQL("WITH high_sales AS (SELECT * FROM sales WHERE amount > 150) SELECT * FROM high_sales")
if err != nil {
if strings.Contains(err.Error(), "不支持的计划节点类型: Unknown") || strings.Contains(err.Error(), "unsupported plan node type: Unknown") {
t.Logf("✗ Found 'Unknown plan type' error in CTE: %v", err)
} else {
t.Logf("Different error in CTE: %v", err)
}
} else {
t.Logf("✓ CTE executed successfully: %s", result4)
}
t.Log("✅ Unknown plan type test completed - check logs above for any 'Unknown plan type' errors")
}