Skip to content

Commit 386d977

Browse files
committed
Increase max supported arrays from 10 to 32
1 parent cf32234 commit 386d977

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed

crates/corro-pg/tests/tests.rs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,91 @@ async fn test_unnest_typing() {
805805
wait_for_all_pending_handles().await;
806806
}
807807

808+
#[tokio::test(flavor = "multi_thread")]
809+
async fn test_unnest_max_parameters() {
810+
let (tripwire, tripwire_worker, tripwire_tx) = Tripwire::new_simple();
811+
812+
let (_ta, server) = setup_pg_test_server(tripwire, None).await;
813+
814+
let conn_str = format!(
815+
"host={} port={} user=testuser",
816+
server.local_addr.ip(),
817+
server.local_addr.port()
818+
);
819+
820+
{
821+
let (client, client_conn) = tokio_postgres::connect(&conn_str, NoTls).await.unwrap();
822+
println!("client is ready!");
823+
tokio::spawn(client_conn);
824+
825+
// expected_max_arrays parameters should work
826+
let expected_max_arrays = 32;
827+
let per_column = 16;
828+
{
829+
let cols = (0..expected_max_arrays)
830+
.map(|i| {
831+
(0..per_column)
832+
.map(|j| i * 1000 + j as i64)
833+
.collect::<Vec<i64>>()
834+
})
835+
.collect::<Vec<Vec<i64>>>();
836+
let rets = (0..expected_max_arrays)
837+
.map(|i| format!("CAST(value{i} AS int)"))
838+
.collect::<Vec<_>>()
839+
.join(",");
840+
let arrs = (0..expected_max_arrays)
841+
.map(|i| format!("CAST(${i} AS int[])"))
842+
.collect::<Vec<_>>()
843+
.join(",");
844+
let params: Vec<&(dyn tokio_postgres::types::ToSql + Sync)> = cols
845+
.iter()
846+
.map(|v| v as &(dyn tokio_postgres::types::ToSql + Sync))
847+
.collect();
848+
let rows = client
849+
.query(&format!("SELECT {} FROM unnest({})", rets, arrs), &params)
850+
.await
851+
.unwrap();
852+
for (i, row) in rows.iter().enumerate() {
853+
for j in 0..per_column {
854+
let val: i64 = row.get(j);
855+
assert_eq!(val, cols[i][j]);
856+
}
857+
}
858+
}
859+
860+
// but not expected_max_arrays + 1
861+
{
862+
let cols = (0..expected_max_arrays + 1)
863+
.map(|i| {
864+
(0..per_column)
865+
.map(|j| i * 1000 + j as i64)
866+
.collect::<Vec<i64>>()
867+
})
868+
.collect::<Vec<Vec<i64>>>();
869+
let rets = (0..expected_max_arrays + 1)
870+
.map(|i| format!("CAST(value{i} AS int)"))
871+
.collect::<Vec<_>>()
872+
.join(", ");
873+
let arrs = (0..expected_max_arrays + 1)
874+
.map(|i| format!("CAST(${i} AS int[])"))
875+
.collect::<Vec<_>>()
876+
.join(", ");
877+
let params: Vec<&(dyn tokio_postgres::types::ToSql + Sync)> = cols
878+
.iter()
879+
.map(|v| v as &(dyn tokio_postgres::types::ToSql + Sync))
880+
.collect();
881+
assert!(client
882+
.query(&format!("SELECT {} FROM unnest({})", rets, arrs), &params,)
883+
.await
884+
.is_err());
885+
}
886+
}
887+
888+
tripwire_tx.send(()).await.ok();
889+
tripwire_worker.await;
890+
wait_for_all_pending_handles().await;
891+
}
892+
808893
#[tokio::test(flavor = "multi_thread")]
809894
async fn test_unnest_vtab() {
810895
let (tripwire, tripwire_worker, tripwire_tx) = Tripwire::new_simple();

crates/corro-types/src/vtab/unnest.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ use rusqlite::Result;
4444
// This must match rusqlite's internal ARRAY_TYPE constant
4545
const ARRAY_TYPE: *const c_char = c"rarray".as_ptr();
4646
// Maximum number of arrays supported
47-
const MAX_ARRAYS: usize = 10;
47+
const MAX_ARRAYS: usize = 32;
4848
lazy_static::lazy_static! {
4949
static ref UNNEST_SCHEMA: String =
5050
format!("CREATE TABLE x({}, {})",

0 commit comments

Comments
 (0)