I’m using PostgreSQL 9.3.5.
Suppose I have the following table:
CREATE TEMPORARY TABLE point_test ("name" varchar(255), "pt" point);
I then insert a row, leaving pt
NULL
:
INSERT INTO point_test (name) VALUES ('me');
Then, I want to update pt
using the array-like syntax:
UPDATE point_test SET pt[0] = 42, pt[1] = -42 WHERE name = 'me';
which appears to succeed (UPDATE 1
) – EXPLAIN VERBOSE
shows the following:
Update on pg_temp_65.point_test (cost=0.00..11.75 rows=1 width=538)
-> Seq Scan on pg_temp_65.point_test (cost=0.00..11.75 rows=1 width=538)
Output: name, (pt[0] := 42::double precision)[1] := (-42)::double precision, ctid
Filter: ((point_test.name)::text = 'me'::text)
However, pt
is still NULL
. If I use a slightly different syntax, it works in this case:
UPDATE point_test SET pt = '(42,-42)' WHERE name = 'me';
results in the point (42,-42)
as expected.
Further, now that there is something in the field, I can update the point using the first syntax:
UPDATE point_test SET pt[0] = 84, pt[1] = -84 WHERE name = 'me';
results in the point (84,-84)
as expected.
Why do the behaviors of the two syntaxes differ only when the pt
column is NULL
?