File tree Expand file tree Collapse file tree 1 file changed +30
-1
lines changed Expand file tree Collapse file tree 1 file changed +30
-1
lines changed Original file line number Diff line number Diff line change @@ -3158,6 +3158,8 @@ ValueExprNode* Optimizer::optimizeLikeSimilar(ComparativeBoolNode* cmpNode)
3158
3158
3159
3159
MoveBuffer prefixBuffer;
3160
3160
ULONG charLen = 0 ;
3161
+ bool specialCharFound = false ;
3162
+ FB_SIZE_T prevPrefixSize = 0 ;
3161
3163
3162
3164
while (IntlUtil::readOneChar (matchCharset, &patternPtr, patternEnd, &charLen))
3163
3165
{
@@ -3172,9 +3174,36 @@ ValueExprNode* Optimizer::optimizeLikeSimilar(ComparativeBoolNode* cmpNode)
3172
3174
}
3173
3175
}
3174
3176
else if (charLen == 1 && SimilarToRegex::isSpecialChar (*patternPtr))
3177
+ {
3178
+ const auto patternChar = *patternPtr;
3179
+
3180
+ // If there are any branches, we assume there is no commom prefix.
3181
+ if (patternChar == ' |' )
3182
+ return nullptr ;
3183
+
3184
+ if (!specialCharFound)
3185
+ {
3186
+ switch (patternChar)
3187
+ {
3188
+ // These patterns may make the previous char optional.
3189
+ case ' *' :
3190
+ case ' ?' :
3191
+ case ' {' :
3192
+ prefixBuffer.resize (prevPrefixSize);
3193
+ break ;
3194
+ }
3195
+
3196
+ specialCharFound = true ;
3197
+ }
3198
+
3175
3199
break ;
3200
+ }
3176
3201
3177
- prefixBuffer.push (patternPtr, charLen);
3202
+ if (!specialCharFound)
3203
+ {
3204
+ prevPrefixSize = prefixBuffer.getCount ();
3205
+ prefixBuffer.push (patternPtr, charLen);
3206
+ }
3178
3207
}
3179
3208
3180
3209
if (prefixBuffer.isEmpty ())
You can’t perform that action at this time.
0 commit comments