mirror of
https://github.com/aljazceru/turso.git
synced 2026-02-08 17:54:22 +01:00
Change parse_limit function to accept reference value to ast::Limit
This commit is contained in:
@@ -68,7 +68,7 @@ pub fn prepare_delete_plan(
|
||||
)?;
|
||||
|
||||
// Parse the LIMIT/OFFSET clause
|
||||
let (resolved_limit, resolved_offset) = limit.map_or(Ok((None, None)), |l| parse_limit(*l))?;
|
||||
let (resolved_limit, resolved_offset) = limit.map_or(Ok((None, None)), |l| parse_limit(&l))?;
|
||||
|
||||
let plan = DeletePlan {
|
||||
table_references,
|
||||
|
||||
@@ -850,30 +850,33 @@ fn parse_join<'a>(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn parse_limit(limit: Limit) -> Result<(Option<isize>, Option<isize>)> {
|
||||
let offset_val = match limit.offset {
|
||||
pub fn parse_limit(limit: &Limit) -> Result<(Option<isize>, Option<isize>)> {
|
||||
let offset_val = match &limit.offset {
|
||||
Some(offset_expr) => match offset_expr {
|
||||
Expr::Literal(ast::Literal::Numeric(n)) => n.parse().ok(),
|
||||
// If OFFSET is negative, the result is as if OFFSET is zero
|
||||
Expr::Unary(UnaryOperator::Negative, expr) => match *expr {
|
||||
Expr::Literal(ast::Literal::Numeric(n)) => n.parse::<isize>().ok().map(|num| -num),
|
||||
_ => crate::bail_parse_error!("Invalid OFFSET clause"),
|
||||
},
|
||||
Expr::Unary(UnaryOperator::Negative, expr) => {
|
||||
if let Expr::Literal(ast::Literal::Numeric(ref n)) = &**expr {
|
||||
n.parse::<isize>().ok().map(|num| -num)
|
||||
} else {
|
||||
crate::bail_parse_error!("Invalid OFFSET clause");
|
||||
}
|
||||
}
|
||||
_ => crate::bail_parse_error!("Invalid OFFSET clause"),
|
||||
},
|
||||
None => Some(0),
|
||||
};
|
||||
|
||||
if let Expr::Literal(ast::Literal::Numeric(n)) = limit.expr {
|
||||
if let Expr::Literal(ast::Literal::Numeric(n)) = &limit.expr {
|
||||
Ok((n.parse().ok(), offset_val))
|
||||
} else if let Expr::Unary(UnaryOperator::Negative, expr) = limit.expr {
|
||||
if let Expr::Literal(ast::Literal::Numeric(n)) = *expr {
|
||||
} else if let Expr::Unary(UnaryOperator::Negative, expr) = &limit.expr {
|
||||
if let Expr::Literal(ast::Literal::Numeric(n)) = &**expr {
|
||||
let limit_val = n.parse::<isize>().ok().map(|num| -num);
|
||||
Ok((limit_val, offset_val))
|
||||
} else {
|
||||
crate::bail_parse_error!("Invalid LIMIT clause");
|
||||
}
|
||||
} else if let Expr::Id(id) = limit.expr {
|
||||
} else if let Expr::Id(id) = &limit.expr {
|
||||
if id.0.eq_ignore_ascii_case("true") {
|
||||
Ok((Some(1), offset_val))
|
||||
} else if id.0.eq_ignore_ascii_case("false") {
|
||||
|
||||
@@ -370,7 +370,7 @@ pub fn prepare_select_plan<'a>(
|
||||
|
||||
// Parse the LIMIT/OFFSET clause
|
||||
(plan.limit, plan.offset) =
|
||||
select.limit.map_or(Ok((None, None)), |l| parse_limit(*l))?;
|
||||
select.limit.map_or(Ok((None, None)), |l| parse_limit(&l))?;
|
||||
|
||||
// Return the unoptimized query plan
|
||||
Ok(Plan::Select(plan))
|
||||
|
||||
@@ -151,17 +151,21 @@ pub fn prepare_update_plan(schema: &Schema, body: &mut Update) -> crate::Result<
|
||||
})
|
||||
.collect()
|
||||
});
|
||||
// Parse the WHERE clause
|
||||
parse_where(
|
||||
body.where_clause.as_ref().map(|w| *w.clone()),
|
||||
&table_references,
|
||||
Some(&result_columns),
|
||||
&mut where_clause,
|
||||
)?;
|
||||
|
||||
// Parse the LIMIT/OFFSET clause
|
||||
let (limit, offset) = body
|
||||
.limit
|
||||
.as_ref()
|
||||
.map(|l| parse_limit(*l.clone()))
|
||||
.map(|l| parse_limit(l))
|
||||
.unwrap_or(Ok((None, None)))?;
|
||||
|
||||
Ok(Plan::Update(UpdatePlan {
|
||||
table_references,
|
||||
set_clauses,
|
||||
|
||||
Reference in New Issue
Block a user