# Buggy code
def set_pattern(self, pattern):
    """Set the pattern used to filter results.

    Args:
        pattern: string pattern to filter by.
    """
    # escape to treat a user input % or _ as a literal, not a wildcard
    pattern = pattern.replace("%", "\\%")
    pattern = pattern.replace("_", "\\_")
    words = ["%{}%".format(w) for w in pattern.split(" ")]

    # build a where clause to match all of the words in any order
    # given the search term "a b", the WHERE clause would be:
    # ((url || ' ' || title) LIKE '%a%') AND
    # ((url || ' ' || title) LIKE '%b%')
    where_clause = " AND ".join(
        "(url || ' ' || title) LIKE :{} escape '\\'".format(i)
        for i in range(len(words))
    )

    # replace ' in timestamp-format to avoid breaking the query
    timestamp_format = config.val.completion.timestamp_format or ""
    timefmt = "strftime('{}', last_atime, 'unixepoch', 'localtime')".format(
        timestamp_format.replace("'", "`")
    )

    if not self._query or len(words) != len(self._query.bound_values()):
        # if the number of words changed, we need to generate a new query
        # otherwise, we can reuse the prepared query for performance
        try:
            self._query = sql.Query(
                " ".join(
                    [
                        "SELECT url, title, {}".format(timefmt),
                        "FROM CompletionHistory",
                        # the incoming pattern will have literal % and _ escaped
                        # we need to tell sql to treat '\' as an escape character
                        "WHERE ({})".format(where_clause),
                        self._atime_expr(),
                        "ORDER BY last_atime DESC",
                    ]
                ),
                forward_only=False,
            )
        except sql.SqlLongQueryError as e:
            # Sometimes, the query we built up was invalid, for example,
            # due to a large amount of words.
            message.error("Error building SQL Query: {}".format(e.text()))
            return

    with debug.log_time("sql", "Running completion query"):
        self._query.run(**{str(i): w for i, w in enumerate(words)})
    self.setQuery(self._query.query)


# Traceback (qutebrowser.misc.sql.SqlEnvironmentError)
00:59:51 DEBUG    completion completionmodel:set_pattern:179 Setting completion pattern ''
00:59:51 DEBUG    sql        sql:__init__:174 Preparing SQL query: "SELECT url, title, strftime('%Y-%m-%d', last_atime, 'unixepoch', 'localtime') FROM CompletionHistory WHERE ((url || title) LIKE :0 escape '\')  ORDER BY last_atime DESC"
00:59:51 DEBUG    sql        sql:run:207 Running SQL query: "SELECT url, title, strftime('%Y-%m-%d', last_atime, 'unixepoch', 'localtime') FROM CompletionHistory WHERE ((url || title) LIKE :0 escape '\')  ORDER BY last_atime DESC"
00:59:51 DEBUG    sql        sql:run:210 query bindings: {':0': '%%'}
00:59:51 DEBUG    sql        sql:raise_sqlite_error:94 SQL error:
00:59:51 DEBUG    sql        sql:raise_sqlite_error:96 type: ConnectionError
00:59:51 DEBUG    sql        sql:raise_sqlite_error:97 database text: database disk image is malformed
00:59:51 DEBUG    sql        sql:raise_sqlite_error:98 driver text: Unable to fetch row
00:59:51 DEBUG    sql        sql:raise_sqlite_error:99 error code: 11
00:59:51 DEBUG    sql        debug:__exit__:265 Running completion query took 0.000379 seconds.
00:59:51 DEBUG    completion debug:__exit__:265 Set pattern  took 0.001134 seconds.
00:59:51 ERROR    misc       crashsignal:exception_hook:214 Uncaught exception
Traceback (most recent call last):
File "/usr/lib/python3.7/site-packages/qutebrowser/completion/completer.py", line 260, in _update_completion
completion.set_pattern(pattern)
File "/usr/lib/python3.7/site-packages/qutebrowser/completion/completionwidget.py", line 320, in set_pattern
self.model().set_pattern(pattern)
File "/usr/lib/python3.7/site-packages/qutebrowser/completion/models/completionmodel.py", line 185, in set_pattern
cat.set_pattern(pattern)
File "/usr/lib/python3.7/site-packages/qutebrowser/completion/models/histcategory.py", line 102, in set_pattern
str(i): w for i, w in enumerate(words)})
File "/usr/lib/python3.7/site-packages/qutebrowser/misc/sql.py", line 213, in run
self._check_ok('exec', ok)
File "/usr/lib/python3.7/site-packages/qutebrowser/misc/sql.py", line 196, in _check_ok
raise_sqlite_error(msg, error)
File "/usr/lib/python3.7/site-packages/qutebrowser/misc/sql.py", line 118, in raise_sqlite_error
raise SqlEnvironmentError(msg, error)
qutebrowser.misc.sql.SqlEnvironmentError: Failed to exec query "SELECT url, title, strftime('%Y-%m-%d', last_atime, 'unixepoch', 'localtime') FROM CompletionHistory WHERE ((url || title) LIKE :0 escape '\')  ORDER BY last_atime DESC": "database disk image is malformed Unable to fetch row"

# Fixed code
def set_pattern(self, pattern):
    """Set the pattern used to filter results.

    Args:
        pattern: string pattern to filter by.
    """
    # escape to treat a user input % or _ as a literal, not a wildcard
    pattern = pattern.replace("%", "\\%")
    pattern = pattern.replace("_", "\\_")
    words = ["%{}%".format(w) for w in pattern.split(" ")]

    # build a where clause to match all of the words in any order
    # given the search term "a b", the WHERE clause would be:
    # ((url || ' ' || title) LIKE '%a%') AND
    # ((url || ' ' || title) LIKE '%b%')
    where_clause = " AND ".join(
        "(url || ' ' || title) LIKE :{} escape '\\'".format(i)
        for i in range(len(words))
    )

    # replace ' in timestamp-format to avoid breaking the query
    timestamp_format = config.val.completion.timestamp_format or ""
    timefmt = "strftime('{}', last_atime, 'unixepoch', 'localtime')".format(
        timestamp_format.replace("'", "`")
    )

    try:
        if not self._query or len(words) != len(self._query.bound_values()):
            # if the number of words changed, we need to generate a new
            # query otherwise, we can reuse the prepared query for
            # performance
            self._query = sql.Query(
                " ".join(
                    [
                        "SELECT url, title, {}".format(timefmt),
                        "FROM CompletionHistory",
                        # the incoming pattern will have literal % and _ escaped we
                        # need to tell sql to treat '\' as an escape character
                        "WHERE ({})".format(where_clause),
                        self._atime_expr(),
                        "ORDER BY last_atime DESC",
                    ]
                ),
                forward_only=False,
            )

        with debug.log_time("sql", "Running completion query"):
            self._query.run(**{str(i): w for i, w in enumerate(words)})
    except sql.SqlKnownError as e:
        # Sometimes, the query we built up was invalid, for example,
        # due to a large amount of words.
        message.error("Error with SQL Query: {}".format(e.text()))
        return
    self.setQuery(self._query.query)