]> granicus.if.org Git - postgresql/commit
Fix bug around assignment expressions containing indirections.
authorAndres Freund <andres@anarazel.de>
Fri, 24 Jul 2015 09:48:53 +0000 (11:48 +0200)
committerAndres Freund <andres@anarazel.de>
Fri, 24 Jul 2015 09:52:22 +0000 (11:52 +0200)
commitbb0203f26fa5f09fe2689a9db4bc632c1435edec
treec1dbfcf28c36c17b93d282058f6383a168a93429
parentfbf8dc21738749470f73f91a95ac01912c9deb10
Fix bug around assignment expressions containing indirections.

Handling of assigned-to expressions with indirection (e.g. set f1[1] =
3) was broken for ON CONFLICT DO UPDATE.  The problem was that
ParseState was consulted to determine if an INSERT-appropriate or
UPDATE-appropriate behavior should be used when transforming expressions
with indirections. When the wrong path was taken the old row was
substituted with NULL, leading to wrong results..

To fix remove p_is_update and only use p_is_insert to decide how to
transform the assignment expression, and uset p_is_insert while parsing
the on conflict statement. This isn't particularly pretty, but it's not
any worse than before.

Author: Peter Geoghegan, slightly edited by me
Discussion: CAM3SWZS8RPvA=KFxADZWw3wAHnnbxMxDzkEC6fNaFc7zSm411w@mail.gmail.com
Backpatch: 9.5, where the feature was introduced
src/backend/parser/analyze.c
src/include/parser/parse_node.h
src/test/regress/expected/arrays.out
src/test/regress/sql/arrays.sql