refactor: delete Insn Json

This commit is contained in:
JeanArhancet
2024-07-26 13:04:18 +02:00
parent 552090cb29
commit 8dbced6a39
3 changed files with 53 additions and 29 deletions

View File

@@ -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)
}

View File

@@ -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,
});

View File

@@ -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;