The docs (section 9.18 for PG 9.6) show as an example for array concatenationARRAY[4,5,6] || 7which works fine. However, trying the same with an array of text doesn't work:# select array['a','b','c'] || 'd';ERROR: malformed array literal: "d"LINE 1: select array['a','b','c'] || 'd';^DETAIL: Array value must start with "{" or dimension information.Casting the second value to TEXT works.# select array['a','b','c'] || 'd'::TEXT;?column?-----------{a,b,c,d}(1 row)The assumption that the second argument is an array constant seems surprising
It has to assume something. And for better and worse it has to assume it without looking at the actual value. Choosing the scalar variant here would be more convenient but choosing the same type as the left-hand side is logical. Note that the concatenation operator/function isn't the one complaining - if it was then intelligence could be inserted. The type conversion code doesn't have the luxury.
I don't suppose one would get far arguing to modify the array input function to convert a value that doesn't look like an array into a single element text array. The "implicit conversion" that involves is something we've gotten away from and seems like it would be worse that requiring the explicit typing.
David J.