I have applied a modified version of this patch, attached. I made a few
changes:
o You had current_query() returning 'void' so it didn't work
o I removed the dblink regression tests for current_query() as
it is now a backend function
o Update documentation to mention the possibility of multiple
statements
o Used the new cstring_to_text() usage that Tom had updated in
CVS for this function
o The pg_proc.h oids and number of columns didn't match CVS
Thanks for the patch.
---------------------------------------------------------------------------
Tomas Doran wrote:
>
> On 10 May 2007, at 03:09, Alvaro Herrera wrote:
> > FWIW I think you should still provide dblink_current_query, even if
> > it's
> > only a wrapper over current_query(), for backwards compatibility.
>
> Good point. Done as suggested (I think, or did you mean also the
> change of instances to use current_query()?). Replaced
> dblink_current_query with an SQL procedure wrapper, I assume that's
> the most efficient way of doing it?
>
> > Also, typically we don't remove items from the TODO list. We mark
> > them
> > as "done" prepending them with a dash. Patch authors are not expected
> > to do it either (though I don't see it be a problem if they did).
>
> Not quite sure what you're suggesting (which way round), so I just
> didn't do it (as you said I'm not expected to).
>
> > Doesn't matter ... just make sure duplicate_oids doesn't report a
> > problem. unused_oids is useful to find, err, unused OIDs.
>
> Ahh, hadn't found those, thanks. They're in the dev FAQ too, *blush*.
> I need this for something I'm doing at $ork, and thought I'd
> implement it in the backend, as well as a .so, it's been a learning
> experience :)
--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com
+ If your life is a hard drive, Christ can be your backup. +
Index: contrib/dblink/dblink.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/dblink/dblink.c,v
retrieving revision 1.71
diff -c -c -r1.71 dblink.c
*** contrib/dblink/dblink.c 26 Mar 2008 21:10:36 -0000 1.71
--- contrib/dblink/dblink.c 4 Apr 2008 16:45:36 -0000
***************
*** 1631,1653 ****
PG_RETURN_TEXT_P(cstring_to_text(sql));
}
- /*
- * dblink_current_query
- * return the current query string
- * to allow its use in (among other things)
- * rewrite rules
- */
- PG_FUNCTION_INFO_V1(dblink_current_query);
- Datum
- dblink_current_query(PG_FUNCTION_ARGS)
- {
- if (debug_query_string)
- PG_RETURN_TEXT_P(cstring_to_text(debug_query_string));
- else
- PG_RETURN_NULL();
- }
-
-
/*************************************************************
* internal functions
*/
--- 1631,1636 ----
Index: contrib/dblink/dblink.h
===================================================================
RCS file: /cvsroot/pgsql/contrib/dblink/dblink.h,v
retrieving revision 1.19
diff -c -c -r1.19 dblink.h
*** contrib/dblink/dblink.h 1 Jan 2008 19:45:45 -0000 1.19
--- contrib/dblink/dblink.h 4 Apr 2008 16:45:36 -0000
***************
*** 56,61 ****
extern Datum dblink_build_sql_insert(PG_FUNCTION_ARGS);
extern Datum dblink_build_sql_delete(PG_FUNCTION_ARGS);
extern Datum dblink_build_sql_update(PG_FUNCTION_ARGS);
- extern Datum dblink_current_query(PG_FUNCTION_ARGS);
#endif /* DBLINK_H */
--- 56,60 ----
Index: contrib/dblink/dblink.sql.in
===================================================================
RCS file: /cvsroot/pgsql/contrib/dblink/dblink.sql.in,v
retrieving revision 1.14
diff -c -c -r1.14 dblink.sql.in
*** contrib/dblink/dblink.sql.in 13 Nov 2007 04:24:27 -0000 1.14
--- contrib/dblink/dblink.sql.in 4 Apr 2008 16:45:36 -0000
***************
*** 163,173 ****
AS 'MODULE_PATHNAME','dblink_build_sql_update'
LANGUAGE C STRICT;
- CREATE OR REPLACE FUNCTION dblink_current_query ()
- RETURNS text
- AS 'MODULE_PATHNAME','dblink_current_query'
- LANGUAGE C;
-
CREATE OR REPLACE FUNCTION dblink_send_query(text, text)
RETURNS int4
AS 'MODULE_PATHNAME', 'dblink_send_query'
--- 163,168 ----
Index: contrib/dblink/uninstall_dblink.sql
===================================================================
RCS file: /cvsroot/pgsql/contrib/dblink/uninstall_dblink.sql,v
retrieving revision 1.5
diff -c -c -r1.5 uninstall_dblink.sql
*** contrib/dblink/uninstall_dblink.sql 13 Nov 2007 04:24:27 -0000 1.5
--- contrib/dblink/uninstall_dblink.sql 4 Apr 2008 16:45:36 -0000
***************
*** 3,10 ****
-- Adjust this setting to control where the objects get dropped.
SET search_path = public;
- DROP FUNCTION dblink_current_query ();
-
DROP FUNCTION dblink_build_sql_update (text, int2vector, int4, _text, _text);
DROP FUNCTION dblink_build_sql_delete (text, int2vector, int4, _text);
--- 3,8 ----
Index: contrib/dblink/expected/dblink.out
===================================================================
RCS file: /cvsroot/pgsql/contrib/dblink/expected/dblink.out,v
retrieving revision 1.21
diff -c -c -r1.21 dblink.out
*** contrib/dblink/expected/dblink.out 3 Jan 2008 21:27:59 -0000 1.21
--- contrib/dblink/expected/dblink.out 4 Apr 2008 16:45:36 -0000
***************
*** 22,34 ****
INSERT INTO foo VALUES (8,'i','{"a8","b8","c8"}');
INSERT INTO foo VALUES (9,'j','{"a9","b9","c9"}');
-- misc utilities
- -- show the currently executing query
- SELECT 'hello' AS hello, dblink_current_query() AS query;
- hello | query
- -------+-----------------------------------------------------------
- hello | SELECT 'hello' AS hello, dblink_current_query() AS query;
- (1 row)
-
-- list the primary key fields
SELECT *
FROM dblink_get_pkey('foo');
--- 22,27 ----
Index: contrib/dblink/sql/dblink.sql
===================================================================
RCS file: /cvsroot/pgsql/contrib/dblink/sql/dblink.sql,v
retrieving revision 1.18
diff -c -c -r1.18 dblink.sql
*** contrib/dblink/sql/dblink.sql 3 Jan 2008 21:27:59 -0000 1.18
--- contrib/dblink/sql/dblink.sql 4 Apr 2008 16:45:36 -0000
***************
*** 27,35 ****
-- misc utilities
- -- show the currently executing query
- SELECT 'hello' AS hello, dblink_current_query() AS query;
-
-- list the primary key fields
SELECT *
FROM dblink_get_pkey('foo');
--- 27,32 ----
Index: doc/src/sgml/dblink.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/dblink.sgml,v
retrieving revision 1.3
diff -c -c -r1.3 dblink.sgml
*** doc/src/sgml/dblink.sgml 6 Dec 2007 04:12:09 -0000 1.3
--- doc/src/sgml/dblink.sgml 4 Apr 2008 16:45:37 -0000
***************
*** 1346,1394 ****
</refsect1>
</refentry>
- <refentry id="CONTRIB-DBLINK-CURRENT-QUERY">
- <refnamediv>
- <refname>dblink_current_query</refname>
- <refpurpose>returns the current query string</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv>
- <synopsis>
- dblink_current_query() returns text
- </synopsis>
- </refsynopsisdiv>
-
- <refsect1>
- <title>Description</title>
-
- <para>
- Returns the currently executing interactive command string of the
- local database session, or NULL if it can't be determined. Note
- that this function is not really related to <filename>dblink</>'s
- other functionality. It is provided since it is sometimes useful
- in generating queries to be forwarded to remote databases.
- </para>
- </refsect1>
-
- <refsect1>
- <title>Return Value</title>
-
- <para>Returns a copy of the currently executing query string.</para>
- </refsect1>
-
- <refsect1>
- <title>Example</title>
-
- <programlisting>
- test=# select dblink_current_query();
- dblink_current_query
- --------------------------------
- select dblink_current_query();
- (1 row)
- </programlisting>
- </refsect1>
- </refentry>
-
<refentry id="CONTRIB-DBLINK-GET-PKEY">
<refnamediv>
<refname>dblink_get_pkey</refname>
--- 1346,1351 ----
Index: doc/src/sgml/func.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/func.sgml,v
retrieving revision 1.425
diff -c -c -r1.425 func.sgml
*** doc/src/sgml/func.sgml 23 Mar 2008 00:24:19 -0000 1.425
--- doc/src/sgml/func.sgml 4 Apr 2008 16:45:37 -0000
***************
*** 10725,10730 ****
--- 10725,10736 ----
</row>
<row>
+ <entry><literal><function>current_query</function></literal></entry>
+ <entry><type>text</type></entry>
+ <entry>text of the currently executing query (might contain more than one statement)</entry>
+ </row>
+
+ <row>
<entry><literal><function>inet_client_addr</function>()</literal></entry>
<entry><type>inet</type></entry>
<entry>address of the remote connection</entry>
Index: src/backend/utils/adt/misc.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/misc.c,v
retrieving revision 1.58
diff -c -c -r1.58 misc.c
*** src/backend/utils/adt/misc.c 1 Jan 2008 19:45:52 -0000 1.58
--- src/backend/utils/adt/misc.c 4 Apr 2008 16:45:39 -0000
***************
*** 29,34 ****
--- 29,35 ----
#include "storage/pmsignal.h"
#include "storage/procarray.h"
#include "utils/builtins.h"
+ #include "tcop/tcopprot.h"
#define atooid(x) ((Oid) strtoul((x), NULL, 10))
***************
*** 72,77 ****
--- 73,91 ----
/*
+ * current_query()
+ * Expose the current query to the user (useful in stored procedures)
+ */
+ Datum
+ current_query(PG_FUNCTION_ARGS)
+ {
+ if (debug_query_string)
+ PG_RETURN_TEXT_P(cstring_to_text(debug_query_string));
+ else
+ PG_RETURN_NULL();
+ }
+
+ /*
* Functions to send signals to other backends.
*/
static bool
Index: src/include/catalog/pg_proc.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/catalog/pg_proc.h,v
retrieving revision 1.485
diff -c -c -r1.485 pg_proc.h
*** src/include/catalog/pg_proc.h 27 Mar 2008 03:57:34 -0000 1.485
--- src/include/catalog/pg_proc.h 4 Apr 2008 16:45:40 -0000
***************
*** 1117,1122 ****
--- 1117,1124 ----
DATA(insert OID = 861 ( current_database PGNSP PGUID 12 1 0 f f t f i 0 19 "" _null_ _null_ _null_
current_database- _null_ _null_ ));
DESCR("returns the current database");
+ DATA(insert OID = 817 ( current_query PGNSP PGUID 12 1 0 f f f f v 0 25 "" _null_ _null_ _null_
current_query- _null_ _null_ ));
+ DESCR("returns the currently executing query");
DATA(insert OID = 862 ( int4_mul_cash PGNSP PGUID 12 1 0 f f t f i 2 790 "23 790" _null_ _null_ _null_
int4_mul_cash- _null_ _null_ ));
DESCR("multiply");
Index: src/include/utils/builtins.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/utils/builtins.h,v
retrieving revision 1.310
diff -c -c -r1.310 builtins.h
*** src/include/utils/builtins.h 25 Mar 2008 22:42:45 -0000 1.310
--- src/include/utils/builtins.h 4 Apr 2008 16:45:41 -0000
***************
*** 414,419 ****
--- 414,420 ----
extern Datum nullvalue(PG_FUNCTION_ARGS);
extern Datum nonnullvalue(PG_FUNCTION_ARGS);
extern Datum current_database(PG_FUNCTION_ARGS);
+ extern Datum current_query(PG_FUNCTION_ARGS);
extern Datum pg_cancel_backend(PG_FUNCTION_ARGS);
extern Datum pg_reload_conf(PG_FUNCTION_ARGS);
extern Datum pg_tablespace_databases(PG_FUNCTION_ARGS);