Re: Implemented current_query - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: Implemented current_query
Date
Msg-id 200804041700.m34H0tu18740@momjian.us
Whole thread Raw
In response to Re: Implemented current_query  (Tomas Doran <bobtfish@bobtfish.net>)
List pgsql-patches
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);

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Friendly help for psql
Next
From: Alvaro Herrera
Date:
Subject: Re: Headers dependencies cleanup