mirror of
https://github.com/tursodatabase/limbo.git
synced 2025-08-04 18:18:03 +00:00
Add early 'changes()' & 'total_changes()' support
This commit is contained in:
parent
90d01f468f
commit
abd8e6af43
3 changed files with 40 additions and 0 deletions
|
@ -73,6 +73,7 @@ impl AggFunc {
|
|||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub enum ScalarFunc {
|
||||
Cast,
|
||||
Changes,
|
||||
Char,
|
||||
Coalesce,
|
||||
Concat,
|
||||
|
@ -102,6 +103,7 @@ pub enum ScalarFunc {
|
|||
Soundex,
|
||||
Date,
|
||||
Time,
|
||||
TotalChanges,
|
||||
Typeof,
|
||||
Unicode,
|
||||
Quote,
|
||||
|
@ -118,6 +120,7 @@ impl Display for ScalarFunc {
|
|||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
let str = match self {
|
||||
Self::Cast => "cast".to_string(),
|
||||
Self::Changes => "changes".to_string(),
|
||||
Self::Char => "char".to_string(),
|
||||
Self::Coalesce => "coalesce".to_string(),
|
||||
Self::Concat => "concat".to_string(),
|
||||
|
@ -147,6 +150,7 @@ impl Display for ScalarFunc {
|
|||
Self::Soundex => "soundex".to_string(),
|
||||
Self::Date => "date".to_string(),
|
||||
Self::Time => "time".to_string(),
|
||||
Self::TotalChanges => "total_changes".to_string(),
|
||||
Self::Typeof => "typeof".to_string(),
|
||||
Self::Unicode => "unicode".to_string(),
|
||||
Self::Quote => "quote".to_string(),
|
||||
|
@ -323,6 +327,8 @@ impl Func {
|
|||
"coalesce" => Ok(Self::Scalar(ScalarFunc::Coalesce)),
|
||||
"concat" => Ok(Self::Scalar(ScalarFunc::Concat)),
|
||||
"concat_ws" => Ok(Self::Scalar(ScalarFunc::ConcatWs)),
|
||||
"changes" => Ok(Self::Scalar(ScalarFunc::Changes)),
|
||||
"total_changes" => Ok(Self::Scalar(ScalarFunc::TotalChanges)),
|
||||
"glob" => Ok(Self::Scalar(ScalarFunc::Glob)),
|
||||
"ifnull" => Ok(Self::Scalar(ScalarFunc::IfNull)),
|
||||
"iif" => Ok(Self::Scalar(ScalarFunc::Iif)),
|
||||
|
|
|
@ -1011,6 +1011,19 @@ pub fn translate_expr(
|
|||
ScalarFunc::Cast => {
|
||||
unreachable!("this is always ast::Expr::Cast")
|
||||
}
|
||||
ScalarFunc::Changes => {
|
||||
if let Some(args) = args{
|
||||
crate::bail_parse_error!("{} fucntion with more than 0 arguments", srf);
|
||||
}
|
||||
let start_reg = program.alloc_register();
|
||||
program.emit_insn(Insn::Function{
|
||||
constant_mask: 0,
|
||||
start_reg,
|
||||
dest: target_register,
|
||||
func: func_ctx,
|
||||
});
|
||||
Ok(target_register)
|
||||
}
|
||||
ScalarFunc::Char => {
|
||||
let start_reg = translate_variable_sized_function_parameter_list(
|
||||
program,
|
||||
|
@ -1501,6 +1514,19 @@ pub fn translate_expr(
|
|||
});
|
||||
Ok(target_register)
|
||||
}
|
||||
ScalarFunc::TotalChanges => {
|
||||
if let Some(args) = args {
|
||||
crate::bail_parse_error!("{} fucntion with more than 0 arguments", srf.to_string());
|
||||
}
|
||||
let start_reg = program.alloc_register();
|
||||
program.emit_insn(Insn::Function{
|
||||
constant_mask: 0,
|
||||
start_reg,
|
||||
dest: target_register,
|
||||
func: func_ctx,
|
||||
});
|
||||
Ok(target_register)
|
||||
}
|
||||
ScalarFunc::Trim
|
||||
| ScalarFunc::LTrim
|
||||
| ScalarFunc::RTrim
|
||||
|
|
|
@ -1321,6 +1321,10 @@ impl Program {
|
|||
let result = exec_cast(®_value_argument, ®_value_type.value);
|
||||
state.registers[*dest] = result;
|
||||
}
|
||||
ScalarFunc::Changes => {
|
||||
//placeholder
|
||||
state.registers[*dest] = OwnedValue::Integer(0);
|
||||
}
|
||||
ScalarFunc::Char => {
|
||||
let reg_values =
|
||||
state.registers[*start_reg..*start_reg + arg_count].to_vec();
|
||||
|
@ -1529,6 +1533,10 @@ impl Program {
|
|||
exec_time(&state.registers[*start_reg..*start_reg + arg_count]);
|
||||
state.registers[*dest] = result;
|
||||
}
|
||||
ScalarFunc::TotalChanges => {
|
||||
//placeholder
|
||||
state.registers[*dest] = OwnedValue::Integer(0);
|
||||
}
|
||||
ScalarFunc::UnixEpoch => {
|
||||
if *start_reg == 0 {
|
||||
let unixepoch: String = exec_unixepoch(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue