From 0f55261589cd42edf8c96262bef58bfb540c8074 Mon Sep 17 00:00:00 2001 From: Sage Griffin Date: Fri, 10 Jul 2026 13:22:50 -0600 Subject: [PATCH] Multi-row insert statements going to all shards --- .../rust/tests/integration/insert_split.rs | 60 +++++++++++++++++++ integration/rust/tests/integration/mod.rs | 1 + 2 files changed, 61 insertions(+) create mode 100644 integration/rust/tests/integration/insert_split.rs diff --git a/integration/rust/tests/integration/insert_split.rs b/integration/rust/tests/integration/insert_split.rs new file mode 100644 index 000000000..6561b921e --- /dev/null +++ b/integration/rust/tests/integration/insert_split.rs @@ -0,0 +1,60 @@ +use crate::setup::{admin_sqlx, connections_sqlx}; +use sqlx::{Executor, Pool, Postgres}; + +#[tokio::test] +async fn test_insert_split_with_many_binds() { + let conns = connections_sqlx().await; + + setup_schema(&conns, "test_insert_split_with_many_binds", "int8").await; + let sharded = &conns[1]; + let values_str = (1..=20) + .step_by(2) + .map(|i| format!("(${}, ${})", i, i + 1)) + .collect::>() + .join(","); + + let sql = format!( + "INSERT INTO test_insert_split_with_many_binds (customer_id, value) VALUES {}", + values_str + ); + let mut query = sqlx::query(&sql); + for i in 1..=10 { + query = query.bind(i).bind(i); + } + let res = query.execute(sharded).await.unwrap(); + assert_eq!(res.rows_affected(), 10); + + let data = sqlx::query_as::<_, (i64, i64)>("SELECT * FROM test_insert_split_with_many_binds") + .fetch_all(sharded) + .await + .unwrap(); + assert_eq!( + data, + vec![ + (1, 1), + (2, 2), + (3, 3), + (4, 4), + (5, 5), + (6, 6), + (7, 7), + (8, 8), + (9, 9), + (10, 10), + ] + ); +} + +async fn setup_schema(conns: &[Pool], table_name: &str, data_type: &str) { + for conn in conns { + conn.execute(&*format!("DROP TABLE IF EXISTS {table_name}")) + .await + .unwrap(); + conn.execute(&*format!( + "CREATE TABLE {table_name} (customer_id BIGINT NOT NULL, value {data_type})", + )) + .await + .unwrap(); + admin_sqlx().await.execute("RELOAD").await.unwrap(); + } +} diff --git a/integration/rust/tests/integration/mod.rs b/integration/rust/tests/integration/mod.rs index 60132d930..c85dd290b 100644 --- a/integration/rust/tests/integration/mod.rs +++ b/integration/rust/tests/integration/mod.rs @@ -13,6 +13,7 @@ pub mod distinct; pub mod explain; pub mod fake_transactions; pub mod idle_in_transaction; +pub mod insert_split; pub mod limit; pub mod maintenance_mode; pub mod max;