Joshua,
I revised. Now Sigres can be activated by setting "sigres = on" in
postgresql.conf.
You can download the version (0.1.2) from
http://sourceforge.jp/projects/sigres .
And, I attach the diff between PostgreSQL-8.2.1 and Sigres-0.1.2 to this
mail.
Thanks for your comments.
-- Hideyuki
Joshua D. Drake wrote:
> Hideyuki Kawashima wrote:
>
>> Joshua,
>>
>> I appreciate your great suggestion!
>> It is great honor for me if Sigres will be merged to PostgreSQL.
>> Since the changes of Sigres from PostgreSQL-8.2.1 are not many,
>> and moreover, all of changes are surrounded with #ifdef SIGRES --- #endif,
>> incorporating Sigres into PostgreSQL would be easy.
>>
>
> The best way is to create a patch against -head and submit that patch
> with a complete description of why, and what. If you have test cases
> that show the improvement all the better.
>
> I would suggest though if you are going to submit the patch that you
> take a look at how you could disable/enable the feature within the
> postgresql.conf via a guc.
>
> Sincerely,
>
> Joshua D. Drake
>
>
>> However, Sigres modifies WAL which is the most important point of DBMS
>> on stability.
>> Although I myself could not find any bugs in Sigres, I am really afraid
>> of it. It a bug exists on Sigres, it puts everyone to huge
>> inconvenience... Therefore, before incorporating Sigres into PostgreSQL,
>> the code must be checked, and the behaviors of Sigres must be checked
>> carefully. Since PostgreSQL is a famous and wide spread software, I
>> strongly want to avoid losing its great reputation. Unfortunately in
>> Japan, I do not know any WAL hackers except for a friend of mine, and he
>> is too busy to check Sigres. So, if pgsql-hackers checks Sigres, I am
>> really happy.
>>
>> Best Regards,
>>
>> -- Hideyuki
>>
>> Joshua D. Drake wrote:
>>
>>> Hideyuki Kawashima wrote:
>>>
>>>
>>>> Joshua,
>>>>
>>>>
>>> :)
>>>
>>>
>>>
>>>> The reason why I made the Sigres is, the advances of recent non volatile
>>>> memories. Just now we do not usually use non volatile memories. But in
>>>> the near future, situation would change. I think if a non volatile
>>>> memories can be considered as a persistence device, PostgreSQL WAL
>>>> mechanism should be modified.
>>>> However, I do not use such devices usually. Thus I made Sigres which
>>>> requires UPS.
>>>>
>>>>
>>> This is actually very interesting. We (www.commandprompt.com) have had
>>> several customers ask us how we can make PostgreSQL more reasonable
>>> within a flash environment.
>>>
>>> I agree with you that in the future you will see many such databases
>>> including PostgreSQL living on these devices.
>>>
>>> Tom? What do you think? Is there some room for movement here within the
>>> postgresql.conf to make something like sigres usable within PostgreSQL
>>> proper?
>>>
>>>
>>>
>>>> Currently I have just ignored XLogWrite and WALWriteLock, but a friend
>>>> of mine (a Japanese great hacker of PostgreSQL) has more idea to improve
>>>> WAL if a battery supplied memory can be considered as a persistent device.
>>>>
>>>>
>>>>
>>> We are coming up very quickly on a feature freeze for the next version
>>> of PostgreSQL. If... we can has something out quickly enough and in a
>>> thought out fashion, the hackers may be willing to accept a patch for
>>> 8.3.. If not there is always 8.4..
>>>
>>> Sincerely,
>>>
>>> Joshua D. Drake
>>>
>>>
>>>
>>>
>>>
>>>
>
>
>
--
Hideyuki Kawashima (Ph.D), University of Tsukuba,
Graduate School of Systems and Information Engineering
Assistant Professor, TEL: +81-29-853-5322
Only in sigres-0.1.2: CHANGELOG
Only in postgresql-8.2.1: README
Only in sigres-0.1.2: README.pgsql
Only in sigres-0.1.2: README.sigres
diff -c -r postgresql-8.2.1/src/backend/access/transam/xlog.c
sigres-0.1.2/src/backend/access/transam/xlog.c
*** postgresql-8.2.1/src/backend/access/transam/xlog.c Fri Dec 1 03:29:11 2006
--- sigres-0.1.2/src/backend/access/transam/xlog.c Fri Feb 16 09:45:05 2007
***************
*** 10,15 ****
--- 10,18 ----
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.258 2006/11/30
18:29:11 tgl Exp $
*
*-------------------------------------------------------------------------
+ *
+ * Extended to Sigres by Hideyuki Kawashima ([EMAIL PROTECTED])
+ *
*/
#include "postgres.h"
***************
*** 142,147 ****
--- 145,154 ----
bool XLOG_DEBUG = false;
#endif
+ /* Entities are in "globals.c", for SIGRES */
+ extern int BgWriterPid;
+ extern bool enableSigres;
+
/*
* XLOGfileslop is used in the code as the allowed "fuzz" in the number of
* preallocated XLOG segments --- we try to have at least XLOGfiles advance
***************
*** 474,480 ****
static bool XLogCheckBuffer(XLogRecData *rdata, bool doPageWrites,
XLogRecPtr *lsn, BkpBlock *bkpb);
static bool AdvanceXLInsertBuffer(bool new_segment);
! static void XLogWrite(XLogwrtRqst WriteRqst, bool flexible, bool xlog_switch);
static int XLogFileInit(uint32 log, uint32 seg,
bool *use_existent, bool use_lock);
static bool InstallXLogFileSegment(uint32 *log, uint32 *seg, char *tmppath,
--- 481,487 ----
static bool XLogCheckBuffer(XLogRecData *rdata, bool doPageWrites,
XLogRecPtr *lsn, BkpBlock *bkpb);
static bool AdvanceXLInsertBuffer(bool new_segment);
! static void _XLogWrite(XLogwrtRqst WriteRqst, bool flexible, bool
xlog_switch);
static int XLogFileInit(uint32 log, uint32 seg,
bool *use_existent, bool use_lock);
static bool InstallXLogFileSegment(uint32 *log, uint32 *seg, char *tmppath,
***************
*** 510,515 ****
--- 517,529 ----
XLogRecPtr *minRecoveryLoc);
static void rm_redo_error_callback(void *arg);
+ #define XLogWrite(WriteRqst, flexible, xlog_switch)
\
+ do {
\
+ if (enableSigres == false)
\
+ _XLogWrite(WriteRqst, flexible, xlog_switch);
\
+ else if ((IsUnderPostmaster && BgWriterPid == MyProcPid) ||
!IsUnderPostmaster) \
+ _XLogWrite(WriteRqst, flexible, xlog_switch);
\
+ } while (0)
/*
* Insert an XLOG record having the specified RMID and info bytes,
***************
*** 727,746 ****
(LogwrtRqst.Write.xrecoff >= LogwrtResult.Write.xrecoff +
XLogCtl->XLogCacheByte / 2))
{
! if (LWLockConditionalAcquire(WALWriteLock, LW_EXCLUSIVE))
! {
! /*
! * Since the amount of data we write here is completely
optional
! * anyway, tell XLogWrite it can be "flexible" and stop
at a
! * convenient boundary. This allows writes triggered
by this
! * mechanism to synchronize with the cache boundaries,
so that in
! * a long transaction we'll basically dump alternating
halves of
! * the buffer array.
! */
! LogwrtResult = XLogCtl->Write.LogwrtResult;
! if (XLByteLT(LogwrtResult.Write, LogwrtRqst.Write))
! XLogWrite(LogwrtRqst, true, false);
! LWLockRelease(WALWriteLock);
}
}
--- 741,762 ----
(LogwrtRqst.Write.xrecoff >= LogwrtResult.Write.xrecoff +
XLogCtl->XLogCacheByte / 2))
{
! if (enableSigres == false) {
! if (LWLockConditionalAcquire(WALWriteLock,
LW_EXCLUSIVE))
! {
! /*
! * Since the amount of data we write here is
completely optional
! * anyway, tell XLogWrite it can be "flexible"
and stop at a
! * convenient boundary. This allows writes
triggered by this
! * mechanism to synchronize with the cache
boundaries, so that in
! * a long transaction we'll basically dump
alternating halves of
! * the buffer array.
! */
! LogwrtResult = XLogCtl->Write.LogwrtResult;
! if (XLByteLT(LogwrtResult.Write,
LogwrtRqst.Write))
! XLogWrite(LogwrtRqst, true, false);
! LWLockRelease(WALWriteLock);
! }
}
}
***************
*** 890,897 ****
RecPtr.xlogid -= 1;
RecPtr.xrecoff = XLogFileSize;
}
!
! LWLockAcquire(WALWriteLock, LW_EXCLUSIVE);
LogwrtResult = XLogCtl->Write.LogwrtResult;
if (!XLByteLE(RecPtr, LogwrtResult.Flush))
{
--- 906,913 ----
RecPtr.xlogid -= 1;
RecPtr.xrecoff = XLogFileSize;
}
! if (enableSigres == false)
! LWLockAcquire(WALWriteLock, LW_EXCLUSIVE);
LogwrtResult = XLogCtl->Write.LogwrtResult;
if (!XLByteLE(RecPtr, LogwrtResult.Flush))
{
***************
*** 901,908 ****
FlushRqst.Flush = RecPtr;
XLogWrite(FlushRqst, false, false);
}
! LWLockRelease(WALWriteLock);
!
END_CRIT_SECTION();
return RecPtr;
--- 917,924 ----
FlushRqst.Flush = RecPtr;
XLogWrite(FlushRqst, false, false);
}
! if (enableSigres == false)
! LWLockRelease(WALWriteLock);
END_CRIT_SECTION();
return RecPtr;
***************
*** 1016,1024 ****
XLogCtlWrite *Write = &XLogCtl->Write;
XLogwrtRqst FlushRqst;
XLogRecPtr OldSegEnd;
!
! LWLockAcquire(WALWriteLock, LW_EXCLUSIVE);
!
/*
* Flush through the end of the page containing XLOG_SWITCH, and
* perform end-of-segment actions (eg, notifying archiver).
--- 1032,1039 ----
XLogCtlWrite *Write = &XLogCtl->Write;
XLogwrtRqst FlushRqst;
XLogRecPtr OldSegEnd;
! if (enableSigres == false)
! LWLockAcquire(WALWriteLock, LW_EXCLUSIVE);
/*
* Flush through the end of the page containing XLOG_SWITCH, and
* perform end-of-segment actions (eg, notifying archiver).
***************
*** 1067,1075 ****
}
Write->LogwrtResult = LogwrtResult;
!
! LWLockRelease(WALWriteLock);
!
updrqst = false; /* done already */
}
else
--- 1082,1089 ----
}
Write->LogwrtResult = LogwrtResult;
! if (enableSigres == false)
! LWLockRelease(WALWriteLock);
updrqst = false; /* done already */
}
else
***************
*** 1376,1382 ****
WriteRqst.Write = OldPageRqstPtr;
WriteRqst.Flush.xlogid = 0;
WriteRqst.Flush.xrecoff = 0;
! XLogWrite(WriteRqst, false, false);
LWLockRelease(WALWriteLock);
Insert->LogwrtResult = LogwrtResult;
}
--- 1390,1396 ----
WriteRqst.Write = OldPageRqstPtr;
WriteRqst.Flush.xlogid = 0;
WriteRqst.Flush.xrecoff = 0;
! _XLogWrite(WriteRqst, false, false); /* SIGRES
*/
LWLockRelease(WALWriteLock);
Insert->LogwrtResult = LogwrtResult;
}
***************
*** 1463,1469 ****
* Must be called with WALWriteLock held.
*/
static void
! XLogWrite(XLogwrtRqst WriteRqst, bool flexible, bool xlog_switch)
{
XLogCtlWrite *Write = &XLogCtl->Write;
bool ispartialpage;
--- 1477,1483 ----
* Must be called with WALWriteLock held.
*/
static void
! _XLogWrite(XLogwrtRqst WriteRqst, bool flexible, bool xlog_switch)
{
XLogCtlWrite *Write = &XLogCtl->Write;
bool ispartialpage;
***************
*** 1581,1587 ****
if (XLOG_DEBUG)
elog(LOG, "time for a
checkpoint, signaling bgwriter");
#endif
! RequestCheckpoint(false, true);
}
}
}
--- 1595,1602 ----
if (XLOG_DEBUG)
elog(LOG, "time for a
checkpoint, signaling bgwriter");
#endif
! if (enableSigres == false)
!
RequestCheckpoint(false, true);
}
}
}
***************
*** 1861,1871 ****
* section. However, calls from bufmgr.c are not within critical
sections
* and so we will not force a restart for a bad LSN on a data page.
*/
! if (XLByteLT(LogwrtResult.Flush, record))
! elog(InRecovery ? WARNING : ERROR,
! "xlog flush request %X/%X is not satisfied --- flushed only to
%X/%X",
! record.xlogid, record.xrecoff,
! LogwrtResult.Flush.xlogid, LogwrtResult.Flush.xrecoff);
}
/*
--- 1876,1887 ----
* section. However, calls from bufmgr.c are not within critical
sections
* and so we will not force a restart for a bad LSN on a data page.
*/
! if (enableSigres == false)
! if (XLByteLT(LogwrtResult.Flush, record))
! elog(InRecovery ? WARNING : ERROR,
! "xlog flush request %X/%X is not
satisfied --- flushed only to %X/%X",
! record.xlogid, record.xrecoff,
! LogwrtResult.Flush.xlogid,
LogwrtResult.Flush.xrecoff);
}
/*
***************
*** 2342,2347 ****
--- 2358,2366 ----
#endif
#endif /* NOT_USED */
+ if (enableSigres == true)
+ issue_xlog_fsync();
+
if (close(openLogFile))
ereport(PANIC,
(errcode_for_file_access(),
***************
*** 5420,5425 ****
--- 5439,5447 ----
void
ShutdownXLOG(int code, Datum arg)
{
+ if (enableSigres == true)
+ enableFsync = true;
+
ereport(LOG,
(errmsg("shutting down")));
***************
*** 5428,5433 ****
--- 5450,5458 ----
ShutdownSUBTRANS();
ShutdownMultiXact();
+ if (enableSigres == true)
+ XLogFileClose();
+
ereport(LOG,
(errmsg("database system is shut down")));
}
***************
*** 6183,6190 ****
* have different checkpoint positions and hence different
history
* file names, even if nothing happened in between.
*/
! RequestCheckpoint(true, false);
!
/*
* Now we need to fetch the checkpoint record location, and
also its
* REDO pointer. The oldest point in WAL that would be needed
to
--- 6208,6215 ----
* have different checkpoint positions and hence different
history
* file names, even if nothing happened in between.
*/
! if (enableSigres == false)
! RequestCheckpoint(true, false);
/*
* Now we need to fetch the checkpoint record location, and
also its
* REDO pointer. The oldest point in WAL that would be needed
to
diff -c -r postgresql-8.2.1/src/backend/commands/dbcommands.c
sigres-0.1.2/src/backend/commands/dbcommands.c
*** postgresql-8.2.1/src/backend/commands/dbcommands.c Mon Nov 6 07:42:08 2006
--- sigres-0.1.2/src/backend/commands/dbcommands.c Fri Feb 16 10:35:01 2007
***************
*** 59,64 ****
--- 59,66 ----
static void remove_dbtablespaces(Oid db_id);
static bool check_db_file_conflict(Oid db_id);
+ /* For Sigres */
+ extern bool enableSigres;
/*
* CREATE DATABASE
***************
*** 504,510 ****
* Perhaps if we ever implement CREATE DATABASE in a less
cheesy way,
* we can avoid this.
*/
! RequestCheckpoint(true, false);
/*
* Close pg_database, but keep lock till commit (this is
important to
--- 506,513 ----
* Perhaps if we ever implement CREATE DATABASE in a less
cheesy way,
* we can avoid this.
*/
! if (enableSigres == false)
! RequestCheckpoint(true, false);
/*
* Close pg_database, but keep lock till commit (this is
important to
diff -c -r postgresql-8.2.1/src/backend/postmaster/bgwriter.c
sigres-0.1.2/src/backend/postmaster/bgwriter.c
*** postgresql-8.2.1/src/backend/postmaster/bgwriter.c Sat Dec 2 04:55:28 2006
--- sigres-0.1.2/src/backend/postmaster/bgwriter.c Fri Feb 16 11:18:06 2007
***************
*** 42,48 ****
*-------------------------------------------------------------------------
*/
#include "postgres.h"
-
#include <signal.h>
#include <time.h>
#include <unistd.h>
--- 42,47 ----
***************
*** 63,68 ****
--- 62,75 ----
#include "utils/memutils.h"
#include "utils/resowner.h"
+ #include "debug.h"
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
+
+ /* For Sigres */
+ extern int BgWriterPid; /* Entity is in "globals.c" */
+ extern bool enableSigres; /* Entity is in "globals.c" */
/*----------
* Shared memory area for communication between bgwriter and backends
***************
*** 171,176 ****
--- 178,193 ----
BgWriterShmem->bgwriter_pid = MyProcPid;
am_bg_writer = true;
+ if (enableSigres == true)
+ {
+ int fd;
+
+ if ((fd = open(BGWRITER_PIDFILE, O_WRONLY|O_TRUNC|O_CREAT, 0644)) == -1)
ERR;
+ if (write(fd, &MyProcPid, sizeof(int)) == -1) ERR;
+ if (close(fd) == -1) ERR;
+ BgWriterPid = MyProcPid;
+ }
+
/*
* If possible, make this process a group leader, so that the postmaster
* can signal any child processes too. (bgwriter probably never has
***************
*** 321,326 ****
--- 338,379 ----
*/
PG_SETMASK(&UnBlockSig);
+ if (enableSigres == true) {
+ for (;;) {
+ if (!PostmasterIsAlive(true))
+ exit(1);
+
+ /*
+ * Process any requests or signals received recently.
+ */
+ AbsorbFsyncRequests();
+
+ if (got_SIGHUP)
+ {
+ got_SIGHUP = false;
+ ProcessConfigFile(PGC_SIGHUP);
+ }
+ if (shutdown_requested)
+ {
+ /*
+ * From here on, elog(ERROR) should end with
exit(1), not send
+ * control back to the sigsetjmp block above
+ */
+ ExitOnAnyError = true;
+ /* Close down the database */
+ ShutdownXLOG(0, 0);
+ DumpFreeSpaceMap(0, 0);
+
+ remove(BGWRITER_PIDFILE); /* SIGRES */
+
+ /* Normal exit from the bgwriter is here */
+ proc_exit(0); /* done */
+ }
+
+ usleep(100000L);
+ }
+ }
+
/*
* Loop forever
*/
***************
*** 506,512 ****
}
}
-
/* --------------------------------
* signal handler routines
* --------------------------------
--- 559,564 ----
diff -c -r postgresql-8.2.1/src/backend/postmaster/postmaster.c
sigres-0.1.2/src/backend/postmaster/postmaster.c
*** postgresql-8.2.1/src/backend/postmaster/postmaster.c Thu Jan 4
09:58:01 2007
--- sigres-0.1.2/src/backend/postmaster/postmaster.c Fri Feb 16 09:48:10 2007
***************
*** 122,127 ****
--- 122,129 ----
#include "storage/spin.h"
#endif
+ /* For Sigres */
+ extern bool enableSigres; /* Entity is in "globals.c" */
/*
* List of active backends (or child processes anyway; we don't actually
***************
*** 960,965 ****
--- 962,970 ----
*/
StartupPID = StartupDataBase();
+ if (enableSigres == true)
+ enableFsync = false;
+
status = ServerLoop();
/*
***************
*** 2841,2846 ****
--- 2846,2854 ----
char protobuf[32];
int i;
+ if (enableSigres == true)
+ enableFsync = false;
+
/*
* Don't want backend to be able to see the postmaster random number
* generator state. We have to clobber the static random_seed *and*
start
diff -c -r postgresql-8.2.1/src/backend/utils/init/globals.c
sigres-0.1.2/src/backend/utils/init/globals.c
*** postgresql-8.2.1/src/backend/utils/init/globals.c Wed Oct 4 09:30:02 2006
--- sigres-0.1.2/src/backend/utils/init/globals.c Fri Feb 16 10:35:00 2007
***************
*** 109,111 ****
--- 109,115 ----
bool VacuumCostActive = false;
int GinFuzzySearchLimit = 0;
+
+ /* Sigres Parameters */
+ int BgWriterPid = 0; /* Must be extern */
+ bool enableSigres = false;
diff -c -r postgresql-8.2.1/src/backend/utils/misc/guc.c
sigres-0.1.2/src/backend/utils/misc/guc.c
*** postgresql-8.2.1/src/backend/utils/misc/guc.c Wed Nov 29 23:50:07 2006
--- sigres-0.1.2/src/backend/utils/misc/guc.c Fri Feb 16 09:30:42 2007
***************
*** 521,526 ****
--- 521,534 ----
true, NULL, NULL
},
{
+ {"sigres", PGC_SIGHUP, WAL_SETTINGS,
+ gettext_noop("Ignoring XLogWrite to accelerate INSERT/UPDATE
operations with UPS ."),
+ gettext_noop("Without using UPS, enabling sigres makes your
system dangerous.")
+ },
+ &enableSigres,
+ false, NULL, NULL
+ },
+ {
{"zero_damaged_pages", PGC_SUSET, DEVELOPER_OPTIONS,
gettext_noop("Continues processing past damaged page
headers."),
gettext_noop("Detection of a damaged page header
normally causes PostgreSQL to "
diff -c -r postgresql-8.2.1/src/backend/utils/misc/postgresql.conf.sample
sigres-0.1.2/src/backend/utils/misc/postgresql.conf.sample
*** postgresql-8.2.1/src/backend/utils/misc/postgresql.conf.sample Tue Nov
21 10:23:37 2006
--- sigres-0.1.2/src/backend/utils/misc/postgresql.conf.sample Fri Feb 16
09:22:08 2007
***************
*** 171,176 ****
--- 171,183 ----
#archive_timeout = 0 # force a logfile segment switch after this
# many seconds; 0 is off
+ # - Accelerating WAL *IF* you have UPS -
+ #sigres = off # turns sigres mode on or off
+ # in default, sigres == off
+ # without UPS, you never turn on sigres
+ # if sigres == on, then,
+ # both of "fsync" and
"full_page_writes"
+ # are turned off.
#---------------------------------------------------------------------------
# QUERY TUNING
diff -c -r postgresql-8.2.1/src/bin/psql/sql_help.h
sigres-0.1.2/src/bin/psql/sql_help.h
*** postgresql-8.2.1/src/bin/psql/sql_help.h Sat Jan 6 14:22:23 2007
--- sigres-0.1.2/src/bin/psql/sql_help.h Sat Feb 10 23:57:54 2007
***************
*** 3,9 ****
* *** generated from the DocBook documentation.
*
* generated by
! * /usr/local/bin/suidperl create_help.pl ../../../doc/src/sgml/ref
sql_help.h
*
*/
--- 3,9 ----
* *** generated from the DocBook documentation.
*
* generated by
! * /usr/bin/perl create_help.pl ../../../doc/src/sgml/ref sql_help.h
*
*/
Only in sigres-0.1.2/src/include: debug.h
diff -c -r postgresql-8.2.1/src/include/miscadmin.h
sigres-0.1.2/src/include/miscadmin.h
*** postgresql-8.2.1/src/include/miscadmin.h Fri Oct 20 03:32:47 2006
--- sigres-0.1.2/src/include/miscadmin.h Fri Feb 16 09:53:40 2007
***************
*** 202,207 ****
--- 202,208 ----
extern bool allowSystemTableMods;
extern DLLIMPORT int work_mem;
extern DLLIMPORT int maintenance_work_mem;
+ extern bool enableSigres; /* SIGRES */
extern int VacuumCostPageHit;
extern int VacuumCostPageMiss;
***************
*** 324,326 ****
--- 325,328 ----
extern void process_local_preload_libraries(void);
#endif /* MISCADMIN_H */
+
diff -c -r postgresql-8.2.1/src/include/postgres.h
sigres-0.1.2/src/include/postgres.h
*** postgresql-8.2.1/src/include/postgres.h Fri Jul 14 01:49:18 2006
--- sigres-0.1.2/src/include/postgres.h Fri Feb 16 10:38:45 2007
***************
*** 544,546 ****
--- 544,552 ----
typedef int4 aclitem; /* PHONY definition for catalog use
only */
#endif /* POSTGRES_H */
+
+ /* ----------------------------------------------------------------
+ * Section 5: Sigres extention
+ * ----------------------------------------------------------------
+ */
+ #define BGWRITER_PIDFILE "/tmp/bgwriter.pid"
diff -c -r postgresql-8.2.1/src/interfaces/ecpg/preproc/pgc.c
sigres-0.1.2/src/interfaces/ecpg/preproc/pgc.c
*** postgresql-8.2.1/src/interfaces/ecpg/preproc/pgc.c Sat Jan 6 14:22:23 2007
--- sigres-0.1.2/src/interfaces/ecpg/preproc/pgc.c Sat Feb 10 23:57:54 2007
***************
*** 1,9 ****
#line 2 "pgc.c"
! /* A lexical scanner generated by flex */
/* Scanner skeleton version:
* $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48
vern Exp $
- * $FreeBSD: src/usr.bin/lex/flex.skl,v 1.8 2004/01/06 19:03:44 nectar Exp $
*/
#define FLEX_SCANNER
--- 1,8 ----
#line 2 "pgc.c"
! /* A lexical scanner generated by flex*/
/* Scanner skeleton version:
* $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48
vern Exp $
*/
#define FLEX_SCANNER
***************
*** 11,16 ****
--- 10,16 ----
#define YY_FLEX_MINOR_VERSION 5
#include <stdio.h>
+ #include <unistd.h>
/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
***************
*** 24,30 ****
#ifdef __cplusplus
#include <stdlib.h>
- #include <unistd.h>
/* Use prototypes in function declarations. */
#define YY_USE_PROTOS
--- 24,29 ----
***************
*** 136,141 ****
--- 135,149 ----
#define unput(c) yyunput( c, yytext_ptr )
+ /* Some routines like yy_flex_realloc() are emitted as static but are
+ not called by all lexers. This generates warnings in some compilers,
+ notably GCC. Arrange to suppress these. */
+ #ifdef __GNUC__
+ #define YY_MAY_BE_UNUSED __attribute__((unused))
+ #else
+ #define YY_MAY_BE_UNUSED
+ #endif
+
/* The following is because we cannot portably get our hands on size_t
* (without autoconf's help, which isn't available because we want
* flex-generated scanners to compile on their own).
***************
*** 242,248 ****
YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
! static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
static void yy_flex_free YY_PROTO(( void * ));
#define yy_new_buffer yy_create_buffer
--- 250,256 ----
YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
! static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )) YY_MAY_BE_UNUSED;
static void yy_flex_free YY_PROTO(( void * ));
#define yy_new_buffer yy_create_buffer
***************
*** 1340,1346 ****
* Note that xcstart must appear before operator, as explained above!
* Also whitespace (comment) must appear before operator.
*/
! #line 1344 "pgc.c"
/* Macros after this point can all be overridden by user definitions in
* section 1.
--- 1348,1354 ----
* Note that xcstart must appear before operator, as explained above!
* Also whitespace (comment) must appear before operator.
*/
! #line 1352 "pgc.c"
/* Macros after this point can all be overridden by user definitions in
* section 1.
***************
*** 1488,1494 ****
YY_DECL
{
register yy_state_type yy_current_state;
! register char *yy_cp, *yy_bp;
register int yy_act;
#line 324 "pgc.l"
--- 1496,1502 ----
YY_DECL
{
register yy_state_type yy_current_state;
! register char *yy_cp = NULL, *yy_bp = NULL;
register int yy_act;
#line 324 "pgc.l"
***************
*** 1499,1505 ****
token_start = NULL;
! #line 1503 "pgc.c"
if ( yy_init )
{
--- 1507,1513 ----
token_start = NULL;
! #line 1511 "pgc.c"
if ( yy_init )
{
***************
*** 1559,1565 ****
yy_find_action:
yy_current_state = *--yy_state_ptr;
yy_lp = yy_accept[yy_current_state];
- goto find_rule; /* avoid `defined but not used' warning */
find_rule: /* we branch to this label when backing up */
for ( ; ; ) /* until we find what rule we matched */
{
--- 1567,1572 ----
***************
*** 2961,2967 ****
#line 1181 "pgc.l"
YY_FATAL_ERROR( "flex scanner jammed" );
YY_BREAK
! #line 2965 "pgc.c"
case YY_END_OF_BUFFER:
{
--- 2968,2974 ----
#line 1181 "pgc.l"
YY_FATAL_ERROR( "flex scanner jammed" );
YY_BREAK
! #line 2972 "pgc.c"
case YY_END_OF_BUFFER:
{
***************
*** 3337,3342 ****
--- 3344,3350 ----
#endif /* ifndef YY_NO_UNPUT */
+ #ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput()
#else
***************
*** 3410,3416 ****
return c;
}
!
#ifdef YY_USE_PROTOS
void yyrestart( FILE *input_file )
--- 3418,3424 ----
return c;
}
! #endif /* YY_NO_INPUT */
#ifdef YY_USE_PROTOS
void yyrestart( FILE *input_file )
***************
*** 3521,3531 ****
}
- #ifndef YY_ALWAYS_INTERACTIVE
- #ifndef YY_NEVER_INTERACTIVE
- extern int isatty YY_PROTO(( int ));
- #endif
- #endif
#ifdef YY_USE_PROTOS
void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
--- 3529,3534 ----
diff -c -r postgresql-8.2.1/src/interfaces/libpq/libpq.rc
sigres-0.1.2/src/interfaces/libpq/libpq.rc
*** postgresql-8.2.1/src/interfaces/libpq/libpq.rc Sat Jan 6 14:22:19 2007
--- sigres-0.1.2/src/interfaces/libpq/libpq.rc Fri Feb 16 11:25:08 2007
***************
*** 1,8 ****
#include <winver.h>
VS_VERSION_INFO VERSIONINFO
! FILEVERSION 8,2,1,7006
! PRODUCTVERSION 8,2,1,7006
FILEFLAGSMASK 0x3fL
FILEFLAGS 0
FILEOS VOS__WINDOWS32
--- 1,8 ----
#include <winver.h>
VS_VERSION_INFO VERSIONINFO
! FILEVERSION 8,2,1,7047
! PRODUCTVERSION 8,2,1,7047
FILEFLAGSMASK 0x3fL
FILEFLAGS 0
FILEOS VOS__WINDOWS32
---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
choose an index scan if your joining column's datatypes do not
match