Check for an exact match with the target.
Try to coerce the expression directly to the target type if necessary.
If the target is a fixed-length type (e.g. char or varchar declared with a length) then try to find a sizing function of the same name as the type taking two arguments, the first the type name and the second an integer length.
For a target column declared as varchar(4) the following query ensures that the target is sized correctly:
tgl=> CREATE TABLE vv (v varchar(4)); CREATE tgl=> INSERT INTO vv SELECT 'abc' || 'def'; INSERT 392905 1 tgl=> select * from vv; v ---- abcd (1 row)