From 3a4146560cbbecd077a67448989e906acfde96ee Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sat, 21 Mar 2020 08:09:28 +1000 Subject: [PATCH] handle escaped tag searches and tag:* special case --- rslib/src/search/sqlwriter.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/rslib/src/search/sqlwriter.rs b/rslib/src/search/sqlwriter.rs index d4cf396ce..e6f8163ef 100644 --- a/rslib/src/search/sqlwriter.rs +++ b/rslib/src/search/sqlwriter.rs @@ -97,14 +97,19 @@ impl SqlWriter<'_, '_> { } fn write_tag(&mut self, text: &str) { - if text == "none" { - write!(self.sql, "n.tags = ''").unwrap(); - return; + match text { + "none" => { + write!(self.sql, "n.tags = ''").unwrap(); + } + "*" | "%" => { + write!(self.sql, "true").unwrap(); + } + text => { + let tag = format!("% {} %", text.replace('*', "%")); + write!(self.sql, "n.tags like ? escape '\\'").unwrap(); + self.args.push(tag); + } } - - let tag = format!("% {} %", text.replace('*', "%")); - write!(self.sql, "n.tags like ?").unwrap(); - self.args.push(tag); } fn write_rated(&mut self, days: u32, ease: Option) -> Result<()> { @@ -486,6 +491,7 @@ mod test { ("(n.tags like ?)".into(), vec!["% o%e %".into()]) ); assert_eq!(s(ctx, "tag:none"), ("(n.tags = '')".into(), vec![])); + assert_eq!(s(ctx, "tag:*"), ("(true)".into(), vec![])); // state assert_eq!(