diff --git a/core/translate/expr.rs b/core/translate/expr.rs index b832288ff..00970c8c1 100644 --- a/core/translate/expr.rs +++ b/core/translate/expr.rs @@ -152,10 +152,10 @@ pub fn translate_expr( }; let regs = program.alloc_register(); translate_expr(program, select, &args[0], regs, cursor_hint)?; - program.emit_insn(Insn::Json { + program.emit_insn(Insn::Function { start_reg: regs, dest: target_register, - func: j, + func: crate::vdbe::Func::Json(j), }); Ok(target_register) } @@ -229,7 +229,7 @@ pub fn translate_expr( program.emit_insn(Insn::Function { start_reg: target_register + 1, dest: target_register, - func: srf, + func: crate::vdbe::Func::Scalar(srf), }); Ok(target_register) } @@ -258,7 +258,7 @@ pub fn translate_expr( program.emit_insn(Insn::Function { start_reg: regs, dest: target_register, - func: srf, + func: crate::vdbe::Func::Scalar(srf), }); Ok(target_register) } @@ -273,7 +273,7 @@ pub fn translate_expr( program.emit_insn(Insn::Function { start_reg: regs, dest: target_register, - func: srf, + func: crate::vdbe::Func::Scalar(srf), }); Ok(target_register) } @@ -297,7 +297,7 @@ pub fn translate_expr( program.emit_insn(Insn::Function { start_reg: start_reg, dest: target_register, - func: ScalarFunc::Date, + func: crate::vdbe::Func::Scalar(srf), }); Ok(target_register) } @@ -354,7 +354,7 @@ pub fn translate_expr( program.emit_insn(Insn::Function { start_reg: target_register + 1, dest: target_register, - func: srf, + func: crate::vdbe::Func::Scalar(srf), }); Ok(target_register) } @@ -381,7 +381,7 @@ pub fn translate_expr( program.emit_insn(Insn::Function { start_reg: target_register + 1, dest: target_register, - func: ScalarFunc::Min, + func: crate::vdbe::Func::Scalar(srf), }); Ok(target_register) } @@ -408,7 +408,7 @@ pub fn translate_expr( program.emit_insn(Insn::Function { start_reg: target_register + 1, dest: target_register, - func: ScalarFunc::Max, + func: crate::vdbe::Func::Scalar(srf), }); Ok(target_register) } diff --git a/core/translate/where_clause.rs b/core/translate/where_clause.rs index d52b44073..6848c8571 100644 --- a/core/translate/where_clause.rs +++ b/core/translate/where_clause.rs @@ -2,7 +2,7 @@ use crate::{ function::ScalarFunc, translate::{expr::translate_expr, select::Select}, util::normalize_ident, - vdbe::{builder::ProgramBuilder, BranchOffset, Insn}, + vdbe::{builder::ProgramBuilder, BranchOffset, Func, Insn}, Result, }; @@ -728,7 +728,7 @@ fn translate_condition_expr( program.mark_last_insn_constant(); let _ = translate_expr(program, Some(select), lhs, column_reg, cursor_hint)?; program.emit_insn(Insn::Function { - func: ScalarFunc::Like, + func: Func::Scalar(ScalarFunc::Like), start_reg: pattern_reg, dest: cur_reg, }); diff --git a/core/vdbe/mod.rs b/core/vdbe/mod.rs index 657caf595..88e890ed9 100644 --- a/core/vdbe/mod.rs +++ b/core/vdbe/mod.rs @@ -30,7 +30,7 @@ use crate::schema::Table; use crate::storage::sqlite3_ondisk::DatabaseHeader; use crate::storage::{btree::BTreeCursor, pager::Pager}; use crate::types::{AggContext, Cursor, CursorResult, OwnedRecord, OwnedValue, Record}; -use crate::{json, Result}; +use crate::Result; use datetime::{exec_date, exec_time}; @@ -46,6 +46,21 @@ pub type CursorID = usize; pub type PageIdx = usize; +#[derive(Debug)] +pub enum Func { + Scalar(ScalarFunc), + Json(JsonFunc), +} + +impl ToString for Func { + fn to_string(&self) -> String { + match self { + Func::Scalar(scalar_func) => scalar_func.to_string(), + Func::Json(json_func) => json_func.to_string(), + } + } +} + #[derive(Debug)] pub enum Insn { // Initialize the program state and jump to the given PC. @@ -287,7 +302,7 @@ pub enum Insn { // constant_mask: i32, // P1, not used for now start_reg: usize, // P2, start of argument registers dest: usize, // P3 - func: ScalarFunc, // P4 + func: Func, // P4 }, InitCoroutine { @@ -1156,8 +1171,17 @@ impl Program { start_reg, dest, } => match func { - ScalarFunc::Coalesce => {} - ScalarFunc::Like => { + Func::Json(JsonFunc::JSON) => { + let json_value = &state.registers[*start_reg]; + let json_str = get_json(json_value); + match json_str { + Ok(json) => state.registers[*dest] = json, + Err(e) => return Err(e), + } + state.pc += 1; + } + Func::Scalar(ScalarFunc::Coalesce) => {} + Func::Scalar(ScalarFunc::Like) => { let start_reg = *start_reg; assert!( start_reg + 2 <= state.registers.len(), @@ -1178,7 +1202,7 @@ impl Program { state.registers[*dest] = result; state.pc += 1; } - ScalarFunc::Abs => { + Func::Scalar(ScalarFunc::Abs) => { let reg_value = state.registers[*start_reg].borrow_mut(); if let Some(value) = exec_abs(reg_value) { state.registers[*dest] = value; @@ -1187,7 +1211,7 @@ impl Program { } state.pc += 1; } - ScalarFunc::Upper => { + Func::Scalar(ScalarFunc::Upper) => { let reg_value = state.registers[*start_reg].borrow_mut(); if let Some(value) = exec_upper(reg_value) { state.registers[*dest] = value; @@ -1196,7 +1220,7 @@ impl Program { } state.pc += 1; } - ScalarFunc::Lower => { + Func::Scalar(ScalarFunc::Lower) => { let reg_value = state.registers[*start_reg].borrow_mut(); if let Some(value) = exec_lower(reg_value) { state.registers[*dest] = value; @@ -1205,16 +1229,16 @@ impl Program { } state.pc += 1; } - ScalarFunc::Length => { + Func::Scalar(ScalarFunc::Length) => { let reg_value = state.registers[*start_reg].borrow_mut(); state.registers[*dest] = exec_length(reg_value); state.pc += 1; } - ScalarFunc::Random => { + Func::Scalar(ScalarFunc::Random) => { state.registers[*dest] = exec_random(); state.pc += 1; } - ScalarFunc::Trim => { + Func::Scalar(ScalarFunc::Trim) => { let start_reg = *start_reg; let reg_value = state.registers[start_reg].clone(); let pattern_value = state.registers.get(start_reg + 1).cloned(); @@ -1224,7 +1248,7 @@ impl Program { state.registers[*dest] = result; state.pc += 1; } - ScalarFunc::LTrim => { + Func::Scalar(ScalarFunc::LTrim) => { let start_reg = *start_reg; let reg_value = state.registers[start_reg].clone(); let pattern_value = state.registers.get(start_reg + 1).cloned(); @@ -1234,7 +1258,7 @@ impl Program { state.registers[*dest] = result; state.pc += 1; } - ScalarFunc::RTrim => { + Func::Scalar(ScalarFunc::RTrim) => { let start_reg = *start_reg; let reg_value = state.registers[start_reg].clone(); let pattern_value = state.registers.get(start_reg + 1).cloned(); @@ -1244,7 +1268,7 @@ impl Program { state.registers[*dest] = result; state.pc += 1; } - ScalarFunc::Round => { + Func::Scalar(ScalarFunc::Round) => { let start_reg = *start_reg; let reg_value = state.registers[start_reg].clone(); let precision_value = state.registers.get(start_reg + 1).cloned(); @@ -1252,7 +1276,7 @@ impl Program { state.registers[*dest] = result; state.pc += 1; } - ScalarFunc::Min => { + Func::Scalar(ScalarFunc::Min) => { let start_reg = *start_reg; let reg_values = state.registers[start_reg..state.registers.len()] .iter() @@ -1265,7 +1289,7 @@ impl Program { } state.pc += 1; } - ScalarFunc::Max => { + Func::Scalar(ScalarFunc::Max) => { let start_reg = *start_reg; let reg_values = state.registers[start_reg..state.registers.len()] .iter() @@ -1278,7 +1302,7 @@ impl Program { } state.pc += 1; } - ScalarFunc::Date => { + Func::Scalar(ScalarFunc::Date) => { if *start_reg == 0 { let date_str = exec_date(&OwnedValue::Text(Rc::new("now".to_string())))?; @@ -1300,7 +1324,7 @@ impl Program { } state.pc += 1; } - ScalarFunc::Time => { + Func::Scalar(ScalarFunc::Time) => { if *start_reg == 0 { let time_str = exec_time(&OwnedValue::Text(Rc::new("now".to_string())))?; @@ -1322,7 +1346,7 @@ impl Program { } state.pc += 1; } - ScalarFunc::Unicode => { + Func::Scalar(ScalarFunc::Unicode) => { let reg_value = state.registers[*start_reg].borrow_mut(); state.registers[*dest] = exec_unicode(reg_value); state.pc += 1;