From e96efd07c72834da48d8a21e4672a150c500a08d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 7 Oct 2026 11:39:02 -0400 Subject: [PATCH] Remove "array_nulls" GUC parameter. This backwards-compatibility hack was introduced twenty years ago (in 8.2), and has surely been of no value for at least the last ten years. However, we shouldn't just leave it sit, because as was just pointed out it creates a dump/reload hazard: if it's set in the receiving environment then array contents will not be restored correctly. Other applications would likely be broken by it too, so whatever residual value it may have seems outweighed by the possibility of misuse. Our precedent for retiring some other comparable parameters, such as standard_conforming_strings, has been to leave the parameter in existence but force it to a fixed value. I judge however that that's not worth the trouble here, because there's no reason to believe that a non-negligible number of applications are either setting or reading this value. Let's just delete it in the master branch and be done with it. Bug: #19747 Reported-by: Ke Author: Tom Lane Reviewed-by: Laurenz Albe Discussion: https://postgr.es/m/19747-69b01e7fc190cd58@postgresql.org --- doc/src/sgml/array.sgml | 5 +--- doc/src/sgml/config.sgml | 26 ------------------- src/backend/utils/adt/arrayfuncs.c | 7 +---- src/backend/utils/misc/guc_parameters.dat | 7 ----- src/backend/utils/misc/postgresql.conf.sample | 1 - src/include/utils/array.h | 5 ---- 6 files changed, 2 insertions(+), 49 deletions(-) diff --git a/doc/src/sgml/array.sgml b/doc/src/sgml/array.sgml index ce338c770c9..5b8ef5cabe6 100644 --- a/doc/src/sgml/array.sgml +++ b/doc/src/sgml/array.sgml @@ -756,10 +756,7 @@ SELECT f1[1][-2][3] AS e1, f1[1][-1][5] AS e2 If the value written for an element is NULL (in any case variant), the element is taken to be NULL. The presence of any quotes or backslashes disables this and allows the literal string value - NULL to be entered. Also, for backward compatibility with - pre-8.2 versions of PostgreSQL, the configuration parameter can be turned - off to suppress recognition of NULL as a NULL. + NULL to be entered. diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index f36fbb60101..e537b3b0043 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -11941,32 +11941,6 @@ dynamic_library_path = '/usr/local/lib/postgresql:$libdir' - - array_nulls (boolean) - - array_nulls configuration parameter - - - - - This controls whether the array input parser recognizes - unquoted NULL as specifying a null array element. - By default, this is on, allowing array values containing - null values to be entered. However, PostgreSQL versions - before 8.2 did not support null values in arrays, and therefore would - treat NULL as specifying a normal array element with - the string value NULL. For backward compatibility with - applications that require the old behavior, this variable can be - turned off. - - - - Note that it is possible to create array values containing null values - even when this variable is off. - - - - backslash_quote (enum) stringsbackslash quotes diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index ef66182b047..f1f6336e5c8 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -38,11 +38,6 @@ #include "utils/typcache.h" -/* - * GUC parameter - */ -bool Array_nulls = true; - /* * Local definitions */ @@ -925,7 +920,7 @@ unquoted_element: elembuf->len = dstlen; *srcptr = p; /* Check if it's unquoted "NULL" */ - if (Array_nulls && !has_escapes && + if (!has_escapes && pg_strcasecmp(elembuf->data, "NULL") == 0) return ATOK_ELEM_NULL; else diff --git a/src/backend/utils/misc/guc_parameters.dat b/src/backend/utils/misc/guc_parameters.dat index c57441f7d98..380679a76c0 100644 --- a/src/backend/utils/misc/guc_parameters.dat +++ b/src/backend/utils/misc/guc_parameters.dat @@ -105,13 +105,6 @@ max => 'INT_MAX / 2', }, -{ name => 'array_nulls', type => 'bool', context => 'PGC_USERSET', group => 'COMPAT_OPTIONS_PREVIOUS', - short_desc => 'Enables input of NULL elements in arrays.', - long_desc => 'When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally.', - variable => 'Array_nulls', - boot_val => 'true', -}, - { name => 'authentication_timeout', type => 'int', context => 'PGC_SIGHUP', group => 'CONN_AUTH_AUTH', short_desc => 'Sets the maximum allowed time to complete client authentication.', flags => 'GUC_UNIT_S', diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index e759f06b50f..01f98de8a9f 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -892,7 +892,6 @@ # - Previous PostgreSQL Versions - -#array_nulls = on #backslash_quote = safe_encoding # on, off, or safe_encoding #lo_compat_privileges = off #quote_all_identifiers = off diff --git a/src/include/utils/array.h b/src/include/utils/array.h index 88e4f4d70d8..e7ee184034e 100644 --- a/src/include/utils/array.h +++ b/src/include/utils/array.h @@ -343,11 +343,6 @@ typedef struct ArrayIteratorData *ArrayIterator; (a)->xpn.lbound : ARR_LBOUND((ArrayType *) (a))) -/* - * GUC parameter - */ -extern PGDLLIMPORT bool Array_nulls; - /* * prototypes for functions defined in arrayfuncs.c */