Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 74563f6

Browse files
committed
Revert "Improve compression and storage support with inheritance"
This reverts commit 0413a55. pg_dump cannot currently dump all the structures that are allowed by this patch. This needs more work in pg_dump and more test coverage. Discussion: https://www.postgresql.org/message-id/flat/24656cec-d6ef-4d15-8b5b-e8dfc9c833a7@eisentraut.org
1 parent d2ca9a5 commit 74563f6

File tree

15 files changed

+111
-408
lines changed

15 files changed

+111
-408
lines changed

doc/src/sgml/ref/create_table.sgml

+1-7
Original file line numberDiff line numberDiff line change
@@ -398,13 +398,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
398398
</para>
399399

400400
<para>
401-
Column storage and compression settings are inherited from parent
402-
tables. If a column is inherited from multiple tables, the storage
403-
settings or any explicit compression settings for the column must be the
404-
same in all parent tables, else an error is reported. Storage or
405-
compression settings explicitly specified for the new table override any
406-
inherited settings and can also be used to override conflicting
407-
inherited settings.
401+
Column <literal>STORAGE</literal> settings are also copied from parent tables.
408402
</para>
409403

410404
<para>

src/backend/catalog/pg_type.c

-23
Original file line numberDiff line numberDiff line change
@@ -974,26 +974,3 @@ makeMultirangeTypeName(const char *rangeTypeName, Oid typeNamespace)
974974

975975
return pstrdup(buf);
976976
}
977-
978-
/*
979-
* GetAttributeStorageName
980-
* returns the name corresponding to a typstorage/attstorage enum value.
981-
*/
982-
const char *
983-
GetAttributeStorageName(char c)
984-
{
985-
switch (c)
986-
{
987-
case TYPSTORAGE_PLAIN:
988-
return "PLAIN";
989-
case TYPSTORAGE_EXTERNAL:
990-
return "EXTERNAL";
991-
case TYPSTORAGE_EXTENDED:
992-
return "EXTENDED";
993-
case TYPSTORAGE_MAIN:
994-
return "MAIN";
995-
default:
996-
elog(ERROR, "invalid storage type %c", c);
997-
return NULL;
998-
}
999-
}

src/backend/commands/tablecmds.c

+75-63
Original file line numberDiff line numberDiff line change
@@ -350,16 +350,6 @@ typedef struct ForeignTruncateInfo
350350
#define child_dependency_type(child_is_partition) \
351351
((child_is_partition) ? DEPENDENCY_AUTO : DEPENDENCY_NORMAL)
352352

353-
/*
354-
* Bogus property string to track conflict in inherited properties of a column.
355-
* It is currently used for storage and compression specifications, but may be
356-
* used for other string specifications in future. It can be any string which
357-
* does not look like a valid compression or storage method. It is meant to be
358-
* used by MergeAttributes() and its minions. It is not expected to be stored
359-
* on disk.
360-
*/
361-
static const char *conflicting_column_property = "*** conflicting column property ***";
362-
363353
static void truncate_check_rel(Oid relid, Form_pg_class reltuple);
364354
static void truncate_check_perms(Oid relid, Form_pg_class reltuple);
365355
static void truncate_check_activity(Relation rel);
@@ -370,8 +360,7 @@ static List *MergeAttributes(List *columns, const List *supers, char relpersiste
370360
List **supnotnulls);
371361
static List *MergeCheckConstraint(List *constraints, const char *name, Node *expr);
372362
static void MergeChildAttribute(List *inh_columns, int exist_attno, int newcol_attno, const ColumnDef *newdef);
373-
static ColumnDef *MergeInheritedAttribute(List *inh_columns, int exist_attno, const ColumnDef *newdef,
374-
bool *have_deferred_conflicts);
363+
static ColumnDef *MergeInheritedAttribute(List *inh_columns, int exist_attno, const ColumnDef *newdef);
375364
static void MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel, bool ispartition);
376365
static void MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel);
377366
static void StoreCatalogInheritance(Oid relationId, List *supers,
@@ -631,6 +620,7 @@ static ObjectAddress ATExecSetCompression(Relation rel,
631620
const char *column, Node *newValue, LOCKMODE lockmode);
632621

633622
static void index_copy_data(Relation rel, RelFileLocator newrlocator);
623+
static const char *storage_name(char c);
634624

635625
static void RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid,
636626
Oid oldRelOid, void *arg);
@@ -1373,7 +1363,9 @@ BuildDescForRelation(const List *columns)
13731363
att->attidentity = entry->identity;
13741364
att->attgenerated = entry->generated;
13751365
att->attcompression = GetAttributeCompression(att->atttypid, entry->compression);
1376-
if (entry->storage_name)
1366+
if (entry->storage)
1367+
att->attstorage = entry->storage;
1368+
else if (entry->storage_name)
13771369
att->attstorage = GetAttributeStorage(att->atttypid, entry->storage_name);
13781370
}
13791371

@@ -2396,6 +2388,28 @@ truncate_check_activity(Relation rel)
23962388
CheckTableNotInUse(rel, "TRUNCATE");
23972389
}
23982390

2391+
/*
2392+
* storage_name
2393+
* returns the name corresponding to a typstorage/attstorage enum value
2394+
*/
2395+
static const char *
2396+
storage_name(char c)
2397+
{
2398+
switch (c)
2399+
{
2400+
case TYPSTORAGE_PLAIN:
2401+
return "PLAIN";
2402+
case TYPSTORAGE_EXTERNAL:
2403+
return "EXTERNAL";
2404+
case TYPSTORAGE_EXTENDED:
2405+
return "EXTENDED";
2406+
case TYPSTORAGE_MAIN:
2407+
return "MAIN";
2408+
default:
2409+
return "???";
2410+
}
2411+
}
2412+
23992413
/*----------
24002414
* MergeAttributes
24012415
* Returns new schema given initial schema and superclasses.
@@ -2469,7 +2483,7 @@ MergeAttributes(List *columns, const List *supers, char relpersistence,
24692483
List *inh_columns = NIL;
24702484
List *constraints = NIL;
24712485
List *nnconstraints = NIL;
2472-
bool have_deferred_conflicts = false;
2486+
bool have_bogus_defaults = false;
24732487
int child_attno;
24742488
static Node bogus_marker = {0}; /* marks conflicting defaults */
24752489
List *saved_columns = NIL;
@@ -2706,10 +2720,11 @@ MergeAttributes(List *columns, const List *supers, char relpersistence,
27062720
*/
27072721
newdef = makeColumnDef(attributeName, attribute->atttypid,
27082722
attribute->atttypmod, attribute->attcollation);
2709-
newdef->storage_name = GetAttributeStorageName(attribute->attstorage);
2723+
newdef->storage = attribute->attstorage;
27102724
newdef->generated = attribute->attgenerated;
27112725
if (CompressionMethodIsValid(attribute->attcompression))
2712-
newdef->compression = GetCompressionMethodName(attribute->attcompression);
2726+
newdef->compression =
2727+
pstrdup(GetCompressionMethodName(attribute->attcompression));
27132728

27142729
/*
27152730
* Regular inheritance children are independent enough not to
@@ -2729,8 +2744,7 @@ MergeAttributes(List *columns, const List *supers, char relpersistence,
27292744
/*
27302745
* Yes, try to merge the two column definitions.
27312746
*/
2732-
mergeddef = MergeInheritedAttribute(inh_columns, exist_attno, newdef,
2733-
&have_deferred_conflicts);
2747+
mergeddef = MergeInheritedAttribute(inh_columns, exist_attno, newdef);
27342748

27352749
newattmap->attnums[parent_attno - 1] = exist_attno;
27362750

@@ -2853,7 +2867,7 @@ MergeAttributes(List *columns, const List *supers, char relpersistence,
28532867
else if (!equal(def->cooked_default, this_default))
28542868
{
28552869
def->cooked_default = &bogus_marker;
2856-
have_deferred_conflicts = true;
2870+
have_bogus_defaults = true;
28572871
}
28582872
}
28592873

@@ -3063,10 +3077,10 @@ MergeAttributes(List *columns, const List *supers, char relpersistence,
30633077
}
30643078

30653079
/*
3066-
* If we found any conflicting parent default values or conflicting parent
3067-
* properties, check to make sure they were overridden by the child.
3080+
* If we found any conflicting parent default values, check to make sure
3081+
* they were overridden by the child.
30683082
*/
3069-
if (have_deferred_conflicts)
3083+
if (have_bogus_defaults)
30703084
{
30713085
foreach(lc, columns)
30723086
{
@@ -3087,20 +3101,6 @@ MergeAttributes(List *columns, const List *supers, char relpersistence,
30873101
def->colname),
30883102
errhint("To resolve the conflict, specify a default explicitly.")));
30893103
}
3090-
3091-
if (def->compression == conflicting_column_property)
3092-
ereport(ERROR,
3093-
(errcode(ERRCODE_DATATYPE_MISMATCH),
3094-
errmsg("column \"%s\" inherits conflicting compression methods",
3095-
def->colname),
3096-
errhint("To resolve the conflict, specify a compression method explicitly.")));
3097-
3098-
if (def->storage_name == conflicting_column_property)
3099-
ereport(ERROR,
3100-
(errcode(ERRCODE_DATATYPE_MISMATCH),
3101-
errmsg("column \"%s\" inherits conflicting storage methods",
3102-
def->colname),
3103-
errhint("To resolve the conflict, specify a storage method explicitly.")));
31043104
}
31053105
}
31063106

@@ -3250,18 +3250,33 @@ MergeChildAttribute(List *inh_columns, int exist_attno, int newcol_attno, const
32503250
inhdef->identity = newdef->identity;
32513251

32523252
/*
3253-
* Child storage specification, if any, overrides inherited storage
3254-
* property.
3253+
* Copy storage parameter
32553254
*/
3256-
if (newdef->storage_name != NULL)
3257-
inhdef->storage_name = newdef->storage_name;
3255+
if (inhdef->storage == 0)
3256+
inhdef->storage = newdef->storage;
3257+
else if (newdef->storage != 0 && inhdef->storage != newdef->storage)
3258+
ereport(ERROR,
3259+
(errcode(ERRCODE_DATATYPE_MISMATCH),
3260+
errmsg("column \"%s\" has a storage parameter conflict",
3261+
attributeName),
3262+
errdetail("%s versus %s",
3263+
storage_name(inhdef->storage),
3264+
storage_name(newdef->storage))));
32583265

32593266
/*
3260-
* Child compression specification, if any, overrides inherited
3261-
* compression property.
3267+
* Copy compression parameter
32623268
*/
3263-
if (newdef->compression != NULL)
3269+
if (inhdef->compression == NULL)
32643270
inhdef->compression = newdef->compression;
3271+
else if (newdef->compression != NULL)
3272+
{
3273+
if (strcmp(inhdef->compression, newdef->compression) != 0)
3274+
ereport(ERROR,
3275+
(errcode(ERRCODE_DATATYPE_MISMATCH),
3276+
errmsg("column \"%s\" has a compression method conflict",
3277+
attributeName),
3278+
errdetail("%s versus %s", inhdef->compression, newdef->compression)));
3279+
}
32653280

32663281
/*
32673282
* Merge of not-null constraints = OR 'em together
@@ -3328,10 +3343,6 @@ MergeChildAttribute(List *inh_columns, int exist_attno, int newcol_attno, const
33283343
* 'exist_attno' is the number the existing matching attribute in inh_columns.
33293344
* 'newdef' is the new parent column/attribute definition to be merged.
33303345
*
3331-
* Output arguments:
3332-
* 'have_deferred_conflicts' is set to true if there is a conflict in inherited
3333-
* compression properties; remains unchanged otherwise.
3334-
*
33353346
* The matching ColumnDef in 'inh_columns' list is modified and returned.
33363347
*
33373348
* Notes:
@@ -3345,8 +3356,7 @@ MergeChildAttribute(List *inh_columns, int exist_attno, int newcol_attno, const
33453356
static ColumnDef *
33463357
MergeInheritedAttribute(List *inh_columns,
33473358
int exist_attno,
3348-
const ColumnDef *newdef,
3349-
bool *have_deferred_conflicts)
3359+
const ColumnDef *newdef)
33503360
{
33513361
char *attributeName = newdef->colname;
33523362
ColumnDef *prevdef;
@@ -3393,26 +3403,28 @@ MergeInheritedAttribute(List *inh_columns,
33933403
/*
33943404
* Copy/check storage parameter
33953405
*/
3396-
if (prevdef->storage_name == NULL)
3397-
prevdef->storage_name = newdef->storage_name;
3398-
else if (newdef->storage_name != NULL &&
3399-
strcmp(prevdef->storage_name, newdef->storage_name) != 0)
3400-
{
3401-
prevdef->storage_name = conflicting_column_property;
3402-
*have_deferred_conflicts = true;
3403-
}
3406+
if (prevdef->storage == 0)
3407+
prevdef->storage = newdef->storage;
3408+
else if (prevdef->storage != newdef->storage)
3409+
ereport(ERROR,
3410+
(errcode(ERRCODE_DATATYPE_MISMATCH),
3411+
errmsg("inherited column \"%s\" has a storage parameter conflict",
3412+
attributeName),
3413+
errdetail("%s versus %s",
3414+
storage_name(prevdef->storage),
3415+
storage_name(newdef->storage))));
34043416

34053417
/*
34063418
* Copy/check compression parameter
34073419
*/
34083420
if (prevdef->compression == NULL)
34093421
prevdef->compression = newdef->compression;
3410-
else if (newdef->compression != NULL &&
3411-
strcmp(prevdef->compression, newdef->compression) != 0)
3412-
{
3413-
prevdef->compression = conflicting_column_property;
3414-
*have_deferred_conflicts = true;
3415-
}
3422+
else if (strcmp(prevdef->compression, newdef->compression) != 0)
3423+
ereport(ERROR,
3424+
(errcode(ERRCODE_DATATYPE_MISMATCH),
3425+
errmsg("column \"%s\" has a compression method conflict",
3426+
attributeName),
3427+
errdetail("%s versus %s", prevdef->compression, newdef->compression)));
34163428

34173429
/*
34183430
* Check for GENERATED conflicts

src/backend/nodes/makefuncs.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ makeColumnDef(const char *colname, Oid typeOid, int32 typmod, Oid collOid)
500500
n->is_local = true;
501501
n->is_not_null = false;
502502
n->is_from_type = false;
503-
n->storage_name = NULL;
503+
n->storage = 0;
504504
n->raw_default = NULL;
505505
n->cooked_default = NULL;
506506
n->collClause = NULL;

src/backend/parser/gram.y

+4-3
Original file line numberDiff line numberDiff line change
@@ -3754,6 +3754,7 @@ columnDef: ColId Typename opt_column_storage opt_column_compression create_gener
37543754
n->is_local = true;
37553755
n->is_not_null = false;
37563756
n->is_from_type = false;
3757+
n->storage = 0;
37573758
n->raw_default = NULL;
37583759
n->cooked_default = NULL;
37593760
n->collOid = InvalidOid;
@@ -3775,7 +3776,7 @@ columnOptions: ColId ColQualList
37753776
n->is_local = true;
37763777
n->is_not_null = false;
37773778
n->is_from_type = false;
3778-
n->storage_name = NULL;
3779+
n->storage = 0;
37793780
n->raw_default = NULL;
37803781
n->cooked_default = NULL;
37813782
n->collOid = InvalidOid;
@@ -3794,7 +3795,7 @@ columnOptions: ColId ColQualList
37943795
n->is_local = true;
37953796
n->is_not_null = false;
37963797
n->is_from_type = false;
3797-
n->storage_name = NULL;
3798+
n->storage = 0;
37983799
n->raw_default = NULL;
37993800
n->cooked_default = NULL;
38003801
n->collOid = InvalidOid;
@@ -13857,7 +13858,7 @@ TableFuncElement: ColId Typename opt_collate_clause
1385713858
n->is_local = true;
1385813859
n->is_not_null = false;
1385913860
n->is_from_type = false;
13860-
n->storage_name = NULL;
13861+
n->storage = 0;
1386113862
n->raw_default = NULL;
1386213863
n->cooked_default = NULL;
1386313864
n->collClause = (CollateClause *) $3;

src/backend/parser/parse_utilcmd.c

+4-3
Original file line numberDiff line numberDiff line change
@@ -1134,14 +1134,15 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla
11341134

11351135
/* Likewise, copy storage if requested */
11361136
if (table_like_clause->options & CREATE_TABLE_LIKE_STORAGE)
1137-
def->storage_name = GetAttributeStorageName(attribute->attstorage);
1137+
def->storage = attribute->attstorage;
11381138
else
1139-
def->storage_name = NULL;
1139+
def->storage = 0;
11401140

11411141
/* Likewise, copy compression if requested */
11421142
if ((table_like_clause->options & CREATE_TABLE_LIKE_COMPRESSION) != 0
11431143
&& CompressionMethodIsValid(attribute->attcompression))
1144-
def->compression = GetCompressionMethodName(attribute->attcompression);
1144+
def->compression =
1145+
pstrdup(GetCompressionMethodName(attribute->attcompression));
11451146
else
11461147
def->compression = NULL;
11471148

src/include/catalog/pg_type.h

-2
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,4 @@ extern bool moveArrayTypeName(Oid typeOid, const char *typeName,
404404
extern char *makeMultirangeTypeName(const char *rangeTypeName,
405405
Oid typeNamespace);
406406

407-
extern const char *GetAttributeStorageName(char storage);
408-
409407
#endif /* PG_TYPE_H */

src/include/nodes/parsenodes.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -712,12 +712,13 @@ typedef struct ColumnDef
712712
NodeTag type;
713713
char *colname; /* name of column */
714714
TypeName *typeName; /* type of column */
715-
const char *compression; /* compression method for column */
715+
char *compression; /* compression method for column */
716716
int inhcount; /* number of times column is inherited */
717717
bool is_local; /* column has local (non-inherited) def'n */
718718
bool is_not_null; /* NOT NULL constraint specified? */
719719
bool is_from_type; /* column definition came from table type */
720-
const char *storage_name; /* attstorage setting name or NULL for default */
720+
char storage; /* attstorage setting, or 0 for default */
721+
char *storage_name; /* attstorage setting name or NULL for default */
721722
Node *raw_default; /* default value (untransformed parse tree) */
722723
Node *cooked_default; /* default value (transformed expr tree) */
723724
char identity; /* attidentity setting */

0 commit comments

Comments
 (0)