Add early 'changes()' & 'total_changes()' support

This commit is contained in:
Lemon-Peppermint 2024-12-31 23:59:04 +02:00
parent 90d01f468f
commit abd8e6af43
3 changed files with 40 additions and 0 deletions

View file

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

View file

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

View file

@ -1321,6 +1321,10 @@ impl Program {
let result = exec_cast(&reg_value_argument, &reg_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(