diff --git a/rslib/src/search/parser.rs b/rslib/src/search/parser.rs index a9df06dd0..656ed1700 100644 --- a/rslib/src/search/parser.rs +++ b/rslib/src/search/parser.rs @@ -68,7 +68,7 @@ pub(super) enum SearchNode<'a> { AddedInDays(u32), EditedInDays(u32), CardTemplate(TemplateKind<'a>), - Deck(Cow<'a, str>), + Deck(String), DeckID(DeckID), NoteTypeID(NoteTypeID), NoteType(OptionalRe<'a>), @@ -279,7 +279,7 @@ fn search_node_for_text_with_argument<'a>( Ok(match key.to_ascii_lowercase().as_str() { "added" => SearchNode::AddedInDays(val.parse()?), "edited" => SearchNode::EditedInDays(val.parse()?), - "deck" => SearchNode::Deck(unescape_quotes(val)), + "deck" => SearchNode::Deck(unescape_to_enforced_re(val, ".")?), "note" => SearchNode::NoteType(unescape_to_re(val)?), "tag" => SearchNode::Tag(unescape_to_enforced_re(val, r"\S")?), "mid" => SearchNode::NoteTypeID(val.parse()?), @@ -632,7 +632,7 @@ mod test { assert_eq!(parse(r#""field:val:ue""#), parse(r"field:val\:ue")); assert_eq!(parse(r#"field:"val:ue""#), parse(r"field:val\:ue")); - // any character should be escapable on the right side of re: + // any character should be escapable on the right side of re: assert_eq!( parse(r#""re:\btest\%""#)?, vec![Search(Regex(r"\btest\%".into()))] diff --git a/rslib/src/search/sqlwriter.rs b/rslib/src/search/sqlwriter.rs index 9afbca0cd..fb06f659c 100644 --- a/rslib/src/search/sqlwriter.rs +++ b/rslib/src/search/sqlwriter.rs @@ -9,7 +9,6 @@ use crate::{ err::Result, notes::field_checksum, notetype::NoteTypeID, - text::text_to_re, text::{normalize_to_nfc, strip_html_preserving_image_filenames, without_combining}, timestamp::TimestampSecs, }; @@ -295,25 +294,26 @@ impl SqlWriter<'_> { fn write_deck(&mut self, deck: &str) -> Result<()> { match deck { - "*" => write!(self.sql, "true").unwrap(), + ".*" => write!(self.sql, "true").unwrap(), "filtered" => write!(self.sql, "c.odid != 0").unwrap(), deck => { // rewrite "current" to the current deck name let native_deck = if deck == "current" { let current_did = self.col.get_current_deck_id(); - self.col - .storage - .get_deck(current_did)? - .map(|d| d.name) - .unwrap_or_else(|| "Default".into()) + regex::escape( + self.col + .storage + .get_deck(current_did)? + .map(|d| d.name) + .unwrap_or_else(|| "Default".into()) + .as_str(), + ) } else { human_deck_name_to_native(deck) }; // convert to a regex that includes child decks - // fixme: use unescape_to_enforced_re from parser.rs? - let re = text_to_re(&native_deck); - self.args.push(format!("(?i)^{}($|\x1f)", re)); + self.args.push(format!("(?i)^{}($|\x1f)", native_deck)); let arg_idx = self.args.len(); self.sql.push_str(&format!(concat!( "(c.did in (select id from decks where name regexp ?{n})",