SET TRANSACTION ISOLATION LEVEL ...
LOCK TABLE IN ... MODE ...implemented
This commit is contained in:
parent
c7da80bb9a
commit
3498d878cb
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.17 1998/09/01 04:27:18 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.18 1998/12/18 09:10:17 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -311,6 +311,42 @@ GetNewTransactionId(TransactionId *xid)
|
|||||||
SpinRelease(OidGenLockId);
|
SpinRelease(OidGenLockId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Like GetNewTransactionId reads nextXid but don't fetch it.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ReadNewTransactionId(TransactionId *xid)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
* during bootstrap initialization, we return the special
|
||||||
|
* bootstrap transaction id.
|
||||||
|
* ----------------
|
||||||
|
*/
|
||||||
|
if (AMI_OVERRIDE)
|
||||||
|
{
|
||||||
|
TransactionIdStore(AmiTransactionId, xid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SpinAcquire(OidGenLockId); /* not good for concurrency... */
|
||||||
|
|
||||||
|
if (ShmemVariableCache->xid_count == 0)
|
||||||
|
{
|
||||||
|
TransactionId nextid;
|
||||||
|
|
||||||
|
VariableRelationGetNextXid(&nextid);
|
||||||
|
TransactionIdStore(nextid, &(ShmemVariableCache->nextXid));
|
||||||
|
ShmemVariableCache->xid_count = VAR_XID_PREFETCH;
|
||||||
|
TransactionIdAdd(&nextid, VAR_XID_PREFETCH);
|
||||||
|
VariableRelationPutNextXid(nextid);
|
||||||
|
}
|
||||||
|
|
||||||
|
TransactionIdStore(ShmemVariableCache->nextXid, xid);
|
||||||
|
|
||||||
|
SpinRelease(OidGenLockId);
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
* object id generation support
|
* object id generation support
|
||||||
* ----------------------------------------------------------------
|
* ----------------------------------------------------------------
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.27 1998/12/16 11:53:44 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.28 1998/12/18 09:10:18 vadim Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* Transaction aborts can now occur two ways:
|
* Transaction aborts can now occur two ways:
|
||||||
@ -194,7 +194,8 @@ TransactionStateData CurrentTransactionStateData = {
|
|||||||
TransactionState CurrentTransactionState =
|
TransactionState CurrentTransactionState =
|
||||||
&CurrentTransactionStateData;
|
&CurrentTransactionStateData;
|
||||||
|
|
||||||
int XactIsoLevel = XACT_SERIALIZED;
|
int DefaultXactIsoLevel = XACT_SERIALIZABLE;
|
||||||
|
int XactIsoLevel;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* info returned when the system is disabled
|
* info returned when the system is disabled
|
||||||
@ -798,6 +799,7 @@ StartTransaction()
|
|||||||
|
|
||||||
TransactionIdFlushCache();
|
TransactionIdFlushCache();
|
||||||
FreeXactSnapshot();
|
FreeXactSnapshot();
|
||||||
|
XactIsoLevel = DefaultXactIsoLevel;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* Check the current transaction state. If the transaction system
|
* Check the current transaction state. If the transaction system
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.34 1998/12/15 12:45:52 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.35 1998/12/18 09:10:18 vadim Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* The PortalExecutorHeapMemory crap needs to be eliminated
|
* The PortalExecutorHeapMemory crap needs to be eliminated
|
||||||
@ -39,6 +39,7 @@
|
|||||||
#include "utils/mcxt.h"
|
#include "utils/mcxt.h"
|
||||||
#include "utils/portal.h"
|
#include "utils/portal.h"
|
||||||
#include "utils/syscache.h"
|
#include "utils/syscache.h"
|
||||||
|
#include "miscadmin.h"
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* PortalExecutorHeapMemory stuff
|
* PortalExecutorHeapMemory stuff
|
||||||
@ -492,3 +493,25 @@ PerformAddAttribute(char *relationName,
|
|||||||
pfree(reltup);
|
pfree(reltup);
|
||||||
heap_close(rel);
|
heap_close(rel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
LockTableCommand(LockStmt *lockstmt)
|
||||||
|
{
|
||||||
|
Relation rel;
|
||||||
|
int aclresult;
|
||||||
|
|
||||||
|
rel = heap_openr(lockstmt->relname);
|
||||||
|
if (rel == NULL)
|
||||||
|
elog(ERROR, "LOCK TABLE: relation %s can't be openned", lockstmt->relname);
|
||||||
|
|
||||||
|
if (lockstmt->mode == AccessShareLock)
|
||||||
|
aclresult = pg_aclcheck(lockstmt->relname, GetPgUserName(), ACL_RD);
|
||||||
|
else
|
||||||
|
aclresult = pg_aclcheck(lockstmt->relname, GetPgUserName(), ACL_WR);
|
||||||
|
|
||||||
|
if (aclresult != ACLCHECK_OK)
|
||||||
|
elog(ERROR, "LOCK TABLE: permission denied");
|
||||||
|
|
||||||
|
LockRelation(rel, lockstmt->mode);
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -818,8 +818,8 @@ GetTupleForTrigger(EState *estate, ItemPointer tid, bool before)
|
|||||||
|
|
||||||
case HeapTupleUpdated:
|
case HeapTupleUpdated:
|
||||||
ReleaseBuffer(buffer);
|
ReleaseBuffer(buffer);
|
||||||
if (XactIsoLevel == XACT_SERIALIZED)
|
if (XactIsoLevel == XACT_SERIALIZABLE)
|
||||||
elog(ERROR, "Serialize access failed due to concurrent update");
|
elog(ERROR, "Can't serialize access due to concurrent update");
|
||||||
else
|
else
|
||||||
elog(ERROR, "Isolation level %u is not supported", XactIsoLevel);
|
elog(ERROR, "Isolation level %u is not supported", XactIsoLevel);
|
||||||
return(NULL);
|
return(NULL);
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* Routines for handling of 'SET var TO',
|
* Routines for handling of 'SET var TO',
|
||||||
* 'SHOW var' and 'RESET var' statements.
|
* 'SHOW var' and 'RESET var' statements.
|
||||||
*
|
*
|
||||||
* $Id: variable.c,v 1.17 1998/10/26 00:59:22 tgl Exp $
|
* $Id: variable.c,v 1.18 1998/12/18 09:10:20 vadim Exp $
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -15,6 +15,7 @@
|
|||||||
#include "commands/variable.h"
|
#include "commands/variable.h"
|
||||||
#include "utils/builtins.h"
|
#include "utils/builtins.h"
|
||||||
#include "optimizer/internal.h"
|
#include "optimizer/internal.h"
|
||||||
|
#include "access/xact.h"
|
||||||
#ifdef MULTIBYTE
|
#ifdef MULTIBYTE
|
||||||
#include "mb/pg_wchar.h"
|
#include "mb/pg_wchar.h"
|
||||||
#endif
|
#endif
|
||||||
@ -44,6 +45,9 @@ static bool parse_geqo(const char *);
|
|||||||
static bool show_ksqo(void);
|
static bool show_ksqo(void);
|
||||||
static bool reset_ksqo(void);
|
static bool reset_ksqo(void);
|
||||||
static bool parse_ksqo(const char *);
|
static bool parse_ksqo(const char *);
|
||||||
|
static bool show_XactIsoLevel(void);
|
||||||
|
static bool reset_XactIsoLevel(void);
|
||||||
|
static bool parse_XactIsoLevel(const char *);
|
||||||
#ifdef QUERY_LIMIT
|
#ifdef QUERY_LIMIT
|
||||||
static bool show_query_limit(void);
|
static bool show_query_limit(void);
|
||||||
static bool reset_query_limit(void);
|
static bool reset_query_limit(void);
|
||||||
@ -669,6 +673,9 @@ struct VariableParsers
|
|||||||
{
|
{
|
||||||
"ksqo", parse_ksqo, show_ksqo, reset_ksqo
|
"ksqo", parse_ksqo, show_ksqo, reset_ksqo
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"XactIsoLevel", parse_XactIsoLevel, show_XactIsoLevel, reset_XactIsoLevel
|
||||||
|
},
|
||||||
#ifdef QUERY_LIMIT
|
#ifdef QUERY_LIMIT
|
||||||
{
|
{
|
||||||
"query_limit", parse_query_limit, show_query_limit, reset_query_limit
|
"query_limit", parse_query_limit, show_query_limit, reset_query_limit
|
||||||
@ -773,3 +780,58 @@ reset_ksqo()
|
|||||||
_use_keyset_query_optimizer = false;
|
_use_keyset_query_optimizer = false;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* SET TRANSACTION */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
parse_XactIsoLevel(const char *value)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (value == NULL)
|
||||||
|
{
|
||||||
|
reset_XactIsoLevel();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SerializableSnapshot != NULL)
|
||||||
|
{
|
||||||
|
elog(ERROR, "SET TRANSACTION ISOLATION LEVEL must be called before any query");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (strcasecmp(value, "SERIALIZABLE") == 0)
|
||||||
|
XactIsoLevel = XACT_SERIALIZABLE;
|
||||||
|
else if (strcasecmp(value, "COMMITTED") == 0)
|
||||||
|
XactIsoLevel = XACT_READ_COMMITTED;
|
||||||
|
else
|
||||||
|
elog(ERROR, "Bad TRANSACTION ISOLATION LEVEL (%s)", value);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
show_XactIsoLevel()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (XactIsoLevel == XACT_SERIALIZABLE)
|
||||||
|
elog(NOTICE, "TRANSACTION ISOLATION LEVEL is SERIALIZABLE");
|
||||||
|
else
|
||||||
|
elog(NOTICE, "TRANSACTION ISOLATION LEVEL is READ COMMITTED");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
reset_XactIsoLevel()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (SerializableSnapshot != NULL)
|
||||||
|
{
|
||||||
|
elog(ERROR, "SET TRANSACTION ISOLATION LEVEL must be called before any query");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
XactIsoLevel = DefaultXactIsoLevel;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.61 1998/12/16 11:53:45 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.62 1998/12/18 09:10:21 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -1037,8 +1037,8 @@ ExecDelete(TupleTableSlot *slot,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HeapTupleUpdated:
|
case HeapTupleUpdated:
|
||||||
if (XactIsoLevel == XACT_SERIALIZED)
|
if (XactIsoLevel == XACT_SERIALIZABLE)
|
||||||
elog(ERROR, "Serialize access failed due to concurrent update");
|
elog(ERROR, "Can't serialize access due to concurrent update");
|
||||||
else
|
else
|
||||||
elog(ERROR, "Isolation level %u is not supported", XactIsoLevel);
|
elog(ERROR, "Isolation level %u is not supported", XactIsoLevel);
|
||||||
return;
|
return;
|
||||||
@ -1167,8 +1167,8 @@ ExecReplace(TupleTableSlot *slot,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HeapTupleUpdated:
|
case HeapTupleUpdated:
|
||||||
if (XactIsoLevel == XACT_SERIALIZED)
|
if (XactIsoLevel == XACT_SERIALIZABLE)
|
||||||
elog(ERROR, "Serialize access failed due to concurrent update");
|
elog(ERROR, "Can't serialize access due to concurrent update");
|
||||||
else
|
else
|
||||||
elog(ERROR, "Isolation level %u is not supported", XactIsoLevel);
|
elog(ERROR, "Isolation level %u is not supported", XactIsoLevel);
|
||||||
return;
|
return;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -10,7 +10,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.39 1998/12/13 04:37:51 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.40 1998/12/18 09:10:32 vadim Exp $
|
||||||
*
|
*
|
||||||
* HISTORY
|
* HISTORY
|
||||||
* AUTHOR DATE MAJOR EVENT
|
* AUTHOR DATE MAJOR EVENT
|
||||||
@ -45,6 +45,7 @@
|
|||||||
#include "catalog/catname.h"
|
#include "catalog/catname.h"
|
||||||
#include "utils/elog.h"
|
#include "utils/elog.h"
|
||||||
#include "access/xact.h"
|
#include "access/xact.h"
|
||||||
|
#include "storage/lmgr.h"
|
||||||
|
|
||||||
#ifdef MULTIBYTE
|
#ifdef MULTIBYTE
|
||||||
#include "mb/pg_wchar.h"
|
#include "mb/pg_wchar.h"
|
||||||
@ -133,6 +134,8 @@ Oid param_type(int t); /* used in parse_expr.c */
|
|||||||
|
|
||||||
%type <str> opt_database1, opt_database2, location, encoding
|
%type <str> opt_database1, opt_database2, location, encoding
|
||||||
|
|
||||||
|
%type <str> opt_lmode
|
||||||
|
|
||||||
%type <pboolean> user_createdb_clause, user_createuser_clause
|
%type <pboolean> user_createdb_clause, user_createuser_clause
|
||||||
%type <str> user_passwd_clause
|
%type <str> user_passwd_clause
|
||||||
%type <str> user_valid_clause
|
%type <str> user_valid_clause
|
||||||
@ -269,8 +272,8 @@ Oid param_type(int t); /* used in parse_expr.c */
|
|||||||
ELSE, END_TRANS, EXECUTE, EXISTS, EXTRACT,
|
ELSE, END_TRANS, EXECUTE, EXISTS, EXTRACT,
|
||||||
FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,
|
FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,
|
||||||
GRANT, GROUP, HAVING, HOUR_P,
|
GRANT, GROUP, HAVING, HOUR_P,
|
||||||
IN, INNER_P, INSENSITIVE, INSERT, INTERVAL, INTO, IS,
|
IN, INNER_P, INSENSITIVE, INSERT, INTERVAL, INTO, IS, ISOLATION,
|
||||||
JOIN, KEY, LANGUAGE, LEADING, LEFT, LIKE, LOCAL,
|
JOIN, KEY, LANGUAGE, LEADING, LEFT, LEVEL, LIKE, LOCAL,
|
||||||
MATCH, MINUTE_P, MONTH_P, NAMES,
|
MATCH, MINUTE_P, MONTH_P, NAMES,
|
||||||
NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULLIF, NULL_P, NUMERIC,
|
NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULLIF, NULL_P, NUMERIC,
|
||||||
OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P,
|
OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P,
|
||||||
@ -539,6 +542,24 @@ VariableSetStmt: SET ColId TO var_value
|
|||||||
n->value = $4;
|
n->value = $4;
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
|
| SET TRANSACTION ISOLATION LEVEL READ ColId
|
||||||
|
{
|
||||||
|
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||||
|
n->name = "XactIsoLevel";
|
||||||
|
n->value = $6;
|
||||||
|
if (strcasecmp(n->value, "COMMITTED"))
|
||||||
|
elog(ERROR,"parser: syntax error at or near \"%s\"", n->value);
|
||||||
|
$$ = (Node *) n;
|
||||||
|
}
|
||||||
|
| SET TRANSACTION ISOLATION LEVEL ColId
|
||||||
|
{
|
||||||
|
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||||
|
n->name = "XactIsoLevel";
|
||||||
|
n->value = $5;
|
||||||
|
if (strcasecmp(n->value, "SERIALIZABLE"))
|
||||||
|
elog(ERROR,"parser: syntax error at or near \"%s\"", n->value);
|
||||||
|
$$ = (Node *) n;
|
||||||
|
}
|
||||||
| SET NAMES encoding
|
| SET NAMES encoding
|
||||||
{
|
{
|
||||||
#ifdef MB
|
#ifdef MB
|
||||||
@ -573,6 +594,12 @@ VariableShowStmt: SHOW ColId
|
|||||||
n->name = "timezone";
|
n->name = "timezone";
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
|
| SHOW TRANSACTION ISOLATION LEVEL
|
||||||
|
{
|
||||||
|
VariableShowStmt *n = makeNode(VariableShowStmt);
|
||||||
|
n->name = "XactIsoLevel";
|
||||||
|
$$ = (Node *) n;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
VariableResetStmt: RESET ColId
|
VariableResetStmt: RESET ColId
|
||||||
@ -587,6 +614,12 @@ VariableResetStmt: RESET ColId
|
|||||||
n->name = "timezone";
|
n->name = "timezone";
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
|
| RESET TRANSACTION ISOLATION LEVEL
|
||||||
|
{
|
||||||
|
VariableResetStmt *n = makeNode(VariableResetStmt);
|
||||||
|
n->name = "XactIsoLevel";
|
||||||
|
$$ = (Node *) n;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
@ -2473,28 +2506,77 @@ DeleteStmt: DELETE FROM relation_name
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
/*
|
LockStmt: LOCK_P opt_table relation_name
|
||||||
* Total hack to just lock a table inside a transaction.
|
|
||||||
* Is it worth making this a separate command, with
|
|
||||||
* its own node type and file. I don't think so. bjm 1998/1/22
|
|
||||||
*/
|
|
||||||
LockStmt: LOCK_P opt_table relation_name
|
|
||||||
{
|
{
|
||||||
DeleteStmt *n = makeNode(DeleteStmt);
|
LockStmt *n = makeNode(LockStmt);
|
||||||
A_Const *c = makeNode(A_Const);
|
|
||||||
|
|
||||||
c->val.type = T_String;
|
|
||||||
c->val.val.str = "f";
|
|
||||||
c->typename = makeNode(TypeName);
|
|
||||||
c->typename->name = xlateSqlType("bool");
|
|
||||||
c->typename->typmod = -1;
|
|
||||||
|
|
||||||
n->relname = $3;
|
n->relname = $3;
|
||||||
n->whereClause = (Node *)c;
|
n->mode = AccessExclusiveLock;
|
||||||
|
$$ = (Node *)n;
|
||||||
|
}
|
||||||
|
| LOCK_P opt_table relation_name IN opt_lmode ROW IDENT IDENT
|
||||||
|
{
|
||||||
|
LockStmt *n = makeNode(LockStmt);
|
||||||
|
|
||||||
|
n->relname = $3;
|
||||||
|
if (strcasecmp($8, "MODE"))
|
||||||
|
elog(ERROR,"parser: syntax error at or near \"%s\"", $8);
|
||||||
|
if ($5 != NULL)
|
||||||
|
{
|
||||||
|
if (strcasecmp($5, "SHARE"))
|
||||||
|
elog(ERROR,"parser: syntax error at or near \"%s\"", $5);
|
||||||
|
if (strcasecmp($7, "EXCLUSIVE"))
|
||||||
|
elog(ERROR,"parser: syntax error at or near \"%s\"", $7);
|
||||||
|
n->mode = ShareRowExclusiveLock;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (strcasecmp($7, "SHARE") == 0)
|
||||||
|
n->mode = RowShareLock;
|
||||||
|
else if (strcasecmp($7, "EXCLUSIVE") == 0)
|
||||||
|
n->mode = RowExclusiveLock;
|
||||||
|
else
|
||||||
|
elog(ERROR,"parser: syntax error at or near \"%s\"", $7);
|
||||||
|
}
|
||||||
|
$$ = (Node *)n;
|
||||||
|
}
|
||||||
|
| LOCK_P opt_table relation_name IN IDENT IDENT IDENT
|
||||||
|
{
|
||||||
|
LockStmt *n = makeNode(LockStmt);
|
||||||
|
|
||||||
|
n->relname = $3;
|
||||||
|
if (strcasecmp($7, "MODE"))
|
||||||
|
elog(ERROR,"parser: syntax error at or near \"%s\"", $7);
|
||||||
|
if (strcasecmp($5, "ACCESS"))
|
||||||
|
elog(ERROR,"parser: syntax error at or near \"%s\"", $5);
|
||||||
|
if (strcasecmp($6, "SHARE") == 0)
|
||||||
|
n->mode = AccessShareLock;
|
||||||
|
else if (strcasecmp($6, "EXCLUSIVE") == 0)
|
||||||
|
n->mode = AccessExclusiveLock;
|
||||||
|
else
|
||||||
|
elog(ERROR,"parser: syntax error at or near \"%s\"", $6);
|
||||||
|
$$ = (Node *)n;
|
||||||
|
}
|
||||||
|
| LOCK_P opt_table relation_name IN IDENT IDENT
|
||||||
|
{
|
||||||
|
LockStmt *n = makeNode(LockStmt);
|
||||||
|
|
||||||
|
n->relname = $3;
|
||||||
|
if (strcasecmp($6, "MODE"))
|
||||||
|
elog(ERROR,"parser: syntax error at or near \"%s\"", $6);
|
||||||
|
if (strcasecmp($5, "SHARE") == 0)
|
||||||
|
n->mode = ShareLock;
|
||||||
|
else if (strcasecmp($5, "EXCLUSIVE") == 0)
|
||||||
|
n->mode = ExclusiveLock;
|
||||||
|
else
|
||||||
|
elog(ERROR,"parser: syntax error at or near \"%s\"", $5);
|
||||||
$$ = (Node *)n;
|
$$ = (Node *)n;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
opt_lmode: IDENT { $$ = $1; }
|
||||||
|
| /*EMPTY*/ { $$ = NULL; }
|
||||||
|
;
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.49 1998/12/04 15:34:29 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.50 1998/12/18 09:10:34 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -124,12 +124,14 @@ static ScanKeyword ScanKeywords[] = {
|
|||||||
{"into", INTO},
|
{"into", INTO},
|
||||||
{"is", IS},
|
{"is", IS},
|
||||||
{"isnull", ISNULL},
|
{"isnull", ISNULL},
|
||||||
|
{"isolation", ISOLATION},
|
||||||
{"join", JOIN},
|
{"join", JOIN},
|
||||||
{"key", KEY},
|
{"key", KEY},
|
||||||
{"lancompiler", LANCOMPILER},
|
{"lancompiler", LANCOMPILER},
|
||||||
{"language", LANGUAGE},
|
{"language", LANGUAGE},
|
||||||
{"leading", LEADING},
|
{"leading", LEADING},
|
||||||
{"left", LEFT},
|
{"left", LEFT},
|
||||||
|
{"level", LEVEL},
|
||||||
{"like", LIKE},
|
{"like", LIKE},
|
||||||
{"listen", LISTEN},
|
{"listen", LISTEN},
|
||||||
{"load", LOAD},
|
{"load", LOAD},
|
||||||
|
@ -94,157 +94,159 @@ typedef union
|
|||||||
#define INTERVAL 320
|
#define INTERVAL 320
|
||||||
#define INTO 321
|
#define INTO 321
|
||||||
#define IS 322
|
#define IS 322
|
||||||
#define JOIN 323
|
#define ISOLATION 323
|
||||||
#define KEY 324
|
#define JOIN 324
|
||||||
#define LANGUAGE 325
|
#define KEY 325
|
||||||
#define LEADING 326
|
#define LANGUAGE 326
|
||||||
#define LEFT 327
|
#define LEADING 327
|
||||||
#define LIKE 328
|
#define LEFT 328
|
||||||
#define LOCAL 329
|
#define LEVEL 329
|
||||||
#define MATCH 330
|
#define LIKE 330
|
||||||
#define MINUTE_P 331
|
#define LOCAL 331
|
||||||
#define MONTH_P 332
|
#define MATCH 332
|
||||||
#define NAMES 333
|
#define MINUTE_P 333
|
||||||
#define NATIONAL 334
|
#define MONTH_P 334
|
||||||
#define NATURAL 335
|
#define NAMES 335
|
||||||
#define NCHAR 336
|
#define NATIONAL 336
|
||||||
#define NEXT 337
|
#define NATURAL 337
|
||||||
#define NO 338
|
#define NCHAR 338
|
||||||
#define NOT 339
|
#define NEXT 339
|
||||||
#define NULLIF 340
|
#define NO 340
|
||||||
#define NULL_P 341
|
#define NOT 341
|
||||||
#define NUMERIC 342
|
#define NULLIF 342
|
||||||
#define OF 343
|
#define NULL_P 343
|
||||||
#define ON 344
|
#define NUMERIC 344
|
||||||
#define ONLY 345
|
#define OF 345
|
||||||
#define OPTION 346
|
#define ON 346
|
||||||
#define OR 347
|
#define ONLY 347
|
||||||
#define ORDER 348
|
#define OPTION 348
|
||||||
#define OUTER_P 349
|
#define OR 349
|
||||||
#define PARTIAL 350
|
#define ORDER 350
|
||||||
#define POSITION 351
|
#define OUTER_P 351
|
||||||
#define PRECISION 352
|
#define PARTIAL 352
|
||||||
#define PRIMARY 353
|
#define POSITION 353
|
||||||
#define PRIOR 354
|
#define PRECISION 354
|
||||||
#define PRIVILEGES 355
|
#define PRIMARY 355
|
||||||
#define PROCEDURE 356
|
#define PRIOR 356
|
||||||
#define PUBLIC 357
|
#define PRIVILEGES 357
|
||||||
#define READ 358
|
#define PROCEDURE 358
|
||||||
#define REFERENCES 359
|
#define PUBLIC 359
|
||||||
#define RELATIVE 360
|
#define READ 360
|
||||||
#define REVOKE 361
|
#define REFERENCES 361
|
||||||
#define RIGHT 362
|
#define RELATIVE 362
|
||||||
#define ROLLBACK 363
|
#define REVOKE 363
|
||||||
#define SCROLL 364
|
#define RIGHT 364
|
||||||
#define SECOND_P 365
|
#define ROLLBACK 365
|
||||||
#define SELECT 366
|
#define SCROLL 366
|
||||||
#define SET 367
|
#define SECOND_P 367
|
||||||
#define SUBSTRING 368
|
#define SELECT 368
|
||||||
#define TABLE 369
|
#define SET 369
|
||||||
#define THEN 370
|
#define SUBSTRING 370
|
||||||
#define TIME 371
|
#define TABLE 371
|
||||||
#define TIMESTAMP 372
|
#define THEN 372
|
||||||
#define TIMEZONE_HOUR 373
|
#define TIME 373
|
||||||
#define TIMEZONE_MINUTE 374
|
#define TIMESTAMP 374
|
||||||
#define TO 375
|
#define TIMEZONE_HOUR 375
|
||||||
#define TRAILING 376
|
#define TIMEZONE_MINUTE 376
|
||||||
#define TRANSACTION 377
|
#define TO 377
|
||||||
#define TRIM 378
|
#define TRAILING 378
|
||||||
#define TRUE_P 379
|
#define TRANSACTION 379
|
||||||
#define UNION 380
|
#define TRIM 380
|
||||||
#define UNIQUE 381
|
#define TRUE_P 381
|
||||||
#define UPDATE 382
|
#define UNION 382
|
||||||
#define USER 383
|
#define UNIQUE 383
|
||||||
#define USING 384
|
#define UPDATE 384
|
||||||
#define VALUES 385
|
#define USER 385
|
||||||
#define VARCHAR 386
|
#define USING 386
|
||||||
#define VARYING 387
|
#define VALUES 387
|
||||||
#define VIEW 388
|
#define VARCHAR 388
|
||||||
#define WHEN 389
|
#define VARYING 389
|
||||||
#define WHERE 390
|
#define VIEW 390
|
||||||
#define WITH 391
|
#define WHEN 391
|
||||||
#define WORK 392
|
#define WHERE 392
|
||||||
#define YEAR_P 393
|
#define WITH 393
|
||||||
#define ZONE 394
|
#define WORK 394
|
||||||
#define TRIGGER 395
|
#define YEAR_P 395
|
||||||
#define TYPE_P 396
|
#define ZONE 396
|
||||||
#define ABORT_TRANS 397
|
#define TRIGGER 397
|
||||||
#define AFTER 398
|
#define TYPE_P 398
|
||||||
#define AGGREGATE 399
|
#define ABORT_TRANS 399
|
||||||
#define ANALYZE 400
|
#define AFTER 400
|
||||||
#define BACKWARD 401
|
#define AGGREGATE 401
|
||||||
#define BEFORE 402
|
#define ANALYZE 402
|
||||||
#define BINARY 403
|
#define BACKWARD 403
|
||||||
#define CACHE 404
|
#define BEFORE 404
|
||||||
#define CLUSTER 405
|
#define BINARY 405
|
||||||
#define COPY 406
|
#define CACHE 406
|
||||||
#define CREATEDB 407
|
#define CLUSTER 407
|
||||||
#define CREATEUSER 408
|
#define COPY 408
|
||||||
#define CYCLE 409
|
#define CREATEDB 409
|
||||||
#define DATABASE 410
|
#define CREATEUSER 410
|
||||||
#define DELIMITERS 411
|
#define CYCLE 411
|
||||||
#define DO 412
|
#define DATABASE 412
|
||||||
#define EACH 413
|
#define DELIMITERS 413
|
||||||
#define ENCODING 414
|
#define DO 414
|
||||||
#define EXPLAIN 415
|
#define EACH 415
|
||||||
#define EXTEND 416
|
#define ENCODING 416
|
||||||
#define FORWARD 417
|
#define EXPLAIN 417
|
||||||
#define FUNCTION 418
|
#define EXTEND 418
|
||||||
#define HANDLER 419
|
#define FORWARD 419
|
||||||
#define INCREMENT 420
|
#define FUNCTION 420
|
||||||
#define INDEX 421
|
#define HANDLER 421
|
||||||
#define INHERITS 422
|
#define INCREMENT 422
|
||||||
#define INSTEAD 423
|
#define INDEX 423
|
||||||
#define ISNULL 424
|
#define INHERITS 424
|
||||||
#define LANCOMPILER 425
|
#define INSTEAD 425
|
||||||
#define LISTEN 426
|
#define ISNULL 426
|
||||||
#define LOAD 427
|
#define LANCOMPILER 427
|
||||||
#define LOCATION 428
|
#define LISTEN 428
|
||||||
#define LOCK_P 429
|
#define LOAD 429
|
||||||
#define MAXVALUE 430
|
#define LOCATION 430
|
||||||
#define MINVALUE 431
|
#define LOCK_P 431
|
||||||
#define MOVE 432
|
#define MAXVALUE 432
|
||||||
#define NEW 433
|
#define MINVALUE 433
|
||||||
#define NOCREATEDB 434
|
#define MOVE 434
|
||||||
#define NOCREATEUSER 435
|
#define NEW 435
|
||||||
#define NONE 436
|
#define NOCREATEDB 436
|
||||||
#define NOTHING 437
|
#define NOCREATEUSER 437
|
||||||
#define NOTIFY 438
|
#define NONE 438
|
||||||
#define NOTNULL 439
|
#define NOTHING 439
|
||||||
#define OIDS 440
|
#define NOTIFY 440
|
||||||
#define OPERATOR 441
|
#define NOTNULL 441
|
||||||
#define PASSWORD 442
|
#define OIDS 442
|
||||||
#define PROCEDURAL 443
|
#define OPERATOR 443
|
||||||
#define RECIPE 444
|
#define PASSWORD 444
|
||||||
#define RENAME 445
|
#define PROCEDURAL 445
|
||||||
#define RESET 446
|
#define RECIPE 446
|
||||||
#define RETURNS 447
|
#define RENAME 447
|
||||||
#define ROW 448
|
#define RESET 448
|
||||||
#define RULE 449
|
#define RETURNS 449
|
||||||
#define SEQUENCE 450
|
#define ROW 450
|
||||||
#define SERIAL 451
|
#define RULE 451
|
||||||
#define SETOF 452
|
#define SEQUENCE 452
|
||||||
#define SHOW 453
|
#define SERIAL 453
|
||||||
#define START 454
|
#define SETOF 454
|
||||||
#define STATEMENT 455
|
#define SHOW 455
|
||||||
#define STDIN 456
|
#define START 456
|
||||||
#define STDOUT 457
|
#define STATEMENT 457
|
||||||
#define TRUSTED 458
|
#define STDIN 458
|
||||||
#define UNLISTEN 459
|
#define STDOUT 459
|
||||||
#define UNTIL 460
|
#define TRUSTED 460
|
||||||
#define VACUUM 461
|
#define UNLISTEN 461
|
||||||
#define VALID 462
|
#define UNTIL 462
|
||||||
#define VERBOSE 463
|
#define VACUUM 463
|
||||||
#define VERSION 464
|
#define VALID 464
|
||||||
#define IDENT 465
|
#define VERBOSE 465
|
||||||
#define SCONST 466
|
#define VERSION 466
|
||||||
#define Op 467
|
#define IDENT 467
|
||||||
#define ICONST 468
|
#define SCONST 468
|
||||||
#define PARAM 469
|
#define Op 469
|
||||||
#define FCONST 470
|
#define ICONST 470
|
||||||
#define OP 471
|
#define PARAM 471
|
||||||
#define UMINUS 472
|
#define FCONST 472
|
||||||
#define TYPECAST 473
|
#define OP 473
|
||||||
|
#define UMINUS 474
|
||||||
|
#define TYPECAST 475
|
||||||
|
|
||||||
|
|
||||||
extern YYSTYPE yylval;
|
extern YYSTYPE yylval;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.33 1998/12/16 11:53:46 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.34 1998/12/18 09:10:34 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -636,7 +636,7 @@ TransactionIdIsInProgress(TransactionId xid)
|
|||||||
* Yet another strange func for this place... - vadim 07/21/98
|
* Yet another strange func for this place... - vadim 07/21/98
|
||||||
*/
|
*/
|
||||||
Snapshot
|
Snapshot
|
||||||
GetSnapshotData(void)
|
GetSnapshotData(bool serializable)
|
||||||
{
|
{
|
||||||
Snapshot snapshot = (Snapshot) malloc(sizeof(SnapshotData));
|
Snapshot snapshot = (Snapshot) malloc(sizeof(SnapshotData));
|
||||||
ShmemIndexEnt *result;
|
ShmemIndexEnt *result;
|
||||||
@ -648,8 +648,11 @@ GetSnapshotData(void)
|
|||||||
Assert(ShmemIndex);
|
Assert(ShmemIndex);
|
||||||
|
|
||||||
snapshot->xip = (TransactionId *) malloc(have * sizeof(TransactionId));
|
snapshot->xip = (TransactionId *) malloc(have * sizeof(TransactionId));
|
||||||
snapshot->xmax = cid;
|
|
||||||
snapshot->xmin = cid;
|
snapshot->xmin = cid;
|
||||||
|
if (serializable)
|
||||||
|
snapshot->xmax = cid;
|
||||||
|
else
|
||||||
|
ReadNewTransactionId(&(snapshot->xmax));
|
||||||
|
|
||||||
SpinAcquire(ShmemIndexLock);
|
SpinAcquire(ShmemIndexLock);
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.50 1998/09/25 13:47:27 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.51 1998/12/18 09:10:36 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -760,6 +760,13 @@ ProcessUtility(Node *parsetree,
|
|||||||
RemoveUser(((DropUserStmt *) parsetree)->user);
|
RemoveUser(((DropUserStmt *) parsetree)->user);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case T_LockStmt:
|
||||||
|
PS_SET_STATUS(commandTag = "LOCK TABLE");
|
||||||
|
CHECK_IF_ABORTED();
|
||||||
|
|
||||||
|
LockTableCommand((LockStmt *) parsetree);
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ******************************** default ********************************
|
* ******************************** default ********************************
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.22 1998/12/16 11:53:55 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.23 1998/12/18 09:10:39 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -30,7 +30,7 @@ SnapshotData SnapshotDirtyData;
|
|||||||
Snapshot SnapshotDirty = &SnapshotDirtyData;
|
Snapshot SnapshotDirty = &SnapshotDirtyData;
|
||||||
|
|
||||||
Snapshot QuerySnapshot = NULL;
|
Snapshot QuerySnapshot = NULL;
|
||||||
static Snapshot SerializedSnapshot = NULL;
|
Snapshot SerializableSnapshot = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX Transaction system override hacks start here
|
* XXX Transaction system override hacks start here
|
||||||
@ -551,24 +551,24 @@ SetQuerySnapshot(void)
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* 1st call in xaction */
|
/* 1st call in xaction */
|
||||||
if (SerializedSnapshot == NULL)
|
if (SerializableSnapshot == NULL)
|
||||||
{
|
{
|
||||||
SerializedSnapshot = GetSnapshotData();
|
SerializableSnapshot = GetSnapshotData(true);
|
||||||
QuerySnapshot = SerializedSnapshot;
|
QuerySnapshot = SerializableSnapshot;
|
||||||
Assert(QuerySnapshot != NULL);
|
Assert(QuerySnapshot != NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (QuerySnapshot != SerializedSnapshot)
|
if (QuerySnapshot != SerializableSnapshot)
|
||||||
{
|
{
|
||||||
free(QuerySnapshot->xip);
|
free(QuerySnapshot->xip);
|
||||||
free(QuerySnapshot);
|
free(QuerySnapshot);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (XactIsoLevel == XACT_SERIALIZED)
|
if (XactIsoLevel == XACT_SERIALIZABLE)
|
||||||
QuerySnapshot = SerializedSnapshot;
|
QuerySnapshot = SerializableSnapshot;
|
||||||
else
|
else
|
||||||
QuerySnapshot = GetSnapshotData();
|
QuerySnapshot = GetSnapshotData(false);
|
||||||
|
|
||||||
Assert(QuerySnapshot != NULL);
|
Assert(QuerySnapshot != NULL);
|
||||||
|
|
||||||
@ -578,7 +578,7 @@ void
|
|||||||
FreeXactSnapshot(void)
|
FreeXactSnapshot(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (QuerySnapshot != NULL && QuerySnapshot != SerializedSnapshot)
|
if (QuerySnapshot != NULL && QuerySnapshot != SerializableSnapshot)
|
||||||
{
|
{
|
||||||
free(QuerySnapshot->xip);
|
free(QuerySnapshot->xip);
|
||||||
free(QuerySnapshot);
|
free(QuerySnapshot);
|
||||||
@ -586,12 +586,12 @@ FreeXactSnapshot(void)
|
|||||||
|
|
||||||
QuerySnapshot = NULL;
|
QuerySnapshot = NULL;
|
||||||
|
|
||||||
if (SerializedSnapshot != NULL)
|
if (SerializableSnapshot != NULL)
|
||||||
{
|
{
|
||||||
free(SerializedSnapshot->xip);
|
free(SerializableSnapshot->xip);
|
||||||
free(SerializedSnapshot);
|
free(SerializableSnapshot);
|
||||||
}
|
}
|
||||||
|
|
||||||
SerializedSnapshot = NULL;
|
SerializableSnapshot = NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: transam.h,v 1.17 1998/12/16 11:52:10 vadim Exp $
|
* $Id: transam.h,v 1.18 1998/12/18 09:09:52 vadim Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* Transaction System Version 101 now support proper oid
|
* Transaction System Version 101 now support proper oid
|
||||||
@ -160,6 +160,7 @@ extern void TransBlockNumberSetXidStatus(Relation relation,
|
|||||||
/* in transam/varsup.c */
|
/* in transam/varsup.c */
|
||||||
extern void VariableRelationPutNextXid(TransactionId xid);
|
extern void VariableRelationPutNextXid(TransactionId xid);
|
||||||
extern void GetNewTransactionId(TransactionId *xid);
|
extern void GetNewTransactionId(TransactionId *xid);
|
||||||
|
extern void ReadNewTransactionId(TransactionId *xid);
|
||||||
extern void GetNewObjectId(Oid *oid_return);
|
extern void GetNewObjectId(Oid *oid_return);
|
||||||
extern void CheckMaxObjectId(Oid assigned_oid);
|
extern void CheckMaxObjectId(Oid assigned_oid);
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: xact.h,v 1.18 1998/12/15 12:46:47 vadim Exp $
|
* $Id: xact.h,v 1.19 1998/12/18 09:09:52 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -36,8 +36,9 @@ typedef struct TransactionStateData
|
|||||||
#define XACT_DIRTY_READ 0 /* not implemented */
|
#define XACT_DIRTY_READ 0 /* not implemented */
|
||||||
#define XACT_READ_COMMITTED 1
|
#define XACT_READ_COMMITTED 1
|
||||||
#define XACT_REPEATABLE_READ 2 /* not implemented */
|
#define XACT_REPEATABLE_READ 2 /* not implemented */
|
||||||
#define XACT_SERIALIZED 3
|
#define XACT_SERIALIZABLE 3
|
||||||
|
|
||||||
|
extern int DefaultXactIsoLevel;
|
||||||
extern int XactIsoLevel;
|
extern int XactIsoLevel;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: command.h,v 1.10 1998/09/01 04:35:25 momjian Exp $
|
* $Id: command.h,v 1.11 1998/12/18 09:09:52 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -44,4 +44,6 @@ extern void PortalCleanup(Portal portal);
|
|||||||
extern void PerformAddAttribute(char *relationName, char *userName,
|
extern void PerformAddAttribute(char *relationName, char *userName,
|
||||||
bool inh, ColumnDef *colDef);
|
bool inh, ColumnDef *colDef);
|
||||||
|
|
||||||
|
extern void LockTableCommand(LockStmt *lockstmt);
|
||||||
|
|
||||||
#endif /* COMMAND_H */
|
#endif /* COMMAND_H */
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: nodes.h,v 1.32 1998/12/04 15:34:44 thomas Exp $
|
* $Id: nodes.h,v 1.33 1998/12/18 09:09:53 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -190,6 +190,7 @@ typedef enum NodeTag
|
|||||||
T_CreateUserStmt,
|
T_CreateUserStmt,
|
||||||
T_AlterUserStmt,
|
T_AlterUserStmt,
|
||||||
T_DropUserStmt,
|
T_DropUserStmt,
|
||||||
|
T_LockStmt,
|
||||||
|
|
||||||
T_A_Expr = 700,
|
T_A_Expr = 700,
|
||||||
T_Attr,
|
T_Attr,
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: parsenodes.h,v 1.62 1998/12/04 15:34:44 thomas Exp $
|
* $Id: parsenodes.h,v 1.63 1998/12/18 09:09:54 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -574,6 +574,16 @@ typedef struct VariableResetStmt
|
|||||||
char *name;
|
char *name;
|
||||||
} VariableResetStmt;
|
} VariableResetStmt;
|
||||||
|
|
||||||
|
/* ----------------------
|
||||||
|
* LOCK Statement
|
||||||
|
* ----------------------
|
||||||
|
*/
|
||||||
|
typedef struct LockStmt
|
||||||
|
{
|
||||||
|
NodeTag type;
|
||||||
|
char *relname; /* relation to lock */
|
||||||
|
int mode; /* lock mode */
|
||||||
|
} LockStmt;
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Optimizable Statements
|
* Optimizable Statements
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: tqual.h,v 1.17 1998/12/16 11:52:11 vadim Exp $
|
* $Id: tqual.h,v 1.18 1998/12/18 09:09:55 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -31,6 +31,7 @@ typedef SnapshotData *Snapshot;
|
|||||||
|
|
||||||
extern Snapshot SnapshotDirty;
|
extern Snapshot SnapshotDirty;
|
||||||
extern Snapshot QuerySnapshot;
|
extern Snapshot QuerySnapshot;
|
||||||
|
extern Snapshot SerializableSnapshot;
|
||||||
|
|
||||||
#define IsSnapshotNow(snapshot) ((Snapshot) snapshot == SnapshotNow)
|
#define IsSnapshotNow(snapshot) ((Snapshot) snapshot == SnapshotNow)
|
||||||
#define IsSnapshotSelf(snapshot) ((Snapshot) snapshot == SnapshotSelf)
|
#define IsSnapshotSelf(snapshot) ((Snapshot) snapshot == SnapshotSelf)
|
||||||
@ -99,7 +100,7 @@ extern int HeapTupleSatisfiesUpdate(HeapTuple tuple);
|
|||||||
|
|
||||||
extern void setheapoverride(bool on);
|
extern void setheapoverride(bool on);
|
||||||
|
|
||||||
extern Snapshot GetSnapshotData(void);
|
extern Snapshot GetSnapshotData(bool serializable);
|
||||||
extern void SetQuerySnapshot(void);
|
extern void SetQuerySnapshot(void);
|
||||||
extern void FreeXactSnapshot(void);
|
extern void FreeXactSnapshot(void);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user