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

Reply via email to