Обсуждение: numeric cast oddity
When I cast an integer to numeric using :: notation it ignores the scale and precision that I specify, but when I use the cast function it uses the scale and precision that I specify. Sim select version(); "PostgreSQL 8.3.5 on i586-pc-linux-gnu, compiled by GCC i586-pc-linux-gnu-gcc (GCC) 4.1.2 (Gentoo 4.1.2 p1.0.1)" select -1::numeric(20,4) ?column? numeric ------------ -1.0000 select cast(-1 as numeric(20,4)) numeric numeric(20,4) ------------------- -1.0000
2009/12/3 Sim Zacks <sim@compulab.co.il>
When I cast an integer to numeric using :: notation it ignores the scale
and precision that I specify, but when I use the cast function it uses
the scale and precision that I specify.
Sim
select version();
"PostgreSQL 8.3.5 on i586-pc-linux-gnu, compiled by GCC
i586-pc-linux-gnu-gcc (GCC) 4.1.2 (Gentoo 4.1.2 p1.0.1)"
select -1::numeric(20,4)
?column?
numeric
------------
-1.0000
select cast(-1 as numeric(20,4))
numeric
numeric(20,4)
-------------------
-1.0000
That looks right to me. What you've effectively asked for is -0000000000000001. 0000, which resolves to -1.000.
Regards
Thom
Regards
Thom
2009/12/3 Sim Zacks <sim@compulab.co.il>
When I cast an integer to numeric using :: notation it ignores the scale
and precision that I specify, but when I use the cast function it uses
the scale and precision that I specify.
Sim
select version();
"PostgreSQL 8.3.5 on i586-pc-linux-gnu, compiled by GCC
i586-pc-linux-gnu-gcc (GCC) 4.1.2 (Gentoo 4.1.2 p1.0.1)"
select -1::numeric(20,4)
?column?
numeric
------------
-1.0000
select cast(-1 as numeric(20,4))
numeric
numeric(20,4)
-------------------
-1.0000
I've just spotted what you mean. Ignore my previous response.
Thom
Sim Zacks <sim@compulab.co.il> writes:
> When I cast an integer to numeric using :: notation it ignores the scale
> and precision that I specify, but when I use the cast function it uses
> the scale and precision that I specify.
Really? Your example doesn't seem to show that.
regards, tom lane
On Thu, Dec 3, 2009 at 8:03 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote: > Sim Zacks <sim@compulab.co.il> writes: >> When I cast an integer to numeric using :: notation it ignores the scale >> and precision that I specify, but when I use the cast function it uses >> the scale and precision that I specify. > > Really? Your example doesn't seem to show that. I think he's talking about the headers
It is more then just a
headers issue. I have a view that has a column of type numeric(20,4).
I modified the view and
added a union which cast an integer as a numeric(20,4) using the ::
notation.
I received an error
stating that I could not change the column type.
When I used the cast
function notation it allowed it through.
The fact that it
actually converts it to numeric(20,4) doesn't help me if the view
thinks that it is a regular numeric.
Sim
Scott Marlowe wrote:
<blockquote
cite="mid:dcc563d10912030749r2bc35040qd42da5b29c37193f@mail.gmail.com"
type="cite">
On Thu, Dec 3, 2009 at 8:03 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Sim Zacks <sim@compulab.co.il> writes:
When I cast an integer to numeric using :: notation it ignores the scale
and precision that I specify, but when I use the cast function it uses
the scale and precision that I specify.
Really? Your example doesn't seem to show that.
I think he's talking about the headers
Scott Marlowe <scott.marlowe@gmail.com> writes:
> On Thu, Dec 3, 2009 at 8:03 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> Really? �Your example doesn't seem to show that.
> I think he's talking about the headers
The headers I get are
regression=# select -1::numeric(20,4);
?column?
----------
-1.0000
(1 row)
regression=# select cast(-1 as numeric(20,4));
numeric
---------
-1.0000
(1 row)
which are indeed different (might be worth looking into why) but
don't seem to have anything to do with scale/precision.
regards, tom lane
I wrote:
> which are indeed different (might be worth looking into why)
Oh: the reason they're different is that these expressions are not
actually the same thing. Minus binds less tightly than typecast.
You get consistent results if you input equivalent expressions:
regression=# select cast(-1 as numeric(20,4));
numeric
---------
-1.0000
(1 row)
regression=# select (-1)::numeric(20,4);
numeric
---------
-1.0000
(1 row)
regression=# select - cast(1 as numeric(20,4));
?column?
----------
-1.0000
(1 row)
regression=# select - 1::numeric(20,4);
?column?
----------
-1.0000
(1 row)
What we're actually seeing here is that the code to guess a default
column name doesn't descend through a unary minus operator, it just
punts upon finding an Op node.
regards, tom lane
As I mentioned, it is more then just a headers issue it is a type issue. I have a view that has a column of type numeric(20,4) If I replace that column with -1::numeric(20,4) or - (1::numeric(20,4)) the type that goes to the view is numeric without any scale or precision and then I get an error that I cannot change the column type. It seems to be a negative number issue because if I use a positive number or null it gives me the numeric(20,4) it is only for negative that it gives me the numeric without scale or precision. Sim Tom Lane wrote: > I wrote: > >> which are indeed different (might be worth looking into why) >> > > Oh: the reason they're different is that these expressions are not > actually the same thing. Minus binds less tightly than typecast. > You get consistent results if you input equivalent expressions: > > regression=# select cast(-1 as numeric(20,4)); > numeric > --------- > -1.0000 > (1 row) > > regression=# select (-1)::numeric(20,4); > numeric > --------- > -1.0000 > (1 row) > > regression=# select - cast(1 as numeric(20,4)); > ?column? > ---------- > -1.0000 > (1 row) > > regression=# select - 1::numeric(20,4); > ?column? > ---------- > -1.0000 > (1 row) > > What we're actually seeing here is that the code to guess a default > column name doesn't descend through a unary minus operator, it just > punts upon finding an Op node. > > regards, tom lane >
Sim Zacks <sim@compulab.co.il> writes:
> If I replace that column with -1::numeric(20,4) or - (1::numeric(20,4))
> the type that goes to the view is numeric without any scale or precision
> and then I get an error that I cannot change the column type.
You've still got the order of operations wrong.
(-1)::numeric(20,4)
is known to have typmod (20,4), because the cast operation enforces it.
- (1::numeric(20,4))
is not known to have any particular typmod --- it actually does fit in
(20,4), of course, but that fact depends on the detailed behavior of the
minus operator, which is not known to the type machinery.
regards, tom lane