diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 4f1a5902f0acd29243e6fb80e37959f7ca5e08ed..c6e5b269cded2ee58866ec32ad4d4ac2d3cbf151 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -368,7 +368,12 @@ ExecAgg(Agg *node) char *args[2]; AggFuncInfo *aggfns = &aggFuncInfo[i]; - if (aggfns->finalfn && nTuplesAgged > 0) { + if (noInitValue[i]) { + /* + * No values found for this agg; return current state. + * This seems to fix behavior for avg() aggregate. -tgl 12/96 + */ + } else if (aggfns->finalfn && nTuplesAgged > 0) { if (aggfns->finalfn_nargs > 1) { args[0] = (char*)value1[i]; args[1] = (char*)value2[i]; diff --git a/src/backend/optimizer/geqo/geqo_eval.c b/src/backend/optimizer/geqo/geqo_eval.c index 72a10ee9dfc3f0a9900a08888f28cd04b0ea9823..cec12ae0ea54cd2de03264ef2e98fc663eb76c6d 100644 --- a/src/backend/optimizer/geqo/geqo_eval.c +++ b/src/backend/optimizer/geqo/geqo_eval.c @@ -5,7 +5,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: geqo_eval.c,v 1.6 1997/03/03 23:26:45 scrappy Exp $ + * $Id: geqo_eval.c,v 1.7 1997/04/03 19:55:35 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -23,7 +23,9 @@ #include <math.h> #ifdef HAVE_LIMITS_H # include <limits.h> -# define MAXINT INT_MAX +# ifndef MAXINT +# define MAXINT INT_MAX +# endif #else # include <values.h> #endif diff --git a/src/backend/tcop/aclchk.c b/src/backend/tcop/aclchk.c index 20748e16c6a720f9e87b1831b9a0fd545549f04b..7ca6bdd33b8a75cd16b5e3c102396d636a20d7d8 100644 --- a/src/backend/tcop/aclchk.c +++ b/src/backend/tcop/aclchk.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/tcop/Attic/aclchk.c,v 1.7 1997/03/12 20:48:17 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/Attic/aclchk.c,v 1.8 1997/04/03 19:55:12 scrappy Exp $ * * NOTES * See acl.h. @@ -277,7 +277,7 @@ aclcheck(Acl *acl, AclId id, AclIdType idtype, AclMode mode) * the system never creates an empty ACL. */ if (num < 1) { -#ifdef ACLDEBUG_TRACE || 1 +#if ACLDEBUG_TRACE || 1 elog(DEBUG, "aclcheck: zero-length ACL, returning 1"); #endif return ACLCHECK_OK; diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h index b2d9b4afb994b9f696a3607bd1f8651ce0f53d26..dcf7a79df637de0c89496497484e9e0d380d953b 100644 --- a/src/include/catalog/pg_aggregate.h +++ b/src/include/catalog/pg_aggregate.h @@ -7,7 +7,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: pg_aggregate.h,v 1.4 1997/04/02 18:36:09 scrappy Exp $ + * $Id: pg_aggregate.h,v 1.5 1997/04/03 19:56:19 scrappy Exp $ * * NOTES * the genbki.sh script reads this file and generates .bki @@ -19,7 +19,7 @@ #define PG_AGGREGATE_H /* ---------------- - * postgres.h contains the system type definintions and the + * postgres.h contains the system type definitions and the * CATALOG(), BOOTSTRAP and DATA() sugar words so this file * can be read by both genbki.sh and the C compiler. * ---------------- @@ -87,15 +87,15 @@ typedef FormData_pg_aggregate *Form_pg_aggregate; * --------------- */ -DATA(insert OID = 0 ( avg PGUID int4pl int4inc int4div 23 23 23 23 0 0 )); -DATA(insert OID = 0 ( avg PGUID int2pl int2inc int2div 21 21 21 21 0 0 )); -DATA(insert OID = 0 ( avg PGUID float4pl float4inc float4div 700 700 700 700 0.0 0.0 )); -DATA(insert OID = 0 ( avg PGUID float8pl float8inc float8div 701 701 701 701 0.0 0.0 )); +DATA(insert OID = 0 ( avg PGUID int4pl int4inc int4div 23 23 23 23 _null_ 0 )); +DATA(insert OID = 0 ( avg PGUID int2pl int2inc int2div 21 21 21 21 _null_ 0 )); +DATA(insert OID = 0 ( avg PGUID float4pl float4inc float4div 700 700 700 700 _null_ 0.0 )); +DATA(insert OID = 0 ( avg PGUID float8pl float8inc float8div 701 701 701 701 _null_ 0.0 )); -DATA(insert OID = 0 ( sum PGUID int4pl - - 23 23 0 23 0 _null_ )); -DATA(insert OID = 0 ( sum PGUID int2pl - - 21 21 0 21 0 _null_ )); -DATA(insert OID = 0 ( sum PGUID float4pl - - 700 700 0 700 0.0 _null_ )); -DATA(insert OID = 0 ( sum PGUID float8pl - - 701 701 0 701 0.0 _null_ )); +DATA(insert OID = 0 ( sum PGUID int4pl - - 23 23 0 23 _null_ _null_ )); +DATA(insert OID = 0 ( sum PGUID int2pl - - 21 21 0 21 _null_ _null_ )); +DATA(insert OID = 0 ( sum PGUID float4pl - - 700 700 0 700 _null_ _null_ )); +DATA(insert OID = 0 ( sum PGUID float8pl - - 701 701 0 701 _null_ _null_ )); DATA(insert OID = 0 ( max PGUID int4larger - - 23 23 0 23 _null_ _null_ )); DATA(insert OID = 0 ( max PGUID int2larger - - 21 21 0 21 _null_ _null_ )); @@ -113,10 +113,10 @@ DATA(insert OID = 0 ( min PGUID int4smaller - - 702 702 0 702 _null_ _nul DATA(insert OID = 0 ( min PGUID date_smaller - - 1082 1082 0 1082 _null_ _null_ )); DATA(insert OID = 0 ( min PGUID float8smaller - - 1084 1084 0 1084 _null_ _null_ )); -DATA(insert OID = 0 ( count PGUID - int4inc - 0 0 23 23 _null_ 0 )); +DATA(insert OID = 0 ( count PGUID - int4inc - 0 0 23 23 _null_ 0 )); /* - * prototypes for fucnctions in pg_aggregate.c + * prototypes for functions in pg_aggregate.c */ extern void AggregateCreate(char *aggName, char *aggtransfn1Name, @@ -131,7 +131,3 @@ extern char *AggNameGetInitVal(char *aggName, Oid basetype, int xfuncno, bool *isNull); #endif /* PG_AGGREGATE_H */ - - - - diff --git a/src/update6_0-6_1.sh b/src/update6_0-6_1.sh new file mode 100644 index 0000000000000000000000000000000000000000..44b3c9aa7b9c130a22ab0a86eb709035f24c1edd --- /dev/null +++ b/src/update6_0-6_1.sh @@ -0,0 +1,56 @@ +#!/bin/sh +# update +# Script to apply patches to existing databases +# to upgrade from Postgres v6.0 to v6.1. +echo "" +echo "This utility does a minimal upgrade for existing v6.0 databases." +echo "Note that several new features and functions in Postgres" +echo " will not be available unless the databases are reloaded" +echo " from a clean install of v6.1." +echo "" +echo "This update script is not necessary for new or reloaded databases," +echo " but will not damage them. You should update existing v6.1beta" +echo " databases created on or before 1997-04-04 (when the patches for" +echo " aggregate functions were applied to the v6.1beta source tree)." +echo "" +echo "Features present with this simple update include:" +echo " - aggregate operators sum() and avg() behave correctly with NULLs" +echo " - the point distance operator '<===>' returns float8 rather than int4" +echo " - some duplicate function OIDs are renumbered to eliminate conflicts" +echo "" +echo "Features unavailable with only this simple update include:" +echo " - new string handling functions a la Oracle/Ingres" +echo " - new date and time data types and expanded functionality" +echo " - some new function overloading to simplify function names" +echo "" +echo "Note that if v6.0 databases are not reloaded from a clean install of v6.1" +echo " or if this update is not applied to existing v6.0 databases:" +echo " - aggregate functions avg() and sum() may divide-by-zero for int4 data types" +# +srcdir=`pwd` +srcsql="update6_0-6_1.sql" +CMDSQL="psql" +SRCSQL="$srcdir/$srcsql" +# +if [ -z $SRCSQL ]; then + echo "unable to locate $SRCSQL" + exit 1 +fi +# +echo "" +echo "updating databases found in $PGDATA/base" +echo "" +# +cd $PGDATA/base +for d in * +do + echo "updating $d at `date` ..." + echo "try $CMDSQL $d < $SRCSQL" + $CMDSQL $d < $SRCSQL + echo "completed updating $d at `date`" +done +# +echo "" +echo "completed all updates at `date`" +echo "" +exit diff --git a/src/update6_0-6_1.sql b/src/update6_0-6_1.sql new file mode 100644 index 0000000000000000000000000000000000000000..e60e8d93cbe0735b988d9bab75586ada0af088f6 --- /dev/null +++ b/src/update6_0-6_1.sql @@ -0,0 +1,47 @@ +-- Aggregate functions +-- Thomas Lockhart +-- This fixes the behavior of built-in aggregate functions avg() and sum(). +-- Code tested on postgres95 v1.0.9, postgres v6.0, and postgres v6.1b-970315. +-- Original definitions return zero rather than null for empty set attributes. +-- Postgres source code says that null behavior for aggregates is not correct, +-- but does describe the correct behavior for pass-by-reference data types +-- if it is given null initial values (from pg_aggregate). +-- Note that pass-by-value data types (e.g. int4) require a simple source code +-- change in backend/executor/nodeAgg.c to avoid divide-by-zero results. +-- If this SQL update is applied without making the corresponding source code +-- patch, then floating point types will work correctly but integer types will +-- divide-by-zero. +-- If the source code patch is applied but this SQL update is not, then there +-- will be divide-by-zero results for floating point types. + +-- For aggregate attributes, the correct behavior is as follows: +-- count(*) should return a count of all tuples, null or otherwise +-- count(col) should return a count of all non-null values, zero if none +-- avg(col), sum(col), etc should ignore null fields and return null if there +-- are no non-null inputs +-- Ref: the original Date book + +update pg_aggregate set agginitval1=null + where aggname = 'avg' or aggname = 'sum'; + +-- Geometric functions +-- Thomas Lockhart +-- This replaces the distance operator with one returning a floating point number. +-- The original operator 'pointdist' returned an integer. +-- There is no corresponding source code change required for this patch. + +update pg_operator set oprresult = 701, oprcode = 'point_distance'::regproc + where oprname = '<===>' and oprresult = 23; + +-- Date functions +-- Thomas Lockhart +-- This fixes conflicting OIDs within the date and time declarations. + +update pg_proc set oid = 1138::oid where proname = 'date_larger'; +update pg_proc set oid = 1139::oid where proname = 'date_smaller'; +update pg_proc set oid = 1140::oid where proname = 'date_mi'; +update pg_proc set oid = 1141::oid where proname = 'date_pli'; +update pg_proc set oid = 1142::oid where proname = 'date_mii'; +update pg_proc set oid = 1143::oid where proname = 'timein'; +update pg_proc set oid = 1144::oid where proname = 'timeout'; +update pg_proc set oid = 1145::oid where proname = 'time_eq';