Change the parameter_types column of the pg_prepared_statements to be
authorNeil Conway
Mon, 16 Jan 2006 18:15:31 +0000 (18:15 +0000)
committerNeil Conway
Mon, 16 Jan 2006 18:15:31 +0000 (18:15 +0000)
an array of regtype, rather than an array of OIDs. This is likely to
be more useful to user, and the type OID can easily be obtained by
casting a regtype value to OID. Per suggestion from Tom.

Update the documentation and regression tests, and bump the catversion.

doc/src/sgml/catalogs.sgml
src/backend/catalog/system_views.sql
src/backend/commands/prepare.c
src/include/catalog/catversion.h
src/include/catalog/pg_type.h
src/test/regress/expected/prepare.out
src/test/regress/expected/rules.out

index 624b5df96f981e9a788773ce982fcec7e1645ccc..c346005bd96c77842042c41bb6826b0c8d2f5a12 100644 (file)
@@ -1,6 +1,6 @@
 
 
 
       
        The initial value of the transition state.  This is a text
        field containing the initial value in its external string
-       representation.  If this field is null, the transition state
-       value starts out null.
+       representation.  If this field is NULL, the transition state
+       value starts out NULL.
       
      
     
   
 
   
-   New aggregate functions are registered with the CREATE
-   AGGREGATE command.  See  for more
-   information about writing aggregate functions and the meaning of
-   the transition functions, etc.
+   New aggregate functions are registered with the 
+   linkend="sql-createaggregate" endterm="sql-createaggregate-title">
+   command.  See  for more information about
+   writing aggregate functions and the meaning of the transition
+   functions, etc.
   
 
  
       bool
       
       
-       Role may log in, that is, this role can be given as the initial
+       Role may log in. That is, this role can be given as the initial
        session authorization identifier.
       
      
       relukeys
       int2
       
-      unused  (not the number of unique keys)
+      Unused  (not the number of unique keys)
      
 
      
       relfkeys
       int2
       
-      unused  (not the number of foreign keys on the table)
+      Unused  (not the number of foreign keys on the table)
      
 
      
       relrefs
       int2
       
-      unused
+      Unused
      
 
      
       bool
       
       
-       True if we generate an OID for each row of the relation.
+       True if we generate an OID for each row of the relation
       
      
 
       bool
       
       
-       True if the table has (or once had) a primary key.
+       True if the table has (or once had) a primary key
       
      
 
       bool
       
       True if table has rules; see
-       pg_rewrite catalog.
+       pg_rewrite catalog
       
      
 
       relhassubclass
       bool
       
-      True if table has (or once had) any inheritance children.
+      True if table has (or once had) any inheritance children
      
 
      
        Access privileges; see
         and
        
-       for details.
+       for details
       
      
     
        Access privileges; see
         and
        
-       for details.
+       for details
       
      
     
       char
       
       
-       A code defining the specific semantics of this dependency relationship; see text.
+       A code defining the specific semantics of this dependency relationship; see text
       
      
 
       description
       text
       
-      Arbitrary text that serves as the description of this object.
+      Arbitrary text that serves as the description of this object
      
     
    
       indisunique
       bool
       
-      If true, this is a unique index.
+      If true, this is a unique index
      
 
      
       indisclustered
       bool
       
-      If true, the table was last clustered on this index.
+      If true, the table was last clustered on this index
      
 
      
       Expression trees (in nodeToString() representation)
       for index attributes that are not simple column references.  This is a
       list with one element for each zero entry in indkey.
-      Null if all index attributes are simple references.
+      NULL if all index attributes are simple references.
      
 
      
       text
       
       Expression tree (in nodeToString() representation)
-      for partial index predicate.  Null if not a partial index.
+      for partial index predicate.  NULL if not a partial index.
      
     
    
       oid
       pg_class.oid
       
-       The OID of the child table.
+       The OID of the child table
       
      
 
       oid
       pg_class.oid
       
-       The OID of the parent table.
+       The OID of the parent table
       
      
 
        Access privileges; see
         and
        
-       for details.
+       for details
       
      
     
       listenerpid
       int4
       
-      PID of the server process that created this entry.
+      PID of the server process that created this entry
      
 
      
        Access privileges; see
         and
        
-       for details.
+       for details
       
      
     
   
 
   
-   Unused column contain zeroes, for example oprleft is zero for a
-   prefix operator.
+   Unused column contain zeroes. For example, oprleft
+   is zero for a prefix operator.
   
 
  
   
    There are not currently any commands that manipulate procedural language
    templates; to change the built-in information, a superuser must modify
-   the table using ordinary INSERT, DELETE, or UPDATE commands.  It is
-   likely that a future release of PostgreSQL
-   will offer commands to change the entries in a cleaner fashion.
+   the table using ordinary INSERTDELETE,
+   or UPDATE commands.  It is likely that a future
+   release of PostgreSQL will offer
+   commands to change the entries in a cleaner fashion.
   
 
   
        Access privileges; see
         and
        
-       for details.
+       for details
       
      
     
       char
       
       
-       A code defining the specific semantics of this dependency relationship; see text.
+       A code defining the specific semantics of this dependency relationship; see text
       
      
 
       
       
        Numerical statistics of the appropriate kind for the
-       Nth slot, or null if the slot
-       kind does not involve numerical values.
+       Nth slot, or NULL if the slot
+       kind does not involve numerical values
       
      
 
       
       
        Column data values of the appropriate kind for the
-       Nth slot, or null if the slot
+       Nth slot, or NULL if the slot
        kind does not store any data values.  Each array's element
        values are actually of the specific column's data type, so there
        is no way to define these columns' type more specifically than
        Access privileges; see
         and
        
-       for details.
+       for details
       
      
     
       tgargs
       bytea
       
-      Argument strings to pass to trigger, each null-terminated
+      Argument strings to pass to trigger, each NULL-terminated
      
     
    
 
      
       pg_prepared_statements
-      current prepared statements
+      prepared statements
      
 
      
       pg_prepared_xacts
-      currently prepared transactions
+      prepared transactions
      
 
      
       xid
       
       
-       ID of the transaction that is holding or awaiting this lock.
+       ID of the transaction that is holding or awaiting this lock
       
      
      
       
       
        Process ID of the server process holding or awaiting this
-       lock.  Null if the lock is held by a prepared transaction.
+       lock.  NULL if the lock is held by a prepared transaction.
       
      
      
   
    pg_prepared_statements contains one row
    for each prepared statement. Rows are added to the view when a new
-   prepared statement is created, and removed when a prepared
-   statement is released (for example, via the 
-   linkend="sql-deallocate" endterm="sql-deallocate-title">
-   command).
+   prepared statement is created and removed when a prepared statement
+   is released (for example, via the 
+   endterm="sql-deallocate-title"> command).
   
 
   
       text
       
       
-       The identifier of the prepared statement.
+       The identifier of the prepared statement
       
      
      
       timestamptz
       
       
-       The time at which the prepared statement was created.
+       The time at which the prepared statement was created
       
      
      
       parameter_types
-      oid[]
+      regtype[]
       
       
-       The expected parameter types for the prepared statement in the form of
-       an array of type OIDs.
+       The expected parameter types for the prepared statement in the
+       form of an array of regtype. The OID corresponding
+       to an element of this array can be obtained by casting the
+       regtype value to oid.
       
      
      
        true if the prepared statement was created
        via the PREPARE SQL statement;
        false if the statement was prepared via the
-       frontend/backend protocol.
+       frontend/backend protocol
       
      
     
       definition
       text
       
-      view definition (a reconstructed SELECT query)
+      view definition (a reconstructed SELECT query)
      
     
    
index a186c33b4447b3d1bf79cdf5104691c904c48d0e..c44e9ed72f1ca5946655a0936aed66b0b21cea17 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1996-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.23 2006/01/08 07:00:25 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.24 2006/01/16 18:15:30 neilc Exp $
  */
 
 CREATE VIEW pg_roles AS 
@@ -160,7 +160,7 @@ CREATE VIEW pg_prepared_statements AS
     SELECT P.name, P.statement, P.prepare_time, P.parameter_types, P.from_sql
     FROM pg_prepared_statement() AS P
     (name text, statement text, prepare_time timestamptz,
-     parameter_types oid[], from_sql boolean);
+     parameter_types regtype[], from_sql boolean);
 
 CREATE VIEW pg_settings AS 
     SELECT * 
index ccf8c297b21fc204ee4dd5e1948adf12476c020b..f523984e5a8cef719054024c831ebfe626b6e6c9 100644 (file)
@@ -10,7 +10,7 @@
  * Copyright (c) 2002-2005, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.45 2006/01/08 07:00:25 neilc Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.46 2006/01/16 18:15:30 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -45,7 +45,7 @@ static HTAB *prepared_queries = NULL;
 static void InitQueryHashTable(void);
 static ParamListInfo EvaluateParams(EState *estate,
               List *params, List *argtypes);
-static Datum build_oid_array(List *oid_list);
+static Datum build_regtype_array(List *oid_list);
 
 /*
  * Implements the 'PREPARE' utility statement.
@@ -674,7 +674,7 @@ ExplainExecuteQuery(ExplainStmt *stmt, ParamListInfo params,
 
 /*
  * This set returning function reads all the prepared statements and
- * returns a set of (name, statement, prepare_time, param_types).
+ * returns a set of (name, statement, prepare_time, param_types, from_sql).
  */
 Datum
 pg_prepared_statement(PG_FUNCTION_ARGS)
@@ -721,7 +721,7 @@ pg_prepared_statement(PG_FUNCTION_ARGS)
        TupleDescInitEntry(tupdesc, (AttrNumber) 3, "prepare_time",
                           TIMESTAMPTZOID, -1, 0);
        TupleDescInitEntry(tupdesc, (AttrNumber) 4, "parameter_types",
-                          OIDARRAYOID, -1, 0);
+                          REGTYPEARRAYOID, -1, 0);
        TupleDescInitEntry(tupdesc, (AttrNumber) 5, "from_sql",
                           BOOLOID, -1, 0);
 
@@ -757,7 +757,7 @@ pg_prepared_statement(PG_FUNCTION_ARGS)
                                    CStringGetDatum(prep_stmt->query_string));
 
        values[2] = TimestampTzGetDatum(prep_stmt->prepare_time);
-       values[3] = build_oid_array(prep_stmt->argtype_list);
+       values[3] = build_regtype_array(prep_stmt->argtype_list);
        values[4] = BoolGetDatum(prep_stmt->from_sql);
 
        tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
@@ -770,26 +770,33 @@ pg_prepared_statement(PG_FUNCTION_ARGS)
 
 /*
  * This utility function takes a List of Oids, and returns a Datum
- * pointing to a Postgres array containing those OIDs. The empty list
- * is returned as a zero-element array, not NULL.
+ * pointing to a one-dimensional Postgres array of regtypes. The empty
+ * list is returned as a zero-element array, not NULL.
  */
 static Datum
-build_oid_array(List *oid_list)
+build_regtype_array(List *oid_list)
 {
-   ListCell *lc;
-   int len;
-   int i;
-   Datum *tmp_ary;
-   ArrayType *ary;
+   ListCell   *lc;
+   int         len;
+   int         i;
+   Datum      *tmp_ary;
+   ArrayType  *result;
 
    len = list_length(oid_list);
    tmp_ary = (Datum *) palloc(len * sizeof(Datum));
 
    i = 0;
    foreach(lc, oid_list)
-       tmp_ary[i++] = ObjectIdGetDatum(lfirst_oid(lc));
+   {
+       Oid     oid;
+       Datum   oid_str;
+
+       oid = lfirst_oid(lc);
+       oid_str = DirectFunctionCall1(oidout, ObjectIdGetDatum(oid));
+       tmp_ary[i++] = DirectFunctionCall1(regtypein, oid_str);
+   }
 
-   /* XXX: this hardcodes assumptions about the OID type... */
-   ary = construct_array(tmp_ary, len, OIDOID, sizeof(Oid), true, 'i');
-   return PointerGetDatum(ary);
+   /* XXX: this hardcodes assumptions about the regtype type */
+   result = construct_array(tmp_ary, len, REGTYPEOID, 4, true, 'i');
+   return PointerGetDatum(result);
 }
index 258a9956f4a20293a17d11dfbf0848f32fcdaf0e..b844196c4ff958bb3e52e3e42b9aa66adb3427ac 100644 (file)
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.310 2006/01/11 20:12:39 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.311 2006/01/16 18:15:30 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 200601111
+#define CATALOG_VERSION_NO 200601161
 
 #endif
index c6ca59c87e2f5aa410b6c78ddef5174c7228ec0f..dfaa69eca52813baaa2d5772337aa066fa5221c8 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_type.h,v 1.168 2006/01/08 07:00:26 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_type.h,v 1.169 2006/01/16 18:15:30 neilc Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
@@ -406,7 +406,6 @@ DATA(insert OID = 1007 (  _int4      PGNSP PGUID -1 f b t \054 0    23 array_in array_
 DATA(insert OID = 1008 (  _regproc  PGNSP PGUID -1 f b t \054 0    24 array_in array_out array_recv array_send - i x f 0 -1 0 _null_ _null_ ));
 DATA(insert OID = 1009 (  _text         PGNSP PGUID -1 f b t \054 0    25 array_in array_out array_recv array_send - i x f 0 -1 0 _null_ _null_ ));
 DATA(insert OID = 1028 (  _oid      PGNSP PGUID -1 f b t \054 0    26 array_in array_out array_recv array_send - i x f 0 -1 0 _null_ _null_ ));
-#define OIDARRAYOID            1028
 DATA(insert OID = 1010 (  _tid      PGNSP PGUID -1 f b t \054 0    27 array_in array_out array_recv array_send - i x f 0 -1 0 _null_ _null_ ));
 DATA(insert OID = 1011 (  _xid      PGNSP PGUID -1 f b t \054 0    28 array_in array_out array_recv array_send - i x f 0 -1 0 _null_ _null_ ));
 DATA(insert OID = 1012 (  _cid      PGNSP PGUID -1 f b t \054 0    29 array_in array_out array_recv array_send - i x f 0 -1 0 _null_ _null_ ));
@@ -517,6 +516,7 @@ DATA(insert OID = 2208 ( _regoper      PGNSP PGUID -1 f b t \054 0 2203 array_in a
 DATA(insert OID = 2209 ( _regoperator  PGNSP PGUID -1 f b t \054 0 2204 array_in array_out array_recv array_send - i x f 0 -1 0 _null_ _null_ ));
 DATA(insert OID = 2210 ( _regclass    PGNSP PGUID -1 f b t \054 0 2205 array_in array_out array_recv array_send - i x f 0 -1 0 _null_ _null_ ));
 DATA(insert OID = 2211 ( _regtype     PGNSP PGUID -1 f b t \054 0 2206 array_in array_out array_recv array_send - i x f 0 -1 0 _null_ _null_ ));
+#define REGTYPEARRAYOID    2211
 
 /*
  * pseudo-types
index f7d1a7581497ffb3dc86cd402c8f97ffada81199..3532953f552acec5adf0923963fe027f595c6627 100644 (file)
@@ -148,19 +148,19 @@ PREPARE q7(unknown) AS
     SELECT * FROM road WHERE thepath = $1;
 SELECT name, statement, parameter_types FROM pg_prepared_statements
     ORDER BY name;
- name |                                                                                    statement                                                                                    |   parameter_types    
-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------
+ name |                                                                                    statement                                                                                    |                    parameter_types                     
+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------
  q2   | PREPARE q2(text) AS
    SELECT datname, datistemplate, datallowconn
-   FROM pg_database WHERE datname = $1;                                                                          | {25}
+   FROM pg_database WHERE datname = $1;                                                                          | {text}
  q3   | PREPARE q3(text, int, float, boolean, oid, smallint) AS
    SELECT * FROM tenk1 WHERE string4 = $1 AND (four = $2 OR
-   ten = $3::bigint OR true = $4 OR oid = $5 OR odd = $6::int); | {25,23,701,16,26,21}
+   ten = $3::bigint OR true = $4 OR oid = $5 OR odd = $6::int); | {text,integer,"double precision",boolean,oid,smallint}
  q5   | PREPARE q5(int, text) AS
-   SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2;                                                                                              | {23,25}
+   SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2;                                                                                              | {integer,text}
  q6   | PREPARE q6 AS
-    SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;                                                                                                     | {23,19}
+    SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;                                                                                                     | {integer,name}
  q7   | PREPARE q7(unknown) AS
-    SELECT * FROM road WHERE thepath = $1;                                                                                                               | {602}
+    SELECT * FROM road WHERE thepath = $1;                                                                                                               | {path}
 (5 rows)
 
index 67616b73335ca2e7bb15b284071f3d1a8d9c0340..63c06ec75ace9e09f988eb5dfa8e2a62175e5248 100644 (file)
@@ -1280,7 +1280,7 @@ SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
  pg_group                 | SELECT pg_authid.rolname AS groname, pg_authid.oid AS grosysid, ARRAY(SELECT pg_auth_members.member FROM pg_auth_members WHERE (pg_auth_members.roleid = pg_authid.oid)) AS grolist FROM pg_authid WHERE (NOT pg_authid.rolcanlogin);
  pg_indexes               | SELECT n.nspname AS schemaname, c.relname AS tablename, i.relname AS indexname, t.spcname AS "tablespace", pg_get_indexdef(i.oid) AS indexdef FROM ((((pg_index x JOIN pg_class c ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) LEFT JOIN pg_tablespace t ON ((t.oid = i.reltablespace))) WHERE ((c.relkind = 'r'::"char") AND (i.relkind = 'i'::"char"));
  pg_locks                 | SELECT l.locktype, l."database", l.relation, l.page, l.tuple, l.transactionid, l.classid, l.objid, l.objsubid, l."transaction", l.pid, l."mode", l."granted" FROM pg_lock_status() l(locktype text, "database" oid, relation oid, page integer, tuple smallint, transactionid xid, classid oid, objid oid, objsubid smallint, "transaction" xid, pid integer, "mode" text, "granted" boolean);
- pg_prepared_statements   | SELECT p.name, p."statement", p.prepare_time, p.parameter_types, p.from_sql FROM pg_prepared_statement() p(name text, "statement" text, prepare_time timestamp with time zone, parameter_types oid[], from_sql boolean);
+ pg_prepared_statements   | SELECT p.name, p."statement", p.prepare_time, p.parameter_types, p.from_sql FROM pg_prepared_statement() p(name text, "statement" text, prepare_time timestamp with time zone, parameter_types regtype[], from_sql boolean);
  pg_prepared_xacts        | SELECT p."transaction", p.gid, p."prepared", u.rolname AS "owner", d.datname AS "database" FROM ((pg_prepared_xact() p("transaction" xid, gid text, "prepared" timestamp with time zone, ownerid oid, dbid oid) LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) LEFT JOIN pg_database d ON ((p.dbid = d.oid)));
  pg_roles                 | SELECT pg_authid.rolname, pg_authid.rolsuper, pg_authid.rolinherit, pg_authid.rolcreaterole, pg_authid.rolcreatedb, pg_authid.rolcatupdate, pg_authid.rolcanlogin, pg_authid.rolconnlimit, '********'::text AS rolpassword, pg_authid.rolvaliduntil, pg_authid.rolconfig, pg_authid.oid FROM pg_authid;
  pg_rules                 | SELECT n.nspname AS schemaname, c.relname AS tablename, r.rulename, pg_get_ruledef(r.oid) AS definition FROM ((pg_rewrite r JOIN pg_class c ON ((c.oid = r.ev_class))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (r.rulename <> '_RETURN'::name);