Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit74563f6

Browse files
committed
Revert "Improve compression and storage support with inheritance"
This reverts commit0413a55.pg_dump cannot currently dump all the structures that are allowed bythis 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 parentd2ca9a5 commit74563f6

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
returnpstrdup(buf);
976976
}
977-
978-
/*
979-
* GetAttributeStorageName
980-
* returns the name corresponding to a typstorage/attstorage enum value.
981-
*/
982-
constchar*
983-
GetAttributeStorageName(charc)
984-
{
985-
switch (c)
986-
{
987-
caseTYPSTORAGE_PLAIN:
988-
return"PLAIN";
989-
caseTYPSTORAGE_EXTERNAL:
990-
return"EXTERNAL";
991-
caseTYPSTORAGE_EXTENDED:
992-
return"EXTENDED";
993-
caseTYPSTORAGE_MAIN:
994-
return"MAIN";
995-
default:
996-
elog(ERROR,"invalid storage type %c",c);
997-
returnNULL;
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-
boolhave_deferred_conflicts = false;
2486+
boolhave_bogus_defaults = false;
24732487
intchild_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 surethey 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 acompressionmethod 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
externchar*makeMultirangeTypeName(constchar*rangeTypeName,
405405
OidtypeNamespace);
406406

407-
externconstchar*GetAttributeStorageName(charstorage);
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
NodeTagtype;
713713
char*colname;/* name of column */
714714
TypeName*typeName;/* type of column */
715-
constchar*compression;/* compression method for column */
715+
char*compression;/* compression method for column */
716716
intinhcount;/* number of times column is inherited */
717717
boolis_local;/* column has local (non-inherited) def'n */
718718
boolis_not_null;/* NOT NULL constraint specified? */
719719
boolis_from_type;/* column definition came from table type */
720-
constchar*storage_name;/* attstorage setting name or NULL for default */
720+
charstorage;/* 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
charidentity;/* attidentity setting */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp