Hello folks,

Stumbled across an odd problem while cleaning data out of a database.  I am 
getting these "invalid tid" errors.  I tried the upgrade from 7.3.2 to 7.3.4.  
I tried a dumpall/initdb/restore... nadda.  Nothing really usefull is coming 
from the logs either, even though logging is cranked up.  If anyone can 
suggest a method to track down the cause of the following dialog with the db, 
I would greatly appreciate it.  If you need any more info, please just ask.
Thank you in advance.
 -Wade


                               version                               
---------------------------------------------------------------------
 PostgreSQL 7.3.4 on i386-unknown-freebsd4.6, compiled by GCC 2.95.4
(-STABLE cvs from today)

dropsites=# begin;
BEGIN
dropsites=# delete from te_users where id = 954;
WARNING:  Error occurred while executing PL/pgSQL function c_delete_categories
WARNING:  line 14 at SQL statement
ERROR:  heap_mark4update: (am)invalid tid
dropsites=# rollback;  
ROLLBACK

                                        Table "public.te_users"
      Column       |            Type             |                      
Modifiers                      
-------------------+-----------------------------+-----------------------------------------------------
 id                | integer                     | not null default 
nextval('"te_users_id_seq"'::text)
 username          | text                        | not null
 password          | text                        | 
 reseller          | integer                     | not null default 0
 directory         | text                        | 
 contact           | integer                     | 
 creation_date     | timestamp with time zone    | default now()
 active            | boolean                     | not null default 'f'
 domain            | integer                     | not null default 0
 has_domain        | boolean                     | not null default 'f'
 tutorial_type     | integer                     | default -1
 tutorial_step     | integer                     | default -1
 license_agreement | boolean                     | default 'f'
 use_header        | integer                     | default 0
 promo             | boolean                     | not null default 'f'
 last_billed       | timestamp without time zone | default now()
Indexes: primary_fk primary key btree (username, "domain"),
         te_users_id_key unique btree (id),
         te_users_username_lower_idx btree (lower(username))

dropsites=# \d c_categories 
                             Table "public.c_categories"
   Column    |  Type   |                          Modifiers                           
-------------+---------+--------------------------------------------------------------
 id          | integer | not null default 
nextval('public.c_categories_id_seq'::text)
 category    | integer | not null default 0
 userid      | integer | not null
 form        | integer | not null
 name        | text    | 
 description | text    | 
 lft         | integer | 
 rgt         | integer | 
 level       | integer | 
 parentid    | integer | 
Indexes: c_categories_id_key unique btree (id)
Foreign Key constraints: $1 FOREIGN KEY (userid) REFERENCES te_users(id) ON 
UPDATE NO ACTION ON DELETE CASCADE,
                         $2 FOREIGN KEY (form) REFERENCES c_forms(id) ON 
UPDATE NO ACTION ON DELETE CASCADE,
                         c_categories_fk FOREIGN KEY (parentid) REFERENCES 
c_categories(id) ON UPDATE NO ACTION ON DELETE SET DEFAULT,
                         c_categories_cat_fk FOREIGN KEY (category) REFERENCES 
c_categories(id) ON UPDATE NO ACTION ON DELETE NO ACTION



--- Source of c_delete_categories ---
CREATE OR REPLACE FUNCTION c_delete_categories() returns TRIGGER AS '

  begin
    IF c_category_mutex() THEN
      -- delete entry
      DELETE FROM c_categories WHERE ID = old.id;
      
      IF (old.rgt - old.lft) > 1 THEN
        -- update children
        UPDATE c_categories SET ParentID = old.parentid WHERE ParentID = 
old.id;
        UPDATE c_categories SET lft = lft - 1, rgt = rgt - 1, level = level - 
1 WHERE lf
t > old.lft AND lft < old.rgt;
      END IF;

      -- remove extra space
      UPDATE c_categories SET lft = lft - 2 WHERE lft > old.rgt;
      UPDATE c_categories SET rgt = rgt - 2 WHERE rgt > old.rgt;
      PERFORM c_category_clear_mutex();
      return NULL;
    else
      return old;
    END IF;
  end;
' language 'plpgsql';

--- source of c_category_mutex ---
CREATE OR REPLACE FUNCTION c_category_mutex() returns BOOL AS '
  DECLARE
    mutex_count integer;
  BEGIN 

    SELECT INTO mutex_count COUNT(*) FROM pg_class c, pg_attribute a
      WHERE a.attrelid = c.oid
        AND c.relname = ''___c_category_mutex___''
        AND a.attname = ''___c_category_mutex___''
        AND pg_catalog.pg_table_is_visible ( c.oid );
   
    IF mutex_count > 0 THEN
      RETURN ''f'';
    ELSE
      CREATE TEMP TABLE ___c_category_mutex___ (___c_category_mutex___ INT2);
      RETURN ''t'';
    END IF;
  END;' LANGUAGE 'plpgsql';


--- source of c_category_clear_mutex ---
CREATE OR REPLACE FUNCTION c_category_clear_mutex() returns BOOL AS '
  DECLARE
    mutex_count         INT4;
  BEGIN

    SELECT INTO mutex_count COUNT(*) FROM pg_class c, pg_attribute a
      WHERE a.attrelid = c.oid
        AND c.relname = ''___c_category_mutex___''
        AND a.attname = ''___c_category_mutex___''
        AND pg_catalog.pg_table_is_visible ( c.oid );
   
    IF mutex_count > 0 THEN
      DROP TABLE ___c_category_mutex___;
      RETURN ''t'';
    ELSE
      RETURN ''f'';
    END IF;

  END;' LANGUAGE 'plpgsql';


-- 
Wade Klaver
Wavefire Technologies Corporation
GPG Public Key at http://archeron.wavefire.com

/"\   ASCII Ribbon Campaign  .
\ / - NO HTML/RTF in e-mail  .
 X  - NO Word docs in e-mail .
/ \ -----------------------------------------------------------------


---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
      joining column's datatypes do not match

Reply via email to