constraints.td 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. > CREATE CONNECTION mysql_conn TO MYSQL (
  12. HOST mysql,
  13. USER root,
  14. PASSWORD SECRET mysqlpass
  15. )
  16. $ mysql-connect name=mysql url=mysql://root@mysql password=${arg.mysql-root-password}
  17. $ mysql-execute name=mysql
  18. DROP DATABASE IF EXISTS public;
  19. CREATE DATABASE public;
  20. USE public;
  21. CREATE TABLE pk (f1 INT, f2 INT, f3 INT, PRIMARY KEY (f1, f2));
  22. INSERT INTO pk VALUES (1,1,null);
  23. CREATE TABLE unique_not_null (f1 INT NOT NULL, f2 INT NOT NULL, f3 INT, UNIQUE (f1, f2));
  24. INSERT INTO unique_not_null VALUES (1,1,null);
  25. CREATE TABLE unique_nullable (f1 INT, f2 INT, f3 INT, UNIQUE (f1, f2));
  26. INSERT INTO unique_nullable VALUES (1,1,null), (null,null,null), (null,null,null);
  27. > CREATE SOURCE mz_source FROM MYSQL CONNECTION mysql_conn;
  28. > CREATE TABLE pk FROM SOURCE mz_source (REFERENCE public.pk);
  29. > CREATE TABLE unique_not_null FROM SOURCE mz_source (REFERENCE public.unique_not_null);
  30. > CREATE TABLE unique_nullable FROM SOURCE mz_source (REFERENCE public.unique_nullable);
  31. > CREATE DEFAULT INDEX ON pk;
  32. > CREATE DEFAULT INDEX ON unique_not_null;
  33. > CREATE DEFAULT INDEX ON unique_nullable;
  34. > SELECT key FROM (SHOW INDEXES ON pk);
  35. {f1,f2}
  36. > SELECT key FROM (SHOW INDEXES ON unique_not_null);
  37. {f1,f2}
  38. > SELECT key FROM (SHOW INDEXES ON unique_nullable);
  39. {f1,f2,f3}
  40. > SELECT * FROM unique_nullable
  41. 1 1 <null>
  42. <null> <null> <null>
  43. <null> <null> <null>
  44. # Not null constraint optimizes like this:
  45. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM pk WHERE f1 IS NULL OR f2 IS NULL;
  46. Explained Query (fast path):
  47. Constant <empty>
  48. Target cluster: quickstart
  49. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM unique_not_null WHERE f1 IS NULL OR f2 IS NULL;
  50. Explained Query (fast path):
  51. Constant <empty>
  52. Target cluster: quickstart
  53. #
  54. # Unique converted to keys
  55. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT DISTINCT f1, f2 FROM pk
  56. Explained Query (fast path):
  57. Project (#0, #1)
  58. ReadIndex on=materialize.public.pk pk_primary_idx=[*** full scan ***]
  59. Used Indexes:
  60. - materialize.public.pk_primary_idx (*** full scan ***)
  61. Target cluster: quickstart
  62. #
  63. # Unique converted to keys
  64. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT DISTINCT f1, f2 FROM unique_not_null
  65. Explained Query (fast path):
  66. Project (#0, #1)
  67. ReadIndex on=materialize.public.unique_not_null unique_not_null_primary_idx=[*** full scan ***]
  68. Used Indexes:
  69. - materialize.public.unique_not_null_primary_idx (*** full scan ***)
  70. Target cluster: quickstart
  71. #
  72. # Unique NOT converted to keys because values are nullable
  73. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT DISTINCT f1, f2 FROM unique_nullable
  74. Explained Query:
  75. Distinct project=[#0, #1]
  76. Project (#0, #1)
  77. ReadIndex on=unique_nullable unique_nullable_primary_idx=[*** full scan ***]
  78. Used Indexes:
  79. - materialize.public.unique_nullable_primary_idx (*** full scan ***)
  80. Target cluster: quickstart