问题描述
在 OceanBase 数据库中,修改 JSON 类型后可能会导致 Invalid argument 问题。
示例如下。
使用 MySQL 数据库。
obclient [(none)]> use mysql; Database changed创建复现表。
obclient [mysql]> CREATE TABLE tny3 (id DECIMAL NOT NULL COMMENT '主键' trade_no VARCHAR(64) NOT NULL); Query OK, 0 rows affected (0.028 sec)查询表内容。
obclient [mysql]> SELECT * FROM tny3; Empty set (0.005 sec)添加列 channel,设置列类型为 JSON,不能为空。
obclient [mysql]> ALTER TABLE tny3 ADD COLUMN CHANNEL JSON NOT NULL; Query OK, 0 rows affected (0.031 sec)查询表内容。
obclient [mysql]> SELECT * FROM tny3; Empty set (0.003 sec)修改列 channel 的类型为 JSON,列值可以为空。
obclient [mysql]> ALTER TABLE tny3 MODIFY CHANNEL JSON NULL; Empty set (0.002 sec)输出报错信息如下。
ERROR 1210 (HY000): Invalid argument查询表内容。
obclient [mysql]> SELECT * FROM tny3;输出报错信息如下。
ERROR 1210 (HY000): Invalid argument删除表操作。
obclient [mysql]> DROP TABLE tny3;输出报错信息如下。
ERROR 1210 (HY000): Invalid argument
适用版本
OceanBase 数据库 V3.2.3 BP4 之前版本。
问题原因
在问题版本中,JSON NULL 默认值的实现有误,导致修改 JSON 列定义为 NOT NULL 后,使用到 JSON NULL 默认值的场景报错。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V3.2.3 BP4 (oceanbase-3.2.3.1-20220805104621) 及之后版本。