smartplaylists: Escape pattern characters in search term

When using the LIKE function, use \ as an escape character and prepend
that to occurrences of the pattern characters _ and % in the search
term.
This commit is contained in:
Jim Broadus 2021-03-26 23:09:41 -07:00 committed by John Maguire
parent b2e3f8ea6e
commit 6412790723
1 changed files with 12 additions and 5 deletions

View File

@ -23,6 +23,13 @@
namespace smart_playlists {
const char* kEscClause = " ESCAPE '#'";
// Replace % and _ with #% and #_
static QString Escape(QString term) {
return term.replace(QRegExp("([%_#])"), "#\\1");
}
SearchTerm::SearchTerm() : field_(Field_Title), operator_(Op_Equals) {}
SearchTerm::SearchTerm(Field field, Operator op, const QVariant& value)
@ -87,16 +94,16 @@ QString SearchTerm::ToSql() const {
switch (operator_) {
case Op_Contains:
return col + " LIKE '%" + value + "%'";
return col + " LIKE '%" + Escape(value) + "%'" + kEscClause;
case Op_NotContains:
return col + " NOT LIKE '%" + value + "%'";
return col + " NOT LIKE '%" + Escape(value) + "%'" + kEscClause;
case Op_StartsWith:
return col + " LIKE '" + value + "%'";
return col + " LIKE '" + Escape(value) + "%'" + kEscClause;
case Op_EndsWith:
return col + " LIKE '%" + value + "'";
return col + " LIKE '%" + Escape(value) + "'" + kEscClause;
case Op_Equals:
if (TypeOf(field_) == Type_Text)
return col + " LIKE '" + value + "'";
return col + " LIKE '" + Escape(value) + "'" + kEscClause;
else if (TypeOf(field_) == Type_Rating || TypeOf(field_) == Type_Date ||
TypeOf(field_) == Type_Time)
return col + " = " + value;