Re: BUG #13829: Exponentiation operator is left-associative

From: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>
To: Henrik Pauli <henrik(dot)pauli(at)uhusystems(dot)com>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, "pgsql-bugs(at)postgresql(dot)org" <pgsql-bugs(at)postgresql(dot)org>
Subject: Re: BUG #13829: Exponentiation operator is left-associative
Date: 2015-12-22 19:20:12
Message-ID: CAKFQuwY+vdiP35zqOksZCEjX7mSoGhSZt3hn9thbURKCVJ=RpQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On Tue, Dec 22, 2015 at 9:55 AM, Henrik Pauli <henrik(dot)pauli(at)uhusystems(dot)com>
wrote:

> On 22/12/15 17:00, Tom Lane wrote:
>
>> henrik(dot)pauli(at)uhusystems(dot)com writes:
>>
>>> The convention with exponentation is the following (according to
>>> Wikipedia):
>>> "Without parentheses to modify the order of calculation, by convention
>>> the
>>> order is top-down, not bottom-up" -- in programming terms, it means that
>>> exponentation is by default right-associative.
>>> ...
>>> However, PostgreSQL -- as indeed mentioned in the docs -- considers the
>>> paren-less version more like the one where the left side is
>>> parenthesised:
>>>
>> Yeah. I can't see us changing this. Aside from backwards-compatibility
>> considerations, "^" is not so thoroughly identified with exponentiation
>> that no-one would ever make a custom operator named "^" that did something
>> else. Since operator precedence and associativity are determined solely
>> by the operator name, right-to-left associativity would have to apply to
>> such custom operators too, which would be mighty surprising if their
>> semantics were something else.
>>
>
> The custom operator thing is one of those situations I didn't think of and
> that's a reasonable problem there. That said, I guess the (few) users with
> things like a^b^c in their code also find it "mighty surprising" that it
> isn't a^(b^c). So one side is left scratching their heads either way.
>
> However, pointing the issue out somewhere near Table 9-2. Mathematical
>> Operators seems reasonable. The minimum change would just be to call it
>> out in the table entry itself:
>>
>> Operator Description Example
>> Result
>> ...
>> ^ exponentiation (associates left to right) 2.0 ^ 3.0 8
>>
>> Do you think that's sufficient?
>>
>> regards, tom lane
>>
>
> Might well be enough, not sure. Some parts of the documentation do come
> with little "Note" boxes in the text (can't quite remember an exact
> example, but I seem to remember there being such), which increase
> visibility to such discrepancy more effectively. Might be worth a sentence
> or two. I guess if there hasn't been a report before (no idea), people
> just don't do this in Postgres and so haven't been bitten by it at all

​Or they do do these things but given the natural order of difference
between the two results quickly realize that they need to add the
parentheses.

I would maybe add to the first sentence in that section.

"""
Operator associativity conforms to mathematical conventions unless
otherwise noted in the description.
"""

That does beg the questions as to where one might find definitions for
"conventional order" and whether any other notes need to be added.

​Pointing any of this out in a big highlighted comment block seems like
overkill.​

I'm not seeing that there is enough benefit to merit changing the behavior
even in the name of consistency and adhering to the POLA. Maybe if we
could change the definition so that it is per-function as opposed to
per-symbol it would be worth considering - though likely not even then.

David J.

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Maeldron T. 2015-12-22 20:49:56 Re: [BUGS] GIN index isn’t working with intarray
Previous Message Henrik Pauli 2015-12-22 16:55:12 Re: BUG #13829: Exponentiation operator is left-associative