alter-table-after-source.td 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  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. $ set-sql-timeout duration=60s
  10. # TODO(def-) Reenable when database-issues#7900 is fixed
  11. $ skip-if
  12. SELECT true
  13. #
  14. # Test ALTER TABLE -- source will error out for tables which existed when the source was created
  15. #
  16. > CREATE SECRET mysqlpass AS '${arg.mysql-root-password}'
  17. > CREATE CONNECTION mysql_conn TO MYSQL (
  18. HOST mysql,
  19. USER root,
  20. PASSWORD SECRET mysqlpass
  21. )
  22. $ mysql-connect name=mysql url=mysql://root@mysql password=${arg.mysql-root-password}
  23. $ mysql-execute name=mysql
  24. DROP DATABASE IF EXISTS public;
  25. CREATE DATABASE public;
  26. USE public;
  27. CREATE TABLE add_columns (f1 INTEGER);
  28. INSERT INTO add_columns VALUES (1);
  29. CREATE TABLE remove_column (f1 INTEGER, f2 VARCHAR(2));
  30. INSERT INTO remove_column VALUES (2, 'ab');
  31. CREATE TABLE alter_column_type_1 (f1 INTEGER, f2 VARCHAR(2));
  32. INSERT INTO alter_column_type_1 VALUES (2, 'ab');
  33. CREATE TABLE alter_column_type_2 (f1 TINYINT);
  34. INSERT INTO alter_column_type_2 VALUES (2);
  35. CREATE TABLE alter_drop_nullability (f1 INTEGER NOT NULL);
  36. INSERT INTO alter_drop_nullability VALUES (1);
  37. CREATE TABLE alter_add_nullability (f1 INTEGER);
  38. INSERT INTO alter_add_nullability VALUES (1);
  39. CREATE TABLE alter_drop_pk (f1 INTEGER PRIMARY KEY);
  40. INSERT INTO alter_drop_pk VALUES (1);
  41. CREATE TABLE alter_add_pk (f1 INTEGER);
  42. INSERT INTO alter_add_pk VALUES (1);
  43. CREATE TABLE alter_cycle_pk (f1 INTEGER PRIMARY KEY);
  44. INSERT INTO alter_cycle_pk VALUES (1);
  45. CREATE TABLE alter_cycle_pk_off (f1 INTEGER);
  46. INSERT INTO alter_cycle_pk_off VALUES (1);
  47. CREATE TABLE alter_drop_unique (f1 INTEGER UNIQUE);
  48. INSERT INTO alter_drop_unique VALUES (1);
  49. CREATE TABLE alter_add_unique (f1 INTEGER);
  50. INSERT INTO alter_add_unique VALUES (1);
  51. CREATE TABLE alter_extend_column (f1 VARCHAR(2));
  52. INSERT INTO alter_extend_column VALUES ('ab');
  53. CREATE TABLE alter_decimal (f1 DECIMAL(5,2));
  54. INSERT INTO alter_decimal VALUES (123.45);
  55. CREATE TABLE alter_table_rename (f1 INTEGER);
  56. INSERT INTO alter_table_rename VALUES (1);
  57. CREATE TABLE alter_table_rename_column (f1 VARCHAR(10), f2 VARCHAR(10));
  58. INSERT INTO alter_table_rename_column (f1, f2) VALUES ('f1_orig','f2_orig');
  59. CREATE TABLE alter_table_change_attnum (f1 VARCHAR(10), f2 VARCHAR(10));
  60. INSERT INTO alter_table_change_attnum (f1, f2) VALUES ('f1_orig','f2_orig');
  61. CREATE TABLE alter_table_supported (f1 int, f2 int);
  62. INSERT INTO alter_table_supported (f1, f2) VALUES (1, 1);
  63. CREATE TABLE truncate_table (f1 int, f2 int);
  64. INSERT INTO truncate_table (f1, f2) VALUES (1, 1);
  65. CREATE TABLE drop_table (f1 int, f2 int);
  66. INSERT INTO drop_table (f1, f2) VALUES (1, 1);
  67. > CREATE SOURCE mz_source
  68. FROM MYSQL CONNECTION mysql_conn
  69. FOR ALL TABLES;
  70. #
  71. # Add column
  72. > SELECT * FROM add_columns;
  73. 1
  74. $ mysql-execute name=mysql
  75. ALTER TABLE add_columns ADD COLUMN f2 varchar(2);
  76. INSERT INTO add_columns VALUES (2, 'ab');
  77. > SELECT * from add_columns;
  78. 1
  79. 2
  80. #
  81. # Remove column
  82. > SELECT * FROM remove_column;
  83. 2 ab
  84. $ mysql-execute name=mysql
  85. ALTER TABLE remove_column DROP COLUMN f2;
  86. INSERT INTO remove_column VALUES (3);
  87. ! select * from remove_column;
  88. contains:incompatible schema change
  89. #
  90. # Alter column type
  91. > SELECT * from alter_column_type_1;
  92. 2 ab
  93. $ mysql-execute name=mysql
  94. UPDATE alter_column_type_1 SET f2 = '12';
  95. ALTER TABLE alter_column_type_1 MODIFY f2 int;
  96. INSERT INTO alter_column_type_1 VALUES (3, 23);
  97. ! select * from alter_column_type_1;
  98. contains:incompatible schema change
  99. > SELECT * from alter_column_type_2;
  100. 2
  101. $ mysql-execute name=mysql
  102. ALTER TABLE alter_column_type_2 MODIFY f1 int;
  103. INSERT INTO alter_column_type_2 VALUES (2048);
  104. ! select * from alter_column_type_2;
  105. contains:incompatible schema change
  106. #
  107. # Drop NOT NULL
  108. > SELECT * from alter_drop_nullability
  109. 1
  110. $ mysql-execute name=mysql
  111. ALTER TABLE alter_drop_nullability MODIFY f1 INTEGER;
  112. INSERT INTO alter_drop_nullability VALUES (NULL);
  113. ! SELECT * FROM alter_drop_nullability WHERE f1 IS NOT NULL;
  114. contains:incompatible schema change
  115. # We have guaranteed that this column is not null so the optimizer eagerly
  116. # returns the empty set.
  117. > SELECT * FROM alter_drop_nullability WHERE f1 IS NULL;
  118. #
  119. # Add NOT NULL
  120. > SELECT * from alter_add_nullability
  121. 1
  122. $ mysql-execute name=mysql
  123. ALTER TABLE alter_add_nullability MODIFY f1 INTEGER NOT NULL;
  124. INSERT INTO alter_add_nullability VALUES (1);
  125. > select * from alter_add_nullability;
  126. 1
  127. 1
  128. # TODO: database-issues#7475 (changes to columns)
  129. # ? EXPLAIN SELECT * FROM alter_add_nullability WHERE f1 IS NULL;
  130. # Explained Query (fast path):
  131. # Constant <empty>
  132. #
  133. # Drop PK
  134. > SELECT * from alter_drop_pk
  135. 1
  136. $ mysql-execute name=mysql
  137. ALTER TABLE alter_drop_pk DROP PRIMARY KEY;
  138. INSERT INTO alter_drop_pk VALUES (1);
  139. ! SELECT f1 FROM alter_drop_pk;
  140. contains:incompatible schema change
  141. #
  142. # Add PK
  143. > SELECT * from alter_add_pk
  144. 1
  145. $ mysql-execute name=mysql
  146. ALTER TABLE alter_add_pk ADD PRIMARY KEY(f1);
  147. INSERT INTO alter_add_pk VALUES (2);
  148. > SELECT * FROM alter_add_pk;
  149. 1
  150. 2
  151. #
  152. # Cycle PK
  153. > SELECT * from alter_cycle_pk
  154. 1
  155. $ mysql-execute name=mysql
  156. ALTER TABLE alter_cycle_pk DROP PRIMARY KEY;
  157. ALTER TABLE alter_cycle_pk ADD PRIMARY KEY(f1);
  158. INSERT INTO alter_cycle_pk VALUES (2);
  159. ! SELECT * FROM alter_cycle_pk;
  160. contains:incompatible schema change
  161. #
  162. # Cycle PK off (no pk, pk, no pk)
  163. > SELECT * from alter_cycle_pk_off
  164. 1
  165. $ mysql-execute name=mysql
  166. ALTER TABLE alter_cycle_pk_off ADD PRIMARY KEY(f1);
  167. ALTER TABLE alter_cycle_pk_off DROP PRIMARY KEY;
  168. INSERT INTO alter_cycle_pk_off VALUES (1);
  169. > SELECT * FROM alter_cycle_pk_off;
  170. 1
  171. 1
  172. #
  173. # Drop unique
  174. > SELECT * from alter_drop_unique
  175. 1
  176. $ mysql-execute name=mysql
  177. ALTER TABLE alter_drop_unique DROP INDEX f1;
  178. INSERT INTO alter_drop_unique VALUES (1);
  179. ! SELECT f1 FROM alter_drop_unique;
  180. contains:incompatible schema change
  181. #
  182. # Add unique
  183. > SELECT * from alter_add_unique
  184. 1
  185. $ mysql-execute name=mysql
  186. ALTER TABLE alter_add_unique MODIFY f1 INTEGER UNIQUE;
  187. INSERT INTO alter_add_unique VALUES (2);
  188. > SELECT * FROM alter_add_unique;
  189. 1
  190. 2
  191. #
  192. # Extend column
  193. > SELECT * from alter_extend_column
  194. ab
  195. $ mysql-execute name=mysql
  196. ALTER TABLE alter_extend_column MODIFY f1 VARCHAR(20);
  197. INSERT INTO alter_extend_column VALUES ('abcd');
  198. ! SELECT * FROM alter_extend_column;
  199. contains:incompatible schema change
  200. #
  201. # Alter decimal
  202. > SELECT * from alter_decimal
  203. 123.45
  204. $ mysql-execute name=mysql
  205. ALTER TABLE alter_decimal MODIFY COLUMN f1 DECIMAL(6,1);
  206. INSERT INTO alter_decimal VALUES (12345.6);
  207. ! SELECT * FROM alter_decimal;
  208. contains:altered
  209. #
  210. # Alter table rename
  211. > SELECT * from alter_table_rename;
  212. 1
  213. $ mysql-execute name=mysql
  214. ALTER TABLE alter_table_rename RENAME TO alter_table_renamed;
  215. INSERT INTO alter_table_renamed VALUES (2);
  216. ! SELECT * FROM alter_table_rename;
  217. contains:table was dropped
  218. $ mysql-execute name=mysql
  219. INSERT INTO alter_table_renamed VALUES (3);
  220. ! SELECT * FROM alter_table_renamed;
  221. contains:unknown
  222. #
  223. # Alter table rename colum
  224. > SELECT * FROM alter_table_rename_column;
  225. f1_orig f2_orig
  226. $ mysql-execute name=mysql
  227. # use CHANGE instead of RENAME COLUMN f1 TO f3 to be compatible with MySQL 5.7
  228. ALTER TABLE alter_table_rename_column CHANGE f1 f3 varchar(10);
  229. ALTER TABLE alter_table_rename_column CHANGE f2 f1 varchar(10);
  230. ALTER TABLE alter_table_rename_column CHANGE f3 f2 varchar(10);
  231. INSERT INTO alter_table_rename_column (f1, f2) VALUES ('f1_renamed', 'f2_renamed');
  232. ! SELECT * FROM alter_table_rename_column;
  233. contains:incompatible schema change
  234. # Change column attnum
  235. > SELECT * from alter_table_change_attnum;
  236. f1_orig f2_orig
  237. # Ensure simpl name swap doesn't fool schema detection
  238. $ mysql-execute name=mysql
  239. ALTER TABLE alter_table_change_attnum DROP COLUMN f2;
  240. ALTER TABLE alter_table_change_attnum ADD COLUMN f2 VARCHAR(10);
  241. INSERT INTO alter_table_change_attnum (f1, f2) VALUES ('f1_changed', 'f2_changed');
  242. ! SELECT * FROM alter_table_change_attnum;
  243. contains:incompatible schema change
  244. > SELECT * from alter_table_supported;
  245. 1 1
  246. $ mysql-execute name=mysql
  247. ALTER TABLE alter_table_supported ADD COLUMN f3 int;
  248. INSERT INTO alter_table_supported (f1, f2, f3) VALUES (2, 2, 2);
  249. > SELECT * from alter_table_supported;
  250. 1 1
  251. 2 2
  252. $ mysql-execute name=mysql
  253. ALTER TABLE alter_table_supported DROP COLUMN f3;
  254. INSERT INTO alter_table_supported (f1, f2) VALUES (3, 3);
  255. > SELECT * from alter_table_supported;
  256. 1 1
  257. 2 2
  258. 3 3
  259. $ mysql-execute name=mysql
  260. ALTER TABLE alter_table_supported DROP COLUMN f2;
  261. INSERT INTO alter_table_supported (f1) VALUES (1);
  262. ! SELECT * from alter_table_supported;
  263. contains:incompatible schema change
  264. #
  265. # Truncate table
  266. > SELECT * from truncate_table;
  267. 1 1
  268. $ mysql-execute name=mysql
  269. TRUNCATE truncate_table;
  270. ! SELECT * FROM truncate_table;
  271. contains: table was truncated
  272. #
  273. # Drop table
  274. > SELECT * from drop_table;
  275. 1 1
  276. $ mysql-execute name=mysql
  277. DROP TABLE drop_table;
  278. # TODO: redesign ceased status database-issues#7687
  279. # > SELECT status FROM mz_internal.mz_source_statuses WHERE name = 'drop_table';
  280. # ceased
  281. # this should not brick the whole source
  282. > SELECT status FROM mz_internal.mz_source_statuses WHERE name = 'mz_source';
  283. running
  284. # the subsources are in a bad state so we need to drop the source so the
  285. # restart check doesn't error
  286. > DROP SOURCE mz_source CASCADE;