Code review for LIKE INCLUDING patch --- clean up some cosmetic and not

so cosmetic stuff.
This commit is contained in:
Tom Lane 2009-10-13 00:53:08 +00:00
parent 5ec1341136
commit 8d54c2482b
11 changed files with 73 additions and 75 deletions

View File

@ -1,5 +1,5 @@
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/ref/create_table.sgml,v 1.117 2009/10/12 19:49:24 adunstan Exp $ $PostgreSQL: pgsql/doc/src/sgml/ref/create_table.sgml,v 1.118 2009/10/13 00:53:07 tgl Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
@ -231,7 +231,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PAR
</para> </para>
<para> <para>
Column storage parameters are also copied from parent tables. Column <literal>STORAGE</> settings are also copied from parent tables.
</para> </para>
<!-- <!--
@ -285,25 +285,27 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PAR
specified. specified.
</para> </para>
<para> <para>
Storage parameters for the copied column definitions will only be copied <literal>STORAGE</> settings for the copied column definitions will only
if <literal>INCLUDING STORAGE</literal> is specified. The default be copied if <literal>INCLUDING STORAGE</literal> is specified. The
behavior is to exclude storage parameters, resulting in the copied default behavior is to exclude <literal>STORAGE</> settings, resulting
columns in the new table having type-specific default parameters. For in the copied columns in the new table having type-specific default
more on storage parameters, see <xref linkend="storage-toast">. settings. For more on <literal>STORAGE</> settings, see
<xref linkend="storage-toast">.
</para> </para>
<para> <para>
Comments for the copied column, constraint, index and columns of index Comments for the copied columns, constraints, and indexes
definitions will only be copied if <literal>INCLUDING COMMENTS</literal> will only be copied if <literal>INCLUDING COMMENTS</literal>
is specified. The default behavior is to exclude comments, resulting in is specified. The default behavior is to exclude comments, resulting in
the copied columns and constraints in the new table having no comments. the copied columns and constraints in the new table having no comments.
</para> </para>
<para> <para>
<literal>INCLUDING ALL</literal> is an abbreviated form of <literal>INCLUDING ALL</literal> is an abbreviated form of
<literal>INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS</literal>. <literal>INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS</literal>.
</para> </para>
<para> <para>
Note also that unlike <literal>INHERITS</literal>, copied columns and Note also that unlike <literal>INHERITS</literal>, columns and
constraints are not merged with similarly named columns and constraints. constraints copied by <literal>LIKE</> are not merged with similarly
named columns and constraints.
If the same name is specified explicitly or in another If the same name is specified explicitly or in another
<literal>LIKE</literal> clause, an error is signalled. <literal>LIKE</literal> clause, an error is signalled.
</para> </para>
@ -752,14 +754,14 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PAR
<para> <para>
Enables or disables the autovacuum daemon on a particular table. Enables or disables the autovacuum daemon on a particular table.
If true, the autovacuum daemon will initiate a <command>VACUUM</> operation If true, the autovacuum daemon will initiate a <command>VACUUM</> operation
on a particular table when the number of updated or deleted tuples exceeds on a particular table when the number of updated or deleted tuples exceeds
<literal>autovacuum_vacuum_threshold</> plus <literal>autovacuum_vacuum_threshold</> plus
<literal>autovacuum_vacuum_scale_factor</> times the number of live tuples <literal>autovacuum_vacuum_scale_factor</> times the number of live tuples
currently estimated to be in the relation. currently estimated to be in the relation.
Similarly, it will initiate an <command>ANALYZE</> operation when the Similarly, it will initiate an <command>ANALYZE</> operation when the
number of inserted, updated or deleted tuples exceeds number of inserted, updated or deleted tuples exceeds
<literal>autovacuum_analyze_threshold</> plus <literal>autovacuum_analyze_threshold</> plus
<literal>autovacuum_analyze_scale_factor</> times the number of live tuples <literal>autovacuum_analyze_scale_factor</> times the number of live tuples
currently estimated to be in the relation. currently estimated to be in the relation.
If false, this table will not be autovacuumed, except to prevent If false, this table will not be autovacuumed, except to prevent
transaction Id wraparound. See <xref linkend="vacuum-for-wraparound"> for transaction Id wraparound. See <xref linkend="vacuum-for-wraparound"> for
@ -775,7 +777,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PAR
<listitem> <listitem>
<para> <para>
Minimum number of updated or deleted tuples before initiate a Minimum number of updated or deleted tuples before initiate a
<command>VACUUM</> operation on a particular table. <command>VACUUM</> operation on a particular table.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -834,7 +836,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PAR
<para> <para>
Custom <xref linkend="guc-vacuum-freeze-min-age"> parameter. Note that Custom <xref linkend="guc-vacuum-freeze-min-age"> parameter. Note that
autovacuum will ignore attempts to set a per-table autovacuum will ignore attempts to set a per-table
<literal>autovacuum_freeze_min_age</> larger than the half system-wide <literal>autovacuum_freeze_min_age</> larger than the half system-wide
<xref linkend="guc-autovacuum-freeze-max-age"> setting. <xref linkend="guc-autovacuum-freeze-max-age"> setting.
</para> </para>
</listitem> </listitem>

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/common/tupdesc.c,v 1.129 2009/10/12 19:49:24 adunstan Exp $ * $PostgreSQL: pgsql/src/backend/access/common/tupdesc.c,v 1.130 2009/10/13 00:53:07 tgl Exp $
* *
* NOTES * NOTES
* some of the executor utility code such as "ExecTypeFromTL" should be * some of the executor utility code such as "ExecTypeFromTL" should be
@ -553,13 +553,15 @@ BuildDescForRelation(List *schema)
TupleDescInitEntry(desc, attnum, attname, TupleDescInitEntry(desc, attnum, attname,
atttypid, atttypmod, attdim); atttypid, atttypmod, attdim);
/* Override TupleDescInitEntry's settings as requested */
if (entry->storage)
desc->attrs[attnum - 1]->attstorage = entry->storage;
/* Fill in additional stuff not handled by TupleDescInitEntry */ /* Fill in additional stuff not handled by TupleDescInitEntry */
desc->attrs[attnum - 1]->attnotnull = entry->is_not_null; desc->attrs[attnum - 1]->attnotnull = entry->is_not_null;
has_not_null |= entry->is_not_null; has_not_null |= entry->is_not_null;
desc->attrs[attnum - 1]->attislocal = entry->is_local; desc->attrs[attnum - 1]->attislocal = entry->is_local;
desc->attrs[attnum - 1]->attinhcount = entry->inhcount; desc->attrs[attnum - 1]->attinhcount = entry->inhcount;
if (entry->storage)
desc->attrs[attnum - 1]->attstorage = entry->storage;
} }
if (has_not_null) if (has_not_null)

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.48 2009/10/12 19:49:24 adunstan Exp $ * $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.49 2009/10/13 00:53:07 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -705,7 +705,8 @@ AlterConstraintNamespaces(Oid ownerId, Oid oldNspId,
/* /*
* GetConstraintByName * GetConstraintByName
* Find a constraint with the specified name. * Find a constraint on the specified relation with the specified name.
* Returns constraint's OID.
*/ */
Oid Oid
GetConstraintByName(Oid relid, const char *conname) GetConstraintByName(Oid relid, const char *conname)
@ -725,7 +726,8 @@ GetConstraintByName(Oid relid, const char *conname)
ScanKeyInit(&skey[0], ScanKeyInit(&skey[0],
Anum_pg_constraint_conrelid, Anum_pg_constraint_conrelid,
BTEqualStrategyNumber, F_OIDEQ, relid); BTEqualStrategyNumber, F_OIDEQ,
ObjectIdGetDatum(relid));
scan = systable_beginscan(pg_constraint, ConstraintRelidIndexId, true, scan = systable_beginscan(pg_constraint, ConstraintRelidIndexId, true,
SnapshotNow, 1, skey); SnapshotNow, 1, skey);
@ -737,28 +739,22 @@ GetConstraintByName(Oid relid, const char *conname)
if (strcmp(NameStr(con->conname), conname) == 0) if (strcmp(NameStr(con->conname), conname) == 0)
{ {
if (OidIsValid(conOid)) if (OidIsValid(conOid))
{
char *relname = get_rel_name(relid);
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_DUPLICATE_OBJECT), (errcode(ERRCODE_DUPLICATE_OBJECT),
errmsg("table \"%s\" has multiple constraints named \"%s\"", errmsg("table \"%s\" has multiple constraints named \"%s\"",
(relname ? relname : "(unknown)"), conname))); get_rel_name(relid), conname)));
}
conOid = HeapTupleGetOid(tuple); conOid = HeapTupleGetOid(tuple);
} }
} }
systable_endscan(scan); systable_endscan(scan);
/* If no constraint exists for the relation specified, notify user */ /* If no such constraint exists, complain */
if (!OidIsValid(conOid)) if (!OidIsValid(conOid))
{
char *relname = get_rel_name(relid);
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT), (errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("constraint \"%s\" for table \"%s\" does not exist", errmsg("constraint \"%s\" for table \"%s\" does not exist",
conname, (relname ? relname : "(unknown)")))); conname, get_rel_name(relid))));
}
heap_close(pg_constraint, AccessShareLock); heap_close(pg_constraint, AccessShareLock);

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.161 2009/07/16 06:33:42 petere Exp $ * $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.162 2009/10/13 00:53:07 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -132,6 +132,7 @@ DefineSequence(CreateSeqStmt *seq)
coldef->inhcount = 0; coldef->inhcount = 0;
coldef->is_local = true; coldef->is_local = true;
coldef->is_not_null = true; coldef->is_not_null = true;
coldef->storage = 0;
coldef->raw_default = NULL; coldef->raw_default = NULL;
coldef->cooked_default = NULL; coldef->cooked_default = NULL;
coldef->constraints = NIL; coldef->constraints = NIL;

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.302 2009/10/12 19:49:24 adunstan Exp $ * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.303 2009/10/13 00:53:07 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -333,7 +333,7 @@ static void ATExecAddInherit(Relation rel, RangeVar *parent);
static void ATExecDropInherit(Relation rel, RangeVar *parent); static void ATExecDropInherit(Relation rel, RangeVar *parent);
static void copy_relation_data(SMgrRelation rel, SMgrRelation dst, static void copy_relation_data(SMgrRelation rel, SMgrRelation dst,
ForkNumber forkNum, bool istemp); ForkNumber forkNum, bool istemp);
static const char * storage_name(char c); static const char *storage_name(char c);
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
@ -1102,22 +1102,25 @@ truncate_check_rel(Relation rel)
CheckTableNotInUse(rel, "TRUNCATE"); CheckTableNotInUse(rel, "TRUNCATE");
} }
/*
/*----------------
* storage_name * storage_name
* returns a name corresponding to a storage enum value * returns the name corresponding to a typstorage/attstorage enum value
* For use in error messages
*/ */
static const char * static const char *
storage_name(char c) storage_name(char c)
{ {
switch (c) switch (c)
{ {
case 'p': return "PLAIN"; case 'p':
case 'm': return "MAIN"; return "PLAIN";
case 'x': return "EXTENDED"; case 'm':
case 'e': return "EXTERNAL"; return "MAIN";
default: return "???"; case 'x':
return "EXTENDED";
case 'e':
return "EXTERNAL";
default:
return "???";
} }
} }
@ -1189,7 +1192,6 @@ MergeAttributes(List *schema, List *supers, bool istemp,
List *constraints = NIL; List *constraints = NIL;
int parentsWithOids = 0; int parentsWithOids = 0;
bool have_bogus_defaults = false; bool have_bogus_defaults = false;
bool have_bogus_comments = false;
int child_attno; int child_attno;
static Node bogus_marker = { 0 }; /* marks conflicting defaults */ static Node bogus_marker = { 0 }; /* marks conflicting defaults */
@ -1354,7 +1356,8 @@ MergeAttributes(List *schema, List *supers, bool istemp,
(errcode(ERRCODE_DATATYPE_MISMATCH), (errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("inherited column \"%s\" has a storage parameter conflict", errmsg("inherited column \"%s\" has a storage parameter conflict",
attributeName), attributeName),
errdetail("%s versus %s", storage_name(def->storage), errdetail("%s versus %s",
storage_name(def->storage),
storage_name(attribute->attstorage)))); storage_name(attribute->attstorage))));
def->inhcount++; def->inhcount++;
@ -1375,10 +1378,10 @@ MergeAttributes(List *schema, List *supers, bool istemp,
def->inhcount = 1; def->inhcount = 1;
def->is_local = false; def->is_local = false;
def->is_not_null = attribute->attnotnull; def->is_not_null = attribute->attnotnull;
def->storage = attribute->attstorage;
def->raw_default = NULL; def->raw_default = NULL;
def->cooked_default = NULL; def->cooked_default = NULL;
def->constraints = NIL; def->constraints = NIL;
def->storage = attribute->attstorage;
inhSchema = lappend(inhSchema, def); inhSchema = lappend(inhSchema, def);
newattno[parent_attno - 1] = ++child_attno; newattno[parent_attno - 1] = ++child_attno;
} }
@ -1525,7 +1528,8 @@ MergeAttributes(List *schema, List *supers, bool istemp,
(errcode(ERRCODE_DATATYPE_MISMATCH), (errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("column \"%s\" has a storage parameter conflict", errmsg("column \"%s\" has a storage parameter conflict",
attributeName), attributeName),
errdetail("%s versus %s", storage_name(def->storage), errdetail("%s versus %s",
storage_name(def->storage),
storage_name(newdef->storage)))); storage_name(newdef->storage))));
/* Mark the column as locally defined */ /* Mark the column as locally defined */
@ -1580,20 +1584,6 @@ MergeAttributes(List *schema, List *supers, bool istemp,
} }
} }
/* Raise an error if we found conflicting comments. */
if (have_bogus_comments)
{
foreach(entry, schema)
{
ColumnDef *def = lfirst(entry);
if (def->cooked_default == &bogus_marker)
ereport(ERROR,
(errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
errmsg("column \"%s\" inherits conflicting comments", def->colname)));
}
}
*supOids = parentOids; *supOids = parentOids;
*supconstr = constraints; *supconstr = constraints;
*supOidCount = parentsWithOids; *supOidCount = parentsWithOids;
@ -3903,6 +3893,7 @@ ATPrepAddOids(List **wqueue, Relation rel, bool recurse, AlterTableCmd *cmd)
cdef->inhcount = 0; cdef->inhcount = 0;
cdef->is_local = true; cdef->is_local = true;
cdef->is_not_null = true; cdef->is_not_null = true;
cdef->storage = 0;
cmd->def = (Node *) cdef; cmd->def = (Node *) cdef;
} }
ATPrepAddColumn(wqueue, rel, recurse, cmd); ATPrepAddColumn(wqueue, rel, recurse, cmd);

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.117 2009/07/16 06:33:42 petere Exp $ * $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.118 2009/10/13 00:53:07 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -124,6 +124,7 @@ DefineVirtualRelation(const RangeVar *relation, List *tlist, bool replace)
def->inhcount = 0; def->inhcount = 0;
def->is_local = true; def->is_local = true;
def->is_not_null = false; def->is_not_null = false;
def->storage = 0;
def->raw_default = NULL; def->raw_default = NULL;
def->cooked_default = NULL; def->cooked_default = NULL;
def->constraints = NIL; def->constraints = NIL;

View File

@ -15,7 +15,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.446 2009/10/12 20:39:39 tgl Exp $ * $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.447 2009/10/13 00:53:08 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -2115,6 +2115,7 @@ _copyColumnDef(ColumnDef *from)
COPY_SCALAR_FIELD(inhcount); COPY_SCALAR_FIELD(inhcount);
COPY_SCALAR_FIELD(is_local); COPY_SCALAR_FIELD(is_local);
COPY_SCALAR_FIELD(is_not_null); COPY_SCALAR_FIELD(is_not_null);
COPY_SCALAR_FIELD(storage);
COPY_NODE_FIELD(raw_default); COPY_NODE_FIELD(raw_default);
COPY_NODE_FIELD(cooked_default); COPY_NODE_FIELD(cooked_default);
COPY_NODE_FIELD(constraints); COPY_NODE_FIELD(constraints);

View File

@ -22,7 +22,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.368 2009/10/12 20:39:40 tgl Exp $ * $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.369 2009/10/13 00:53:08 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -2084,6 +2084,7 @@ _equalColumnDef(ColumnDef *a, ColumnDef *b)
COMPARE_SCALAR_FIELD(inhcount); COMPARE_SCALAR_FIELD(inhcount);
COMPARE_SCALAR_FIELD(is_local); COMPARE_SCALAR_FIELD(is_local);
COMPARE_SCALAR_FIELD(is_not_null); COMPARE_SCALAR_FIELD(is_not_null);
COMPARE_SCALAR_FIELD(storage);
COMPARE_NODE_FIELD(raw_default); COMPARE_NODE_FIELD(raw_default);
COMPARE_NODE_FIELD(cooked_default); COMPARE_NODE_FIELD(cooked_default);
COMPARE_NODE_FIELD(constraints); COMPARE_NODE_FIELD(constraints);

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.368 2009/10/12 18:10:45 tgl Exp $ * $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.369 2009/10/13 00:53:08 tgl Exp $
* *
* NOTES * NOTES
* Every node type that can appear in stored rules' parsetrees *must* * Every node type that can appear in stored rules' parsetrees *must*
@ -1885,6 +1885,7 @@ _outColumnDef(StringInfo str, ColumnDef *node)
WRITE_INT_FIELD(inhcount); WRITE_INT_FIELD(inhcount);
WRITE_BOOL_FIELD(is_local); WRITE_BOOL_FIELD(is_local);
WRITE_BOOL_FIELD(is_not_null); WRITE_BOOL_FIELD(is_not_null);
WRITE_INT_FIELD(storage);
WRITE_NODE_FIELD(raw_default); WRITE_NODE_FIELD(raw_default);
WRITE_NODE_FIELD(cooked_default); WRITE_NODE_FIELD(cooked_default);
WRITE_NODE_FIELD(constraints); WRITE_NODE_FIELD(constraints);

View File

@ -19,7 +19,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.27 2009/10/12 19:49:24 adunstan Exp $ * $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.28 2009/10/13 00:53:08 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -642,6 +642,8 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt,
/* Likewise, copy storage if requested */ /* Likewise, copy storage if requested */
if (inhRelation->options & CREATE_TABLE_LIKE_STORAGE) if (inhRelation->options & CREATE_TABLE_LIKE_STORAGE)
def->storage = attribute->attstorage; def->storage = attribute->attstorage;
else
def->storage = 0;
/* Likewise, copy comment if requested */ /* Likewise, copy comment if requested */
if ((inhRelation->options & CREATE_TABLE_LIKE_COMMENTS) && if ((inhRelation->options & CREATE_TABLE_LIKE_COMMENTS) &&

View File

@ -13,7 +13,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.408 2009/10/12 20:39:42 tgl Exp $ * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.409 2009/10/13 00:53:08 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -460,20 +460,20 @@ typedef struct ColumnDef
int inhcount; /* number of times column is inherited */ int inhcount; /* number of times column is inherited */
bool is_local; /* column has local (non-inherited) def'n */ bool is_local; /* column has local (non-inherited) def'n */
bool is_not_null; /* NOT NULL constraint specified? */ bool is_not_null; /* NOT NULL constraint specified? */
char storage; /* storage parameter of column */ char storage; /* attstorage setting, or 0 for default */
Node *raw_default; /* default value (untransformed parse tree) */ Node *raw_default; /* default value (untransformed parse tree) */
Node *cooked_default; /* default value (transformed expr tree) */ Node *cooked_default; /* default value (transformed expr tree) */
List *constraints; /* other constraints on column */ List *constraints; /* other constraints on column */
} ColumnDef; } ColumnDef;
/* /*
* inhRelation - Relations a CREATE TABLE is to inherit attributes of * inhRelation - Relation a CREATE TABLE is to inherit attributes of
*/ */
typedef struct InhRelation typedef struct InhRelation
{ {
NodeTag type; NodeTag type;
RangeVar *relation; RangeVar *relation;
bits32 options; /* bitmap of CreateStmtLikeOption */ bits32 options; /* OR of CreateStmtLikeOption flags */
} InhRelation; } InhRelation;
typedef enum CreateStmtLikeOption typedef enum CreateStmtLikeOption