agora inbox for pgsql-hackers@postgresql.org  
help / color / mirror / Atom feed
s/pg_attribute_always_inline/pg_always_inline/?
18+ messages / 6 participants
[nested] [flat]

* s/pg_attribute_always_inline/pg_always_inline/?
@ 2026-04-08 21:09 Andres Freund <andres@anarazel.de>
  2026-04-08 21:30 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  0 siblings, 2 replies; 18+ messages in thread

From: Andres Freund @ 2026-04-08 21:09 UTC (permalink / raw)
  To: pgsql-hackers

Hi,

When reviewing the index prefetching patch I got a bit dismayed at how long
pg_attribute_always_inline is due to the way it triggers pgindent to format
stuff.

I propose that we remove the _attribute_ part of the name.

Given that it is implemented for compilers that don't use the
__attribute__((always_inline)) spelling, so the shorter name seems better
anyway.

Thoughts?

Greetings,

Andres Freund

Attachments:

  [text/x-diff] v1-0001-Shorten-pg_attribute_always_inline-to-pg_always_i.patch (22.7K, ../../bqqdehahpoa36igpictuqyn2s2mexk3t3ehidh2ffd2slb35e5@rzgksuiszgbg/2-v1-0001-Shorten-pg_attribute_always_inline-to-pg_always_i.patch)
  download | inline diff:
From 0ae1b26130652306c97f811a05e3013540156423 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 8 Apr 2026 17:07:53 -0400
Subject: [PATCH v1] Shorten pg_attribute_always_inline to pg_always_inline

---
 src/include/c.h                       |  8 +++---
 src/include/executor/execScan.h       |  8 +++---
 src/include/portability/instr_time.h  |  8 +++---
 src/backend/access/heap/heapam.c      |  2 +-
 src/backend/access/transam/xlog.c     |  4 +--
 src/backend/commands/copyfromparse.c  | 32 ++++++++++++------------
 src/backend/commands/copyto.c         |  4 +--
 src/backend/executor/execExprInterp.c | 36 +++++++++++++--------------
 src/backend/executor/execTuples.c     |  6 ++---
 src/backend/executor/nodeHashjoin.c   |  2 +-
 src/backend/executor/nodeSeqscan.c    |  4 +--
 src/backend/nodes/queryjumblefuncs.c  |  6 ++---
 src/backend/storage/buffer/bufmgr.c   | 24 +++++++++---------
 src/backend/utils/adt/json.c          |  2 +-
 src/backend/utils/cache/catcache.c    |  2 +-
 15 files changed, 74 insertions(+), 74 deletions(-)

diff --git a/src/include/c.h b/src/include/c.h
index 88d13ec9993..ec74d78d72a 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -289,20 +289,20 @@ extern "C++"
 #endif
 
 /*
- * Use "pg_attribute_always_inline" in place of "inline" for functions that
+ * Use "pg_always_inline" in place of "inline" for functions that
  * we wish to force inlining of, even when the compiler's heuristics would
  * choose not to.  But, if possible, don't force inlining in unoptimized
  * debug builds.
  */
 #if defined(__GNUC__) && defined(__OPTIMIZE__)
 /* GCC supports always_inline via __attribute__ */
-#define pg_attribute_always_inline __attribute__((always_inline)) inline
+#define pg_always_inline __attribute__((always_inline)) inline
 #elif defined(_MSC_VER)
 /* MSVC has a special keyword for this */
-#define pg_attribute_always_inline __forceinline
+#define pg_always_inline __forceinline
 #else
 /* Otherwise, the best we can do is to say "inline" */
-#define pg_attribute_always_inline inline
+#define pg_always_inline inline
 #endif
 
 /*
diff --git a/src/include/executor/execScan.h b/src/include/executor/execScan.h
index 18b03235c3c..7f795b0b3fc 100644
--- a/src/include/executor/execScan.h
+++ b/src/include/executor/execScan.h
@@ -24,12 +24,12 @@
  * This routine substitutes a test tuple if inside an EvalPlanQual recheck.
  * Otherwise, it simply executes the access method's next-tuple routine.
  *
- * The pg_attribute_always_inline attribute allows the compiler to inline
+ * The pg_always_inline attribute allows the compiler to inline
  * this function into its caller. When EPQState is NULL, the EvalPlanQual
  * logic is completely eliminated at compile time, avoiding unnecessary
  * run-time checks and code for cases where EPQ is not required.
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 ExecScanFetch(ScanState *node,
 			  EPQState *epqstate,
 			  ExecScanAccessMtd accessMtd,
@@ -145,7 +145,7 @@ ExecScanFetch(ScanState *node,
  * conditions enforced by the access method.
  *
  * This function is an alternative to ExecScan, used when callers may omit
- * 'qual' or 'projInfo'. The pg_attribute_always_inline attribute allows the
+ * 'qual' or 'projInfo'. The pg_always_inline attribute allows the
  * compiler to eliminate non-relevant branches at compile time, avoiding
  * run-time checks in those cases.
  *
@@ -157,7 +157,7 @@ ExecScanFetch(ScanState *node,
  *	positioned before the first qualifying tuple.
  * ----------------------------------------------------------------
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 ExecScanExtended(ScanState *node,
 				 ExecScanAccessMtd accessMtd,	/* function returning a tuple */
 				 ExecScanRecheckMtd recheckMtd,
diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h
index 92558e234ac..b110008b747 100644
--- a/src/include/portability/instr_time.h
+++ b/src/include/portability/instr_time.h
@@ -368,7 +368,7 @@ pg_rdtscp(void)
  * only inlining the function partially.
  * See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124795
  */
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks(void)
 {
 	if (likely(timing_tsc_enabled))
@@ -382,7 +382,7 @@ pg_get_ticks(void)
 	return pg_get_ticks_system();
 }
 
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks_fast(void)
 {
 	if (likely(timing_tsc_enabled))
@@ -398,13 +398,13 @@ pg_get_ticks_fast(void)
 
 #else
 
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks(void)
 {
 	return pg_get_ticks_system();
 }
 
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks_fast(void)
 {
 	return pg_get_ticks_system();
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index abfd8e8970a..4f373b86028 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -519,7 +519,7 @@ heap_setscanlimits(TableScanDesc sscan, BlockNumber startBlk, BlockNumber numBlk
  * multiple times, with constant arguments for all_visible,
  * check_serializable.
  */
-pg_attribute_always_inline
+pg_always_inline
 static int
 page_collect_tuples(HeapScanDesc scan, Snapshot snapshot,
 					Page page, Buffer buffer,
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index f85b5286086..d13c0353dce 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -1143,9 +1143,9 @@ XLogInsertRecord(XLogRecData *rdata,
  *
  * NB: Testing shows that XLogInsertRecord runs faster if this code is inlined;
  * however, because there are two call sites, the compiler is reluctant to
- * inline. We use pg_attribute_always_inline here to try to convince it.
+ * inline. We use pg_always_inline here to try to convince it.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 ReserveXLogInsertLocation(int size, XLogRecPtr *StartPos, XLogRecPtr *EndPos,
 						  XLogRecPtr *PrevPtr)
 {
diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c
index 65fd5a0ab4f..500810577ad 100644
--- a/src/backend/commands/copyfromparse.c
+++ b/src/backend/commands/copyfromparse.c
@@ -144,22 +144,22 @@ static const char BinarySignature[11] = "PGCOPY\n\377\r\n\0";
 
 /* non-export function prototypes */
 static bool CopyReadLine(CopyFromState cstate, bool is_csv);
-static pg_attribute_always_inline bool CopyReadLineText(CopyFromState cstate,
-														bool is_csv);
+static pg_always_inline bool CopyReadLineText(CopyFromState cstate,
+											  bool is_csv);
 static int	CopyReadAttributesText(CopyFromState cstate);
 static int	CopyReadAttributesCSV(CopyFromState cstate);
 static Datum CopyReadBinaryAttribute(CopyFromState cstate, FmgrInfo *flinfo,
 									 Oid typioparam, int32 typmod,
 									 bool *isnull);
-static pg_attribute_always_inline bool CopyFromTextLikeOneRow(CopyFromState cstate,
-															  ExprContext *econtext,
-															  Datum *values,
-															  bool *nulls,
-															  bool is_csv);
-static pg_attribute_always_inline bool NextCopyFromRawFieldsInternal(CopyFromState cstate,
-																	 char ***fields,
-																	 int *nfields,
-																	 bool is_csv);
+static pg_always_inline bool CopyFromTextLikeOneRow(CopyFromState cstate,
+													ExprContext *econtext,
+													Datum *values,
+													bool *nulls,
+													bool is_csv);
+static pg_always_inline bool NextCopyFromRawFieldsInternal(CopyFromState cstate,
+														   char ***fields,
+														   int *nfields,
+														   bool is_csv);
 
 
 /* Low-level communications functions */
@@ -769,11 +769,11 @@ NextCopyFromRawFields(CopyFromState cstate, char ***fields, int *nfields)
  *
  * NOTE: force_not_null option are not applied to the returned fields.
  *
- * We use pg_attribute_always_inline to reduce function call overhead
+ * We use pg_always_inline to reduce function call overhead
  * and to help compilers to optimize away the 'is_csv' condition when called
  * by internal functions such as CopyFromTextLikeOneRow().
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 NextCopyFromRawFieldsInternal(CopyFromState cstate, char ***fields, int *nfields, bool is_csv)
 {
 	int			fldct;
@@ -946,10 +946,10 @@ CopyFromCSVOneRow(CopyFromState cstate, ExprContext *econtext, Datum *values,
 /*
  * Workhorse for CopyFromTextOneRow() and CopyFromCSVOneRow().
  *
- * We use pg_attribute_always_inline to reduce function call overhead
+ * We use pg_always_inline to reduce function call overhead
  * and to help compilers to optimize away the 'is_csv' condition.
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 CopyFromTextLikeOneRow(CopyFromState cstate, ExprContext *econtext,
 					   Datum *values, bool *nulls, bool is_csv)
 {
@@ -1463,7 +1463,7 @@ CopyReadLineTextSIMDHelper(CopyFromState cstate, bool is_csv,
 /*
  * CopyReadLineText - inner loop of CopyReadLine for text mode
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 CopyReadLineText(CopyFromState cstate, bool is_csv)
 {
 	char	   *copy_input_buf;
diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c
index f0e0147c665..2d91ca86b3d 100644
--- a/src/backend/commands/copyto.c
+++ b/src/backend/commands/copyto.c
@@ -294,10 +294,10 @@ CopyToCSVOneRow(CopyToState cstate, TupleTableSlot *slot)
 /*
  * Workhorse for CopyToTextOneRow() and CopyToCSVOneRow().
  *
- * We use pg_attribute_always_inline to reduce function call overhead
+ * We use pg_always_inline to reduce function call overhead
  * and to help compilers to optimize away the 'is_csv' condition.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 CopyToTextLikeOneRow(CopyToState cstate,
 					 TupleTableSlot *slot,
 					 bool is_csv)
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 3c4843cde86..2bb0a3d1f63 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -178,16 +178,16 @@ static Datum ExecJustHashInnerVarVirt(ExprState *state, ExprContext *econtext, b
 static Datum ExecJustHashOuterVarStrict(ExprState *state, ExprContext *econtext, bool *isnull);
 
 /* execution helper functions */
-static pg_attribute_always_inline void ExecAggPlainTransByVal(AggState *aggstate,
-															  AggStatePerTrans pertrans,
-															  AggStatePerGroup pergroup,
-															  ExprContext *aggcontext,
-															  int setno);
-static pg_attribute_always_inline void ExecAggPlainTransByRef(AggState *aggstate,
-															  AggStatePerTrans pertrans,
-															  AggStatePerGroup pergroup,
-															  ExprContext *aggcontext,
-															  int setno);
+static pg_always_inline void ExecAggPlainTransByVal(AggState *aggstate,
+													AggStatePerTrans pertrans,
+													AggStatePerGroup pergroup,
+													ExprContext *aggcontext,
+													int setno);
+static pg_always_inline void ExecAggPlainTransByRef(AggState *aggstate,
+													AggStatePerTrans pertrans,
+													AggStatePerGroup pergroup,
+													ExprContext *aggcontext,
+													int setno);
 static char *ExecGetJsonValueItemString(JsonbValue *item, bool *resnull);
 
 /*
@@ -2544,7 +2544,7 @@ get_cached_rowtype(Oid type_id, int32 typmod,
  */
 
 /* implementation of ExecJust(Inner|Outer|Scan)Var */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustVarImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[1];
@@ -2582,7 +2582,7 @@ ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJustAssign(Inner|Outer|Scan)Var */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustAssignVarImpl(ExprState *state, TupleTableSlot *inslot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[1];
@@ -2677,7 +2677,7 @@ ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJust(Inner|Outer|Scan)VarVirt */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustVarVirtImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[0];
@@ -2720,7 +2720,7 @@ ExecJustScanVarVirt(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJustAssign(Inner|Outer|Scan)VarVirt */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustAssignVarVirtImpl(ExprState *state, TupleTableSlot *inslot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[0];
@@ -2799,7 +2799,7 @@ ExecJustHashInnerVarWithIV(ExprState *state, ExprContext *econtext,
 }
 
 /* implementation of ExecJustHash(Inner|Outer)Var */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustHashVarImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *fetchop = &state->steps[0];
@@ -2837,7 +2837,7 @@ ExecJustHashInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJustHash(Inner|Outer)VarVirt */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustHashVarVirtImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *var = &state->steps[0];
@@ -5836,7 +5836,7 @@ ExecEvalAggOrderedTransTuple(ExprState *state, ExprEvalStep *op,
 }
 
 /* implementation of transition function invocation for byval types */
-static pg_attribute_always_inline void
+static pg_always_inline void
 ExecAggPlainTransByVal(AggState *aggstate, AggStatePerTrans pertrans,
 					   AggStatePerGroup pergroup,
 					   ExprContext *aggcontext, int setno)
@@ -5868,7 +5868,7 @@ ExecAggPlainTransByVal(AggState *aggstate, AggStatePerTrans pertrans,
 }
 
 /* implementation of transition function invocation for byref types */
-static pg_attribute_always_inline void
+static pg_always_inline void
 ExecAggPlainTransByRef(AggState *aggstate, AggStatePerTrans pertrans,
 					   AggStatePerGroup pergroup,
 					   ExprContext *aggcontext, int setno)
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index f08982a43cc..cb47b4fda1b 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -72,8 +72,8 @@
 
 static TupleDesc ExecTypeFromTLInternal(List *targetList,
 										bool skipjunk);
-static pg_attribute_always_inline void slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
-															  int reqnatts, bool support_cstring);
+static pg_always_inline void slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
+													int reqnatts, bool support_cstring);
 static inline void tts_buffer_heap_store_tuple(TupleTableSlot *slot,
 											   HeapTuple tuple,
 											   Buffer buffer,
@@ -1013,7 +1013,7 @@ tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple,
  * emit code during inlining for cstring deforming when it's required.
  * cstrings can exist in MinimalTuples, but not in HeapTuples.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 					   int reqnatts, bool support_cstring)
 {
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c
index 0b365d5b475..202dd866251 100644
--- a/src/backend/executor/nodeHashjoin.c
+++ b/src/backend/executor/nodeHashjoin.c
@@ -221,7 +221,7 @@ static void ExecParallelHashJoinPartitionOuter(HashJoinState *hjstate);
  *			  the other one is "outer".
  * ----------------------------------------------------------------
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 ExecHashJoinImpl(PlanState *pstate, bool parallel)
 {
 	HashJoinState *node = castNode(HashJoinState, pstate);
diff --git a/src/backend/executor/nodeSeqscan.c b/src/backend/executor/nodeSeqscan.c
index 5bcb0a861d7..b8c528ca089 100644
--- a/src/backend/executor/nodeSeqscan.c
+++ b/src/backend/executor/nodeSeqscan.c
@@ -48,7 +48,7 @@ static TupleTableSlot *SeqNext(SeqScanState *node);
  *		This is a workhorse for ExecSeqScan
  * ----------------------------------------------------------------
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 SeqNext(SeqScanState *node)
 {
 	TableScanDesc scandesc;
@@ -95,7 +95,7 @@ SeqNext(SeqScanState *node)
 /*
  * SeqRecheck -- access method routine to recheck a tuple in EvalPlanQual
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 SeqRecheck(SeqScanState *node, TupleTableSlot *slot)
 {
 	/*
diff --git a/src/backend/nodes/queryjumblefuncs.c b/src/backend/nodes/queryjumblefuncs.c
index 7c63766a51c..2ce27b9e552 100644
--- a/src/backend/nodes/queryjumblefuncs.c
+++ b/src/backend/nodes/queryjumblefuncs.c
@@ -232,7 +232,7 @@ DoJumble(JumbleState *jstate, Node *node)
  *
  * Note: Callers must ensure that size > 0.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 AppendJumbleInternal(JumbleState *jstate, const unsigned char *item,
 					 Size size)
 {
@@ -308,7 +308,7 @@ AppendJumble(JumbleState *jstate, const unsigned char *value, Size size)
  * AppendJumbleNull
  *		For jumbling NULL pointers
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 AppendJumbleNull(JumbleState *jstate)
 {
 	jstate->pending_nulls++;
@@ -375,7 +375,7 @@ AppendJumble64(JumbleState *jstate, const unsigned char *value)
  *
  * Note: Callers must ensure that there's at least 1 pending NULL.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 FlushPendingNulls(JumbleState *jstate)
 {
 	Assert(jstate->pending_nulls > 0);
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 3cc0b0bdd92..1f1198ec0f7 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -649,10 +649,10 @@ static inline BufferDesc *BufferAlloc(SMgrRelation smgr,
 static bool AsyncReadBuffers(ReadBuffersOperation *operation, int *nblocks_progress);
 static void CheckReadBuffersOperation(ReadBuffersOperation *operation, bool is_complete);
 
-static pg_attribute_always_inline void TrackBufferHit(IOObject io_object,
-													  IOContext io_context,
-													  Relation rel, char persistence, SMgrRelation smgr,
-													  ForkNumber forknum, BlockNumber blocknum);
+static pg_always_inline void TrackBufferHit(IOObject io_object,
+											IOContext io_context,
+											Relation rel, char persistence, SMgrRelation smgr,
+											ForkNumber forknum, BlockNumber blocknum);
 static Buffer GetVictimBuffer(BufferAccessStrategy strategy, IOContext io_context);
 static void FlushUnlockedBuffer(BufferDesc *buf, SMgrRelation reln,
 								IOObject io_object, IOContext io_context);
@@ -1228,7 +1228,7 @@ ZeroAndLockBuffer(Buffer buffer, ReadBufferMode mode, bool already_valid)
  * already present, or false if more work is required to either read it in or
  * zero it.
  */
-static pg_attribute_always_inline Buffer
+static pg_always_inline Buffer
 PinBufferForBlock(Relation rel,
 				  SMgrRelation smgr,
 				  char persistence,
@@ -1281,7 +1281,7 @@ PinBufferForBlock(Relation rel,
  *
  * smgr is required, rel is optional unless using P_NEW.
  */
-static pg_attribute_always_inline Buffer
+static pg_always_inline Buffer
 ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence,
 				  ForkNumber forkNum,
 				  BlockNumber blockNum, ReadBufferMode mode,
@@ -1364,7 +1364,7 @@ ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence,
 	return buffer;
 }
 
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 StartReadBuffersImpl(ReadBuffersOperation *operation,
 					 Buffer *buffers,
 					 BlockNumber blockNum,
@@ -1670,7 +1670,7 @@ CheckReadBuffersOperation(ReadBuffersOperation *operation, bool is_complete)
  * We track various stats related to buffer hits. Because this is done in a
  * few separate places, this helper exists for convenience.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 TrackBufferHit(IOObject io_object, IOContext io_context,
 			   Relation rel, char persistence, SMgrRelation smgr,
 			   ForkNumber forknum, BlockNumber blocknum)
@@ -2184,7 +2184,7 @@ AsyncReadBuffers(ReadBuffersOperation *operation, int *nblocks_progress)
  *
  * No locks are held either at entry or exit.
  */
-static pg_attribute_always_inline BufferDesc *
+static pg_always_inline BufferDesc *
 BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum,
 			BlockNumber blockNum,
 			BufferAccessStrategy strategy,
@@ -8277,7 +8277,7 @@ MarkDirtyAllUnpinnedBuffers(int32 *buffers_dirtied,
  * part of error handling, which in turn could lead to the buffer being
  * replaced while IO is ongoing.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 buffer_stage_common(PgAioHandle *ioh, bool is_write, bool is_temp)
 {
 	uint64	   *io_data;
@@ -8521,7 +8521,7 @@ buffer_readv_encode_error(PgAioResult *result,
  * Helper for AIO readv completion callbacks, supporting both shared and temp
  * buffers. Gets called once for each buffer in a multi-page read.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 buffer_readv_complete_one(PgAioTargetData *td, uint8 buf_off, Buffer buffer,
 						  uint8 flags, bool failed, bool is_temp,
 						  bool *buffer_invalid,
@@ -8672,7 +8672,7 @@ buffer_readv_complete_one(PgAioTargetData *td, uint8 buf_off, Buffer buffer,
  *
  * Shared between shared and local buffers, to reduce code duplication.
  */
-static pg_attribute_always_inline PgAioResult
+static pg_always_inline PgAioResult
 buffer_readv_complete(PgAioHandle *ioh, PgAioResult prior_result,
 					  uint8 cb_data, bool is_temp)
 {
diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index 0fee1b40d63..dccbe07cd2d 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -1528,7 +1528,7 @@ json_object_two_arg(PG_FUNCTION_ARGS)
  * escape_json_char
  *		Inline helper function for escape_json* functions
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 escape_json_char(StringInfo buf, char c)
 {
 	switch (c)
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index 87ed5506460..baa98f18ffa 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -1080,7 +1080,7 @@ RehashCatCacheLists(CatCache *cp)
  *
  * Call CatalogCacheInitializeCache() if not yet done.
  */
-pg_attribute_always_inline
+pg_always_inline
 static void
 ConditionalCatalogCacheInitializeCache(CatCache *cache)
 {
-- 
2.53.0.1.gb2826b52eb

^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
@ 2026-04-08 21:30 ` Peter Geoghegan <pg@bowt.ie>
  1 sibling, 0 replies; 18+ messages in thread

From: Peter Geoghegan @ 2026-04-08 21:30 UTC (permalink / raw)
  To: Andres Freund <andres@anarazel.de>; +Cc: pgsql-hackers

On Wed, Apr 8, 2026 at 5:09 PM Andres Freund <andres@anarazel.de> wrote:
> When reviewing the index prefetching patch I got a bit dismayed at how long
> pg_attribute_always_inline is due to the way it triggers pgindent to format
> stuff.

I had to significantly reorder function prototypes to avoid overly
long prototypes that had pg_attribute_always_inline. While perhaps not
strictly necessary, we shouldn't have to work around the fact that
pg_attribute_always_inline is an absurdly verbose symbol name.

> I propose that we remove the _attribute_ part of the name.

+1

-- 
Peter Geoghegan





^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
@ 2026-04-09 00:00 ` Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  1 sibling, 1 reply; 18+ messages in thread

From: Peter Eisentraut @ 2026-04-09 00:00 UTC (permalink / raw)
  To: Andres Freund <andres@anarazel.de>; pgsql-hackers

On 08.04.26 23:09, Andres Freund wrote:
> Hi,
> 
> When reviewing the index prefetching patch I got a bit dismayed at how long
> pg_attribute_always_inline is due to the way it triggers pgindent to format
> stuff.
> 
> I propose that we remove the _attribute_ part of the name.
> 
> Given that it is implemented for compilers that don't use the
> __attribute__((always_inline)) spelling, so the shorter name seems better
> anyway.

Yes, and the existing name is also kind of wrong even on GCC because the 
macro does not expand to only an attribute but also includes the "inline".






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
@ 2026-04-09 14:40   ` Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  0 siblings, 1 reply; 18+ messages in thread

From: Andres Freund @ 2026-04-09 14:40 UTC (permalink / raw)
  To: Peter Eisentraut <peter@eisentraut.org>; +Cc: pgsql-hackers

Hi,

On 2026-04-09 02:00:37 +0200, Peter Eisentraut wrote:
> On 08.04.26 23:09, Andres Freund wrote:
> > Hi,
> > 
> > When reviewing the index prefetching patch I got a bit dismayed at how long
> > pg_attribute_always_inline is due to the way it triggers pgindent to format
> > stuff.
> > 
> > I propose that we remove the _attribute_ part of the name.
> > 
> > Given that it is implemented for compilers that don't use the
> > __attribute__((always_inline)) spelling, so the shorter name seems better
> > anyway.
> 
> Yes, and the existing name is also kind of wrong even on GCC because the
> macro does not expand to only an attribute but also includes the "inline".

It didn't start out that way, that only came in a bit later, in
434e6e148441...

Created a CF entry, to reduce the chances of me forgetting about committing
this early in the 20 cycle.

Greetings,

Andres Freund





^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
@ 2026-05-27 22:17     ` Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  0 siblings, 1 reply; 18+ messages in thread

From: Peter Geoghegan @ 2026-05-27 22:17 UTC (permalink / raw)
  To: Andres Freund <andres@anarazel.de>; +Cc: Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers@postgresql.org, Tomas Vondra <tomas@vondra.me>

On Thu, Apr 9, 2026 at 10:40 AM Andres Freund <andres@anarazel.de> wrote:
> Created a CF entry, to reduce the chances of me forgetting about committing
> this early in the 20 cycle.

We already have a pg_noinline. How about renaming
pg_attribute_always_inline to pg_mustinline? That is an alternative
that is both consistent with pg_noinline, and even terser than your
proposal.

I have no intention of holding this patch up with bikeshedding. But I
noticed that even your proposed pg_always_inline rename still leaves
function prototypes over the column limit with moderately verbose
function names. It seems better to avoid that outcome.

-- 
Peter Geoghegan





^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
@ 2026-06-12 15:22       ` Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  0 siblings, 1 reply; 18+ messages in thread

From: Tomas Vondra @ 2026-06-12 15:22 UTC (permalink / raw)
  To: Peter Geoghegan <pg@bowt.ie>; Andres Freund <andres@anarazel.de>; +Cc: Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

On 5/28/26 00:17, Peter Geoghegan wrote:
> On Thu, Apr 9, 2026 at 10:40 AM Andres Freund <andres@anarazel.de> wrote:
>> Created a CF entry, to reduce the chances of me forgetting about committing
>> this early in the 20 cycle.
> 
> We already have a pg_noinline. How about renaming
> pg_attribute_always_inline to pg_mustinline? That is an alternative
> that is both consistent with pg_noinline, and even terser than your
> proposal.
> 

I agree we should shorten pg_attribute_always_inline, it's way too
verbose. And other attributes don't include the _attribute_ either (like
the pg_noinline mentioned here).

I'm not sure about pg_mustinline. It seems weird to me, and I'm not sure
saving the 3 characters is worth it, pg_always_inline seems better.

> I have no intention of holding this patch up with bikeshedding. But I
> noticed that even your proposed pg_always_inline rename still leaves
> function prototypes over the column limit with moderately verbose
> function names. It seems better to avoid that outcome.
> 

Yeah, we should not do such weird stuff just because of unnecessarily
long attribute names.

Question - do we plan to do this in master only, or was the plan to
backpatch the change? I'm not sure if these labels are used outside the
core code, that might be an issue for backpatching.


regards

-- 
Tomas Vondra






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
@ 2026-06-12 16:10         ` Peter Geoghegan <pg@bowt.ie>
  2026-07-08 21:41           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  0 siblings, 1 reply; 18+ messages in thread

From: Peter Geoghegan @ 2026-06-12 16:10 UTC (permalink / raw)
  To: Tomas Vondra <tomas@vondra.me>; +Cc: Andres Freund <andres@anarazel.de>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

On Fri, Jun 12, 2026 at 11:23 AM Tomas Vondra <tomas@vondra.me> wrote:
> I'm not sure about pg_mustinline. It seems weird to me, and I'm not sure
> saving the 3 characters is worth it, pg_always_inline seems better.

I'm not going to make a fuss about it.

> Yeah, we should not do such weird stuff just because of unnecessarily
> long attribute names.

Right. Basically, I don't want to be told that I must completely
change the order of function definitions because I used
pg_[attribute]_always_inline. It's just not reasonable to impose that
requirement on patch authors.

> Question - do we plan to do this in master only, or was the plan to
> backpatch the change? I'm not sure if these labels are used outside the
> core code, that might be an issue for backpatching.

I think that we should bite the bullet and backpatch. I count only 17
instances of pg_attribute_always_inline on the master branch.

Some extensions will no longer build against the backbranches if we go
this way. However, extension authors should find it easy to work
around this on an ad-hoc basis. They're going to have to work around
it sooner or later, so we might as well favor the new spelling.

-- 
Peter Geoghegan





^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
@ 2026-07-08 21:41           ` Tomas Vondra <tomas@vondra.me>
  2026-07-09 00:02             ` Re: s/pg_attribute_always_inline/pg_always_inline/? David Rowley <dgrowleyml@gmail.com>
  2026-07-09 06:05             ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  0 siblings, 2 replies; 18+ messages in thread

From: Tomas Vondra @ 2026-07-08 21:41 UTC (permalink / raw)
  To: Peter Geoghegan <pg@bowt.ie>; +Cc: Andres Freund <andres@anarazel.de>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

On 6/12/26 18:10, Peter Geoghegan wrote:
> On Fri, Jun 12, 2026 at 11:23 AM Tomas Vondra <tomas@vondra.me> wrote:
>> I'm not sure about pg_mustinline. It seems weird to me, and I'm not sure
>> saving the 3 characters is worth it, pg_always_inline seems better.
> 
> I'm not going to make a fuss about it.
> 
>> Yeah, we should not do such weird stuff just because of unnecessarily
>> long attribute names.
> 
> Right. Basically, I don't want to be told that I must completely
> change the order of function definitions because I used
> pg_[attribute]_always_inline. It's just not reasonable to impose that
> requirement on patch authors.
> 
>> Question - do we plan to do this in master only, or was the plan to
>> backpatch the change? I'm not sure if these labels are used outside the
>> core code, that might be an issue for backpatching.
> 
> I think that we should bite the bullet and backpatch. I count only 17
> instances of pg_attribute_always_inline on the master branch.
> 
> Some extensions will no longer build against the backbranches if we go
> this way. However, extension authors should find it easy to work
> around this on an ad-hoc basis. They're going to have to work around
> it sooner or later, so we might as well favor the new spelling.
> 

So, what shall we do about this? I've been looking at the v29 of the
index prefetching patch series, which is using this attribute in a bunch
of places. And that reminded me of this thread.

I guess we should just commit that, so unless someone objects soon I'll
just do that. ISTM the agreement is to backpatch this too.


regards

-- 
Tomas Vondra






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-07-08 21:41           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
@ 2026-07-09 00:02             ` David Rowley <dgrowleyml@gmail.com>
  2026-07-09 00:14               ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  1 sibling, 1 reply; 18+ messages in thread

From: David Rowley @ 2026-07-09 00:02 UTC (permalink / raw)
  To: Tomas Vondra <tomas@vondra.me>; +Cc: Peter Geoghegan <pg@bowt.ie>; Andres Freund <andres@anarazel.de>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

On Thu, 9 Jul 2026 at 09:42, Tomas Vondra <tomas@vondra.me> wrote:
> So, what shall we do about this? I've been looking at the v29 of the
> index prefetching patch series, which is using this attribute in a bunch
> of places. And that reminded me of this thread.
>
> I guess we should just commit that, so unless someone objects soon I'll
> just do that. ISTM the agreement is to backpatch this too.

How about just backpatching the new macro and leaving the old one in
place back branches? There should be slightly less backpatching pain
that way, for us, and fewer merge issues for people maintaining forks
on existing versions.

David





^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-07-08 21:41           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-09 00:02             ` Re: s/pg_attribute_always_inline/pg_always_inline/? David Rowley <dgrowleyml@gmail.com>
@ 2026-07-09 00:14               ` Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 00:05                 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  0 siblings, 1 reply; 18+ messages in thread

From: Tom Lane @ 2026-07-09 00:14 UTC (permalink / raw)
  To: David Rowley <dgrowleyml@gmail.com>; +Cc: Tomas Vondra <tomas@vondra.me>; Peter Geoghegan <pg@bowt.ie>; Andres Freund <andres@anarazel.de>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

David Rowley <dgrowleyml@gmail.com> writes:
> On Thu, 9 Jul 2026 at 09:42, Tomas Vondra <tomas@vondra.me> wrote:
>> I guess we should just commit that, so unless someone objects soon I'll
>> just do that. ISTM the agreement is to backpatch this too.

> How about just backpatching the new macro and leaving the old one in
> place back branches?

+1.  Breaking valid code in released branches is unfriendly.

			regards, tom lane





^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-07-08 21:41           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-09 00:02             ` Re: s/pg_attribute_always_inline/pg_always_inline/? David Rowley <dgrowleyml@gmail.com>
  2026-07-09 00:14               ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
@ 2026-07-10 00:05                 ` Tomas Vondra <tomas@vondra.me>
  2026-07-10 00:14                   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  0 siblings, 1 reply; 18+ messages in thread

From: Tomas Vondra @ 2026-07-10 00:05 UTC (permalink / raw)
  To: Tom Lane <tgl@sss.pgh.pa.us>; David Rowley <dgrowleyml@gmail.com>; +Cc: Peter Geoghegan <pg@bowt.ie>; Andres Freund <andres@anarazel.de>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

On 7/9/26 02:14, Tom Lane wrote:
> David Rowley <dgrowleyml@gmail.com> writes:
>> On Thu, 9 Jul 2026 at 09:42, Tomas Vondra <tomas@vondra.me> wrote:
>>> I guess we should just commit that, so unless someone objects soon I'll
>>> just do that. ISTM the agreement is to backpatch this too.
> 
>> How about just backpatching the new macro and leaving the old one in
>> place back branches?
> 
> +1.  Breaking valid code in released branches is unfriendly.
> 

OK, that sounds reasonable. So in the backbranches we'd have both
pg_always_inline and the original pg_attriute_always_inline.

Does "backpatching the new macro" mean we'd also adjust all existing
places to use the new macro or not? I mean, we could backpatch just the
bit in c.h. I plan to adjust the places, to minimize possible conflicts
when backpatching other stuff.


regards

-- 
Tomas Vondra






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-07-08 21:41           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-09 00:02             ` Re: s/pg_attribute_always_inline/pg_always_inline/? David Rowley <dgrowleyml@gmail.com>
  2026-07-09 00:14               ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 00:05                 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
@ 2026-07-10 00:14                   ` Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 12:34                     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  0 siblings, 1 reply; 18+ messages in thread

From: Tom Lane @ 2026-07-10 00:14 UTC (permalink / raw)
  To: Tomas Vondra <tomas@vondra.me>; +Cc: David Rowley <dgrowleyml@gmail.com>; Peter Geoghegan <pg@bowt.ie>; Andres Freund <andres@anarazel.de>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

Tomas Vondra <tomas@vondra.me> writes:
> Does "backpatching the new macro" mean we'd also adjust all existing
> places to use the new macro or not? I mean, we could backpatch just the
> bit in c.h. I plan to adjust the places, to minimize possible conflicts
> when backpatching other stuff.

I think it'd be sufficient to add the new macro to the old branches.
The point of back-patching at all, I think, is to save ourselves
work if we have to back-patch some new code that uses the new style.

			regards, tom lane





^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-07-08 21:41           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-09 00:02             ` Re: s/pg_attribute_always_inline/pg_always_inline/? David Rowley <dgrowleyml@gmail.com>
  2026-07-09 00:14               ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 00:05                 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-10 00:14                   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
@ 2026-07-10 12:34                     ` Tomas Vondra <tomas@vondra.me>
  2026-07-10 16:37                       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  0 siblings, 1 reply; 18+ messages in thread

From: Tomas Vondra @ 2026-07-10 12:34 UTC (permalink / raw)
  To: Tom Lane <tgl@sss.pgh.pa.us>; +Cc: David Rowley <dgrowleyml@gmail.com>; Peter Geoghegan <pg@bowt.ie>; Andres Freund <andres@anarazel.de>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

On 7/10/26 02:14, Tom Lane wrote:
> Tomas Vondra <tomas@vondra.me> writes:
>> Does "backpatching the new macro" mean we'd also adjust all existing
>> places to use the new macro or not? I mean, we could backpatch just the
>> bit in c.h. I plan to adjust the places, to minimize possible conflicts
>> when backpatching other stuff.
> 
> I think it'd be sufficient to add the new macro to the old branches.
> The point of back-patching at all, I think, is to save ourselves
> work if we have to back-patch some new code that uses the new style.
> 

I'm not very worried about new code using the new macro name. We only
use it in ~50 places, and I don't think fixes will use it very often.
It's more likely a fix will touching some code nearby, and the
cherry-pick will fail because of the difference.

I intend to backpatch "everything", with backbranches having both macros
(as in the -19 patch).


regards

-- 
Tomas Vondra

Attachments:

  [text/x-patch] v2-0001-Shorten-pg_attribute_always_inline-to-pg_always_i-master.patch (24.5K, ../../57d9a1c8-d4d7-4154-bb46-9e03ca3bde09@vondra.me/2-v2-0001-Shorten-pg_attribute_always_inline-to-pg_always_i-master.patch)
  download | inline diff:
From 128d933a0d25d246c4086ce01cbcb2b596938c44 Mon Sep 17 00:00:00 2001
From: test <test>
Date: Fri, 10 Jul 2026 01:54:38 +0200
Subject: [PATCH v2] Shorten pg_attribute_always_inline to pg_always_inline

The pg_attribute_always_inline macro name is so long it forces pgindent
to format the code in strange ways. Which may incentivize patch authors
to either structure the code in strange ways (e.g. reorder prototypes),
use shorter names, etc. Neither is very desirable for code readability.

This shortens the name by removing the _attribute_ part. It also makes
it more consistent with pg_noinline, which does not have the _attribute_
part either.

Backpatched to all supported branches, to prevent conflicts when
backpatching other fixes. The backbranches however keep both the old
and new macro name, so that existing code keeps working.

Author: Andres Freund <andres@anarazel.de>
Reviewed-by: Peter Geoghegan <pg@bowt.ie>
Reviewed-by: Tomas Vondra <tomas@vondra.me>
Discussion: https://postgr.es/m/bqqdehahpoa36igpictuqyn2s2mexk3t3ehidh2ffd2slb35e5@rzgksuiszgbg
Backpatch-through: 14
---
 src/backend/access/heap/heapam.c      |  2 +-
 src/backend/access/transam/xlog.c     |  4 +-
 src/backend/commands/copyfromparse.c  | 32 ++++++++--------
 src/backend/commands/copyto.c         |  4 +-
 src/backend/executor/execExprInterp.c | 54 +++++++++++++--------------
 src/backend/executor/execTuples.c     |  6 +--
 src/backend/executor/nodeHashjoin.c   |  2 +-
 src/backend/executor/nodeSeqscan.c    |  4 +-
 src/backend/nodes/queryjumblefuncs.c  |  6 +--
 src/backend/storage/buffer/bufmgr.c   | 24 ++++++------
 src/backend/utils/adt/json.c          |  2 +-
 src/backend/utils/cache/catcache.c    |  2 +-
 src/include/c.h                       |  8 ++--
 src/include/executor/execScan.h       |  8 ++--
 src/include/portability/instr_time.h  |  8 ++--
 15 files changed, 83 insertions(+), 83 deletions(-)

diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index abfd8e8970a..4f373b86028 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -519,7 +519,7 @@ heap_setscanlimits(TableScanDesc sscan, BlockNumber startBlk, BlockNumber numBlk
  * multiple times, with constant arguments for all_visible,
  * check_serializable.
  */
-pg_attribute_always_inline
+pg_always_inline
 static int
 page_collect_tuples(HeapScanDesc scan, Snapshot snapshot,
 					Page page, Buffer buffer,
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index a8bbf6284a7..b431a921e4b 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -1143,9 +1143,9 @@ XLogInsertRecord(XLogRecData *rdata,
  *
  * NB: Testing shows that XLogInsertRecord runs faster if this code is inlined;
  * however, because there are two call sites, the compiler is reluctant to
- * inline. We use pg_attribute_always_inline here to try to convince it.
+ * inline. We use pg_always_inline here to try to convince it.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 ReserveXLogInsertLocation(int size, XLogRecPtr *StartPos, XLogRecPtr *EndPos,
 						  XLogRecPtr *PrevPtr)
 {
diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c
index 65fd5a0ab4f..500810577ad 100644
--- a/src/backend/commands/copyfromparse.c
+++ b/src/backend/commands/copyfromparse.c
@@ -144,22 +144,22 @@ static const char BinarySignature[11] = "PGCOPY\n\377\r\n\0";
 
 /* non-export function prototypes */
 static bool CopyReadLine(CopyFromState cstate, bool is_csv);
-static pg_attribute_always_inline bool CopyReadLineText(CopyFromState cstate,
-														bool is_csv);
+static pg_always_inline bool CopyReadLineText(CopyFromState cstate,
+											  bool is_csv);
 static int	CopyReadAttributesText(CopyFromState cstate);
 static int	CopyReadAttributesCSV(CopyFromState cstate);
 static Datum CopyReadBinaryAttribute(CopyFromState cstate, FmgrInfo *flinfo,
 									 Oid typioparam, int32 typmod,
 									 bool *isnull);
-static pg_attribute_always_inline bool CopyFromTextLikeOneRow(CopyFromState cstate,
-															  ExprContext *econtext,
-															  Datum *values,
-															  bool *nulls,
-															  bool is_csv);
-static pg_attribute_always_inline bool NextCopyFromRawFieldsInternal(CopyFromState cstate,
-																	 char ***fields,
-																	 int *nfields,
-																	 bool is_csv);
+static pg_always_inline bool CopyFromTextLikeOneRow(CopyFromState cstate,
+													ExprContext *econtext,
+													Datum *values,
+													bool *nulls,
+													bool is_csv);
+static pg_always_inline bool NextCopyFromRawFieldsInternal(CopyFromState cstate,
+														   char ***fields,
+														   int *nfields,
+														   bool is_csv);
 
 
 /* Low-level communications functions */
@@ -769,11 +769,11 @@ NextCopyFromRawFields(CopyFromState cstate, char ***fields, int *nfields)
  *
  * NOTE: force_not_null option are not applied to the returned fields.
  *
- * We use pg_attribute_always_inline to reduce function call overhead
+ * We use pg_always_inline to reduce function call overhead
  * and to help compilers to optimize away the 'is_csv' condition when called
  * by internal functions such as CopyFromTextLikeOneRow().
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 NextCopyFromRawFieldsInternal(CopyFromState cstate, char ***fields, int *nfields, bool is_csv)
 {
 	int			fldct;
@@ -946,10 +946,10 @@ CopyFromCSVOneRow(CopyFromState cstate, ExprContext *econtext, Datum *values,
 /*
  * Workhorse for CopyFromTextOneRow() and CopyFromCSVOneRow().
  *
- * We use pg_attribute_always_inline to reduce function call overhead
+ * We use pg_always_inline to reduce function call overhead
  * and to help compilers to optimize away the 'is_csv' condition.
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 CopyFromTextLikeOneRow(CopyFromState cstate, ExprContext *econtext,
 					   Datum *values, bool *nulls, bool is_csv)
 {
@@ -1463,7 +1463,7 @@ CopyReadLineTextSIMDHelper(CopyFromState cstate, bool is_csv,
 /*
  * CopyReadLineText - inner loop of CopyReadLine for text mode
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 CopyReadLineText(CopyFromState cstate, bool is_csv)
 {
 	char	   *copy_input_buf;
diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c
index d3adc752ae3..f9bc617ddb1 100644
--- a/src/backend/commands/copyto.c
+++ b/src/backend/commands/copyto.c
@@ -294,10 +294,10 @@ CopyToCSVOneRow(CopyToState cstate, TupleTableSlot *slot)
 /*
  * Workhorse for CopyToTextOneRow() and CopyToCSVOneRow().
  *
- * We use pg_attribute_always_inline to reduce function call overhead
+ * We use pg_always_inline to reduce function call overhead
  * and to help compilers to optimize away the 'is_csv' condition.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 CopyToTextLikeOneRow(CopyToState cstate,
 					 TupleTableSlot *slot,
 					 bool is_csv)
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 0634af964a9..d45812c23aa 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -178,24 +178,24 @@ static Datum ExecJustHashInnerVarVirt(ExprState *state, ExprContext *econtext, b
 static Datum ExecJustHashOuterVarStrict(ExprState *state, ExprContext *econtext, bool *isnull);
 
 /* execution helper functions */
-static pg_attribute_always_inline void ExecEvalArrayCompareInternal(FunctionCallInfo fcinfo,
-																	ArrayType *arr,
-																	int16 typlen,
-																	bool typbyval,
-																	char typalign,
-																	bool useOr,
-																	Datum *result,
-																	bool *resultnull);
-static pg_attribute_always_inline void ExecAggPlainTransByVal(AggState *aggstate,
-															  AggStatePerTrans pertrans,
-															  AggStatePerGroup pergroup,
-															  ExprContext *aggcontext,
-															  int setno);
-static pg_attribute_always_inline void ExecAggPlainTransByRef(AggState *aggstate,
-															  AggStatePerTrans pertrans,
-															  AggStatePerGroup pergroup,
-															  ExprContext *aggcontext,
-															  int setno);
+static pg_always_inline void ExecEvalArrayCompareInternal(FunctionCallInfo fcinfo,
+														  ArrayType *arr,
+														  int16 typlen,
+														  bool typbyval,
+														  char typalign,
+														  bool useOr,
+														  Datum *result,
+														  bool *resultnull);
+static pg_always_inline void ExecAggPlainTransByVal(AggState *aggstate,
+													AggStatePerTrans pertrans,
+													AggStatePerGroup pergroup,
+													ExprContext *aggcontext,
+													int setno);
+static pg_always_inline void ExecAggPlainTransByRef(AggState *aggstate,
+													AggStatePerTrans pertrans,
+													AggStatePerGroup pergroup,
+													ExprContext *aggcontext,
+													int setno);
 static char *ExecGetJsonValueItemString(JsonbValue *item, bool *resnull);
 
 /*
@@ -2552,7 +2552,7 @@ get_cached_rowtype(Oid type_id, int32 typmod,
  */
 
 /* implementation of ExecJust(Inner|Outer|Scan)Var */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustVarImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[1];
@@ -2590,7 +2590,7 @@ ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJustAssign(Inner|Outer|Scan)Var */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustAssignVarImpl(ExprState *state, TupleTableSlot *inslot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[1];
@@ -2685,7 +2685,7 @@ ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJust(Inner|Outer|Scan)VarVirt */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustVarVirtImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[0];
@@ -2728,7 +2728,7 @@ ExecJustScanVarVirt(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJustAssign(Inner|Outer|Scan)VarVirt */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustAssignVarVirtImpl(ExprState *state, TupleTableSlot *inslot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[0];
@@ -2807,7 +2807,7 @@ ExecJustHashInnerVarWithIV(ExprState *state, ExprContext *econtext,
 }
 
 /* implementation of ExecJustHash(Inner|Outer)Var */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustHashVarImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *fetchop = &state->steps[0];
@@ -2845,7 +2845,7 @@ ExecJustHashInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJustHash(Inner|Outer)VarVirt */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustHashVarVirtImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *var = &state->steps[0];
@@ -4107,7 +4107,7 @@ ExecEvalScalarArrayOp(ExprState *state, ExprEvalStep *op)
  * Callers must handle the strict LHS-is-NULL; return NULL fast path prior to
  * calling this.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 ExecEvalArrayCompareInternal(FunctionCallInfo fcinfo, ArrayType *arr,
 							 int16 typlen, bool typbyval, char typalign,
 							 bool useOr, Datum *result, bool *resultnull)
@@ -5906,7 +5906,7 @@ ExecEvalAggOrderedTransTuple(ExprState *state, ExprEvalStep *op,
 }
 
 /* implementation of transition function invocation for byval types */
-static pg_attribute_always_inline void
+static pg_always_inline void
 ExecAggPlainTransByVal(AggState *aggstate, AggStatePerTrans pertrans,
 					   AggStatePerGroup pergroup,
 					   ExprContext *aggcontext, int setno)
@@ -5938,7 +5938,7 @@ ExecAggPlainTransByVal(AggState *aggstate, AggStatePerTrans pertrans,
 }
 
 /* implementation of transition function invocation for byref types */
-static pg_attribute_always_inline void
+static pg_always_inline void
 ExecAggPlainTransByRef(AggState *aggstate, AggStatePerTrans pertrans,
 					   AggStatePerGroup pergroup,
 					   ExprContext *aggcontext, int setno)
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 7f4ebf95432..97ae019d10a 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -72,8 +72,8 @@
 
 static TupleDesc ExecTypeFromTLInternal(List *targetList,
 										bool skipjunk);
-static pg_attribute_always_inline void slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
-															  int reqnatts, bool support_cstring);
+static pg_always_inline void slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
+													int reqnatts, bool support_cstring);
 static inline void tts_buffer_heap_store_tuple(TupleTableSlot *slot,
 											   HeapTuple tuple,
 											   Buffer buffer,
@@ -1013,7 +1013,7 @@ tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple,
  * emit code during inlining for cstring deforming when it's required.
  * cstrings can exist in MinimalTuples, but not in HeapTuples.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 					   int reqnatts, bool support_cstring)
 {
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c
index 0b365d5b475..202dd866251 100644
--- a/src/backend/executor/nodeHashjoin.c
+++ b/src/backend/executor/nodeHashjoin.c
@@ -221,7 +221,7 @@ static void ExecParallelHashJoinPartitionOuter(HashJoinState *hjstate);
  *			  the other one is "outer".
  * ----------------------------------------------------------------
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 ExecHashJoinImpl(PlanState *pstate, bool parallel)
 {
 	HashJoinState *node = castNode(HashJoinState, pstate);
diff --git a/src/backend/executor/nodeSeqscan.c b/src/backend/executor/nodeSeqscan.c
index 5bcb0a861d7..b8c528ca089 100644
--- a/src/backend/executor/nodeSeqscan.c
+++ b/src/backend/executor/nodeSeqscan.c
@@ -48,7 +48,7 @@ static TupleTableSlot *SeqNext(SeqScanState *node);
  *		This is a workhorse for ExecSeqScan
  * ----------------------------------------------------------------
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 SeqNext(SeqScanState *node)
 {
 	TableScanDesc scandesc;
@@ -95,7 +95,7 @@ SeqNext(SeqScanState *node)
 /*
  * SeqRecheck -- access method routine to recheck a tuple in EvalPlanQual
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 SeqRecheck(SeqScanState *node, TupleTableSlot *slot)
 {
 	/*
diff --git a/src/backend/nodes/queryjumblefuncs.c b/src/backend/nodes/queryjumblefuncs.c
index 7c63766a51c..2ce27b9e552 100644
--- a/src/backend/nodes/queryjumblefuncs.c
+++ b/src/backend/nodes/queryjumblefuncs.c
@@ -232,7 +232,7 @@ DoJumble(JumbleState *jstate, Node *node)
  *
  * Note: Callers must ensure that size > 0.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 AppendJumbleInternal(JumbleState *jstate, const unsigned char *item,
 					 Size size)
 {
@@ -308,7 +308,7 @@ AppendJumble(JumbleState *jstate, const unsigned char *value, Size size)
  * AppendJumbleNull
  *		For jumbling NULL pointers
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 AppendJumbleNull(JumbleState *jstate)
 {
 	jstate->pending_nulls++;
@@ -375,7 +375,7 @@ AppendJumble64(JumbleState *jstate, const unsigned char *value)
  *
  * Note: Callers must ensure that there's at least 1 pending NULL.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 FlushPendingNulls(JumbleState *jstate)
 {
 	Assert(jstate->pending_nulls > 0);
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 9ab282a76d1..3908529872a 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -649,10 +649,10 @@ static inline BufferDesc *BufferAlloc(SMgrRelation smgr,
 static bool AsyncReadBuffers(ReadBuffersOperation *operation, int *nblocks_progress);
 static void CheckReadBuffersOperation(ReadBuffersOperation *operation, bool is_complete);
 
-static pg_attribute_always_inline void TrackBufferHit(IOObject io_object,
-													  IOContext io_context,
-													  Relation rel, char persistence, SMgrRelation smgr,
-													  ForkNumber forknum, BlockNumber blocknum);
+static pg_always_inline void TrackBufferHit(IOObject io_object,
+											IOContext io_context,
+											Relation rel, char persistence, SMgrRelation smgr,
+											ForkNumber forknum, BlockNumber blocknum);
 static Buffer GetVictimBuffer(BufferAccessStrategy strategy, IOContext io_context);
 static void FlushUnlockedBuffer(BufferDesc *buf, SMgrRelation reln,
 								IOObject io_object, IOContext io_context);
@@ -1219,7 +1219,7 @@ ZeroAndLockBuffer(Buffer buffer, ReadBufferMode mode, bool already_valid)
  * already present, or false if more work is required to either read it in or
  * zero it.
  */
-static pg_attribute_always_inline Buffer
+static pg_always_inline Buffer
 PinBufferForBlock(Relation rel,
 				  SMgrRelation smgr,
 				  char persistence,
@@ -1272,7 +1272,7 @@ PinBufferForBlock(Relation rel,
  *
  * smgr is required, rel is optional unless using P_NEW.
  */
-static pg_attribute_always_inline Buffer
+static pg_always_inline Buffer
 ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence,
 				  ForkNumber forkNum,
 				  BlockNumber blockNum, ReadBufferMode mode,
@@ -1367,7 +1367,7 @@ ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence,
 	return buffer;
 }
 
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 StartReadBuffersImpl(ReadBuffersOperation *operation,
 					 Buffer *buffers,
 					 BlockNumber blockNum,
@@ -1679,7 +1679,7 @@ CheckReadBuffersOperation(ReadBuffersOperation *operation, bool is_complete)
  * We track various stats related to buffer hits. Because this is done in a
  * few separate places, this helper exists for convenience.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 TrackBufferHit(IOObject io_object, IOContext io_context,
 			   Relation rel, char persistence, SMgrRelation smgr,
 			   ForkNumber forknum, BlockNumber blocknum)
@@ -2193,7 +2193,7 @@ AsyncReadBuffers(ReadBuffersOperation *operation, int *nblocks_progress)
  *
  * No locks are held either at entry or exit.
  */
-static pg_attribute_always_inline BufferDesc *
+static pg_always_inline BufferDesc *
 BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum,
 			BlockNumber blockNum,
 			BufferAccessStrategy strategy,
@@ -8326,7 +8326,7 @@ MarkDirtyAllUnpinnedBuffers(int32 *buffers_dirtied,
  * part of error handling, which in turn could lead to the buffer being
  * replaced while IO is ongoing.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 buffer_stage_common(PgAioHandle *ioh, bool is_write, bool is_temp)
 {
 	uint64	   *io_data;
@@ -8570,7 +8570,7 @@ buffer_readv_encode_error(PgAioResult *result,
  * Helper for AIO readv completion callbacks, supporting both shared and temp
  * buffers. Gets called once for each buffer in a multi-page read.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 buffer_readv_complete_one(PgAioTargetData *td, uint8 buf_off, Buffer buffer,
 						  uint8 flags, bool failed, bool is_temp,
 						  bool *buffer_invalid,
@@ -8721,7 +8721,7 @@ buffer_readv_complete_one(PgAioTargetData *td, uint8 buf_off, Buffer buffer,
  *
  * Shared between shared and local buffers, to reduce code duplication.
  */
-static pg_attribute_always_inline PgAioResult
+static pg_always_inline PgAioResult
 buffer_readv_complete(PgAioHandle *ioh, PgAioResult prior_result,
 					  uint8 cb_data, bool is_temp)
 {
diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index 0fee1b40d63..dccbe07cd2d 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -1528,7 +1528,7 @@ json_object_two_arg(PG_FUNCTION_ARGS)
  * escape_json_char
  *		Inline helper function for escape_json* functions
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 escape_json_char(StringInfo buf, char c)
 {
 	switch (c)
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index 6fb35dedf95..0c8955fc61a 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -1091,7 +1091,7 @@ RehashCatCacheLists(CatCache *cp)
  *
  * Call CatalogCacheInitializeCache() if not yet done.
  */
-pg_attribute_always_inline
+pg_always_inline
 static void
 ConditionalCatalogCacheInitializeCache(CatCache *cache)
 {
diff --git a/src/include/c.h b/src/include/c.h
index 0e4aea5d5a3..0e8053d1fe3 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -348,20 +348,20 @@ extern "C++"
 #endif
 
 /*
- * Use "pg_attribute_always_inline" in place of "inline" for functions that
+ * Use "pg_always_inline" in place of "inline" for functions that
  * we wish to force inlining of, even when the compiler's heuristics would
  * choose not to.  But, if possible, don't force inlining in unoptimized
  * debug builds.
  */
 #if defined(__GNUC__) && defined(__OPTIMIZE__)
 /* GCC supports always_inline via __attribute__ */
-#define pg_attribute_always_inline __attribute__((always_inline)) inline
+#define pg_always_inline __attribute__((always_inline)) inline
 #elif defined(_MSC_VER)
 /* MSVC has a special keyword for this */
-#define pg_attribute_always_inline __forceinline
+#define pg_always_inline __forceinline
 #else
 /* Otherwise, the best we can do is to say "inline" */
-#define pg_attribute_always_inline inline
+#define pg_always_inline inline
 #endif
 
 /*
diff --git a/src/include/executor/execScan.h b/src/include/executor/execScan.h
index 18b03235c3c..7f795b0b3fc 100644
--- a/src/include/executor/execScan.h
+++ b/src/include/executor/execScan.h
@@ -24,12 +24,12 @@
  * This routine substitutes a test tuple if inside an EvalPlanQual recheck.
  * Otherwise, it simply executes the access method's next-tuple routine.
  *
- * The pg_attribute_always_inline attribute allows the compiler to inline
+ * The pg_always_inline attribute allows the compiler to inline
  * this function into its caller. When EPQState is NULL, the EvalPlanQual
  * logic is completely eliminated at compile time, avoiding unnecessary
  * run-time checks and code for cases where EPQ is not required.
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 ExecScanFetch(ScanState *node,
 			  EPQState *epqstate,
 			  ExecScanAccessMtd accessMtd,
@@ -145,7 +145,7 @@ ExecScanFetch(ScanState *node,
  * conditions enforced by the access method.
  *
  * This function is an alternative to ExecScan, used when callers may omit
- * 'qual' or 'projInfo'. The pg_attribute_always_inline attribute allows the
+ * 'qual' or 'projInfo'. The pg_always_inline attribute allows the
  * compiler to eliminate non-relevant branches at compile time, avoiding
  * run-time checks in those cases.
  *
@@ -157,7 +157,7 @@ ExecScanFetch(ScanState *node,
  *	positioned before the first qualifying tuple.
  * ----------------------------------------------------------------
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 ExecScanExtended(ScanState *node,
 				 ExecScanAccessMtd accessMtd,	/* function returning a tuple */
 				 ExecScanRecheckMtd recheckMtd,
diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h
index 826cc202847..2b74ce91ecb 100644
--- a/src/include/portability/instr_time.h
+++ b/src/include/portability/instr_time.h
@@ -376,7 +376,7 @@ pg_rdtscp(void)
  * only inlining the function partially.
  * See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124795
  */
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks(void)
 {
 	if (likely(timing_tsc_enabled))
@@ -390,7 +390,7 @@ pg_get_ticks(void)
 	return pg_get_ticks_system();
 }
 
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks_fast(void)
 {
 	if (likely(timing_tsc_enabled))
@@ -406,13 +406,13 @@ pg_get_ticks_fast(void)
 
 #else
 
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks(void)
 {
 	return pg_get_ticks_system();
 }
 
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks_fast(void)
 {
 	return pg_get_ticks_system();
-- 
2.54.0



  [text/x-patch] v2-0001-Shorten-pg_attribute_always_inline-to-pg_always_i-19.patch (24.7K, ../../57d9a1c8-d4d7-4154-bb46-9e03ca3bde09@vondra.me/3-v2-0001-Shorten-pg_attribute_always_inline-to-pg_always_i-19.patch)
  download | inline diff:
From 3a47eb9f4be297d030a32fdc8db2002cbe858dcc Mon Sep 17 00:00:00 2001
From: test <test>
Date: Fri, 10 Jul 2026 01:54:38 +0200
Subject: [PATCH v2] Shorten pg_attribute_always_inline to pg_always_inline

The pg_attribute_always_inline macro name is so long it forces pgindent
to format the code in strange ways. Which may incentivize patch authors
to either structure the code in strange ways (e.g. reorder prototypes),
use shorter names, etc. Neither is very desirable for code readability.

This shortens the name by removing the _attribute_ part. It also makes
it more consistent with pg_noinline, which does not have the _attribute_
part either.

Backpatched to all supported branches, to prevent conflicts when
backpatching other fixes. The backbranches however keep both the old
and new macro name, so that existing code keeps working.

Author: Andres Freund <andres@anarazel.de>
Reviewed-by: Peter Geoghegan <pg@bowt.ie>
Reviewed-by: Tomas Vondra <tomas@vondra.me>
Discussion: https://postgr.es/m/bqqdehahpoa36igpictuqyn2s2mexk3t3ehidh2ffd2slb35e5@rzgksuiszgbg
Backpatch-through: 14
---
 src/backend/access/heap/heapam.c      |  2 +-
 src/backend/access/transam/xlog.c     |  4 +-
 src/backend/commands/copyfromparse.c  | 32 ++++++++--------
 src/backend/commands/copyto.c         |  4 +-
 src/backend/executor/execExprInterp.c | 54 +++++++++++++--------------
 src/backend/executor/execTuples.c     |  6 +--
 src/backend/executor/nodeHashjoin.c   |  2 +-
 src/backend/executor/nodeSeqscan.c    |  4 +-
 src/backend/nodes/queryjumblefuncs.c  |  6 +--
 src/backend/storage/buffer/bufmgr.c   | 24 ++++++------
 src/backend/utils/adt/json.c          |  2 +-
 src/backend/utils/cache/catcache.c    |  2 +-
 src/include/c.h                       |  9 ++++-
 src/include/executor/execScan.h       |  8 ++--
 src/include/portability/instr_time.h  |  8 ++--
 15 files changed, 87 insertions(+), 80 deletions(-)

diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index abfd8e8970a..4f373b86028 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -519,7 +519,7 @@ heap_setscanlimits(TableScanDesc sscan, BlockNumber startBlk, BlockNumber numBlk
  * multiple times, with constant arguments for all_visible,
  * check_serializable.
  */
-pg_attribute_always_inline
+pg_always_inline
 static int
 page_collect_tuples(HeapScanDesc scan, Snapshot snapshot,
 					Page page, Buffer buffer,
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index a81912b7441..254bb158565 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -1143,9 +1143,9 @@ XLogInsertRecord(XLogRecData *rdata,
  *
  * NB: Testing shows that XLogInsertRecord runs faster if this code is inlined;
  * however, because there are two call sites, the compiler is reluctant to
- * inline. We use pg_attribute_always_inline here to try to convince it.
+ * inline. We use pg_always_inline here to try to convince it.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 ReserveXLogInsertLocation(int size, XLogRecPtr *StartPos, XLogRecPtr *EndPos,
 						  XLogRecPtr *PrevPtr)
 {
diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c
index 65fd5a0ab4f..500810577ad 100644
--- a/src/backend/commands/copyfromparse.c
+++ b/src/backend/commands/copyfromparse.c
@@ -144,22 +144,22 @@ static const char BinarySignature[11] = "PGCOPY\n\377\r\n\0";
 
 /* non-export function prototypes */
 static bool CopyReadLine(CopyFromState cstate, bool is_csv);
-static pg_attribute_always_inline bool CopyReadLineText(CopyFromState cstate,
-														bool is_csv);
+static pg_always_inline bool CopyReadLineText(CopyFromState cstate,
+											  bool is_csv);
 static int	CopyReadAttributesText(CopyFromState cstate);
 static int	CopyReadAttributesCSV(CopyFromState cstate);
 static Datum CopyReadBinaryAttribute(CopyFromState cstate, FmgrInfo *flinfo,
 									 Oid typioparam, int32 typmod,
 									 bool *isnull);
-static pg_attribute_always_inline bool CopyFromTextLikeOneRow(CopyFromState cstate,
-															  ExprContext *econtext,
-															  Datum *values,
-															  bool *nulls,
-															  bool is_csv);
-static pg_attribute_always_inline bool NextCopyFromRawFieldsInternal(CopyFromState cstate,
-																	 char ***fields,
-																	 int *nfields,
-																	 bool is_csv);
+static pg_always_inline bool CopyFromTextLikeOneRow(CopyFromState cstate,
+													ExprContext *econtext,
+													Datum *values,
+													bool *nulls,
+													bool is_csv);
+static pg_always_inline bool NextCopyFromRawFieldsInternal(CopyFromState cstate,
+														   char ***fields,
+														   int *nfields,
+														   bool is_csv);
 
 
 /* Low-level communications functions */
@@ -769,11 +769,11 @@ NextCopyFromRawFields(CopyFromState cstate, char ***fields, int *nfields)
  *
  * NOTE: force_not_null option are not applied to the returned fields.
  *
- * We use pg_attribute_always_inline to reduce function call overhead
+ * We use pg_always_inline to reduce function call overhead
  * and to help compilers to optimize away the 'is_csv' condition when called
  * by internal functions such as CopyFromTextLikeOneRow().
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 NextCopyFromRawFieldsInternal(CopyFromState cstate, char ***fields, int *nfields, bool is_csv)
 {
 	int			fldct;
@@ -946,10 +946,10 @@ CopyFromCSVOneRow(CopyFromState cstate, ExprContext *econtext, Datum *values,
 /*
  * Workhorse for CopyFromTextOneRow() and CopyFromCSVOneRow().
  *
- * We use pg_attribute_always_inline to reduce function call overhead
+ * We use pg_always_inline to reduce function call overhead
  * and to help compilers to optimize away the 'is_csv' condition.
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 CopyFromTextLikeOneRow(CopyFromState cstate, ExprContext *econtext,
 					   Datum *values, bool *nulls, bool is_csv)
 {
@@ -1463,7 +1463,7 @@ CopyReadLineTextSIMDHelper(CopyFromState cstate, bool is_csv,
 /*
  * CopyReadLineText - inner loop of CopyReadLine for text mode
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 CopyReadLineText(CopyFromState cstate, bool is_csv)
 {
 	char	   *copy_input_buf;
diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c
index d3adc752ae3..f9bc617ddb1 100644
--- a/src/backend/commands/copyto.c
+++ b/src/backend/commands/copyto.c
@@ -294,10 +294,10 @@ CopyToCSVOneRow(CopyToState cstate, TupleTableSlot *slot)
 /*
  * Workhorse for CopyToTextOneRow() and CopyToCSVOneRow().
  *
- * We use pg_attribute_always_inline to reduce function call overhead
+ * We use pg_always_inline to reduce function call overhead
  * and to help compilers to optimize away the 'is_csv' condition.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 CopyToTextLikeOneRow(CopyToState cstate,
 					 TupleTableSlot *slot,
 					 bool is_csv)
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 0634af964a9..d45812c23aa 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -178,24 +178,24 @@ static Datum ExecJustHashInnerVarVirt(ExprState *state, ExprContext *econtext, b
 static Datum ExecJustHashOuterVarStrict(ExprState *state, ExprContext *econtext, bool *isnull);
 
 /* execution helper functions */
-static pg_attribute_always_inline void ExecEvalArrayCompareInternal(FunctionCallInfo fcinfo,
-																	ArrayType *arr,
-																	int16 typlen,
-																	bool typbyval,
-																	char typalign,
-																	bool useOr,
-																	Datum *result,
-																	bool *resultnull);
-static pg_attribute_always_inline void ExecAggPlainTransByVal(AggState *aggstate,
-															  AggStatePerTrans pertrans,
-															  AggStatePerGroup pergroup,
-															  ExprContext *aggcontext,
-															  int setno);
-static pg_attribute_always_inline void ExecAggPlainTransByRef(AggState *aggstate,
-															  AggStatePerTrans pertrans,
-															  AggStatePerGroup pergroup,
-															  ExprContext *aggcontext,
-															  int setno);
+static pg_always_inline void ExecEvalArrayCompareInternal(FunctionCallInfo fcinfo,
+														  ArrayType *arr,
+														  int16 typlen,
+														  bool typbyval,
+														  char typalign,
+														  bool useOr,
+														  Datum *result,
+														  bool *resultnull);
+static pg_always_inline void ExecAggPlainTransByVal(AggState *aggstate,
+													AggStatePerTrans pertrans,
+													AggStatePerGroup pergroup,
+													ExprContext *aggcontext,
+													int setno);
+static pg_always_inline void ExecAggPlainTransByRef(AggState *aggstate,
+													AggStatePerTrans pertrans,
+													AggStatePerGroup pergroup,
+													ExprContext *aggcontext,
+													int setno);
 static char *ExecGetJsonValueItemString(JsonbValue *item, bool *resnull);
 
 /*
@@ -2552,7 +2552,7 @@ get_cached_rowtype(Oid type_id, int32 typmod,
  */
 
 /* implementation of ExecJust(Inner|Outer|Scan)Var */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustVarImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[1];
@@ -2590,7 +2590,7 @@ ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJustAssign(Inner|Outer|Scan)Var */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustAssignVarImpl(ExprState *state, TupleTableSlot *inslot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[1];
@@ -2685,7 +2685,7 @@ ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJust(Inner|Outer|Scan)VarVirt */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustVarVirtImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[0];
@@ -2728,7 +2728,7 @@ ExecJustScanVarVirt(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJustAssign(Inner|Outer|Scan)VarVirt */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustAssignVarVirtImpl(ExprState *state, TupleTableSlot *inslot, bool *isnull)
 {
 	ExprEvalStep *op = &state->steps[0];
@@ -2807,7 +2807,7 @@ ExecJustHashInnerVarWithIV(ExprState *state, ExprContext *econtext,
 }
 
 /* implementation of ExecJustHash(Inner|Outer)Var */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustHashVarImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *fetchop = &state->steps[0];
@@ -2845,7 +2845,7 @@ ExecJustHashInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
 }
 
 /* implementation of ExecJustHash(Inner|Outer)VarVirt */
-static pg_attribute_always_inline Datum
+static pg_always_inline Datum
 ExecJustHashVarVirtImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
 {
 	ExprEvalStep *var = &state->steps[0];
@@ -4107,7 +4107,7 @@ ExecEvalScalarArrayOp(ExprState *state, ExprEvalStep *op)
  * Callers must handle the strict LHS-is-NULL; return NULL fast path prior to
  * calling this.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 ExecEvalArrayCompareInternal(FunctionCallInfo fcinfo, ArrayType *arr,
 							 int16 typlen, bool typbyval, char typalign,
 							 bool useOr, Datum *result, bool *resultnull)
@@ -5906,7 +5906,7 @@ ExecEvalAggOrderedTransTuple(ExprState *state, ExprEvalStep *op,
 }
 
 /* implementation of transition function invocation for byval types */
-static pg_attribute_always_inline void
+static pg_always_inline void
 ExecAggPlainTransByVal(AggState *aggstate, AggStatePerTrans pertrans,
 					   AggStatePerGroup pergroup,
 					   ExprContext *aggcontext, int setno)
@@ -5938,7 +5938,7 @@ ExecAggPlainTransByVal(AggState *aggstate, AggStatePerTrans pertrans,
 }
 
 /* implementation of transition function invocation for byref types */
-static pg_attribute_always_inline void
+static pg_always_inline void
 ExecAggPlainTransByRef(AggState *aggstate, AggStatePerTrans pertrans,
 					   AggStatePerGroup pergroup,
 					   ExprContext *aggcontext, int setno)
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 7f4ebf95432..97ae019d10a 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -72,8 +72,8 @@
 
 static TupleDesc ExecTypeFromTLInternal(List *targetList,
 										bool skipjunk);
-static pg_attribute_always_inline void slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
-															  int reqnatts, bool support_cstring);
+static pg_always_inline void slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
+													int reqnatts, bool support_cstring);
 static inline void tts_buffer_heap_store_tuple(TupleTableSlot *slot,
 											   HeapTuple tuple,
 											   Buffer buffer,
@@ -1013,7 +1013,7 @@ tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple,
  * emit code during inlining for cstring deforming when it's required.
  * cstrings can exist in MinimalTuples, but not in HeapTuples.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 					   int reqnatts, bool support_cstring)
 {
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c
index 0b365d5b475..202dd866251 100644
--- a/src/backend/executor/nodeHashjoin.c
+++ b/src/backend/executor/nodeHashjoin.c
@@ -221,7 +221,7 @@ static void ExecParallelHashJoinPartitionOuter(HashJoinState *hjstate);
  *			  the other one is "outer".
  * ----------------------------------------------------------------
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 ExecHashJoinImpl(PlanState *pstate, bool parallel)
 {
 	HashJoinState *node = castNode(HashJoinState, pstate);
diff --git a/src/backend/executor/nodeSeqscan.c b/src/backend/executor/nodeSeqscan.c
index 5bcb0a861d7..b8c528ca089 100644
--- a/src/backend/executor/nodeSeqscan.c
+++ b/src/backend/executor/nodeSeqscan.c
@@ -48,7 +48,7 @@ static TupleTableSlot *SeqNext(SeqScanState *node);
  *		This is a workhorse for ExecSeqScan
  * ----------------------------------------------------------------
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 SeqNext(SeqScanState *node)
 {
 	TableScanDesc scandesc;
@@ -95,7 +95,7 @@ SeqNext(SeqScanState *node)
 /*
  * SeqRecheck -- access method routine to recheck a tuple in EvalPlanQual
  */
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 SeqRecheck(SeqScanState *node, TupleTableSlot *slot)
 {
 	/*
diff --git a/src/backend/nodes/queryjumblefuncs.c b/src/backend/nodes/queryjumblefuncs.c
index 7c63766a51c..2ce27b9e552 100644
--- a/src/backend/nodes/queryjumblefuncs.c
+++ b/src/backend/nodes/queryjumblefuncs.c
@@ -232,7 +232,7 @@ DoJumble(JumbleState *jstate, Node *node)
  *
  * Note: Callers must ensure that size > 0.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 AppendJumbleInternal(JumbleState *jstate, const unsigned char *item,
 					 Size size)
 {
@@ -308,7 +308,7 @@ AppendJumble(JumbleState *jstate, const unsigned char *value, Size size)
  * AppendJumbleNull
  *		For jumbling NULL pointers
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 AppendJumbleNull(JumbleState *jstate)
 {
 	jstate->pending_nulls++;
@@ -375,7 +375,7 @@ AppendJumble64(JumbleState *jstate, const unsigned char *value)
  *
  * Note: Callers must ensure that there's at least 1 pending NULL.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 FlushPendingNulls(JumbleState *jstate)
 {
 	Assert(jstate->pending_nulls > 0);
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 9ab282a76d1..3908529872a 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -649,10 +649,10 @@ static inline BufferDesc *BufferAlloc(SMgrRelation smgr,
 static bool AsyncReadBuffers(ReadBuffersOperation *operation, int *nblocks_progress);
 static void CheckReadBuffersOperation(ReadBuffersOperation *operation, bool is_complete);
 
-static pg_attribute_always_inline void TrackBufferHit(IOObject io_object,
-													  IOContext io_context,
-													  Relation rel, char persistence, SMgrRelation smgr,
-													  ForkNumber forknum, BlockNumber blocknum);
+static pg_always_inline void TrackBufferHit(IOObject io_object,
+											IOContext io_context,
+											Relation rel, char persistence, SMgrRelation smgr,
+											ForkNumber forknum, BlockNumber blocknum);
 static Buffer GetVictimBuffer(BufferAccessStrategy strategy, IOContext io_context);
 static void FlushUnlockedBuffer(BufferDesc *buf, SMgrRelation reln,
 								IOObject io_object, IOContext io_context);
@@ -1219,7 +1219,7 @@ ZeroAndLockBuffer(Buffer buffer, ReadBufferMode mode, bool already_valid)
  * already present, or false if more work is required to either read it in or
  * zero it.
  */
-static pg_attribute_always_inline Buffer
+static pg_always_inline Buffer
 PinBufferForBlock(Relation rel,
 				  SMgrRelation smgr,
 				  char persistence,
@@ -1272,7 +1272,7 @@ PinBufferForBlock(Relation rel,
  *
  * smgr is required, rel is optional unless using P_NEW.
  */
-static pg_attribute_always_inline Buffer
+static pg_always_inline Buffer
 ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence,
 				  ForkNumber forkNum,
 				  BlockNumber blockNum, ReadBufferMode mode,
@@ -1367,7 +1367,7 @@ ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence,
 	return buffer;
 }
 
-static pg_attribute_always_inline bool
+static pg_always_inline bool
 StartReadBuffersImpl(ReadBuffersOperation *operation,
 					 Buffer *buffers,
 					 BlockNumber blockNum,
@@ -1679,7 +1679,7 @@ CheckReadBuffersOperation(ReadBuffersOperation *operation, bool is_complete)
  * We track various stats related to buffer hits. Because this is done in a
  * few separate places, this helper exists for convenience.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 TrackBufferHit(IOObject io_object, IOContext io_context,
 			   Relation rel, char persistence, SMgrRelation smgr,
 			   ForkNumber forknum, BlockNumber blocknum)
@@ -2193,7 +2193,7 @@ AsyncReadBuffers(ReadBuffersOperation *operation, int *nblocks_progress)
  *
  * No locks are held either at entry or exit.
  */
-static pg_attribute_always_inline BufferDesc *
+static pg_always_inline BufferDesc *
 BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum,
 			BlockNumber blockNum,
 			BufferAccessStrategy strategy,
@@ -8326,7 +8326,7 @@ MarkDirtyAllUnpinnedBuffers(int32 *buffers_dirtied,
  * part of error handling, which in turn could lead to the buffer being
  * replaced while IO is ongoing.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 buffer_stage_common(PgAioHandle *ioh, bool is_write, bool is_temp)
 {
 	uint64	   *io_data;
@@ -8570,7 +8570,7 @@ buffer_readv_encode_error(PgAioResult *result,
  * Helper for AIO readv completion callbacks, supporting both shared and temp
  * buffers. Gets called once for each buffer in a multi-page read.
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 buffer_readv_complete_one(PgAioTargetData *td, uint8 buf_off, Buffer buffer,
 						  uint8 flags, bool failed, bool is_temp,
 						  bool *buffer_invalid,
@@ -8721,7 +8721,7 @@ buffer_readv_complete_one(PgAioTargetData *td, uint8 buf_off, Buffer buffer,
  *
  * Shared between shared and local buffers, to reduce code duplication.
  */
-static pg_attribute_always_inline PgAioResult
+static pg_always_inline PgAioResult
 buffer_readv_complete(PgAioHandle *ioh, PgAioResult prior_result,
 					  uint8 cb_data, bool is_temp)
 {
diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index 0fee1b40d63..dccbe07cd2d 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -1528,7 +1528,7 @@ json_object_two_arg(PG_FUNCTION_ARGS)
  * escape_json_char
  *		Inline helper function for escape_json* functions
  */
-static pg_attribute_always_inline void
+static pg_always_inline void
 escape_json_char(StringInfo buf, char c)
 {
 	switch (c)
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index 6fb35dedf95..0c8955fc61a 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -1091,7 +1091,7 @@ RehashCatCacheLists(CatCache *cp)
  *
  * Call CatalogCacheInitializeCache() if not yet done.
  */
-pg_attribute_always_inline
+pg_always_inline
 static void
 ConditionalCatalogCacheInitializeCache(CatCache *cache)
 {
diff --git a/src/include/c.h b/src/include/c.h
index f32989a6331..c641f004eff 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -289,19 +289,26 @@ extern "C++"
 #endif
 
 /*
- * Use "pg_attribute_always_inline" in place of "inline" for functions that
+ * Use "pg_always_inline" in place of "inline" for functions that
  * we wish to force inlining of, even when the compiler's heuristics would
  * choose not to.  But, if possible, don't force inlining in unoptimized
  * debug builds.
+ *
+ * XXX The "pg_attribute_always_inline" variant is kept for backwards
+ * compatibility with existing code. All new code should use the shorter
+ * variant "pg_always_inline."
  */
 #if defined(__GNUC__) && defined(__OPTIMIZE__)
 /* GCC supports always_inline via __attribute__ */
+#define pg_always_inline __attribute__((always_inline)) inline
 #define pg_attribute_always_inline __attribute__((always_inline)) inline
 #elif defined(_MSC_VER)
 /* MSVC has a special keyword for this */
+#define pg_always_inline __forceinline
 #define pg_attribute_always_inline __forceinline
 #else
 /* Otherwise, the best we can do is to say "inline" */
+#define pg_always_inline inline
 #define pg_attribute_always_inline inline
 #endif
 
diff --git a/src/include/executor/execScan.h b/src/include/executor/execScan.h
index 18b03235c3c..7f795b0b3fc 100644
--- a/src/include/executor/execScan.h
+++ b/src/include/executor/execScan.h
@@ -24,12 +24,12 @@
  * This routine substitutes a test tuple if inside an EvalPlanQual recheck.
  * Otherwise, it simply executes the access method's next-tuple routine.
  *
- * The pg_attribute_always_inline attribute allows the compiler to inline
+ * The pg_always_inline attribute allows the compiler to inline
  * this function into its caller. When EPQState is NULL, the EvalPlanQual
  * logic is completely eliminated at compile time, avoiding unnecessary
  * run-time checks and code for cases where EPQ is not required.
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 ExecScanFetch(ScanState *node,
 			  EPQState *epqstate,
 			  ExecScanAccessMtd accessMtd,
@@ -145,7 +145,7 @@ ExecScanFetch(ScanState *node,
  * conditions enforced by the access method.
  *
  * This function is an alternative to ExecScan, used when callers may omit
- * 'qual' or 'projInfo'. The pg_attribute_always_inline attribute allows the
+ * 'qual' or 'projInfo'. The pg_always_inline attribute allows the
  * compiler to eliminate non-relevant branches at compile time, avoiding
  * run-time checks in those cases.
  *
@@ -157,7 +157,7 @@ ExecScanFetch(ScanState *node,
  *	positioned before the first qualifying tuple.
  * ----------------------------------------------------------------
  */
-static pg_attribute_always_inline TupleTableSlot *
+static pg_always_inline TupleTableSlot *
 ExecScanExtended(ScanState *node,
 				 ExecScanAccessMtd accessMtd,	/* function returning a tuple */
 				 ExecScanRecheckMtd recheckMtd,
diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h
index 655f8737b6f..650770754d5 100644
--- a/src/include/portability/instr_time.h
+++ b/src/include/portability/instr_time.h
@@ -376,7 +376,7 @@ pg_rdtscp(void)
  * only inlining the function partially.
  * See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124795
  */
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks(void)
 {
 	if (likely(timing_tsc_enabled))
@@ -390,7 +390,7 @@ pg_get_ticks(void)
 	return pg_get_ticks_system();
 }
 
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks_fast(void)
 {
 	if (likely(timing_tsc_enabled))
@@ -406,13 +406,13 @@ pg_get_ticks_fast(void)
 
 #else
 
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks(void)
 {
 	return pg_get_ticks_system();
 }
 
-static pg_attribute_always_inline instr_time
+static pg_always_inline instr_time
 pg_get_ticks_fast(void)
 {
 	return pg_get_ticks_system();
-- 
2.54.0



^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-07-08 21:41           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-09 00:02             ` Re: s/pg_attribute_always_inline/pg_always_inline/? David Rowley <dgrowleyml@gmail.com>
  2026-07-09 00:14               ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 00:05                 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-10 00:14                   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 12:34                     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
@ 2026-07-10 16:37                       ` Tomas Vondra <tomas@vondra.me>
  2026-07-10 16:46                         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  0 siblings, 1 reply; 18+ messages in thread

From: Tomas Vondra @ 2026-07-10 16:37 UTC (permalink / raw)
  To: Tom Lane <tgl@sss.pgh.pa.us>; +Cc: David Rowley <dgrowleyml@gmail.com>; Peter Geoghegan <pg@bowt.ie>; Andres Freund <andres@anarazel.de>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

On 7/10/26 14:34, Tomas Vondra wrote:
> On 7/10/26 02:14, Tom Lane wrote:
>> Tomas Vondra <tomas@vondra.me> writes:
>>> Does "backpatching the new macro" mean we'd also adjust all existing
>>> places to use the new macro or not? I mean, we could backpatch just the
>>> bit in c.h. I plan to adjust the places, to minimize possible conflicts
>>> when backpatching other stuff.
>>
>> I think it'd be sufficient to add the new macro to the old branches.
>> The point of back-patching at all, I think, is to save ourselves
>> work if we have to back-patch some new code that uses the new style.
>>
> 
> I'm not very worried about new code using the new macro name. We only
> use it in ~50 places, and I don't think fixes will use it very often.
> It's more likely a fix will touching some code nearby, and the
> cherry-pick will fail because of the difference.
> 
> I intend to backpatch "everything", with backbranches having both macros
> (as in the -19 patch).
> 

FWIW here are the per-version patches what I plan to commit + backpatch.

At some point I was worried we might end up with an awful mix of code
using the two variants of the macro in the backbranches (old removed
code with old naming, and new name in code updated by the backpatch).

But that really does not seem to happen. Essentially the only code stuck
with the old name (pg_atttribute_...) is three lines in tuplesort.c
(which disappeared in 19).

So I think it's fine. I still want to double-check the backpatches.


regards

-- 
Tomas Vondra

Attachments:

  [application/x-compressed-tar] patches.tgz (9.6K, ../../b8eff77d-11f1-4b70-bcc5-4c2721c887bd@vondra.me/2-patches.tgz)
  download

^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-07-08 21:41           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-09 00:02             ` Re: s/pg_attribute_always_inline/pg_always_inline/? David Rowley <dgrowleyml@gmail.com>
  2026-07-09 00:14               ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 00:05                 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-10 00:14                   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 12:34                     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-10 16:37                       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
@ 2026-07-10 16:46                         ` Peter Geoghegan <pg@bowt.ie>
  2026-07-10 17:32                           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  0 siblings, 1 reply; 18+ messages in thread

From: Peter Geoghegan @ 2026-07-10 16:46 UTC (permalink / raw)
  To: Tomas Vondra <tomas@vondra.me>; +Cc: Tom Lane <tgl@sss.pgh.pa.us>; David Rowley <dgrowleyml@gmail.com>; Andres Freund <andres@anarazel.de>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

On Fri, Jul 10, 2026 at 12:37 PM Tomas Vondra <tomas@vondra.me> wrote:
> FWIW here are the per-version patches what I plan to commit + backpatch.

LGTM.

-- 
Peter Geoghegan





^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-07-08 21:41           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-09 00:02             ` Re: s/pg_attribute_always_inline/pg_always_inline/? David Rowley <dgrowleyml@gmail.com>
  2026-07-09 00:14               ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 00:05                 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-10 00:14                   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 12:34                     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-10 16:37                       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-10 16:46                         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
@ 2026-07-10 17:32                           ` Andres Freund <andres@anarazel.de>
  2026-07-10 21:01                             ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  0 siblings, 1 reply; 18+ messages in thread

From: Andres Freund @ 2026-07-10 17:32 UTC (permalink / raw)
  To: Peter Geoghegan <pg@bowt.ie>; +Cc: Tomas Vondra <tomas@vondra.me>; Tom Lane <tgl@sss.pgh.pa.us>; David Rowley <dgrowleyml@gmail.com>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

Hi,

On 2026-07-10 12:46:01 -0400, Peter Geoghegan wrote:
> On Fri, Jul 10, 2026 at 12:37 PM Tomas Vondra <tomas@vondra.me> wrote:
> > FWIW here are the per-version patches what I plan to commit + backpatch.
> 
> LGTM.

Same. Personally I'd not have adjusted the uses of the macro in the
backbranches, but I don't have a problem with you doing that either.

Greetings,

Andres Freund





^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-07-08 21:41           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-09 00:02             ` Re: s/pg_attribute_always_inline/pg_always_inline/? David Rowley <dgrowleyml@gmail.com>
  2026-07-09 00:14               ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 00:05                 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-10 00:14                   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tom Lane <tgl@sss.pgh.pa.us>
  2026-07-10 12:34                     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-10 16:37                       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-07-10 16:46                         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-07-10 17:32                           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
@ 2026-07-10 21:01                             ` Peter Geoghegan <pg@bowt.ie>
  0 siblings, 0 replies; 18+ messages in thread

From: Peter Geoghegan @ 2026-07-10 21:01 UTC (permalink / raw)
  To: Andres Freund <andres@anarazel.de>; +Cc: Tomas Vondra <tomas@vondra.me>; Tom Lane <tgl@sss.pgh.pa.us>; David Rowley <dgrowleyml@gmail.com>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

On Fri, Jul 10, 2026 at 1:32 PM Andres Freund <andres@anarazel.de> wrote:
> Same. Personally I'd not have adjusted the uses of the macro in the
> backbranches, but I don't have a problem with you doing that either.

FWIW a quick Debian code search shows the following Debian packages
depend on the current pg_attribute_always_inline spelling (excluding
Postgres itself):

pg-stat-plans, documentdb, timescaledb, mobilitydb, libpg-query, postgresql-rum

libpg-query and mobilitydb don't really count, because they seem to
vendor src/postgres/include/c.h directly. postgresql-rum and
pg-stat-plans definitely use pg_attribute_always_inline as
straightforward extensions. I think that the rest are also simple
extensions that rely on the authoritative pg_attribute_always_inline,
but I didn't check.

-- 
Peter Geoghegan






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: s/pg_attribute_always_inline/pg_always_inline/?
  2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-04-09 00:00 ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Eisentraut <peter@eisentraut.org>
  2026-04-09 14:40   ` Re: s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
  2026-05-27 22:17     ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-06-12 15:22       ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
  2026-06-12 16:10         ` Re: s/pg_attribute_always_inline/pg_always_inline/? Peter Geoghegan <pg@bowt.ie>
  2026-07-08 21:41           ` Re: s/pg_attribute_always_inline/pg_always_inline/? Tomas Vondra <tomas@vondra.me>
@ 2026-07-09 06:05             ` Peter Geoghegan <pg@bowt.ie>
  1 sibling, 0 replies; 18+ messages in thread

From: Peter Geoghegan @ 2026-07-09 06:05 UTC (permalink / raw)
  To: Tomas Vondra <tomas@vondra.me>; +Cc: Andres Freund <andres@anarazel.de>; Peter Eisentraut <peter@eisentraut.org>; pgsql-hackers

On Wed, Jul 8, 2026 at 5:41 PM Tomas Vondra <tomas@vondra.me> wrote:
> So, what shall we do about this? I've been looking at the v29 of the
> index prefetching patch series, which is using this attribute in a bunch
> of places. And that reminded me of this thread.
>
> I guess we should just commit that, so unless someone objects soon I'll
> just do that. ISTM the agreement is to backpatch this too.

+1 to backpatching, along with a compatibility macro that supports the
original spelling on backbranches only.

-- 
Peter Geoghegan





^ permalink  raw  reply  [nested|flat] 18+ messages in thread


end of thread, other threads:[~2026-07-10 21:01 UTC | newest]

Thread overview: 18+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2026-04-08 21:09 s/pg_attribute_always_inline/pg_always_inline/? Andres Freund <andres@anarazel.de>
2026-04-08 21:30 ` Peter Geoghegan <pg@bowt.ie>
2026-04-09 00:00 ` Peter Eisentraut <peter@eisentraut.org>
2026-04-09 14:40   ` Andres Freund <andres@anarazel.de>
2026-05-27 22:17     ` Peter Geoghegan <pg@bowt.ie>
2026-06-12 15:22       ` Tomas Vondra <tomas@vondra.me>
2026-06-12 16:10         ` Peter Geoghegan <pg@bowt.ie>
2026-07-08 21:41           ` Tomas Vondra <tomas@vondra.me>
2026-07-09 00:02             ` David Rowley <dgrowleyml@gmail.com>
2026-07-09 00:14               ` Tom Lane <tgl@sss.pgh.pa.us>
2026-07-10 00:05                 ` Tomas Vondra <tomas@vondra.me>
2026-07-10 00:14                   ` Tom Lane <tgl@sss.pgh.pa.us>
2026-07-10 12:34                     ` Tomas Vondra <tomas@vondra.me>
2026-07-10 16:37                       ` Tomas Vondra <tomas@vondra.me>
2026-07-10 16:46                         ` Peter Geoghegan <pg@bowt.ie>
2026-07-10 17:32                           ` Andres Freund <andres@anarazel.de>
2026-07-10 21:01                             ` Peter Geoghegan <pg@bowt.ie>
2026-07-09 06:05             ` Peter Geoghegan <pg@bowt.ie>

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox