Thread

  1. Howto add a field to each postgresql tuple

    Maurice Gittens <mgittens@gits.nl> — 1998-02-27T08:57:11Z

    Ok,
    
    As part of my "learning postgresql project" I've been hacking yesterday
    and I've found out how to add a system attribute to each tuple in
    postgresql.
    
    I added a system attribute which maintains the relation between the
    oid of a heaptuple and the oid of the relation to which the tuple
    belongs.
    
    In OO speak each instance now knows to which class it belongs.
    (Like runtime type idenfication in C++ and other languages).
    
    The operation required the following changes.
    
    * in htup.h
    - add the new attribute to the HeapTupleData structure. Remember to
      add a symbolic constant with the index of the system attribute.
      also remember to Adjust the FirstLowInvalidHeapAttribute constant
      accordingly.
    
    * in heaptuple.c
    - add offsetof new fields to the heap_sysoffset table
    - update the functions heap_attisnull, heap_sysattrlen, heap_sysattrbyval,
      heap_getsysattr to support the new system attribute
    
    * in heapam.c
    - for example in the function heap_insert initialize the new field.
      In my case I want the field to carry the oid of the relation into which
      the tuple is being inserted.
    
    * in heap.c
    - update the static array of AttributeTupleForms called HeapAtt with
      information about the new systemattribute.
      Make sure the name of your systemattribute isn't a postgresql
      reserve word -:).
    
    * in index.c
    - update the static array of FormData_pg_attribute called sysatts with
      information about the new systemattribute
    
    After making these modifcations the system passes all regression tests
    and seems to give the expected results.
    Of course it was tested using inheritance (since this is the only context
    in which the functionality offered makes any sense).
    
    Now my next goal is polymorphism.
    I want triggers to be more like polymorphic functions in OO languages.
    So that the definition of the trigger used only depend on the relation
    but also on the context which it is used.
    So it more closely follows the semantics of polymorphic methods.
    
    Don't worry I will try to ensure that poeple who don't like OO will not
    notice any difference in the semantics of the postgresql system.
    
    Thanks for your patience,
    Maurice