Klustron 不支持的PostgreSQL语法和功能汇总
Klustron 不支持的PostgreSQL语法和功能汇总
Klustron(原KunlunBase) 支持大多数 PostgreSQL DDL SQL 语法和几乎全部 DML SQL 语法,下文列出的功能点除外。 对于Klustron 支持的SQL语法和功能用法,可以 参考PostgreSQL文档
一、不支持的功能特性
- 外键 - 创建外键的DDL语句会被忽略,返回客户端警告消息而不是错误消息。这样,数据导入可以正常运行,只是在KlustronDB中,不存在外键约束。 
- 数组类型 和 Range 类型 - 从Klustron-1.3版本开始,支持了元素类型为数值类型的任意维度的数组类型。 
- 数据流式复制,包括基于 WAL 的物理复制以及逻辑复制 - 执行这些功能对应的DDL语句,KlustronDB均会报错。KlustronDB 在存储shard中有独特的Fullsync高可用机制,基于MySQL的binlog replication. 
- 数据表和索引的存储相关选项 - create table 语句的所有 storage params(存储参数),以及表空间(TABLESPACE)选项。这些选项会被忽略并返回警告消息给客户端。新增了适应于Klustron的存储选项。
- exclude约束:不支持,如果使用了则报错。
- 索引的include字段:忽略。Include字段用于实现覆盖索引的效果,忽略后索引功能可以正常工作。
- 系统列(OID, CTID 等)。注意,tableOID系统列仍然有效,可以正常使用。
 - 这些操作不可以针对用户数据表执行操作,可以针对计算节点本地存储的元数据表执行操作。 
- create table 语句的所有 
- 针对数据表的存储管理命令 - 包括 - cluster,- vacuum,- reindex。- 这些命令自1.3.3 版本开始支持,在此之前的版本会报错。支持的方式: - CLUSTER命令:直接忽略,因为KlustronDB的数据存储方式是b+tree 而不是heap, 不需要此操作。
- VACUUM 和 REINDEX 命令:发送OPTIMIZE TABLE 命令给目标表。
 - 原本PostgreSQL的后台进程自动定期执行的 autovacuum 仍然会后台定期自动运行。由于在计算节点中仅存储元数据表,占用空间极小(通常几个MB),因此与PostgreSQL不同,KlustronDB中定期自动运行的VACUUM不会消耗大量IO带宽,不会影响系统性能。 
- 'create table as select from'语句- 该语句自Klustron-1.2 版本开始支持。 
- CREATE/ALTER/DROP TABLESPACE语句以及表空间管理功能- Klustron不使用PostgreSQL的存储引擎存储用户数据,因此不支持PostgreSQL的表空间管理功能。 
- create index高级功能 Klustron 不支持这些索引选项和功能: - 表达式作为索引字段
- partial index选项:忽略。此选项用于忽略某些数据行不为它们插入索引行。
- CONCURRENT选项:忽略
- include子句:忽略
- 'COLLATE'子句 :禁止, 不可以使用其他COLLATION来做字符串比较和排序,仅可以使用该列的COLLATION。
- 'nulls first' / 'nulls last' :如果指定了会被自动忽略,总是使用MySQL的默认方式(nulls first),与 PostgreSQL的默认方式(nulls last) 刚好相反。
- opclass禁止,如果指定了会报错
- hash索引类型:由于MySQL 不支持hash index,所以即使指定了也会被自动忽略,索引仍然使用b+tree
- rtree索引类型:不支持;但是Klustron支持使用空间索引类型,配合PostGIS扩展组件。
- exclude子句:不支持,如果使用了就会报错。
 - 从Klustron-1.3和Klustron-1.2.2版本开始,可以成功创建partial索引,partial 选项被忽略,也就是所有数据行都会有索引行,这样并不会影响查询结果的正确性,仅在理论上对查询性能可能有一些影响。 
- create / alter database的TABLESPACE 选项, 这些选项会被忽略。
- CREATE/ALTER TABLE不支持的功能 Klustron自动忽略这些选项:- SET { WITH | WITHOUT } OIDS
- SET { LOGGED | UNLOGGED }
- 列和表级别的外键约束
- CLUSTER 选项:CLUSTER ON index_name ; SET WITHOUT CLUSTER
- 表空间(TABLESPACE )选项
- 存储参数
- 流复制设置(含有REPLICA关键字的子句)
 
- 不可以在显式事务中执行DDL语句 - 这个要求与MySQL一致,对于PostgreSQL用户来说,如果有此情形,则需要修改一下SQL代码:每一个DDL 都不能放在显式启动的事务中执行。 
- Klustron 1.1 不支持但是 从 Klustron 1.2 版本起,支持的功能 存储过程,触发器,物化视图,policy(即row level security),domain, json数据管理 
- 从Klustron-1.3版本开始,支持PostGIS和PGVector插件 - 必须使用Klustron自带的PostGIS和PGVector插件,不可以使用PostgreSQL社区的版本。PostgreSQL社区的其他extension插件,只要支持PostgreSQL-11 版本(几乎全部如此),就可以挂载到Klustron的计算节点正常工作,但是需要使用Klustron的头文件编译该插件。 
二、与 PostgreSQL 有差异的功能特性
- 加列 ALTER TABLE ADD COLUMN - 对已有的表新加的列,如果有缺省值的话,缺省值不可以是MySQL无法执行的表达式,只能是常量或者MySQL可以执行的表达式。例如,表达式中的函数和运算符必须在MySQL中存在和支持。 另外,如果这个新增列是sequence类型,那么这个表只能新增一列这样的sequence列,因为Klustron会在存储节点中将该列定义为MySQL的自增列,以便为已有的行的该列新字段自动赋值。而MySQL的每个表只允许一个自增列。 
- 索引的 - 'nulls first' / 'nulls last'选项- 无论指定哪个选项,总是使用MySQL的默认方式(nulls first),与PostgreSQL的默认方式(nulls last) 刚好相反。 
- 数据类型支持 - 时间戳的有效范围缩小到了 [ '0000-01-01 00:00:00.000000' , '9999-12-31 23:59:59.999999' ].
- 日期类型的有效范围缩小到了[ '0000-01-01' , '9999-12-31' ].
 
- 时间戳的有效范围缩小到了 
- json查询中的问号(?)运算符 Klustron中不支持在json查询中使用问号(?)运算符,例如 - SELECT jsonb '{"a":null, "b":"qq"}' ? 'a';- 因为问号(?) 用于MySQL 语法的prepare statement 查询语句中做参数占位符了。用户可以使用json_exists() 来做等价的检查。 - 从Klustron-1.3版本开始,这个运算符在MySQL连接中仍然作为prepared statemenet的参数占位符,但是在PostgreSQL连接中可以作为普通的运算符使用,包括可以作为JSON数据查找运算符。 
