]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Make SPI_prepare argtypes argument const
authorPeter Eisentraut <peter@eisentraut.org>
Tue, 30 Jun 2026 13:43:56 +0000 (15:43 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Tue, 30 Jun 2026 13:43:56 +0000 (15:43 +0200)
This changes the argtypes argument of SPI_prepare(),
SPI_prepare_cursor(), SPI_cursor_open_with_args(), and
SPI_execute_with_args() from Oid *argtypes to const Oid *argtypes.
The underlying functions were already receptive to that, so this
doesn't require any significant changes beyond the function signatures
and some internal variables.

Commit 28972b6fc3dc recently introduced a case where a const had to be
cast away before calling these functions.  This is fixed here.

In passing, make a very similar const addition to SPI_modifytuple().

Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Reviewed-by: Ewan Young <kdbase.hack@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/86b5162f-c472-40fa-997b-0450dece1dec%40eisentraut.org

contrib/postgres_fdw/postgres_fdw.c
doc/src/sgml/spi.sgml
src/backend/executor/spi.c
src/backend/utils/adt/ri_triggers.c
src/backend/utils/cache/plancache.c
src/include/executor/spi.h
src/include/executor/spi_priv.h
src/include/utils/plancache.h

index 6dbae583ecc4f91e00e778eb9e38de63789d2b1b..6fa45773c30d68e0ec78abf6f8843cfc6fba5381 100644 (file)
@@ -6164,12 +6164,12 @@ import_fetched_statistics(const char *schemaname,
                Assert(PQntuples(remstats->att) >= 1);
 
                attimport_plan = SPI_prepare(attimport_sql, ATTIMPORT_SQL_NUM_FIELDS,
-                                                                        (Oid *) attimport_argtypes);
+                                                                        attimport_argtypes);
                if (attimport_plan == NULL)
                        elog(ERROR, "failed to prepare attimport_sql query");
 
                attclear_plan = SPI_prepare(attclear_sql, ATTCLEAR_SQL_NUM_FIELDS,
-                                                                       (Oid *) attclear_argtypes);
+                                                                       attclear_argtypes);
                if (attclear_plan == NULL)
                        elog(ERROR, "failed to prepare attclear_sql query");
 
@@ -6247,7 +6247,7 @@ import_fetched_statistics(const char *schemaname,
 
        spirc = SPI_execute_with_args(relimport_sql,
                                                                  RELIMPORT_SQL_NUM_FIELDS,
-                                                                 (Oid *) relimport_argtypes,
+                                                                 relimport_argtypes,
                                                                  values, nulls, false, 1);
        if (spirc != SPI_OK_SELECT)
                elog(ERROR, "failed to execute relimport_sql query for foreign table \"%s.%s\"",
index 179cceb8da947b550ce33eecdfbf38ce0aad2e6d..5846fcceb8976dccaa957826a01becc971fd184e 100644 (file)
@@ -845,7 +845,7 @@ int SPI_execute_extended(const char *<parameter>command</parameter>,
  <refsynopsisdiv>
 <synopsis>
 int SPI_execute_with_args(const char *<parameter>command</parameter>,
-                          int <parameter>nargs</parameter>, Oid *<parameter>argtypes</parameter>,
+                          int <parameter>nargs</parameter>, const Oid *<parameter>argtypes</parameter>,
                           const Datum *<parameter>values</parameter>, const char *<parameter>nulls</parameter>,
                           bool <parameter>read_only</parameter>, long <parameter>count</parameter>)
 </synopsis>
@@ -997,7 +997,7 @@ int SPI_execute_with_args(const char *<parameter>command</parameter>,
 
  <refsynopsisdiv>
 <synopsis>
-SPIPlanPtr SPI_prepare(const char * <parameter>command</parameter>, int <parameter>nargs</parameter>, Oid * <parameter>argtypes</parameter>)
+SPIPlanPtr SPI_prepare(const char * <parameter>command</parameter>, int <parameter>nargs</parameter>, const Oid * <parameter>argtypes</parameter>)
 </synopsis>
  </refsynopsisdiv>
 
@@ -1160,7 +1160,7 @@ SPIPlanPtr SPI_prepare(const char * <parameter>command</parameter>, int <paramet
  <refsynopsisdiv>
 <synopsis>
 SPIPlanPtr SPI_prepare_cursor(const char * <parameter>command</parameter>, int <parameter>nargs</parameter>,
-                              Oid * <parameter>argtypes</parameter>, int <parameter>cursorOptions</parameter>)
+                              const Oid * <parameter>argtypes</parameter>, int <parameter>cursorOptions</parameter>)
 </synopsis>
  </refsynopsisdiv>
 
@@ -2316,7 +2316,7 @@ Portal SPI_cursor_open(const char * <parameter>name</parameter>, SPIPlanPtr <par
 <synopsis>
 Portal SPI_cursor_open_with_args(const char *<parameter>name</parameter>,
                                  const char *<parameter>command</parameter>,
-                                 int <parameter>nargs</parameter>, Oid *<parameter>argtypes</parameter>,
+                                 int <parameter>nargs</parameter>, const Oid *<parameter>argtypes</parameter>,
                                  const Datum *<parameter>values</parameter>, const char *<parameter>nulls</parameter>,
                                  bool <parameter>read_only</parameter>, int <parameter>cursorOptions</parameter>)
 </synopsis>
@@ -4694,7 +4694,7 @@ HeapTupleHeader SPI_returntuple(HeapTuple <parameter>row</parameter>, TupleDesc
  <refsynopsisdiv>
 <synopsis>
 HeapTuple SPI_modifytuple(Relation <parameter>rel</parameter>, HeapTuple <parameter>row</parameter>, int <parameter>ncols</parameter>,
-                          int * <parameter>colnum</parameter>, const Datum * <parameter>values</parameter>, const char * <parameter>nulls</parameter>)
+                          const int * <parameter>colnum</parameter>, const Datum * <parameter>values</parameter>, const char * <parameter>nulls</parameter>)
 </synopsis>
  </refsynopsisdiv>
 
index 4e52542a3d17f825897d9abdfd41bbd536457524..23a8395766c303177c23d71f2decf34c3e7ccba4 100644 (file)
@@ -68,7 +68,7 @@ static int    _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options,
                                                          Snapshot snapshot, Snapshot crosscheck_snapshot,
                                                          bool fire_triggers);
 
-static ParamListInfo _SPI_convert_params(int nargs, Oid *argtypes,
+static ParamListInfo _SPI_convert_params(int nargs, const Oid *argtypes,
                                                                                 const Datum *Values, const char *Nulls);
 
 static int     _SPI_pquery(QueryDesc *queryDesc, bool fire_triggers, uint64 tcount);
@@ -811,7 +811,7 @@ SPI_execute_snapshot(SPIPlanPtr plan,
  */
 int
 SPI_execute_with_args(const char *src,
-                                         int nargs, Oid *argtypes,
+                                         int nargs, const Oid *argtypes,
                                          const Datum *Values, const char *Nulls,
                                          bool read_only, long tcount)
 {
@@ -858,13 +858,13 @@ SPI_execute_with_args(const char *src,
 }
 
 SPIPlanPtr
-SPI_prepare(const char *src, int nargs, Oid *argtypes)
+SPI_prepare(const char *src, int nargs, const Oid *argtypes)
 {
        return SPI_prepare_cursor(src, nargs, argtypes, 0);
 }
 
 SPIPlanPtr
-SPI_prepare_cursor(const char *src, int nargs, Oid *argtypes,
+SPI_prepare_cursor(const char *src, int nargs, const Oid *argtypes,
                                   int cursorOptions)
 {
        _SPI_plan       plan;
@@ -1104,7 +1104,7 @@ SPI_returntuple(HeapTuple tuple, TupleDesc tupdesc)
 }
 
 HeapTuple
-SPI_modifytuple(Relation rel, HeapTuple tuple, int natts, int *attnum,
+SPI_modifytuple(Relation rel, HeapTuple tuple, int natts, const int *attnum,
                                const Datum *Values, const char *Nulls)
 {
        MemoryContext oldcxt;
@@ -1472,7 +1472,7 @@ SPI_cursor_open(const char *name, SPIPlanPtr plan,
 Portal
 SPI_cursor_open_with_args(const char *name,
                                                  const char *src,
-                                                 int nargs, Oid *argtypes,
+                                                 int nargs, const Oid *argtypes,
                                                  const Datum *Values, const char *Nulls,
                                                  bool read_only, int cursorOptions)
 {
@@ -2846,7 +2846,7 @@ fail:
  * Convert arrays of query parameters to form wanted by planner and executor
  */
 static ParamListInfo
-_SPI_convert_params(int nargs, Oid *argtypes,
+_SPI_convert_params(int nargs, const Oid *argtypes,
                                        const Datum *Values, const char *Nulls)
 {
        ParamListInfo paramLI;
@@ -3170,8 +3170,11 @@ _SPI_make_plan_non_temp(SPIPlanPtr plan)
        newplan->nargs = plan->nargs;
        if (plan->nargs > 0)
        {
-               newplan->argtypes = palloc_array(Oid, plan->nargs);
-               memcpy(newplan->argtypes, plan->argtypes, plan->nargs * sizeof(Oid));
+               Oid                *newplan_argtypes;
+
+               newplan_argtypes = palloc_array(Oid, plan->nargs);
+               memcpy(newplan_argtypes, plan->argtypes, plan->nargs * sizeof(Oid));
+               newplan->argtypes = newplan_argtypes;
        }
        else
                newplan->argtypes = NULL;
@@ -3235,8 +3238,11 @@ _SPI_save_plan(SPIPlanPtr plan)
        newplan->nargs = plan->nargs;
        if (plan->nargs > 0)
        {
-               newplan->argtypes = palloc_array(Oid, plan->nargs);
-               memcpy(newplan->argtypes, plan->argtypes, plan->nargs * sizeof(Oid));
+               Oid                *newplan_argtypes;
+
+               newplan_argtypes = palloc_array(Oid, plan->nargs);
+               memcpy(newplan_argtypes, plan->argtypes, plan->nargs * sizeof(Oid));
+               newplan->argtypes = newplan_argtypes;
        }
        else
                newplan->argtypes = NULL;
index bf54f9b459243fcd207bbd00525739ce83e9f426..627a9fb38ea37f6e3a777103c904b8a2a7d6d848 100644 (file)
@@ -308,7 +308,7 @@ static RI_ConstraintInfo *ri_FetchConstraintInfo(Trigger *trigger,
                                                                                                 Relation trig_rel, bool rel_is_pk);
 static RI_ConstraintInfo *ri_LoadConstraintInfo(Oid constraintOid);
 static Oid     get_ri_constraint_root(Oid constrOid);
-static SPIPlanPtr ri_PlanCheck(const char *querystr, int nargs, Oid *argtypes,
+static SPIPlanPtr ri_PlanCheck(const char *querystr, int nargs, const Oid *argtypes,
                                                           RI_QueryKey *qkey, Relation fk_rel, Relation pk_rel);
 static bool ri_PerformCheck(const RI_ConstraintInfo *riinfo,
                                                        RI_QueryKey *qkey, SPIPlanPtr qplan,
@@ -2605,7 +2605,7 @@ InvalidateConstraintCacheCallBack(Datum arg, SysCacheIdentifier cacheid,
  * Prepare execution plan for a query to enforce an RI restriction
  */
 static SPIPlanPtr
-ri_PlanCheck(const char *querystr, int nargs, Oid *argtypes,
+ri_PlanCheck(const char *querystr, int nargs, const Oid *argtypes,
                         RI_QueryKey *qkey, Relation fk_rel, Relation pk_rel)
 {
        SPIPlanPtr      qplan;
index 698e7c1aa220f21bd7231d1d2006f23c9d50d179..26f1bd6451534aa699fd514d19ffa800c169cb3b 100644 (file)
@@ -393,7 +393,7 @@ void
 CompleteCachedPlan(CachedPlanSource *plansource,
                                   List *querytree_list,
                                   MemoryContext querytree_context,
-                                  Oid *param_types,
+                                  const Oid *param_types,
                                   int num_params,
                                   ParserSetupHook parserSetup,
                                   void *parserSetupArg,
index fd79f86a98c239e901326b1e510d76c399b7299d..c7a3b7abb260944985da4343c61d65b6e9fea3c9 100644 (file)
@@ -127,11 +127,11 @@ extern int        SPI_execute_snapshot(SPIPlanPtr plan,
                                                                 Snapshot crosscheck_snapshot,
                                                                 bool read_only, bool fire_triggers, long tcount);
 extern int     SPI_execute_with_args(const char *src,
-                                                                 int nargs, Oid *argtypes,
+                                                                 int nargs, const Oid *argtypes,
                                                                  const Datum *Values, const char *Nulls,
                                                                  bool read_only, long tcount);
-extern SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes);
-extern SPIPlanPtr SPI_prepare_cursor(const char *src, int nargs, Oid *argtypes,
+extern SPIPlanPtr SPI_prepare(const char *src, int nargs, const Oid *argtypes);
+extern SPIPlanPtr SPI_prepare_cursor(const char *src, int nargs, const Oid *argtypes,
                                                                         int cursorOptions);
 extern SPIPlanPtr SPI_prepare_extended(const char *src,
                                                                           const SPIPrepareOptions *options);
@@ -155,7 +155,7 @@ extern CachedPlan *SPI_plan_get_cached_plan(SPIPlanPtr plan);
 extern HeapTuple SPI_copytuple(HeapTuple tuple);
 extern HeapTupleHeader SPI_returntuple(HeapTuple tuple, TupleDesc tupdesc);
 extern HeapTuple SPI_modifytuple(Relation rel, HeapTuple tuple, int natts,
-                                                                int *attnum, const Datum *Values, const char *Nulls);
+                                                                const int *attnum, const Datum *Values, const char *Nulls);
 extern int     SPI_fnumber(TupleDesc tupdesc, const char *fname);
 extern char *SPI_fname(TupleDesc tupdesc, int fnumber);
 extern char *SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber);
@@ -175,7 +175,7 @@ extern Portal SPI_cursor_open(const char *name, SPIPlanPtr plan,
                                                          const Datum *Values, const char *Nulls, bool read_only);
 extern Portal SPI_cursor_open_with_args(const char *name,
                                                                                const char *src,
-                                                                               int nargs, Oid *argtypes,
+                                                                               int nargs, const Oid *argtypes,
                                                                                const Datum *Values, const char *Nulls,
                                                                                bool read_only, int cursorOptions);
 extern Portal SPI_cursor_open_with_paramlist(const char *name, SPIPlanPtr plan,
index 240383b97b9db5c0c982c2f1e70456b65ca73fcb..9fb82ad0984220bc1bec0d88dd81cf38d39da90b 100644 (file)
@@ -97,7 +97,7 @@ typedef struct _SPI_plan
        RawParseMode parse_mode;        /* raw_parser() mode */
        int                     cursor_options; /* Cursor options used for planning */
        int                     nargs;                  /* number of plan arguments */
-       Oid                *argtypes;           /* Argument types (NULL if nargs is 0) */
+       const Oid  *argtypes;           /* Argument types (NULL if nargs is 0) */
        ParserSetupHook parserSetup;    /* alternative parameter spec method */
        void       *parserSetupArg;
 } _SPI_plan;
index 7a4a85c803835ae54de38e707499c47804cf391b..a0355e79c28359b878a72913f84b885586a99da5 100644 (file)
@@ -214,7 +214,7 @@ extern CachedPlanSource *CreateOneShotCachedPlan(RawStmt *raw_parse_tree,
 extern void CompleteCachedPlan(CachedPlanSource *plansource,
                                                           List *querytree_list,
                                                           MemoryContext querytree_context,
-                                                          Oid *param_types,
+                                                          const Oid *param_types,
                                                           int num_params,
                                                           ParserSetupHook parserSetup,
                                                           void *parserSetupArg,