mysql-cdc.td 21 KB

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