diff --git a/sqlx-core/src/any/arguments.rs b/sqlx-core/src/any/arguments.rs index 59d6f4d6e0..8f44f54bdb 100644 --- a/sqlx-core/src/any/arguments.rs +++ b/sqlx-core/src/any/arguments.rs @@ -30,6 +30,10 @@ impl Arguments for AnyArguments { fn len(&self) -> usize { self.values.0.len() } + + fn merge(&mut self, arguments: Self) { + self.values.0.extend(arguments.values.0); + } } #[derive(Default)] diff --git a/sqlx-core/src/arguments.rs b/sqlx-core/src/arguments.rs index 7b9da60b9c..a74219bed1 100644 --- a/sqlx-core/src/arguments.rs +++ b/sqlx-core/src/arguments.rs @@ -27,6 +27,8 @@ pub trait Arguments: Send + Sized + Default { fn format_placeholder(&self, writer: &mut W) -> fmt::Result { writer.write_str("?") } + + fn merge(&mut self, arguments: Self); } pub trait IntoArguments: Sized + Send { diff --git a/sqlx-mysql/src/arguments.rs b/sqlx-mysql/src/arguments.rs index 306431039d..10b3dc3fd5 100644 --- a/sqlx-mysql/src/arguments.rs +++ b/sqlx-mysql/src/arguments.rs @@ -55,6 +55,20 @@ impl Arguments for MySqlArguments { fn len(&self) -> usize { self.types.len() } + + fn merge(&mut self, arguments: Self) { + self.values.extend(arguments.values); + self.types.extend(arguments.types); + + for i in 0..arguments.null_bitmap.length { + let byte_index = i / 8; + let bit_offset = i % 8; + let is_null = (arguments.null_bitmap.bytes[byte_index] & (1 << bit_offset)) != 0; + + self.null_bitmap + .push(if is_null { IsNull::Yes } else { IsNull::No }); + } + } } #[derive(Debug, Default, Clone)] diff --git a/sqlx-postgres/src/arguments.rs b/sqlx-postgres/src/arguments.rs index c0db982c7d..51210bde69 100644 --- a/sqlx-postgres/src/arguments.rs +++ b/sqlx-postgres/src/arguments.rs @@ -161,6 +161,25 @@ impl Arguments for PgArguments { fn len(&self) -> usize { self.buffer.count } + + fn merge(&mut self, arguments: Self) { + let buf_offset = self.buffer.len(); + let count_offset = self.buffer.count; + + self.types.extend(arguments.types); + self.buffer.count += arguments.buffer.count; + self.buffer.buffer.extend(arguments.buffer.buffer); + + for mut patch in arguments.buffer.patches { + patch.buf_offset += buf_offset; + patch.arg_index += count_offset; + self.buffer.patches.push(patch); + } + + for (offset, kind) in arguments.buffer.type_holes { + self.buffer.type_holes.push((offset + buf_offset, kind)); + } + } } impl PgArgumentBuffer { diff --git a/sqlx-sqlite/src/arguments.rs b/sqlx-sqlite/src/arguments.rs index 4fd7da5067..7a85449b1c 100644 --- a/sqlx-sqlite/src/arguments.rs +++ b/sqlx-sqlite/src/arguments.rs @@ -66,6 +66,10 @@ impl Arguments for SqliteArguments { fn len(&self) -> usize { self.values.0.len() } + + fn merge(&mut self, arguments: Self) { + self.values.0.extend(arguments.values.0); + } } impl SqliteArguments {