Обсуждение: Transition functions for SUM(::int2), SUM(::int4, SUM(::int8])
Is there any reason that int2_sum, int4_sum, and int8_sum are not marked as being strict? All the other transition functions for sum, and every other built in aggregation function is marked as strict, as demonstrated with: select x.proname, t.proname, t.proisstrict from ((pg_aggregate a left join pg_proc x on (a.aggfnoid = x.oid)) left join pg_proc t on (a.aggtransfn = t.oid)) where not t.proisstrict; proname | proname | proisstrict ---------+----------+-------------sum | int2_sum | fsum | int4_sum | fsum | int8_sum | f select x.proname, t.proname, t.proisstrict from ((pg_aggregate a left join pg_proc x on (a.aggfnoid = x.oid)) left join pg_proc t on (a.aggtransfn = t.oid)) where x.proname = 'sum'; proname | proname | proisstrict ---------+-------------+-------------sum | int8_sum | fsum | int4_sum | fsum | int2_sum | fsum |float4pl | tsum | float8pl | tsum | cash_pl | tsum | interval_pl | tsum | numeric_add | t (8 rows) Thanks, Caleb
Caleb Welton <cwelton@greenplum.com> writes: > Is there any reason that int2_sum, int4_sum, and int8_sum are not marked as > being strict? They wouldn't work otherwise, because the transition datatypes aren't the same as the inputs. regards, tom lane
Caleb Welton <cwelton@greenplum.com> writes: > Forgive me if I'm being dense, but could you explain why > int4_sum(bigint,int) must not be strict, but > int4_avg_accum(bytea, int) can be strict? The former is used with a NULL initial value, the latter isn't. Read the fine print in the CREATE AGGREGATE man page about behavior with strict transition functions. regards, tom lane
Thanks Tom, Forgive me if I'm being dense, but could you explain why int4_sum(bigint,int) must not be strict, but int4_avg_accum(bytea, int) can be strict? It seems that both of them have transition datatypes that are different from the input. -Caleb On 1/28/08 7:31 PM, "Tom Lane" <tgl@sss.pgh.pa.us> wrote: > Caleb Welton <cwelton@greenplum.com> writes: >> Is there any reason that int2_sum, int4_sum, and int8_sum are not marked as >> being strict? > > They wouldn't work otherwise, because the transition datatypes aren't > the same as the inputs. > > regards, tom lane