diff --git a/core/translate/insert.rs b/core/translate/insert.rs index 3f99e40c0..48dedf80d 100644 --- a/core/translate/insert.rs +++ b/core/translate/insert.rs @@ -99,6 +99,15 @@ pub fn translate_insert( }) .collect::>(); let root_page = btree_table.root_page; + + let inserting_multiple_rows = match body { + InsertBody::Select(select, _) => match select.body.select.as_ref() { + OneSelect::Values(values) => values.len() > 1, + OneSelect::Select(..) => true, + }, + InsertBody::DefaultValues => false, + }; + let values = match body { InsertBody::Select(ref mut select, _) => match select.body.select.as_mut() { OneSelect::Values(ref mut values) => values, @@ -141,8 +150,6 @@ pub fn translate_insert( let halt_label = program.allocate_label(); let loop_start_label = program.allocate_label(); - let inserting_multiple_rows = values.len() > 1; - // Multiple rows - use coroutine for value population if inserting_multiple_rows { let yield_reg = program.alloc_register(); diff --git a/core/translate/mod.rs b/core/translate/mod.rs index 83134c71b..e0070305c 100644 --- a/core/translate/mod.rs +++ b/core/translate/mod.rs @@ -232,7 +232,9 @@ pub fn translate_inner( ast::Stmt::Release(_) => bail_parse_error!("RELEASE not supported yet"), ast::Stmt::Rollback { .. } => bail_parse_error!("ROLLBACK not supported yet"), ast::Stmt::Savepoint(_) => bail_parse_error!("SAVEPOINT not supported yet"), - ast::Stmt::Select(select) => translate_select(query_mode, schema, *select, syms, program)?, + ast::Stmt::Select(select) => { + translate_select(query_mode, schema, *select, syms, program)?.program + } ast::Stmt::Update(mut update) => translate_update( query_mode, schema, diff --git a/core/translate/select.rs b/core/translate/select.rs index 3420d65d8..31f42bf8d 100644 --- a/core/translate/select.rs +++ b/core/translate/select.rs @@ -19,13 +19,18 @@ use crate::{schema::Schema, vdbe::builder::ProgramBuilder, Result}; use limbo_sqlite3_parser::ast::{self, CompoundSelect, SortOrder}; use limbo_sqlite3_parser::ast::{ResultColumn, SelectInner}; +pub struct TranslateSelectResult { + pub program: ProgramBuilder, + pub num_result_cols: usize, +} + pub fn translate_select( query_mode: QueryMode, schema: &Schema, select: ast::Select, syms: &SymbolTable, mut program: ProgramBuilder, -) -> Result { +) -> Result { let mut select_plan = prepare_select_plan( schema, select, @@ -63,8 +68,12 @@ pub fn translate_select( }; program.extend(&opts); + let num_result_cols = select.result_columns.len(); emit_program(&mut program, select_plan, syms)?; - Ok(program) + Ok(TranslateSelectResult { + program, + num_result_cols, + }) } pub fn prepare_select_plan<'a>(