]> granicus.if.org Git - postgresql/commitdiff
Add scale(numeric)
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 5 Jan 2016 22:02:13 +0000 (19:02 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 5 Jan 2016 22:02:13 +0000 (19:02 -0300)
Author: Marko Tiikkaja

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

index a0b42c2ddbd73e8a945a7c75a1d417eb1cb960b3..8591aa3e5a5b0a604f87eb59a6d57190516fa7fb 100644 (file)
        <entry><literal>42.44</literal></entry>
       </row>
 
+      <row>
+       <entry>
+        <indexterm>
+         <primary>scale</primary>
+        </indexterm>
+        <literal><function>scale(<type>numeric</type>)</function></literal>
+       </entry>
+       <entry><type>numeric</type></entry>
+       <entry>scale of the argument (the number of decimal digits in the fractional part)</entry>
+       <entry><literal>scale(8.41)</literal></entry>
+       <entry><literal>2</literal></entry>
+      </row>
+
       <row>
        <entry>
         <indexterm>
index ea79b48a8f6e149c4078d024171437444601f551..07b264572d9c92787b4c0e74df9aa8a6826265b3 100644 (file)
@@ -2825,6 +2825,23 @@ numeric_power(PG_FUNCTION_ARGS)
        PG_RETURN_NUMERIC(res);
 }
 
+/*
+ * numeric_scale() -
+ *
+ *     Returns the scale, i.e. the count of decimal digits in the fractional part
+ */
+Datum
+numeric_scale(PG_FUNCTION_ARGS)
+{
+       Numeric         num = PG_GETARG_NUMERIC(0);
+
+       if (NUMERIC_IS_NAN(num))
+               PG_RETURN_NULL();
+
+       PG_RETURN_INT32(NUMERIC_DSCALE(num));
+}
+
+
 
 /* ----------------------------------------------------------------------
  *
index 2c6aa4506371472585093937ce134fb63dba25ec..31a132ea98462a3663704bfd396c2ec64e6334f5 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     201601051
+#define CATALOG_VERSION_NO     201601052
 
 #endif
index 22d9386adac9802b13f84a8814a5c818309eed1a..9250545d3b5af6d05eda5ac30bbf5e03d8d65359 100644 (file)
@@ -2361,6 +2361,8 @@ DESCR("exponentiation");
 DATA(insert OID = 2169 ( power                                 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_  numeric_power _null_ _null_ _null_ ));
 DESCR("exponentiation");
 DATA(insert OID = 1739 ( numeric_power                 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_  numeric_power _null_ _null_ _null_ ));
+DATA(insert OID = 8888 ( scale                                 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "1700" _null_ _null_ _null_ _null_ _null_ numeric_scale _null_ _null_ _null_ ));
+DESCR("number of decimal digits in the fractional part");
 DATA(insert OID = 1740 ( numeric                               PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 1700 "23" _null_ _null_ _null_ _null_ _null_ int4_numeric _null_ _null_ _null_ ));
 DESCR("convert int4 to numeric");
 DATA(insert OID = 1741 ( log                                   PGNSP PGUID 14 1 0 0 0 f f f f t f i s 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.log(10, $1)" _null_ _null_ _null_ ));
index bbaa2cea7e78c94719871f96ba8bf69808ab9cdb..b35d20626b77d3e9c160583a2455898175474114 100644 (file)
@@ -1022,6 +1022,7 @@ extern Datum numeric_exp(PG_FUNCTION_ARGS);
 extern Datum numeric_ln(PG_FUNCTION_ARGS);
 extern Datum numeric_log(PG_FUNCTION_ARGS);
 extern Datum numeric_power(PG_FUNCTION_ARGS);
+extern Datum numeric_scale(PG_FUNCTION_ARGS);
 extern Datum int4_numeric(PG_FUNCTION_ARGS);
 extern Datum numeric_int4(PG_FUNCTION_ARGS);
 extern Datum int8_numeric(PG_FUNCTION_ARGS);
index caac424744f76f8c0046ec2239743688a64d3ce9..f1f50560ee1edd8e40f1b3d0543a5348223f9471 100644 (file)
@@ -1852,3 +1852,60 @@ select log(3.1954752e47, 9.4792021e-73);
  -1.51613372350688302142917386143459361608600157692779164475351842333265418126982165
 (1 row)
 
+--
+-- Tests for scale()
+--
+select scale(numeric 'NaN');
+ scale 
+-------
+      
+(1 row)
+
+select scale(NULL::numeric);
+ scale 
+-------
+      
+(1 row)
+
+select scale(1.12);
+ scale 
+-------
+     2
+(1 row)
+
+select scale(0);
+ scale 
+-------
+     0
+(1 row)
+
+select scale(0.00);
+ scale 
+-------
+     2
+(1 row)
+
+select scale(1.12345);
+ scale 
+-------
+     5
+(1 row)
+
+select scale(110123.12475871856128);
+ scale 
+-------
+    14
+(1 row)
+
+select scale(-1123.12471856128);
+ scale 
+-------
+    11
+(1 row)
+
+select scale(-13.000000000000000);
+ scale 
+-------
+    15
+(1 row)
+
index 0a4d1cb1d2727976fd74b7b07f6f434ef25465c6..fc472187d873d9cbb9fb34e696b12289bb21c9ae 100644 (file)
@@ -983,3 +983,17 @@ select log(1.23e-89, 6.4689e45);
 select log(0.99923, 4.58934e34);
 select log(1.000016, 8.452010e18);
 select log(3.1954752e47, 9.4792021e-73);
+
+--
+-- Tests for scale()
+--
+
+select scale(numeric 'NaN');
+select scale(NULL::numeric);
+select scale(1.12);
+select scale(0);
+select scale(0.00);
+select scale(1.12345);
+select scale(110123.12475871856128);
+select scale(-1123.12471856128);
+select scale(-13.000000000000000);