From 99220b8af46bdb04f1d7304f070b5b5d8ee97911 Mon Sep 17 00:00:00 2001
From: Denis Smirnov <sd@picodata.io>
Date: Thu, 18 Aug 2022 19:21:10 +0700
Subject: [PATCH] perf: clarify preallocation for add syntax plan node

---
 src/executor/engine/cartridge/backend/sql/tree.rs | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/executor/engine/cartridge/backend/sql/tree.rs b/src/executor/engine/cartridge/backend/sql/tree.rs
index 4590883c56..8d20745e65 100644
--- a/src/executor/engine/cartridge/backend/sql/tree.rs
+++ b/src/executor/engine/cartridge/backend/sql/tree.rs
@@ -512,7 +512,7 @@ impl<'p> SyntaxPlan<'p> {
                     // `SELECT` and `FROM`.
                     let expr = ir_plan.get_expression_node(*output)?;
                     if let Expression::Row { list, .. } = expr {
-                        let mut nodes: Vec<usize> = Vec::with_capacity(list.len());
+                        let mut nodes: Vec<usize> = Vec::with_capacity(list.len() * 2);
                         if let Some((last, elements)) = list.split_last() {
                             for elem in elements {
                                 nodes.push(self.nodes.get_syntax_node_id(*elem)?);
@@ -609,7 +609,7 @@ impl<'p> SyntaxPlan<'p> {
                     Ok(self.nodes.push_syntax_node(sn))
                 }
                 Relational::Values { children, .. } => {
-                    let mut sn_children: Vec<usize> = Vec::with_capacity(children.len() * 2 - 1);
+                    let mut sn_children: Vec<usize> = Vec::with_capacity(children.len() * 2);
                     if let Some((last_id, other)) = children.split_last() {
                         for child_id in other {
                             sn_children.push(self.nodes.get_syntax_node_id(*child_id)?);
@@ -691,6 +691,7 @@ impl<'p> SyntaxPlan<'p> {
                     let mut nodes: Vec<usize> =
                         vec![self.nodes.push_syntax_node(SyntaxNode::new_open())];
                     if let Some((last, elements)) = list.split_last() {
+                        nodes.reserve(list.len() * 2);
                         for elem in elements {
                             nodes.push(self.nodes.get_syntax_node_id(*elem)?);
                             nodes.push(self.nodes.push_syntax_node(SyntaxNode::new_comma()));
-- 
GitLab