constraints.td 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 FROM POSTGRES CONNECTION pg (PUBLICATION 'mz_source');
  35. > CREATE TABLE pk FROM SOURCE mz_source (REFERENCE pk);
  36. > CREATE TABLE unique_not_null FROM SOURCE mz_source (REFERENCE unique_not_null);
  37. > CREATE TABLE unique_nullable FROM SOURCE mz_source (REFERENCE unique_nullable);
  38. > CREATE DEFAULT INDEX ON pk;
  39. > CREATE DEFAULT INDEX ON unique_not_null;
  40. > CREATE DEFAULT INDEX ON unique_nullable;
  41. > SELECT key FROM (SHOW INDEXES ON pk);
  42. {f1,f2}
  43. > SELECT key FROM (SHOW INDEXES ON unique_not_null);
  44. {f1,f2}
  45. > SELECT key FROM (SHOW INDEXES ON unique_nullable);
  46. {f1,f2,f3}
  47. > SELECT * FROM unique_nullable
  48. 1 1 <null>
  49. <null> <null> <null>
  50. <null> <null> <null>
  51. # Not null constraint optimizes like this:
  52. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM pk WHERE f1 IS NULL OR f2 IS NULL;
  53. Explained Query (fast path):
  54. Constant <empty>
  55. Target cluster: quickstart
  56. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT 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. ? 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. #
  70. # Unique converted to keys
  71. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT DISTINCT f1, f2 FROM unique_not_null
  72. Explained Query (fast path):
  73. Project (#0, #1)
  74. ReadIndex on=materialize.public.unique_not_null unique_not_null_primary_idx=[*** full scan ***]
  75. Used Indexes:
  76. - materialize.public.unique_not_null_primary_idx (*** full scan ***)
  77. Target cluster: quickstart
  78. #
  79. # Unique NOT converted to keys because values are nullable
  80. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT DISTINCT f1, f2 FROM unique_nullable
  81. Explained Query:
  82. Distinct project=[#0, #1]
  83. Project (#0, #1)
  84. ReadIndex on=unique_nullable unique_nullable_primary_idx=[*** full scan ***]
  85. Used Indexes:
  86. - materialize.public.unique_nullable_primary_idx (*** full scan ***)
  87. Target cluster: quickstart