Add min and max aggregates for inet/cidr data types.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 29 Aug 2014 02:37:58 +0000 (22:37 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 29 Aug 2014 02:37:58 +0000 (22:37 -0400)
Haribabu Kommi, reviewed by Muhammad Asif Naeem

doc/src/sgml/func.sgml
src/backend/utils/adt/network.c
src/include/catalog/catversion.h
src/include/catalog/pg_aggregate.h
src/include/catalog/pg_proc.h
src/include/utils/builtins.h
src/test/regress/expected/inet.out
src/test/regress/sql/inet.sql

index c715ca25508b9ec06998784a274eca225144dd5c..56b01dc620b6e39ecfb729c123c1d611082d732d 100644 (file)
@@ -12192,7 +12192,8 @@ NULL baz</literallayout>(3 rows)</entry>
        </indexterm>
        <function>max(<replaceable class="parameter">expression</replaceable>)</function>
       </entry>
-      <entry>any array, numeric, string, or date/time type</entry>
+      <entry>any numeric, string, date/time, network, or enum type,
+             or arrays of these types</entry>
       <entry>same as argument type</entry>
       <entry>
        maximum value of <replaceable
@@ -12208,7 +12209,8 @@ NULL baz</literallayout>(3 rows)</entry>
        </indexterm>
        <function>min(<replaceable class="parameter">expression</replaceable>)</function>
       </entry>
-      <entry>any array, numeric, string, or date/time type</entry>
+      <entry>any numeric, string, date/time, network, or enum type,
+             or arrays of these types</entry>
       <entry>same as argument type</entry>
       <entry>
        minimum value of <replaceable
index 69c7ac182f0a66a7b2a9af57d14ab5c91aac23a9..3a705da6197b1ff30f2863b9ea6f51fac3494b10 100644 (file)
@@ -471,6 +471,33 @@ network_ne(PG_FUNCTION_ARGS)
        PG_RETURN_BOOL(network_cmp_internal(a1, a2) != 0);
 }
 
+/*
+ * MIN/MAX support functions.
+ */
+Datum
+network_smaller(PG_FUNCTION_ARGS)
+{
+       inet       *a1 = PG_GETARG_INET_PP(0);
+       inet       *a2 = PG_GETARG_INET_PP(1);
+
+       if (network_cmp_internal(a1, a2) < 0)
+               PG_RETURN_INET_P(a1);
+       else
+               PG_RETURN_INET_P(a2);
+}
+
+Datum
+network_larger(PG_FUNCTION_ARGS)
+{
+       inet       *a1 = PG_GETARG_INET_PP(0);
+       inet       *a2 = PG_GETARG_INET_PP(1);
+
+       if (network_cmp_internal(a1, a2) > 0)
+               PG_RETURN_INET_P(a1);
+       else
+               PG_RETURN_INET_P(a2);
+}
+
 /*
  * Support function for hash indexes on inet/cidr.
  */
index 3a7a553980e0fc48ddac5dbf6f3fe8f5de432d9d..e1b62a505cab89f60b2255e3222f6a83caf0437a 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     201408162
+#define CATALOG_VERSION_NO     201408281
 
 #endif
index e69c0a210dae4c97176ec4d680f02d2a8a31ccd3..3ba9e5e1b268518695b30672a181a8d3a9dfc8ff 100644 (file)
@@ -164,6 +164,7 @@ DATA(insert ( 2050  n 0 array_larger        -                               -                               -                               -                               f f 1073        2277    0       0               0       _nu
 DATA(insert ( 2244     n 0 bpchar_larger       -                               -                               -                               -                               f f 1060        1042    0       0               0       _null_ _null_ ));
 DATA(insert ( 2797     n 0 tidlarger           -                               -                               -                               -                               f f 2800        27              0       0               0       _null_ _null_ ));
 DATA(insert ( 3526     n 0 enum_larger         -                               -                               -                               -                               f f 3519        3500    0       0               0       _null_ _null_ ));
+DATA(insert ( 3564     n 0 network_larger      -                               -                               -                               -                               f f 1205        869             0       0               0       _null_ _null_ ));
 
 /* min */
 DATA(insert ( 2131     n 0 int8smaller         -                               -                               -                               -                               f f 412         20              0       0               0       _null_ _null_ ));
@@ -186,6 +187,7 @@ DATA(insert ( 2051  n 0 array_smaller       -                               -                               -                               -                               f f 1072        2277    0       0               0       _n
 DATA(insert ( 2245     n 0 bpchar_smaller      -                               -                               -                               -                               f f 1058        1042    0       0               0       _null_ _null_ ));
 DATA(insert ( 2798     n 0 tidsmaller          -                               -                               -                               -                               f f 2799        27              0       0               0       _null_ _null_ ));
 DATA(insert ( 3527     n 0 enum_smaller        -                               -                               -                               -                               f f 3518        3500    0       0               0       _null_ _null_ ));
+DATA(insert ( 3565     n 0 network_smaller -                           -                               -                               -                               f f 1203        869             0       0               0       _null_ _null_ ));
 
 /* count */
 DATA(insert ( 2147     n 0 int8inc_any         -                               int8inc_any             int8dec_any             -                               f f 0           20              0       20              0       "0" "0" ));
index a84595eb2c200a09ac6b45835c68cd7cd0e8e794..5176ed04dd815e0a6c5b18e9e4d459b913d6800e 100644 (file)
@@ -2122,6 +2122,10 @@ DATA(insert OID = 922 (  network_le                      PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 1
 DATA(insert OID = 923 (  network_gt                    PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_       network_gt _null_ _null_ _null_ ));
 DATA(insert OID = 924 (  network_ge                    PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_       network_ge _null_ _null_ _null_ ));
 DATA(insert OID = 925 (  network_ne                    PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_       network_ne _null_ _null_ _null_ ));
+DATA(insert OID = 3562 (  network_larger       PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 869 "869 869" _null_ _null_ _null_ _null_      network_larger _null_ _null_ _null_ ));
+DESCR("larger of two");
+DATA(insert OID = 3563 (  network_smaller      PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 869 "869 869" _null_ _null_ _null_ _null_      network_smaller _null_ _null_ _null_ ));
+DESCR("smaller of two");
 DATA(insert OID = 926 (  network_cmp           PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "869 869" _null_ _null_ _null_ _null_       network_cmp _null_ _null_ _null_ ));
 DESCR("less-equal-greater");
 DATA(insert OID = 927 (  network_sub           PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_       network_sub _null_ _null_ _null_ ));
@@ -3163,6 +3167,8 @@ DATA(insert OID = 2244 (  max                             PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1042 "
 DESCR("maximum value of all bpchar input values");
 DATA(insert OID = 2797 (  max                          PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 27 "27" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
 DESCR("maximum value of all tid input values");
+DATA(insert OID = 3564 (  max                          PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 869 "869" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("maximum value of all inet input values");
 
 DATA(insert OID = 2131 (  min                          PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "20" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
 DESCR("minimum value of all bigint input values");
@@ -3202,6 +3208,8 @@ DATA(insert OID = 2245 (  min                             PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1042 "
 DESCR("minimum value of all bpchar input values");
 DATA(insert OID = 2798 (  min                          PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 27 "27" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
 DESCR("minimum value of all tid input values");
+DATA(insert OID = 3565 (  min                          PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 869 "869" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));
+DESCR("minimum value of all inet input values");
 
 /* count has two forms: count(any) and count(*) */
 DATA(insert OID = 2147 (  count                                PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "2276" _null_ _null_ _null_ _null_  aggregate_dummy _null_ _null_ _null_ ));
index b0a4748daba482eab9dc38e1afdf7b30bc86bf9a..78cc0a0bea38160c1c626ae638acf7cc750926a8 100644 (file)
@@ -908,6 +908,8 @@ extern Datum network_eq(PG_FUNCTION_ARGS);
 extern Datum network_ge(PG_FUNCTION_ARGS);
 extern Datum network_gt(PG_FUNCTION_ARGS);
 extern Datum network_ne(PG_FUNCTION_ARGS);
+extern Datum network_smaller(PG_FUNCTION_ARGS);
+extern Datum network_larger(PG_FUNCTION_ARGS);
 extern Datum hashinet(PG_FUNCTION_ARGS);
 extern Datum network_sub(PG_FUNCTION_ARGS);
 extern Datum network_subeq(PG_FUNCTION_ARGS);
index 008cc0b5ddf05ec8361f88c53c564587cd0566ea..d58bf017b693170ac7dfd0dfe704f22b304db86e 100644 (file)
@@ -204,6 +204,18 @@ SELECT '' AS ten, i, c,
      | ::4.3.2.1/24     | ::ffff:1.2.3.4/128 | t  | t  | f  | f  | f  | t  | f  | f   | t   | t   | t
 (17 rows)
 
+SELECT max(i) AS max, min(i) AS min FROM INET_TBL;
+     max     |    min    
+-------------+-----------
+ 10:23::ffff | 9.1.2.3/8
+(1 row)
+
+SELECT max(c) AS max, min(c) AS min FROM INET_TBL;
+       max       |    min     
+-----------------+------------
+ 10:23::8000/113 | 10.0.0.0/8
+(1 row)
+
 -- check the conversion to/from text and set_netmask
 SELECT '' AS ten, set_masklen(inet(text(i)), 24) FROM INET_TBL;
  ten |   set_masklen    
index be078fbb8471f958ae800966bdeb8a960d85e377..c9792b71201f3991b71d03a957f707dc4e069715 100644 (file)
@@ -56,6 +56,9 @@ SELECT '' AS ten, i, c,
   i && c AS ovr
   FROM INET_TBL;
 
+SELECT max(i) AS max, min(i) AS min FROM INET_TBL;
+SELECT max(c) AS max, min(c) AS min FROM INET_TBL;
+
 -- check the conversion to/from text and set_netmask
 SELECT '' AS ten, set_masklen(inet(text(i)), 24) FROM INET_TBL;