Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pkg/sql/delegate/show_enums.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func (d *delegator) delegateShowEnums(n *tree.ShowEnums) (tree.Statement, error)
WITH enums(enumtypid, values) AS (
SELECT
enums.enumtypid AS enumtypid,
array_agg(enums.enumlabel) WITHIN GROUP (ORDER BY (enumsortorder)) AS values
array_agg(enums.enumlabel ORDER BY enums.enumsortorder) AS values
FROM %[1]s.pg_catalog.pg_enum AS enums
GROUP BY enumtypid
)
Expand Down
12 changes: 12 additions & 0 deletions pkg/sql/logictest/testdata/logic_test/aggregate
Original file line number Diff line number Diff line change
Expand Up @@ -3567,6 +3567,18 @@ SELECT percentile_disc(0.50) FROM osagg
statement error ordered-set aggregations must have a WITHIN GROUP clause containing one ORDER BY column
SELECT percentile_cont(0.50) FROM osagg

# Test that WITHIN GROUP is rejected on functions that are not ordered-set
# aggregates (#171236). Covers non-aggregate scalar builtins and general
# aggregates.
statement error pgcode 42809 function concat_ws is not an ordered set aggregate
SELECT concat_ws(',', 'a', 'b') WITHIN GROUP (ORDER BY 1)

statement error pgcode 42809 function abs is not an ordered set aggregate
SELECT abs(-5) WITHIN GROUP (ORDER BY 1)

statement error pgcode 42809 function sum is not an ordered set aggregate
SELECT sum(f) WITHIN GROUP (ORDER BY f) FROM osagg

# Tests for min/max on collated strings.
statement ok
CREATE TABLE t_collate (x STRING COLLATE en_us);
Expand Down
11 changes: 11 additions & 0 deletions pkg/sql/opt/optbuilder/scope.go
Original file line number Diff line number Diff line change
Expand Up @@ -1162,6 +1162,17 @@ func (s *scope) VisitPre(expr tree.Expr) (recurse bool, newExpr tree.Expr) {
panic(err)
}

// WITHIN GROUP is only valid on ordered-set aggregate functions.
if t.AggType == tree.OrderedSetAgg {
if _, found := isOrderedSetAggregate(def); !found {
panic(pgerror.Newf(
pgcode.WrongObjectType,
"function %s is not an ordered set aggregate",
def.Name,
))
}
}

if isGenerator(def) && s.replaceSRFs {
expr = s.replaceSRF(t, def)
break
Expand Down
Loading