oracle plsql 与 postgres plpgsql

 最近工作内容涉及到这部分内容,感觉它在设计过程中的思路和postgrres内核的结合非常紧密。
 在学习和工作中,逻辑严密是非常重要的。初次接触plpgsql,看到它目录下5个.c文件,头有点大,毕竟时间紧。找了个相关文档介绍plpgsql,着重讲解了关于pl_hander.c文件里面包含的几个函数。但这也是plpgsql的框架的分立的三个部分。

plpgsql_validator

使用plpgsql过程语言创建存储过程、函数时,进行检测

plpgsql_call_handler

select调用创建的函数或者过程时,具体处理在这个函数中进行。

plpgsql_inline_handler

处理do匿名块的逻辑

现在, 就一起体验一下前人逻辑严丝合缝的恐怖性。后面的内容我打算用大白话来讲。

目的

我们都知道一个sql进入服务器,需要进行此法分析,语法分析,这一部分在pg内核中进行。但是我们踏遍整个gram.y文件,没有找到declare等处理逻辑,(相信你们在读完整个文件的时候,你就会发现这个真相,它处理逻辑并不在此处)它的做法是:将as之后的语句处理成一个prosrc,将其写入pg_proc系统表。
oracle plsql 与 postgres plpgsql_第1张图片
那不解的小明,就有疑问了,我什么时候去处理prosrc部分的内容啊。来接下一张图,让你瞬间明白。
oracle plsql 与 postgres plpgsql_第2张图片
从此进入处理prosrc里面的内容,并生成相应的语法树,在执行select tt_try()调用该函数时为其处理提供语法树。
处理select tt_try()语句时,会进入plpgsql_call_handler.

oracle plsql 与 postgres plpgsql_第3张图片plpgsql_call_handler函数会为执行做以下工作:
(1)SPI接口程序连接数据库;
(2)确保函数块语法树存在;
(3)创建执行所需资源;
(4)执行,plisql_exec_function。
plisql_exec_function函数会做以下工作:
(1)错误回调函数;
(2)copy datums(所有数据类型在数据库的存储方式,想知道它具体内容使用相应结构体,进行获取;
(3)处理prosrc中声明的字段;
(4)处理prosrc中对应的语法结构。
语法结构主要使用函数exec_toplevel_block(declare中声明字段赋值)进行处理,具体实现在函数exec_stmts中
oracle plsql 与 postgres plpgsql_第4张图片z
在begin之后,如果有等式,调用函数exec_stmt_assign处理;如果有if条件,调用函数exec_stmt_if处理
现在我们进入exec_stmt_if函数;
oracle plsql 与 postgres plpgsql_第5张图片
这就不得不佩服,作者的脑洞了,他把语言真正抽象成了让人一看就明白的逻辑。
这里,只讲exec_eval_boolean这个函数。
它包含两部分:(1)将条件语句调用pg内核raw_parser处理成语法树,并调用函数pg_analyze_and_rewrite_params进行语义转换。(2)exec_eval_simple_expr函数最后生成执行计划,并处理。
同志们进入ExecEvalExpr函数
oracle plsql 与 postgres plpgsql_第6张图片
是不是很熟悉,这就是我们pg内核执行器部分的代码。处理完成之后放回正真的结果集。

结束

这期时间很匆忙,不了解的同学可以,留言进行交流。
下期,讲讲pl_gram.y的设计的巧妙性,以及今天内容里面没有包含的一些回调函数处理的完美用例,以及pg内核里面链表使用的技巧性。
see you!!!

你可能感兴趣的:(数据库开发,dba)