From 5a6acd67312601e4dba32896600044950e20f99f Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Fri, 22 Sep 2023 17:31:15 +0100 Subject: [PATCH] Fix loader panic on empty --- src/executor/cursor.rs | 1 - src/query/loader.rs | 31 +++++++++++++++++-------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/executor/cursor.rs b/src/executor/cursor.rs index 494957fa..50f282ef 100644 --- a/src/executor/cursor.rs +++ b/src/executor/cursor.rs @@ -382,7 +382,6 @@ where #[cfg(test)] #[cfg(feature = "mock")] mod tests { - use super::*; use crate::entity::prelude::*; use crate::tests_cfg::*; use crate::{DbBackend, MockDatabase, Statement, Transaction}; diff --git a/src/query/loader.rs b/src/query/loader.rs index 2f3693a3..c615b4e4 100644 --- a/src/query/loader.rs +++ b/src/query/loader.rs @@ -143,6 +143,10 @@ where return Err(query_err("Relation is HasMany instead of HasOne")); } + if self.is_empty() { + return Ok(Vec::new()); + } + let keys: Vec = self .iter() .map(|model: &M| extract_key(&rel_def.from_col, model)) @@ -194,6 +198,10 @@ where return Err(query_err("Relation is HasOne instead of HasMany")); } + if self.is_empty() { + return Ok(Vec::new()); + } + let keys: Vec = self .iter() .map(|model: &M| extract_key(&rel_def.from_col, model)) @@ -269,6 +277,10 @@ where ))); } + if self.is_empty() { + return Ok(Vec::new()); + } + let pkeys: Vec = self .iter() .map(|model: &M| extract_key(&via_rel.from_col, model)) @@ -587,14 +599,11 @@ mod tests { ); } - // FIXME: load many with empty vector will panic - // #[tokio::test] + #[tokio::test] async fn test_load_many_empty() { use sea_orm::{entity::prelude::*, tests_cfg::*, DbBackend, MockDatabase}; - let db = MockDatabase::new(DbBackend::Postgres) - .append_query_results([[fruit_model(1, Some(1)), fruit_model(2, Some(1))]]) - .into_connection(); + let db = MockDatabase::new(DbBackend::Postgres).into_connection(); let cakes: Vec = vec![]; @@ -610,9 +619,7 @@ mod tests { #[tokio::test] async fn test_load_many_to_many_base() { - use sea_orm::{ - entity::prelude::*, tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase, - }; + use sea_orm::{tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase}; let db = MockDatabase::new(DbBackend::Postgres) .append_query_results([ @@ -633,9 +640,7 @@ mod tests { #[tokio::test] async fn test_load_many_to_many_complex() { - use sea_orm::{ - entity::prelude::*, tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase, - }; + use sea_orm::{tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase}; let db = MockDatabase::new(DbBackend::Postgres) .append_query_results([ @@ -675,9 +680,7 @@ mod tests { #[tokio::test] async fn test_load_many_to_many_empty() { - use sea_orm::{ - entity::prelude::*, tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase, - }; + use sea_orm::{tests_cfg::*, DbBackend, IntoMockRow, LoaderTrait, MockDatabase}; let db = MockDatabase::new(DbBackend::Postgres) .append_query_results([