Skip to content

Commit 27b0f83

Browse files
committed
Update MySql driver
1 parent b00f4aa commit 27b0f83

File tree

11 files changed

+53
-47
lines changed

11 files changed

+53
-47
lines changed

sqlx-core/src/migrate/migration.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@ use std::borrow::Cow;
22

33
use sha2::{Digest, Sha384};
44

5-
use crate::sql_str::{SqlSafeStr, SqlStr};
6-
75
use super::MigrationType;
86

97
#[derive(Debug, Clone)]
108
pub struct Migration {
119
pub version: i64,
1210
pub description: Cow<'static, str>,
1311
pub migration_type: MigrationType,
14-
pub sql: SqlStr,
12+
// We can't use `SqlStr` here because it can't be used in a const context
13+
pub sql: Cow<'static, str>,
1514
pub checksum: Cow<'static, [u8]>,
1615
pub no_tx: bool,
1716
}
@@ -21,13 +20,10 @@ impl Migration {
2120
version: i64,
2221
description: Cow<'static, str>,
2322
migration_type: MigrationType,
24-
sql: impl SqlSafeStr,
23+
sql: Cow<'static, str>,
2524
no_tx: bool,
2625
) -> Self {
27-
let sql = sql.into_sql_str();
28-
let checksum = Cow::Owned(Vec::from(
29-
Sha384::digest(sql.as_str().as_bytes()).as_slice(),
30-
));
26+
let checksum = Cow::Owned(Vec::from(Sha384::digest(sql.as_bytes()).as_slice()));
3127

3228
Migration {
3329
version,

sqlx-core/src/migrate/source.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::error::BoxDynError;
22
use crate::migrate::{Migration, MigrationType};
3-
use crate::sql_str::AssertSqlSafe;
43
use futures_core::future::BoxFuture;
54

65
use std::borrow::Cow;
@@ -132,7 +131,7 @@ pub fn resolve_blocking(path: &Path) -> Result<Vec<(Migration, PathBuf)>, Resolv
132131
version,
133132
Cow::Owned(description),
134133
migration_type,
135-
AssertSqlSafe(sql),
134+
Cow::Owned(sql),
136135
no_tx,
137136
),
138137
entry_path,

sqlx-mysql/src/any.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use sqlx_core::connection::Connection;
1515
use sqlx_core::database::Database;
1616
use sqlx_core::describe::Describe;
1717
use sqlx_core::executor::Executor;
18+
use sqlx_core::sql_str::SqlStr;
1819
use sqlx_core::transaction::TransactionManager;
1920
use std::{future, pin::pin};
2021

@@ -74,7 +75,7 @@ impl AnyConnectionBackend for MySqlConnection {
7475

7576
fn fetch_many<'q>(
7677
&'q mut self,
77-
query: &'q str,
78+
query: SqlStr,
7879
persistent: bool,
7980
arguments: Option<AnyArguments<'q>>,
8081
) -> BoxStream<'q, sqlx_core::Result<Either<AnyQueryResult, AnyRow>>> {
@@ -100,7 +101,7 @@ impl AnyConnectionBackend for MySqlConnection {
100101

101102
fn fetch_optional<'q>(
102103
&'q mut self,
103-
query: &'q str,
104+
query: SqlStr,
104105
persistent: bool,
105106
arguments: Option<AnyArguments<'q>>,
106107
) -> BoxFuture<'q, sqlx_core::Result<Option<AnyRow>>> {
@@ -127,11 +128,11 @@ impl AnyConnectionBackend for MySqlConnection {
127128

128129
fn prepare_with<'c, 'q: 'c>(
129130
&'c mut self,
130-
sql: &'q str,
131+
sql: SqlStr,
131132
_parameters: &[AnyTypeInfo],
132133
) -> BoxFuture<'c, sqlx_core::Result<AnyStatement>> {
133134
Box::pin(async move {
134-
let statement = Executor::prepare_with(self, sql, &[]).await?;
135+
let statement = Executor::prepare_with(self, sql.clone(), &[]).await?;
135136
AnyStatement::try_from_statement(
136137
sql,
137138
&statement,
@@ -140,7 +141,7 @@ impl AnyConnectionBackend for MySqlConnection {
140141
})
141142
}
142143

143-
fn describe<'q>(&'q mut self, sql: &'q str) -> BoxFuture<'q, sqlx_core::Result<Describe<Any>>> {
144+
fn describe<'q>(&'q mut self, sql: SqlStr) -> BoxFuture<'q, sqlx_core::Result<Describe<Any>>> {
144145
Box::pin(async move {
145146
let describe = Executor::describe(self, sql).await?;
146147
describe.try_into_any()

sqlx-mysql/src/connection/executor.rs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use futures_core::future::BoxFuture;
2222
use futures_core::stream::BoxStream;
2323
use futures_core::Stream;
2424
use futures_util::TryStreamExt;
25-
use sqlx_core::sql_str::{AssertSqlSafe, SqlSafeStr};
25+
use sqlx_core::sql_str::{SqlSafeStr, SqlStr};
2626
use std::{pin::pin, sync::Arc};
2727

2828
impl MySqlConnection {
@@ -102,13 +102,11 @@ impl MySqlConnection {
102102
#[allow(clippy::needless_lifetimes)]
103103
pub(crate) async fn run<'e, 'c: 'e, 'q: 'e>(
104104
&'c mut self,
105-
sql: &'q str,
105+
sql: SqlStr,
106106
arguments: Option<MySqlArguments>,
107107
persistent: bool,
108108
) -> Result<impl Stream<Item = Result<Either<MySqlQueryResult, MySqlRow>, Error>> + 'e, Error>
109109
{
110-
let mut logger = QueryLogger::new(sql, self.inner.log_settings.clone());
111-
112110
self.inner.stream.wait_until_ready().await?;
113111
self.inner.stream.waiting.push_back(Waiting::Result);
114112

@@ -121,7 +119,7 @@ impl MySqlConnection {
121119
let (mut column_names, format, mut needs_metadata) = if let Some(arguments) = arguments {
122120
if persistent && self.inner.cache_statement.is_enabled() {
123121
let (id, metadata) = self
124-
.get_or_prepare_statement(sql)
122+
.get_or_prepare_statement(sql.as_str())
125123
.await?;
126124

127125
// https://dev.mysql.com/doc/internals/en/com-stmt-execute.html
@@ -135,7 +133,7 @@ impl MySqlConnection {
135133
(metadata.column_names, MySqlValueFormat::Binary, false)
136134
} else {
137135
let (id, metadata) = self
138-
.prepare_statement(sql)
136+
.prepare_statement(sql.as_str())
139137
.await?;
140138

141139
// https://dev.mysql.com/doc/internals/en/com-stmt-execute.html
@@ -152,10 +150,11 @@ impl MySqlConnection {
152150
}
153151
} else {
154152
// https://dev.mysql.com/doc/internals/en/com-query.html
155-
self.inner.stream.send_packet(Query(sql)).await?;
153+
self.inner.stream.send_packet(Query(sql.as_str())).await?;
156154

157155
(Arc::default(), MySqlValueFormat::Text, true)
158156
};
157+
let mut logger = QueryLogger::new(sql, self.inner.log_settings.clone());
159158

160159
loop {
161160
// query response is a meta-packet which may be one of:
@@ -258,11 +257,11 @@ impl<'c> Executor<'c> for &'c mut MySqlConnection {
258257
'q: 'e,
259258
E: 'q,
260259
{
261-
let sql = query.sql();
262260
let arguments = query.take_arguments().map_err(Error::Encode);
263261
let persistent = query.persistent();
264262

265263
Box::pin(try_stream! {
264+
let sql = query.sql();
266265
let arguments = arguments?;
267266
let mut s = pin!(self.run(sql, arguments, persistent).await?);
268267

@@ -294,21 +293,22 @@ impl<'c> Executor<'c> for &'c mut MySqlConnection {
294293
})
295294
}
296295

297-
fn prepare_with<'e, 'q: 'e>(
296+
fn prepare_with<'e>(
298297
self,
299-
sql: &'q str,
298+
sql: impl SqlSafeStr,
300299
_parameters: &'e [MySqlTypeInfo],
301300
) -> BoxFuture<'e, Result<MySqlStatement, Error>>
302301
where
303302
'c: 'e,
304303
{
304+
let sql = sql.into_sql_str();
305305
Box::pin(async move {
306306
self.inner.stream.wait_until_ready().await?;
307307

308308
let metadata = if self.inner.cache_statement.is_enabled() {
309-
self.get_or_prepare_statement(sql).await?.1
309+
self.get_or_prepare_statement(sql.as_str()).await?.1
310310
} else {
311-
let (id, metadata) = self.prepare_statement(sql).await?;
311+
let (id, metadata) = self.prepare_statement(sql.as_str()).await?;
312312

313313
self.inner
314314
.stream
@@ -319,22 +319,23 @@ impl<'c> Executor<'c> for &'c mut MySqlConnection {
319319
};
320320

321321
Ok(MySqlStatement {
322-
sql: AssertSqlSafe(sql).into_sql_str(),
322+
sql,
323323
// metadata has internal Arcs for expensive data structures
324324
metadata: metadata.clone(),
325325
})
326326
})
327327
}
328328

329329
#[doc(hidden)]
330-
fn describe<'e, 'q: 'e>(self, sql: &'q str) -> BoxFuture<'e, Result<Describe<MySql>, Error>>
330+
fn describe<'e>(self, sql: impl SqlSafeStr) -> BoxFuture<'e, Result<Describe<MySql>, Error>>
331331
where
332332
'c: 'e,
333333
{
334+
let sql = sql.into_sql_str();
334335
Box::pin(async move {
335336
self.inner.stream.wait_until_ready().await?;
336337

337-
let (id, metadata) = self.prepare_statement(sql).await?;
338+
let (id, metadata) = self.prepare_statement(sql.as_str()).await?;
338339

339340
self.inner
340341
.stream

sqlx-mysql/src/migrate.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::time::Instant;
44

55
use futures_core::future::BoxFuture;
66
pub(crate) use sqlx_core::migrate::*;
7+
use sqlx_core::sql_str::AssertSqlSafe;
78

89
use crate::connection::{ConnectOptions, Connection};
910
use crate::error::Error;
@@ -37,7 +38,7 @@ impl MigrateDatabase for MySql {
3738
let mut conn = options.connect().await?;
3839

3940
let _ = conn
40-
.execute(&*format!("CREATE DATABASE `{database}`"))
41+
.execute(AssertSqlSafe(format!("CREATE DATABASE `{database}`")))
4142
.await?;
4243

4344
Ok(())
@@ -66,7 +67,9 @@ impl MigrateDatabase for MySql {
6667
let mut conn = options.connect().await?;
6768

6869
let _ = conn
69-
.execute(&*format!("DROP DATABASE IF EXISTS `{database}`"))
70+
.execute(AssertSqlSafe(format!(
71+
"DROP DATABASE IF EXISTS `{database}`"
72+
)))
7073
.await?;
7174

7275
Ok(())
@@ -200,7 +203,8 @@ CREATE TABLE IF NOT EXISTS _sqlx_migrations (
200203
.await?;
201204

202205
let _ = tx
203-
.execute(&*migration.sql)
206+
// We can't use `SqlStr` in `Migration` because it can't be used in a const context
207+
.execute(AssertSqlSafe(migration.sql.to_string()))
204208
.await
205209
.map_err(|e| MigrateError::ExecuteMigration(e, migration.version))?;
206210

@@ -269,7 +273,7 @@ CREATE TABLE IF NOT EXISTS _sqlx_migrations (
269273
.execute(&mut *tx)
270274
.await?;
271275

272-
tx.execute(&*migration.sql).await?;
276+
tx.execute(AssertSqlSafe(migration.sql.to_string())).await?;
273277

274278
// language=SQL
275279
let _ = query(r#"DELETE FROM _sqlx_migrations WHERE version = ?"#)

sqlx-mysql/src/options/connect.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::executor::Executor;
44
use crate::{MySqlConnectOptions, MySqlConnection};
55
use futures_core::future::BoxFuture;
66
use log::LevelFilter;
7+
use sqlx_core::sql_str::AssertSqlSafe;
78
use sqlx_core::Url;
89
use std::time::Duration;
910

@@ -77,7 +78,7 @@ impl ConnectOptions for MySqlConnectOptions {
7778
}
7879

7980
if !options.is_empty() {
80-
conn.execute(&*format!(r#"SET {};"#, options.join(",")))
81+
conn.execute(AssertSqlSafe(format!(r#"SET {};"#, options.join(","))))
8182
.await?;
8283
}
8384

sqlx-mysql/src/statement.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ impl Statement for MySqlStatement {
3333
}
3434
}
3535

36-
fn sql(&self) -> &str {
37-
&self.sql.as_str()
36+
fn sql(&self) -> SqlStr {
37+
self.sql.clone()
3838
}
3939

4040
fn parameters(&self) -> Option<Either<&[MySqlTypeInfo], usize>> {

sqlx-mysql/src/testing/mod.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::ops::Deref;
22
use std::str::FromStr;
3+
use std::sync::Arc;
34
use std::time::Duration;
45

56
use futures_core::future::BoxFuture;
@@ -8,6 +9,7 @@ use once_cell::sync::OnceCell;
89
use sqlx_core::connection::Connection;
910
use sqlx_core::query_builder::QueryBuilder;
1011
use sqlx_core::query_scalar::query_scalar;
12+
use sqlx_core::sql_str::AssertSqlSafe;
1113
use std::fmt::Write;
1214

1315
use crate::error::Error;
@@ -55,15 +57,16 @@ impl TestSupport for MySql {
5557

5658
let mut deleted_db_names = Vec::with_capacity(delete_db_names.len());
5759

58-
let mut command = String::new();
60+
let mut command_arced = Arc::new(String::new());
5961

6062
for db_name in &delete_db_names {
63+
let command = Arc::get_mut(&mut command_arced).unwrap();
6164
command.clear();
6265

6366
let db_name = format!("_sqlx_test_database_{db_name}");
6467

6568
writeln!(command, "drop database if exists {db_name:?};").ok();
66-
match conn.execute(&*command).await {
69+
match conn.execute(AssertSqlSafe(command_arced.clone())).await {
6770
Ok(_deleted) => {
6871
deleted_db_names.push(db_name);
6972
}
@@ -162,7 +165,7 @@ async fn test_context(args: &TestArgs) -> Result<TestContext<MySql>, Error> {
162165
.execute(&mut *conn)
163166
.await?;
164167

165-
conn.execute(&format!("create database {db_name:?}")[..])
168+
conn.execute(AssertSqlSafe(format!("create database {db_name:?}")))
166169
.await?;
167170

168171
eprintln!("created database {db_name}");
@@ -187,7 +190,7 @@ async fn test_context(args: &TestArgs) -> Result<TestContext<MySql>, Error> {
187190

188191
async fn do_cleanup(conn: &mut MySqlConnection, db_name: &str) -> Result<(), Error> {
189192
let delete_db_command = format!("drop database if exists {db_name:?};");
190-
conn.execute(&*delete_db_command).await?;
193+
conn.execute(AssertSqlSafe(delete_db_command)).await?;
191194
query("delete from _sqlx_test.databases where db_name = $1::text")
192195
.bind(db_name)
193196
.execute(&mut *conn)

sqlx-mysql/src/transaction.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ impl TransactionManager for MySqlTransactionManager {
1818
Box::pin(async move {
1919
let depth = conn.inner.transaction_depth;
2020

21-
conn.execute(&*begin_ansi_transaction_sql(depth)).await?;
21+
conn.execute(begin_ansi_transaction_sql(depth)).await?;
2222
conn.inner.transaction_depth = depth + 1;
2323

2424
Ok(())
@@ -30,7 +30,7 @@ impl TransactionManager for MySqlTransactionManager {
3030
let depth = conn.inner.transaction_depth;
3131

3232
if depth > 0 {
33-
conn.execute(&*commit_ansi_transaction_sql(depth)).await?;
33+
conn.execute(commit_ansi_transaction_sql(depth)).await?;
3434
conn.inner.transaction_depth = depth - 1;
3535
}
3636

@@ -43,7 +43,7 @@ impl TransactionManager for MySqlTransactionManager {
4343
let depth = conn.inner.transaction_depth;
4444

4545
if depth > 0 {
46-
conn.execute(&*rollback_ansi_transaction_sql(depth)).await?;
46+
conn.execute(rollback_ansi_transaction_sql(depth)).await?;
4747
conn.inner.transaction_depth = depth - 1;
4848
}
4949

@@ -59,7 +59,7 @@ impl TransactionManager for MySqlTransactionManager {
5959
conn.inner.stream.sequence_id = 0;
6060
conn.inner
6161
.stream
62-
.write_packet(Query(&rollback_ansi_transaction_sql(depth)))
62+
.write_packet(Query(rollback_ansi_transaction_sql(depth).as_str()))
6363
.expect("BUG: unexpected error queueing ROLLBACK");
6464

6565
conn.inner.transaction_depth = depth - 1;

0 commit comments

Comments
 (0)