当前位置:网站首页>PostgreSQL notes (10) dynamically execute syntax parsing process
PostgreSQL notes (10) dynamically execute syntax parsing process
2022-07-01 23:28:00 【mingjie73】
background
Postgresql in PLPGSQL Support dynamic splicing SQL And implement :
https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN
for example :
EXECUTE 'SELECT count(*) FROM mytable WHERE inserted_by = $1 AND inserted <= $2'
INTO c
USING checked_user, checked_date;
This article briefly analyzes EXECUTE Execute the process .
test 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 Analytical process
EXECUTE 'SELECT sum(i) FROM u1tbl WHERE i >= $1 AND i <= $2' INTO id USING i1, i2;
1、 for the first time read_sql_construct Will be called many times lex Put what you need SQL Extract it all , The actual situation is for the first time lex after , Will be able to EXECUTE after '' Take out all the text in , Give a SCONST Of token.
The process is as follows :
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、 Later in the circulation body read_sql_construct Will be able to USING Everything in the back SQL Or read the variable name , Press , Separate . every last SQL Or the variable is recorded as a expr Hang it as a linked list PLpgSQL_stmt_dynexecute->param after .
Last returned PLpgSQL_stmt_dynexecute structure :
{
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 Related to the source code
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’
边栏推荐
- [micro service sentinel] sentinel integrates openfeign
- plain framework的实际应用和扩展
- 马赛克后挡板是什么?
- Commemorate becoming the first dayus200 tripartite demo contributor
- 2022 crane driver (limited to bridge crane) examination questions and simulation examination
- [swoole Series 1] what will you learn in the world of swoole?
- Behind sharing e-commerce: the spirit of CO creation, symbiosis, sharing, CO prosperity and win-win
- What is mosaic?
- jpa手写sql,用自定义实体类接收
- SWT/ANR问题--SWT 导致 low memory killer(LMK)
猜你喜欢

Redis数据类型和应用场景

2022 examination questions and online simulation examination for safety management personnel of hazardous chemical business units

Yoga27 multidimensional all-in-one computer with excellent appearance and high-end configuration

Wechat personal small store one click opening assistant applet development

Istio, ebpf and rsocket Broker: in depth study of service grid

问题随记 —— /usr/bin/perl is needed by MySQL-server-5.1.73-1.glibc23.x86_64

RPA: Bank digitalization, business process automation "a small step", and loan review efficiency "a big step"

Current situation and future development trend of Internet of things

SWT / anr problem - SWT causes kernel fuse deadlock

Airserver latest win64 bit personal screen projection software
随机推荐
Matplotlib常用图表
Zhongang Mining: it has inherent advantages to develop the characteristic chemical industry dominated by fluorine chemical industry
2022年R1快开门式压力容器操作考题及答案
URL introduction
The third part of the construction of the defense system of offensive and defensive exercises is the establishment of a practical security system
Matplotlib common settings
转行软件测试,知道这四点就够了!
Applet form verification encapsulation
Practical application and extension of plain framework
Development trend and future direction of neural network Internet of things
物联网现状及未来发展趋势
What is the difference between memory leak and memory overflow?
Li Kou today's question -241 Design priorities for operational expressions
Glass mosaic
问题随记 —— /usr/bin/perl is needed by MySQL-server-5.1.73-1.glibc23.x86_64
【微服务|Sentinel】SentinelResourceAspect详解
SWT / anr problem - SWT causes kernel fuse deadlock
What is the relationship between modeling and later film and television?
Linux foundation - centos7 offline installation of MySQL
Commemorate becoming the first dayus200 tripartite demo contributor