Prevent tv_sec from becoming negative in connection timeout code.
This commit is contained in:
parent
c2311337f0
commit
6a7bb0afbc
@ -143,6 +143,7 @@
|
||||
from a function?<BR>
|
||||
<A href="#4.26">4.26</A>) Why can't I reliably create/drop
|
||||
temporary tables in PL/PgSQL functions?<BR>
|
||||
<A href="#4.27">4.27</A>) What replication options are available?<BR>
|
||||
|
||||
|
||||
<H2 align="center">Extending PostgreSQL</H2>
|
||||
@ -1346,12 +1347,14 @@ BYTEA bytea variable-length byte array (null-byte safe)
|
||||
<H4><A name="4.24">4.24</A>) How do I perform queries using
|
||||
multiple databases?</H4>
|
||||
|
||||
<P>There is no way to query any database except the current one.
|
||||
<P>There is no way to query a database other than the current one.
|
||||
Because PostgreSQL loads database-specific system catalogs, it is
|
||||
uncertain how a cross-database query should even behave.</P>
|
||||
|
||||
<P>Of course, a client can make simultaneous connections to
|
||||
different databases and merge the information that way.</P>
|
||||
<P><I>/contrib/dblink</I> allows cross-database queries using
|
||||
function calls. Of course, a client can make simultaneous
|
||||
connections to different databases and merge the results on the
|
||||
client side.</P>
|
||||
|
||||
<H4><A name="4.25">4.25</A>) How do I return multiple rows or
|
||||
columns from a function?</H4>
|
||||
@ -1364,13 +1367,19 @@ BYTEA bytea variable-length byte array (null-byte safe)
|
||||
|
||||
<H4><A name="4.26">4.26</A>) Why can't I reliably create/drop
|
||||
temporary tables in PL/PgSQL functions?</H4>
|
||||
PL/PgSQL caches function contents, and an unfortunate side effect
|
||||
<P>PL/PgSQL caches function contents, and an unfortunate side effect
|
||||
is that if a PL/PgSQL function accesses a temporary table, and that
|
||||
table is later dropped and recreated, and the function called
|
||||
again, the function will fail because the cached function contents
|
||||
still point to the old temporary table. The solution is to use
|
||||
<SMALL>EXECUTE</SMALL> for temporary table access in PL/PgSQL. This
|
||||
will cause the query to be reparsed every time.
|
||||
will cause the query to be reparsed every time.</P>
|
||||
|
||||
<H4><A name="4.27">4.27</A>) What replication options are available?
|
||||
</H4>
|
||||
<P>There are several master/slave replication solutions available.
|
||||
These allow only one server to make database changes and the slave
|
||||
merely allow database reading.
|
||||
|
||||
<HR>
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/nodes.c,v 1.15 2002/06/20 20:29:29 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/nodes.c,v 1.16 2002/10/11 04:12:14 momjian Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* Andrew Yu Oct 20, 1994 file creation
|
||||
@ -28,15 +28,5 @@
|
||||
* macro makeNode. eg. to create a Resdom node, use makeNode(Resdom)
|
||||
*
|
||||
*/
|
||||
Node *
|
||||
newNode(Size size, NodeTag tag)
|
||||
{
|
||||
Node *newNode;
|
||||
Node *newNodeMacroHolder;
|
||||
|
||||
Assert(size >= sizeof(Node)); /* need the tag, at least */
|
||||
|
||||
newNode = (Node *) palloc(size);
|
||||
MemSet((char *) newNode, 0, size);
|
||||
newNode->type = tag;
|
||||
return newNode;
|
||||
}
|
||||
|
@ -14,7 +14,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/mmgr/mcxt.c,v 1.32 2002/08/12 00:36:12 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/mmgr/mcxt.c,v 1.33 2002/10/11 04:12:14 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -452,6 +452,29 @@ MemoryContextAlloc(MemoryContext context, Size size)
|
||||
return (*context->methods->alloc) (context, size);
|
||||
}
|
||||
|
||||
/*
|
||||
* MemoryContextAllocZero
|
||||
* Like MemoryContextAlloc, but clears allocated memory
|
||||
*
|
||||
* We could just call MemoryContextAlloc then clear the memory, but this
|
||||
* function is called too many times, so we have a separate version.
|
||||
*/
|
||||
void *
|
||||
MemoryContextAllocZero(MemoryContext context, Size size)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
AssertArg(MemoryContextIsValid(context));
|
||||
|
||||
if (!AllocSizeIsValid(size))
|
||||
elog(ERROR, "MemoryContextAllocZero: invalid request size %lu",
|
||||
(unsigned long) size);
|
||||
|
||||
ret = (*context->methods->alloc) (context, size);
|
||||
MemSet(ret, 0, size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* pfree
|
||||
* Release an allocated chunk.
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: nodes.h,v 1.118 2002/08/31 22:10:47 tgl Exp $
|
||||
* $Id: nodes.h,v 1.119 2002/10/11 04:12:14 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -261,6 +261,24 @@ typedef struct Node
|
||||
|
||||
#define nodeTag(nodeptr) (((Node*)(nodeptr))->type)
|
||||
|
||||
/*
|
||||
* There is no way to dereference the palloc'ed pointer to assign the
|
||||
* tag, and return the pointer itself, so we need a holder variable.
|
||||
* Fortunately, this function isn't recursive so we just define
|
||||
* a global variable for this purpose.
|
||||
*/
|
||||
extern Node *newNodeMacroHolder;
|
||||
|
||||
#define newNode(size, tag) \
|
||||
( \
|
||||
AssertMacro((size) >= sizeof(Node)), /* need the tag, at least */ \
|
||||
\
|
||||
newNodeMacroHolder = (Node *) palloc0(size), \
|
||||
newNodeMacroHolder->type = (tag), \
|
||||
newNodeMacroHolder \
|
||||
)
|
||||
|
||||
|
||||
#define makeNode(_type_) ((_type_ *) newNode(sizeof(_type_),T_##_type_))
|
||||
#define NodeSetTag(nodeptr,t) (((Node*)(nodeptr))->type = (t))
|
||||
|
||||
@ -282,11 +300,6 @@ typedef struct Node
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
* nodes/nodes.c
|
||||
*/
|
||||
extern Node *newNode(Size size, NodeTag tag);
|
||||
|
||||
/*
|
||||
* nodes/{outfuncs.c,print.c}
|
||||
*/
|
||||
|
@ -21,7 +21,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: palloc.h,v 1.19 2002/06/20 20:29:53 momjian Exp $
|
||||
* $Id: palloc.h,v 1.20 2002/10/11 04:12:14 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -46,9 +46,12 @@ extern DLLIMPORT MemoryContext CurrentMemoryContext;
|
||||
* Fundamental memory-allocation operations (more are in utils/memutils.h)
|
||||
*/
|
||||
extern void *MemoryContextAlloc(MemoryContext context, Size size);
|
||||
extern void *MemoryContextAllocZero(MemoryContext context, Size size);
|
||||
|
||||
#define palloc(sz) MemoryContextAlloc(CurrentMemoryContext, (sz))
|
||||
|
||||
#define palloc0(sz) MemoryContextAllocZero(CurrentMemoryContext, (sz))
|
||||
|
||||
extern void pfree(void *pointer);
|
||||
|
||||
extern void *repalloc(void *pointer, Size size);
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.206 2002/10/03 17:09:42 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.207 2002/10/11 04:12:14 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -1131,7 +1131,10 @@ connectDBComplete(PGconn *conn)
|
||||
return 0;
|
||||
}
|
||||
|
||||
remains.tv_sec = finish_time - current_time;
|
||||
if (finish_time > current_time)
|
||||
remains.tv_sec = finish_time - current_time;
|
||||
else
|
||||
remains.tv_sec = 0;
|
||||
remains.tv_usec = 0;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user