Josh Berkus <josh@agliodbs.com> writes:
> On 11/26/2014 11:54 AM, Josh Berkus wrote:
>> Tested on 9.4b3, 9.4rc1, 9.5devel
>>
>> select * from json_to_record('
>> {"id":1,"val":"josh","valry":["potter","chef","programmer"]}') as r(id
>> int, val text, valry text[]);
>>
>> ERROR: missing dimension value
>>
>> With some experimentation, I can't find any way to convert a JSON array
>> to an array field using json_to_record or json_to_recordset. I know
>> this worked back in January, though.
> Lemme take that back, it didn't work. Just checked an old devel snapshot.
> Looks like this is not intended to work, so the only bug is that we need
> a less confusing error message.
What's happening is that this string:
["potter","chef","programmer"]
is getting passed to array_in, which of course does not like it because
that's not the I/O syntax for Postgres arrays. Arguably,
populate_record_worker should be smart enough to convert somehow, but
it isn't today. Looks to me like it wouldn't succeed for the comparable
case of converting a sub-object to a Postgres composite type, either.
I'm satisfied with regarding those cases as missing features to be
added later.
As far as your request for a better error message is concerned, I'm a
bit inclined to lay the blame on array_in rather than the JSON code.
Wouldn't it be better if it said
ERROR: invalid input syntax for array: "["potter","chef","programmer"]" DETAIL: Dimension value is missing.
which is comparable to what you'd get out of most other input functions
that were feeling indigestion?
regards, tom lane