From 704b0877170757deae269b6bababbb2487693a4b Mon Sep 17 00:00:00 2001 From: amit Date: Wed, 9 Aug 2017 16:53:47 +0900 Subject: [PATCH 5/5] Store in pg_inherits if a child is a partitioned table --- doc/src/sgml/catalogs.sgml | 10 ++++++++++ src/backend/catalog/pg_inherits.c | 14 +++++++------- src/backend/commands/tablecmds.c | 17 +++++++++++------ src/include/catalog/pg_inherits.h | 4 +++- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 97e5ecf686..eae9b77ccb 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -3896,6 +3896,16 @@ SCRAM-SHA-256$<iteration count>:<salt>< inherited columns are to be arranged. The count starts at 1. + + + inhchildparted + bool + + + This is true if the child table is a partitioned table, + false otherwise + + diff --git a/src/backend/catalog/pg_inherits.c b/src/backend/catalog/pg_inherits.c index 99b1e70de6..0285bc3c33 100644 --- a/src/backend/catalog/pg_inherits.c +++ b/src/backend/catalog/pg_inherits.c @@ -30,7 +30,6 @@ #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/memutils.h" -#include "utils/lsyscache.h" #include "utils/syscache.h" #include "utils/tqual.h" @@ -123,7 +122,12 @@ find_inheritance_children(Oid parentrelId, LOCKMODE lockmode, while ((inheritsTuple = systable_getnext(scan)) != NULL) { + bool is_partitioned; + inhrelid = ((Form_pg_inherits) GETSTRUCT(inheritsTuple))->inhrelid; + is_partitioned = ((Form_pg_inherits) + GETSTRUCT(inheritsTuple))->inhchildparted; + if (numchildren >= maxchildren) { maxchildren *= 2; @@ -131,14 +135,10 @@ find_inheritance_children(Oid parentrelId, LOCKMODE lockmode, maxchildren * sizeof(InhChildInfo)); } inhchildren[numchildren].relid = inhrelid; + inhchildren[numchildren].is_partitioned = is_partitioned; - if (get_rel_relkind(inhrelid) == RELKIND_PARTITIONED_TABLE) - { - inhchildren[numchildren].is_partitioned = true; + if (is_partitioned) my_num_partitioned_children++; - } - else - inhchildren[numchildren].is_partitioned = false; numchildren++; } diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 14bac087d9..ab3cbbcdba 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -299,10 +299,10 @@ static bool MergeCheckConstraint(List *constraints, char *name, Node *expr); static void MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel); static void MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel); static void StoreCatalogInheritance(Oid relationId, List *supers, - bool child_is_partition); + bool child_is_partition, bool child_is_partitioned); static void StoreCatalogInheritance1(Oid relationId, Oid parentOid, int16 seqNumber, Relation inhRelation, - bool child_is_partition); + bool child_is_partition, bool child_is_partitioned); static int findAttrByName(const char *attributeName, List *schema); static void AlterIndexNamespaces(Relation classRel, Relation rel, Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved); @@ -746,7 +746,8 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, typaddress); /* Store inheritance information for new rel. */ - StoreCatalogInheritance(relationId, inheritOids, stmt->partbound != NULL); + StoreCatalogInheritance(relationId, inheritOids, stmt->partbound != NULL, + relkind == RELKIND_PARTITIONED_TABLE); /* * We must bump the command counter to make the newly-created relation @@ -2298,7 +2299,7 @@ MergeCheckConstraint(List *constraints, char *name, Node *expr) */ static void StoreCatalogInheritance(Oid relationId, List *supers, - bool child_is_partition) + bool child_is_partition, bool child_is_partitioned) { Relation relation; int16 seqNumber; @@ -2329,7 +2330,7 @@ StoreCatalogInheritance(Oid relationId, List *supers, Oid parentOid = lfirst_oid(entry); StoreCatalogInheritance1(relationId, parentOid, seqNumber, relation, - child_is_partition); + child_is_partition, child_is_partitioned); seqNumber++; } @@ -2343,7 +2344,7 @@ StoreCatalogInheritance(Oid relationId, List *supers, static void StoreCatalogInheritance1(Oid relationId, Oid parentOid, int16 seqNumber, Relation inhRelation, - bool child_is_partition) + bool child_is_partition, bool child_is_partitioned) { TupleDesc desc = RelationGetDescr(inhRelation); Datum values[Natts_pg_inherits]; @@ -2358,6 +2359,8 @@ StoreCatalogInheritance1(Oid relationId, Oid parentOid, values[Anum_pg_inherits_inhrelid - 1] = ObjectIdGetDatum(relationId); values[Anum_pg_inherits_inhparent - 1] = ObjectIdGetDatum(parentOid); values[Anum_pg_inherits_inhseqno - 1] = Int16GetDatum(seqNumber); + values[Anum_pg_inherits_inhchildparted - 1] = + BoolGetDatum(child_is_partitioned); memset(nulls, 0, sizeof(nulls)); @@ -11112,6 +11115,8 @@ CreateInheritance(Relation child_rel, Relation parent_rel) inhseqno + 1, catalogRelation, parent_rel->rd_rel->relkind == + RELKIND_PARTITIONED_TABLE, + child_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE); /* Now we're done with pg_inherits */ diff --git a/src/include/catalog/pg_inherits.h b/src/include/catalog/pg_inherits.h index 26bfab5db6..2c4ef246a4 100644 --- a/src/include/catalog/pg_inherits.h +++ b/src/include/catalog/pg_inherits.h @@ -33,6 +33,7 @@ CATALOG(pg_inherits,2611) BKI_WITHOUT_OIDS Oid inhrelid; Oid inhparent; int32 inhseqno; + bool inhchildparted; } FormData_pg_inherits; /* ---------------- @@ -46,10 +47,11 @@ typedef FormData_pg_inherits *Form_pg_inherits; * compiler constants for pg_inherits * ---------------- */ -#define Natts_pg_inherits 3 +#define Natts_pg_inherits 4 #define Anum_pg_inherits_inhrelid 1 #define Anum_pg_inherits_inhparent 2 #define Anum_pg_inherits_inhseqno 3 +#define Anum_pg_inherits_inhchildparted 4 /* ---------------- * pg_inherits has no initial contents -- 2.11.0