From 2398918adf756ccbb17c911adb80808ea7fb6575 Mon Sep 17 00:00:00 2001 From: Weny Xu Date: Tue, 9 Apr 2024 14:00:04 +0800 Subject: [PATCH] feat(fuzz): support to create metric table (#3617) Co-authored-by: tison --- tests-fuzz/src/generator/create_expr.rs | 13 +++++++ .../src/translator/mysql/create_expr.rs | 17 +++++++-- tests-fuzz/targets/fuzz_create_table.rs | 35 +++++++++++++------ 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/tests-fuzz/src/generator/create_expr.rs b/tests-fuzz/src/generator/create_expr.rs index 9a08475e62..d1d4093de2 100644 --- a/tests-fuzz/src/generator/create_expr.rs +++ b/tests-fuzz/src/generator/create_expr.rs @@ -12,6 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::collections::HashMap; + +use datatypes::value::Value; use derive_builder::Builder; use partition::partition::{PartitionBound, PartitionDef}; use rand::seq::SliceRandom; @@ -39,6 +42,8 @@ pub struct CreateTableExprGenerator { if_not_exists: bool, #[builder(setter(into))] name: String, + #[builder(setter(into))] + with_clause: HashMap, name_generator: Box>, ts_column_type_generator: ConcreteDataTypeGenerator, column_type_generator: ConcreteDataTypeGenerator, @@ -58,6 +63,7 @@ impl Default for CreateTableExprGenerator { if_not_exists: false, partition: 0, name: String::new(), + with_clause: HashMap::default(), name_generator: Box::new(MappedGenerator::new(WordGenerator, random_capitalize_map)), ts_column_type_generator: Box::new(TsColumnTypeGenerator), column_type_generator: Box::new(ColumnTypeGenerator), @@ -183,6 +189,13 @@ impl Generator for CreateTableExprGenerato } else { builder.table_name(self.name.to_string()); } + if !self.with_clause.is_empty() { + let mut options = HashMap::new(); + for (key, value) in &self.with_clause { + options.insert(key.to_string(), Value::from(value.to_string())); + } + builder.options(options); + } builder.build().context(error::BuildCreateTableExprSnafu) } } diff --git a/tests-fuzz/src/translator/mysql/create_expr.rs b/tests-fuzz/src/translator/mysql/create_expr.rs index b03f69dfbc..5e5e76fa55 100644 --- a/tests-fuzz/src/translator/mysql/create_expr.rs +++ b/tests-fuzz/src/translator/mysql/create_expr.rs @@ -29,11 +29,12 @@ impl DslTranslator for CreateTableExprTranslator { fn translate(&self, input: &CreateTableExpr) -> Result { Ok(format!( - "CREATE TABLE{}{}(\n{}\n)\n{};", + "CREATE TABLE{}{}(\n{}\n)\n{}{};", Self::create_if_not_exists(input), input.table_name, Self::format_columns(input), - Self::format_table_options(input) + Self::format_table_options(input), + Self::format_with_clause(input), )) } } @@ -146,6 +147,18 @@ impl CreateTableExprTranslator { output.join("\n") } + + fn format_with_clause(input: &CreateTableExpr) -> String { + if input.options.is_empty() { + String::new() + } else { + let mut output = vec![]; + for (key, value) in &input.options { + output.push(format!("\"{key}\" = \"{value}\"")); + } + format!(" with ({})", output.join("\n")) + } + } } pub struct CreateDatabaseExprTranslator; diff --git a/tests-fuzz/targets/fuzz_create_table.rs b/tests-fuzz/targets/fuzz_create_table.rs index 6d351778dc..3d8bc1db9e 100644 --- a/tests-fuzz/targets/fuzz_create_table.rs +++ b/tests-fuzz/targets/fuzz_create_table.rs @@ -61,16 +61,31 @@ impl Arbitrary<'_> for FuzzInput { fn generate_expr(input: FuzzInput) -> Result { let mut rng = ChaChaRng::seed_from_u64(input.seed); - let create_table_generator = CreateTableExprGeneratorBuilder::default() - .name_generator(Box::new(MappedGenerator::new( - WordGenerator, - merge_two_word_map_fn(random_capitalize_map, uppercase_and_keyword_backtick_map), - ))) - .columns(input.columns) - .engine("mito") - .build() - .unwrap(); - create_table_generator.generate(&mut rng) + let metric_engine = rng.gen_bool(0.5); + if metric_engine { + let create_table_generator = CreateTableExprGeneratorBuilder::default() + .name_generator(Box::new(MappedGenerator::new( + WordGenerator, + merge_two_word_map_fn(random_capitalize_map, uppercase_and_keyword_backtick_map), + ))) + .columns(input.columns) + .engine("metric") + .with_clause([("physical_metric_table".to_string(), "".to_string())]) + .build() + .unwrap(); + create_table_generator.generate(&mut rng) + } else { + let create_table_generator = CreateTableExprGeneratorBuilder::default() + .name_generator(Box::new(MappedGenerator::new( + WordGenerator, + merge_two_word_map_fn(random_capitalize_map, uppercase_and_keyword_backtick_map), + ))) + .columns(input.columns) + .engine("mito") + .build() + .unwrap(); + create_table_generator.generate(&mut rng) + } } async fn execute_create_table(ctx: FuzzContext, input: FuzzInput) -> Result<()> {