Skip to content
Snippets Groups Projects
Select Git revision
  • benchmark-tools
  • postgres-lambda
  • master default
  • REL9_4_25
  • REL9_5_20
  • REL9_6_16
  • REL_10_11
  • REL_11_6
  • REL_12_1
  • REL_12_0
  • REL_12_RC1
  • REL_12_BETA4
  • REL9_4_24
  • REL9_5_19
  • REL9_6_15
  • REL_10_10
  • REL_11_5
  • REL_12_BETA3
  • REL9_4_23
  • REL9_5_18
  • REL9_6_14
  • REL_10_9
  • REL_11_4
23 results

postgresql.conf.sample

Blame
    • Tom Lane's avatar
      c6b3c939
      Make operator precedence follow the SQL standard more closely. · c6b3c939
      Tom Lane authored
      While the SQL standard is pretty vague on the overall topic of operator
      precedence (because it never presents a unified BNF for all expressions),
      it does seem reasonable to conclude from the spec for <boolean value
      expression> that OR has the lowest precedence, then AND, then NOT, then IS
      tests, then the six standard comparison operators, then everything else
      (since any non-boolean operator in a WHERE clause would need to be an
      argument of one of these).
      
      We were only sort of on board with that: most notably, while "<" ">" and
      "=" had properly low precedence, "<=" ">=" and "<>" were treated as generic
      operators and so had significantly higher precedence.  And "IS" tests were
      even higher precedence than those, which is very clearly wrong per spec.
      
      Another problem was that "foo NOT SOMETHING bar" constructs, such as
      "x NOT LIKE y", were treated inconsistently because of a bison
      implementation artifact: they had the documented precedence with respect
      to operators to their right, but behaved like NOT (i.e., very low priority)
      with respect to operators to their left.
      
      Fixing the precedence issues is just a small matter of rearranging the
      precedence declarations in gram.y, except for the NOT problem, which
      requires adding an additional lookahead case in base_yylex() so that we
      can attach a different token precedence to NOT LIKE and allied two-word
      operators.
      
      The bulk of this patch is not the bug fix per se, but adding logic to
      parse_expr.c to allow giving warnings if an expression has changed meaning
      because of these precedence changes.  These warnings are off by default
      and are enabled by the new GUC operator_precedence_warning.  It's believed
      that very few applications will be affected by these changes, but it was
      agreed that a warning mechanism is essential to help debug any that are.
      c6b3c939
      History
      Make operator precedence follow the SQL standard more closely.
      Tom Lane authored
      While the SQL standard is pretty vague on the overall topic of operator
      precedence (because it never presents a unified BNF for all expressions),
      it does seem reasonable to conclude from the spec for <boolean value
      expression> that OR has the lowest precedence, then AND, then NOT, then IS
      tests, then the six standard comparison operators, then everything else
      (since any non-boolean operator in a WHERE clause would need to be an
      argument of one of these).
      
      We were only sort of on board with that: most notably, while "<" ">" and
      "=" had properly low precedence, "<=" ">=" and "<>" were treated as generic
      operators and so had significantly higher precedence.  And "IS" tests were
      even higher precedence than those, which is very clearly wrong per spec.
      
      Another problem was that "foo NOT SOMETHING bar" constructs, such as
      "x NOT LIKE y", were treated inconsistently because of a bison
      implementation artifact: they had the documented precedence with respect
      to operators to their right, but behaved like NOT (i.e., very low priority)
      with respect to operators to their left.
      
      Fixing the precedence issues is just a small matter of rearranging the
      precedence declarations in gram.y, except for the NOT problem, which
      requires adding an additional lookahead case in base_yylex() so that we
      can attach a different token precedence to NOT LIKE and allied two-word
      operators.
      
      The bulk of this patch is not the bug fix per se, but adding logic to
      parse_expr.c to allow giving warnings if an expression has changed meaning
      because of these precedence changes.  These warnings are off by default
      and are enabled by the new GUC operator_precedence_warning.  It's believed
      that very few applications will be affected by these changes, but it was
      agreed that a warning mechanism is essential to help debug any that are.