• Robert Haas's avatar
    Fix problems with "read only query" checks, and refactor the code. · 2eb34ac3
    Robert Haas authored
    Previously, check_xact_readonly() was responsible for determining
    which types of queries could not be run in a read-only transaction,
    standard_ProcessUtility() was responsibility for prohibiting things
    which were allowed in read only transactions but not in recovery, and
    utility commands were basically prohibited in bulk in parallel mode by
    calls to CommandIsReadOnly() in functions.c and spi.c.  This situation
    was confusing and error-prone. Accordingly, move all the checks to a
    new function ClassifyUtilityCommandAsReadOnly(), which determines the
    degree to which a given statement is read only.
    
    In the old code, check_xact_readonly() inadvertently failed to handle
    several statement types that actually should have been prohibited,
    specifically T_CreatePolicyStmt, T_AlterPolicyStmt, T_CreateAmStmt,
    T_CreateStatsStmt, T_AlterStatsStmt, and T_AlterCollationStmt.  As a
    result, thes statements were erroneously allowed in read only
    transactions, parallel queries, and standby operation. Generally, they
    would fail anyway due to some lower-level error check, but we
    shouldn't rely on that.  In the new code structure, future omissions
    of this type should cause ClassifyUtilityCommandAsReadOnly() to
    complain about an unrecognized node type.
    
    As a fringe benefit, this means we can allow certain types of utility
    commands in parallel mode, where it's safe to do so. This allows
    ALTER SYSTEM, CALL, DO, CHECKPOINT, COPY FROM, EXPLAIN, and SHOW.
    It might be possible to allow additional commands with more work
    and thought.
    
    Along the way, document the thinking process behind the current set
    of checks, as per discussion especially with Peter Eisentraut. There
    is some interest in revising some of these rules, but that seems
    like a job for another patch.
    
    Patch by me, reviewed by Tom Lane, Stephen Frost, and Peter
    Eisentraut.
    
    Discussion: http://postgr.es/m/CA+TgmoZ_rLqJt5sYkvh+JpQnfX0Y+B2R+qfi820xNih6x-FQOQ@mail.gmail.com
    2eb34ac3
spi.c 73 KB