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

Commit7361e91

Browse files
committed
This patch is for the TODO item
* Disallow LOCK on viewsrc/backend/commands/command.c is the only affected file--Mark Hollomon
1 parent5c6fa5e commit7361e91

File tree

1 file changed

+37
-30
lines changed

1 file changed

+37
-30
lines changed

‎src/backend/commands/command.c

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.98 2000/09/06 14:15:16 petere Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.99 2000/09/12 04:30:08 momjian Exp $
1212
*
1313
* NOTES
1414
* The PerformAddAttribute() code, like most of the relation
@@ -55,6 +55,9 @@
5555

5656

5757
staticboolneeds_toast_table(Relationrel);
58+
staticboolis_view(char*relname,char*command);
59+
60+
5861

5962

6063
/* --------------------------------
@@ -1087,9 +1090,6 @@ void
10871090
AlterTableAddConstraint(char*relationName,
10881091
boolinh,Node*newConstraint)
10891092
{
1090-
charrulequery[41+NAMEDATALEN];
1091-
void*qplan;
1092-
charnulls[1]="";
10931093

10941094
if (newConstraint==NULL)
10951095
elog(ERROR,"ALTER TABLE / ADD CONSTRAINT passed invalid constraint.");
@@ -1100,19 +1100,8 @@ AlterTableAddConstraint(char *relationName,
11001100
#endif
11011101

11021102
/* check to see if the table to be constrained is a view. */
1103-
sprintf(rulequery,"select * from pg_views where viewname='%s'",relationName);
1104-
if (SPI_connect()!=SPI_OK_CONNECT)
1105-
elog(ERROR,"ALTER TABLE: Unable to determine if %s is a view - SPI_connect failure..",relationName);
1106-
qplan=SPI_prepare(rulequery,0,NULL);
1107-
if (!qplan)
1108-
elog(ERROR,"ALTER TABLE: Unable to determine if %s is a view - SPI_prepare failure.",relationName);
1109-
qplan=SPI_saveplan(qplan);
1110-
if (SPI_execp(qplan,NULL,nulls,1)!=SPI_OK_SELECT)
1111-
elog(ERROR,"ALTER TABLE: Unable to determine if %s is a view - SPI_execp failure.",relationName);
1112-
if (SPI_processed!=0)
1113-
elog(ERROR,"ALTER TABLE: Cannot add constraints to views.");
1114-
if (SPI_finish()!=SPI_OK_FINISH)
1115-
elog(NOTICE,"SPI_finish() failed in ALTER TABLE");
1103+
if (is_view(relationName,"ALTER TABLE"))
1104+
elog(ERROR,"ALTER TABLE: Cannot add constraints to views.");
11161105

11171106
switch (nodeTag(newConstraint))
11181107
{
@@ -1261,19 +1250,8 @@ AlterTableAddConstraint(char *relationName,
12611250
}
12621251

12631252
/* check to see if the referenced table is a view. */
1264-
sprintf(rulequery,"select * from pg_views where viewname='%s'",fkconstraint->pktable_name);
1265-
if (SPI_connect()!=SPI_OK_CONNECT)
1266-
elog(ERROR,"ALTER TABLE: Unable to determine if %s is a view.",relationName);
1267-
qplan=SPI_prepare(rulequery,0,NULL);
1268-
if (!qplan)
1269-
elog(ERROR,"ALTER TABLE: Unable to determine if %s is a view.",relationName);
1270-
qplan=SPI_saveplan(qplan);
1271-
if (SPI_execp(qplan,NULL,nulls,1)!=SPI_OK_SELECT)
1272-
elog(ERROR,"ALTER TABLE: Unable to determine if %s is a view.",relationName);
1273-
if (SPI_processed!=0)
1274-
elog(ERROR,"ALTER TABLE: Cannot add constraints to views.");
1275-
if (SPI_finish()!=SPI_OK_FINISH)
1276-
elog(NOTICE,"SPI_finish() failed in RI_FKey_check()");
1253+
if (is_view(fkconstraint->pktable_name,"ALTER TABLE"))
1254+
elog(ERROR,"ALTER TABLE: Cannot add constraints to views.");
12771255

12781256
/*
12791257
* Grab an exclusive lock on the pk table, so that someone
@@ -1720,6 +1698,9 @@ LockTableCommand(LockStmt *lockstmt)
17201698
Relationrel;
17211699
intaclresult;
17221700

1701+
if (is_view(lockstmt->relname,"LOCK TABLE"))
1702+
elog(ERROR,"LOCK TABLE: cannot lock a view");
1703+
17231704
rel=heap_openr(lockstmt->relname,NoLock);
17241705

17251706
if (lockstmt->mode==AccessShareLock)
@@ -1735,3 +1716,29 @@ LockTableCommand(LockStmt *lockstmt)
17351716
heap_close(rel,NoLock);/* close rel, keep lock */
17361717
}
17371718

1719+
1720+
static
1721+
bool
1722+
is_view (char*relname,char*command)
1723+
{
1724+
boolretval;
1725+
charrulequery[41+NAMEDATALEN];
1726+
void*qplan;
1727+
charnulls[1]="";
1728+
1729+
sprintf(rulequery,"select * from pg_views where viewname='%s'",relname);
1730+
if (SPI_connect()!=SPI_OK_CONNECT)
1731+
elog(ERROR,"%s: Unable to determine if %s is a view - SPI_connect failure..",command,relname);
1732+
qplan=SPI_prepare(rulequery,0,NULL);
1733+
if (!qplan)
1734+
elog(ERROR,"%s: Unable to determine if %s is a view - SPI_prepare failure.",command,relname);
1735+
qplan=SPI_saveplan(qplan);
1736+
if (SPI_execp(qplan,NULL,nulls,1)!=SPI_OK_SELECT)
1737+
elog(ERROR,"%s: Unable to determine if %s is a view - SPI_execp failure.",command,relname);
1738+
1739+
retval= (SPI_processed!=0);
1740+
if (SPI_finish()!=SPI_OK_FINISH)
1741+
elog(NOTICE,"SPI_finish() failed in %s",command);
1742+
1743+
returnretval;
1744+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp