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

Lines changed: 22 additions & 23 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 4 additions & 4 deletions
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

Lines changed: 5 additions & 1 deletion
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy