Postgresql源码(78)plpgsql中调用call proc()时的参数传递和赋值(pl参数)_mingjie - 码子裤

技术标签:   Linux  PostgreSQL  SQL  云数据库 PostgreSQL

Postgresql源码(78)plpgsql中调用call proc()时的参数传递和赋值(pl参数)

作者:mingjie


《Postgresql源码(77)plpgsql中参数传递和赋值(pl参数)》 《Postgresql源码(78)plpgsql中调用call proc()时的参数传递和赋值(pl参数)》

总结

  • 调用者在exec_stmt_call中拼接ParamListInfo传给SPI去执行call xxxx命令。
  • ParamListInfo记录了PL的一些回调函数,在SPI会走到:ExecuteCallStmt
  • ExecuteCallStmt核心流程两步:
    1. 拼参数列表:会拿到所有入参
    • 假设第一个入参是Param类型,会回调PL的plpgsql_param_fetch函数,从PL的Datums中拿变量的值赋值给fcinfo->args[0]
    • 假设第二个入参是Const类型常量,则会直接在执行器内赋值给fcinfo->args[1]
    1. 走FunctionCallInvoke进入plpgsql_exec_functions开始执行被调用函数。

实验用例

create or replace procedure p1(p_a in int, p_b in int, p_c out int)
language plpgsql
as $$
begin
  p_c := 30000;
  raise notice '% % %', p_a, p_b, p_c;
end;
$$;


do $$                          
declare 
  a1 int;
  a3 int;
begin 
  a1 := 10;
  call p1(a1, 20, a3);
  raise notice 'a3: %', a3;
end;
$$;

进入exec_stmt_call时

  • a1:有值,value = 10,isnull = false,freeval = false
  • a3:无值,value = 0, isnull = true, freeval = false
(gdb) p *(PLpgSQL_var*)estate->datums[0]
$9 = {dtype = PLPGSQL_DTYPE_VAR, dno = 0, refname = 0x17107c0 "found", lineno = 0, 
	isconst = false, notnull = false, default_val = 0x0, datatype = 0x17106b0,
  cursor_explicit_expr = 0x0, cursor_explicit_argrow = 0, cursor_options = 0,
  value = 0, isnull = false, freeval = false, promise = PLPGSQL_PROMISE_NONE}

(gdb) p *(PLpgSQL_var*)estate->datums[1]
$10 = {dtype = PLPGSQL_DTYPE_VAR, dno = 1, refname = 0x1711518 "a1", lineno = 3, 
	isconst = false, notnull = false, default_val = 0x0, datatype = 0x1711408,
  cursor_explicit_expr = 0x0, cursor_explicit_argrow = 0, cursor_options = 0, 
  value = 10, isnull = false, freeval = false, promise = PLPGSQL_PROMISE_NONE}

(gdb) p *(PLpgSQL_var*)estate->datums[2]
$11 = {dtype = PLPGSQL_DTYPE_VAR, dno = 2, refname = 0x1711e20 "a3", lineno = 4, 
	isconst = false, notnull = false, default_val = 0x0, datatype = 0x1711d10,
  cursor_explicit_expr = 0x0, cursor_explicit_argrow = 0, cursor_options = 0, 
  value = 0, isnull = true, freeval = false, promise = PLPGSQL_PROMISE_NONE}
  
(gdb) p *expr
$13 = {query = 0x1712178 "call p1(a1, 20, a3)", parseMode = RAW_PARSE_DEFAULT, 
	plan = 0x0, paramnos = 0x0, func = 0x0, ns = 0x1711e40, expr_simple_expr = 0x0,
  expr_simple_type = 0, expr_simple_typmod = 0, expr_simple_mutable = false, 
  target_param = -1, expr_rw_param = 0x0, expr_simple_plansource = 0x0,
  expr_simple_plan = 0x0, expr_simple_plan_lxid = 0, expr_simple_state = 0x0, 
  expr_simple_in_use = false, expr_simple_lxid = 0}
本文参与 码字裤自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/jackgo73复制
如有侵权,请联系 heekey.com 删除。



 

 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.heekey.com/article/weixin_2123865.html

智能推荐

SDN 作业提示器(持续更新)

SDN解放了手工操作,减少了配置错误,易于统一快速部署 SDN具有广阔的发展前景和巨大的研究价值.

第一章 SDN介绍 (附件3)【云计算,SDN,虚拟化三者关系】

云计算是一种按需分配、按使用量收费的使用模式,提供了一个可配置的资源共享池,用户可以通过网络访问,获取存储空间、网络带宽、服务器、应用软件等等服务。

Linux从零开始(二、基础命令(续二)解压 tar)

由于这是每一个 Linux用户都会经常用到的基本功能,因此我们将介绍最常见到的打 包、压缩和解压缩程序。 打包文件的tar命令 tar命令位于/bin目录...

Linux从零开始(一、安装系统)

先安装一个 Ubuntu(乌班图)/ Deepin(深度)/ Ukylin(优麒麟) 的桌面版。深度 和 优麒麟 都是 基于Ubunutu 的 国产版,添加了许...

Linux命令及文件操作

1.在/tmp/目录下创建test.txt文件,内容为:Hello,World!,用一个命令写出来。     答:     echo "Hello,Wor...

Linux操作系统知识

1.常见的Linux发行版本都有什么?你最擅长哪一个?它的官网网站是什么?说明你擅长哪一块?     答:     常见的Linux发现版本有Redhat...

K8S学习笔记之sed awk使用print printf构建多个参数执行指令配合kubectl操作pod

本文记录在sed awk命令配合下,给kubectl构建参数,实现对pod的操作。

什么是Linux,学习Linux可以做什么工作?

也许这个名字经常出现在你所使用的教科书上,或者是一些技术性的文章上,你却不知其意,此时这个名字再次出现,你就更是好奇了,Linux到底是什么?