From 78b3d05f4126dfa1165445c03804f52cf9117bc6 Mon Sep 17 00:00:00 2001 From: everpcpc Date: Wed, 31 Jul 2024 17:00:40 +0800 Subject: [PATCH] fix(driver): add test for format_null_as_str (#466) --- cli/src/display.rs | 27 ++++++-------- cli/test.sh | 2 +- driver/tests/driver/select_simple.rs | 55 +++++++++++++++++++++++++--- sql/src/value.rs | 17 ++++++--- tests/Makefile | 2 +- 5 files changed, 74 insertions(+), 29 deletions(-) diff --git a/cli/src/display.rs b/cli/src/display.rs index 3dea3f479..74a31cd06 100644 --- a/cli/src/display.rs +++ b/cli/src/display.rs @@ -152,21 +152,18 @@ impl<'a> FormatDisplay<'a> { ); } ExpandMode::Auto => { - if rows.len() > 1 { - println!( - "{}", - create_table( - schema, - &rows, - self.replace_newline, - self.settings.max_display_rows, - self.settings.max_width, - self.settings.max_col_width - )? - ); - } else { - print_expanded(schema, &rows)?; - } + // FIXME: depends on terminal size + println!( + "{}", + create_table( + schema, + &rows, + self.replace_newline, + self.settings.max_display_rows, + self.settings.max_width, + self.settings.max_col_width + )? + ); } } diff --git a/cli/test.sh b/cli/test.sh index d26f7ba42..f4e4e3f10 100755 --- a/cli/test.sh +++ b/cli/test.sh @@ -32,7 +32,7 @@ case $TEST_HANDLER in ;; "http") echo "==> Testing REST API handler" - export BENDSQL_DSN="databend+http://${DATABEND_USER}:${DATABEND_PASSWORD}@${DATABEND_HOST}:8000/?sslmode=disable&presign=on&format_null_as_str=0" + export BENDSQL_DSN="databend+http://${DATABEND_USER}:${DATABEND_PASSWORD}@${DATABEND_HOST}:8000/?sslmode=disable&presign=on" ;; *) echo "Usage: $0 [flight|http]" diff --git a/driver/tests/driver/select_simple.rs b/driver/tests/driver/select_simple.rs index 7792e2d6f..36e67d657 100644 --- a/driver/tests/driver/select_simple.rs +++ b/driver/tests/driver/select_simple.rs @@ -28,12 +28,55 @@ async fn prepare() -> Box { #[tokio::test] async fn select_null() { - let conn = prepare().await; - let row = conn.query_row("select null").await.unwrap(); - assert!(row.is_some()); - let row = row.unwrap(); - let (val,): (Option,) = row.try_into().unwrap(); - assert_eq!(val, None); + { + let conn = prepare().await; + conn.exec("DROP TABLE IF EXISTS select_null").await.unwrap(); + conn.exec( + "CREATE TABLE `select_null` ( + a String, + b UInt64, + c String + );", + ) + .await + .unwrap(); + conn.exec("INSERT INTO `select_null` (a) VALUES ('NULL')") + .await + .unwrap(); + } + { + let dsn = option_env!("TEST_DATABEND_DSN").unwrap_or(DEFAULT_DSN); + // ignore null to str test for flightsql + if !dsn.starts_with("databend+flight://") { + let client = Client::new(format!("{dsn}&format_null_as_str=1")); + let conn = client.get_conn().await.unwrap(); + let row = conn.query_row("select * from select_null").await.unwrap(); + assert!(row.is_some()); + let row = row.unwrap(); + let (val1, val2, val3): (Option, Option, Option) = + row.try_into().unwrap(); + assert_eq!(val1, Some("NULL".to_string())); + assert_eq!(val2, None); + assert_eq!(val3, Some("NULL".to_string())); + } + } + { + let dsn = option_env!("TEST_DATABEND_DSN").unwrap_or(DEFAULT_DSN); + let client = Client::new(format!("{dsn}&format_null_as_str=0")); + let conn = client.get_conn().await.unwrap(); + let row = conn.query_row("select * from select_null").await.unwrap(); + assert!(row.is_some()); + let row = row.unwrap(); + let (val1, val2, val3): (Option, Option, Option) = + row.try_into().unwrap(); + assert_eq!(val1, Some("NULL".to_string())); + assert_eq!(val2, None); + assert_eq!(val3, None); + } + { + let conn = prepare().await; + conn.exec("DROP TABLE IF EXISTS select_null").await.unwrap(); + } } #[tokio::test] diff --git a/sql/src/value.rs b/sql/src/value.rs index 9fac7904f..3c7596a6a 100644 --- a/sql/src/value.rs +++ b/sql/src/value.rs @@ -230,13 +230,18 @@ impl TryFrom<(&DataType, &str)> for Value { let decoder = ValueDecoder {}; decoder.read_field(t, &mut reader) } - DataType::Nullable(inner) => { - if v == NULL_VALUE { - Ok(Self::Null) - } else { - Self::try_from((inner.as_ref(), v)) + DataType::Nullable(inner) => match inner.as_ref() { + DataType::String => Ok(Self::String(v.to_string())), + _ => { + // not string type, try to check if it is NULL + // for compatible with old version server + if v == NULL_VALUE { + Ok(Self::Null) + } else { + Self::try_from((inner.as_ref(), v)) + } } - } + }, } } } diff --git a/tests/Makefile b/tests/Makefile index 1b98703cf..3b061853a 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -15,7 +15,7 @@ test-core: up test-driver: up cargo test --test driver - TEST_DATABEND_DSN=databend+flight://root:@localhost:8900/default?sslmode=disable&format_null_as_str=0 cargo test --features flight-sql --test driver + TEST_DATABEND_DSN=databend+flight://root:@localhost:8900/default?sslmode=disable cargo test --features flight-sql --test driver test-bendsql: up cd .. && ./cli/test.sh http