mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Run pgindent on 9.2 source tree in preparation for first 9.3
commit-fest.
This commit is contained in:
@@ -96,11 +96,11 @@ static void compute_index_stats(Relation onerel, double totalrows,
|
||||
MemoryContext col_context);
|
||||
static VacAttrStats *examine_attribute(Relation onerel, int attnum,
|
||||
Node *index_expr);
|
||||
static int acquire_sample_rows(Relation onerel, int elevel,
|
||||
static int acquire_sample_rows(Relation onerel, int elevel,
|
||||
HeapTuple *rows, int targrows,
|
||||
double *totalrows, double *totaldeadrows);
|
||||
static int compare_rows(const void *a, const void *b);
|
||||
static int acquire_inherited_sample_rows(Relation onerel, int elevel,
|
||||
static int acquire_inherited_sample_rows(Relation onerel, int elevel,
|
||||
HeapTuple *rows, int targrows,
|
||||
double *totalrows, double *totaldeadrows);
|
||||
static void update_attstats(Oid relid, bool inh,
|
||||
@@ -118,7 +118,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt, BufferAccessStrategy bstrategy)
|
||||
Relation onerel;
|
||||
int elevel;
|
||||
AcquireSampleRowsFunc acquirefunc = NULL;
|
||||
BlockNumber relpages = 0;
|
||||
BlockNumber relpages = 0;
|
||||
|
||||
/* Select logging level */
|
||||
if (vacstmt->options & VACOPT_VERBOSE)
|
||||
@@ -205,8 +205,8 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt, BufferAccessStrategy bstrategy)
|
||||
}
|
||||
|
||||
/*
|
||||
* Check that it's a plain table or foreign table; we used to do this
|
||||
* in get_rel_oids() but seems safer to check after we've locked the
|
||||
* Check that it's a plain table or foreign table; we used to do this in
|
||||
* get_rel_oids() but seems safer to check after we've locked the
|
||||
* relation.
|
||||
*/
|
||||
if (onerel->rd_rel->relkind == RELKIND_RELATION)
|
||||
@@ -235,8 +235,8 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt, BufferAccessStrategy bstrategy)
|
||||
if (!ok)
|
||||
{
|
||||
ereport(WARNING,
|
||||
(errmsg("skipping \"%s\" --- cannot analyze this foreign table",
|
||||
RelationGetRelationName(onerel))));
|
||||
(errmsg("skipping \"%s\" --- cannot analyze this foreign table",
|
||||
RelationGetRelationName(onerel))));
|
||||
relation_close(onerel, ShareUpdateExclusiveLock);
|
||||
return;
|
||||
}
|
||||
@@ -464,8 +464,8 @@ do_analyze_rel(Relation onerel, VacuumStmt *vacstmt,
|
||||
/*
|
||||
* Determine how many rows we need to sample, using the worst case from
|
||||
* all analyzable columns. We use a lower bound of 100 rows to avoid
|
||||
* possible overflow in Vitter's algorithm. (Note: that will also be
|
||||
* the target in the corner case where there are no analyzable columns.)
|
||||
* possible overflow in Vitter's algorithm. (Note: that will also be the
|
||||
* target in the corner case where there are no analyzable columns.)
|
||||
*/
|
||||
targrows = 100;
|
||||
for (i = 0; i < attr_cnt; i++)
|
||||
@@ -1337,7 +1337,7 @@ anl_get_next_S(double t, int n, double *stateptr)
|
||||
double V,
|
||||
quot;
|
||||
|
||||
V = anl_random_fract(); /* Generate V */
|
||||
V = anl_random_fract(); /* Generate V */
|
||||
S = 0;
|
||||
t += 1;
|
||||
/* Note: "num" in Vitter's code is always equal to t - n */
|
||||
@@ -1398,7 +1398,7 @@ anl_get_next_S(double t, int n, double *stateptr)
|
||||
y *= numer / denom;
|
||||
denom -= 1;
|
||||
}
|
||||
W = exp(-log(anl_random_fract()) / n); /* Generate W in advance */
|
||||
W = exp(-log(anl_random_fract()) / n); /* Generate W in advance */
|
||||
if (exp(log(y) / n) <= (t + X) / t)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -594,10 +594,10 @@ make_new_heap(Oid OIDOldHeap, Oid NewTableSpace)
|
||||
OldHeapDesc = RelationGetDescr(OldHeap);
|
||||
|
||||
/*
|
||||
* Note that the NewHeap will not
|
||||
* receive any of the defaults or constraints associated with the OldHeap;
|
||||
* we don't need 'em, and there's no reason to spend cycles inserting them
|
||||
* into the catalogs only to delete them.
|
||||
* Note that the NewHeap will not receive any of the defaults or
|
||||
* constraints associated with the OldHeap; we don't need 'em, and there's
|
||||
* no reason to spend cycles inserting them into the catalogs only to
|
||||
* delete them.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
@@ -150,7 +150,7 @@ typedef struct CopyStateData
|
||||
Oid *typioparams; /* array of element types for in_functions */
|
||||
int *defmap; /* array of default att numbers */
|
||||
ExprState **defexprs; /* array of default att expressions */
|
||||
bool volatile_defexprs; /* is any of defexprs volatile? */
|
||||
bool volatile_defexprs; /* is any of defexprs volatile? */
|
||||
|
||||
/*
|
||||
* These variables are used to reduce overhead in textual COPY FROM.
|
||||
@@ -566,11 +566,11 @@ CopyGetData(CopyState cstate, void *databuf, int minread, int maxread)
|
||||
if (mtype == EOF)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_CONNECTION_FAILURE),
|
||||
errmsg("unexpected EOF on client connection with an open transaction")));
|
||||
errmsg("unexpected EOF on client connection with an open transaction")));
|
||||
if (pq_getmessage(cstate->fe_msgbuf, 0))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_CONNECTION_FAILURE),
|
||||
errmsg("unexpected EOF on client connection with an open transaction")));
|
||||
errmsg("unexpected EOF on client connection with an open transaction")));
|
||||
switch (mtype)
|
||||
{
|
||||
case 'd': /* CopyData */
|
||||
@@ -1861,6 +1861,7 @@ CopyFrom(CopyState cstate)
|
||||
uint64 processed = 0;
|
||||
bool useHeapMultiInsert;
|
||||
int nBufferedTuples = 0;
|
||||
|
||||
#define MAX_BUFFERED_TUPLES 1000
|
||||
HeapTuple *bufferedTuples = NULL; /* initialize to silence warning */
|
||||
Size bufferedTuplesSize = 0;
|
||||
@@ -1968,8 +1969,8 @@ CopyFrom(CopyState cstate)
|
||||
* processed and prepared for insertion are not there.
|
||||
*/
|
||||
if ((resultRelInfo->ri_TrigDesc != NULL &&
|
||||
(resultRelInfo->ri_TrigDesc->trig_insert_before_row ||
|
||||
resultRelInfo->ri_TrigDesc->trig_insert_instead_row)) ||
|
||||
(resultRelInfo->ri_TrigDesc->trig_insert_before_row ||
|
||||
resultRelInfo->ri_TrigDesc->trig_insert_instead_row)) ||
|
||||
cstate->volatile_defexprs)
|
||||
{
|
||||
useHeapMultiInsert = false;
|
||||
@@ -2162,8 +2163,8 @@ CopyFromInsertBatch(CopyState cstate, EState *estate, CommandId mycid,
|
||||
int i;
|
||||
|
||||
/*
|
||||
* heap_multi_insert leaks memory, so switch to short-lived memory
|
||||
* context before calling it.
|
||||
* heap_multi_insert leaks memory, so switch to short-lived memory context
|
||||
* before calling it.
|
||||
*/
|
||||
oldcontext = MemoryContextSwitchTo(GetPerTupleMemoryContext(estate));
|
||||
heap_multi_insert(cstate->rel,
|
||||
@@ -2175,14 +2176,14 @@ CopyFromInsertBatch(CopyState cstate, EState *estate, CommandId mycid,
|
||||
MemoryContextSwitchTo(oldcontext);
|
||||
|
||||
/*
|
||||
* If there are any indexes, update them for all the inserted tuples,
|
||||
* and run AFTER ROW INSERT triggers.
|
||||
* If there are any indexes, update them for all the inserted tuples, and
|
||||
* run AFTER ROW INSERT triggers.
|
||||
*/
|
||||
if (resultRelInfo->ri_NumIndices > 0)
|
||||
{
|
||||
for (i = 0; i < nBufferedTuples; i++)
|
||||
{
|
||||
List *recheckIndexes;
|
||||
List *recheckIndexes;
|
||||
|
||||
ExecStoreTuple(bufferedTuples[i], myslot, InvalidBuffer, false);
|
||||
recheckIndexes =
|
||||
@@ -2194,6 +2195,7 @@ CopyFromInsertBatch(CopyState cstate, EState *estate, CommandId mycid,
|
||||
list_free(recheckIndexes);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* There's no indexes, but see if we need to run AFTER ROW INSERT triggers
|
||||
* anyway.
|
||||
|
||||
@@ -62,12 +62,12 @@ void
|
||||
ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
|
||||
ParamListInfo params, char *completionTag)
|
||||
{
|
||||
Query *query = (Query *) stmt->query;
|
||||
Query *query = (Query *) stmt->query;
|
||||
IntoClause *into = stmt->into;
|
||||
DestReceiver *dest;
|
||||
List *rewritten;
|
||||
List *rewritten;
|
||||
PlannedStmt *plan;
|
||||
QueryDesc *queryDesc;
|
||||
QueryDesc *queryDesc;
|
||||
ScanDirection dir;
|
||||
|
||||
/*
|
||||
@@ -98,9 +98,9 @@ ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
|
||||
* plancache.c.
|
||||
*
|
||||
* Because the rewriter and planner tend to scribble on the input, we make
|
||||
* a preliminary copy of the source querytree. This prevents problems in
|
||||
* a preliminary copy of the source querytree. This prevents problems in
|
||||
* the case that CTAS is in a portal or plpgsql function and is executed
|
||||
* repeatedly. (See also the same hack in EXPLAIN and PREPARE.)
|
||||
* repeatedly. (See also the same hack in EXPLAIN and PREPARE.)
|
||||
*/
|
||||
rewritten = QueryRewrite((Query *) copyObject(stmt->query));
|
||||
|
||||
@@ -115,10 +115,10 @@ ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
|
||||
|
||||
/*
|
||||
* Use a snapshot with an updated command ID to ensure this query sees
|
||||
* results of any previously executed queries. (This could only matter
|
||||
* if the planner executed an allegedly-stable function that changed
|
||||
* the database contents, but let's do it anyway to be parallel to the
|
||||
* EXPLAIN code path.)
|
||||
* results of any previously executed queries. (This could only matter if
|
||||
* the planner executed an allegedly-stable function that changed the
|
||||
* database contents, but let's do it anyway to be parallel to the EXPLAIN
|
||||
* code path.)
|
||||
*/
|
||||
PushCopiedSnapshot(GetActiveSnapshot());
|
||||
UpdateActiveSnapshotCommandId();
|
||||
@@ -211,12 +211,12 @@ intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
|
||||
DR_intorel *myState = (DR_intorel *) self;
|
||||
IntoClause *into = myState->into;
|
||||
CreateStmt *create;
|
||||
Oid intoRelationId;
|
||||
Relation intoRelationDesc;
|
||||
Oid intoRelationId;
|
||||
Relation intoRelationDesc;
|
||||
RangeTblEntry *rte;
|
||||
Datum toast_options;
|
||||
ListCell *lc;
|
||||
int attnum;
|
||||
ListCell *lc;
|
||||
int attnum;
|
||||
static char *validnsps[] = HEAP_RELOPT_NAMESPACES;
|
||||
|
||||
Assert(into != NULL); /* else somebody forgot to set it */
|
||||
@@ -237,8 +237,8 @@ intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
|
||||
create->if_not_exists = false;
|
||||
|
||||
/*
|
||||
* Build column definitions using "pre-cooked" type and collation info.
|
||||
* If a column name list was specified in CREATE TABLE AS, override the
|
||||
* Build column definitions using "pre-cooked" type and collation info. If
|
||||
* a column name list was specified in CREATE TABLE AS, override the
|
||||
* column names derived from the query. (Too few column names are OK, too
|
||||
* many are not.)
|
||||
*/
|
||||
@@ -246,8 +246,8 @@ intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
|
||||
for (attnum = 0; attnum < typeinfo->natts; attnum++)
|
||||
{
|
||||
Form_pg_attribute attribute = typeinfo->attrs[attnum];
|
||||
ColumnDef *col = makeNode(ColumnDef);
|
||||
TypeName *coltype = makeNode(TypeName);
|
||||
ColumnDef *col = makeNode(ColumnDef);
|
||||
TypeName *coltype = makeNode(TypeName);
|
||||
|
||||
if (lc)
|
||||
{
|
||||
@@ -280,9 +280,9 @@ intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
|
||||
|
||||
/*
|
||||
* It's possible that the column is of a collatable type but the
|
||||
* collation could not be resolved, so double-check. (We must
|
||||
* check this here because DefineRelation would adopt the type's
|
||||
* default collation rather than complaining.)
|
||||
* collation could not be resolved, so double-check. (We must check
|
||||
* this here because DefineRelation would adopt the type's default
|
||||
* collation rather than complaining.)
|
||||
*/
|
||||
if (!OidIsValid(col->collOid) &&
|
||||
type_is_collatable(coltype->typeOid))
|
||||
@@ -297,8 +297,8 @@ intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
|
||||
|
||||
if (lc != NULL)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("CREATE TABLE AS specifies too many column names")));
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("CREATE TABLE AS specifies too many column names")));
|
||||
|
||||
/*
|
||||
* Actually create the target table
|
||||
@@ -342,7 +342,7 @@ intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
|
||||
|
||||
for (attnum = 1; attnum <= intoRelationDesc->rd_att->natts; attnum++)
|
||||
rte->modifiedCols = bms_add_member(rte->modifiedCols,
|
||||
attnum - FirstLowInvalidHeapAttributeNumber);
|
||||
attnum - FirstLowInvalidHeapAttributeNumber);
|
||||
|
||||
ExecCheckRTPerms(list_make1(rte), true);
|
||||
|
||||
|
||||
@@ -695,8 +695,8 @@ check_encoding_locale_matches(int encoding, const char *collate, const char *cty
|
||||
errmsg("encoding \"%s\" does not match locale \"%s\"",
|
||||
pg_encoding_to_char(encoding),
|
||||
ctype),
|
||||
errdetail("The chosen LC_CTYPE setting requires encoding \"%s\".",
|
||||
pg_encoding_to_char(ctype_encoding))));
|
||||
errdetail("The chosen LC_CTYPE setting requires encoding \"%s\".",
|
||||
pg_encoding_to_char(ctype_encoding))));
|
||||
|
||||
if (!(collate_encoding == encoding ||
|
||||
collate_encoding == PG_SQL_ASCII ||
|
||||
@@ -710,8 +710,8 @@ check_encoding_locale_matches(int encoding, const char *collate, const char *cty
|
||||
errmsg("encoding \"%s\" does not match locale \"%s\"",
|
||||
pg_encoding_to_char(encoding),
|
||||
collate),
|
||||
errdetail("The chosen LC_COLLATE setting requires encoding \"%s\".",
|
||||
pg_encoding_to_char(collate_encoding))));
|
||||
errdetail("The chosen LC_COLLATE setting requires encoding \"%s\".",
|
||||
pg_encoding_to_char(collate_encoding))));
|
||||
}
|
||||
|
||||
/* Error cleanup callback for createdb */
|
||||
@@ -784,7 +784,8 @@ dropdb(const char *dbname, bool missing_ok)
|
||||
/* DROP hook for the database being removed */
|
||||
if (object_access_hook)
|
||||
{
|
||||
ObjectAccessDrop drop_arg;
|
||||
ObjectAccessDrop drop_arg;
|
||||
|
||||
memset(&drop_arg, 0, sizeof(ObjectAccessDrop));
|
||||
InvokeObjectAccessHook(OAT_DROP,
|
||||
DatabaseRelationId, db_id, 0, &drop_arg);
|
||||
@@ -831,8 +832,7 @@ dropdb(const char *dbname, bool missing_ok)
|
||||
ReleaseSysCache(tup);
|
||||
|
||||
/*
|
||||
* Delete any comments or security labels associated with
|
||||
* the database.
|
||||
* Delete any comments or security labels associated with the database.
|
||||
*/
|
||||
DeleteSharedComments(db_id, DatabaseRelationId);
|
||||
DeleteSharedSecurityLabel(db_id, DatabaseRelationId);
|
||||
@@ -860,18 +860,18 @@ dropdb(const char *dbname, bool missing_ok)
|
||||
pgstat_drop_database(db_id);
|
||||
|
||||
/*
|
||||
* Tell checkpointer to forget any pending fsync and unlink requests for files
|
||||
* in the database; else the fsyncs will fail at next checkpoint, or
|
||||
* Tell checkpointer to forget any pending fsync and unlink requests for
|
||||
* files in the database; else the fsyncs will fail at next checkpoint, or
|
||||
* worse, it will delete files that belong to a newly created database
|
||||
* with the same OID.
|
||||
*/
|
||||
ForgetDatabaseFsyncRequests(db_id);
|
||||
|
||||
/*
|
||||
* Force a checkpoint to make sure the checkpointer has received the message
|
||||
* sent by ForgetDatabaseFsyncRequests. On Windows, this also ensures that
|
||||
* background procs don't hold any open files, which would cause rmdir() to
|
||||
* fail.
|
||||
* Force a checkpoint to make sure the checkpointer has received the
|
||||
* message sent by ForgetDatabaseFsyncRequests. On Windows, this also
|
||||
* ensures that background procs don't hold any open files, which would
|
||||
* cause rmdir() to fail.
|
||||
*/
|
||||
RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT);
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#include "utils/syscache.h"
|
||||
|
||||
static void does_not_exist_skipping(ObjectType objtype,
|
||||
List *objname, List *objargs);
|
||||
List *objname, List *objargs);
|
||||
|
||||
/*
|
||||
* Drop one or more objects.
|
||||
@@ -54,7 +54,7 @@ RemoveObjects(DropStmt *stmt)
|
||||
|
||||
foreach(cell1, stmt->objects)
|
||||
{
|
||||
ObjectAddress address;
|
||||
ObjectAddress address;
|
||||
List *objname = lfirst(cell1);
|
||||
List *objargs = NIL;
|
||||
Relation relation = NULL;
|
||||
@@ -97,8 +97,8 @@ RemoveObjects(DropStmt *stmt)
|
||||
if (((Form_pg_proc) GETSTRUCT(tup))->proisagg)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||
errmsg("\"%s\" is an aggregate function",
|
||||
NameListToString(objname)),
|
||||
errmsg("\"%s\" is an aggregate function",
|
||||
NameListToString(objname)),
|
||||
errhint("Use DROP AGGREGATE to drop aggregate functions.")));
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
@@ -149,7 +149,7 @@ does_not_exist_skipping(ObjectType objtype, List *objname, List *objargs)
|
||||
break;
|
||||
case OBJECT_CONVERSION:
|
||||
msg = gettext_noop("conversion \"%s\" does not exist, skipping");
|
||||
name = NameListToString(objname);
|
||||
name = NameListToString(objname);
|
||||
break;
|
||||
case OBJECT_SCHEMA:
|
||||
msg = gettext_noop("schema \"%s\" does not exist, skipping");
|
||||
@@ -196,9 +196,9 @@ does_not_exist_skipping(ObjectType objtype, List *objname, List *objargs)
|
||||
case OBJECT_CAST:
|
||||
msg = gettext_noop("cast from type %s to type %s does not exist, skipping");
|
||||
name = format_type_be(typenameTypeId(NULL,
|
||||
(TypeName *) linitial(objname)));
|
||||
(TypeName *) linitial(objname)));
|
||||
args = format_type_be(typenameTypeId(NULL,
|
||||
(TypeName *) linitial(objargs)));
|
||||
(TypeName *) linitial(objargs)));
|
||||
break;
|
||||
case OBJECT_TRIGGER:
|
||||
msg = gettext_noop("trigger \"%s\" for table \"%s\" does not exist, skipping");
|
||||
@@ -231,7 +231,7 @@ does_not_exist_skipping(ObjectType objtype, List *objname, List *objargs)
|
||||
args = strVal(linitial(objargs));
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "unexpected object type (%d)", (int)objtype);
|
||||
elog(ERROR, "unexpected object type (%d)", (int) objtype);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ ExplainQuery(ExplainStmt *stmt, const char *queryString,
|
||||
TupOutputState *tstate;
|
||||
List *rewritten;
|
||||
ListCell *lc;
|
||||
bool timing_set = false;
|
||||
bool timing_set = false;
|
||||
|
||||
/* Initialize ExplainState. */
|
||||
ExplainInitState(&es);
|
||||
@@ -169,7 +169,7 @@ ExplainQuery(ExplainStmt *stmt, const char *queryString,
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("EXPLAIN option BUFFERS requires ANALYZE")));
|
||||
|
||||
|
||||
/* if the timing was not set explicitly, set default value */
|
||||
es.timing = (timing_set) ? es.timing : es.analyze;
|
||||
|
||||
@@ -340,9 +340,9 @@ ExplainOneUtility(Node *utilityStmt, IntoClause *into, ExplainState *es,
|
||||
if (IsA(utilityStmt, CreateTableAsStmt))
|
||||
{
|
||||
/*
|
||||
* We have to rewrite the contained SELECT and then pass it back
|
||||
* to ExplainOneQuery. It's probably not really necessary to copy
|
||||
* the contained parsetree another time, but let's be safe.
|
||||
* We have to rewrite the contained SELECT and then pass it back to
|
||||
* ExplainOneQuery. It's probably not really necessary to copy the
|
||||
* contained parsetree another time, but let's be safe.
|
||||
*/
|
||||
CreateTableAsStmt *ctas = (CreateTableAsStmt *) utilityStmt;
|
||||
List *rewritten;
|
||||
@@ -1021,7 +1021,7 @@ ExplainNode(PlanState *planstate, List *ancestors,
|
||||
{
|
||||
if (planstate->instrument->need_timer)
|
||||
appendStringInfo(es->str,
|
||||
" (actual time=%.3f..%.3f rows=%.0f loops=%.0f)",
|
||||
" (actual time=%.3f..%.3f rows=%.0f loops=%.0f)",
|
||||
startup_sec, total_sec, rows, nloops);
|
||||
else
|
||||
appendStringInfo(es->str,
|
||||
@@ -1095,7 +1095,7 @@ ExplainNode(PlanState *planstate, List *ancestors,
|
||||
planstate, es);
|
||||
if (es->analyze)
|
||||
ExplainPropertyLong("Heap Fetches",
|
||||
((IndexOnlyScanState *) planstate)->ioss_HeapFetches, es);
|
||||
((IndexOnlyScanState *) planstate)->ioss_HeapFetches, es);
|
||||
break;
|
||||
case T_BitmapIndexScan:
|
||||
show_scan_qual(((BitmapIndexScan *) plan)->indexqualorig,
|
||||
@@ -1237,7 +1237,7 @@ ExplainNode(PlanState *planstate, List *ancestors,
|
||||
bool has_temp = (usage->temp_blks_read > 0 ||
|
||||
usage->temp_blks_written > 0);
|
||||
bool has_timing = (!INSTR_TIME_IS_ZERO(usage->blk_read_time) ||
|
||||
!INSTR_TIME_IS_ZERO(usage->blk_write_time));
|
||||
!INSTR_TIME_IS_ZERO(usage->blk_write_time));
|
||||
|
||||
/* Show only positive counter values. */
|
||||
if (has_shared || has_local || has_temp)
|
||||
@@ -1301,10 +1301,10 @@ ExplainNode(PlanState *planstate, List *ancestors,
|
||||
appendStringInfoString(es->str, "I/O Timings:");
|
||||
if (!INSTR_TIME_IS_ZERO(usage->blk_read_time))
|
||||
appendStringInfo(es->str, " read=%0.3f",
|
||||
INSTR_TIME_GET_MILLISEC(usage->blk_read_time));
|
||||
INSTR_TIME_GET_MILLISEC(usage->blk_read_time));
|
||||
if (!INSTR_TIME_IS_ZERO(usage->blk_write_time))
|
||||
appendStringInfo(es->str, " write=%0.3f",
|
||||
INSTR_TIME_GET_MILLISEC(usage->blk_write_time));
|
||||
INSTR_TIME_GET_MILLISEC(usage->blk_write_time));
|
||||
appendStringInfoChar(es->str, '\n');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -899,8 +899,8 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control,
|
||||
{
|
||||
t_sql = DirectFunctionCall3(replace_text,
|
||||
t_sql,
|
||||
CStringGetTextDatum("MODULE_PATHNAME"),
|
||||
CStringGetTextDatum(control->module_pathname));
|
||||
CStringGetTextDatum("MODULE_PATHNAME"),
|
||||
CStringGetTextDatum(control->module_pathname));
|
||||
}
|
||||
|
||||
/* And now back to C string */
|
||||
@@ -1585,14 +1585,14 @@ RemoveExtensionById(Oid extId)
|
||||
* might write "DROP EXTENSION foo" in foo's own script files, as because
|
||||
* errors in dependency management in extension script files could give
|
||||
* rise to cases where an extension is dropped as a result of recursing
|
||||
* from some contained object. Because of that, we must test for the case
|
||||
* from some contained object. Because of that, we must test for the case
|
||||
* here, not at some higher level of the DROP EXTENSION command.
|
||||
*/
|
||||
if (extId == CurrentExtensionObject)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
||||
errmsg("cannot drop extension \"%s\" because it is being modified",
|
||||
get_extension_name(extId))));
|
||||
errmsg("cannot drop extension \"%s\" because it is being modified",
|
||||
get_extension_name(extId))));
|
||||
|
||||
rel = heap_open(ExtensionRelationId, RowExclusiveLock);
|
||||
|
||||
|
||||
@@ -166,7 +166,7 @@ transformGenericOptions(Oid catalogId,
|
||||
|
||||
if (OidIsValid(fdwvalidator))
|
||||
{
|
||||
Datum valarg = result;
|
||||
Datum valarg = result;
|
||||
|
||||
/*
|
||||
* Pass a null options list as an empty array, so that validators
|
||||
@@ -215,13 +215,13 @@ RenameForeignDataWrapper(const char *oldname, const char *newname)
|
||||
if (!HeapTupleIsValid(tup))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("foreign-data wrapper \"%s\" does not exist", oldname)));
|
||||
errmsg("foreign-data wrapper \"%s\" does not exist", oldname)));
|
||||
|
||||
/* make sure the new name doesn't exist */
|
||||
if (SearchSysCacheExists1(FOREIGNDATAWRAPPERNAME, CStringGetDatum(newname)))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DUPLICATE_OBJECT),
|
||||
errmsg("foreign-data wrapper \"%s\" already exists", newname)));
|
||||
errmsg("foreign-data wrapper \"%s\" already exists", newname)));
|
||||
|
||||
/* must be owner of FDW */
|
||||
if (!pg_foreign_data_wrapper_ownercheck(HeapTupleGetOid(tup), GetUserId()))
|
||||
@@ -364,7 +364,7 @@ AlterForeignDataWrapperOwner_oid(Oid fwdId, Oid newOwnerId)
|
||||
if (!HeapTupleIsValid(tup))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("foreign-data wrapper with OID %u does not exist", fwdId)));
|
||||
errmsg("foreign-data wrapper with OID %u does not exist", fwdId)));
|
||||
|
||||
AlterForeignDataWrapperOwner_internal(rel, tup, newOwnerId);
|
||||
|
||||
|
||||
@@ -890,9 +890,9 @@ CreateFunction(CreateFunctionStmt *stmt, const char *queryString)
|
||||
ReleaseSysCache(languageTuple);
|
||||
|
||||
/*
|
||||
* Only superuser is allowed to create leakproof functions because
|
||||
* it possibly allows unprivileged users to reference invisible tuples
|
||||
* to be filtered out using views for row-level security.
|
||||
* Only superuser is allowed to create leakproof functions because it
|
||||
* possibly allows unprivileged users to reference invisible tuples to be
|
||||
* filtered out using views for row-level security.
|
||||
*/
|
||||
if (isLeakProof && !superuser())
|
||||
ereport(ERROR,
|
||||
@@ -1320,7 +1320,7 @@ AlterFunction(AlterFunctionStmt *stmt)
|
||||
if (intVal(leakproof_item->arg) && !superuser())
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
errmsg("only superuser can define a leakproof function")));
|
||||
errmsg("only superuser can define a leakproof function")));
|
||||
procForm->proleakproof = intVal(leakproof_item->arg);
|
||||
}
|
||||
if (cost_item)
|
||||
|
||||
@@ -96,7 +96,7 @@ static void RangeVarCallbackForReindexIndex(const RangeVar *relation,
|
||||
* concrete benefit for core types.
|
||||
|
||||
* When a comparison or exclusion operator has a polymorphic input type, the
|
||||
* actual input types must also match. This defends against the possibility
|
||||
* actual input types must also match. This defends against the possibility
|
||||
* that operators could vary behavior in response to get_fn_expr_argtype().
|
||||
* At present, this hazard is theoretical: check_exclusion_constraint() and
|
||||
* all core index access methods decline to set fn_expr for such calls.
|
||||
@@ -134,6 +134,7 @@ CheckIndexCompatible(Oid oldId,
|
||||
|
||||
/* Caller should already have the relation locked in some way. */
|
||||
relationId = RangeVarGetRelid(heapRelation, NoLock, false);
|
||||
|
||||
/*
|
||||
* We can pretend isconstraint = false unconditionally. It only serves to
|
||||
* decide the text of an error message that should never happen for us.
|
||||
@@ -157,10 +158,10 @@ CheckIndexCompatible(Oid oldId,
|
||||
ReleaseSysCache(tuple);
|
||||
|
||||
/*
|
||||
* Compute the operator classes, collations, and exclusion operators
|
||||
* for the new index, so we can test whether it's compatible with the
|
||||
* existing one. Note that ComputeIndexAttrs might fail here, but that's
|
||||
* OK: DefineIndex would have called this function with the same arguments
|
||||
* Compute the operator classes, collations, and exclusion operators for
|
||||
* the new index, so we can test whether it's compatible with the existing
|
||||
* one. Note that ComputeIndexAttrs might fail here, but that's OK:
|
||||
* DefineIndex would have called this function with the same arguments
|
||||
* later on, and it would have failed then anyway.
|
||||
*/
|
||||
indexInfo = makeNode(IndexInfo);
|
||||
@@ -218,11 +219,11 @@ CheckIndexCompatible(Oid oldId,
|
||||
return false;
|
||||
|
||||
/* For polymorphic opcintype, column type changes break compatibility. */
|
||||
irel = index_open(oldId, AccessShareLock); /* caller probably has a lock */
|
||||
irel = index_open(oldId, AccessShareLock); /* caller probably has a lock */
|
||||
for (i = 0; i < old_natts; i++)
|
||||
{
|
||||
if (IsPolymorphicType(get_opclass_input_type(classObjectId[i])) &&
|
||||
irel->rd_att->attrs[i]->atttypid != typeObjectId[i])
|
||||
irel->rd_att->attrs[i]->atttypid != typeObjectId[i])
|
||||
{
|
||||
ret = false;
|
||||
break;
|
||||
@@ -232,7 +233,8 @@ CheckIndexCompatible(Oid oldId,
|
||||
/* Any change in exclusion operator selections breaks compatibility. */
|
||||
if (ret && indexInfo->ii_ExclusionOps != NULL)
|
||||
{
|
||||
Oid *old_operators, *old_procs;
|
||||
Oid *old_operators,
|
||||
*old_procs;
|
||||
uint16 *old_strats;
|
||||
|
||||
RelationGetExclusionInfo(irel, &old_operators, &old_procs, &old_strats);
|
||||
@@ -249,7 +251,7 @@ CheckIndexCompatible(Oid oldId,
|
||||
|
||||
op_input_types(indexInfo->ii_ExclusionOps[i], &left, &right);
|
||||
if ((IsPolymorphicType(left) || IsPolymorphicType(right)) &&
|
||||
irel->rd_att->attrs[i]->atttypid != typeObjectId[i])
|
||||
irel->rd_att->attrs[i]->atttypid != typeObjectId[i])
|
||||
{
|
||||
ret = false;
|
||||
break;
|
||||
@@ -1778,9 +1780,9 @@ RangeVarCallbackForReindexIndex(const RangeVar *relation,
|
||||
return;
|
||||
|
||||
/*
|
||||
* If the relation does exist, check whether it's an index. But note
|
||||
* that the relation might have been dropped between the time we did the
|
||||
* name lookup and now. In that case, there's nothing to do.
|
||||
* If the relation does exist, check whether it's an index. But note that
|
||||
* the relation might have been dropped between the time we did the name
|
||||
* lookup and now. In that case, there's nothing to do.
|
||||
*/
|
||||
relkind = get_rel_relkind(relId);
|
||||
if (!relkind)
|
||||
@@ -1798,9 +1800,9 @@ RangeVarCallbackForReindexIndex(const RangeVar *relation,
|
||||
if (relId != oldRelId)
|
||||
{
|
||||
/*
|
||||
* Lock level here should match reindex_index() heap lock.
|
||||
* If the OID isn't valid, it means the index as concurrently dropped,
|
||||
* which is not a problem for us; just return normally.
|
||||
* Lock level here should match reindex_index() heap lock. If the OID
|
||||
* isn't valid, it means the index as concurrently dropped, which is
|
||||
* not a problem for us; just return normally.
|
||||
*/
|
||||
*heapOid = IndexGetRelation(relId, true);
|
||||
if (OidIsValid(*heapOid))
|
||||
|
||||
@@ -40,9 +40,9 @@ LockTableCommand(LockStmt *lockstmt)
|
||||
|
||||
/*
|
||||
* During recovery we only accept these variations: LOCK TABLE foo IN
|
||||
* ACCESS SHARE MODE LOCK TABLE foo IN ROW SHARE MODE LOCK TABLE foo
|
||||
* IN ROW EXCLUSIVE MODE This test must match the restrictions defined
|
||||
* in LockAcquire()
|
||||
* ACCESS SHARE MODE LOCK TABLE foo IN ROW SHARE MODE LOCK TABLE foo IN
|
||||
* ROW EXCLUSIVE MODE This test must match the restrictions defined in
|
||||
* LockAcquire()
|
||||
*/
|
||||
if (lockstmt->mode > RowExclusiveLock)
|
||||
PreventCommandDuringRecovery("LOCK TABLE");
|
||||
@@ -74,15 +74,16 @@ static void
|
||||
RangeVarCallbackForLockTable(const RangeVar *rv, Oid relid, Oid oldrelid,
|
||||
void *arg)
|
||||
{
|
||||
LOCKMODE lockmode = * (LOCKMODE *) arg;
|
||||
LOCKMODE lockmode = *(LOCKMODE *) arg;
|
||||
char relkind;
|
||||
AclResult aclresult;
|
||||
|
||||
if (!OidIsValid(relid))
|
||||
return; /* doesn't exist, so no permissions check */
|
||||
return; /* doesn't exist, so no permissions check */
|
||||
relkind = get_rel_relkind(relid);
|
||||
if (!relkind)
|
||||
return; /* woops, concurrently dropped; no permissions check */
|
||||
return; /* woops, concurrently dropped; no permissions
|
||||
* check */
|
||||
|
||||
/* Currently, we only allow plain tables to be locked */
|
||||
if (relkind != RELKIND_RELATION)
|
||||
@@ -122,9 +123,10 @@ LockTableRecurse(Oid reloid, LOCKMODE lockmode, bool nowait)
|
||||
if (aclresult != ACLCHECK_OK)
|
||||
{
|
||||
char *relname = get_rel_name(childreloid);
|
||||
|
||||
if (!relname)
|
||||
continue; /* child concurrently dropped, just skip it */
|
||||
aclcheck_error(aclresult, ACL_KIND_CLASS, relname);
|
||||
continue; /* child concurrently dropped, just skip it */
|
||||
aclcheck_error(aclresult, ACL_KIND_CLASS, relname);
|
||||
}
|
||||
|
||||
/* We have enough rights to lock the relation; do so. */
|
||||
@@ -134,17 +136,18 @@ LockTableRecurse(Oid reloid, LOCKMODE lockmode, bool nowait)
|
||||
{
|
||||
/* try to throw error by name; relation could be deleted... */
|
||||
char *relname = get_rel_name(childreloid);
|
||||
|
||||
if (!relname)
|
||||
continue; /* child concurrently dropped, just skip it */
|
||||
continue; /* child concurrently dropped, just skip it */
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_LOCK_NOT_AVAILABLE),
|
||||
errmsg("could not obtain lock on relation \"%s\"",
|
||||
relname)));
|
||||
relname)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Even if we got the lock, child might have been concurrently dropped.
|
||||
* If so, we can skip it.
|
||||
* Even if we got the lock, child might have been concurrently
|
||||
* dropped. If so, we can skip it.
|
||||
*/
|
||||
if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(childreloid)))
|
||||
{
|
||||
|
||||
@@ -1167,7 +1167,7 @@ assignProcTypes(OpFamilyMember *member, Oid amoid, Oid typeoid)
|
||||
if (procform->prorettype != INT4OID)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
|
||||
errmsg("btree comparison procedures must return integer")));
|
||||
errmsg("btree comparison procedures must return integer")));
|
||||
|
||||
/*
|
||||
* If lefttype/righttype isn't specified, use the proc's input
|
||||
@@ -1188,7 +1188,7 @@ assignProcTypes(OpFamilyMember *member, Oid amoid, Oid typeoid)
|
||||
if (procform->prorettype != VOIDOID)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
|
||||
errmsg("btree sort support procedures must return void")));
|
||||
errmsg("btree sort support procedures must return void")));
|
||||
|
||||
/*
|
||||
* Can't infer lefttype/righttype from proc, so use default rule
|
||||
@@ -1217,7 +1217,7 @@ assignProcTypes(OpFamilyMember *member, Oid amoid, Oid typeoid)
|
||||
|
||||
/*
|
||||
* The default in CREATE OPERATOR CLASS is to use the class' opcintype as
|
||||
* lefttype and righttype. In CREATE or ALTER OPERATOR FAMILY, opcintype
|
||||
* lefttype and righttype. In CREATE or ALTER OPERATOR FAMILY, opcintype
|
||||
* isn't available, so make the user specify the types.
|
||||
*/
|
||||
if (!OidIsValid(member->lefttype))
|
||||
|
||||
@@ -174,7 +174,7 @@ PrepareQuery(PrepareStmt *stmt, const char *queryString)
|
||||
* ExecuteQuery --- implement the 'EXECUTE' utility statement.
|
||||
*
|
||||
* This code also supports CREATE TABLE ... AS EXECUTE. That case is
|
||||
* indicated by passing a non-null intoClause. The DestReceiver is already
|
||||
* indicated by passing a non-null intoClause. The DestReceiver is already
|
||||
* set up correctly for CREATE TABLE AS, but we still have to make a few
|
||||
* other adjustments here.
|
||||
*
|
||||
@@ -211,7 +211,7 @@ ExecuteQuery(ExecuteStmt *stmt, IntoClause *intoClause,
|
||||
{
|
||||
/*
|
||||
* Need an EState to evaluate parameters; must not delete it till end
|
||||
* of query, in case parameters are pass-by-reference. Note that the
|
||||
* of query, in case parameters are pass-by-reference. Note that the
|
||||
* passed-in "params" could possibly be referenced in the parameter
|
||||
* expressions.
|
||||
*/
|
||||
@@ -237,15 +237,15 @@ ExecuteQuery(ExecuteStmt *stmt, IntoClause *intoClause,
|
||||
/*
|
||||
* For CREATE TABLE ... AS EXECUTE, we must verify that the prepared
|
||||
* statement is one that produces tuples. Currently we insist that it be
|
||||
* a plain old SELECT. In future we might consider supporting other
|
||||
* a plain old SELECT. In future we might consider supporting other
|
||||
* things such as INSERT ... RETURNING, but there are a couple of issues
|
||||
* to be settled first, notably how WITH NO DATA should be handled in such
|
||||
* a case (do we really want to suppress execution?) and how to pass down
|
||||
* the OID-determining eflags (PortalStart won't handle them in such a
|
||||
* case, and for that matter it's not clear the executor will either).
|
||||
*
|
||||
* For CREATE TABLE ... AS EXECUTE, we also have to ensure that the
|
||||
* proper eflags and fetch count are passed to PortalStart/PortalRun.
|
||||
* For CREATE TABLE ... AS EXECUTE, we also have to ensure that the proper
|
||||
* eflags and fetch count are passed to PortalStart/PortalRun.
|
||||
*/
|
||||
if (intoClause)
|
||||
{
|
||||
@@ -658,7 +658,7 @@ ExplainExecuteQuery(ExecuteStmt *execstmt, IntoClause *into, ExplainState *es,
|
||||
{
|
||||
/*
|
||||
* Need an EState to evaluate parameters; must not delete it till end
|
||||
* of query, in case parameters are pass-by-reference. Note that the
|
||||
* of query, in case parameters are pass-by-reference. Note that the
|
||||
* passed-in "params" could possibly be referenced in the parameter
|
||||
* expressions.
|
||||
*/
|
||||
|
||||
@@ -133,7 +133,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
|
||||
false, /* isAgg */
|
||||
false, /* isWindowFunc */
|
||||
false, /* security_definer */
|
||||
false, /* isLeakProof */
|
||||
false, /* isLeakProof */
|
||||
false, /* isStrict */
|
||||
PROVOLATILE_VOLATILE,
|
||||
buildoidvector(funcargtypes, 0),
|
||||
@@ -210,7 +210,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
|
||||
false, /* isAgg */
|
||||
false, /* isWindowFunc */
|
||||
false, /* security_definer */
|
||||
false, /* isLeakProof */
|
||||
false, /* isLeakProof */
|
||||
true, /* isStrict */
|
||||
PROVOLATILE_VOLATILE,
|
||||
buildoidvector(funcargtypes, 1),
|
||||
|
||||
@@ -237,7 +237,7 @@ GetSecurityLabel(const ObjectAddress *object, const char *provider)
|
||||
return seclabel;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* SetSharedSecurityLabel is a helper function of SetSecurityLabel to
|
||||
* handle shared database objects.
|
||||
*/
|
||||
@@ -246,8 +246,8 @@ SetSharedSecurityLabel(const ObjectAddress *object,
|
||||
const char *provider, const char *label)
|
||||
{
|
||||
Relation pg_shseclabel;
|
||||
ScanKeyData keys[4];
|
||||
SysScanDesc scan;
|
||||
ScanKeyData keys[4];
|
||||
SysScanDesc scan;
|
||||
HeapTuple oldtup;
|
||||
HeapTuple newtup = NULL;
|
||||
Datum values[Natts_pg_shseclabel];
|
||||
@@ -414,8 +414,8 @@ void
|
||||
DeleteSharedSecurityLabel(Oid objectId, Oid classId)
|
||||
{
|
||||
Relation pg_shseclabel;
|
||||
ScanKeyData skey[2];
|
||||
SysScanDesc scan;
|
||||
ScanKeyData skey[2];
|
||||
SysScanDesc scan;
|
||||
HeapTuple oldtup;
|
||||
|
||||
ScanKeyInit(&skey[0],
|
||||
|
||||
@@ -430,7 +430,7 @@ AlterSequence(AlterSeqStmt *stmt)
|
||||
{
|
||||
ereport(NOTICE,
|
||||
(errmsg("relation \"%s\" does not exist, skipping",
|
||||
stmt->sequence->relname)));
|
||||
stmt->sequence->relname)));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -514,12 +514,12 @@ nextval(PG_FUNCTION_ARGS)
|
||||
sequence = makeRangeVarFromNameList(textToQualifiedNameList(seqin));
|
||||
|
||||
/*
|
||||
* XXX: This is not safe in the presence of concurrent DDL, but
|
||||
* acquiring a lock here is more expensive than letting nextval_internal
|
||||
* do it, since the latter maintains a cache that keeps us from hitting
|
||||
* the lock manager more than once per transaction. It's not clear
|
||||
* whether the performance penalty is material in practice, but for now,
|
||||
* we do it this way.
|
||||
* XXX: This is not safe in the presence of concurrent DDL, but acquiring
|
||||
* a lock here is more expensive than letting nextval_internal do it,
|
||||
* since the latter maintains a cache that keeps us from hitting the lock
|
||||
* manager more than once per transaction. It's not clear whether the
|
||||
* performance penalty is material in practice, but for now, we do it this
|
||||
* way.
|
||||
*/
|
||||
relid = RangeVarGetRelid(sequence, NoLock, false);
|
||||
|
||||
@@ -1543,9 +1543,9 @@ seq_redo(XLogRecPtr lsn, XLogRecord *record)
|
||||
* is also used for updating sequences, it's possible that a hot-standby
|
||||
* backend is examining the page concurrently; so we mustn't transiently
|
||||
* trash the buffer. The solution is to build the correct new page
|
||||
* contents in local workspace and then memcpy into the buffer. Then
|
||||
* only bytes that are supposed to change will change, even transiently.
|
||||
* We must palloc the local page for alignment reasons.
|
||||
* contents in local workspace and then memcpy into the buffer. Then only
|
||||
* bytes that are supposed to change will change, even transiently. We
|
||||
* must palloc the local page for alignment reasons.
|
||||
*/
|
||||
localpage = (Page) palloc(BufferGetPageSize(buffer));
|
||||
|
||||
|
||||
@@ -237,9 +237,9 @@ static const struct dropmsgstrings dropmsgstringarray[] = {
|
||||
|
||||
struct DropRelationCallbackState
|
||||
{
|
||||
char relkind;
|
||||
Oid heapOid;
|
||||
bool concurrent;
|
||||
char relkind;
|
||||
Oid heapOid;
|
||||
bool concurrent;
|
||||
};
|
||||
|
||||
/* Alter table target-type flags for ATSimplePermissions */
|
||||
@@ -372,8 +372,8 @@ static void ATPrepSetTableSpace(AlteredTableInfo *tab, Relation rel,
|
||||
char *tablespacename, LOCKMODE lockmode);
|
||||
static void ATExecSetTableSpace(Oid tableOid, Oid newTableSpace, LOCKMODE lockmode);
|
||||
static void ATExecSetRelOptions(Relation rel, List *defList,
|
||||
AlterTableType operation,
|
||||
LOCKMODE lockmode);
|
||||
AlterTableType operation,
|
||||
LOCKMODE lockmode);
|
||||
static void ATExecEnableDisableTrigger(Relation rel, char *trigname,
|
||||
char fires_when, bool skip_system, LOCKMODE lockmode);
|
||||
static void ATExecEnableDisableRule(Relation rel, char *rulename,
|
||||
@@ -752,7 +752,7 @@ RemoveRelations(DropStmt *drop)
|
||||
if (drop->behavior == DROP_CASCADE)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("DROP INDEX CONCURRENTLY does not support CASCADE")));
|
||||
errmsg("DROP INDEX CONCURRENTLY does not support CASCADE")));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -799,7 +799,7 @@ RemoveRelations(DropStmt *drop)
|
||||
RangeVar *rel = makeRangeVarFromNameList((List *) lfirst(cell));
|
||||
Oid relOid;
|
||||
ObjectAddress obj;
|
||||
struct DropRelationCallbackState state;
|
||||
struct DropRelationCallbackState state;
|
||||
|
||||
/*
|
||||
* These next few steps are a great deal like relation_openrv, but we
|
||||
@@ -914,9 +914,9 @@ RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid, Oid oldRelOid,
|
||||
/*
|
||||
* In DROP INDEX, attempt to acquire lock on the parent table before
|
||||
* locking the index. index_drop() will need this anyway, and since
|
||||
* regular queries lock tables before their indexes, we risk deadlock
|
||||
* if we do it the other way around. No error if we don't find a
|
||||
* pg_index entry, though --- the relation may have been droppd.
|
||||
* regular queries lock tables before their indexes, we risk deadlock if
|
||||
* we do it the other way around. No error if we don't find a pg_index
|
||||
* entry, though --- the relation may have been droppd.
|
||||
*/
|
||||
if (relkind == RELKIND_INDEX && relOid != oldRelOid)
|
||||
{
|
||||
@@ -2322,12 +2322,12 @@ static void
|
||||
RangeVarCallbackForRenameAttribute(const RangeVar *rv, Oid relid, Oid oldrelid,
|
||||
void *arg)
|
||||
{
|
||||
HeapTuple tuple;
|
||||
Form_pg_class form;
|
||||
HeapTuple tuple;
|
||||
Form_pg_class form;
|
||||
|
||||
tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
|
||||
if (!HeapTupleIsValid(tuple))
|
||||
return; /* concurrently dropped */
|
||||
return; /* concurrently dropped */
|
||||
form = (Form_pg_class) GETSTRUCT(tuple);
|
||||
renameatt_check(relid, form, false);
|
||||
ReleaseSysCache(tuple);
|
||||
@@ -2351,7 +2351,7 @@ renameatt(RenameStmt *stmt)
|
||||
{
|
||||
ereport(NOTICE,
|
||||
(errmsg("relation \"%s\" does not exist, skipping",
|
||||
stmt->relation->relname)));
|
||||
stmt->relation->relname)));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2379,7 +2379,7 @@ rename_constraint_internal(Oid myrelid,
|
||||
{
|
||||
Relation targetrelation = NULL;
|
||||
Oid constraintOid;
|
||||
HeapTuple tuple;
|
||||
HeapTuple tuple;
|
||||
Form_pg_constraint con;
|
||||
|
||||
AssertArg(!myrelid || !mytypid);
|
||||
@@ -2391,7 +2391,11 @@ rename_constraint_internal(Oid myrelid,
|
||||
else
|
||||
{
|
||||
targetrelation = relation_open(myrelid, AccessExclusiveLock);
|
||||
/* don't tell it whether we're recursing; we allow changing typed tables here */
|
||||
|
||||
/*
|
||||
* don't tell it whether we're recursing; we allow changing typed
|
||||
* tables here
|
||||
*/
|
||||
renameatt_check(myrelid, RelationGetForm(targetrelation), false);
|
||||
|
||||
constraintOid = get_relation_constraint_oid(myrelid, oldconname, false);
|
||||
@@ -2408,9 +2412,9 @@ rename_constraint_internal(Oid myrelid,
|
||||
if (recurse)
|
||||
{
|
||||
List *child_oids,
|
||||
*child_numparents;
|
||||
*child_numparents;
|
||||
ListCell *lo,
|
||||
*li;
|
||||
*li;
|
||||
|
||||
child_oids = find_all_inheritors(myrelid, AccessExclusiveLock,
|
||||
&child_numparents);
|
||||
@@ -2455,7 +2459,7 @@ rename_constraint_internal(Oid myrelid,
|
||||
ReleaseSysCache(tuple);
|
||||
|
||||
if (targetrelation)
|
||||
relation_close(targetrelation, NoLock); /* close rel but keep lock */
|
||||
relation_close(targetrelation, NoLock); /* close rel but keep lock */
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2469,7 +2473,7 @@ RenameConstraint(RenameStmt *stmt)
|
||||
Relation rel;
|
||||
HeapTuple tup;
|
||||
|
||||
typid = typenameTypeId(NULL, makeTypeNameFromNameList(stmt->object));
|
||||
typid = typenameTypeId(NULL, makeTypeNameFromNameList(stmt->object));
|
||||
rel = heap_open(TypeRelationId, RowExclusiveLock);
|
||||
tup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
|
||||
if (!HeapTupleIsValid(tup))
|
||||
@@ -2490,9 +2494,9 @@ RenameConstraint(RenameStmt *stmt)
|
||||
rename_constraint_internal(relid, typid,
|
||||
stmt->subname,
|
||||
stmt->newname,
|
||||
stmt->relation ? interpretInhOption(stmt->relation->inhOpt) : false, /* recursive? */
|
||||
stmt->relation ? interpretInhOption(stmt->relation->inhOpt) : false, /* recursive? */
|
||||
false, /* recursing? */
|
||||
0 /* expected inhcount */);
|
||||
0 /* expected inhcount */ );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2507,8 +2511,8 @@ RenameRelation(RenameStmt *stmt)
|
||||
* Grab an exclusive lock on the target table, index, sequence or view,
|
||||
* which we will NOT release until end of transaction.
|
||||
*
|
||||
* Lock level used here should match RenameRelationInternal, to avoid
|
||||
* lock escalation.
|
||||
* Lock level used here should match RenameRelationInternal, to avoid lock
|
||||
* escalation.
|
||||
*/
|
||||
relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock,
|
||||
stmt->missing_ok, false,
|
||||
@@ -2519,7 +2523,7 @@ RenameRelation(RenameStmt *stmt)
|
||||
{
|
||||
ereport(NOTICE,
|
||||
(errmsg("relation \"%s\" does not exist, skipping",
|
||||
stmt->relation->relname)));
|
||||
stmt->relation->relname)));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2702,11 +2706,11 @@ AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode)
|
||||
* Thanks to the magic of MVCC, an error anywhere along the way rolls back
|
||||
* the whole operation; we don't have to do anything special to clean up.
|
||||
*
|
||||
* The caller must lock the relation, with an appropriate lock level
|
||||
* The caller must lock the relation, with an appropriate lock level
|
||||
* for the subcommands requested. Any subcommand that needs to rewrite
|
||||
* tuples in the table forces the whole command to be executed with
|
||||
* AccessExclusiveLock (actually, that is currently required always, but
|
||||
* we hope to relax it at some point). We pass the lock level down
|
||||
* we hope to relax it at some point). We pass the lock level down
|
||||
* so that we can apply it recursively to inherited tables. Note that the
|
||||
* lock level we want as we recurse might well be higher than required for
|
||||
* that specific subcommand. So we pass down the overall lock requirement,
|
||||
@@ -2773,22 +2777,22 @@ LOCKMODE
|
||||
AlterTableGetLockLevel(List *cmds)
|
||||
{
|
||||
/*
|
||||
* Late in 9.1 dev cycle a number of issues were uncovered with access
|
||||
* to catalog relations, leading to the decision to re-enforce all DDL
|
||||
* at AccessExclusiveLock level by default.
|
||||
* Late in 9.1 dev cycle a number of issues were uncovered with access to
|
||||
* catalog relations, leading to the decision to re-enforce all DDL at
|
||||
* AccessExclusiveLock level by default.
|
||||
*
|
||||
* The issues are that there is a pervasive assumption in the code that
|
||||
* the catalogs will not be read unless an AccessExclusiveLock is held.
|
||||
* If that rule is relaxed, we must protect against a number of potential
|
||||
* the catalogs will not be read unless an AccessExclusiveLock is held. If
|
||||
* that rule is relaxed, we must protect against a number of potential
|
||||
* effects - infrequent, but proven possible with test cases where
|
||||
* multiple DDL operations occur in a stream against frequently accessed
|
||||
* tables.
|
||||
*
|
||||
* 1. Catalog tables are read using SnapshotNow, which has a race bug
|
||||
* that allows a scan to return no valid rows even when one is present
|
||||
* in the case of a commit of a concurrent update of the catalog table.
|
||||
* SnapshotNow also ignores transactions in progress, so takes the
|
||||
* latest committed version without waiting for the latest changes.
|
||||
* 1. Catalog tables are read using SnapshotNow, which has a race bug that
|
||||
* allows a scan to return no valid rows even when one is present in the
|
||||
* case of a commit of a concurrent update of the catalog table.
|
||||
* SnapshotNow also ignores transactions in progress, so takes the latest
|
||||
* committed version without waiting for the latest changes.
|
||||
*
|
||||
* 2. Relcache needs to be internally consistent, so unless we lock the
|
||||
* definition during reads we have no way to guarantee that.
|
||||
@@ -3156,8 +3160,8 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd,
|
||||
pass = AT_PASS_MISC; /* doesn't actually matter */
|
||||
break;
|
||||
case AT_SetRelOptions: /* SET (...) */
|
||||
case AT_ResetRelOptions: /* RESET (...) */
|
||||
case AT_ReplaceRelOptions: /* reset them all, then set just these */
|
||||
case AT_ResetRelOptions: /* RESET (...) */
|
||||
case AT_ReplaceRelOptions: /* reset them all, then set just these */
|
||||
ATSimplePermissions(rel, ATT_TABLE | ATT_INDEX | ATT_VIEW);
|
||||
/* This command never recurses */
|
||||
/* No command-specific prep needed */
|
||||
@@ -3344,8 +3348,8 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, Relation rel,
|
||||
case AT_ValidateConstraint: /* VALIDATE CONSTRAINT */
|
||||
ATExecValidateConstraint(rel, cmd->name, false, false, lockmode);
|
||||
break;
|
||||
case AT_ValidateConstraintRecurse: /* VALIDATE CONSTRAINT with
|
||||
* recursion */
|
||||
case AT_ValidateConstraintRecurse: /* VALIDATE CONSTRAINT with
|
||||
* recursion */
|
||||
ATExecValidateConstraint(rel, cmd->name, true, false, lockmode);
|
||||
break;
|
||||
case AT_DropConstraint: /* DROP CONSTRAINT */
|
||||
@@ -3361,7 +3365,7 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, Relation rel,
|
||||
case AT_AlterColumnType: /* ALTER COLUMN TYPE */
|
||||
ATExecAlterColumnType(tab, rel, cmd, lockmode);
|
||||
break;
|
||||
case AT_AlterColumnGenericOptions: /* ALTER COLUMN OPTIONS */
|
||||
case AT_AlterColumnGenericOptions: /* ALTER COLUMN OPTIONS */
|
||||
ATExecAlterColumnGenericOptions(rel, cmd->name, (List *) cmd->def, lockmode);
|
||||
break;
|
||||
case AT_ChangeOwner: /* ALTER OWNER */
|
||||
@@ -4725,7 +4729,7 @@ static void
|
||||
check_for_column_name_collision(Relation rel, const char *colname)
|
||||
{
|
||||
HeapTuple attTuple;
|
||||
int attnum;
|
||||
int attnum;
|
||||
|
||||
/*
|
||||
* this test is deliberately not attisdropped-aware, since if one tries to
|
||||
@@ -4737,7 +4741,7 @@ check_for_column_name_collision(Relation rel, const char *colname)
|
||||
if (!HeapTupleIsValid(attTuple))
|
||||
return;
|
||||
|
||||
attnum = ((Form_pg_attribute) GETSTRUCT(attTuple))->attnum;
|
||||
attnum = ((Form_pg_attribute) GETSTRUCT(attTuple))->attnum;
|
||||
ReleaseSysCache(attTuple);
|
||||
|
||||
/*
|
||||
@@ -4745,16 +4749,16 @@ check_for_column_name_collision(Relation rel, const char *colname)
|
||||
* names, since they are normally not shown and the user might otherwise
|
||||
* be confused about the reason for the conflict.
|
||||
*/
|
||||
if (attnum <= 0)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DUPLICATE_COLUMN),
|
||||
errmsg("column name \"%s\" conflicts with a system column name",
|
||||
colname)));
|
||||
else
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DUPLICATE_COLUMN),
|
||||
errmsg("column \"%s\" of relation \"%s\" already exists",
|
||||
colname, RelationGetRelationName(rel))));
|
||||
if (attnum <= 0)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DUPLICATE_COLUMN),
|
||||
errmsg("column name \"%s\" conflicts with a system column name",
|
||||
colname)));
|
||||
else
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DUPLICATE_COLUMN),
|
||||
errmsg("column \"%s\" of relation \"%s\" already exists",
|
||||
colname, RelationGetRelationName(rel))));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -4999,8 +5003,8 @@ ATExecColumnDefault(Relation rel, const char *colName,
|
||||
* safety, but at present we do not expect anything to depend on the
|
||||
* default.
|
||||
*
|
||||
* We treat removing the existing default as an internal operation when
|
||||
* it is preparatory to adding a new default, but as a user-initiated
|
||||
* We treat removing the existing default as an internal operation when it
|
||||
* is preparatory to adding a new default, but as a user-initiated
|
||||
* operation when the user asked for a drop.
|
||||
*/
|
||||
RemoveAttrDefault(RelationGetRelid(rel), attnum, DROP_RESTRICT, false,
|
||||
@@ -5507,13 +5511,14 @@ ATExecAddIndex(AlteredTableInfo *tab, Relation rel,
|
||||
|
||||
/*
|
||||
* If TryReuseIndex() stashed a relfilenode for us, we used it for the new
|
||||
* index instead of building from scratch. The DROP of the old edition of
|
||||
* index instead of building from scratch. The DROP of the old edition of
|
||||
* this index will have scheduled the storage for deletion at commit, so
|
||||
* cancel that pending deletion.
|
||||
*/
|
||||
if (OidIsValid(stmt->oldNode))
|
||||
{
|
||||
Relation irel = index_open(new_index, NoLock);
|
||||
|
||||
RelationPreserveStorage(irel->rd_node, true);
|
||||
index_close(irel, NoLock);
|
||||
}
|
||||
@@ -5687,8 +5692,8 @@ ATAddCheckConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
|
||||
*/
|
||||
newcons = AddRelationNewConstraints(rel, NIL,
|
||||
list_make1(copyObject(constr)),
|
||||
recursing, /* allow_merge */
|
||||
!recursing); /* is_local */
|
||||
recursing, /* allow_merge */
|
||||
!recursing); /* is_local */
|
||||
|
||||
/* Add each to-be-validated constraint to Phase 3's queue */
|
||||
foreach(lcon, newcons)
|
||||
@@ -5743,7 +5748,7 @@ ATAddCheckConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel,
|
||||
|
||||
/*
|
||||
* Check if ONLY was specified with ALTER TABLE. If so, allow the
|
||||
* contraint creation only if there are no children currently. Error out
|
||||
* contraint creation only if there are no children currently. Error out
|
||||
* otherwise.
|
||||
*/
|
||||
if (!recurse && children != NIL)
|
||||
@@ -6064,11 +6069,11 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
|
||||
|
||||
/*
|
||||
* Upon a change to the cast from the FK column to its pfeqop
|
||||
* operand, revalidate the constraint. For this evaluation, a
|
||||
* operand, revalidate the constraint. For this evaluation, a
|
||||
* binary coercion cast is equivalent to no cast at all. While
|
||||
* type implementors should design implicit casts with an eye
|
||||
* toward consistency of operations like equality, we cannot assume
|
||||
* here that they have done so.
|
||||
* toward consistency of operations like equality, we cannot
|
||||
* assume here that they have done so.
|
||||
*
|
||||
* A function with a polymorphic argument could change behavior
|
||||
* arbitrarily in response to get_fn_expr_argtype(). Therefore,
|
||||
@@ -6082,7 +6087,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
|
||||
* Necessarily, the primary key column must then be of the domain
|
||||
* type. Since the constraint was previously valid, all values on
|
||||
* the foreign side necessarily exist on the primary side and in
|
||||
* turn conform to the domain. Consequently, we need not treat
|
||||
* turn conform to the domain. Consequently, we need not treat
|
||||
* domains specially here.
|
||||
*
|
||||
* Since we require that all collations share the same notion of
|
||||
@@ -6091,8 +6096,8 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
|
||||
*
|
||||
* We need not directly consider the PK type. It's necessarily
|
||||
* binary coercible to the opcintype of the unique index column,
|
||||
* and ri_triggers.c will only deal with PK datums in terms of that
|
||||
* opcintype. Changing the opcintype also changes pfeqop.
|
||||
* and ri_triggers.c will only deal with PK datums in terms of
|
||||
* that opcintype. Changing the opcintype also changes pfeqop.
|
||||
*/
|
||||
old_check_ok = (new_pathtype == old_pathtype &&
|
||||
new_castfunc == old_castfunc &&
|
||||
@@ -6144,11 +6149,11 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
|
||||
createForeignKeyTriggers(rel, fkconstraint, constrOid, indexOid);
|
||||
|
||||
/*
|
||||
* Tell Phase 3 to check that the constraint is satisfied by existing rows.
|
||||
* We can skip this during table creation, when requested explicitly by
|
||||
* specifying NOT VALID in an ADD FOREIGN KEY command, and when we're
|
||||
* recreating a constraint following a SET DATA TYPE operation that did not
|
||||
* impugn its validity.
|
||||
* Tell Phase 3 to check that the constraint is satisfied by existing
|
||||
* rows. We can skip this during table creation, when requested explicitly
|
||||
* by specifying NOT VALID in an ADD FOREIGN KEY command, and when we're
|
||||
* recreating a constraint following a SET DATA TYPE operation that did
|
||||
* not impugn its validity.
|
||||
*/
|
||||
if (!old_check_ok && !fkconstraint->skip_validation)
|
||||
{
|
||||
@@ -6236,12 +6241,12 @@ ATExecValidateConstraint(Relation rel, char *constrName, bool recurse,
|
||||
Relation refrel;
|
||||
|
||||
/*
|
||||
* Triggers are already in place on both tables, so a concurrent write
|
||||
* that alters the result here is not possible. Normally we can run a
|
||||
* query here to do the validation, which would only require
|
||||
* AccessShareLock. In some cases, it is possible that we might need
|
||||
* to fire triggers to perform the check, so we take a lock at
|
||||
* RowShareLock level just in case.
|
||||
* Triggers are already in place on both tables, so a concurrent
|
||||
* write that alters the result here is not possible. Normally we
|
||||
* can run a query here to do the validation, which would only
|
||||
* require AccessShareLock. In some cases, it is possible that we
|
||||
* might need to fire triggers to perform the check, so we take a
|
||||
* lock at RowShareLock level just in case.
|
||||
*/
|
||||
refrel = heap_open(con->confrelid, RowShareLock);
|
||||
|
||||
@@ -6278,7 +6283,7 @@ ATExecValidateConstraint(Relation rel, char *constrName, bool recurse,
|
||||
*/
|
||||
foreach(child, children)
|
||||
{
|
||||
Oid childoid = lfirst_oid(child);
|
||||
Oid childoid = lfirst_oid(child);
|
||||
Relation childrel;
|
||||
|
||||
if (childoid == RelationGetRelid(rel))
|
||||
@@ -6662,27 +6667,28 @@ checkFkeyPermissions(Relation rel, int16 *attnums, int natts)
|
||||
static void
|
||||
validateCheckConstraint(Relation rel, HeapTuple constrtup)
|
||||
{
|
||||
EState *estate;
|
||||
Datum val;
|
||||
char *conbin;
|
||||
Expr *origexpr;
|
||||
List *exprstate;
|
||||
TupleDesc tupdesc;
|
||||
HeapScanDesc scan;
|
||||
HeapTuple tuple;
|
||||
ExprContext *econtext;
|
||||
MemoryContext oldcxt;
|
||||
EState *estate;
|
||||
Datum val;
|
||||
char *conbin;
|
||||
Expr *origexpr;
|
||||
List *exprstate;
|
||||
TupleDesc tupdesc;
|
||||
HeapScanDesc scan;
|
||||
HeapTuple tuple;
|
||||
ExprContext *econtext;
|
||||
MemoryContext oldcxt;
|
||||
TupleTableSlot *slot;
|
||||
Form_pg_constraint constrForm;
|
||||
bool isnull;
|
||||
bool isnull;
|
||||
|
||||
constrForm = (Form_pg_constraint) GETSTRUCT(constrtup);
|
||||
|
||||
estate = CreateExecutorState();
|
||||
|
||||
/*
|
||||
* XXX this tuple doesn't really come from a syscache, but this doesn't
|
||||
* matter to SysCacheGetAttr, because it only wants to be able to fetch the
|
||||
* tupdesc
|
||||
* matter to SysCacheGetAttr, because it only wants to be able to fetch
|
||||
* the tupdesc
|
||||
*/
|
||||
val = SysCacheGetAttr(CONSTROID, constrtup, Anum_pg_constraint_conbin,
|
||||
&isnull);
|
||||
@@ -7132,7 +7138,7 @@ ATExecDropConstraint(Relation rel, const char *constrName,
|
||||
|
||||
con = (Form_pg_constraint) GETSTRUCT(copy_tuple);
|
||||
|
||||
if (con->coninhcount <= 0) /* shouldn't happen */
|
||||
if (con->coninhcount <= 0) /* shouldn't happen */
|
||||
elog(ERROR, "relation %u has non-inherited constraint \"%s\"",
|
||||
childrelid, constrName);
|
||||
|
||||
@@ -7140,8 +7146,7 @@ ATExecDropConstraint(Relation rel, const char *constrName,
|
||||
{
|
||||
/*
|
||||
* If the child constraint has other definition sources, just
|
||||
* decrement its inheritance count; if not, recurse to delete
|
||||
* it.
|
||||
* decrement its inheritance count; if not, recurse to delete it.
|
||||
*/
|
||||
if (con->coninhcount == 1 && !con->conislocal)
|
||||
{
|
||||
@@ -7164,9 +7169,9 @@ ATExecDropConstraint(Relation rel, const char *constrName,
|
||||
else
|
||||
{
|
||||
/*
|
||||
* If we were told to drop ONLY in this table (no recursion),
|
||||
* we need to mark the inheritors' constraints as locally
|
||||
* defined rather than inherited.
|
||||
* If we were told to drop ONLY in this table (no recursion), we
|
||||
* need to mark the inheritors' constraints as locally defined
|
||||
* rather than inherited.
|
||||
*/
|
||||
con->coninhcount--;
|
||||
con->conislocal = true;
|
||||
@@ -7315,8 +7320,8 @@ ATPrepAlterColumnType(List **wqueue,
|
||||
if (transform == NULL)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||
errmsg("column \"%s\" cannot be cast automatically to type %s",
|
||||
colName, format_type_be(targettype)),
|
||||
errmsg("column \"%s\" cannot be cast automatically to type %s",
|
||||
colName, format_type_be(targettype)),
|
||||
errhint("Specify a USING expression to perform the conversion.")));
|
||||
|
||||
/* Fix collations after all else */
|
||||
@@ -7483,8 +7488,8 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel,
|
||||
if (defaultexpr == NULL)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||
errmsg("default for column \"%s\" cannot be cast automatically to type %s",
|
||||
colName, format_type_be(targettype))));
|
||||
errmsg("default for column \"%s\" cannot be cast automatically to type %s",
|
||||
colName, format_type_be(targettype))));
|
||||
}
|
||||
else
|
||||
defaultexpr = NULL;
|
||||
@@ -8060,7 +8065,8 @@ TryReuseIndex(Oid oldId, IndexStmt *stmt)
|
||||
stmt->indexParams,
|
||||
stmt->excludeOpNames))
|
||||
{
|
||||
Relation irel = index_open(oldId, NoLock);
|
||||
Relation irel = index_open(oldId, NoLock);
|
||||
|
||||
stmt->oldNode = irel->rd_node.relNode;
|
||||
index_close(irel, NoLock);
|
||||
}
|
||||
@@ -8085,7 +8091,7 @@ TryReuseForeignKey(Oid oldId, Constraint *con)
|
||||
int i;
|
||||
|
||||
Assert(con->contype == CONSTR_FOREIGN);
|
||||
Assert(con->old_conpfeqop == NIL); /* already prepared this node */
|
||||
Assert(con->old_conpfeqop == NIL); /* already prepared this node */
|
||||
|
||||
tup = SearchSysCache1(CONSTROID, ObjectIdGetDatum(oldId));
|
||||
if (!HeapTupleIsValid(tup)) /* should not happen */
|
||||
@@ -8587,8 +8593,8 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation,
|
||||
|
||||
/* Generate new proposed reloptions (text array) */
|
||||
newOptions = transformRelOptions(isnull ? (Datum) 0 : datum,
|
||||
defList, NULL, validnsps, false,
|
||||
operation == AT_ResetRelOptions);
|
||||
defList, NULL, validnsps, false,
|
||||
operation == AT_ResetRelOptions);
|
||||
|
||||
/* Validate */
|
||||
switch (rel->rd_rel->relkind)
|
||||
@@ -8665,8 +8671,8 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation,
|
||||
}
|
||||
|
||||
newOptions = transformRelOptions(isnull ? (Datum) 0 : datum,
|
||||
defList, "toast", validnsps, false,
|
||||
operation == AT_ResetRelOptions);
|
||||
defList, "toast", validnsps, false,
|
||||
operation == AT_ResetRelOptions);
|
||||
|
||||
(void) heap_reloptions(RELKIND_TOASTVALUE, newOptions, true);
|
||||
|
||||
@@ -9831,7 +9837,7 @@ AlterTableNamespace(AlterObjectSchemaStmt *stmt)
|
||||
{
|
||||
ereport(NOTICE,
|
||||
(errmsg("relation \"%s\" does not exist, skipping",
|
||||
stmt->relation->relname)));
|
||||
stmt->relation->relname)));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -9848,10 +9854,10 @@ AlterTableNamespace(AlterObjectSchemaStmt *stmt)
|
||||
if (sequenceIsOwned(relid, &tableId, &colId))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("cannot move an owned sequence into another schema"),
|
||||
errdetail("Sequence \"%s\" is linked to table \"%s\".",
|
||||
RelationGetRelationName(rel),
|
||||
get_rel_name(tableId))));
|
||||
errmsg("cannot move an owned sequence into another schema"),
|
||||
errdetail("Sequence \"%s\" is linked to table \"%s\".",
|
||||
RelationGetRelationName(rel),
|
||||
get_rel_name(tableId))));
|
||||
}
|
||||
|
||||
/* Get and lock schema OID and check its permissions. */
|
||||
@@ -10267,9 +10273,9 @@ RangeVarCallbackOwnsTable(const RangeVar *relation,
|
||||
return;
|
||||
|
||||
/*
|
||||
* If the relation does exist, check whether it's an index. But note
|
||||
* that the relation might have been dropped between the time we did the
|
||||
* name lookup and now. In that case, there's nothing to do.
|
||||
* If the relation does exist, check whether it's an index. But note that
|
||||
* the relation might have been dropped between the time we did the name
|
||||
* lookup and now. In that case, there's nothing to do.
|
||||
*/
|
||||
relkind = get_rel_relkind(relId);
|
||||
if (!relkind)
|
||||
@@ -10292,16 +10298,16 @@ static void
|
||||
RangeVarCallbackForAlterRelation(const RangeVar *rv, Oid relid, Oid oldrelid,
|
||||
void *arg)
|
||||
{
|
||||
Node *stmt = (Node *) arg;
|
||||
ObjectType reltype;
|
||||
HeapTuple tuple;
|
||||
Form_pg_class classform;
|
||||
AclResult aclresult;
|
||||
char relkind;
|
||||
Node *stmt = (Node *) arg;
|
||||
ObjectType reltype;
|
||||
HeapTuple tuple;
|
||||
Form_pg_class classform;
|
||||
AclResult aclresult;
|
||||
char relkind;
|
||||
|
||||
tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
|
||||
if (!HeapTupleIsValid(tuple))
|
||||
return; /* concurrently dropped */
|
||||
return; /* concurrently dropped */
|
||||
classform = (Form_pg_class) GETSTRUCT(tuple);
|
||||
relkind = classform->relkind;
|
||||
|
||||
@@ -10324,7 +10330,7 @@ RangeVarCallbackForAlterRelation(const RangeVar *rv, Oid relid, Oid oldrelid,
|
||||
*/
|
||||
if (IsA(stmt, RenameStmt))
|
||||
{
|
||||
aclresult = pg_namespace_aclcheck(classform->relnamespace,
|
||||
aclresult = pg_namespace_aclcheck(classform->relnamespace,
|
||||
GetUserId(), ACL_CREATE);
|
||||
if (aclresult != ACLCHECK_OK)
|
||||
aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
|
||||
@@ -10333,20 +10339,21 @@ RangeVarCallbackForAlterRelation(const RangeVar *rv, Oid relid, Oid oldrelid,
|
||||
}
|
||||
else if (IsA(stmt, AlterObjectSchemaStmt))
|
||||
reltype = ((AlterObjectSchemaStmt *) stmt)->objectType;
|
||||
|
||||
else if (IsA(stmt, AlterTableStmt))
|
||||
reltype = ((AlterTableStmt *) stmt)->relkind;
|
||||
else
|
||||
{
|
||||
reltype = OBJECT_TABLE; /* placate compiler */
|
||||
reltype = OBJECT_TABLE; /* placate compiler */
|
||||
elog(ERROR, "unrecognized node type: %d", (int) nodeTag(stmt));
|
||||
}
|
||||
|
||||
/*
|
||||
* For compatibility with prior releases, we allow ALTER TABLE to be
|
||||
* used with most other types of relations (but not composite types).
|
||||
* We allow similar flexibility for ALTER INDEX in the case of RENAME,
|
||||
* but not otherwise. Otherwise, the user must select the correct form
|
||||
* of the command for the relation at issue.
|
||||
* For compatibility with prior releases, we allow ALTER TABLE to be used
|
||||
* with most other types of relations (but not composite types). We allow
|
||||
* similar flexibility for ALTER INDEX in the case of RENAME, but not
|
||||
* otherwise. Otherwise, the user must select the correct form of the
|
||||
* command for the relation at issue.
|
||||
*/
|
||||
if (reltype == OBJECT_SEQUENCE && relkind != RELKIND_SEQUENCE)
|
||||
ereport(ERROR,
|
||||
@@ -10391,10 +10398,10 @@ RangeVarCallbackForAlterRelation(const RangeVar *rv, Oid relid, Oid oldrelid,
|
||||
errhint("Use ALTER FOREIGN TABLE instead.")));
|
||||
|
||||
/*
|
||||
* Don't allow ALTER TABLE .. SET SCHEMA on relations that can't be
|
||||
* moved to a different schema, such as indexes and TOAST tables.
|
||||
* Don't allow ALTER TABLE .. SET SCHEMA on relations that can't be moved
|
||||
* to a different schema, such as indexes and TOAST tables.
|
||||
*/
|
||||
if (IsA(stmt, AlterObjectSchemaStmt) && relkind != RELKIND_RELATION
|
||||
if (IsA(stmt, AlterObjectSchemaStmt) &&relkind != RELKIND_RELATION
|
||||
&& relkind != RELKIND_VIEW && relkind != RELKIND_SEQUENCE
|
||||
&& relkind != RELKIND_FOREIGN_TABLE)
|
||||
ereport(ERROR,
|
||||
|
||||
@@ -437,7 +437,8 @@ DropTableSpace(DropTableSpaceStmt *stmt)
|
||||
/* DROP hook for the tablespace being removed */
|
||||
if (object_access_hook)
|
||||
{
|
||||
ObjectAccessDrop drop_arg;
|
||||
ObjectAccessDrop drop_arg;
|
||||
|
||||
memset(&drop_arg, 0, sizeof(ObjectAccessDrop));
|
||||
InvokeObjectAccessHook(OAT_DROP, TableSpaceRelationId,
|
||||
tablespaceoid, 0, &drop_arg);
|
||||
@@ -638,7 +639,7 @@ create_tablespace_directories(const char *location, const Oid tablespaceoid)
|
||||
* Attempt to remove filesystem infrastructure for the tablespace.
|
||||
*
|
||||
* 'redo' indicates we are redoing a drop from XLOG; in that case we should
|
||||
* not throw an ERROR for problems, just LOG them. The worst consequence of
|
||||
* not throw an ERROR for problems, just LOG them. The worst consequence of
|
||||
* not removing files here would be failure to release some disk space, which
|
||||
* does not justify throwing an error that would require manual intervention
|
||||
* to get the database running again.
|
||||
@@ -678,7 +679,7 @@ destroy_tablespace_directories(Oid tablespaceoid, bool redo)
|
||||
* with a warning. This is because even though ProcessUtility disallows
|
||||
* DROP TABLESPACE in a transaction block, it's possible that a previous
|
||||
* DROP failed and rolled back after removing the tablespace directories
|
||||
* and/or symlink. We want to allow a new DROP attempt to succeed at
|
||||
* and/or symlink. We want to allow a new DROP attempt to succeed at
|
||||
* removing the catalog entries (and symlink if still present), so we
|
||||
* should not give a hard error here.
|
||||
*/
|
||||
@@ -1199,14 +1200,14 @@ check_temp_tablespaces(char **newval, void **extra, GucSource source)
|
||||
}
|
||||
|
||||
/*
|
||||
* In an interactive SET command, we ereport for bad info. When
|
||||
* In an interactive SET command, we ereport for bad info. When
|
||||
* source == PGC_S_TEST, we are checking the argument of an ALTER
|
||||
* DATABASE SET or ALTER USER SET command. pg_dumpall dumps all
|
||||
* DATABASE SET or ALTER USER SET command. pg_dumpall dumps all
|
||||
* roles before tablespaces, so if we're restoring a pg_dumpall
|
||||
* script the tablespace might not yet exist, but will be created
|
||||
* later. Because of that, issue a NOTICE if source == PGC_S_TEST,
|
||||
* but accept the value anyway. Otherwise, silently ignore any
|
||||
* bad list elements.
|
||||
* later. Because of that, issue a NOTICE if source ==
|
||||
* PGC_S_TEST, but accept the value anyway. Otherwise, silently
|
||||
* ignore any bad list elements.
|
||||
*/
|
||||
curoid = get_tablespace_oid(curname, source <= PGC_S_TEST);
|
||||
if (curoid == InvalidOid)
|
||||
@@ -1493,10 +1494,10 @@ tblspc_redo(XLogRecPtr lsn, XLogRecord *record)
|
||||
* files then do conflict processing and try again, if currently
|
||||
* enabled.
|
||||
*
|
||||
* Other possible reasons for failure include bollixed file permissions
|
||||
* on a standby server when they were okay on the primary, etc etc.
|
||||
* There's not much we can do about that, so just remove what we can
|
||||
* and press on.
|
||||
* Other possible reasons for failure include bollixed file
|
||||
* permissions on a standby server when they were okay on the primary,
|
||||
* etc etc. There's not much we can do about that, so just remove what
|
||||
* we can and press on.
|
||||
*/
|
||||
if (!destroy_tablespace_directories(xlrec->ts_id, true))
|
||||
{
|
||||
@@ -1513,8 +1514,8 @@ tblspc_redo(XLogRecPtr lsn, XLogRecord *record)
|
||||
if (!destroy_tablespace_directories(xlrec->ts_id, true))
|
||||
ereport(LOG,
|
||||
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
||||
errmsg("directories for tablespace %u could not be removed",
|
||||
xlrec->ts_id),
|
||||
errmsg("directories for tablespace %u could not be removed",
|
||||
xlrec->ts_id),
|
||||
errhint("You can remove the directories manually if necessary.")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -199,8 +199,8 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
|
||||
/*
|
||||
* We must take a lock on the target relation to protect against
|
||||
* concurrent drop. It's not clear that AccessShareLock is strong
|
||||
* enough, but we certainly need at least that much... otherwise,
|
||||
* we might end up creating a pg_constraint entry referencing a
|
||||
* enough, but we certainly need at least that much... otherwise, we
|
||||
* might end up creating a pg_constraint entry referencing a
|
||||
* nonexistent table.
|
||||
*/
|
||||
constrrelid = RangeVarGetRelid(stmt->constrrel, AccessShareLock, false);
|
||||
@@ -494,8 +494,8 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
|
||||
* can skip this for internally generated triggers, since the name
|
||||
* modification above should be sufficient.
|
||||
*
|
||||
* NOTE that this is cool only because we have AccessExclusiveLock on
|
||||
* the relation, so the trigger set won't be changing underneath us.
|
||||
* NOTE that this is cool only because we have AccessExclusiveLock on the
|
||||
* relation, so the trigger set won't be changing underneath us.
|
||||
*/
|
||||
if (!isInternal)
|
||||
{
|
||||
@@ -1168,27 +1168,27 @@ static void
|
||||
RangeVarCallbackForRenameTrigger(const RangeVar *rv, Oid relid, Oid oldrelid,
|
||||
void *arg)
|
||||
{
|
||||
HeapTuple tuple;
|
||||
Form_pg_class form;
|
||||
HeapTuple tuple;
|
||||
Form_pg_class form;
|
||||
|
||||
tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
|
||||
if (!HeapTupleIsValid(tuple))
|
||||
return; /* concurrently dropped */
|
||||
return; /* concurrently dropped */
|
||||
form = (Form_pg_class) GETSTRUCT(tuple);
|
||||
|
||||
/* only tables and views can have triggers */
|
||||
if (form->relkind != RELKIND_RELATION && form->relkind != RELKIND_VIEW)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||
errmsg("\"%s\" is not a table or view", rv->relname)));
|
||||
if (form->relkind != RELKIND_RELATION && form->relkind != RELKIND_VIEW)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||
errmsg("\"%s\" is not a table or view", rv->relname)));
|
||||
|
||||
/* you must own the table to rename one of its triggers */
|
||||
if (!pg_class_ownercheck(relid, GetUserId()))
|
||||
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS, rv->relname);
|
||||
if (!allowSystemTableMods && IsSystemClass(form))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
errmsg("permission denied: \"%s\" is a system catalog",
|
||||
if (!pg_class_ownercheck(relid, GetUserId()))
|
||||
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS, rv->relname);
|
||||
if (!allowSystemTableMods && IsSystemClass(form))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
errmsg("permission denied: \"%s\" is a system catalog",
|
||||
rv->relname)));
|
||||
|
||||
ReleaseSysCache(tuple);
|
||||
|
||||
@@ -609,7 +609,7 @@ DefineType(List *names, List *parameters)
|
||||
F_ARRAY_SEND, /* send procedure */
|
||||
typmodinOid, /* typmodin procedure */
|
||||
typmodoutOid, /* typmodout procedure */
|
||||
F_ARRAY_TYPANALYZE, /* analyze procedure */
|
||||
F_ARRAY_TYPANALYZE, /* analyze procedure */
|
||||
typoid, /* element type ID */
|
||||
true, /* yes this is an array type */
|
||||
InvalidOid, /* no further array type */
|
||||
@@ -1140,7 +1140,7 @@ DefineEnum(CreateEnumStmt *stmt)
|
||||
F_ARRAY_SEND, /* send procedure */
|
||||
InvalidOid, /* typmodin procedure - none */
|
||||
InvalidOid, /* typmodout procedure - none */
|
||||
F_ARRAY_TYPANALYZE, /* analyze procedure */
|
||||
F_ARRAY_TYPANALYZE, /* analyze procedure */
|
||||
enumTypeOid, /* element type ID */
|
||||
true, /* yes this is an array type */
|
||||
InvalidOid, /* no further array type */
|
||||
@@ -1450,7 +1450,7 @@ DefineRange(CreateRangeStmt *stmt)
|
||||
F_ARRAY_SEND, /* send procedure */
|
||||
InvalidOid, /* typmodin procedure - none */
|
||||
InvalidOid, /* typmodout procedure - none */
|
||||
F_ARRAY_TYPANALYZE, /* analyze procedure */
|
||||
F_ARRAY_TYPANALYZE, /* analyze procedure */
|
||||
typoid, /* element type ID */
|
||||
true, /* yes this is an array type */
|
||||
InvalidOid, /* no further array type */
|
||||
@@ -1477,15 +1477,15 @@ DefineRange(CreateRangeStmt *stmt)
|
||||
* impossible to define a polymorphic constructor; we have to generate new
|
||||
* constructor functions explicitly for each range type.
|
||||
*
|
||||
* We actually define 4 functions, with 0 through 3 arguments. This is just
|
||||
* We actually define 4 functions, with 0 through 3 arguments. This is just
|
||||
* to offer more convenience for the user.
|
||||
*/
|
||||
static void
|
||||
makeRangeConstructors(const char *name, Oid namespace,
|
||||
Oid rangeOid, Oid subtype)
|
||||
{
|
||||
static const char * const prosrc[2] = {"range_constructor2",
|
||||
"range_constructor3"};
|
||||
static const char *const prosrc[2] = {"range_constructor2",
|
||||
"range_constructor3"};
|
||||
static const int pronargs[2] = {2, 3};
|
||||
|
||||
Oid constructorArgTypes[3];
|
||||
@@ -1509,7 +1509,7 @@ makeRangeConstructors(const char *name, Oid namespace,
|
||||
constructorArgTypesVector = buildoidvector(constructorArgTypes,
|
||||
pronargs[i]);
|
||||
|
||||
procOid = ProcedureCreate(name, /* name: same as range type */
|
||||
procOid = ProcedureCreate(name, /* name: same as range type */
|
||||
namespace, /* namespace */
|
||||
false, /* replace */
|
||||
false, /* returns set */
|
||||
@@ -1518,7 +1518,7 @@ makeRangeConstructors(const char *name, Oid namespace,
|
||||
INTERNALlanguageId, /* language */
|
||||
F_FMGR_INTERNAL_VALIDATOR, /* language validator */
|
||||
prosrc[i], /* prosrc */
|
||||
NULL, /* probin */
|
||||
NULL, /* probin */
|
||||
false, /* isAgg */
|
||||
false, /* isWindowFunc */
|
||||
false, /* security_definer */
|
||||
@@ -1834,9 +1834,9 @@ findRangeSubOpclass(List *opcname, Oid subtype)
|
||||
if (!IsBinaryCoercible(subtype, opInputType))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||
errmsg("operator class \"%s\" does not accept data type %s",
|
||||
NameListToString(opcname),
|
||||
format_type_be(subtype))));
|
||||
errmsg("operator class \"%s\" does not accept data type %s",
|
||||
NameListToString(opcname),
|
||||
format_type_be(subtype))));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2335,8 +2335,8 @@ AlterDomainDropConstraint(List *names, const char *constrName,
|
||||
if (!missing_ok)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("constraint \"%s\" of domain \"%s\" does not exist",
|
||||
constrName, TypeNameToString(typename))));
|
||||
errmsg("constraint \"%s\" of domain \"%s\" does not exist",
|
||||
constrName, TypeNameToString(typename))));
|
||||
else
|
||||
ereport(NOTICE,
|
||||
(errmsg("constraint \"%s\" of domain \"%s\" does not exist, skipping",
|
||||
@@ -2958,7 +2958,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
|
||||
ccsrc, /* Source form of check constraint */
|
||||
true, /* is local */
|
||||
0, /* inhcount */
|
||||
false); /* is only */
|
||||
false); /* is only */
|
||||
|
||||
/*
|
||||
* Return the compiled constraint expression so the calling routine can
|
||||
|
||||
@@ -936,7 +936,8 @@ DropRole(DropRoleStmt *stmt)
|
||||
/* DROP hook for the role being removed */
|
||||
if (object_access_hook)
|
||||
{
|
||||
ObjectAccessDrop drop_arg;
|
||||
ObjectAccessDrop drop_arg;
|
||||
|
||||
memset(&drop_arg, 0, sizeof(ObjectAccessDrop));
|
||||
InvokeObjectAccessHook(OAT_DROP,
|
||||
AuthIdRelationId, roleid, 0, &drop_arg);
|
||||
|
||||
@@ -322,13 +322,13 @@ get_rel_oids(Oid relid, const RangeVar *vacrel)
|
||||
Oid relid;
|
||||
|
||||
/*
|
||||
* Since we don't take a lock here, the relation might be gone,
|
||||
* or the RangeVar might no longer refer to the OID we look up
|
||||
* here. In the former case, VACUUM will do nothing; in the
|
||||
* latter case, it will process the OID we looked up here, rather
|
||||
* than the new one. Neither is ideal, but there's little practical
|
||||
* alternative, since we're going to commit this transaction and
|
||||
* begin a new one between now and then.
|
||||
* Since we don't take a lock here, the relation might be gone, or the
|
||||
* RangeVar might no longer refer to the OID we look up here. In the
|
||||
* former case, VACUUM will do nothing; in the latter case, it will
|
||||
* process the OID we looked up here, rather than the new one.
|
||||
* Neither is ideal, but there's little practical alternative, since
|
||||
* we're going to commit this transaction and begin a new one between
|
||||
* now and then.
|
||||
*/
|
||||
relid = RangeVarGetRelid(vacrel, NoLock, false);
|
||||
|
||||
|
||||
@@ -155,9 +155,9 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt,
|
||||
BlockNumber possibly_freeable;
|
||||
PGRUsage ru0;
|
||||
TimestampTz starttime = 0;
|
||||
long secs;
|
||||
int usecs;
|
||||
double read_rate,
|
||||
long secs;
|
||||
int usecs;
|
||||
double read_rate,
|
||||
write_rate;
|
||||
bool scan_all;
|
||||
TransactionId freezeTableLimit;
|
||||
@@ -222,17 +222,17 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt,
|
||||
*
|
||||
* A corner case here is that if we scanned no pages at all because every
|
||||
* page is all-visible, we should not update relpages/reltuples, because
|
||||
* we have no new information to contribute. In particular this keeps
|
||||
* us from replacing relpages=reltuples=0 (which means "unknown tuple
|
||||
* we have no new information to contribute. In particular this keeps us
|
||||
* from replacing relpages=reltuples=0 (which means "unknown tuple
|
||||
* density") with nonzero relpages and reltuples=0 (which means "zero
|
||||
* tuple density") unless there's some actual evidence for the latter.
|
||||
*
|
||||
* We do update relallvisible even in the corner case, since if the
|
||||
* table is all-visible we'd definitely like to know that. But clamp
|
||||
* the value to be not more than what we're setting relpages to.
|
||||
* We do update relallvisible even in the corner case, since if the table
|
||||
* is all-visible we'd definitely like to know that. But clamp the value
|
||||
* to be not more than what we're setting relpages to.
|
||||
*
|
||||
* Also, don't change relfrozenxid if we skipped any pages, since then
|
||||
* we don't know for certain that all tuples have a newer xmin.
|
||||
* Also, don't change relfrozenxid if we skipped any pages, since then we
|
||||
* don't know for certain that all tuples have a newer xmin.
|
||||
*/
|
||||
new_rel_pages = vacrelstats->rel_pages;
|
||||
new_rel_tuples = vacrelstats->new_rel_tuples;
|
||||
@@ -265,7 +265,7 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt,
|
||||
/* and log the action if appropriate */
|
||||
if (IsAutoVacuumWorkerProcess() && Log_autovacuum_min_duration >= 0)
|
||||
{
|
||||
TimestampTz endtime = GetCurrentTimestamp();
|
||||
TimestampTz endtime = GetCurrentTimestamp();
|
||||
|
||||
if (Log_autovacuum_min_duration == 0 ||
|
||||
TimestampDifferenceExceeds(starttime, endtime,
|
||||
@@ -277,17 +277,17 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt,
|
||||
write_rate = 0;
|
||||
if ((secs > 0) || (usecs > 0))
|
||||
{
|
||||
read_rate = (double) BLCKSZ * VacuumPageMiss / (1024 * 1024) /
|
||||
(secs + usecs / 1000000.0);
|
||||
write_rate = (double) BLCKSZ * VacuumPageDirty / (1024 * 1024) /
|
||||
(secs + usecs / 1000000.0);
|
||||
read_rate = (double) BLCKSZ *VacuumPageMiss / (1024 * 1024) /
|
||||
(secs + usecs / 1000000.0);
|
||||
write_rate = (double) BLCKSZ *VacuumPageDirty / (1024 * 1024) /
|
||||
(secs + usecs / 1000000.0);
|
||||
}
|
||||
ereport(LOG,
|
||||
(errmsg("automatic vacuum of table \"%s.%s.%s\": index scans: %d\n"
|
||||
"pages: %d removed, %d remain\n"
|
||||
"tuples: %.0f removed, %.0f remain\n"
|
||||
"buffer usage: %d hits, %d misses, %d dirtied\n"
|
||||
"avg read rate: %.3f MiB/s, avg write rate: %.3f MiB/s\n"
|
||||
"avg read rate: %.3f MiB/s, avg write rate: %.3f MiB/s\n"
|
||||
"system usage: %s",
|
||||
get_database_name(MyDatabaseId),
|
||||
get_namespace_name(RelationGetNamespace(onerel)),
|
||||
@@ -300,7 +300,7 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt,
|
||||
VacuumPageHit,
|
||||
VacuumPageMiss,
|
||||
VacuumPageDirty,
|
||||
read_rate,write_rate,
|
||||
read_rate, write_rate,
|
||||
pg_rusage_show(&ru0))));
|
||||
}
|
||||
}
|
||||
@@ -501,10 +501,10 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
|
||||
vacrelstats->num_dead_tuples > 0)
|
||||
{
|
||||
/*
|
||||
* Before beginning index vacuuming, we release any pin we may hold
|
||||
* on the visibility map page. This isn't necessary for correctness,
|
||||
* but we do it anyway to avoid holding the pin across a lengthy,
|
||||
* unrelated operation.
|
||||
* Before beginning index vacuuming, we release any pin we may
|
||||
* hold on the visibility map page. This isn't necessary for
|
||||
* correctness, but we do it anyway to avoid holding the pin
|
||||
* across a lengthy, unrelated operation.
|
||||
*/
|
||||
if (BufferIsValid(vmbuffer))
|
||||
{
|
||||
@@ -535,10 +535,10 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
|
||||
/*
|
||||
* Pin the visibility map page in case we need to mark the page
|
||||
* all-visible. In most cases this will be very cheap, because we'll
|
||||
* already have the correct page pinned anyway. However, it's possible
|
||||
* that (a) next_not_all_visible_block is covered by a different VM page
|
||||
* than the current block or (b) we released our pin and did a cycle of
|
||||
* index vacuuming.
|
||||
* already have the correct page pinned anyway. However, it's
|
||||
* possible that (a) next_not_all_visible_block is covered by a
|
||||
* different VM page than the current block or (b) we released our pin
|
||||
* and did a cycle of index vacuuming.
|
||||
*/
|
||||
visibilitymap_pin(onerel, blkno, &vmbuffer);
|
||||
|
||||
@@ -873,10 +873,10 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
|
||||
else if (!all_visible_according_to_vm)
|
||||
{
|
||||
/*
|
||||
* It should never be the case that the visibility map page
|
||||
* is set while the page-level bit is clear, but the reverse
|
||||
* is allowed. Set the visibility map bit as well so that
|
||||
* we get back in sync.
|
||||
* It should never be the case that the visibility map page is
|
||||
* set while the page-level bit is clear, but the reverse is
|
||||
* allowed. Set the visibility map bit as well so that we get
|
||||
* back in sync.
|
||||
*/
|
||||
visibilitymap_set(onerel, blkno, InvalidXLogRecPtr, vmbuffer,
|
||||
visibility_cutoff_xid);
|
||||
@@ -1152,7 +1152,7 @@ lazy_check_needs_freeze(Buffer buf)
|
||||
|
||||
if (heap_tuple_needs_freeze(tupleheader, FreezeLimit, buf))
|
||||
return true;
|
||||
} /* scan along page */
|
||||
} /* scan along page */
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -204,8 +204,8 @@ DefineVirtualRelation(RangeVar *relation, List *tlist, bool replace,
|
||||
checkViewTupleDesc(descriptor, rel->rd_att);
|
||||
|
||||
/*
|
||||
* The new options list replaces the existing options list, even
|
||||
* if it's empty.
|
||||
* The new options list replaces the existing options list, even if
|
||||
* it's empty.
|
||||
*/
|
||||
atcmd = makeNode(AlterTableCmd);
|
||||
atcmd->subtype = AT_ReplaceRelOptions;
|
||||
@@ -504,7 +504,7 @@ DefineView(ViewStmt *stmt, const char *queryString)
|
||||
* long as the CREATE command is consistent with that --- no explicit
|
||||
* schema name.
|
||||
*/
|
||||
view = copyObject(stmt->view); /* don't corrupt original command */
|
||||
view = copyObject(stmt->view); /* don't corrupt original command */
|
||||
if (view->relpersistence == RELPERSISTENCE_PERMANENT
|
||||
&& isViewOnTempTable(viewParse))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user