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);