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)
+        )
     }
 }