|
6 | 6 | * Copyright (c) 2002-2005, PostgreSQL Global Development Group |
7 | 7 | * |
8 | 8 | * IDENTIFICATION |
9 | | - * $PostgreSQL: pgsql/src/backend/utils/adt/lockfuncs.c,v 1.17 2005/04/29 22:28:24 tgl Exp $ |
| 9 | + * $PostgreSQL: pgsql/src/backend/utils/adt/lockfuncs.c,v 1.18 2005/05/17 21:46:10 tgl Exp $ |
10 | 10 | * |
11 | 11 | *------------------------------------------------------------------------- |
12 | 12 | */ |
|
20 | 20 | #include "utils/builtins.h" |
21 | 21 |
|
22 | 22 |
|
| 23 | +/* This must match enum LockTagType! */ |
| 24 | +static const char * const LockTagTypeNames[] = { |
| 25 | + "relation", |
| 26 | + "extend", |
| 27 | + "page", |
| 28 | + "tuple", |
| 29 | + "transaction", |
| 30 | + "object", |
| 31 | + "userlock" |
| 32 | +}; |
| 33 | + |
23 | 34 | /* Working status for pg_lock_status */ |
24 | 35 | typedef struct |
25 | 36 | { |
@@ -53,18 +64,30 @@ pg_lock_status(PG_FUNCTION_ARGS) |
53 | 64 |
|
54 | 65 | /* build tupdesc for result tuples */ |
55 | 66 | /* this had better match pg_locks view in system_views.sql */ |
56 | | - tupdesc = CreateTemplateTupleDesc(6, false); |
57 | | - TupleDescInitEntry(tupdesc, (AttrNumber) 1, "relation", |
58 | | - OIDOID, -1, 0); |
| 67 | + tupdesc = CreateTemplateTupleDesc(12, false); |
| 68 | + TupleDescInitEntry(tupdesc, (AttrNumber) 1, "locktype", |
| 69 | + TEXTOID, -1, 0); |
59 | 70 | TupleDescInitEntry(tupdesc, (AttrNumber) 2, "database", |
60 | 71 | OIDOID, -1, 0); |
61 | | - TupleDescInitEntry(tupdesc, (AttrNumber) 3, "transaction", |
| 72 | + TupleDescInitEntry(tupdesc, (AttrNumber) 3, "relation", |
| 73 | + OIDOID, -1, 0); |
| 74 | + TupleDescInitEntry(tupdesc, (AttrNumber) 4, "page", |
| 75 | + INT4OID, -1, 0); |
| 76 | + TupleDescInitEntry(tupdesc, (AttrNumber) 5, "tuple", |
| 77 | + INT2OID, -1, 0); |
| 78 | + TupleDescInitEntry(tupdesc, (AttrNumber) 6, "transaction", |
62 | 79 | XIDOID, -1, 0); |
63 | | - TupleDescInitEntry(tupdesc, (AttrNumber) 4, "pid", |
| 80 | + TupleDescInitEntry(tupdesc, (AttrNumber) 7, "classid", |
| 81 | + OIDOID, -1, 0); |
| 82 | + TupleDescInitEntry(tupdesc, (AttrNumber) 8, "objid", |
| 83 | + OIDOID, -1, 0); |
| 84 | + TupleDescInitEntry(tupdesc, (AttrNumber) 9, "objsubid", |
| 85 | + INT2OID, -1, 0); |
| 86 | + TupleDescInitEntry(tupdesc, (AttrNumber) 10, "pid", |
64 | 87 | INT4OID, -1, 0); |
65 | | - TupleDescInitEntry(tupdesc, (AttrNumber) 5, "mode", |
| 88 | + TupleDescInitEntry(tupdesc, (AttrNumber) 11, "mode", |
66 | 89 | TEXTOID, -1, 0); |
67 | | - TupleDescInitEntry(tupdesc, (AttrNumber) 6, "granted", |
| 90 | + TupleDescInitEntry(tupdesc, (AttrNumber) 12, "granted", |
68 | 91 | BOOLOID, -1, 0); |
69 | 92 |
|
70 | 93 | funcctx->tuple_desc = BlessTupleDesc(tupdesc); |
@@ -93,8 +116,10 @@ pg_lock_status(PG_FUNCTION_ARGS) |
93 | 116 | PGPROC *proc; |
94 | 117 | bool granted; |
95 | 118 | LOCKMODE mode = 0; |
96 | | - Datum values[6]; |
97 | | - char nulls[6]; |
| 119 | + const char *locktypename; |
| 120 | + char tnbuf[32]; |
| 121 | + Datum values[12]; |
| 122 | + char nulls[12]; |
98 | 123 | HeapTuple tuple; |
99 | 124 | Datum result; |
100 | 125 |
|
@@ -155,30 +180,79 @@ pg_lock_status(PG_FUNCTION_ARGS) |
155 | 180 | MemSet(values, 0, sizeof(values)); |
156 | 181 | MemSet(nulls, ' ', sizeof(nulls)); |
157 | 182 |
|
| 183 | + if (lock->tag.locktag_type <= LOCKTAG_USERLOCK) |
| 184 | + locktypename = LockTagTypeNames[lock->tag.locktag_type]; |
| 185 | + else |
| 186 | + { |
| 187 | + snprintf(tnbuf, sizeof(tnbuf), "unknown %d", |
| 188 | + (int) lock->tag.locktag_type); |
| 189 | + locktypename = tnbuf; |
| 190 | + } |
| 191 | + values[0] = DirectFunctionCall1(textin, |
| 192 | + CStringGetDatum(locktypename)); |
| 193 | + |
| 194 | + |
158 | 195 | switch (lock->tag.locktag_type) |
159 | 196 | { |
160 | 197 | case LOCKTAG_RELATION: |
161 | 198 | case LOCKTAG_RELATION_EXTEND: |
| 199 | + values[1] = ObjectIdGetDatum(lock->tag.locktag_field1); |
| 200 | + values[2] = ObjectIdGetDatum(lock->tag.locktag_field2); |
| 201 | + nulls[3] = 'n'; |
| 202 | + nulls[4] = 'n'; |
| 203 | + nulls[5] = 'n'; |
| 204 | + nulls[6] = 'n'; |
| 205 | + nulls[7] = 'n'; |
| 206 | + nulls[8] = 'n'; |
| 207 | + break; |
162 | 208 | case LOCKTAG_PAGE: |
| 209 | + values[1] = ObjectIdGetDatum(lock->tag.locktag_field1); |
| 210 | + values[2] = ObjectIdGetDatum(lock->tag.locktag_field2); |
| 211 | + values[3] = UInt32GetDatum(lock->tag.locktag_field3); |
| 212 | + nulls[4] = 'n'; |
| 213 | + nulls[5] = 'n'; |
| 214 | + nulls[6] = 'n'; |
| 215 | + nulls[7] = 'n'; |
| 216 | + nulls[8] = 'n'; |
| 217 | + break; |
163 | 218 | case LOCKTAG_TUPLE: |
164 | | - values[0] = ObjectIdGetDatum(lock->tag.locktag_field2); |
165 | 219 | values[1] = ObjectIdGetDatum(lock->tag.locktag_field1); |
166 | | - nulls[2] = 'n'; |
| 220 | + values[2] = ObjectIdGetDatum(lock->tag.locktag_field2); |
| 221 | + values[3] = UInt32GetDatum(lock->tag.locktag_field3); |
| 222 | + values[4] = UInt16GetDatum(lock->tag.locktag_field4); |
| 223 | + nulls[5] = 'n'; |
| 224 | + nulls[6] = 'n'; |
| 225 | + nulls[7] = 'n'; |
| 226 | + nulls[8] = 'n'; |
167 | 227 | break; |
168 | 228 | case LOCKTAG_TRANSACTION: |
169 | | - nulls[0] = 'n'; |
| 229 | + values[5] = TransactionIdGetDatum(lock->tag.locktag_field1); |
170 | 230 | nulls[1] = 'n'; |
171 | | - values[2] = TransactionIdGetDatum(lock->tag.locktag_field1); |
| 231 | + nulls[2] = 'n'; |
| 232 | + nulls[3] = 'n'; |
| 233 | + nulls[4] = 'n'; |
| 234 | + nulls[6] = 'n'; |
| 235 | + nulls[7] = 'n'; |
| 236 | + nulls[8] = 'n'; |
| 237 | + break; |
| 238 | + case LOCKTAG_OBJECT: |
| 239 | + case LOCKTAG_USERLOCK: |
| 240 | + default: /* treat unknown locktags like OBJECT */ |
| 241 | + values[1] = ObjectIdGetDatum(lock->tag.locktag_field1); |
| 242 | + values[6] = ObjectIdGetDatum(lock->tag.locktag_field2); |
| 243 | + values[7] = ObjectIdGetDatum(lock->tag.locktag_field3); |
| 244 | + values[8] = Int16GetDatum(lock->tag.locktag_field4); |
| 245 | + nulls[2] = 'n'; |
| 246 | + nulls[3] = 'n'; |
| 247 | + nulls[4] = 'n'; |
| 248 | + nulls[5] = 'n'; |
172 | 249 | break; |
173 | | - default: |
174 | | - /* XXX Ignore all other lock types for now */ |
175 | | - continue; |
176 | 250 | } |
177 | 251 |
|
178 | | - values[3] = Int32GetDatum(proc->pid); |
179 | | - values[4] = DirectFunctionCall1(textin, |
180 | | - CStringGetDatum(GetLockmodeName(mode))); |
181 | | - values[5] = BoolGetDatum(granted); |
| 252 | + values[9] = Int32GetDatum(proc->pid); |
| 253 | + values[10] = DirectFunctionCall1(textin, |
| 254 | + CStringGetDatum(GetLockmodeName(mode))); |
| 255 | + values[11] = BoolGetDatum(granted); |
182 | 256 |
|
183 | 257 | tuple = heap_formtuple(funcctx->tuple_desc, values, nulls); |
184 | 258 | result = HeapTupleGetDatum(tuple); |
|
0 commit comments