From e4372f5d7e509ce9ebd9c75550344804278808fa Mon Sep 17 00:00:00 2001 From: Dimitry Sibiryakov Date: Sun, 14 Dec 2025 19:20:10 +0100 Subject: [PATCH] Fix for #8359 --- src/jrd/optimizer/Optimizer.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/jrd/optimizer/Optimizer.cpp b/src/jrd/optimizer/Optimizer.cpp index c7ae78e32f0..7aa4a1e2c69 100644 --- a/src/jrd/optimizer/Optimizer.cpp +++ b/src/jrd/optimizer/Optimizer.cpp @@ -3397,9 +3397,12 @@ ValueExprNode* Optimizer::optimizeLikeSimilar(ComparativeBoolNode* cmpNode) // allocate a literal node to store the starting with string; // assume it will be shorter than the pattern string + // This literal will be in text charset to prevent conversion on every comparison const auto literal = FB_NEW_POOL(getPool()) LiteralNode(getPool()); literal->litDesc = *patternDesc; + literal->litDesc.setTextType(matchDesc.getTextType()); + literal->litDesc.dsc_length = p_count; UCHAR* q = literal->litDesc.dsc_address = FB_NEW_POOL(getPool()) UCHAR[literal->litDesc.dsc_length]; // Set the string length to point till the first wildcard character. @@ -3431,8 +3434,8 @@ ValueExprNode* Optimizer::optimizeLikeSimilar(ComparativeBoolNode* cmpNode) break; } - q += patternCharset->substring(patternDesc->dsc_length, - patternDesc->dsc_address, + q += matchCharset->substring(p_count, + p, literal->litDesc.dsc_length - (q - literal->litDesc.dsc_address), q, (patternPtrStart - patternCanonical.begin()) / canWidth, 1); }