Skip to content

Commit 55a5d67

Browse files
committed
try send null type
1 parent f6330cc commit 55a5d67

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

ydb/src/client_table_test_integration.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::transaction::Mode;
77
use crate::transaction::Mode::SerializableReadWrite;
88
use crate::transaction::Transaction;
99
use crate::types::{Value, ValueList, ValueStruct};
10+
use crate::ydb_params;
1011
use async_once::AsyncOnce;
1112
use lazy_static::lazy_static;
1213
use std::collections::HashMap;
@@ -335,6 +336,40 @@ SELECT $test AS test;
335336
return Ok(());
336337
}
337338

339+
#[tokio::test]
340+
#[traced_test]
341+
// #[ignore]
342+
async fn send_null_value_as_nullable_param() -> YdbResult<()> {
343+
let client = create_client().await?;
344+
let table_client = client.table_client();
345+
let res: Option<i32> = table_client
346+
.retry_transaction(|tx| async {
347+
let mut tx = tx;
348+
let param = Value::Null;
349+
350+
let res = tx
351+
.query(
352+
Query::from(
353+
"
354+
DECLARE $res AS Int32?;
355+
356+
SELECT $res AS res;
357+
",
358+
)
359+
.with_params(ydb_params!("$res" => param)),
360+
)
361+
.await?;
362+
let mut row = res.into_only_row()?;
363+
return Ok(row.remove_field_by_name("res")?);
364+
})
365+
.await?
366+
.try_into()?;
367+
368+
assert_eq!(None, res);
369+
370+
return Ok(());
371+
}
372+
338373
#[tokio::test]
339374
#[traced_test]
340375
#[ignore] // need YDB access

ydb/src/session.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ impl Session {
122122
debug!("request: {}", serde_json::to_string(&req)?);
123123

124124
let mut channel = self.get_channel().await?;
125+
// trace!("execute data query: '{:?}'", req);
125126
let response = channel.execute_data_query(req).await?;
126127
let operation_result: ExecuteQueryResult = self.handle_operation_result(response)?;
127128

ydb/src/types.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ const SECONDS_PER_DAY: u64 = 60 * 60 * 24;
5959
#[non_exhaustive]
6060
pub enum Value {
6161
Void,
62+
Null,
6263
Bool(bool),
6364
Int8(i8),
6465
Uint8(u8),
@@ -280,6 +281,7 @@ impl Value {
280281
_ => unimplemented!("{:?} ({})", P::from_i32(*t_id), *t_id),
281282
},
282283
T::VoidType(_) => Value::Void,
284+
T::NullType(_) => Value::Null,
283285
T::OptionalType(val) => {
284286
let t = if let Some(item) = &val.item {
285287
Some(*item.clone())
@@ -319,6 +321,7 @@ impl Value {
319321
pub(crate) fn from_proto(t: &Value, proto_value: ydb_proto::Value) -> YdbResult<Self> {
320322
let res = match (t, proto_value) {
321323
(Value::Void, _) => Value::Void,
324+
(Value::Null, _) => Value::Null,
322325
(
323326
t,
324327
ydb_proto::Value {
@@ -461,6 +464,21 @@ impl Value {
461464
..ydb_proto::Value::default()
462465
}),
463466
},
467+
Self::Null => ydb_proto::TypedValue {
468+
r#type: Some(ydb_proto::Type {
469+
r#type: Some(ydb_proto::r#type::Type::NullType(
470+
prost_types::NullValue::NullValue.into(),
471+
)),
472+
..ydb_proto::Type::default()
473+
}),
474+
value: Some(ydb_proto::Value {
475+
value: Some(ydb_proto::value::Value::NullFlagValue(
476+
prost_types::NullValue::NullValue.into(),
477+
)),
478+
..ydb_proto::Value::default()
479+
}),
480+
..ydb_proto::TypedValue::default()
481+
},
464482
Self::Bool(val) => proto_typed_value(pt::Bool, pv::BoolValue(val)),
465483
Self::Int8(val) => proto_typed_value(pt::Int8, pv::Int32Value(val.into())),
466484
Self::Uint8(val) => proto_typed_value(pt::Uint8, pv::Uint32Value(val.into())),
@@ -627,6 +645,7 @@ mod test {
627645
num_tests!(values, Value::Double, f64);
628646

629647
values.push(Value::Void);
648+
values.push(Value::Null);
630649

631650
values.push(Value::Date(std::time::Duration::from_secs(1633996800))); //Tue Oct 12 00:00:00 UTC 2021
632651
values.push(Value::DateTime(std::time::Duration::from_secs(1634000523))); //Tue Oct 12 01:02:03 UTC 2021

0 commit comments

Comments
 (0)