嘿大家
今天,我将向您解释Apache Age在 postgresql 上的工作方式被认为是我在我的个人资料上找到它们之前发布的旧博客的免费部分,让我们开始!
首先要感谢 postgresql 对他们的扩展很友好,他们考虑到可以将一些挂钩添加到其源代码中,其中之一就是主要由 Apache Age 是
post_parse_analyze_hook
什么是post_parse_analyze_hook?
这是postgresql
上分配给 null 的函数地址,如果它得到一个地址,则将调用它,即 postgresql session加载扩展
,当执行查询将使用挂钩时,它对 postgresql 变量进行了影响。
它什么时候使用的?这就是 postgresql 而不是扩展的决定'决策,因此在分析和解析状态后,在当前被调用。
该功能调用是什么附加的?
parsestate 和 querytree 和 jumplestate 。如果您错过这些术语的任何部分,您也可以在我的博客上找到与它们相关的帖子。
Apache Age获得该调用后会发生什么?将其用于什么功能?
if (post_parse_analyze_hook)
(*post_parse_analyze_hook) (pstate, query, jstate);
Apache Age已将POST_PARSE_ANALYZE_HOOK设置为 POST_PARSE_ANALYZE
通过以下代码在src/cypher/anaylze
void post_parse_analyze_init(void)
{
prev_post_parse_analyze_hook = post_parse_analyze_hook;
post_parse_analyze_hook = post_parse_analyze;
}
POST_PARSE_ANALYZE是Apache年龄的一部分,目的是?
a:要将每个cyhper呼叫更改为子查询节点
问:如何?
解析后:即第二解析。
- 转到来自语句的查询的每个部分(因为我们的Cypher调用是从部分执行的)
如何找到它们?在解析状态下,我们可以在 rangetblentry
上找到它们对于那些条目的每个条目,我们检查是否是
- 功能调用
-
subquery
-
如果函数调用,则可能是一个密码调用,因此我们需要在此处进行检查[简单地匹配]
-
得到它?但是,为什么我们需要检查另一个 subquies ?因为它们的列表可能包括一个密码调用(我们正在递归解决)
那是什么函数转换? convert_cypher_walker
从子句中求解cypher()调用,然后将其转换为选择 subquies
- 保持检查一个节点如果是 rtetblentry (从列表中的节点)
if (they are function as cypher is defined as function) {
// check if it is cypher or not
if (cypher) CONVERT TO SUB_QUERY
}
if there is real existing sub query check if it contains a cypher in their FROM list or not (i.e. RECURSIVE CALL)
Mission :更新查询树以添加Cypher子查询而不是Cypher函数调用
convert_cypher_walker
代码的一部分
static bool convert_cypher_walker(Node *node, ParseState *pstate)
{
if (!node)
return false;
if (IsA(node, RangeTblEntry))
{
RangeTblEntry *rte = (RangeTblEntry *)node;
switch (rte->rtekind)
{
case RTE_SUBQUERY:
// traverse other RTE_SUBQUERYs
return convert_cypher_walker((Node *)rte->subquery, pstate);
case RTE_FUNCTION:
if (is_rte_cypher(rte))
convert_cypher_to_subquery(rte, pstate);
return false;
default:
return false;
}
}
感谢您的阅读,直到这里我已经结束了今天的博客的结尾,希望您觉得这使您对 PostgreSql 扩展和年龄有很好的了解
_ _
__ _ ___ ___ __| | |__ _ _ ___
/ _` |/ _ \ / _ \ / _` | '_ \| | | |/ _ \
| (_| | (_) | (_) | (_| | |_) | |_| | __/
\__, |\___/ \___/ \__,_|_.__/ \__, |\___|
|___/ |___/