Re: CREATE TABLE LIKE INCLUDING INDEXES support - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: CREATE TABLE LIKE INCLUDING INDEXES support
Date
Msg-id 200704270112.l3R1C9522574@momjian.us
Whole thread Raw
In response to Re: CREATE TABLE LIKE INCLUDING INDEXES support  (Trevor Hardcastle <chizu@spicious.com>)
Responses Re: CREATE TABLE LIKE INCLUDING INDEXES support
List pgsql-patches
Your patch has been added to the PostgreSQL unapplied patches list at:

    http://momjian.postgresql.org/cgi-bin/pgpatches

It will be applied as soon as one of the PostgreSQL committers reviews
and approves it.

---------------------------------------------------------------------------


Trevor Hardcastle wrote:
> NikhilS wrote:
> > Hi Trevor,
> >
> >
> >     +
> >     +                                       parent_index_info =
> >     BuildIndexInfo(parent_index);
> >
> >
> > The above is not used anywhere else in the code and seems redundant.
> Yep, pulled that out.
> >
> >     +
> >     +                                       ereport(NOTICE,
> >     +
> >     (errmsg("Index \"%s\" cloned.",
> >     +
> >     RelationGetRelationName(parent_index))));
> >
> >
> > DefineIndex will give out a message anyways for unique/primary keys.
> > The above seems additional to it.
> The original reason for this was the support for copying all indexes,
> but it doesn't make much sense now. I've pulled it too.
>
> Thanks for pointing those out. An updated patch is attached.
>
> -Trevor Hardcastle
>

> Index: src/backend/parser/analyze.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/parser/analyze.c,v
> retrieving revision 1.362
> diff -c -r1.362 analyze.c
> *** src/backend/parser/analyze.c    13 Mar 2007 00:33:41 -0000    1.362
> --- src/backend/parser/analyze.c    13 Apr 2007 16:41:46 -0000
> ***************
> *** 28,33 ****
> --- 28,34 ----
>   #include "postgres.h"
>
>   #include "access/heapam.h"
> + #include "access/genam.h"
>   #include "catalog/heap.h"
>   #include "catalog/index.h"
>   #include "catalog/namespace.h"
> ***************
> *** 54,59 ****
> --- 55,61 ----
>   #include "utils/acl.h"
>   #include "utils/builtins.h"
>   #include "utils/lsyscache.h"
> + #include "utils/relcache.h"
>   #include "utils/syscache.h"
>
>
> ***************
> *** 1331,1338 ****
>       }
>
>       /*
> !      * Copy CHECK constraints if requested, being careful to adjust
> !      * attribute numbers
>        */
>       if (including_constraints && tupleDesc->constr)
>       {
> --- 1333,1340 ----
>       }
>
>       /*
> !      * Copy CHECK based constraints if requested, being careful to adjust
> !      * attribute numbers. Also duplicate unique index constraints.
>        */
>       if (including_constraints && tupleDesc->constr)
>       {
> ***************
> *** 1355,1360 ****
> --- 1357,1424 ----
>               n->indexspace = NULL;
>               cxt->ckconstraints = lappend(cxt->ckconstraints, (Node *) n);
>           }
> +
> +         /*
> +          * Clone constraint indexes if any exist.
> +          */
> +         if (relation->rd_rel->relhasindex)
> +         {
> +             List       *parent_index_list = RelationGetIndexList(relation);
> +             ListCell   *parent_index_scan;
> +
> +             foreach(parent_index_scan, parent_index_list)
> +             {
> +                 Oid        parent_index_oid = lfirst_oid(parent_index_scan);
> +                 Relation   parent_index;
> +
> +                 parent_index = index_open(parent_index_oid, AccessShareLock);
> +
> +                 /*
> +                  * Create new unique or primary key indexes on the child.
> +                  */
> +                 if (parent_index->rd_index->indisunique || parent_index->rd_index->indisprimary)
> +                 {
> +                     Constraint *n = makeNode(Constraint);
> +                     AttrNumber  parent_attno;
> +
> +                     if (parent_index->rd_index->indisprimary)
> +                     {
> +                         n->contype = CONSTR_PRIMARY;
> +                     }
> +                     else
> +                     {
> +                         n->contype = CONSTR_UNIQUE;
> +                     }
> +                     /* Let DefineIndex name it */
> +                     n->name = NULL;
> +                     n->raw_expr = NULL;
> +                     n->cooked_expr = NULL;
> +
> +                     /*
> +                      * Search through the possible index keys, and append
> +                      * the names of simple columns to the new index key list.
> +                      */
> +                     for (parent_attno = 1; parent_attno <= parent_index->rd_att->natts;
> +                          parent_attno++)
> +                     {
> +                         Form_pg_attribute  attribute = parent_index->rd_att->attrs[parent_attno - 1];
> +                         char              *attributeName = NameStr(attribute->attname);
> +
> +                         /*
> +                          * Ignore dropped columns in the parent.
> +                          */
> +                         if (!attribute->attisdropped)
> +                             n->keys = lappend(n->keys,
> +                                               makeString(attributeName));
> +                     }
> +
> +                     /* Add the new index constraint to the create context */
> +                     cxt->ixconstraints = lappend(cxt->ixconstraints, n);
> +                 }
> +
> +                 relation_close(parent_index, AccessShareLock);
> +             }
> +         }
>       }
>
>       /*
> Index: src/test/regress/sql/inherit.sql
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/test/regress/sql/inherit.sql,v
> retrieving revision 1.10
> diff -c -r1.10 inherit.sql
> *** src/test/regress/sql/inherit.sql    27 Jun 2006 03:43:20 -0000    1.10
> --- src/test/regress/sql/inherit.sql    13 Apr 2007 16:41:46 -0000
> ***************
> *** 151,160 ****
>   DROP TABLE inhg;
>   CREATE TABLE inhg (x text, LIKE inhx INCLUDING CONSTRAINTS, y text); /* Copies constraints */
>   INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds */
> ! INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds -- Unique constraints not copied */
>   INSERT INTO inhg VALUES ('x', 'foo',  'y');  /* fails due to constraint */
>   SELECT * FROM inhg; /* Two records with three columns in order x=x, xx=text, y=y */
>   DROP TABLE inhg;
>
>
>   -- Test changing the type of inherited columns
> --- 151,161 ----
>   DROP TABLE inhg;
>   CREATE TABLE inhg (x text, LIKE inhx INCLUDING CONSTRAINTS, y text); /* Copies constraints */
>   INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds */
> ! INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Fails -- Unique constraints copied */
>   INSERT INTO inhg VALUES ('x', 'foo',  'y');  /* fails due to constraint */
>   SELECT * FROM inhg; /* Two records with three columns in order x=x, xx=text, y=y */
>   DROP TABLE inhg;
> + CREATE TABLE inhg (x text, LIKE inhx INCLUDING INDEXES, y text); /* Unimplemented */
>
>
>   -- Test changing the type of inherited columns
> Index: src/test/regress/expected/inherit.out
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/test/regress/expected/inherit.out,v
> retrieving revision 1.20
> diff -c -r1.20 inherit.out
> *** src/test/regress/expected/inherit.out    27 Jun 2006 03:43:20 -0000    1.20
> --- src/test/regress/expected/inherit.out    13 Apr 2007 16:41:46 -0000
> ***************
> *** 621,638 ****
>   INSERT INTO inhg VALUES ('foo');
>   DROP TABLE inhg;
>   CREATE TABLE inhg (x text, LIKE inhx INCLUDING CONSTRAINTS, y text); /* Copies constraints */
>   INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds */
> ! INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds -- Unique constraints not copied */
>   INSERT INTO inhg VALUES ('x', 'foo',  'y');  /* fails due to constraint */
>   ERROR:  new row for relation "inhg" violates check constraint "foo"
>   SELECT * FROM inhg; /* Two records with three columns in order x=x, xx=text, y=y */
>    x |  xx  | y
>   ---+------+---
>    x | text | y
> !  x | text | y
> ! (2 rows)
>
>   DROP TABLE inhg;
>   -- Test changing the type of inherited columns
>   insert into d values('test','one','two','three');
>   alter table a alter column aa type integer using bit_length(aa);
> --- 621,641 ----
>   INSERT INTO inhg VALUES ('foo');
>   DROP TABLE inhg;
>   CREATE TABLE inhg (x text, LIKE inhx INCLUDING CONSTRAINTS, y text); /* Copies constraints */
> + NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "inhg_pkey" for table "inhg"
>   INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds */
> ! INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Fails -- Unique constraints copied */
> ! ERROR:  duplicate key violates unique constraint "inhg_pkey"
>   INSERT INTO inhg VALUES ('x', 'foo',  'y');  /* fails due to constraint */
>   ERROR:  new row for relation "inhg" violates check constraint "foo"
>   SELECT * FROM inhg; /* Two records with three columns in order x=x, xx=text, y=y */
>    x |  xx  | y
>   ---+------+---
>    x | text | y
> ! (1 row)
>
>   DROP TABLE inhg;
> + CREATE TABLE inhg (x text, LIKE inhx INCLUDING INDEXES, y text); /* Unimplemented */
> + ERROR:  LIKE INCLUDING INDEXES is not implemented
>   -- Test changing the type of inherited columns
>   insert into d values('test','one','two','three');
>   alter table a alter column aa type integer using bit_length(aa);
> Index: doc/src/sgml/ref/create_table.sgml
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/doc/src/sgml/ref/create_table.sgml,v
> retrieving revision 1.107
> diff -c -r1.107 create_table.sgml
> *** doc/src/sgml/ref/create_table.sgml    1 Feb 2007 00:28:18 -0000    1.107
> --- doc/src/sgml/ref/create_table.sgml    13 Apr 2007 16:41:46 -0000
> ***************
> *** 259,269 ****
>        </para>
>        <para>
>         Not-null constraints are always copied to the new table.
> !       <literal>CHECK</literal> constraints will only be copied if
> !       <literal>INCLUDING CONSTRAINTS</literal> is specified; other types of
> !       constraints will never be copied. Also, no distinction is made between
> !       column constraints and table constraints — when constraints are
> !       requested, all check constraints are copied.
>        </para>
>        <para>
>         Note also that unlike <literal>INHERITS</literal>, copied columns and
> --- 259,268 ----
>        </para>
>        <para>
>         Not-null constraints are always copied to the new table.
> !       <literal>CHECK, UNIQUE, and PRIMARY KEY</literal> constraints will only
> !       be copied if <literal>INCLUDING CONSTRAINTS</literal> is specified. Also,
> !       no distinction is made between column constraints and table constraints
> !       — when constraints are requested, all check constraints are copied.
>        </para>
>        <para>
>         Note also that unlike <literal>INHERITS</literal>, copied columns and

--
  Bruce Momjian  <bruce@momjian.us>          http://momjian.us
  EnterpriseDB                               http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: UPDATE using sub selects
Next
From: Bruce Momjian
Date:
Subject: Re: HOT + MVCC-safe cluster conflict fix