30-text-columns.td 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. #
  10. # Test mysql TEXT COLUMNS support
  11. #
  12. > CREATE SECRET mysqlpass AS '${arg.mysql-root-password}'
  13. > CREATE CONNECTION mysqc TO MYSQL (
  14. HOST mysql,
  15. USER root,
  16. PASSWORD SECRET mysqlpass
  17. )
  18. $ mysql-connect name=mysql url=mysql://root@mysql password=${arg.mysql-root-password}
  19. # Insert data into MySQL that can't be decoded using native types and must be decoded
  20. # as a TEXT COLUMN
  21. # NOTE: We need to use `sql_mode = ''` to have MySQL allow the 0000-00-00 dates which it
  22. # correctly disallows by default in newer versions, but used to allow in previous ones.
  23. $ mysql-execute name=mysql
  24. DROP DATABASE IF EXISTS public;
  25. CREATE DATABASE public;
  26. USE public;
  27. CREATE TABLE t1 (f1 JSON, f2 ENUM('small', 'medium', 'large'), f3 YEAR, f4 DATE, f5 DATE, f6 DATE, f7 DATETIME, f8 DATETIME, f9 DATETIME(4));
  28. SET SESSION sql_mode = '';
  29. INSERT INTO t1 VALUES (CAST('{"bar": "baz", "balance": 7.77, "active": false, "nest": {"birds": ["seagull", "robin"]}}' AS JSON), 'large', 2024, '0000-00-00', '2024-00-01', '2024-01-00', '0000-00-00 00:00:00', '0000-00-00 00:00:00.000000', '0000-00-00 00:00:00.000000');
  30. > CREATE SOURCE da
  31. FROM MYSQL CONNECTION mysqc;
  32. > CREATE TABLE t1 FROM SOURCE da (REFERENCE public.t1)
  33. WITH (TEXT COLUMNS = (f1, f2, f3, f4, f5, f6, f7, f8, f9));
  34. # Insert the same data post-snapshot
  35. $ mysql-execute name=mysql
  36. USE public;
  37. SET SESSION sql_mode = '';
  38. INSERT INTO t1 SELECT * FROM t1;
  39. > SELECT f1::jsonb->>'balance' FROM t1;
  40. 7.77
  41. 7.77
  42. > SELECT f2 FROM t1;
  43. "large"
  44. "large"
  45. > SELECT f3 FROM t1;
  46. "2024"
  47. "2024"
  48. # verify JSON representation is consistent between snapshot and replication
  49. > SELECT f1 FROM t1;
  50. "{\"bar\":\"baz\",\"nest\":{\"birds\":[\"seagull\",\"robin\"]},\"active\":false,\"balance\":7.77}"
  51. "{\"bar\":\"baz\",\"nest\":{\"birds\":[\"seagull\",\"robin\"]},\"active\":false,\"balance\":7.77}"
  52. > SELECT f4 FROM t1;
  53. 0000-00-00
  54. 0000-00-00
  55. > SELECT f5 FROM t1;
  56. 2024-00-01
  57. 2024-00-01
  58. > SELECT f6 FROM t1;
  59. 2024-01-00
  60. 2024-01-00
  61. > SELECT f7 FROM t1;
  62. "0000-00-00 00:00:00"
  63. "0000-00-00 00:00:00"
  64. > SELECT f8 FROM t1;
  65. "0000-00-00 00:00:00"
  66. "0000-00-00 00:00:00"
  67. > SELECT f9 FROM t1;
  68. "0000-00-00 00:00:00.0000"
  69. "0000-00-00 00:00:00.0000"
  70. $ set-regex match="DETAILS = '[a-f0-9]+'" replacement=<DETAILS>
  71. > SHOW CREATE TABLE t1;
  72. materialize.public.t1 "CREATE TABLE materialize.public.t1 (f1 pg_catalog.text, f2 pg_catalog.text, f3 pg_catalog.text, f4 pg_catalog.text, f5 pg_catalog.text, f6 pg_catalog.text, f7 pg_catalog.text, f8 pg_catalog.text, f9 pg_catalog.text) FROM SOURCE materialize.public.da (REFERENCE = public.t1) WITH (TEXT COLUMNS = (f1, f2, f3, f4, f5, f6, f7, f8, f9), <DETAILS>);"
  73. > DROP SOURCE da CASCADE;
  74. #
  75. # Validate that unsupported types error even as TEXT COLUMNS
  76. #
  77. $ mysql-execute name=mysql
  78. DROP DATABASE IF EXISTS public;
  79. CREATE DATABASE public;
  80. USE public;
  81. CREATE TABLE t1 (f1 BIT(5));
  82. INSERT INTO t1 VALUES (b'11111');
  83. > CREATE SOURCE da_other
  84. FROM MYSQL CONNECTION mysqc;
  85. ! CREATE TABLE t1 FROM SOURCE da_other (REFERENCE public.t1) WITH (TEXT COLUMNS (f1));
  86. contains: unsupported type