constraints.td 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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. # IMPORTANT: The Postgres server has a custom pg_hba.conf that only
  10. # accepts connections from specific users. You will have to update
  11. # pg_hba.conf if you modify the existing user names or add new ones.
  12. > CREATE SECRET pgpass AS 'postgres'
  13. > CREATE CONNECTION pg TO POSTGRES (
  14. HOST postgres,
  15. DATABASE postgres,
  16. USER postgres,
  17. PASSWORD SECRET pgpass
  18. )
  19. $ postgres-execute connection=postgres://postgres:postgres@postgres
  20. ALTER USER postgres WITH replication;
  21. DROP SCHEMA IF EXISTS public CASCADE;
  22. CREATE SCHEMA public;
  23. DROP PUBLICATION IF EXISTS mz_source;
  24. CREATE PUBLICATION mz_source FOR ALL TABLES;
  25. CREATE TABLE pk (f1 INT, f2 INT, f3 INT, PRIMARY KEY (f1, f2));
  26. INSERT INTO pk VALUES (1,1,null);
  27. ALTER TABLE pk REPLICA IDENTITY FULL;
  28. CREATE TABLE unique_not_null (f1 INT NOT NULL, f2 INT NOT NULL, f3 INT, UNIQUE (f1, f2));
  29. INSERT INTO unique_not_null VALUES (1,1,null);
  30. ALTER TABLE unique_not_null REPLICA IDENTITY FULL;
  31. CREATE TABLE unique_nullable (f1 INT, f2 INT, f3 INT, UNIQUE (f1, f2));
  32. INSERT INTO unique_nullable VALUES (1,1,null), (null,null,null), (null,null,null);
  33. ALTER TABLE unique_nullable REPLICA IDENTITY FULL;
  34. > CREATE SOURCE mz_source
  35. FROM POSTGRES CONNECTION pg (PUBLICATION 'mz_source')
  36. FOR ALL TABLES;
  37. > CREATE DEFAULT INDEX ON pk;
  38. > CREATE DEFAULT INDEX ON unique_not_null;
  39. > CREATE DEFAULT INDEX ON unique_nullable;
  40. > SELECT key FROM (SHOW INDEXES ON pk);
  41. {f1,f2}
  42. > SELECT key FROM (SHOW INDEXES ON unique_not_null);
  43. {f1,f2}
  44. > SELECT key FROM (SHOW INDEXES ON unique_nullable);
  45. {f1,f2,f3}
  46. > SELECT * FROM unique_nullable
  47. 1 1 <null>
  48. <null> <null> <null>
  49. <null> <null> <null>
  50. # Not null constraint optimizes like this:
  51. ?[version>=13500] EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM pk WHERE f1 IS NULL OR f2 IS NULL;
  52. Explained Query (fast path):
  53. Constant <empty>
  54. Target cluster: quickstart
  55. ?[version<13500] EXPLAIN OPTIMIZED PLAN FOR SELECT * FROM pk WHERE f1 IS NULL OR f2 IS NULL;
  56. Explained Query (fast path):
  57. Constant <empty>
  58. Target cluster: quickstart
  59. ?[version>=13500] EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM unique_not_null WHERE f1 IS NULL OR f2 IS NULL;
  60. Explained Query (fast path):
  61. Constant <empty>
  62. Target cluster: quickstart
  63. ?[version<13500] EXPLAIN OPTIMIZED PLAN FOR SELECT * FROM unique_not_null WHERE f1 IS NULL OR f2 IS NULL;
  64. Explained Query (fast path):
  65. Constant <empty>
  66. Target cluster: quickstart
  67. #
  68. # Unique converted to keys
  69. ?[version>=13500] EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT 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. ?[version<13500] EXPLAIN OPTIMIZED PLAN FOR SELECT DISTINCT f1, f2 FROM pk
  77. Explained Query (fast path):
  78. Project (#0, #1)
  79. ReadIndex on=materialize.public.pk pk_primary_idx=[*** full scan ***]
  80. Used Indexes:
  81. - materialize.public.pk_primary_idx (*** full scan ***)
  82. Target cluster: quickstart
  83. #
  84. # Unique converted to keys
  85. ?[version>=13500] EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT 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. ?[version<13500] EXPLAIN OPTIMIZED PLAN FOR SELECT DISTINCT f1, f2 FROM unique_not_null
  93. Explained Query (fast path):
  94. Project (#0, #1)
  95. ReadIndex on=materialize.public.unique_not_null unique_not_null_primary_idx=[*** full scan ***]
  96. Used Indexes:
  97. - materialize.public.unique_not_null_primary_idx (*** full scan ***)
  98. Target cluster: quickstart
  99. #
  100. # Unique NOT converted to keys because values are nullable
  101. ?[version>=13500] EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT DISTINCT f1, f2 FROM unique_nullable
  102. Explained Query:
  103. Distinct project=[#0, #1]
  104. Project (#0, #1)
  105. ReadIndex on=unique_nullable unique_nullable_primary_idx=[*** full scan ***]
  106. Used Indexes:
  107. - materialize.public.unique_nullable_primary_idx (*** full scan ***)
  108. Target cluster: quickstart
  109. ?[version<13500] EXPLAIN OPTIMIZED PLAN FOR SELECT DISTINCT f1, f2 FROM unique_nullable
  110. Explained Query:
  111. Distinct project=[#0, #1]
  112. Project (#0, #1)
  113. ReadIndex on=unique_nullable unique_nullable_primary_idx=[*** full scan ***]
  114. Used Indexes:
  115. - materialize.public.unique_nullable_primary_idx (*** full scan ***)
  116. Target cluster: quickstart