Skip to content

Commit 7361e91

Browse files
committed
This patch is for the TODO item
* Disallow LOCK on view src/backend/commands/command.c is the only affected file -- Mark Hollomon
1 parent 5c6fa5e commit 7361e91

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
static bool needs_toast_table(Relation rel);
58+
static bool is_view(char *relname, char *command);
59+
60+
5861

5962

6063
/* --------------------------------
@@ -1087,9 +1090,6 @@ void
10871090
AlterTableAddConstraint(char *relationName,
10881091
bool inh, Node *newConstraint)
10891092
{
1090-
char rulequery[41+NAMEDATALEN];
1091-
void *qplan;
1092-
char nulls[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
Relation rel;
17211699
int aclresult;
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+
bool retval;
1725+
char rulequery[41+NAMEDATALEN];
1726+
void *qplan;
1727+
char nulls[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+
return retval;
1744+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy