postgres-github.git / summary / log / commit / refs

commit    1fee0e857e330d148cf14b8d6027d02111841cf8
Author:   Alexander Korotkov <akorotkov@postgresql.org>
Date:     Thu May 14 09:21:03 2026 +0000

    Add tests for cross-session temp table access
    
    Add a TAP test in src/test/modules/test_misc that documents what
    happens when one session attempts to read or modify another session's
    temporary table.  This commit only adds tests; it does not change
    backend behavior, so the assertions reflect current behavior:
    
    - SELECT, UPDATE, DELETE, MERGE, COPY on a table without an index
      silently succeed with no error and zero rows / zero affected rows.
      These commands run through the read-stream path, which currently
      bypasses the RELATION_IS_OTHER_TEMP() check.  This is the
      underlying bug to be fixed in a follow-up.
    - INSERT errors with "cannot access temporary tables of other
      sessions" because hio.c calls ReadBufferExtended() to find a page
      with free space and is caught by the existing check there.
    - Index scan errors via the same existing check, reached through
      nbtree -> ReadBuffer -> ReadBufferExtended.
    - TRUNCATE / ALTER TABLE / ALTER INDEX / CLUSTER fail with their
      command-specific error messages.
    - VACUUM is silently skipped to avoid noise during database-wide
      VACUUM (vacuum_rel() returns without warning).
    - DROP TABLE is intentionally allowed: DROP does not touch the
      table's contents, and autovacuum relies on this to clean up
      temp relations orphaned by a crashed backend.
    - ALTER FUNCTION / DROP FUNCTION on an owner-created function over
      its own temp row type work as catalog operations -- they don't
      read the underlying data.
    - CREATE FUNCTION from a separate session, using another session's
      temp row type as an argument, is allowed but emits a NOTICE: the
      function is moved into the creator's pg_temp namespace with an
      auto-dependency on the borrowed type, so it disappears together
      with the session that created it.
    - A bare DROP TABLE on a temp table that has a cross-session
      dependent function fails with a catalog-level dependency error.
    - LOCK TABLE in ACCESS SHARE mode on another session's temp table
      succeeds and properly blocks the owner's session-exit cleanup
      (which acquires AccessExclusiveLock via findDependentObjects).
      This exercises the same LockRelationOid path used by autovacuum
      when cleaning up orphaned temp relations.
    - When the owner session ends, the normal session-exit cleanup
      cascades through DEPENDENCY_NORMAL and removes both the temp
      objects and any cross-session functions that depended on them.
    
    Also, document the contract for RELATION_IS_OTHER_TEMP() so that
    future buffer-access entry points enforce the same rule.
    
    Backpatch this through PostgreSQL 17, where b7b0f3f27241 introduces a code
    path bypassing this check.
    
    Author: Jim Jones <jim.jones@uni-muenster.de>
    Author: Daniil Davydov <3danissimo@gmail.com>
    Co-authored-by: Alexander Korotkov <aekorotkov@gmail.com>
    Reviewed-by: Michael Paquier <michael@paquier.xyz>
    Reviewed-by: Soumya S Murali <soumyamurali.work@gmail.com>
    Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
    Discussion: https://postgr.es/m/CAJDiXghdFcZ8%3Dnh4G69te7iRr3Q0uFyXxb3ZdG09_GTNZXwH0g%40mail.gmail.com
    Backpatch-through: 17

[parent: 5107398e6d5e]