Skip to content

Commit b81a44d

Browse files
authored
fix(sqlite): regression when decoding nulls (#3991)
1 parent a301d9a commit b81a44d

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

sqlx-sqlite/src/value.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -278,10 +278,14 @@ impl ValueHandle {
278278
unsafe { Self::try_dup_of(self.value.as_ptr(), self.column_type.clone()) }
279279
}
280280

281-
fn type_info(&self) -> SqliteTypeInfo {
282-
let value_type = SqliteTypeInfo(DataType::from_code(unsafe {
281+
fn value_type_info(&self) -> SqliteTypeInfo {
282+
SqliteTypeInfo(DataType::from_code(unsafe {
283283
sqlite3_value_type(self.value.as_ptr())
284-
}));
284+
}))
285+
}
286+
287+
fn type_info(&self) -> SqliteTypeInfo {
288+
let value_type = self.value_type_info();
285289

286290
// Assume the actual value type is more accurate, if it's not NULL.
287291
match &self.column_type {
@@ -305,7 +309,7 @@ impl ValueHandle {
305309
}
306310

307311
fn is_null(&self) -> bool {
308-
self.type_info().is_null()
312+
self.value_type_info().is_null()
309313
}
310314
}
311315

tests/sqlite/sqlite.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,3 +1416,25 @@ enum SqliteTransactionState {
14161416
Read,
14171417
Write,
14181418
}
1419+
1420+
#[sqlx_macros::test]
1421+
async fn issue_3982() -> anyhow::Result<()> {
1422+
let mut conn = new::<Sqlite>().await?;
1423+
1424+
let r = sqlx::raw_sql("insert into products(product_no) values(1)")
1425+
.execute(&mut conn)
1426+
.await?;
1427+
assert_eq!(r.rows_affected(), 1);
1428+
1429+
let (name,) = sqlx::query_as::<_, (Option<String>,)>(
1430+
r#"
1431+
select name from products where name IS NULL
1432+
"#,
1433+
)
1434+
.fetch_one(&mut conn)
1435+
.await?;
1436+
1437+
assert_eq!(name, None,);
1438+
1439+
Ok(())
1440+
}

tests/sqlite/types.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ test_type!(str<String>(Sqlite,
3434
"''" == ""
3535
));
3636

37+
test_type!(null_str<Option<String>>(Sqlite,
38+
"NULL" == None::<String>
39+
));
40+
3741
test_type!(bytes<Vec<u8>>(Sqlite,
3842
"X'DEADBEEF'"
3943
== vec![0xDE_u8, 0xAD, 0xBE, 0xEF],

0 commit comments

Comments
 (0)