Index: doc/src/sgml/func.sgml
===================================================================
RCS file: /home/brendanjurd/src/pgsql.cvs/pgsql/doc/src/sgml/func.sgml,v
retrieving revision 1.400
diff -c -r1.400 func.sgml
*** doc/src/sgml/func.sgml	11 Oct 2007 02:43:55 -0000	1.400
--- doc/src/sgml/func.sgml	11 Oct 2007 15:53:37 -0000
***************
*** 1263,1268 ****
--- 1263,1271 ----
      quote_literal
     
     
+     quote_nullable
+    
+    
      repeat
     
     
***************
*** 1532,1545 ****
         text
         
          Return the given string suitably quoted to be used as a string literal
!         in an SQL statement string.
!         Embedded single-quotes and backslashes are properly doubled.
         
         quote_literal('O\'Reilly')
         'O''Reilly'
        
  
        
         regexp_matches(string text, pattern text [, flags text])
         setof text[]
         
--- 1535,1564 ----
         text
         
          Return the given string suitably quoted to be used as a string literal
!         in an SQL statement string.  Embedded single-quotes
!         and backslashes are properly doubled.  Note that
!         quote_literal returns null on
!         null input; use quote_nullable
!         instead if you want to use nulls in your SQL
!         statement.
         
         quote_literal('O\'Reilly')
         'O''Reilly'
        
  
        
+        quote_nullable(string)
+        text
+        
+         Return the given string (which may be null) suitably quoted to be used
+         as a string literal in an SQL statement string.
+         Embedded single-quotes and backslashes are properly doubled.
+        
+        quote_literal(NULL)
+        NULL
+       
+ 
+       
         regexp_matches(string text, pattern text [, flags text])
         setof text[]
         
Index: src/backend/utils/adt/quote.c
===================================================================
RCS file: /home/brendanjurd/src/pgsql.cvs/pgsql/src/backend/utils/adt/quote.c,v
retrieving revision 1.22
diff -c -r1.22 quote.c
*** src/backend/utils/adt/quote.c	27 Feb 2007 23:48:08 -0000	1.22
--- src/backend/utils/adt/quote.c	11 Oct 2007 15:52:45 -0000
***************
*** 96,98 ****
--- 96,114 ----
  
  	PG_RETURN_TEXT_P(result);
  }
+ 
+ /*
+  * quote_nullable -
+  *    Returns a properly quoted literal, with null values returned as the SQL
+  *    value NULL.
+  */
+ Datum
+ quote_nullable(PG_FUNCTION_ARGS)
+ {
+ 	if (PG_ARGISNULL(0))
+ 		PG_RETURN_DATUM(DirectFunctionCall1(textin,
+ 											CStringGetDatum("NULL")));
+ 	else
+ 		PG_RETURN_DATUM(DirectFunctionCall1(quote_literal,
+ 											PG_GETARG_DATUM(0)));
+ }
Index: src/include/catalog/pg_proc.h
===================================================================
RCS file: /home/brendanjurd/src/pgsql.cvs/pgsql/src/include/catalog/pg_proc.h,v
retrieving revision 1.473
diff -c -r1.473 pg_proc.h
*** src/include/catalog/pg_proc.h	25 Sep 2007 20:03:38 -0000	1.473
--- src/include/catalog/pg_proc.h	11 Oct 2007 14:08:04 -0000
***************
*** 2627,2636 ****
  DATA(insert OID = 1768 ( to_char			PGNSP PGUID 12 1 0 f f t f s 2	25 "1186 25" _null_ _null_ _null_  interval_to_char - _null_ _null_ ));
  DESCR("format interval to text");
  
! DATA(insert OID =  1282 ( quote_ident	   PGNSP PGUID 12 1 0 f f t f i 1 25 "25" _null_ _null_ _null_ quote_ident - _null_ _null_ ));
  DESCR("quote an identifier for usage in a querystring");
! DATA(insert OID =  1283 ( quote_literal    PGNSP PGUID 12 1 0 f f t f i 1 25 "25" _null_ _null_ _null_ quote_literal - _null_ _null_ ));
  DESCR("quote a literal for usage in a querystring");
  
  DATA(insert OID = 1798 (  oidin			   PGNSP PGUID 12 1 0 f f t f i 1 26 "2275" _null_ _null_ _null_ oidin - _null_ _null_ ));
  DESCR("I/O");
--- 2627,2638 ----
  DATA(insert OID = 1768 ( to_char			PGNSP PGUID 12 1 0 f f t f s 2	25 "1186 25" _null_ _null_ _null_  interval_to_char - _null_ _null_ ));
  DESCR("format interval to text");
  
! DATA(insert OID = 1282 ( quote_ident	   PGNSP PGUID 12 1 0 f f t f i 1 25 "25" _null_ _null_ _null_ quote_ident - _null_ _null_ ));
  DESCR("quote an identifier for usage in a querystring");
! DATA(insert OID = 1283 ( quote_literal     PGNSP PGUID 12 1 0 f f t f i 1 25 "25" _null_ _null_ _null_ quote_literal - _null_ _null_ ));
  DESCR("quote a literal for usage in a querystring");
+ DATA(insert OID = 1285 ( quote_nullable    PGNSP PGUID 12 1 0 f f f f i 1 25 "25" _null_ _null_ _null_ quote_nullable - _null_ _null_ ));
+ DESCR("quote a possibly-null literal for usage in a querystring");
  
  DATA(insert OID = 1798 (  oidin			   PGNSP PGUID 12 1 0 f f t f i 1 26 "2275" _null_ _null_ _null_ oidin - _null_ _null_ ));
  DESCR("I/O");
Index: src/include/utils/builtins.h
===================================================================
RCS file: /home/brendanjurd/src/pgsql.cvs/pgsql/src/include/utils/builtins.h,v
retrieving revision 1.304
diff -c -r1.304 builtins.h
*** src/include/utils/builtins.h	24 Sep 2007 01:29:30 -0000	1.304
--- src/include/utils/builtins.h	11 Oct 2007 14:08:04 -0000
***************
*** 916,921 ****
--- 916,922 ----
  /* quote.c */
  extern Datum quote_ident(PG_FUNCTION_ARGS);
  extern Datum quote_literal(PG_FUNCTION_ARGS);
+ extern Datum quote_nullable(PG_FUNCTION_ARGS);
  
  /* guc.c */
  extern Datum show_config_by_name(PG_FUNCTION_ARGS);