金仓数据库KingbaseES 新特性——报错信息显示列名
1.产品新特性
KingbaseES数据库中,当插入或更新一条数据,超出长度后,报错提示信息只显示了列类型,如ERROR: value too long for type character varying(1),而不会显示列名。但是,当数据表中同样类型的列名有多个且长度限制条件相同时,不便用户迅速排查到具体的数据列,会为用户带来一定的困扰,不方便用户分辨出具体哪一列超长,所以希望当某一列超出长度后,报错提示信息能够具体指明是哪一列超长,而不仅仅是抛出字段长度。
2.Oracle与MySQL中的报错信息
通过对Oracle,MySQL数据库进行Insert和Update超长报错提示信息进行对比分析,我们发现了如下内容:
Oracle中Insert操作时候,当超出所设置的长度,报错提示信息会显示当前的用户名(Schema)、表名、列名以及当前实际长度和最大长度。
Oracle中Update操作时候,当超出所设置的长度,报错提示信息会显示当前的用户名(Schema)、表名、列名以及当前实际长度和最大长度。
MySQL中Insert操作时候,当超出所设置的长度,报错提示信息会显示列名以所在行数。MySQL中Update操作时候,当超出所设置的长度,报错提示信息会显示列名以所在行数。
为了方便用户迅速定位错误的数据列,在我们金仓数据库KingbaseES 产品中,对报错提示信息进行了优化改进,实现了在报错提示信息中显示列名的功能。
3.金仓数据库KingbaseES的实现方式
首先我们通过堆栈信息确认,长度报错是在查询规划模块pg_plan_queries中的preprocess_expression进行判断的。
第一步,将列名添加到FunctionCallInfoBaseData 的args结构后面,然后根据相应函数中是否有列名,来确定报错提示信息中是否显示。
第二步,在FuncExpr的args赋值的地方查看是否能够获取到列名,并将其添加到args列表中,将FuncExpr的args直接赋值给FunctionCallInfoBaseData 的args。
经过分析该阶段是在语义分析parse_analyze阶段的transformInsertRow,故在处理完FuncExpr完之后,能够通过ResTarget获取到列名,然后在通过makeConst函数将列名加入args的列表中,最后在相应函数中根据nargs个数进行选择使用。
最终在Kingbase ES中实现了这一功能,使得产品功能更加完善。金仓数据库始终坚持为用户着想,从用户角度解决实际问题,同时将始终坚持创新,提升产品质量,引领国产数据库越好又快向前发展,努力成为世界卓越的数据库产品与服务提供商。