diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 85817c6..6013202 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -416,13 +416,20 @@ DefineIndex(Oid relationId, } /* - * Select tablespace to use. If not specified, use default tablespace - * (which may in turn default to database's default). + * Select tablespace to use. For indexes created as part of ALTER + * TABLE, use pg_default if no tablespace is defined. This ensures + * that the tablespace of a rewritten index is constant for such + * queries. In other cases, if not specified, use the default + * tablespace defined. (which may in turn default to database's default). */ if (stmt->tableSpace) { tablespaceId = get_tablespace_oid(stmt->tableSpace, false); } + else if (is_alter_table) + { + tablespaceId = InvalidOid; + } else { tablespaceId = GetDefaultTablespace(rel->rd_rel->relpersistence); diff --git a/src/test/regress/input/tablespace.source b/src/test/regress/input/tablespace.source index 041ec97..5282859 100644 --- a/src/test/regress/input/tablespace.source +++ b/src/test/regress/input/tablespace.source @@ -44,6 +44,38 @@ CREATE INDEX foo_idx on testschema.foo(i) TABLESPACE regress_tblspace; SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c where c.reltablespace = t.oid AND c.relname = 'foo_idx'; +-- default_tablespace and ALTER TABLE TYPE +CREATE TABLE testschema.test_default_tab(id bigint) TABLESPACE regress_tblspace; +INSERT INTO testschema.test_default_tab VALUES (1); +-- Create indexes on different tablespaces +CREATE INDEX test_index1 on testschema.test_default_tab (id); +CREATE INDEX test_index2 on testschema.test_default_tab (id) TABLESPACE regress_tblspace; +\d testschema.test_index1 +\d testschema.test_index2 +-- Use a custom tablespace for default_tablespace +SET default_tablespace TO regress_tblspace; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE bigint; +\d testschema.test_index1 +\d testschema.test_index2 +SELECT * FROM testschema.test_default_tab; +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE int; +\d testschema.test_index1 +\d testschema.test_index2 +SELECT * FROM testschema.test_default_tab; +-- Now use the default tablespace for default_tablespace +SET default_tablespace TO ''; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE int; +\d testschema.test_index1 +\d testschema.test_index2 +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE bigint; +\d testschema.test_index1 +\d testschema.test_index2 +DROP TABLE testschema.test_default_tab; + -- let's try moving a table from one place to another CREATE TABLE testschema.atable AS VALUES (1), (2); CREATE UNIQUE INDEX anindex ON testschema.atable(column1); diff --git a/src/test/regress/output/tablespace.source b/src/test/regress/output/tablespace.source index 384f689..a82403b 100644 --- a/src/test/regress/output/tablespace.source +++ b/src/test/regress/output/tablespace.source @@ -61,6 +61,112 @@ SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c foo_idx | regress_tblspace (1 row) +-- default_tablespace and ALTER TABLE TYPE +CREATE TABLE testschema.test_default_tab(id bigint) TABLESPACE regress_tblspace; +INSERT INTO testschema.test_default_tab VALUES (1); +-- Create indexes on different tablespaces +CREATE INDEX test_index1 on testschema.test_default_tab (id); +CREATE INDEX test_index2 on testschema.test_default_tab (id) TABLESPACE regress_tblspace; +\d testschema.test_index1 +Index "testschema.test_index1" + Column | Type | Definition +--------+--------+------------ + id | bigint | id +btree, for table "testschema.test_default_tab" + +\d testschema.test_index2 +Index "testschema.test_index2" + Column | Type | Definition +--------+--------+------------ + id | bigint | id +btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +-- Use a custom tablespace for default_tablespace +SET default_tablespace TO regress_tblspace; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE bigint; +\d testschema.test_index1 +Index "testschema.test_index1" + Column | Type | Definition +--------+--------+------------ + id | bigint | id +btree, for table "testschema.test_default_tab" + +\d testschema.test_index2 +Index "testschema.test_index2" + Column | Type | Definition +--------+--------+------------ + id | bigint | id +btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +SELECT * FROM testschema.test_default_tab; + id +---- + 1 +(1 row) + +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE int; +\d testschema.test_index1 +Index "testschema.test_index1" + Column | Type | Definition +--------+---------+------------ + id | integer | id +btree, for table "testschema.test_default_tab" + +\d testschema.test_index2 +Index "testschema.test_index2" + Column | Type | Definition +--------+---------+------------ + id | integer | id +btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +SELECT * FROM testschema.test_default_tab; + id +---- + 1 +(1 row) + +-- Now use the default tablespace for default_tablespace +SET default_tablespace TO ''; +-- tablespace should not change if no rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE int; +\d testschema.test_index1 +Index "testschema.test_index1" + Column | Type | Definition +--------+---------+------------ + id | integer | id +btree, for table "testschema.test_default_tab" + +\d testschema.test_index2 +Index "testschema.test_index2" + Column | Type | Definition +--------+---------+------------ + id | integer | id +btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +-- tablespace should not change even if there is an index rewrite +ALTER TABLE testschema.test_default_tab ALTER id TYPE bigint; +\d testschema.test_index1 +Index "testschema.test_index1" + Column | Type | Definition +--------+--------+------------ + id | bigint | id +btree, for table "testschema.test_default_tab" + +\d testschema.test_index2 +Index "testschema.test_index2" + Column | Type | Definition +--------+--------+------------ + id | bigint | id +btree, for table "testschema.test_default_tab" +Tablespace: "regress_tblspace" + +DROP TABLE testschema.test_default_tab; -- let's try moving a table from one place to another CREATE TABLE testschema.atable AS VALUES (1), (2); CREATE UNIQUE INDEX anindex ON testschema.atable(column1);