Re: SELECT INTO question

From: Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>
To: Kevin Brannen <KBrannen(at)efji(dot)com>, "pgsql-generallists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: SELECT INTO question
Date: 2019-07-25 19:32:07
Message-ID: c781b965-5e01-8072-377a-40b24001f64c@aklaver.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 7/25/19 12:23 PM, Kevin Brannen wrote:
> Hi,
>
> We’re trying to understand what happened with a SELECT INTO. The problem
> can be see with this example:
>
> # create table t1 (id int, v int);
>
> CREATE TABLE
>
> # insert into t1 (select x, x from generate_series(1, 5) as g(x));
>
> INSERT 0 5
>
> # select * from t1;
>
> id | v
>
> ----+----
>
>   1 |  1
>
>   2 |  2
>
>   3 |  3
>
>   4 |  4
>
>   5 |  5
>
> (5 rows)
>
> nms=# select into t2 from t1;
>
> SELECT 5
>
> # select * from t2;
>
> --
>
> (5 rows)
>
> # select * into t3 from t1;
>
> SELECT 5
>
> # select * from t3;
>
> id | v
>
> ----+----
>
>   1 |  1
>
>   2 |  2
>
>   3 |  3
>
>   4 |  4
>
>   5 |  5
>
> (5 rows)
>
> As you can see on the first select into, the result in t2 is … missing,
> no “data” at all, unlike t3 which was the expected answer. Upon closer
> inspection, it was realized that the “expression” in the statement was
> left out (oops!), but instead of getting a syntax error, it worked.
>
> So why did it work and why was nothing stored?
>
> The only answer I’ve been able to come up with is that the expression
> was evaluated as a “null expression” for each row, so it gave us 5 null
> rows. A small part of my brain understands that, but most of my brain
> goes “what?!”
>
> I’ve noticed that I can also do:
>
> # select from t1;
>
> --
>
> (5 rows)
>
> That also doesn’t make sense and yet it does in a weird way. I suspect
> the answer revolves around some corner case in the SQL Standard.
>
> So, what’s going on here?

https://www.postgresql.org/docs/11/sql-select.html

Compatibility

"Omitted FROM Clauses

PostgreSQL allows one to omit the FROM clause. It has a straightforward
use to compute the results of simple expressions:

SELECT 2+2;

?column?
----------
4

Some other SQL databases cannot do this except by introducing a dummy
one-row table from which to do the SELECT.

...

Empty SELECT Lists

The list of output expressions after SELECT can be empty, producing a
zero-column result table. This is not valid syntax according to the SQL
standard. PostgreSQL allows it to be consistent with allowing
zero-column tables. However, an empty list is not allowed when DISTINCT
is used.
"

So:
test=# \d t2

Table "public.t2"

Column | Type | Collation | Nullable | Default

--------+------+-----------+----------+---------

>
> Thanks,
>
> Kevin
>

--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Adrian Klaver 2019-07-25 19:39:16 Re: postgres 9.5 DB corruption
Previous Message Kevin Brannen 2019-07-25 19:23:26 SELECT INTO question