mirror of
https://github.com/postgres/postgres.git
synced 2026-02-19 02:29:10 -05:00
To ensure that "make installcheck" can be used safely against an existing installation, we need to be careful about what global object names (database, role, and tablespace names) we use; otherwise we might accidentally clobber important objects. There's been a weak consensus that test databases should have names including "regression", and that test role names should start with "regress_", but we didn't have any particular rule about tablespace names; and neither of the other rules was followed with any consistency either. This commit moves us a long way towards having a hard-and-fast rule that regression test databases must have names including "regression", and that test role and tablespace names must start with "regress_". It's not completely there because I did not touch some test cases in rolenames.sql that test creation of special role names like "session_user". That will require some rethinking of exactly what we want to test, whereas the intent of this patch is just to hit all the cases in which the needed renamings are cosmetic. There is no enforcement mechanism in this patch either, but if we don't add one we can expect that the tests will soon be violating the convention again. Again, that's not such a cosmetic change and it will require discussion. (But I did use a quick-hack enforcement patch to find these cases.) Discussion: <16638.1468620817@sss.pgh.pa.us>
105 lines
3 KiB
PL/PgSQL
105 lines
3 KiB
PL/PgSQL
--
|
|
-- 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 regress_selinto_user;
|
|
ALTER DEFAULT PRIVILEGES FOR ROLE regress_selinto_user
|
|
REVOKE INSERT ON TABLES FROM regress_selinto_user;
|
|
GRANT ALL ON SCHEMA selinto_schema TO public;
|
|
|
|
SET SESSION AUTHORIZATION regress_selinto_user;
|
|
SELECT * INTO TABLE selinto_schema.tmp1
|
|
FROM pg_class WHERE relname like '%a%'; -- Error
|
|
SELECT oid AS clsoid, relname, relnatts + 10 AS x
|
|
INTO selinto_schema.tmp2
|
|
FROM pg_class WHERE relname like '%b%'; -- Error
|
|
CREATE TABLE selinto_schema.tmp3 (a,b,c)
|
|
AS SELECT oid,relname,relacl FROM pg_class
|
|
WHERE relname like '%c%'; -- Error
|
|
RESET SESSION AUTHORIZATION;
|
|
|
|
ALTER DEFAULT PRIVILEGES FOR ROLE regress_selinto_user
|
|
GRANT INSERT ON TABLES TO regress_selinto_user;
|
|
|
|
SET SESSION AUTHORIZATION regress_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;
|
|
DROP USER regress_selinto_user;
|
|
|
|
-- Tests for WITH NO DATA and column name consistency
|
|
CREATE TABLE ctas_base (i int, j int);
|
|
INSERT INTO ctas_base VALUES (1, 2);
|
|
CREATE TABLE ctas_nodata (ii, jj, kk) AS SELECT i, j FROM ctas_base; -- Error
|
|
CREATE TABLE ctas_nodata (ii, jj, kk) AS SELECT i, j FROM ctas_base WITH NO DATA; -- Error
|
|
CREATE TABLE ctas_nodata (ii, jj) AS SELECT i, j FROM ctas_base; -- OK
|
|
CREATE TABLE ctas_nodata_2 (ii, jj) AS SELECT i, j FROM ctas_base WITH NO DATA; -- OK
|
|
CREATE TABLE ctas_nodata_3 (ii) AS SELECT i, j FROM ctas_base; -- OK
|
|
CREATE TABLE ctas_nodata_4 (ii) AS SELECT i, j FROM ctas_base WITH NO DATA; -- OK
|
|
SELECT * FROM ctas_nodata;
|
|
SELECT * FROM ctas_nodata_2;
|
|
SELECT * FROM ctas_nodata_3;
|
|
SELECT * FROM ctas_nodata_4;
|
|
DROP TABLE ctas_base;
|
|
DROP TABLE ctas_nodata;
|
|
DROP TABLE ctas_nodata_2;
|
|
DROP TABLE ctas_nodata_3;
|
|
DROP TABLE ctas_nodata_4;
|
|
|
|
--
|
|
-- 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();
|
|
|
|
SELECT * FROM created_table;
|
|
|
|
-- Try EXPLAIN ANALYZE SELECT INTO, but hide the output since it won't
|
|
-- be stable.
|
|
DO $$
|
|
BEGIN
|
|
EXECUTE 'EXPLAIN ANALYZE SELECT * INTO TABLE easi FROM int8_tbl';
|
|
END$$;
|
|
|
|
DROP TABLE created_table;
|
|
DROP TABLE easi;
|
|
|
|
--
|
|
-- Disallowed uses of SELECT ... INTO. All should fail
|
|
--
|
|
DECLARE foo CURSOR FOR SELECT 1 INTO b;
|
|
COPY (SELECT 1 INTO frak UNION SELECT 2) TO 'blob';
|
|
SELECT * FROM (SELECT 1 INTO f) bar;
|
|
CREATE VIEW foo AS SELECT 1 INTO b;
|
|
INSERT INTO b SELECT 1 INTO f;
|