summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2008-02-17 02:09:32 +0000
committerTom Lane2008-02-17 02:09:32 +0000
commitd1956d7c3911dbc4fd349103b0fdd06de8d89968 (patch)
treeeae88e90bd0158e7b228b998be7b5473aaee8917
parentea3612610edaeaacb1d22972e82cdf4ae5fab4be (diff)
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.
-rw-r--r--contrib/pgcrypto/internal.c3
-rw-r--r--src/backend/access/transam/xlog.c24
-rw-r--r--src/backend/postmaster/bgwriter.c20
-rw-r--r--src/backend/postmaster/syslogger.c2
-rw-r--r--src/backend/utils/adt/date.c9
-rw-r--r--src/backend/utils/adt/datetime.c8
-rw-r--r--src/backend/utils/adt/nabstime.c9
-rw-r--r--src/backend/utils/adt/timestamp.c20
-rw-r--r--src/backend/utils/init/globals.c2
-rw-r--r--src/bin/pg_controldata/pg_controldata.c12
-rw-r--r--src/bin/pg_resetxlog/pg_resetxlog.c8
-rw-r--r--src/include/access/xlog_internal.h7
-rw-r--r--src/include/catalog/pg_control.h9
-rw-r--r--src/include/miscadmin.h4
-rw-r--r--src/include/port/win32.h12
-rw-r--r--src/include/utils/timestamp.h4
-rw-r--r--src/tools/msvc/Project.pm2
17 files changed, 81 insertions, 74 deletions
diff --git a/contrib/pgcrypto/internal.c b/contrib/pgcrypto/internal.c
index 171a54ccc0..2d6efb2558 100644
--- a/contrib/pgcrypto/internal.c
+++ b/contrib/pgcrypto/internal.c
@@ -649,7 +649,8 @@ system_reseed(void)
skip = 1;
else if ((t - seed_time) > SYSTEM_RESEED_MAX)
skip = 0;
- else if (!check_time || (t - check_time) > SYSTEM_RESEED_CHECK_TIME)
+ else if (check_time == 0 ||
+ (t - check_time) > SYSTEM_RESEED_CHECK_TIME)
{
check_time = t;
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index ba8a3b6616..6f6be205b4 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -271,7 +271,7 @@ typedef struct XLogCtlWrite
{
XLogwrtResult LogwrtResult; /* current value of LogwrtResult */
int curridx; /* cache index of next block to write */
- time_t lastSegSwitchTime; /* time of last xlog segment switch */
+ pg_time_t lastSegSwitchTime; /* time of last xlog segment switch */
} XLogCtlWrite;
/*
@@ -1553,7 +1553,7 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible, bool xlog_switch)
if (XLogArchivingActive())
XLogArchiveNotifySeg(openLogId, openLogSeg);
- Write->lastSegSwitchTime = time(NULL);
+ Write->lastSegSwitchTime = (pg_time_t) time(NULL);
/*
* Signal bgwriter to start a checkpoint if we've consumed too
@@ -4217,7 +4217,7 @@ BootStrapXLOG(void)
checkPoint.nextOid = FirstBootstrapObjectId;
checkPoint.nextMulti = FirstMultiXactId;
checkPoint.nextMultiOffset = 0;
- checkPoint.time = time(NULL);
+ checkPoint.time = (pg_time_t) time(NULL);
ShmemVariableCache->nextXid = checkPoint.nextXid;
ShmemVariableCache->nextOid = checkPoint.nextOid;
@@ -4972,7 +4972,7 @@ StartupXLOG(void)
ControlFile->checkPointCopy = checkPoint;
if (minRecoveryLoc.xlogid != 0 || minRecoveryLoc.xrecoff != 0)
ControlFile->minRecoveryPoint = minRecoveryLoc;
- ControlFile->time = time(NULL);
+ ControlFile->time = (pg_time_t) time(NULL);
UpdateControlFile();
/*
@@ -5277,7 +5277,7 @@ StartupXLOG(void)
InRecovery = false;
ControlFile->state = DB_IN_PRODUCTION;
- ControlFile->time = time(NULL);
+ ControlFile->time = (pg_time_t) time(NULL);
UpdateControlFile();
/* start the archive_timeout timer running */
@@ -5496,10 +5496,10 @@ GetInsertRecPtr(void)
/*
* Get the time of the last xlog segment switch
*/
-time_t
+pg_time_t
GetLastSegSwitchTime(void)
{
- time_t result;
+ pg_time_t result;
/* Need WALWriteLock, but shared lock is sufficient */
LWLockAcquire(WALWriteLock, LW_SHARED);
@@ -5676,7 +5676,7 @@ CreateCheckPoint(int flags)
if (shutdown)
{
ControlFile->state = DB_SHUTDOWNING;
- ControlFile->time = time(NULL);
+ ControlFile->time = (pg_time_t) time(NULL);
UpdateControlFile();
}
@@ -5690,7 +5690,7 @@ CreateCheckPoint(int flags)
/* Begin filling in the checkpoint WAL record */
MemSet(&checkPoint, 0, sizeof(checkPoint));
checkPoint.ThisTimeLineID = ThisTimeLineID;
- checkPoint.time = time(NULL);
+ checkPoint.time = (pg_time_t) time(NULL);
/*
* We must hold WALInsertLock while examining insert state to determine
@@ -5891,7 +5891,7 @@ CreateCheckPoint(int flags)
ControlFile->prevCheckPoint = ControlFile->checkPoint;
ControlFile->checkPoint = ProcLastRecPtr;
ControlFile->checkPointCopy = checkPoint;
- ControlFile->time = time(NULL);
+ ControlFile->time = (pg_time_t) time(NULL);
UpdateControlFile();
LWLockRelease(ControlFileLock);
@@ -5992,7 +5992,7 @@ RecoveryRestartPoint(const CheckPoint *checkPoint)
* Checking true elapsed time keeps us from doing restartpoints too often
* while rapidly scanning large amounts of WAL.
*/
- elapsed_secs = time(NULL) - ControlFile->time;
+ elapsed_secs = (pg_time_t) time(NULL) - ControlFile->time;
if (elapsed_secs < CheckPointTimeout / 2)
return;
@@ -6028,7 +6028,7 @@ RecoveryRestartPoint(const CheckPoint *checkPoint)
ControlFile->prevCheckPoint = ControlFile->checkPoint;
ControlFile->checkPoint = ReadRecPtr;
ControlFile->checkPointCopy = *checkPoint;
- ControlFile->time = time(NULL);
+ ControlFile->time = (pg_time_t) time(NULL);
UpdateControlFile();
ereport((recoveryLogRestartpoints ? LOG : DEBUG2),
diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c
index 4a1a0552bd..97b6b3c2d4 100644
--- a/src/backend/postmaster/bgwriter.c
+++ b/src/backend/postmaster/bgwriter.c
@@ -163,12 +163,12 @@ static bool am_bg_writer = false;
static bool ckpt_active = false;
/* these values are valid when ckpt_active is true: */
-static time_t ckpt_start_time;
+static pg_time_t ckpt_start_time;
static XLogRecPtr ckpt_start_recptr;
static double ckpt_cached_elapsed;
-static time_t last_checkpoint_time;
-static time_t last_xlog_switch_time;
+static pg_time_t last_checkpoint_time;
+static pg_time_t last_xlog_switch_time;
/* Prototypes for private functions */
@@ -250,7 +250,7 @@ BackgroundWriterMain(void)
/*
* Initialize so that first time-driven event happens at the correct time.
*/
- last_checkpoint_time = last_xlog_switch_time = time(NULL);
+ last_checkpoint_time = last_xlog_switch_time = (pg_time_t) time(NULL);
/*
* Create a resource owner to keep track of our resources (currently only
@@ -361,7 +361,7 @@ BackgroundWriterMain(void)
{
bool do_checkpoint = false;
int flags = 0;
- time_t now;
+ pg_time_t now;
int elapsed_secs;
/*
@@ -407,7 +407,7 @@ BackgroundWriterMain(void)
* occurs without an external request, but we set the CAUSE_TIME flag
* bit even if there is also an external request.
*/
- now = time(NULL);
+ now = (pg_time_t) time(NULL);
elapsed_secs = now - last_checkpoint_time;
if (elapsed_secs >= CheckPointTimeout)
{
@@ -504,13 +504,13 @@ BackgroundWriterMain(void)
static void
CheckArchiveTimeout(void)
{
- time_t now;
- time_t last_time;
+ pg_time_t now;
+ pg_time_t last_time;
if (XLogArchiveTimeout <= 0)
return;
- now = time(NULL);
+ now = (pg_time_t) time(NULL);
/* First we do a quick check using possibly-stale local state. */
if ((int) (now - last_xlog_switch_time) < XLogArchiveTimeout)
@@ -730,7 +730,7 @@ IsCheckpointOnSchedule(double progress)
* Check progress against time elapsed and checkpoint_timeout.
*/
gettimeofday(&now, NULL);
- elapsed_time = ((double) (now.tv_sec - ckpt_start_time) +
+ elapsed_time = ((double) ((pg_time_t) now.tv_sec - ckpt_start_time) +
now.tv_usec / 1000000.0) / CheckPointTimeout;
if (progress < elapsed_time)
diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c
index 9a108b4e62..4f79d01a31 100644
--- a/src/backend/postmaster/syslogger.c
+++ b/src/backend/postmaster/syslogger.c
@@ -331,7 +331,7 @@ SysLoggerMain(int argc, char *argv[])
if (!rotation_requested && Log_RotationAge > 0)
{
/* Do a logfile rotation if it's time */
- pg_time_t now = time(NULL);
+ pg_time_t now = (pg_time_t) time(NULL);
if (now >= next_rotation_time)
rotation_requested = time_based_rotation = true;
diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c
index 745d9d5b2e..0c1bdda174 100644
--- a/src/backend/utils/adt/date.c
+++ b/src/backend/utils/adt/date.c
@@ -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;
}
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
index 8584143905..834aadead4 100644
--- a/src/backend/utils/adt/datetime.c
+++ b/src/backend/utils/adt/datetime.c
@@ -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,
diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c
index f548dee095..992f7ab8b9 100644
--- a/src/backend/utils/adt/nabstime.c
+++ b/src/backend/utils/adt/nabstime.c
@@ -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());
}
/*
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index 2883caf716..9b9087338f 100644
--- a/src/backend/utils/adt/timestamp.c
+++ b/src/backend/utils/adt/timestamp.c
@@ -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
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
index 4f7d2a4308..abe8e67fe0 100644
--- a/src/backend/utils/init/globals.c
+++ b/src/backend/utils/init/globals.c
@@ -33,7 +33,7 @@ volatile uint32 InterruptHoldoffCount = 0;
volatile uint32 CritSectionCount = 0;
int MyProcPid;
-time_t MyStartTime;
+pg_time_t MyStartTime;
struct Port *MyProcPort;
long MyCancelKey;
diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c
index f466784c50..2e6a5dc09a 100644
--- a/src/bin/pg_controldata/pg_controldata.c
+++ b/src/bin/pg_controldata/pg_controldata.c
@@ -69,6 +69,7 @@ main(int argc, char *argv[])
char ControlFilePath[MAXPGPATH];
char *DataDir;
pg_crc32 crc;
+ time_t time_tmp;
char pgctime_str[128];
char ckpttime_str[128];
char sysident_str[32];
@@ -134,13 +135,20 @@ main(int argc, char *argv[])
"is expecting. The results below are untrustworthy.\n\n"));
/*
+ * This slightly-chintzy coding will work as long as the control file
+ * timestamps are within the range of time_t; that should be the case
+ * in all foreseeable circumstances, so we don't bother importing the
+ * backend's timezone library into pg_controldata.
+ *
* Use variable for format to suppress overly-anal-retentive gcc warning
* about %c
*/
+ time_tmp = (time_t) ControlFile.time;
strftime(pgctime_str, sizeof(pgctime_str), strftime_fmt,
- localtime(&(ControlFile.time)));
+ localtime(&time_tmp));
+ time_tmp = (time_t) ControlFile.checkPointCopy.time;
strftime(ckpttime_str, sizeof(ckpttime_str), strftime_fmt,
- localtime(&(ControlFile.checkPointCopy.time)));
+ localtime(&time_tmp));
/*
* Format system_identifier separately to keep platform-dependent format
diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c
index d266817a8c..6e3504baac 100644
--- a/src/bin/pg_resetxlog/pg_resetxlog.c
+++ b/src/bin/pg_resetxlog/pg_resetxlog.c
@@ -471,10 +471,10 @@ GuessControlValues(void)
ControlFile.checkPointCopy.nextOid = FirstBootstrapObjectId;
ControlFile.checkPointCopy.nextMulti = FirstMultiXactId;
ControlFile.checkPointCopy.nextMultiOffset = 0;
- ControlFile.checkPointCopy.time = time(NULL);
+ ControlFile.checkPointCopy.time = (pg_time_t) time(NULL);
ControlFile.state = DB_SHUTDOWNED;
- ControlFile.time = time(NULL);
+ ControlFile.time = (pg_time_t) time(NULL);
ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
ControlFile.maxAlign = MAXIMUM_ALIGNOF;
@@ -603,10 +603,10 @@ RewriteControlFile(void)
ControlFile.checkPointCopy.redo.xlogid = newXlogId;
ControlFile.checkPointCopy.redo.xrecoff =
newXlogSeg * XLogSegSize + SizeOfXLogLongPHD;
- ControlFile.checkPointCopy.time = time(NULL);
+ ControlFile.checkPointCopy.time = (pg_time_t) time(NULL);
ControlFile.state = DB_SHUTDOWNED;
- ControlFile.time = time(NULL);
+ ControlFile.time = (pg_time_t) time(NULL);
ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
ControlFile.prevCheckPoint.xlogid = 0;
ControlFile.prevCheckPoint.xrecoff = 0;
diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h
index 6958518241..d33091f624 100644
--- a/src/include/access/xlog_internal.h
+++ b/src/include/access/xlog_internal.h
@@ -16,10 +16,9 @@
#ifndef XLOG_INTERNAL_H
#define XLOG_INTERNAL_H
-#include <time.h>
-
#include "access/xlog.h"
#include "fmgr.h"
+#include "pgtime.h"
#include "storage/block.h"
#include "storage/relfilenode.h"
@@ -71,7 +70,7 @@ typedef struct XLogContRecord
/*
* Each page of XLOG file has a header like this:
*/
-#define XLOG_PAGE_MAGIC 0xD062 /* can be used as WAL version indicator */
+#define XLOG_PAGE_MAGIC 0xD063 /* can be used as WAL version indicator */
typedef struct XLogPageHeaderData
{
@@ -242,7 +241,7 @@ extern const RmgrData RmgrTable[];
/*
* Exported to support xlog switching from bgwriter
*/
-extern time_t GetLastSegSwitchTime(void);
+extern pg_time_t GetLastSegSwitchTime(void);
extern XLogRecPtr RequestXLogSwitch(void);
/*
diff --git a/src/include/catalog/pg_control.h b/src/include/catalog/pg_control.h
index 25e7777d29..2738cad817 100644
--- a/src/include/catalog/pg_control.h
+++ b/src/include/catalog/pg_control.h
@@ -15,14 +15,13 @@
#ifndef PG_CONTROL_H
#define PG_CONTROL_H
-#include <time.h>
-
#include "access/xlogdefs.h"
+#include "pgtime.h" /* for pg_time_t */
#include "utils/pg_crc.h"
/* Version identifier for this pg_control format */
-#define PG_CONTROL_VERSION 833
+#define PG_CONTROL_VERSION 841
/*
* Body of CheckPoint XLOG records. This is declared here because we keep
@@ -38,7 +37,7 @@ typedef struct CheckPoint
Oid nextOid; /* next free OID */
MultiXactId nextMulti; /* next free MultiXactId */
MultiXactOffset nextMultiOffset; /* next free MultiXact offset */
- time_t time; /* time stamp of checkpoint */
+ pg_time_t time; /* time stamp of checkpoint */
} CheckPoint;
/* XLOG info values for XLOG rmgr */
@@ -99,7 +98,7 @@ typedef struct ControlFileData
* System status data
*/
DBState state; /* see enum above */
- time_t time; /* time stamp of last pg_control update */
+ pg_time_t time; /* time stamp of last pg_control update */
XLogRecPtr checkPoint; /* last check point record ptr */
XLogRecPtr prevCheckPoint; /* previous check point record ptr */
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index 100a8354fd..9c848305e1 100644
--- a/src/include/miscadmin.h
+++ b/src/include/miscadmin.h
@@ -23,7 +23,7 @@
#ifndef MISCADMIN_H
#define MISCADMIN_H
-#include <time.h> /* for time_t */
+#include "pgtime.h" /* for pg_time_t */
#define PG_VERSIONSTR "postgres (PostgreSQL) " PG_VERSION "\n"
@@ -134,7 +134,7 @@ extern int MaxBackends;
extern int MaxConnections;
extern PGDLLIMPORT int MyProcPid;
-extern PGDLLIMPORT time_t MyStartTime;
+extern PGDLLIMPORT pg_time_t MyStartTime;
extern PGDLLIMPORT struct Port *MyProcPort;
extern long MyCancelKey;
diff --git a/src/include/port/win32.h b/src/include/port/win32.h
index bd9f4619d8..fc65515fb5 100644
--- a/src/include/port/win32.h
+++ b/src/include/port/win32.h
@@ -45,17 +45,6 @@
#define USES_WINSOCK
-/*
- * Ensure that anyone building an extension is using a 32 bit time_t.
- * On Mingw/Msys, that should always be the case, but MSVC++ defaults
- * to 64 bits. We set that for our own build in the project files
- */
-#if defined(WIN32_ONLY_COMPILER) && !defined(FRONTEND)
-#ifndef _USE_32BIT_TIME_T
-#error "Postgres uses 32 bit time_t - add #define _USE_32BIT_TIME_T on Windows"
-#endif
-#endif
-
/* defines for dynamic linking on Win32 platform */
#if defined(WIN32) || defined(__CYGWIN__)
@@ -198,6 +187,7 @@ struct itimerval
struct timeval it_interval;
struct timeval it_value;
};
+
int setitimer(int which, const struct itimerval * value, struct itimerval * ovalue);
diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h
index e8603ecbf9..34e6644487 100644
--- a/src/include/utils/timestamp.h
+++ b/src/include/utils/timestamp.h
@@ -310,8 +310,8 @@ extern bool TimestampDifferenceExceeds(TimestampTz start_time,
TimestampTz stop_time,
int msec);
-extern TimestampTz time_t_to_timestamptz(time_t tm);
-extern time_t timestamptz_to_time_t(TimestampTz t);
+extern TimestampTz time_t_to_timestamptz(pg_time_t tm);
+extern pg_time_t timestamptz_to_time_t(TimestampTz t);
extern const char *timestamptz_to_str(TimestampTz t);
diff --git a/src/tools/msvc/Project.pm b/src/tools/msvc/Project.pm
index 14ae7a8052..36e120e066 100644
--- a/src/tools/msvc/Project.pm
+++ b/src/tools/msvc/Project.pm
@@ -494,7 +494,7 @@ sub WriteConfiguration
ConfigurationType="$cfgtype" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" CharacterSet="2" WholeProgramOptimization="$p->{wholeopt}">
<Tool Name="VCCLCompilerTool" Optimization="$p->{opt}"
AdditionalIncludeDirectories="$self->{prefixincludes}src/include;src/include/port/win32;src/include/port/win32_msvc;$self->{includes}"
- PreprocessorDefinitions="WIN32;_WINDOWS;__WINDOWS__;__WIN32__;EXEC_BACKEND;WIN32_STACK_RLIMIT=4194304;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T$self->{defines}$p->{defs}"
+ PreprocessorDefinitions="WIN32;_WINDOWS;__WINDOWS__;__WIN32__;EXEC_BACKEND;WIN32_STACK_RLIMIT=4194304;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE$self->{defines}$p->{defs}"
StringPooling="$p->{strpool}"
RuntimeLibrary="$p->{runtime}" DisableSpecificWarnings="$self->{disablewarnings}"
EOF