From ce62fea776840c43013a2336fbad3ff6a1191bcd Mon Sep 17 00:00:00 2001 From: Bugen Zhao Date: Fri, 21 Feb 2025 18:17:46 +0800 Subject: [PATCH] check type when generating col_index_mapping Signed-off-by: Bugen Zhao --- .../src/handler/alter_table_column.rs | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/handler/alter_table_column.rs b/src/frontend/src/handler/alter_table_column.rs index ded9d2ade7f83..e891f7746498e 100644 --- a/src/frontend/src/handler/alter_table_column.rs +++ b/src/frontend/src/handler/alter_table_column.rs @@ -19,6 +19,7 @@ use itertools::Itertools; use pgwire::pg_response::{PgResponse, StatementType}; use risingwave_common::catalog::ColumnCatalog; use risingwave_common::hash::VnodeCount; +use risingwave_common::types::DataType; use risingwave_common::util::column_index_mapping::ColIndexMapping; use risingwave_common::{bail, bail_not_implemented}; use risingwave_connector::sink::catalog::SinkCatalog; @@ -121,7 +122,24 @@ pub async fn get_replace_table_plan( .iter() .map(|old_c| { table.columns.iter().position(|new_c| { - new_c.get_column_desc().unwrap().column_id == old_c.column_id().get_id() + let new_c = new_c.get_column_desc().unwrap(); + + let id_matches = || new_c.column_id == old_c.column_id().get_id(); + let type_matches = || { + let original_data_type = old_c.data_type(); + let new_data_type = DataType::from(new_c.column_type.as_ref().unwrap()); + let matches = original_data_type == &new_data_type; + if !matches { + // TODO: transform the data type if possible + tracing::warn!( + "the data type column \"{}\" has changed, currently treating as a new column", + old_c.name() + ); + } + matches + }; + + id_matches() && type_matches() }) }) .collect(),