25-schema-changes.td 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  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. > CREATE SECRET mysqlpass AS '${arg.mysql-root-password}'
  10. > CREATE CONNECTION mysql_conn TO MYSQL (
  11. HOST mysql,
  12. USER root,
  13. PASSWORD SECRET mysqlpass
  14. )
  15. $ mysql-connect name=mysql url=mysql://root@mysql password=${arg.mysql-root-password}
  16. $ mysql-execute name=mysql
  17. DROP DATABASE IF EXISTS public;
  18. CREATE DATABASE public;
  19. USE public;
  20. #
  21. # ALTER TABLE <tbl> ADD COLUMN
  22. #
  23. $ mysql-execute name=mysql
  24. CREATE TABLE add_columns (f1 INTEGER);
  25. INSERT INTO add_columns VALUES (1);
  26. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  27. > CREATE TABLE add_columns FROM SOURCE mz_source (REFERENCE public.add_columns);
  28. > SELECT * FROM add_columns;
  29. 1
  30. $ mysql-execute name=mysql
  31. ALTER TABLE add_columns ADD COLUMN f2 varchar(2);
  32. INSERT INTO add_columns VALUES (2, 'ab');
  33. > SELECT * FROM add_columns;
  34. 1
  35. 2
  36. #
  37. # Now remove that added column
  38. #
  39. $ mysql-execute name=mysql
  40. ALTER TABLE add_columns DROP COLUMN f2;
  41. > SELECT * FROM add_columns;
  42. 1
  43. 2
  44. > DROP SOURCE mz_source CASCADE;
  45. #
  46. # ALTER TABLE <tbl> DROP COLUMN
  47. #
  48. $ mysql-execute name=mysql
  49. CREATE TABLE drop_columns (f1 INTEGER, f2 INTEGER);
  50. INSERT INTO drop_columns VALUES (1, 1);
  51. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  52. > CREATE TABLE drop_columns FROM SOURCE mz_source (REFERENCE public.drop_columns);
  53. > SELECT * FROM drop_columns;
  54. 1 1
  55. $ mysql-execute name=mysql
  56. ALTER TABLE drop_columns DROP COLUMN f2;
  57. ! SELECT * FROM drop_columns;
  58. contains:incompatible schema change
  59. > DROP SOURCE mz_source CASCADE;
  60. #
  61. # ALTER TABLE <tbl> MODIFY <col> TYPE
  62. #
  63. $ mysql-execute name=mysql
  64. CREATE TABLE alter_column (f1 INTEGER, f2 VARCHAR(2));
  65. INSERT INTO alter_column VALUES (2, '12');
  66. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  67. > CREATE TABLE alter_column FROM SOURCE mz_source (REFERENCE public.alter_column);
  68. $ mysql-execute name=mysql
  69. ALTER TABLE alter_column MODIFY f2 INT;
  70. INSERT INTO alter_column VALUES (3, 23);
  71. ! SELECT * from alter_column;
  72. contains:incompatible schema change
  73. > DROP SOURCE mz_source CASCADE;
  74. #
  75. # ALTER TABLE reorder column
  76. #
  77. $ mysql-execute name=mysql
  78. CREATE TABLE reorder_column (f1 INTEGER, f2 INTEGER);
  79. INSERT INTO reorder_column VALUES (1, 2);
  80. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  81. > CREATE TABLE reorder_column FROM SOURCE mz_source (REFERENCE public.reorder_column);
  82. $ mysql-execute name=mysql
  83. ALTER TABLE reorder_column MODIFY f1 INT AFTER f2;
  84. INSERT INTO reorder_column VALUES (20, 10);
  85. ! SELECT * from reorder_column;
  86. contains:incompatible schema change
  87. > DROP SOURCE mz_source CASCADE;
  88. #
  89. # ALTER TABLE rename column
  90. #
  91. $ mysql-execute name=mysql
  92. CREATE TABLE rename_column (f1 INTEGER, f2 INTEGER);
  93. INSERT INTO rename_column VALUES (1, 2);
  94. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  95. > CREATE TABLE rename_column FROM SOURCE mz_source (REFERENCE public.rename_column);
  96. $ mysql-execute name=mysql
  97. ALTER TABLE rename_column CHANGE f1 f3 INT;
  98. INSERT INTO rename_column VALUES (10, 20);
  99. ! SELECT * from rename_column;
  100. contains:incompatible schema change
  101. > DROP SOURCE mz_source CASCADE;
  102. #
  103. # ALTER TABLE no column change
  104. #
  105. $ mysql-execute name=mysql
  106. CREATE TABLE no_column_change (f1 INT);
  107. INSERT INTO no_column_change VALUES (1);
  108. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  109. > CREATE TABLE no_column_change FROM SOURCE mz_source (REFERENCE public.no_column_change);
  110. $ mysql-execute name=mysql
  111. ALTER TABLE no_column_change CHANGE f1 f1 INT;
  112. INSERT INTO no_column_change VALUES (10);
  113. > SELECT * from no_column_change;
  114. 1
  115. 10
  116. > DROP SOURCE mz_source CASCADE;
  117. #
  118. # Alter a column type using a fully-qualified name
  119. # to validate our detection of ALTER TABLE <schema>.<table>
  120. #
  121. $ mysql-execute name=mysql
  122. CREATE TABLE alter_column_2 (f1 INTEGER, f2 VARCHAR(2));
  123. INSERT INTO alter_column_2 VALUES (2, '12');
  124. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  125. > CREATE TABLE alter_column_2 FROM SOURCE mz_source (REFERENCE public.alter_column_2);
  126. $ mysql-execute name=mysql
  127. DROP DATABASE IF EXISTS other;
  128. CREATE DATABASE other;
  129. USE other;
  130. ALTER TABLE public.alter_column_2 MODIFY f2 INT;
  131. INSERT INTO public.alter_column_2 VALUES (3, 23);
  132. ! SELECT * from alter_column_2;
  133. contains:incompatible schema change
  134. > DROP SOURCE mz_source CASCADE;
  135. #
  136. # ALTER TABLE <tbl> MODIFY <col> TYPE NON NULLABLE
  137. # Adding a non-null constraint should be allowed
  138. #
  139. $ mysql-execute name=mysql
  140. USE public;
  141. CREATE TABLE alter_column_nullable (f1 INTEGER, f2 VARCHAR(2));
  142. INSERT INTO alter_column_nullable VALUES (2, '12');
  143. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  144. > CREATE TABLE alter_column_nullable FROM SOURCE mz_source (REFERENCE public.alter_column_nullable);
  145. $ mysql-execute name=mysql
  146. ALTER TABLE alter_column_nullable MODIFY f2 VARCHAR(2) NOT NULL;
  147. INSERT INTO alter_column_nullable VALUES (3, '23');
  148. > SELECT * from alter_column_nullable;
  149. 2 12
  150. 3 23
  151. > DROP SOURCE mz_source CASCADE;
  152. #
  153. # ALTER TABLE <tbl> MODIFY <col> TYPE NULLABLE
  154. # Removing a non-null constraint should error
  155. #
  156. $ mysql-execute name=mysql
  157. CREATE TABLE alter_column_nullable_2 (f1 INTEGER, f2 VARCHAR(2) NOT NULL);
  158. INSERT INTO alter_column_nullable_2 VALUES (2, '12');
  159. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  160. > CREATE TABLE alter_column_nullable_2 FROM SOURCE mz_source (REFERENCE public.alter_column_nullable_2);
  161. $ mysql-execute name=mysql
  162. ALTER TABLE alter_column_nullable_2 MODIFY f2 VARCHAR(2);
  163. INSERT INTO alter_column_nullable_2 VALUES (3, '23');
  164. ! SELECT * from alter_column_nullable_2;
  165. contains:incompatible schema change
  166. > DROP SOURCE mz_source CASCADE;
  167. #
  168. # ALTER TABLE <tbl> ADD CONSTRAINT <uq> UNIQUE (col);
  169. # Adding a new unique constraint should be allowed
  170. #
  171. $ mysql-execute name=mysql
  172. CREATE TABLE alter_column_uq (f1 INTEGER, f2 VARCHAR(2));
  173. INSERT INTO alter_column_uq VALUES (2, '12');
  174. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  175. > CREATE TABLE alter_column_uq FROM SOURCE mz_source (REFERENCE public.alter_column_uq);
  176. $ mysql-execute name=mysql
  177. ALTER TABLE alter_column_uq ADD CONSTRAINT uq_f2 UNIQUE (f1);
  178. INSERT INTO alter_column_uq VALUES (3, '23');
  179. > SELECT * from alter_column_uq;
  180. 2 12
  181. 3 23
  182. > DROP SOURCE mz_source CASCADE;
  183. #
  184. # ALTER TABLE <tbl> DROP INDEX <uq>;
  185. # Dropping new unique constraint should error
  186. #
  187. $ mysql-execute name=mysql
  188. CREATE TABLE alter_column_uq_2 (f1 INTEGER, f2 VARCHAR(2));
  189. ALTER TABLE alter_column_uq_2 ADD CONSTRAINT uq_f2 UNIQUE (f1);
  190. INSERT INTO alter_column_uq_2 VALUES (2, '12');
  191. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  192. > CREATE TABLE alter_column_uq_2 FROM SOURCE mz_source (REFERENCE public.alter_column_uq_2);
  193. $ mysql-execute name=mysql
  194. ALTER TABLE alter_column_uq_2 DROP INDEX uq_f2;
  195. INSERT INTO alter_column_uq_2 VALUES (3, '23');
  196. ! SELECT * from alter_column_uq_2;
  197. contains:incompatible schema change
  198. > DROP SOURCE mz_source CASCADE;
  199. #
  200. # ALTER TABLE old_table RENAME new_table
  201. #
  202. $ mysql-execute name=mysql
  203. USE public;
  204. CREATE TABLE alter_table_rename (f1 INTEGER);
  205. INSERT INTO alter_table_rename VALUES (1);
  206. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  207. > CREATE TABLE alter_table_rename FROM SOURCE mz_source (REFERENCE public.alter_table_rename);
  208. $ mysql-execute name=mysql
  209. ALTER TABLE alter_table_rename RENAME TO alter_table_renamed;
  210. ! SELECT * FROM alter_table_rename;
  211. contains:table was dropped
  212. > DROP SOURCE mz_source CASCADE;
  213. #
  214. # RENAME TABLE old_table TO new_table
  215. #
  216. $ mysql-execute name=mysql
  217. CREATE TABLE alter_table_rename_2 (f1 INTEGER);
  218. INSERT INTO alter_table_rename_2 VALUES (1);
  219. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  220. > CREATE TABLE alter_table_rename_2 FROM SOURCE mz_source (REFERENCE public.alter_table_rename_2);
  221. $ mysql-execute name=mysql
  222. RENAME TABLE alter_table_rename_2 TO alter_table_rename_3;
  223. ! SELECT * FROM alter_table_rename_2;
  224. contains:table was dropped
  225. > DROP SOURCE mz_source CASCADE;
  226. #
  227. # DROP TABLE <tbl>
  228. #
  229. $ mysql-execute name=mysql
  230. CREATE TABLE drop_table (f1 INTEGER);
  231. INSERT INTO drop_table VALUES (1);
  232. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  233. > CREATE TABLE drop_table FROM SOURCE mz_source (REFERENCE public.drop_table);
  234. $ mysql-execute name=mysql
  235. DROP TABLE drop_table;
  236. ! SELECT * FROM drop_table;
  237. contains:table was dropped
  238. > DROP SOURCE mz_source CASCADE;
  239. #
  240. # TRUNCATE TABLE <tbl>
  241. #
  242. $ mysql-execute name=mysql
  243. CREATE TABLE trunc_table (f1 INTEGER);
  244. INSERT INTO trunc_table VALUES (1);
  245. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  246. > CREATE TABLE trunc_table FROM SOURCE mz_source (REFERENCE public.trunc_table);
  247. $ mysql-execute name=mysql
  248. TRUNCATE TABLE trunc_table;
  249. ! SELECT * FROM trunc_table;
  250. contains:table was truncated
  251. > DROP SOURCE mz_source CASCADE;
  252. #
  253. # TRUNCATE <tbl>
  254. #
  255. $ mysql-execute name=mysql
  256. CREATE TABLE trunc_table_2 (f1 INTEGER);
  257. INSERT INTO trunc_table_2 VALUES (1);
  258. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  259. > CREATE TABLE trunc_table_2 FROM SOURCE mz_source (REFERENCE public.trunc_table_2);
  260. $ mysql-execute name=mysql
  261. TRUNCATE trunc_table_2;
  262. ! SELECT * FROM trunc_table_2;
  263. contains:table was truncated
  264. > DROP SOURCE mz_source CASCADE;