Skip to content

Commit

Permalink
Merge pull request #54942 from ClickHouse/binary-like
Browse files Browse the repository at this point in the history
Allow LIKE over binary data
  • Loading branch information
alexey-milovidov committed Sep 23, 2023
2 parents 4032fc1 + 1326bff commit a751f51
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/Common/OptimizedRegularExpression.cpp
Expand Up @@ -496,6 +496,14 @@ OptimizedRegularExpression::OptimizedRegularExpression(const std::string & regex
regexp_options.set_dot_nl(true);

re2 = std::make_unique<re2::RE2>(regexp_, regexp_options);

/// Fallback to latin1 to allow matching binary data.
if (!re2->ok() && re2->error_code() == re2::RE2::ErrorCode::ErrorBadUTF8)
{
regexp_options.set_encoding(re2::RE2::Options::EncodingLatin1);
re2 = std::make_unique<re2::RE2>(regexp_, regexp_options);
}

if (!re2->ok())
{
throw DB::Exception(DB::ErrorCodes::CANNOT_COMPILE_REGEXP,
Expand Down
24 changes: 24 additions & 0 deletions tests/queries/0_stateless/02886_binary_like.reference
@@ -0,0 +1,24 @@
1
1
1
1
1
0
0
1
1
1
1
1
1
0
0
1
1
1
1
1
1
0
0
1
26 changes: 26 additions & 0 deletions tests/queries/0_stateless/02886_binary_like.sql
@@ -0,0 +1,26 @@
SELECT 'aяb' LIKE 'a_b';
SELECT 'a\0b' LIKE 'a_b';
SELECT 'a\0b' LIKE 'a\0b';
SELECT 'a\0b' LIKE 'a%\0b';
SELECT 'a\xFFb' LIKE 'a%\xFFb';
SELECT 'a\xFFb' LIKE 'a%\xFF\xFEb';
SELECT 'a\xFFb' LIKE '%a\xFF\xFEb';
SELECT 'a\xFF\xFEb' LIKE '%a\xFF\xFEb';

SELECT materialize('aяb') LIKE 'a_b';
SELECT materialize('a\0b') LIKE 'a_b';
SELECT materialize('a\0b') LIKE 'a\0b';
SELECT materialize('a\0b') LIKE 'a%\0b';
SELECT materialize('a\xFFb') LIKE 'a%\xFFb';
SELECT materialize('a\xFFb') LIKE 'a%\xFF\xFEb';
SELECT materialize('a\xFFb') LIKE '%a\xFF\xFEb';
SELECT materialize('a\xFF\xFEb') LIKE '%a\xFF\xFEb';

SELECT materialize('aяb') LIKE materialize('a_b');
SELECT materialize('a\0b') LIKE materialize('a_b');
SELECT materialize('a\0b') LIKE materialize('a\0b');
SELECT materialize('a\0b') LIKE materialize('a%\0b');
SELECT materialize('a\xFFb') LIKE materialize('a%\xFFb');
SELECT materialize('a\xFFb') LIKE materialize('a%\xFF\xFEb');
SELECT materialize('a\xFFb') LIKE materialize('%a\xFF\xFEb');
SELECT materialize('a\xFF\xFEb') LIKE materialize('%a\xFF\xFEb');

0 comments on commit a751f51

Please sign in to comment.