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

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 &#xff0c;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插件快速解决屏幕适配问题。仅用少量代码&#xff0c;新手均可快速使用。 Step1. 安装 npm install postcss-px-to-viewport-8-plugin --save-dev Step2. 新建 postcss.config.js 文件&#xff0c;做基础配置 module.exports {plugins: {postcss-px-to-v…...

Go基础编程 - 09 - 通道(channel)

通道&#xff08;channel&#xff09; 1. 声明2. channel的操作3. 无缓冲通道4. 有缓冲通道5. 如何优雅的从通道循环取值6. 单向通道7. 异常总结 上一篇&#xff1a;结构体 Go语言的并发模式&#xff1a;不要通过共享内存来通信&#xff0c;而应该通过通信来共享内存。 Go语言…...

[SAP ABAP] 数据类型

1.基本数据类型 示例1 默认定义的基本数据类型是CHAR数据类型 输出结果: 示例2 STRING数据类型用于存储任何长度可变的字符串 输出结果: 示例3 DATE数据类型用于存储日期信息&#xff0c;并且可以存储8位数字 输出结果: 提示Tips&#xff1a;日期和时间类型的变量可以直接进…...

什么是Vue开发技术

概述 Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;它设计得非常灵活&#xff0c;可以轻松地被集成到任何项目中。 vue是视图的发音&#xff0c;其目的是帮助开发者易于上手&#xff0c;提供强大的功能构建复杂的应用程序 示例 以下是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&#xff08;升级助手&#xff09;升级 .NET 老旧版本项目&#xff1a;https://blog.csdn.net/ChaITSimpleLove/article/details/134711604...

SpringBoot如何自定义启动Banner 以及自定义启动项目控制台输出信息 类似于若依启动大佛 制作教程

前言 Spring Boot 项目启动时会在控制台打印出一个 banner&#xff0c;下面演示如何定制这个 banner。 若依也会有相应的启动动画 _ooOoo_o8888888o88" . "88(| -_- |)O\ /O____/---\____. \\| |// ./ \\||| : |||// \/ _||||| -:- |||||- \| | \\…...

访问控制列表(Access Control Lists,ACL)与哈希查找的爱恨情怨

访问控制列表&#xff08;Access Control Lists&#xff0c;ACL&#xff09;与哈希查找 什么是访问控制列表ACL&#xff1f;直接说ACL是干啥的ACL概念为什么需要ACLACL类型ACL匹配机制使用例子 哈希查找什么是哈希查找&#xff1f;哈希查找的基本原理哈希查找的步骤 哈希查找在…...

一文讲清楚分销裂变是什么?怎么做好分销裂变?【附案例】

在数字化营销日益盛行的今天&#xff0c;分销裂变作为一种高效的推广手段&#xff0c;受到了越来越多企业的青睐。那么&#xff0c;分销裂变究竟是什么&#xff1f;我们又该如何做好分销裂变呢&#xff1f;林叔将从定义、方法以及案例分析三个方面进行阐述。 一、分销裂变是什…...

Mybatis Plus 详解 IService、BaseMapper、自动填充、分页查询功能

结构直接看目录 前言 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 愿景 我们的愿景是成为 MyBatis 最好的搭档&#xff0c;就像 魂斗罗 中的 1P、2P&#xff0c;基友搭配&#xff0c;效…...

鸿蒙开发组件:【FA模型的Context】

FA模型的Context FA模型下只有一个Context。Context中的所有功能都是通过方法来提供的&#xff0c;它提供了一些featureAbility中不存在的方法&#xff0c;相当于featureAbility的一个扩展和补全。 接口说明 FA模型下使用Context&#xff0c;需要通过featureAbility下的接口…...

Linux下手动修改服务器时间(没网环境下)

在客户服务器上更新程序时&#xff0c;发现服务器时间不对&#xff0c;现在应该是下午13:44:00&#xff0c;但服务器却显示为&#xff1a;21:40:53&#xff0c;所有是不对的。 date解决办法&#xff1a; 1、由于服务器是没有网的&#xff0c;只能手动设置时间&#xff0c;输入…...

嵌入式系统软件开发环境_3.主要功能和典型产品

1.嵌入式系统软件开发环境的主要功能 由于嵌入式系统的软件开发通常采用的是交叉开发方式&#xff0c;因此其开发环境中的工具应支持这种交叉开发的特点。嵌入式系统软件开发环境的功能应覆盖嵌入式软件开发过程&#xff0c;即编码过程、编译过程、构建过程、下载过程、调式过程…...

使用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系统中&#xff0c;一切皆文件。因此&#xff0c;掌握Linux下文件IO常用的函数…...

【无线传感网】分簇路由算法介绍

目录 1、LEACH路由算法 2、PEGASIS 算法 3、TEEN 算法 5、APTEEN 5、LEACH-C 算法 无线传感网中的路由协议就是寻找一条路径让网络中节点沿着这条路径将数据信息传输出去。路由协议的两大关键要点就是路径的优化和数据的分组,在传统计算机网络中,是将网络的拓扑…...

java 利用poi读取wps嵌入式图片,自测

代码 主要工具类 需要引入依赖&#xff1a; package com.chenkang.demo.util;import cn.wps.officeDocument.x2017.etCustomData.CellImagesDocument; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.…...

git 常用操作指令

文章目录 git clonegit configgit addgit commitgit rmgit branch/checkoutgit pull/pushgit rebash/merge git clone git clone 可以将一个远程 Git 仓库拷贝到本地&#xff0c;让自己能够查看该项目&#xff0c;或者进行修改。 拷贝项目命令格式如下&#xff1a;git clone [u…...

达梦导入导出

针对导出数据库表结构通常有 3 种方法&#xff1a; 使用 DTS 导出 打开 DTS 迁移工具&#xff0c;选择【DM-->SQL】并链接到数据库中&#xff0c;如下图所示&#xff1a; 添加定义脚本&#xff0c;并选择【迁移范围】&#xff08;仅迁移对象定义&#xff09;&#xff0c;如…...

超级数据查看器 教程pdf 1-31集 百度网盘

百度网盘链接 提取码1234https://pan.baidu.com/s/1s_2lbwZ2_Su83vDElv76ag?pwd1234 通过百度网盘分享的文件&#xff1a;超级数据查看器 … 链接:https://pan.baidu.com/s/1s_2lbwZ2_Su83vDElv76ag?pwd1234 提取码:1234 复制这段内容打开「百度网盘APP 即可获取」...

一、开发环境安装 Avalonia

1、概述 官网中是这么介绍Avalonia的&#xff0c;Avalonia是一个强大的框架&#xff0c;使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件&#xff0c;确保在Windows、macOS、Linux、Android、iOS和WebAssembly等不同平台上具有一致的外观和行为。这…...

融资A轮B轮是什么意思?

环境&#xff1a; 融资 问题描述&#xff1a; 融资A轮B轮是什么意思 解决方案&#xff1a; 在A轮融资之前&#xff0c;通常有以下几轮融资阶段&#xff1a; 种子轮&#xff08;Seed Round&#xff09;&#xff1a;这是企业生命周期中最早的融资阶段&#xff0c;通常发生在…...

开发一个python工具,pdf转图片,并且截成单个图片,然后修整没用的白边

今天推荐一键款本人开发的pdf转单张图片并截取没有用的白边工具 一、开发背景&#xff1a; 业务需要将一个pdf文件展示在前端显示&#xff0c;但是基于各种原因&#xff0c;放弃了h5使用插件展示 原因有多个&#xff0c;文件资源太大加载太慢、pdf展示兼容性问题、pdf展示效果…...

手机网络卡顿,试试飞行模式

当你遇到某个网页刷新慢或者打不开&#xff0c;而通过切换飞行模式就能解决这个问题&#xff0c;可能的原因有以下几种&#xff1a; 1. 网络连接重置 切换飞行模式会导致你的手机断开当前的网络连接&#xff08;包括Wi-Fi和移动数据&#xff09;&#xff0c;然后重新建立连接…...

【退役之重学 AI】Ubuntu 安装 Anaconda

一. 下载 安装文件 https://www.anaconda.com/download/success 二. 安装 bash anaconda****.bash 一路 enter&#xff0c;yes 最后一个问你 要不要 conda init&#xff0c;这里得输入yes&#xff08;默认是no&#xff0c;所以不要直接 enter&#xff09;&#xff0c;否则你…...

wordpress 左右翻页/深圳谷歌网络推广公司

Lua支持goto语法, 但是有一定的局限性.例如1. 不能在block外面跳入block(因为block中的lable不可见), 2. 不能跳出或者跳入一个函数. 3. 不能跳入本地变量的作用域.Lua poses some restrictions to where you can jump with a goto. First, labels follow the usual visibility…...

兰溪优秀高端网站设计地址/发广告推广平台

本文讲的是许给云存储一个未来&#xff0c;【IT168 资讯】在IT行业中&#xff0c;许多厂商正在不断推出创新的托管解决方案。  一些厂商是通过市场宣传语言来吸引你的眼球&#xff0c;一些厂商则用是新方式来解决旧问题。但是作为一名负责的IT人员&#xff0c;你确实需要注意…...

南京高端网站建设/新公司如何做推广

开头 Spring框架自诞生以来一直备受开发者青睐&#xff0c;有人亲切的称之为&#xff1a;Spring 全家桶。Spring更是避免了重复造轮子的工作并跟随着互联网行业的发展做出不断的更新&#xff0c;很多研发人员把spring看作心目中最好的Java项目&#xff0c;没有之一。 **可以毫…...

建设一个网站的好处/关键词百度网盘

一、问题描述&#xff1a; KVM中宿主机通过console无法连接客户机&#xff0c;卡在这里不动。 # virsh console vm01 Connected to domain vm01 Escape character is ^] 二、解决办法&#xff1a; 利用vnc或宿主机的桌面进入客户机vm01中添加参数 1、添加ttyS0的安全许可&#…...

vr网站开发/网上引流推广怎么做

linux Windows的默认编码为GBK&#xff0c;Linux的默认编码为UTF-8。在Windows下编辑的中文&#xff0c;在Linux下显示为乱码。为了解决此问题&#xff0c;修改Linux的默认编码为GBK2&#xff09;查看支持的字符集:# locale -a3) 安装英文版默认的字符集配置为&#xff1a;# c…...

成人本科官网/谷歌seo外包公司哪家好

/home/user/Documents文件夹突然消失了&#xff0c;最近的操作是vsftpd配置行为&#xff0c;但是并没有涉及该文件夹的操作。求助&#xff0c;个人很多资料保存在这个文件夹下。OS: Linux Mint 17.3(rosa)bash_history:sudo adduser jin vboxuserscat /etc/group | grep vboxsu…...