mirror of
https://github.com/postgres/postgres.git
synced 2025-11-10 17:42:29 +03:00
SELECT FOR UPDATE is implemented...
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: analyze.c,v 1.94 1999/01/21 22:48:07 momjian Exp $
|
||||
* $Id: analyze.c,v 1.95 1999/01/25 12:01:05 vadim Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -45,7 +45,8 @@ static Query *transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt);
|
||||
static Query *transformCursorStmt(ParseState *pstate, SelectStmt *stmt);
|
||||
static Query *transformCreateStmt(ParseState *pstate, CreateStmt *stmt);
|
||||
|
||||
static void transformForUpdate(Query *qry, List *forUpdate);
|
||||
static void transformForUpdate(Query *qry, List *forUpdate);
|
||||
void CheckSelectForUpdate(Query *qry);
|
||||
|
||||
List *extras_before = NIL;
|
||||
List *extras_after = NIL;
|
||||
@@ -1134,6 +1135,19 @@ Node *A_Expr_to_Expr(Node *ptr, bool *intersect_present)
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
CheckSelectForUpdate(Query *qry)
|
||||
{
|
||||
if (qry->unionClause != NULL)
|
||||
elog(ERROR, "SELECT FOR UPDATE is not allowed with UNION/INTERSECT/EXCEPT clause");
|
||||
if (qry->uniqueFlag != NULL)
|
||||
elog(ERROR, "SELECT FOR UPDATE is not allowed with DISTINCT clause");
|
||||
if (qry->groupClause != NULL)
|
||||
elog(ERROR, "SELECT FOR UPDATE is not allowed with GROUP BY clause");
|
||||
if (qry->hasAggs)
|
||||
elog(ERROR, "SELECT FOR UPDATE is not allowed with AGGREGATE");
|
||||
}
|
||||
|
||||
static void
|
||||
transformForUpdate(Query *qry, List *forUpdate)
|
||||
{
|
||||
@@ -1142,6 +1156,8 @@ transformForUpdate(Query *qry, List *forUpdate)
|
||||
List *l;
|
||||
Index i;
|
||||
|
||||
CheckSelectForUpdate(qry);
|
||||
|
||||
if (lfirst(forUpdate) == NULL) /* all tables */
|
||||
{
|
||||
i = 1;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.48 1999/01/22 19:35:54 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.49 1999/01/25 12:01:13 vadim Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
@@ -2798,19 +2798,8 @@ SelectStmt: select_w_o_sort sort_clause for_update_clause
|
||||
first_select->forUpdate = $3;
|
||||
$$ = (Node *)first_select;
|
||||
}
|
||||
if (((SelectStmt *)$$)->forUpdate != NULL)
|
||||
{
|
||||
SelectStmt *n = (SelectStmt *)$$;
|
||||
|
||||
if (n->unionClause != NULL)
|
||||
elog(ERROR, "SELECT FOR UPDATE is not allowed with UNION/INTERSECT/EXCEPT clause");
|
||||
if (n->unique != NULL)
|
||||
elog(ERROR, "SELECT FOR UPDATE is not allowed with DISTINCT clause");
|
||||
if (n->groupClause != NULL)
|
||||
elog(ERROR, "SELECT FOR UPDATE is not allowed with GROUP BY clause");
|
||||
if (n->havingClause != NULL)
|
||||
elog(ERROR, "SELECT FOR UPDATE is not allowed with HAVING clause");
|
||||
}
|
||||
if (((SelectStmt *)$$)->forUpdate != NULL && QueryIsRule)
|
||||
elog(ERROR, "SELECT FOR UPDATE is not allowed in RULES");
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user