From 0d79c0a8cc20dbaa39112d78a9abb821c4ca3554 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 18 Jan 2014 16:04:11 -0500 Subject: [PATCH] Make various variables const (read-only). These changes should generally improve correctness/maintainability. A nice side benefit is that several kilobytes move from initialized data to text segment, allowing them to be shared across processes and probably reducing copy-on-write overhead while forking a new backend. Unfortunately this doesn't seem to help libpq in the same way (at least not when it's compiled with -fpic on x86_64), but we can hope the linker at least collects all nominally-const data together even if it's not actually part of the text segment. Also, make pg_encname_tbl[] static in encnames.c, since there seems no very good reason for any other code to use it; per a suggestion from Wim Lewis, who independently submitted a patch that was mostly a subset of this one. Oskari Saarenmaa, with some editorialization by me --- src/backend/catalog/objectaddress.c | 28 +++++------ src/backend/commands/conversioncmds.c | 2 +- src/backend/regex/regc_lex.c | 4 +- src/backend/regex/regcomp.c | 2 +- src/backend/regex/regerror.c | 6 +-- src/backend/tsearch/wparser_def.c | 4 +- src/backend/utils/adt/datetime.c | 6 +-- src/backend/utils/adt/formatting.c | 67 ++++++++++++--------------- src/backend/utils/adt/tsrank.c | 16 +++---- src/backend/utils/mb/encnames.c | 55 +++++++++------------- src/backend/utils/mb/mbutils.c | 6 +-- src/backend/utils/mb/wchar.c | 2 +- src/common/relpath.c | 2 +- src/include/common/relpath.h | 3 +- src/include/mb/pg_wchar.h | 26 +++-------- src/include/utils/datetime.h | 2 + 16 files changed, 101 insertions(+), 130 deletions(-) diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index f8fd4f8c46..991c02abbf 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -101,7 +101,7 @@ typedef struct * class? */ } ObjectPropertyType; -static ObjectPropertyType ObjectProperty[] = +static const ObjectPropertyType ObjectProperty[] = { { CastRelationId, @@ -431,7 +431,7 @@ static ObjectAddress get_object_address_type(ObjectType objtype, List *objname, bool missing_ok); static ObjectAddress get_object_address_opcf(ObjectType objtype, List *objname, List *objargs, bool missing_ok); -static ObjectPropertyType *get_object_property_data(Oid class_id); +static const ObjectPropertyType *get_object_property_data(Oid class_id); static void getRelationDescription(StringInfo buffer, Oid relid); static void getOpFamilyDescription(StringInfo buffer, Oid opfid); @@ -1297,7 +1297,7 @@ get_object_namespace(const ObjectAddress *address) HeapTuple tuple; bool isnull; Oid oid; - ObjectPropertyType *property; + const ObjectPropertyType *property; /* If not owned by a namespace, just return InvalidOid. */ property = get_object_property_data(address->classId); @@ -1329,7 +1329,7 @@ get_object_namespace(const ObjectAddress *address) Oid get_object_oid_index(Oid class_id) { - ObjectPropertyType *prop = get_object_property_data(class_id); + const ObjectPropertyType *prop = get_object_property_data(class_id); return prop->oid_index_oid; } @@ -1337,7 +1337,7 @@ get_object_oid_index(Oid class_id) int get_object_catcache_oid(Oid class_id) { - ObjectPropertyType *prop = get_object_property_data(class_id); + const ObjectPropertyType *prop = get_object_property_data(class_id); return prop->oid_catcache_id; } @@ -1345,7 +1345,7 @@ get_object_catcache_oid(Oid class_id) int get_object_catcache_name(Oid class_id) { - ObjectPropertyType *prop = get_object_property_data(class_id); + const ObjectPropertyType *prop = get_object_property_data(class_id); return prop->name_catcache_id; } @@ -1353,7 +1353,7 @@ get_object_catcache_name(Oid class_id) AttrNumber get_object_attnum_name(Oid class_id) { - ObjectPropertyType *prop = get_object_property_data(class_id); + const ObjectPropertyType *prop = get_object_property_data(class_id); return prop->attnum_name; } @@ -1361,7 +1361,7 @@ get_object_attnum_name(Oid class_id) AttrNumber get_object_attnum_namespace(Oid class_id) { - ObjectPropertyType *prop = get_object_property_data(class_id); + const ObjectPropertyType *prop = get_object_property_data(class_id); return prop->attnum_namespace; } @@ -1369,7 +1369,7 @@ get_object_attnum_namespace(Oid class_id) AttrNumber get_object_attnum_owner(Oid class_id) { - ObjectPropertyType *prop = get_object_property_data(class_id); + const ObjectPropertyType *prop = get_object_property_data(class_id); return prop->attnum_owner; } @@ -1377,7 +1377,7 @@ get_object_attnum_owner(Oid class_id) AttrNumber get_object_attnum_acl(Oid class_id) { - ObjectPropertyType *prop = get_object_property_data(class_id); + const ObjectPropertyType *prop = get_object_property_data(class_id); return prop->attnum_acl; } @@ -1385,7 +1385,7 @@ get_object_attnum_acl(Oid class_id) AclObjectKind get_object_aclkind(Oid class_id) { - ObjectPropertyType *prop = get_object_property_data(class_id); + const ObjectPropertyType *prop = get_object_property_data(class_id); return prop->acl_kind; } @@ -1393,7 +1393,7 @@ get_object_aclkind(Oid class_id) bool get_object_namensp_unique(Oid class_id) { - ObjectPropertyType *prop = get_object_property_data(class_id); + const ObjectPropertyType *prop = get_object_property_data(class_id); return prop->is_nsp_name_unique; } @@ -1419,10 +1419,10 @@ is_objectclass_supported(Oid class_id) /* * Find ObjectProperty structure by class_id. */ -static ObjectPropertyType * +static const ObjectPropertyType * get_object_property_data(Oid class_id) { - static ObjectPropertyType *prop_last = NULL; + static const ObjectPropertyType *prop_last = NULL; int index; /* diff --git a/src/backend/commands/conversioncmds.c b/src/backend/commands/conversioncmds.c index f206c7bac3..dc55fe5ed4 100644 --- a/src/backend/commands/conversioncmds.c +++ b/src/backend/commands/conversioncmds.c @@ -46,7 +46,7 @@ CreateConversionCommand(CreateConversionStmt *stmt) const char *from_encoding_name = stmt->for_encoding_name; const char *to_encoding_name = stmt->to_encoding_name; List *func_name = stmt->func_name; - static Oid funcargs[] = {INT4OID, INT4OID, CSTRINGOID, INTERNALOID, INT4OID}; + static const Oid funcargs[] = {INT4OID, INT4OID, CSTRINGOID, INTERNALOID, INT4OID}; char result[1]; /* Convert list of names to a name and namespace */ diff --git a/src/backend/regex/regc_lex.c b/src/backend/regex/regc_lex.c index 3360cfb0e9..c4095e98cb 100644 --- a/src/backend/regex/regc_lex.c +++ b/src/backend/regex/regc_lex.c @@ -716,10 +716,10 @@ static int /* not actually used, but convenient for RETV */ lexescape(struct vars * v) { chr c; - static chr alert[] = { + static const chr alert[] = { CHR('a'), CHR('l'), CHR('e'), CHR('r'), CHR('t') }; - static chr esc[] = { + static const chr esc[] = { CHR('E'), CHR('S'), CHR('C') }; const chr *save; diff --git a/src/backend/regex/regcomp.c b/src/backend/regex/regcomp.c index b5988a2fbc..ca1ccc5202 100644 --- a/src/backend/regex/regcomp.c +++ b/src/backend/regex/regcomp.c @@ -274,7 +274,7 @@ struct vars /* static function list */ -static struct fns functions = { +static const struct fns functions = { rfree, /* regfree insides */ }; diff --git a/src/backend/regex/regerror.c b/src/backend/regex/regerror.c index f6a3f2667f..4b2573e625 100644 --- a/src/backend/regex/regerror.c +++ b/src/backend/regex/regerror.c @@ -34,10 +34,10 @@ #include "regex/regguts.h" /* unknown-error explanation */ -static char unk[] = "*** unknown regex error code 0x%x ***"; +static const char unk[] = "*** unknown regex error code 0x%x ***"; /* struct to map among codes, code names, and explanations */ -static struct rerr +static const struct rerr { int code; const char *name; @@ -62,7 +62,7 @@ pg_regerror(int errcode, /* error code, or REG_ATOI or REG_ITOA */ char *errbuf, /* result buffer (unless errbuf_size==0) */ size_t errbuf_size) /* available space in errbuf, can be 0 */ { - struct rerr *r; + const struct rerr *r; const char *msg; char convbuf[sizeof(unk) + 50]; /* 50 = plenty for int */ size_t len; diff --git a/src/backend/tsearch/wparser_def.c b/src/backend/tsearch/wparser_def.c index 7252d3b616..fa73dff694 100644 --- a/src/backend/tsearch/wparser_def.c +++ b/src/backend/tsearch/wparser_def.c @@ -789,7 +789,7 @@ p_isspecial(TParser *prs) */ if (GetDatabaseEncoding() == PG_UTF8 && prs->usewide) { - static pg_wchar strange_letter[] = { + static const pg_wchar strange_letter[] = { /* * use binary search, so elements should be ordered */ @@ -1023,7 +1023,7 @@ p_isspecial(TParser *prs) 0xAA34, /* CHAM CONSONANT SIGN RA */ 0xAA4D /* CHAM CONSONANT SIGN FINAL H */ }; - pg_wchar *StopLow = strange_letter, + const pg_wchar *StopLow = strange_letter, *StopHigh = strange_letter + lengthof(strange_letter), *StopMiddle; pg_wchar c; diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 9e4c9829ad..a61b40e17f 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -59,10 +59,10 @@ const int day_tab[2][13] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0} }; -char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", +const char *const months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL}; -char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", +const char *const days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", NULL}; @@ -186,7 +186,7 @@ static const datetkn datetktbl[] = { static int szdatetktbl = sizeof datetktbl / sizeof datetktbl[0]; -static datetkn deltatktbl[] = { +static const datetkn deltatktbl[] = { /* text, token, lexval */ {"@", IGNORE_DTF, 0}, /* postgres relative prefix */ {DAGO, AGO, 0}, /* "ago" indicates negative time offset */ diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index 6ae426b77a..27aea9cbbc 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -121,13 +121,6 @@ #define MAXDOUBLEWIDTH 500 -/* ---------- - * External (defined in PgSQL datetime.c (timestamp utils)) - * ---------- - */ -extern char *months[], /* month abbreviation */ - *days[]; /* full days */ - /* ---------- * Format parser structs * ---------- @@ -188,12 +181,12 @@ struct FormatNode * Full months * ---------- */ -static char *months_full[] = { +static const char *const months_full[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", NULL }; -static char *days_short[] = { +static const char *const days_short[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL }; @@ -226,8 +219,8 @@ static char *days_short[] = { * matches for BC have an odd index. So the boolean value for BC is given by * taking the array index of the match, modulo 2. */ -static char *adbc_strings[] = {ad_STR, bc_STR, AD_STR, BC_STR, NULL}; -static char *adbc_strings_long[] = {a_d_STR, b_c_STR, A_D_STR, B_C_STR, NULL}; +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 @@ -253,8 +246,8 @@ static char *adbc_strings_long[] = {a_d_STR, b_c_STR, A_D_STR, B_C_STR, NULL}; * matches for PM have an odd index. So the boolean value for PM is given by * taking the array index of the match, modulo 2. */ -static char *ampm_strings[] = {am_STR, pm_STR, AM_STR, PM_STR, NULL}; -static char *ampm_strings_long[] = {a_m_STR, p_m_STR, A_M_STR, P_M_STR, NULL}; +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 @@ -262,26 +255,26 @@ static char *ampm_strings_long[] = {a_m_STR, p_m_STR, A_M_STR, P_M_STR, NULL}; * 'VIII' must have higher precedence than 'V') * ---------- */ -static char *rm_months_upper[] = +static const char *const rm_months_upper[] = {"XII", "XI", "X", "IX", "VIII", "VII", "VI", "V", "IV", "III", "II", "I", NULL}; -static char *rm_months_lower[] = +static const char *const rm_months_lower[] = {"xii", "xi", "x", "ix", "viii", "vii", "vi", "v", "iv", "iii", "ii", "i", NULL}; /* ---------- * Roman numbers * ---------- */ -static char *rm1[] = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", NULL}; -static char *rm10[] = {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", NULL}; -static char *rm100[] = {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", NULL}; +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}; +static const char *const rm100[] = {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", NULL}; /* ---------- * Ordinal postfixes * ---------- */ -static char *numTH[] = {"ST", "ND", "RD", "TH", NULL}; -static char *numth[] = {"st", "nd", "rd", "th", NULL}; +static const char *const numTH[] = {"ST", "ND", "RD", "TH", NULL}; +static const char *const numth[] = {"st", "nd", "rd", "th", NULL}; /* ---------- * Flags & Options: @@ -525,7 +518,7 @@ do { \ * Suffixes definition for DATE-TIME TO/FROM CHAR * ---------- */ -static KeySuffix DCH_suff[] = { +static const KeySuffix DCH_suff[] = { {"FM", 2, DCH_S_FM, SUFFTYPE_PREFIX}, {"fm", 2, DCH_S_FM, SUFFTYPE_PREFIX}, {"TM", 2, DCH_S_TM, SUFFTYPE_PREFIX}, @@ -950,10 +943,10 @@ typedef struct NUMProc */ static const KeyWord *index_seq_search(char *str, const KeyWord *kw, const int *index); -static KeySuffix *suff_search(char *str, KeySuffix *suf, int type); +static const KeySuffix *suff_search(char *str, const KeySuffix *suf, int type); static void NUMDesc_prepare(NUMDesc *num, FormatNode *n); static void parse_format(FormatNode *node, char *str, const KeyWord *kw, - KeySuffix *suf, const int *index, int ver, NUMDesc *Num); + const KeySuffix *suf, const int *index, int ver, NUMDesc *Num); static void DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid collid); @@ -964,7 +957,7 @@ static void dump_index(const KeyWord *k, const int *index); static void dump_node(FormatNode *node, int max); #endif -static char *get_th(char *num, int type); +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(char *str); @@ -973,8 +966,8 @@ static void from_char_set_mode(TmFromChar *tmfc, const FromCharDateMode mode); static void from_char_set_int(int *dest, const int value, const FormatNode *node); static int from_char_parse_int_len(int *dest, char **src, const int len, FormatNode *node); static int from_char_parse_int(int *dest, char **src, FormatNode *node); -static int seq_search(char *name, char **array, int type, int max, int *len); -static int from_char_seq_search(int *dest, char **src, char **array, int type, int max, FormatNode *node); +static int seq_search(char *name, const char *const * array, int type, int max, int *len); +static int from_char_seq_search(int *dest, char **src, const char *const * array, int type, int max, FormatNode *node); static void do_to_timestamp(text *date_txt, text *fmt, struct pg_tm * tm, fsec_t *fsec); static char *fill_str(char *str, int c, int max); @@ -1024,10 +1017,10 @@ index_seq_search(char *str, const KeyWord *kw, const int *index) return NULL; } -static KeySuffix * -suff_search(char *str, KeySuffix *suf, int type) +static const KeySuffix * +suff_search(char *str, const KeySuffix *suf, int type) { - KeySuffix *s; + const KeySuffix *s; for (s = suf; s->name != NULL; s++) { @@ -1237,9 +1230,9 @@ NUMDesc_prepare(NUMDesc *num, FormatNode *n) */ static void parse_format(FormatNode *node, char *str, const KeyWord *kw, - KeySuffix *suf, const int *index, int ver, NUMDesc *Num) + const KeySuffix *suf, const int *index, int ver, NUMDesc *Num) { - KeySuffix *s; + const KeySuffix *s; FormatNode *n; int node_set = 0, suffix, @@ -1401,7 +1394,7 @@ dump_node(FormatNode *node, int max) * type --> 0 upper, 1 lower * ---------- */ -static char * +static const char * get_th(char *num, int type) { int len = strlen(num), @@ -2268,11 +2261,11 @@ from_char_parse_int(int *dest, char **src, FormatNode *node) * ---------- */ static int -seq_search(char *name, char **array, int type, int max, int *len) +seq_search(char *name, const char *const * array, int type, int max, int *len) { - char *p, - *n, - **a; + const char *p; + const char *const * a; + char *n; int last, i; @@ -2346,7 +2339,7 @@ seq_search(char *name, char **array, int type, int max, int *len) * If the string doesn't match, throw an error. */ static int -from_char_seq_search(int *dest, char **src, char **array, int type, int max, +from_char_seq_search(int *dest, char **src, const char *const * array, int type, int max, FormatNode *node) { int len; diff --git a/src/backend/utils/adt/tsrank.c b/src/backend/utils/adt/tsrank.c index a8e07e7fbc..c9e71c9e21 100644 --- a/src/backend/utils/adt/tsrank.c +++ b/src/backend/utils/adt/tsrank.c @@ -20,7 +20,7 @@ #include "miscadmin.h" -static float weights[] = {0.1f, 0.2f, 0.4f, 1.0f}; +static const float weights[] = {0.1f, 0.2f, 0.4f, 1.0f}; #define wpos(wep) ( w[ WEP_GETWEIGHT(wep) ] ) @@ -33,8 +33,8 @@ static float weights[] = {0.1f, 0.2f, 0.4f, 1.0f}; #define RANK_NORM_RDIVRPLUS1 0x20 #define DEF_NORM_METHOD RANK_NO_NORM -static float calc_rank_or(float *w, TSVector t, TSQuery q); -static float calc_rank_and(float *w, TSVector t, TSQuery q); +static float calc_rank_or(const float *w, TSVector t, TSQuery q); +static float calc_rank_and(const float *w, TSVector t, TSQuery q); /* * Returns a weight of a word collocation @@ -202,7 +202,7 @@ static WordEntryPosVector POSNULL = { }; static float -calc_rank_and(float *w, TSVector t, TSQuery q) +calc_rank_and(const float *w, TSVector t, TSQuery q) { WordEntryPosVector **pos; int i, @@ -278,7 +278,7 @@ calc_rank_and(float *w, TSVector t, TSQuery q) } static float -calc_rank_or(float *w, TSVector t, TSQuery q) +calc_rank_or(const float *w, TSVector t, TSQuery q) { WordEntry *entry, *firstentry; @@ -347,7 +347,7 @@ calc_rank_or(float *w, TSVector t, TSQuery q) } static float -calc_rank(float *w, TSVector t, TSQuery q, int32 method) +calc_rank(const float *w, TSVector t, TSQuery q, int32 method) { QueryItem *item = GETQUERY(q); float res = 0.0; @@ -387,7 +387,7 @@ calc_rank(float *w, TSVector t, TSQuery q, int32 method) return res; } -static float * +static const float * getWeights(ArrayType *win) { static float ws[lengthof(weights)]; @@ -723,7 +723,7 @@ get_docrep(TSVector txt, QueryRepresentation *qr, int *doclen) } static float4 -calc_rank_cd(float4 *arrdata, TSVector txt, TSQuery query, int method) +calc_rank_cd(const float4 *arrdata, TSVector txt, TSQuery query, int method) { DocRepresentation *doc; int len, diff --git a/src/backend/utils/mb/encnames.c b/src/backend/utils/mb/encnames.c index 772d4a5d05..38fae001eb 100644 --- a/src/backend/utils/mb/encnames.c +++ b/src/backend/utils/mb/encnames.c @@ -29,7 +29,13 @@ * Karel Zak, Aug 2001 * ---------- */ -pg_encname pg_encname_tbl[] = +typedef struct pg_encname +{ + const char *name; + pg_enc encoding; +} pg_encname; + +static const pg_encname pg_encname_tbl[] = { { "abc", PG_WIN1258 @@ -285,15 +291,9 @@ pg_encname pg_encname_tbl[] = }, /* alias for UHC */ { "windows950", PG_BIG5 - }, /* alias for BIG5 */ - { - NULL, 0 - } /* last */ + } /* alias for BIG5 */ }; -unsigned int pg_encname_tbl_sz = \ -sizeof(pg_encname_tbl) / sizeof(pg_encname_tbl[0]) - 1; - /* ---------- * These are "official" encoding names. * XXX must be sorted by the same order as enum pg_enc (in mb/pg_wchar.h) @@ -304,7 +304,7 @@ sizeof(pg_encname_tbl) / sizeof(pg_encname_tbl[0]) - 1; #else #define DEF_ENC2NAME(name, codepage) { #name, PG_##name, codepage } #endif -pg_enc2name pg_enc2name_tbl[] = +const pg_enc2name pg_enc2name_tbl[] = { DEF_ENC2NAME(SQL_ASCII, 0), DEF_ENC2NAME(EUC_JP, 20932), @@ -356,7 +356,7 @@ pg_enc2name pg_enc2name_tbl[] = * This covers all encodings except MULE_INTERNAL, which is alien to gettext. * ---------- */ -pg_enc2gettext pg_enc2gettext_tbl[] = +const pg_enc2gettext pg_enc2gettext_tbl[] = { {PG_SQL_ASCII, "US-ASCII"}, {PG_UTF8, "UTF-8"}, @@ -467,13 +467,15 @@ clean_encoding_name(const char *key, char *newkey) /* ---------- * Search encoding by encoding name + * + * Returns encoding ID, or -1 for error * ---------- */ -pg_encname * -pg_char_to_encname_struct(const char *name) +int +pg_char_to_encoding(const char *name) { - unsigned int nel = pg_encname_tbl_sz; - pg_encname *base = pg_encname_tbl, + unsigned int nel = lengthof(pg_encname_tbl); + const pg_encname *base = pg_encname_tbl, *last = base + nel - 1, *position; int result; @@ -481,13 +483,13 @@ pg_char_to_encname_struct(const char *name) *key; if (name == NULL || *name == '\0') - return NULL; + return -1; if (strlen(name) >= NAMEDATALEN) { #ifdef FRONTEND fprintf(stderr, "encoding name too long\n"); - return NULL; + return -1; #else ereport(ERROR, (errcode(ERRCODE_NAME_TOO_LONG), @@ -505,29 +507,14 @@ pg_char_to_encname_struct(const char *name) { result = strcmp(key, position->name); if (result == 0) - return position; + return position->encoding; } if (result < 0) last = position - 1; else base = position + 1; } - return NULL; -} - -/* - * Returns encoding or -1 for error - */ -int -pg_char_to_encoding(const char *name) -{ - pg_encname *p; - - if (!name) - return -1; - - p = pg_char_to_encname_struct(name); - return p ? p->encoding : -1; + return -1; } #ifndef FRONTEND @@ -545,7 +532,7 @@ pg_encoding_to_char(int encoding) { if (PG_VALID_ENCODING(encoding)) { - pg_enc2name *p = &pg_enc2name_tbl[encoding]; + const pg_enc2name *p = &pg_enc2name_tbl[encoding]; Assert(encoding == p->encoding); return p->name; diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c index 6d1cd8e875..08440e9fe9 100644 --- a/src/backend/utils/mb/mbutils.c +++ b/src/backend/utils/mb/mbutils.c @@ -55,9 +55,9 @@ static FmgrInfo *ToClientConvProc = NULL; /* * These variables track the currently-selected encodings. */ -static pg_enc2name *ClientEncoding = &pg_enc2name_tbl[PG_SQL_ASCII]; -static pg_enc2name *DatabaseEncoding = &pg_enc2name_tbl[PG_SQL_ASCII]; -static pg_enc2name *MessageEncoding = &pg_enc2name_tbl[PG_SQL_ASCII]; +static const pg_enc2name *ClientEncoding = &pg_enc2name_tbl[PG_SQL_ASCII]; +static const pg_enc2name *DatabaseEncoding = &pg_enc2name_tbl[PG_SQL_ASCII]; +static const pg_enc2name *MessageEncoding = &pg_enc2name_tbl[PG_SQL_ASCII]; /* * During backend startup we can't set client encoding because we (a) diff --git a/src/backend/utils/mb/wchar.c b/src/backend/utils/mb/wchar.c index 45bc3c1604..6d03a10854 100644 --- a/src/backend/utils/mb/wchar.c +++ b/src/backend/utils/mb/wchar.c @@ -1720,7 +1720,7 @@ pg_eucjp_increment(unsigned char *charptr, int length) * XXX must be sorted by the same order as enum pg_enc (in mb/pg_wchar.h) *------------------------------------------------------------------- */ -pg_wchar_tbl pg_wchar_table[] = { +const pg_wchar_tbl pg_wchar_table[] = { {pg_ascii2wchar_with_len, pg_wchar2single_with_len, pg_ascii_mblen, pg_ascii_dsplen, pg_ascii_verifier, 1}, /* PG_SQL_ASCII */ {pg_eucjp2wchar_with_len, pg_wchar2euc_with_len, pg_eucjp_mblen, pg_eucjp_dsplen, pg_eucjp_verifier, 3}, /* PG_EUC_JP */ {pg_euccn2wchar_with_len, pg_wchar2euc_with_len, pg_euccn_mblen, pg_euccn_dsplen, pg_euccn_verifier, 2}, /* PG_EUC_CN */ diff --git a/src/common/relpath.c b/src/common/relpath.c index f7ad6d2a45..fbb5de6922 100644 --- a/src/common/relpath.c +++ b/src/common/relpath.c @@ -29,7 +29,7 @@ * documentation for pg_relation_size(). Also keep FORKNAMECHARS above * up-to-date. */ -const char *forkNames[] = { +const char *const forkNames[] = { "main", /* MAIN_FORKNUM */ "fsm", /* FSM_FORKNUM */ "vm", /* VISIBILITYMAP_FORKNUM */ diff --git a/src/include/common/relpath.h b/src/include/common/relpath.h index 8795464a27..23a226d058 100644 --- a/src/include/common/relpath.h +++ b/src/include/common/relpath.h @@ -25,7 +25,8 @@ #define TABLESPACE_VERSION_DIRECTORY "PG_" PG_MAJORVERSION "_" \ CppAsString2(CATALOG_VERSION_NO) -extern const char *forkNames[]; +extern const char *const forkNames[]; + extern int forkname_chars(const char *str, ForkNumber *fork); extern char *relpathbackend(RelFileNode rnode, BackendId backend, ForkNumber forknum); diff --git a/src/include/mb/pg_wchar.h b/src/include/mb/pg_wchar.h index 74aacc4368..6154d20969 100644 --- a/src/include/mb/pg_wchar.h +++ b/src/include/mb/pg_wchar.h @@ -303,33 +303,23 @@ typedef enum pg_enc #define PG_VALID_FE_ENCODING(_enc) PG_VALID_ENCODING(_enc) /* - * Encoding names with all aliases - */ -typedef struct pg_encname -{ - char *name; - pg_enc encoding; -} pg_encname; - -extern pg_encname pg_encname_tbl[]; -extern unsigned int pg_encname_tbl_sz; - -/* - * Careful: + * Table for mapping an encoding number to official encoding name and + * possibly other subsidiary data. Be careful to check encoding number + * before accessing a table entry! * * if (PG_VALID_ENCODING(encoding)) * pg_enc2name_tbl[ encoding ]; */ typedef struct pg_enc2name { - char *name; + const char *name; pg_enc encoding; #ifdef WIN32 unsigned codepage; /* codepage for WIN32 */ #endif } pg_enc2name; -extern pg_enc2name pg_enc2name_tbl[]; +extern const pg_enc2name pg_enc2name_tbl[]; /* * Encoding names for gettext @@ -340,7 +330,7 @@ typedef struct pg_enc2gettext const char *name; } pg_enc2gettext; -extern pg_enc2gettext pg_enc2gettext_tbl[]; +extern const pg_enc2gettext pg_enc2gettext_tbl[]; /* * pg_wchar stuff @@ -373,7 +363,7 @@ typedef struct int maxmblen; /* max bytes for a char in this encoding */ } pg_wchar_tbl; -extern pg_wchar_tbl pg_wchar_table[]; +extern const pg_wchar_tbl pg_wchar_table[]; /* * UTF-8 to local code conversion map @@ -441,8 +431,6 @@ extern int pg_valid_server_encoding_id(int encoding); * Remaining functions are not considered part of libpq's API, though many * of them do exist inside libpq. */ -extern pg_encname *pg_char_to_encname_struct(const char *name); - extern int pg_mb2wchar(const char *from, pg_wchar *to); extern int pg_mb2wchar_with_len(const char *from, pg_wchar *to, int len); extern int pg_encoding_mb2wchar_with_len(int encoding, diff --git a/src/include/utils/datetime.h b/src/include/utils/datetime.h index b38d2514fe..12f1e7753c 100644 --- a/src/include/utils/datetime.h +++ b/src/include/utils/datetime.h @@ -247,6 +247,8 @@ do { \ * Include check for leap year. */ +extern const char *const months[]; /* months (3-char abbreviations) */ +extern const char *const days[]; /* days (full names) */ extern const int day_tab[2][13]; #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))