constraints.td 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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
  28. FROM MYSQL CONNECTION mysql_conn
  29. FOR ALL TABLES;
  30. > CREATE DEFAULT INDEX ON pk;
  31. > CREATE DEFAULT INDEX ON unique_not_null;
  32. > CREATE DEFAULT INDEX ON unique_nullable;
  33. > SELECT key FROM (SHOW INDEXES ON pk);
  34. {f1,f2}
  35. > SELECT key FROM (SHOW INDEXES ON unique_not_null);
  36. {f1,f2}
  37. > SELECT key FROM (SHOW INDEXES ON unique_nullable);
  38. {f1,f2,f3}
  39. > SELECT * FROM unique_nullable
  40. 1 1 <null>
  41. <null> <null> <null>
  42. <null> <null> <null>
  43. # Not null constraint optimizes like this:
  44. ?[version>=13500] EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM pk WHERE f1 IS NULL OR f2 IS NULL;
  45. Explained Query (fast path):
  46. Constant <empty>
  47. Target cluster: quickstart
  48. ?[version<13500] EXPLAIN OPTIMIZED PLAN FOR SELECT * FROM pk WHERE f1 IS NULL OR f2 IS NULL;
  49. Explained Query (fast path):
  50. Constant <empty>
  51. Target cluster: quickstart
  52. ?[version>=13500] EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM unique_not_null WHERE f1 IS NULL OR f2 IS NULL;
  53. Explained Query (fast path):
  54. Constant <empty>
  55. Target cluster: quickstart
  56. ?[version<13500] EXPLAIN OPTIMIZED PLAN FOR SELECT * FROM unique_not_null WHERE f1 IS NULL OR f2 IS NULL;
  57. Explained Query (fast path):
  58. Constant <empty>
  59. Target cluster: quickstart
  60. #
  61. # Unique converted to keys
  62. ?[version>=13500] EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT DISTINCT f1, f2 FROM pk
  63. Explained Query (fast path):
  64. Project (#0, #1)
  65. ReadIndex on=materialize.public.pk pk_primary_idx=[*** full scan ***]
  66. Used Indexes:
  67. - materialize.public.pk_primary_idx (*** full scan ***)
  68. Target cluster: quickstart
  69. ?[version<13500] EXPLAIN OPTIMIZED PLAN FOR SELECT DISTINCT f1, f2 FROM pk
  70. Explained Query (fast path):
  71. Project (#0, #1)
  72. ReadIndex on=materialize.public.pk pk_primary_idx=[*** full scan ***]
  73. Used Indexes:
  74. - materialize.public.pk_primary_idx (*** full scan ***)
  75. Target cluster: quickstart
  76. #
  77. # Unique converted to keys
  78. ?[version>=13500] EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT DISTINCT f1, f2 FROM unique_not_null
  79. Explained Query (fast path):
  80. Project (#0, #1)
  81. ReadIndex on=materialize.public.unique_not_null unique_not_null_primary_idx=[*** full scan ***]
  82. Used Indexes:
  83. - materialize.public.unique_not_null_primary_idx (*** full scan ***)
  84. Target cluster: quickstart
  85. ?[version<13500] EXPLAIN OPTIMIZED PLAN FOR SELECT DISTINCT f1, f2 FROM unique_not_null
  86. Explained Query (fast path):
  87. Project (#0, #1)
  88. ReadIndex on=materialize.public.unique_not_null unique_not_null_primary_idx=[*** full scan ***]
  89. Used Indexes:
  90. - materialize.public.unique_not_null_primary_idx (*** full scan ***)
  91. Target cluster: quickstart
  92. #
  93. # Unique NOT converted to keys because values are nullable
  94. ?[version>=13500] EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT DISTINCT f1, f2 FROM unique_nullable
  95. Explained Query:
  96. Distinct project=[#0, #1]
  97. Project (#0, #1)
  98. ReadIndex on=unique_nullable unique_nullable_primary_idx=[*** full scan ***]
  99. Used Indexes:
  100. - materialize.public.unique_nullable_primary_idx (*** full scan ***)
  101. Target cluster: quickstart
  102. ?[version<13500] EXPLAIN OPTIMIZED PLAN FOR SELECT DISTINCT f1, f2 FROM unique_nullable
  103. Explained Query:
  104. Distinct project=[#0, #1]
  105. Project (#0, #1)
  106. ReadIndex on=unique_nullable unique_nullable_primary_idx=[*** full scan ***]
  107. Used Indexes:
  108. - materialize.public.unique_nullable_primary_idx (*** full scan ***)
  109. Target cluster: quickstart