Bootstrap

MySQL兼容测试用例(持续中)

测试背景:针对TdSQL,GDB,OceanBase,GreatDB,达梦进行mysql 5.7.35进行兼容性测试。 效果如下:

MySQL 模式测试

1. DDL

1.1标准DDL

验证脚本:功能验证/MySQL模式/DDL.sql

用例编号DDL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01create table基本建表语句YYYYY
02缺省值约束
03非空约束
04唯一性约束
05主键约束
06外键约束
07CTAS建表
08表结构复制
09创建临时表
10创建范围分区表
11创建HASH分区表
12创建LIST分区表
13创建key分区表
14创建范围-HASH分区
15创建范围-LIST分区
16创建LIST-范围分区
17创建LIST-HASH分区
18create index基本建索引 在线
19唯一性索引 在线
20全局索引 在线
21本地索引 在线
22create view创建视图
23alter database修改数据库属性
24Alter table增加列 在线
25删除列 在线
26重命名列 在线
27修改列类型 在线
28重命名表 在线
29新建索引 在线
30新建唯一索引 在线
31删除索引 在线
32删除主键 在线
33删除外键 在线
34增加新的分区 在线
35删除分区 在线
36字段注释 在线
37alter index重命名索引 在线
38重建索引 在线
39索引失效 在线
40truncate tabletruncate整个表
41comment注释表
42注释字段
43rename table重命名表
44drop index删除索引
45drop table删除表
46drop view删除视图

1.2.全局唯一自增列

用例说明 验证全局自增列的特性

  • 1.全局唯一
  • 2.分区内单调递增

预期结果:

用例编号DDL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01创建分区表带自增列创建对象成功YYYYY

登陆信创数据库集群MySQL租户:
mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c(以OB为例)

1 创建序列:

drop table test_range_partition_table;
create table test_range_partition_table (
  insert_time datetime default CURRENT_TIMESTAMP,
  id int auto_increment,
  c3 int
)
partition by range (c3) (
  partition p1 values less than (10),
  partition p2 values less than (20),
  partition p3 values less than (30),
  partition px values less than MAXVALUE
);

检查创建成功:

desc test_range_partition_table;

2 使用序列插入10000行数据并核查 插入成功
操作命令:

for i in `seq 1 40`;
do
mysql -h192.168.1.90 -P2881 -uuser1@mysql_tenant -p"password" -c -Dtest -e "\"insert into test_range_partition_table(c3) values($i)\""; 
done

检查350行数据插入成功

mysql -h192.168.1.90 -P2881 -uuser1@mysql_tenant -p"password" -c -Dtest -e "select count(*) from test_range_partition_table;"

4 检查数据全局唯一且单调递增 列id的值在全局保持唯一,分区内单调递增
操作命令:

select min(id),max(id),count(distinct id),count(*) from test_range_partition_table;

select * from (
select 'P1' as p,insert_time, id,c3 from test_range_partition_table partition (p1)
union
select 'P2' as p,insert_time, id,c3 from test_range_partition_table partition (p2)
union
select 'P3' as p,insert_time, id,c3 from test_range_partition_table partition (p3)
union
select 'Px' as p,insert_time, id,c3 from test_range_partition_table partition (px))
order by c3;

5 删除表 成功
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c
drop table test_range_partition_table;

1.3.一级及二级分区表

用例说明:验证一级和二级分区创建和使用

预期结果:

用例编号DDL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01创建一级range和二级hash分区创建对象成功YYYYY

执行步骤
1 创建表并初始化数据:

drop table mysql_range_hash_table;
create table mysql_range_hash_table
(
  id                   int,
  name                 varchar(200),
  province_id           int,
  constraint pk_r_h primary key (id,province_id,name)
)
Primary_zone= ' RANDOM'
partition by range (province_id)
subpartition by hash(id)
subpartitions 128
(
 partition p1 values less than(100),
partition p2 values less than(200),
 partition pdefault values less than (maxvalue)
) ;

检查数据字典查看二级分区创建成功:
show create table MYSQL_RANGE_HASH_TABLE;

2 验证该分区表均匀分布在所有节点 各个分区均匀分布于所有可用节点
登陆信创数据库集群sys租户:
mysql -h192.168.1.90 -uroot@sys -P2881 -D信创数据库 -c (已OB为例)
查询分区表的物理分布:

select s.zone,s.svr_ip,d.database_name,t.table_name,count(*)
from __all_virtual_table t, __all_virtual_meta_table m , __all_server s, __all_virtual_database d
where t.table_id=m.table_id and m.svr_ip = s.svr_ip and t.database_id=d.database_id and m.role=1
and t.table_name='MYSQL_RANGE_HASH_TABLE'
group by s.zone,s.svr_ip,d.database_name,t.table_name;

3 删除分区表 成功
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c
drop table MYSQL_RANGE_HASH_TABLE;

1.4.外键约束

用例说明:验证基于分区表的外键约束
注:因为分区表的物理分布不一致,该用例旨在说明跨分区跨节点的外键的可用性

预期结果:

用例编号DDL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01创建表及外键约束创建对象成功YYYYY

执行步骤
1 创建表及外键约束 创建对象成功
登陆信创数据库集群MySQL租户:
mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c
foreign_key_checks=on

创建表并初始化数据:

drop table mysql_table_fk;
drop table mysql_table_key;
create table mysql_table_key (did integer primary key) partition by hash(did) partitions 3;
create table mysql_table_fk
( pid                  integer,
  did                  integer,
  constraint mysql_pk primary key(pid),
  constraint mysql_fk foreign key(did) references mysql_table_key(did)
)
partition by hash(pid) partitions 3;

检查数据字典查看外键创建成功:

show create table mysql_table_key;
show create table mysql_table_fk;

2 初始化数据并验证外键 Insert / Update语句会因为违反引用约束报错:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

insert into mysql_table_key(did) values(1);
insert into mysql_table_fk (pid,did) values(1,2);
insert into mysql_table_fk (pid,did) values(2,1);
update mysql_table_fk set did=3 where did=1;
commit;

drop table mysql_range_hash_table;

3 删除表和数据 成功
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

drop table mysql_table_fk;
drop table mysql_table_key;

1.5.全局索引

用例说明:验证全局索引
注:全局索引的分区规则跟表分区是相互独立的,可以支持分区表上非分区键的全局性唯一性索引

执行步骤
1 创建分区表 创建对象成功
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

drop table test_range_partition_table;
create table test_range_partition_table (
  c1 integer primary key,
  c2 varchar(32)
)
partition by range (c1) (
  partition p1 values less than (1000),
  partition p2 values less than (2000),
  partition p3 values less than (3000),
  partition px values less than MAXVALUE);

2 尝试在非分区列创建local唯一索引 创建失败

登陆信创数据库集群MySQL租户:
mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

create unique index idx_1 on test_range_partition_table (c2) local;

3 尝试在非分区列创建全局唯一索引成功 创建成功
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

create unique index idx_1 on test_range_partition_table (c2);

4 插入同分区和不同分区的重复列值 由于违反唯一性约束,插入失败
登陆信创数据库集群MySQL租户:

insert into test_range_partition_table values(100,100);
insert into test_range_partition_table values(200,100);
insert into test_range_partition_table values(1100,100);

5 根据全局索引键查询 执行计划走全局索引
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

explain select count(c2) from test_range_partition_table where c2=100;

6 删除表和索引 成功
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

drop index idx_1 on test_range_partition_table;
drop table test_range_partition_table;

1.6.复制表

用例说明:验证信创数据库复制表功能
注:将更新频率低访问频率高的表定义为复制表,表的副本自动在租户所属服务器上产生复制副本,以避免分布式事务。

预期结果:

用例编号DDL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01创建一张复制表主副本在zone_1 ,另一张表主副本分别在zone_2创建对象成功YYYYY

执行步骤
登陆信创数据库集群MySQL租户:

1 创建表并初始化数据:

drop table table_item;
drop table table_trade;

create table table_item ( 
i_id integer not null, 
i_name varchar(24), 
i_price decimal(5,2), 
PRIMARY KEY (i_id))
locality='F,R{all_server}@zone_1,F,R{all_server}@zone_2,F,R{all_server}@zone_3' primary_zone='zone_1' duplicate_scope='cluster';

create table table_trade (
trade_id integer primary key,
i_id integer)
partition by hash(trade_id) partitions 3;

insert into table_item values(1,'hat',2), (2,'bread',3),(3,'milk',4);
insert into table_trade values(1,1),(2,2),(3,3);
commit;

2 运行复制表和交易表的连接查询,检查执行计划 plan type是 LOCAL
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

explain extended select * from table_item a, table_trade b where a.i_id=b.i_id and b.trade_id=1;

explain extended select * from table_item a, table_trade b where a.i_id=b.i_id and b.trade_id=2;

explain extended select * from table_item a, table_trade b where a.i_id=b.i_id and b.trade_id=3;

3 删除表和数据 成功
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

drop table table_trade;
drop table table_item;

2. DML

2.1.标准DML

验证脚本:功能验证/MySQL模式/DML.sql

用例编号DDL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01insert基本语句
02子查询方式
03插入时含空值
04插入时多行数据
05插入时set语句
06插入时引用已经赋值的字段
07插入时忽略错误(前提)
08update更新时用select子句
09更新时用case when子句
10更新时用limit子句
11更新时用select子查询
12更新时用order by子句
13更新时用多表同时更新
14更新时用inner join子句
15更新数据时忽略错误
16delete删除数据
17删除数据时用select子查询

2.2.Replace into

用例说明:验证replace into 语句

预期结果:

用例编号DDL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01创建一级range和二级hash分区创建对象成功YYYYY

执行步骤

1 创建表并初始化数据 创建对象成功
登陆信创数据库集群MySQL租户:
mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

创建表并初始化数据:

drop table test_replace1;
create table test_replace(c1 integer primary key, c2 integer);
insert into test_replace values(1,1);

2 运行merge into语句 运行成功
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

replace into test_replace values(1,2);
replace into test_replace values(2,2);

3 检查运行结果 c1, c2=(1,2),(2,2)
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c
select * from test_replace;

4 删除表 成功
登陆信创数据库集群MySQL租户:

mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c
drop table test_replace;

2.3.Insert on duplicate key update

用例说明: 验证insert on duplicate key update多行语句

预期结果:

用例编号DDL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01创建一级range和二级hash分区创建对象成功YYYYY

执行步骤

1 创建表并初始化数据 创建对象成功
登陆信创数据库集群MySQL租户:
mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

创建表并初始化数据:

drop table test_insert_duplicate;
create table test_insert_duplicate(c1 integer primary key, c2 integer);

2 运行insert on duplicate key update语句 运行成功
登陆信创数据库集群MySQL租户:

insert into test_insert_duplicate values(1,1);
insert into test_insert_duplicate(c1,c2) values(1,2) on duplicate key update c2=2;
commit;

3 检查运行结果 c1, c2=(1,2)
登陆信创数据库集群MySQL租户:

select * from test_insert_duplicate;

4 删除表 成功
登陆信创数据库集群MySQL租户:

drop table test_insert_duplicate;

3. 查询语句

3.1 标准查询

预期结果:

用例编号DQL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01select基本语句YYYYY
02select for update查询加锁
03table_name as t表别名引用
04column_name c字段别名
05inner join内连接
06left join左外连接
07right join右外连接
08union all全连接
0984960 as draw_id获取固定值
10group by分组查询
11limit限制输出
12substring字符串截取
13group_concat合并行
14concat合并列
15all(sub select)all子查询
16any(sub select)any子查询
17existsexists子查询
18not existsnot exists查询
19regexp正则表达式
20like binary按子母大小写查询

3.2.窗口函数

用例说明:验证窗口分析函数

注:
1.窗口分析函数,SQL99中也称为OLAP函数,对相关数据行集合的统计分析
2.本用例初始化一张学生成绩表,通过部分窗口分析函数举例查询满足不同的查询需求

预期结果:

用例编号DDL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01创建一级range和二级hash分区创建对象成功YYYYY

执行步骤

1 创建表并初始化数据
登陆信创数据库集群MySQL租户:
mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

创建表并初始化数据:

create table score_tbl(class int, student int, score number, primary key(class, student));

insert into score_tbl values
(1,1,90), (1,2,80), (1,3,85), (1,4,82), (1,5,82), (1,6,80), (2,1,87), (2,2,88), (2,3,67), (2,4,79);

2 查询每个学生班里分数与自己相邻的学生(包括自己一共三个人)的最高分 成功
登陆信创数据库集群MySQL租户:

select class,student,score,max(score) over (partition by class order by score desc rows between 1 preceding and 1 following) max_score from score_tbl;

3 查询学校里每个学生分数与其分差在10分以内的同学(包含自己)的最高分 成功
登陆信创数据库集群MySQL租户:

select class,student,score,max(score) over (partition by class order by score desc range between 10 preceding and 10 following) max_score from score_tbl;

4 查询每个学生在自己班级的分数名次 成功
登陆信创数据库集群MySQL租户:

select class,student,score,rank() over (partition by class order by score desc) max_score from score_tbl;

5 查询每个学生的分数、所在班级的分数总和以及第一名同学的学号 成功
登陆信创数据库集群MySQL租户:

select class,student,score,sum(score) over (partition by class) sum_score,
first_value(student) over (partition by class order by score desc) first_stu
from score_tbl;

6 删除表 成功
登陆信创数据库集群MySQL租户:

drop table score_tbl;

3.3.通过Hint并行查询

用例说明:验证通过Hint并行查询行为的能力

预期结果:

用例编号DDL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01创建一级range和二级hash分区创建对象成功YYYYY

执行步骤
1 创建分区表并初始化数据

登陆信创数据库集群MySQL租户:
mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

创建表并初始化数据:

create table emp(emp_id integer, emp_name varchar(200), mgr_id integer) partition by range(emp_id) (partition p1 values less than (5),  partition p2 values less than(10));
insert into emp values
(1,'Tom',3),(2,'Jone',3),(3,'MJ',4),(4,'Kurt',null),(5,'David',2),(6,'Scott',1);

2 通过Hint进行并行查询 运行成功,通过执行计划可以看到并行查询的关键字
1.PX BLOCK ITERATOR
2.dop=4
登陆信创数据库集群MySQL租户:

explain select /*+parallel(2) */ * from emp;

3 删除表 成功
登陆信创数据库集群MySQL租户:
mysql -h192.168.1.90 -uroot@mysql_tenant -P2881 -c

drop table emp;

4.过程语言支持

验证脚本:功能验证/MySQL模式/{procedure.sql, function.sql}

用例编号DQL类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01存储过程
02自定义函数

5. 数据类型兼容性

验证脚本:功能验证/MySQL模式/data_type.sql

用例编号数据类型测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01整数类型BIT
02BOOL/BOOLEAN
03TINYINT
04SMALLINT
05MEDIUMINT
06INT/INTEGER
07BIGINT
08定点类型DECIMAL
09NUMERIC
10浮点类型FLOAT
11DOUBLE
12日期类型YEAR
13DATE
14时间类型DATETIME
15TIMESTAMP
16TIME
17普通字符类型CHAR
18BINARY
19VARCHAR
20VARBINARY
21ENUM
22SET
23大对象字符类型TINYTEXT
24TINYLOB
25TEXT
26BLOB
27MEDIUMTEXT

6. 内置函数兼容性

验证脚本:功能验证/MySQL模式/building_function.sql

用例编号函数内置测试用例描述TdSQLGDBOceanBaseGreatDB达梦
01ASCII返回ASCII码值
02CONCAT连接字符串
03CONCAT_WS连接字符串时用指定字符隔开
04INSERT字符串替换
05FIND_IN_SET查找字符串位置
06LCASE/LOWER字符串小写
07LEFT字符串左截取
08LENGTH字符串字符数
09LTRIM切掉字符串开头的空格
10POSITION字符串第一次出现的位置
11QUOTE反斜杠转义字符串中的单引号
12REPEAT字符串重复的次数
13REVERSE颠倒字符串
14RIGHT字符串右截取
15RTRIM字符串尾部的空格
16STRCMP字符串比较
17TRIM字符串两边截取
18UCASE/UPPER字符串变大写
19ABS(x)X绝对值
20BIN(x)X二进制
21CEILING(x)X最小整数
22FLOOR(x)x的最大值
24GREATEST集合中最大的值
25LEAST集合中最小的值
26MOD(x,y)x/y的模(余数)
29RAND随机数
31ROUND四舍五入
32SIGN(x)数字x的符号的值
33SQRT(x)X的平方根
34TRUNCATE(x,y)x截短为y位小数
35CURDATE当前日期
36CURTIME当前的时间
37DATE_ADD日期相加
38DATE_FORMAT日期格式化
39DAYOFWEEK返回星期
40DAYOFMONTH返回一个月的第几天
41DAYOFYEAR返回一年的第几天
42HOUR小时
43MINUTE分钟
44MONTH月份
45WEEK
46YEAR
47AVG平均值
48COUNT个数
49MIN最小值
50MAX最大值
51SUM总数
;