Add scale(numeric)

Author: Marko Tiikkaja
pull/8/head
Alvaro Herrera 10 years ago
parent 419400c5da
commit abb1733922
  1. 13
      doc/src/sgml/func.sgml
  2. 17
      src/backend/utils/adt/numeric.c
  3. 2
      src/include/catalog/catversion.h
  4. 2
      src/include/catalog/pg_proc.h
  5. 1
      src/include/utils/builtins.h
  6. 57
      src/test/regress/expected/numeric.out
  7. 14
      src/test/regress/sql/numeric.sql

@ -849,6 +849,19 @@
<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>

@ -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));
}
/* ----------------------------------------------------------------------
*

@ -53,6 +53,6 @@
*/
/* yyyymmddN */
#define CATALOG_VERSION_NO 201601051
#define CATALOG_VERSION_NO 201601052
#endif

@ -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_ ));

@ -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);

@ -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)

@ -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);

Loading…
Cancel
Save