Patch attached...

Поиск
Список
Период
Сортировка
От Chris
Тема Patch attached...
Дата
Msg-id 389B9ACB.9F929BAE@bitmead.com
обсуждение исходный текст
Ответы Re: [HACKERS] Patch attached...  (Don Baccus <dhogaza@pacifier.com>)
Re: [HACKERS] Patch attached...  (Bruce Momjian <pgman@candle.pha.pa.us>)
Re: [HACKERS] Patch attached...  (Bruce Momjian <pgman@candle.pha.pa.us>)
Status of inheritance-changing patch  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
Attached is a patch for the ONLY inheritance
functionality...

*) It includes a SET compatibility mode.
*) The overhead for non-inheritance has
been cut down to 30 microseconds (on a pc).
*) It needs an initdb.

Comments welcome.

--
Chris Bitmead
mailto:chris@bitmead.com? src/backend/1
Index: src/backend/commands/creatinh.c
===================================================================
RCS file: /usr/local/cvsroot/pgsql/src/backend/commands/creatinh.c,v
retrieving revision 1.56
diff -c -r1.56 creatinh.c
*** src/backend/commands/creatinh.c    2000/01/29 16:58:34    1.56
--- src/backend/commands/creatinh.c    2000/02/05 03:13:17
***************
*** 35,40 ****
--- 35,43 ----
                              const char *attributeType, List *schema);
  static List *MergeAttributes(List *schema, List *supers, List **supconstr);
  static void StoreCatalogInheritance(Oid relationId, List *supers);
+ static void
+ setRelhassubclassInRelation(Oid relationId, bool relhassubclass);
+

  /* ----------------------------------------------------------------
   *        DefineRelation
***************
*** 323,328 ****
--- 326,332 ----
          TupleConstr *constr;

          relation = heap_openr(name, AccessShareLock);
+         setRelhassubclassInRelation(relation->rd_id, true);
          tupleDesc = RelationGetDescr(relation);
          constr = tupleDesc->constr;

***************
*** 655,657 ****
--- 659,698 ----
      }
      return false;
  }
+
+
+ static void
+ setRelhassubclassInRelation(Oid relationId, bool relhassubclass)
+ {
+         Relation        relationRelation;
+         HeapTuple       tuple;
+         Relation        idescs[Num_pg_class_indices];
+
+         /*
+          * Lock a relation given its Oid. Go to the RelationRelation (i.e.
+          * pg_relation), find the appropriate tuple, and add the specified
+          * lock to it.
+          */
+         relationRelation = heap_openr(RelationRelationName, RowExclusiveLock);
+         tuple = SearchSysCacheTupleCopy(RELOID,
+                                                                         ObjectIdGetDatum(relationId),
+                                                                         0, 0, 0)
+ ;
+         Assert(HeapTupleIsValid(tuple));
+
+         ((Form_pg_class) GETSTRUCT(tuple))->relhassubclass = relhassubclass;
+         heap_update(relationRelation, &tuple->t_self, tuple, NULL);
+
+         /* keep the catalog indices up to date */
+         CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
+         CatalogIndexInsert(idescs, Num_pg_class_indices, relationRelation, tuple
+ );
+         CatalogCloseIndices(Num_pg_class_indices, idescs);
+
+         heap_freetuple(tuple);
+         heap_close(relationRelation, RowExclusiveLock);
+ }
+
+
+
+
Index: src/backend/commands/variable.c
===================================================================
RCS file: /usr/local/cvsroot/pgsql/src/backend/commands/variable.c,v
retrieving revision 1.28
diff -c -r1.28 variable.c
*** src/backend/commands/variable.c    2000/01/22 23:50:10    1.28
--- src/backend/commands/variable.c    2000/02/05 03:13:18
***************
*** 48,53 ****
--- 48,56 ----

  extern bool _use_keyset_query_optimizer;

+ #define examine_subclass_default true
+ bool examine_subclass = examine_subclass_default;
+
  /*
   *
   * Get_Token
***************
*** 228,233 ****
--- 231,274 ----
      geqo_rels = GEQO_RELS;
      return TRUE;
  }
+ /*
+  *
+  * EXAMINE_SUBCLASS
+  *
+  */
+ #define EXAMINE_SUBCLASS "EXAMINE_SUBCLASS"
+
+ static bool
+ parse_examine_subclass(const char *value)
+ {
+     if (strcasecmp(value, "on") == 0)
+         examine_subclass = true;
+     else if (strcasecmp(value, "off") == 0)
+         examine_subclass = false;
+     else if (strcasecmp(value, "default") == 0)
+         examine_subclass = examine_subclass_default;
+     else
+         elog(ERROR, "Bad value for %s (%s)", EXAMINE_SUBCLASS, value);
+     return TRUE;
+ }
+
+ static bool
+ show_examine_subclass()
+ {
+
+     if (examine_subclass)
+         elog(NOTICE, "%s is ON", EXAMINE_SUBCLASS);
+     else
+         elog(NOTICE, "%s is OFF", EXAMINE_SUBCLASS);
+     return TRUE;
+ }
+
+ static bool
+ reset_examine_subclass(void)
+ {
+     examine_subclass = examine_subclass_default;
+     return TRUE;
+ }

  /*
   *
***************
*** 600,605 ****
--- 641,649 ----
      {
          "pg_options", parse_pg_options, show_pg_options, reset_pg_options
      },
+     {
+         EXAMINE_SUBCLASS, parse_examine_subclass, show_examine_subclass, reset_examine_subclass
+     },
      {
          NULL, NULL, NULL, NULL
      }
Index: src/backend/optimizer/plan/planner.c
===================================================================
RCS file: /usr/local/cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v
retrieving revision 1.74
diff -c -r1.74 planner.c
*** src/backend/optimizer/plan/planner.c    2000/01/27 18:11:31    1.74
--- src/backend/optimizer/plan/planner.c    2000/02/05 03:13:21
***************
*** 35,40 ****
--- 35,41 ----
  #include "utils/builtins.h"
  #include "utils/lsyscache.h"
  #include "utils/syscache.h"
+ #include "parser/parsetree.h"

  static List *make_subplanTargetList(Query *parse, List *tlist,
                                      AttrNumber **groupColIdx);
***************
*** 140,146 ****
           * to change interface to plan_union_queries to pass that info back!
           */
      }
!     else if ((rt_index = first_inherit_rt_entry(rangetable)) != -1)
      {
          List       *sub_tlist;

--- 141,147 ----
           * to change interface to plan_union_queries to pass that info back!
           */
      }
!     else if ((rt_index = first_inherit_rt_entry(rangetable)) != -1 && has_inheritors(rt_fetch(rt_index,
parse->rtable)->relid))
      {
          List       *sub_tlist;

Index: src/backend/optimizer/prep/prepunion.c
===================================================================
RCS file: /usr/local/cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v
retrieving revision 1.43
diff -c -r1.43 prepunion.c
*** src/backend/optimizer/prep/prepunion.c    2000/02/03 06:12:19    1.43
--- src/backend/optimizer/prep/prepunion.c    2000/02/05 03:13:23
***************
*** 25,30 ****
--- 25,33 ----
  #include "parser/parse_clause.h"
  #include "parser/parsetree.h"
  #include "utils/lsyscache.h"
+ #include "access/heapam.h"
+ #include "catalog/catname.h"
+ #include "utils/syscache.h"

  typedef struct {
      Index        rt_index;
***************
*** 45,50 ****
--- 48,54 ----
  static Append *make_append(List *appendplans, List *unionrtables,
                             Index rt_index,
                             List *inheritrtable, List *tlist);
+ bool has_inheritors(Oid relationId);


  /*
***************
*** 352,357 ****
--- 356,386 ----

      *union_rtentriesPtr = union_rtentries;
      return union_plans;
+ }
+
+ bool has_inheritors(Oid relationId)
+ {
+         bool rtn;
+         Relation        relationRelation;
+         HeapTuple       tuple;
+
+         /*
+          * Lock a relation given its Oid. Go to the RelationRelation (i.e.
+          * pg_relation), find the appropriate tuple, and add the specified
+          * lock to it.
+          */
+         relationRelation = heap_openr(RelationRelationName, NoLock);
+         tuple = SearchSysCacheTupleCopy(RELOID,
+                                         ObjectIdGetDatum(relationId),
+                                         0, 0, 0)
+ ;
+ /*        Assert(HeapTupleIsValid(tuple)); */
+
+         rtn = ((Form_pg_class) GETSTRUCT(tuple))->relhassubclass;
+
+         heap_freetuple(tuple);
+         heap_close(relationRelation, NoLock);
+         return rtn;
  }

  /*
Index: src/backend/parser/gram.y
===================================================================
RCS file: /usr/local/cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.139
diff -c -r2.139 gram.y
*** src/backend/parser/gram.y    2000/02/04 18:49:33    2.139
--- src/backend/parser/gram.y    2000/02/05 03:13:39
***************
*** 3553,3562 ****

  relation_expr:    relation_name
                  {
!                     /* normal relations */
                      $$ = makeNode(RelExpr);
                      $$->relname = $1;
!                     $$->inh = FALSE;
                  }
          | relation_name '*'                  %prec '='
                  {
--- 3553,3563 ----

  relation_expr:    relation_name
                  {
!                     /* default inheritance */
!                     extern bool examine_subclass;
                      $$ = makeNode(RelExpr);
                      $$->relname = $1;
!                     $$->inh = examine_subclass;
                  }
          | relation_name '*'                  %prec '='
                  {
***************
*** 3565,3570 ****
--- 3566,3578 ----
                      $$->relname = $1;
                      $$->inh = TRUE;
                  }
+         | ONLY relation_name
+                 {
+                     /* no inheritance */
+                     $$ = makeNode(RelExpr);
+                     $$->relname = $2;
+                     $$->inh = FALSE;
+                 }

  opt_array_bounds:    '[' ']' opt_array_bounds
                  {  $$ = lcons(makeInteger(-1), $3); }
Index: src/include/catalog/pg_attribute.h
===================================================================
RCS file: /usr/local/cvsroot/pgsql/src/include/catalog/pg_attribute.h,v
retrieving revision 1.53
diff -c -r1.53 pg_attribute.h
*** src/include/catalog/pg_attribute.h    2000/01/26 05:57:57    1.53
--- src/include/catalog/pg_attribute.h    2000/02/05 03:13:39
***************
*** 402,408 ****
  { 1259, {"relrefs"},       21, 0,    2, 16, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
  { 1259, {"relhaspkey"},    16, 0,    1, 17, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
  { 1259, {"relhasrules"},   16, 0,    1, 18, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
! { 1259, {"relacl"},         1034, 0,  -1, 19, 0, -1, -1,    '\0', 'p', '\0', 'i', '\0', '\0' }

  DATA(insert OID = 0 ( 1259 relname            19 0 NAMEDATALEN   1 0 -1 -1 f p f i f f));
  DATA(insert OID = 0 ( 1259 reltype            26 0  4   2 0 -1 -1 t p f i f f));
--- 402,409 ----
  { 1259, {"relrefs"},       21, 0,    2, 16, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
  { 1259, {"relhaspkey"},    16, 0,    1, 17, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
  { 1259, {"relhasrules"},   16, 0,    1, 18, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
! { 1259, {"relhassubclass"},16, 0,    1, 19, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
! { 1259, {"relacl"},         1034, 0,  -1, 20, 0, -1, -1,    '\0', 'p', '\0', 'i', '\0', '\0' }

  DATA(insert OID = 0 ( 1259 relname            19 0 NAMEDATALEN   1 0 -1 -1 f p f i f f));
  DATA(insert OID = 0 ( 1259 reltype            26 0  4   2 0 -1 -1 t p f i f f));
***************
*** 422,428 ****
  DATA(insert OID = 0 ( 1259 relrefs            21 0  2  16 0 -1 -1 t p f s f f));
  DATA(insert OID = 0 ( 1259 relhaspkey        16 0  1  17 0 -1 -1 t p f c f f));
  DATA(insert OID = 0 ( 1259 relhasrules        16 0  1  18 0 -1 -1 t p f c f f));
! DATA(insert OID = 0 ( 1259 relacl          1034 0 -1  19 0 -1 -1 f p f i f f));
  DATA(insert OID = 0 ( 1259 ctid                27 0  6  -1 0 -1 -1 f p f i f f));
  DATA(insert OID = 0 ( 1259 oid                26 0  4  -2 0 -1 -1 t p f i f f));
  DATA(insert OID = 0 ( 1259 xmin                28 0  4  -3 0 -1 -1 t p f i f f));
--- 423,430 ----
  DATA(insert OID = 0 ( 1259 relrefs            21 0  2  16 0 -1 -1 t p f s f f));
  DATA(insert OID = 0 ( 1259 relhaspkey        16 0  1  17 0 -1 -1 t p f c f f));
  DATA(insert OID = 0 ( 1259 relhasrules        16 0  1  18 0 -1 -1 t p f c f f));
! DATA(insert OID = 0 ( 1259 relhassubclass    16 0  1   19 0 -1 -1 t p f c f f));
! DATA(insert OID = 0 ( 1259 relacl          1034 0 -1  20 0 -1 -1 f p f i f f));
  DATA(insert OID = 0 ( 1259 ctid                27 0  6  -1 0 -1 -1 f p f i f f));
  DATA(insert OID = 0 ( 1259 oid                26 0  4  -2 0 -1 -1 t p f i f f));
  DATA(insert OID = 0 ( 1259 xmin                28 0  4  -3 0 -1 -1 t p f i f f));
Index: src/include/catalog/pg_class.h
===================================================================
RCS file: /usr/local/cvsroot/pgsql/src/include/catalog/pg_class.h,v
retrieving revision 1.33
diff -c -r1.33 pg_class.h
*** src/include/catalog/pg_class.h    2000/01/26 05:57:57    1.33
--- src/include/catalog/pg_class.h    2000/02/05 03:13:40
***************
*** 78,88 ****
      int2        relrefs;        /* # of references to this relation */
      bool        relhaspkey;        /* has PRIMARY KEY */
      bool        relhasrules;
      aclitem        relacl[1];        /* this is here for the catalog */
  } FormData_pg_class;

  #define CLASS_TUPLE_SIZE \
!      (offsetof(FormData_pg_class,relhasrules) + sizeof(bool))

  /* ----------------
   *        Form_pg_class corresponds to a pointer to a tuple with
--- 78,89 ----
      int2        relrefs;        /* # of references to this relation */
      bool        relhaspkey;        /* has PRIMARY KEY */
      bool        relhasrules;
+     bool        relhassubclass;
      aclitem        relacl[1];        /* this is here for the catalog */
  } FormData_pg_class;

  #define CLASS_TUPLE_SIZE \
!      (offsetof(FormData_pg_class,relhassubclass) + sizeof(bool))

  /* ----------------
   *        Form_pg_class corresponds to a pointer to a tuple with
***************
*** 102,109 ****
   *        relacl field.
   * ----------------
   */
! #define Natts_pg_class_fixed            18
! #define Natts_pg_class                    19
  #define Anum_pg_class_relname            1
  #define Anum_pg_class_reltype            2
  #define Anum_pg_class_relowner            3
--- 103,110 ----
   *        relacl field.
   * ----------------
   */
! #define Natts_pg_class_fixed            19
! #define Natts_pg_class                    20
  #define Anum_pg_class_relname            1
  #define Anum_pg_class_reltype            2
  #define Anum_pg_class_relowner            3
***************
*** 122,128 ****
  #define Anum_pg_class_relrefs            16
  #define Anum_pg_class_relhaspkey        17
  #define Anum_pg_class_relhasrules        18
! #define Anum_pg_class_relacl            19

  /* ----------------
   *        initial contents of pg_class
--- 123,130 ----
  #define Anum_pg_class_relrefs            16
  #define Anum_pg_class_relhaspkey        17
  #define Anum_pg_class_relhasrules        18
! #define Anum_pg_class_relhassubclass        19
! #define Anum_pg_class_relacl            20

  /* ----------------
   *        initial contents of pg_class
***************
*** 135,141 ****
  DESCR("");
  DATA(insert OID = 1255 (  pg_proc 81          PGUID 0 0 0 0 f f r 16 0 0 0 0 0 f f _null_ ));
  DESCR("");
! DATA(insert OID = 1259 (  pg_class 83          PGUID 0 0 0 0 f f r 19 0 0 0 0 0 f f _null_ ));
  DESCR("");
  DATA(insert OID = 1260 (  pg_shadow 86          PGUID 0 0 0 0 f t r 8  0 0 0 0 0 f f _null_ ));
  DESCR("");
--- 137,143 ----
  DESCR("");
  DATA(insert OID = 1255 (  pg_proc 81          PGUID 0 0 0 0 f f r 16 0 0 0 0 0 f f _null_ ));
  DESCR("");
! DATA(insert OID = 1259 (  pg_class 83          PGUID 0 0 0 0 f f r 20 0 0 0 0 0 f f _null_ ));
  DESCR("");
  DATA(insert OID = 1260 (  pg_shadow 86          PGUID 0 0 0 0 f t r 8  0 0 0 0 0 f f _null_ ));
  DESCR("");

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Don Baccus
Дата:
Сообщение: Re: [HACKERS] Re: [SQL] Proposed Changes to PostgreSQL
Следующее
От: Don Baccus
Дата:
Сообщение: Re: [HACKERS] Patch attached...