
PostgreSQL(简称pg)是一个高级的对象关系数据库管理系统,它支持SQL标准的一个扩展子集。最近在研究pg14的create table like语句,如下命令会被拆分成若干个statement,在greenplum中QD与QE的处理还不一样,会将statement从QD分发到各个QE上。
CREATE TABLE inhg (x text, LIKE inhx INCLUDING INDEXES);
当前sql语句会在内核中拆分成create、like table两个statement。
create table statement中会使用DistributeBy的内容生成GpPolicy,同时会定义Relation。
like table statement中会生成AlterTableCmd、CommentStmt、IndexStmt,这些会在下一轮调用中使用,例如:上面这个语句会生成IndexStmt,将like的table(inhx)的index克隆一份。
而我们自己实现的DistributeBy是在第一轮CreateStatement中提前创建的,这个又依赖于inhx表的index,后来由于pg14代码的重构,移除了inh_indexes,新增了likecauses,并且移动index逻辑到第二轮调用,因此上述语句在我们内核升级过程中,就会创建失败。
因此为了解决create table like语句创建失败的问题,最终定位于distributeBy逻辑处理不当,这里重构为使用likecauses,废除inh_indexes。
今后将继续分享pg、gpdb等相关内容,本节完~