summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/indexcmds.c56
-rw-r--r--src/test/regress/expected/alter_table.out5
-rw-r--r--src/test/regress/sql/alter_table.sql2
3 files changed, 13 insertions, 50 deletions
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 130cebd6588..e33ad815295 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -51,6 +51,7 @@
#include "optimizer/optimizer.h"
#include "parser/parse_coerce.h"
#include "parser/parse_oper.h"
+#include "parser/parse_utilcmd.h"
#include "partitioning/partdesc.h"
#include "pgstat.h"
#include "rewrite/rewriteManip.h"
@@ -1465,55 +1466,20 @@ DefineIndex(Oid tableId,
*/
if (!found)
{
- IndexStmt *childStmt = copyObject(stmt);
- bool found_whole_row;
- ListCell *lc;
+ IndexStmt *childStmt;
ObjectAddress childAddr;
/*
- * We can't use the same index name for the child index,
- * so clear idxname to let the recursive invocation choose
- * a new name. Likewise, the existing target relation
- * field is wrong, and if indexOid or oldNumber are set,
- * they mustn't be applied to the child either.
+ * Build an IndexStmt describing the desired child index
+ * in the same way that we do during ATTACH PARTITION.
+ * Notably, we rely on generateClonedIndexStmt to produce
+ * a search-path-independent representation, which the
+ * original IndexStmt might not be.
*/
- childStmt->idxname = NULL;
- childStmt->relation = NULL;
- childStmt->indexOid = InvalidOid;
- childStmt->oldNumber = InvalidRelFileNumber;
- childStmt->oldCreateSubid = InvalidSubTransactionId;
- childStmt->oldFirstRelfilelocatorSubid = InvalidSubTransactionId;
-
- /*
- * Adjust any Vars (both in expressions and in the index's
- * WHERE clause) to match the partition's column numbering
- * in case it's different from the parent's.
- */
- foreach(lc, childStmt->indexParams)
- {
- IndexElem *ielem = lfirst(lc);
-
- /*
- * If the index parameter is an expression, we must
- * translate it to contain child Vars.
- */
- if (ielem->expr)
- {
- ielem->expr =
- map_variable_attnos((Node *) ielem->expr,
- 1, 0, attmap,
- InvalidOid,
- &found_whole_row);
- if (found_whole_row)
- elog(ERROR, "cannot convert whole-row table reference");
- }
- }
- childStmt->whereClause =
- map_variable_attnos(stmt->whereClause, 1, 0,
- attmap,
- InvalidOid, &found_whole_row);
- if (found_whole_row)
- elog(ERROR, "cannot convert whole-row table reference");
+ childStmt = generateClonedIndexStmt(NULL,
+ parentIndex,
+ attmap,
+ NULL);
/*
* Recurse as the starting user ID. Callee will use that
diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out
index fb8db37623d..143ae7c09c0 100644
--- a/src/test/regress/expected/alter_table.out
+++ b/src/test/regress/expected/alter_table.out
@@ -2215,7 +2215,6 @@ select conname, obj_description(oid, 'pg_constraint') as desc
(3 rows)
alter table at_partitioned alter column name type varchar(127);
--- Note: these tests currently show the wrong behavior for comments :-(
select relname,
c.oid = oldoid as orig_oid,
case relfilenode
@@ -2232,9 +2231,9 @@ select relname,
------------------------------+----------+---------+--------------
at_partitioned | t | none |
at_partitioned_0 | t | own |
- at_partitioned_0_id_name_key | f | own | parent index
+ at_partitioned_0_id_name_key | f | own |
at_partitioned_1 | t | own |
- at_partitioned_1_id_name_key | f | own | parent index
+ at_partitioned_1_id_name_key | f | own |
at_partitioned_id_name_key | f | none | parent index
(6 rows)
diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql
index cba15ebfec8..c5dd43a15c4 100644
--- a/src/test/regress/sql/alter_table.sql
+++ b/src/test/regress/sql/alter_table.sql
@@ -1496,8 +1496,6 @@ select conname, obj_description(oid, 'pg_constraint') as desc
alter table at_partitioned alter column name type varchar(127);
--- Note: these tests currently show the wrong behavior for comments :-(
-
select relname,
c.oid = oldoid as orig_oid,
case relfilenode