|
|
@@ -0,0 +1,104 @@
|
|
|
+-- ============================================================
|
|
|
+-- 服务端 Bug 复现:单节点 Cypher Match nil pointer dereference
|
|
|
+-- ============================================================
|
|
|
+-- 环境要求: odbserver 运行在 127.0.0.1:11001, keyspace=oktest
|
|
|
+-- 运行方式: ./mql aaa/15cypher/bug_reproduce.mql
|
|
|
+-- 预期: 服务端 crash (runtime error: invalid memory address or nil pointer dereference)
|
|
|
+-- ============================================================
|
|
|
+
|
|
|
+-- 初始化:创建测试 class
|
|
|
+create class if not exists /test/aaa/test_graph (
|
|
|
+ g_name varchar,
|
|
|
+ g_type varchar,
|
|
|
+ g_value int,
|
|
|
+ indexes(g_name, g_type),
|
|
|
+ keys(g_name)
|
|
|
+) with nickname='test_graph'
|
|
|
+;
|
|
|
+
|
|
|
+-- 插入测试数据
|
|
|
+insert into /test/aaa/test_graph (g_name, g_type, g_value) values ('bug_node_a', 'type_a', 10)
|
|
|
+;
|
|
|
+insert into /test/aaa/test_graph (g_name, g_type, g_value) values ('bug_node_b', 'type_a', 20)
|
|
|
+;
|
|
|
+
|
|
|
+/**
|
|
|
+sleep(1s)
|
|
|
+**/
|
|
|
+;
|
|
|
+
|
|
|
+-- ============================================================
|
|
|
+-- Bug 1: 单节点 match + return 变量 → nil pointer
|
|
|
+-- ============================================================
|
|
|
+match (n:test_graph) return n
|
|
|
+/**
|
|
|
+onerror(continue)
|
|
|
+**/
|
|
|
+;
|
|
|
+
|
|
|
+-- ============================================================
|
|
|
+-- Bug 2: 单节点 match + return n.* → nil pointer
|
|
|
+-- ============================================================
|
|
|
+match (n:test_graph) return n.*
|
|
|
+/**
|
|
|
+onerror(continue)
|
|
|
+**/
|
|
|
+;
|
|
|
+
|
|
|
+-- ============================================================
|
|
|
+-- Bug 3: 单节点 match + return 字段列表 → nil pointer
|
|
|
+-- ============================================================
|
|
|
+match (n:test_graph) return n.g_name, n.g_type, n.g_value
|
|
|
+/**
|
|
|
+onerror(continue)
|
|
|
+**/
|
|
|
+;
|
|
|
+
|
|
|
+-- ============================================================
|
|
|
+-- Bug 4: 多节点 match (逗号分隔, 无关系模式) → nil pointer
|
|
|
+-- ============================================================
|
|
|
+match (a:test_graph), (b:test_graph) where a.g_name='bug_node_a' and b.g_name='bug_node_b'
|
|
|
+create (a) -[:connect]-> (b)
|
|
|
+/**
|
|
|
+onerror(continue)
|
|
|
+**/
|
|
|
+;
|
|
|
+
|
|
|
+-- ============================================================
|
|
|
+-- Bug 5: CypherCtrl 级别的 where + 子查询 in → 解析错误
|
|
|
+-- ============================================================
|
|
|
+match (a:test_graph) -[:connect]-> (b:test_graph) where a.g_name in (match (n:test_graph) return n.g_name) return a, b
|
|
|
+/**
|
|
|
+onerror(continue)
|
|
|
+**/
|
|
|
+;
|
|
|
+
|
|
|
+-- ============================================================
|
|
|
+-- 以下是正常工作的 Cypher 查询(有明确关系路径)
|
|
|
+-- ============================================================
|
|
|
+-- 先建 edge type 和关系
|
|
|
+create edge type if not exists test.connect
|
|
|
+;
|
|
|
+
|
|
|
+match (a:test_graph), (b:test_graph) where a.g_name='bug_node_a' and b.g_name='bug_node_b'
|
|
|
+create (a) -[:connect]-> (b)
|
|
|
+/**
|
|
|
+onerror(continue)
|
|
|
+**/
|
|
|
+;
|
|
|
+
|
|
|
+-- 这个应该正常工作:有关系路径的 multi-node match
|
|
|
+match (a:test_graph) -[:connect]-> (b:test_graph) return a, b
|
|
|
+/**
|
|
|
+output()
|
|
|
+**/
|
|
|
+;
|
|
|
+
|
|
|
+-- 清理
|
|
|
+delete from /test/aaa/test_graph with version
|
|
|
+/**
|
|
|
+onerror(continue,'not exist','not find','not found')
|
|
|
+**/
|
|
|
+;
|
|
|
+drop class if exists /test/aaa/test_graph
|
|
|
+;
|