From 7698bd93fe3f60c8bd30e9bd1884450552e189b8 Mon Sep 17 00:00:00 2001 From: Denis Smirnov <sd@picodata.io> Date: Thu, 18 Aug 2022 17:53:36 +0700 Subject: [PATCH] perf: reuse parameters for values during binding --- benches/parse.rs | 6 +-- src/api/exec_query.rs | 4 +- src/api/explain.rs | 2 +- src/executor.rs | 6 ++- src/executor/bucket/tests.rs | 12 ++--- .../engine/cartridge/backend/sql/ir/tests.rs | 18 +++---- src/executor/tests.rs | 48 ++++++++++--------- src/executor/tests/between.rs | 4 +- src/executor/tests/bucket_id.rs | 4 +- src/executor/tests/not_eq.rs | 4 +- src/executor/tests/not_in.rs | 2 +- src/frontend/sql.rs | 38 ++++++++------- src/frontend/sql/ir/tests.rs | 44 ++++++++--------- src/ir/explain/tests.rs | 12 ++--- src/ir/transformation/bool_in/tests.rs | 15 ++++-- src/ir/transformation/dnf/tests.rs | 12 ++--- .../equality_propagation/tests.rs | 10 ++-- src/ir/transformation/helpers.rs | 4 +- src/ir/transformation/merge_tuples/tests.rs | 12 ++--- src/ir/transformation/redistribution/tests.rs | 42 ++++++++-------- .../redistribution/tests/between.rs | 8 ++-- .../redistribution/tests/except.rs | 10 ++-- .../redistribution/tests/not_in.rs | 10 ++-- src/ir/transformation/split_columns/tests.rs | 10 ++-- 24 files changed, 180 insertions(+), 157 deletions(-) diff --git a/benches/parse.rs b/benches/parse.rs index 8f120baa75..cc19262c6d 100644 --- a/benches/parse.rs +++ b/benches/parse.rs @@ -234,7 +234,7 @@ fn query1_sql() -> String { sql.into() } -fn query1(pattern: &str, params: &[Value], engine: &mut RouterRuntimeMock) { +fn query1(pattern: &str, params: &mut Vec<Value>, engine: &mut RouterRuntimeMock) { let mut query = Query::new(engine, pattern, params).unwrap(); let top_id = query.get_exec_plan().get_ir_plan().get_top().unwrap(); let buckets = query.bucket_discovery(top_id).unwrap(); @@ -251,10 +251,10 @@ fn bench_query1(c: &mut Criterion) { let mut reestrid: u64 = 666; c.bench_function("query1", |b| { b.iter(|| { - let params = vec![Value::from(sys_from), Value::from(reestrid)]; + let mut params = vec![Value::from(sys_from), Value::from(reestrid)]; sys_from += 1; reestrid += 1; - query1(&sql, ¶ms, &mut engine) + query1(&sql, &mut params, &mut engine) }) }); } diff --git a/src/api/exec_query.rs b/src/api/exec_query.rs index c4e17eb8e9..a90f05f9d0 100644 --- a/src/api/exec_query.rs +++ b/src/api/exec_query.rs @@ -14,7 +14,7 @@ use crate::ir::value::Value; /// Dispatch parameterized SQL query from coordinator to the segments. #[no_mangle] pub extern "C" fn dispatch_query(ctx: FunctionCtx, args: FunctionArgs) -> c_int { - let lua_params = match PatternWithParams::try_from(args) { + let mut lua_params = match PatternWithParams::try_from(args) { Ok(param) => param, Err(e) => return tarantool::set_error!(TarantoolErrorCode::ProcC, "{:?}", e), }; @@ -34,7 +34,7 @@ pub extern "C" fn dispatch_query(ctx: FunctionCtx, args: FunctionArgs) -> c_int ); } }; - let mut query = match Query::new(&*runtime, &lua_params.pattern, &lua_params.params) { + let mut query = match Query::new(&*runtime, &lua_params.pattern, &mut lua_params.params) { Ok(q) => q, Err(e) => { say( diff --git a/src/api/explain.rs b/src/api/explain.rs index 15d38322d8..38d74d9cf1 100644 --- a/src/api/explain.rs +++ b/src/api/explain.rs @@ -50,7 +50,7 @@ pub extern "C" fn explain(ctx: FunctionCtx, args: FunctionArgs) -> c_int { ); } }; - let query = match Query::new(&*runtime, &lua_params.query, &[]) { + let query = match Query::new(&*runtime, &lua_params.query, &mut vec![]) { Ok(q) => q, Err(e) => { say( diff --git a/src/executor.rs b/src/executor.rs index db2e3867ac..62cd3b711a 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -90,7 +90,11 @@ where /// - Failed to build AST. /// - Failed to build IR plan. /// - Failed to apply optimizing transformations to IR plan. - pub fn new(coordinator: &'a C, sql: &str, params: &[Value]) -> Result<Self, QueryPlannerError> + pub fn new( + coordinator: &'a C, + sql: &str, + params: &mut Vec<Value>, + ) -> Result<Self, QueryPlannerError> where C::Configuration: CoordinatorMetadata, C::Cache: Cache<String, Plan>, diff --git a/src/executor/bucket/tests.rs b/src/executor/bucket/tests.rs index 6cb76c18a5..9ba97d39df 100644 --- a/src/executor/bucket/tests.rs +++ b/src/executor/bucket/tests.rs @@ -18,7 +18,7 @@ fn simple_union_query() { WHERE "id" = 1"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, query, &[]).unwrap(); + let mut query = Query::new(&coordinator, query, &mut vec![]).unwrap(); let plan = query.exec_plan.get_ir_plan(); let top = plan.get_top().unwrap(); let buckets = query.bucket_discovery(top).unwrap(); @@ -42,7 +42,7 @@ fn simple_disjunction_in_union_query() { WHERE ("id" = 1) OR ("id" = 100)"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, query, &[]).unwrap(); + let mut query = Query::new(&coordinator, query, &mut vec![]).unwrap(); let plan = query.exec_plan.get_ir_plan(); let top = plan.get_top().unwrap(); let buckets = query.bucket_discovery(top).unwrap(); @@ -73,7 +73,7 @@ fn complex_shard_key_union_query() { WHERE "identification_number" = 1 AND "product_code" = '222'"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, query, &[]).unwrap(); + let mut query = Query::new(&coordinator, query, &mut vec![]).unwrap(); let plan = query.exec_plan.get_ir_plan(); let top = plan.get_top().unwrap(); let buckets = query.bucket_discovery(top).unwrap(); @@ -106,7 +106,7 @@ fn union_complex_cond_query() { OR "product_code" = '111')"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, query, &[]).unwrap(); + let mut query = Query::new(&coordinator, query, &mut vec![]).unwrap(); let plan = query.exec_plan.get_ir_plan(); let top = plan.get_top().unwrap(); let buckets = query.bucket_discovery(top).unwrap(); @@ -156,7 +156,7 @@ fn union_query_conjunction() { SELECT * FROM "test_space_hist" WHERE "id" = 2"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, query, &[]).unwrap(); + let mut query = Query::new(&coordinator, query, &mut vec![]).unwrap(); let plan = query.exec_plan.get_ir_plan(); let top = plan.get_top().unwrap(); let buckets = query.bucket_discovery(top).unwrap(); @@ -182,7 +182,7 @@ fn simple_except_query() { WHERE "id" = 1"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, query, &[]).unwrap(); + let mut query = Query::new(&coordinator, query, &mut vec![]).unwrap(); let plan = query.exec_plan.get_ir_plan(); let top = plan.get_top().unwrap(); let buckets = query.bucket_discovery(top).unwrap(); diff --git a/src/executor/engine/cartridge/backend/sql/ir/tests.rs b/src/executor/engine/cartridge/backend/sql/ir/tests.rs index 8249052bd7..51543e6c57 100644 --- a/src/executor/engine/cartridge/backend/sql/ir/tests.rs +++ b/src/executor/engine/cartridge/backend/sql/ir/tests.rs @@ -20,7 +20,7 @@ fn one_table_projection() { let metadata = &RouterConfigurationMock::new(); let ast = AbstractSyntaxTree::new(query).unwrap(); let mut plan = ast.resolve_metadata(metadata).unwrap(); - plan.bind_params(&[]).unwrap(); + plan.bind_params(&mut vec![]).unwrap(); let ex_plan = ExecutionPlan::from(plan); let top_id = ex_plan.get_ir_plan().get_top().unwrap(); @@ -52,7 +52,7 @@ fn one_table_with_asterisk() { let metadata = &RouterConfigurationMock::new(); let ast = AbstractSyntaxTree::new(query).unwrap(); let mut plan = ast.resolve_metadata(metadata).unwrap(); - plan.bind_params(&[]).unwrap(); + plan.bind_params(&mut vec![]).unwrap(); let ex_plan = ExecutionPlan::from(plan); let top_id = ex_plan.get_ir_plan().get_top().unwrap(); @@ -90,7 +90,7 @@ fn union_all() { let metadata = &RouterConfigurationMock::new(); let ast = AbstractSyntaxTree::new(query).unwrap(); let mut plan = ast.resolve_metadata(metadata).unwrap(); - plan.bind_params(&[]).unwrap(); + plan.bind_params(&mut vec![]).unwrap(); let ex_plan = ExecutionPlan::from(plan); let top_id = ex_plan.get_ir_plan().get_top().unwrap(); @@ -125,7 +125,7 @@ fn from_sub_query() { let metadata = &RouterConfigurationMock::new(); let ast = AbstractSyntaxTree::new(query).unwrap(); let mut plan = ast.resolve_metadata(metadata).unwrap(); - plan.bind_params(&[]).unwrap(); + plan.bind_params(&mut vec![]).unwrap(); let ex_plan = ExecutionPlan::from(plan); let top_id = ex_plan.get_ir_plan().get_top().unwrap(); @@ -163,7 +163,7 @@ fn from_sub_query_with_union() { let metadata = &RouterConfigurationMock::new(); let ast = AbstractSyntaxTree::new(query).unwrap(); let mut plan = ast.resolve_metadata(metadata).unwrap(); - plan.bind_params(&[]).unwrap(); + plan.bind_params(&mut vec![]).unwrap(); let ex_plan = ExecutionPlan::from(plan); let top_id = ex_plan.get_ir_plan().get_top().unwrap(); @@ -198,7 +198,7 @@ fn inner_join() { let metadata = &RouterConfigurationMock::new(); let ast = AbstractSyntaxTree::new(query).unwrap(); let mut plan = ast.resolve_metadata(metadata).unwrap(); - plan.bind_params(&[]).unwrap(); + plan.bind_params(&mut vec![]).unwrap(); let ex_plan = ExecutionPlan::from(plan); let top_id = ex_plan.get_ir_plan().get_top().unwrap(); @@ -235,7 +235,7 @@ fn inner_join_with_sq() { let metadata = &RouterConfigurationMock::new(); let ast = AbstractSyntaxTree::new(query).unwrap(); let mut plan = ast.resolve_metadata(metadata).unwrap(); - plan.bind_params(&[]).unwrap(); + plan.bind_params(&mut vec![]).unwrap(); let ex_plan = ExecutionPlan::from(plan); let top_id = ex_plan.get_ir_plan().get_top().unwrap(); @@ -272,7 +272,7 @@ fn selection_with_sq() { let metadata = &RouterConfigurationMock::new(); let ast = AbstractSyntaxTree::new(query).unwrap(); let mut plan = ast.resolve_metadata(metadata).unwrap(); - plan.bind_params(&[]).unwrap(); + plan.bind_params(&mut vec![]).unwrap(); let ex_plan = ExecutionPlan::from(plan); let top_id = ex_plan.get_ir_plan().get_top().unwrap(); let mut sp = SyntaxPlan::new(&ex_plan, top_id).unwrap(); @@ -309,7 +309,7 @@ fn except() { let metadata = &RouterConfigurationMock::new(); let ast = AbstractSyntaxTree::new(query).unwrap(); let mut plan = ast.resolve_metadata(metadata).unwrap(); - plan.bind_params(&[]).unwrap(); + plan.bind_params(&mut vec![]).unwrap(); let ex_plan = ExecutionPlan::from(plan); let top_id = ex_plan.get_ir_plan().get_top().unwrap(); diff --git a/src/executor/tests.rs b/src/executor/tests.rs index 7f248494fb..e849027f68 100644 --- a/src/executor/tests.rs +++ b/src/executor/tests.rs @@ -16,7 +16,7 @@ fn shard_query() { let sql = r#"SELECT "FIRST_NAME" FROM "test_space" where "id" = 1"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let result = *query .dispatch() .unwrap() @@ -56,7 +56,7 @@ fn shard_union_query() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let result = *query .dispatch() .unwrap() @@ -91,7 +91,7 @@ fn map_reduce_query() { let sql = r#"SELECT "product_code" FROM "hash_testing" where "identification_number" = 1 and "product_code" = '457'"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let result = *query .dispatch() .unwrap() @@ -130,7 +130,7 @@ fn linker_test() { (SELECT "identification_number" FROM "hash_testing" where "identification_number" > 1)"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_table = virtual_table_23(); if let MotionPolicy::Segment(key) = get_motion_policy(query.exec_plan.get_ir_plan(), motion_id) @@ -209,7 +209,7 @@ fn union_linker_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_table = virtual_table_23(); if let MotionPolicy::Segment(key) = get_motion_policy(query.exec_plan.get_ir_plan(), motion_id) @@ -307,7 +307,7 @@ WHERE "t3"."id" = 2 AND "t8"."identification_number" = 2"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_table = virtual_table_23(); virtual_table.set_alias("\"t8\"").unwrap(); @@ -383,7 +383,7 @@ fn join_linker2_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_table = VirtualTable::new(); @@ -450,7 +450,7 @@ fn join_linker3_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_table = VirtualTable::new(); @@ -521,7 +521,7 @@ fn join_linker4_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion_t2_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_t2 = VirtualTable::new(); @@ -624,7 +624,7 @@ fn anonymous_col_index_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion1_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_t1 = virtual_table_23(); if let MotionPolicy::Segment(key) = get_motion_policy(query.exec_plan.get_ir_plan(), motion1_id) @@ -709,7 +709,7 @@ fn sharding_column1_test() { let sql = r#"SELECT * FROM "test_space" where "id" = 1"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let result = *query .dispatch() .unwrap() @@ -740,7 +740,7 @@ fn sharding_column2_test() { let sql = r#"SELECT *, "bucket_id" FROM "test_space" where "id" = 1"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let result = *query .dispatch() .unwrap() @@ -773,7 +773,7 @@ fn insert1_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_table = VirtualTable::new(); @@ -838,7 +838,7 @@ fn insert2_test() { where "a" = 1 and "b" = 2"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); // Though projection row has the same distribution key as // the target table, we still add a motion and collect a @@ -898,7 +898,7 @@ fn insert3_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_table = VirtualTable::new(); @@ -975,7 +975,7 @@ fn insert4_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); // Though data allows to be inserted locally still gather it on the // coordinator to recalculate a "bucket_id" field for "t". @@ -1033,7 +1033,7 @@ fn insert5_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_table = VirtualTable::new(); @@ -1097,7 +1097,7 @@ fn insert6_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_table = VirtualTable::new(); @@ -1186,7 +1186,7 @@ fn insert7_test() { let sql = r#"insert into "hash_testing" ("sys_op", "bucket_id" ) values (1, 2)"#; let coordinator = RouterRuntimeMock::new(); - let result = Query::new(&coordinator, sql, &[]).unwrap_err(); + let result = Query::new(&coordinator, sql, &mut vec![]).unwrap_err(); assert_eq!( QueryPlannerError::CustomError(format!( @@ -1203,7 +1203,7 @@ fn insert8_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_table = VirtualTable::new(); @@ -1270,8 +1270,12 @@ fn insert9_test() { let coordinator = RouterRuntimeMock::new(); - let mut query = - Query::new(&coordinator, sql, &[Value::from(1_u64), Value::from(2_u64)]).unwrap(); + let mut query = Query::new( + &coordinator, + sql, + &mut vec![Value::from(1_u64), Value::from(2_u64)], + ) + .unwrap(); let motion_id = query.exec_plan.get_ir_plan().get_slices().unwrap()[0][0]; let mut virtual_table = VirtualTable::new(); diff --git a/src/executor/tests/between.rs b/src/executor/tests/between.rs index fcc3957a2c..1ee4c15e12 100644 --- a/src/executor/tests/between.rs +++ b/src/executor/tests/between.rs @@ -23,7 +23,7 @@ fn between1_test() { // Initialize the query. let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let plan = query.exec_plan.get_ir_plan(); // Validate the motion type. @@ -81,7 +81,7 @@ fn between2_test() { // Initialize the query. let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let plan = query.exec_plan.get_ir_plan(); // Validate the motion type. diff --git a/src/executor/tests/bucket_id.rs b/src/executor/tests/bucket_id.rs index 958ce30123..42e288dc90 100644 --- a/src/executor/tests/bucket_id.rs +++ b/src/executor/tests/bucket_id.rs @@ -12,7 +12,7 @@ fn bucket1_test() { let sql = r#"SELECT *, "bucket_id" FROM "t1""#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let result = *query .dispatch() .unwrap() @@ -40,7 +40,7 @@ fn bucket2_test() { WHERE "a" = 1 AND "b" = 2"#; let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let result = *query .dispatch() .unwrap() diff --git a/src/executor/tests/not_eq.rs b/src/executor/tests/not_eq.rs index 76085bd350..d444e1e3ed 100644 --- a/src/executor/tests/not_eq.rs +++ b/src/executor/tests/not_eq.rs @@ -20,7 +20,7 @@ fn not_eq1_test() { // Initialize the query. let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let plan = query.exec_plan.get_ir_plan(); // Validate the motion type. @@ -61,7 +61,7 @@ fn not_eq2_test() { // Initialize the query. let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let plan = query.exec_plan.get_ir_plan(); // Validate the motion type. diff --git a/src/executor/tests/not_in.rs b/src/executor/tests/not_in.rs index bdfded6dfc..933da8de89 100644 --- a/src/executor/tests/not_in.rs +++ b/src/executor/tests/not_in.rs @@ -23,7 +23,7 @@ fn not_in1_test() { // Initialize the query. let coordinator = RouterRuntimeMock::new(); - let mut query = Query::new(&coordinator, sql, &[]).unwrap(); + let mut query = Query::new(&coordinator, sql, &mut vec![]).unwrap(); let plan = query.exec_plan.get_ir_plan(); // Validate the motion type. diff --git a/src/frontend/sql.rs b/src/frontend/sql.rs index 0c995c1295..3fc4e8de2e 100644 --- a/src/frontend/sql.rs +++ b/src/frontend/sql.rs @@ -758,17 +758,22 @@ impl Plan { /// - Invalid amount of parameters. /// - Internal errors. #[allow(clippy::too_many_lines)] - pub fn bind_params(&mut self, params: &[Value]) -> Result<(), QueryPlannerError> { + pub fn bind_params(&mut self, params: &mut Vec<Value>) -> Result<(), QueryPlannerError> { + // Nothing to do here. + if params.is_empty() { + return Ok(()); + } + let top_id = self.get_top()?; let tree = DftPost::new(&top_id, |node| self.nodes.subtree_iter(node)); let nodes: Vec<usize> = tree.map(|(_, id)| *id).collect(); - let mut idx = 0; - // Add parameter values to the plan arena (but they are still unlinked to the tree). - let value_ids: Vec<usize> = params - .iter() - .map(|param| self.add_const(param.clone())) - .collect(); + // Transform parameters to values. The result values are stored in the + // opposite to parameters order. + let mut value_ids: Vec<usize> = Vec::with_capacity(params.len()); + while let Some(param) = params.pop() { + value_ids.push(self.add_const(param)); + } // We need to use rows instead of values in some cases (AST can solve // this problem for non-parameterized queries, but for parameterized @@ -791,6 +796,7 @@ impl Plan { }; // Populate rows. + let mut idx = value_ids.len(); for id in &nodes { let node = self.get_node(*id)?; match node { @@ -808,9 +814,9 @@ impl Plan { .. } => { if param_set.contains(param_id) { + idx -= 1; let val_id = get_value(idx)?; row_ids.insert(idx, self.nodes.add_row(vec![val_id], None)); - idx += 1; } } _ => {} @@ -825,7 +831,7 @@ impl Plan { .. } => { if param_set.contains(param_id) { - idx += 1; + idx -= 1; } } Expression::Bool { @@ -835,16 +841,16 @@ impl Plan { } => { for param_id in &[*left, *right] { if param_set.contains(param_id) { + idx -= 1; let val_id = get_value(idx)?; row_ids.insert(idx, self.nodes.add_row(vec![val_id], None)); - idx += 1; } } } Expression::Row { ref list, .. } => { for param_id in list { if param_set.contains(param_id) { - idx += 1; + idx -= 1; } } } @@ -862,7 +868,7 @@ impl Plan { }; // Replace parameters in the plan. - idx = 0; + idx = value_ids.len(); for id in &nodes { let node = self.get_mut_node(*id)?; match node { @@ -880,9 +886,9 @@ impl Plan { .. } => { if param_set.contains(param_id) { + idx -= 1; let row_id = get_row(idx)?; *param_id = row_id; - idx += 1; } } _ => {} @@ -897,9 +903,9 @@ impl Plan { .. } => { if param_set.contains(param_id) { + idx -= 1; let val_id = get_value(idx)?; *param_id = val_id; - idx += 1; } } Expression::Bool { @@ -909,18 +915,18 @@ impl Plan { } => { for param_id in &mut [left, right].iter_mut() { if param_set.contains(param_id) { + idx -= 1; let row_id = get_row(idx)?; **param_id = row_id; - idx += 1; } } } Expression::Row { ref mut list, .. } => { for param_id in list { if param_set.contains(param_id) { + idx -= 1; let val_id = get_value(idx)?; *param_id = val_id; - idx += 1; } } } diff --git a/src/frontend/sql/ir/tests.rs b/src/frontend/sql/ir/tests.rs index 307bcc6f0a..09a80b3afb 100644 --- a/src/frontend/sql/ir/tests.rs +++ b/src/frontend/sql/ir/tests.rs @@ -24,7 +24,7 @@ fn front_sql1() { vec![Value::from(1_u64)], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -48,7 +48,7 @@ fn front_sql2() { ], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -77,7 +77,7 @@ fn front_sql3() { vec![Value::from(1_u64), Value::from(1_u64), Value::from(1_u64)], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -119,7 +119,7 @@ fn front_sql4() { ], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -138,7 +138,7 @@ fn front_sql5() { vec![Value::from("a")], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -162,7 +162,7 @@ fn front_sql6() { vec![Value::from(5_u64), Value::from("123")], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -202,7 +202,7 @@ fn front_sql8() { vec![Value::from(1_u64)], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -261,7 +261,7 @@ fn front_sql9() { ], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -280,7 +280,7 @@ fn front_sql10() { ], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -291,7 +291,7 @@ fn front_sql11() { vec![Value::from(1_u64), Value::from(2_u64)], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -335,7 +335,7 @@ fn front_sql14() { vec![], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -368,7 +368,7 @@ fn front_sql16() { vec![Value::from("кириллица")], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -384,7 +384,7 @@ fn front_sql17() { vec![], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -401,7 +401,7 @@ fn front_sql18() { vec![Value::from(1_u64), Value::from(2_u64)], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] @@ -417,14 +417,14 @@ fn front_sql19() { vec![], ); - assert_eq!(sql_to_sql(input, &[], &no_transform), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &no_transform), expected); } #[test] fn front_params1() { let pattern = r#"SELECT "id", "FIRST_NAME" FROM "test_space" WHERE "sys_op" = ? AND "sysFrom" > ?"#; - let params = vec![Value::from(0_i64), Value::from(1_i64)]; + let mut params = vec![Value::from(0_i64), Value::from(1_i64)]; let expected = PatternWithParams::new( format!( "{} {}", @@ -434,14 +434,14 @@ fn front_params1() { params.clone(), ); - assert_eq!(sql_to_sql(pattern, ¶ms, &no_transform), expected); + assert_eq!(sql_to_sql(pattern, &mut params, &no_transform), expected); } #[test] fn front_params2() { let pattern = r#"SELECT "id" FROM "test_space" WHERE "sys_op" = ? AND "FIRST_NAME" = ?"#; - let params = vec![Value::Null, Value::from("hello")]; + let mut params = vec![Value::Null, Value::from("hello")]; let expected = PatternWithParams::new( format!( "{} {}", @@ -451,7 +451,7 @@ fn front_params2() { params.clone(), ); - assert_eq!(sql_to_sql(pattern, ¶ms, &no_transform), expected); + assert_eq!(sql_to_sql(pattern, &mut params, &no_transform), expected); } // check cyrillic params support @@ -459,7 +459,7 @@ fn front_params2() { fn front_params3() { let pattern = r#"SELECT "id" FROM "test_space" WHERE "sys_op" = ? AND "FIRST_NAME" = ?"#; - let params = vec![Value::Null, Value::from("кириллица")]; + let mut params = vec![Value::Null, Value::from("кириллица")]; let expected = PatternWithParams::new( format!( "{} {}", @@ -469,7 +469,7 @@ fn front_params3() { params.clone(), ); - assert_eq!(sql_to_sql(pattern, ¶ms, &no_transform), expected); + assert_eq!(sql_to_sql(pattern, &mut params, &no_transform), expected); } // check symbols in values (grammar) @@ -488,5 +488,5 @@ fn front_params4() { params, ); - assert_eq!(sql_to_sql(pattern, &vec![], &no_transform), expected); + assert_eq!(sql_to_sql(pattern, &mut vec![], &no_transform), expected); } diff --git a/src/ir/explain/tests.rs b/src/ir/explain/tests.rs index 8723566d0d..1acbc4e65b 100644 --- a/src/ir/explain/tests.rs +++ b/src/ir/explain/tests.rs @@ -8,7 +8,7 @@ fn simple_query_without_cond_plan() { let query = r#"SELECT "t"."identification_number" as "c1", "product_code" FROM "hash_testing" as "t""#; - let plan = sql_to_ir(query, &[]); + let plan = sql_to_ir(query, &mut vec![]); let top = &plan.get_top().unwrap(); let explain_tree = FullExplain::new(&plan, *top).unwrap(); @@ -27,7 +27,7 @@ fn simple_query_without_cond_plan() { fn simple_query_with_cond_plan() { let query = r#"SELECT "t"."identification_number" as "c1", "product_code" FROM "hash_testing" as "t" WHERE "t"."identification_number" = 1 AND "t"."product_code" = '222'"#; - let plan = sql_to_ir(query, &[]); + let plan = sql_to_ir(query, &mut vec![]); let top = &plan.get_top().unwrap(); let explain_tree = FullExplain::new(&plan, *top).unwrap(); @@ -49,7 +49,7 @@ fn union_query_plan() { UNION ALL SELECT "t2"."identification_number", "product_code" FROM "hash_testing_hist" as "t2""#; - let plan = sql_to_ir(query, &[]); + let plan = sql_to_ir(query, &mut vec![]); let top = &plan.get_top().unwrap(); let explain_tree = FullExplain::new(&plan, *top).unwrap(); @@ -74,7 +74,7 @@ SELECT "id", "FIRST_NAME" FROM "test_space_hist" WHERE "sys_op" < 0 ) as "t" WHERE "id" = 1"#; - let plan = sql_to_ir(query, &[]); + let plan = sql_to_ir(query, &mut vec![]); let top = &plan.get_top().unwrap(); let explain_tree = FullExplain::new(&plan, *top).unwrap(); @@ -112,7 +112,7 @@ WHERE "id" IN (SELECT "id" AND "FIRST_NAME" IN (SELECT "FIRST_NAME" FROM "test_space" WHERE "id" = 5) "#; - let plan = sql_to_ir(query, &[]); + let plan = sql_to_ir(query, &mut vec![]); let top = &plan.get_top().unwrap(); let explain_tree = FullExplain::new(&plan, *top).unwrap(); @@ -156,7 +156,7 @@ fn explain_except1() { EXCEPT DISTINCT SELECT "identification_number" FROM "hash_testing_hist""#; - let plan = sql_to_ir(query, &[]); + let plan = sql_to_ir(query, &mut vec![]); let top = &plan.get_top().unwrap(); let explain_tree = FullExplain::new(&plan, *top).unwrap(); diff --git a/src/ir/transformation/bool_in/tests.rs b/src/ir/transformation/bool_in/tests.rs index 28a57918a8..c5724afc32 100644 --- a/src/ir/transformation/bool_in/tests.rs +++ b/src/ir/transformation/bool_in/tests.rs @@ -20,7 +20,10 @@ fn bool_in1() { vec![Value::from(1_u64), Value::from(2_u64), Value::from(3_u64)], ); - assert_eq!(sql_to_sql(input, &[], &replace_in_operator), expected); + assert_eq!( + sql_to_sql(input, &mut vec![], &replace_in_operator), + expected + ); } #[test] @@ -43,7 +46,10 @@ fn bool_in2() { ], ); - assert_eq!(sql_to_sql(input, &[], &replace_in_operator), expected); + assert_eq!( + sql_to_sql(input, &mut vec![], &replace_in_operator), + expected + ); } #[test] @@ -58,5 +64,8 @@ fn bool_in3() { vec![Value::from(1_u64), Value::from(2_u64), Value::from(3_u64)], ); - assert_eq!(sql_to_sql(input, &[], &replace_in_operator), expected); + assert_eq!( + sql_to_sql(input, &mut vec![], &replace_in_operator), + expected + ); } diff --git a/src/ir/transformation/dnf/tests.rs b/src/ir/transformation/dnf/tests.rs index 56c84ab4d4..83c7cacc3e 100644 --- a/src/ir/transformation/dnf/tests.rs +++ b/src/ir/transformation/dnf/tests.rs @@ -28,7 +28,7 @@ fn dnf1() { ], ); - assert_eq!(sql_to_sql(input, &[], &set_dnf), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &set_dnf), expected); } #[test] @@ -54,7 +54,7 @@ fn dnf2() { ], ); - assert_eq!(sql_to_sql(input, &[], &set_dnf), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &set_dnf), expected); } #[test] @@ -75,7 +75,7 @@ fn dnf3() { ], ); - assert_eq!(sql_to_sql(input, &[], &set_dnf), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &set_dnf), expected); } #[test] @@ -96,7 +96,7 @@ fn dnf4() { ], ); - assert_eq!(sql_to_sql(input, &[], &set_dnf), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &set_dnf), expected); } #[test] @@ -117,7 +117,7 @@ fn dnf5() { ], ); - assert_eq!(sql_to_sql(input, &[], &set_dnf), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &set_dnf), expected); } #[test] @@ -133,5 +133,5 @@ fn dnf6() { vec![Value::from(1_u64), Value::from(1_u64), Value::from(2_u64)], ); - assert_eq!(sql_to_sql(input, &[], &set_dnf), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &set_dnf), expected); } diff --git a/src/ir/transformation/equality_propagation/tests.rs b/src/ir/transformation/equality_propagation/tests.rs index b7aa75d6d9..d48740a75f 100644 --- a/src/ir/transformation/equality_propagation/tests.rs +++ b/src/ir/transformation/equality_propagation/tests.rs @@ -28,7 +28,7 @@ fn equality_propagation1() { ], ); - assert_eq!(sql_to_sql(input, &[], &derive_equalities), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &derive_equalities), expected); } #[test] @@ -44,7 +44,7 @@ fn equality_propagation2() { vec![Value::Null, Value::Null], ); - assert_eq!(sql_to_sql(input, &[], &derive_equalities), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &derive_equalities), expected); } #[test] @@ -61,7 +61,7 @@ fn equality_propagation3() { vec![Value::from(1_u64), Value::Null, Value::Null], ); - assert_eq!(sql_to_sql(input, &[], &derive_equalities), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &derive_equalities), expected); } #[test] @@ -84,7 +84,7 @@ fn equality_propagation4() { ], ); - assert_eq!(sql_to_sql(input, &[], &derive_equalities), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &derive_equalities), expected); } #[test] @@ -109,5 +109,5 @@ fn equality_propagation5() { ], ); - assert_eq!(sql_to_sql(input, &[], &derive_equalities), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &derive_equalities), expected); } diff --git a/src/ir/transformation/helpers.rs b/src/ir/transformation/helpers.rs index f19b01fbce..70144a5b04 100644 --- a/src/ir/transformation/helpers.rs +++ b/src/ir/transformation/helpers.rs @@ -12,7 +12,7 @@ use crate::ir::Plan; /// Compiles an SQL query to IR plan. #[allow(dead_code)] -pub fn sql_to_ir(query: &str, params: &[Value]) -> Plan { +pub fn sql_to_ir(query: &str, params: &mut Vec<Value>) -> Plan { let metadata = &RouterConfigurationMock::new(); let ast = AbstractSyntaxTree::new(query).unwrap(); let mut plan = ast.resolve_metadata(metadata).unwrap(); @@ -24,7 +24,7 @@ pub fn sql_to_ir(query: &str, params: &[Value]) -> Plan { #[allow(dead_code)] pub fn sql_to_sql( query: &str, - params: &[Value], + params: &mut Vec<Value>, f_transform: &dyn Fn(&mut Plan), ) -> PatternWithParams { let mut plan = sql_to_ir(query, params); diff --git a/src/ir/transformation/merge_tuples/tests.rs b/src/ir/transformation/merge_tuples/tests.rs index 96440851d3..3a6d76608d 100644 --- a/src/ir/transformation/merge_tuples/tests.rs +++ b/src/ir/transformation/merge_tuples/tests.rs @@ -25,7 +25,7 @@ fn merge_tuples1() { ], ); - assert_eq!(sql_to_sql(input, &[], &merge_tuples), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &merge_tuples), expected); } #[test] @@ -50,7 +50,7 @@ fn merge_tuples2() { ], ); - assert_eq!(sql_to_sql(input, &[], &merge_tuples), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &merge_tuples), expected); } #[test] @@ -61,7 +61,7 @@ fn merge_tuples3() { vec![Value::Boolean(true)], ); - assert_eq!(sql_to_sql(input, &[], &merge_tuples), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &merge_tuples), expected); } #[test] @@ -75,7 +75,7 @@ fn merge_tuples4() { vec![Value::from(1_u64), Value::from(2_u64), Value::from(3_u64)], ); - assert_eq!(sql_to_sql(input, &[], &merge_tuples), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &merge_tuples), expected); } #[test] @@ -90,7 +90,7 @@ fn merge_tuples5() { vec![Value::from(1_u64), Value::from(2_u64), Value::from(3_u64)], ); - assert_eq!(sql_to_sql(input, &[], &merge_tuples), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &merge_tuples), expected); } #[test] @@ -104,5 +104,5 @@ fn merge_tuples6() { vec![Value::from(2_u64), Value::from(1_u64)], ); - assert_eq!(sql_to_sql(input, &[], &merge_tuples), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &merge_tuples), expected); } diff --git a/src/ir/transformation/redistribution/tests.rs b/src/ir/transformation/redistribution/tests.rs index 75602f1c7b..9b01db7c4c 100644 --- a/src/ir/transformation/redistribution/tests.rs +++ b/src/ir/transformation/redistribution/tests.rs @@ -345,7 +345,7 @@ fn union_all_in_sq() { WHERE "sys_op" > 1) AS "t3" WHERE "identification_number" = 1"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let expected: Option<Vec<Vec<usize>>> = None; assert_eq!(expected, plan.slices); @@ -357,7 +357,7 @@ fn inner_join_eq_for_keys() { INNER JOIN "t" ON ("t1"."identification_number", "t1"."product_code") = ("t"."a", "t"."b")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let expected: Option<Vec<Vec<usize>>> = None; assert_eq!(expected, plan.slices); @@ -370,7 +370,7 @@ fn join_inner_sq_eq_for_keys() { (SELECT "identification_number" as "id", "product_code" as "pc" FROM "hash_testing_hist") AS "t2" ON ("t1"."identification_number", "t1"."product_code") = ("t2"."id", "t2"."pc")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let expected: Option<Vec<Vec<usize>>> = None; assert_eq!(expected, plan.slices); @@ -383,7 +383,7 @@ fn join_inner_eq_non_match_keys() { (SELECT "identification_number" as "id", "product_code" as "pc" FROM "hash_testing_hist") AS "t2" ON ("t1"."identification_number", "t1"."product_code") = ("t2"."pc", "t2"."id")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices @@ -416,7 +416,7 @@ fn join_inner_sq_eq_for_keys_with_const() { (SELECT "identification_number" as "id", "product_code" as "pc" FROM "hash_testing_hist") AS "t2" ON ("t1"."identification_number", 1, "t1"."product_code") = ("t2"."id", 1, "t2"."pc")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let expected: Option<Vec<Vec<usize>>> = None; assert_eq!(expected, plan.slices); @@ -429,7 +429,7 @@ fn join_inner_sq_less_for_keys() { (SELECT "identification_number" as "id", "product_code" as "pc" FROM "hash_testing_hist") AS "t2" ON ("t1"."identification_number", "t1"."product_code") < ("t2"."id", "t2"."pc")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices @@ -454,7 +454,7 @@ fn join_inner_sq_eq_no_keys() { (SELECT "identification_number" as "id", "product_code" as "pc" FROM "hash_testing_hist") AS "t2" ON ("t1"."identification_number", 1) = (1, "t2"."pc")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices @@ -479,7 +479,7 @@ fn join_inner_sq_eq_no_outer_keys() { (SELECT "identification_number" as "id", "product_code" as "pc" FROM "hash_testing_hist") AS "t2" ON ("t1"."identification_number", 1) = ("t2"."id", "t2"."pc")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices @@ -505,7 +505,7 @@ fn inner_join_full_policy_sq_in_filter() { AND ("t"."a", "t"."b") >= (SELECT "hash_testing"."sys_op", "hash_testing"."bucket_id" FROM "hash_testing")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices @@ -531,7 +531,7 @@ fn inner_join_local_policy_sq_in_filter() { AND ("t"."a", "t"."b") = (SELECT "hash_testing"."identification_number", "hash_testing"."product_code" FROM "hash_testing")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let expected: Option<Vec<Vec<usize>>> = None; assert_eq!(expected, plan.slices); @@ -547,7 +547,7 @@ fn inner_join_local_policy_sq_with_union_all_in_filter() { UNION ALL SELECT "hash_testing_hist"."identification_number", "hash_testing_hist"."product_code" FROM "hash_testing_hist")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let expected: Option<Vec<Vec<usize>>> = None; assert_eq!(expected, plan.slices); @@ -563,7 +563,7 @@ fn inner_join_full_policy_sq_with_union_all_in_filter() { UNION ALL SELECT "hash_testing_hist"."product_code", "hash_testing_hist"."identification_number" FROM "hash_testing_hist")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices @@ -597,7 +597,7 @@ fn join_inner_and_local_full_policies() { ON ("t1"."identification_number", "t1"."product_code") = ("t2"."id", "t2"."pc") AND "t1"."identification_number" = "t2"."pc""#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let expected: Option<Vec<Vec<usize>>> = None; assert_eq!(expected, plan.slices); @@ -611,7 +611,7 @@ fn join_inner_or_local_full_policies() { ON ("t1"."identification_number", "t1"."product_code") = ("t2"."id", "t2"."pc") OR "t1"."identification_number" = "t2"."pc""#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices @@ -652,7 +652,7 @@ fn join1() { ON "t3"."id" = "t8"."identification_number" WHERE "t3"."id" = 1 AND "t8"."identification_number" = 1"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices @@ -696,7 +696,7 @@ fn join1() { fn redistribution1() { let query = r#"INSERT INTO "t" SELECT "d", "c", "b", "a" FROM "t""#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices @@ -726,7 +726,7 @@ fn redistribution1() { fn redistribution2() { let query = r#"INSERT INTO "t" SELECT * FROM "t""#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); // Though data allows to be inserted locally still gather it on the // coordinator to recalculate a "bucket_id" field for "t". @@ -758,7 +758,7 @@ fn redistribution2() { fn redistribution3() { let query = r#"INSERT INTO "t" ("a", "b") SELECT "a", "b" FROM "t""#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); // Though data allows to be inserted locally still gather it on the // coordinator to recalculate a "bucket_id" field for "t". @@ -790,7 +790,7 @@ fn redistribution3() { fn redistribution4() { let query = r#"INSERT INTO "t" ("b", "a") SELECT "a", "b" FROM "t""#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices @@ -820,7 +820,7 @@ fn redistribution4() { fn redistribution5() { let query = r#"INSERT INTO "t" ("c", "d") SELECT "a", "b" FROM "t""#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices @@ -850,7 +850,7 @@ fn redistribution5() { fn redistribution6() { let query = r#"INSERT INTO "t" ("a", "c") SELECT "a", "b" FROM "t""#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *plan .slices diff --git a/src/ir/transformation/redistribution/tests/between.rs b/src/ir/transformation/redistribution/tests/between.rs index f6f3f6dd7e..7521917d83 100644 --- a/src/ir/transformation/redistribution/tests/between.rs +++ b/src/ir/transformation/redistribution/tests/between.rs @@ -10,7 +10,7 @@ fn between1() { WHERE (SELECT "identification_number" FROM "hash_testing_hist" AS "h" WHERE "identification_number" = 2) BETWEEN 1 AND 2"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_gt_eq_id = *get_motion_id(&plan, 0, 0).unwrap(); let motion = plan.get_relation_node(motion_gt_eq_id).unwrap(); @@ -35,7 +35,7 @@ fn between2() { let query = r#"SELECT "identification_number" FROM "hash_testing" AS "t" WHERE "identification_number" BETWEEN 1 AND 2"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let expected: Option<Vec<Vec<usize>>> = None; assert_eq!(expected, plan.slices); @@ -48,7 +48,7 @@ fn between3() { SELECT "identification_number" FROM "hash_testing_hist" WHERE "identification_number" = 3)"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *get_motion_id(&plan, 0, 0).unwrap(); let motion = plan.get_relation_node(motion_id).unwrap(); @@ -66,7 +66,7 @@ fn between4() { let query = r#"SELECT "identification_number" FROM "hash_testing" AS "t" WHERE 1 BETWEEN "identification_number" AND 2"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let expected: Option<Vec<Vec<usize>>> = None; assert_eq!(expected, plan.slices); diff --git a/src/ir/transformation/redistribution/tests/except.rs b/src/ir/transformation/redistribution/tests/except.rs index 558e46e5f2..f7780b0e8d 100644 --- a/src/ir/transformation/redistribution/tests/except.rs +++ b/src/ir/transformation/redistribution/tests/except.rs @@ -10,7 +10,7 @@ fn except1() { EXCEPT DISTINCT SELECT "identification_number" as "id", "product_code" as "pc" FROM "hash_testing_hist""#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *get_motion_id(&plan, 0, 0).unwrap(); let motion = plan.get_relation_node(motion_id).unwrap(); @@ -27,7 +27,7 @@ fn except2() { EXCEPT DISTINCT SELECT "identification_number" as "id", "product_code" as "pc" FROM "hash_testing_hist" AS "t""#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let expected: Option<Vec<Vec<usize>>> = None; assert_eq!(expected, plan.slices); @@ -39,7 +39,7 @@ fn except3() { EXCEPT SELECT 1, 2 FROM "hash_testing_hist""#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *get_motion_id(&plan, 0, 0).unwrap(); let motion = plan.get_relation_node(motion_id).unwrap(); @@ -68,7 +68,7 @@ fn except4() { SELECT 1, 2 FROM "hash_testing_hist" ) as t"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *get_motion_id(&plan, 0, 0).unwrap(); let motion = plan.get_relation_node(motion_id).unwrap(); @@ -97,7 +97,7 @@ fn except5() { SELECT 1, 2 FROM "hash_testing_hist" ) as t"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *get_motion_id(&plan, 0, 0).unwrap(); let motion = plan.get_relation_node(motion_id).unwrap(); diff --git a/src/ir/transformation/redistribution/tests/not_in.rs b/src/ir/transformation/redistribution/tests/not_in.rs index 3809f20964..bf0a1d3ca5 100644 --- a/src/ir/transformation/redistribution/tests/not_in.rs +++ b/src/ir/transformation/redistribution/tests/not_in.rs @@ -9,7 +9,7 @@ fn not_in1() { let query = r#"SELECT 1 FROM "hash_testing" AS "t" WHERE "product_code" NOT IN ( SELECT "product_code" FROM "hash_testing_hist")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *get_motion_id(&plan, 0, 0).unwrap(); let motion = plan.get_relation_node(motion_id).unwrap(); @@ -25,7 +25,7 @@ fn not_in2() { let query = r#"SELECT 1 FROM "hash_testing" AS "t" WHERE ("identification_number", "product_code") NOT IN ( SELECT "identification_number", "product_code" FROM "hash_testing_hist" AS "t")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let expected: Option<Vec<Vec<usize>>> = None; assert_eq!(expected, plan.slices); @@ -36,7 +36,7 @@ fn not_in3() { let query = r#"SELECT 1 FROM "hash_testing" AS "t" WHERE ("identification_number", "product_code") NOT IN ( SELECT "product_code", 42 FROM "hash_testing_hist")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *get_motion_id(&plan, 0, 0).unwrap(); let motion = plan.get_relation_node(motion_id).unwrap(); @@ -60,7 +60,7 @@ fn not_in4() { let query = r#"SELECT 1 FROM "hash_testing" AS "t" WHERE ("product_code", "identification_number") NOT IN ( SELECT "product_code", 42 FROM "hash_testing_hist")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *get_motion_id(&plan, 0, 0).unwrap(); let motion = plan.get_relation_node(motion_id).unwrap(); @@ -84,7 +84,7 @@ fn not_in5() { let query = r#"SELECT 1 FROM "hash_testing" AS "t" WHERE ("identification_number", "product_code") NOT IN ( SELECT 42, 666 FROM "hash_testing_hist" AS "t")"#; - let mut plan = sql_to_ir(query, &[]); + let mut plan = sql_to_ir(query, &mut vec![]); plan.add_motions().unwrap(); let motion_id = *get_motion_id(&plan, 0, 0).unwrap(); let motion = plan.get_relation_node(motion_id).unwrap(); diff --git a/src/ir/transformation/split_columns/tests.rs b/src/ir/transformation/split_columns/tests.rs index 8dbdcf5a2b..038c5081c8 100644 --- a/src/ir/transformation/split_columns/tests.rs +++ b/src/ir/transformation/split_columns/tests.rs @@ -22,7 +22,7 @@ fn split_columns1() { vec![Value::from(1_u64), Value::from(2_u64)], ); - assert_eq!(sql_to_sql(input, &[], &split_columns), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &split_columns), expected); } #[test] @@ -33,7 +33,7 @@ fn split_columns2() { vec![Value::from(1_u64)], ); - assert_eq!(sql_to_sql(input, &[], &split_columns), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &split_columns), expected); } #[test] @@ -43,7 +43,7 @@ fn split_columns3() { let metadata = &RouterConfigurationMock::new(); let ast = AbstractSyntaxTree::new(query).unwrap(); let mut plan = ast.resolve_metadata(metadata).unwrap(); - plan.bind_params(&[]).unwrap(); + plan.bind_params(&mut vec![]).unwrap(); let plan_err = plan.split_columns().unwrap_err(); assert_eq!( format!( @@ -64,7 +64,7 @@ fn split_columns4() { vec![Value::from(1_u64), Value::from(2_u64)], ); - assert_eq!(sql_to_sql(input, &[], &split_columns), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &split_columns), expected); } #[test] @@ -79,5 +79,5 @@ fn split_columns5() { vec![Value::from(1_u64), Value::from(2_u64), Value::from(2_u64)], ); - assert_eq!(sql_to_sql(input, &[], &split_columns), expected); + assert_eq!(sql_to_sql(input, &mut vec![], &split_columns), expected); } -- GitLab