Andrew Dunstan wrote:
>
>
> Tom Lane wrote:
>> Andrew Dunstan <andrew@dunslane.net> writes:
>>
>>> We should only be able to get out of step from the "%_" case, I
>>> believe, so we should only need to do the first-byte test in that
>>> case (which is in a different code path from the normal "_" case.
>>> Does that seem right?
>>>
>>
>> At least put Assert(IsFirstByte()) in the main path.
>>
>> I'm a bit suspicious of the separate-path business anyway. Will it do
>> the right thing with say "%%%_" ?
>>
>>
>>
>
> Yes:
>
>
> /* %% is the same as % according to the SQL standard */
> /* Advance past all %'s */
> while ((plen > 0) && (*p == '%'))
> NextByte(p, plen);
I am also wondering if it might be sensible to make this choice once at
backend startup and store a function pointer, instead of doing it for
every string processed by like/ilike:
if (pg_database_encoding_max_length() == 1) return SB_MatchText(s, slen, p, plen); else if
(GetDatabaseEncoding()== PG_UTF8) return UTF8_MatchText(s, slen, p, plen); else return MB_MatchText(s,
slen,p, plen);
I guess that might make matters harder if we ever got per-column encodings.
cheers
andrew