Klustron 不支持的PostgreSQL语法和功能汇总
Klustron 不支持的PostgreSQL语法和功能汇总
Klustron(原KunlunBase) 支持大多数 PostgreSQL DDL SQL 语法和几乎全部 DML SQL 语法,下文列出的功能点除外。 对于Klustron 支持的SQL语法和功能用法,可以 参考PostgreSQL文档
一、不支持的功能特性
外键
表继承
用户自定义类型(enum除外)及其继承
XML数据管理
对象数据库相关功能
数组类型 和 Range 类型 从Klustron-1.3版本开始,支持了元素类型为数值类型的任意维度的数组类型。
数据流式复制,包括基于 WAL 的物理复制以及逻辑复制
数据表和索引的存储相关选项
- create table 语句的所有
storage params
(存储参数),以及表空间设置。这些选项会被忽略并返回警告消息给客户端。 exclude
约束:忽略并返回警告- 索引的
include
字段 'create table select from'
语句- 针对数据表的存储管理操作,包括
cluster
,vacuum
,reindex
,etc
。 - 系统列(OID, CTID 等)
这些操作不可以针对用户数据表执行操作,可以针对计算节点本地存储的元数据表执行操作。
- create table 语句的所有
create index高级功能 Klustron 不支持这些索引选项和功能:
- 表达式作为索引字段
partial index
(忽略某些数据行不为它们插入索引行)CONCURRENT
选项:忽略include
子句:忽略'COLLATE'
子句 :禁止,'nulls first' / 'nulls last' :
如果指定了会被自动忽略,总是使用MySQL的默认方式,与 PostgreSQL的默认方式刚好相反。opclass
禁止hash
索引类型:由于MySQL 不支持hash index,所以即使指定了也会被自动忽略,索引仍然使用b+treertree
索引类型:不支持exclude
子句:不支持
从Klustron-1.3和Klustron-1.2.2版本开始,可以成功创建partial索引和exclude索引,partial或者exclude 选项被忽略。
create / alter database
的存储相关选项ALTER TABLE
不支持的功能 Klustron自动忽略这些选项:SET { WITH | WITHOUT } OIDS
SET { LOGGED | UNLOGGED }
- 列和表级别的外键约束
- CLUSTER 选项:CLUSTER ON index_name SET WITHOUT CLUSTER
- 自定义约束
ADD CONSTRAINT ALTER CONSTRAINT VALIDATE CONSTRAINT
- 对表空间和存储参数的修改
- 流复制设置(含有
REPLICA
关键字的子句)
不支持 rules 这是一个在PostgreSQL中都让很多人迷惑的功能,Klustron选择不支持。
不可以在显式事务中执行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的计算节点正常工作。
二、与 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数据查找运算符。