()
| 302 | |
| 303 | #[tokio::test(flavor = "multi_thread", worker_threads = 2)] |
| 304 | async fn test_query_only() -> Result<()> { |
| 305 | let t = TestContext::new().await; |
| 306 | |
| 307 | // `query_row` does not acquire write lock |
| 308 | // and operates on read-only connection. |
| 309 | // Using it to `INSERT` should fail. |
| 310 | let res = t |
| 311 | .sql |
| 312 | .query_row( |
| 313 | "INSERT INTO config (keyname, value) VALUES (?, ?) RETURNING 1", |
| 314 | ("xyz", "ijk"), |
| 315 | |row| { |
| 316 | let res: u32 = row.get(0)?; |
| 317 | Ok(res) |
| 318 | }, |
| 319 | ) |
| 320 | .await; |
| 321 | assert!(res.is_err()); |
| 322 | |
| 323 | // If you want to `INSERT` and get value via `RETURNING`, |
| 324 | // use `call_write` or `transaction`. |
| 325 | |
| 326 | let res: Result<u32> = t |
| 327 | .sql |
| 328 | .call_write(|conn| { |
| 329 | let val = conn.query_row( |
| 330 | "INSERT INTO config (keyname, value) VALUES (?, ?) RETURNING 2", |
| 331 | ("foo", "bar"), |
| 332 | |row| { |
| 333 | let res: u32 = row.get(0)?; |
| 334 | Ok(res) |
| 335 | }, |
| 336 | )?; |
| 337 | Ok(val) |
| 338 | }) |
| 339 | .await; |
| 340 | assert_eq!(res.unwrap(), 2); |
| 341 | |
| 342 | let res = t |
| 343 | .sql |
| 344 | .transaction(|t| { |
| 345 | let val = t.query_row( |
| 346 | "INSERT INTO config (keyname, value) VALUES (?, ?) RETURNING 3", |
| 347 | ("abc", "def"), |
| 348 | |row| { |
| 349 | let res: u32 = row.get(0)?; |
| 350 | Ok(res) |
| 351 | }, |
| 352 | )?; |
| 353 | Ok(val) |
| 354 | }) |
| 355 | .await; |
| 356 | assert_eq!(res.unwrap(), 3); |
| 357 | |
| 358 | Ok(()) |
| 359 | } |
| 360 | |
| 361 | /// Tests that incremental_vacuum does not fail. |
nothing calls this directly
no test coverage detected