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

Commit1dc43ea

Browse files
committed
Make VACUUM handle schema-qualified relation names properly.
1 parent789ddcb commit1dc43ea

File tree

6 files changed

+152
-142
lines changed

6 files changed

+152
-142
lines changed

‎src/backend/commands/analyze.c

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.29 2002/03/21 23:27:20 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.30 2002/04/02 01:03:05 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -20,6 +20,7 @@
2020
#include"access/tuptoaster.h"
2121
#include"catalog/catname.h"
2222
#include"catalog/indexing.h"
23+
#include"catalog/pg_namespace.h"
2324
#include"catalog/pg_operator.h"
2425
#include"catalog/pg_statistic.h"
2526
#include"catalog/pg_type.h"
@@ -30,6 +31,7 @@
3031
#include"utils/builtins.h"
3132
#include"utils/datum.h"
3233
#include"utils/fmgroids.h"
34+
#include"utils/lsyscache.h"
3335
#include"utils/syscache.h"
3436
#include"utils/tuplesort.h"
3537

@@ -147,7 +149,6 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
147149
numrows;
148150
doubletotalrows;
149151
HeapTuple*rows;
150-
HeapTupletuple;
151152

152153
if (vacstmt->verbose)
153154
elevel=INFO;
@@ -173,46 +174,61 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
173174
* Race condition -- if the pg_class tuple has gone away since the
174175
* last time we saw it, we don't need to process it.
175176
*/
176-
tuple=SearchSysCache(RELOID,
177-
ObjectIdGetDatum(relid),
178-
0,0,0);
179-
if (!HeapTupleIsValid(tuple))
177+
if (!SearchSysCacheExists(RELOID,
178+
ObjectIdGetDatum(relid),
179+
0,0,0))
180180
{
181181
CommitTransactionCommand();
182182
return;
183183
}
184184

185185
/*
186-
* We can ANALYZE any table except pg_statistic. See update_attstats
186+
* Open the class, getting only a read lock on it, and check
187+
* permissions. Permissions check should match vacuum's check!
187188
*/
188-
if (strcmp(NameStr(((Form_pg_class)GETSTRUCT(tuple))->relname),
189-
StatisticRelationName)==0)
189+
onerel=relation_open(relid,AccessShareLock);
190+
191+
if (!(pg_class_ownercheck(RelationGetRelid(onerel),GetUserId())||
192+
(is_dbadmin(MyDatabaseId)&& !onerel->rd_rel->relisshared)))
190193
{
191-
ReleaseSysCache(tuple);
194+
/* No need for a WARNING if we already complained during VACUUM */
195+
if (!vacstmt->vacuum)
196+
elog(WARNING,"Skipping \"%s\" --- only table or database owner can ANALYZE it",
197+
RelationGetRelationName(onerel));
198+
relation_close(onerel,AccessShareLock);
192199
CommitTransactionCommand();
193200
return;
194201
}
195-
ReleaseSysCache(tuple);
196202

197203
/*
198-
*Open the class, getting only a read lock on it, and check
199-
*permissions. Permissionscheckshould match vacuum's check!
204+
*Check that it's a plain table; we used to do this in getrels() but
205+
*seems safer tocheckafter we've locked the relation.
200206
*/
201-
onerel=heap_open(relid,AccessShareLock);
202-
203-
if (!(pg_class_ownercheck(RelationGetRelid(onerel),GetUserId())||
204-
(is_dbadmin(MyDatabaseId)&& !onerel->rd_rel->relisshared)))
207+
if (onerel->rd_rel->relkind!=RELKIND_RELATION)
205208
{
206209
/* No need for a WARNING if we already complained during VACUUM */
207210
if (!vacstmt->vacuum)
208-
elog(WARNING,"Skipping \"%s\" ---only table or database owner can ANALYZE it",
211+
elog(WARNING,"Skipping \"%s\" ---can not process indexes, views or special system tables",
209212
RelationGetRelationName(onerel));
210-
heap_close(onerel,NoLock);
213+
relation_close(onerel,AccessShareLock);
214+
CommitTransactionCommand();
215+
return;
216+
}
217+
218+
/*
219+
* We can ANALYZE any table except pg_statistic. See update_attstats
220+
*/
221+
if (RelationGetNamespace(onerel)==PG_CATALOG_NAMESPACE&&
222+
strcmp(RelationGetRelationName(onerel),StatisticRelationName)==0)
223+
{
224+
relation_close(onerel,AccessShareLock);
211225
CommitTransactionCommand();
212226
return;
213227
}
214228

215-
elog(elevel,"Analyzing %s",RelationGetRelationName(onerel));
229+
elog(elevel,"Analyzing %s.%s",
230+
get_namespace_name(RelationGetNamespace(onerel)),
231+
RelationGetRelationName(onerel));
216232

217233
/*
218234
* Determine which columns to analyze
@@ -266,7 +282,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
266282
*/
267283
if (attr_cnt <=0)
268284
{
269-
heap_close(onerel,NoLock);
285+
relation_close(onerel,NoLock);
270286
CommitTransactionCommand();
271287
return;
272288
}
@@ -353,7 +369,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
353369
* before we commit. (If someone did, they'd fail to clean up the
354370
* entries we made in pg_statistic.)
355371
*/
356-
heap_close(onerel,NoLock);
372+
relation_close(onerel,NoLock);
357373

358374
/* Commit and release working memory */
359375
CommitTransactionCommand();

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp