Thanks Steve. FWIW I looked at the 9.0 and 9.1 release notes, and didn't find much on arrays in them.
I do have one follow-up curiosity question, though. Why does array_dims(array[]::varchar[]) return NULL instead of 0? I would expect NULL for a NULL array, but not an empty one. (And the same for array_[upper,lower,length] functions as well. There doesn't seem to be much coverage of NULLs in the array documentation, so in the making-work-for-other-people department, I'd suggest that either weaving it in or including a small separate section on the topic might be helpful. Cheers, Ken On Thu, Jun 14, 2012 at 3:15 PM, Steve Crawford < scrawf...@pinpointresearch.com> wrote: > On 06/14/2012 12:47 PM, Ken Tanzer wrote: > >> Hi. I had this piece of SQL, which ran fine on my 9.1 installation: >> >> INSERT INTO foo >> SELECT ..., >> CASE WHEN NOT allow_output_screen THEN array['O_SCREEN'] ELSE >> array[]::varchar[] END >> || CASE WHEN NOT allow_output_spreadsheet THEN array['O_TEMPLATE'] >> ELSE array[]::varchar[] END, >> ...; >> >> However, this failed miserably on someone else's 8.3: >> >> ERROR: syntax error at or near "]" >> LINE 1: ...w_output_screen THEN array['O_SCREEN'] ELSE array[]::varchar >> >> ^ >> The 9.1 documentation >> (http://www.postgresql.org/**docs/9.1/static/sql-**expressions.html<http://www.postgresql.org/docs/9.1/static/sql-expressions.html> >> ) >> states you can construct an empty array with my syntax (that's how I >> got it originally), but there is no mention of empty arrays in the >> corresponding 8.3 page. >> >> In 8.3, I can SELECT NULL::varchar[], which seems to behave the same >> in my query. The two don't seem to be exactly the same. I'm a little >> confused, however, as to the finer points or conceptual differences >> between them, and also what the differences might be between 8.3 and >> 9.1. >> >> Sticking within 9.1, I ran this: >> >> =>CREATE TEMPORARY TABLE array_fun( f1 varchar[] ); >> =>INSERT INTO array_fun VALUES (array[]::varchar[]),(NULL::**varchar[]); >> >> CREATE TABLE >> INSERT 0 2 >> >> => SELECT array_dims(f1) AS dims, f1 IS NULL as is_null, f1 || >> array['Item 2']::varchar[] AS concats,f1 FROM array_fun; >> >> dims | is_null | concats | f1 >> ------+---------+------------+**---- >> | f | {"Item 2"} | {} >> | t | {"Item 2"} | >> (2 rows) >> >> If anyone can shed some light on this, and also how to construct an >> empty array in 8.3, it would be great. Thanks! >> >> > Array handling in general has undergone many changes from 8.3 to 9.1 and > more if you go back from 8.3. Check the release notes for each major > release for the specifics and logic. Some of the changes such as how to > handle string_to_array('') (my fault for bringing it up originally) > required discussions that spanned a couple major versions. > > To create an empty array in 8.3 you can just use '{}' and note that an > empty array is *not* null while NULL::varchar[] *is*. > > Cheers, > Steve > > -- AGENCY Software A data system that puts you in control *http://agency-software.org/* ken.tan...@agency-software.org (253) 245-3801