The file formatting.c contains some hard to read and understand code.
For the attached patch series, I made a few more or less mechanical
passes over it to modernize the code a bit, renamed some symbols to be
clearer, adjusted some types to make things more self-documenting,
removed some redundant code to make some things more compact. I hope
this helps a bit.
From 4dcecd7bfd306cdca86e8ac529043776af06c175 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 01/13] formatting.c cleanup: Remove dashes in comments
This saves some vertical space and makes the comments style more
consistent with the rest of the code.
---
src/backend/utils/adt/formatting.c | 174 ++++++++++-------------------
1 file changed, 59 insertions(+), 115 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index 78e19ac39ac..3adbfcd5592 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -1,4 +1,4 @@
-/* -----------------------------------------------------------------------
+/*-------------------------------------------------------------------------
* formatting.c
*
* src/backend/utils/adt/formatting.c
@@ -54,7 +54,7 @@
* than Oracle :-),
* to_char('Hello', 'X X X X X') -> 'H e l l o'
*
- * -----------------------------------------------------------------------
+ *-------------------------------------------------------------------------
*/
#ifdef DEBUG_TO_FROM_CHAR
@@ -92,32 +92,28 @@
#include "varatt.h"
-/* ----------
+/*
* Routines flags
- * ----------
*/
#define DCH_FLAG 0x1 /* DATE-TIME flag */
#define NUM_FLAG 0x2 /* NUMBER flag */
#define STD_FLAG 0x4 /* STANDARD flag */
-/* ----------
+/*
* KeyWord Index (ascii from position 32 (' ') to 126 (~))
- * ----------
*/
#define KeyWord_INDEX_SIZE ('~' - ' ')
#define KeyWord_INDEX_FILTER(_c) ((_c) <= ' ' || (_c) >= '~' ? 0 : 1)
-/* ----------
+/*
* Maximal length of one node
- * ----------
*/
#define DCH_MAX_ITEM_SIZ 12 /* max localized day name
*/
#define NUM_MAX_ITEM_SIZ 8 /* roman number (RN has 15
chars) */
-/* ----------
+/*
* Format parser structs
- * ----------
*/
typedef struct
{
@@ -127,9 +123,8 @@ typedef struct
type; /* prefix / postfix
*/
} KeySuffix;
-/* ----------
+/*
* FromCharDateMode
- * ----------
*
* This value is used to nominate one of several distinct (and mutually
* exclusive) date conventions that a keyword can belong to.
@@ -171,9 +166,8 @@ typedef struct
#define CLOCK_12_HOUR 1
-/* ----------
+/*
* Full months
- * ----------
*/
static const char *const months_full[] = {
"January", "February", "March", "April", "May", "June", "July",
@@ -184,9 +178,9 @@ static const char *const days_short[] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL
};
-/* ----------
+/*
* AD / BC
- * ----------
+ *
* There is no 0 AD. Years go from 1 BC to 1 AD, so we make it
* positive and map year == -1 to year zero, and shift all negative
* years up one. For interval years, we just return the year.
@@ -216,9 +210,8 @@ static const char *const days_short[] = {
static const char *const adbc_strings[] = {ad_STR, bc_STR, AD_STR, BC_STR,
NULL};
static const char *const adbc_strings_long[] = {a_d_STR, b_c_STR, A_D_STR,
B_C_STR, NULL};
-/* ----------
+/*
* AM / PM
- * ----------
*/
#define A_M_STR "A.M."
#define a_m_STR "a.m."
@@ -243,11 +236,10 @@ static const char *const adbc_strings_long[] = {a_d_STR,
b_c_STR, A_D_STR, B_C_S
static const char *const ampm_strings[] = {am_STR, pm_STR, AM_STR, PM_STR,
NULL};
static const char *const ampm_strings_long[] = {a_m_STR, p_m_STR, A_M_STR,
P_M_STR, NULL};
-/* ----------
+/*
* Months in roman-numeral
* (Must be in reverse order for seq_search (in FROM_CHAR), because
* 'VIII' must have higher precedence than 'V')
- * ----------
*/
static const char *const rm_months_upper[] =
{"XII", "XI", "X", "IX", "VIII", "VII", "VI", "V", "IV", "III", "II", "I",
NULL};
@@ -255,9 +247,8 @@ static const char *const rm_months_upper[] =
static const char *const rm_months_lower[] =
{"xii", "xi", "x", "ix", "viii", "vii", "vi", "v", "iv", "iii", "ii", "i",
NULL};
-/* ----------
+/*
* Roman numerals
- * ----------
*/
static const char *const rm1[] = {"I", "II", "III", "IV", "V", "VI", "VII",
"VIII", "IX", NULL};
static const char *const rm10[] = {"X", "XX", "XXX", "XL", "L", "LX", "LXX",
"LXXX", "XC", NULL};
@@ -289,23 +280,20 @@ static const char *const rm100[] = {"C", "CC", "CCC",
"CD", "D", "DC", "DCC", "D
*/
#define MAX_ROMAN_LEN 15
-/* ----------
+/*
* Ordinal postfixes
- * ----------
*/
static const char *const numTH[] = {"ST", "ND", "RD", "TH", NULL};
static const char *const numth[] = {"st", "nd", "rd", "th", NULL};
-/* ----------
+/*
* Flags & Options:
- * ----------
*/
#define TH_UPPER 1
#define TH_LOWER 2
-/* ----------
+/*
* Number description struct
- * ----------
*/
typedef struct
{
@@ -320,9 +308,8 @@ typedef struct
need_locale; /* needs it locale
*/
} NUMDesc;
-/* ----------
+/*
* Flags for NUMBER version
- * ----------
*/
#define NUM_F_DECIMAL (1 << 1)
#define NUM_F_LDECIMAL (1 << 2)
@@ -343,9 +330,8 @@ typedef struct
#define NUM_LSIGN_POST 1
#define NUM_LSIGN_NONE 0
-/* ----------
+/*
* Tests
- * ----------
*/
#define IS_DECIMAL(_f) ((_f)->flag & NUM_F_DECIMAL)
#define IS_LDECIMAL(_f) ((_f)->flag & NUM_F_LDECIMAL)
@@ -360,7 +346,7 @@ typedef struct
#define IS_MULTI(_f) ((_f)->flag & NUM_F_MULTI)
#define IS_EEEE(_f) ((_f)->flag & NUM_F_EEEE)
-/* ----------
+/*
* Format picture cache
*
* We will cache datetime format pictures up to DCH_CACHE_SIZE bytes long;
@@ -376,7 +362,6 @@ typedef struct
*
* The max number of entries in each cache is DCH_CACHE_ENTRIES
* resp. NUM_CACHE_ENTRIES.
- * ----------
*/
#define DCH_CACHE_OVERHEAD \
MAXALIGN(sizeof(bool) + sizeof(int))
@@ -419,9 +404,8 @@ static NUMCacheEntry *NUMCache[NUM_CACHE_ENTRIES];
static int n_NUMCache = 0; /* current number of entries */
static int NUMCounter = 0; /* aging-event counter */
-/* ----------
+/*
* For char->date/time conversion
- * ----------
*/
typedef struct
{
@@ -463,9 +447,8 @@ struct fmt_tz /*
do_to_timestamp's timezone info output */
int gmtoffset; /* GMT offset in
seconds */
};
-/* ----------
+/*
* Debug
- * ----------
*/
#ifdef DEBUG_TO_FROM_CHAR
#define DEBUG_TMFC(_X) \
@@ -484,13 +467,12 @@ struct fmt_tz /*
do_to_timestamp's timezone info output */
#define DEBUG_TM(_X)
#endif
-/* ----------
+/*
* Datetime to char conversion
*
* To support intervals as well as timestamps, we use a custom "tm" struct
* that is almost like struct pg_tm, but has a 64-bit tm_hour field.
* We omit the tm_isdst and tm_zone fields, which are not used here.
- * ----------
*/
struct fmt_tm
{
@@ -561,9 +543,8 @@ do { \
* KeyWord definitions
*****************************************************************************/
-/* ----------
+/*
* Suffixes (FormatNode.suffix is an OR of these codes)
- * ----------
*/
#define DCH_S_FM 0x01
#define DCH_S_TH 0x02
@@ -571,9 +552,8 @@ do { \
#define DCH_S_SP 0x08
#define DCH_S_TM 0x10
-/* ----------
+/*
* Suffix tests
- * ----------
*/
#define S_THth(_s) ((((_s) & DCH_S_TH) || ((_s) & DCH_S_th)) ? 1 : 0)
#define S_TH(_s) (((_s) & DCH_S_TH) ? 1 : 0)
@@ -585,9 +565,8 @@ do { \
#define S_SP(_s) (((_s) & DCH_S_SP) ? 1 : 0)
#define S_TM(_s) (((_s) & DCH_S_TM) ? 1 : 0)
-/* ----------
+/*
* Suffixes definition for DATE-TIME TO/FROM CHAR
- * ----------
*/
#define TM_SUFFIX_LEN 2
@@ -604,7 +583,7 @@ static const KeySuffix DCH_suff[] = {
};
-/* ----------
+/*
* Format-pictures (KeyWord).
*
* The KeyWord field; alphabetic sorted, *BUT* strings alike is sorted
@@ -628,8 +607,6 @@ static const KeySuffix DCH_suff[] = {
* 1) see in index to index['M' - 32],
* 2) take keywords position (enum DCH_MI) from index
* 3) run sequential search in keywords[] from this position
- *
- * ----------
*/
typedef enum
@@ -794,9 +771,8 @@ typedef enum
_NUM_last_
} NUM_poz;
-/* ----------
+/*
* KeyWords for DATE-TIME version
- * ----------
*/
static const KeyWord DCH_keywords[] = {
/* name, len, id, is_digit, date_mode */
@@ -917,11 +893,10 @@ static const KeyWord DCH_keywords[] = {
{NULL, 0, 0, 0, 0}
};
-/* ----------
+/*
* KeyWords for NUMBER version
*
* The is_digit and date_mode fields are not relevant here.
- * ----------
*/
static const KeyWord NUM_keywords[] = {
/* name, len, id is in Index */
@@ -967,9 +942,8 @@ static const KeyWord NUM_keywords[] = {
};
-/* ----------
+/*
* KeyWords index for DATE-TIME version
- * ----------
*/
static const int DCH_index[KeyWord_INDEX_SIZE] = {
/*
@@ -991,9 +965,8 @@ static const int DCH_index[KeyWord_INDEX_SIZE] = {
/*---- chars over 126 are skipped ----*/
};
-/* ----------
+/*
* KeyWords index for NUMBER version
- * ----------
*/
static const int NUM_index[KeyWord_INDEX_SIZE] = {
/*
@@ -1015,9 +988,8 @@ static const int NUM_index[KeyWord_INDEX_SIZE] = {
/*---- chars over 126 are skipped ----*/
};
-/* ----------
+/*
* Number processor struct
- * ----------
*/
typedef struct NUMProc
{
@@ -1062,9 +1034,8 @@ typedef struct NUMProc
#define AMOUNT_TEST(s) (Np->inout_p <= Np->inout + (input_len - (s)))
-/* ----------
+/*
* Functions
- * ----------
*/
static const KeyWord *index_seq_search(const char *str, const KeyWord *kw,
const int *index);
@@ -1125,11 +1096,10 @@ static NUMCacheEntry *NUM_cache_search(const char *str);
static NUMCacheEntry *NUM_cache_fetch(const char *str);
-/* ----------
+/*
* Fast sequential search, use index for data selection which
* go to seq. cycle (it is very fast for unwanted strings)
* (can't be used binary search in format parsing)
- * ----------
*/
static const KeyWord *
index_seq_search(const char *str, const KeyWord *kw, const int *index)
@@ -1181,9 +1151,8 @@ is_separator_char(const char *str)
!(*str >= '0' && *str <= '9'));
}
-/* ----------
+/*
* Prepare NUMDesc (number description struct) via FormatNode struct
- * ----------
*/
static void
NUMDesc_prepare(NUMDesc *num, FormatNode *n)
@@ -1364,12 +1333,11 @@ NUMDesc_prepare(NUMDesc *num, FormatNode *n)
errdetail("\"RN\" may only be used together
with \"FM\".")));
}
-/* ----------
+/*
* Format parser, search small keywords and keyword's suffixes, and make
* format-node tree.
*
* for DATE-TIME & NUMBER version
- * ----------
*/
static void
parse_format(FormatNode *node, const char *str, const KeyWord *kw,
@@ -1514,9 +1482,8 @@ parse_format(FormatNode *node, const char *str, const
KeyWord *kw,
n->suffix = 0;
}
-/* ----------
+/*
* DEBUG: Dump the FormatNode Tree (debug)
- * ----------
*/
#ifdef DEBUG_TO_FROM_CHAR
@@ -1554,10 +1521,9 @@ dump_node(FormatNode *node, int max)
* Private utils
*****************************************************************************/
-/* ----------
+/*
* Return ST/ND/RD/TH for simple (1..9) numbers
* type --> 0 upper, 1 lower
- * ----------
*/
static const char *
get_th(char *num, int type)
@@ -1601,10 +1567,9 @@ get_th(char *num, int type)
}
}
-/* ----------
+/*
* Convert string-number to ordinal string-number
* type --> 0 upper, 1 lower
- * ----------
*/
static char *
str_numth(char *dest, char *num, int type)
@@ -2006,11 +1971,10 @@ asc_toupper_z(const char *buff)
/* asc_initcap_z is not currently needed */
-/* ----------
+/*
* Skip TM / th in FROM_CHAR
*
* If S_THth is on, skip two chars, assuming there are two available
- * ----------
*/
#define SKIP_THth(ptr, _suf) \
do { \
@@ -2023,10 +1987,9 @@ asc_toupper_z(const char *buff)
#ifdef DEBUG_TO_FROM_CHAR
-/* -----------
+/*
* DEBUG: Call for debug and for index checking; (Show ASCII char
* and defined keyword for each used position
- * ----------
*/
static void
dump_index(const KeyWord *k, const int *index)
@@ -2055,9 +2018,8 @@ dump_index(const KeyWord *k, const int *index)
}
#endif /* DEBUG */
-/* ----------
+/*
* Return true if next format picture is not digit value
- * ----------
*/
static bool
is_next_separator(FormatNode *n)
@@ -2498,10 +2460,9 @@ from_char_seq_search(int *dest, const char **src, const
char *const *array,
return true;
}
-/* ----------
+/*
* Process a TmToChar struct as denoted by a list of FormatNodes.
* The formatted data is written to the string pointed to by 'out'.
- * ----------
*/
static void
DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid
collid)
@@ -3992,9 +3953,8 @@ datetime_to_char_body(TmToChar *tmtc, text *fmt, bool
is_interval, Oid collid)
* Public routines
***************************************************************************/
-/* -------------------
+/*
* TIMESTAMP to_char()
- * -------------------
*/
Datum
timestamp_to_char(PG_FUNCTION_ARGS)
@@ -4068,9 +4028,8 @@ timestamptz_to_char(PG_FUNCTION_ARGS)
}
-/* -------------------
+/*
* INTERVAL to_char()
- * -------------------
*/
Datum
interval_to_char(PG_FUNCTION_ARGS)
@@ -4107,12 +4066,11 @@ interval_to_char(PG_FUNCTION_ARGS)
PG_RETURN_TEXT_P(res);
}
-/* ---------------------
+/*
* TO_TIMESTAMP()
*
* Make Timestamp from date_str which is formatted at argument 'fmt'
* ( to_timestamp is reverse to_char() )
- * ---------------------
*/
Datum
to_timestamp(PG_FUNCTION_ARGS)
@@ -4148,10 +4106,9 @@ to_timestamp(PG_FUNCTION_ARGS)
PG_RETURN_TIMESTAMP(result);
}
-/* ----------
+/*
* TO_DATE
* Make Date from date_str which is formatted at argument 'fmt'
- * ----------
*/
Datum
to_date(PG_FUNCTION_ARGS)
@@ -4998,9 +4955,8 @@ NUM_cache_fetch(const char *str)
return ent;
}
-/* ----------
+/*
* Cache routine for NUM to_char version
- * ----------
*/
static FormatNode *
NUM_cache(int len, NUMDesc *Num, text *pars_str, bool *shouldFree)
@@ -5271,9 +5227,8 @@ roman_to_int(NUMProc *Np, int input_len)
}
-/* ----------
+/*
* Locale
- * ----------
*/
static void
NUM_prepare_locale(NUMProc *Np)
@@ -5349,13 +5304,12 @@ NUM_prepare_locale(NUMProc *Np)
}
}
-/* ----------
+/*
* Return pointer of last relevant number after decimal point
* 12.0500 --> last relevant is '5'
* 12.0000 --> last relevant is '.'
* If there is no decimal point, return NULL (which will result in same
* behavior as if FM hadn't been specified).
- * ----------
*/
static char *
get_last_relevant_decnum(char *num)
@@ -5381,9 +5335,8 @@ get_last_relevant_decnum(char *num)
return result;
}
-/* ----------
+/*
* Number extraction for TO_NUMBER()
- * ----------
*/
static void
NUM_numpart_from_char(NUMProc *Np, int id, int input_len)
@@ -5596,9 +5549,8 @@ NUM_numpart_from_char(NUMProc *Np, int id, int input_len)
*(_n)->number == '0' && \
(_n)->Num->post != 0)
-/* ----------
+/*
* Add digit or sign to number-string
- * ----------
*/
static void
NUM_numpart_to_char(NUMProc *Np, int id)
@@ -6267,10 +6219,9 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char
*inout,
}
}
-/* ----------
+/*
* MACRO: Start part of NUM - for all NUM's to_char variants
* (sorry, but I hate copy same code - macro is better..)
- * ----------
*/
#define NUM_TOCHAR_prepare \
do { \
@@ -6281,9 +6232,8 @@ do { \
format = NUM_cache(len, &Num, fmt, &shouldFree); \
} while (0)
-/* ----------
+/*
* MACRO: Finish part of NUM
- * ----------
*/
#define NUM_TOCHAR_finish \
do { \
@@ -6303,9 +6253,8 @@ do { \
SET_VARSIZE(result, len + VARHDRSZ); \
} while (0)
-/* -------------------
+/*
* NUMERIC to_number() (convert string to numeric)
- * -------------------
*/
Datum
numeric_to_number(PG_FUNCTION_ARGS)
@@ -6362,9 +6311,8 @@ numeric_to_number(PG_FUNCTION_ARGS)
return result;
}
-/* ------------------
+/*
* NUMERIC to_char()
- * ------------------
*/
Datum
numeric_to_char(PG_FUNCTION_ARGS)
@@ -6490,9 +6438,8 @@ numeric_to_char(PG_FUNCTION_ARGS)
PG_RETURN_TEXT_P(result);
}
-/* ---------------
+/*
* INT4 to_char()
- * ---------------
*/
Datum
int4_to_char(PG_FUNCTION_ARGS)
@@ -6584,9 +6531,8 @@ int4_to_char(PG_FUNCTION_ARGS)
PG_RETURN_TEXT_P(result);
}
-/* ---------------
+/*
* INT8 to_char()
- * ---------------
*/
Datum
int8_to_char(PG_FUNCTION_ARGS)
@@ -6696,9 +6642,8 @@ int8_to_char(PG_FUNCTION_ARGS)
PG_RETURN_TEXT_P(result);
}
-/* -----------------
+/*
* FLOAT4 to_char()
- * -----------------
*/
Datum
float4_to_char(PG_FUNCTION_ARGS)
@@ -6809,9 +6754,8 @@ float4_to_char(PG_FUNCTION_ARGS)
PG_RETURN_TEXT_P(result);
}
-/* -----------------
+/*
* FLOAT8 to_char()
- * -----------------
*/
Datum
float8_to_char(PG_FUNCTION_ARGS)
base-commit: 762faf702c6f7292bd02705553078700d92c15f1
--
2.51.0
From 5fac132f101843e7ccbf8edab82af956eccc5634 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 02/13] formatting.c cleanup: Move loop variables
definitions into for statement
---
src/backend/utils/adt/formatting.c | 45 ++++++++++--------------------
1 file changed, 15 insertions(+), 30 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index 3adbfcd5592..92e6e86ac26 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -1128,9 +1128,7 @@ index_seq_search(const char *str, const KeyWord *kw,
const int *index)
static const KeySuffix *
suff_search(const char *str, const KeySuffix *suf, int type)
{
- const KeySuffix *s;
-
- for (s = suf; s->name != NULL; s++)
+ for (const KeySuffix *s = suf; s->name != NULL; s++)
{
if (s->type != type)
continue;
@@ -1865,14 +1863,13 @@ char *
asc_tolower(const char *buff, size_t nbytes)
{
char *result;
- char *p;
if (!buff)
return NULL;
result = pnstrdup(buff, nbytes);
- for (p = result; *p; p++)
+ for (char *p = result; *p; p++)
*p = pg_ascii_tolower((unsigned char) *p);
return result;
@@ -1888,14 +1885,13 @@ char *
asc_toupper(const char *buff, size_t nbytes)
{
char *result;
- char *p;
if (!buff)
return NULL;
result = pnstrdup(buff, nbytes);
- for (p = result; *p; p++)
+ for (char *p = result; *p; p++)
*p = pg_ascii_toupper((unsigned char) *p);
return result;
@@ -1911,7 +1907,6 @@ char *
asc_initcap(const char *buff, size_t nbytes)
{
char *result;
- char *p;
int wasalnum = false;
if (!buff)
@@ -1919,7 +1914,7 @@ asc_initcap(const char *buff, size_t nbytes)
result = pnstrdup(buff, nbytes);
- for (p = result; *p; p++)
+ for (char *p = result; *p; p++)
{
char c;
@@ -1994,13 +1989,12 @@ asc_toupper_z(const char *buff)
static void
dump_index(const KeyWord *k, const int *index)
{
- int i,
- count = 0,
+ int count = 0,
free_i = 0;
elog(DEBUG_elog_output, "TO-FROM_CHAR: Dump KeyWord Index:");
- for (i = 0; i < KeyWord_INDEX_SIZE; i++)
+ for (int i = 0; i < KeyWord_INDEX_SIZE; i++)
{
if (index[i] != -1)
{
@@ -2282,7 +2276,6 @@ static int
seq_search_ascii(const char *name, const char *const *array, int *len)
{
unsigned char firstc;
- const char *const *a;
*len = 0;
@@ -2293,17 +2286,14 @@ seq_search_ascii(const char *name, const char *const
*array, int *len)
/* we handle first char specially to gain some speed */
firstc = pg_ascii_tolower((unsigned char) *name);
- for (a = array; *a != NULL; a++)
+ for (const char *const *a = array; *a != NULL; a++)
{
- const char *p;
- const char *n;
-
/* compare first chars */
if (pg_ascii_tolower((unsigned char) **a) != firstc)
continue;
/* compare rest of string */
- for (p = *a + 1, n = name + 1;; p++, n++)
+ for (const char *p = *a + 1, *n = name + 1;; p++, n++)
{
/* return success if we matched whole array entry */
if (*p == '\0')
@@ -2338,7 +2328,6 @@ seq_search_ascii(const char *name, const char *const
*array, int *len)
static int
seq_search_localized(const char *name, char **array, int *len, Oid collid)
{
- char **a;
char *upper_name;
char *lower_name;
@@ -2352,7 +2341,7 @@ seq_search_localized(const char *name, char **array, int
*len, Oid collid)
* The case-folding processing done below is fairly expensive, so before
* doing that, make a quick pass to see if there is an exact match.
*/
- for (a = array; *a != NULL; a++)
+ for (char **a = array; *a != NULL; a++)
{
int element_len = strlen(*a);
@@ -2371,7 +2360,7 @@ seq_search_localized(const char *name, char **array, int
*len, Oid collid)
lower_name = str_tolower(upper_name, strlen(upper_name), collid);
pfree(upper_name);
- for (a = array; *a != NULL; a++)
+ for (char **a = array; *a != NULL; a++)
{
char *upper_element;
char *lower_element;
@@ -2438,9 +2427,8 @@ from_char_seq_search(int *dest, const char **src, const
char *const *array,
* any) to avoid including irrelevant data.
*/
char *copy = pstrdup(*src);
- char *c;
- for (c = copy; *c; c++)
+ for (char *c = copy; *c; c++)
{
if (scanner_isspace(*c))
{
@@ -2467,7 +2455,6 @@ from_char_seq_search(int *dest, const char **src, const
char *const *array,
static void
DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid
collid)
{
- FormatNode *n;
char *s;
struct fmt_tm *tm = &in->tm;
int i;
@@ -2476,7 +2463,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
cache_locale_time();
s = out;
- for (n = node; n->type != NODE_TYPE_END; n++)
+ for (FormatNode *n = node; n->type != NODE_TYPE_END; n++)
{
if (n->type != NODE_TYPE_ACTION)
{
@@ -3686,10 +3673,9 @@ DCH_prevent_counter_overflow(void)
static int
DCH_datetime_type(FormatNode *node)
{
- FormatNode *n;
int flags = 0;
- for (n = node; n->type != NODE_TYPE_END; n++)
+ for (FormatNode *n = node; n->type != NODE_TYPE_END; n++)
{
if (n->type != NODE_TYPE_ACTION)
continue;
@@ -5026,8 +5012,7 @@ int_to_roman(int number)
{
int len,
num;
- char *p,
- *result,
+ char *result,
numstr[12];
result = (char *) palloc(MAX_ROMAN_LEN + 1);
@@ -5048,7 +5033,7 @@ int_to_roman(int number)
len = snprintf(numstr, sizeof(numstr), "%d", number);
Assert(len > 0 && len <= 4);
- for (p = numstr; *p != '\0'; p++, --len)
+ for (char *p = numstr; *p != '\0'; p++, --len)
{
num = *p - ('0' + 1);
if (num < 0)
--
2.51.0
From c34cf49b22e465c226524bcf56fa4f2c40935f3e Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 03/13] formatting.c cleanup: Use size_t for string length
variables and arguments
---
src/backend/utils/adt/formatting.c | 96 +++++++++++++++---------------
1 file changed, 48 insertions(+), 48 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index 92e6e86ac26..93f497e31cb 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -118,9 +118,9 @@
typedef struct
{
const char *name; /* suffix string
*/
- int len, /* suffix length
*/
- id, /* used in
node->suffix */
- type; /* prefix / postfix
*/
+ size_t len; /* suffix length
*/
+ int id; /* used in
node->suffix */
+ int type; /* prefix / postfix
*/
} KeySuffix;
/*
@@ -139,7 +139,7 @@ typedef enum
typedef struct
{
const char *name;
- int len;
+ size_t len;
int id;
bool is_digit;
FromCharDateMode date_mode;
@@ -1058,17 +1058,17 @@ static void dump_node(FormatNode *node, int max);
static const char *get_th(char *num, int type);
static char *str_numth(char *dest, char *num, int type);
static int adjust_partial_year_to_2020(int year);
-static int strspace_len(const char *str);
+static size_t strspace_len(const char *str);
static bool from_char_set_mode(TmFromChar *tmfc, const FromCharDateMode mode,
Node *escontext);
static bool from_char_set_int(int *dest, const int value, const FormatNode
*node,
Node *escontext);
-static int from_char_parse_int_len(int *dest, const char **src, const int
len,
+static int from_char_parse_int_len(int *dest, const char **src, const
size_t len,
FormatNode *node, Node *escontext);
static int from_char_parse_int(int *dest, const char **src, FormatNode
*node,
Node
*escontext);
-static int seq_search_ascii(const char *name, const char *const *array,
int *len);
-static int seq_search_localized(const char *name, char **array, int *len,
+static int seq_search_ascii(const char *name, const char *const *array,
size_t *len);
+static int seq_search_localized(const char *name, char **array, size_t
*len,
Oid collid);
static bool from_char_seq_search(int *dest, const char **src,
const char
*const *array,
@@ -1077,16 +1077,16 @@ static bool from_char_seq_search(int *dest, const char
**src,
static bool do_to_timestamp(text *date_txt, text *fmt, Oid collid, bool std,
struct pg_tm *tm,
fsec_t *fsec, struct fmt_tz *tz,
int *fprec, uint32
*flags, Node *escontext);
-static char *fill_str(char *str, int c, int max);
+static char *fill_str(char *str, int c, size_t maxlen);
static FormatNode *NUM_cache(int len, NUMDesc *Num, text *pars_str, bool
*shouldFree);
static char *int_to_roman(int number);
-static int roman_to_int(NUMProc *Np, int input_len);
+static int roman_to_int(NUMProc *Np, size_t input_len);
static void NUM_prepare_locale(NUMProc *Np);
static char *get_last_relevant_decnum(char *num);
-static void NUM_numpart_from_char(NUMProc *Np, int id, int input_len);
+static void NUM_numpart_from_char(NUMProc *Np, int id, size_t input_len);
static void NUM_numpart_to_char(NUMProc *Np, int id);
static char *NUM_processor(FormatNode *node, NUMDesc *Num, char *inout,
- char *number, int input_len,
int to_char_out_pre_spaces,
+ char *number, size_t
input_len, int to_char_out_pre_spaces,
int sign, bool is_to_char,
Oid collid);
static DCHCacheEntry *DCH_cache_getnew(const char *str, bool std);
static DCHCacheEntry *DCH_cache_search(const char *str, bool std);
@@ -1526,8 +1526,8 @@ dump_node(FormatNode *node, int max)
static const char *
get_th(char *num, int type)
{
- int len = strlen(num),
- last;
+ size_t len = strlen(num);
+ char last;
Assert(len > 0);
@@ -2072,10 +2072,10 @@ adjust_partial_year_to_2020(int year)
}
-static int
+static size_t
strspace_len(const char *str)
{
- int len = 0;
+ size_t len = 0;
while (*str && isspace((unsigned char) *str))
{
@@ -2158,13 +2158,13 @@ from_char_set_int(int *dest, const int value, const
FormatNode *node,
* with DD and MI).
*/
static int
-from_char_parse_int_len(int *dest, const char **src, const int len, FormatNode
*node,
+from_char_parse_int_len(int *dest, const char **src, const size_t len,
FormatNode *node,
Node *escontext)
{
long result;
char copy[DCH_MAX_ITEM_SIZ + 1];
const char *init = *src;
- int used;
+ size_t used;
/*
* Skip any whitespace before parsing the integer.
@@ -2172,7 +2172,7 @@ from_char_parse_int_len(int *dest, const char **src,
const int len, FormatNode *
*src += strspace_len(*src);
Assert(len <= DCH_MAX_ITEM_SIZ);
- used = (int) strlcpy(copy, *src, len + 1);
+ used = strlcpy(copy, *src, len + 1);
if (S_FM(node->suffix) || is_next_separator(node))
{
@@ -2199,7 +2199,7 @@ from_char_parse_int_len(int *dest, const char **src,
const int len, FormatNode *
(errcode(ERRCODE_INVALID_DATETIME_FORMAT),
errmsg("source string too short for
\"%s\" formatting field",
node->key->name),
- errdetail("Field requires %d
characters, but only %d remain.",
+ errdetail("Field requires %zu
characters, but only %zu remain.",
len, used),
errhint("If your source string is not
fixed-width, "
"try using the \"FM\"
modifier.")));
@@ -2213,7 +2213,7 @@ from_char_parse_int_len(int *dest, const char **src,
const int len, FormatNode *
(errcode(ERRCODE_INVALID_DATETIME_FORMAT),
errmsg("invalid value \"%s\" for
\"%s\"",
copy, node->key->name),
- errdetail("Field requires %d
characters, but only %d could be parsed.",
+ errdetail("Field requires %zu
characters, but only %zu could be parsed.",
len, used),
errhint("If your source string is not
fixed-width, "
"try using the \"FM\"
modifier.")));
@@ -2273,7 +2273,7 @@ from_char_parse_int(int *dest, const char **src,
FormatNode *node,
* suitable for comparisons to ASCII strings.
*/
static int
-seq_search_ascii(const char *name, const char *const *array, int *len)
+seq_search_ascii(const char *name, const char *const *array, size_t *len)
{
unsigned char firstc;
@@ -2326,7 +2326,7 @@ seq_search_ascii(const char *name, const char *const
*array, int *len)
* the arrays exported by pg_locale.c aren't const.
*/
static int
-seq_search_localized(const char *name, char **array, int *len, Oid collid)
+seq_search_localized(const char *name, char **array, size_t *len, Oid collid)
{
char *upper_name;
char *lower_name;
@@ -2343,7 +2343,7 @@ seq_search_localized(const char *name, char **array, int
*len, Oid collid)
*/
for (char **a = array; *a != NULL; a++)
{
- int element_len = strlen(*a);
+ size_t element_len = strlen(*a);
if (strncmp(name, *a, element_len) == 0)
{
@@ -2364,7 +2364,7 @@ seq_search_localized(const char *name, char **array, int
*len, Oid collid)
{
char *upper_element;
char *lower_element;
- int element_len;
+ size_t element_len;
/* Likewise upper/lower-case array element */
upper_element = str_toupper(*a, strlen(*a), collid);
@@ -2413,7 +2413,7 @@ from_char_seq_search(int *dest, const char **src, const
char *const *array,
char **localized_array, Oid collid,
FormatNode *node, Node *escontext)
{
- int len;
+ size_t len;
if (localized_array == NULL)
*dest = seq_search_ascii(*src, array, &len);
@@ -3881,7 +3881,7 @@ datetime_to_char_body(TmToChar *tmtc, text *fmt, bool
is_interval, Oid collid)
char *fmt_str,
*result;
bool incache;
- int fmt_len;
+ size_t fmt_len;
text *res;
/*
@@ -4311,7 +4311,7 @@ bool
datetime_format_has_tz(const char *fmt_str)
{
bool incache;
- int fmt_len = strlen(fmt_str);
+ size_t fmt_len = strlen(fmt_str);
int result;
FormatNode *format;
@@ -4804,10 +4804,10 @@ do_to_timestamp(text *date_txt, text *fmt, Oid collid,
bool std,
static char *
-fill_str(char *str, int c, int max)
+fill_str(char *str, int c, size_t maxlen)
{
- memset(str, c, max);
- *(str + max) = '\0';
+ memset(str, c, maxlen);
+ *(str + maxlen) = '\0';
return str;
}
@@ -5067,10 +5067,10 @@ int_to_roman(int number)
* If input is invalid, return -1.
*/
static int
-roman_to_int(NUMProc *Np, int input_len)
+roman_to_int(NUMProc *Np, size_t input_len)
{
int result = 0;
- int len;
+ size_t len;
char romanChars[MAX_ROMAN_LEN];
int romanValues[MAX_ROMAN_LEN];
int repeatCount = 1;
@@ -5109,7 +5109,7 @@ roman_to_int(NUMProc *Np, int input_len)
return -1; /* No valid roman
numerals. */
/* Check for valid combinations and compute the represented value. */
- for (int i = 0; i < len; i++)
+ for (size_t i = 0; i < len; i++)
{
char currChar = romanChars[i];
int currValue = romanValues[i];
@@ -5324,7 +5324,7 @@ get_last_relevant_decnum(char *num)
* Number extraction for TO_NUMBER()
*/
static void
-NUM_numpart_from_char(NUMProc *Np, int id, int input_len)
+NUM_numpart_from_char(NUMProc *Np, int id, size_t input_len)
{
bool isread = false;
@@ -5358,7 +5358,7 @@ NUM_numpart_from_char(NUMProc *Np, int id, int input_len)
*/
if (IS_LSIGN(Np->Num) && Np->Num->lsign == NUM_LSIGN_PRE)
{
- int x = 0;
+ size_t x = 0;
#ifdef DEBUG_TO_FROM_CHAR
elog(DEBUG_elog_output, "Try read locale pre-sign
(%c)", *Np->inout_p);
@@ -5437,7 +5437,7 @@ NUM_numpart_from_char(NUMProc *Np, int id, int input_len)
* Np->decimal is always just "." if we don't have a D format
token.
* So we just unconditionally match to Np->decimal.
*/
- int x = strlen(Np->decimal);
+ size_t x = strlen(Np->decimal);
#ifdef DEBUG_TO_FROM_CHAR
elog(DEBUG_elog_output, "Try read decimal point (%c)",
@@ -5476,7 +5476,7 @@ NUM_numpart_from_char(NUMProc *Np, int id, int input_len)
(Np->inout_p + 1) < Np->inout + input_len &&
!isdigit((unsigned char) *(Np->inout_p + 1)))
{
- int x;
+ size_t x;
char *tmp = Np->inout_p++;
#ifdef DEBUG_TO_FROM_CHAR
@@ -5728,7 +5728,7 @@ NUM_numpart_to_char(NUMProc *Np, int id)
* Skip over "n" input characters, but only if they aren't numeric data
*/
static void
-NUM_eat_non_data_chars(NUMProc *Np, int n, int input_len)
+NUM_eat_non_data_chars(NUMProc *Np, int n, size_t input_len)
{
while (n-- > 0)
{
@@ -5742,14 +5742,14 @@ NUM_eat_non_data_chars(NUMProc *Np, int n, int
input_len)
static char *
NUM_processor(FormatNode *node, NUMDesc *Num, char *inout,
- char *number, int input_len, int
to_char_out_pre_spaces,
+ char *number, size_t input_len, int
to_char_out_pre_spaces,
int sign, bool is_to_char, Oid collid)
{
FormatNode *n;
NUMProc _Np,
*Np = &_Np;
const char *pattern;
- int pattern_len;
+ size_t pattern_len;
MemSet(Np, 0, sizeof(NUMProc));
@@ -5830,7 +5830,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout,
*/
if (Np->last_relevant && Np->Num->zero_end >
Np->out_pre_spaces)
{
- int last_zero_pos;
+ size_t last_zero_pos;
char *last_zero;
/* note that Np->number cannot be zero-length
here */
@@ -6222,7 +6222,7 @@ do { \
*/
#define NUM_TOCHAR_finish \
do { \
- int len; \
+ size_t len; \
\
NUM_processor(format, &Num, VARDATA(result), numstr, 0, out_pre_spaces,
sign, true, PG_GET_COLLATION()); \
\
@@ -6367,7 +6367,7 @@ numeric_to_char(PG_FUNCTION_ARGS)
}
else
{
- int numstr_pre_len;
+ size_t numstr_pre_len;
Numeric val = value;
Numeric x;
@@ -6464,7 +6464,7 @@ int4_to_char(PG_FUNCTION_ARGS)
}
else
{
- int numstr_pre_len;
+ size_t numstr_pre_len;
if (IS_MULTI(&Num))
{
@@ -6573,7 +6573,7 @@ int8_to_char(PG_FUNCTION_ARGS)
}
else
{
- int numstr_pre_len;
+ size_t numstr_pre_len;
if (IS_MULTI(&Num))
{
@@ -6687,7 +6687,7 @@ float4_to_char(PG_FUNCTION_ARGS)
{
float4 val = value;
char *orgnum;
- int numstr_pre_len;
+ size_t numstr_pre_len;
if (IS_MULTI(&Num))
{
@@ -6799,7 +6799,7 @@ float8_to_char(PG_FUNCTION_ARGS)
{
float8 val = value;
char *orgnum;
- int numstr_pre_len;
+ size_t numstr_pre_len;
if (IS_MULTI(&Num))
{
--
2.51.0
From 6e12166dfea398e72cee8696d906e68a07382206 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 04/13] formatting.c cleanup: Add some const char *
qualifiers
---
src/backend/utils/adt/formatting.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index 93f497e31cb..d949153dfb4 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -436,7 +436,7 @@ typedef struct
bool has_tz; /* was there a TZ field? */
int gmtoffset; /* GMT offset of
fixed-offset zone abbrev */
pg_tz *tzp; /* pg_tz for dynamic abbrev */
- char *abbrev; /* dynamic abbrev */
+ const char *abbrev; /* dynamic abbrev */
} TmFromChar;
#define ZERO_tmfc(_X) memset(_X, 0, sizeof(TmFromChar))
@@ -1055,8 +1055,8 @@ static void dump_index(const KeyWord *k, const int
*index);
static void dump_node(FormatNode *node, int max);
#endif
-static const char *get_th(char *num, int type);
-static char *str_numth(char *dest, char *num, int type);
+static const char *get_th(const char *num, int type);
+static char *str_numth(char *dest, const char *num, int type);
static int adjust_partial_year_to_2020(int year);
static size_t strspace_len(const char *str);
static bool from_char_set_mode(TmFromChar *tmfc, const FromCharDateMode mode,
@@ -1082,7 +1082,7 @@ static FormatNode *NUM_cache(int len, NUMDesc *Num, text
*pars_str, bool *should
static char *int_to_roman(int number);
static int roman_to_int(NUMProc *Np, size_t input_len);
static void NUM_prepare_locale(NUMProc *Np);
-static char *get_last_relevant_decnum(char *num);
+static char *get_last_relevant_decnum(const char *num);
static void NUM_numpart_from_char(NUMProc *Np, int id, size_t input_len);
static void NUM_numpart_to_char(NUMProc *Np, int id);
static char *NUM_processor(FormatNode *node, NUMDesc *Num, char *inout,
@@ -1524,7 +1524,7 @@ dump_node(FormatNode *node, int max)
* type --> 0 upper, 1 lower
*/
static const char *
-get_th(char *num, int type)
+get_th(const char *num, int type)
{
size_t len = strlen(num);
char last;
@@ -1570,7 +1570,7 @@ get_th(char *num, int type)
* type --> 0 upper, 1 lower
*/
static char *
-str_numth(char *dest, char *num, int type)
+str_numth(char *dest, const char *num, int type)
{
if (dest != num)
strcpy(dest, num);
@@ -5297,7 +5297,7 @@ NUM_prepare_locale(NUMProc *Np)
* behavior as if FM hadn't been specified).
*/
static char *
-get_last_relevant_decnum(char *num)
+get_last_relevant_decnum(const char *num)
{
char *result,
*p = strchr(num, '.');
--
2.51.0
From 1f75a3249aff857049f29bbdf45d79ac0116a8a8 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 05/13] formatting.c cleanup: Use array syntax instead of
pointer arithmetic
for easier readability
---
src/backend/utils/adt/formatting.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index d949153dfb4..0671acf2874 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -1109,7 +1109,7 @@ index_seq_search(const char *str, const KeyWord *kw,
const int *index)
if (!KeyWord_INDEX_FILTER(*str))
return NULL;
- if ((poz = *(index + (*str - ' '))) > -1)
+ if ((poz = index[*str - ' ']) > -1)
{
const KeyWord *k = kw + poz;
@@ -1531,7 +1531,7 @@ get_th(const char *num, int type)
Assert(len > 0);
- last = *(num + (len - 1));
+ last = num[len - 1];
if (!isdigit((unsigned char) last))
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
@@ -4807,7 +4807,7 @@ static char *
fill_str(char *str, int c, size_t maxlen)
{
memset(str, c, maxlen);
- *(str + maxlen) = '\0';
+ str[maxlen] = '\0';
return str;
}
--
2.51.0
From 26970c5c4e0781305968b206261b38605afe9888 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 06/13] formatting.c cleanup: Remove unnecessary extra
parentheses
---
src/backend/utils/adt/formatting.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index 0671acf2874..1a40463023c 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -1200,7 +1200,7 @@ NUMDesc_prepare(NUMDesc *num, FormatNode *n)
break;
case NUM_B:
- if (num->pre == 0 && num->post == 0 && (!IS_ZERO(num)))
+ if (num->pre == 0 && num->post == 0 && !IS_ZERO(num))
num->flag |= NUM_F_BLANK;
break;
@@ -1541,7 +1541,7 @@ get_th(const char *num, int type)
* All "teens" (<x>1[0-9]) get 'TH/th', while <x>[02-9][123] still get
* 'ST/st', 'ND/nd', 'RD/rd', respectively
*/
- if ((len > 1) && (num[len - 2] == '1'))
+ if (len > 1 && num[len - 2] == '1')
last = 0;
switch (last)
--
2.51.0
From 821d03e2c7b5f54d0a3ccedaacd277b4854e2f6d Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 07/13] formatting.c cleanup: Remove unnecessary extra line
breaks in error message literals
---
src/backend/utils/adt/formatting.c | 36 ++++++++++--------------------
1 file changed, 12 insertions(+), 24 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index 1a40463023c..e11b01242c0 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -2106,8 +2106,7 @@ from_char_set_mode(TmFromChar *tmfc, const
FromCharDateMode mode,
ereturn(escontext, false,
(errcode(ERRCODE_INVALID_DATETIME_FORMAT),
errmsg("invalid combination of date
conventions"),
- errhint("Do not mix Gregorian and ISO
week date "
- "conventions in a
formatting template.")));
+ errhint("Do not mix Gregorian and ISO
week date conventions in a formatting template.")));
}
return true;
}
@@ -2130,8 +2129,7 @@ from_char_set_int(int *dest, const int value, const
FormatNode *node,
(errcode(ERRCODE_INVALID_DATETIME_FORMAT),
errmsg("conflicting values for \"%s\" field in
formatting string",
node->key->name),
- errdetail("This value contradicts a previous
setting "
- "for the same field
type.")));
+ errdetail("This value contradicts a previous
setting for the same field type.")));
*dest = value;
return true;
}
@@ -2201,8 +2199,7 @@ from_char_parse_int_len(int *dest, const char **src,
const size_t len, FormatNod
node->key->name),
errdetail("Field requires %zu
characters, but only %zu remain.",
len, used),
- errhint("If your source string is not
fixed-width, "
- "try using the \"FM\"
modifier.")));
+ errhint("If your source string is not
fixed-width, try using the \"FM\" modifier.")));
errno = 0;
result = strtol(copy, &last, 10);
@@ -2215,8 +2212,7 @@ from_char_parse_int_len(int *dest, const char **src,
const size_t len, FormatNod
copy, node->key->name),
errdetail("Field requires %zu
characters, but only %zu could be parsed.",
len, used),
- errhint("If your source string is not
fixed-width, "
- "try using the \"FM\"
modifier.")));
+ errhint("If your source string is not
fixed-width, try using the \"FM\" modifier.")));
*src += used;
}
@@ -2441,8 +2437,7 @@ from_char_seq_search(int *dest, const char **src, const
char *const *array,
(errcode(ERRCODE_INVALID_DATETIME_FORMAT),
errmsg("invalid value \"%s\" for \"%s\"",
copy, node->key->name),
- errdetail("The given value did not match any
of "
- "the allowed values for this
field.")));
+ errdetail("The given value did not match any
of the allowed values for this field.")));
}
*src += len;
return true;
@@ -3337,8 +3332,7 @@ DCH_from_char(FormatNode *node, const char *in,
TmFromChar *out,
*/
ereturn(escontext,,
(errcode(ERRCODE_INVALID_DATETIME_FORMAT),
-
errmsg("invalid value \"%s\" for \"%s\"",
-
s, n->key->name),
+
errmsg("invalid value \"%s\" for \"%s\"", s, n->key->name),
errdetail("Time zone abbreviation is not recognized.")));
}
/* otherwise parse it like OF */
@@ -3540,8 +3534,7 @@ DCH_from_char(FormatNode *node, const char *in,
TmFromChar *out,
if (matched < 2)
ereturn(escontext,,
(errcode(ERRCODE_INVALID_DATETIME_FORMAT),
-
errmsg("invalid value \"%s\" for \"%s\"",
-
s, "Y,YYY")));
+
errmsg("invalid value \"%s\" for \"%s\"", s, "Y,YYY")));
/* years += (millennia * 1000); */
if (pg_mul_s32_overflow(millennia,
1000, &millennia) ||
@@ -4114,8 +4107,7 @@ to_date(PG_FUNCTION_ARGS)
if (!IS_VALID_JULIAN(tm.tm_year, tm.tm_mon, tm.tm_mday))
ereport(ERROR,
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
- errmsg("date out of range: \"%s\"",
- text_to_cstring(date_txt))));
+ errmsg("date out of range: \"%s\"",
text_to_cstring(date_txt))));
result = date2j(tm.tm_year, tm.tm_mon, tm.tm_mday) -
POSTGRES_EPOCH_JDATE;
@@ -4123,8 +4115,7 @@ to_date(PG_FUNCTION_ARGS)
if (!IS_VALID_DATE(result))
ereport(ERROR,
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
- errmsg("date out of range: \"%s\"",
- text_to_cstring(date_txt))));
+ errmsg("date out of range: \"%s\"",
text_to_cstring(date_txt))));
PG_RETURN_DATEADT(result);
}
@@ -4228,8 +4219,7 @@ parse_datetime(text *date_txt, text *fmt, Oid collid,
bool strict,
if (!IS_VALID_JULIAN(tm.tm_year, tm.tm_mon,
tm.tm_mday))
ereturn(escontext, (Datum) 0,
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
- errmsg("date out of
range: \"%s\"",
-
text_to_cstring(date_txt))));
+ errmsg("date out of
range: \"%s\"", text_to_cstring(date_txt))));
result = date2j(tm.tm_year, tm.tm_mon,
tm.tm_mday) -
POSTGRES_EPOCH_JDATE;
@@ -4238,8 +4228,7 @@ parse_datetime(text *date_txt, text *fmt, Oid collid,
bool strict,
if (!IS_VALID_DATE(result))
ereturn(escontext, (Datum) 0,
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
- errmsg("date out of
range: \"%s\"",
-
text_to_cstring(date_txt))));
+ errmsg("date out of
range: \"%s\"", text_to_cstring(date_txt))));
*typid = DATEOID;
return DateADTGetDatum(result);
@@ -4476,8 +4465,7 @@ do_to_timestamp(text *date_txt, text *fmt, Oid collid,
bool std,
{
errsave(escontext,
(errcode(ERRCODE_INVALID_DATETIME_FORMAT),
- errmsg("hour \"%d\" is invalid for the
12-hour clock",
- tm->tm_hour),
+ errmsg("hour \"%d\" is invalid for the
12-hour clock", tm->tm_hour),
errhint("Use the 24-hour clock, or
give an hour between 1 and 12.")));
goto fail;
}
--
2.51.0
From 51994d68b4a8cd52f5e3c29152aaffa4471f6f87 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 08/13] formatting.c cleanup: Remove unnecessary zeroize
macros
Replace with initializer or memset().
---
src/backend/utils/adt/formatting.c | 22 +++-------------------
1 file changed, 3 insertions(+), 19 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index e11b01242c0..a1d59ef859c 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -439,8 +439,6 @@ typedef struct
const char *abbrev; /* dynamic abbrev */
} TmFromChar;
-#define ZERO_tmfc(_X) memset(_X, 0, sizeof(TmFromChar))
-
struct fmt_tz /* do_to_timestamp's timezone
info output */
{
bool has_tz; /* was there any TZ/TZH/TZM
field? */
@@ -4365,7 +4363,7 @@ do_to_timestamp(text *date_txt, text *fmt, Oid collid,
bool std,
int *fprec, uint32 *flags, Node *escontext)
{
FormatNode *format = NULL;
- TmFromChar tmfc;
+ TmFromChar tmfc = {0};
int fmt_len;
char *date_str;
int fmask;
@@ -4376,7 +4374,6 @@ do_to_timestamp(text *date_txt, text *fmt, Oid collid,
bool std,
date_str = text_to_cstring(date_txt);
- ZERO_tmfc(&tmfc);
ZERO_tm(tm);
*fsec = 0;
tz->has_tz = false;
@@ -4799,19 +4796,6 @@ fill_str(char *str, int c, size_t maxlen)
return str;
}
-#define zeroize_NUM(_n) \
-do { \
- (_n)->flag = 0; \
- (_n)->lsign = 0; \
- (_n)->pre = 0; \
- (_n)->post = 0; \
- (_n)->pre_lsign_num = 0; \
- (_n)->need_locale = 0; \
- (_n)->multi = 0; \
- (_n)->zero_start = 0; \
- (_n)->zero_end = 0; \
-} while(0)
-
/* This works the same as DCH_prevent_counter_overflow */
static inline void
NUM_prevent_counter_overflow(void)
@@ -4919,7 +4903,7 @@ NUM_cache_fetch(const char *str)
*/
ent = NUM_cache_getnew(str);
- zeroize_NUM(&ent->Num);
+ memset(&ent->Num, 0, sizeof ent->Num);
parse_format(ent->format, str, NUM_keywords,
NULL, NUM_index, NUM_FLAG, &ent->Num);
@@ -4950,7 +4934,7 @@ NUM_cache(int len, NUMDesc *Num, text *pars_str, bool
*shouldFree)
*shouldFree = true;
- zeroize_NUM(Num);
+ memset(Num, 0, sizeof *Num);
parse_format(format, str, NUM_keywords,
NULL, NUM_index, NUM_FLAG, Num);
--
2.51.0
From 5717ddddbc7a2f9edf0700f96619ab6fb2a4c31b Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 09/13] formatting.c cleanup: Improve formatting of some
struct declarations
This makes future editing easier.
---
src/backend/utils/adt/formatting.c | 64 +++++++++++++++---------------
1 file changed, 32 insertions(+), 32 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index a1d59ef859c..cab3d4374c0 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -297,15 +297,15 @@ static const char *const numth[] = {"st", "nd", "rd",
"th", NULL};
*/
typedef struct
{
- int pre, /* (count) numbers
before decimal */
- post, /* (count) numbers
after decimal */
- lsign, /* want locales sign
*/
- flag, /* number parameters
*/
- pre_lsign_num, /* tmp value for lsign
*/
- multi, /* multiplier for 'V'
*/
- zero_start, /* position of first
zero */
- zero_end, /* position of last
zero */
- need_locale; /* needs it locale
*/
+ int pre; /* (count) numbers
before decimal */
+ int post; /* (count) numbers
after decimal */
+ int lsign; /* want locales sign */
+ int flag; /* number parameters */
+ int pre_lsign_num; /* tmp value for lsign */
+ int multi; /* multiplier for 'V' */
+ int zero_start; /* position of first
zero */
+ int zero_end; /* position of last
zero */
+ int need_locale; /* needs it locale */
} NUMDesc;
/*
@@ -410,29 +410,29 @@ static int NUMCounter = 0; /* aging-event
counter */
typedef struct
{
FromCharDateMode mode;
- int hh,
- pm,
- mi,
- ss,
- ssss,
- d, /* stored as
1-7, Sunday = 1, 0 means missing */
- dd,
- ddd,
- mm,
- ms,
- year,
- bc,
- ww,
- w,
- cc,
- j,
- us,
- yysz, /* is it YY or YYYY ? */
- clock, /* 12 or 24 hour clock?
*/
- tzsign, /* +1, -1, or 0 if no
TZH/TZM fields */
- tzh,
- tzm,
- ff; /* fractional
precision */
+ int hh;
+ int pm;
+ int mi;
+ int ss;
+ int ssss;
+ int d; /* stored as
1-7, Sunday = 1, 0 means missing */
+ int dd;
+ int ddd;
+ int mm;
+ int ms;
+ int year;
+ int bc;
+ int ww;
+ int w;
+ int cc;
+ int j;
+ int us;
+ int yysz; /* is it YY or YYYY ? */
+ int clock; /* 12 or 24 hour clock?
*/
+ int tzsign; /* +1, -1, or 0 if no
TZH/TZM fields */
+ int tzh;
+ int tzm;
+ int ff; /* fractional
precision */
bool has_tz; /* was there a TZ field? */
int gmtoffset; /* GMT offset of
fixed-offset zone abbrev */
pg_tz *tzp; /* pg_tz for dynamic abbrev */
--
2.51.0
From 5c06aec1a9c00aef4042602c5c7e8a2d694e0009 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 10/13] formatting.c cleanup: Change TmFromChar.clock field
to bool
This makes the purpose clearer and avoids having two extra symbols,
one of which (CLOCK_24_HOUR) was unused.
---
src/backend/utils/adt/formatting.c | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index cab3d4374c0..532ed7ab2ad 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -162,9 +162,6 @@ typedef struct
#define SUFFTYPE_PREFIX 1
#define SUFFTYPE_POSTFIX 2
-#define CLOCK_24_HOUR 0
-#define CLOCK_12_HOUR 1
-
/*
* Full months
@@ -428,7 +425,7 @@ typedef struct
int j;
int us;
int yysz; /* is it YY or YYYY ? */
- int clock; /* 12 or 24 hour clock?
*/
+ bool clock_12_hour; /* 12 or 24 hour clock? */
int tzsign; /* +1, -1, or 0 if no
TZH/TZM fields */
int tzh;
int tzm;
@@ -3225,7 +3222,7 @@ DCH_from_char(FormatNode *node, const char *in,
TmFromChar *out,
return;
if (!from_char_set_int(&out->pm, value % 2, n,
escontext))
return;
- out->clock = CLOCK_12_HOUR;
+ out->clock_12_hour = true;
break;
case DCH_AM:
case DCH_PM:
@@ -3237,13 +3234,13 @@ DCH_from_char(FormatNode *node, const char *in,
TmFromChar *out,
return;
if (!from_char_set_int(&out->pm, value % 2, n,
escontext))
return;
- out->clock = CLOCK_12_HOUR;
+ out->clock_12_hour = true;
break;
case DCH_HH:
case DCH_HH12:
if (from_char_parse_int_len(&out->hh, &s, 2, n,
escontext) < 0)
return;
- out->clock = CLOCK_12_HOUR;
+ out->clock_12_hour = true;
SKIP_THth(s, n->suffix);
break;
case DCH_HH24:
@@ -4456,7 +4453,7 @@ do_to_timestamp(text *date_txt, text *fmt, Oid collid,
bool std,
if (tmfc.hh)
tm->tm_hour = tmfc.hh;
- if (tmfc.clock == CLOCK_12_HOUR)
+ if (tmfc.clock_12_hour)
{
if (tm->tm_hour < 1 || tm->tm_hour > HOURS_PER_DAY / 2)
{
--
2.51.0
From 231ac1b944579f203a243753b5f63c521b5d6364 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 11/13] formatting.c cleanup: Change several int fields to
enums
This makes their purpose more self-documenting.
---
src/backend/utils/adt/formatting.c | 76 ++++++++++++++++++------------
1 file changed, 46 insertions(+), 30 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index 532ed7ab2ad..d72e0572e32 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -115,12 +115,19 @@
/*
* Format parser structs
*/
+
+enum KeySuffixType
+{
+ SUFFTYPE_PREFIX = 1,
+ SUFFTYPE_POSTFIX = 2,
+};
+
typedef struct
{
const char *name; /* suffix string
*/
size_t len; /* suffix length
*/
int id; /* used in
node->suffix */
- int type; /* prefix / postfix
*/
+ enum KeySuffixType type; /* prefix / postfix */
} KeySuffix;
/*
@@ -145,23 +152,23 @@ typedef struct
FromCharDateMode date_mode;
} KeyWord;
+enum FormatNodeType
+{
+ NODE_TYPE_END = 1,
+ NODE_TYPE_ACTION = 2,
+ NODE_TYPE_CHAR = 3,
+ NODE_TYPE_SEPARATOR = 4,
+ NODE_TYPE_SPACE = 5,
+};
+
typedef struct
{
- uint8 type; /* NODE_TYPE_XXX, see below */
+ enum FormatNodeType type;
char character[MAX_MULTIBYTE_CHAR_LEN + 1]; /* if type is
CHAR */
- uint8 suffix; /* keyword prefix/suffix code,
if any */
+ uint8 suffix; /* keyword prefix/suffix code,
if any (DCH_S_*) */
const KeyWord *key; /* if type is ACTION */
} FormatNode;
-#define NODE_TYPE_END 1
-#define NODE_TYPE_ACTION 2
-#define NODE_TYPE_CHAR 3
-#define NODE_TYPE_SEPARATOR 4
-#define NODE_TYPE_SPACE 5
-
-#define SUFFTYPE_PREFIX 1
-#define SUFFTYPE_POSTFIX 2
-
/*
* Full months
@@ -286,8 +293,18 @@ static const char *const numth[] = {"st", "nd", "rd",
"th", NULL};
/*
* Flags & Options:
*/
-#define TH_UPPER 1
-#define TH_LOWER 2
+enum TH_Case
+{
+ TH_UPPER = 1,
+ TH_LOWER = 2,
+};
+
+enum NUMDesc_lsign
+{
+ NUM_LSIGN_PRE = -1,
+ NUM_LSIGN_POST = 1,
+ NUM_LSIGN_NONE = 0,
+};
/*
* Number description struct
@@ -296,13 +313,13 @@ typedef struct
{
int pre; /* (count) numbers
before decimal */
int post; /* (count) numbers
after decimal */
- int lsign; /* want locales sign */
- int flag; /* number parameters */
+ enum NUMDesc_lsign lsign; /* want locales sign */
+ int flag; /* number parameters
(NUM_F_*) */
int pre_lsign_num; /* tmp value for lsign */
int multi; /* multiplier for 'V' */
int zero_start; /* position of first
zero */
int zero_end; /* position of last
zero */
- int need_locale; /* needs it locale */
+ bool need_locale; /* needs it locale */
} NUMDesc;
/*
@@ -323,10 +340,6 @@ typedef struct
#define NUM_F_MINUS_POST (1 << 13)
#define NUM_F_EEEE (1 << 14)
-#define NUM_LSIGN_PRE (-1)
-#define NUM_LSIGN_POST 1
-#define NUM_LSIGN_NONE 0
-
/*
* Tests
*/
@@ -553,7 +566,12 @@ do { \
#define S_THth(_s) ((((_s) & DCH_S_TH) || ((_s) & DCH_S_th)) ? 1 : 0)
#define S_TH(_s) (((_s) & DCH_S_TH) ? 1 : 0)
#define S_th(_s) (((_s) & DCH_S_th) ? 1 : 0)
-#define S_TH_TYPE(_s) (((_s) & DCH_S_TH) ? TH_UPPER : TH_LOWER)
+
+static inline enum TH_Case
+S_TH_TYPE(uint8 _s)
+{
+ return _s & DCH_S_TH ? TH_UPPER : TH_LOWER;
+}
/* Oracle toggles FM behavior, we don't; see docs. */
#define S_FM(_s) (((_s) & DCH_S_FM) ? 1 : 0)
@@ -1034,7 +1052,7 @@ typedef struct NUMProc
*/
static const KeyWord *index_seq_search(const char *str, const KeyWord *kw,
const int *index);
-static const KeySuffix *suff_search(const char *str, const KeySuffix *suf, int
type);
+static const KeySuffix *suff_search(const char *str, const KeySuffix *suf,
enum KeySuffixType type);
static bool is_separator_char(const char *str);
static void NUMDesc_prepare(NUMDesc *num, FormatNode *n);
static void parse_format(FormatNode *node, const char *str, const KeyWord *kw,
@@ -1050,8 +1068,8 @@ static void dump_index(const KeyWord *k, const int
*index);
static void dump_node(FormatNode *node, int max);
#endif
-static const char *get_th(const char *num, int type);
-static char *str_numth(char *dest, const char *num, int type);
+static const char *get_th(const char *num, enum TH_Case type);
+static char *str_numth(char *dest, const char *num, enum TH_Case type);
static int adjust_partial_year_to_2020(int year);
static size_t strspace_len(const char *str);
static bool from_char_set_mode(TmFromChar *tmfc, const FromCharDateMode mode,
@@ -1121,7 +1139,7 @@ index_seq_search(const char *str, const KeyWord *kw,
const int *index)
}
static const KeySuffix *
-suff_search(const char *str, const KeySuffix *suf, int type)
+suff_search(const char *str, const KeySuffix *suf, enum KeySuffixType type)
{
for (const KeySuffix *s = suf; s->name != NULL; s++)
{
@@ -1516,10 +1534,9 @@ dump_node(FormatNode *node, int max)
/*
* Return ST/ND/RD/TH for simple (1..9) numbers
- * type --> 0 upper, 1 lower
*/
static const char *
-get_th(const char *num, int type)
+get_th(const char *num, enum TH_Case type)
{
size_t len = strlen(num);
char last;
@@ -1562,10 +1579,9 @@ get_th(const char *num, int type)
/*
* Convert string-number to ordinal string-number
- * type --> 0 upper, 1 lower
*/
static char *
-str_numth(char *dest, const char *num, int type)
+str_numth(char *dest, const char *num, enum TH_Case type)
{
if (dest != num)
strcpy(dest, num);
--
2.51.0
From a295ff6a49f6b9715f8f6ebd0e2035286b58acfe Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 12/13] formatting.c cleanup: Rename DCH_S_* to DCH_SUFFIX_*
For clarity. Also rename several related macros and turn them into
inline functions.
---
src/backend/utils/adt/formatting.c | 239 ++++++++++++++++-------------
1 file changed, 131 insertions(+), 108 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index d72e0572e32..c421625cf60 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -165,7 +165,8 @@ typedef struct
{
enum FormatNodeType type;
char character[MAX_MULTIBYTE_CHAR_LEN + 1]; /* if type is
CHAR */
- uint8 suffix; /* keyword prefix/suffix code,
if any (DCH_S_*) */
+ uint8 suffix; /* keyword prefix/suffix code,
if any
+ *
(DCH_SUFFIX_*) */
const KeyWord *key; /* if type is ACTION */
} FormatNode;
@@ -554,29 +555,51 @@ do { \
/*
* Suffixes (FormatNode.suffix is an OR of these codes)
*/
-#define DCH_S_FM 0x01
-#define DCH_S_TH 0x02
-#define DCH_S_th 0x04
-#define DCH_S_SP 0x08
-#define DCH_S_TM 0x10
+#define DCH_SUFFIX_FM 0x01
+#define DCH_SUFFIX_TH 0x02
+#define DCH_SUFFIX_th 0x04
+#define DCH_SUFFIX_SP 0x08
+#define DCH_SUFFIX_TM 0x10
/*
* Suffix tests
*/
-#define S_THth(_s) ((((_s) & DCH_S_TH) || ((_s) & DCH_S_th)) ? 1 : 0)
-#define S_TH(_s) (((_s) & DCH_S_TH) ? 1 : 0)
-#define S_th(_s) (((_s) & DCH_S_th) ? 1 : 0)
+static inline bool
+IS_SUFFIX_TH(uint8 _s)
+{
+ return (_s & DCH_SUFFIX_TH);
+}
+
+static inline bool
+IS_SUFFIX_th(uint8 _s)
+{
+ return (_s & DCH_SUFFIX_th);
+}
+
+static inline bool
+IS_SUFFIX_THth(uint8 _s)
+{
+ return IS_SUFFIX_TH(_s) || IS_SUFFIX_th(_s);
+}
static inline enum TH_Case
-S_TH_TYPE(uint8 _s)
+SUFFIX_TH_TYPE(uint8 _s)
{
- return _s & DCH_S_TH ? TH_UPPER : TH_LOWER;
+ return _s & DCH_SUFFIX_TH ? TH_UPPER : TH_LOWER;
}
/* Oracle toggles FM behavior, we don't; see docs. */
-#define S_FM(_s) (((_s) & DCH_S_FM) ? 1 : 0)
-#define S_SP(_s) (((_s) & DCH_S_SP) ? 1 : 0)
-#define S_TM(_s) (((_s) & DCH_S_TM) ? 1 : 0)
+static inline bool
+IS_SUFFIX_FM(uint8 _s)
+{
+ return (_s & DCH_SUFFIX_FM);
+}
+
+static inline bool
+IS_SUFFIX_TM(uint8 _s)
+{
+ return (_s & DCH_SUFFIX_TM);
+}
/*
* Suffixes definition for DATE-TIME TO/FROM CHAR
@@ -584,13 +607,13 @@ S_TH_TYPE(uint8 _s)
#define TM_SUFFIX_LEN 2
static const KeySuffix DCH_suff[] = {
- {"FM", 2, DCH_S_FM, SUFFTYPE_PREFIX},
- {"fm", 2, DCH_S_FM, SUFFTYPE_PREFIX},
- {"TM", TM_SUFFIX_LEN, DCH_S_TM, SUFFTYPE_PREFIX},
- {"tm", 2, DCH_S_TM, SUFFTYPE_PREFIX},
- {"TH", 2, DCH_S_TH, SUFFTYPE_POSTFIX},
- {"th", 2, DCH_S_th, SUFFTYPE_POSTFIX},
- {"SP", 2, DCH_S_SP, SUFFTYPE_POSTFIX},
+ {"FM", 2, DCH_SUFFIX_FM, SUFFTYPE_PREFIX},
+ {"fm", 2, DCH_SUFFIX_FM, SUFFTYPE_PREFIX},
+ {"TM", TM_SUFFIX_LEN, DCH_SUFFIX_TM, SUFFTYPE_PREFIX},
+ {"tm", 2, DCH_SUFFIX_TM, SUFFTYPE_PREFIX},
+ {"TH", 2, DCH_SUFFIX_TH, SUFFTYPE_POSTFIX},
+ {"th", 2, DCH_SUFFIX_th, SUFFTYPE_POSTFIX},
+ {"SP", 2, DCH_SUFFIX_SP, SUFFTYPE_POSTFIX},
/* last */
{NULL, 0, 0, 0}
};
@@ -1498,8 +1521,8 @@ parse_format(FormatNode *node, const char *str, const
KeyWord *kw,
*/
#ifdef DEBUG_TO_FROM_CHAR
-#define DUMP_THth(_suf) (S_TH(_suf) ? "TH" : (S_th(_suf) ? "th" : " "))
-#define DUMP_FM(_suf) (S_FM(_suf) ? "FM" : " ")
+#define DUMP_THth(_suf) (SUFFIX_TH(_suf) ? "TH" : (SUFFIX_th(_suf) ? "th" : "
"))
+#define DUMP_FM(_suf) (SUFFIX_FM(_suf) ? "FM" : " ")
static void
dump_node(FormatNode *node, int max)
@@ -1980,11 +2003,11 @@ asc_toupper_z(const char *buff)
/*
* Skip TM / th in FROM_CHAR
*
- * If S_THth is on, skip two chars, assuming there are two available
+ * If SUFFIX_THth is on, skip two chars, assuming there are two available
*/
#define SKIP_THth(ptr, _suf) \
do { \
- if (S_THth(_suf)) \
+ if (IS_SUFFIX_THth(_suf)) \
{ \
if (*(ptr)) (ptr) += pg_mblen(ptr); \
if (*(ptr)) (ptr) += pg_mblen(ptr); \
@@ -2032,7 +2055,7 @@ is_next_separator(FormatNode *n)
if (n->type == NODE_TYPE_END)
return false;
- if (n->type == NODE_TYPE_ACTION && S_THth(n->suffix))
+ if (n->type == NODE_TYPE_ACTION && IS_SUFFIX_THth(n->suffix))
return true;
/*
@@ -2183,7 +2206,7 @@ from_char_parse_int_len(int *dest, const char **src,
const size_t len, FormatNod
Assert(len <= DCH_MAX_ITEM_SIZ);
used = strlcpy(copy, *src, len + 1);
- if (S_FM(node->suffix) || is_next_separator(node))
+ if (IS_SUFFIX_FM(node->suffix) || is_next_separator(node))
{
/*
* This node is in Fill Mode, or the next node is known to be a
@@ -2511,40 +2534,40 @@ DCH_to_char(FormatNode *node, bool is_interval,
TmToChar *in, char *out, Oid col
* display time as shown on a 12-hour clock,
even for
* intervals
*/
- sprintf(s, "%0*lld", S_FM(n->suffix) ? 0 :
(tm->tm_hour >= 0) ? 2 : 3,
+ sprintf(s, "%0*lld", IS_SUFFIX_FM(n->suffix) ?
0 : (tm->tm_hour >= 0) ? 2 : 3,
tm->tm_hour % (HOURS_PER_DAY /
2) == 0 ?
(long long) (HOURS_PER_DAY / 2)
:
(long long) (tm->tm_hour %
(HOURS_PER_DAY / 2)));
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_HH24:
- sprintf(s, "%0*lld", S_FM(n->suffix) ? 0 :
(tm->tm_hour >= 0) ? 2 : 3,
+ sprintf(s, "%0*lld", IS_SUFFIX_FM(n->suffix) ?
0 : (tm->tm_hour >= 0) ? 2 : 3,
(long long) tm->tm_hour);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_MI:
- sprintf(s, "%0*d", S_FM(n->suffix) ? 0 :
(tm->tm_min >= 0) ? 2 : 3,
+ sprintf(s, "%0*d", IS_SUFFIX_FM(n->suffix) ? 0
: (tm->tm_min >= 0) ? 2 : 3,
tm->tm_min);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_SS:
- sprintf(s, "%0*d", S_FM(n->suffix) ? 0 :
(tm->tm_sec >= 0) ? 2 : 3,
+ sprintf(s, "%0*d", IS_SUFFIX_FM(n->suffix) ? 0
: (tm->tm_sec >= 0) ? 2 : 3,
tm->tm_sec);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
#define DCH_to_char_fsec(frac_fmt, frac_val) \
sprintf(s, frac_fmt, (int) (frac_val)); \
- if (S_THth(n->suffix)) \
- str_numth(s, s, S_TH_TYPE(n->suffix)); \
+ if (IS_SUFFIX_THth(n->suffix)) \
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix)); \
s += strlen(s)
case DCH_FF1: /* tenth of second */
@@ -2573,8 +2596,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
(long long) (tm->tm_hour *
SECS_PER_HOUR +
tm->tm_min * SECS_PER_MINUTE +
tm->tm_sec));
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_tz:
@@ -2614,7 +2637,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
INVALID_FOR_INTERVAL;
sprintf(s, "%c%0*d",
(tm->tm_gmtoff >= 0) ? '+' :
'-',
- S_FM(n->suffix) ? 0 : 2,
+ IS_SUFFIX_FM(n->suffix) ? 0 : 2,
abs((int) tm->tm_gmtoff) /
SECS_PER_HOUR);
s += strlen(s);
if (abs((int) tm->tm_gmtoff) % SECS_PER_HOUR !=
0)
@@ -2652,7 +2675,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
INVALID_FOR_INTERVAL;
if (!tm->tm_mon)
break;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_toupper_z(localized_full_months[tm->tm_mon - 1], collid);
@@ -2664,7 +2687,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
errmsg("localized string format value too long")));
}
else
- sprintf(s, "%*s", S_FM(n->suffix) ? 0 :
-9,
+ sprintf(s, "%*s",
IS_SUFFIX_FM(n->suffix) ? 0 : -9,
asc_toupper_z(months_full[tm->tm_mon - 1]));
s += strlen(s);
break;
@@ -2672,7 +2695,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
INVALID_FOR_INTERVAL;
if (!tm->tm_mon)
break;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_initcap_z(localized_full_months[tm->tm_mon - 1], collid);
@@ -2684,7 +2707,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
errmsg("localized string format value too long")));
}
else
- sprintf(s, "%*s", S_FM(n->suffix) ? 0 :
-9,
+ sprintf(s, "%*s",
IS_SUFFIX_FM(n->suffix) ? 0 : -9,
months_full[tm->tm_mon
- 1]);
s += strlen(s);
break;
@@ -2692,7 +2715,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
INVALID_FOR_INTERVAL;
if (!tm->tm_mon)
break;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_tolower_z(localized_full_months[tm->tm_mon - 1], collid);
@@ -2704,7 +2727,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
errmsg("localized string format value too long")));
}
else
- sprintf(s, "%*s", S_FM(n->suffix) ? 0 :
-9,
+ sprintf(s, "%*s",
IS_SUFFIX_FM(n->suffix) ? 0 : -9,
asc_tolower_z(months_full[tm->tm_mon - 1]));
s += strlen(s);
break;
@@ -2712,7 +2735,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
INVALID_FOR_INTERVAL;
if (!tm->tm_mon)
break;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_toupper_z(localized_abbrev_months[tm->tm_mon - 1], collid);
@@ -2731,7 +2754,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
INVALID_FOR_INTERVAL;
if (!tm->tm_mon)
break;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_initcap_z(localized_abbrev_months[tm->tm_mon - 1], collid);
@@ -2750,7 +2773,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
INVALID_FOR_INTERVAL;
if (!tm->tm_mon)
break;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_tolower_z(localized_abbrev_months[tm->tm_mon - 1], collid);
@@ -2766,15 +2789,15 @@ DCH_to_char(FormatNode *node, bool is_interval,
TmToChar *in, char *out, Oid col
s += strlen(s);
break;
case DCH_MM:
- sprintf(s, "%0*d", S_FM(n->suffix) ? 0 :
(tm->tm_mon >= 0) ? 2 : 3,
+ sprintf(s, "%0*d", IS_SUFFIX_FM(n->suffix) ? 0
: (tm->tm_mon >= 0) ? 2 : 3,
tm->tm_mon);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_DAY:
INVALID_FOR_INTERVAL;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_toupper_z(localized_full_days[tm->tm_wday], collid);
@@ -2786,13 +2809,13 @@ DCH_to_char(FormatNode *node, bool is_interval,
TmToChar *in, char *out, Oid col
errmsg("localized string format value too long")));
}
else
- sprintf(s, "%*s", S_FM(n->suffix) ? 0 :
-9,
+ sprintf(s, "%*s",
IS_SUFFIX_FM(n->suffix) ? 0 : -9,
asc_toupper_z(days[tm->tm_wday]));
s += strlen(s);
break;
case DCH_Day:
INVALID_FOR_INTERVAL;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_initcap_z(localized_full_days[tm->tm_wday], collid);
@@ -2804,13 +2827,13 @@ DCH_to_char(FormatNode *node, bool is_interval,
TmToChar *in, char *out, Oid col
errmsg("localized string format value too long")));
}
else
- sprintf(s, "%*s", S_FM(n->suffix) ? 0 :
-9,
+ sprintf(s, "%*s",
IS_SUFFIX_FM(n->suffix) ? 0 : -9,
days[tm->tm_wday]);
s += strlen(s);
break;
case DCH_day:
INVALID_FOR_INTERVAL;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_tolower_z(localized_full_days[tm->tm_wday], collid);
@@ -2822,13 +2845,13 @@ DCH_to_char(FormatNode *node, bool is_interval,
TmToChar *in, char *out, Oid col
errmsg("localized string format value too long")));
}
else
- sprintf(s, "%*s", S_FM(n->suffix) ? 0 :
-9,
+ sprintf(s, "%*s",
IS_SUFFIX_FM(n->suffix) ? 0 : -9,
asc_tolower_z(days[tm->tm_wday]));
s += strlen(s);
break;
case DCH_DY:
INVALID_FOR_INTERVAL;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_toupper_z(localized_abbrev_days[tm->tm_wday], collid);
@@ -2845,7 +2868,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
break;
case DCH_Dy:
INVALID_FOR_INTERVAL;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_initcap_z(localized_abbrev_days[tm->tm_wday], collid);
@@ -2862,7 +2885,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
break;
case DCH_dy:
INVALID_FOR_INTERVAL;
- if (S_TM(n->suffix))
+ if (IS_SUFFIX_TM(n->suffix))
{
char *str =
str_tolower_z(localized_abbrev_days[tm->tm_wday], collid);
@@ -2879,54 +2902,54 @@ DCH_to_char(FormatNode *node, bool is_interval,
TmToChar *in, char *out, Oid col
break;
case DCH_DDD:
case DCH_IDDD:
- sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : 3,
+ sprintf(s, "%0*d", IS_SUFFIX_FM(n->suffix) ? 0
: 3,
(n->key->id == DCH_DDD) ?
tm->tm_yday :
date2isoyearday(tm->tm_year,
tm->tm_mon, tm->tm_mday));
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_DD:
- sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : 2,
tm->tm_mday);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ sprintf(s, "%0*d", IS_SUFFIX_FM(n->suffix) ? 0
: 2, tm->tm_mday);
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_D:
INVALID_FOR_INTERVAL;
sprintf(s, "%d", tm->tm_wday + 1);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_ID:
INVALID_FOR_INTERVAL;
sprintf(s, "%d", (tm->tm_wday == 0) ? 7 :
tm->tm_wday);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_WW:
- sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : 2,
+ sprintf(s, "%0*d", IS_SUFFIX_FM(n->suffix) ? 0
: 2,
(tm->tm_yday - 1) / 7 + 1);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_IW:
- sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : 2,
+ sprintf(s, "%0*d", IS_SUFFIX_FM(n->suffix) ? 0
: 2,
date2isoweek(tm->tm_year,
tm->tm_mon, tm->tm_mday));
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_Q:
if (!tm->tm_mon)
break;
sprintf(s, "%d", (tm->tm_mon - 1) / 3 + 1);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_CC:
@@ -2942,25 +2965,25 @@ DCH_to_char(FormatNode *node, bool is_interval,
TmToChar *in, char *out, Oid col
i = tm->tm_year / 100 - 1;
}
if (i <= 99 && i >= -99)
- sprintf(s, "%0*d", S_FM(n->suffix) ? 0
: (i >= 0) ? 2 : 3, i);
+ sprintf(s, "%0*d",
IS_SUFFIX_FM(n->suffix) ? 0 : (i >= 0) ? 2 : 3, i);
else
sprintf(s, "%d", i);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_Y_YYY:
i = ADJUST_YEAR(tm->tm_year, is_interval) /
1000;
sprintf(s, "%d,%03d", i,
ADJUST_YEAR(tm->tm_year,
is_interval) - (i * 1000));
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_YYYY:
case DCH_IYYY:
sprintf(s, "%0*d",
- S_FM(n->suffix) ? 0 :
+ IS_SUFFIX_FM(n->suffix) ? 0 :
(ADJUST_YEAR(tm->tm_year,
is_interval) >= 0) ? 4 : 5,
(n->key->id == DCH_YYYY ?
ADJUST_YEAR(tm->tm_year,
is_interval) :
@@ -2968,14 +2991,14 @@ DCH_to_char(FormatNode *node, bool is_interval,
TmToChar *in, char *out, Oid col
tm->tm_mon,
tm->tm_mday),
is_interval)));
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_YYY:
case DCH_IYY:
sprintf(s, "%0*d",
- S_FM(n->suffix) ? 0 :
+ IS_SUFFIX_FM(n->suffix) ? 0 :
(ADJUST_YEAR(tm->tm_year,
is_interval) >= 0) ? 3 : 4,
(n->key->id == DCH_YYY ?
ADJUST_YEAR(tm->tm_year,
is_interval) :
@@ -2983,14 +3006,14 @@ DCH_to_char(FormatNode *node, bool is_interval,
TmToChar *in, char *out, Oid col
tm->tm_mon,
tm->tm_mday),
is_interval)) % 1000);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_YY:
case DCH_IY:
sprintf(s, "%0*d",
- S_FM(n->suffix) ? 0 :
+ IS_SUFFIX_FM(n->suffix) ? 0 :
(ADJUST_YEAR(tm->tm_year,
is_interval) >= 0) ? 2 : 3,
(n->key->id == DCH_YY ?
ADJUST_YEAR(tm->tm_year,
is_interval) :
@@ -2998,8 +3021,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
tm->tm_mon,
tm->tm_mday),
is_interval)) % 100);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_Y:
@@ -3011,8 +3034,8 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar
*in, char *out, Oid col
tm->tm_mon,
tm->tm_mday),
is_interval)) % 10);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_RM:
@@ -3067,21 +3090,21 @@ DCH_to_char(FormatNode *node, bool is_interval,
TmToChar *in, char *out, Oid col
mon = MONTHS_PER_YEAR -
tm->tm_mon;
}
- sprintf(s, "%*s", S_FM(n->suffix) ? 0 :
-4,
+ sprintf(s, "%*s",
IS_SUFFIX_FM(n->suffix) ? 0 : -4,
months[mon]);
s += strlen(s);
}
break;
case DCH_W:
sprintf(s, "%d", (tm->tm_mday - 1) / 7 + 1);
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_J:
sprintf(s, "%d", date2j(tm->tm_year,
tm->tm_mon, tm->tm_mday));
- if (S_THth(n->suffix))
- str_numth(s, s, S_TH_TYPE(n->suffix));
+ if (IS_SUFFIX_THth(n->suffix))
+ str_numth(s, s,
SUFFIX_TH_TYPE(n->suffix));
s += strlen(s);
break;
}
@@ -3432,7 +3455,7 @@ DCH_from_char(FormatNode *node, const char *in,
TmFromChar *out,
case DCH_Month:
case DCH_month:
if (!from_char_seq_search(&value, &s,
months_full,
-
S_TM(n->suffix) ? localized_full_months : NULL,
+
IS_SUFFIX_TM(n->suffix) ? localized_full_months : NULL,
collid,
n, escontext))
return;
@@ -3443,7 +3466,7 @@ DCH_from_char(FormatNode *node, const char *in,
TmFromChar *out,
case DCH_Mon:
case DCH_mon:
if (!from_char_seq_search(&value, &s, months,
-
S_TM(n->suffix) ? localized_abbrev_months : NULL,
+
IS_SUFFIX_TM(n->suffix) ? localized_abbrev_months : NULL,
collid,
n, escontext))
return;
@@ -3459,7 +3482,7 @@ DCH_from_char(FormatNode *node, const char *in,
TmFromChar *out,
case DCH_Day:
case DCH_day:
if (!from_char_seq_search(&value, &s, days,
-
S_TM(n->suffix) ? localized_full_days : NULL,
+
IS_SUFFIX_TM(n->suffix) ? localized_full_days : NULL,
collid,
n, escontext))
return;
@@ -3471,7 +3494,7 @@ DCH_from_char(FormatNode *node, const char *in,
TmFromChar *out,
case DCH_Dy:
case DCH_dy:
if (!from_char_seq_search(&value, &s,
days_short,
-
S_TM(n->suffix) ? localized_abbrev_days : NULL,
+
IS_SUFFIX_TM(n->suffix) ? localized_abbrev_days : NULL,
collid,
n, escontext))
return;
--
2.51.0
From 9038f68c2877a10b6b3303e8a51fb48ec6ad6516 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 20 Oct 2025 08:16:03 +0200
Subject: [PATCH v1 13/13] formatting.c cleanup: Change fill_str() return type
to void
The return value is not used anywhere.
---
src/backend/utils/adt/formatting.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/backend/utils/adt/formatting.c
b/src/backend/utils/adt/formatting.c
index c421625cf60..4c217d0e825 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -1113,7 +1113,7 @@ static bool from_char_seq_search(int *dest, const char
**src,
static bool do_to_timestamp(text *date_txt, text *fmt, Oid collid, bool std,
struct pg_tm *tm,
fsec_t *fsec, struct fmt_tz *tz,
int *fprec, uint32
*flags, Node *escontext);
-static char *fill_str(char *str, int c, size_t maxlen);
+static void fill_str(char *str, int c, size_t maxlen);
static FormatNode *NUM_cache(int len, NUMDesc *Num, text *pars_str, bool
*shouldFree);
static char *int_to_roman(int number);
static int roman_to_int(NUMProc *Np, size_t input_len);
@@ -4824,12 +4824,11 @@ do_to_timestamp(text *date_txt, text *fmt, Oid collid,
bool std,
*********************************************************************/
-static char *
+static void
fill_str(char *str, int c, size_t maxlen)
{
memset(str, c, maxlen);
str[maxlen] = '\0';
- return str;
}
/* This works the same as DCH_prevent_counter_overflow */
--
2.51.0