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

functioncmds.c

Blame
    • Tom Lane's avatar
      eaccfded
      Centralize the logic for detecting misplaced aggregates, window funcs, etc. · eaccfded
      Tom Lane authored
      Formerly we relied on checking after-the-fact to see if an expression
      contained aggregates, window functions, or sub-selects when it shouldn't.
      This is grotty, easily forgotten (indeed, we had forgotten to teach
      DefineIndex about rejecting window functions), and none too efficient
      since it requires extra traversals of the parse tree.  To improve matters,
      define an enum type that classifies all SQL sub-expressions, store it in
      ParseState to show what kind of expression we are currently parsing, and
      make transformAggregateCall, transformWindowFuncCall, and transformSubLink
      check the expression type and throw error if the type indicates the
      construct is disallowed.  This allows removal of a large number of ad-hoc
      checks scattered around the code base.  The enum type is sufficiently
      fine-grained that we can still produce error messages of at least the
      same specificity as before.
      
      Bringing these error checks together revealed that we'd been none too
      consistent about phrasing of the error messages, so standardize the wording
      a bit.
      
      Also, rewrite checking of aggregate arguments so that it requires only one
      traversal of the arguments, rather than up to three as before.
      
      In passing, clean up some more comments left over from add_missing_from
      support, and annotate some tests that I think are dead code now that that's
      gone.  (I didn't risk actually removing said dead code, though.)
      eaccfded
      History
      Centralize the logic for detecting misplaced aggregates, window funcs, etc.
      Tom Lane authored
      Formerly we relied on checking after-the-fact to see if an expression
      contained aggregates, window functions, or sub-selects when it shouldn't.
      This is grotty, easily forgotten (indeed, we had forgotten to teach
      DefineIndex about rejecting window functions), and none too efficient
      since it requires extra traversals of the parse tree.  To improve matters,
      define an enum type that classifies all SQL sub-expressions, store it in
      ParseState to show what kind of expression we are currently parsing, and
      make transformAggregateCall, transformWindowFuncCall, and transformSubLink
      check the expression type and throw error if the type indicates the
      construct is disallowed.  This allows removal of a large number of ad-hoc
      checks scattered around the code base.  The enum type is sufficiently
      fine-grained that we can still produce error messages of at least the
      same specificity as before.
      
      Bringing these error checks together revealed that we'd been none too
      consistent about phrasing of the error messages, so standardize the wording
      a bit.
      
      Also, rewrite checking of aggregate arguments so that it requires only one
      traversal of the arguments, rather than up to three as before.
      
      In passing, clean up some more comments left over from add_missing_from
      support, and annotate some tests that I think are dead code now that that's
      gone.  (I didn't risk actually removing said dead code, though.)