=?UTF-8?Q?Johannes_Gra=c3=abn?= <[email protected]> writes:
> This is a minimal example that goes wrong (but shouldn't IMHO:
>> SELECT format('%L:1', '\:')::tsvector
format(%L) is designed to produce a SQL literal, which does not
have the same requirements as a tsvector element ... yeah, they're
close, but not close enough. In this particular example,
what you get is
=# SELECT format('%L:1', '\:');
format
----------
E'\\:':1
(1 row)
because format() adds an E prefix for the avoidance of doubt about
what to do with the backslashes. tsvector doesn't like that.
I don't think we have any prefab function that does what you're
looking for here, and TBH I'm not sure I see the point of it.
Pretty much any tsvector you'd be dealing with in practice is
going to have come from one of the to_tsvector family of
functions, and those tend to drop punctuation.
> My understanding is that everything inside
> single quotes is taken as a lexeme. From the documentation:
>> To represent lexemes containing whitespace or punctuation, surround them
>> with quotes
See also the next bit about having to double quotes and backslashes
within those quotes. So what you'd actually need is
=# select $$'\\:':1$$::tsvector;
tsvector
----------
'\\:':1
(1 row)
If you write just one backslash, it has the effect of quoting
the next character, which in this case doesn't need quoting.
regards, tom lane