Prevent tv_sec from becoming negative in connection timeout code.

This commit is contained in:
Bruce Momjian 2002-10-11 04:12:14 +00:00
parent c2311337f0
commit 6a7bb0afbc
6 changed files with 68 additions and 27 deletions

View File

@ -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>

View File

@ -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;
}

View File

@ -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.

View File

@ -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}
*/

View File

@ -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);

View File

@ -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;
}
}