mirror of
https://github.com/postgres/postgres.git
synced 2026-01-13 12:22:55 +03:00
The idea behind this patch is to make it possible to run individual test scripts without running the entire core test suite. Making all the scripts completely independent would involve a massive rewrite, and would probably be worse for coverage of things like concurrent DDL. So this patch just does what seems practical with limited changes. The net effect is that any test script can be run after running limited earlier dependencies: * all scripts depend on test_setup * many scripts depend on create_index * other dependencies are few in number, and are documented in the parallel_schedule file. To accomplish this, I chose a small number of commonly-used tables and moved their creation and filling into test_setup. Later scripts are expected not to modify these tables' data contents, for fear of affecting other scripts' results. Also, our former habit of declaring all C functions in one place is now gone in favor of declaring them where they're used, if that's just one script, or in test_setup if necessary. There's more that could be done to remove some of the remaining inter-script dependencies, but significantly more-invasive changes would be needed, and at least for now it doesn't seem worth it. Discussion: https://postgr.es/m/1114748.1640383217@sss.pgh.pa.us
139 lines
4.8 KiB
PL/PgSQL
139 lines
4.8 KiB
PL/PgSQL
--
|
|
-- SELECT_INTO
|
|
--
|
|
|
|
SELECT *
|
|
INTO TABLE sitmp1
|
|
FROM onek
|
|
WHERE onek.unique1 < 2;
|
|
|
|
DROP TABLE sitmp1;
|
|
|
|
SELECT *
|
|
INTO TABLE sitmp1
|
|
FROM onek2
|
|
WHERE onek2.unique1 < 2;
|
|
|
|
DROP TABLE sitmp1;
|
|
|
|
--
|
|
-- 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;
|
|
-- WITH DATA, passes.
|
|
CREATE TABLE selinto_schema.tbl_withdata1 (a)
|
|
AS SELECT generate_series(1,3) WITH DATA;
|
|
INSERT INTO selinto_schema.tbl_withdata1 VALUES (4);
|
|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
|
|
CREATE TABLE selinto_schema.tbl_withdata2 (a) AS
|
|
SELECT generate_series(1,3) WITH DATA;
|
|
-- WITH NO DATA, passes.
|
|
CREATE TABLE selinto_schema.tbl_nodata1 (a) AS
|
|
SELECT generate_series(1,3) WITH NO DATA;
|
|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
|
|
CREATE TABLE selinto_schema.tbl_nodata2 (a) AS
|
|
SELECT generate_series(1,3) WITH NO DATA;
|
|
-- EXECUTE and WITH DATA, passes.
|
|
PREPARE data_sel AS SELECT generate_series(1,3);
|
|
CREATE TABLE selinto_schema.tbl_withdata3 (a) AS
|
|
EXECUTE data_sel WITH DATA;
|
|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
|
|
CREATE TABLE selinto_schema.tbl_withdata4 (a) AS
|
|
EXECUTE data_sel WITH DATA;
|
|
-- EXECUTE and WITH NO DATA, passes.
|
|
CREATE TABLE selinto_schema.tbl_nodata3 (a) AS
|
|
EXECUTE data_sel WITH NO DATA;
|
|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
|
|
CREATE TABLE selinto_schema.tbl_nodata4 (a) AS
|
|
EXECUTE data_sel WITH NO DATA;
|
|
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;
|
|
RESET SESSION AUTHORIZATION;
|
|
|
|
DEALLOCATE data_sel;
|
|
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 and EXPLAIN ANALYZE CREATE TABLE AS
|
|
-- WITH NO DATA, but hide the outputs since they won't be stable.
|
|
DO $$
|
|
BEGIN
|
|
EXECUTE 'EXPLAIN ANALYZE SELECT * INTO TABLE easi FROM int8_tbl';
|
|
EXECUTE 'EXPLAIN ANALYZE CREATE TABLE easi2 AS SELECT * FROM int8_tbl WITH NO DATA';
|
|
END$$;
|
|
|
|
DROP TABLE created_table;
|
|
DROP TABLE easi, easi2;
|
|
|
|
--
|
|
-- Disallowed uses of SELECT ... INTO. All should fail
|
|
--
|
|
DECLARE foo CURSOR FOR SELECT 1 INTO int4_tbl;
|
|
COPY (SELECT 1 INTO frak UNION SELECT 2) TO 'blob';
|
|
SELECT * FROM (SELECT 1 INTO f) bar;
|
|
CREATE VIEW foo AS SELECT 1 INTO int4_tbl;
|
|
INSERT INTO int4_tbl SELECT 1 INTO f;
|
|
|
|
-- Test CREATE TABLE AS ... IF NOT EXISTS
|
|
CREATE TABLE ctas_ine_tbl AS SELECT 1;
|
|
CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0; -- error
|
|
CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0; -- ok
|
|
CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- error
|
|
CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- ok
|
|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
|
|
CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0; -- error
|
|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
|
|
CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0; -- ok
|
|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
|
|
CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- error
|
|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
|
|
CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- ok
|
|
PREPARE ctas_ine_query AS SELECT 1 / 0;
|
|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
|
|
CREATE TABLE ctas_ine_tbl AS EXECUTE ctas_ine_query; -- error
|
|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
|
|
CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS EXECUTE ctas_ine_query; -- ok
|
|
DROP TABLE ctas_ine_tbl;
|