mirror of
https://github.com/aljazceru/turso.git
synced 2026-02-20 07:25:14 +01:00
refactor: delete Insn Json
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user