summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/catalog/catversion.h2
-rw-r--r--src/include/catalog/pg_aggregate.h296
-rw-r--r--src/include/catalog/pg_operator.h1
-rw-r--r--src/include/catalog/pg_proc.h57
-rw-r--r--src/include/commands/defrem.h1
-rw-r--r--src/include/fmgr.h13
-rw-r--r--src/include/nodes/execnodes.h8
-rw-r--r--src/include/nodes/parsenodes.h4
-rw-r--r--src/include/nodes/primnodes.h19
-rw-r--r--src/include/nodes/relation.h9
-rw-r--r--src/include/parser/kwlist.h1
-rw-r--r--src/include/parser/parse_agg.h9
-rw-r--r--src/include/parser/parse_clause.h3
-rw-r--r--src/include/parser/parse_func.h4
-rw-r--r--src/include/utils/builtins.h15
-rw-r--r--src/include/utils/lsyscache.h1
-rw-r--r--src/include/utils/tuplesort.h3
17 files changed, 296 insertions, 150 deletions
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index b7610e8c3f..e8b60bda7e 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -53,6 +53,6 @@
*/
/* yyyymmddN */
-#define CATALOG_VERSION_NO 201312131
+#define CATALOG_VERSION_NO 201312231
#endif
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index 034456a315..f0eaf60a09 100644
--- a/src/include/catalog/pg_aggregate.h
+++ b/src/include/catalog/pg_aggregate.h
@@ -28,6 +28,8 @@
* cpp turns this into typedef struct FormData_pg_aggregate
*
* aggfnoid pg_proc OID of the aggregate itself
+ * aggkind aggregate kind, see AGGKIND_ categories below
+ * aggnumdirectargs number of arguments that are "direct" arguments
* aggtransfn transition function
* aggfinalfn final function (0 if none)
* aggsortop associated sort operator (0 if none)
@@ -41,6 +43,8 @@
CATALOG(pg_aggregate,2600) BKI_WITHOUT_OIDS
{
regproc aggfnoid;
+ char aggkind;
+ int16 aggnumdirectargs;
regproc aggtransfn;
regproc aggfinalfn;
Oid aggsortop;
@@ -64,14 +68,31 @@ typedef FormData_pg_aggregate *Form_pg_aggregate;
* ----------------
*/
-#define Natts_pg_aggregate 7
-#define Anum_pg_aggregate_aggfnoid 1
-#define Anum_pg_aggregate_aggtransfn 2
-#define Anum_pg_aggregate_aggfinalfn 3
-#define Anum_pg_aggregate_aggsortop 4
-#define Anum_pg_aggregate_aggtranstype 5
-#define Anum_pg_aggregate_aggtransspace 6
-#define Anum_pg_aggregate_agginitval 7
+#define Natts_pg_aggregate 9
+#define Anum_pg_aggregate_aggfnoid 1
+#define Anum_pg_aggregate_aggkind 2
+#define Anum_pg_aggregate_aggnumdirectargs 3
+#define Anum_pg_aggregate_aggtransfn 4
+#define Anum_pg_aggregate_aggfinalfn 5
+#define Anum_pg_aggregate_aggsortop 6
+#define Anum_pg_aggregate_aggtranstype 7
+#define Anum_pg_aggregate_aggtransspace 8
+#define Anum_pg_aggregate_agginitval 9
+
+/*
+ * Symbolic values for aggkind column. We distinguish normal aggregates
+ * from ordered-set aggregates (which have two sets of arguments, namely
+ * direct and aggregated arguments) and from hypothetical-set aggregates
+ * (which are a subclass of ordered-set aggregates in which the last
+ * direct arguments have to match up in number and datatypes with the
+ * aggregated arguments).
+ */
+#define AGGKIND_NORMAL 'n'
+#define AGGKIND_ORDERED_SET 'o'
+#define AGGKIND_HYPOTHETICAL 'h'
+
+/* Use this macro to test for "ordered-set agg including hypothetical case" */
+#define AGGKIND_IS_ORDERED_SET(kind) ((kind) != AGGKIND_NORMAL)
/* ----------------
@@ -80,175 +101,192 @@ typedef FormData_pg_aggregate *Form_pg_aggregate;
*/
/* avg */
-DATA(insert ( 2100 int8_avg_accum numeric_avg 0 2281 128 _null_ ));
-DATA(insert ( 2101 int4_avg_accum int8_avg 0 1016 0 "{0,0}" ));
-DATA(insert ( 2102 int2_avg_accum int8_avg 0 1016 0 "{0,0}" ));
-DATA(insert ( 2103 numeric_avg_accum numeric_avg 0 2281 128 _null_ ));
-DATA(insert ( 2104 float4_accum float8_avg 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2105 float8_accum float8_avg 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2106 interval_accum interval_avg 0 1187 0 "{0 second,0 second}" ));
+DATA(insert ( 2100 n 0 int8_avg_accum numeric_avg 0 2281 128 _null_ ));
+DATA(insert ( 2101 n 0 int4_avg_accum int8_avg 0 1016 0 "{0,0}" ));
+DATA(insert ( 2102 n 0 int2_avg_accum int8_avg 0 1016 0 "{0,0}" ));
+DATA(insert ( 2103 n 0 numeric_avg_accum numeric_avg 0 2281 128 _null_ ));
+DATA(insert ( 2104 n 0 float4_accum float8_avg 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2105 n 0 float8_accum float8_avg 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2106 n 0 interval_accum interval_avg 0 1187 0 "{0 second,0 second}" ));
/* sum */
-DATA(insert ( 2107 int8_avg_accum numeric_sum 0 2281 128 _null_ ));
-DATA(insert ( 2108 int4_sum - 0 20 0 _null_ ));
-DATA(insert ( 2109 int2_sum - 0 20 0 _null_ ));
-DATA(insert ( 2110 float4pl - 0 700 0 _null_ ));
-DATA(insert ( 2111 float8pl - 0 701 0 _null_ ));
-DATA(insert ( 2112 cash_pl - 0 790 0 _null_ ));
-DATA(insert ( 2113 interval_pl - 0 1186 0 _null_ ));
-DATA(insert ( 2114 numeric_avg_accum numeric_sum 0 2281 128 _null_ ));
+DATA(insert ( 2107 n 0 int8_avg_accum numeric_sum 0 2281 128 _null_ ));
+DATA(insert ( 2108 n 0 int4_sum - 0 20 0 _null_ ));
+DATA(insert ( 2109 n 0 int2_sum - 0 20 0 _null_ ));
+DATA(insert ( 2110 n 0 float4pl - 0 700 0 _null_ ));
+DATA(insert ( 2111 n 0 float8pl - 0 701 0 _null_ ));
+DATA(insert ( 2112 n 0 cash_pl - 0 790 0 _null_ ));
+DATA(insert ( 2113 n 0 interval_pl - 0 1186 0 _null_ ));
+DATA(insert ( 2114 n 0 numeric_avg_accum numeric_sum 0 2281 128 _null_ ));
/* max */
-DATA(insert ( 2115 int8larger - 413 20 0 _null_ ));
-DATA(insert ( 2116 int4larger - 521 23 0 _null_ ));
-DATA(insert ( 2117 int2larger - 520 21 0 _null_ ));
-DATA(insert ( 2118 oidlarger - 610 26 0 _null_ ));
-DATA(insert ( 2119 float4larger - 623 700 0 _null_ ));
-DATA(insert ( 2120 float8larger - 674 701 0 _null_ ));
-DATA(insert ( 2121 int4larger - 563 702 0 _null_ ));
-DATA(insert ( 2122 date_larger - 1097 1082 0 _null_ ));
-DATA(insert ( 2123 time_larger - 1112 1083 0 _null_ ));
-DATA(insert ( 2124 timetz_larger - 1554 1266 0 _null_ ));
-DATA(insert ( 2125 cashlarger - 903 790 0 _null_ ));
-DATA(insert ( 2126 timestamp_larger - 2064 1114 0 _null_ ));
-DATA(insert ( 2127 timestamptz_larger - 1324 1184 0 _null_ ));
-DATA(insert ( 2128 interval_larger - 1334 1186 0 _null_ ));
-DATA(insert ( 2129 text_larger - 666 25 0 _null_ ));
-DATA(insert ( 2130 numeric_larger - 1756 1700 0 _null_ ));
-DATA(insert ( 2050 array_larger - 1073 2277 0 _null_ ));
-DATA(insert ( 2244 bpchar_larger - 1060 1042 0 _null_ ));
-DATA(insert ( 2797 tidlarger - 2800 27 0 _null_ ));
-DATA(insert ( 3526 enum_larger - 3519 3500 0 _null_ ));
+DATA(insert ( 2115 n 0 int8larger - 413 20 0 _null_ ));
+DATA(insert ( 2116 n 0 int4larger - 521 23 0 _null_ ));
+DATA(insert ( 2117 n 0 int2larger - 520 21 0 _null_ ));
+DATA(insert ( 2118 n 0 oidlarger - 610 26 0 _null_ ));
+DATA(insert ( 2119 n 0 float4larger - 623 700 0 _null_ ));
+DATA(insert ( 2120 n 0 float8larger - 674 701 0 _null_ ));
+DATA(insert ( 2121 n 0 int4larger - 563 702 0 _null_ ));
+DATA(insert ( 2122 n 0 date_larger - 1097 1082 0 _null_ ));
+DATA(insert ( 2123 n 0 time_larger - 1112 1083 0 _null_ ));
+DATA(insert ( 2124 n 0 timetz_larger - 1554 1266 0 _null_ ));
+DATA(insert ( 2125 n 0 cashlarger - 903 790 0 _null_ ));
+DATA(insert ( 2126 n 0 timestamp_larger - 2064 1114 0 _null_ ));
+DATA(insert ( 2127 n 0 timestamptz_larger - 1324 1184 0 _null_ ));
+DATA(insert ( 2128 n 0 interval_larger - 1334 1186 0 _null_ ));
+DATA(insert ( 2129 n 0 text_larger - 666 25 0 _null_ ));
+DATA(insert ( 2130 n 0 numeric_larger - 1756 1700 0 _null_ ));
+DATA(insert ( 2050 n 0 array_larger - 1073 2277 0 _null_ ));
+DATA(insert ( 2244 n 0 bpchar_larger - 1060 1042 0 _null_ ));
+DATA(insert ( 2797 n 0 tidlarger - 2800 27 0 _null_ ));
+DATA(insert ( 3526 n 0 enum_larger - 3519 3500 0 _null_ ));
/* min */
-DATA(insert ( 2131 int8smaller - 412 20 0 _null_ ));
-DATA(insert ( 2132 int4smaller - 97 23 0 _null_ ));
-DATA(insert ( 2133 int2smaller - 95 21 0 _null_ ));
-DATA(insert ( 2134 oidsmaller - 609 26 0 _null_ ));
-DATA(insert ( 2135 float4smaller - 622 700 0 _null_ ));
-DATA(insert ( 2136 float8smaller - 672 701 0 _null_ ));
-DATA(insert ( 2137 int4smaller - 562 702 0 _null_ ));
-DATA(insert ( 2138 date_smaller - 1095 1082 0 _null_ ));
-DATA(insert ( 2139 time_smaller - 1110 1083 0 _null_ ));
-DATA(insert ( 2140 timetz_smaller - 1552 1266 0 _null_ ));
-DATA(insert ( 2141 cashsmaller - 902 790 0 _null_ ));
-DATA(insert ( 2142 timestamp_smaller - 2062 1114 0 _null_ ));
-DATA(insert ( 2143 timestamptz_smaller - 1322 1184 0 _null_ ));
-DATA(insert ( 2144 interval_smaller - 1332 1186 0 _null_ ));
-DATA(insert ( 2145 text_smaller - 664 25 0 _null_ ));
-DATA(insert ( 2146 numeric_smaller - 1754 1700 0 _null_ ));
-DATA(insert ( 2051 array_smaller - 1072 2277 0 _null_ ));
-DATA(insert ( 2245 bpchar_smaller - 1058 1042 0 _null_ ));
-DATA(insert ( 2798 tidsmaller - 2799 27 0 _null_ ));
-DATA(insert ( 3527 enum_smaller - 3518 3500 0 _null_ ));
+DATA(insert ( 2131 n 0 int8smaller - 412 20 0 _null_ ));
+DATA(insert ( 2132 n 0 int4smaller - 97 23 0 _null_ ));
+DATA(insert ( 2133 n 0 int2smaller - 95 21 0 _null_ ));
+DATA(insert ( 2134 n 0 oidsmaller - 609 26 0 _null_ ));
+DATA(insert ( 2135 n 0 float4smaller - 622 700 0 _null_ ));
+DATA(insert ( 2136 n 0 float8smaller - 672 701 0 _null_ ));
+DATA(insert ( 2137 n 0 int4smaller - 562 702 0 _null_ ));
+DATA(insert ( 2138 n 0 date_smaller - 1095 1082 0 _null_ ));
+DATA(insert ( 2139 n 0 time_smaller - 1110 1083 0 _null_ ));
+DATA(insert ( 2140 n 0 timetz_smaller - 1552 1266 0 _null_ ));
+DATA(insert ( 2141 n 0 cashsmaller - 902 790 0 _null_ ));
+DATA(insert ( 2142 n 0 timestamp_smaller - 2062 1114 0 _null_ ));
+DATA(insert ( 2143 n 0 timestamptz_smaller - 1322 1184 0 _null_ ));
+DATA(insert ( 2144 n 0 interval_smaller - 1332 1186 0 _null_ ));
+DATA(insert ( 2145 n 0 text_smaller - 664 25 0 _null_ ));
+DATA(insert ( 2146 n 0 numeric_smaller - 1754 1700 0 _null_ ));
+DATA(insert ( 2051 n 0 array_smaller - 1072 2277 0 _null_ ));
+DATA(insert ( 2245 n 0 bpchar_smaller - 1058 1042 0 _null_ ));
+DATA(insert ( 2798 n 0 tidsmaller - 2799 27 0 _null_ ));
+DATA(insert ( 3527 n 0 enum_smaller - 3518 3500 0 _null_ ));
/* count */
-DATA(insert ( 2147 int8inc_any - 0 20 0 "0" ));
-DATA(insert ( 2803 int8inc - 0 20 0 "0" ));
+DATA(insert ( 2147 n 0 int8inc_any - 0 20 0 "0" ));
+DATA(insert ( 2803 n 0 int8inc - 0 20 0 "0" ));
/* var_pop */
-DATA(insert ( 2718 int8_accum numeric_var_pop 0 2281 128 _null_ ));
-DATA(insert ( 2719 int4_accum numeric_var_pop 0 2281 128 _null_ ));
-DATA(insert ( 2720 int2_accum numeric_var_pop 0 2281 128 _null_ ));
-DATA(insert ( 2721 float4_accum float8_var_pop 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2722 float8_accum float8_var_pop 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2723 numeric_accum numeric_var_pop 0 2281 128 _null_ ));
+DATA(insert ( 2718 n 0 int8_accum numeric_var_pop 0 2281 128 _null_ ));
+DATA(insert ( 2719 n 0 int4_accum numeric_var_pop 0 2281 128 _null_ ));
+DATA(insert ( 2720 n 0 int2_accum numeric_var_pop 0 2281 128 _null_ ));
+DATA(insert ( 2721 n 0 float4_accum float8_var_pop 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2722 n 0 float8_accum float8_var_pop 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2723 n 0 numeric_accum numeric_var_pop 0 2281 128 _null_ ));
/* var_samp */
-DATA(insert ( 2641 int8_accum numeric_var_samp 0 2281 128 _null_ ));
-DATA(insert ( 2642 int4_accum numeric_var_samp 0 2281 128 _null_ ));
-DATA(insert ( 2643 int2_accum numeric_var_samp 0 2281 128 _null_ ));
-DATA(insert ( 2644 float4_accum float8_var_samp 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2645 float8_accum float8_var_samp 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2646 numeric_accum numeric_var_samp 0 2281 128 _null_ ));
+DATA(insert ( 2641 n 0 int8_accum numeric_var_samp 0 2281 128 _null_ ));
+DATA(insert ( 2642 n 0 int4_accum numeric_var_samp 0 2281 128 _null_ ));
+DATA(insert ( 2643 n 0 int2_accum numeric_var_samp 0 2281 128 _null_ ));
+DATA(insert ( 2644 n 0 float4_accum float8_var_samp 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2645 n 0 float8_accum float8_var_samp 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2646 n 0 numeric_accum numeric_var_samp 0 2281 128 _null_ ));
/* variance: historical Postgres syntax for var_samp */
-DATA(insert ( 2148 int8_accum numeric_var_samp 0 2281 128 _null_ ));
-DATA(insert ( 2149 int4_accum numeric_var_samp 0 2281 128 _null_ ));
-DATA(insert ( 2150 int2_accum numeric_var_samp 0 2281 128 _null_ ));
-DATA(insert ( 2151 float4_accum float8_var_samp 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2152 float8_accum float8_var_samp 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2153 numeric_accum numeric_var_samp 0 2281 128 _null_ ));
+DATA(insert ( 2148 n 0 int8_accum numeric_var_samp 0 2281 128 _null_ ));
+DATA(insert ( 2149 n 0 int4_accum numeric_var_samp 0 2281 128 _null_ ));
+DATA(insert ( 2150 n 0 int2_accum numeric_var_samp 0 2281 128 _null_ ));
+DATA(insert ( 2151 n 0 float4_accum float8_var_samp 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2152 n 0 float8_accum float8_var_samp 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2153 n 0 numeric_accum numeric_var_samp 0 2281 128 _null_ ));
/* stddev_pop */
-DATA(insert ( 2724 int8_accum numeric_stddev_pop 0 2281 128 _null_ ));
-DATA(insert ( 2725 int4_accum numeric_stddev_pop 0 2281 128 _null_ ));
-DATA(insert ( 2726 int2_accum numeric_stddev_pop 0 2281 128 _null_ ));
-DATA(insert ( 2727 float4_accum float8_stddev_pop 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2728 float8_accum float8_stddev_pop 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2729 numeric_accum numeric_stddev_pop 0 2281 128 _null_ ));
+DATA(insert ( 2724 n 0 int8_accum numeric_stddev_pop 0 2281 128 _null_ ));
+DATA(insert ( 2725 n 0 int4_accum numeric_stddev_pop 0 2281 128 _null_ ));
+DATA(insert ( 2726 n 0 int2_accum numeric_stddev_pop 0 2281 128 _null_ ));
+DATA(insert ( 2727 n 0 float4_accum float8_stddev_pop 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2728 n 0 float8_accum float8_stddev_pop 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2729 n 0 numeric_accum numeric_stddev_pop 0 2281 128 _null_ ));
/* stddev_samp */
-DATA(insert ( 2712 int8_accum numeric_stddev_samp 0 2281 128 _null_ ));
-DATA(insert ( 2713 int4_accum numeric_stddev_samp 0 2281 128 _null_ ));
-DATA(insert ( 2714 int2_accum numeric_stddev_samp 0 2281 128 _null_ ));
-DATA(insert ( 2715 float4_accum float8_stddev_samp 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2716 float8_accum float8_stddev_samp 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2717 numeric_accum numeric_stddev_samp 0 2281 128 _null_ ));
+DATA(insert ( 2712 n 0 int8_accum numeric_stddev_samp 0 2281 128 _null_ ));
+DATA(insert ( 2713 n 0 int4_accum numeric_stddev_samp 0 2281 128 _null_ ));
+DATA(insert ( 2714 n 0 int2_accum numeric_stddev_samp 0 2281 128 _null_ ));
+DATA(insert ( 2715 n 0 float4_accum float8_stddev_samp 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2716 n 0 float8_accum float8_stddev_samp 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2717 n 0 numeric_accum numeric_stddev_samp 0 2281 128 _null_ ));
/* stddev: historical Postgres syntax for stddev_samp */
-DATA(insert ( 2154 int8_accum numeric_stddev_samp 0 2281 128 _null_ ));
-DATA(insert ( 2155 int4_accum numeric_stddev_samp 0 2281 128 _null_ ));
-DATA(insert ( 2156 int2_accum numeric_stddev_samp 0 2281 128 _null_ ));
-DATA(insert ( 2157 float4_accum float8_stddev_samp 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2158 float8_accum float8_stddev_samp 0 1022 0 "{0,0,0}" ));
-DATA(insert ( 2159 numeric_accum numeric_stddev_samp 0 2281 128 _null_ ));
+DATA(insert ( 2154 n 0 int8_accum numeric_stddev_samp 0 2281 128 _null_ ));
+DATA(insert ( 2155 n 0 int4_accum numeric_stddev_samp 0 2281 128 _null_ ));
+DATA(insert ( 2156 n 0 int2_accum numeric_stddev_samp 0 2281 128 _null_ ));
+DATA(insert ( 2157 n 0 float4_accum float8_stddev_samp 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2158 n 0 float8_accum float8_stddev_samp 0 1022 0 "{0,0,0}" ));
+DATA(insert ( 2159 n 0 numeric_accum numeric_stddev_samp 0 2281 128 _null_ ));
/* SQL2003 binary regression aggregates */
-DATA(insert ( 2818 int8inc_float8_float8 - 0 20 0 "0" ));
-DATA(insert ( 2819 float8_regr_accum float8_regr_sxx 0 1022 0 "{0,0,0,0,0,0}" ));
-DATA(insert ( 2820 float8_regr_accum float8_regr_syy 0 1022 0 "{0,0,0,0,0,0}" ));
-DATA(insert ( 2821 float8_regr_accum float8_regr_sxy 0 1022 0 "{0,0,0,0,0,0}" ));
-DATA(insert ( 2822 float8_regr_accum float8_regr_avgx 0 1022 0 "{0,0,0,0,0,0}" ));
-DATA(insert ( 2823 float8_regr_accum float8_regr_avgy 0 1022 0 "{0,0,0,0,0,0}" ));
-DATA(insert ( 2824 float8_regr_accum float8_regr_r2 0 1022 0 "{0,0,0,0,0,0}" ));
-DATA(insert ( 2825 float8_regr_accum float8_regr_slope 0 1022 0 "{0,0,0,0,0,0}" ));
-DATA(insert ( 2826 float8_regr_accum float8_regr_intercept 0 1022 0 "{0,0,0,0,0,0}" ));
-DATA(insert ( 2827 float8_regr_accum float8_covar_pop 0 1022 0 "{0,0,0,0,0,0}" ));
-DATA(insert ( 2828 float8_regr_accum float8_covar_samp 0 1022 0 "{0,0,0,0,0,0}" ));
-DATA(insert ( 2829 float8_regr_accum float8_corr 0 1022 0 "{0,0,0,0,0,0}" ));
+DATA(insert ( 2818 n 0 int8inc_float8_float8 - 0 20 0 "0" ));
+DATA(insert ( 2819 n 0 float8_regr_accum float8_regr_sxx 0 1022 0 "{0,0,0,0,0,0}" ));
+DATA(insert ( 2820 n 0 float8_regr_accum float8_regr_syy 0 1022 0 "{0,0,0,0,0,0}" ));
+DATA(insert ( 2821 n 0 float8_regr_accum float8_regr_sxy 0 1022 0 "{0,0,0,0,0,0}" ));
+DATA(insert ( 2822 n 0 float8_regr_accum float8_regr_avgx 0 1022 0 "{0,0,0,0,0,0}" ));
+DATA(insert ( 2823 n 0 float8_regr_accum float8_regr_avgy 0 1022 0 "{0,0,0,0,0,0}" ));
+DATA(insert ( 2824 n 0 float8_regr_accum float8_regr_r2 0 1022 0 "{0,0,0,0,0,0}" ));
+DATA(insert ( 2825 n 0 float8_regr_accum float8_regr_slope 0 1022 0 "{0,0,0,0,0,0}" ));
+DATA(insert ( 2826 n 0 float8_regr_accum float8_regr_intercept 0 1022 0 "{0,0,0,0,0,0}" ));
+DATA(insert ( 2827 n 0 float8_regr_accum float8_covar_pop 0 1022 0 "{0,0,0,0,0,0}" ));
+DATA(insert ( 2828 n 0 float8_regr_accum float8_covar_samp 0 1022 0 "{0,0,0,0,0,0}" ));
+DATA(insert ( 2829 n 0 float8_regr_accum float8_corr 0 1022 0 "{0,0,0,0,0,0}" ));
/* boolean-and and boolean-or */
-DATA(insert ( 2517 booland_statefunc - 58 16 0 _null_ ));
-DATA(insert ( 2518 boolor_statefunc - 59 16 0 _null_ ));
-DATA(insert ( 2519 booland_statefunc - 58 16 0 _null_ ));
+DATA(insert ( 2517 n 0 booland_statefunc - 58 16 0 _null_ ));
+DATA(insert ( 2518 n 0 boolor_statefunc - 59 16 0 _null_ ));
+DATA(insert ( 2519 n 0 booland_statefunc - 58 16 0 _null_ ));
/* bitwise integer */
-DATA(insert ( 2236 int2and - 0 21 0 _null_ ));
-DATA(insert ( 2237 int2or - 0 21 0 _null_ ));
-DATA(insert ( 2238 int4and - 0 23 0 _null_ ));
-DATA(insert ( 2239 int4or - 0 23 0 _null_ ));
-DATA(insert ( 2240 int8and - 0 20 0 _null_ ));
-DATA(insert ( 2241 int8or - 0 20 0 _null_ ));
-DATA(insert ( 2242 bitand - 0 1560 0 _null_ ));
-DATA(insert ( 2243 bitor - 0 1560 0 _null_ ));
+DATA(insert ( 2236 n 0 int2and - 0 21 0 _null_ ));
+DATA(insert ( 2237 n 0 int2or - 0 21 0 _null_ ));
+DATA(insert ( 2238 n 0 int4and - 0 23 0 _null_ ));
+DATA(insert ( 2239 n 0 int4or - 0 23 0 _null_ ));
+DATA(insert ( 2240 n 0 int8and - 0 20 0 _null_ ));
+DATA(insert ( 2241 n 0 int8or - 0 20 0 _null_ ));
+DATA(insert ( 2242 n 0 bitand - 0 1560 0 _null_ ));
+DATA(insert ( 2243 n 0 bitor - 0 1560 0 _null_ ));
/* xml */
-DATA(insert ( 2901 xmlconcat2 - 0 142 0 _null_ ));
+DATA(insert ( 2901 n 0 xmlconcat2 - 0 142 0 _null_ ));
/* array */
-DATA(insert ( 2335 array_agg_transfn array_agg_finalfn 0 2281 0 _null_ ));
+DATA(insert ( 2335 n 0 array_agg_transfn array_agg_finalfn 0 2281 0 _null_ ));
/* text */
-DATA(insert ( 3538 string_agg_transfn string_agg_finalfn 0 2281 0 _null_ ));
+DATA(insert ( 3538 n 0 string_agg_transfn string_agg_finalfn 0 2281 0 _null_ ));
/* bytea */
-DATA(insert ( 3545 bytea_string_agg_transfn bytea_string_agg_finalfn 0 2281 0 _null_ ));
+DATA(insert ( 3545 n 0 bytea_string_agg_transfn bytea_string_agg_finalfn 0 2281 0 _null_ ));
/* json */
-DATA(insert ( 3175 json_agg_transfn json_agg_finalfn 0 2281 0 _null_ ));
+DATA(insert ( 3175 n 0 json_agg_transfn json_agg_finalfn 0 2281 0 _null_ ));
+
+/* ordered-set and hypothetical-set aggregates */
+DATA(insert ( 3972 o 1 ordered_set_transition percentile_disc_final 0 2281 0 _null_ ));
+DATA(insert ( 3974 o 1 ordered_set_transition percentile_cont_float8_final 0 2281 0 _null_ ));
+DATA(insert ( 3976 o 1 ordered_set_transition percentile_cont_interval_final 0 2281 0 _null_ ));
+DATA(insert ( 3978 o 1 ordered_set_transition percentile_disc_multi_final 0 2281 0 _null_ ));
+DATA(insert ( 3980 o 1 ordered_set_transition percentile_cont_float8_multi_final 0 2281 0 _null_ ));
+DATA(insert ( 3982 o 1 ordered_set_transition percentile_cont_interval_multi_final 0 2281 0 _null_ ));
+DATA(insert ( 3984 o 0 ordered_set_transition mode_final 0 2281 0 _null_ ));
+DATA(insert ( 3986 h 1 ordered_set_transition_multi rank_final 0 2281 0 _null_ ));
+DATA(insert ( 3988 h 1 ordered_set_transition_multi percent_rank_final 0 2281 0 _null_ ));
+DATA(insert ( 3990 h 1 ordered_set_transition_multi cume_dist_final 0 2281 0 _null_ ));
+DATA(insert ( 3992 h 1 ordered_set_transition_multi dense_rank_final 0 2281 0 _null_ ));
+
/*
* prototypes for functions in pg_aggregate.c
*/
extern Oid AggregateCreate(const char *aggName,
Oid aggNamespace,
+ char aggKind,
int numArgs,
+ int numDirectArgs,
oidvector *parameterTypes,
Datum allParameterTypes,
Datum parameterModes,
Datum parameterNames,
List *parameterDefaults,
+ Oid variadicArgType,
List *aggtransfnName,
List *aggfinalfnName,
List *aggsortopName,
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index 78efaa5f23..a49cfdbdde 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -130,6 +130,7 @@ DATA(insert OID = 96 ( "=" PGNSP PGUID b t t 23 23 16 96 518 int4eq eqsel e
DESCR("equal");
DATA(insert OID = 97 ( "<" PGNSP PGUID b f f 23 23 16 521 525 int4lt scalarltsel scalarltjoinsel ));
DESCR("less than");
+#define Int4LessOperator 97
DATA(insert OID = 98 ( "=" PGNSP PGUID b t t 25 25 16 98 531 texteq eqsel eqjoinsel ));
DESCR("equal");
#define TextEqualOperator 98
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 0117500a8a..05d7ba5407 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -4756,10 +4756,65 @@ DESCR("SP-GiST support for quad tree over range");
DATA(insert OID = 3473 ( spg_range_quad_leaf_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2281 2281" _null_ _null_ _null_ _null_ spg_range_quad_leaf_consistent _null_ _null_ _null_ ));
DESCR("SP-GiST support for quad tree over range");
-
/* event triggers */
DATA(insert OID = 3566 ( pg_event_trigger_dropped_objects PGNSP PGUID 12 10 100 0 0 f f f f t t s 0 0 2249 "" "{26,26,23,25,25,25,25}" "{o,o,o,o,o,o,o}" "{classid, objid, objsubid, object_type, schema_name, object_name, object_identity}" _null_ pg_event_trigger_dropped_objects _null_ _null_ _null_ ));
DESCR("list objects dropped by the current command");
+
+/* generic transition functions for ordered-set aggregates */
+DATA(insert OID = 3970 ( ordered_set_transition PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 2276" _null_ _null_ _null_ _null_ ordered_set_transition _null_ _null_ _null_ ));
+DESCR("aggregate transition function");
+DATA(insert OID = 3971 ( ordered_set_transition_multi PGNSP PGUID 12 1 0 2276 0 f f f f f f i 2 0 2281 "2281 2276" "{2281,2276}" "{i,v}" _null_ _null_ ordered_set_transition_multi _null_ _null_ _null_ ));
+DESCR("aggregate transition function");
+
+/* inverse distribution aggregates (and their support functions) */
+DATA(insert OID = 3972 ( percentile_disc PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 2283 "701 2283" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("discrete percentile");
+DATA(insert OID = 3973 ( percentile_disc_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 2283 "2281 701 2283" _null_ _null_ _null_ _null_ percentile_disc_final _null_ _null_ _null_ ));
+DESCR("aggregate final function");
+DATA(insert OID = 3974 ( percentile_cont PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("continuous distribution percentile");
+DATA(insert OID = 3975 ( percentile_cont_float8_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 701 "2281 701 701" _null_ _null_ _null_ _null_ percentile_cont_float8_final _null_ _null_ _null_ ));
+DESCR("aggregate final function");
+DATA(insert OID = 3976 ( percentile_cont PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 1186 "701 1186" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("continuous distribution percentile");
+DATA(insert OID = 3977 ( percentile_cont_interval_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 1186 "2281 701 1186" _null_ _null_ _null_ _null_ percentile_cont_interval_final _null_ _null_ _null_ ));
+DESCR("aggregate final function");
+DATA(insert OID = 3978 ( percentile_disc PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 2277 "1022 2283" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("multiple discrete percentiles");
+DATA(insert OID = 3979 ( percentile_disc_multi_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 2277 "2281 1022 2283" _null_ _null_ _null_ _null_ percentile_disc_multi_final _null_ _null_ _null_ ));
+DESCR("aggregate final function");
+DATA(insert OID = 3980 ( percentile_cont PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 1022 "1022 701" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("multiple continuous percentiles");
+DATA(insert OID = 3981 ( percentile_cont_float8_multi_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 1022 "2281 1022 701" _null_ _null_ _null_ _null_ percentile_cont_float8_multi_final _null_ _null_ _null_ ));
+DESCR("aggregate final function");
+DATA(insert OID = 3982 ( percentile_cont PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 1187 "1022 1186" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("multiple continuous percentiles");
+DATA(insert OID = 3983 ( percentile_cont_interval_multi_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 1187 "2281 1022 1186" _null_ _null_ _null_ _null_ percentile_cont_interval_multi_final _null_ _null_ _null_ ));
+DESCR("aggregate final function");
+DATA(insert OID = 3984 ( mode PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 2283 "2283" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("most common value");
+DATA(insert OID = 3985 ( mode_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2283 "2281 2283" _null_ _null_ _null_ _null_ mode_final _null_ _null_ _null_ ));
+DESCR("aggregate final function");
+
+/* hypothetical-set aggregates (and their support functions) */
+DATA(insert OID = 3986 ( rank PGNSP PGUID 12 1 0 2276 0 t f f f f f i 1 0 20 "2276" "{2276}" "{v}" _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("rank of hypothetical row");
+DATA(insert OID = 3987 ( rank_final PGNSP PGUID 12 1 0 2276 0 f f f f f f i 2 0 20 "2281 2276" "{2281,2276}" "{i,v}" _null_ _null_ hypothetical_rank_final _null_ _null_ _null_ ));
+DESCR("aggregate final function");
+DATA(insert OID = 3988 ( percent_rank PGNSP PGUID 12 1 0 2276 0 t f f f f f i 1 0 701 "2276" "{2276}" "{v}" _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("fractional rank of hypothetical row");
+DATA(insert OID = 3989 ( percent_rank_final PGNSP PGUID 12 1 0 2276 0 f f f f f f i 2 0 701 "2281 2276" "{2281,2276}" "{i,v}" _null_ _null_ hypothetical_percent_rank_final _null_ _null_ _null_ ));
+DESCR("aggregate final function");
+DATA(insert OID = 3990 ( cume_dist PGNSP PGUID 12 1 0 2276 0 t f f f f f i 1 0 701 "2276" "{2276}" "{v}" _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("cumulative distribution of hypothetical row");
+DATA(insert OID = 3991 ( cume_dist_final PGNSP PGUID 12 1 0 2276 0 f f f f f f i 2 0 701 "2281 2276" "{2281,2276}" "{i,v}" _null_ _null_ hypothetical_cume_dist_final _null_ _null_ _null_ ));
+DESCR("aggregate final function");
+DATA(insert OID = 3992 ( dense_rank PGNSP PGUID 12 1 0 2276 0 t f f f f f i 1 0 20 "2276" "{2276}" "{v}" _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("rank of hypothetical row without gaps");
+DATA(insert OID = 3993 ( dense_rank_final PGNSP PGUID 12 1 0 2276 0 f f f f f f i 2 0 20 "2281 2276" "{2281,2276}" "{i,v}" _null_ _null_ hypothetical_dense_rank_final _null_ _null_ _null_ ));
+DESCR("aggregate final function");
+
+
/*
* Symbolic values for provolatile column: these indicate whether the result
* of a function is dependent *only* on the values of its explicit arguments,
diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h
index f8ceb5da2e..16817b68e7 100644
--- a/src/include/commands/defrem.h
+++ b/src/include/commands/defrem.h
@@ -63,6 +63,7 @@ extern void interpret_function_parameter_list(List *parameters,
ArrayType **parameterModes,
ArrayType **parameterNames,
List **parameterDefaults,
+ Oid *variadicArgType,
Oid *requiredResultType);
/* commands/operatorcmds.c */
diff --git a/src/include/fmgr.h b/src/include/fmgr.h
index 1f72e1bd48..2b41746b56 100644
--- a/src/include/fmgr.h
+++ b/src/include/fmgr.h
@@ -18,8 +18,12 @@
#ifndef FMGR_H
#define FMGR_H
-/* We don't want to include primnodes.h here, so make a stub reference */
+/* We don't want to include primnodes.h here, so make some stub references */
typedef struct Node *fmNodePtr;
+typedef struct Aggref *fmAggrefPtr;
+
+/* Likewise, avoid including execnodes.h here */
+typedef struct ExprContext *fmExprContextPtr;
/* Likewise, avoid including stringinfo.h here */
typedef struct StringInfoData *fmStringInfo;
@@ -640,8 +644,8 @@ extern void **find_rendezvous_variable(const char *varName);
/*
* Support for aggregate functions
*
- * This is actually in executor/nodeAgg.c, but we declare it here since the
- * whole point is for callers of it to not be overly friendly with nodeAgg.
+ * These are actually in executor/nodeAgg.c, but we declare them here since
+ * the whole point is for callers to not be overly friendly with nodeAgg.
*/
/* AggCheckCallContext can return one of the following codes, or 0: */
@@ -650,6 +654,9 @@ extern void **find_rendezvous_variable(const char *varName);
extern int AggCheckCallContext(FunctionCallInfo fcinfo,
MemoryContext *aggcontext);
+extern fmAggrefPtr AggGetAggref(FunctionCallInfo fcinfo);
+extern fmExprContextPtr AggGetPerTupleEContext(FunctionCallInfo fcinfo);
+extern fmExprContextPtr AggGetPerAggEContext(FunctionCallInfo fcinfo);
/*
* We allow plugin modules to hook function entry/exit. This is intended
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index 5a4034729c..2a7b36e148 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -141,7 +141,7 @@ typedef struct ExprContext
/* Link to containing EState (NULL if a standalone ExprContext) */
struct EState *ecxt_estate;
- /* Functions to call back when ExprContext is shut down */
+ /* Functions to call back when ExprContext is shut down or rescanned */
ExprContext_CB *ecxt_callbacks;
} ExprContext;
@@ -587,8 +587,9 @@ typedef struct WholeRowVarExprState
typedef struct AggrefExprState
{
ExprState xprstate;
- List *args; /* states of argument expressions */
- ExprState *aggfilter; /* FILTER expression */
+ List *aggdirectargs; /* states of direct-argument expressions */
+ List *args; /* states of aggregated-argument expressions */
+ ExprState *aggfilter; /* state of FILTER expression, if any */
int aggno; /* ID number for agg within its plan node */
} AggrefExprState;
@@ -1704,6 +1705,7 @@ typedef struct AggState
AggStatePerAgg peragg; /* per-Aggref information */
MemoryContext aggcontext; /* memory context for long-lived data */
ExprContext *tmpcontext; /* econtext for input expressions */
+ AggStatePerAgg curperagg; /* identifies currently active aggregate */
bool agg_done; /* indicates completion of Agg scan */
/* these fields are used in AGG_PLAIN and AGG_SORTED modes: */
AggStatePerGroup pergroup; /* per-Aggref-per-group working state */
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 6a5a8c5f2d..e89d93034f 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -281,7 +281,8 @@ typedef struct CollateClause
/*
* FuncCall - a function or aggregate invocation
*
- * agg_order (if not NIL) indicates we saw 'foo(... ORDER BY ...)'.
+ * agg_order (if not NIL) indicates we saw 'foo(... ORDER BY ...)', or if
+ * agg_within_group is true, it was 'foo(...) WITHIN GROUP (ORDER BY ...)'.
* agg_star indicates we saw a 'foo(*)' construct, while agg_distinct
* indicates we saw 'foo(DISTINCT ...)'. In any of these cases, the
* construct *must* be an aggregate call. Otherwise, it might be either an
@@ -298,6 +299,7 @@ typedef struct FuncCall
List *args; /* the arguments (list of exprs) */
List *agg_order; /* ORDER BY (list of SortBy) */
Node *agg_filter; /* FILTER clause, if any */
+ bool agg_within_group; /* ORDER BY appeared in WITHIN GROUP */
bool agg_star; /* argument was really '*' */
bool agg_distinct; /* arguments were labeled DISTINCT */
bool func_variadic; /* last argument was labeled VARIADIC */
diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h
index 791853730b..16144d4576 100644
--- a/src/include/nodes/primnodes.h
+++ b/src/include/nodes/primnodes.h
@@ -225,8 +225,9 @@ typedef struct Param
/*
* Aggref
*
- * The aggregate's args list is a targetlist, ie, a list of TargetEntry nodes
- * (before Postgres 9.0 it was just bare expressions). The non-resjunk TLEs
+ * The aggregate's args list is a targetlist, ie, a list of TargetEntry nodes.
+ *
+ * For a normal (non-ordered-set) aggregate, the non-resjunk TargetEntries
* represent the aggregate's regular arguments (if any) and resjunk TLEs can
* be added at the end to represent ORDER BY expressions that are not also
* arguments. As in a top-level Query, the TLEs can be marked with
@@ -236,6 +237,12 @@ typedef struct Param
* they are passed to the transition function. The grammar only allows a
* simple "DISTINCT" specifier for the arguments, but we use the full
* query-level representation to allow more code sharing.
+ *
+ * For an ordered-set aggregate, the args list represents the WITHIN GROUP
+ * (aggregated) arguments, all of which will be listed in the aggorder list.
+ * DISTINCT is not supported in this case, so aggdistinct will be NIL.
+ * The direct arguments appear in aggdirectargs (as a list of plain
+ * expressions, not TargetEntry nodes).
*/
typedef struct Aggref
{
@@ -244,12 +251,14 @@ typedef struct Aggref
Oid aggtype; /* type Oid of result of the aggregate */
Oid aggcollid; /* OID of collation of result */
Oid inputcollid; /* OID of collation that function should use */
- List *args; /* arguments and sort expressions */
+ List *aggdirectargs; /* direct arguments, if an ordered-set agg */
+ List *args; /* aggregated arguments and sort expressions */
List *aggorder; /* ORDER BY (list of SortGroupClause) */
List *aggdistinct; /* DISTINCT (list of SortGroupClause) */
- Expr *aggfilter; /* FILTER expression */
+ Expr *aggfilter; /* FILTER expression, if any */
bool aggstar; /* TRUE if argument list was really '*' */
bool aggvariadic; /* TRUE if VARIADIC was used in call */
+ char aggkind; /* aggregate kind (see pg_aggregate.h) */
Index agglevelsup; /* > 0 if agg belongs to outer query */
int location; /* token location, or -1 if unknown */
} Aggref;
@@ -265,7 +274,7 @@ typedef struct WindowFunc
Oid wincollid; /* OID of collation of result */
Oid inputcollid; /* OID of collation that function should use */
List *args; /* arguments to the window function */
- Expr *aggfilter; /* FILTER expression */
+ Expr *aggfilter; /* FILTER expression, if any */
Index winref; /* index of associated WindowClause */
bool winstar; /* TRUE if argument list was really '*' */
bool winagg; /* is function a simple aggregate? */
diff --git a/src/include/nodes/relation.h b/src/include/nodes/relation.h
index 6d7b5948cd..a9219e0be9 100644
--- a/src/include/nodes/relation.h
+++ b/src/include/nodes/relation.h
@@ -47,15 +47,16 @@ typedef struct QualCost
/*
* Costing aggregate function execution requires these statistics about
- * the aggregates to be executed by a given Agg node. Note that transCost
- * includes the execution costs of the aggregates' input expressions.
+ * the aggregates to be executed by a given Agg node. Note that the costs
+ * include the execution costs of the aggregates' argument expressions as
+ * well as the aggregate functions themselves.
*/
typedef struct AggClauseCosts
{
int numAggs; /* total number of aggregate functions */
- int numOrderedAggs; /* number that use DISTINCT or ORDER BY */
+ int numOrderedAggs; /* number w/ DISTINCT/ORDER BY/WITHIN GROUP */
QualCost transCost; /* total per-input-row execution costs */
- Cost finalCost; /* total costs of agg final functions */
+ Cost finalCost; /* total per-aggregated-row costs */
Size transitionSpace; /* space for pass-by-ref transition data */
} AggClauseCosts;
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 8bd34d6e8f..ab2715629c 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -412,6 +412,7 @@ PG_KEYWORD("where", WHERE, RESERVED_KEYWORD)
PG_KEYWORD("whitespace", WHITESPACE_P, UNRESERVED_KEYWORD)
PG_KEYWORD("window", WINDOW, RESERVED_KEYWORD)
PG_KEYWORD("with", WITH, RESERVED_KEYWORD)
+PG_KEYWORD("within", WITHIN, UNRESERVED_KEYWORD)
PG_KEYWORD("without", WITHOUT, UNRESERVED_KEYWORD)
PG_KEYWORD("work", WORK, UNRESERVED_KEYWORD)
PG_KEYWORD("wrapper", WRAPPER, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_agg.h b/src/include/parser/parse_agg.h
index b6d9dd37b0..487d5cc889 100644
--- a/src/include/parser/parse_agg.h
+++ b/src/include/parser/parse_agg.h
@@ -23,8 +23,17 @@ extern void transformWindowFuncCall(ParseState *pstate, WindowFunc *wfunc,
extern void parseCheckAggregates(ParseState *pstate, Query *qry);
+extern int get_aggregate_argtypes(Aggref *aggref, Oid *inputTypes);
+
+extern Oid resolve_aggregate_transtype(Oid aggfuncid,
+ Oid aggtranstype,
+ Oid *inputTypes,
+ int numArguments);
+
extern void build_aggregate_fnexprs(Oid *agg_input_types,
int agg_num_inputs,
+ int agg_num_direct_inputs,
+ bool agg_ordered_set,
bool agg_variadic,
Oid agg_state_type,
Oid agg_result_type,
diff --git a/src/include/parser/parse_clause.h b/src/include/parser/parse_clause.h
index 9bdb03347a..18f338d340 100644
--- a/src/include/parser/parse_clause.h
+++ b/src/include/parser/parse_clause.h
@@ -42,6 +42,9 @@ extern List *transformDistinctClause(ParseState *pstate,
extern List *transformDistinctOnClause(ParseState *pstate, List *distinctlist,
List **targetlist, List *sortClause);
+extern List *addTargetToSortList(ParseState *pstate, TargetEntry *tle,
+ List *sortlist, List *targetlist, SortBy *sortby,
+ bool resolveUnknown);
extern Index assignSortGroupRef(TargetEntry *tle, List *tlist);
extern bool targetIsInSortList(TargetEntry *tle, Oid sortop, List *sortList);
diff --git a/src/include/parser/parse_func.h b/src/include/parser/parse_func.h
index d33eef3482..f28fd9974c 100644
--- a/src/include/parser/parse_func.h
+++ b/src/include/parser/parse_func.h
@@ -43,9 +43,7 @@ typedef enum
extern Node *ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
- List *agg_order, Expr *agg_filter,
- bool agg_star, bool agg_distinct, bool func_variadic,
- WindowDef *over, bool is_column, int location);
+ FuncCall *fn, int location);
extern FuncDetailCode func_get_detail(List *funcname,
List *fargs, List *fargnames,
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 1bfd145da5..4ad900ed2c 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -515,6 +515,21 @@ extern Datum oidvectorgt(PG_FUNCTION_ARGS);
extern oidvector *buildoidvector(const Oid *oids, int n);
extern Oid oidparse(Node *node);
+/* orderedsetaggs.c */
+extern Datum ordered_set_transition(PG_FUNCTION_ARGS);
+extern Datum ordered_set_transition_multi(PG_FUNCTION_ARGS);
+extern Datum percentile_disc_final(PG_FUNCTION_ARGS);
+extern Datum percentile_cont_float8_final(PG_FUNCTION_ARGS);
+extern Datum percentile_cont_interval_final(PG_FUNCTION_ARGS);
+extern Datum percentile_disc_multi_final(PG_FUNCTION_ARGS);
+extern Datum percentile_cont_float8_multi_final(PG_FUNCTION_ARGS);
+extern Datum percentile_cont_interval_multi_final(PG_FUNCTION_ARGS);
+extern Datum mode_final(PG_FUNCTION_ARGS);
+extern Datum hypothetical_rank_final(PG_FUNCTION_ARGS);
+extern Datum hypothetical_percent_rank_final(PG_FUNCTION_ARGS);
+extern Datum hypothetical_cume_dist_final(PG_FUNCTION_ARGS);
+extern Datum hypothetical_dense_rank_final(PG_FUNCTION_ARGS);
+
/* pseudotypes.c */
extern Datum cstring_in(PG_FUNCTION_ARGS);
extern Datum cstring_out(PG_FUNCTION_ARGS);
diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h
index 49f459ad58..dfba74c47d 100644
--- a/src/include/utils/lsyscache.h
+++ b/src/include/utils/lsyscache.h
@@ -90,6 +90,7 @@ extern Oid get_func_namespace(Oid funcid);
extern Oid get_func_rettype(Oid funcid);
extern int get_func_nargs(Oid funcid);
extern Oid get_func_signature(Oid funcid, Oid **argtypes, int *nargs);
+extern Oid get_func_variadictype(Oid funcid);
extern bool get_func_retset(Oid funcid);
extern bool func_strict(Oid funcid);
extern char func_volatile(Oid funcid);
diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h
index 25fa6de18e..5f87254881 100644
--- a/src/include/utils/tuplesort.h
+++ b/src/include/utils/tuplesort.h
@@ -99,6 +99,9 @@ extern IndexTuple tuplesort_getindextuple(Tuplesortstate *state, bool forward,
extern bool tuplesort_getdatum(Tuplesortstate *state, bool forward,
Datum *val, bool *isNull);
+extern bool tuplesort_skiptuples(Tuplesortstate *state, int64 ntuples,
+ bool forward);
+
extern void tuplesort_end(Tuplesortstate *state);
extern void tuplesort_get_stats(Tuplesortstate *state,