【问题场景】

CREATE TABLE t1(name char,a int,b double);
ALTER TABLE t1 ADD UNIQUE INDEX idx11 (((regexp_substr(name,1,3)))); # cantian coredump
ALTER TABLE t1 ADD UNIQUE INDEX idx10 (((regexp_instr(name,1,3))));  # cantian coredump

【问题原因】

  1. alter table 失败:
// alter 失败位置
tse_alter_table
    --> tse_alter_table_atomic_impl
        --> knl_alter_table4mysql
            --> knl_alter_single_action
                --> knl_reopen_dc_in_alter_constraints

// 报错日志
CT-00606:[knl_reopen_dc_in_alter_constraints]:knl_open_dc failed,Inconsistent datatypes, expected VARCHAR - got BINARY_INTEGER [knl_interface.c:15207]
CT-00606:[knl_alter_single_action]: knl_reopen_dc_in_alter_constraints failed,Inconsistent datatypes, expected VARCHAR - got BINARY_INTEGER [knl_interface.c:15240]
CT-00606:[for mysql]alter table t1 fail, count:0,Inconsistent datatypes, expected VARCHAR - got BINARY_INTEGER [knl_interface.c:15272]
  1. alter 失败导致回滚
// rollback 失败位置
tse_trx_rollback
    --> tse_ddl_rollback_update_dc
        --> knl_open_dc_by_id // 失败
    --> assert(0) // coredump

【修改方案】

  1. 如果alter中open dc失败,那rollback时失败就是正常的,不能assert(0); 因此修改rollback中tse_ddl_rollback_update_dc的失败处理逻辑;
  2. 调整rollback中代码顺序,如:赋有效/无效值和失败提前return等;
  3. MySQL和参天函数索引实现不同,参天目前保持报错。