@@ -2583,6 +2583,76 @@ impl SchemaApiTestSuite {
25832583 let ret_table_name_ident: DBIdTableName =
25842584 get_kv_data ( mt, & key_table_id_to_name) . await ?;
25852585 assert_eq ! ( ret_table_name_ident, key_dbid_tbname) ;
2586+
2587+ // Engine names are case-insensitive.
2588+ let ( _, replaced_meta) = util
2589+ . create_table_with (
2590+ |mut meta| {
2591+ meta. engine = "json" . to_string ( ) ;
2592+ meta
2593+ } ,
2594+ |mut req| {
2595+ req. create_option = CreateOption :: CreateOrReplace ;
2596+ req. name_ident . table_name = table. to_string ( ) ;
2597+ req
2598+ } ,
2599+ )
2600+ . await ?;
2601+ assert_eq ! ( "json" , replaced_meta. engine) ;
2602+
2603+ // Restore the upper-case engine for the mismatch cases below.
2604+ let ( table_id, _) = util
2605+ . create_table_with (
2606+ |mut meta| {
2607+ meta. engine = "JSON" . to_string ( ) ;
2608+ meta
2609+ } ,
2610+ |mut req| {
2611+ req. create_option = CreateOption :: CreateOrReplace ;
2612+ req. name_ident . table_name = table. to_string ( ) ;
2613+ req
2614+ } ,
2615+ )
2616+ . await ?;
2617+
2618+ // Replacing a table with a different engine must fail without changing
2619+ // the existing table or its name mapping.
2620+ let mismatched_req = CreateTableReq {
2621+ create_option : CreateOption :: CreateOrReplace ,
2622+ catalog_name : Some ( "default" . to_string ( ) ) ,
2623+ name_ident : TableNameIdent {
2624+ tenant : tenant. clone ( ) ,
2625+ db_name : db_name. to_string ( ) ,
2626+ table_name : table. to_string ( ) ,
2627+ } ,
2628+ table_meta : TableMeta {
2629+ engine : "STREAM" . to_string ( ) ,
2630+ ..Default :: default ( )
2631+ } ,
2632+ as_dropped : false ,
2633+ materialized_view : None ,
2634+ table_properties : None ,
2635+ table_partition : None ,
2636+ } ;
2637+ let err = mt. create_table ( mismatched_req. clone ( ) ) . await . unwrap_err ( ) ;
2638+ assert ! ( matches!(
2639+ err,
2640+ KVAppError :: AppError ( AppError :: TableEngineMismatch ( _) )
2641+ ) ) ;
2642+ assert_eq ! ( table_id, get_kv_u64_data( mt, & key_dbid_tbname) . await ?) ;
2643+ assert_eq ! ( "JSON" , util. get_table_by_name( table) . await ?. meta. engine) ;
2644+
2645+ // The same validation applies when CTAS creates its replacement as a
2646+ // hidden dropped table.
2647+ let mut as_dropped_req = mismatched_req;
2648+ as_dropped_req. as_dropped = true ;
2649+ as_dropped_req. table_meta . drop_on = Some ( Utc :: now ( ) ) ;
2650+ let err = mt. create_table ( as_dropped_req) . await . unwrap_err ( ) ;
2651+ assert ! ( matches!(
2652+ err,
2653+ KVAppError :: AppError ( AppError :: TableEngineMismatch ( _) )
2654+ ) ) ;
2655+ assert_eq ! ( table_id, get_kv_u64_data( mt, & key_dbid_tbname) . await ?) ;
25862656 }
25872657
25882658 {
0 commit comments