*** ./src/backend/commands/variable.c.orig	2010-02-14 19:42:14.000000000 +0100
--- ./src/backend/commands/variable.c	2010-05-31 16:54:34.934729768 +0200
***************
*** 154,159 ****
--- 154,166 ----
  			/* when doit is true */
  			free((char *) subval);
  		}
+ 		else if (pg_strcasecmp(tok, "CUSTOM") == 0)
+ 		{
+ 			if (have_style && newDateStyle != USE_CUSTOM_DATES)
+ 				ok = false;		/* conflicting styles */
+ 			newDateStyle = USE_CUSTOM_DATES;
+ 			have_style = true;
+ 		}
  		else
  		{
  			ereport(GUC_complaint_elevel(source),
***************
*** 200,205 ****
--- 207,215 ----
  		case USE_GERMAN_DATES:
  			strcpy(result, "German");
  			break;
+ 		case USE_CUSTOM_DATES:
+ 			strcpy(result, "Custom");
+ 			break;
  		default:
  			strcpy(result, "Postgres");
  			break;
*** ./src/backend/utils/adt/date.c.orig	2010-02-26 03:01:07.000000000 +0100
--- ./src/backend/utils/adt/date.c	2010-06-02 11:59:16.260024688 +0200
***************
*** 27,32 ****
--- 27,33 ----
  #include "utils/array.h"
  #include "utils/builtins.h"
  #include "utils/date.h"
+ #include "utils/formatting.h"
  #include "utils/nabstime.h"
  
  /*
***************
*** 45,50 ****
--- 46,54 ----
  static int	tm2timetz(struct pg_tm * tm, fsec_t fsec, int tz, TimeTzADT *result);
  static void AdjustTimeForTypmod(TimeADT *time, int32 typmod);
  
+ extern char *custom_datestyle_format;
+ 
+ 
  
  /* common code for timetypmodin and timetztypmodin */
  static int32
***************
*** 183,198 ****
  			   *tm = &tt;
  	char		buf[MAXDATELEN + 1];
  
! 	if (DATE_NOT_FINITE(date))
! 		EncodeSpecialDate(date, buf);
  	else
  	{
! 		j2date(date + POSTGRES_EPOCH_JDATE,
! 			   &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday));
! 		EncodeDateOnly(tm, DateStyle, buf);
  	}
  
- 	result = pstrdup(buf);
  	PG_RETURN_CSTRING(result);
  }
  
--- 187,221 ----
  			   *tm = &tt;
  	char		buf[MAXDATELEN + 1];
  
! 	if (DateStyle == USE_CUSTOM_DATES)
! 	{
! 		Timestamp dt;
! 		text	*fmt;
! 
! 		if (custom_datestyle_format == NULL || strcmp(custom_datestyle_format,"") == 0)
! 			elog(ERROR, "custom_datestyle_format is empty");
! 		
! 		dt = DirectFunctionCall1(date_timestamp, DateADTGetDatum(date));
! 		fmt = cstring_to_text(custom_datestyle_format);
! 		result  = text_to_cstring(DatumGetTextP(DirectFunctionCall2(timestamp_to_char,
! 										TimestampGetDatum(dt),
! 										PointerGetDatum(fmt))));
! 	}
  	else
  	{
! 		/* use predefined style */
! 		if (DATE_NOT_FINITE(date))
! 			EncodeSpecialDate(date, buf);
! 		else
! 		{
! 			j2date(date + POSTGRES_EPOCH_JDATE,
! 				   &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday));
! 			EncodeDateOnly(tm, DateStyle, buf);
! 		}
! 		
! 		result = pstrdup(buf);
  	}
  
  	PG_RETURN_CSTRING(result);
  }
  
*** ./src/backend/utils/adt/datetime.c.orig	2010-05-09 04:15:59.000000000 +0200
--- ./src/backend/utils/adt/datetime.c	2010-05-31 17:42:42.384729881 +0200
***************
*** 52,57 ****
--- 52,58 ----
  static void AdjustFractDays(double frac, struct pg_tm * tm, fsec_t *fsec,
  				int scale);
  
+ char *custom_datestyle_format = NULL;
  
  const int	day_tab[2][13] =
  {
*** ./src/backend/utils/misc/guc.c.orig	2010-05-02 04:10:33.000000000 +0200
--- ./src/backend/utils/misc/guc.c	2010-05-31 17:42:37.016854897 +0200
***************
*** 118,123 ****
--- 118,124 ----
  extern bool fullPageWrites;
  extern int	vacuum_defer_cleanup_age;
  extern int	ssl_renegotiation_limit;
+ extern char *custom_datestyle_format;
  
  int			trace_recovery_messages = LOG;
  
***************
*** 2539,2544 ****
--- 2540,2554 ----
  	},
  
  	{
+ 		{"custom_datestyle_format", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ 			gettext_noop("Sets custom format for date "),
+ 			NULL
+ 		},
+ 		&custom_datestyle_format,
+ 		"", NULL, NULL
+ 	},
+ 
+ 	{
  		{"custom_variable_classes", PGC_SIGHUP, CUSTOM_OPTIONS,
  			gettext_noop("Sets the list of known custom variable classes."),
  			NULL,
*** ./src/include/miscadmin.h.orig	2010-02-26 03:01:20.000000000 +0100
--- ./src/include/miscadmin.h	2010-05-31 16:45:54.299855276 +0200
***************
*** 184,189 ****
--- 184,190 ----
  #define USE_SQL_DATES			2
  #define USE_GERMAN_DATES		3
  #define USE_XSD_DATES			4
+ #define USE_CUSTOM_DATES		5
  
  /* valid DateOrder values */
  #define DATEORDER_YMD			0