Skip to content

Commit 694e3d1

Browse files
committed
Further code review for pg_lsn data type.
Change input function error messages to be more consistent with what is done elsewhere. Remove a bunch of redundant type casts, so that the compiler will warn us if we screw up. Don't pass LSNs by value on platforms where a Datum is only 32 bytes, per buildfarm. Move macros for packing and unpacking LSNs to pg_lsn.h so that we can include access/xlogdefs.h, to avoid an unsatisfied dependency on XLogRecPtr.
1 parent 844a28a commit 694e3d1

File tree

6 files changed

+32
-41
lines changed

6 files changed

+32
-41
lines changed

src/backend/utils/adt/pg_lsn.c

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,25 +38,25 @@ pg_lsn_in(PG_FUNCTION_ARGS)
3838
if (len1 < 1 || len1 > MAXPG_LSNCOMPONENT || str[len1] != '/')
3939
ereport(ERROR,
4040
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
41-
errmsg("invalid input syntax for transaction log location: \"%s\"", str)));
41+
errmsg("invalid input syntax for type pg_lsn: \"%s\"", str)));
4242
len2 = strspn(str + len1 + 1, "0123456789abcdefABCDEF");
4343
if (len2 < 1 || len2 > MAXPG_LSNCOMPONENT || str[len1 + 1 + len2] != '\0')
4444
ereport(ERROR,
4545
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
46-
errmsg("invalid input syntax for transaction log location: \"%s\"", str)));
46+
errmsg("invalid input syntax for type pg_lsn: \"%s\"", str)));
4747

4848
/* Decode result. */
4949
id = (uint32) strtoul(str, NULL, 16);
5050
off = (uint32) strtoul(str + len1 + 1, NULL, 16);
51-
result = (XLogRecPtr) ((uint64) id << 32) | off;
51+
result = ((uint64) id << 32) | off;
5252

5353
PG_RETURN_LSN(result);
5454
}
5555

5656
Datum
5757
pg_lsn_out(PG_FUNCTION_ARGS)
5858
{
59-
XLogRecPtr lsn = (XLogRecPtr) PG_GETARG_LSN(0);
59+
XLogRecPtr lsn = PG_GETARG_LSN(0);
6060
char buf[MAXPG_LSNLEN + 1];
6161
char *result;
6262
uint32 id, off;
@@ -83,7 +83,7 @@ pg_lsn_recv(PG_FUNCTION_ARGS)
8383
Datum
8484
pg_lsn_send(PG_FUNCTION_ARGS)
8585
{
86-
XLogRecPtr lsn = (XLogRecPtr) PG_GETARG_LSN(0);
86+
XLogRecPtr lsn = 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_LSN(0);
103-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
102+
XLogRecPtr lsn1 = PG_GETARG_LSN(0);
103+
XLogRecPtr lsn2 = 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_LSN(0);
112-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
111+
XLogRecPtr lsn1 = PG_GETARG_LSN(0);
112+
XLogRecPtr lsn2 = 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_LSN(0);
121-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
120+
XLogRecPtr lsn1 = PG_GETARG_LSN(0);
121+
XLogRecPtr lsn2 = 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_LSN(0);
130-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
129+
XLogRecPtr lsn1 = PG_GETARG_LSN(0);
130+
XLogRecPtr lsn2 = 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_LSN(0);
139-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
138+
XLogRecPtr lsn1 = PG_GETARG_LSN(0);
139+
XLogRecPtr lsn2 = 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_LSN(0);
148-
XLogRecPtr lsn2 = (XLogRecPtr) PG_GETARG_LSN(1);
147+
XLogRecPtr lsn1 = PG_GETARG_LSN(0);
148+
XLogRecPtr lsn2 = PG_GETARG_LSN(1);
149149

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

src/include/catalog/pg_type.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ DESCR("UUID datatype");
578578
DATA(insert OID = 2951 ( _uuid PGNSP PGUID -1 f b A f t \054 0 2950 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
579579

580580
/* pg_lsn */
581-
DATA(insert OID = 3220 ( pg_lsn PGNSP PGUID 8 t b U t t \054 0 0 3221 pg_lsn_in pg_lsn_out pg_lsn_recv pg_lsn_send - - - d p f 0 -1 0 0 _null_ _null_ _null_ ));
581+
DATA(insert OID = 3220 ( pg_lsn PGNSP PGUID 8 FLOAT8PASSBYVAL b U t t \054 0 0 3221 pg_lsn_in pg_lsn_out pg_lsn_recv pg_lsn_send - - - d p f 0 -1 0 0 _null_ _null_ _null_ ));
582582
DESCR("PostgreSQL LSN datatype");
583583
DATA(insert OID = 3221 ( _pg_lsn PGNSP PGUID -1 f b A f t \054 0 3220 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));
584584

src/include/fmgr.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,6 @@ 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_LSN(n) DatumGetLSN(PG_GETARG_DATUM(n))
234233
#define PG_GETARG_POINTER(n) DatumGetPointer(PG_GETARG_DATUM(n))
235234
#define PG_GETARG_CSTRING(n) DatumGetCString(PG_GETARG_DATUM(n))
236235
#define PG_GETARG_NAME(n) DatumGetName(PG_GETARG_DATUM(n))
@@ -303,7 +302,6 @@ extern struct varlena *pg_detoast_datum_packed(struct varlena * datum);
303302
#define PG_RETURN_CHAR(x) return CharGetDatum(x)
304303
#define PG_RETURN_BOOL(x) return BoolGetDatum(x)
305304
#define PG_RETURN_OID(x) return ObjectIdGetDatum(x)
306-
#define PG_RETURN_LSN(x) return LSNGetDatum(x)
307305
#define PG_RETURN_POINTER(x) return PointerGetDatum(x)
308306
#define PG_RETURN_CSTRING(x) return CStringGetDatum(x)
309307
#define PG_RETURN_NAME(x) return NameGetDatum(x)

src/include/postgres.h

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -483,20 +483,6 @@ typedef Datum *DatumPtr;
483483

484484
#define ObjectIdGetDatum(X) ((Datum) SET_4_BYTES(X))
485485

486-
/*
487-
* DatumGetLSN
488-
* Returns PostgreSQL log sequence number of a datum.
489-
*/
490-
491-
#define DatumGetLSN(X) ((XLogRecPtr) GET_8_BYTES(X))
492-
493-
/*
494-
* LSNGetDatum
495-
* Returns datum representation for a PostgreSQL log sequence number.
496-
*/
497-
498-
#define LSNGetDatum(X) ((Datum) SET_8_BYTES(X))
499-
500486
/*
501487
* DatumGetTransactionId
502488
* Returns transaction identifier value of a datum.

src/include/utils/pg_lsn.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#define PG_LSN_H
1717

1818
#include "fmgr.h"
19+
#include "access/xlogdefs.h"
1920

2021
extern Datum pg_lsn_in(PG_FUNCTION_ARGS);
2122
extern Datum pg_lsn_out(PG_FUNCTION_ARGS);
@@ -31,4 +32,10 @@ extern Datum pg_lsn_ge(PG_FUNCTION_ARGS);
3132

3233
extern Datum pg_lsn_mi(PG_FUNCTION_ARGS);
3334

35+
#define DatumGetLSN(X) ((XLogRecPtr) DatumGetInt64(X))
36+
#define LSNGetDatum(X) (Int64GetDatum((int64) (X)))
37+
38+
#define PG_GETARG_LSN(n) DatumGetLSN(PG_GETARG_DATUM(n))
39+
#define PG_RETURN_LSN(x) return LSNGetDatum(x)
40+
3441
#endif /* PG_LSN_H */

src/test/regress/expected/pg_lsn.out

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@ INSERT INTO PG_LSN_TBL VALUES ('0/0');
77
INSERT INTO PG_LSN_TBL VALUES ('FFFFFFFF/FFFFFFFF');
88
-- Incorrect input
99
INSERT INTO PG_LSN_TBL VALUES ('G/0');
10-
ERROR: invalid input syntax for transaction log location: "G/0"
10+
ERROR: invalid input syntax for type pg_lsn: "G/0"
1111
LINE 1: INSERT INTO PG_LSN_TBL VALUES ('G/0');
1212
^
1313
INSERT INTO PG_LSN_TBL VALUES ('-1/0');
14-
ERROR: invalid input syntax for transaction log location: "-1/0"
14+
ERROR: invalid input syntax for type pg_lsn: "-1/0"
1515
LINE 1: INSERT INTO PG_LSN_TBL VALUES ('-1/0');
1616
^
1717
INSERT INTO PG_LSN_TBL VALUES (' 0/12345678');
18-
ERROR: invalid input syntax for transaction log location: " 0/12345678"
18+
ERROR: invalid input syntax for type pg_lsn: " 0/12345678"
1919
LINE 1: INSERT INTO PG_LSN_TBL VALUES (' 0/12345678');
2020
^
2121
INSERT INTO PG_LSN_TBL VALUES ('ABCD/');
22-
ERROR: invalid input syntax for transaction log location: "ABCD/"
22+
ERROR: invalid input syntax for type pg_lsn: "ABCD/"
2323
LINE 1: INSERT INTO PG_LSN_TBL VALUES ('ABCD/');
2424
^
2525
INSERT INTO PG_LSN_TBL VALUES ('/ABCD');
26-
ERROR: invalid input syntax for transaction log location: "/ABCD"
26+
ERROR: invalid input syntax for type pg_lsn: "/ABCD"
2727
LINE 1: INSERT INTO PG_LSN_TBL VALUES ('/ABCD');
2828
^
2929
DROP TABLE PG_LSN_TBL;

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