select_into.out 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. ERROR: permission denied for table tbl_withdata1
  28. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  29. CREATE TABLE selinto_schema.tbl_withdata2 (a) AS
  30. SELECT generate_series(1,3) WITH DATA;
  31. QUERY PLAN
  32. --------------------------------------
  33. ProjectSet (actual rows=3 loops=1)
  34. -> Result (actual rows=1 loops=1)
  35. (2 rows)
  36. -- WITH NO DATA, passes.
  37. CREATE TABLE selinto_schema.tbl_nodata1 (a) AS
  38. SELECT generate_series(1,3) WITH NO DATA;
  39. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  40. CREATE TABLE selinto_schema.tbl_nodata2 (a) AS
  41. SELECT generate_series(1,3) WITH NO DATA;
  42. QUERY PLAN
  43. -------------------------------
  44. ProjectSet (never executed)
  45. -> Result (never executed)
  46. (2 rows)
  47. -- EXECUTE and WITH DATA, passes.
  48. PREPARE data_sel AS SELECT generate_series(1,3);
  49. CREATE TABLE selinto_schema.tbl_withdata3 (a) AS
  50. EXECUTE data_sel WITH DATA;
  51. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  52. CREATE TABLE selinto_schema.tbl_withdata4 (a) AS
  53. EXECUTE data_sel WITH DATA;
  54. QUERY PLAN
  55. --------------------------------------
  56. ProjectSet (actual rows=3 loops=1)
  57. -> Result (actual rows=1 loops=1)
  58. (2 rows)
  59. -- EXECUTE and WITH NO DATA, passes.
  60. CREATE TABLE selinto_schema.tbl_nodata3 (a) AS
  61. EXECUTE data_sel WITH NO DATA;
  62. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  63. CREATE TABLE selinto_schema.tbl_nodata4 (a) AS
  64. EXECUTE data_sel WITH NO DATA;
  65. QUERY PLAN
  66. -------------------------------
  67. ProjectSet (never executed)
  68. -> Result (never executed)
  69. (2 rows)
  70. RESET SESSION AUTHORIZATION;
  71. ALTER DEFAULT PRIVILEGES FOR ROLE regress_selinto_user
  72. GRANT INSERT ON TABLES TO regress_selinto_user;
  73. SET SESSION AUTHORIZATION regress_selinto_user;
  74. RESET SESSION AUTHORIZATION;
  75. DEALLOCATE data_sel;
  76. DROP SCHEMA selinto_schema CASCADE;
  77. NOTICE: drop cascades to 8 other objects
  78. DETAIL: drop cascades to table selinto_schema.tbl_withdata1
  79. drop cascades to table selinto_schema.tbl_withdata2
  80. drop cascades to table selinto_schema.tbl_nodata1
  81. drop cascades to table selinto_schema.tbl_nodata2
  82. drop cascades to table selinto_schema.tbl_withdata3
  83. drop cascades to table selinto_schema.tbl_withdata4
  84. drop cascades to table selinto_schema.tbl_nodata3
  85. drop cascades to table selinto_schema.tbl_nodata4
  86. DROP USER regress_selinto_user;
  87. -- Tests for WITH NO DATA and column name consistency
  88. CREATE TABLE ctas_base (i int, j int);
  89. INSERT INTO ctas_base VALUES (1, 2);
  90. CREATE TABLE ctas_nodata (ii, jj, kk) AS SELECT i, j FROM ctas_base; -- Error
  91. ERROR: too many column names were specified
  92. CREATE TABLE ctas_nodata (ii, jj, kk) AS SELECT i, j FROM ctas_base WITH NO DATA; -- Error
  93. ERROR: too many column names were specified
  94. CREATE TABLE ctas_nodata (ii, jj) AS SELECT i, j FROM ctas_base; -- OK
  95. CREATE TABLE ctas_nodata_2 (ii, jj) AS SELECT i, j FROM ctas_base WITH NO DATA; -- OK
  96. CREATE TABLE ctas_nodata_3 (ii) AS SELECT i, j FROM ctas_base; -- OK
  97. CREATE TABLE ctas_nodata_4 (ii) AS SELECT i, j FROM ctas_base WITH NO DATA; -- OK
  98. SELECT * FROM ctas_nodata;
  99. ii | jj
  100. ----+----
  101. 1 | 2
  102. (1 row)
  103. SELECT * FROM ctas_nodata_2;
  104. ii | jj
  105. ----+----
  106. (0 rows)
  107. SELECT * FROM ctas_nodata_3;
  108. ii | j
  109. ----+---
  110. 1 | 2
  111. (1 row)
  112. SELECT * FROM ctas_nodata_4;
  113. ii | j
  114. ----+---
  115. (0 rows)
  116. DROP TABLE ctas_base;
  117. DROP TABLE ctas_nodata;
  118. DROP TABLE ctas_nodata_2;
  119. DROP TABLE ctas_nodata_3;
  120. DROP TABLE ctas_nodata_4;
  121. --
  122. -- CREATE TABLE AS/SELECT INTO as last command in a SQL function
  123. -- have been known to cause problems
  124. --
  125. CREATE FUNCTION make_table() RETURNS VOID
  126. AS $$
  127. CREATE TABLE created_table AS SELECT * FROM int8_tbl;
  128. $$ LANGUAGE SQL;
  129. SELECT make_table();
  130. make_table
  131. ------------
  132. (1 row)
  133. SELECT * FROM created_table;
  134. q1 | q2
  135. ------------------+-------------------
  136. 123 | 456
  137. 123 | 4567890123456789
  138. 4567890123456789 | 123
  139. 4567890123456789 | 4567890123456789
  140. 4567890123456789 | -4567890123456789
  141. (5 rows)
  142. -- Try EXPLAIN ANALYZE SELECT INTO and EXPLAIN ANALYZE CREATE TABLE AS
  143. -- WITH NO DATA, but hide the outputs since they won't be stable.
  144. DO $$
  145. BEGIN
  146. EXECUTE 'EXPLAIN ANALYZE SELECT * INTO TABLE easi FROM int8_tbl';
  147. EXECUTE 'EXPLAIN ANALYZE CREATE TABLE easi2 AS SELECT * FROM int8_tbl WITH NO DATA';
  148. END$$;
  149. DROP TABLE created_table;
  150. DROP TABLE easi, easi2;
  151. --
  152. -- Disallowed uses of SELECT ... INTO. All should fail
  153. --
  154. DECLARE foo CURSOR FOR SELECT 1 INTO b;
  155. ERROR: SELECT ... INTO is not allowed here
  156. LINE 1: DECLARE foo CURSOR FOR SELECT 1 INTO b;
  157. ^
  158. COPY (SELECT 1 INTO frak UNION SELECT 2) TO 'blob';
  159. ERROR: COPY (SELECT INTO) is not supported
  160. SELECT * FROM (SELECT 1 INTO f) bar;
  161. ERROR: SELECT ... INTO is not allowed here
  162. LINE 1: SELECT * FROM (SELECT 1 INTO f) bar;
  163. ^
  164. CREATE VIEW foo AS SELECT 1 INTO b;
  165. ERROR: views must not contain SELECT INTO
  166. INSERT INTO b SELECT 1 INTO f;
  167. ERROR: SELECT ... INTO is not allowed here
  168. LINE 1: INSERT INTO b SELECT 1 INTO f;
  169. ^
  170. -- Test CREATE TABLE AS ... IF NOT EXISTS
  171. CREATE TABLE ctas_ine_tbl AS SELECT 1;
  172. CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0; -- error
  173. ERROR: relation "ctas_ine_tbl" already exists
  174. CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0; -- ok
  175. NOTICE: relation "ctas_ine_tbl" already exists, skipping
  176. CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- error
  177. ERROR: relation "ctas_ine_tbl" already exists
  178. CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- ok
  179. NOTICE: relation "ctas_ine_tbl" already exists, skipping
  180. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  181. CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0; -- error
  182. ERROR: relation "ctas_ine_tbl" already exists
  183. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  184. CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0; -- ok
  185. NOTICE: relation "ctas_ine_tbl" already exists, skipping
  186. QUERY PLAN
  187. ------------
  188. (0 rows)
  189. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  190. CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- error
  191. ERROR: relation "ctas_ine_tbl" already exists
  192. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  193. CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS SELECT 1 / 0 WITH NO DATA; -- ok
  194. NOTICE: relation "ctas_ine_tbl" already exists, skipping
  195. QUERY PLAN
  196. ------------
  197. (0 rows)
  198. PREPARE ctas_ine_query AS SELECT 1 / 0;
  199. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  200. CREATE TABLE ctas_ine_tbl AS EXECUTE ctas_ine_query; -- error
  201. ERROR: relation "ctas_ine_tbl" already exists
  202. EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
  203. CREATE TABLE IF NOT EXISTS ctas_ine_tbl AS EXECUTE ctas_ine_query; -- ok
  204. NOTICE: relation "ctas_ine_tbl" already exists, skipping
  205. QUERY PLAN
  206. ------------
  207. (0 rows)
  208. DROP TABLE ctas_ine_tbl;