SQL Columns can get different default names depending on if the columns come from subqueries (where they all get ?column? )

# SELECT 1,2,3,(SELECT 1),(SELECT 2),(SELECT 3),* FROM (SELECT 1,2,3) AS t; ?column? | ?column? | ?column? | ?column? | ?column? | ?column? | ?column? | ?column? | ?column? ----------+----------+----------+----------+----------+----------+----------+----------+---------- 1 | 2 | 3 | 1 | 2 | 3 | 1 | 2 | 3 (1 row)

Or, from VALUES LIST (where they all get column# )

SELECT * FROM (VALUES (1,2,3)) AS f; column1 | column2 | column3 ---------+---------+--------- 1 | 2 | 3 (1 row)

This is mentioned in the docs on VALUES LIST,

By default, PostgreSQL assigns the names column1, column2, etc. to the columns of a VALUES table. The column names are not specified by the SQL standard and different database systems do it differently, so it's usually better to override the default names with a table alias list, like this:

And, then this is mentioned in the docs on SELECT

In more complex cases a function or type name may be used, or the system may fall back on a generated name such as ?column?.

Is there any reason we generate different sets of names like this? Why not just have the SELECT list generate sequentially all unnamed columns in the same fashion as the VALUES list?

This shows a behavior that I think is somewhat awkward, I would expect, column1 - column3 twice.