From 2f82762ca2d5ebcc28c1d38466a9510a0fdcc0eb Mon Sep 17 00:00:00 2001 From: meteorgan Date: Wed, 28 May 2025 00:33:08 +0800 Subject: [PATCH] add function parse_signed_number --- core/translate/pragma.rs | 16 ++-------------- core/util.rs | 25 ++++++++++++++++++++++++- database | Bin 0 -> 8192 bytes 3 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 database diff --git a/core/translate/pragma.rs b/core/translate/pragma.rs index 5a4716672..7859d64ed 100644 --- a/core/translate/pragma.rs +++ b/core/translate/pragma.rs @@ -10,7 +10,7 @@ use crate::fast_lock::SpinLock; use crate::schema::Schema; use crate::storage::sqlite3_ondisk::{DatabaseHeader, MIN_PAGE_CACHE_SIZE}; use crate::storage::wal::CheckpointMode; -use crate::util::{normalize_ident, parse_numeric_literal}; +use crate::util::{normalize_ident, parse_signed_number}; use crate::vdbe::builder::{ProgramBuilder, ProgramBuilderOpts, QueryMode}; use crate::vdbe::insn::{Cookie, Insn}; use crate::{bail_parse_error, Pager, Value}; @@ -142,19 +142,7 @@ fn update_pragma( Ok(()) } PragmaName::UserVersion => { - let data = match value { - ast::Expr::Literal(ast::Literal::Numeric(numeric_value)) => { - parse_numeric_literal(&numeric_value)? - } - ast::Expr::Unary(ast::UnaryOperator::Negative, expr) => match *expr { - ast::Expr::Literal(ast::Literal::Numeric(numeric_value)) => { - let data = "-".to_owned() + numeric_value.as_str(); - parse_numeric_literal(&data)? - } - _ => bail_parse_error!("Not a valid value"), - }, - _ => bail_parse_error!("Not a valid value"), - }; + let data = parse_signed_number(&value)?; let version_value = match data { Value::Integer(i) => i as i32, Value::Float(f) => f as i32, diff --git a/core/util.rs b/core/util.rs index 909145bd0..f6b83ebfd 100644 --- a/core/util.rs +++ b/core/util.rs @@ -4,7 +4,9 @@ use crate::{ types::{Value, ValueType}, LimboError, OpenFlags, Result, Statement, StepResult, SymbolTable, IO, }; -use limbo_sqlite3_parser::ast::{self, CreateTableBody, Expr, FunctionTail, Literal}; +use limbo_sqlite3_parser::ast::{ + self, CreateTableBody, Expr, FunctionTail, Literal, UnaryOperator, +}; use std::{rc::Rc, sync::Arc}; pub trait RoundToPrecision { @@ -1011,6 +1013,27 @@ pub fn parse_numeric_literal(text: &str) -> Result { Ok(Value::Float(float_value)) } +pub fn parse_signed_number(expr: &Expr) -> Result { + match expr { + Expr::Literal(Literal::Numeric(num)) => parse_numeric_literal(num), + Expr::Unary(op, expr) => match (op, expr.as_ref()) { + (UnaryOperator::Negative, Expr::Literal(Literal::Numeric(num))) => { + let data = "-".to_owned() + &num.to_string(); + parse_numeric_literal(&data) + } + (UnaryOperator::Positive, Expr::Literal(Literal::Numeric(num))) => { + parse_numeric_literal(num) + } + _ => Err(LimboError::InvalidArgument( + "signed-number must follow the format: ([+|-] numeric-literal)".to_string(), + )), + }, + _ => Err(LimboError::InvalidArgument( + "signed-number must follow the format: ([+|-] numeric-literal)".to_string(), + )), + } +} + // for TVF's we need these at planning time so we cannot emit translate_expr pub fn vtable_args(args: &[ast::Expr]) -> Vec { let mut vtable_args = Vec::new(); diff --git a/database b/database new file mode 100644 index 0000000000000000000000000000000000000000..564a67b357b84fccabebbe5d215c2ae5a4d8323c GIT binary patch literal 8192 zcmeI#u?_)25XSM@jp&3etPBnO8CBu09{jsAK7g_cB!#5ohJCKGU-C?KODpzh`vWh*igax$af$5d;uG009IL zKmY**5I_I{1Q7T|VB*^SByo#aZV#aeb@T3izRJ=f(;}VanLalh|Y9Y8J{ZU6uP literal 0 HcmV?d00001