Add some const qualifiers enabled by typeof_unqual change on copyObject master github/master
authorPeter Eisentraut <peter@eisentraut.org>
Thu, 19 Mar 2026 05:34:27 +0000 (06:34 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Thu, 19 Mar 2026 05:35:54 +0000 (06:35 +0100)
The recent commit to change copyObject() to use typeof_unqual allows
cleaning up some APIs to take advantage of this improved qualifier
handling.  EventTriggerCollectSimpleCommand() is a good example: It
takes a node tree and makes a copy that it keeps around for its
internal purposes, but it can't communicate via its function signature
that it promises not scribble on the passed node tree.  That is now
fixed.

Reviewed-by: David Geier <geidav.pg@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/92f9750f-c7f6-42d8-9a4a-85a3cbe808f3%40eisentraut.org

13 files changed:
src/backend/catalog/index.c
src/backend/commands/event_trigger.c
src/backend/commands/indexcmds.c
src/backend/commands/trigger.c
src/backend/optimizer/prep/prepjointree.c
src/backend/partitioning/partprune.c
src/backend/rewrite/rewriteManip.c
src/backend/utils/cache/plancache.c
src/include/commands/defrem.h
src/include/commands/event_trigger.h
src/include/commands/trigger.h
src/include/rewrite/rewriteManip.h
src/include/utils/plancache.h

index 8b3c60d91f92622d6a4351611a167e7e817ef717..d8219b18c489bd46d06d667b86c5a1e93d475038 100644 (file)
@@ -3708,7 +3708,7 @@ reindex_index(const ReindexStmt *stmt, Oid indexId,
        ObjectAddressSet(address, RelationRelationId, indexId);
        EventTriggerCollectSimpleCommand(address,
                                         InvalidObjectAddress,
-                                        (Node *) stmt);
+                                        (const Node *) stmt);
    }
 
    /*
index ace8eca1f98465a5f084008c40e0a3f1bd9a028e..ecd2e929f8ddf76c20bde9c14512238d255cf06d 100644 (file)
@@ -1715,7 +1715,7 @@ EventTriggerUndoInhibitCommandCollection(void)
 void
 EventTriggerCollectSimpleCommand(ObjectAddress address,
                                 ObjectAddress secondaryObject,
-                                Node *parsetree)
+                                const Node *parsetree)
 {
    MemoryContext oldcxt;
    CollectedCommand *command;
@@ -1751,7 +1751,7 @@ EventTriggerCollectSimpleCommand(ObjectAddress address,
  * add it to the command list.
  */
 void
-EventTriggerAlterTableStart(Node *parsetree)
+EventTriggerAlterTableStart(const Node *parsetree)
 {
    MemoryContext oldcxt;
    CollectedCommand *command;
@@ -1803,7 +1803,7 @@ EventTriggerAlterTableRelid(Oid objectId)
  * internally, so that's all that this code needs to handle at the moment.
  */
 void
-EventTriggerCollectAlterTableSubcmd(Node *subcmd, ObjectAddress address)
+EventTriggerCollectAlterTableSubcmd(const Node *subcmd, ObjectAddress address)
 {
    MemoryContext oldcxt;
    CollectedATSubcmd *newsub;
@@ -1920,7 +1920,7 @@ EventTriggerCollectGrant(InternalGrant *istmt)
  *     executed
  */
 void
-EventTriggerCollectAlterOpFam(AlterOpFamilyStmt *stmt, Oid opfamoid,
+EventTriggerCollectAlterOpFam(const AlterOpFamilyStmt *stmt, Oid opfamoid,
                              List *operators, List *procedures)
 {
    MemoryContext oldcxt;
@@ -1953,7 +1953,7 @@ EventTriggerCollectAlterOpFam(AlterOpFamilyStmt *stmt, Oid opfamoid,
  *     Save data about a CREATE OPERATOR CLASS command being executed
  */
 void
-EventTriggerCollectCreateOpClass(CreateOpClassStmt *stmt, Oid opcoid,
+EventTriggerCollectCreateOpClass(const CreateOpClassStmt *stmt, Oid opcoid,
                                 List *operators, List *procedures)
 {
    MemoryContext oldcxt;
@@ -1987,7 +1987,7 @@ EventTriggerCollectCreateOpClass(CreateOpClassStmt *stmt, Oid opcoid,
  *     executed
  */
 void
-EventTriggerCollectAlterTSConfig(AlterTSConfigurationStmt *stmt, Oid cfgId,
+EventTriggerCollectAlterTSConfig(const AlterTSConfigurationStmt *stmt, Oid cfgId,
                                 Oid *dictIds, int ndicts)
 {
    MemoryContext oldcxt;
@@ -2025,7 +2025,7 @@ EventTriggerCollectAlterTSConfig(AlterTSConfigurationStmt *stmt, Oid cfgId,
  *     executed
  */
 void
-EventTriggerCollectAlterDefPrivs(AlterDefaultPrivilegesStmt *stmt)
+EventTriggerCollectAlterDefPrivs(const AlterDefaultPrivilegesStmt *stmt)
 {
    MemoryContext oldcxt;
    CollectedCommand *command;
index cbd76066f74692580b0a3fd8d4f477e88132be1a..b89c6855364947de86b787aaf0ff22bd3a5c26f6 100644 (file)
@@ -544,7 +544,7 @@ WaitForOlderSnapshots(TransactionId limitXmin, bool progress)
 ObjectAddress
 DefineIndex(ParseState *pstate,
            Oid tableId,
-           IndexStmt *stmt,
+           const IndexStmt *stmt,
            Oid indexRelationId,
            Oid parentIndexId,
            Oid parentConstraintId,
@@ -4048,7 +4048,7 @@ ReindexRelationConcurrently(const ReindexStmt *stmt, Oid relationOid, const Rein
            ObjectAddressSet(address, RelationRelationId, newIndexId);
            EventTriggerCollectSimpleCommand(address,
                                             InvalidObjectAddress,
-                                            (Node *) stmt);
+                                            (const Node *) stmt);
        }
    }
 
index 9c0438a125a5e947c186c995282cf0982861a166..6596843a8d85f4aba98a08bc20bc5936881269d6 100644 (file)
@@ -159,7 +159,7 @@ static HeapTuple check_modified_virtual_generated(TupleDesc tupdesc, HeapTuple t
  * (but see CloneRowTriggersToPartition).
  */
 ObjectAddress
-CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
+CreateTrigger(const CreateTrigStmt *stmt, const char *queryString,
              Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid,
              Oid funcoid, Oid parentTriggerOid, Node *whenClause,
              bool isInternal, bool in_partition)
@@ -176,7 +176,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
  * (always/origin/replica/disabled) can be specified.
  */
 ObjectAddress
-CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString,
+CreateTriggerFiringOn(const CreateTrigStmt *stmt, const char *queryString,
                      Oid relOid, Oid refRelOid, Oid constraintOid,
                      Oid indexOid, Oid funcoid, Oid parentTriggerOid,
                      Node *whenClause, bool isInternal, bool in_partition,
index 0e77114efc8984c73fc3c6ec3247eb1cf192a633..d5e1041ffa332819c8ff84191cb5759cc4021778 100644 (file)
@@ -150,7 +150,7 @@ static void replace_vars_in_jointree(Node *jtnode,
                                     pullup_replace_vars_context *context);
 static Node *pullup_replace_vars(Node *expr,
                                 pullup_replace_vars_context *context);
-static Node *pullup_replace_vars_callback(Var *var,
+static Node *pullup_replace_vars_callback(const Var *var,
                                          replace_rte_variables_context *context);
 static Query *pullup_replace_vars_subquery(Query *query,
                                           pullup_replace_vars_context *context);
@@ -2761,7 +2761,7 @@ pullup_replace_vars(Node *expr, pullup_replace_vars_context *context)
 }
 
 static Node *
-pullup_replace_vars_callback(Var *var,
+pullup_replace_vars_callback(const Var *var,
                             replace_rte_variables_context *context)
 {
    pullup_replace_vars_context *rcon = (pullup_replace_vars_context *) context->callback_arg;
index 6d979a08fd3eeab913cdde3c2392737a2eb5dc7b..db1dd153ddb5c58fdceb9b82d09aa3fb3ae2c6f9 100644 (file)
@@ -158,7 +158,7 @@ static PartitionPruneStep *gen_prune_step_combine(GeneratePruningStepsContext *c
 static List *gen_prune_steps_from_opexps(GeneratePruningStepsContext *context,
                                         List **keyclauses, Bitmapset *nullkeys);
 static PartClauseMatchStatus match_clause_to_partition_key(GeneratePruningStepsContext *context,
-                                                          Expr *clause, Expr *partkey, int partkeyidx,
+                                                          const Expr *clause, const Expr *partkey, int partkeyidx,
                                                           bool *clause_is_not_null,
                                                           PartClauseInfo **pc, List **clause_steps);
 static List *get_steps_using_prefix(GeneratePruningStepsContext *context,
@@ -196,8 +196,8 @@ static PruneStepResult *perform_pruning_combine_step(PartitionPruneContext *cont
                                                     PartitionPruneStepCombine *cstep,
                                                     PruneStepResult **step_results);
 static PartClauseMatchStatus match_boolean_partition_clause(Oid partopfamily,
-                                                           Expr *clause,
-                                                           Expr *partkey,
+                                                           const Expr *clause,
+                                                           const Expr *partkey,
                                                            Expr **outconst,
                                                            bool *notclause);
 static void partkey_datum_from_expr(PartitionPruneContext *context,
@@ -1816,7 +1816,7 @@ gen_prune_steps_from_opexps(GeneratePruningStepsContext *context,
  */
 static PartClauseMatchStatus
 match_clause_to_partition_key(GeneratePruningStepsContext *context,
-                             Expr *clause, Expr *partkey, int partkeyidx,
+                             const Expr *clause, const Expr *partkey, int partkeyidx,
                              bool *clause_is_not_null, PartClauseInfo **pc,
                              List **clause_steps)
 {
@@ -3697,10 +3697,10 @@ perform_pruning_combine_step(PartitionPruneContext *context,
  * 'partkey'.
  */
 static PartClauseMatchStatus
-match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey,
+match_boolean_partition_clause(Oid partopfamily, const Expr *clause, const Expr *partkey,
                               Expr **outconst, bool *notclause)
 {
-   Expr       *leftop;
+   const Expr *leftop;
 
    *outconst = NULL;
    *notclause = false;
index fe89754a73ce4d4487533005d1ef4a102df7c0c0..5282f60e5312d0d80b605df21ef27a3a454e83a9 100644 (file)
@@ -1769,7 +1769,7 @@ typedef struct
 } ReplaceVarsFromTargetList_context;
 
 static Node *
-ReplaceVarsFromTargetList_callback(Var *var,
+ReplaceVarsFromTargetList_callback(const Var *var,
                                   replace_rte_variables_context *context)
 {
    ReplaceVarsFromTargetList_context *rcon = (ReplaceVarsFromTargetList_context *) context->callback_arg;
@@ -1790,7 +1790,7 @@ ReplaceVarsFromTargetList_callback(Var *var,
 }
 
 Node *
-ReplaceVarFromTargetList(Var *var,
+ReplaceVarFromTargetList(const Var *var,
                         RangeTblEntry *target_rte,
                         List *targetlist,
                         int result_relation,
@@ -1876,11 +1876,14 @@ ReplaceVarFromTargetList(Var *var,
                break;
 
            case REPLACEVARS_CHANGE_VARNO:
-               var = copyObject(var);
-               var->varno = nomatch_varno;
-               var->varlevelsup = 0;
-               /* we leave the syntactic referent alone */
-               return (Node *) var;
+               {
+                   Var        *newvar = copyObject(var);
+
+                   newvar->varno = nomatch_varno;
+                   newvar->varlevelsup = 0;
+                   /* we leave the syntactic referent alone */
+                   return (Node *) newvar;
+               }
 
            case REPLACEVARS_SUBSTITUTE_NULL:
                {
index 182c16e9b9a1a0a8110e70c0ead211ffbb8262b3..698e7c1aa220f21bd7231d1d2006f23c9d50d179 100644 (file)
@@ -182,7 +182,7 @@ InitPlanCache(void)
  * commandTag: command tag for query, or UNKNOWN if empty query
  */
 CachedPlanSource *
-CreateCachedPlan(RawStmt *raw_parse_tree,
+CreateCachedPlan(const RawStmt *raw_parse_tree,
                 const char *query_string,
                 CommandTag commandTag)
 {
index 8f4a2d9bbc1ce2d531725ee8631c76570fc8df02..d080ad59b71ff70c4b4b901de66e7ec3f2d3f184 100644 (file)
@@ -27,7 +27,7 @@ extern void RemoveObjects(DropStmt *stmt);
 /* commands/indexcmds.c */
 extern ObjectAddress DefineIndex(ParseState *pstate,
                                 Oid tableId,
-                                IndexStmt *stmt,
+                                const IndexStmt *stmt,
                                 Oid indexRelationId,
                                 Oid parentIndexId,
                                 Oid parentConstraintId,
index c662782bb1e85ff7a87a8bc09bbbf2a90639e31f..27340655061f0f98de21c9f48c220733d92e10e0 100644 (file)
@@ -75,23 +75,23 @@ extern void EventTriggerUndoInhibitCommandCollection(void);
 
 extern void EventTriggerCollectSimpleCommand(ObjectAddress address,
                                             ObjectAddress secondaryObject,
-                                            Node *parsetree);
+                                            const Node *parsetree);
 
-extern void EventTriggerAlterTableStart(Node *parsetree);
+extern void EventTriggerAlterTableStart(const Node *parsetree);
 extern void EventTriggerAlterTableRelid(Oid objectId);
-extern void EventTriggerCollectAlterTableSubcmd(Node *subcmd,
+extern void EventTriggerCollectAlterTableSubcmd(const Node *subcmd,
                                                ObjectAddress address);
 extern void EventTriggerAlterTableEnd(void);
 
 extern void EventTriggerCollectGrant(InternalGrant *istmt);
-extern void EventTriggerCollectAlterOpFam(AlterOpFamilyStmt *stmt,
+extern void EventTriggerCollectAlterOpFam(const AlterOpFamilyStmt *stmt,
                                          Oid opfamoid, List *operators,
                                          List *procedures);
-extern void EventTriggerCollectCreateOpClass(CreateOpClassStmt *stmt,
+extern void EventTriggerCollectCreateOpClass(const CreateOpClassStmt *stmt,
                                             Oid opcoid, List *operators,
                                             List *procedures);
-extern void EventTriggerCollectAlterTSConfig(AlterTSConfigurationStmt *stmt,
+extern void EventTriggerCollectAlterTSConfig(const AlterTSConfigurationStmt *stmt,
                                             Oid cfgId, Oid *dictIds, int ndicts);
-extern void EventTriggerCollectAlterDefPrivs(AlterDefaultPrivilegesStmt *stmt);
+extern void EventTriggerCollectAlterDefPrivs(const AlterDefaultPrivilegesStmt *stmt);
 
 #endif                         /* EVENT_TRIGGER_H */
index 556c86bf5e1744fa55743956407f0645f1f0da2f..27af5284406c9210faf476fb67db2ede4c832b94 100644 (file)
@@ -153,11 +153,11 @@ extern PGDLLIMPORT int SessionReplicationRole;
 #define TRIGGER_FIRES_ON_REPLICA           'R'
 #define TRIGGER_DISABLED                   'D'
 
-extern ObjectAddress CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
+extern ObjectAddress CreateTrigger(const CreateTrigStmt *stmt, const char *queryString,
                                   Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid,
                                   Oid funcoid, Oid parentTriggerOid, Node *whenClause,
                                   bool isInternal, bool in_partition);
-extern ObjectAddress CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString,
+extern ObjectAddress CreateTriggerFiringOn(const CreateTrigStmt *stmt, const char *queryString,
                                           Oid relOid, Oid refRelOid, Oid constraintOid,
                                           Oid indexOid, Oid funcoid, Oid parentTriggerOid,
                                           Node *whenClause, bool isInternal, bool in_partition,
index f8216c22fb7ace354c18c8db7fec0c6ae36d420a..a6d4e888e060095283194371524df3e84ddf7ced 100644 (file)
@@ -22,7 +22,7 @@ typedef struct AttrMap AttrMap; /* avoid including attmap.h here */
 
 typedef struct replace_rte_variables_context replace_rte_variables_context;
 
-typedef Node *(*replace_rte_variables_callback) (Var *var,
+typedef Node *(*replace_rte_variables_callback) (const Var *var,
                                                 replace_rte_variables_context *context);
 
 struct replace_rte_variables_context
@@ -104,7 +104,7 @@ extern Node *map_variable_attnos(Node *node,
                                 const AttrMap *attno_map,
                                 Oid to_rowtype, bool *found_whole_row);
 
-extern Node *ReplaceVarFromTargetList(Var *var,
+extern Node *ReplaceVarFromTargetList(const Var *var,
                                      RangeTblEntry *target_rte,
                                      List *targetlist,
                                      int result_relation,
index 984c51515c6d17df4c160f675bbe343426e3cbe3..7a4a85c803835ae54de38e707499c47804cf391b 100644 (file)
@@ -202,7 +202,7 @@ extern void ResetPlanCache(void);
 
 extern void ReleaseAllPlanCacheRefsInOwner(ResourceOwner owner);
 
-extern CachedPlanSource *CreateCachedPlan(RawStmt *raw_parse_tree,
+extern CachedPlanSource *CreateCachedPlan(const RawStmt *raw_parse_tree,
                                          const char *query_string,
                                          CommandTag commandTag);
 extern CachedPlanSource *CreateCachedPlanForQuery(Query *analyzed_parse_tree,