From a97c3b50a92fd239ad8b80f0f634f993f4e8a6b1 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 14 Jan 2025 11:41:24 +0800 Subject: [PATCH 1/2] support virtual --- storage/ctc/ctc_srv.h | 1 + storage/ctc/datatype_cnvrtr.cc | 2 +- storage/ctc/ha_ctc_ddl.cc | 66 +++++++++++++--------------------- 3 files changed, 27 insertions(+), 42 deletions(-) diff --git a/storage/ctc/ctc_srv.h b/storage/ctc/ctc_srv.h index 345be8e..eb57445 100644 --- a/storage/ctc/ctc_srv.h +++ b/storage/ctc/ctc_srv.h @@ -253,6 +253,7 @@ typedef union { uint32_t nullable : 1; // 是否允许为空(1允许为空 0不允许) uint32_t primary : 1; // if it is a primary key (主键) uint32_t unique : 1; // 是否唯一 + uint32_t is_virtual : 1; // 是否虚拟列 uint32_t is_serial : 1; // 自增 uint32_t is_check : 1; // 检查列(取值范围)约束 http://c.biancheng.net/view/2446.html uint32_t is_ref : 1; // 指定外键 参考sql_parse_column_ref diff --git a/storage/ctc/datatype_cnvrtr.cc b/storage/ctc/datatype_cnvrtr.cc index 13300d3..e76356d 100644 --- a/storage/ctc/datatype_cnvrtr.cc +++ b/storage/ctc/datatype_cnvrtr.cc @@ -835,7 +835,7 @@ void cal_gcol_cnts_for_update(Field **field, uint column_id, uint32_t *virtual_g *virtual_gcol_cnt = 0; for (uint i = 0; i < column_id; i++) { Field *mysql_field = *(field + i); - if (mysql_field->is_gcol()) { + if (mysql_field->is_virtual_gcol()) { *virtual_gcol_cnt += 1; } } diff --git a/storage/ctc/ha_ctc_ddl.cc b/storage/ctc/ha_ctc_ddl.cc index 30205b9..e9905ec 100644 --- a/storage/ctc/ha_ctc_ddl.cc +++ b/storage/ctc/ha_ctc_ddl.cc @@ -1077,6 +1077,7 @@ static void ctc_fill_column_option_set(TcDb__CtcDDLColumnDef *column, Field *fie option_set->is_default_null = false; option_set->has_null = true; // 保证nullable的值是准确的 option_set->nullable = (field->is_flag_set(NOT_NULL_FLAG)) ? 0 : 1; + option_set->is_virtual = field->is_virtual_gcol() ? 1 : 0; if (field->is_flag_set(PRI_KEY_FLAG)) { option_set->primary = true; @@ -1135,14 +1136,31 @@ static bool ctc_ddl_fill_column_by_field( ctc_column_option_set_bit option_set; ctc_fill_column_option_set(column, field, form, &option_set); - if (ctc_is_with_default_value(field, col_obj)) { - CTC_RETURN_IF_ERROR(ctc_ddl_fill_column_default_value(thd, column, field, fld, col_obj, - &option_set, mem_start, mem_end, field_cs), false); + if (option_set.is_virtual) { + String expr; + column->default_text = (char *)ctc_ddl_alloc_mem(mem_start, mem_end, expr.length() + 1); + if (column->default_text == nullptr) { + ctc_log_error("alloc mem for datetime default text failed."); + return false; + } + if (field->gcol_info->expr_str.length == 0){ + field->gcol_info->expr_item->print(thd, &expr, QT_ORDINARY); + strncpy(column->default_text, expr.c_ptr(), expr.length() + 1); + } else { + strncpy(column->default_text, field->gcol_info->expr_str.str, field->gcol_info->expr_str.length + 1); + } + option_set.is_default = 1; + option_set.is_default_null = 0; } else { - option_set.is_default = 0; - option_set.is_default_func = 0; - option_set.is_curr_timestamp = 0; - option_set.is_default_null = 1; + if (ctc_is_with_default_value(field, col_obj)) { + CTC_RETURN_IF_ERROR(ctc_ddl_fill_column_default_value(thd, column, field, fld, col_obj, + &option_set, mem_start, mem_end, field_cs), false); + } else { + option_set.is_default = 0; + option_set.is_default_func = 0; + option_set.is_curr_timestamp = 0; + option_set.is_default_null = 1; + } } // 这句代码要放在所有设置option_set的后面 column->is_option_set = option_set.is_option_set; @@ -1352,12 +1370,6 @@ static bool ctc_ddl_create_table_fill_add_key_table_def_null_fill_key_part(TcDb_ req_key_def->is_func = true; CTC_RETURN_IF_ERROR(ctc_fill_func_key_part(form, thd, req_key_part, fld->gcol_info) == CT_SUCCESS, false); } else { - if (fld->is_virtual_gcol()) { - my_printf_error(ER_DISALLOWED_OPERATION, "%s", MYF(0), - "Cantian does not support index on virtual generated column."); - return false; - } - uint prefix_len = get_prefix_index_len(fld, key_part->length); if (prefix_len) { ctc_fill_prefix_func_key_part(req_key_part, fld, prefix_len); @@ -1421,12 +1433,6 @@ static inline bool ctc_ddl_create_table_fill_add_key_table_def_not_null_fill_key req_key_def->is_func = true; CTC_RETURN_IF_ERROR(ctc_fill_func_key_part(form, thd, req_key_part, fld->gcol_info) == CT_SUCCESS, false); } else { - if (fld->is_virtual_gcol()) { - my_printf_error(ER_DISALLOWED_OPERATION, "%s", MYF(0), - "Cantian does not support index on virtual generated column."); - return false; - } - uint prefix_len = get_prefix_index_len(fld, key_part->length()); if (prefix_len) { ctc_fill_prefix_func_key_part(req_key_part, fld, prefix_len); @@ -1847,13 +1853,6 @@ static int fill_create_table_req_columns_info(HA_CREATE_INFO *create_info, dd::T Field *field = form->field[mysql_col_idx]; if (field->is_gcol()) { ddl_ctrl->table_flags |= CTC_TABLE_CONTAINS_VIRCOL; - if (field->is_virtual_gcol()) { - mysql_col_idx++; - req->n_columns--; - continue; - } - my_printf_error(ER_DISALLOWED_OPERATION, "%s", MYF(0), "Cantian does not support stored generated column."); - return HA_ERR_WRONG_COMMAND; } TcDb__CtcDDLColumnDef *column = req->columns[ctc_col_idx]; @@ -2322,12 +2321,6 @@ static uint32_t ctc_fill_key_part(THD *thd, req_key_def->is_func = true; CTC_RETURN_IF_ERROR(ctc_fill_func_key_part(form, thd, req_key_part, create_field->gcol_info) == CT_SUCCESS, CT_ERROR); } else { - if (field->is_virtual_gcol()) { - my_printf_error(ER_DISALLOWED_OPERATION, "%s", MYF(0), - "Cantian does not support index on virtual generated column."); - return CT_ERROR; - } - uint prefix_len = get_prefix_index_len(create_field->field, key_part->length); if (prefix_len) { ctc_fill_prefix_func_key_part(req_key_part, create_field->field, prefix_len); @@ -2443,15 +2436,6 @@ static int fill_ctc_alter_create_list(THD *thd, TABLE *altered_table, Alter_inpl /* Generate Columns Not Processed */ if (fld->is_gcol()) { ddl_ctrl->table_flags |= CTC_TABLE_CONTAINS_VIRCOL; - if (fld->is_virtual_gcol()) { - req->n_create_list--; - mysql_col_idx++; - continue; - } else { - my_printf_error(ER_DISALLOWED_OPERATION, "%s", MYF(0), - "Cantian does not support stored generated column."); - return HA_ERR_WRONG_COMMAND; - } } ctc_alter_column_alter_mode alter_mode = CTC_ALTER_COLUMN_ALTER_MODE_NONE; -- Gitee From 80fe31de1cd279c939b1461fc9a57651aab2e3c5 Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 20 Feb 2025 11:25:06 +0800 Subject: [PATCH 2/2] support virtual --- storage/ctc/ha_ctc_ddl.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/ctc/ha_ctc_ddl.cc b/storage/ctc/ha_ctc_ddl.cc index e9905ec..d4205ee 100644 --- a/storage/ctc/ha_ctc_ddl.cc +++ b/storage/ctc/ha_ctc_ddl.cc @@ -1852,7 +1852,7 @@ static int fill_create_table_req_columns_info(HA_CREATE_INFO *create_info, dd::T while (ctc_col_idx < req->n_columns) { Field *field = form->field[mysql_col_idx]; if (field->is_gcol()) { - ddl_ctrl->table_flags |= CTC_TABLE_CONTAINS_VIRCOL; + //ddl_ctrl->table_flags |= CTC_TABLE_CONTAINS_VIRCOL; } TcDb__CtcDDLColumnDef *column = req->columns[ctc_col_idx]; @@ -2435,7 +2435,7 @@ static int fill_ctc_alter_create_list(THD *thd, TABLE *altered_table, Alter_inpl /* Generate Columns Not Processed */ if (fld->is_gcol()) { - ddl_ctrl->table_flags |= CTC_TABLE_CONTAINS_VIRCOL; + //ddl_ctrl->table_flags |= CTC_TABLE_CONTAINS_VIRCOL; } ctc_alter_column_alter_mode alter_mode = CTC_ALTER_COLUMN_ALTER_MODE_NONE; -- Gitee