Changes to avoid collisions with WIN32 & MFC names...
1. Renamed:
a. PROC => PGPROC
b. GetUserName() => GetUserNameFromId()
c. GetCurrentTime() => GetCurrentDateTime()
d. IGNORE => IGNORE_DTF in include/utils/datetime.h & utils/adt/datetime.c
2. Added _P to some lex/yacc tokens:
CONST, CHAR, DELETE, FLOAT, GROUP, IN, OUT
__________________________________________________
Do You Yahoo!?
Yahoo! - Official partner of 2002 FIFA World Cup
http://fifaworldcup.yahoo.comIndex: src/backend/access/transam/transam.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/transam.c,v
retrieving revision 1.51
diff -c -r1.51 transam.c
*** src/backend/access/transam/transam.c 2002/05/25 20:00:11 1.51
--- src/backend/access/transam/transam.c 2002/06/10 17:44:24
***************
*** 201,207 ****
/*
* Now this func in shmem.c and gives quality answer by scanning
! * PROC structures of all running backend. - vadim 11/26/96
*
* Old comments:
* true if given transaction has neither committed nor aborted
--- 201,207 ----
/*
* Now this func in shmem.c and gives quality answer by scanning
! * PGPROC structures of all running backend. - vadim 11/26/96
*
* Old comments:
* true if given transaction has neither committed nor aborted
Index: src/backend/access/transam/varsup.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/varsup.c,v
retrieving revision 1.49
diff -c -r1.49 varsup.c
*** src/backend/access/transam/varsup.c 2002/05/25 20:00:11 1.49
--- src/backend/access/transam/varsup.c 2002/06/10 17:44:24
***************
*** 61,83 ****
* Must set MyProc->xid before releasing XidGenLock. This ensures
* that when GetSnapshotData calls ReadNewTransactionId, all active
* XIDs before the returned value of nextXid are already present in
! * the shared PROC array. Else we have a race condition.
*
* XXX by storing xid into MyProc without acquiring SInvalLock, we are
* relying on fetch/store of an xid to be atomic, else other backends
* might see a partially-set xid here. But holding both locks at once
* would be a nasty concurrency hit (and in fact could cause a
* deadlock against GetSnapshotData). So for now, assume atomicity.
! * Note that readers of PROC xid field should be careful to fetch the
* value only once, rather than assume they can read it multiple times
* and get the same answer each time.
*
! * A solution to the atomic-store problem would be to give each PROC its
! * own spinlock used only for fetching/storing that PROC's xid.
* (SInvalLock would then mean primarily that PROCs couldn't be added/
* removed while holding the lock.)
*/
! if (MyProc != (PROC *) NULL)
MyProc->xid = xid;
LWLockRelease(XidGenLock);
--- 61,83 ----
* Must set MyProc->xid before releasing XidGenLock. This ensures
* that when GetSnapshotData calls ReadNewTransactionId, all active
* XIDs before the returned value of nextXid are already present in
! * the shared PGPROC array. Else we have a race condition.
*
* XXX by storing xid into MyProc without acquiring SInvalLock, we are
* relying on fetch/store of an xid to be atomic, else other backends
* might see a partially-set xid here. But holding both locks at once
* would be a nasty concurrency hit (and in fact could cause a
* deadlock against GetSnapshotData). So for now, assume atomicity.
! * Note that readers of PGPROC xid field should be careful to fetch the
* value only once, rather than assume they can read it multiple times
* and get the same answer each time.
*
! * A solution to the atomic-store problem would be to give each PGPROC its
! * own spinlock used only for fetching/storing that PGPROC's xid.
* (SInvalLock would then mean primarily that PROCs couldn't be added/
* removed while holding the lock.)
*/
! if (MyProc != (PGPROC *) NULL)
MyProc->xid = xid;
LWLockRelease(XidGenLock);
Index: src/backend/access/transam/xact.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/xact.c,v
retrieving revision 1.125
diff -c -r1.125 xact.c
*** src/backend/access/transam/xact.c 2002/05/25 20:00:12 1.125
--- src/backend/access/transam/xact.c 2002/06/10 17:44:26
***************
*** 602,608 ****
MyLastRecPtr.xrecoff = 0;
MyXactMadeXLogEntry = false;
! /* Show myself as out of the transaction in PROC array */
MyProc->logRec.xrecoff = 0;
if (leak)
--- 602,608 ----
MyLastRecPtr.xrecoff = 0;
MyXactMadeXLogEntry = false;
! /* Show myself as out of the transaction in PGPROC array */
MyProc->logRec.xrecoff = 0;
if (leak)
***************
*** 727,733 ****
MyLastRecPtr.xrecoff = 0;
MyXactMadeXLogEntry = false;
! /* Show myself as out of the transaction in PROC array */
MyProc->logRec.xrecoff = 0;
/*
--- 727,733 ----
MyLastRecPtr.xrecoff = 0;
MyXactMadeXLogEntry = false;
! /* Show myself as out of the transaction in PGPROC array */
MyProc->logRec.xrecoff = 0;
/*
***************
*** 960,966 ****
* as running as well or it will see two tuple versions - one deleted
* by xid 1 and one inserted by xid 0. See notes in GetSnapshotData.
*/
! if (MyProc != (PROC *) NULL)
{
/* Lock SInvalLock because that's what GetSnapshotData uses. */
LWLockAcquire(SInvalLock, LW_EXCLUSIVE);
--- 960,966 ----
* as running as well or it will see two tuple versions - one deleted
* by xid 1 and one inserted by xid 0. See notes in GetSnapshotData.
*/
! if (MyProc != (PGPROC *) NULL)
{
/* Lock SInvalLock because that's what GetSnapshotData uses. */
LWLockAcquire(SInvalLock, LW_EXCLUSIVE);
***************
*** 1069,1075 ****
* this must be done _before_ releasing locks we hold and _after_
* RecordTransactionAbort.
*/
! if (MyProc != (PROC *) NULL)
{
/* Lock SInvalLock because that's what GetSnapshotData uses. */
LWLockAcquire(SInvalLock, LW_EXCLUSIVE);
--- 1069,1075 ----
* this must be done _before_ releasing locks we hold and _after_
* RecordTransactionAbort.
*/
! if (MyProc != (PGPROC *) NULL)
{
/* Lock SInvalLock because that's what GetSnapshotData uses. */
LWLockAcquire(SInvalLock, LW_EXCLUSIVE);
Index: src/backend/access/transam/xlog.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/xlog.c,v
retrieving revision 1.96
diff -c -r1.96 xlog.c
*** src/backend/access/transam/xlog.c 2002/06/07 21:47:45 1.96
--- src/backend/access/transam/xlog.c 2002/06/10 17:44:27
***************
*** 753,759 ****
/* Compute record's XLOG location */
INSERT_RECPTR(RecPtr, Insert, curridx);
! /* If first XLOG record of transaction, save it in PROC array */
if (MyLastRecPtr.xrecoff == 0 && !no_tran)
{
/*
--- 753,759 ----
/* Compute record's XLOG location */
INSERT_RECPTR(RecPtr, Insert, curridx);
! /* If first XLOG record of transaction, save it in PGPROC array */
if (MyLastRecPtr.xrecoff == 0 && !no_tran)
{
/*
***************
*** 3026,3032 ****
}
/*
! * Get UNDO record ptr - this is oldest of PROC->logRec values. We do
* this while holding insert lock to ensure that we won't miss any
* about-to-commit transactions (UNDO must include all xacts that have
* commits after REDO point).
--- 3026,3032 ----
}
/*
! * Get UNDO record ptr - this is oldest of PGPROC->logRec values. We do
* this while holding insert lock to ensure that we won't miss any
* about-to-commit transactions (UNDO must include all xacts that have
* commits after REDO point).
Index: src/backend/bootstrap/bootparse.y
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v
retrieving revision 1.46
diff -c -r1.46 bootparse.y
*** src/backend/bootstrap/bootparse.y 2002/04/27 21:24:33 1.46
--- src/backend/bootstrap/bootparse.y 2002/06/10 17:44:27
***************
*** 93,99 ****
%type <ival> boot_tuple boot_tuplelist
%type <oidval> optoideq
! %token <ival> CONST ID
%token OPEN XCLOSE XCREATE INSERT_TUPLE
%token STRING XDEFINE
%token XDECLARE INDEX ON USING XBUILD INDICES UNIQUE
--- 93,99 ----
%type <ival> boot_tuple boot_tuplelist
%type <oidval> optoideq
! %token <ival> CONST_P ID
%token OPEN XCLOSE XCREATE INSERT_TUPLE
%token STRING XDEFINE
%token XDECLARE INDEX ON USING XBUILD INDICES UNIQUE
***************
*** 329,335 ****
;
boot_const :
! CONST { $$=yylval.ival; }
;
boot_ident :
--- 329,335 ----
;
boot_const :
! CONST_P { $$=yylval.ival; }
;
boot_ident :
Index: src/backend/bootstrap/bootscanner.l
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/bootstrap/bootscanner.l,v
retrieving revision 1.22
diff -c -r1.22 bootscanner.l
*** src/backend/bootstrap/bootscanner.l 2002/04/27 21:24:33 1.22
--- src/backend/bootstrap/bootscanner.l 2002/06/10 17:44:27
***************
*** 121,127 ****
(-)?{D}*"."{D}+({Exp})? |
(-)?{D}+{Exp} {
yylval.ival = EnterString((char*)yytext);
! return(CONST);
}
. {
--- 121,127 ----
(-)?{D}*"."{D}+({Exp})? |
(-)?{D}+{Exp} {
yylval.ival = EnterString((char*)yytext);
! return(CONST_P);
}
. {
Index: src/backend/commands/schemacmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/schemacmds.c,v
retrieving revision 1.3
diff -c -r1.3 schemacmds.c
*** src/backend/commands/schemacmds.c 2002/05/17 20:53:33 1.3
--- src/backend/commands/schemacmds.c 2002/06/10 17:44:27
***************
*** 50,56 ****
if (!authId)
{
owner_userid = saved_userid;
! owner_name = GetUserName(owner_userid);
}
else if (superuser())
{
--- 50,56 ----
if (!authId)
{
owner_userid = saved_userid;
! owner_name = GetUserNameFromId(owner_userid);
}
else if (superuser())
{
***************
*** 68,74 ****
else /* not superuser */
{
owner_userid = saved_userid;
! owner_name = GetUserName(owner_userid);
if (strcmp(authId, owner_name) != 0)
elog(ERROR, "CREATE SCHEMA: permission denied"
"\n\t\"%s\" is not a superuser, so cannot create a schema for \"%s\"",
--- 68,74 ----
else /* not superuser */
{
owner_userid = saved_userid;
! owner_name = GetUserNameFromId(owner_userid);
if (strcmp(authId, owner_name) != 0)
elog(ERROR, "CREATE SCHEMA: permission denied"
"\n\t\"%s\" is not a superuser, so cannot create a schema for \"%s\"",
Index: src/backend/commands/user.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/user.c,v
retrieving revision 1.103
diff -c -r1.103 user.c
*** src/backend/commands/user.c 2002/05/21 22:05:54 1.103
--- src/backend/commands/user.c 2002/06/10 17:44:27
***************
*** 724,730 ****
createuser < 0 &&
!validUntil &&
password &&
! strcmp(GetUserName(GetUserId()), stmt->user) == 0))
elog(ERROR, "ALTER USER: permission denied");
/* changes to the flat password file cannot be rolled back */
--- 724,730 ----
createuser < 0 &&
!validUntil &&
password &&
! strcmp(GetUserNameFromId(GetUserId()), stmt->user) == 0))
elog(ERROR, "ALTER USER: permission denied");
/* changes to the flat password file cannot be rolled back */
Index: src/backend/commands/variable.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/variable.c,v
retrieving revision 1.67
diff -c -r1.67 variable.c
*** src/backend/commands/variable.c 2002/05/17 01:19:17 1.67
--- src/backend/commands/variable.c 2002/06/10 17:44:27
***************
*** 583,587 ****
const char *
show_session_authorization(void)
{
! return GetUserName(GetSessionUserId());
}
--- 583,587 ----
const char *
show_session_authorization(void)
{
! return GetUserNameFromId(GetSessionUserId());
}
Index: src/backend/parser/gram.y
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.319
diff -c -r2.319 gram.y
*** src/backend/parser/gram.y 2002/05/22 17:20:59 2.319
--- src/backend/parser/gram.y 2002/06/10 17:44:28
***************
*** 321,345 ****
BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BIGINT, BINARY, BIT, BOTH,
BOOLEAN, BY,
! CACHE, CALLED, CASCADE, CASE, CAST, CHAIN, CHAR, CHARACTER,
CHARACTERISTICS, CHECK, CHECKPOINT, CLOSE, CLUSTER, COALESCE, COLLATE,
COLUMN, COMMENT, COMMIT, COMMITTED, CONSTRAINT, CONSTRAINTS, COPY,
CREATE, CREATEDB, CREATEUSER, CROSS, CURRENT_DATE, CURRENT_TIME,
CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, CYCLE,
DATABASE, DAY_P, DEC, DECIMAL, DECLARE, DEFAULT, DEFERRABLE, DEFERRED,
! DEFINER, DELETE, DELIMITERS, DESC, DISTINCT, DO, DOMAIN_P, DOUBLE, DROP,
EACH, ELSE, ENCODING, ENCRYPTED, END_TRANS, ESCAPE, EXCEPT, EXCLUSIVE,
EXECUTE, EXISTS, EXPLAIN, EXTERNAL, EXTRACT,
! FALSE_P, FETCH, FLOAT, FOR, FORCE, FOREIGN, FORWARD, FREEZE, FROM,
FULL, FUNCTION,
! GLOBAL, GRANT, GROUP,
HANDLER, HAVING, HOUR_P,
! ILIKE, IMMEDIATE, IMMUTABLE, IMPLICIT, IN, INCREMENT, INDEX, INHERITS,
INITIALLY, INNER_P, INOUT, INPUT, INSENSITIVE, INSERT, INSTEAD, INT,
INTEGER, INTERSECT, INTERVAL, INTO, INVOKER, IS, ISNULL, ISOLATION,
--- 321,345 ----
BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BIGINT, BINARY, BIT, BOTH,
BOOLEAN, BY,
! CACHE, CALLED, CASCADE, CASE, CAST, CHAIN, CHAR_P, CHARACTER,
CHARACTERISTICS, CHECK, CHECKPOINT, CLOSE, CLUSTER, COALESCE, COLLATE,
COLUMN, COMMENT, COMMIT, COMMITTED, CONSTRAINT, CONSTRAINTS, COPY,
CREATE, CREATEDB, CREATEUSER, CROSS, CURRENT_DATE, CURRENT_TIME,
CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, CYCLE,
DATABASE, DAY_P, DEC, DECIMAL, DECLARE, DEFAULT, DEFERRABLE, DEFERRED,
! DEFINER, DELETE_P, DELIMITERS, DESC, DISTINCT, DO, DOMAIN_P, DOUBLE, DROP,
EACH, ELSE, ENCODING, ENCRYPTED, END_TRANS, ESCAPE, EXCEPT, EXCLUSIVE,
EXECUTE, EXISTS, EXPLAIN, EXTERNAL, EXTRACT,
! FALSE_P, FETCH, FLOAT_P, FOR, FORCE, FOREIGN, FORWARD, FREEZE, FROM,
FULL, FUNCTION,
! GLOBAL, GRANT, GROUP_P,
HANDLER, HAVING, HOUR_P,
! ILIKE, IMMEDIATE, IMMUTABLE, IMPLICIT, IN_P, INCREMENT, INDEX, INHERITS,
INITIALLY, INNER_P, INOUT, INPUT, INSENSITIVE, INSERT, INSTEAD, INT,
INTEGER, INTERSECT, INTERVAL, INTO, INVOKER, IS, ISNULL, ISOLATION,
***************
*** 356,362 ****
NUMERIC,
OF, OFF, OFFSET, OIDS, OLD, ON, ONLY, OPERATOR, OPTION, OR, ORDER,
! OUT, OUTER_P, OVERLAPS, OWNER,
PARTIAL, PASSWORD, PATH_P, PENDANT, POSITION, PRECISION, PRIMARY,
PRIOR, PRIVILEGES, PROCEDURE, PROCEDURAL,
--- 356,362 ----
NUMERIC,
OF, OFF, OFFSET, OIDS, OLD, ON, ONLY, OPERATOR, OPTION, OR, ORDER,
! OUT_P, OUTER_P, OVERLAPS, OWNER,
PARTIAL, PASSWORD, PATH_P, PENDANT, POSITION, PRECISION, PRIMARY,
PRIOR, PRIVILEGES, PROCEDURE, PROCEDURAL,
***************
*** 406,412 ****
%nonassoc ESCAPE
%nonassoc OVERLAPS
%nonassoc BETWEEN
! %nonassoc IN
%left POSTFIXOP /* dummy for postfix Op rules */
%left Op OPERATOR /* multi-character ops and user-defined operators */
%nonassoc NOTNULL
--- 406,412 ----
%nonassoc ESCAPE
%nonassoc OVERLAPS
%nonassoc BETWEEN
! %nonassoc IN_P
%left POSTFIXOP /* dummy for postfix Op rules */
%left Op OPERATOR /* multi-character ops and user-defined operators */
%nonassoc NOTNULL
***************
*** 647,653 ****
$$->defname = "createuser";
$$->arg = (Node *)makeInteger(FALSE);
}
! | IN GROUP user_list
{
$$ = makeNode(DefElem);
$$->defname = "groupElts";
--- 647,653 ----
$$->defname = "createuser";
$$->arg = (Node *)makeInteger(FALSE);
}
! | IN_P GROUP_P user_list
{
$$ = makeNode(DefElem);
$$->defname = "groupElts";
***************
*** 680,693 ****
*
*****************************************************************************/
! CreateGroupStmt: CREATE GROUP UserId OptGroupList
{
CreateGroupStmt *n = makeNode(CreateGroupStmt);
n->name = $3;
n->options = $4;
$$ = (Node *)n;
}
! | CREATE GROUP UserId WITH OptGroupList
{
CreateGroupStmt *n = makeNode(CreateGroupStmt);
n->name = $3;
--- 680,693 ----
*
*****************************************************************************/
! CreateGroupStmt: CREATE GROUP_P UserId OptGroupList
{
CreateGroupStmt *n = makeNode(CreateGroupStmt);
n->name = $3;
n->options = $4;
$$ = (Node *)n;
}
! | CREATE GROUP_P UserId WITH OptGroupList
{
CreateGroupStmt *n = makeNode(CreateGroupStmt);
n->name = $3;
***************
*** 725,731 ****
*
*****************************************************************************/
! AlterGroupStmt: ALTER GROUP UserId ADD USER user_list
{
AlterGroupStmt *n = makeNode(AlterGroupStmt);
n->name = $3;
--- 725,731 ----
*
*****************************************************************************/
! AlterGroupStmt: ALTER GROUP_P UserId ADD USER user_list
{
AlterGroupStmt *n = makeNode(AlterGroupStmt);
n->name = $3;
***************
*** 733,739 ****
n->listUsers = $6;
$$ = (Node *)n;
}
! | ALTER GROUP UserId DROP USER user_list
{
AlterGroupStmt *n = makeNode(AlterGroupStmt);
n->name = $3;
--- 733,739 ----
n->listUsers = $6;
$$ = (Node *)n;
}
! | ALTER GROUP_P UserId DROP USER user_list
{
AlterGroupStmt *n = makeNode(AlterGroupStmt);
n->name = $3;
***************
*** 751,757 ****
*
*****************************************************************************/
! DropGroupStmt: DROP GROUP UserId
{
DropGroupStmt *n = makeNode(DropGroupStmt);
n->name = $3;
--- 751,757 ----
*
*****************************************************************************/
! DropGroupStmt: DROP GROUP_P UserId
{
DropGroupStmt *n = makeNode(DropGroupStmt);
n->name = $3;
***************
*** 1671,1677 ****
| /*EMPTY*/ { $$ = 0; }
;
! key_delete: ON DELETE key_reference { $$ = $3 << FKCONSTR_ON_DELETE_SHIFT; }
;
key_update: ON UPDATE key_reference { $$ = $3 << FKCONSTR_ON_UPDATE_SHIFT; }
--- 1671,1677 ----
| /*EMPTY*/ { $$ = 0; }
;
! key_delete: ON DELETE_P key_reference { $$ = $3 << FKCONSTR_ON_DELETE_SHIFT; }
;
key_update: ON UPDATE key_reference { $$ = $3 << FKCONSTR_ON_UPDATE_SHIFT; }
***************
*** 1963,1969 ****
;
TriggerOneEvent: INSERT { $$ = 'i'; }
! | DELETE { $$ = 'd'; }
| UPDATE { $$ = 'u'; }
;
--- 1963,1969 ----
;
TriggerOneEvent: INSERT { $$ = 'i'; }
! | DELETE_P { $$ = 'd'; }
| UPDATE { $$ = 'u'; }
;
***************
*** 2472,2478 ****
| PRIOR { $$ = -1; }
;
! from_in: IN { }
| FROM { }
;
--- 2472,2478 ----
| PRIOR { $$ = -1; }
;
! from_in: IN_P { }
| FROM { }
;
***************
*** 2524,2530 ****
privilege: SELECT { $$ = ACL_SELECT; }
| INSERT { $$ = ACL_INSERT; }
| UPDATE { $$ = ACL_UPDATE; }
! | DELETE { $$ = ACL_DELETE; }
| RULE { $$ = ACL_RULE; }
| REFERENCES { $$ = ACL_REFERENCES; }
| TRIGGER { $$ = ACL_TRIGGER; }
--- 2524,2530 ----
privilege: SELECT { $$ = ACL_SELECT; }
| INSERT { $$ = ACL_INSERT; }
| UPDATE { $$ = ACL_UPDATE; }
! | DELETE_P { $$ = ACL_DELETE; }
| RULE { $$ = ACL_RULE; }
| REFERENCES { $$ = ACL_REFERENCES; }
| TRIGGER { $$ = ACL_TRIGGER; }
***************
*** 2598,2604 ****
n->groupname = NULL;
$$ = (Node *)n;
}
! | GROUP ColId
{
PrivGrantee *n = makeNode(PrivGrantee);
/* Treat GROUP PUBLIC as a synonym for PUBLIC */
--- 2598,2604 ----
n->groupname = NULL;
$$ = (Node *)n;
}
! | GROUP_P ColId
{
PrivGrantee *n = makeNode(PrivGrantee);
/* Treat GROUP PUBLIC as a synonym for PUBLIC */
***************
*** 2807,2817 ****
}
;
! opt_arg: IN
{
$$ = FALSE;
}
! | OUT
{
elog(ERROR, "CREATE FUNCTION / OUT parameters are not supported");
$$ = TRUE;
--- 2807,2817 ----
}
;
! opt_arg: IN_P
{
$$ = FALSE;
}
! | OUT_P
{
elog(ERROR, "CREATE FUNCTION / OUT parameters are not supported");
$$ = TRUE;
***************
*** 3143,3149 ****
/* change me to select, update, etc. some day */
event: SELECT { $$ = CMD_SELECT; }
| UPDATE { $$ = CMD_UPDATE; }
! | DELETE { $$ = CMD_DELETE; }
| INSERT { $$ = CMD_INSERT; }
;
--- 3143,3149 ----
/* change me to select, update, etc. some day */
event: SELECT { $$ = CMD_SELECT; }
| UPDATE { $$ = CMD_UPDATE; }
! | DELETE_P { $$ = CMD_DELETE; }
| INSERT { $$ = CMD_INSERT; }
;
***************
*** 3728,3734 ****
*
*****************************************************************************/
! DeleteStmt: DELETE FROM relation_expr where_clause
{
DeleteStmt *n = makeNode(DeleteStmt);
n->relation = $3;
--- 3728,3734 ----
*
*****************************************************************************/
! DeleteStmt: DELETE_P FROM relation_expr where_clause
{
DeleteStmt *n = makeNode(DeleteStmt);
n->relation = $3;
***************
*** 3747,3753 ****
}
;
! opt_lock: IN lock_type MODE { $$ = $2; }
| /*EMPTY*/ { $$ = AccessExclusiveLock; }
;
--- 3747,3753 ----
}
;
! opt_lock: IN_P lock_type MODE { $$ = $2; }
| /*EMPTY*/ { $$ = AccessExclusiveLock; }
;
***************
*** 4134,4140 ****
* cases for these.
*/
! group_clause: GROUP BY expr_list { $$ = $3; }
| /*EMPTY*/ { $$ = NIL; }
;
--- 4134,4140 ----
* cases for these.
*/
! group_clause: GROUP_P BY expr_list { $$ = $3; }
| /*EMPTY*/ { $$ = NIL; }
;
***************
*** 4535,4541 ****
{
$$ = SystemTypeName("float4");
}
! | FLOAT opt_float
{
$$ = $2;
}
--- 4535,4541 ----
{
$$ = SystemTypeName("float4");
}
! | FLOAT_P opt_float
{
$$ = $2;
}
***************
*** 4726,4735 ****
;
character: CHARACTER opt_varying { $$ = $2 ? "varchar": "bpchar"; }
! | CHAR opt_varying { $$ = $2 ? "varchar": "bpchar"; }
| VARCHAR { $$ = "varchar"; }
| NATIONAL CHARACTER opt_varying { $$ = $3 ? "varchar": "bpchar"; }
! | NATIONAL CHAR opt_varying { $$ = $3 ? "varchar": "bpchar"; }
| NCHAR opt_varying { $$ = $2 ? "varchar": "bpchar"; }
;
--- 4726,4735 ----
;
character: CHARACTER opt_varying { $$ = $2 ? "varchar": "bpchar"; }
! | CHAR_P opt_varying { $$ = $2 ? "varchar": "bpchar"; }
| VARCHAR { $$ = "varchar"; }
| NATIONAL CHARACTER opt_varying { $$ = $3 ? "varchar": "bpchar"; }
! | NATIONAL CHAR_P opt_varying { $$ = $3 ? "varchar": "bpchar"; }
| NCHAR opt_varying { $$ = $2 ? "varchar": "bpchar"; }
;
***************
*** 4842,4848 ****
* Define row_descriptor to allow yacc to break the reduce/reduce conflict
* with singleton expressions.
*/
! row_expr: '(' row_descriptor ')' IN select_with_parens
{
SubLink *n = makeNode(SubLink);
n->lefthand = $2;
--- 4842,4848 ----
* Define row_descriptor to allow yacc to break the reduce/reduce conflict
* with singleton expressions.
*/
! row_expr: '(' row_descriptor ')' IN_P select_with_parens
{
SubLink *n = makeNode(SubLink);
n->lefthand = $2;
***************
*** 4852,4858 ****
n->subselect = $5;
$$ = (Node *)n;
}
! | '(' row_descriptor ')' NOT IN select_with_parens
{
SubLink *n = makeNode(SubLink);
n->lefthand = $2;
--- 4852,4858 ----
n->subselect = $5;
$$ = (Node *)n;
}
! | '(' row_descriptor ')' NOT IN_P select_with_parens
{
SubLink *n = makeNode(SubLink);
n->lefthand = $2;
***************
*** 5190,5196 ****
(Node *) makeSimpleA_Expr(OP, "<", $1, $4),
(Node *) makeSimpleA_Expr(OP, ">", $1, $6));
}
! | a_expr IN in_expr
{
/* in_expr returns a SubLink or a list of a_exprs */
if (IsA($3, SubLink))
--- 5190,5196 ----
(Node *) makeSimpleA_Expr(OP, "<", $1, $4),
(Node *) makeSimpleA_Expr(OP, ">", $1, $6));
}
! | a_expr IN_P in_expr
{
/* in_expr returns a SubLink or a list of a_exprs */
if (IsA($3, SubLink))
***************
*** 5220,5226 ****
$$ = n;
}
}
! | a_expr NOT IN in_expr
{
/* in_expr returns a SubLink or a list of a_exprs */
if (IsA($4, SubLink))
--- 5220,5226 ----
$$ = n;
}
}
! | a_expr NOT IN_P in_expr
{
/* in_expr returns a SubLink or a list of a_exprs */
if (IsA($4, SubLink))
***************
*** 5708,5714 ****
/* position_list uses b_expr not a_expr to avoid conflict with general IN */
! position_list: b_expr IN b_expr
{ $$ = makeList2($3, $1); }
| /*EMPTY*/
{ $$ = NIL; }
--- 5708,5714 ----
/* position_list uses b_expr not a_expr to avoid conflict with general IN */
! position_list: b_expr IN_P b_expr
{ $$ = makeList2($3, $1); }
| /*EMPTY*/
{ $$ = NIL; }
***************
*** 6242,6248 ****
| DECLARE
| DEFERRED
| DEFINER
! | DELETE
| DELIMITERS
| DOMAIN_P
| DOUBLE
--- 6242,6248 ----
| DECLARE
| DEFERRED
| DEFINER
! | DELETE_P
| DELIMITERS
| DOMAIN_P
| DOUBLE
***************
*** 6303,6309 ****
| OIDS
| OPERATOR
| OPTION
! | OUT
| OWNER
| PARTIAL
| PASSWORD
--- 6303,6309 ----
| OIDS
| OPERATOR
| OPTION
! | OUT_P
| OWNER
| PARTIAL
| PASSWORD
***************
*** 6389,6402 ****
BIGINT
| BIT
| BOOLEAN
! | CHAR
| CHARACTER
| COALESCE
| DEC
| DECIMAL
| EXISTS
| EXTRACT
! | FLOAT
| INT
| INTEGER
| INTERVAL
--- 6389,6402 ----
BIGINT
| BIT
| BOOLEAN
! | CHAR_P
| CHARACTER
| COALESCE
| DEC
| DECIMAL
| EXISTS
| EXTRACT
! | FLOAT_P
| INT
| INTEGER
| INTERVAL
***************
*** 6433,6439 ****
| FREEZE
| FULL
| ILIKE
! | IN
| INNER_P
| IS
| ISNULL
--- 6433,6439 ----
| FREEZE
| FULL
| ILIKE
! | IN_P
| INNER_P
| IS
| ISNULL
***************
*** 6487,6493 ****
| FOREIGN
| FROM
| GRANT
! | GROUP
| HAVING
| INITIALLY
| INTERSECT
--- 6487,6493 ----
| FOREIGN
| FROM
| GRANT
! | GROUP_P
| HAVING
| INITIALLY
| INTERSECT
Index: src/backend/parser/keywords.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/parser/keywords.c,v
retrieving revision 1.111
diff -c -r1.111 keywords.c
*** src/backend/parser/keywords.c 2002/05/22 17:20:59 1.111
--- src/backend/parser/keywords.c 2002/06/10 17:44:28
***************
*** 62,68 ****
{"case", CASE},
{"cast", CAST},
{"chain", CHAIN},
! {"char", CHAR},
{"character", CHARACTER},
{"characteristics", CHARACTERISTICS},
{"check", CHECK},
--- 62,68 ----
{"case", CASE},
{"cast", CAST},
{"chain", CHAIN},
! {"char", CHAR_P},
{"character", CHARACTER},
{"characteristics", CHARACTERISTICS},
{"check", CHECK},
***************
*** 97,103 ****
{"deferrable", DEFERRABLE},
{"deferred", DEFERRED},
{"definer", DEFINER},
! {"delete", DELETE},
{"delimiters", DELIMITERS},
{"desc", DESC},
{"distinct", DISTINCT},
--- 97,103 ----
{"deferrable", DEFERRABLE},
{"deferred", DEFERRED},
{"definer", DEFINER},
! {"delete", DELETE_P},
{"delimiters", DELIMITERS},
{"desc", DESC},
{"distinct", DISTINCT},
***************
*** 120,126 ****
{"extract", EXTRACT},
{"false", FALSE_P},
{"fetch", FETCH},
! {"float", FLOAT},
{"for", FOR},
{"force", FORCE},
{"foreign", FOREIGN},
--- 120,126 ----
{"extract", EXTRACT},
{"false", FALSE_P},
{"fetch", FETCH},
! {"float", FLOAT_P},
{"for", FOR},
{"force", FORCE},
{"foreign", FOREIGN},
***************
*** 131,137 ****
{"function", FUNCTION},
{"global", GLOBAL},
{"grant", GRANT},
! {"group", GROUP},
{"handler", HANDLER},
{"having", HAVING},
{"hour", HOUR_P},
--- 131,137 ----
{"function", FUNCTION},
{"global", GLOBAL},
{"grant", GRANT},
! {"group", GROUP_P},
{"handler", HANDLER},
{"having", HAVING},
{"hour", HOUR_P},
***************
*** 139,145 ****
{"immediate", IMMEDIATE},
{"immutable", IMMUTABLE},
{"implicit", IMPLICIT},
! {"in", IN},
{"increment", INCREMENT},
{"index", INDEX},
{"inherits", INHERITS},
--- 139,145 ----
{"immediate", IMMEDIATE},
{"immutable", IMMUTABLE},
{"implicit", IMPLICIT},
! {"in", IN_P},
{"increment", INCREMENT},
{"index", INDEX},
{"inherits", INHERITS},
***************
*** 208,214 ****
{"option", OPTION},
{"or", OR},
{"order", ORDER},
! {"out", OUT},
{"outer", OUTER_P},
{"overlaps", OVERLAPS},
{"owner", OWNER},
--- 208,214 ----
{"option", OPTION},
{"or", OR},
{"order", ORDER},
! {"out", OUT_P},
{"outer", OUTER_P},
{"overlaps", OVERLAPS},
{"owner", OWNER},
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.275
diff -c -r1.275 postmaster.c
*** src/backend/postmaster/postmaster.c 2002/05/28 23:56:51 1.275
--- src/backend/postmaster/postmaster.c 2002/06/10 17:44:29
***************
*** 14,20 ****
*
* The postmaster process creates the shared memory and semaphore
* pools during startup, but as a rule does not touch them itself.
! * In particular, it is not a member of the PROC array of backends
* and so it cannot participate in lock-manager operations. Keeping
* the postmaster away from shared memory operations makes it simpler
* and more reliable. The postmaster is almost always able to recover
--- 14,20 ----
*
* The postmaster process creates the shared memory and semaphore
* pools during startup, but as a rule does not touch them itself.
! * In particular, it is not a member of the PGPROC array of backends
* and so it cannot participate in lock-manager operations. Keeping
* the postmaster away from shared memory operations makes it simpler
* and more reliable. The postmaster is almost always able to recover
Index: src/backend/storage/ipc/sinval.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v
retrieving revision 1.47
diff -c -r1.47 sinval.c
*** src/backend/storage/ipc/sinval.c 2002/05/24 18:57:56 1.47
--- src/backend/storage/ipc/sinval.c 2002/06/10 17:44:29
***************
*** 97,103 ****
* The routines later in this file that use shared mode are okay with
* this, because they aren't looking at the ProcState fields
* associated with SI message transfer; they only use the
! * ProcState array as an easy way to find all the PROC structures.
*/
LWLockAcquire(SInvalLock, LW_SHARED);
getResult = SIGetDataEntry(shmInvalBuffer, MyBackendId, &data);
--- 97,103 ----
* The routines later in this file that use shared mode are okay with
* this, because they aren't looking at the ProcState fields
* associated with SI message transfer; they only use the
! * ProcState array as an easy way to find all the PGPROC structures.
*/
LWLockAcquire(SInvalLock, LW_SHARED);
getResult = SIGetDataEntry(shmInvalBuffer, MyBackendId, &data);
***************
*** 130,141 ****
/****************************************************************************/
! /* Functions that need to scan the PROC structures of all running backends. */
/* It's a bit strange to keep these in sinval.c, since they don't have any */
/* direct relationship to shared-cache invalidation. But the procState */
/* array in the SI segment is the only place in the system where we have */
/* an array of per-backend data, so it is the most convenient place to keep */
! /* pointers to the backends' PROC structures. We used to implement these */
/* functions with a slow, ugly search through the ShmemIndex hash table --- */
/* now they are simple loops over the SI ProcState array. */
/****************************************************************************/
--- 130,141 ----
/****************************************************************************/
! /* Functions that need to scan the PGPROC structures of all running backends. */
/* It's a bit strange to keep these in sinval.c, since they don't have any */
/* direct relationship to shared-cache invalidation. But the procState */
/* array in the SI segment is the only place in the system where we have */
/* an array of per-backend data, so it is the most convenient place to keep */
! /* pointers to the backends' PGPROC structures. We used to implement these */
/* functions with a slow, ugly search through the ShmemIndex hash table --- */
/* now they are simple loops over the SI ProcState array. */
/****************************************************************************/
***************
*** 171,177 ****
if (pOffset != INVALID_OFFSET)
{
! PROC *proc = (PROC *) MAKE_PTR(pOffset);
if (proc->databaseId == databaseId)
{
--- 171,177 ----
if (pOffset != INVALID_OFFSET)
{
! PGPROC *proc = (PGPROC *) MAKE_PTR(pOffset);
if (proc->databaseId == databaseId)
{
***************
*** 208,214 ****
if (pOffset != INVALID_OFFSET)
{
! PROC *proc = (PROC *) MAKE_PTR(pOffset);
/* Fetch xid just once - see GetNewTransactionId */
TransactionId pxid = proc->xid;
--- 208,214 ----
if (pOffset != INVALID_OFFSET)
{
! PGPROC *proc = (PGPROC *) MAKE_PTR(pOffset);
/* Fetch xid just once - see GetNewTransactionId */
TransactionId pxid = proc->xid;
***************
*** 260,266 ****
if (pOffset != INVALID_OFFSET)
{
! PROC *proc = (PROC *) MAKE_PTR(pOffset);
if (allDbs || proc->databaseId == MyDatabaseId)
{
--- 260,266 ----
if (pOffset != INVALID_OFFSET)
{
! PGPROC *proc = (PGPROC *) MAKE_PTR(pOffset);
if (allDbs || proc->databaseId == MyDatabaseId)
{
***************
*** 371,377 ****
if (pOffset != INVALID_OFFSET)
{
! PROC *proc = (PROC *) MAKE_PTR(pOffset);
/* Fetch xid just once - see GetNewTransactionId */
TransactionId xid = proc->xid;
--- 371,377 ----
if (pOffset != INVALID_OFFSET)
{
! PGPROC *proc = (PGPROC *) MAKE_PTR(pOffset);
/* Fetch xid just once - see GetNewTransactionId */
TransactionId xid = proc->xid;
***************
*** 460,466 ****
if (pOffset != INVALID_OFFSET)
{
! PROC *proc = (PROC *) MAKE_PTR(pOffset);
if (proc == MyProc)
continue; /* do not count myself */
--- 460,466 ----
if (pOffset != INVALID_OFFSET)
{
! PGPROC *proc = (PGPROC *) MAKE_PTR(pOffset);
if (proc == MyProc)
continue; /* do not count myself */
***************
*** 476,482 ****
}
/*
! * GetUndoRecPtr -- returns oldest PROC->logRec.
*/
XLogRecPtr
GetUndoRecPtr(void)
--- 476,482 ----
}
/*
! * GetUndoRecPtr -- returns oldest PGPROC->logRec.
*/
XLogRecPtr
GetUndoRecPtr(void)
***************
*** 495,501 ****
if (pOffset != INVALID_OFFSET)
{
! PROC *proc = (PROC *) MAKE_PTR(pOffset);
tempr = proc->logRec;
if (tempr.xrecoff == 0)
--- 495,501 ----
if (pOffset != INVALID_OFFSET)
{
! PGPROC *proc = (PGPROC *) MAKE_PTR(pOffset);
tempr = proc->logRec;
if (tempr.xrecoff == 0)
***************
*** 512,524 ****
}
/*
! * BackendIdGetProc - given a BackendId, find its PROC structure
*
* This is a trivial lookup in the ProcState array. We assume that the caller
* knows that the backend isn't going to go away, so we do not bother with
* locking.
*/
! struct PROC *
BackendIdGetProc(BackendId procId)
{
SISeg *segP = shmInvalBuffer;
--- 512,524 ----
}
/*
! * BackendIdGetProc - given a BackendId, find its PGPROC structure
*
* This is a trivial lookup in the ProcState array. We assume that the caller
* knows that the backend isn't going to go away, so we do not bother with
* locking.
*/
! struct PGPROC *
BackendIdGetProc(BackendId procId)
{
SISeg *segP = shmInvalBuffer;
***************
*** 530,536 ****
if (pOffset != INVALID_OFFSET)
{
! PROC *proc = (PROC *) MAKE_PTR(pOffset);
return proc;
}
--- 530,536 ----
if (pOffset != INVALID_OFFSET)
{
! PGPROC *proc = (PGPROC *) MAKE_PTR(pOffset);
return proc;
}
Index: src/backend/storage/lmgr/deadlock.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/storage/lmgr/deadlock.c,v
retrieving revision 1.8
diff -c -r1.8 deadlock.c
*** src/backend/storage/lmgr/deadlock.c 2001/10/28 06:25:50 1.8
--- src/backend/storage/lmgr/deadlock.c 2002/06/10 17:44:29
***************
*** 31,38 ****
/* One edge in the waits-for graph */
typedef struct
{
! PROC *waiter; /* the waiting process */
! PROC *blocker; /* the process it is waiting for */
int pred; /* workspace for TopoSort */
int link; /* workspace for TopoSort */
} EDGE;
--- 31,38 ----
/* One edge in the waits-for graph */
typedef struct
{
! PGPROC *waiter; /* the waiting process */
! PGPROC *blocker; /* the process it is waiting for */
int pred; /* workspace for TopoSort */
int link; /* workspace for TopoSort */
} EDGE;
***************
*** 41,60 ****
typedef struct
{
LOCK *lock; /* the lock whose wait queue is described */
! PROC **procs; /* array of PROC *'s in new wait order */
int nProcs;
} WAIT_ORDER;
! static bool DeadLockCheckRecurse(PROC *proc);
! static bool TestConfiguration(PROC *startProc);
! static bool FindLockCycle(PROC *checkProc,
EDGE *softEdges, int *nSoftEdges);
! static bool FindLockCycleRecurse(PROC *checkProc,
EDGE *softEdges, int *nSoftEdges);
static bool ExpandConstraints(EDGE *constraints, int nConstraints);
static bool TopoSort(LOCK *lock, EDGE *constraints, int nConstraints,
! PROC **ordering);
#ifdef DEBUG_DEADLOCK
static void PrintLockQueue(LOCK *lock, const char *info);
--- 41,60 ----
typedef struct
{
LOCK *lock; /* the lock whose wait queue is described */
! PGPROC **procs; /* array of PGPROC *'s in new wait order */
int nProcs;
} WAIT_ORDER;
! static bool DeadLockCheckRecurse(PGPROC *proc);
! static bool TestConfiguration(PGPROC *startProc);
! static bool FindLockCycle(PGPROC *checkProc,
EDGE *softEdges, int *nSoftEdges);
! static bool FindLockCycleRecurse(PGPROC *checkProc,
EDGE *softEdges, int *nSoftEdges);
static bool ExpandConstraints(EDGE *constraints, int nConstraints);
static bool TopoSort(LOCK *lock, EDGE *constraints, int nConstraints,
! PGPROC **ordering);
#ifdef DEBUG_DEADLOCK
static void PrintLockQueue(LOCK *lock, const char *info);
***************
*** 66,83 ****
*/
/* Workspace for FindLockCycle */
! static PROC **visitedProcs; /* Array of visited procs */
static int nVisitedProcs;
/* Workspace for TopoSort */
! static PROC **topoProcs; /* Array of not-yet-output procs */
static int *beforeConstraints; /* Counts of remaining before-constraints */
static int *afterConstraints; /* List head for after-constraints */
/* Output area for ExpandConstraints */
static WAIT_ORDER *waitOrders; /* Array of proposed queue rearrangements */
static int nWaitOrders;
! static PROC **waitOrderProcs; /* Space for waitOrders queue contents */
/* Current list of constraints being considered */
static EDGE *curConstraints;
--- 66,83 ----
*/
/* Workspace for FindLockCycle */
! static PGPROC **visitedProcs; /* Array of visited procs */
static int nVisitedProcs;
/* Workspace for TopoSort */
! static PGPROC **topoProcs; /* Array of not-yet-output procs */
static int *beforeConstraints; /* Counts of remaining before-constraints */
static int *afterConstraints; /* List head for after-constraints */
/* Output area for ExpandConstraints */
static WAIT_ORDER *waitOrders; /* Array of proposed queue rearrangements */
static int nWaitOrders;
! static PGPROC **waitOrderProcs; /* Space for waitOrders queue contents */
/* Current list of constraints being considered */
static EDGE *curConstraints;
***************
*** 111,117 ****
/*
* FindLockCycle needs at most MaxBackends entries in visitedProcs[]
*/
! visitedProcs = (PROC **) palloc(MaxBackends * sizeof(PROC *));
/*
* TopoSort needs to consider at most MaxBackends wait-queue entries,
--- 111,117 ----
/*
* FindLockCycle needs at most MaxBackends entries in visitedProcs[]
*/
! visitedProcs = (PGPROC **) palloc(MaxBackends * sizeof(PGPROC *));
/*
* TopoSort needs to consider at most MaxBackends wait-queue entries,
***************
*** 128,134 ****
* than MaxBackends total waiters.
*/
waitOrders = (WAIT_ORDER *) palloc((MaxBackends / 2) * sizeof(WAIT_ORDER));
! waitOrderProcs = (PROC **) palloc(MaxBackends * sizeof(PROC *));
/*
* Allow at most MaxBackends distinct constraints in a configuration.
--- 128,134 ----
* than MaxBackends total waiters.
*/
waitOrders = (WAIT_ORDER *) palloc((MaxBackends / 2) * sizeof(WAIT_ORDER));
! waitOrderProcs = (PGPROC **) palloc(MaxBackends * sizeof(PGPROC *));
/*
* Allow at most MaxBackends distinct constraints in a configuration.
***************
*** 176,182 ****
* interlocked!
*/
bool
! DeadLockCheck(PROC *proc)
{
int i,
j;
--- 176,182 ----
* interlocked!
*/
bool
! DeadLockCheck(PGPROC *proc)
{
int i,
j;
***************
*** 194,200 ****
for (i = 0; i < nWaitOrders; i++)
{
LOCK *lock = waitOrders[i].lock;
! PROC **procs = waitOrders[i].procs;
int nProcs = waitOrders[i].nProcs;
PROC_QUEUE *waitQueue = &(lock->waitProcs);
--- 194,200 ----
for (i = 0; i < nWaitOrders; i++)
{
LOCK *lock = waitOrders[i].lock;
! PGPROC **procs = waitOrders[i].procs;
int nProcs = waitOrders[i].nProcs;
PROC_QUEUE *waitQueue = &(lock->waitProcs);
***************
*** 234,240 ****
* rearrangements of lock wait queues (if any).
*/
static bool
! DeadLockCheckRecurse(PROC *proc)
{
int nEdges;
int oldPossibleConstraints;
--- 234,240 ----
* rearrangements of lock wait queues (if any).
*/
static bool
! DeadLockCheckRecurse(PGPROC *proc)
{
int nEdges;
int oldPossibleConstraints;
***************
*** 300,306 ****
*--------------------
*/
static bool
! TestConfiguration(PROC *startProc)
{
int softFound = 0;
EDGE *softEdges = possibleConstraints + nPossibleConstraints;
--- 300,306 ----
*--------------------
*/
static bool
! TestConfiguration(PGPROC *startProc)
{
int softFound = 0;
EDGE *softEdges = possibleConstraints + nPossibleConstraints;
***************
*** 365,371 ****
* be believed in preference to the actual ordering seen in the locktable.
*/
static bool
! FindLockCycle(PROC *checkProc,
EDGE *softEdges, /* output argument */
int *nSoftEdges) /* output argument */
{
--- 365,371 ----
* be believed in preference to the actual ordering seen in the locktable.
*/
static bool
! FindLockCycle(PGPROC *checkProc,
EDGE *softEdges, /* output argument */
int *nSoftEdges) /* output argument */
{
***************
*** 375,385 ****
}
static bool
! FindLockCycleRecurse(PROC *checkProc,
EDGE *softEdges, /* output argument */
int *nSoftEdges) /* output argument */
{
! PROC *proc;
LOCK *lock;
HOLDER *holder;
SHM_QUEUE *lockHolders;
--- 375,385 ----
}
static bool
! FindLockCycleRecurse(PGPROC *checkProc,
EDGE *softEdges, /* output argument */
int *nSoftEdges) /* output argument */
{
! PGPROC *proc;
LOCK *lock;
HOLDER *holder;
SHM_QUEUE *lockHolders;
***************
*** 438,444 ****
while (holder)
{
! proc = (PROC *) MAKE_PTR(holder->tag.proc);
/* A proc never blocks itself */
if (proc != checkProc)
--- 438,444 ----
while (holder)
{
! proc = (PGPROC *) MAKE_PTR(holder->tag.proc);
/* A proc never blocks itself */
if (proc != checkProc)
***************
*** 480,486 ****
if (i < nWaitOrders)
{
/* Use the given hypothetical wait queue order */
! PROC **procs = waitOrders[i].procs;
queue_size = waitOrders[i].nProcs;
--- 480,486 ----
if (i < nWaitOrders)
{
/* Use the given hypothetical wait queue order */
! PGPROC **procs = waitOrders[i].procs;
queue_size = waitOrders[i].nProcs;
***************
*** 517,523 ****
waitQueue = &(lock->waitProcs);
queue_size = waitQueue->size;
! proc = (PROC *) MAKE_PTR(waitQueue->links.next);
while (queue_size-- > 0)
{
--- 517,523 ----
waitQueue = &(lock->waitProcs);
queue_size = waitQueue->size;
! proc = (PGPROC *) MAKE_PTR(waitQueue->links.next);
while (queue_size-- > 0)
{
***************
*** 543,549 ****
}
}
! proc = (PROC *) MAKE_PTR(proc->links.next);
}
}
--- 543,549 ----
}
}
! proc = (PGPROC *) MAKE_PTR(proc->links.next);
}
}
***************
*** 559,565 ****
* specific new orderings for affected wait queues
*
* Input is a list of soft edges to be reversed. The output is a list
! * of nWaitOrders WAIT_ORDER structs in waitOrders[], with PROC array
* workspace in waitOrderProcs[].
*
* Returns TRUE if able to build an ordering that satisfies all the
--- 559,565 ----
* specific new orderings for affected wait queues
*
* Input is a list of soft edges to be reversed. The output is a list
! * of nWaitOrders WAIT_ORDER structs in waitOrders[], with PGPROC array
* workspace in waitOrderProcs[].
*
* Returns TRUE if able to build an ordering that satisfies all the
***************
*** 582,588 ****
*/
for (i = nConstraints; --i >= 0;)
{
! PROC *proc = constraints[i].waiter;
LOCK *lock = proc->waitLock;
/* Did we already make a list for this lock? */
--- 582,588 ----
*/
for (i = nConstraints; --i >= 0;)
{
! PGPROC *proc = constraints[i].waiter;
LOCK *lock = proc->waitLock;
/* Did we already make a list for this lock? */
***************
*** 628,634 ****
* slowness of the algorithm won't really matter.
*
* The initial queue ordering is taken directly from the lock's wait queue.
! * The output is an array of PROC pointers, of length equal to the lock's
* wait queue length (the caller is responsible for providing this space).
* The partial order is specified by an array of EDGE structs. Each EDGE
* is one that we need to reverse, therefore the "waiter" must appear before
--- 628,634 ----
* slowness of the algorithm won't really matter.
*
* The initial queue ordering is taken directly from the lock's wait queue.
! * The output is an array of PGPROC pointers, of length equal to the lock's
* wait queue length (the caller is responsible for providing this space).
* The partial order is specified by an array of EDGE structs. Each EDGE
* is one that we need to reverse, therefore the "waiter" must appear before
***************
*** 642,663 ****
TopoSort(LOCK *lock,
EDGE *constraints,
int nConstraints,
! PROC **ordering) /* output argument */
{
PROC_QUEUE *waitQueue = &(lock->waitProcs);
int queue_size = waitQueue->size;
! PROC *proc;
int i,
j,
k,
last;
/* First, fill topoProcs[] array with the procs in their current order */
! proc = (PROC *) MAKE_PTR(waitQueue->links.next);
for (i = 0; i < queue_size; i++)
{
topoProcs[i] = proc;
! proc = (PROC *) MAKE_PTR(proc->links.next);
}
/*
--- 642,663 ----
TopoSort(LOCK *lock,
EDGE *constraints,
int nConstraints,
! PGPROC **ordering) /* output argument */
{
PROC_QUEUE *waitQueue = &(lock->waitProcs);
int queue_size = waitQueue->size;
! PGPROC *proc;
int i,
j,
k,
last;
/* First, fill topoProcs[] array with the procs in their current order */
! proc = (PGPROC *) MAKE_PTR(waitQueue->links.next);
for (i = 0; i < queue_size; i++)
{
topoProcs[i] = proc;
! proc = (PGPROC *) MAKE_PTR(proc->links.next);
}
/*
***************
*** 743,757 ****
{
PROC_QUEUE *waitQueue = &(lock->waitProcs);
int queue_size = waitQueue->size;
! PROC *proc;
int i;
printf("%s lock %lx queue ", info, MAKE_OFFSET(lock));
! proc = (PROC *) MAKE_PTR(waitQueue->links.next);
for (i = 0; i < queue_size; i++)
{
printf(" %d", proc->pid);
! proc = (PROC *) MAKE_PTR(proc->links.next);
}
printf("\n");
fflush(stdout);
--- 743,757 ----
{
PROC_QUEUE *waitQueue = &(lock->waitProcs);
int queue_size = waitQueue->size;
! PGPROC *proc;
int i;
printf("%s lock %lx queue ", info, MAKE_OFFSET(lock));
! proc = (PGPROC *) MAKE_PTR(waitQueue->links.next);
for (i = 0; i < queue_size; i++)
{
printf(" %d", proc->pid);
! proc = (PGPROC *) MAKE_PTR(proc->links.next);
}
printf("\n");
fflush(stdout);
Index: src/backend/storage/lmgr/lock.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v
retrieving revision 1.106
diff -c -r1.106 lock.c
*** src/backend/storage/lmgr/lock.c 2002/03/06 06:10:06 1.106
--- src/backend/storage/lmgr/lock.c 2002/06/10 17:44:29
***************
*** 49,55 ****
static int WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
LOCK *lock, HOLDER *holder);
! static void LockCountMyLocks(SHMEM_OFFSET lockOffset, PROC *proc,
int *myHolding);
static char *lock_mode_names[] =
--- 49,55 ----
static int WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
LOCK *lock, HOLDER *holder);
! static void LockCountMyLocks(SHMEM_OFFSET lockOffset, PGPROC *proc,
int *myHolding);
static char *lock_mode_names[] =
***************
*** 746,752 ****
LOCKMODE lockmode,
LOCK *lock,
HOLDER *holder,
! PROC *proc,
int *myHolding) /* myHolding[] array or NULL */
{
LOCKMETHODCTL *lockctl = lockMethodTable->ctl;
--- 746,752 ----
LOCKMODE lockmode,
LOCK *lock,
HOLDER *holder,
! PGPROC *proc,
int *myHolding) /* myHolding[] array or NULL */
{
LOCKMETHODCTL *lockctl = lockMethodTable->ctl;
***************
*** 820,826 ****
* be a net slowdown.
*/
static void
! LockCountMyLocks(SHMEM_OFFSET lockOffset, PROC *proc, int *myHolding)
{
SHM_QUEUE *procHolders = &(proc->procHolders);
HOLDER *holder;
--- 820,826 ----
* be a net slowdown.
*/
static void
! LockCountMyLocks(SHMEM_OFFSET lockOffset, PGPROC *proc, int *myHolding)
{
SHM_QUEUE *procHolders = &(proc->procHolders);
HOLDER *holder;
***************
*** 944,950 ****
* this routine can only happen if we are aborting the transaction.)
*/
void
! RemoveFromWaitQueue(PROC *proc)
{
LOCK *waitLock = proc->waitLock;
LOCKMODE lockmode = proc->waitLockMode;
--- 944,950 ----
* this routine can only happen if we are aborting the transaction.)
*/
void
! RemoveFromWaitQueue(PGPROC *proc)
{
LOCK *waitLock = proc->waitLock;
LOCKMODE lockmode = proc->waitLockMode;
***************
*** 1182,1188 ****
* specified XID are released.
*/
bool
! LockReleaseAll(LOCKMETHOD lockmethod, PROC *proc,
bool allxids, TransactionId xid)
{
SHM_QUEUE *procHolders = &(proc->procHolders);
--- 1182,1188 ----
* specified XID are released.
*/
bool
! LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
bool allxids, TransactionId xid)
{
SHM_QUEUE *procHolders = &(proc->procHolders);
***************
*** 1354,1360 ****
long max_table_size = NLOCKENTS(maxBackends);
size += MAXALIGN(sizeof(PROC_HDR)); /* ProcGlobal */
! size += maxBackends * MAXALIGN(sizeof(PROC)); /* each MyProc */
size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LOCKMETHODCTL)); /* each
* lockMethodTable->ctl */
--- 1354,1360 ----
long max_table_size = NLOCKENTS(maxBackends);
size += MAXALIGN(sizeof(PROC_HDR)); /* ProcGlobal */
! size += maxBackends * MAXALIGN(sizeof(PGPROC)); /* each MyProc */
size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LOCKMETHODCTL)); /* each
* lockMethodTable->ctl */
***************
*** 1383,1389 ****
void
DumpLocks(void)
{
! PROC *proc;
SHM_QUEUE *procHolders;
HOLDER *holder;
LOCK *lock;
--- 1383,1389 ----
void
DumpLocks(void)
{
! PGPROC *proc;
SHM_QUEUE *procHolders;
HOLDER *holder;
LOCK *lock;
***************
*** 1427,1433 ****
void
DumpAllLocks(void)
{
! PROC *proc;
HOLDER *holder;
LOCK *lock;
int lockmethod = DEFAULT_LOCKMETHOD;
--- 1427,1433 ----
void
DumpAllLocks(void)
{
! PGPROC *proc;
HOLDER *holder;
LOCK *lock;
int lockmethod = DEFAULT_LOCKMETHOD;
Index: src/backend/storage/lmgr/lwlock.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/storage/lmgr/lwlock.c,v
retrieving revision 1.10
diff -c -r1.10 lwlock.c
*** src/backend/storage/lmgr/lwlock.c 2002/05/05 00:03:28 1.10
--- src/backend/storage/lmgr/lwlock.c 2002/06/10 17:44:30
***************
*** 29,40 ****
typedef struct LWLock
{
! slock_t mutex; /* Protects LWLock and queue of PROCs */
bool releaseOK; /* T if ok to release waiters */
char exclusive; /* # of exclusive holders (0 or 1) */
int shared; /* # of shared holders (0..MaxBackends) */
! PROC *head; /* head of list of waiting PROCs */
! PROC *tail; /* tail of list of waiting PROCs */
/* tail is undefined when head is NULL */
} LWLock;
--- 29,40 ----
typedef struct LWLock
{
! slock_t mutex; /* Protects LWLock and queue of PGPROCs */
bool releaseOK; /* T if ok to release waiters */
char exclusive; /* # of exclusive holders (0 or 1) */
int shared; /* # of shared holders (0..MaxBackends) */
! PGPROC *head; /* head of list of waiting PGPROCs */
! PGPROC *tail; /* tail of list of waiting PGPROCs */
/* tail is undefined when head is NULL */
} LWLock;
***************
*** 197,203 ****
LWLockAcquire(LWLockId lockid, LWLockMode mode)
{
volatile LWLock *lock = LWLockArray + lockid;
! PROC *proc = MyProc;
bool retry = false;
int extraWaits = 0;
--- 197,203 ----
LWLockAcquire(LWLockId lockid, LWLockMode mode)
{
volatile LWLock *lock = LWLockArray + lockid;
! PGPROC *proc = MyProc;
bool retry = false;
int extraWaits = 0;
***************
*** 266,277 ****
/*
* Add myself to wait queue.
*
! * If we don't have a PROC structure, there's no way to wait. This
* should never occur, since MyProc should only be null during
* shared memory initialization.
*/
if (proc == NULL)
! elog(FATAL, "LWLockAcquire: can't wait without a PROC structure");
proc->lwWaiting = true;
proc->lwExclusive = (mode == LW_EXCLUSIVE);
--- 266,277 ----
/*
* Add myself to wait queue.
*
! * If we don't have a PGPROC structure, there's no way to wait. This
* should never occur, since MyProc should only be null during
* shared memory initialization.
*/
if (proc == NULL)
! elog(FATAL, "LWLockAcquire: can't wait without a PGPROC structure");
proc->lwWaiting = true;
proc->lwExclusive = (mode == LW_EXCLUSIVE);
***************
*** 401,408 ****
LWLockRelease(LWLockId lockid)
{
volatile LWLock *lock = LWLockArray + lockid;
! PROC *head;
! PROC *proc;
int i;
PRINT_LWDEBUG("LWLockRelease", lockid, lock);
--- 401,408 ----
LWLockRelease(LWLockId lockid)
{
volatile LWLock *lock = LWLockArray + lockid;
! PGPROC *head;
! PGPROC *proc;
int i;
PRINT_LWDEBUG("LWLockRelease", lockid, lock);
***************
*** 446,452 ****
if (lock->exclusive == 0 && lock->shared == 0 && lock->releaseOK)
{
/*
! * Remove the to-be-awakened PROCs from the queue. If the
* front waiter wants exclusive lock, awaken him only.
* Otherwise awaken as many waiters as want shared access.
*/
--- 446,452 ----
if (lock->exclusive == 0 && lock->shared == 0 && lock->releaseOK)
{
/*
! * Remove the to-be-awakened PGPROCs from the queue. If the
* front waiter wants exclusive lock, awaken him only.
* Otherwise awaken as many waiters as want shared access.
*/
***************
*** 459,465 ****
proc = proc->lwWaitLink;
}
}
! /* proc is now the last PROC to be released */
lock->head = proc->lwWaitLink;
proc->lwWaitLink = NULL;
/* prevent additional wakeups until retryer gets to run */
--- 459,465 ----
proc = proc->lwWaitLink;
}
}
! /* proc is now the last PGPROC to be released */
lock->head = proc->lwWaitLink;
proc->lwWaitLink = NULL;
/* prevent additional wakeups until retryer gets to run */
Index: src/backend/storage/lmgr/proc.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v
retrieving revision 1.119
diff -c -r1.119 proc.c
*** src/backend/storage/lmgr/proc.c 2002/05/05 00:03:28 1.119
--- src/backend/storage/lmgr/proc.c 2002/06/10 17:44:30
***************
*** 55,66 ****
int DeadlockTimeout = 1000;
! PROC *MyProc = NULL;
/*
! * This spinlock protects the freelist of recycled PROC structures.
* We cannot use an LWLock because the LWLock manager depends on already
! * having a PROC and a wait semaphore! But these structures are touched
* relatively infrequently (only at backend startup or shutdown) and not for
* very long, so a spinlock is okay.
*/
--- 55,66 ----
int DeadlockTimeout = 1000;
! PGPROC *MyProc = NULL;
/*
! * This spinlock protects the freelist of recycled PGPROC structures.
* We cannot use an LWLock because the LWLock manager depends on already
! * having a PGPROC and a wait semaphore! But these structures are touched
* relatively infrequently (only at backend startup or shutdown) and not for
* very long, so a spinlock is okay.
*/
***************
*** 68,74 ****
static PROC_HDR *ProcGlobal = NULL;
! static PROC *DummyProc = NULL;
static bool waitingForLock = false;
static bool waitingForSignal = false;
--- 68,74 ----
static PROC_HDR *ProcGlobal = NULL;
! static PGPROC *DummyProc = NULL;
static bool waitingForLock = false;
static bool waitingForSignal = false;
***************
*** 129,157 ****
ProcGlobal->freeProcs = INVALID_OFFSET;
/*
! * Pre-create the PROC structures and create a semaphore for each.
*/
for (i = 0; i < maxBackends; i++)
{
! PROC *proc;
! proc = (PROC *) ShmemAlloc(sizeof(PROC));
if (!proc)
elog(FATAL, "cannot create new proc: out of memory");
! MemSet(proc, 0, sizeof(PROC));
PGSemaphoreCreate(&proc->sem);
proc->links.next = ProcGlobal->freeProcs;
ProcGlobal->freeProcs = MAKE_OFFSET(proc);
}
/*
! * Pre-allocate a PROC structure for dummy (checkpoint) processes,
* too. This does not get linked into the freeProcs list.
*/
! DummyProc = (PROC *) ShmemAlloc(sizeof(PROC));
if (!DummyProc)
elog(FATAL, "cannot create new proc: out of memory");
! MemSet(DummyProc, 0, sizeof(PROC));
DummyProc->pid = 0; /* marks DummyProc as not in use */
PGSemaphoreCreate(&DummyProc->sem);
--- 129,157 ----
ProcGlobal->freeProcs = INVALID_OFFSET;
/*
! * Pre-create the PGPROC structures and create a semaphore for each.
*/
for (i = 0; i < maxBackends; i++)
{
! PGPROC *proc;
! proc = (PGPROC *) ShmemAlloc(sizeof(PGPROC));
if (!proc)
elog(FATAL, "cannot create new proc: out of memory");
! MemSet(proc, 0, sizeof(PGPROC));
PGSemaphoreCreate(&proc->sem);
proc->links.next = ProcGlobal->freeProcs;
ProcGlobal->freeProcs = MAKE_OFFSET(proc);
}
/*
! * Pre-allocate a PGPROC structure for dummy (checkpoint) processes,
* too. This does not get linked into the freeProcs list.
*/
! DummyProc = (PGPROC *) ShmemAlloc(sizeof(PGPROC));
if (!DummyProc)
elog(FATAL, "cannot create new proc: out of memory");
! MemSet(DummyProc, 0, sizeof(PGPROC));
DummyProc->pid = 0; /* marks DummyProc as not in use */
PGSemaphoreCreate(&DummyProc->sem);
***************
*** 183,189 ****
/*
* Try to get a proc struct from the free list. If this fails,
! * we must be out of PROC structures (not to mention semaphores).
*/
SpinLockAcquire(ProcStructLock);
--- 183,189 ----
/*
* Try to get a proc struct from the free list. If this fails,
! * we must be out of PGPROC structures (not to mention semaphores).
*/
SpinLockAcquire(ProcStructLock);
***************
*** 191,204 ****
if (myOffset != INVALID_OFFSET)
{
! MyProc = (PROC *) MAKE_PTR(myOffset);
procglobal->freeProcs = MyProc->links.next;
SpinLockRelease(ProcStructLock);
}
else
{
/*
! * If we reach here, all the PROCs are in use. This is one of
* the possible places to detect "too many backends", so give the
* standard error message.
*/
--- 191,204 ----
if (myOffset != INVALID_OFFSET)
{
! MyProc = (PGPROC *) MAKE_PTR(myOffset);
procglobal->freeProcs = MyProc->links.next;
SpinLockRelease(ProcStructLock);
}
else
{
/*
! * If we reach here, all the PGPROCs are in use. This is one of
* the possible places to detect "too many backends", so give the
* standard error message.
*/
***************
*** 236,242 ****
PGSemaphoreReset(&MyProc->sem);
/*
! * Now that we have a PROC, we could try to acquire locks, so
* initialize the deadlock checker.
*/
InitDeadLockChecking();
--- 236,242 ----
PGSemaphoreReset(&MyProc->sem);
/*
! * Now that we have a PGPROC, we could try to acquire locks, so
* initialize the deadlock checker.
*/
InitDeadLockChecking();
***************
*** 246,252 ****
* InitDummyProcess -- create a dummy per-process data structure
*
* This is called by checkpoint processes so that they will have a MyProc
! * value that's real enough to let them wait for LWLocks. The PROC and
* sema that are assigned are the extra ones created during InitProcGlobal.
*/
void
--- 246,252 ----
* InitDummyProcess -- create a dummy per-process data structure
*
* This is called by checkpoint processes so that they will have a MyProc
! * value that's real enough to let them wait for LWLocks. The PGPROC and
* sema that are assigned are the extra ones created during InitProcGlobal.
*/
void
***************
*** 402,412 ****
SpinLockAcquire(ProcStructLock);
! /* Return PROC structure (and semaphore) to freelist */
MyProc->links.next = procglobal->freeProcs;
procglobal->freeProcs = MAKE_OFFSET(MyProc);
! /* PROC struct isn't mine anymore */
MyProc = NULL;
SpinLockRelease(ProcStructLock);
--- 402,412 ----
SpinLockAcquire(ProcStructLock);
! /* Return PGPROC structure (and semaphore) to freelist */
MyProc->links.next = procglobal->freeProcs;
procglobal->freeProcs = MAKE_OFFSET(MyProc);
! /* PGPROC struct isn't mine anymore */
MyProc = NULL;
SpinLockRelease(ProcStructLock);
***************
*** 414,420 ****
/*
* DummyProcKill() -- Cut-down version of ProcKill for dummy (checkpoint)
! * processes. The PROC and sema are not released, only marked
* as not-in-use.
*/
static void
--- 414,420 ----
/*
* DummyProcKill() -- Cut-down version of ProcKill for dummy (checkpoint)
! * processes. The PGPROC and sema are not released, only marked
* as not-in-use.
*/
static void
***************
*** 433,439 ****
/* Mark DummyProc no longer in use */
MyProc->pid = 0;
! /* PROC struct isn't mine anymore */
MyProc = NULL;
}
--- 433,439 ----
/* Mark DummyProc no longer in use */
MyProc->pid = 0;
! /* PGPROC struct isn't mine anymore */
MyProc = NULL;
}
***************
*** 506,512 ****
PROC_QUEUE *waitQueue = &(lock->waitProcs);
int myHeldLocks = MyProc->heldLocks;
bool early_deadlock = false;
! PROC *proc;
int i;
/*
--- 506,512 ----
PROC_QUEUE *waitQueue = &(lock->waitProcs);
int myHeldLocks = MyProc->heldLocks;
bool early_deadlock = false;
! PGPROC *proc;
int i;
/*
***************
*** 531,537 ****
{
int aheadRequests = 0;
! proc = (PROC *) MAKE_PTR(waitQueue->links.next);
for (i = 0; i < waitQueue->size; i++)
{
/* Must he wait for me? */
--- 531,537 ----
{
int aheadRequests = 0;
! proc = (PGPROC *) MAKE_PTR(waitQueue->links.next);
for (i = 0; i < waitQueue->size; i++)
{
/* Must he wait for me? */
***************
*** 568,574 ****
}
/* Nope, so advance to next waiter */
aheadRequests |= (1 << proc->waitLockMode);
! proc = (PROC *) MAKE_PTR(proc->links.next);
}
/*
--- 568,574 ----
}
/* Nope, so advance to next waiter */
aheadRequests |= (1 << proc->waitLockMode);
! proc = (PGPROC *) MAKE_PTR(proc->links.next);
}
/*
***************
*** 579,585 ****
else
{
/* I hold no locks, so I can't push in front of anyone. */
! proc = (PROC *) &(waitQueue->links);
}
/*
--- 579,585 ----
else
{
/* I hold no locks, so I can't push in front of anyone. */
! proc = (PGPROC *) &(waitQueue->links);
}
/*
***************
*** 591,597 ****
lock->waitMask |= (1 << lockmode);
! /* Set up wait information in PROC object, too */
MyProc->waitLock = lock;
MyProc->waitHolder = holder;
MyProc->waitLockMode = lockmode;
--- 591,597 ----
lock->waitMask |= (1 << lockmode);
! /* Set up wait information in PGPROC object, too */
MyProc->waitLock = lock;
MyProc->waitHolder = holder;
MyProc->waitLockMode = lockmode;
***************
*** 685,704 ****
* works correctly for that case. To clean up in failure case, would need
* to twiddle the lock's request counts too --- see RemoveFromWaitQueue.
*/
! PROC *
! ProcWakeup(PROC *proc, int errType)
{
! PROC *retProc;
/* assume that masterLock has been acquired */
/* Proc should be sleeping ... */
if (proc->links.prev == INVALID_OFFSET ||
proc->links.next == INVALID_OFFSET)
! return (PROC *) NULL;
/* Save next process before we zap the list link */
! retProc = (PROC *) MAKE_PTR(proc->links.next);
/* Remove process from wait queue */
SHMQueueDelete(&(proc->links));
--- 685,704 ----
* works correctly for that case. To clean up in failure case, would need
* to twiddle the lock's request counts too --- see RemoveFromWaitQueue.
*/
! PGPROC *
! ProcWakeup(PGPROC *proc, int errType)
{
! PGPROC *retProc;
/* assume that masterLock has been acquired */
/* Proc should be sleeping ... */
if (proc->links.prev == INVALID_OFFSET ||
proc->links.next == INVALID_OFFSET)
! return (PGPROC *) NULL;
/* Save next process before we zap the list link */
! retProc = (PGPROC *) MAKE_PTR(proc->links.next);
/* Remove process from wait queue */
SHMQueueDelete(&(proc->links));
***************
*** 726,732 ****
LOCKMETHODCTL *lockctl = lockMethodTable->ctl;
PROC_QUEUE *waitQueue = &(lock->waitProcs);
int queue_size = waitQueue->size;
! PROC *proc;
int aheadRequests = 0;
Assert(queue_size >= 0);
--- 726,732 ----
LOCKMETHODCTL *lockctl = lockMethodTable->ctl;
PROC_QUEUE *waitQueue = &(lock->waitProcs);
int queue_size = waitQueue->size;
! PGPROC *proc;
int aheadRequests = 0;
Assert(queue_size >= 0);
***************
*** 734,740 ****
if (queue_size == 0)
return;
! proc = (PROC *) MAKE_PTR(waitQueue->links.next);
while (queue_size-- > 0)
{
--- 734,740 ----
if (queue_size == 0)
return;
! proc = (PGPROC *) MAKE_PTR(waitQueue->links.next);
while (queue_size-- > 0)
{
***************
*** 769,775 ****
* checks.
*/
aheadRequests |= (1 << lockmode);
! proc = (PROC *) MAKE_PTR(proc->links.next);
}
}
--- 769,775 ----
* checks.
*/
aheadRequests |= (1 << lockmode);
! proc = (PGPROC *) MAKE_PTR(proc->links.next);
}
}
***************
*** 902,908 ****
void
ProcSendSignal(BackendId procId)
{
! PROC *proc = BackendIdGetProc(procId);
if (proc != NULL)
PGSemaphoreUnlock(&proc->sem);
--- 902,908 ----
void
ProcSendSignal(BackendId procId)
{
! PGPROC *proc = BackendIdGetProc(procId);
if (proc != NULL)
PGSemaphoreUnlock(&proc->sem);
Index: src/backend/utils/adt/date.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/date.c,v
retrieving revision 1.67
diff -c -r1.67 date.c
*** src/backend/utils/adt/date.c 2002/06/01 15:52:15 1.67
--- src/backend/utils/adt/date.c 2002/06/10 17:44:30
***************
*** 69,75 ****
case DTK_CURRENT:
elog(ERROR, "Date CURRENT no longer supported"
"\n\tdate_in() internal coding error");
! GetCurrentTime(tm);
break;
case DTK_EPOCH:
--- 69,75 ----
case DTK_CURRENT:
elog(ERROR, "Date CURRENT no longer supported"
"\n\tdate_in() internal coding error");
! GetCurrentDateTime(tm);
break;
case DTK_EPOCH:
***************
*** 1697,1703 ****
fsec_t fsec;
int tz;
! GetCurrentTime(tm);
time2tm(time, tm, &fsec);
tz = DetermineLocalTimeZone(tm);
--- 1697,1703 ----
fsec_t fsec;
int tz;
! GetCurrentDateTime(tm);
time2tm(time, tm, &fsec);
tz = DetermineLocalTimeZone(tm);
Index: src/backend/utils/adt/datetime.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/datetime.c,v
retrieving revision 1.90
diff -c -r1.90 datetime.c
*** src/backend/utils/adt/datetime.c 2002/05/17 01:19:18 1.90
--- src/backend/utils/adt/datetime.c 2002/06/10 17:44:31
***************
*** 83,89 ****
{"acst", DTZ, NEG(24)}, /* Atlantic/Porto Acre */
{"act", TZ, NEG(30)}, /* Atlantic/Porto Acre */
{DA_D, ADBC, AD}, /* "ad" for years >= 0 */
! {"abstime", IGNORE, 0}, /* for pre-v6.1 "Invalid Abstime" */
{"adt", DTZ, NEG(18)}, /* Atlantic Daylight Time */
{"aesst", DTZ, 66}, /* E. Australia */
{"aest", TZ, 60}, /* Australia Eastern Std Time */
--- 83,89 ----
{"acst", DTZ, NEG(24)}, /* Atlantic/Porto Acre */
{"act", TZ, NEG(30)}, /* Atlantic/Porto Acre */
{DA_D, ADBC, AD}, /* "ad" for years >= 0 */
! {"abstime", IGNORE_DTF, 0}, /* for pre-v6.1 "Invalid Abstime" */
{"adt", DTZ, NEG(18)}, /* Atlantic Daylight Time */
{"aesst", DTZ, 66}, /* E. Australia */
{"aest", TZ, 60}, /* Australia Eastern Std Time */
***************
*** 115,121 ****
{"apr", MONTH, 4},
{"april", MONTH, 4},
{"ast", TZ, NEG(24)}, /* Atlantic Std Time (Canada) */
! {"at", IGNORE, 0}, /* "at" (throwaway) */
{"aug", MONTH, 8},
{"august", MONTH, 8},
{"awsst", DTZ, 54}, /* W. Australia */
--- 115,121 ----
{"apr", MONTH, 4},
{"april", MONTH, 4},
{"ast", TZ, NEG(24)}, /* Atlantic Std Time (Canada) */
! {"at", IGNORE_DTF, 0}, /* "at" (throwaway) */
{"aug", MONTH, 8},
{"august", MONTH, 8},
{"awsst", DTZ, 54}, /* W. Australia */
***************
*** 348,354 ****
{"october", MONTH, 10},
{"omsst", DTZ, 42}, /* Omsk Summer Time */
{"omst", TZ, 36}, /* Omsk Time */
! {"on", IGNORE, 0}, /* "on" (throwaway) */
{"pdt", DTZ, NEG(42)}, /* Pacific Daylight Time */
#if 0
pest
--- 348,354 ----
{"october", MONTH, 10},
{"omsst", DTZ, 42}, /* Omsk Summer Time */
{"omst", TZ, 36}, /* Omsk Time */
! {"on", IGNORE_DTF, 0}, /* "on" (throwaway) */
{"pdt", DTZ, NEG(42)}, /* Pacific Daylight Time */
#if 0
pest
***************
*** 494,500 ****
static datetkn deltatktbl[] = {
/* text, token, lexval */
! {"@", IGNORE, 0}, /* postgres relative prefix */
{DAGO, AGO, 0}, /* "ago" indicates negative time offset */
{"c", UNITS, DTK_CENTURY}, /* "century" relative */
{"cent", UNITS, DTK_CENTURY}, /* "century" relative */
--- 494,500 ----
static datetkn deltatktbl[] = {
/* text, token, lexval */
! {"@", IGNORE_DTF, 0}, /* postgres relative prefix */
{DAGO, AGO, 0}, /* "ago" indicates negative time offset */
{"c", UNITS, DTK_CENTURY}, /* "century" relative */
{"cent", UNITS, DTK_CENTURY}, /* "century" relative */
***************
*** 536,542 ****
{"msecs", UNITS, DTK_MILLISEC},
{"qtr", UNITS, DTK_QUARTER}, /* "quarter" relative */
{DQUARTER, UNITS, DTK_QUARTER}, /* "quarter" relative */
! {"reltime", IGNORE, 0}, /* pre-v6.1 "Undefined Reltime" */
{"s", UNITS, DTK_SECOND},
{"sec", UNITS, DTK_SECOND},
{DSECOND, UNITS, DTK_SECOND},
--- 536,542 ----
{"msecs", UNITS, DTK_MILLISEC},
{"qtr", UNITS, DTK_QUARTER}, /* "quarter" relative */
{DQUARTER, UNITS, DTK_QUARTER}, /* "quarter" relative */
! {"reltime", IGNORE_DTF, 0}, /* pre-v6.1 "Undefined Reltime" */
{"s", UNITS, DTK_SECOND},
{"sec", UNITS, DTK_SECOND},
{DSECOND, UNITS, DTK_SECOND},
***************
*** 1198,1204 ****
case DTK_STRING:
case DTK_SPECIAL:
type = DecodeSpecial(i, field[i], &val);
! if (type == IGNORE)
continue;
tmask = DTK_M(type);
--- 1198,1204 ----
case DTK_STRING:
case DTK_SPECIAL:
type = DecodeSpecial(i, field[i], &val);
! if (type == IGNORE_DTF)
continue;
tmask = DTK_M(type);
***************
*** 1223,1229 ****
case DTK_YESTERDAY:
tmask = DTK_DATE_M;
*dtype = DTK_DATE;
! GetCurrentTime(tm);
j2date((date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - 1),
&tm->tm_year, &tm->tm_mon, &tm->tm_mday);
tm->tm_hour = 0;
--- 1223,1229 ----
case DTK_YESTERDAY:
tmask = DTK_DATE_M;
*dtype = DTK_DATE;
! GetCurrentDateTime(tm);
j2date((date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - 1),
&tm->tm_year, &tm->tm_mon, &tm->tm_mday);
tm->tm_hour = 0;
***************
*** 1234,1240 ****
case DTK_TODAY:
tmask = DTK_DATE_M;
*dtype = DTK_DATE;
! GetCurrentTime(tm);
tm->tm_hour = 0;
tm->tm_min = 0;
tm->tm_sec = 0;
--- 1234,1240 ----
case DTK_TODAY:
tmask = DTK_DATE_M;
*dtype = DTK_DATE;
! GetCurrentDateTime(tm);
tm->tm_hour = 0;
tm->tm_min = 0;
tm->tm_sec = 0;
***************
*** 1243,1249 ****
case DTK_TOMORROW:
tmask = DTK_DATE_M;
*dtype = DTK_DATE;
! GetCurrentTime(tm);
j2date((date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) + 1),
&tm->tm_year, &tm->tm_mon, &tm->tm_mday);
tm->tm_hour = 0;
--- 1243,1249 ----
case DTK_TOMORROW:
tmask = DTK_DATE_M;
*dtype = DTK_DATE;
! GetCurrentDateTime(tm);
j2date((date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) + 1),
&tm->tm_year, &tm->tm_mon, &tm->tm_mday);
tm->tm_hour = 0;
***************
*** 1319,1325 ****
ftype[i] = DTK_TZ;
break;
! case IGNORE:
break;
case AMPM:
--- 1319,1325 ----
ftype[i] = DTK_TZ;
break;
! case IGNORE_DTF:
break;
case AMPM:
***************
*** 1815,1821 ****
case DTK_STRING:
case DTK_SPECIAL:
type = DecodeSpecial(i, field[i], &val);
! if (type == IGNORE)
continue;
tmask = DTK_M(type);
--- 1815,1821 ----
case DTK_STRING:
case DTK_SPECIAL:
type = DecodeSpecial(i, field[i], &val);
! if (type == IGNORE_DTF)
continue;
tmask = DTK_M(type);
***************
*** 1885,1891 ****
ftype[i] = DTK_TZ;
break;
! case IGNORE:
break;
case AMPM:
--- 1885,1891 ----
ftype[i] = DTK_TZ;
break;
! case IGNORE_DTF:
break;
case AMPM:
***************
*** 1967,1973 ****
if ((fmask & DTK_DATE_M) == 0)
{
! GetCurrentTime(tmp);
}
else
{
--- 1967,1973 ----
if ((fmask & DTK_DATE_M) == 0)
{
! GetCurrentDateTime(tmp);
}
else
{
***************
*** 2043,2049 ****
if (isalpha((unsigned char) *field[i]))
{
type = DecodeSpecial(i, field[i], &val);
! if (type == IGNORE)
continue;
dmask = DTK_M(type);
--- 2043,2049 ----
if (isalpha((unsigned char) *field[i]))
{
type = DecodeSpecial(i, field[i], &val);
! if (type == IGNORE_DTF)
continue;
dmask = DTK_M(type);
***************
*** 2576,2582 ****
*dtype = DTK_DELTA;
! type = IGNORE;
tm->tm_year = 0;
tm->tm_mon = 0;
tm->tm_mday = 0;
--- 2576,2582 ----
*dtype = DTK_DELTA;
! type = IGNORE_DTF;
tm->tm_year = 0;
tm->tm_mon = 0;
tm->tm_mday = 0;
***************
*** 2633,2639 ****
tmask = DTK_M(TZ);
break;
}
! else if (type == IGNORE)
{
if (*cp == '.')
{
--- 2633,2639 ----
tmask = DTK_M(TZ);
break;
}
! else if (type == IGNORE_DTF)
{
if (*cp == '.')
{
***************
*** 2658,2664 ****
case DTK_NUMBER:
val = strtol(field[i], &cp, 10);
! if (type == IGNORE)
type = DTK_SECOND;
if (*cp == '.')
--- 2658,2664 ----
case DTK_NUMBER:
val = strtol(field[i], &cp, 10);
! if (type == IGNORE_DTF)
type = DTK_SECOND;
if (*cp == '.')
***************
*** 2826,2832 ****
case DTK_STRING:
case DTK_SPECIAL:
type = DecodeUnits(i, field[i], &val);
! if (type == IGNORE)
continue;
tmask = 0; /* DTK_M(type); */
--- 2826,2832 ----
case DTK_STRING:
case DTK_SPECIAL:
type = DecodeUnits(i, field[i], &val);
! if (type == IGNORE_DTF)
continue;
tmask = 0; /* DTK_M(type); */
Index: src/backend/utils/adt/nabstime.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v
retrieving revision 1.93
diff -c -r1.93 nabstime.c
*** src/backend/utils/adt/nabstime.c 2002/04/21 19:48:12 1.93
--- src/backend/utils/adt/nabstime.c 2002/06/10 17:44:31
***************
*** 239,252 ****
void
! GetCurrentTime(struct tm * tm)
{
int tz;
abstime2tm(GetCurrentTransactionStartTime(), &tz, tm, NULL);
return;
! } /* GetCurrentTime() */
void
--- 239,252 ----
void
! GetCurrentDateTime(struct tm * tm)
{
int tz;
abstime2tm(GetCurrentTransactionStartTime(), &tz, tm, NULL);
return;
! } /* GetCurrentDateTime() */
void
Index: src/backend/utils/adt/name.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/name.c,v
retrieving revision 1.35
diff -c -r1.35 name.c
*** src/backend/utils/adt/name.c 2002/05/17 20:53:33 1.35
--- src/backend/utils/adt/name.c 2002/06/10 17:44:31
***************
*** 219,231 ****
Datum
current_user(PG_FUNCTION_ARGS)
{
! PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserName(GetUserId()))));
}
Datum
session_user(PG_FUNCTION_ARGS)
{
! PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserName(GetSessionUserId()))));
}
--- 219,231 ----
Datum
current_user(PG_FUNCTION_ARGS)
{
! PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetUserId()))));
}
Datum
session_user(PG_FUNCTION_ARGS)
{
! PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetSessionUserId()))));
}
Index: src/backend/utils/init/miscinit.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/init/miscinit.c,v
retrieving revision 1.91
diff -c -r1.91 miscinit.c
*** src/backend/utils/init/miscinit.c 2002/05/17 01:19:18 1.91
--- src/backend/utils/init/miscinit.c 2002/06/10 17:44:31
***************
*** 676,682 ****
* Get user name from user id
*/
char *
! GetUserName(Oid userid)
{
HeapTuple tuple;
char *result;
--- 676,682 ----
* Get user name from user id
*/
char *
! GetUserNameFromId(Oid userid)
{
HeapTuple tuple;
char *result;
Index: src/backend/utils/init/postinit.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/init/postinit.c,v
retrieving revision 1.106
diff -c -r1.106 postinit.c
*** src/backend/utils/init/postinit.c 2002/05/20 23:51:43 1.106
--- src/backend/utils/init/postinit.c 2002/06/10 17:44:31
***************
*** 286,294 ****
*/
/*
! * Set up my per-backend PROC struct in shared memory. (We need to
* know MyDatabaseId before we can do this, since it's entered into
! * the PROC struct.)
*/
InitProcess();
--- 286,294 ----
*/
/*
! * Set up my per-backend PGPROC struct in shared memory. (We need to
* know MyDatabaseId before we can do this, since it's entered into
! * the PGPROC struct.)
*/
InitProcess();
Index: src/include/miscadmin.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/miscadmin.h,v
retrieving revision 1.104
diff -c -r1.104 miscadmin.h
*** src/include/miscadmin.h 2002/05/17 01:19:19 1.104
--- src/include/miscadmin.h 2002/06/10 17:44:31
***************
*** 203,209 ****
extern void SetDatabaseName(const char *name);
extern void SetDatabasePath(const char *path);
! extern char *GetUserName(Oid userid);
extern Oid GetUserId(void);
extern void SetUserId(Oid userid);
--- 203,209 ----
extern void SetDatabaseName(const char *name);
extern void SetDatabasePath(const char *path);
! extern char *GetUserNameFromId(Oid userid);
extern Oid GetUserId(void);
extern void SetUserId(Oid userid);
Index: src/include/storage/lock.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/storage/lock.h,v
retrieving revision 1.59
diff -c -r1.59 lock.h
*** src/include/storage/lock.h 2001/11/05 17:46:35 1.59
--- src/include/storage/lock.h 2002/06/10 17:44:31
***************
*** 22,33 ****
/* originally in procq.h */
typedef struct PROC_QUEUE
{
! SHM_QUEUE links; /* head of list of PROC objects */
int size; /* number of entries in list */
} PROC_QUEUE;
! /* struct PROC is declared in storage/proc.h, but must forward-reference it */
! typedef struct PROC PROC;
extern int max_locks_per_xact;
--- 22,33 ----
/* originally in procq.h */
typedef struct PROC_QUEUE
{
! SHM_QUEUE links; /* head of list of PGPROC objects */
int size; /* number of entries in list */
} PROC_QUEUE;
! /* struct PGPROC is declared in storage/proc.h, but must forward-reference it */
! typedef struct PGPROC PGPROC;
extern int max_locks_per_xact;
***************
*** 161,167 ****
int grantMask; /* bitmask for lock types already granted */
int waitMask; /* bitmask for lock types awaited */
SHM_QUEUE lockHolders; /* list of HOLDER objects assoc. with lock */
! PROC_QUEUE waitProcs; /* list of PROC objects waiting on lock */
int requested[MAX_LOCKMODES]; /* counts of requested
* locks */
int nRequested; /* total of requested[] array */
--- 161,167 ----
int grantMask; /* bitmask for lock types already granted */
int waitMask; /* bitmask for lock types awaited */
SHM_QUEUE lockHolders; /* list of HOLDER objects assoc. with lock */
! PROC_QUEUE waitProcs; /* list of PGPROC objects waiting on lock */
int requested[MAX_LOCKMODES]; /* counts of requested
* locks */
int nRequested; /* total of requested[] array */
***************
*** 181,188 ****
* holder hashtable. A HOLDERTAG value uniquely identifies a lock holder.
*
* There are two possible kinds of holder tags: a transaction (identified
! * both by the PROC of the backend running it, and the xact's own ID) and
! * a session (identified by backend PROC, with xid = InvalidTransactionId).
*
* Currently, session holders are used for user locks and for cross-xact
* locks obtained for VACUUM. We assume that a session lock never conflicts
--- 181,188 ----
* holder hashtable. A HOLDERTAG value uniquely identifies a lock holder.
*
* There are two possible kinds of holder tags: a transaction (identified
! * both by the PGPROC of the backend running it, and the xact's own ID) and
! * a session (identified by backend PGPROC, with xid = InvalidTransactionId).
*
* Currently, session holders are used for user locks and for cross-xact
* locks obtained for VACUUM. We assume that a session lock never conflicts
***************
*** 195,209 ****
* as soon as convenient.
*
* Each HOLDER object is linked into lists for both the associated LOCK object
! * and the owning PROC object. Note that the HOLDER is entered into these
* lists as soon as it is created, even if no lock has yet been granted.
! * A PROC that is waiting for a lock to be granted will also be linked into
* the lock's waitProcs queue.
*/
typedef struct HOLDERTAG
{
SHMEM_OFFSET lock; /* link to per-lockable-object information */
! SHMEM_OFFSET proc; /* link to PROC of owning backend */
TransactionId xid; /* xact ID, or InvalidTransactionId */
} HOLDERTAG;
--- 195,209 ----
* as soon as convenient.
*
* Each HOLDER object is linked into lists for both the associated LOCK object
! * and the owning PGPROC object. Note that the HOLDER is entered into these
* lists as soon as it is created, even if no lock has yet been granted.
! * A PGPROC that is waiting for a lock to be granted will also be linked into
* the lock's waitProcs queue.
*/
typedef struct HOLDERTAG
{
SHMEM_OFFSET lock; /* link to per-lockable-object information */
! SHMEM_OFFSET proc; /* link to PGPROC of owning backend */
TransactionId xid; /* xact ID, or InvalidTransactionId */
} HOLDERTAG;
***************
*** 235,250 ****
TransactionId xid, LOCKMODE lockmode, bool dontWait);
extern bool LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
TransactionId xid, LOCKMODE lockmode);
! extern bool LockReleaseAll(LOCKMETHOD lockmethod, PROC *proc,
bool allxids, TransactionId xid);
extern int LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
LOCKMODE lockmode,
! LOCK *lock, HOLDER *holder, PROC *proc,
int *myHolding);
extern void GrantLock(LOCK *lock, HOLDER *holder, LOCKMODE lockmode);
! extern void RemoveFromWaitQueue(PROC *proc);
extern int LockShmemSize(int maxBackends);
! extern bool DeadLockCheck(PROC *proc);
extern void InitDeadLockChecking(void);
#ifdef LOCK_DEBUG
--- 235,250 ----
TransactionId xid, LOCKMODE lockmode, bool dontWait);
extern bool LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
TransactionId xid, LOCKMODE lockmode);
! extern bool LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
bool allxids, TransactionId xid);
extern int LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
LOCKMODE lockmode,
! LOCK *lock, HOLDER *holder, PGPROC *proc,
int *myHolding);
extern void GrantLock(LOCK *lock, HOLDER *holder, LOCKMODE lockmode);
! extern void RemoveFromWaitQueue(PGPROC *proc);
extern int LockShmemSize(int maxBackends);
! extern bool DeadLockCheck(PGPROC *proc);
extern void InitDeadLockChecking(void);
#ifdef LOCK_DEBUG
Index: src/include/storage/proc.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/storage/proc.h,v
retrieving revision 1.55
diff -c -r1.55 proc.h
*** src/include/storage/proc.h 2002/05/05 00:03:29 1.55
--- src/include/storage/proc.h 2002/06/10 17:44:31
***************
*** 21,34 ****
/*
! * Each backend has a PROC struct in shared memory. There is also a list of
! * currently-unused PROC structs that will be reallocated to new backends.
*
! * links: list link for any list the PROC is in. When waiting for a lock,
! * the PROC is linked into that lock's waitProcs queue. A recycled PROC
* is linked into ProcGlobal's freeProcs list.
*/
! struct PROC
{
/* proc->links MUST BE FIRST IN STRUCT (see ProcSleep,ProcWakeup,etc) */
SHM_QUEUE links; /* list link if process is in a list */
--- 21,34 ----
/*
! * Each backend has a PGPROC struct in shared memory. There is also a list of
! * currently-unused PGPROC structs that will be reallocated to new backends.
*
! * links: list link for any list the PGPROC is in. When waiting for a lock,
! * the PGPROC is linked into that lock's waitProcs queue. A recycled PGPROC
* is linked into ProcGlobal's freeProcs list.
*/
! struct PGPROC
{
/* proc->links MUST BE FIRST IN STRUCT (see ProcSleep,ProcWakeup,etc) */
SHM_QUEUE links; /* list link if process is in a list */
***************
*** 56,62 ****
/* Info about LWLock the process is currently waiting for, if any. */
bool lwWaiting; /* true if waiting for an LW lock */
bool lwExclusive; /* true if waiting for exclusive access */
! struct PROC *lwWaitLink; /* next waiter for same LW lock */
/* Info about lock the process is currently waiting for, if any. */
/* waitLock and waitHolder are NULL if not currently waiting. */
--- 56,62 ----
/* Info about LWLock the process is currently waiting for, if any. */
bool lwWaiting; /* true if waiting for an LW lock */
bool lwExclusive; /* true if waiting for exclusive access */
! struct PGPROC *lwWaitLink; /* next waiter for same LW lock */
/* Info about lock the process is currently waiting for, if any. */
/* waitLock and waitHolder are NULL if not currently waiting. */
***************
*** 70,79 ****
* or awaited by this backend */
};
! /* NOTE: "typedef struct PROC PROC" appears in storage/lock.h. */
! extern PROC *MyProc;
/*
--- 70,79 ----
* or awaited by this backend */
};
! /* NOTE: "typedef struct PGPROC PGPROC" appears in storage/lock.h. */
! extern PGPROC *MyProc;
/*
***************
*** 81,87 ****
*/
typedef struct PROC_HDR
{
! /* Head of list of free PROC structures */
SHMEM_OFFSET freeProcs;
} PROC_HDR;
--- 81,87 ----
*/
typedef struct PROC_HDR
{
! /* Head of list of free PGPROC structures */
SHMEM_OFFSET freeProcs;
} PROC_HDR;
***************
*** 102,108 ****
extern void ProcQueueInit(PROC_QUEUE *queue);
extern int ProcSleep(LOCKMETHODTABLE *lockMethodTable, LOCKMODE lockmode,
LOCK *lock, HOLDER *holder);
! extern PROC *ProcWakeup(PROC *proc, int errType);
extern void ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock);
extern bool LockWaitCancel(void);
extern void HandleDeadLock(SIGNAL_ARGS);
--- 102,108 ----
extern void ProcQueueInit(PROC_QUEUE *queue);
extern int ProcSleep(LOCKMETHODTABLE *lockMethodTable, LOCKMODE lockmode,
LOCK *lock, HOLDER *holder);
! extern PGPROC *ProcWakeup(PGPROC *proc, int errType);
extern void ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock);
extern bool LockWaitCancel(void);
extern void HandleDeadLock(SIGNAL_ARGS);
Index: src/include/storage/sinval.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/storage/sinval.h,v
retrieving revision 1.26
diff -c -r1.26 sinval.h
*** src/include/storage/sinval.h 2002/03/03 17:47:56 1.26
--- src/include/storage/sinval.h 2002/06/10 17:44:31
***************
*** 86,92 ****
extern TransactionId GetOldestXmin(bool allDbs);
extern int CountActiveBackends(void);
! /* Use "struct PROC", not PROC, to avoid including proc.h here */
! extern struct PROC *BackendIdGetProc(BackendId procId);
#endif /* SINVAL_H */
--- 86,92 ----
extern TransactionId GetOldestXmin(bool allDbs);
extern int CountActiveBackends(void);
! /* Use "struct PGPROC", not PGPROC, to avoid including proc.h here */
! extern struct PGPROC *BackendIdGetProc(BackendId procId);
#endif /* SINVAL_H */
Index: src/include/storage/sinvaladt.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/storage/sinvaladt.h,v
retrieving revision 1.30
diff -c -r1.30 sinvaladt.h
*** src/include/storage/sinvaladt.h 2001/11/05 17:46:35 1.30
--- src/include/storage/sinvaladt.h 2002/06/10 17:44:31
***************
*** 71,77 ****
/* nextMsgNum is -1 in an inactive ProcState array entry. */
int nextMsgNum; /* next message number to read, or -1 */
bool resetState; /* true, if backend has to reset its state */
! SHMEM_OFFSET procStruct; /* location of backend's PROC struct */
} ProcState;
/* Shared cache invalidation memory segment */
--- 71,77 ----
/* nextMsgNum is -1 in an inactive ProcState array entry. */
int nextMsgNum; /* next message number to read, or -1 */
bool resetState; /* true, if backend has to reset its state */
! SHMEM_OFFSET procStruct; /* location of backend's PGPROC struct */
} ProcState;
/* Shared cache invalidation memory segment */
Index: src/include/utils/datetime.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/utils/datetime.h,v
retrieving revision 1.30
diff -c -r1.30 datetime.h
*** src/include/utils/datetime.h 2002/05/17 01:19:19 1.30
--- src/include/utils/datetime.h 2002/06/10 17:44:31
***************
*** 95,101 ****
#define TZ 5
#define DTZ 6
#define DTZMOD 7
! #define IGNORE 8
#define AMPM 9
#define HOUR 10
#define MINUTE 11
--- 95,101 ----
#define TZ 5
#define DTZ 6
#define DTZMOD 7
! #define IGNORE_DTF 8
#define AMPM 9
#define HOUR 10
#define MINUTE 11
***************
*** 260,266 ****
|| (((m) == UTIME_MAXMONTH) && ((d) <= UTIME_MAXDAY))))))
! extern void GetCurrentTime(struct tm * tm);
extern void GetCurrentTimeUsec(struct tm * tm, fsec_t *fsec);
extern void j2date(int jd, int *year, int *month, int *day);
extern int date2j(int year, int month, int day);
--- 260,266 ----
|| (((m) == UTIME_MAXMONTH) && ((d) <= UTIME_MAXDAY))))))
! extern void GetCurrentDateTime(struct tm * tm);
extern void GetCurrentTimeUsec(struct tm * tm, fsec_t *fsec);
extern void j2date(int jd, int *year, int *month, int *day);
extern int date2j(int year, int month, int day);
Index: src/include/utils/exc.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/utils/exc.h,v
retrieving revision 1.22
diff -c -r1.22 exc.h
*** src/include/utils/exc.h 2001/11/05 17:46:36 1.22
--- src/include/utils/exc.h 2002/06/10 17:44:31
***************
*** 40,46 ****
/* These are not used anywhere 1998/6/15 */
#define ExcBegin() \
do { \
! ExcFrame exception;�\
\
exception.link = ExcCurFrameP; \
if (sigsetjmp(exception.context, 1) == 0) \
--- 40,46 ----
/* These are not used anywhere 1998/6/15 */
#define ExcBegin() \
do { \
! ExcFrame exception; \
\
exception.link = ExcCurFrameP; \
if (sigsetjmp(exception.context, 1) == 0) \
Index: src/interfaces/ecpg/preproc/c_keywords.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/preproc/c_keywords.c,v
retrieving revision 1.12
diff -c -r1.12 c_keywords.c
*** src/interfaces/ecpg/preproc/c_keywords.c 2002/05/20 09:29:41 1.12
--- src/interfaces/ecpg/preproc/c_keywords.c 2002/06/10 17:44:31
***************
*** 23,34 ****
{"VARCHAR", VARCHAR},
{"auto", S_AUTO},
{"bool", SQL_BOOL},
! {"char", CHAR},
{"const", S_CONST},
{"double", DOUBLE},
{"enum", SQL_ENUM},
{"extern", S_EXTERN},
! {"float", FLOAT},
{"int", INT},
{"long", SQL_LONG},
{"register", S_REGISTER},
--- 23,34 ----
{"VARCHAR", VARCHAR},
{"auto", S_AUTO},
{"bool", SQL_BOOL},
! {"char", CHAR_P},
{"const", S_CONST},
{"double", DOUBLE},
{"enum", SQL_ENUM},
{"extern", S_EXTERN},
! {"float", FLOAT_P},
{"int", INT},
{"long", SQL_LONG},
{"register", S_REGISTER},
Index: src/interfaces/ecpg/preproc/keywords.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v
retrieving revision 1.48
diff -c -r1.48 keywords.c
*** src/interfaces/ecpg/preproc/keywords.c 2002/05/19 20:00:53 1.48
--- src/interfaces/ecpg/preproc/keywords.c 2002/06/10 17:44:31
***************
*** 62,68 ****
{"case", CASE},
{"cast", CAST},
{"chain", CHAIN},
! {"char", CHAR},
{"character", CHARACTER},
{"characteristics", CHARACTERISTICS},
{"check", CHECK},
--- 62,68 ----
{"case", CASE},
{"cast", CAST},
{"chain", CHAIN},
! {"char", CHAR_P},
{"character", CHARACTER},
{"characteristics", CHARACTERISTICS},
{"check", CHECK},
***************
*** 97,103 ****
{"deferrable", DEFERRABLE},
{"deferred", DEFERRED},
{"definer", DEFINER},
! {"delete", DELETE},
{"delimiters", DELIMITERS},
{"desc", DESC},
{"distinct", DISTINCT},
--- 97,103 ----
{"deferrable", DEFERRABLE},
{"deferred", DEFERRED},
{"definer", DEFINER},
! {"delete", DELETE_P},
{"delimiters", DELIMITERS},
{"desc", DESC},
{"distinct", DISTINCT},
***************
*** 120,126 ****
{"extract", EXTRACT},
{"false", FALSE_P},
{"fetch", FETCH},
! {"float", FLOAT},
{"for", FOR},
{"force", FORCE},
{"foreign", FOREIGN},
--- 120,126 ----
{"extract", EXTRACT},
{"false", FALSE_P},
{"fetch", FETCH},
! {"float", FLOAT_P},
{"for", FOR},
{"force", FORCE},
{"foreign", FOREIGN},
***************
*** 131,137 ****
{"function", FUNCTION},
{"global", GLOBAL},
{"grant", GRANT},
! {"group", GROUP},
{"handler", HANDLER},
{"having", HAVING},
{"hour", HOUR_P},
--- 131,137 ----
{"function", FUNCTION},
{"global", GLOBAL},
{"grant", GRANT},
! {"group", GROUP_P},
{"handler", HANDLER},
{"having", HAVING},
{"hour", HOUR_P},
***************
*** 139,145 ****
{"immediate", IMMEDIATE},
{"immutable", IMMUTABLE},
{"implicit", IMPLICIT},
! {"in", IN},
{"increment", INCREMENT},
{"index", INDEX},
{"inherits", INHERITS},
--- 139,145 ----
{"immediate", IMMEDIATE},
{"immutable", IMMUTABLE},
{"implicit", IMPLICIT},
! {"in", IN_P},
{"increment", INCREMENT},
{"index", INDEX},
{"inherits", INHERITS},
***************
*** 208,214 ****
{"option", OPTION},
{"or", OR},
{"order", ORDER},
! {"out", OUT},
{"outer", OUTER_P},
{"overlaps", OVERLAPS},
{"owner", OWNER},
--- 208,214 ----
{"option", OPTION},
{"or", OR},
{"order", ORDER},
! {"out", OUT_P},
{"outer", OUTER_P},
{"overlaps", OVERLAPS},
{"owner", OWNER},
Index: src/interfaces/ecpg/preproc/preproc.y
===================================================================
RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/preproc/preproc.y,v
retrieving revision 1.189
diff -c -r1.189 preproc.y
*** src/interfaces/ecpg/preproc/preproc.y 2002/05/20 09:29:41 1.189
--- src/interfaces/ecpg/preproc/preproc.y 2002/06/10 17:44:32
***************
*** 184,207 ****
BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BIGINT, BINARY, BIT, BOTH,
BOOLEAN, BY,
! CACHE, CALLED, CASCADE, CASE, CAST, CHAIN, CHAR, CHARACTER,
CHARACTERISTICS, CHECK, CHECKPOINT, CLOSE, CLUSTER, COALESCE, COLLATE,
COLUMN, COMMENT, COMMIT, COMMITTED, CONSTRAINT, CONSTRAINTS, COPY,
CREATE, CREATEDB, CREATEUSER, CROSS, CURRENT_DATE, CURRENT_TIME,
CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, CYCLE,
DATABASE, DAY_P, DEC, DECIMAL, DECLARE, DEFAULT, DEFERRABLE, DEFERRED,
! DEFINER, DELETE, DELIMITERS, DESC, DISTINCT, DO, DOMAIN_P, DOUBLE, DROP,
EACH, ELSE, ENCODING, ENCRYPTED, END_TRANS, ESCAPE, EXCEPT, EXCLUSIVE,
EXECUTE, EXISTS, EXPLAIN, EXTERNAL, EXTRACT,
! FALSE_P, FETCH, FLOAT, FOR, FORCE, FOREIGN, FORWARD, FREEZE, FROM,
FULL, FUNCTION,
! GLOBAL, GRANT, GROUP,
HANDLER, HAVING, HOUR_P,
! ILIKE, IMMEDIATE, IMMUTABLE, IMPLICIT, IN, INCREMENT, INDEX, INHERITS,
INITIALLY, INNER_P, INOUT, INPUT, INSENSITIVE, INSERT, INSTEAD, INT,
INTEGER, INTERSECT, INTERVAL, INTO, INVOKER, IS, ISNULL, ISOLATION,
--- 184,207 ----
BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BIGINT, BINARY, BIT, BOTH,
BOOLEAN, BY,
! CACHE, CALLED, CASCADE, CASE, CAST, CHAIN, CHAR_P, CHARACTER,
CHARACTERISTICS, CHECK, CHECKPOINT, CLOSE, CLUSTER, COALESCE, COLLATE,
COLUMN, COMMENT, COMMIT, COMMITTED, CONSTRAINT, CONSTRAINTS, COPY,
CREATE, CREATEDB, CREATEUSER, CROSS, CURRENT_DATE, CURRENT_TIME,
CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, CYCLE,
DATABASE, DAY_P, DEC, DECIMAL, DECLARE, DEFAULT, DEFERRABLE, DEFERRED,
! DEFINER, DELETE_P, DELIMITERS, DESC, DISTINCT, DO, DOMAIN_P, DOUBLE, DROP,
EACH, ELSE, ENCODING, ENCRYPTED, END_TRANS, ESCAPE, EXCEPT, EXCLUSIVE,
EXECUTE, EXISTS, EXPLAIN, EXTERNAL, EXTRACT,
! FALSE_P, FETCH, FLOAT_P, FOR, FORCE, FOREIGN, FORWARD, FREEZE, FROM,
FULL, FUNCTION,
! GLOBAL, GRANT, GROUP_P,
HANDLER, HAVING, HOUR_P,
! ILIKE, IMMEDIATE, IMMUTABLE, IMPLICIT, IN_P, INCREMENT, INDEX, INHERITS,
INITIALLY, INNER_P, INOUT, INPUT, INSENSITIVE, INSERT, INSTEAD, INT,
INTEGER, INTERSECT, INTERVAL, INTO, INVOKER, IS, ISNULL, ISOLATION,
***************
*** 218,224 ****
NUMERIC,
OF, OFF, OFFSET, OIDS, OLD, ON, ONLY, OPERATOR, OPTION, OR, ORDER,
! OUT, OUTER_P, OVERLAPS, OWNER,
PARTIAL, PASSWORD, PATH_P, PENDANT, POSITION, PRECISION, PRIMARY,
PRIOR, PRIVILEGES, PROCEDURE, PROCEDURAL,
--- 218,224 ----
NUMERIC,
OF, OFF, OFFSET, OIDS, OLD, ON, ONLY, OPERATOR, OPTION, OR, ORDER,
! OUT_P, OUTER_P, OVERLAPS, OWNER,
PARTIAL, PASSWORD, PATH_P, PENDANT, POSITION, PRECISION, PRIMARY,
PRIOR, PRIVILEGES, PROCEDURE, PROCEDURAL,
***************
*** 268,274 ****
%nonassoc ESCAPE
%nonassoc OVERLAPS
%nonassoc BETWEEN
! %nonassoc IN
%left POSTFIXOP /* dummy for postfix Op rules */
%left Op /* multi-character ops and user-defined operators */
%nonassoc NOTNULL
--- 268,274 ----
%nonassoc ESCAPE
%nonassoc OVERLAPS
%nonassoc BETWEEN
! %nonassoc IN_P
%left POSTFIXOP /* dummy for postfix Op rules */
%left Op /* multi-character ops and user-defined operators */
%nonassoc NOTNULL
***************
*** 713,719 ****
{ $$ = make_str("createuser"); }
| NOCREATEUSER
{ $$ = make_str("nocreateuser"); }
! | IN GROUP user_list
{ $$ = cat2_str(make_str("in group"), $3); }
| VALID UNTIL Sconst
{ $$ = cat2_str(make_str("valid until"), $3); }
--- 713,719 ----
{ $$ = make_str("createuser"); }
| NOCREATEUSER
{ $$ = make_str("nocreateuser"); }
! | IN_P GROUP_P user_list
{ $$ = cat2_str(make_str("in group"), $3); }
| VALID UNTIL Sconst
{ $$ = cat2_str(make_str("valid until"), $3); }
***************
*** 731,739 ****
*
*
****************************************************************************/
! CreateGroupStmt: CREATE GROUP UserId OptGroupList
{ $$ = cat_str(3, make_str("create group"), $3, $4); }
! | CREATE GROUP UserId WITH OptGroupList
{ $$ = cat_str(4, make_str("create group"), $3, make_str("with"), $5); }
;
--- 731,739 ----
*
*
****************************************************************************/
! CreateGroupStmt: CREATE GROUP_P UserId OptGroupList
{ $$ = cat_str(3, make_str("create group"), $3, $4); }
! | CREATE GROUP_P UserId WITH OptGroupList
{ $$ = cat_str(4, make_str("create group"), $3, make_str("with"), $5); }
;
***************
*** 757,765 ****
*
*
*****************************************************************************/
! AlterGroupStmt: ALTER GROUP UserId ADD USER user_list
{ $$ = cat_str(4, make_str("alter group"), $3, make_str("add user"), $6); }
! | ALTER GROUP UserId DROP USER user_list
{ $$ = cat_str(4, make_str("alter group"), $3, make_str("drop user"), $6); }
;
--- 757,765 ----
*
*
*****************************************************************************/
! AlterGroupStmt: ALTER GROUP_P UserId ADD USER user_list
{ $$ = cat_str(4, make_str("alter group"), $3, make_str("add user"), $6); }
! | ALTER GROUP_P UserId DROP USER user_list
{ $$ = cat_str(4, make_str("alter group"), $3, make_str("drop user"), $6); }
;
***************
*** 769,775 ****
*
*
*****************************************************************************/
! DropGroupStmt: DROP GROUP UserId
{ $$ = cat2_str(make_str("drop group"), $3); }
;
--- 769,775 ----
*
*
*****************************************************************************/
! DropGroupStmt: DROP GROUP_P UserId
{ $$ = cat2_str(make_str("drop group"), $3); }
;
***************
*** 1234,1240 ****
| /*EMPTY*/ { $$ = EMPTY; }
;
! key_delete: ON DELETE key_reference
{ $$ = cat2_str(make_str("on delete"), $3); }
;
--- 1234,1240 ----
| /*EMPTY*/ { $$ = EMPTY; }
;
! key_delete: ON DELETE_P key_reference
{ $$ = cat2_str(make_str("on delete"), $3); }
;
***************
*** 1396,1402 ****
;
TriggerOneEvent: INSERT { $$ = make_str("insert"); }
! | DELETE { $$ = make_str("delete"); }
| UPDATE { $$ = make_str("update"); }
;
--- 1396,1402 ----
;
TriggerOneEvent: INSERT { $$ = make_str("insert"); }
! | DELETE_P { $$ = make_str("delete"); }
| UPDATE { $$ = make_str("update"); }
;
***************
*** 1611,1617 ****
| PRIOR { $$ = make_str("prior"); }
;
! from_in: IN { $$ = make_str("in"); }
| FROM { $$ = make_str("from"); }
;
--- 1611,1617 ----
| PRIOR { $$ = make_str("prior"); }
;
! from_in: IN_P { $$ = make_str("in"); }
| FROM { $$ = make_str("from"); }
;
***************
*** 1687,1693 ****
privilege: SELECT { $$ = make_str("select"); }
| INSERT { $$ = make_str("insert"); }
| UPDATE { $$ = make_str("update"); }
! | DELETE { $$ = make_str("delete"); }
| RULE { $$ = make_str("rule"); }
| REFERENCES { $$ = make_str("references"); }
| TRIGGER { $$ = make_str("trigger"); }
--- 1687,1693 ----
privilege: SELECT { $$ = make_str("select"); }
| INSERT { $$ = make_str("insert"); }
| UPDATE { $$ = make_str("update"); }
! | DELETE_P { $$ = make_str("delete"); }
| RULE { $$ = make_str("rule"); }
| REFERENCES { $$ = make_str("references"); }
| TRIGGER { $$ = make_str("trigger"); }
***************
*** 1719,1725 ****
;
grantee: ColId { $$ = $1; }
! | GROUP ColId { $$ = cat2_str(make_str("group"), $2); }
;
opt_grant_grant_option: WITH GRANT OPTION
--- 1719,1725 ----
;
grantee: ColId { $$ = $1; }
! | GROUP_P ColId { $$ = cat2_str(make_str("group"), $2); }
;
opt_grant_grant_option: WITH GRANT OPTION
***************
*** 1854,1861 ****
| func_type { $$ = $1; }
;
! opt_arg: IN { $$ = make_str("in"); }
! | OUT
{
mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported CREATE FUNCTION/OUT will be passed to backend");
--- 1854,1861 ----
| func_type { $$ = $1; }
;
! opt_arg: IN_P { $$ = make_str("in"); }
! | OUT_P
{
mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported CREATE FUNCTION/OUT will be passed to backend");
***************
*** 2049,2055 ****
/* change me to select, update, etc. some day */
event: SELECT { $$ = make_str("select"); }
| UPDATE { $$ = make_str("update"); }
! | DELETE { $$ = make_str("delete"); }
| INSERT { $$ = make_str("insert"); }
;
--- 2049,2055 ----
/* change me to select, update, etc. some day */
event: SELECT { $$ = make_str("select"); }
| UPDATE { $$ = make_str("update"); }
! | DELETE_P { $$ = make_str("delete"); }
| INSERT { $$ = make_str("insert"); }
;
***************
*** 2354,2360 ****
*
*****************************************************************************/
! DeleteStmt: DELETE FROM relation_expr where_clause
{ $$ = cat_str(3, make_str("delete from"), $3, $4); }
;
--- 2354,2360 ----
*
*****************************************************************************/
! DeleteStmt: DELETE_P FROM relation_expr where_clause
{ $$ = cat_str(3, make_str("delete from"), $3, $4); }
;
***************
*** 2362,2368 ****
{ $$ = cat_str(4, make_str("lock"), $2, $3, $4); }
;
! opt_lock: IN lock_type MODE
{ $$ = cat_str(3, make_str("in"), $2, make_str("mode")); }
| /*EMPTY*/
{ $$ = EMPTY;}
--- 2362,2368 ----
{ $$ = cat_str(4, make_str("lock"), $2, $3, $4); }
;
! opt_lock: IN_P lock_type MODE
{ $$ = cat_str(3, make_str("in"), $2, make_str("mode")); }
| /*EMPTY*/
{ $$ = EMPTY;}
***************
*** 2600,2606 ****
* ...however, recursive addattr and rename supported. make special
* cases for these.
*/
! group_clause: GROUP BY expr_list
{ $$ = cat2_str(make_str("group by"), $3); }
| /*EMPTY*/
{ $$ = EMPTY; }
--- 2600,2606 ----
* ...however, recursive addattr and rename supported. make special
* cases for these.
*/
! group_clause: GROUP_P BY expr_list
{ $$ = cat2_str(make_str("group by"), $3); }
| /*EMPTY*/
{ $$ = EMPTY; }
***************
*** 2837,2843 ****
{ $$ = make_str("bigint"); }
| REAL
{ $$ = make_str("real"); }
! | FLOAT opt_float
{ $$ = cat2_str(make_str("float"), $2); }
| DOUBLE PRECISION
{ $$ = make_str("double precision"); }
--- 2837,2843 ----
{ $$ = make_str("bigint"); }
| REAL
{ $$ = make_str("real"); }
! | FLOAT_P opt_float
{ $$ = cat2_str(make_str("float"), $2); }
| DOUBLE PRECISION
{ $$ = make_str("double precision"); }
***************
*** 2896,2908 ****
character: CHARACTER opt_varying
{ $$ = cat2_str(make_str("character"), $2); }
! | CHAR opt_varying
{ $$ = cat2_str(make_str("char"), $2); }
| VARCHAR
{ $$ = make_str("varchar"); }
| NATIONAL CHARACTER opt_varying
{ $$ = cat2_str(make_str("national character"), $3); }
! | NATIONAL CHAR opt_varying
{ $$ = cat2_str(make_str("national char"), $3); }
| NCHAR opt_varying
{ $$ = cat2_str(make_str("nchar"), $2); }
--- 2896,2908 ----
character: CHARACTER opt_varying
{ $$ = cat2_str(make_str("character"), $2); }
! | CHAR_P opt_varying
{ $$ = cat2_str(make_str("char"), $2); }
| VARCHAR
{ $$ = make_str("varchar"); }
| NATIONAL CHARACTER opt_varying
{ $$ = cat2_str(make_str("national character"), $3); }
! | NATIONAL CHAR_P opt_varying
{ $$ = cat2_str(make_str("national char"), $3); }
| NCHAR opt_varying
{ $$ = cat2_str(make_str("nchar"), $2); }
***************
*** 2975,2983 ****
* Define row_descriptor to allow yacc to break the reduce/reduce conflict
* with singleton expressions.
*/
! row_expr: '(' row_descriptor ')' IN select_with_parens
{ $$ = cat_str(4, make_str("("), $2, make_str(") in "), $5); }
! | '(' row_descriptor ')' NOT IN select_with_parens
{ $$ = cat_str(4, make_str("("), $2, make_str(") not in "), $6); }
| '(' row_descriptor ')' all_Op sub_type select_with_parens
{ $$ = cat_str(6, make_str("("), $2, make_str(")"), $4, $5, $6); }
--- 2975,2983 ----
* Define row_descriptor to allow yacc to break the reduce/reduce conflict
* with singleton expressions.
*/
! row_expr: '(' row_descriptor ')' IN_P select_with_parens
{ $$ = cat_str(4, make_str("("), $2, make_str(") in "), $5); }
! | '(' row_descriptor ')' NOT IN_P select_with_parens
{ $$ = cat_str(4, make_str("("), $2, make_str(") not in "), $6); }
| '(' row_descriptor ')' all_Op sub_type select_with_parens
{ $$ = cat_str(6, make_str("("), $2, make_str(")"), $4, $5, $6); }
***************
*** 3140,3148 ****
{ $$ = cat_str(5, $1, make_str("between"), $3, make_str("and"), $5); }
| a_expr NOT BETWEEN b_expr AND b_expr %prec BETWEEN
{ $$ = cat_str(5, $1, make_str("not between"), $4, make_str("and"), $6); }
! | a_expr IN in_expr
{ $$ = cat_str(3, $1, make_str(" in"), $3); }
! | a_expr NOT IN in_expr
{ $$ = cat_str(3, $1, make_str(" not in "), $4); }
| a_expr all_Op sub_type select_with_parens %prec Op
{ $$ = cat_str(4, $1, $2, $3, $4); }
--- 3140,3148 ----
{ $$ = cat_str(5, $1, make_str("between"), $3, make_str("and"), $5); }
| a_expr NOT BETWEEN b_expr AND b_expr %prec BETWEEN
{ $$ = cat_str(5, $1, make_str("not between"), $4, make_str("and"), $6); }
! | a_expr IN_P in_expr
{ $$ = cat_str(3, $1, make_str(" in"), $3); }
! | a_expr NOT IN_P in_expr
{ $$ = cat_str(3, $1, make_str(" not in "), $4); }
| a_expr all_Op sub_type select_with_parens %prec Op
{ $$ = cat_str(4, $1, $2, $3, $4); }
***************
*** 3307,3313 ****
;
/* position_list uses b_expr not a_expr to avoid conflict with general IN */
! position_list: b_expr IN b_expr
{ $$ = cat_str(3, $1, make_str("in"), $3); }
| /* EMPTY */
{ $$ = EMPTY; }
--- 3307,3313 ----
;
/* position_list uses b_expr not a_expr to avoid conflict with general IN */
! position_list: b_expr IN_P b_expr
{ $$ = cat_str(3, $1, make_str("in"), $3); }
| /* EMPTY */
{ $$ = EMPTY; }
***************
*** 4146,4152 ****
$$ = ECPGt_unsigned_long;
#endif
}
! | SQL_UNSIGNED CHAR { $$ = ECPGt_unsigned_char; }
;
signed_type: SQL_SHORT { $$ = ECPGt_short; }
--- 4146,4152 ----
$$ = ECPGt_unsigned_long;
#endif
}
! | SQL_UNSIGNED CHAR_P { $$ = ECPGt_unsigned_char; }
;
signed_type: SQL_SHORT { $$ = ECPGt_short; }
***************
*** 4171,4177 ****
#endif
}
| SQL_BOOL { $$ = ECPGt_bool; }
! | CHAR { $$ = ECPGt_char; }
;
opt_signed: SQL_SIGNED
--- 4171,4177 ----
#endif
}
| SQL_BOOL { $$ = ECPGt_bool; }
! | CHAR_P { $$ = ECPGt_char; }
;
opt_signed: SQL_SIGNED
***************
*** 4823,4829 ****
| unreserved_keyword { $$ = $1; }
| col_name_keyword { $$ = $1; }
| ECPGKeywords { $$ = $1; }
! | CHAR { $$ = make_str("char"); }
;
/* Type identifier --- names that can be type names.
--- 4823,4829 ----
| unreserved_keyword { $$ = $1; }
| col_name_keyword { $$ = $1; }
| ECPGKeywords { $$ = $1; }
! | CHAR_P { $$ = make_str("char"); }
;
/* Type identifier --- names that can be type names.
***************
*** 4847,4853 ****
*/
ColLabel: ECPGColLabel { $$ = $1; }
| ECPGTypeName { $$ = $1; }
! | CHAR { $$ = make_str("char"); }
| INT { $$ = make_str("int"); }
| UNION { $$ = make_str("union"); }
;
--- 4847,4853 ----
*/
ColLabel: ECPGColLabel { $$ = $1; }
| ECPGTypeName { $$ = $1; }
! | CHAR_P { $$ = make_str("char"); }
| INT { $$ = make_str("int"); }
| UNION { $$ = make_str("union"); }
;
***************
*** 4907,4913 ****
| DAY_P { $$ = make_str("day"); }
| DECLARE { $$ = make_str("declare"); }
| DEFERRED { $$ = make_str("deferred"); }
! | DELETE { $$ = make_str("delete"); }
| DELIMITERS { $$ = make_str("delimiters"); }
| DOMAIN_P { $$ = make_str("domain"); }
| DOUBLE { $$ = make_str("double"); }
--- 4907,4913 ----
| DAY_P { $$ = make_str("day"); }
| DECLARE { $$ = make_str("declare"); }
| DEFERRED { $$ = make_str("deferred"); }
! | DELETE_P { $$ = make_str("delete"); }
| DELIMITERS { $$ = make_str("delimiters"); }
| DOMAIN_P { $$ = make_str("domain"); }
| DOUBLE { $$ = make_str("double"); }
***************
*** 4963,4969 ****
| OIDS { $$ = make_str("oids"); }
| OPERATOR { $$ = make_str("operator"); }
| OPTION { $$ = make_str("option"); }
! | OUT { $$ = make_str("out"); }
| OWNER { $$ = make_str("owner"); }
| PARTIAL { $$ = make_str("partial"); }
| PASSWORD { $$ = make_str("password"); }
--- 4963,4969 ----
| OIDS { $$ = make_str("oids"); }
| OPERATOR { $$ = make_str("operator"); }
| OPTION { $$ = make_str("option"); }
! | OUT_P { $$ = make_str("out"); }
| OWNER { $$ = make_str("owner"); }
| PARTIAL { $$ = make_str("partial"); }
| PASSWORD { $$ = make_str("password"); }
***************
*** 5044,5050 ****
BIGINT { $$ = make_str("bigint");}
| BIT { $$ = make_str("bit"); }
/* CHAR must be excluded from ECPGColLabel because of conflict with UNSIGNED
! | CHAR { $$ = make_str("char"); }
*/
| CHARACTER { $$ = make_str("character"); }
| COALESCE { $$ = make_str("coalesce"); }
--- 5044,5050 ----
BIGINT { $$ = make_str("bigint");}
| BIT { $$ = make_str("bit"); }
/* CHAR must be excluded from ECPGColLabel because of conflict with UNSIGNED
! | CHAR_P { $$ = make_str("char"); }
*/
| CHARACTER { $$ = make_str("character"); }
| COALESCE { $$ = make_str("coalesce"); }
***************
*** 5052,5058 ****
| DECIMAL { $$ = make_str("decimal"); }
| EXISTS { $$ = make_str("exists"); }
| EXTRACT { $$ = make_str("extract"); }
! | FLOAT { $$ = make_str("float"); }
/* INT must be excluded from ECPGColLabel because of conflict
| INT { $$ = make_str("int"); }
*/
--- 5052,5058 ----
| DECIMAL { $$ = make_str("decimal"); }
| EXISTS { $$ = make_str("exists"); }
| EXTRACT { $$ = make_str("extract"); }
! | FLOAT_P { $$ = make_str("float"); }
/* INT must be excluded from ECPGColLabel because of conflict
| INT { $$ = make_str("int"); }
*/
***************
*** 5091,5097 ****
| FREEZE { $$ = make_str("freeze"); }
| FULL { $$ = make_str("full"); }
| ILIKE { $$ = make_str("ilike"); }
! | IN { $$ = make_str("in"); }
| INNER_P { $$ = make_str("inner"); }
| IS { $$ = make_str("is"); }
| ISNULL { $$ = make_str("isnull"); }
--- 5091,5097 ----
| FREEZE { $$ = make_str("freeze"); }
| FULL { $$ = make_str("full"); }
| ILIKE { $$ = make_str("ilike"); }
! | IN_P { $$ = make_str("in"); }
| INNER_P { $$ = make_str("inner"); }
| IS { $$ = make_str("is"); }
| ISNULL { $$ = make_str("isnull"); }
***************
*** 5145,5151 ****
| FOREIGN { $$ = make_str("foreign"); }
| FROM { $$ = make_str("from"); }
| GRANT { $$ = make_str("grant"); }
! | GROUP { $$ = make_str("group"); }
| HAVING { $$ = make_str("having"); }
| INITIALLY { $$ = make_str("initially"); }
| INTERSECT { $$ = make_str("intersect"); }
--- 5145,5151 ----
| FOREIGN { $$ = make_str("foreign"); }
| FROM { $$ = make_str("from"); }
| GRANT { $$ = make_str("grant"); }
! | GROUP_P { $$ = make_str("group"); }
| HAVING { $$ = make_str("having"); }
| INITIALLY { $$ = make_str("initially"); }
| INTERSECT { $$ = make_str("intersect"); }
***************
*** 5305,5313 ****
| SQL_SIGNED { $$ = make_str("signed"); }
| SQL_STRUCT { $$ = make_str("struct"); }
| SQL_UNSIGNED { $$ = make_str("unsigned"); }
! | CHAR { $$ = make_str("char"); }
| DOUBLE { $$ = make_str("double"); }
! | FLOAT { $$ = make_str("float"); }
| UNION { $$ = make_str("union"); }
| VARCHAR { $$ = make_str("varchar"); }
| '[' { $$ = make_str("["); }
--- 5305,5313 ----
| SQL_SIGNED { $$ = make_str("signed"); }
| SQL_STRUCT { $$ = make_str("struct"); }
| SQL_UNSIGNED { $$ = make_str("unsigned"); }
! | CHAR_P { $$ = make_str("char"); }
| DOUBLE { $$ = make_str("double"); }
! | FLOAT_P { $$ = make_str("float"); }
| UNION { $$ = make_str("union"); }
| VARCHAR { $$ = make_str("varchar"); }
| '[' { $$ = make_str("["); }
Index: src/interfaces/libpq/fe-auth.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/interfaces/libpq/fe-auth.c,v
retrieving revision 1.65
diff -c -r1.65 fe-auth.c
*** src/interfaces/libpq/fe-auth.c 2002/04/24 23:00:40 1.65
--- src/interfaces/libpq/fe-auth.c 2002/06/10 17:44:33
***************
*** 714,720 ****
char username[128];
DWORD namesize = sizeof(username) - 1;
! if (GetUserName(username, &namesize))
name = username;
#else
struct passwd *pw = getpwuid(geteuid());
--- 714,720 ----
char username[128];
DWORD namesize = sizeof(username) - 1;
! if (GetUserNameFromId(username, &namesize))
name = username;
#else
struct passwd *pw = getpwuid(geteuid());