The following bug has been logged online:
Bug reference: 6165
Logged by: raf
Email address: raf@raf.org
PostgreSQL version: 9.0.4
Operating system: N/A
Description: documentation bug in plpgsql-declarations.html and
plpgsql-statements.html (or plpgsql parser bug)
Details:
the documentation available at:
http://www.postgresql.org/docs/current/static/plpgsql-declarations.html
states that the general syntax of a variable declaration is:
name [ CONSTANT ] type [ NOT NULL ] [ { DEFAULT | := } expression ];
when it is really:
name [ CONSTANT ] type [ NOT NULL ] [ { DEFAULT | := | = } expression ];
i.e. an sql equality operator ("=") is accepted and acts as if it were
a plpgsql assignment operator (":=").
similarly, the documentation available at:
http://www.postgresql.org/docs/current/static/plpgsql-statements.html
states that an assignment of a value to a PL/pgSQL variable is written as:
variable := expression;
even though the sql equality operator works too:
variable = expression;
so, there is either a plpgsql parser bug that treats the sql equality
operator as the plpgsql assignment operator, or "=" is an undocumented
alternative to the documented plpgsql assignment operator (":=").
the only mention i have found of "=" being an assignment operator is in
the documentation that shows:
GET DIAGNOSTICS variable = item [ , ... ];
but i think that might be a special case.
example demonstration:
do $$
declare
i integer = 5;
begin
raise notice '%', i;
i = 6;
raise notice %', i;
end
$$;
will output 5 and then 6 (as expected by someone who doesn't know that
they should be using ":=" according to the documentation).