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;