30-text-columns.td 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. TEXT COLUMNS (public.t1.f1, public.t1.f2, public.t1.f3, public.t1.f4, public.t1.f5, public.t1.f6, public.t1.f7, public.t1.f8, public.t1.f9)
  33. )
  34. FOR TABLES (public.t1);
  35. # Insert the same data post-snapshot
  36. $ mysql-execute name=mysql
  37. USE public;
  38. SET SESSION sql_mode = '';
  39. INSERT INTO t1 SELECT * FROM t1;
  40. > SELECT f1::jsonb->>'balance' FROM t1;
  41. 7.77
  42. 7.77
  43. > SELECT f2 FROM t1;
  44. "large"
  45. "large"
  46. > SELECT f3 FROM t1;
  47. "2024"
  48. "2024"
  49. # verify JSON representation is consistent between snapshot and replication
  50. > SELECT f1 FROM t1;
  51. "{\"bar\":\"baz\",\"nest\":{\"birds\":[\"seagull\",\"robin\"]},\"active\":false,\"balance\":7.77}"
  52. "{\"bar\":\"baz\",\"nest\":{\"birds\":[\"seagull\",\"robin\"]},\"active\":false,\"balance\":7.77}"
  53. > SELECT f4 FROM t1;
  54. 0000-00-00
  55. 0000-00-00
  56. > SELECT f5 FROM t1;
  57. 2024-00-01
  58. 2024-00-01
  59. > SELECT f6 FROM t1;
  60. 2024-01-00
  61. 2024-01-00
  62. > SELECT f7 FROM t1;
  63. "0000-00-00 00:00:00"
  64. "0000-00-00 00:00:00"
  65. > SELECT f8 FROM t1;
  66. "0000-00-00 00:00:00"
  67. "0000-00-00 00:00:00"
  68. > SELECT f9 FROM t1;
  69. "0000-00-00 00:00:00.0000"
  70. "0000-00-00 00:00:00.0000"
  71. >[version>=14000] SHOW CREATE SOURCE t1;
  72. materialize.public.t1 "CREATE SUBSOURCE 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) OF SOURCE materialize.public.da WITH (EXTERNAL REFERENCE = public.t1, TEXT COLUMNS = (f1, f2, f3, f4, f5, f6, f7, f8, f9));"
  73. >[version<14000] SHOW CREATE SOURCE t1;
  74. materialize.public.t1 "CREATE SUBSOURCE \"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\") OF SOURCE \"materialize\".\"public\".\"da\" WITH (EXTERNAL REFERENCE = \"public\".\"t1\", TEXT COLUMNS = (\"f1\", \"f2\", \"f3\", \"f4\", \"f5\", \"f6\", \"f7\", \"f8\", \"f9\"))"
  75. > DROP SOURCE da CASCADE;
  76. #
  77. # Validate that unsupported types error even as TEXT COLUMNS
  78. #
  79. $ mysql-execute name=mysql
  80. DROP DATABASE IF EXISTS public;
  81. CREATE DATABASE public;
  82. USE public;
  83. CREATE TABLE t1 (f1 BIT(5));
  84. INSERT INTO t1 VALUES (b'11111');
  85. ! CREATE SOURCE da_other
  86. FROM MYSQL CONNECTION mysqc (
  87. TEXT COLUMNS (public.t1.f1)
  88. )
  89. FOR TABLES (public.t1);
  90. contains: unsupported type