From 75b3fb9cb4bb8f7015df799de109c57425e2a7e4 Mon Sep 17 00:00:00 2001 From: Polina Alekseeva Date: Tue, 2 Sep 2025 11:56:47 +0400 Subject: [PATCH 1/6] fix-spaces: allow queries on column names with spaces --- src/tds/codec/token/token_col_metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tds/codec/token/token_col_metadata.rs b/src/tds/codec/token/token_col_metadata.rs index 53ffdf1c..6d49938d 100644 --- a/src/tds/codec/token/token_col_metadata.rs +++ b/src/tds/codec/token/token_col_metadata.rs @@ -25,7 +25,7 @@ pub struct MetaDataColumn<'a> { impl<'a> Display for MetaDataColumn<'a> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{} ", self.col_name)?; + write!(f, "[{}] ", self.col_name)?; match &self.base.ty { TypeInfo::FixedLen(fixed) => match fixed { From 0e1293dc3e2d48861ac0ac08f57dd1d51119e1a9 Mon Sep 17 00:00:00 2001 From: Polina Alekseeva Date: Wed, 3 Sep 2025 14:11:04 +0400 Subject: [PATCH 2/6] fix-spaces: Replace brackets --- src/tds/codec/token/token_col_metadata.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tds/codec/token/token_col_metadata.rs b/src/tds/codec/token/token_col_metadata.rs index 6d49938d..e0425559 100644 --- a/src/tds/codec/token/token_col_metadata.rs +++ b/src/tds/codec/token/token_col_metadata.rs @@ -25,7 +25,8 @@ pub struct MetaDataColumn<'a> { impl<'a> Display for MetaDataColumn<'a> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "[{}] ", self.col_name)?; + let name = self.col_name.replace(']', "]]"); + write!(f, "[{}] ", name)?; match &self.base.ty { TypeInfo::FixedLen(fixed) => match fixed { From 5d3cf54486416a8cc68d7cde44bd1337eafbeb12 Mon Sep 17 00:00:00 2001 From: Polina Alekseeva Date: Wed, 3 Sep 2025 16:11:39 +0400 Subject: [PATCH 3/6] fix-spaces: add info --- src/client.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/client.rs b/src/client.rs index 688721d1..e06a79ea 100644 --- a/src/client.rs +++ b/src/client.rs @@ -28,6 +28,7 @@ use enumflags2::BitFlags; use futures_util::io::{AsyncRead, AsyncWrite}; use futures_util::stream::TryStreamExt; use std::{borrow::Cow, fmt::Debug}; +use tracing::info; /// `Client` is the main entry point to the SQL Server, providing query /// execution capabilities. @@ -331,10 +332,17 @@ impl Client { .into_iter() .filter(|column| column.base.flags.contains(ColumnFlag::Updateable)) .collect(); + let col_specs_indexed = columns + .iter() + .enumerate() + .map(|(i, c)| format!("#{i}: {}", c)) // uses Display -> "[Name] " + .join(", "); self.connection.flush_stream().await?; let col_data = columns.iter().map(|c| format!("{}", c)).join(", "); let query = format!("INSERT BULK {} ({})", table, col_data); + info!("INSERT BULK header: {}", query); + info!("INSERT BULK specs: {}", col_specs_indexed); let req = BatchRequest::new(query, self.connection.context().transaction_descriptor()); let id = self.connection.context_mut().next_packet_id(); From d7b219fde1b12bfc404a19b2656257146be4c1ad Mon Sep 17 00:00:00 2001 From: Polina Alekseeva Date: Wed, 3 Sep 2025 16:45:43 +0400 Subject: [PATCH 4/6] fix-spaces: return init fix --- src/client.rs | 8 -------- src/tds/codec/token/token_col_metadata.rs | 3 +-- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/client.rs b/src/client.rs index e06a79ea..688721d1 100644 --- a/src/client.rs +++ b/src/client.rs @@ -28,7 +28,6 @@ use enumflags2::BitFlags; use futures_util::io::{AsyncRead, AsyncWrite}; use futures_util::stream::TryStreamExt; use std::{borrow::Cow, fmt::Debug}; -use tracing::info; /// `Client` is the main entry point to the SQL Server, providing query /// execution capabilities. @@ -332,17 +331,10 @@ impl Client { .into_iter() .filter(|column| column.base.flags.contains(ColumnFlag::Updateable)) .collect(); - let col_specs_indexed = columns - .iter() - .enumerate() - .map(|(i, c)| format!("#{i}: {}", c)) // uses Display -> "[Name] " - .join(", "); self.connection.flush_stream().await?; let col_data = columns.iter().map(|c| format!("{}", c)).join(", "); let query = format!("INSERT BULK {} ({})", table, col_data); - info!("INSERT BULK header: {}", query); - info!("INSERT BULK specs: {}", col_specs_indexed); let req = BatchRequest::new(query, self.connection.context().transaction_descriptor()); let id = self.connection.context_mut().next_packet_id(); diff --git a/src/tds/codec/token/token_col_metadata.rs b/src/tds/codec/token/token_col_metadata.rs index e0425559..6d49938d 100644 --- a/src/tds/codec/token/token_col_metadata.rs +++ b/src/tds/codec/token/token_col_metadata.rs @@ -25,8 +25,7 @@ pub struct MetaDataColumn<'a> { impl<'a> Display for MetaDataColumn<'a> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let name = self.col_name.replace(']', "]]"); - write!(f, "[{}] ", name)?; + write!(f, "[{}] ", self.col_name)?; match &self.base.ty { TypeInfo::FixedLen(fixed) => match fixed { From 52034bedbb1a738ece3d5ce8015b004f7d839bac Mon Sep 17 00:00:00 2001 From: Polina Alekseeva Date: Wed, 3 Sep 2025 17:07:59 +0400 Subject: [PATCH 5/6] fix-spaces: update tiberius version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 081e6491..9d8ccf95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ license = "MIT/Apache-2.0" name = "tiberius" readme = "README.md" repository = "https://github.com/prisma/tiberius" -version = "0.12.2" +version = "0.12.3" [workspace] members = ["runtimes-macro"] From 8c3ba16e21874f57b011c5ad9f1210d0e87776ca Mon Sep 17 00:00:00 2001 From: "a.demidov" Date: Tue, 11 Nov 2025 09:58:53 +0300 Subject: [PATCH 6/6] Add column name escaping --- src/tds/codec/token/token_col_metadata.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tds/codec/token/token_col_metadata.rs b/src/tds/codec/token/token_col_metadata.rs index 6d49938d..ade75251 100644 --- a/src/tds/codec/token/token_col_metadata.rs +++ b/src/tds/codec/token/token_col_metadata.rs @@ -25,7 +25,8 @@ pub struct MetaDataColumn<'a> { impl<'a> Display for MetaDataColumn<'a> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "[{}] ", self.col_name)?; + let col_name = self.col_name.replace(']', "]]"); + write!(f, "[{}] ", col_name)?; match &self.base.ty { TypeInfo::FixedLen(fixed) => match fixed {