我们分析一下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
版权归原作者 chirpyli 所有, 如有侵权,请联系我们删除。