mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Add the ability to create indexes 'concurrently', that is, without
blocking concurrent writes to the table. Greg Stark, with a little help from Tom Lane.
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.142 2006/07/25 19:13:00 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.143 2006/08/25 04:06:46 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -244,8 +244,33 @@ _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
|
||||
}
|
||||
|
||||
/*
|
||||
* Otherwise we have a definite conflict.
|
||||
* Otherwise we have a definite conflict. But before
|
||||
* complaining, look to see if the tuple we want to insert
|
||||
* is itself now committed dead --- if so, don't complain.
|
||||
* This is a waste of time in normal scenarios but we must
|
||||
* do it to support CREATE INDEX CONCURRENTLY.
|
||||
*/
|
||||
htup.t_self = itup->t_tid;
|
||||
if (heap_fetch(heapRel, SnapshotSelf, &htup, &hbuffer,
|
||||
false, NULL))
|
||||
{
|
||||
/* Normal case --- it's still live */
|
||||
ReleaseBuffer(hbuffer);
|
||||
}
|
||||
else if (htup.t_data != NULL)
|
||||
{
|
||||
/*
|
||||
* It's been deleted, so no error, and no need to
|
||||
* continue searching
|
||||
*/
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* couldn't find the tuple?? */
|
||||
elog(ERROR, "failed to fetch tuple being inserted");
|
||||
}
|
||||
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNIQUE_VIOLATION),
|
||||
errmsg("duplicate key violates unique constraint \"%s\"",
|
||||
|
Reference in New Issue
Block a user