diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 49ef5dce02c..e707934f507 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -350,6 +350,14 @@ ConstructTupleDescriptor(Relation heapRelation, */ memcpy(to, from, ATTRIBUTE_FIXED_PART_SIZE); + /* + * Set the attribute name as specified by caller. + */ + if (colnames_item == NULL) /* shouldn't happen */ + elog(ERROR, "too few entries in colnames list"); + namestrcpy(&to->attname, (const char *) lfirst(colnames_item)); + colnames_item = lnext(colnames_item); + /* * Fix the stuff that should not be the same as the underlying * attr @@ -371,6 +379,14 @@ ConstructTupleDescriptor(Relation heapRelation, MemSet(to, 0, ATTRIBUTE_FIXED_PART_SIZE); + /* + * Set the attribute name as specified by caller. + */ + if (colnames_item == NULL) /* shouldn't happen */ + elog(ERROR, "too few entries in colnames list"); + namestrcpy(&to->attname, (const char *) lfirst(colnames_item)); + colnames_item = lnext(colnames_item); + if (indexpr_item == NULL) /* shouldn't happen */ elog(ERROR, "too few entries in indexprs list"); indexkey = (Node *) lfirst(indexpr_item); @@ -423,14 +439,6 @@ ConstructTupleDescriptor(Relation heapRelation, */ to->attrelid = InvalidOid; - /* - * Set the attribute name as specified by caller. - */ - if (colnames_item == NULL) /* shouldn't happen */ - elog(ERROR, "too few entries in colnames list"); - namestrcpy(&to->attname, (const char *) lfirst(colnames_item)); - colnames_item = lnext(colnames_item); - /* * Check the opclass and index AM to see if either provides a keytype * (overriding the attribute type). Opclass takes precedence. diff --git a/src/test/regress/expected/create_index.out b/src/test/regress/expected/create_index.out index 9c0f3e3b57b..d7930fe7f5e 100644 --- a/src/test/regress/expected/create_index.out +++ b/src/test/regress/expected/create_index.out @@ -2360,6 +2360,23 @@ ERROR: duplicate key value violates unique constraint "func_index_index" DETAIL: Key (textcat(f1, f2))=(ABCDEF) already exists. -- but this shouldn't: INSERT INTO func_index_heap VALUES('QWERTY'); +-- while we're here, see that the metadata looks sane +\d func_index_heap +Table "public.func_index_heap" + Column | Type | Modifiers +--------+------+----------- + f1 | text | + f2 | text | +Indexes: + "func_index_index" UNIQUE, btree (textcat(f1, f2)) + +\d func_index_index + Index "public.func_index_index" + Column | Type | Definition +---------+------+----------------- + textcat | text | textcat(f1, f2) +unique, btree, for table "public.func_index_heap" + -- -- Same test, expressional index -- @@ -2375,6 +2392,26 @@ ERROR: duplicate key value violates unique constraint "func_index_index" DETAIL: Key ((f1 || f2))=(ABCDEF) already exists. -- but this shouldn't: INSERT INTO func_index_heap VALUES('QWERTY'); +-- while we're here, see that the metadata looks sane +\d func_index_heap +Table "public.func_index_heap" + Column | Type | Modifiers +--------+------+----------- + f1 | text | + f2 | text | +Indexes: + "func_index_index" UNIQUE, btree ((f1 || f2)) + +\d func_index_index +Index "public.func_index_index" + Column | Type | Definition +--------+------+------------ + expr | text | (f1 || f2) +unique, btree, for table "public.func_index_heap" + +-- this should fail because of unsafe column type (anonymous record) +create index on func_index_heap ((f1 || f2), (row(f1, f2))); +ERROR: column "row" has pseudo-type record -- -- Also try building functional, expressional, and partial indexes on -- tables that already contain data. diff --git a/src/test/regress/sql/create_index.sql b/src/test/regress/sql/create_index.sql index b199c2368ea..f17edc9c5c2 100644 --- a/src/test/regress/sql/create_index.sql +++ b/src/test/regress/sql/create_index.sql @@ -705,6 +705,10 @@ INSERT INTO func_index_heap VALUES('ABCD', 'EF'); -- but this shouldn't: INSERT INTO func_index_heap VALUES('QWERTY'); +-- while we're here, see that the metadata looks sane +\d func_index_heap +\d func_index_index + -- -- Same test, expressional index @@ -721,6 +725,14 @@ INSERT INTO func_index_heap VALUES('ABCD', 'EF'); -- but this shouldn't: INSERT INTO func_index_heap VALUES('QWERTY'); +-- while we're here, see that the metadata looks sane +\d func_index_heap +\d func_index_index + +-- this should fail because of unsafe column type (anonymous record) +create index on func_index_heap ((f1 || f2), (row(f1, f2))); + + -- -- Also try building functional, expressional, and partial indexes on -- tables that already contain data.