Skip to content

Commit 1da2fee

Browse files
committed
Previous patch backed out.
Here is a patch against CVS (without my earlier patch) to disallow LOCK x if x is a view. It does not use the SPI interface. -- Mark Hollomon
1 parent 7361e91 commit 1da2fee

File tree

2 files changed

+66
-27
lines changed

2 files changed

+66
-27
lines changed

doc/TODO

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ VIEWS
3535
* Views containing aggregates sometimes fail(Jan)
3636
* Creating view and inheriting the view causes view* to show
3737
duplicates(inherit)
38-
* Disallow LOCK on view
38+
* -Disallow LOCK on view(Mark Hollomon)
3939

4040
MISC
4141

src/backend/commands/command.c

Lines changed: 65 additions & 26 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.99 2000/09/12 04:30:08 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.100 2000/09/12 04:33:18 momjian Exp $
1212
*
1313
* NOTES
1414
* The PerformAddAttribute() code, like most of the relation
@@ -26,6 +26,7 @@
2626
#include "catalog/indexing.h"
2727
#include "catalog/pg_attrdef.h"
2828
#include "catalog/pg_opclass.h"
29+
#include "catalog/pg_rewrite.h"
2930
#include "commands/command.h"
3031
#include "executor/spi.h"
3132
#include "catalog/heap.h"
@@ -55,7 +56,8 @@
5556

5657

5758
static bool needs_toast_table(Relation rel);
58-
static bool is_view(char *relname, char *command);
59+
static bool is_viewr(char *relname);
60+
static bool is_view(Relation rel);
5961

6062

6163

@@ -1100,7 +1102,7 @@ AlterTableAddConstraint(char *relationName,
11001102
#endif
11011103

11021104
/* check to see if the table to be constrained is a view. */
1103-
if (is_view(relationName, "ALTER TABLE"))
1105+
if (is_viewr(relationName))
11041106
elog(ERROR, "ALTER TABLE: Cannot add constraints to views.");
11051107

11061108
switch (nodeTag(newConstraint))
@@ -1250,7 +1252,7 @@ AlterTableAddConstraint(char *relationName,
12501252
}
12511253

12521254
/* check to see if the referenced table is a view. */
1253-
if (is_view(fkconstraint->pktable_name, "ALTER TABLE"))
1255+
if (is_viewr(fkconstraint->pktable_name))
12541256
elog(ERROR, "ALTER TABLE: Cannot add constraints to views.");
12551257

12561258
/*
@@ -1698,11 +1700,11 @@ LockTableCommand(LockStmt *lockstmt)
16981700
Relation rel;
16991701
int aclresult;
17001702

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

1705+
if (is_view(rel))
1706+
elog(ERROR, "LOCK TABLE: cannot lock a view");
1707+
17061708
if (lockstmt->mode == AccessShareLock)
17071709
aclresult = pg_aclcheck(lockstmt->relname, GetUserId(), ACL_RD);
17081710
else
@@ -1719,26 +1721,63 @@ LockTableCommand(LockStmt *lockstmt)
17191721

17201722
static
17211723
bool
1722-
is_view (char * relname, char *command)
1724+
is_viewr(char *name)
17231725
{
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);
1726+
Relation rel = heap_openr(name, NoLock);
1727+
1728+
bool retval = is_view(rel);
1729+
1730+
heap_close(rel, NoLock);
1731+
1732+
return retval;
1733+
}
1734+
1735+
static
1736+
bool
1737+
is_view (Relation rel)
1738+
{
1739+
Relation RewriteRelation;
1740+
HeapScanDesc scanDesc;
1741+
ScanKeyData scanKeyData;
1742+
HeapTuple tuple;
1743+
Form_pg_rewrite data;
1744+
1745+
1746+
bool retval = 0;
1747+
1748+
/*
1749+
* Open the pg_rewrite relation.
1750+
*/
1751+
RewriteRelation = heap_openr(RewriteRelationName, RowExclusiveLock);
1752+
1753+
/*
1754+
* Scan the RuleRelation ('pg_rewrite') for all the tuples that has
1755+
* the same ev_class as the relation being checked.
1756+
*/
1757+
ScanKeyEntryInitialize(&scanKeyData,
1758+
0,
1759+
Anum_pg_rewrite_ev_class,
1760+
F_OIDEQ,
1761+
ObjectIdGetDatum(rel->rd_id));
1762+
scanDesc = heap_beginscan(RewriteRelation,
1763+
0, SnapshotNow, 1, &scanKeyData);
1764+
1765+
while (HeapTupleIsValid(tuple = heap_getnext(scanDesc, 0)))
1766+
{
1767+
if (tuple->t_data != NULL)
1768+
{
1769+
data = (Form_pg_rewrite) GETSTRUCT(tuple);
1770+
if (data->ev_type == '1')
1771+
{
1772+
retval = 1;
1773+
break;
1774+
}
1775+
}
1776+
1777+
}
17421778

1779+
heap_endscan(scanDesc);
1780+
heap_close(RewriteRelation, RowExclusiveLock);
1781+
17431782
return retval;
17441783
}

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