On Tue, May 6, 2014 at 4:14 PM, Andres Freund <and...@2ndquadrant.com> wrote: > Hi, > > Craig just mentioned in an internal chat that there's no btree or even > hash opclass for the new pg_lsn type. That restricts what you can do > with it quite severely. > Imo this should be fixed for 9.4 - after all it was possible unto now to > index a table with lsns returned by system functions or have queries > with grouping on them without casting. Makes sense, especially knowing operators needed for btree processing are already defined. Patch attached solves that. Now to include it in 9.4 where development is over is another story... I wouldn't mind adding it to the next commit fest either. Regards, -- Michael
commit 604177ac2af4bfd26a392b8669dd2fc3550f2a3d Author: Michael Paquier <mich...@otacoo.com> Date: Tue May 6 22:42:09 2014 +0900
Support for hash and btree operators for pg_lsn datatype The following functions are added in pg_lsn bundle for the different index operators: - pg_lsn_hash for hash index - pg_lsn_cmp for btree index Related catalogs are updated as well. diff --git a/src/backend/utils/adt/pg_lsn.c b/src/backend/utils/adt/pg_lsn.c index e2b528a..f7980f8 100644 --- a/src/backend/utils/adt/pg_lsn.c +++ b/src/backend/utils/adt/pg_lsn.c @@ -150,6 +150,24 @@ pg_lsn_ge(PG_FUNCTION_ARGS) PG_RETURN_BOOL(lsn1 >= lsn2); } +/* handler for btree index operator */ +Datum +pg_lsn_cmp(PG_FUNCTION_ARGS) +{ + XLogRecPtr lsn1 = PG_GETARG_LSN(0); + XLogRecPtr lsn2 = PG_GETARG_LSN(1); + + PG_RETURN_INT32(lsn1 == lsn2); +} + +/* hash index support */ +Datum +pg_lsn_hash(PG_FUNCTION_ARGS) +{ + XLogRecPtr lsn = PG_GETARG_LSN(0); + + return hashint8(lsn); +} /*---------------------------------------------------------- * Arithmetic operators on PostgreSQL LSNs. diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h index 8efd3be..5cd170d 100644 --- a/src/include/catalog/pg_amop.h +++ b/src/include/catalog/pg_amop.h @@ -513,6 +513,16 @@ DATA(insert ( 2968 2950 2950 4 s 2977 403 0 )); DATA(insert ( 2968 2950 2950 5 s 2975 403 0 )); /* + * btree pglsn_ops + */ + +DATA(insert ( 3260 3220 3220 1 s 3224 403 0 )); +DATA(insert ( 3260 3220 3220 2 s 3226 403 0 )); +DATA(insert ( 3260 3220 3220 3 s 3222 403 0 )); +DATA(insert ( 3260 3220 3220 4 s 3227 403 0 )); +DATA(insert ( 3260 3220 3220 5 s 3225 403 0 )); + +/* * hash index _ops */ @@ -581,6 +591,8 @@ DATA(insert ( 2231 1042 1042 1 s 1054 405 0 )); DATA(insert ( 2235 1033 1033 1 s 974 405 0 )); /* uuid_ops */ DATA(insert ( 2969 2950 2950 1 s 2972 405 0 )); +/* pglsn_ops */ +DATA(insert ( 3261 3220 3220 1 s 3222 405 0 )); /* numeric_ops */ DATA(insert ( 1998 1700 1700 1 s 1752 405 0 )); /* array_ops */ diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h index 198b126..369adb9 100644 --- a/src/include/catalog/pg_amproc.h +++ b/src/include/catalog/pg_amproc.h @@ -134,6 +134,7 @@ DATA(insert ( 2789 27 27 1 2794 )); DATA(insert ( 2968 2950 2950 1 2960 )); DATA(insert ( 2994 2249 2249 1 2987 )); DATA(insert ( 3194 2249 2249 1 3187 )); +DATA(insert ( 3260 3220 3220 1 3263 )); DATA(insert ( 3522 3500 3500 1 3514 )); DATA(insert ( 3626 3614 3614 1 3622 )); DATA(insert ( 3683 3615 3615 1 3668 )); @@ -174,6 +175,7 @@ DATA(insert ( 2229 25 25 1 400 )); DATA(insert ( 2231 1042 1042 1 1080 )); DATA(insert ( 2235 1033 1033 1 329 )); DATA(insert ( 2969 2950 2950 1 2963 )); +DATA(insert ( 3261 3220 3220 1 3262 )); DATA(insert ( 3523 3500 3500 1 3515 )); DATA(insert ( 3903 3831 3831 1 3902 )); DATA(insert ( 4034 3802 3802 1 4045 )); diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h index 49b2410..cbcdacd 100644 --- a/src/include/catalog/pg_opclass.h +++ b/src/include/catalog/pg_opclass.h @@ -215,6 +215,8 @@ DATA(insert ( 2742 _reltime_ops PGNSP PGUID 2745 1024 t 703 )); DATA(insert ( 2742 _tinterval_ops PGNSP PGUID 2745 1025 t 704 )); DATA(insert ( 403 uuid_ops PGNSP PGUID 2968 2950 t 0 )); DATA(insert ( 405 uuid_ops PGNSP PGUID 2969 2950 t 0 )); +DATA(insert ( 403 pglsn_ops PGNSP PGUID 3260 3220 t 0 )); +DATA(insert ( 405 pglsn_ops PGNSP PGUID 3261 3220 t 0 )); DATA(insert ( 403 enum_ops PGNSP PGUID 3522 3500 t 0 )); DATA(insert ( 405 enum_ops PGNSP PGUID 3523 3500 t 0 )); DATA(insert ( 403 tsvector_ops PGNSP PGUID 3626 3614 t 0 )); diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h index f280af4..87ee4eb 100644 --- a/src/include/catalog/pg_operator.h +++ b/src/include/catalog/pg_operator.h @@ -1595,7 +1595,7 @@ DATA(insert OID = 2977 ( ">=" PGNSP PGUID b f f 2950 2950 16 2976 2974 uuid_ DESCR("greater than or equal"); /* pg_lsn operators */ -DATA(insert OID = 3222 ( "=" PGNSP PGUID b f f 3220 3220 16 3222 3223 pg_lsn_eq eqsel eqjoinsel )); +DATA(insert OID = 3222 ( "=" PGNSP PGUID b t t 3220 3220 16 3222 3223 pg_lsn_eq eqsel eqjoinsel )); DESCR("equal"); DATA(insert OID = 3223 ( "<>" PGNSP PGUID b f f 3220 3220 16 3223 3222 pg_lsn_ne neqsel neqjoinsel )); DESCR("not equal"); diff --git a/src/include/catalog/pg_opfamily.h b/src/include/catalog/pg_opfamily.h index 9e8f4ac..29089d5 100644 --- a/src/include/catalog/pg_opfamily.h +++ b/src/include/catalog/pg_opfamily.h @@ -134,6 +134,8 @@ DATA(insert OID = 1029 ( 783 point_ops PGNSP PGUID )); DATA(insert OID = 2745 ( 2742 array_ops PGNSP PGUID )); DATA(insert OID = 2968 ( 403 uuid_ops PGNSP PGUID )); DATA(insert OID = 2969 ( 405 uuid_ops PGNSP PGUID )); +DATA(insert OID = 3260 ( 403 pglsn_ops PGNSP PGUID )); +DATA(insert OID = 3261 ( 405 pglsn_ops PGNSP PGUID )); DATA(insert OID = 3522 ( 403 enum_ops PGNSP PGUID )); DATA(insert OID = 3523 ( 405 enum_ops PGNSP PGUID )); DATA(insert OID = 3626 ( 403 tsvector_ops PGNSP PGUID )); diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 98c183b..f82463b 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -4293,6 +4293,10 @@ DATA(insert OID = 3238 ( pg_lsn_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3 DESCR("I/O"); DATA(insert OID = 3239 ( pg_lsn_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "3220" _null_ _null_ _null_ _null_ pg_lsn_send _null_ _null_ _null_ )); DESCR("I/O"); +DATA(insert OID = 3262 ( pg_lsn_hash PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "3220" _null_ _null_ _null_ _null_ pg_lsn_hash _null_ _null_ _null_ )); +DESCR("hash"); +DATA(insert OID = 3263 ( pg_lsn_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "3220 3220" _null_ _null_ _null_ _null_ pg_lsn_cmp _null_ _null_ _null_ )); +DESCR("less-equal-greater"); /* enum related procs */ DATA(insert OID = 3504 ( anyenum_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3500 "2275" _null_ _null_ _null_ _null_ anyenum_in _null_ _null_ _null_ )); diff --git a/src/include/utils/pg_lsn.h b/src/include/utils/pg_lsn.h index 981fcd6..7dd932d 100644 --- a/src/include/utils/pg_lsn.h +++ b/src/include/utils/pg_lsn.h @@ -29,6 +29,8 @@ extern Datum pg_lsn_lt(PG_FUNCTION_ARGS); extern Datum pg_lsn_gt(PG_FUNCTION_ARGS); extern Datum pg_lsn_le(PG_FUNCTION_ARGS); extern Datum pg_lsn_ge(PG_FUNCTION_ARGS); +extern Datum pg_lsn_cmp(PG_FUNCTION_ARGS); +extern Datum pg_lsn_hash(PG_FUNCTION_ARGS); extern Datum pg_lsn_mi(PG_FUNCTION_ARGS);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers