mysql-cdc.td 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  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=1s
  10. > CREATE SECRET mysqlpass AS '${arg.mysql-root-password}'
  11. # TODO: database-issues#7490 (misleading error message)
  12. # ! CREATE CONNECTION mysql_conn TO MYSQL (
  13. # HOST mysql,
  14. # USER root,
  15. # PASSWORD SECRET mysqlpass
  16. # BROKER '${testdrive.kafka-addr}'
  17. # )
  18. # contains:mysql connections do not support BROKER values
  19. > CREATE CONNECTION mysql_conn TO MYSQL (
  20. HOST mysql,
  21. USER root,
  22. PASSWORD SECRET mysqlpass
  23. )
  24. > CREATE CLUSTER cdc_cluster SIZE '${arg.default-replica-size}'
  25. $ mysql-connect name=mysql url=mysql://root@mysql password=${arg.mysql-root-password}
  26. $ mysql-execute name=mysql
  27. DROP DATABASE IF EXISTS public;
  28. CREATE DATABASE public;
  29. USE public;
  30. CREATE TABLE pk_table (pk INTEGER PRIMARY KEY, f2 TEXT);
  31. INSERT INTO pk_table VALUES (1, 'one');
  32. INSERT INTO pk_table VALUES (2, 'two');
  33. INSERT INTO pk_table VALUES (3, 'three');
  34. CREATE TABLE nonpk_table (f1 INTEGER, f2 INTEGER);
  35. INSERT INTO nonpk_table VALUES (1, 1), (1, 1);
  36. INSERT INTO nonpk_table VALUES (2, 2), (2, 2);
  37. # no range types in MySQL
  38. CREATE TABLE types_table (char_col char(3), date_col DATE, time_col TIME, timestamp_col TIMESTAMP, uuid_col VARCHAR(36), double_col DOUBLE PRECISION, numeric_col DECIMAL(8,4));
  39. INSERT INTO types_table VALUES ('foo', '2011-11-11', '11:11:11', '2011-11-11 11:11:11', 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', 1234.56768, 1234.5678);
  40. # no array_types_table: MySQL does not support array types
  41. # needed for MySQL 5.7
  42. SET GLOBAL max_allowed_packet=67108864;
  43. # reconnect after setting the max_allowed_packet var
  44. $ mysql-connect name=mysql url=mysql://root@mysql password=${arg.mysql-root-password}
  45. $ mysql-execute name=mysql
  46. USE public;
  47. # explicitly set the value to have the same across different versions of MySQL
  48. ALTER DATABASE public CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
  49. CREATE TABLE mysql_version (version TEXT);
  50. INSERT INTO mysql_version SELECT version();
  51. CREATE TABLE large_text (f1 LONGTEXT, f2 LONGTEXT, f3 TEXT);
  52. INSERT INTO large_text VALUES (REPEAT('x', 16 * 1024 * 1024), REPEAT('y', 1 * 1024 * 1024), REPEAT('z', 65535));
  53. INSERT INTO large_text VALUES (REPEAT('a', 3 * 1024 * 1024), REPEAT('b', 2 * 1024 * 1024), REPEAT('c', 65535));
  54. CREATE TABLE trailing_space_pk (f1 VARCHAR(32) PRIMARY KEY);
  55. INSERT INTO trailing_space_pk VALUES ('abc ');
  56. CREATE TABLE trailing_space_nopk (f1 TEXT);
  57. INSERT INTO trailing_space_nopk VALUES ('abc ');
  58. CREATE TABLE multipart_pk(f1 INTEGER, f2 VARCHAR(32), f3 TEXT, PRIMARY KEY (f1, f2));
  59. INSERT INTO multipart_pk VALUES (1, 'abc', 'xyz');
  60. CREATE TABLE nulls_table (f1 TEXT, f2 INTEGER);
  61. INSERT INTO nulls_table VALUES (NULL, NULL);
  62. CREATE TABLE utf8_table (f1 VARCHAR(32) PRIMARY KEY, f2 TEXT);
  63. INSERT INTO utf8_table VALUES ('това е текст', 'това ''е'' "текст"');
  64. CREATE TABLE no_replica_identity (f1 INTEGER);
  65. INSERT INTO no_replica_identity VALUES (1), (2);
  66. CREATE TABLE `таблица` (`колона` TEXT);
  67. INSERT INTO `таблица` VALUES ('стойност');
  68. CREATE TABLE `"literal_quotes"` (a TEXT);
  69. INSERT INTO `"literal_quotes"` VALUES ('v');
  70. CREATE TABLE `create` (a TEXT);
  71. INSERT INTO `create` VALUES ('v');
  72. CREATE TABLE escaped_text_table (f1 TEXT, f2 TEXT);
  73. INSERT INTO escaped_text_table VALUES ('escaped\\ntext\\twith\\nnewlines\\tand\\ntabs', 'more\\tescaped\\ntext');
  74. INSERT INTO escaped_text_table VALUES ('second\\nrow\\twith\\tmore\\ttabs', 'and\\nmore\\n\\nnewlines\\n');
  75. CREATE TABLE mixED_CAse (spECialCase INTEGER);
  76. INSERT INTO mixED_CAse VALUES (1), (2);
  77. CREATE TABLE conflict_table (f1 INTEGER);
  78. INSERT INTO conflict_table VALUES (123);
  79. DROP SCHEMA IF EXISTS conflict_schema;
  80. CREATE SCHEMA conflict_schema;
  81. CREATE TABLE conflict_schema.conflict_table (f1 TEXT);
  82. INSERT INTO conflict_schema.conflict_table VALUES ('234');
  83. CREATE TABLE `space table` (`space column` INTEGER);
  84. CREATE TABLE enum_table (a ENUM ('var0', 'var1'));
  85. INSERT INTO enum_table VALUES ('var1'), ('var0');
  86. CREATE TABLE another_enum_table (`колона` ENUM ('var2', 'var3'));
  87. INSERT INTO another_enum_table VALUES ('var2'), ('var3');
  88. CREATE TABLE conflict_schema.another_enum_table (`колона` ENUM ('var2', 'var3'));
  89. INSERT INTO conflict_schema.another_enum_table VALUES ('var2'), ('var3');
  90. DROP SCHEMA IF EXISTS another_schema;
  91. CREATE SCHEMA another_schema;
  92. CREATE TABLE another_schema.another_table (f1 TEXT);
  93. INSERT INTO another_schema.another_table VALUES ('123');
  94. # Sneak in a test for mysql_source_snapshot_max_execution_time
  95. $ postgres-connect name=mz_system url=postgres://mz_system:materialize@${testdrive.materialize-internal-sql-addr}
  96. $ postgres-execute connection=mz_system
  97. ALTER SYSTEM SET mysql_source_snapshot_max_execution_time = 1000
  98. > CREATE SOURCE "test_slot_source"
  99. IN CLUSTER cdc_cluster
  100. FROM MYSQL CONNECTION mysql_conn
  101. FOR TABLES (public.pk_table);
  102. > SHOW SUBSOURCES ON test_slot_source
  103. pk_table subsource
  104. test_slot_source_progress progress
  105. > DROP SOURCE test_slot_source CASCADE;
  106. $ postgres-execute connection=mz_system
  107. ALTER SYSTEM SET mysql_source_snapshot_max_execution_time = 0
  108. # Validate mysql_source_snapshot_lock_wait_timeout
  109. $ postgres-connect name=mz_system url=postgres://mz_system:materialize@${testdrive.materialize-internal-sql-addr}
  110. $ postgres-execute connection=mz_system
  111. ALTER SYSTEM SET mysql_source_snapshot_lock_wait_timeout = 1
  112. $ mysql-execute name=mysql
  113. USE public;
  114. BEGIN;
  115. INSERT INTO pk_table VALUES (4, 'four');
  116. > CREATE SOURCE "test_slot_source"
  117. IN CLUSTER cdc_cluster
  118. FROM MYSQL CONNECTION mysql_conn
  119. FOR TABLES (public.pk_table);
  120. > SELECT status FROM mz_internal.mz_source_statuses WHERE name = 'test_slot_source';
  121. stalled
  122. $ mysql-execute name=mysql
  123. ROLLBACK;
  124. > SELECT status FROM mz_internal.mz_source_statuses WHERE name = 'test_slot_source';
  125. running
  126. > DROP SOURCE test_slot_source CASCADE;
  127. $ postgres-execute connection=mz_system
  128. ALTER SYSTEM SET mysql_source_snapshot_lock_wait_timeout = 3600
  129. #
  130. # Error checking
  131. #
  132. ! CREATE CONNECTION no_such_host TO MYSQL (
  133. HOST 'no_such_mysql.mtrlz.com',
  134. USER root,
  135. PASSWORD SECRET mysqlpass
  136. )
  137. contains:failed to lookup address information
  138. # TODO: database-issues#7490 (misleading error message)
  139. # contains:error connecting to server: failed to lookup address information: Name or service not known: failed to lookup address
  140. ! CREATE CONNECTION no_such_port TO MYSQL (
  141. HOST mysql,
  142. PORT 65534,
  143. USER root,
  144. PASSWORD SECRET mysqlpass
  145. )
  146. contains:Connection refused
  147. # TODO: database-issues#7490 (misleading error message)
  148. # contains:error connecting to server: Connection refused
  149. # TODO: database-issues#7587 (error not stable)
  150. # ! CREATE CONNECTION no_such_user TO MYSQL (
  151. # HOST mysql,
  152. # USER no_such_user,
  153. # PASSWORD SECRET mysqlpass
  154. # )
  155. # TODO: database-issues#7490 (misleading error message)
  156. # contains:password authentication failed for user "no_such_user"
  157. > CREATE SECRET badpass AS 'badpass'
  158. ! CREATE CONNECTION no_such_password TO MYSQL (
  159. HOST mysql,
  160. USER root,
  161. PASSWORD SECRET badpass
  162. )
  163. contains:Access denied for user 'root'
  164. $ postgres-execute connection=postgres://mz_system:materialize@${testdrive.materialize-internal-sql-addr}
  165. ALTER SYSTEM SET storage_enforce_external_addresses = true
  166. ! CREATE CONNECTION private_address TO MYSQL (
  167. HOST mysql,
  168. USER root,
  169. PASSWORD SECRET mysqlpass
  170. )
  171. contains:Address resolved to a private IP
  172. $ postgres-execute connection=postgres://mz_system:materialize@${testdrive.materialize-internal-sql-addr}
  173. ALTER SYSTEM SET storage_enforce_external_addresses = false
  174. ! CREATE SOURCE "mz_source"
  175. IN CLUSTER cdc_cluster
  176. FROM MYSQL CONNECTION mysql_conn
  177. FOR TABLES (
  178. public."enum_table"
  179. );
  180. contains:referenced tables use unsupported types
  181. ! CREATE SOURCE "mz_source"
  182. IN CLUSTER cdc_cluster
  183. FROM MYSQL CONNECTION mysql_conn
  184. FOR TABLES (
  185. public."enum_table",
  186. public.another_enum_table
  187. );
  188. contains:referenced tables use unsupported types
  189. ! CREATE SOURCE mz_source
  190. IN CLUSTER cdc_cluster
  191. FROM MYSQL CONNECTION mysql_conn (
  192. PUBLICATION 'mz_source'
  193. )
  194. FOR TABLES (
  195. public.pk_table
  196. );
  197. contains: found PUBLICATION
  198. ! CREATE SOURCE mz_source
  199. IN CLUSTER cdc_cluster
  200. FROM MYSQL CONNECTION mysql_conn (
  201. DETAILS 'abc'
  202. )
  203. FOR TABLES (
  204. public.pk_table
  205. );
  206. contains: CREATE SOURCE specifies DETAILS option
  207. #
  208. # Establish direct replication
  209. #
  210. #
  211. # Note: This implicitly tests that enum_table being part of the publication does not
  212. # prevent us from using other tables as subsources.
  213. #
  214. > CREATE SOURCE "mz_source"
  215. IN CLUSTER cdc_cluster
  216. FROM MYSQL CONNECTION mysql_conn
  217. FOR TABLES (
  218. public."pk_table",
  219. public."nonpk_table",
  220. public."types_table",
  221. public."large_text",
  222. public."trailing_space_pk",
  223. public."trailing_space_nopk",
  224. public."multipart_pk",
  225. public."nulls_table",
  226. public."utf8_table",
  227. public."escaped_text_table",
  228. public."mixED_CAse",
  229. conflict_schema.conflict_table AS public.conflict_table,
  230. public."create",
  231. public."space table",
  232. public."таблица",
  233. public."""literal_quotes"""
  234. );
  235. > SHOW SOURCES
  236. conflict_table subsource cdc_cluster ""
  237. create subsource cdc_cluster ""
  238. escaped_text_table subsource cdc_cluster ""
  239. large_text subsource cdc_cluster ""
  240. mixED_CAse subsource cdc_cluster ""
  241. multipart_pk subsource cdc_cluster ""
  242. mz_source mysql cdc_cluster ""
  243. mz_source_progress progress <null> ""
  244. nonpk_table subsource cdc_cluster ""
  245. nulls_table subsource cdc_cluster ""
  246. pk_table subsource cdc_cluster ""
  247. trailing_space_nopk subsource cdc_cluster ""
  248. trailing_space_pk subsource cdc_cluster ""
  249. types_table subsource cdc_cluster ""
  250. utf8_table subsource cdc_cluster ""
  251. "\"literal_quotes\"" subsource cdc_cluster ""
  252. "space table" subsource cdc_cluster ""
  253. таблица subsource cdc_cluster ""
  254. > SELECT schema_name, table_name FROM mz_internal.mz_mysql_source_tables
  255. public create
  256. public pk_table
  257. public large_text
  258. public utf8_table
  259. public nonpk_table
  260. public types_table
  261. public nulls_table
  262. public multipart_pk
  263. public "\"mixED_CAse\""
  264. public "\"space table\""
  265. public "\"таблица\""
  266. public trailing_space_pk
  267. public escaped_text_table
  268. public trailing_space_nopk
  269. public "\"\"\"literal_quotes\"\"\""
  270. conflict_schema conflict_table
  271. > SELECT status FROM mz_internal.mz_source_statuses WHERE name = 'mz_source';
  272. running
  273. > SELECT status FROM mz_internal.mz_source_statuses WHERE name = 'mz_source_progress';
  274. running
  275. > SELECT count(*) FROM mz_source_progress WHERE transaction_id > 0
  276. 1
  277. # There is no such thing like mz_internal.mz_mysql_sources because MySQL does not have replication slots.
  278. #
  279. # Perform sanity checks of the initial snapshot
  280. #
  281. > SELECT * FROM pk_table;
  282. 1 one
  283. 2 two
  284. 3 three
  285. > SELECT * FROM nonpk_table;
  286. 1 1
  287. 1 1
  288. 2 2
  289. 2 2
  290. > SELECT * FROM types_table;
  291. "foo" "2011-11-11" "11:11:11" "2011-11-11 11:11:11" "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11" "1234.56768" "1234.5678"
  292. > SELECT pg_typeof(numeric_col) FROM types_table;
  293. "numeric"
  294. # no array_types_table: MySQL does not support array types
  295. > SELECT LENGTH(f1), LENGTH(f2) FROM large_text;
  296. 16777216 1048576
  297. 3145728 2097152
  298. > SELECT LENGTH(f1), f1 FROM trailing_space_pk;
  299. "6" "abc "
  300. > SELECT LENGTH(f1), f1 FROM trailing_space_nopk;
  301. "6" "abc "
  302. > SELECT * FROM multipart_pk;
  303. 1 abc xyz
  304. > SELECT f1, f2, f1 IS NULL, f2 IS NULL FROM nulls_table;
  305. <null> <null> true true
  306. > SELECT * FROM utf8_table;
  307. "това е текст" "това \'е\' \"текст\""
  308. > SELECT * FROM "таблица";
  309. стойност
  310. > SELECT * FROM escaped_text_table;
  311. "escaped\\ntext\\twith\\nnewlines\\tand\\ntabs" "more\\tescaped\\ntext"
  312. "second\\nrow\\twith\\tmore\\ttabs" "and\\nmore\\n\\nnewlines\\n"
  313. > SELECT * FROM conflict_table;
  314. 234
  315. > SELECT * FROM """literal_quotes"""
  316. v
  317. > SELECT * FROM "create"
  318. v
  319. > SELECT * FROM "mixED_CAse"
  320. 1
  321. 2
  322. #
  323. # Confirm that the new sources can be used to build upon
  324. #
  325. > CREATE MATERIALIZED VIEW join_view (a, b, c, d) AS SELECT * FROM pk_table, nonpk_table WHERE pk_table.pk = nonpk_table.f1;
  326. > SELECT * FROM join_view;
  327. "1" "one" "1" "1"
  328. "1" "one" "1" "1"
  329. "2" "two" "2" "2"
  330. "2" "two" "2" "2"
  331. #
  332. # Basic sanity check that the timestamps are reasonable
  333. #
  334. > SELECT COUNT(*) > 0 FROM pk_table;
  335. true
  336. > SELECT COUNT(*) > 0 FROM nonpk_table;
  337. true
  338. > SELECT COUNT(*) > 0 FROM join_view;
  339. true
  340. #
  341. # Modify the tables on the MySQL side
  342. #
  343. $ mysql-execute name=mysql
  344. INSERT INTO pk_table VALUES (4, 'four');
  345. INSERT INTO pk_table VALUES (5, 'five');
  346. DELETE FROM pk_table WHERE pk = 1;
  347. UPDATE pk_table SET f2 = 'two_two' WHERE pk = 2;
  348. UPDATE pk_table SET pk = pk + 10 WHERE pk BETWEEN 3 AND 4;
  349. INSERT INTO nonpk_table VALUES (3, 3), (3, 3);
  350. DELETE FROM nonpk_table WHERE f1 = 1 LIMIT 1;
  351. UPDATE nonpk_table SET f1 = f1 + 10 WHERE f1 = 1;
  352. UPDATE nonpk_table SET f1 = f1 + 100 WHERE f1 = 3;
  353. INSERT INTO types_table VALUES ('foo', '2011-11-11', '11:11:11', '2011-11-11 11:11:11', 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', 1234.56768, 1234.5678);
  354. INSERT INTO large_text VALUES (REPEAT('x', 16 * 1024 * 1024), 'abc', 'abc');
  355. INSERT INTO trailing_space_pk VALUES ('klm ');
  356. UPDATE trailing_space_pk SET f1 = 'xyz ' WHERE f1 = 'klm ';
  357. DELETE FROM trailing_space_pk WHERE f1 = 'abc ';
  358. INSERT INTO trailing_space_nopk VALUES ('klm ');
  359. UPDATE trailing_space_nopk SET f1 = 'xyz ' WHERE f1 = 'klm ';
  360. DELETE FROM trailing_space_nopk WHERE f1 = 'abc ';
  361. INSERT INTO multipart_pk VALUES (2, 'klm', 'xyz');
  362. DELETE FROM multipart_pk WHERE f1 = 1;
  363. UPDATE nulls_table SET f2 = 3 WHERE f2 IS NULL;
  364. INSERT INTO nulls_table VALUES (NULL, 1), (NULL, 2);
  365. UPDATE nulls_table SET f2 = NULL WHERE f2 = 2;
  366. INSERT INTO utf8_table VALUES ('това е текст 2', 'това ''е'' "текст" 2');
  367. UPDATE utf8_table SET f1 = concat(f1, f1), f2 = concat(f2, f2);
  368. INSERT INTO `таблица` SELECT * FROM `таблица`;
  369. INSERT INTO mixED_CAse SELECT * FROM mixED_CAse;
  370. #
  371. # Check the updated data on the Materialize side
  372. #
  373. > SELECT * FROM pk_table;
  374. 13 three
  375. 14 four
  376. 2 two_two
  377. 5 five
  378. > SELECT * FROM nonpk_table;
  379. 103 3
  380. 103 3
  381. 11 1
  382. 2 2
  383. 2 2
  384. > SELECT * FROM types_table;
  385. "foo" "2011-11-11" "11:11:11" "2011-11-11 11:11:11" "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11" "1234.56768" "1234.5678"
  386. "foo" "2011-11-11" "11:11:11" "2011-11-11 11:11:11" "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11" "1234.56768" "1234.5678"
  387. > SELECT LENGTH(f1), LENGTH(f2), LENGTH(f3) FROM large_text;
  388. 16777216 1048576 65535
  389. 3145728 2097152 65535
  390. 16777216 3 3
  391. > SELECT LENGTH(f1), f1 FROM trailing_space_pk;
  392. "6" "xyz "
  393. > SELECT LENGTH(f1), f1 FROM trailing_space_nopk;
  394. "6" "xyz "
  395. > SELECT * FROM multipart_pk;
  396. "2" "klm" "xyz"
  397. > SELECT f1, f2, f1 IS NULL, f2 IS NULL FROM nulls_table;
  398. "<null>" "1" "true" "false"
  399. "<null>" "3" "true" "false"
  400. "<null>" "<null>" "true" "true"
  401. > SELECT * FROM utf8_table;
  402. "това е текст 2това е текст 2" "това \'е\' \"текст\" 2това \'е\' \"текст\" 2"
  403. "това е тексттова е текст" "това \'е\' \"текст\"това \'е\' \"текст\""
  404. > SELECT * FROM "таблица";
  405. стойност
  406. стойност
  407. > SELECT * FROM "mixED_CAse";
  408. 1
  409. 2
  410. 1
  411. 2
  412. > SELECT * FROM join_view;
  413. "2" "two_two" "2" "2"
  414. "2" "two_two" "2" "2"
  415. #
  416. # Check that the timestamps continue to be reasonable in the face of incoming updates
  417. #
  418. > SELECT COUNT(*) > 0 FROM pk_table;
  419. true
  420. > SELECT COUNT(*) > 0 FROM nonpk_table;
  421. true
  422. > SELECT COUNT(*) > 0 FROM join_view;
  423. true
  424. #
  425. # Ensure we can start a source with more workers
  426. #
  427. > CREATE CLUSTER large_cluster SIZE '16';
  428. > CREATE SOURCE large_cluster_source
  429. IN CLUSTER large_cluster
  430. FROM MYSQL CONNECTION mysql_conn
  431. FOR TABLES (public."pk_table" AS large_cluster_source_pk_table);
  432. > SELECT * FROM large_cluster_source_pk_table;
  433. 13 three
  434. 14 four
  435. 2 two_two
  436. 5 five
  437. > SELECT status = 'running' FROM mz_internal.mz_source_statuses WHERE name = 'large_cluster_source_pk_table';
  438. true
  439. > DROP SOURCE large_cluster_source CASCADE;
  440. #
  441. # Remove all data on the Postgres side
  442. #
  443. $ mysql-execute name=mysql
  444. DELETE FROM pk_table;
  445. DELETE FROM nonpk_table;
  446. DELETE FROM large_text;
  447. DELETE FROM trailing_space_pk;
  448. DELETE FROM trailing_space_nopk;
  449. DELETE FROM multipart_pk;
  450. DELETE FROM nulls_table;
  451. DELETE FROM utf8_table;
  452. DELETE FROM conflict_schema.conflict_table;
  453. DELETE FROM `таблица`;
  454. DELETE FROM mixED_CAse;
  455. #
  456. # Check that all data sources empty out on the Materialize side
  457. #
  458. > SELECT COUNT(*) FROM pk_table;
  459. 0
  460. > SELECT COUNT(*) FROM nonpk_table;
  461. 0
  462. > SELECT COUNT(*) FROM large_text;
  463. 0
  464. > SELECT COUNT(*) FROM trailing_space_nopk;
  465. 0
  466. > SELECT COUNT(*) FROM trailing_space_pk;
  467. 0
  468. > SELECT COUNT(*) FROM multipart_pk;
  469. 0
  470. > SELECT COUNT(*) FROM nulls_table;
  471. 0
  472. > SELECT COUNT(*) FROM utf8_table;
  473. 0
  474. > SELECT COUNT(*) FROM join_view;
  475. 0
  476. > SELECT COUNT(*) FROM "таблица";
  477. 0
  478. > SELECT COUNT(*) FROM "mixED_CAse";
  479. 0
  480. > SELECT COUNT(*) FROM conflict_table;
  481. 0
  482. # Reference exists in two schemas, so is not unambiguous
  483. # TODO: database-issues#7397 (explicit schema definition required)
  484. # ! CREATE SOURCE enum_source
  485. # IN CLUSTER cdc_cluster
  486. # FROM MYSQL CONNECTION mysql_conn (
  487. # TEXT COLUMNS [another_enum_table."колона"]
  488. # )
  489. # FOR TABLES(
  490. # conflict_schema.another_enum_table AS conflict_enum,
  491. # public.another_enum_table AS public_enum
  492. # );
  493. # contains: invalid TEXT COLUMNS option value: table another_enum_table is ambiguous, consider specifying the schema
  494. # TODO: database-issues#7397 (explicit schema definition required)
  495. # ! CREATE SOURCE enum_source
  496. # IN CLUSTER cdc_cluster
  497. # FROM MYSQL CONNECTION mysql_conn (
  498. # TEXT COLUMNS [foo]
  499. # )
  500. # FOR TABLES (pk_table);
  501. # contains: invalid TEXT COLUMNS option value: column name 'foo' must have at least a table qualification
  502. # TODO: database-issues#7397 (explicit schema definition required)
  503. # ! CREATE SOURCE enum_source
  504. # IN CLUSTER cdc_cluster
  505. # FROM MYSQL CONNECTION mysql_conn (
  506. # TEXT COLUMNS [foo.bar.qux.qax.foo]
  507. # )
  508. # FOR TABLES (pk_table);
  509. # contains: invalid TEXT COLUMNS option value: qualified name did not have between 1 and 3 components: foo.bar.qux.qax
  510. # TODO: database-issues#7397 (explicit schema definition required)
  511. # ! CREATE SOURCE enum_source
  512. # IN CLUSTER cdc_cluster
  513. # FROM MYSQL CONNECTION mysql_conn (
  514. # TEXT COLUMNS [enum_table.a, enum_table.a]
  515. # )
  516. # FOR TABLES (enum_table);
  517. # contains: invalid TEXT COLUMNS option value: unexpected multiple references to postgres.public.enum_table.a
  518. # TODO: database-issues#7397 (explicit schema definition required)
  519. # utf8_table is not part of mz_source_narrow publication
  520. # ! CREATE SOURCE enum_source
  521. # IN CLUSTER cdc_cluster
  522. # FROM MYSQL CONNECTION mysql_conn (
  523. # TEXT COLUMNS [enum_table.a, utf8_table.f1]
  524. # )
  525. # FOR TABLES (enum_table);
  526. # contains: invalid TEXT COLUMNS option value: table utf8_table not found in source
  527. # n.b includes a reference to pk_table, which is not a table that's part of the
  528. # source, but is part of the publication.
  529. ! CREATE SOURCE enum_source
  530. IN CLUSTER cdc_cluster
  531. FROM MYSQL CONNECTION mysql_conn (
  532. TEXT COLUMNS [
  533. public.enum_table.a,
  534. public.another_enum_table."колона",
  535. public.pk_table.pk
  536. ]
  537. )
  538. FOR TABLES (
  539. public."enum_table",
  540. public.another_enum_table
  541. );
  542. contains:TEXT COLUMNS refers to table not currently being added
  543. > CREATE SOURCE enum_source
  544. IN CLUSTER cdc_cluster
  545. FROM MYSQL CONNECTION mysql_conn (
  546. TEXT COLUMNS [
  547. public.enum_table.a,
  548. public.another_enum_table."колона"
  549. ]
  550. )
  551. FOR TABLES (
  552. public."enum_table",
  553. public.another_enum_table
  554. );
  555. > SELECT * FROM (SHOW SOURCES) WHERE name LIKE '%enum%';
  556. another_enum_table subsource cdc_cluster ""
  557. enum_source mysql cdc_cluster ""
  558. enum_source_progress progress <null> ""
  559. enum_table subsource cdc_cluster ""
  560. > SELECT * FROM enum_table
  561. var0
  562. var1
  563. > SELECT "колона" FROM another_enum_table
  564. var2
  565. var3
  566. #
  567. # Cleanup
  568. #
  569. #
  570. $ mysql-execute name=mysql
  571. INSERT INTO pk_table VALUES (99999, 'abc');
  572. > DROP SOURCE enum_source CASCADE;
  573. > DROP SOURCE "mz_source" CASCADE;
  574. #
  575. # Check schema scoped tables
  576. > CREATE SOURCE another_source
  577. IN CLUSTER cdc_cluster
  578. FROM MYSQL CONNECTION mysql_conn
  579. FOR SCHEMAS (
  580. another_schema
  581. );
  582. > SHOW SOURCES
  583. another_source mysql cdc_cluster ""
  584. another_source_progress progress <null> ""
  585. another_table subsource cdc_cluster ""
  586. > DROP SOURCE another_source CASCADE;
  587. $ mysql-execute name=mysql
  588. DROP SCHEMA conflict_schema;
  589. DROP SCHEMA another_schema;