mirror of
https://github.com/postgres/postgres.git
synced 2025-06-22 02:52:08 +03:00
First phase of plan-invalidation project: create a plan cache management
module and teach PREPARE and protocol-level prepared statements to use it. In service of this, rearrange utility-statement processing so that parse analysis does not assume table schemas can't change before execution for utility statements (necessary because we don't attempt to re-acquire locks for utility statements when reusing a stored plan). This requires some refactoring of the ProcessUtility API, but it ends up cleaner anyway, for instance we can get rid of the QueryContext global. Still to do: fix up SPI and related code to use the plan cache; I'm tempted to try to make SQL functions use it too. Also, there are at least some aspects of system state that we want to ensure remain the same during a replan as in the original processing; search_path certainly ought to behave that way for instance, and perhaps there are others.
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.156 2007/03/06 02:06:12 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.157 2007/03/13 00:33:39 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -77,7 +77,6 @@ static bool relationHasPrimaryKey(Relation rel);
|
||||
* 'attributeList': a list of IndexElem specifying columns and expressions
|
||||
* to index on.
|
||||
* 'predicate': the partial-index condition, or NULL if none.
|
||||
* 'rangetable': needed to interpret the predicate.
|
||||
* 'options': reloptions from WITH (in list-of-DefElem form).
|
||||
* 'unique': make the index enforce uniqueness.
|
||||
* 'primary': mark the index as a primary key in the catalogs.
|
||||
@ -99,7 +98,6 @@ DefineIndex(RangeVar *heapRelation,
|
||||
char *tableSpaceName,
|
||||
List *attributeList,
|
||||
Expr *predicate,
|
||||
List *rangetable,
|
||||
List *options,
|
||||
bool unique,
|
||||
bool primary,
|
||||
@ -300,18 +298,6 @@ DefineIndex(RangeVar *heapRelation,
|
||||
|
||||
ReleaseSysCache(tuple);
|
||||
|
||||
/*
|
||||
* If a range table was created then check that only the base rel is
|
||||
* mentioned.
|
||||
*/
|
||||
if (rangetable != NIL)
|
||||
{
|
||||
if (list_length(rangetable) != 1 || getrelid(1, rangetable) != relationId)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
|
||||
errmsg("index expressions and predicates can refer only to the table being indexed")));
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate predicate, if given
|
||||
*/
|
||||
@ -1218,6 +1204,7 @@ ReindexTable(RangeVar *relation)
|
||||
*
|
||||
* To reduce the probability of deadlocks, each table is reindexed in a
|
||||
* separate transaction, so we can release the lock on it right away.
|
||||
* That means this must not be called within a user transaction block!
|
||||
*/
|
||||
void
|
||||
ReindexDatabase(const char *databaseName, bool do_system, bool do_user)
|
||||
@ -1241,13 +1228,6 @@ ReindexDatabase(const char *databaseName, bool do_system, bool do_user)
|
||||
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_DATABASE,
|
||||
databaseName);
|
||||
|
||||
/*
|
||||
* We cannot run inside a user transaction block; if we were inside a
|
||||
* transaction, then our commit- and start-transaction-command calls would
|
||||
* not have the intended effect!
|
||||
*/
|
||||
PreventTransactionChain((void *) databaseName, "REINDEX DATABASE");
|
||||
|
||||
/*
|
||||
* Create a memory context that will survive forced transaction commits we
|
||||
* do below. Since it is a child of PortalContext, it will go away
|
||||
|
Reference in New Issue
Block a user