mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-03 02:36:53 +02:00
dfd26f9c5f
As previously coded, the QueryDesc's dest pointer was left dangling (pointing at an already-freed receiver object) after ExecutorEnd. It's a bit astonishing that it took us this long to notice, and I'm not sure that the known problem case with SQL functions is the only one. Fix it by saving and restoring the original receiver pointer, which seems the most bulletproof way of ensuring any related bugs are also covered. Per bug #6379 from Paul Ramsey. Back-patch to 8.4 where the current handling of SELECT INTO was introduced.
78 lines
2.3 KiB
Plaintext
78 lines
2.3 KiB
Plaintext
--
|
|
-- SELECT_INTO
|
|
--
|
|
SELECT *
|
|
INTO TABLE tmp1
|
|
FROM onek
|
|
WHERE onek.unique1 < 2;
|
|
DROP TABLE tmp1;
|
|
SELECT *
|
|
INTO TABLE tmp1
|
|
FROM onek2
|
|
WHERE onek2.unique1 < 2;
|
|
DROP TABLE tmp1;
|
|
--
|
|
-- SELECT INTO and INSERT permission, if owner is not allowed to insert.
|
|
--
|
|
CREATE SCHEMA selinto_schema;
|
|
CREATE USER selinto_user;
|
|
ALTER DEFAULT PRIVILEGES FOR ROLE selinto_user
|
|
REVOKE INSERT ON TABLES FROM selinto_user;
|
|
GRANT ALL ON SCHEMA selinto_schema TO public;
|
|
SET SESSION AUTHORIZATION selinto_user;
|
|
SELECT * INTO TABLE selinto_schema.tmp1
|
|
FROM pg_class WHERE relname like '%a%'; -- Error
|
|
ERROR: permission denied for relation tmp1
|
|
SELECT oid AS clsoid, relname, relnatts + 10 AS x
|
|
INTO selinto_schema.tmp2
|
|
FROM pg_class WHERE relname like '%b%'; -- Error
|
|
ERROR: permission denied for relation tmp2
|
|
CREATE TABLE selinto_schema.tmp3 (a,b,c)
|
|
AS SELECT oid,relname,relacl FROM pg_class
|
|
WHERE relname like '%c%'; -- Error
|
|
ERROR: permission denied for relation tmp3
|
|
RESET SESSION AUTHORIZATION;
|
|
ALTER DEFAULT PRIVILEGES FOR ROLE selinto_user
|
|
GRANT INSERT ON TABLES TO selinto_user;
|
|
SET SESSION AUTHORIZATION selinto_user;
|
|
SELECT * INTO TABLE selinto_schema.tmp1
|
|
FROM pg_class WHERE relname like '%a%'; -- OK
|
|
SELECT oid AS clsoid, relname, relnatts + 10 AS x
|
|
INTO selinto_schema.tmp2
|
|
FROM pg_class WHERE relname like '%b%'; -- OK
|
|
CREATE TABLE selinto_schema.tmp3 (a,b,c)
|
|
AS SELECT oid,relname,relacl FROM pg_class
|
|
WHERE relname like '%c%'; -- OK
|
|
RESET SESSION AUTHORIZATION;
|
|
DROP SCHEMA selinto_schema CASCADE;
|
|
NOTICE: drop cascades to 3 other objects
|
|
DETAIL: drop cascades to table selinto_schema.tmp1
|
|
drop cascades to table selinto_schema.tmp2
|
|
drop cascades to table selinto_schema.tmp3
|
|
DROP USER selinto_user;
|
|
--
|
|
-- CREATE TABLE AS/SELECT INTO as last command in a SQL function
|
|
-- have been known to cause problems
|
|
--
|
|
CREATE FUNCTION make_table() RETURNS VOID
|
|
AS $$
|
|
CREATE TABLE created_table AS SELECT * FROM int8_tbl;
|
|
$$ LANGUAGE SQL;
|
|
SELECT make_table();
|
|
make_table
|
|
------------
|
|
|
|
(1 row)
|
|
|
|
SELECT * FROM created_table;
|
|
q1 | q2
|
|
------------------+-------------------
|
|
123 | 456
|
|
123 | 4567890123456789
|
|
4567890123456789 | 123
|
|
4567890123456789 | 4567890123456789
|
|
4567890123456789 | -4567890123456789
|
|
(5 rows)
|
|
|
|
DROP TABLE created_table;
|