The PATINDEX function doesn't seem to handle brackets properly. The statement:
select patindex('%[%', 'abc[]def')
returns '0' instead of '4'.
After some experimentation, I see that brackets are being interpreted according to the usual regexp syntax. PATINDEX is not documented to support regular expressions, so this is unexpected. As per regexps, the following statement works:
select patindex('%[[]%', 'abc[]def')