public inbox for [email protected]
help / color / mirror / Atom feedFrom: Marcelo Fernandes <[email protected]>
To: [email protected]
Subject: Increasing a NUMERIC column precision doesn't cause a table rewrite. Why?
Date: Mon, 3 Nov 2025 21:24:00 +1300
Message-ID: <CAM2F1VNniBN2RK9+DD8Pwz4tphE-1w3hZgtwZF-6c08--6JLiw@mail.gmail.com> (raw)
Hi everyone,
A numeric field is defined as: NUMERIC(precision, scale) [0].
After doing some playing around with different operations against a numeric
column, namely: increasing/decreasing the precision or increasing/decreasing
the scale, I noticed that the table is rewritten in all cases except when
increasing the precision number.
Take the following snippet as example (tested on postgres 15):
```sql
CREATE DATABASE test_precision_field;
-- \c test_precision_field
SET client_min_messages=debug1;
DROP TABLE IF EXISTS foo;
CREATE TABLE foo (id SERIAL PRIMARY KEY, bar NUMERIC(10, 2));
-- Only increase precision but keep the scale:
-- This does not rewrite the table
ALTER TABLE foo ALTER COLUMN bar TYPE numeric(20, 2);
-- Only decrease the precision but keep the scale:
-- This rewrites the table.
ALTER TABLE foo ALTER COLUMN bar TYPE numeric(10, 2);
-- DEBUG: rewriting table "foo"
-- DEBUG: building index "foo_pkey" on table "foo" serially
-- DEBUG: index "foo_pkey" can safely use deduplication
-- Only increase the scale, but keep the precision:
-- This rewrites the table.
ALTER TABLE foo ALTER COLUMN bar TYPE numeric(10, 4);
-- DEBUG: rewriting table "foo"
-- DEBUG: building index "foo_pkey" on table "foo" serially
-- DEBUG: index "foo_pkey" can safely use deduplication
-- Only decrease the scale, but keep the precision:
-- This rewrites the table.
ALTER TABLE foo ALTER COLUMN bar TYPE numeric(10, 2);
-- DEBUG: rewriting table "foo"
-- DEBUG: building index "foo_pkey" on table "foo" serially
-- DEBUG: index "foo_pkey" can safely use deduplication
```
My assumption is that once the precision is increased, Postgres can still
interpret the old values that were generated with a lower precision, whereas
this is not possible for any other types of changes on the numeric field.
Is that assumption correct? How can I verify it?
For example, is there a catalog table I can have a look to see how these values
are defined, along with some form of documentation to understand how they are
interpreted by Postgres?
Thank you,
Marcelo.
- [0] https://www.postgresql.org/docs/current/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected]
Subject: Re: Increasing a NUMERIC column precision doesn't cause a table rewrite. Why?
In-Reply-To: <CAM2F1VNniBN2RK9+DD8Pwz4tphE-1w3hZgtwZF-6c08--6JLiw@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox