1use std::{pin::pin, sync::LazyLock};
2use tank::{
3 Entity, Executor, QueryBuilder, cols,
4 stream::{StreamExt, TryStreamExt},
5};
6use tokio::sync::Mutex;
7
8static MUTEX: LazyLock<Mutex<()>> = LazyLock::new(|| Mutex::new(()));
9
10#[derive(Entity, PartialEq, Debug)]
11pub struct ATable {
12 #[tank(primary_key)]
13 a_column: String,
14}
15
16pub async fn other(executor: &mut impl Executor) {
17 let _lock = MUTEX.lock().await;
18
19 ATable::drop_table(executor, true, false)
21 .await
22 .expect("Failed to drop ATable table");
23 ATable::create_table(executor, true, true)
24 .await
25 .expect("Failed to create ATable table");
26 ATable::insert_one(
27 executor,
28 &ATable {
29 a_column: "".into(),
30 },
31 )
32 .await
33 .expect("Could not save a row");
34
35 let stream = executor
37 .fetch(
38 QueryBuilder::new()
39 .select(cols!(NULL))
40 .from(ATable::table())
41 .where_expr(true)
42 .build(&executor.driver()),
43 )
44 .map_ok(|v| v.values.into_iter().nth(0).unwrap());
45 let value = pin!(stream)
46 .next()
47 .await
48 .expect("No result returned from the stream")
49 .expect("Could not query for NULL");
50 assert!(value.is_null());
51}