| From: | Marcelo Fernandes <marcefern7(at)gmail(dot)com> |
|---|---|
| To: | pgsql-general(at)lists(dot)postgresql(dot)org |
| Subject: | Increasing a NUMERIC column precision doesn't cause a table rewrite. Why? |
| Date: | 2025-11-03 08:24:00 |
| Message-ID: | CAM2F1VNniBN2RK9+DD8Pwz4tphE-1w3hZgtwZF-6c08--6JLiw@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-general |
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
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Weck, Luis | 2025-11-03 11:32:37 | Re: Increasing a NUMERIC column precision doesn't cause a table rewrite. Why? |
| Previous Message | Sivaprasad | 2025-11-02 17:00:09 | Re: [ANNOUNCE] BISCUIT – A Bitmap-Based Indexed Search Extension for PostgreSQL |