CLUSTER specified the wrong namespace when renaming toast tables of temporary
relations (they don't live in pg_toast). This caused an Assert failure in assert-enabled builds. So far as I can see, in a non-assert build it would only have messed up the checks for conflicting names, so a failure would be quite improbable but perhaps not impossible.
This commit is contained in:
parent
9fd5fb8d15
commit
8f13ee63cb
@ -11,7 +11,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.186 2009/06/11 20:46:11 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.186.2.1 2010/02/02 19:12:34 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -641,20 +641,25 @@ rebuild_relation(Relation OldHeap, Oid indexOid)
|
|||||||
newrel = heap_open(tableOid, NoLock);
|
newrel = heap_open(tableOid, NoLock);
|
||||||
if (OidIsValid(newrel->rd_rel->reltoastrelid))
|
if (OidIsValid(newrel->rd_rel->reltoastrelid))
|
||||||
{
|
{
|
||||||
char NewToastName[NAMEDATALEN];
|
|
||||||
Relation toastrel;
|
Relation toastrel;
|
||||||
|
Oid toastidx;
|
||||||
|
Oid toastnamespace;
|
||||||
|
char NewToastName[NAMEDATALEN];
|
||||||
|
|
||||||
|
toastrel = relation_open(newrel->rd_rel->reltoastrelid, AccessShareLock);
|
||||||
|
toastidx = toastrel->rd_rel->reltoastidxid;
|
||||||
|
toastnamespace = toastrel->rd_rel->relnamespace;
|
||||||
|
relation_close(toastrel, AccessShareLock);
|
||||||
|
|
||||||
/* rename the toast table ... */
|
/* rename the toast table ... */
|
||||||
snprintf(NewToastName, NAMEDATALEN, "pg_toast_%u", tableOid);
|
snprintf(NewToastName, NAMEDATALEN, "pg_toast_%u", tableOid);
|
||||||
RenameRelationInternal(newrel->rd_rel->reltoastrelid, NewToastName,
|
RenameRelationInternal(newrel->rd_rel->reltoastrelid, NewToastName,
|
||||||
PG_TOAST_NAMESPACE);
|
toastnamespace);
|
||||||
|
|
||||||
/* ... and its index too */
|
/* ... and its index too */
|
||||||
toastrel = relation_open(newrel->rd_rel->reltoastrelid, AccessShareLock);
|
|
||||||
snprintf(NewToastName, NAMEDATALEN, "pg_toast_%u_index", tableOid);
|
snprintf(NewToastName, NAMEDATALEN, "pg_toast_%u_index", tableOid);
|
||||||
RenameRelationInternal(toastrel->rd_rel->reltoastidxid, NewToastName,
|
RenameRelationInternal(toastidx, NewToastName,
|
||||||
PG_TOAST_NAMESPACE);
|
toastnamespace);
|
||||||
relation_close(toastrel, AccessShareLock);
|
|
||||||
}
|
}
|
||||||
relation_close(newrel, NoLock);
|
relation_close(newrel, NoLock);
|
||||||
}
|
}
|
||||||
|
@ -434,6 +434,18 @@ SELECT * FROM clustertest;
|
|||||||
100
|
100
|
||||||
(5 rows)
|
(5 rows)
|
||||||
|
|
||||||
|
-- check that temp tables can be clustered
|
||||||
|
create temp table clstr_temp (col1 int primary key, col2 text);
|
||||||
|
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "clstr_temp_pkey" for table "clstr_temp"
|
||||||
|
insert into clstr_temp values (2, 'two'), (1, 'one');
|
||||||
|
cluster clstr_temp using clstr_temp_pkey;
|
||||||
|
select * from clstr_temp;
|
||||||
|
col1 | col2
|
||||||
|
------+------
|
||||||
|
1 | one
|
||||||
|
2 | two
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
-- clean up
|
-- clean up
|
||||||
\c -
|
\c -
|
||||||
DROP TABLE clustertest;
|
DROP TABLE clustertest;
|
||||||
|
@ -187,6 +187,12 @@ COMMIT;
|
|||||||
|
|
||||||
SELECT * FROM clustertest;
|
SELECT * FROM clustertest;
|
||||||
|
|
||||||
|
-- check that temp tables can be clustered
|
||||||
|
create temp table clstr_temp (col1 int primary key, col2 text);
|
||||||
|
insert into clstr_temp values (2, 'two'), (1, 'one');
|
||||||
|
cluster clstr_temp using clstr_temp_pkey;
|
||||||
|
select * from clstr_temp;
|
||||||
|
|
||||||
-- clean up
|
-- clean up
|
||||||
\c -
|
\c -
|
||||||
DROP TABLE clustertest;
|
DROP TABLE clustertest;
|
||||||
|
Loading…
Reference in New Issue
Block a user