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

Lines changed: 1 addition & 7 deletions
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

Lines changed: 0 additions & 23 deletions
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

Lines changed: 75 additions & 63 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 4 additions & 3 deletions
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

Lines changed: 4 additions & 3 deletions
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

Lines changed: 0 additions & 2 deletions
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

Lines changed: 3 additions & 2 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy