mirror of
https://github.com/postgres/postgres.git
synced 2025-11-29 23:43:17 +03:00
Replace time_t with pg_time_t (same values, but always int64) in on-disk
data structures and backend internal APIs. This solves problems we've seen recently with inconsistent layout of pg_control between machines that have 32-bit time_t and those that have already migrated to 64-bit time_t. Also, we can get out from under the problem that Windows' Unix-API emulation is not consistent about the width of time_t. There are a few remaining places where local time_t variables are used to hold the current or recent result of time(NULL). I didn't bother changing these since they do not affect any cross-module APIs and surely all platforms will have 64-bit time_t before overflow becomes an actual risk. time_t should be avoided for anything visible to extension modules, however.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/date.c,v 1.138 2008/01/01 19:45:52 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/date.c,v 1.139 2008/02/17 02:09:28 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -945,8 +945,10 @@ tm2time(struct pg_tm * tm, fsec_t fsec, TimeADT *result)
|
||||
|
||||
/* time2tm()
|
||||
* Convert time data type to POSIX time structure.
|
||||
* For dates within the system-supported time_t range, convert to the
|
||||
* local time zone. If out of this range, leave as GMT. - tgl 97/05/27
|
||||
*
|
||||
* For dates within the range of pg_time_t, convert to the local time zone.
|
||||
* If out of this range, leave as UTC (in practice that could only happen
|
||||
* if pg_time_t is just 32 bits) - thomas 97/05/27
|
||||
*/
|
||||
static int
|
||||
time2tm(TimeADT time, struct pg_tm * tm, fsec_t *fsec)
|
||||
@@ -2466,10 +2468,9 @@ timetz_zone(PG_FUNCTION_ARGS)
|
||||
if (tzp)
|
||||
{
|
||||
/* Get the offset-from-GMT that is valid today for the selected zone */
|
||||
pg_time_t now;
|
||||
pg_time_t now = (pg_time_t) time(NULL);
|
||||
struct pg_tm *tm;
|
||||
|
||||
now = time(NULL);
|
||||
tm = pg_localtime(&now, tzp);
|
||||
tz = -tm->tm_gmtoff;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.184 2008/01/01 19:45:52 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.185 2008/02/17 02:09:28 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -650,9 +650,11 @@ ParseDateTime(const char *timestr, char *workbuf, size_t buflen,
|
||||
* "20011225T040506.789-07"
|
||||
*
|
||||
* Use the system-provided functions to get the current time zone
|
||||
* if not specified in the input string.
|
||||
* If the date is outside the time_t system-supported time range,
|
||||
* then assume UTC time zone. - thomas 1997-05-27
|
||||
* if not specified in the input string.
|
||||
*
|
||||
* If the date is outside the range of pg_time_t (in practice that could only
|
||||
* happen if pg_time_t is just 32 bits), then assume UTC time zone - thomas
|
||||
* 1997-05-27
|
||||
*/
|
||||
int
|
||||
DecodeDateTime(char **field, int *ftype, int nf,
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.152 2008/01/01 19:45:52 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.153 2008/02/17 02:09:28 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -86,6 +86,8 @@ static void parsetinterval(char *i_string,
|
||||
* GetCurrentAbsoluteTime()
|
||||
*
|
||||
* Get the current system time (relative to Unix epoch).
|
||||
*
|
||||
* NB: this will overflow in 2038; it should be gone long before that.
|
||||
*/
|
||||
AbsoluteTime
|
||||
GetCurrentAbsoluteTime(void)
|
||||
@@ -1029,12 +1031,7 @@ tintervalrel(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
timenow(PG_FUNCTION_ARGS)
|
||||
{
|
||||
time_t sec;
|
||||
|
||||
if (time(&sec) < 0)
|
||||
PG_RETURN_ABSOLUTETIME(INVALID_ABSTIME);
|
||||
|
||||
PG_RETURN_ABSOLUTETIME((AbsoluteTime) sec);
|
||||
PG_RETURN_ABSOLUTETIME(GetCurrentAbsoluteTime());
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.184 2008/01/01 19:45:52 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.185 2008/02/17 02:09:28 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -1264,9 +1264,14 @@ TimestampDifferenceExceeds(TimestampTz start_time,
|
||||
*
|
||||
* We do not use time_t internally in Postgres, but this is provided for use
|
||||
* by functions that need to interpret, say, a stat(2) result.
|
||||
*
|
||||
* To avoid having the function's ABI vary depending on the width of time_t,
|
||||
* we declare the argument as pg_time_t, which is cast-compatible with
|
||||
* time_t but always 64 bits wide (unless the platform has no 64-bit type).
|
||||
* This detail should be invisible to callers, at least at source code level.
|
||||
*/
|
||||
TimestampTz
|
||||
time_t_to_timestamptz(time_t tm)
|
||||
time_t_to_timestamptz(pg_time_t tm)
|
||||
{
|
||||
TimestampTz result;
|
||||
|
||||
@@ -1284,17 +1289,22 @@ time_t_to_timestamptz(time_t tm)
|
||||
* Convert a TimestampTz to time_t.
|
||||
*
|
||||
* This too is just marginally useful, but some places need it.
|
||||
*
|
||||
* To avoid having the function's ABI vary depending on the width of time_t,
|
||||
* we declare the result as pg_time_t, which is cast-compatible with
|
||||
* time_t but always 64 bits wide (unless the platform has no 64-bit type).
|
||||
* This detail should be invisible to callers, at least at source code level.
|
||||
*/
|
||||
time_t
|
||||
pg_time_t
|
||||
timestamptz_to_time_t(TimestampTz t)
|
||||
{
|
||||
time_t result;
|
||||
pg_time_t result;
|
||||
|
||||
#ifdef HAVE_INT64_TIMESTAMP
|
||||
result = (time_t) (t / USECS_PER_SEC +
|
||||
result = (pg_time_t) (t / USECS_PER_SEC +
|
||||
((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY));
|
||||
#else
|
||||
result = (time_t) (t +
|
||||
result = (pg_time_t) (t +
|
||||
((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY));
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user