Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 844a28a

Browse files
committed
pg_lsn macro naming and type behavior revisions.
Change pg_lsn_mi so that it can return negative values when subtracting LSNs, and clean up some perhaps ill-considered macro names.
1 parent 7d03a83 commit 844a28a

File tree

4 files changed

+33
-30
lines changed

4 files changed

+33
-30
lines changed

src/backend/utils/adt/pg_lsn.c

+22-23
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@ pg_lsn_in(PG_FUNCTION_ARGS)
5050
off = (uint32) strtoul(str + len1 + 1, NULL, 16);
5151
result = (XLogRecPtr) ((uint64) id << 32) | off;
5252

53-
PG_RETURN_PG_LSN(result);
53+
PG_RETURN_LSN(result);
5454
}
5555

5656
Datum
5757
pg_lsn_out(PG_FUNCTION_ARGS)
5858
{
59-
XLogRecPtr lsn = (XLogRecPtr) PG_GETARG_PG_LSN(0);
59+
XLogRecPtr lsn = (XLogRecPtr) PG_GETARG_LSN(0);
6060
char buf[MAXPG_LSNLEN + 1];
6161
char *result;
6262
uint32 id, off;
@@ -77,13 +77,13 @@ pg_lsn_recv(PG_FUNCTION_ARGS)
7777
XLogRecPtr result;
7878

7979
result = pq_getmsgint64(buf);
80-
PG_RETURN_PG_LSN(result);
80+
PG_RETURN_LSN(result);
8181
}
8282

8383
Datum
8484
pg_lsn_send(PG_FUNCTION_ARGS)
8585
{
86-
XLogRecPtr lsn = (XLogRecPtr) PG_GETARG_PG_LSN(0);
86+
XLogRecPtr lsn = (XLogRecPtr) PG_GETARG_LSN(0);
8787
StringInfoData buf;
8888

8989
pq_begintypsend(&buf);
@@ -99,53 +99,53 @@ pg_lsn_send(PG_FUNCTION_ARGS)
9999
Datum
100100
pg_lsn_eq(PG_FUNCTION_ARGS)
101101
{
102-
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_PG_LSN(0);
103-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_PG_LSN(1);
102+
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_LSN(0);
103+
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
104104

105105
PG_RETURN_BOOL(lsn1 == lsn2);
106106
}
107107

108108
Datum
109109
pg_lsn_ne(PG_FUNCTION_ARGS)
110110
{
111-
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_PG_LSN(0);
112-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_PG_LSN(1);
111+
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_LSN(0);
112+
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
113113

114114
PG_RETURN_BOOL(lsn1 != lsn2);
115115
}
116116

117117
Datum
118118
pg_lsn_lt(PG_FUNCTION_ARGS)
119119
{
120-
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_PG_LSN(0);
121-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_PG_LSN(1);
120+
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_LSN(0);
121+
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
122122

123123
PG_RETURN_BOOL(lsn1 < lsn2);
124124
}
125125

126126
Datum
127127
pg_lsn_gt(PG_FUNCTION_ARGS)
128128
{
129-
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_PG_LSN(0);
130-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_PG_LSN(1);
129+
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_LSN(0);
130+
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
131131

132132
PG_RETURN_BOOL(lsn1 > lsn2);
133133
}
134134

135135
Datum
136136
pg_lsn_le(PG_FUNCTION_ARGS)
137137
{
138-
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_PG_LSN(0);
139-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_PG_LSN(1);
138+
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_LSN(0);
139+
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
140140

141141
PG_RETURN_BOOL(lsn1 <= lsn2);
142142
}
143143

144144
Datum
145145
pg_lsn_ge(PG_FUNCTION_ARGS)
146146
{
147-
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_PG_LSN(0);
148-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_PG_LSN(1);
147+
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_LSN(0);
148+
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
149149

150150
PG_RETURN_BOOL(lsn1 >= lsn2);
151151
}
@@ -158,19 +158,18 @@ pg_lsn_ge(PG_FUNCTION_ARGS)
158158
Datum
159159
pg_lsn_mi(PG_FUNCTION_ARGS)
160160
{
161-
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_PG_LSN(0);
162-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_PG_LSN(1);
161+
XLogRecPtr lsn1 = (XLogRecPtr) PG_GETARG_LSN(0);
162+
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
163163
char buf[256];
164164
Datum result;
165165

166-
/* Negative results are not allowed. */
166+
/* Output could be as large as plus or minus 2^63 - 1. */
167167
if (lsn1 < lsn2)
168-
ereport(ERROR,
169-
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
170-
errmsg("transaction log location out of range")));
168+
snprintf(buf, sizeof buf, "-" UINT64_FORMAT, lsn2 - lsn1);
169+
else
170+
snprintf(buf, sizeof buf, UINT64_FORMAT, lsn1 - lsn2);
171171

172172
/* Convert to numeric. */
173-
snprintf(buf, sizeof buf, UINT64_FORMAT, lsn1 - lsn2);
174173
result = DirectFunctionCall3(numeric_in,
175174
CStringGetDatum(buf),
176175
ObjectIdGetDatum(0),

src/include/fmgr.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ extern struct varlena *pg_detoast_datum_packed(struct varlena * datum);
230230
#define PG_GETARG_CHAR(n) DatumGetChar(PG_GETARG_DATUM(n))
231231
#define PG_GETARG_BOOL(n) DatumGetBool(PG_GETARG_DATUM(n))
232232
#define PG_GETARG_OID(n) DatumGetObjectId(PG_GETARG_DATUM(n))
233-
#define PG_GETARG_PG_LSN(n) DatumGetPgLsn(PG_GETARG_DATUM(n))
233+
#define PG_GETARG_LSN(n) DatumGetLSN(PG_GETARG_DATUM(n))
234234
#define PG_GETARG_POINTER(n) DatumGetPointer(PG_GETARG_DATUM(n))
235235
#define PG_GETARG_CSTRING(n) DatumGetCString(PG_GETARG_DATUM(n))
236236
#define PG_GETARG_NAME(n) DatumGetName(PG_GETARG_DATUM(n))
@@ -303,7 +303,7 @@ extern struct varlena *pg_detoast_datum_packed(struct varlena * datum);
303303
#define PG_RETURN_CHAR(x) return CharGetDatum(x)
304304
#define PG_RETURN_BOOL(x) return BoolGetDatum(x)
305305
#define PG_RETURN_OID(x) return ObjectIdGetDatum(x)
306-
#define PG_RETURN_PG_LSN(x) return PgLsnGetDatum(x)
306+
#define PG_RETURN_LSN(x) return LSNGetDatum(x)
307307
#define PG_RETURN_POINTER(x) return PointerGetDatum(x)
308308
#define PG_RETURN_CSTRING(x) return CStringGetDatum(x)
309309
#define PG_RETURN_NAME(x) return NameGetDatum(x)

src/include/postgres.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -484,18 +484,18 @@ typedef Datum *DatumPtr;
484484
#define ObjectIdGetDatum(X) ((Datum) SET_4_BYTES(X))
485485

486486
/*
487-
* DatumGetPgLsn
487+
* DatumGetLSN
488488
* Returns PostgreSQL log sequence number of a datum.
489489
*/
490490

491-
#define DatumGetPgLsn(X) ((XLogRecPtr) GET_8_BYTES(X))
491+
#define DatumGetLSN(X) ((XLogRecPtr) GET_8_BYTES(X))
492492

493493
/*
494-
* PG_LSNGetDatum
494+
* LSNGetDatum
495495
* Returns datum representation for a PostgreSQL log sequence number.
496496
*/
497497

498-
#define PgLsnGetDatum(X) ((Datum) SET_8_BYTES(X))
498+
#define LSNGetDatum(X) ((Datum) SET_8_BYTES(X))
499499

500500
/*
501501
* DatumGetTransactionId

src/test/regress/expected/pg_lsn.out

+5-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ SELECT '0/16AE7F8' > pg_lsn '0/16AE7F7';
5353
(1 row)
5454

5555
SELECT '0/16AE7F7'::pg_lsn - '0/16AE7F8'::pg_lsn; -- No negative results
56-
ERROR: transaction log location out of range
56+
?column?
57+
----------
58+
-1
59+
(1 row)
60+
5761
SELECT '0/16AE7F8'::pg_lsn - '0/16AE7F7'::pg_lsn; -- correct
5862
?column?
5963
----------

0 commit comments

Comments
 (0)