Skip to content

FIX: fold non-ASCII case in the seed value search - #3665

Open
Manohar Paturi (ManoharPaturi) wants to merge 1 commit into
microsoft:mainfrom
ManoharPaturi:fix/unicode-seed-value-search
Open

Manohar Paturi (ManoharPaturi) wants to merge 1 commit into
microsoft:mainfrom
ManoharPaturi:fix/unicode-seed-value-search

Conversation

@ManoharPaturi

Copy link
Copy Markdown
Contributor

Description

Fixes #3664

value_search is documented to match stored values containing the text while ignoring case, but on SQLite the filter compiled to lower(value) LIKE lower(pattern) and SQLite's lower() only folds ASCII letters. A seed stored as CAFÉ au lait tactics was found by searching CAFÉ but missed by searching café, while the same data matched both on Azure SQL.

The search now folds the column with the existing Unicode-aware UnicodeLower (the same machinery the harm category filters already use for exactly this reason) and folds the pattern in Python, so both backends apply the same folding. Wildcard escaping is unchanged.

Tests and Documentation

Added a regression next to the harm filter's non-ASCII folding test, covering the accented pair in both directions plus an escaped wildcard value. It fails on main and passes with the change. The full memory interface suite passes (759 tests) and ruff is clean.

No documentation change needed, so I did not run JupyText.

SQLite lower() only folds ASCII, so a stored value like CAFE with an accent was found by an exact-case search but missed by a lowercase one. The search now folds the column with the Unicode-aware UnicodeLower used by the harm category filters and folds the pattern in Python.

Signed-off-by: Manohar Paturi <186662190+ManoharPaturi@users.noreply.github.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Seed value search misses non-ASCII matches on SQLite: case folding is ASCII only

1 participant