La priorité et l'associativité des opérateurs sont intégrées
dans l'analyseur. La plupart des opérateurs ont la même priorité et sont
associés à gauche. Ceci peut conduire à un comportement non intuitif; par
exemple les opérateurs booléens < et >
ont une priorité différente par rapport aux opérateurs booléens <= and >=. Aussi, nous aurons parfois besoin de rajouter
des parenthèses quand nous utilisons des combinaisons d'opérateurs
binaires ou unaires. Par exemple
sera analysé comme
car l'analyseur n'a pas l'idée que
! est défini comme un opérateur postfixé, pas inséré.
Pour obtenir le comportement désiré dans ce cas, vous devez écrire
C'est le prix à payer pour l'extensibilité.
Table 1. Operator Precedence (decreasing)
| Operator/Element | Associativity | Description |
|---|
| :: | left | Style coercition de type PostgreSQL |
| [ ] | left | Sélection élément de tableau |
| . | left | séparateur de nom de table/colonne |
| - | right | moins unaire |
| ^ | left | exponentiation |
| * / % | left | multiplication, division, pourcentage |
| + - | left | addition, soustraction |
| IS | | test pour TRUE, FALSE, UNKNOWN, NULL |
| ISNULL | | test pour NULL |
| NOTNULL | | test pour NOT NULL |
| (n'importe quel autre) | left | tous les autres opérateurs natifs ou utilisateurs |
| IN | | placement des effectifs |
| BETWEEN | | confinement |
| OVERLAPS | | chevauchement d'intervalle de temps |
| LIKE ILIKE | | chaîne de filtrage |
| < > | | moins que, plus grand que |
| = | right | égalité, affectation |
| NOT | right | négation logique |
| AND | left | conjonction logique |
| OR | left | disjonction logique |
Notez que les règles de priorité des opérateurs s'appliquent aussi
aux opérateurs utilisateur qui ont les mêmes noms que les opérateurs
natifs mentionnés précédemment. Par exemple, si vous définissez
un opérateur "+" pour certain type de donnée il aura la
même priorité que l'opérateur natif "+".