mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +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:
@ -2706,7 +2706,6 @@ deparseOpExpr(OpExpr *node, deparse_expr_cxt *context)
|
||||
HeapTuple tuple;
|
||||
Form_pg_operator form;
|
||||
char oprkind;
|
||||
ListCell *arg;
|
||||
|
||||
/* Retrieve information about the operator from system catalog. */
|
||||
tuple = SearchSysCache1(OPEROID, ObjectIdGetDatum(node->opno));
|
||||
@ -2716,18 +2715,16 @@ deparseOpExpr(OpExpr *node, deparse_expr_cxt *context)
|
||||
oprkind = form->oprkind;
|
||||
|
||||
/* Sanity check. */
|
||||
Assert((oprkind == 'r' && list_length(node->args) == 1) ||
|
||||
(oprkind == 'l' && list_length(node->args) == 1) ||
|
||||
Assert((oprkind == 'l' && list_length(node->args) == 1) ||
|
||||
(oprkind == 'b' && list_length(node->args) == 2));
|
||||
|
||||
/* Always parenthesize the expression. */
|
||||
appendStringInfoChar(buf, '(');
|
||||
|
||||
/* Deparse left operand. */
|
||||
if (oprkind == 'r' || oprkind == 'b')
|
||||
/* Deparse left operand, if any. */
|
||||
if (oprkind == 'b')
|
||||
{
|
||||
arg = list_head(node->args);
|
||||
deparseExpr(lfirst(arg), context);
|
||||
deparseExpr(linitial(node->args), context);
|
||||
appendStringInfoChar(buf, ' ');
|
||||
}
|
||||
|
||||
@ -2735,12 +2732,8 @@ deparseOpExpr(OpExpr *node, deparse_expr_cxt *context)
|
||||
deparseOperatorName(buf, form);
|
||||
|
||||
/* Deparse right operand. */
|
||||
if (oprkind == 'l' || oprkind == 'b')
|
||||
{
|
||||
arg = list_tail(node->args);
|
||||
appendStringInfoChar(buf, ' ');
|
||||
deparseExpr(lfirst(arg), context);
|
||||
}
|
||||
appendStringInfoChar(buf, ' ');
|
||||
deparseExpr(llast(node->args), context);
|
||||
|
||||
appendStringInfoChar(buf, ')');
|
||||
|
||||
|
Reference in New Issue
Block a user