mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Remove support for postfix (right-unary) operators.
This feature has been a thorn in our sides for a long time, causing many grammatical ambiguity problems. It doesn't seem worth the pain to continue to support it, so remove it. There are some follow-on improvements we can make in the grammar, but this commit only removes the bare minimum number of productions, plus assorted backend support code. Note that pg_dump and psql continue to have full support, since they may be used against older servers. However, pg_dump warns about postfix operators. There is also a check in pg_upgrade. Documentation-wise, I (tgl) largely removed the "left unary" terminology in favor of saying "prefix operator", which is a more standard and IMO less confusing term. I included a catversion bump, although no initial catalog data changes here, to mark the boundary at which oprkind = 'r' stopped being valid in pg_operator. Mark Dilger, based on work by myself and Robert Haas; review by John Naylor Discussion: https://postgr.es/m/38ca86db-42ab-9b48-2902-337a0d6b8311@2ndquadrant.com
This commit is contained in:
@ -111,7 +111,7 @@ CREATE FUNCTION complex_add(complex, complex)
|
||||
LANGUAGE C IMMUTABLE STRICT;
|
||||
|
||||
-- we can now define the operator. We show a binary operator here but you
|
||||
-- can also define unary operators by omitting either of leftarg or rightarg.
|
||||
-- can also define a prefix operator by omitting the leftarg.
|
||||
CREATE OPERATOR + (
|
||||
leftarg = complex,
|
||||
rightarg = complex,
|
||||
|
@ -96,36 +96,22 @@ SELECT n.nspname, r.rolname, format_type(t.oid, null) as typname
|
||||
|
||||
|
||||
--
|
||||
-- lists all left unary operators
|
||||
-- lists all prefix operators
|
||||
--
|
||||
SELECT n.nspname, o.oprname AS left_unary,
|
||||
SELECT n.nspname, o.oprname AS prefix_op,
|
||||
format_type(right_type.oid, null) AS operand,
|
||||
format_type(result.oid, null) AS return_type
|
||||
FROM pg_namespace n, pg_operator o,
|
||||
pg_type right_type, pg_type result
|
||||
WHERE o.oprnamespace = n.oid
|
||||
and o.oprkind = 'l' -- left unary
|
||||
and o.oprkind = 'l' -- prefix ("left unary")
|
||||
and o.oprright = right_type.oid
|
||||
and o.oprresult = result.oid
|
||||
ORDER BY nspname, operand;
|
||||
|
||||
|
||||
--
|
||||
-- lists all right unary operators
|
||||
--
|
||||
SELECT n.nspname, o.oprname AS right_unary,
|
||||
format_type(left_type.oid, null) AS operand,
|
||||
format_type(result.oid, null) AS return_type
|
||||
FROM pg_namespace n, pg_operator o,
|
||||
pg_type left_type, pg_type result
|
||||
WHERE o.oprnamespace = n.oid
|
||||
and o.oprkind = 'r' -- right unary
|
||||
and o.oprleft = left_type.oid
|
||||
and o.oprresult = result.oid
|
||||
ORDER BY nspname, operand;
|
||||
|
||||
--
|
||||
-- lists all binary operators
|
||||
-- lists all infix operators
|
||||
--
|
||||
SELECT n.nspname, o.oprname AS binary_op,
|
||||
format_type(left_type.oid, null) AS left_opr,
|
||||
@ -134,7 +120,7 @@ SELECT n.nspname, o.oprname AS binary_op,
|
||||
FROM pg_namespace n, pg_operator o, pg_type left_type,
|
||||
pg_type right_type, pg_type result
|
||||
WHERE o.oprnamespace = n.oid
|
||||
and o.oprkind = 'b' -- binary
|
||||
and o.oprkind = 'b' -- infix ("binary")
|
||||
and o.oprleft = left_type.oid
|
||||
and o.oprright = right_type.oid
|
||||
and o.oprresult = result.oid
|
||||
|
Reference in New Issue
Block a user