Skip to main content

tank_tests/
other.rs

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    // Setup
20    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    // SELECT NULL
36    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}