diff --git a/tests-fuzz/src/generator/create_expr.rs b/tests-fuzz/src/generator/create_expr.rs index 93809c06d4cd..200485e266c9 100644 --- a/tests-fuzz/src/generator/create_expr.rs +++ b/tests-fuzz/src/generator/create_expr.rs @@ -243,12 +243,20 @@ pub struct CreatePhysicalTableExprGenerator { name_generator: Box>, #[builder(default = "false")] if_not_exists: bool, + #[builder(default, setter(into))] + with_clause: HashMap, } impl Generator for CreatePhysicalTableExprGenerator { type Error = Error; fn generate(&self, rng: &mut R) -> Result { + let mut options = HashMap::with_capacity(self.with_clause.len() + 1); + options.insert("physical_metric_table".to_string(), Value::from("")); + for (key, value) in &self.with_clause { + options.insert(key.to_string(), Value::from(value.to_string())); + } + Ok(CreateTableExpr { table_name: self.name_generator.gen(rng), columns: vec![ @@ -266,7 +274,7 @@ impl Generator for CreatePhysicalTableExpr if_not_exists: self.if_not_exists, partition: None, engine: "metric".to_string(), - options: [("physical_metric_table".to_string(), "".into())].into(), + options, primary_keys: vec![], }) } diff --git a/tests-fuzz/src/translator/mysql/create_expr.rs b/tests-fuzz/src/translator/mysql/create_expr.rs index 3ce659bf6e3d..073643b05967 100644 --- a/tests-fuzz/src/translator/mysql/create_expr.rs +++ b/tests-fuzz/src/translator/mysql/create_expr.rs @@ -151,7 +151,7 @@ impl CreateTableExprTranslator { for (key, value) in &input.options { output.push(format!("\"{key}\" = \"{value}\"")); } - format!(" with ({})", output.join("\n")) + format!(" with ({})", output.join(",\n")) } } } diff --git a/tests-fuzz/targets/fuzz_alter_logical_table.rs b/tests-fuzz/targets/fuzz_alter_logical_table.rs index 3ceb5b8b4572..80f017a35397 100644 --- a/tests-fuzz/targets/fuzz_alter_logical_table.rs +++ b/tests-fuzz/targets/fuzz_alter_logical_table.rs @@ -14,6 +14,7 @@ #![no_main] +use std::collections::HashMap; use std::sync::Arc; use arbitrary::{Arbitrary, Unstructured}; @@ -76,12 +77,17 @@ impl Arbitrary<'_> for FuzzInput { fn generate_create_physical_table_expr(rng: &mut R) -> Result { let physical_table_if_not_exists = rng.gen_bool(0.5); + let mut with_clause = HashMap::new(); + if rng.gen_bool(0.5) { + with_clause.insert("append_mode".to_string(), "true".to_string()); + } let create_physical_table_expr = CreatePhysicalTableExprGeneratorBuilder::default() .name_generator(Box::new(MappedGenerator::new( WordGenerator, merge_two_word_map_fn(random_capitalize_map, uppercase_and_keyword_backtick_map), ))) .if_not_exists(physical_table_if_not_exists) + .with_clause(with_clause) .build() .unwrap(); create_physical_table_expr.generate(rng) diff --git a/tests-fuzz/targets/fuzz_alter_table.rs b/tests-fuzz/targets/fuzz_alter_table.rs index 8c17612d0443..7f2a809c9e14 100644 --- a/tests-fuzz/targets/fuzz_alter_table.rs +++ b/tests-fuzz/targets/fuzz_alter_table.rs @@ -14,6 +14,7 @@ #![no_main] +use std::collections::HashMap; use std::sync::Arc; use arbitrary::{Arbitrary, Unstructured}; @@ -71,6 +72,10 @@ enum AlterTableOption { fn generate_create_table_expr(rng: &mut R) -> Result { let max_columns = get_gt_fuzz_input_max_columns(); let columns = rng.gen_range(2..max_columns); + let mut with_clause = HashMap::new(); + if rng.gen_bool(0.5) { + with_clause.insert("append_mode".to_string(), "true".to_string()); + } let create_table_generator = CreateTableExprGeneratorBuilder::default() .name_generator(Box::new(MappedGenerator::new( WordGenerator, @@ -78,6 +83,7 @@ fn generate_create_table_expr(rng: &mut R) -> Result Resul // Create physical table let physical_table_if_not_exists = rng.gen_bool(0.5); + let mut with_clause = HashMap::new(); + if rng.gen_bool(0.5) { + with_clause.insert("append_mode".to_string(), "true".to_string()); + } let create_physical_table_expr = CreatePhysicalTableExprGeneratorBuilder::default() .name_generator(Box::new(MappedGenerator::new( WordGenerator, merge_two_word_map_fn(random_capitalize_map, uppercase_and_keyword_backtick_map), ))) .if_not_exists(physical_table_if_not_exists) + .with_clause(with_clause) .build() .unwrap() .generate(&mut rng)?; diff --git a/tests-fuzz/targets/fuzz_create_table.rs b/tests-fuzz/targets/fuzz_create_table.rs index 0d2458c15eb0..6d03b0dffab9 100644 --- a/tests-fuzz/targets/fuzz_create_table.rs +++ b/tests-fuzz/targets/fuzz_create_table.rs @@ -14,6 +14,8 @@ #![no_main] +use std::collections::HashMap; + use common_telemetry::info; use libfuzzer_sys::arbitrary::{Arbitrary, Unstructured}; use libfuzzer_sys::fuzz_target; @@ -65,6 +67,10 @@ impl Arbitrary<'_> for FuzzInput { fn generate_expr(input: FuzzInput) -> Result { let mut rng = ChaChaRng::seed_from_u64(input.seed); let if_not_exists = rng.gen_bool(0.5); + let mut with_clause = HashMap::new(); + if rng.gen_bool(0.5) { + with_clause.insert("append_mode".to_string(), "true".to_string()); + } let create_table_generator = CreateTableExprGeneratorBuilder::default() .name_generator(Box::new(MappedGenerator::new( @@ -74,6 +80,7 @@ fn generate_expr(input: FuzzInput) -> Result { .columns(input.columns) .engine("mito") .if_not_exists(if_not_exists) + .with_clause(with_clause) .build() .unwrap(); create_table_generator.generate(&mut rng) diff --git a/tests-fuzz/targets/fuzz_insert.rs b/tests-fuzz/targets/fuzz_insert.rs index a5db2bfffe45..739d6af7a386 100644 --- a/tests-fuzz/targets/fuzz_insert.rs +++ b/tests-fuzz/targets/fuzz_insert.rs @@ -14,6 +14,7 @@ #![no_main] +use std::collections::HashMap; use std::sync::Arc; use common_telemetry::info; @@ -83,6 +84,11 @@ fn generate_create_expr( input: FuzzInput, rng: &mut R, ) -> Result { + let mut with_clause = HashMap::new(); + if rng.gen_bool(0.5) { + with_clause.insert("append_mode".to_string(), "true".to_string()); + } + let create_table_generator = CreateTableExprGeneratorBuilder::default() .name_generator(Box::new(MappedGenerator::new( WordGenerator, @@ -90,6 +96,7 @@ fn generate_create_expr( ))) .columns(input.columns) .engine("mito") + .with_clause(with_clause) .ts_column_type_generator(Box::new(MySQLTsColumnTypeGenerator)) .build() .unwrap(); diff --git a/tests-fuzz/targets/fuzz_insert_logical_table.rs b/tests-fuzz/targets/fuzz_insert_logical_table.rs index 6efb6ea50955..abafdef9a8b7 100644 --- a/tests-fuzz/targets/fuzz_insert_logical_table.rs +++ b/tests-fuzz/targets/fuzz_insert_logical_table.rs @@ -79,12 +79,17 @@ impl Arbitrary<'_> for FuzzInput { fn generate_create_physical_table_expr(rng: &mut R) -> Result { let physical_table_if_not_exists = rng.gen_bool(0.5); + let mut with_clause = HashMap::new(); + if rng.gen_bool(0.5) { + with_clause.insert("append_mode".to_string(), "true".to_string()); + } let create_physical_table_expr = CreatePhysicalTableExprGeneratorBuilder::default() .name_generator(Box::new(MappedGenerator::new( WordGenerator, merge_two_word_map_fn(random_capitalize_map, uppercase_and_keyword_backtick_map), ))) .if_not_exists(physical_table_if_not_exists) + .with_clause(with_clause) .build() .unwrap(); create_physical_table_expr.generate(rng)