控制流程圖(CFG)本質為有向圖,節點代表基本區塊,邊代表控制流向。關聯表自然表達:
CREATE TABLE CfgEdges (
NodeId CHAR(10) NOT NULL, -- 當前節點
ParentId CHAR(10) NOT NULL, -- 父節點(支配者)
PRIMARY KEY (NodeId, ParentId)
);
輸入:`NodeId = 'a'` → 輸出:`b, c, d`(假設 a→b→c→d 鏈)。
WITH DomCTE (NodeId, ParentId, Lvl) AS (
-- Anchor member:起始節點
SELECT NodeId, ParentId, 1 AS Lvl
FROM CfgEdges
WHERE NodeId = 'a'
UNION ALL
-- Recursive member:向上追溯父節點
SELECT e.NodeId, e.ParentId, c.Lvl + 1
FROM CfgEdges e
INNER JOIN DomCTE c ON e.NodeId = c.ParentId
)
SELECT NodeId, ParentId, Lvl
FROM DomCTE
OPTION (MAXRECURSION 1000); -- 防無限遞迴,預設 100
| NodeId | ParentId | Lvl |
|---|---|---|
| a | b | 1 |
| b | c | 2 |
| c | d | 3 |