diff --git a/sbroad-core/src/frontend/sql.rs b/sbroad-core/src/frontend/sql.rs index 60ebad050037b72c3e55d0849ba5210ee047bb4e..5ec0ab7591180d09617b684c2e86ae86b5afb707 100644 --- a/sbroad-core/src/frontend/sql.rs +++ b/sbroad-core/src/frontend/sql.rs @@ -2079,7 +2079,7 @@ impl ParseExpression { let op_plan_id = match op { ParseExpressionInfixOperator::Concat => { - plan.add_concat(left_row_id, right_row_id)? + plan.add_concat(left_row_id, right_row_id) } ParseExpressionInfixOperator::InfixArithmetic(arith) => { plan.add_arithmetic_to_plan(left_row_id, arith.clone(), right_row_id)? diff --git a/sbroad-core/src/frontend/sql/ir/tests.rs b/sbroad-core/src/frontend/sql/ir/tests.rs index 56db2026266b1af221727444b62b75061cabdf2b..b47235123e6223f3f31dc71281b0fbcd5a514b3d 100644 --- a/sbroad-core/src/frontend/sql/ir/tests.rs +++ b/sbroad-core/src/frontend/sql/ir/tests.rs @@ -4060,6 +4060,24 @@ vtable_max_rows = 5000 assert_eq!(expected_explain, plan.as_explain().unwrap()); } +#[test] +fn front_sql_check_concat_with_parameters() { + let input = r#"values (? || ?)"#; + + let plan = sql_to_optimized_ir(input, vec![Value::from("a"), Value::from("b")]); + + let expected_explain = String::from( + r#"values + value row (data=ROW(ROW('a'::string) || ROW('b'::string))) +execution options: +vdbe_max_steps = 45000 +vtable_max_rows = 5000 +"#, + ); + + assert_eq!(expected_explain, plan.as_explain().unwrap()); +} + #[cfg(test)] mod cte; #[cfg(test)] diff --git a/sbroad-core/src/ir/expression/concat.rs b/sbroad-core/src/ir/expression/concat.rs index c469fee91a9804eee4a4e438594998f60e1bbd3b..efd91b2d80d4a52ea9019b4ddb72b503a7c2fc80 100644 --- a/sbroad-core/src/ir/expression/concat.rs +++ b/sbroad-core/src/ir/expression/concat.rs @@ -1,5 +1,4 @@ -use crate::errors::SbroadError; -use crate::ir::node::Concat; +use crate::ir::node::{Concat, Node}; use crate::ir::Plan; use super::NodeId; @@ -9,18 +8,22 @@ impl Plan { /// /// # Errors /// - Left or right child nodes are not of the expression type. - pub fn add_concat(&mut self, left_id: NodeId, right_id: NodeId) -> Result<NodeId, SbroadError> { - // Check that both children are of expression type. - for child_id in &[left_id, right_id] { - self.get_expression_node(*child_id)?; - } - let concat_id = self.nodes.push( + pub fn add_concat(&mut self, left_id: NodeId, right_id: NodeId) -> NodeId { + debug_assert!(matches!( + self.get_node(left_id), + Ok(Node::Expression(_) | Node::Parameter(_)) + )); + debug_assert!(matches!( + self.get_node(right_id), + Ok(Node::Expression(_) | Node::Parameter(_)) + )); + + self.nodes.push( Concat { left: left_id, right: right_id, } .into(), - ); - Ok(concat_id) + ) } }