Incorrect mention of number of columns?

Started by Daniel Westermann (DWE)over 2 years ago7 messagesdocs
Jump to latest
#1Daniel Westermann (DWE)
daniel.westermann@dbi-services.com

Hi,

from the limits page in the docs: https://www.postgresql.org/docs/current/limits.html

"...but a tuple of 1600 bigint columns would consume 12800 bytes and would therefore not fit inside a heap page".

Creating a table with 1600 bigint columns does work with a 8k blocksize:

$ cat gen_tab.sh
#!/bin/bash
AMOUNT_OF_COLS=$1
DATA_TYPE=$2
STATEMENT="create table t ( "
for (( i=1 ; i<${AMOUNT_OF_COLS} ; i++ ));
do
STATEMENT+=" col${i} ${DATA_TYPE},"
done
STATEMENT+="col${AMOUNT_OF_COLS} ${DATA_TYPE} );"
echo ${STATEMENT}

.$ /gen_tab.sh 1600 bigint > a.sql

$ psql -f a.sql
CREATE TABLE

$ psql -c "\d t"
...
col1598 | bigint | | |
col1599 | bigint | | |
col1600 | bigint | | |

Am I missing something?

Regards
Daniel

#2Magnus Hagander
magnus@hagander.net
In reply to: Daniel Westermann (DWE) (#1)
Re: Incorrect mention of number of columns?

On Fri, Nov 3, 2023 at 5:09 PM Daniel Westermann (DWE)
<daniel.westermann@dbi-services.com> wrote:

Hi,

from the limits page in the docs: https://www.postgresql.org/docs/current/limits.html

"...but a tuple of 1600 bigint columns would consume 12800 bytes and would therefore not fit inside a heap page".

Creating a table with 1600 bigint columns does work with a 8k blocksize:

$ cat gen_tab.sh
#!/bin/bash
AMOUNT_OF_COLS=$1
DATA_TYPE=$2
STATEMENT="create table t ( "
for (( i=1 ; i<${AMOUNT_OF_COLS} ; i++ ));
do
STATEMENT+=" col${i} ${DATA_TYPE},"
done
STATEMENT+="col${AMOUNT_OF_COLS} ${DATA_TYPE} );"
echo ${STATEMENT}

.$ /gen_tab.sh 1600 bigint > a.sql

$ psql -f a.sql
CREATE TABLE

$ psql -c "\d t"
...
col1598 | bigint | | |
col1599 | bigint | | |
col1600 | bigint | | |

Am I missing something?

It will fail when you try to insert data in it.

//Magnus

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Daniel Westermann (DWE) (#1)
Re: Incorrect mention of number of columns?

"Daniel Westermann (DWE)" <daniel.westermann@dbi-services.com> writes:

Creating a table with 1600 bigint columns does work with a 8k blocksize:

Yeah, but populating it would not (unless many of the columns were
NULL).

regards, tom lane

#4Daniel Westermann (DWE)
daniel.westermann@dbi-services.com
In reply to: Tom Lane (#3)
Re: Incorrect mention of number of columns?

"Daniel Westermann (DWE)" <daniel.westermann@dbi-services.com> writes:

Creating a table with 1600 bigint columns does work with a 8k blocksize:

Yeah, but populating it would not (unless many of the columns were
NULL).

Ok, but then should the documentation be more precise? It seems a bit odd to let users create such a table without at least a warning.

Regards
Daniel

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Daniel Westermann (DWE) (#4)
Re: Incorrect mention of number of columns?

"Daniel Westermann (DWE)" <daniel.westermann@dbi-services.com> writes:

Yeah, but populating it would not (unless many of the columns were
NULL).

Ok, but then should the documentation be more precise? It seems a bit odd to let users create such a table without at least a warning.

Given the impact of NULLs, and the fact that usually tables have some
variable-width columns, I doubt that a creation-time warning could be
accurate enough to be useful.

regards, tom lane

#6Daniel Westermann (DWE)
daniel.westermann@dbi-services.com
In reply to: Tom Lane (#5)
Re: Incorrect mention of number of columns?

"Daniel Westermann (DWE)" <daniel.westermann@dbi-services.com> writes:

Yeah, but populating it would not (unless many of the columns were
NULL).

Ok, but then should the documentation be more precise? It seems a bit odd to let users create such a table without at least a warning.

Given the impact of NULLs, and the fact that usually tables have some
variable-width columns, I doubt that a creation-time warning could be
accurate enough to be useful.

I am not speaking about a warning at creation time, but rather a warning in the docs. Something like: Although a table with e.g. 1600 bigint columns can be created, creating a tuple of more than 8160 bytes will fail.

Regards
Daniel

#7Bruce Momjian
bruce@momjian.us
In reply to: Daniel Westermann (DWE) (#6)
Re: Incorrect mention of number of columns?

On Fri, Nov 3, 2023 at 05:04:46PM +0000, Daniel Westermann (DWE) wrote:

"Daniel Westermann (DWE)" <daniel.westermann@dbi-services.com> writes:

Yeah, but populating it would not (unless many of the columns were
NULL).

Ok, but then should the documentation be more precise? It seems a bit odd to

let users create such a table without at least a warning.

Given the impact of NULLs, and the fact that usually tables have some
variable-width columns, I doubt that a creation-time warning could be
accurate enough to be useful.

I am not speaking about a warning at creation time, but rather a warning in the
docs. Something like: Although a table with e.g. 1600 bigint columns can be
created, creating a tuple of more than 8160 bytes will fail.

It is in the "limits" docs:

https://www.postgresql.org/docs/current/limits.html

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

Only you can decide what is important to you.