alter-table.slt 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. mode cockroach
  10. reset-server
  11. query error db error: ERROR: invalid table definition for "t1"
  12. CREATE TABLE t1 (a int, b text VERSION ADDED 0);
  13. statement ok
  14. CREATE TABLE t2 (a int);
  15. # TODO(alter_table): Manually specifying a VERSION when referencing an item (maybe?) shouldn't be allowed.
  16. statement ok
  17. CREATE VIEW v1 AS SELECT * FROM [u1 AS "materialize"."public"."t2" VERSION 0];
  18. statement ok
  19. CREATE VIEW v2 AS SELECT * FROM t2;
  20. # TODO(alter_table): Sort out what is returned from SHOW CREATE.
  21. query TT
  22. SHOW CREATE VIEW v1
  23. ----
  24. materialize.public.v1 CREATE␠VIEW␠materialize.public.v1␠AS␠SELECT␠*␠FROM␠materialize.public.t2;
  25. # Note: When the feature is off we should not record versions.
  26. query TT
  27. SHOW CREATE VIEW v2
  28. ----
  29. materialize.public.v2 CREATE␠VIEW␠materialize.public.v2␠AS␠SELECT␠*␠FROM␠materialize.public.t2;
  30. statement ok
  31. DROP VIEW v1 CASCADE;
  32. statement ok
  33. DROP VIEW v2 CASCADE;
  34. simple conn=mz_system,user=mz_system
  35. ALTER SYSTEM SET enable_alter_table_add_column = true
  36. ----
  37. COMPLETE 0
  38. statement ok
  39. CREATE TABLE t1 (a int NOT NULL)
  40. statement error column "a" of relation "t1" already exists
  41. ALTER TABLE t1 ADD COLUMN a int;
  42. statement ok
  43. ALTER TABLE t1 ADD COLUMN IF NOT EXISTS a int;
  44. query error db error: ERROR: invalid version "1000" for "t2"
  45. CREATE VIEW v1 AS SELECT * FROM [u1 AS "materialize"."public"."t2" VERSION 1000];
  46. query TTTT
  47. SHOW COLUMNS FROM t1;
  48. ----
  49. a false integer (empty)
  50. statement ok
  51. INSERT INTO t1 VALUES (1), (2), (3);
  52. statement ok
  53. CREATE VIEW v1 AS SELECT * FROM t1;
  54. statement ok
  55. ALTER TABLE t1 ADD COLUMN b text;
  56. query TTTT
  57. SHOW COLUMNS FROM t1;
  58. ----
  59. a false integer (empty)
  60. b true text (empty)
  61. query TT
  62. SHOW CREATE TABLE t1;
  63. ----
  64. materialize.public.t1 CREATE␠TABLE␠materialize.public.t1␠(a␠pg_catalog.int4␠NOT␠NULL,␠b␠pg_catalog.text␠VERSION␠ADDED␠1);
  65. query TT
  66. SHOW CREATE VIEW v1;
  67. ----
  68. materialize.public.v1 CREATE␠VIEW␠materialize.public.v1␠AS␠SELECT␠*␠FROM␠materialize.public.t1;
  69. statement ok
  70. CREATE VIEW v2 AS SELECT * FROM t1;
  71. query TTTT
  72. SHOW COLUMNS FROM v2;
  73. ----
  74. a false integer (empty)
  75. b true text (empty)
  76. statement ok
  77. CREATE INDEX v2_idx ON v2 (a);
  78. statement ok
  79. CREATE MATERIALIZED VIEW mv1 AS SELECT SUM(a) FROM t1 WHERE b IS NOT NULL;
  80. statement ok
  81. INSERT INTO t1 VALUES (4, 'hello'), (5, 'world');
  82. query I
  83. SELECT * FROM v1;
  84. ----
  85. 1
  86. 2
  87. 3
  88. 4
  89. 5
  90. query I
  91. SELECT * FROM mv1;
  92. ----
  93. 9
  94. query IT
  95. SELECT * FROM t1;
  96. ----
  97. 1 NULL
  98. 2 NULL
  99. 3 NULL
  100. 4 hello
  101. 5 world
  102. query IT
  103. SELECT * FROM v2;
  104. ----
  105. 1 NULL
  106. 2 NULL
  107. 3 NULL
  108. 4 hello
  109. 5 world
  110. statement ok
  111. ALTER TABLE t1 ADD COLUMN c timestamp;
  112. query TT
  113. SHOW CREATE TABLE t1;
  114. ----
  115. materialize.public.t1 CREATE␠TABLE␠materialize.public.t1␠(a␠pg_catalog.int4␠NOT␠NULL,␠b␠pg_catalog.text␠VERSION␠ADDED␠1,␠c␠pg_catalog.timestamp␠VERSION␠ADDED␠2);
  116. query TTTT
  117. SHOW COLUMNS FROM t1;
  118. ----
  119. a false integer (empty)
  120. b true text (empty)
  121. c true timestamp␠without␠time␠zone (empty)
  122. statement ok
  123. CREATE VIEW v3 AS SELECT * FROM t1;
  124. query TTTT
  125. SHOW COLUMNS FROM v3;
  126. ----
  127. a false integer (empty)
  128. b true text (empty)
  129. c true timestamp␠without␠time␠zone (empty)
  130. statement ok
  131. CREATE VIEW v4 AS SELECT a, c FROM t1;
  132. query TTTT
  133. SHOW COLUMNS FROM v4;
  134. ----
  135. a false integer (empty)
  136. c true timestamp␠without␠time␠zone (empty)
  137. statement ok
  138. DROP VIEW v1;
  139. statement ok
  140. INSERT INTO t1 VALUES (6, 'foo', '2020-01-01'::timestamp), (7, 'bar', '1000-01-01'::timestamp);
  141. query I
  142. SELECT * FROM mv1;
  143. ----
  144. 22
  145. statement ok
  146. UPDATE t1 SET b = 'later' WHERE a % 2 = 0;
  147. query I
  148. SELECT * FROM mv1;
  149. ----
  150. 24
  151. query ITT
  152. SELECT * FROM t1 ORDER BY a ASC;
  153. ----
  154. 1 NULL NULL
  155. 2 later NULL
  156. 3 NULL NULL
  157. 4 later NULL
  158. 5 world NULL
  159. 6 later 2020-01-01␠00:00:00
  160. 7 bar 1000-01-01␠00:00:00
  161. query IT
  162. SELECT * FROM v2 ORDER BY a ASC;
  163. ----
  164. 1 NULL
  165. 2 later
  166. 3 NULL
  167. 4 later
  168. 5 world
  169. 6 later
  170. 7 bar
  171. query ITT
  172. SELECT * FROM v3 ORDER BY a ASC;
  173. ----
  174. 1 NULL NULL
  175. 2 later NULL
  176. 3 NULL NULL
  177. 4 later NULL
  178. 5 world NULL
  179. 6 later 2020-01-01␠00:00:00
  180. 7 bar 1000-01-01␠00:00:00
  181. query IT
  182. SELECT * FROM v4 ORDER BY a ASC;
  183. ----
  184. 1 NULL
  185. 2 NULL
  186. 3 NULL
  187. 4 NULL
  188. 5 NULL
  189. 6 2020-01-01␠00:00:00
  190. 7 1000-01-01␠00:00:00
  191. statement ok
  192. DELETE FROM t1 WHERE b IS NULL;
  193. query I
  194. SELECT * FROM mv1;
  195. ----
  196. 24
  197. query ITT
  198. SELECT * FROM t1 ORDER BY a ASC;
  199. ----
  200. 2 later NULL
  201. 4 later NULL
  202. 5 world NULL
  203. 6 later 2020-01-01␠00:00:00
  204. 7 bar 1000-01-01␠00:00:00
  205. query IT
  206. SELECT * FROM v2 ORDER BY a ASC;
  207. ----
  208. 2 later
  209. 4 later
  210. 5 world
  211. 6 later
  212. 7 bar
  213. query ITT
  214. SELECT * FROM v3 ORDER BY a ASC;
  215. ----
  216. 2 later NULL
  217. 4 later NULL
  218. 5 world NULL
  219. 6 later 2020-01-01␠00:00:00
  220. 7 bar 1000-01-01␠00:00:00
  221. query IT
  222. SELECT * FROM v4 ORDER BY a ASC;
  223. ----
  224. 2 NULL
  225. 4 NULL
  226. 5 NULL
  227. 6 2020-01-01␠00:00:00
  228. 7 1000-01-01␠00:00:00
  229. statement ok
  230. CREATE INDEX v3_idx_full_scan ON v3 (b);
  231. query IIITTT
  232. SELECT v2.a, v3.a, v4.a, v2.b, v3.b, v4.c FROM v2 JOIN v3 ON v2.a = v3.a JOIN v4 ON v2.a = v4.a;
  233. ----
  234. 2 2 2 later later NULL
  235. 4 4 4 later later NULL
  236. 5 5 5 world world NULL
  237. 6 6 6 later later 2020-01-01␠00:00:00
  238. 7 7 7 bar bar 1000-01-01␠00:00:00
  239. query T multiline
  240. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT v2.a, v3.a, v4.a, v2.b, v3.b, v4.c FROM v2 JOIN v3 ON v2.a = v3.a JOIN v4 ON v2.a = v4.a;
  241. ----
  242. Explained Query:
  243. Project (#0{a}, #0{a}, #0{a}, #1{b}, #3{b}, #5{c})
  244. Join on=(#0{a} = #2{a} = #4{a}) type=delta
  245. ArrangeBy keys=[[#0{a}]]
  246. ReadIndex on=v2 v2_idx=[delta join 1st input (full scan)]
  247. ArrangeBy keys=[[#0{a}]]
  248. Project (#0{a}, #1{b})
  249. ReadIndex on=v3 v3_idx_full_scan=[*** full scan ***]
  250. ArrangeBy keys=[[#0{a}]]
  251. Project (#0{a}, #2{c})
  252. ReadStorage materialize.public.t1
  253. Source materialize.public.t1
  254. Used Indexes:
  255. - materialize.public.v2_idx (delta join 1st input (full scan))
  256. - materialize.public.v3_idx_full_scan (*** full scan ***)
  257. Target cluster: quickstart
  258. EOF
  259. # Should be the same results as above.
  260. query IIITTT
  261. SELECT v2.a, v3.a, v4.a, v2.b, v3.b, v4.c FROM v2 JOIN v3 ON v2.a = v3.a JOIN v4 ON v2.a = v4.a;
  262. ----
  263. 2 2 2 later later NULL
  264. 4 4 4 later later NULL
  265. 5 5 5 world world NULL
  266. 6 6 6 later later 2020-01-01␠00:00:00
  267. 7 7 7 bar bar 1000-01-01␠00:00:00
  268. statement ok
  269. DROP INDEX v3_idx_full_scan;
  270. statement ok
  271. CREATE INDEX t1_idx_a ON t1 (a);
  272. query T multiline
  273. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT v2.a, v3.a, v4.a, v2.b, v3.b, v4.c FROM v2 JOIN v3 ON v2.a = v3.a JOIN v4 ON v2.a = v4.a;
  274. ----
  275. Explained Query:
  276. With
  277. cte l0 =
  278. ArrangeBy keys=[[#0{a}]]
  279. ReadIndex on=t1 t1_idx_a=[delta join lookup]
  280. Return
  281. Project (#0{a}, #0{a}, #0{a}, #1{b}, #3{b}, #7{c})
  282. Join on=(#0{a} = #2{a} = #5{a}) type=delta
  283. ArrangeBy keys=[[#0{a}]]
  284. ReadIndex on=v2 v2_idx=[delta join 1st input (full scan)]
  285. Get l0
  286. Get l0
  287. Used Indexes:
  288. - materialize.public.v2_idx (delta join 1st input (full scan))
  289. - materialize.public.t1_idx_a (delta join lookup)
  290. Target cluster: quickstart
  291. EOF
  292. # Should be the same results as above.
  293. query IIITTT
  294. SELECT v2.a, v3.a, v4.a, v2.b, v3.b, v4.c FROM v2 JOIN v3 ON v2.a = v3.a JOIN v4 ON v2.a = v4.a;
  295. ----
  296. 2 2 2 later later NULL
  297. 4 4 4 later later NULL
  298. 5 5 5 world world NULL
  299. 6 6 6 later later 2020-01-01␠00:00:00
  300. 7 7 7 bar bar 1000-01-01␠00:00:00
  301. simple conn=mz_system,user=mz_system
  302. ALTER SYSTEM SET enable_alter_table_add_column = false;
  303. ----
  304. COMPLETE 0
  305. # We should be able to select from existing views even if the feature gets turned off.
  306. query IT
  307. SELECT * FROM v2 ORDER BY a ASC;
  308. ----
  309. 2 later
  310. 4 later
  311. 5 world
  312. 6 later
  313. 7 bar
  314. statement ok
  315. INSERT INTO t1 VALUES (8, 'apple', '2024-09-20'::timestamp);
  316. query IT
  317. SELECT * FROM v2 ORDER BY a ASC;
  318. ----
  319. 2 later
  320. 4 later
  321. 5 world
  322. 6 later
  323. 7 bar
  324. 8 apple
  325. simple conn=mz_system,user=mz_system
  326. ALTER SYSTEM SET enable_alter_table_add_column = true;
  327. ----
  328. COMPLETE 0
  329. statement ok
  330. CREATE VIEW v_on_t2 AS SELECT * FROM t2;
  331. statement ok
  332. ALTER TABLE t2 ADD COLUMN b text;
  333. statement ok
  334. DROP TABLE t1 CASCADE;
  335. query TT
  336. SELECT id, name FROM mz_tables WHERE id LIKE 'u%';
  337. ----
  338. u1 t2
  339. statement ok
  340. COMMENT ON COLUMN t2.a IS 'this column existed originally';
  341. query TTIT
  342. SELECT * FROM mz_internal.mz_comments WHERE id = 'u1';
  343. ----
  344. u1 table 1 this␠column␠existed␠originally
  345. statement ok
  346. ALTER TABLE t2 ADD COLUMN c timestamp;
  347. statement ok
  348. COMMENT ON COLUMN t2.c IS 'added later';
  349. query TTIT rowsort
  350. SELECT * FROM mz_internal.mz_comments WHERE id = 'u1';
  351. ----
  352. u1 table 3 added␠later
  353. u1 table 1 this␠column␠existed␠originally
  354. statement ok
  355. DROP TABLE t2 CASCADE;
  356. query TTIT
  357. SELECT * FROM mz_internal.mz_comments WHERE id = 'u1';
  358. ----