You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by wa...@apache.org on 2025/07/12 17:17:01 UTC
(datafusion) branch main updated: ensure MemTable has at least one partition (#16754)
This is an automated email from the ASF dual-hosted git repository.
wayne pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new c01c71fcff ensure MemTable has at least one partition (#16754)
c01c71fcff is described below
commit c01c71fcff838fdfedd9c9e674618e264ffb41d9
Author: Ruihang Xia <wa...@gmail.com>
AuthorDate: Sat Jul 12 10:16:57 2025 -0700
ensure MemTable has at least one partition (#16754)
Co-authored-by: Yongting You <20...@gmail.com>
---
datafusion-examples/examples/sql_analysis.rs | 5 ++++-
datafusion/catalog/src/memory/table.rs | 10 +++++++++-
datafusion/core/src/datasource/memory_test.rs | 2 +-
datafusion/core/tests/dataframe/mod.rs | 2 +-
docs/source/library-user-guide/building-logical-plans.md | 2 +-
5 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/datafusion-examples/examples/sql_analysis.rs b/datafusion-examples/examples/sql_analysis.rs
index d3826026a9..4ff669faf1 100644
--- a/datafusion-examples/examples/sql_analysis.rs
+++ b/datafusion-examples/examples/sql_analysis.rs
@@ -274,7 +274,10 @@ from
for table in tables {
ctx.register_table(
table.name,
- Arc::new(MemTable::try_new(Arc::new(table.schema.clone()), vec![])?),
+ Arc::new(MemTable::try_new(
+ Arc::new(table.schema.clone()),
+ vec![vec![]],
+ )?),
)?;
}
// We can create a LogicalPlan from a SQL query like this
diff --git a/datafusion/catalog/src/memory/table.rs b/datafusion/catalog/src/memory/table.rs
index e996e1974d..63b626fb6c 100644
--- a/datafusion/catalog/src/memory/table.rs
+++ b/datafusion/catalog/src/memory/table.rs
@@ -67,8 +67,16 @@ pub struct MemTable {
}
impl MemTable {
- /// Create a new in-memory table from the provided schema and record batches
+ /// Create a new in-memory table from the provided schema and record batches.
+ ///
+ /// Requires at least one partition. To construct an empty `MemTable`, pass
+ /// `vec![vec![]]` as the `partitions` argument, this represents one partition with
+ /// no batches.
pub fn try_new(schema: SchemaRef, partitions: Vec<Vec<RecordBatch>>) -> Result<Self> {
+ if partitions.is_empty() {
+ return plan_err!("No partitions provided, expected at least one partition");
+ }
+
for batches in partitions.iter().flatten() {
let batches_schema = batches.schema();
if !schema.contains(&batches_schema) {
diff --git a/datafusion/core/src/datasource/memory_test.rs b/datafusion/core/src/datasource/memory_test.rs
index 2760f94f4f..c16837c73b 100644
--- a/datafusion/core/src/datasource/memory_test.rs
+++ b/datafusion/core/src/datasource/memory_test.rs
@@ -446,7 +446,7 @@ mod tests {
.unwrap_err();
// Ensure that there is a descriptive error message
assert_eq!(
- "Error during planning: Cannot insert into MemTable with zero partitions",
+ "Error during planning: No partitions provided, expected at least one partition",
experiment_result.strip_backtrace()
);
Ok(())
diff --git a/datafusion/core/tests/dataframe/mod.rs b/datafusion/core/tests/dataframe/mod.rs
index c0a78cb9e2..c55f5c8b49 100644
--- a/datafusion/core/tests/dataframe/mod.rs
+++ b/datafusion/core/tests/dataframe/mod.rs
@@ -4851,7 +4851,7 @@ async fn use_var_provider() -> Result<()> {
Field::new("bar", DataType::Int64, false),
]));
- let mem_table = Arc::new(MemTable::try_new(schema, vec![])?);
+ let mem_table = Arc::new(MemTable::try_new(schema, vec![vec![]])?);
let config = SessionConfig::new()
.with_target_partitions(4)
diff --git a/docs/source/library-user-guide/building-logical-plans.md b/docs/source/library-user-guide/building-logical-plans.md
index e1e75b3e4b..ad53857bc1 100644
--- a/docs/source/library-user-guide/building-logical-plans.md
+++ b/docs/source/library-user-guide/building-logical-plans.md
@@ -181,7 +181,7 @@ async fn main() -> Result<(), DataFusionError> {
// TableProvider. For this example, we don't provide any data
// but in production code, this would have `RecordBatch`es with
// in memory data
- let table_provider = Arc::new(MemTable::try_new(Arc::new(schema), vec![])?);
+ let table_provider = Arc::new(MemTable::try_new(Arc::new(schema), vec![vec![]])?);
// Use the provider_as_source function to convert the TableProvider to a table source
let table_source = provider_as_source(table_provider);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org