From fab0ec6e947c6685d575bbb6ff3b4723599e6698 Mon Sep 17 00:00:00 2001 From: Dorin Marcoci Date: Sat, 3 Oct 2026 18:51:31 +0300 Subject: [PATCH] Do not convert pattern literals of LIKE, CONTAINING, STARTING WITH and SIMILAR TO to the operand type --- src/dsql/BoolNodes.cpp | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/dsql/BoolNodes.cpp b/src/dsql/BoolNodes.cpp index fd84e9af226..af5fb73c8db 100644 --- a/src/dsql/BoolNodes.cpp +++ b/src/dsql/BoolNodes.cpp @@ -486,11 +486,35 @@ BoolExprNode* ComparativeBoolNode::dsqlPass(DsqlCompilerScratch* dsqlScratch) literalArg = value; }; - convertLiteralToOperand(procArg1, procArg2); - convertLiteralToOperand(procArg2, procArg1); + // Pattern matching operators (LIKE, CONTAINING, etc) compare strings, so their literals are kept as is + switch (blrOp) + { + case blr_eql: + case blr_neq: + case blr_gtr: + case blr_geq: + case blr_lss: + case blr_leq: + case blr_equiv: + case blr_between: + convertLiteralToOperand(procArg1, procArg2); + convertLiteralToOperand(procArg2, procArg1); - if (blrOp == blr_between) - convertLiteralToOperand(procArg3, procArg1); + if (blrOp == blr_between) + convertLiteralToOperand(procArg3, procArg1); + break; + + case blr_containing: + case blr_like: + case blr_matching: + case blr_matching2: + case blr_similar: + case blr_starting: + break; + + default: + fb_assert(false); + } ComparativeBoolNode* node = FB_NEW_POOL(dsqlScratch->getPool()) ComparativeBoolNode(dsqlScratch->getPool(), blrOp, procArg1,