Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit12be3e0

Browse files
committed
FOR UPDATE is in parser & rules.
1 parentc8ae6af commit12be3e0

File tree

10 files changed

+745
-591
lines changed

10 files changed

+745
-591
lines changed

‎src/backend/Makefile

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#
3535
#
3636
# IDENTIFICATION
37-
# $Header: /cvsroot/pgsql/src/backend/Makefile,v 1.35 1999/01/17 06:18:11 momjian Exp $
37+
# $Header: /cvsroot/pgsql/src/backend/Makefile,v 1.36 1999/01/21 16:08:36 vadim Exp $
3838
#
3939
#-------------------------------------------------------------------------
4040

@@ -111,9 +111,6 @@ catalog/global1.description catalog/local1_template1.description:
111111
postgres.o:$(OBJS)
112112
$(CC) -r -o postgres.o$(OBJS)$(LDFLAGS)
113113

114-
fast:
115-
$(CC) -r -o postgres.o$(OBJS)$(LDFLAGS)
116-
117114
############################################################################
118115
# The following targets are specified in make commands that appear in the
119116
# make files in our subdirectories.

‎src/backend/nodes/outfuncs.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*
66
* Copyright (c) 1994, Regents of the University of California
77
*
8-
* $Id: outfuncs.c,v 1.59 1999/01/18 00:09:45 momjian Exp $
8+
* $Id: outfuncs.c,v 1.60 1999/01/21 16:08:36 vadim Exp $
99
*
1010
* NOTES
1111
* Every (plan) node in POSTGRES has an associated "out" routine which
@@ -162,6 +162,7 @@ _outIndexElem(StringInfo str, IndexElem *node)
162162
staticvoid
163163
_outQuery(StringInfostr,Query*node)
164164
{
165+
165166
appendStringInfo(str," QUERY :command %d ",node->commandType);
166167

167168
if (node->utilityStmt)
@@ -235,6 +236,10 @@ _outQuery(StringInfo str, Query *node)
235236

236237
appendStringInfo(str," :limitCount ");
237238
_outNode(str,node->limitCount);
239+
240+
appendStringInfo(str," :rowMark ");
241+
_outNode(str,node->rowMark);
242+
238243
}
239244

240245
staticvoid
@@ -907,6 +912,12 @@ _outRangeTblEntry(StringInfo str, RangeTblEntry *node)
907912
node->skipAcl ?"true" :"false");
908913
}
909914

915+
staticvoid
916+
_outRowMark(StringInfostr,RowMark*node)
917+
{
918+
appendStringInfo(str," ROWMARK :rti %u :info %u",node->rti,node->info);
919+
}
920+
910921
/*
911922
*Path is a subclass of Node.
912923
*/
@@ -1528,6 +1539,9 @@ _outNode(StringInfo str, void *obj)
15281539
caseT_RangeTblEntry:
15291540
_outRangeTblEntry(str,obj);
15301541
break;
1542+
caseT_RowMark:
1543+
_outRowMark(str,obj);
1544+
break;
15311545
caseT_Path:
15321546
_outPath(str,obj);
15331547
break;

‎src/backend/nodes/readfuncs.c

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.41 1999/01/18 00:09:46 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.42 1999/01/21 16:08:37 vadim Exp $
1111
*
1212
* NOTES
1313
* Most of the read functions for plan nodes are tested. (In fact, they
@@ -174,6 +174,9 @@ _readQuery()
174174
token=lsptok(NULL,&length);/* skip :limitCount */
175175
local_node->limitCount=nodeRead(true);
176176

177+
token=lsptok(NULL,&length);/* skip :rowMark */
178+
local_node->rowMark=nodeRead(true);
179+
177180
returnlocal_node;
178181
}
179182

@@ -1427,6 +1430,24 @@ _readRangeTblEntry()
14271430
returnlocal_node;
14281431
}
14291432

1433+
staticRowMark*
1434+
_readRowMark()
1435+
{
1436+
RowMark*local_node=makeNode(RowMark);
1437+
char*token;
1438+
intlength;
1439+
1440+
token=lsptok(NULL,&length);/* eat :rti */
1441+
token=lsptok(NULL,&length);/* get :rti */
1442+
local_node->rti=strtoul(token,NULL,10);
1443+
1444+
token=lsptok(NULL,&length);/* eat :info */
1445+
token=lsptok(NULL,&length);/* get :info */
1446+
local_node->info=strtoul(token,NULL,10);
1447+
1448+
returnlocal_node;
1449+
}
1450+
14301451
/* ----------------
14311452
*_readPath
14321453
*
@@ -2090,6 +2111,8 @@ parsePlanString(void)
20902111
return_value=_readCaseExpr();
20912112
elseif (!strncmp(token,"WHEN",length))
20922113
return_value=_readCaseWhen();
2114+
elseif (!strncmp(token,"ROWMARK",length))
2115+
return_value=_readRowMark();
20932116
else
20942117
elog(ERROR,"badly formatted planstring \"%.10s\"...\n",token);
20952118

‎src/backend/parser/analyze.c

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*
66
* Copyright (c) 1994, Regents of the University of California
77
*
8-
* $Id: analyze.c,v 1.92 1999/01/18 00:09:49 momjian Exp $
8+
* $Id: analyze.c,v 1.93 1999/01/21 16:08:38 vadim Exp $
99
*
1010
*-------------------------------------------------------------------------
1111
*/
@@ -45,6 +45,8 @@ static Query *transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt);
4545
staticQuery*transformCursorStmt(ParseState*pstate,SelectStmt*stmt);
4646
staticQuery*transformCreateStmt(ParseState*pstate,CreateStmt*stmt);
4747

48+
staticvoidtransformForUpdate(Query*qry,List*forUpdate);
49+
4850
List*extras_before=NIL;
4951
List*extras_after=NIL;
5052

@@ -387,7 +389,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
387389
/*
388390
* The INSERT INTO ... SELECT ... could have a UNION in child, so
389391
* unionClause may be false
390-
*/
392+
, */
391393
qry->unionall=stmt->unionall;
392394

393395
/***S*I***/
@@ -408,6 +410,9 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
408410
return (Query*)NIL;
409411
}
410412

413+
if (stmt->forUpdate!=NULL)
414+
transformForUpdate(qry,stmt->forUpdate);
415+
411416
return (Query*)qry;
412417
}
413418

@@ -971,6 +976,9 @@ transformSelectStmt(ParseState *pstate, SelectStmt *stmt)
971976
return (Query*)NIL;
972977
}
973978

979+
if (stmt->forUpdate!=NULL)
980+
transformForUpdate(qry,stmt->forUpdate);
981+
974982
return (Query*)qry;
975983
}
976984

@@ -1121,3 +1129,59 @@ Node *A_Expr_to_Expr(Node *ptr, bool *intersect_present)
11211129
}
11221130
returnresult;
11231131
}
1132+
1133+
staticvoid
1134+
transformForUpdate(Query*qry,List*forUpdate)
1135+
{
1136+
List*rowMark=NULL;
1137+
RowMark*newrm;
1138+
List*l;
1139+
Indexi;
1140+
1141+
if (lfirst(forUpdate)==NULL)/* all tables */
1142+
{
1143+
i=1;
1144+
foreach (l,qry->rtable)
1145+
{
1146+
newrm=makeNode(RowMark);
1147+
newrm->rti=i++;
1148+
newrm->info=ROW_MARK_FOR_UPDATE|ROW_ACL_FOR_UPDATE;
1149+
rowMark=lappend(rowMark,newrm);
1150+
}
1151+
qry->rowMark=nconc(qry->rowMark,rowMark);
1152+
return;
1153+
}
1154+
1155+
foreach (l,forUpdate)
1156+
{
1157+
List*l2;
1158+
List*l3;
1159+
1160+
i=1;
1161+
foreach (l2,qry->rtable)
1162+
{
1163+
if (strcmp(((RangeTblEntry*)lfirst(l2))->refname,lfirst(l))==0)
1164+
{
1165+
foreach (l3,rowMark)
1166+
{
1167+
if (((RowMark*)lfirst(l3))->rti==i)/* duplicate */
1168+
break;
1169+
}
1170+
if (l3==NULL)
1171+
{
1172+
newrm=makeNode(RowMark);
1173+
newrm->rti=i;
1174+
newrm->info=ROW_MARK_FOR_UPDATE|ROW_ACL_FOR_UPDATE;
1175+
rowMark=lappend(rowMark,newrm);
1176+
}
1177+
break;
1178+
}
1179+
i++;
1180+
}
1181+
if (l2==NULL)
1182+
elog(ERROR,"FOR UPDATE: relation %s not found in FROM clause",lfirst(l));
1183+
}
1184+
1185+
qry->rowMark=rowMark;
1186+
return;
1187+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp