0


PostgreSQL源码分析 —— CAST类型转换

我们分析一下PostgreSQL中显式类型转换是如何实现的,在PostgreSQL中,显式类型转换可以用

CAST(x AS typename)

等同于

x::typename

。 这里我们以

select cast (2 as numeric

为例进行分析。

再结合之前对Postgres源码分析——CREATE CAST的分析,基本就弄清了一部分PostgreSQL中数据类型转换问题。当然要完整的理解类型转换还需要完整的理解PostgreSQL中的类型系统,后续还需要我们逐步的深入理解。

源码分析

在分析类型转换前,我们前面分析过

CREATE CAST

的源码,类型转换实质就是定义个类型转换函数,存储在pg_cast系统表中。

CREATE CAST (source_type AS target_type)WITHFUNCTION function_name [(argument_type [,...])][AS ASSIGNMENT |AS IMPLICIT ]

在进行类型转换时会调用这个定义的函数。理解了这个我们再继续分析下面的源码。

主流程
exec_simple_query
--> pg_parse_query   // 语法解析,这块不再做说明,前面的很多文章中已经讲的比较多了--> pg_analyze_and_rewrite
    --> parse_analyze
        --> transformStmt
            --> transformSelectStmt
                --> transformTargetList
                    --> transformTargetEntry
                        --> transformTypeCast // 将TypeCast节点转为FuncExpr节点,调用函数为类型转换函数--> typenameTypeIdAndMod // 类型名获取类型oid,访问pg_type系统表--> exprType // 获取输入表达式的类型oid--> coerce_to_target_type  // 类型转换函数--> can_coerce_type  // 判断能否进行类型转换--> find_coercion_pathway // 查pg_cast系统表,能否被转换--> coerce_type  // 将表达式转换另一个类型--> find_coercion_pathway
                                    --> getBaseTypeAndTypmod
                                    --> build_coercion_expression // 构造强制转换表达式节点--> makeFuncExpr // 构造类型转换函数的调用节点--> coerce_type_typmod
--> pg_plan_queries // 生成执行计划--> pg_plan_query
        --> standard_planner
            --> subquery_planner
                --> preprocess_expression  // 预处理targetList 的表达式--> eval_const_expressions  // 常量表达式化简--> simplify_function
                            --> evaluate_function
                                --> evaluate_expr
                                    --> ExecEvalExprSwitchContext
                                        --> ExecInte
标签: postgresql 数据库

本文转载自: https://blog.csdn.net/s_lisheng/article/details/139780183
版权归原作者 chirpyli 所有, 如有侵权,请联系我们删除。

“PostgreSQL源码分析 —— CAST类型转换”的评论:

还没有评论