PostgreSQL源码分析——CREATE CAST
CREATE CAST源码分析
CREATE CAST用法
CREATE CAST —— 定义一个用户自定义的类型转换
用法如下:
CREATE CAST (source_type AS target_type)WITH FUNCTION function_name [ (argument_type [, ...]) ][ AS ASSIGNMENT | AS IMPLICIT ]CREATE CAST (source_type AS target_type)WITHOUT FUNCTION[ AS ASSIGNMENT | AS IMPLICIT ]CREATE CAST (source_type AS target_type)WITH INOUT[ AS ASSIGNMENT | AS IMPLICIT ]
如何使用以及用法请参考PostgreSQL文档中CREATE CAST一节。下面我们主要分析一下其源码,看一下是如何实现的。
源码分析
因为CREATE CAST属于Utility型语句,无需查询优化,其主流程如下:
exec_simple_query
--> pg_parse_query // 语法解析
--> pg_analyze_and_rewrite // 语义分析--> parse_analyze--> pg_rewrite_query
--> pg_plan_queries // 生成执行计划
--> PortalStart
--> PortalRun // 执行器执行--> PortalRunMulti--> PortalRunUtility--> ProcessUtility--> standard_ProcessUtility--> ProcessUtilitySlow--> CreateCast // 进入CreateCast处理函数处理CREATE CAST语句
--> PortalDrop
主要的处理逻辑都在CreateCast函数中完成。后续会重点分析一下这个函数。
解析部分
我们首先分析一下其语法解析部分,这部分比较简单,核心是CreateCastStmt的定义,定义如下:
/* ----------------------* CREATE CAST Statement* ----------------------*/
typedef struct CreateCastStmt
{NodeTag type;TypeName *sourcetype;TypeName *targettype;ObjectWithArgs *func;CoercionContext context;bool inout;
} CreateCastStmt;
CREATE CAST其在gram.y中定义的表示如下:
/*************************************************** CREATE CAST / DROP CAST**************************************************/
CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'WITH FUNCTION function_with_argtypes cast_context{CreateCastStmt *n = makeNode(CreateCastStmt);n->sourcetype = $4;n->targettype = $6;n->func = $10;n->context = (CoercionContext) $11;n->inout = false;$$ = (Node *)n;}| CREATE CAST '(' Typename AS Typename ')'WITHOUT FUNCTION cast_context{CreateCastStmt *n = makeNode(CreateCastStmt);n->sourcetype = $4;n->targettype = $6;n->func = NULL;n->context = (CoercionContext) $10;n->inout = false;$$ = (Node *)n;}| CREATE CAST '(' Typename AS Typename ')'WITH INOUT cast_context{CreateCastStmt *n = makeNode(CreateCastStmt);n->sourcetype = $4;n->targettype = $6;n->func = NULL;n->context = (CoercionContext) $10;n->inout = true;$$ = (Node *)n;};cast_context: AS IMPLICIT_P { $$ = COERCION_IMPLICIT; }| AS ASSIGNMENT { $$ = COERCION_ASSIGNMENT; }| /*EMPTY*/ { $$ = COERCION_EXPLICIT; };DropCastStmt: DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior{DropStmt *n = makeNode(DropStmt);n->removeType = OBJECT_CAST;n->objects = list_make1(list_make2($5, $7));n->behavior = $9;n->missing_ok = $3;n->concurrent = false;$$ = (Node *)n;};opt_if_exists: IF_P EXISTS { $$ = true; }| /*EMPTY*/ { $$ = false; };
非常容易理解,下面我们重点分析一下CreateCast函数的实现。
执行部分
用户通过CREATE CAST语句自定义一个类型转换,数据库肯定有个地方将这个转换的信息存起来,这个地方就是pg_cast系统表。pg_cast系统表存在数据类型转换路径,包括内建和用户自定义的。
postgres@postgres=# \d pg_castTable "pg_catalog.pg_cast"Column | Type | Collation | Nullable | Default
-------------+--------+-----------+----------+---------oid | oid | | not null | castsource | oid | | not null | -- 源数据类型的OIDcasttarget | oid | | not null | -- 目标数据类型的OIDcastfunc | oid | | not null | -- 执行该转换的函数的OID。如果该转换方法不需要一个函数则存储0。castcontext | "char" | | not null | -- 指示该转换能被调用的环境castmethod | "char" | | not null | -- 指示转换如何被执行。
Indexes:"pg_cast_oid_index" UNIQUE, btree (oid)"pg_cast_source_target_index" UNIQUE, btree (castsource, casttarget)
而CreateCast函数的主要内容就是将用户自定义的类型转换信息插入到pg_cast系统表中。
CreateCast
--> LookupFuncWithArgs // 查到pg_proc系统表,看是否已存在--> LookupFuncNameInternal--> FuncnameGetCandidates
--> IsBinaryCoercible(Oid srctype, Oid targettype) //Check if srctype is binary-coercible to targettype.
--> CastCreate // 将类型转换信息插入pg_cast系统表中
相关文章:
PostgreSQL源码分析——CREATE CAST
CREATE CAST源码分析 CREATE CAST用法 CREATE CAST —— 定义一个用户自定义的类型转换 用法如下: CREATE CAST (source_type AS target_type)WITH FUNCTION function_name [ (argument_type [, ...]) ][ AS ASSIGNMENT | AS IMPLICIT ]CREATE CAST (source_type…...
解锁5G新营销:视频短信的优势与全方位推广策略
随着5G时代的全面来临,企业的数字化转型步伐日益加快,视频短信作为新兴的数字营销工具,正逐步展现出其巨大的潜力。视频短信群发以其独特的形式和内容,将图片、文字、视频、声音融为一体,为用户带来全新的直观感受&…...
视频监控平台功能:国外的硬盘录像机NVR通过ISUP协议(原ehome协议)接入AS-V1000视频平台
目录 一、背景说明 二、ISUP协议介绍 1、海康ISUP协议概述 2、ISUP协议支持主码流和子码流切换 (1)灵活配置和个性化 (2)适应不同网络带宽,提高使用体验 3、海康ehome相关文章 三、ISUP协议接入说明 1、平台侧…...
PostgreSQL查询用户
在 PostgreSQL 中,可以通过查询系统表来确定当前用户是否是超级管理员(超级用户)。具体来说,可以使用 pg_roles 系统表,该表包含数据库中所有角色的信息。 以下是查询当前用户是否是超级用户的 SQL 语句: …...
力扣1539.第k个缺失的正整数
力扣1539.第k个缺失的正整数 占位运算 只要n<k ,k;最终k就是结果 class Solution {public:int findKthPositive(vector<int>& arr, int k) {for(int n : arr){if(n < k) k ;else break;}return k;}};...
如何快速解决屏幕适配问题
下面将利用postcss插件快速解决屏幕适配问题。仅用少量代码,新手均可快速使用。 Step1. 安装 npm install postcss-px-to-viewport-8-plugin --save-dev Step2. 新建 postcss.config.js 文件,做基础配置 module.exports {plugins: {postcss-px-to-v…...
Go基础编程 - 09 - 通道(channel)
通道(channel) 1. 声明2. channel的操作3. 无缓冲通道4. 有缓冲通道5. 如何优雅的从通道循环取值6. 单向通道7. 异常总结 上一篇:结构体 Go语言的并发模式:不要通过共享内存来通信,而应该通过通信来共享内存。 Go语言…...
[SAP ABAP] 数据类型
1.基本数据类型 示例1 默认定义的基本数据类型是CHAR数据类型 输出结果: 示例2 STRING数据类型用于存储任何长度可变的字符串 输出结果: 示例3 DATE数据类型用于存储日期信息,并且可以存储8位数字 输出结果: 提示Tips:日期和时间类型的变量可以直接进…...
什么是Vue开发技术
概述 Vue.js 是一个用于构建用户界面的渐进式框架,它设计得非常灵活,可以轻松地被集成到任何项目中。 vue是视图的发音,其目的是帮助开发者易于上手,提供强大的功能构建复杂的应用程序 示例 以下是vue基本的语法概述 声明式渲…...
【QT】
通信服务端实现 widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpServer>//服务器类 #include <QMessageBox>//消息 #include <QTcpServer> #include <QList> #include <QTcpSocket> QT_BEGIN_NAMESPAC…...
【转载】使用 .NET Upgrade Assistant(升级助手)升级 .NET 老旧版本项目
使用 .NET Upgrade Assistant(升级助手)升级 .NET 老旧版本项目:https://blog.csdn.net/ChaITSimpleLove/article/details/134711604...
SpringBoot如何自定义启动Banner 以及自定义启动项目控制台输出信息 类似于若依启动大佛 制作教程
前言 Spring Boot 项目启动时会在控制台打印出一个 banner,下面演示如何定制这个 banner。 若依也会有相应的启动动画 _ooOoo_o8888888o88" . "88(| -_- |)O\ /O____/---\____. \\| |// ./ \\||| : |||// \/ _||||| -:- |||||- \| | \\…...
访问控制列表(Access Control Lists,ACL)与哈希查找的爱恨情怨
访问控制列表(Access Control Lists,ACL)与哈希查找 什么是访问控制列表ACL?直接说ACL是干啥的ACL概念为什么需要ACLACL类型ACL匹配机制使用例子 哈希查找什么是哈希查找?哈希查找的基本原理哈希查找的步骤 哈希查找在…...
一文讲清楚分销裂变是什么?怎么做好分销裂变?【附案例】
在数字化营销日益盛行的今天,分销裂变作为一种高效的推广手段,受到了越来越多企业的青睐。那么,分销裂变究竟是什么?我们又该如何做好分销裂变呢?林叔将从定义、方法以及案例分析三个方面进行阐述。 一、分销裂变是什…...
Mybatis Plus 详解 IService、BaseMapper、自动填充、分页查询功能
结构直接看目录 前言 MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 愿景 我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效…...
鸿蒙开发组件:【FA模型的Context】
FA模型的Context FA模型下只有一个Context。Context中的所有功能都是通过方法来提供的,它提供了一些featureAbility中不存在的方法,相当于featureAbility的一个扩展和补全。 接口说明 FA模型下使用Context,需要通过featureAbility下的接口…...
Linux下手动修改服务器时间(没网环境下)
在客户服务器上更新程序时,发现服务器时间不对,现在应该是下午13:44:00,但服务器却显示为:21:40:53,所有是不对的。 date解决办法: 1、由于服务器是没有网的,只能手动设置时间,输入…...
嵌入式系统软件开发环境_3.主要功能和典型产品
1.嵌入式系统软件开发环境的主要功能 由于嵌入式系统的软件开发通常采用的是交叉开发方式,因此其开发环境中的工具应支持这种交叉开发的特点。嵌入式系统软件开发环境的功能应覆盖嵌入式软件开发过程,即编码过程、编译过程、构建过程、下载过程、调式过程…...
使用Python保护或加密Excel文件的7种方法
目录 安装Python Excel库 Python 使用文档打开密码保护 Excel 文件 Python 使用文档修改密码保护 Excel 文件 Python 将 Excel 文件标记为最终版本 Python 保护 Excel 工作表 Python 在保护 Excel 工作表的同时允许编辑某些单元格 Python 锁定 Excel 工作表中的特定单元…...
【嵌入式Linux】<总览> 文件IO(更新中)
文章目录 前言 一、常用函数 1. open函数 2. close函数 3. write函数 4. read函数 5. dup函数 6. dup2函数 二、文件读写细节 1. 换行符 2. 文件描述符 3. errno和perror 前言 在Linux系统中,一切皆文件。因此,掌握Linux下文件IO常用的函数…...
Mermaid:文本驱动的可视化引擎深度指南
Mermaid:文本驱动的可视化引擎深度指南 【免费下载链接】mermaid mermaid-js/mermaid: 是一个用于生成图表和流程图的 Markdown 渲染器,支持多种图表类型和丰富的样式。适合对 Markdown、图表和流程图以及想要使用 Markdown 绘制图表和流程图的开发者。 …...
从镜像到实战:星图OpenClaw+Qwen3-32B完整链路
从镜像到实战:星图OpenClawQwen3-32B完整链路 1. 为什么选择OpenClawQwen3-32B组合 去年冬天,当我第一次尝试用AI自动化处理周报时,发现公有云方案总在数据隐私和功能定制上让我束手束脚。直到遇见星图平台的OpenClaw镜像与Qwen3-32B组合&a…...
手把手教你用STM32实现BLDC电机的SPWM控制(附代码调试心得)
STM32实战:无刷直流电机SPWM控制全解析与代码优化指南 从理论到实践:BLDC电机控制的核心逻辑 第一次接触无刷直流电机(BLDC)控制时,我被它优雅的工作原理所吸引——没有电刷的火花和磨损,却能实现高效的能量转换。在工业自动化、无…...
YOLOv7剪枝实战:5种高效剪枝方法对比与代码实现
YOLOv7剪枝实战:5种高效剪枝方法对比与代码实现 在目标检测领域,YOLOv7以其卓越的速度-精度平衡成为工业界宠儿。但当我们将模型部署到边缘设备或需要高吞吐量的生产环境时,原始模型的计算量和参数量往往成为瓶颈。这时,模型剪枝技…...
OpenClaw版本升级:nanobot镜像迁移全记录
OpenClaw版本升级:nanobot镜像迁移全记录 1. 升级背景与准备工作 去年我在本地部署了基于OpenClaw v1.2的nanobot镜像,这套系统一直稳定运行着我的自动化办公流程。直到上个月收到社区通知,新版本v2.1重构了核心架构,特别是技能…...
pyqt使用QChartView绘制饼状图详解(QPieSeries)
pyqt使用QChartView绘制柱状图一、工程搭建二、QPieSeries详解1、核心概念2、主要功能和方法2.1、QPieSeries 的常用方法2.2、QPieSlice 的常用属性和方法3、关键点解释4、常见问题二、代码示例1、示例代码2、效果展示一、工程搭建 pyqt6QtCharts模块需要单独安装,…...
突破3大技术瓶颈:抖音音乐批量下载工具的创新解决方案
突破3大技术瓶颈:抖音音乐批量下载工具的创新解决方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容创作领域,音频素材的获取与管理已成为制约生产力的关键因素。特别是当…...
QMK Toolbox:机械键盘固件定制与刷写全攻略
QMK Toolbox:机械键盘固件定制与刷写全攻略 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox 一、核心价值:重新定义键盘控制自由 QMK Toolbox 作为开源硬件领域的…...
实战必备:快马AI打造ensp实验室级安装方案,保障网络教学顺利进行
作为一名网络工程专业的教师,我深知ensp(Enterprise Network Simulation Platform)在实验教学中的重要性。但每次新学期开始,最头疼的就是帮学生们搭建实验环境。不同电脑配置、系统版本、驱动兼容性问题,常常让简单的…...
Pixel Fashion Atelier实战教程:如何导出带元数据的PNG并适配Unity像素精灵管线
Pixel Fashion Atelier实战教程:如何导出带元数据的PNG并适配Unity像素精灵管线 1. 教程概述 Pixel Fashion Atelier作为一款专为像素艺术设计的AI生成工具,其输出结果需要经过特殊处理才能完美适配Unity的像素精灵管线。本教程将手把手教你如何导出带…...
