You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by gi...@apache.org on 2026/08/11 21:29:41 UTC

(datafusion) 01/01: fix(physical-plan): CTAS panic on wasm32-unknown-unknown (#24275)

This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/main/pr-24275-30ca39bef9ea2e746e143727f9de48b1608edc2a
in repository https://gitbox.apache.org/repos/asf/datafusion.git

commit 7e015b74af0928187a77cdf9df23b587e349ebf9
Author: Kent Wu <ke...@gmail.com>
AuthorDate: Tue Aug 11 17:29:17 2026 -0400

    fix(physical-plan): CTAS panic on wasm32-unknown-unknown (#24275)
    
    ## Which issue does this PR close?
    
    - Closes #24274
    
    ## Rationale for this change
    
    `CREATE TABLE ... AS SELECT` and `MemTable::load` panic on
    `wasm32-unknown-unknown` in browser hosts using `wasm-bindgen-futures`.
    Both route through `collect_partitioned`, which unconditionally calls
    `JoinSet::spawn` which needs an active tokio reactor.
    `wasm32-unknown-unknown` builds typically don't have one.
    
    ## What changes are included in this PR?
    
    - Adds a single-partition fast path to `collect_partitioned` that drains
    the stream directly instead of using `JoinSet::spawn`
    - Adds a `test_create_table_as_select` regression test to
    `datafusion/wasmtest`, exercising the CTAS path both natively (via
    `tokio::test`) and in the browser (via `wasm-pack test`).
    
    Behavior for `partition_count != 1` is unchanged.
    
    ## Are these changes tested?
    
    Yes
    
    - Adds a CTAS query-level regression test to the `linux-wasm-pack` CI
    job.
    - Ran wasm-pack test suite on chrome:
    - `RUSTFLAGS='--cfg getrandom_backend="wasm_js"' wasm-pack test
    --headless --chrome datafusion/wasmtest`
    - `cargo fmt --all`
    - `cargo clippy --all-targets --all-features -- -D warnings`
    - Full workspace extended-tests suite
    
    ## Are there any user-facing changes?
    
    No API changes. On `wasm32-unknown-unknown`, `CREATE TABLE ... AS
    SELECT` and `MemTable::load` no longer panic.
---
 datafusion/physical-plan/src/execution_plan.rs |  7 +++++++
 datafusion/wasmtest/src/lib.rs                 | 28 ++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/datafusion/physical-plan/src/execution_plan.rs b/datafusion/physical-plan/src/execution_plan.rs
index b1d7c32882..ff803746aa 100644
--- a/datafusion/physical-plan/src/execution_plan.rs
+++ b/datafusion/physical-plan/src/execution_plan.rs
@@ -1655,6 +1655,13 @@ pub async fn collect_partitioned(
     plan: Arc<dyn ExecutionPlan>,
     context: Arc<TaskContext>,
 ) -> Result<Vec<Vec<RecordBatch>>> {
+    // Avoid `JoinSet::spawn` for single partition
+    if plan.output_partitioning().partition_count() == 1 {
+        let stream = plan.execute(0, context)?;
+        let batches: Vec<RecordBatch> = stream.try_collect().await?;
+        return Ok(vec![batches]);
+    }
+
     let streams = execute_stream_partitioned(plan, context)?;
 
     let mut join_set = JoinSet::new();
diff --git a/datafusion/wasmtest/src/lib.rs b/datafusion/wasmtest/src/lib.rs
index f545ccf193..d8da5d4b4f 100644
--- a/datafusion/wasmtest/src/lib.rs
+++ b/datafusion/wasmtest/src/lib.rs
@@ -206,6 +206,34 @@ mod test {
         let _ = collect(physical_plan, task_ctx).await.unwrap();
     }
 
+    #[wasm_bindgen_test(unsupported = tokio::test)]
+    async fn test_create_table_as_select() {
+        let ctx = get_ctx();
+        ctx.sql("CREATE TABLE t AS SELECT 1 AS a, 'x' AS b")
+            .await
+            .unwrap()
+            .collect()
+            .await
+            .unwrap();
+
+        let result = ctx
+            .sql("SELECT * FROM t")
+            .await
+            .unwrap()
+            .collect()
+            .await
+            .unwrap();
+
+        assert_eq!(
+            batches_to_string(&result),
+            "+---+---+\n\
+             | a | b |\n\
+             +---+---+\n\
+             | 1 | x |\n\
+             +---+---+"
+        );
+    }
+
     #[wasm_bindgen_test(unsupported = tokio::test)]
     async fn test_parquet_write() {
         let (schema, batch) = create_test_data();


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org