Thanks for the explanation. I think I at least understand what it's doing now. I'm either surprised or confused though, as I was under the impression that you could substitute a subquery for a value pretty much anywhere, but I guess that's not the case?
Cheers, Ken
Your subquery can also be explicitly casted to make it work. Note the "::TEXT[]"
SELECT 'found' WHERE 'test' = ANY( (SELECT ARRAY['test','pass','fail'])::TEXT[] );