mirror of
https://github.com/launchbadge/sqlx.git
synced 2025-10-03 15:55:45 +00:00
Postgres: don't cache failed statement
This commit is contained in:
parent
3103d50be8
commit
e594a7fdca
@ -56,8 +56,6 @@ impl PgConnection {
|
|||||||
query,
|
query,
|
||||||
});
|
});
|
||||||
|
|
||||||
self.cache_statement_id.insert(query.into(), id);
|
|
||||||
|
|
||||||
Ok(id)
|
Ok(id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -163,6 +161,24 @@ impl PgConnection {
|
|||||||
self.stream.flush().await?;
|
self.stream.flush().await?;
|
||||||
self.is_ready = false;
|
self.is_ready = false;
|
||||||
|
|
||||||
|
// only cache
|
||||||
|
if let Some(statement) = statement {
|
||||||
|
// prefer redundant lookup to copying the query string
|
||||||
|
if !self.cache_statement_id.contains_key(query) {
|
||||||
|
// wait for `ParseComplete` on the stream or the
|
||||||
|
// error before we cache the statement
|
||||||
|
match self.stream.read().await? {
|
||||||
|
Message::ParseComplete => {
|
||||||
|
self.cache_statement_id.insert(query.into(), statement);
|
||||||
|
}
|
||||||
|
|
||||||
|
message => {
|
||||||
|
return Err(protocol_err!("run: unexpected message: {:?}", message).into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(statement)
|
Ok(statement)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,7 +230,6 @@ impl PgConnection {
|
|||||||
|
|
||||||
let result_fields = result.map_or_else(Default::default, |r| r.fields);
|
let result_fields = result.map_or_else(Default::default, |r| r.fields);
|
||||||
|
|
||||||
// TODO: cache this result
|
|
||||||
let type_names = self
|
let type_names = self
|
||||||
.get_type_names(
|
.get_type_names(
|
||||||
params
|
params
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use futures::TryStreamExt;
|
use futures::TryStreamExt;
|
||||||
use sqlx::postgres::{PgPool, PgQueryAs, PgRow};
|
use sqlx::postgres::{PgPool, PgQueryAs, PgRow};
|
||||||
use sqlx::{Connection, Executor, Postgres, Row};
|
use sqlx::{Connection, Cursor, Executor, Postgres, Row};
|
||||||
use sqlx_test::new;
|
use sqlx_test::new;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
@ -306,6 +306,23 @@ async fn pool_smoke_test() -> anyhow::Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "runtime-async-std", async_std::test)]
|
||||||
|
#[cfg_attr(feature = "runtime-tokio", tokio::test)]
|
||||||
|
async fn test_invalid_query() -> anyhow::Result<()> {
|
||||||
|
let mut conn = new::<Postgres>().await?;
|
||||||
|
|
||||||
|
conn.execute("definitely not a correct query")
|
||||||
|
.await
|
||||||
|
.unwrap_err();
|
||||||
|
|
||||||
|
let mut cursor = conn.fetch("select 1");
|
||||||
|
let row = cursor.next().await?.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(row.get::<i32, _>(0), 1i32);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature = "runtime-async-std", async_std::test)]
|
#[cfg_attr(feature = "runtime-async-std", async_std::test)]
|
||||||
#[cfg_attr(feature = "runtime-tokio", tokio::test)]
|
#[cfg_attr(feature = "runtime-tokio", tokio::test)]
|
||||||
async fn test_describe() -> anyhow::Result<()> {
|
async fn test_describe() -> anyhow::Result<()> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user