aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-05-17 21:46:11 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-05-17 21:46:11 +0000
commita9c4c9cd52b3fde9aed016cbc5d684ab2ad968ef (patch)
tree171185e6f234c68b95016c2db9bf2a6db3d42b1e /src
parent4e7d6f534913becd050f21dab8f4a7a90fe1c0c3 (diff)
downloadpostgresql-a9c4c9cd52b3fde9aed016cbc5d684ab2ad968ef.tar.gz
postgresql-a9c4c9cd52b3fde9aed016cbc5d684ab2ad968ef.zip
Extend the pg_locks system view so that it can fully display all lock
types, as per recent discussion.
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/system_views.sql8
-rw-r--r--src/backend/utils/adt/lockfuncs.c116
-rw-r--r--src/include/catalog/catversion.h4
-rw-r--r--src/include/catalog/pg_proc.h4
-rw-r--r--src/test/regress/expected/rules.out2
5 files changed, 105 insertions, 29 deletions
diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql
index 1bf0f1657d5..d66bb780b4f 100644
--- a/src/backend/catalog/system_views.sql
+++ b/src/backend/catalog/system_views.sql
@@ -3,7 +3,7 @@
*
* Copyright (c) 1996-2005, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.12 2005/05/09 11:31:32 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.13 2005/05/17 21:46:09 tgl Exp $
*/
CREATE VIEW pg_user AS
@@ -261,8 +261,10 @@ CREATE VIEW pg_stat_database AS
CREATE VIEW pg_locks AS
SELECT *
- FROM pg_lock_status() AS L(relation oid, database oid,
- transaction xid, pid int4, mode text, granted boolean);
+ FROM pg_lock_status() AS L
+ (locktype text, database oid, relation oid, page int4, tuple int2,
+ transaction xid, classid oid, objid oid, objsubid int2,
+ pid int4, mode text, granted boolean);
CREATE VIEW pg_settings AS
SELECT *
diff --git a/src/backend/utils/adt/lockfuncs.c b/src/backend/utils/adt/lockfuncs.c
index 6878662b79f..e941ec2d3d8 100644
--- a/src/backend/utils/adt/lockfuncs.c
+++ b/src/backend/utils/adt/lockfuncs.c
@@ -6,7 +6,7 @@
* Copyright (c) 2002-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/lockfuncs.c,v 1.17 2005/04/29 22:28:24 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/lockfuncs.c,v 1.18 2005/05/17 21:46:10 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -20,6 +20,17 @@
#include "utils/builtins.h"
+/* This must match enum LockTagType! */
+static const char * const LockTagTypeNames[] = {
+ "relation",
+ "extend",
+ "page",
+ "tuple",
+ "transaction",
+ "object",
+ "userlock"
+};
+
/* Working status for pg_lock_status */
typedef struct
{
@@ -53,18 +64,30 @@ pg_lock_status(PG_FUNCTION_ARGS)
/* build tupdesc for result tuples */
/* this had better match pg_locks view in system_views.sql */
- tupdesc = CreateTemplateTupleDesc(6, false);
- TupleDescInitEntry(tupdesc, (AttrNumber) 1, "relation",
- OIDOID, -1, 0);
+ tupdesc = CreateTemplateTupleDesc(12, false);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "locktype",
+ TEXTOID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber) 2, "database",
OIDOID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber) 3, "transaction",
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "relation",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "page",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "tuple",
+ INT2OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6, "transaction",
XIDOID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber) 4, "pid",
+ TupleDescInitEntry(tupdesc, (AttrNumber) 7, "classid",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 8, "objid",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 9, "objsubid",
+ INT2OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 10, "pid",
INT4OID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber) 5, "mode",
+ TupleDescInitEntry(tupdesc, (AttrNumber) 11, "mode",
TEXTOID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber) 6, "granted",
+ TupleDescInitEntry(tupdesc, (AttrNumber) 12, "granted",
BOOLOID, -1, 0);
funcctx->tuple_desc = BlessTupleDesc(tupdesc);
@@ -93,8 +116,10 @@ pg_lock_status(PG_FUNCTION_ARGS)
PGPROC *proc;
bool granted;
LOCKMODE mode = 0;
- Datum values[6];
- char nulls[6];
+ const char *locktypename;
+ char tnbuf[32];
+ Datum values[12];
+ char nulls[12];
HeapTuple tuple;
Datum result;
@@ -155,30 +180,79 @@ pg_lock_status(PG_FUNCTION_ARGS)
MemSet(values, 0, sizeof(values));
MemSet(nulls, ' ', sizeof(nulls));
+ if (lock->tag.locktag_type <= LOCKTAG_USERLOCK)
+ locktypename = LockTagTypeNames[lock->tag.locktag_type];
+ else
+ {
+ snprintf(tnbuf, sizeof(tnbuf), "unknown %d",
+ (int) lock->tag.locktag_type);
+ locktypename = tnbuf;
+ }
+ values[0] = DirectFunctionCall1(textin,
+ CStringGetDatum(locktypename));
+
+
switch (lock->tag.locktag_type)
{
case LOCKTAG_RELATION:
case LOCKTAG_RELATION_EXTEND:
+ values[1] = ObjectIdGetDatum(lock->tag.locktag_field1);
+ values[2] = ObjectIdGetDatum(lock->tag.locktag_field2);
+ nulls[3] = 'n';
+ nulls[4] = 'n';
+ nulls[5] = 'n';
+ nulls[6] = 'n';
+ nulls[7] = 'n';
+ nulls[8] = 'n';
+ break;
case LOCKTAG_PAGE:
+ values[1] = ObjectIdGetDatum(lock->tag.locktag_field1);
+ values[2] = ObjectIdGetDatum(lock->tag.locktag_field2);
+ values[3] = UInt32GetDatum(lock->tag.locktag_field3);
+ nulls[4] = 'n';
+ nulls[5] = 'n';
+ nulls[6] = 'n';
+ nulls[7] = 'n';
+ nulls[8] = 'n';
+ break;
case LOCKTAG_TUPLE:
- values[0] = ObjectIdGetDatum(lock->tag.locktag_field2);
values[1] = ObjectIdGetDatum(lock->tag.locktag_field1);
- nulls[2] = 'n';
+ values[2] = ObjectIdGetDatum(lock->tag.locktag_field2);
+ values[3] = UInt32GetDatum(lock->tag.locktag_field3);
+ values[4] = UInt16GetDatum(lock->tag.locktag_field4);
+ nulls[5] = 'n';
+ nulls[6] = 'n';
+ nulls[7] = 'n';
+ nulls[8] = 'n';
break;
case LOCKTAG_TRANSACTION:
- nulls[0] = 'n';
+ values[5] = TransactionIdGetDatum(lock->tag.locktag_field1);
nulls[1] = 'n';
- values[2] = TransactionIdGetDatum(lock->tag.locktag_field1);
+ nulls[2] = 'n';
+ nulls[3] = 'n';
+ nulls[4] = 'n';
+ nulls[6] = 'n';
+ nulls[7] = 'n';
+ nulls[8] = 'n';
+ break;
+ case LOCKTAG_OBJECT:
+ case LOCKTAG_USERLOCK:
+ default: /* treat unknown locktags like OBJECT */
+ values[1] = ObjectIdGetDatum(lock->tag.locktag_field1);
+ values[6] = ObjectIdGetDatum(lock->tag.locktag_field2);
+ values[7] = ObjectIdGetDatum(lock->tag.locktag_field3);
+ values[8] = Int16GetDatum(lock->tag.locktag_field4);
+ nulls[2] = 'n';
+ nulls[3] = 'n';
+ nulls[4] = 'n';
+ nulls[5] = 'n';
break;
- default:
- /* XXX Ignore all other lock types for now */
- continue;
}
- values[3] = Int32GetDatum(proc->pid);
- values[4] = DirectFunctionCall1(textin,
- CStringGetDatum(GetLockmodeName(mode)));
- values[5] = BoolGetDatum(granted);
+ values[9] = Int32GetDatum(proc->pid);
+ values[10] = DirectFunctionCall1(textin,
+ CStringGetDatum(GetLockmodeName(mode)));
+ values[11] = BoolGetDatum(granted);
tuple = heap_formtuple(funcctx->tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 2579b032a59..dd1c29ab02b 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -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.267 2005/05/09 11:31:34 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.268 2005/05/17 21:46:10 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -53,6 +53,6 @@
*/
/* yyyymmddN */
-#define CATALOG_VERSION_NO 200505091
+#define CATALOG_VERSION_NO 200505171
#endif
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 13468fc5beb..a3f50ea8902 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -7,7 +7,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_proc.h,v 1.361 2005/05/09 11:31:34 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.362 2005/05/17 21:46:10 tgl Exp $
*
* NOTES
* The script catalog/genbki.sh reads this file and generates .bki
@@ -2999,7 +2999,7 @@ DATA(insert OID = 2078 ( set_config PGNSP PGUID 12 f f f f v 3 25 "25 25 16" _
DESCR("SET X as a function");
DATA(insert OID = 2084 ( pg_show_all_settings PGNSP PGUID 12 f f t t s 0 2249 "" _null_ _null_ _null_ show_all_settings - _null_ ));
DESCR("SHOW ALL as a function");
-DATA(insert OID = 1371 ( pg_lock_status PGNSP PGUID 12 f f f t v 0 2249 "" _null_ _null_ _null_ pg_lock_status - _null_ ));
+DATA(insert OID = 1371 ( pg_lock_status PGNSP PGUID 12 f f t t v 0 2249 "" _null_ _null_ _null_ pg_lock_status - _null_ ));
DESCR("view system lock information");
DATA(insert OID = 2079 ( pg_table_is_visible PGNSP PGUID 12 f f t f s 1 16 "26" _null_ _null_ _null_ pg_table_is_visible - _null_ ));
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 5e3ca10faeb..5eccf2d44a0 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -1278,7 +1278,7 @@ SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
--------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
iexit | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r WHERE (ih.thepath ## r.thepath);
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.relation, l."database", l."transaction", l.pid, l."mode", l.granted FROM pg_lock_status() l(relation oid, "database" oid, "transaction" xid, pid integer, "mode" text, granted boolean);
+ pg_locks | SELECT l.locktype, l."database", l.relation, l.page, l.tuple, l."transaction", l.classid, l.objid, l.objsubid, l.pid, l."mode", l.granted FROM pg_lock_status() l(locktype text, "database" oid, relation oid, page integer, tuple smallint, "transaction" xid, classid oid, objid oid, objsubid smallint, pid integer, "mode" text, granted boolean);
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);
pg_settings | SELECT a.name, a.setting, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val FROM pg_show_all_settings() a(name text, setting text, category text, short_desc text, extra_desc text, context text, vartype text, source text, min_val text, max_val text);
pg_stat_activity | SELECT d.oid AS datid, d.datname, pg_stat_get_backend_pid(s.backendid) AS procpid, pg_stat_get_backend_userid(s.backendid) AS usesysid, u.usename, pg_stat_get_backend_activity(s.backendid) AS current_query, pg_stat_get_backend_activity_start(s.backendid) AS query_start, pg_stat_get_backend_start(s.backendid) AS backend_start, pg_stat_get_backend_client_addr(s.backendid) AS client_addr, pg_stat_get_backend_client_port(s.backendid) AS client_port FROM pg_database d, (SELECT pg_stat_get_backend_idset() AS backendid) s, pg_shadow u WHERE ((pg_stat_get_backend_dbid(s.backendid) = d.oid) AND (pg_stat_get_backend_userid(s.backendid) = u.usesysid));