select_into.sql 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. --
  2. -- SELECT_INTO
  3. --
  4. SELECT *
  5. INTO TABLE sitmp1
  6. FROM onek
  7. WHERE onek.unique1 < 2;
  8. DROP TABLE sitmp1;
  9. SELECT *
  10. INTO TABLE sitmp1
  11. FROM onek2
  12. WHERE onek2.unique1 < 2;
  13. DROP TABLE sitmp1;
  14. --
  15. -- SELECT INTO and INSERT permission, if owner is not allowed to insert.
  16. --
  17. CREATE SCHEMA selinto_schema;
  18. CREATE USER regress_selinto_user;
  19. ALTER DEFAULT PRIVILEGES FOR ROLE regress_selinto_user
  20. REVOKE INSERT ON TABLES FROM regress_selinto_user;
  21. GRANT ALL ON SCHEMA selinto_schema TO public;
  22. SET SESSION AUTHORIZATION regress_selinto_user;
  23. -- WITH DATA, passes.
  24. CREATE TABLE selinto_schema.tbl_withdata1 (a)
  25. AS SELECT generate_series(1,3) WITH DATA;
  26. INSERT INTO selinto_schema.tbl_withdata1 VALUES (4);
  27. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  28. CREATE TABLE selinto_schema.tbl_withdata2 (a) AS
  29. SELECT generate_series(1,3) WITH DATA;
  30. -- WITH NO DATA, passes.
  31. CREATE TABLE selinto_schema.tbl_nodata1 (a) AS
  32. SELECT generate_series(1,3) WITH NO DATA;
  33. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  34. CREATE TABLE selinto_schema.tbl_nodata2 (a) AS
  35. SELECT generate_series(1,3) WITH NO DATA;
  36. -- EXECUTE and WITH DATA, passes.
  37. PREPARE data_sel AS SELECT generate_series(1,3);
  38. CREATE TABLE selinto_schema.tbl_withdata3 (a) AS
  39. EXECUTE data_sel WITH DATA;
  40. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  41. CREATE TABLE selinto_schema.tbl_withdata4 (a) AS
  42. EXECUTE data_sel WITH DATA;
  43. -- EXECUTE and WITH NO DATA, passes.
  44. CREATE TABLE selinto_schema.tbl_nodata3 (a) AS
  45. EXECUTE data_sel WITH NO DATA;
  46. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  47. CREATE TABLE selinto_schema.tbl_nodata4 (a) AS
  48. EXECUTE data_sel WITH NO DATA;
  49. RESET SESSION AUTHORIZATION;
  50. ALTER DEFAULT PRIVILEGES FOR ROLE regress_selinto_user
  51. GRANT INSERT ON TABLES TO regress_selinto_user;
  52. SET SESSION AUTHORIZATION regress_selinto_user;
  53. RESET SESSION AUTHORIZATION;
  54. DEALLOCATE data_sel;
  55. DROP SCHEMA selinto_schema CASCADE;
  56. DROP USER regress_selinto_user;
  57. -- Tests for WITH NO DATA and column name consistency
  58. CREATE TABLE ctas_base (i int, j int);
  59. INSERT INTO ctas_base VALUES (1, 2);
  60. CREATE TABLE ctas_nodata (ii, jj, kk) AS SELECT i, j FROM ctas_base; -- Error
  61. CREATE TABLE ctas_nodata (ii, jj, kk) AS SELECT i, j FROM ctas_base WITH NO DATA; -- Error
  62. CREATE TABLE ctas_nodata (ii, jj) AS SELECT i, j FROM ctas_base; -- OK
  63. CREATE TABLE ctas_nodata_2 (ii, jj) AS SELECT i, j FROM ctas_base WITH NO DATA; -- OK
  64. CREATE TABLE ctas_nodata_3 (ii) AS SELECT i, j FROM ctas_base; -- OK
  65. CREATE TABLE ctas_nodata_4 (ii) AS SELECT i, j FROM ctas_base WITH NO DATA; -- OK
  66. SELECT * FROM ctas_nodata;
  67. SELECT * FROM ctas_nodata_2;
  68. SELECT * FROM ctas_nodata_3;
  69. SELECT * FROM ctas_nodata_4;
  70. DROP TABLE ctas_base;
  71. DROP TABLE ctas_nodata;
  72. DROP TABLE ctas_nodata_2;
  73. DROP TABLE ctas_nodata_3;
  74. DROP TABLE ctas_nodata_4;
  75. --
  76. -- CREATE TABLE AS/SELECT INTO as last command in a SQL function
  77. -- have been known to cause problems
  78. --
  79. CREATE FUNCTION make_table() RETURNS VOID
  80. AS $$
  81. CREATE TABLE created_table AS SELECT * FROM int8_tbl;
  82. $$ LANGUAGE SQL;
  83. SELECT make_table();
  84. SELECT * FROM created_table;
  85. -- Try EXPLAIN ANALYZE SELECT INTO and EXPLAIN ANALYZE CREATE TABLE AS
  86. -- WITH NO DATA, but hide the outputs since they won't be stable.
  87. DO $$
  88. BEGIN
  89. EXECUTE 'EXPLAIN ANALYZE SELECT * INTO TABLE easi FROM int8_tbl';
  90. EXECUTE 'EXPLAIN ANALYZE CREATE TABLE easi2 AS SELECT * FROM int8_tbl WITH NO DATA';
  91. END$$;
  92. DROP TABLE created_table;
  93. DROP TABLE easi, easi2;
  94. --
  95. -- Disallowed uses of SELECT ... INTO. All should fail
  96. --
  97. DECLARE foo CURSOR FOR SELECT 1 INTO b;
  98. COPY (SELECT 1 INTO frak UNION SELECT 2) TO 'blob';
  99. SELECT * FROM (SELECT 1 INTO f) bar;
  100. CREATE VIEW foo AS SELECT 1 INTO b;
  101. INSERT INTO b SELECT 1 INTO f;
  102. -- Test CREATE TABLE AS ... IF NOT EXISTS
  103. CREATE TABLE ctas_ine_tbl AS SELECT 1;
  104. CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0; -- error
  105. CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0; -- ok
  106. CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- error
  107. CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- ok
  108. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  109. CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0; -- error
  110. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  111. CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0; -- ok
  112. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  113. CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- error
  114. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  115. CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- ok
  116. PREPARE ctas_ine_query AS SELECT 1 / 0;
  117. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  118. CREATE TABLE ctas_ine_tbl AS EXECUTE ctas_ine_query; -- error
  119. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  120. CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS EXECUTE ctas_ine_query; -- ok
  121. DROP TABLE ctas_ine_tbl;