diff --git a/src/query/ee/src/storages/fuse/operations/virtual_columns.rs b/src/query/ee/src/storages/fuse/operations/virtual_columns.rs index 6767f4757a17a..c6eb71554ae39 100644 --- a/src/query/ee/src/storages/fuse/operations/virtual_columns.rs +++ b/src/query/ee/src/storages/fuse/operations/virtual_columns.rs @@ -107,9 +107,11 @@ pub async fn do_refresh_virtual_column( }); if !fuse_table.support_virtual_columns() { - return Err(ErrorCode::VirtualColumnError( - "table don't support virtual column".to_string(), - )); + return Err(ErrorCode::VirtualColumnError(format!( + "Table don't support virtual column, storage_format: {} read_only: {}", + fuse_table.get_storage_format(), + fuse_table.is_read_only() + ))); } let virtual_column_builder = VirtualColumnBuilder::try_create(ctx.clone(), source_schema)?; diff --git a/src/query/storages/fuse/src/fuse_table.rs b/src/query/storages/fuse/src/fuse_table.rs index 163f7e1ef2f12..c2792920d6a98 100644 --- a/src/query/storages/fuse/src/fuse_table.rs +++ b/src/query/storages/fuse/src/fuse_table.rs @@ -1273,9 +1273,7 @@ impl Table for FuseTable { } fn support_virtual_columns(&self) -> bool { - if matches!(self.storage_format, FuseStorageFormat::Parquet) - && matches!(self.table_type, FuseTableType::Standard) - { + if matches!(self.storage_format, FuseStorageFormat::Parquet) && !self.is_read_only() { // ignore persistent system tables { if let Ok(database_name) = self.table_info.database_name() { if database_name == "persistent_system" { diff --git a/src/query/storages/fuse/src/fuse_type.rs b/src/query/storages/fuse/src/fuse_type.rs index 2797191516d36..cf5cbfce288f5 100644 --- a/src/query/storages/fuse/src/fuse_type.rs +++ b/src/query/storages/fuse/src/fuse_type.rs @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::fmt::Display; +use std::fmt::Formatter; use std::str::FromStr; use databend_common_exception::ErrorCode; @@ -50,6 +52,15 @@ pub enum FuseStorageFormat { Native, } +impl Display for FuseStorageFormat { + fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { + match self { + FuseStorageFormat::Parquet => write!(f, "Parquet"), + FuseStorageFormat::Native => write!(f, "Native"), + } + } +} + impl FromStr for FuseStorageFormat { type Err = ErrorCode;