mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +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:
@ -9198,35 +9198,14 @@ get_oper_expr(OpExpr *expr, deparse_context *context)
|
||||
}
|
||||
else
|
||||
{
|
||||
/* unary operator --- but which side? */
|
||||
/* prefix operator */
|
||||
Node *arg = (Node *) linitial(args);
|
||||
HeapTuple tp;
|
||||
Form_pg_operator optup;
|
||||
|
||||
tp = SearchSysCache1(OPEROID, ObjectIdGetDatum(opno));
|
||||
if (!HeapTupleIsValid(tp))
|
||||
elog(ERROR, "cache lookup failed for operator %u", opno);
|
||||
optup = (Form_pg_operator) GETSTRUCT(tp);
|
||||
switch (optup->oprkind)
|
||||
{
|
||||
case 'l':
|
||||
appendStringInfo(buf, "%s ",
|
||||
generate_operator_name(opno,
|
||||
InvalidOid,
|
||||
exprType(arg)));
|
||||
get_rule_expr_paren(arg, context, true, (Node *) expr);
|
||||
break;
|
||||
case 'r':
|
||||
get_rule_expr_paren(arg, context, true, (Node *) expr);
|
||||
appendStringInfo(buf, " %s",
|
||||
generate_operator_name(opno,
|
||||
exprType(arg),
|
||||
InvalidOid));
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "bogus oprkind: %d", optup->oprkind);
|
||||
}
|
||||
ReleaseSysCache(tp);
|
||||
appendStringInfo(buf, "%s ",
|
||||
generate_operator_name(opno,
|
||||
InvalidOid,
|
||||
exprType(arg)));
|
||||
get_rule_expr_paren(arg, context, true, (Node *) expr);
|
||||
}
|
||||
if (!PRETTY_PAREN(context))
|
||||
appendStringInfoChar(buf, ')');
|
||||
@ -11087,10 +11066,6 @@ generate_operator_name(Oid operid, Oid arg1, Oid arg2)
|
||||
p_result = left_oper(NULL, list_make1(makeString(oprname)), arg2,
|
||||
true, -1);
|
||||
break;
|
||||
case 'r':
|
||||
p_result = right_oper(NULL, list_make1(makeString(oprname)), arg1,
|
||||
true, -1);
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "unrecognized oprkind: %d", operform->oprkind);
|
||||
p_result = NULL; /* keep compiler quiet */
|
||||
|
Reference in New Issue
Block a user