diff --git a/core/function.rs b/core/function.rs index 4bb6a3f9b..253c1dfe6 100644 --- a/core/function.rs +++ b/core/function.rs @@ -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)), diff --git a/core/translate/expr.rs b/core/translate/expr.rs index bd8d9c94e..4ac6654c0 100644 --- a/core/translate/expr.rs +++ b/core/translate/expr.rs @@ -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 diff --git a/core/vdbe/mod.rs b/core/vdbe/mod.rs index 76e332c2b..c3612c8ae 100644 --- a/core/vdbe/mod.rs +++ b/core/vdbe/mod.rs @@ -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(