*** a/doc/src/sgml/config.sgml
--- b/doc/src/sgml/config.sgml
***************
*** 39,45 ****
       For convenience,
       a different unit can also be specified explicitly.  Valid memory units
       are <literal>kB</literal> (kilobytes), <literal>MB</literal>
!      (megabytes), and <literal>GB</literal> (gigabytes); valid time units
       are <literal>ms</literal> (milliseconds), <literal>s</literal>
       (seconds), <literal>min</literal> (minutes), <literal>h</literal>
       (hours), and <literal>d</literal> (days).  Note that the multiplier
--- 39,45 ----
       For convenience,
       a different unit can also be specified explicitly.  Valid memory units
       are <literal>kB</literal> (kilobytes), <literal>MB</literal>
!      (megabytes), <literal>GB</literal> (gigabytes), and <literal>TB</literal> (terabytes); valid time units
       are <literal>ms</literal> (milliseconds), <literal>s</literal>
       (seconds), <literal>min</literal> (minutes), <literal>h</literal>
       (hours), and <literal>d</literal> (days).  Note that the multiplier
*** a/src/backend/utils/misc/guc.c
--- b/src/backend/utils/misc/guc.c
***************
*** 105,110 ****
--- 105,111 ----
  
  #define KB_PER_MB (1024)
  #define KB_PER_GB (1024*1024)
+ #define KB_PER_TB (1024*1024*1024)
  
  #define MS_PER_S 1000
  #define S_PER_MIN 60
***************
*** 4837,4843 **** parse_int(const char *value, int *result, int flags, const char **hintmsg)
  		{
  			/* Set hint for use if no match or trailing garbage */
  			if (hintmsg)
! 				*hintmsg = gettext_noop("Valid units for this parameter are \"kB\", \"MB\", and \"GB\".");
  
  #if BLCKSZ < 1024 || BLCKSZ > (1024*1024)
  #error BLCKSZ must be between 1KB and 1MB
--- 4838,4844 ----
  		{
  			/* Set hint for use if no match or trailing garbage */
  			if (hintmsg)
! 				*hintmsg = gettext_noop("Valid units for this parameter are \"kB\", \"MB\", \"GB\", and \"TB\".");
  
  #if BLCKSZ < 1024 || BLCKSZ > (1024*1024)
  #error BLCKSZ must be between 1KB and 1MB
***************
*** 4891,4896 **** parse_int(const char *value, int *result, int flags, const char **hintmsg)
--- 4892,4913 ----
  						break;
  				}
  			}
+ 			else if (strncmp(endptr, "TB", 2) == 0)
+ 			{
+ 				endptr += 2;
+ 				switch (flags & GUC_UNIT_MEMORY)
+ 				{
+ 					case GUC_UNIT_KB:
+ 						val *= KB_PER_TB;
+ 						break;
+ 					case GUC_UNIT_BLOCKS:
+ 						val *= KB_PER_TB / (BLCKSZ / 1024);
+ 						break;
+ 					case GUC_UNIT_XBLOCKS:
+ 						val *= KB_PER_TB / (XLOG_BLCKSZ / 1024);
+ 						break;
+ 				}
+ 			}
  		}
  		else if (flags & GUC_UNIT_TIME)
  		{
***************
*** 7384,7390 **** _ShowOption(struct config_generic * record, bool use_units)
  								break;
  						}
  
! 						if (result % KB_PER_GB == 0)
  						{
  							result /= KB_PER_GB;
  							unit = "GB";
--- 7401,7412 ----
  								break;
  						}
  
! 						if (result % KB_PER_TB == 0)
! 						{
! 							result /= KB_PER_TB;
! 							unit = "TB";
! 						}
! 						else if (result % KB_PER_GB == 0)
  						{
  							result /= KB_PER_GB;
  							unit = "GB";
*** a/src/backend/utils/misc/postgresql.conf.sample
--- b/src/backend/utils/misc/postgresql.conf.sample
***************
*** 27,33 ****
  # Memory units:  kB = kilobytes        Time units:  ms  = milliseconds
  #                MB = megabytes                     s   = seconds
  #                GB = gigabytes                     min = minutes
! #                                                   h   = hours
  #                                                   d   = days
  
  
--- 27,33 ----
  # Memory units:  kB = kilobytes        Time units:  ms  = milliseconds
  #                MB = megabytes                     s   = seconds
  #                GB = gigabytes                     min = minutes
! #                TB = terabytes                     h   = hours
  #                                                   d   = days
  
  
