当前位置:网站首页>Postgresql随手记(10)动态执行EXECUTING语法解析过程
Postgresql随手记(10)动态执行EXECUTING语法解析过程
2022-07-01 22:57:00 【mingjie73】
背景
Postgresql中PLPGSQL支持动态拼接SQL并执行:
https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN
例如:
EXECUTE 'SELECT count(*) FROM mytable WHERE inserted_by = $1 AND inserted <= $2'
INTO c
USING checked_user, checked_date;
本篇简单分析下EXECUTE执行流程。
测试case
drop table u1tbl;
create table u1tbl(i int);
insert into u1tbl values (1);
insert into u1tbl values (2);
insert into u1tbl values (3);
drop function f1();
CREATE OR REPLACE FUNCTION f1() RETURNS int AS $$
DECLARE
id int;
i1 int := 1;
i2 int := 2;
BEGIN
EXECUTE 'SELECT sum(i) FROM u1tbl WHERE i >= $1 AND i <= $2'
INTO id
USING i1, i2;
return id;
END;
$$ LANGUAGE plpgsql;
select f1();
postgres=# select f1();
f1
----
3
(1 row)
EXECUTE解析流程
EXECUTE 'SELECT sum(i) FROM u1tbl WHERE i >= $1 AND i <= $2' INTO id USING i1, i2;
1、第一次read_sql_construct中会调用多次lex把需要的SQL全部提取出来,实际情况是第一次lex后,会把EXECUTE后''
内的所有文本拿出来,给出一个SCONST的token。
过程如下:
EXECUTE 'SELECT sum(i) FROM u1tbl WHERE i >= $1 AND i <= $2' INTO id USING i1, i2;
|--------------- SCONST -----------------| K_INTO K_USING
[pl_gram.y] stmt_dynexecute : K_EXECUTE read_sql_construct
[ scan.l] {xqstart} BEGIN(xq);
[ scan.l] <xq,xus>{xqinside} addlit(yytext, yyleng, yyscanner);
[ scan.l] <xb,xh,xq,xe,xus>{quote} BEGIN(xqs);
[ scan.l] <xqs><<EOF>> BEGIN(INITIAL); return SCONST;
[pl_gram.y]
2、后面在循环体里面的read_sql_construct会把USING
后面的所有SQL或变量名读取出来,按,
分隔。每一个SQL或变量记为一个expr作为链表挂在PLpgSQL_stmt_dynexecute->param后。
最后返回的PLpgSQL_stmt_dynexecute结构:
{
cmd_type = PLPGSQL_STMT_DYNEXECUTE,
lineno = 7,
stmtid = 1,
query = 0x1a3a328, <PLpgSQL_expr> 'SELECT sum(i) FROM u1tbl WHERE i >= $1 AND i <= $2'
into = true,
strict = false,
target = 0x1a3a490, <PLpgSQL_variable> dno=4 --> ((PLpgSQL_row*)plpgsql_Datums[4])
params = 0x1a3a600 List: <PLpgSQL_expr> <PLpgSQL_expr>
}
pl_gram.y相关源码
stmt_dynexecute : K_EXECUTE
{
PLpgSQL_stmt_dynexecute *new;
PLpgSQL_expr *expr;
int endtoken;
expr = read_sql_construct(K_INTO, K_USING, ';',
"INTO or USING or ;",
RAW_PARSE_PLPGSQL_EXPR,
true, true, true,
NULL, &endtoken);
new = palloc(sizeof(PLpgSQL_stmt_dynexecute));
new->cmd_type = PLPGSQL_STMT_DYNEXECUTE;
new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->query = expr;
new->into = false;
new->strict = false;
new->target = NULL;
new->params = NIL;
/*
* We loop to allow the INTO and USING clauses to
* appear in either order, since people easily get
* that wrong. This coding also prevents "INTO foo"
* from getting absorbed into a USING expression,
* which is *really* confusing.
*/
for (;;)
{
if (endtoken == K_INTO)
{
if (new->into) /* multiple INTO */
yyerror("syntax error");
new->into = true;
read_into_target(&new->target, &new->strict);
endtoken = yylex();
}
else if (endtoken == K_USING)
{
if (new->params) /* multiple USING */
yyerror("syntax error");
do
{
expr = read_sql_construct(',', ';', K_INTO,
", or ; or INTO",
RAW_PARSE_PLPGSQL_EXPR,
true, true, true,
NULL, &endtoken);
new->params = lappend(new->params, expr);
} while (endtoken == ',');
}
else if (endtoken == ';')
break;
else
yyerror("syntax error");
}
$$ = (PLpgSQL_stmt *)new;
}
;
SELECT sum(i) FROM u1tbl WHERE i >= $1 AND i <= $2’
边栏推荐
- Redis数据类型和应用场景
- Jerry's records are powered by Vbat with a power supply voltage of 4.2V [chapter]
- The difference between timer and scheduledthreadpoolexecutor
- y53.第三章 Kubernetes从入门到精通 -- ingress(二六)
- CADD course learning (3) -- target drug interaction
- 2022年起重机司机(限桥式起重机)考试试题及模拟考试
- 距离度量 —— 汉明距离(Hamming Distance)
- Y53. Chapter III kubernetes from introduction to mastery -- ingress (26)
- 【微服务|Sentinel】SentinelResourceAspect详解
- Why is PHP called hypertext preprocessor
猜你喜欢
Glass mosaic
Experience of practical learning of Silicon Valley products
flutter Unable to load asset: assets/images/888.png
MT manager test skiing Adventure
神经网络物联网的未来趋势与发展
What category does the Internet of things application technology major belong to
纪念成为首个DAYUs200三方demo贡献者
Programming English vocabulary notebook
会声会影2022智能、快速、简单的视频剪辑软件
软件架构的本质
随机推荐
Switch to software testing, knowing these four points is enough!
【小程序】通过scroll-view组件实现左右【滑动】列表
2022年R1快开门式压力容器操作考题及答案
CKS CKA CKAD 将终端更改为远程桌面
Openresty load balancing
纪念成为首个DAYUs200三方demo贡献者
What professional classification does the application of Internet of things technology belong to
Wechat personal small store one click opening assistant applet development
JS - use of arguments
mt管理器测试滑雪大冒险
Yunxin small class | common cognitive misunderstandings in IM and audio and video
“35岁,公司老总,月薪2万送外卖“:时代抛弃你,连声再见都没有
Treatment of insufficient space in the root partition of armbain system
通过Go语言创建CA与签发证书
What is the relationship between modeling and later film and television?
Future trend and development of neural network Internet of things
SWT / anr problem - SWT causes low memory killer (LMK)
CADD课程学习(3)-- 靶点药物相互作用
SWT/ANR问题--SWT 导致 low memory killer(LMK)
What category does the Internet of things application technology major belong to