diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-08-01 20:31:16 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-08-01 20:31:16 +0000 |
commit | 2a4fad1a0e43d6375ffa8eddb2d8dfa1ed36593f (patch) | |
tree | bb2bc2208507b0ab2403850e8dd01003a4ed73e9 /src/backend/rewrite/rewriteHandler.c | |
parent | ca7abcd89dbeecb82cde50fccf4f6c483244fdf7 (diff) | |
download | postgresql-2a4fad1a0e43d6375ffa8eddb2d8dfa1ed36593f.tar.gz postgresql-2a4fad1a0e43d6375ffa8eddb2d8dfa1ed36593f.zip |
Add NOWAIT option to SELECT FOR UPDATE/SHARE.
Original patch by Hans-Juergen Schoenig, revisions by Karel Zak
and Tom Lane.
Diffstat (limited to 'src/backend/rewrite/rewriteHandler.c')
-rw-r--r-- | src/backend/rewrite/rewriteHandler.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 428bf7ba44f..1c58ccd7ca3 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/rewrite/rewriteHandler.c,v 1.156 2005/07/28 22:27:02 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/rewrite/rewriteHandler.c,v 1.157 2005/08/01 20:31:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -52,7 +52,8 @@ static TargetEntry *process_matched_tle(TargetEntry *src_tle, TargetEntry *prior_tle, const char *attrName); static Node *get_assignment_input(Node *node); -static void markQueryForLocking(Query *qry, bool forUpdate, bool skipOldNew); +static void markQueryForLocking(Query *qry, bool forUpdate, bool noWait, + bool skipOldNew); static List *matchLocks(CmdType event, RuleLock *rulelocks, int varno, Query *parsetree); static Query *fireRIRrules(Query *parsetree, List *activeRIRs); @@ -962,7 +963,8 @@ ApplyRetrieveRule(Query *parsetree, /* * Set up the view's referenced tables as if FOR UPDATE/SHARE. */ - markQueryForLocking(rule_action, parsetree->forUpdate, true); + markQueryForLocking(rule_action, parsetree->forUpdate, + parsetree->rowNoWait, true); } return parsetree; @@ -977,16 +979,24 @@ ApplyRetrieveRule(Query *parsetree, * NB: this must agree with the parser's transformLocking() routine. */ static void -markQueryForLocking(Query *qry, bool forUpdate, bool skipOldNew) +markQueryForLocking(Query *qry, bool forUpdate, bool noWait, bool skipOldNew) { Index rti = 0; ListCell *l; - if (qry->rowMarks && forUpdate != qry->forUpdate) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot use both FOR UPDATE and FOR SHARE in one query"))); + if (qry->rowMarks) + { + if (forUpdate != qry->forUpdate) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot use both FOR UPDATE and FOR SHARE in one query"))); + if (noWait != qry->rowNoWait) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot use both wait and NOWAIT in one query"))); + } qry->forUpdate = forUpdate; + qry->rowNoWait = noWait; foreach(l, qry->rtable) { @@ -1007,7 +1017,7 @@ markQueryForLocking(Query *qry, bool forUpdate, bool skipOldNew) else if (rte->rtekind == RTE_SUBQUERY) { /* FOR UPDATE/SHARE of subquery is propagated to subquery's rels */ - markQueryForLocking(rte->subquery, forUpdate, false); + markQueryForLocking(rte->subquery, forUpdate, noWait, false); } } } |