跳至主要內容

Klustron 不支持的PostgreSQL语法和功能汇总

Klustron大约 4 分钟

Klustron 不支持的PostgreSQL语法和功能汇总

Klustron(原KunlunBase) 支持大多数 PostgreSQL DDL SQL 语法和几乎全部 DML SQL 语法,下文列出的功能点除外。 对于Klustron 支持的SQL语法和功能用法,可以 参考PostgreSQL文档open in new window

一、不支持的功能特性

  1. 外键

  2. 表继承

  3. 用户自定义类型(enum除外)及其继承

  4. XML数据管理

  5. 对象数据库相关功能

  6. 数组类型 和 Range 类型 从Klustron-1.3版本开始,支持了元素类型为数值类型的任意维度的数组类型。

  7. 数据流式复制,包括基于 WAL 的物理复制以及逻辑复制

  8. 数据表和索引的存储相关选项

    • create table 语句的所有 storage params(存储参数),以及表空间设置。这些选项会被忽略并返回警告消息给客户端。
    • exclude约束:忽略并返回警告
    • 索引的include字段
    • 'create table select from'语句
    • 针对数据表的存储管理操作,包括 cluster, vacuum, reindex, etc
    • 系统列(OID, CTID 等)

    这些操作不可以针对用户数据表执行操作,可以针对计算节点本地存储的元数据表执行操作。

  9. create index高级功能 Klustron 不支持这些索引选项和功能:

    • 表达式作为索引字段
    • partial index(忽略某些数据行不为它们插入索引行)
    • CONCURRENT选项:忽略
    • include子句:忽略
    • 'COLLATE'子句 :禁止,
    • 'nulls first' / 'nulls last' :如果指定了会被自动忽略,总是使用MySQL的默认方式,与 PostgreSQL的默认方式刚好相反。
    • opclass禁止
    • hash索引类型:由于MySQL 不支持hash index,所以即使指定了也会被自动忽略,索引仍然使用b+tree
    • rtree索引类型:不支持
    • exclude子句:不支持

从Klustron-1.3和Klustron-1.2.2版本开始,可以成功创建partial索引和exclude索引,partial或者exclude 选项被忽略。

  1. create / alter database 的存储相关选项

  2. 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关键字的子句)
  3. 不支持 rules 这是一个在PostgreSQL中都让很多人迷惑的功能,Klustron选择不支持。

  4. 不可以在显式事务中执行DDL语句 这个要求与MySQL一致,对于PostgreSQL用户来说则需要修改一下SQL代码,每一个DDL 都不能放在显式启动的事务中执行。

  5. Klustron 1.1 不支持但是 从 Klustron 1.2 版本起,支持的功能 触发器,物化视图,policy(即row level security),domain, json数据管理

  6. 从Klustron-1.3版本开始,支持PostGIS和PGVector插件。 必须使用Klustron自带的PostGIS和PGVector插件,不可以使用PostgreSQL社区的版本。PostgreSQL社区的其他extension插件,只要支持PostgreSQL-11 版本(几乎全部如此),就可以挂载到Klustron的计算节点正常工作。

二、与 PostgreSQL 有差异的功能特性

  1. 加列 ALTER TABLE ADD COLUMN 对已有的表新加的列,如果有缺省值的话,缺省值不可以是MySQL无法执行的表达式,只能是常量或者MySQL可以执行的表达式。例如,表达式中的函数和运算符必须在MySQL中存在和支持。 另外,如果这个新增列是sequence类型,那么这个表只能新增一列这样的sequence列,因为Klustron会使用MySQL的自增列为已有的行的新字段赋值。而MySQL的每个表只允许一个自增列。
  2. 索引的 'nulls first' / 'nulls last' 选项 无论指定哪个选项,总是使用MySQL的默认方式(nulls first),与PostgreSQL的默认方式(nulls last) 刚好相反。
  3. 数据类型支持
    • 时间戳的有效范围缩小到了 [ '0000-01-01 00:00:00.000000' , '9999-12-31 23:59:59.999999' ].
    • 日期类型的有效范围缩小到了 [ '0000-01-01' , '9999-12-31' ].
  4. json查询中的问号(?)运算符 Klustron中不支持在json查询中使用问号(?)运算符,例如
SELECT jsonb '{"a":null, "b":"qq"}' ? 'a';

因为问号(?) 用于MySQL 语法的prepare statement 查询语句中做参数占位符了。用户可以使用json_exists() 来做等价的检查。

从Klustron-1.3版本开始,这个运算符在MySQL连接中仍然作为prepared statemenet的参数占位符,但是在PostgreSQL连接中可以作为普通的运算符使用,包括可以作为JSON数据查找运算符。

END