当前位置: 首页 > news >正文

PgSQL技术内幕 - ereport ERROR跳转机制

PgSQL技术内幕 - ereport ERROR跳转机制

使用客户端执行SQL的时候经常遇到报ERROR错误,然后SQL语句就退出了。当然,事务也会回滚掉。本文我们看下它是如何做到退出SQL语句并回滚事务的。

1、以insert一个numeric类型值为例

表一个字段为numeric(10,2)类型,表示存储10位数字,精确到小数点后两位。当插入的值超过10位时就会报错:numeric field overflow

首先观察报错的位置:

e7d3cc6309b593fc1a0241265d1a7232.png

由ereport输出打印日志。从函数ereport_domain函数的调用逻辑,如下图所示,可以看到通过siglongjmp函数进行跳转。

daa166336a7d5637fc7eb042e0cfffad.png

2、PG_TRY/PG_CATCH/PG_RE_THROW/PG_END_TRY

从上面可知,PG中通过PG_RE_THROW完成跳转,捕获ereport(ERROR)的API为:

PG_TRY();
{... code that might throw ereport(ERROR) ...
}
PG_CATCH();
{... error recovery code ...
}
PG_END_TRY();

该宏定义:

4622b076ea134d5c4460b58e6a58847c.png

sigsetjmp会保存目前堆栈环境,然后将目前的地址作为一个记号。程序其他地方调用siglongjmp时会直接跳到这个记号位置,然后还原堆栈,继续程序的执行。

3、整体逻辑

15d45f44b6ce6bf64ca6b66a256480d4.png

从PostgresMain接收命令ReadCommand到调用exec_simple_query执行SQL,然后standard_ExectorRun执行器开始执行;再到ExecModifyTable执行insert操作。首先,从子节点获取slot,然后执行ExecInsert执行插入操作。红色箭头为插入操作函数调用方向。

从子节点获取slot时,会调用apply_typmod函数校验numeric类型值是否会溢出。一旦溢出则报ereport ERROR。

蓝色箭头为跳转方向。从apply_typmod函数跳转到standard_ExecutorRun的PG_TRY位置,然后通过PG_CATCH处理一些清理操作,再由PG_RE_THROW跳转到exec_simple_query的PG_TRY位置,同理一直跳转到PostgresMain的sigsetjmp位置。

由此完成插入过程中报错退出动作,也就是说当ereport报ERROR时,并不是继续当前函数的退出逻辑,而是跳转到PostgresMain的sigsetjmp位置接着执行,继续一些清理操作,包括调用AbortCurrentTransaction回滚事务。

从上图中可以看到,回滚事务后会接着再次进入for循环,调用ReadCommand读取新命令执行,当然若没有命令到来,则进入等待。

http://www.lryc.cn/news/269162.html

相关文章:

  • 【验证概括 SV的数据类型_2023.12.18】
  • 如何在无公网IP环境下远程访问Serv-U FTP服务器共享文件
  • 电子工程师如何接私活赚外快?
  • 数据库进阶教学——读写分离(Mycat1.6+Ubuntu22.04主+Win10从)
  • MidJourney笔记(9)-daily_theme-docs-describe
  • 鸿蒙 - arkTs:网络请求封装和使用
  • 多功能演示工具ProVideoPlayer2 mac特色介绍
  • java设计模式学习之【责任链模式】
  • docker 安装可视化工具 Protainer 以及 汉化
  • 【SpringBoot篇】详解Bean的管理(获取bean,bean的作用域,第三方bean)
  • 彭涛:2023年终复盘,工作,团队,个人!
  • 【数据结构和算法】---二叉树(2)--堆的实现和应用
  • 【大模型实践】基于文心一言的对话模型设计
  • 聊聊PowerJob的StoreStrategy
  • HTML+CSS+JS网页设计期末课程大作业 web课程设计 web前端开发 网页规划与设计
  • vscode | python | remote-SSH | Debug 配置 + CLIP4Clip实验记录
  • 【Linux】实现windows主机与ubuntu虚拟机系统之间文件/字符复制粘贴
  • Ubuntu22.04-安装后Terminal无法调出
  • ffmpeg两种windows版本区别说明
  • 最新国内AI绘画Midjourney绘画提示词Prompt分享
  • ChatGPT4.0(中文版)国内无限制免费版(附网址)
  • 模拟电路基础知识笔记,你想知道的都有,建议收藏!
  • 【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用
  • Pandas 高级教程——高级时间序列分析
  • 解决Pycharm pip安装模块太慢问题,pycharm2022没有manage repositories配置镜像源
  • 十二:爬虫-Scrapy框架(上)
  • BUUCTF Reverse/[2019红帽杯]Snake
  • 概率论相关题型
  • C#中的Attribute详解(上)
  • 天津医科大学临床医学院专升本药学专业有机化学考试大纲