1mod builtin;
26pub mod notice;
27mod ontology;
28mod pg_catalog;
29pub use pg_catalog::*;
30mod mz_catalog;
31pub use mz_catalog::*;
32mod mz_internal;
33pub use mz_internal::*;
34mod mz_introspection;
35pub use mz_introspection::*;
36mod information_schema;
37pub use information_schema::*;
38
39use std::collections::BTreeMap;
40use std::hash::Hash;
41use std::string::ToString;
42use std::sync::LazyLock;
43
44use mz_compute_client::logging::LogVariant;
45use mz_ore::collections::HashMap;
46use mz_pgrepr::oid;
47use mz_repr::adt::mz_acl_item::{AclMode, MzAclItem};
48use mz_repr::namespaces::{
49 INFORMATION_SCHEMA, MZ_CATALOG_SCHEMA, MZ_INTERNAL_SCHEMA, MZ_UNSAFE_SCHEMA, PG_CATALOG_SCHEMA,
50};
51use mz_repr::role_id::RoleId;
52use mz_repr::{RelationDesc, SemanticType, SqlRelationType};
53use mz_sql::catalog::RoleAttributesRaw;
54use mz_sql::catalog::{
55 CatalogItemType, CatalogTypeDetails, NameReference, ObjectType, SystemObjectType, TypeReference,
56};
57use mz_sql::rbac;
58use mz_sql::session::user::{
59 ANALYTICS_USER_NAME, JWT_SYNC_ROLE_NAME, MZ_ANALYTICS_ROLE_ID, MZ_JWT_SYNC_ROLE_ID,
60 MZ_MONITOR_REDACTED_ROLE_ID, MZ_MONITOR_ROLE_ID, MZ_SUPPORT_ROLE_ID, MZ_SYSTEM_ROLE_ID,
61 SUPPORT_USER_NAME, SYSTEM_USER_NAME,
62};
63use serde::Serialize;
64
65use crate::durable::objects::SystemObjectDescription;
66use crate::memory::objects::DataSourceDesc;
67
68pub const BUILTIN_PREFIXES: &[&str] = &["mz_", "pg_", "external_"];
69const BUILTIN_CLUSTER_REPLICA_NAME: &str = "r1";
70
71pub const RUNTIME_ALTERABLE_FINGERPRINT_SENTINEL: &str = "<RUNTIME-ALTERABLE>";
87
88#[derive(Clone, Debug)]
89pub enum Builtin<T: 'static + TypeReference> {
90 Log(&'static BuiltinLog),
91 Table(&'static BuiltinTable),
92 View(&'static BuiltinView),
93 MaterializedView(&'static BuiltinMaterializedView),
94 Type(&'static BuiltinType<T>),
95 Func(BuiltinFunc),
96 Source(&'static BuiltinSource),
97 Index(&'static BuiltinIndex),
98 Connection(&'static BuiltinConnection),
99}
100
101impl<T: TypeReference> Builtin<T> {
102 pub fn name(&self) -> &'static str {
103 match self {
104 Builtin::Log(log) => log.name,
105 Builtin::Table(table) => table.name,
106 Builtin::View(view) => view.name,
107 Builtin::MaterializedView(mv) => mv.name,
108 Builtin::Type(typ) => typ.name,
109 Builtin::Func(func) => func.name,
110 Builtin::Source(coll) => coll.name,
111 Builtin::Index(index) => index.name,
112 Builtin::Connection(connection) => connection.name,
113 }
114 }
115
116 pub fn schema(&self) -> &'static str {
117 match self {
118 Builtin::Log(log) => log.schema,
119 Builtin::Table(table) => table.schema,
120 Builtin::View(view) => view.schema,
121 Builtin::MaterializedView(mv) => mv.schema,
122 Builtin::Type(typ) => typ.schema,
123 Builtin::Func(func) => func.schema,
124 Builtin::Source(coll) => coll.schema,
125 Builtin::Index(index) => index.schema,
126 Builtin::Connection(connection) => connection.schema,
127 }
128 }
129
130 pub fn catalog_item_type(&self) -> CatalogItemType {
131 match self {
132 Builtin::Log(_) => CatalogItemType::Source,
133 Builtin::Source(_) => CatalogItemType::Source,
134 Builtin::Table(_) => CatalogItemType::Table,
135 Builtin::View(_) => CatalogItemType::View,
136 Builtin::MaterializedView(_) => CatalogItemType::MaterializedView,
137 Builtin::Type(_) => CatalogItemType::Type,
138 Builtin::Func(_) => CatalogItemType::Func,
139 Builtin::Index(_) => CatalogItemType::Index,
140 Builtin::Connection(_) => CatalogItemType::Connection,
141 }
142 }
143
144 pub fn runtime_alterable(&self) -> bool {
146 match self {
147 Builtin::Connection(c) => c.runtime_alterable,
148 _ => false,
149 }
150 }
151}
152
153#[derive(Clone, Debug, Hash, Serialize)]
154pub struct BuiltinLog {
155 pub variant: LogVariant,
156 pub name: &'static str,
157 pub schema: &'static str,
158 pub oid: u32,
159 pub access: Vec<MzAclItem>,
161 #[serde(default)]
162 pub ontology: Option<Ontology>,
163}
164
165#[derive(Clone, Hash, Debug, PartialEq, Eq, Serialize)]
182pub struct Ontology {
183 pub entity_name: &'static str,
187 pub description: &'static str,
189 pub links: &'static [OntologyLink],
192 pub column_semantic_types: &'static [(&'static str, SemanticType)],
195}
196
197#[derive(
199 Clone,
200 Copy,
201 Debug,
202 Hash,
203 PartialEq,
204 Eq,
205 serde::Serialize,
206 serde::Deserialize
207)]
208#[serde(rename_all = "snake_case")]
209pub enum Cardinality {
210 OneToOne,
211 ManyToOne,
212}
213
214fn is_false(v: &bool) -> bool {
216 !v
217}
218
219#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, serde::Serialize)]
245#[serde(tag = "kind", rename_all = "snake_case")]
246pub enum LinkProperties {
247 ForeignKey {
250 source_column: &'static str,
252 target_column: &'static str,
254 cardinality: Cardinality,
256 #[serde(skip_serializing_if = "Option::is_none")]
259 source_id_type: Option<mz_repr::SemanticType>,
260 #[serde(skip_serializing_if = "Option::is_none")]
265 requires_mapping: Option<&'static str>,
266 #[serde(default, skip_serializing_if = "is_false")]
268 nullable: bool,
269 #[serde(skip_serializing_if = "Option::is_none")]
271 note: Option<&'static str>,
272 #[serde(skip_serializing_if = "Option::is_none")]
278 extra_key_columns: Option<&'static [(&'static str, &'static str)]>,
279 },
280 Union {
283 #[serde(skip_serializing_if = "Option::is_none")]
285 discriminator_column: Option<&'static str>,
286 #[serde(skip_serializing_if = "Option::is_none")]
288 discriminator_value: Option<&'static str>,
289 #[serde(skip_serializing_if = "Option::is_none")]
291 note: Option<&'static str>,
292 },
293 MapsTo {
296 source_column: &'static str,
298 target_column: &'static str,
300 #[serde(skip_serializing_if = "Option::is_none")]
302 via: Option<&'static str>,
303 #[serde(skip_serializing_if = "Option::is_none")]
305 from_type: Option<mz_repr::SemanticType>,
306 #[serde(skip_serializing_if = "Option::is_none")]
308 to_type: Option<mz_repr::SemanticType>,
309 #[serde(skip_serializing_if = "Option::is_none")]
311 note: Option<&'static str>,
312 },
313 DependsOn {
316 source_column: &'static str,
318 target_column: &'static str,
320 #[serde(skip_serializing_if = "Option::is_none")]
322 source_id_type: Option<mz_repr::SemanticType>,
323 #[serde(skip_serializing_if = "Option::is_none")]
327 requires_mapping: Option<&'static str>,
328 },
329 Measures {
332 source_column: &'static str,
334 target_column: &'static str,
336 metric: &'static str,
338 #[serde(skip_serializing_if = "Option::is_none")]
340 source_id_type: Option<mz_repr::SemanticType>,
341 #[serde(skip_serializing_if = "Option::is_none")]
344 requires_mapping: Option<&'static str>,
345 #[serde(skip_serializing_if = "Option::is_none")]
347 note: Option<&'static str>,
348 #[serde(skip_serializing_if = "Option::is_none")]
351 extra_key_columns: Option<&'static [(&'static str, &'static str)]>,
352 },
353}
354
355impl LinkProperties {
356 pub const fn fk(
358 source_column: &'static str,
359 target_column: &'static str,
360 cardinality: Cardinality,
361 ) -> Self {
362 Self::ForeignKey {
363 source_column,
364 target_column,
365 cardinality,
366 source_id_type: None,
367 requires_mapping: None,
368 nullable: false,
369 note: None,
370 extra_key_columns: None,
371 }
372 }
373
374 pub const fn fk_nullable(
376 source_column: &'static str,
377 target_column: &'static str,
378 cardinality: Cardinality,
379 ) -> Self {
380 Self::ForeignKey {
381 source_column,
382 target_column,
383 cardinality,
384 source_id_type: None,
385 requires_mapping: None,
386 nullable: true,
387 note: None,
388 extra_key_columns: None,
389 }
390 }
391
392 pub const fn fk_typed(
395 source_column: &'static str,
396 target_column: &'static str,
397 cardinality: Cardinality,
398 source_id_type: mz_repr::SemanticType,
399 ) -> Self {
400 Self::ForeignKey {
401 source_column,
402 target_column,
403 cardinality,
404 source_id_type: Some(source_id_type),
405 requires_mapping: None,
406 nullable: false,
407 note: None,
408 extra_key_columns: None,
409 }
410 }
411
412 pub const fn fk_mapped(
416 source_column: &'static str,
417 target_column: &'static str,
418 cardinality: Cardinality,
419 source_id_type: mz_repr::SemanticType,
420 requires_mapping: &'static str,
421 ) -> Self {
422 Self::ForeignKey {
423 source_column,
424 target_column,
425 cardinality,
426 source_id_type: Some(source_id_type),
427 requires_mapping: Some(requires_mapping),
428 nullable: false,
429 note: None,
430 extra_key_columns: None,
431 }
432 }
433
434 pub const fn fk_composite(
440 source_column: &'static str,
441 target_column: &'static str,
442 cardinality: Cardinality,
443 extra_key_columns: &'static [(&'static str, &'static str)],
444 ) -> Self {
445 Self::ForeignKey {
446 source_column,
447 target_column,
448 cardinality,
449 source_id_type: None,
450 requires_mapping: None,
451 nullable: false,
452 note: None,
453 extra_key_columns: Some(extra_key_columns),
454 }
455 }
456
457 pub const fn union_disc(
459 discriminator_column: &'static str,
460 discriminator_value: &'static str,
461 ) -> Self {
462 Self::Union {
463 discriminator_column: Some(discriminator_column),
464 discriminator_value: Some(discriminator_value),
465 note: None,
466 }
467 }
468
469 pub const fn measures(
471 source_column: &'static str,
472 target_column: &'static str,
473 metric: &'static str,
474 ) -> Self {
475 Self::Measures {
476 source_column,
477 target_column,
478 metric,
479 source_id_type: None,
480 requires_mapping: None,
481 note: None,
482 extra_key_columns: None,
483 }
484 }
485
486 pub const fn measures_composite(
488 source_column: &'static str,
489 target_column: &'static str,
490 metric: &'static str,
491 extra_key_columns: &'static [(&'static str, &'static str)],
492 ) -> Self {
493 Self::Measures {
494 source_column,
495 target_column,
496 metric,
497 source_id_type: None,
498 requires_mapping: None,
499 note: None,
500 extra_key_columns: Some(extra_key_columns),
501 }
502 }
503
504 pub const fn measures_mapped(
506 source_column: &'static str,
507 target_column: &'static str,
508 metric: &'static str,
509 source_id_type: mz_repr::SemanticType,
510 requires_mapping: &'static str,
511 ) -> Self {
512 Self::Measures {
513 source_column,
514 target_column,
515 metric,
516 source_id_type: Some(source_id_type),
517 requires_mapping: Some(requires_mapping),
518 note: None,
519 extra_key_columns: None,
520 }
521 }
522}
523
524#[derive(Clone, Debug, Hash, PartialEq, Eq, Serialize)]
530pub struct OntologyLink {
531 pub name: &'static str,
537 pub target: &'static str,
539 pub properties: LinkProperties,
541}
542
543#[derive(Clone, Hash, Debug, PartialEq, Eq)]
544pub struct BuiltinTable {
545 pub name: &'static str,
546 pub schema: &'static str,
547 pub oid: u32,
548 pub desc: RelationDesc,
549 pub column_comments: BTreeMap<&'static str, &'static str>,
550 pub is_retained_metrics_object: bool,
553 pub access: Vec<MzAclItem>,
555 pub ontology: Option<Ontology>,
557}
558
559#[derive(Clone, Debug, PartialEq, Eq)]
560pub struct BuiltinSource {
561 pub name: &'static str,
562 pub schema: &'static str,
563 pub oid: u32,
564 pub desc: RelationDesc,
565 pub column_comments: BTreeMap<&'static str, &'static str>,
566 pub data_source: DataSourceDesc,
567 pub is_retained_metrics_object: bool,
570 pub access: Vec<MzAclItem>,
572 pub ontology: Option<Ontology>,
574}
575
576#[derive(Hash, Debug)]
577pub struct BuiltinView {
578 pub name: &'static str,
579 pub schema: &'static str,
580 pub oid: u32,
581 pub desc: RelationDesc,
582 pub column_comments: BTreeMap<&'static str, &'static str>,
583 pub sql: &'static str,
584 pub access: Vec<MzAclItem>,
586 pub ontology: Option<Ontology>,
588}
589
590impl BuiltinView {
591 pub fn create_sql(&self) -> String {
592 format!("CREATE VIEW {}.{} AS {}", self.schema, self.name, self.sql)
593 }
594}
595
596#[derive(Hash, Debug)]
597pub struct BuiltinMaterializedView {
598 pub name: &'static str,
599 pub schema: &'static str,
600 pub oid: u32,
601 pub desc: RelationDesc,
602 pub column_comments: BTreeMap<&'static str, &'static str>,
603 pub sql: &'static str,
607 pub is_retained_metrics_object: bool,
610 pub access: Vec<MzAclItem>,
612 pub ontology: Option<Ontology>,
614}
615
616impl BuiltinMaterializedView {
617 pub fn create_sql(&self) -> String {
618 format!(
619 "CREATE MATERIALIZED VIEW {}.{} {}",
620 self.schema, self.name, self.sql
621 )
622 }
623}
624
625#[derive(Debug)]
626pub struct BuiltinType<T: TypeReference> {
627 pub name: &'static str,
628 pub schema: &'static str,
629 pub oid: u32,
630 pub details: CatalogTypeDetails<T>,
631}
632
633#[derive(Clone, Debug)]
634pub struct BuiltinFunc {
635 pub schema: &'static str,
636 pub name: &'static str,
637 pub inner: &'static mz_sql::func::Func,
638}
639
640#[derive(Debug)]
646pub struct BuiltinIndex {
647 pub name: &'static str,
648 pub schema: &'static str,
649 pub oid: u32,
650 pub sql: &'static str,
654 pub is_retained_metrics_object: bool,
655}
656
657impl BuiltinIndex {
658 pub fn create_sql(&self) -> String {
659 format!("CREATE INDEX {}\n{}", self.name, self.sql)
660 }
661}
662
663#[derive(Hash, Debug)]
664pub struct BuiltinConnection {
665 pub name: &'static str,
666 pub schema: &'static str,
667 pub oid: u32,
668 pub sql: &'static str,
669 pub access: &'static [MzAclItem],
670 pub owner_id: &'static RoleId,
671 pub runtime_alterable: bool,
676}
677
678#[derive(Clone, Debug)]
679pub struct BuiltinRole {
680 pub id: RoleId,
681 pub name: &'static str,
685 pub oid: u32,
686 pub attributes: RoleAttributesRaw,
687}
688
689#[derive(Clone, Debug)]
690pub struct BuiltinCluster {
691 pub name: &'static str,
695 pub privileges: &'static [MzAclItem],
696 pub owner_id: &'static RoleId,
697}
698
699#[derive(Clone, Debug, PartialEq, Eq)]
700pub struct BuiltinClusterReplica {
701 pub name: &'static str,
703 pub cluster_name: &'static str,
705}
706
707pub trait Fingerprint {
709 fn fingerprint(&self) -> String;
710}
711
712impl<T: TypeReference> Fingerprint for &Builtin<T> {
713 fn fingerprint(&self) -> String {
714 match self {
715 Builtin::Log(log) => log.fingerprint(),
716 Builtin::Table(table) => table.fingerprint(),
717 Builtin::View(view) => view.fingerprint(),
718 Builtin::MaterializedView(mv) => mv.fingerprint(),
719 Builtin::Type(typ) => typ.fingerprint(),
720 Builtin::Func(func) => func.fingerprint(),
721 Builtin::Source(coll) => coll.fingerprint(),
722 Builtin::Index(index) => index.fingerprint(),
723 Builtin::Connection(connection) => connection.fingerprint(),
724 }
725 }
726}
727
728impl<T: TypeReference> Fingerprint for &BuiltinType<T> {
730 fn fingerprint(&self) -> String {
731 "".to_string()
732 }
733}
734
735impl Fingerprint for &BuiltinFunc {
736 fn fingerprint(&self) -> String {
737 "".to_string()
738 }
739}
740
741impl Fingerprint for &BuiltinLog {
742 fn fingerprint(&self) -> String {
743 self.variant.desc().fingerprint()
744 }
745}
746
747impl Fingerprint for &BuiltinTable {
748 fn fingerprint(&self) -> String {
749 self.desc.fingerprint()
750 }
751}
752
753impl Fingerprint for &BuiltinView {
754 fn fingerprint(&self) -> String {
755 self.sql.to_string()
756 }
757}
758
759impl Fingerprint for &BuiltinSource {
760 fn fingerprint(&self) -> String {
761 self.desc.fingerprint()
762 }
763}
764
765impl Fingerprint for &BuiltinMaterializedView {
766 fn fingerprint(&self) -> String {
767 self.create_sql()
768 }
769}
770
771impl Fingerprint for &BuiltinIndex {
772 fn fingerprint(&self) -> String {
773 self.create_sql()
774 }
775}
776
777impl Fingerprint for &BuiltinConnection {
778 fn fingerprint(&self) -> String {
779 self.sql.to_string()
780 }
781}
782
783impl Fingerprint for RelationDesc {
784 fn fingerprint(&self) -> String {
785 self.typ().fingerprint()
786 }
787}
788
789impl Fingerprint for SqlRelationType {
790 fn fingerprint(&self) -> String {
791 serde_json::to_string(self).expect("serialization cannot fail")
792 }
793}
794
795pub(super) const PUBLIC_SELECT: MzAclItem = MzAclItem {
796 grantee: RoleId::Public,
797 grantor: MZ_SYSTEM_ROLE_ID,
798 acl_mode: AclMode::SELECT,
799};
800
801pub(super) const SUPPORT_SELECT: MzAclItem = MzAclItem {
802 grantee: MZ_SUPPORT_ROLE_ID,
803 grantor: MZ_SYSTEM_ROLE_ID,
804 acl_mode: AclMode::SELECT,
805};
806
807pub(super) const ANALYTICS_SELECT: MzAclItem = MzAclItem {
808 grantee: MZ_ANALYTICS_ROLE_ID,
809 grantor: MZ_SYSTEM_ROLE_ID,
810 acl_mode: AclMode::SELECT,
811};
812
813pub(super) const MONITOR_SELECT: MzAclItem = MzAclItem {
814 grantee: MZ_MONITOR_ROLE_ID,
815 grantor: MZ_SYSTEM_ROLE_ID,
816 acl_mode: AclMode::SELECT,
817};
818
819pub(super) const MONITOR_REDACTED_SELECT: MzAclItem = MzAclItem {
820 grantee: MZ_MONITOR_REDACTED_ROLE_ID,
821 grantor: MZ_SYSTEM_ROLE_ID,
822 acl_mode: AclMode::SELECT,
823};
824
825pub static MZ_CATALOG_RAW_DESCRIPTION: LazyLock<SystemObjectDescription> =
826 LazyLock::new(|| SystemObjectDescription {
827 schema_name: MZ_CATALOG_RAW.schema.to_string(),
828 object_type: CatalogItemType::Source,
829 object_name: MZ_CATALOG_RAW.name.to_string(),
830 });
831
832pub static MZ_STORAGE_USAGE_BY_SHARD_DESCRIPTION: LazyLock<SystemObjectDescription> =
833 LazyLock::new(|| SystemObjectDescription {
834 schema_name: MZ_STORAGE_USAGE_BY_SHARD.schema.to_string(),
835 object_type: CatalogItemType::Table,
836 object_name: MZ_STORAGE_USAGE_BY_SHARD.name.to_string(),
837 });
838
839pub static MZ_OBJECT_ARRANGEMENT_SIZE_HISTORY_DESCRIPTION: LazyLock<SystemObjectDescription> =
843 LazyLock::new(|| SystemObjectDescription {
844 schema_name: MZ_OBJECT_ARRANGEMENT_SIZE_HISTORY.schema.to_string(),
845 object_type: CatalogItemType::Table,
846 object_name: MZ_OBJECT_ARRANGEMENT_SIZE_HISTORY.name.to_string(),
847 });
848pub const MZ_SYSTEM_ROLE: BuiltinRole = BuiltinRole {
849 id: MZ_SYSTEM_ROLE_ID,
850 name: SYSTEM_USER_NAME,
851 oid: oid::ROLE_MZ_SYSTEM_OID,
852 attributes: RoleAttributesRaw::new().with_all(),
853};
854
855pub const MZ_SUPPORT_ROLE: BuiltinRole = BuiltinRole {
856 id: MZ_SUPPORT_ROLE_ID,
857 name: SUPPORT_USER_NAME,
858 oid: oid::ROLE_MZ_SUPPORT_OID,
859 attributes: RoleAttributesRaw::new(),
860};
861
862pub const MZ_ANALYTICS_ROLE: BuiltinRole = BuiltinRole {
863 id: MZ_ANALYTICS_ROLE_ID,
864 name: ANALYTICS_USER_NAME,
865 oid: oid::ROLE_MZ_ANALYTICS_OID,
866 attributes: RoleAttributesRaw::new(),
867};
868
869pub const MZ_MONITOR_ROLE: BuiltinRole = BuiltinRole {
872 id: MZ_MONITOR_ROLE_ID,
873 name: "mz_monitor",
874 oid: oid::ROLE_MZ_MONITOR_OID,
875 attributes: RoleAttributesRaw::new(),
876};
877
878pub const MZ_MONITOR_REDACTED: BuiltinRole = BuiltinRole {
881 id: MZ_MONITOR_REDACTED_ROLE_ID,
882 name: "mz_monitor_redacted",
883 oid: oid::ROLE_MZ_MONITOR_REDACTED_OID,
884 attributes: RoleAttributesRaw::new(),
885};
886
887pub const MZ_JWT_SYNC_ROLE: BuiltinRole = BuiltinRole {
890 id: MZ_JWT_SYNC_ROLE_ID,
891 name: JWT_SYNC_ROLE_NAME,
892 oid: oid::ROLE_MZ_JWT_SYNC_OID,
893 attributes: RoleAttributesRaw::new(),
894};
895
896pub const MZ_SYSTEM_CLUSTER: BuiltinCluster = BuiltinCluster {
897 name: SYSTEM_USER_NAME,
898 owner_id: &MZ_SYSTEM_ROLE_ID,
899 privileges: &[
900 MzAclItem {
901 grantee: MZ_SUPPORT_ROLE_ID,
902 grantor: MZ_SYSTEM_ROLE_ID,
903 acl_mode: AclMode::USAGE,
904 },
905 rbac::owner_privilege(ObjectType::Cluster, MZ_SYSTEM_ROLE_ID),
906 ],
907};
908
909pub const MZ_SYSTEM_CLUSTER_REPLICA: BuiltinClusterReplica = BuiltinClusterReplica {
910 name: BUILTIN_CLUSTER_REPLICA_NAME,
911 cluster_name: MZ_SYSTEM_CLUSTER.name,
912};
913
914pub const MZ_CATALOG_SERVER_CLUSTER: BuiltinCluster = BuiltinCluster {
915 name: "mz_catalog_server",
916 owner_id: &MZ_SYSTEM_ROLE_ID,
917 privileges: &[
918 MzAclItem {
919 grantee: RoleId::Public,
920 grantor: MZ_SYSTEM_ROLE_ID,
921 acl_mode: AclMode::USAGE,
922 },
923 MzAclItem {
924 grantee: MZ_SUPPORT_ROLE_ID,
925 grantor: MZ_SYSTEM_ROLE_ID,
926 acl_mode: AclMode::USAGE.union(AclMode::CREATE),
927 },
928 rbac::owner_privilege(ObjectType::Cluster, MZ_SYSTEM_ROLE_ID),
929 ],
930};
931
932pub const MZ_CATALOG_SERVER_CLUSTER_REPLICA: BuiltinClusterReplica = BuiltinClusterReplica {
933 name: BUILTIN_CLUSTER_REPLICA_NAME,
934 cluster_name: MZ_CATALOG_SERVER_CLUSTER.name,
935};
936
937pub const MZ_PROBE_CLUSTER: BuiltinCluster = BuiltinCluster {
938 name: "mz_probe",
939 owner_id: &MZ_SYSTEM_ROLE_ID,
940 privileges: &[
941 MzAclItem {
942 grantee: MZ_SUPPORT_ROLE_ID,
943 grantor: MZ_SYSTEM_ROLE_ID,
944 acl_mode: AclMode::USAGE,
945 },
946 MzAclItem {
947 grantee: MZ_MONITOR_ROLE_ID,
948 grantor: MZ_SYSTEM_ROLE_ID,
949 acl_mode: AclMode::USAGE,
950 },
951 rbac::owner_privilege(ObjectType::Cluster, MZ_SYSTEM_ROLE_ID),
952 ],
953};
954pub const MZ_PROBE_CLUSTER_REPLICA: BuiltinClusterReplica = BuiltinClusterReplica {
955 name: BUILTIN_CLUSTER_REPLICA_NAME,
956 cluster_name: MZ_PROBE_CLUSTER.name,
957};
958
959pub const MZ_SUPPORT_CLUSTER: BuiltinCluster = BuiltinCluster {
960 name: "mz_support",
961 owner_id: &MZ_SUPPORT_ROLE_ID,
962 privileges: &[
963 MzAclItem {
964 grantee: MZ_SYSTEM_ROLE_ID,
965 grantor: MZ_SUPPORT_ROLE_ID,
966 acl_mode: rbac::all_object_privileges(SystemObjectType::Object(ObjectType::Cluster)),
967 },
968 rbac::owner_privilege(ObjectType::Cluster, MZ_SUPPORT_ROLE_ID),
969 ],
970};
971
972pub const MZ_ANALYTICS_CLUSTER: BuiltinCluster = BuiltinCluster {
973 name: "mz_analytics",
974 owner_id: &MZ_ANALYTICS_ROLE_ID,
975 privileges: &[
976 MzAclItem {
977 grantee: MZ_SYSTEM_ROLE_ID,
978 grantor: MZ_ANALYTICS_ROLE_ID,
979 acl_mode: rbac::all_object_privileges(SystemObjectType::Object(ObjectType::Cluster)),
980 },
981 rbac::owner_privilege(ObjectType::Cluster, MZ_ANALYTICS_ROLE_ID),
982 ],
983};
984
985pub static BUILTINS_STATIC: LazyLock<Vec<Builtin<NameReference>>> = LazyLock::new(|| {
987 let mut builtin_types = vec![
988 Builtin::Type(&TYPE_ANY),
989 Builtin::Type(&TYPE_ANYARRAY),
990 Builtin::Type(&TYPE_ANYELEMENT),
991 Builtin::Type(&TYPE_ANYNONARRAY),
992 Builtin::Type(&TYPE_ANYRANGE),
993 Builtin::Type(&TYPE_BOOL),
994 Builtin::Type(&TYPE_BOOL_ARRAY),
995 Builtin::Type(&TYPE_BYTEA),
996 Builtin::Type(&TYPE_BYTEA_ARRAY),
997 Builtin::Type(&TYPE_BPCHAR),
998 Builtin::Type(&TYPE_BPCHAR_ARRAY),
999 Builtin::Type(&TYPE_CHAR),
1000 Builtin::Type(&TYPE_CHAR_ARRAY),
1001 Builtin::Type(&TYPE_DATE),
1002 Builtin::Type(&TYPE_DATE_ARRAY),
1003 Builtin::Type(&TYPE_FLOAT4),
1004 Builtin::Type(&TYPE_FLOAT4_ARRAY),
1005 Builtin::Type(&TYPE_FLOAT8),
1006 Builtin::Type(&TYPE_FLOAT8_ARRAY),
1007 Builtin::Type(&TYPE_INT4),
1008 Builtin::Type(&TYPE_INT4_ARRAY),
1009 Builtin::Type(&TYPE_INT8),
1010 Builtin::Type(&TYPE_INT8_ARRAY),
1011 Builtin::Type(&TYPE_INTERVAL),
1012 Builtin::Type(&TYPE_INTERVAL_ARRAY),
1013 Builtin::Type(&TYPE_JSONB),
1014 Builtin::Type(&TYPE_JSONB_ARRAY),
1015 Builtin::Type(&TYPE_LIST),
1016 Builtin::Type(&TYPE_MAP),
1017 Builtin::Type(&TYPE_NAME),
1018 Builtin::Type(&TYPE_NAME_ARRAY),
1019 Builtin::Type(&TYPE_NUMERIC),
1020 Builtin::Type(&TYPE_NUMERIC_ARRAY),
1021 Builtin::Type(&TYPE_OID),
1022 Builtin::Type(&TYPE_OID_ARRAY),
1023 Builtin::Type(&TYPE_RECORD),
1024 Builtin::Type(&TYPE_RECORD_ARRAY),
1025 Builtin::Type(&TYPE_REGCLASS),
1026 Builtin::Type(&TYPE_REGCLASS_ARRAY),
1027 Builtin::Type(&TYPE_REGPROC),
1028 Builtin::Type(&TYPE_REGPROC_ARRAY),
1029 Builtin::Type(&TYPE_REGTYPE),
1030 Builtin::Type(&TYPE_REGTYPE_ARRAY),
1031 Builtin::Type(&TYPE_INT2),
1032 Builtin::Type(&TYPE_INT2_ARRAY),
1033 Builtin::Type(&TYPE_TEXT),
1034 Builtin::Type(&TYPE_TEXT_ARRAY),
1035 Builtin::Type(&TYPE_TIME),
1036 Builtin::Type(&TYPE_TIME_ARRAY),
1037 Builtin::Type(&TYPE_TIMESTAMP),
1038 Builtin::Type(&TYPE_TIMESTAMP_ARRAY),
1039 Builtin::Type(&TYPE_TIMESTAMPTZ),
1040 Builtin::Type(&TYPE_TIMESTAMPTZ_ARRAY),
1041 Builtin::Type(&TYPE_UUID),
1042 Builtin::Type(&TYPE_UUID_ARRAY),
1043 Builtin::Type(&TYPE_VARCHAR),
1044 Builtin::Type(&TYPE_VARCHAR_ARRAY),
1045 Builtin::Type(&TYPE_INT2_VECTOR),
1046 Builtin::Type(&TYPE_INT2_VECTOR_ARRAY),
1047 Builtin::Type(&TYPE_ANYCOMPATIBLE),
1048 Builtin::Type(&TYPE_ANYCOMPATIBLEARRAY),
1049 Builtin::Type(&TYPE_ANYCOMPATIBLENONARRAY),
1050 Builtin::Type(&TYPE_ANYCOMPATIBLELIST),
1051 Builtin::Type(&TYPE_ANYCOMPATIBLEMAP),
1052 Builtin::Type(&TYPE_ANYCOMPATIBLERANGE),
1053 Builtin::Type(&TYPE_UINT2),
1054 Builtin::Type(&TYPE_UINT2_ARRAY),
1055 Builtin::Type(&TYPE_UINT4),
1056 Builtin::Type(&TYPE_UINT4_ARRAY),
1057 Builtin::Type(&TYPE_UINT8),
1058 Builtin::Type(&TYPE_UINT8_ARRAY),
1059 Builtin::Type(&TYPE_MZ_TIMESTAMP),
1060 Builtin::Type(&TYPE_MZ_TIMESTAMP_ARRAY),
1061 Builtin::Type(&TYPE_INT4_RANGE),
1062 Builtin::Type(&TYPE_INT4_RANGE_ARRAY),
1063 Builtin::Type(&TYPE_INT8_RANGE),
1064 Builtin::Type(&TYPE_INT8_RANGE_ARRAY),
1065 Builtin::Type(&TYPE_DATE_RANGE),
1066 Builtin::Type(&TYPE_DATE_RANGE_ARRAY),
1067 Builtin::Type(&TYPE_NUM_RANGE),
1068 Builtin::Type(&TYPE_NUM_RANGE_ARRAY),
1069 Builtin::Type(&TYPE_TS_RANGE),
1070 Builtin::Type(&TYPE_TS_RANGE_ARRAY),
1071 Builtin::Type(&TYPE_TSTZ_RANGE),
1072 Builtin::Type(&TYPE_TSTZ_RANGE_ARRAY),
1073 Builtin::Type(&TYPE_MZ_ACL_ITEM),
1074 Builtin::Type(&TYPE_MZ_ACL_ITEM_ARRAY),
1075 Builtin::Type(&TYPE_ACL_ITEM),
1076 Builtin::Type(&TYPE_ACL_ITEM_ARRAY),
1077 Builtin::Type(&TYPE_INTERNAL),
1078 ];
1079
1080 let mut builtin_funcs = Vec::new();
1081 for (schema, funcs) in &[
1082 (PG_CATALOG_SCHEMA, &*mz_sql::func::PG_CATALOG_BUILTINS),
1083 (
1084 INFORMATION_SCHEMA,
1085 &*mz_sql::func::INFORMATION_SCHEMA_BUILTINS,
1086 ),
1087 (MZ_CATALOG_SCHEMA, &*mz_sql::func::MZ_CATALOG_BUILTINS),
1088 (MZ_INTERNAL_SCHEMA, &*mz_sql::func::MZ_INTERNAL_BUILTINS),
1089 (MZ_UNSAFE_SCHEMA, &*mz_sql::func::MZ_UNSAFE_BUILTINS),
1090 ] {
1091 for (name, func) in funcs.iter() {
1092 builtin_funcs.push(Builtin::Func(BuiltinFunc {
1093 name,
1094 schema,
1095 inner: func,
1096 }));
1097 }
1098 }
1099
1100 let mut builtin_items = vec![
1101 Builtin::Source(&MZ_CATALOG_RAW),
1102 Builtin::Log(&MZ_ARRANGEMENT_SHARING_RAW),
1103 Builtin::Log(&MZ_ARRANGEMENT_BATCHES_RAW),
1104 Builtin::Log(&MZ_ARRANGEMENT_RECORDS_RAW),
1105 Builtin::Log(&MZ_ARRANGEMENT_BATCHER_RECORDS_RAW),
1106 Builtin::Log(&MZ_ARRANGEMENT_BATCHER_SIZE_RAW),
1107 Builtin::Log(&MZ_ARRANGEMENT_BATCHER_CAPACITY_RAW),
1108 Builtin::Log(&MZ_ARRANGEMENT_BATCHER_ALLOCATIONS_RAW),
1109 Builtin::Log(&MZ_DATAFLOW_CHANNELS_PER_WORKER),
1110 Builtin::Log(&MZ_DATAFLOW_OPERATORS_PER_WORKER),
1111 Builtin::Log(&MZ_DATAFLOW_ADDRESSES_PER_WORKER),
1112 Builtin::Log(&MZ_DATAFLOW_OPERATOR_REACHABILITY_RAW),
1113 Builtin::Log(&MZ_COMPUTE_EXPORTS_PER_WORKER),
1114 Builtin::Log(&MZ_COMPUTE_DATAFLOW_GLOBAL_IDS_PER_WORKER),
1115 Builtin::Log(&MZ_CLUSTER_PROMETHEUS_METRICS),
1116 Builtin::Log(&MZ_MESSAGE_COUNTS_RECEIVED_RAW),
1117 Builtin::Log(&MZ_MESSAGE_COUNTS_SENT_RAW),
1118 Builtin::Log(&MZ_MESSAGE_BATCH_COUNTS_RECEIVED_RAW),
1119 Builtin::Log(&MZ_MESSAGE_BATCH_COUNTS_SENT_RAW),
1120 Builtin::Log(&MZ_ACTIVE_PEEKS_PER_WORKER),
1121 Builtin::Log(&MZ_PEEK_DURATIONS_HISTOGRAM_RAW),
1122 Builtin::Log(&MZ_ARRANGEMENT_HEAP_CAPACITY_RAW),
1123 Builtin::Log(&MZ_ARRANGEMENT_HEAP_ALLOCATIONS_RAW),
1124 Builtin::Log(&MZ_ARRANGEMENT_HEAP_SIZE_RAW),
1125 Builtin::Log(&MZ_SCHEDULING_ELAPSED_RAW),
1126 Builtin::Log(&MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM_RAW),
1127 Builtin::Log(&MZ_SCHEDULING_PARKS_HISTOGRAM_RAW),
1128 Builtin::Log(&MZ_COMPUTE_FRONTIERS_PER_WORKER),
1129 Builtin::Log(&MZ_COMPUTE_IMPORT_FRONTIERS_PER_WORKER),
1130 Builtin::Log(&MZ_COMPUTE_ERROR_COUNTS_RAW),
1131 Builtin::Log(&MZ_COMPUTE_HYDRATION_TIMES_PER_WORKER),
1132 Builtin::Log(&MZ_COMPUTE_OPERATOR_HYDRATION_STATUSES_PER_WORKER),
1133 Builtin::Table(&MZ_KAFKA_SINKS),
1134 Builtin::Table(&MZ_KAFKA_CONNECTIONS),
1135 Builtin::MaterializedView(&MZ_KAFKA_SOURCES),
1136 Builtin::Table(&MZ_OBJECT_DEPENDENCIES),
1137 Builtin::Table(&MZ_ICEBERG_SINKS),
1138 Builtin::MaterializedView(&MZ_DATABASES),
1139 Builtin::MaterializedView(&MZ_SCHEMAS),
1140 Builtin::Table(&MZ_COLUMNS),
1141 Builtin::Table(&MZ_INDEX_COLUMNS),
1143 Builtin::Table(&MZ_TABLES),
1144 Builtin::Table(&MZ_SOURCE_REFERENCES),
1146 Builtin::MaterializedView(&MZ_POSTGRES_SOURCES),
1147 Builtin::Table(&MZ_POSTGRES_SOURCE_TABLES),
1148 Builtin::Table(&MZ_MYSQL_SOURCE_TABLES),
1149 Builtin::Table(&MZ_SQL_SERVER_SOURCE_TABLES),
1150 Builtin::Table(&MZ_KAFKA_SOURCE_TABLES),
1151 Builtin::Table(&MZ_SINKS),
1152 Builtin::Table(&MZ_VIEWS),
1153 Builtin::Table(&MZ_TYPES),
1154 Builtin::Table(&MZ_TYPE_PG_METADATA),
1155 Builtin::Table(&MZ_ARRAY_TYPES),
1156 Builtin::Table(&MZ_BASE_TYPES),
1157 Builtin::Table(&MZ_LIST_TYPES),
1158 Builtin::Table(&MZ_MAP_TYPES),
1159 Builtin::MaterializedView(&MZ_ROLES),
1160 Builtin::Table(&MZ_ROLE_AUTH),
1161 Builtin::MaterializedView(&MZ_ROLE_MEMBERS),
1162 Builtin::MaterializedView(&MZ_ROLE_PARAMETERS),
1163 Builtin::Table(&MZ_PSEUDO_TYPES),
1164 Builtin::Table(&MZ_FUNCTIONS),
1165 Builtin::Table(&MZ_OPERATORS),
1166 Builtin::Table(&MZ_AGGREGATES),
1167 Builtin::Table(&MZ_CLUSTER_REPLICA_SIZES),
1168 Builtin::Table(&MZ_CLUSTER_REPLICA_SIZE_INTERNAL),
1169 Builtin::MaterializedView(&MZ_CLUSTERS),
1170 Builtin::MaterializedView(&MZ_CLUSTER_WORKLOAD_CLASSES),
1171 Builtin::MaterializedView(&MZ_CLUSTER_SCHEDULES),
1172 Builtin::MaterializedView(&MZ_CLUSTER_RECONFIGURATIONS),
1173 Builtin::MaterializedView(&MZ_CLUSTER_AUTO_SCALING_STRATEGIES),
1174 Builtin::MaterializedView(&MZ_SECRETS),
1175 Builtin::MaterializedView(&MZ_CONNECTIONS),
1176 Builtin::Table(&MZ_SSH_TUNNEL_CONNECTIONS),
1177 Builtin::MaterializedView(&MZ_CLUSTER_REPLICAS),
1178 Builtin::Source(&MZ_CLUSTER_REPLICA_METRICS_HISTORY),
1179 Builtin::View(&MZ_CLUSTER_REPLICA_METRICS),
1180 Builtin::Source(&MZ_CLUSTER_REPLICA_STATUS_HISTORY),
1181 Builtin::View(&MZ_CLUSTER_REPLICA_STATUSES),
1182 Builtin::MaterializedView(&MZ_INTERNAL_CLUSTER_REPLICAS),
1183 Builtin::MaterializedView(&MZ_PENDING_CLUSTER_REPLICAS),
1184 Builtin::MaterializedView(&MZ_AUDIT_EVENTS),
1185 Builtin::Table(&MZ_STORAGE_USAGE_BY_SHARD),
1186 Builtin::Table(&MZ_EGRESS_IPS),
1187 Builtin::Table(&MZ_AWS_PRIVATELINK_CONNECTIONS),
1188 Builtin::Table(&MZ_AWS_CONNECTIONS),
1189 Builtin::Table(&MZ_SUBSCRIPTIONS),
1190 Builtin::Table(&MZ_SESSIONS),
1191 Builtin::MaterializedView(&MZ_OVERRIDDEN_SYSTEM_PARAMETERS),
1192 Builtin::MaterializedView(&MZ_CLUSTER_SYSTEM_PARAMETERS),
1193 Builtin::MaterializedView(&MZ_REPLICA_SYSTEM_PARAMETERS),
1194 Builtin::MaterializedView(&MZ_DEFAULT_PRIVILEGES),
1195 Builtin::MaterializedView(&MZ_SYSTEM_PRIVILEGES),
1196 Builtin::MaterializedView(&MZ_COMMENTS),
1197 Builtin::Table(&MZ_WEBHOOKS_SOURCES),
1198 Builtin::Table(&MZ_HISTORY_RETENTION_STRATEGIES),
1199 Builtin::MaterializedView(&MZ_MATERIALIZED_VIEWS),
1200 Builtin::Table(&MZ_MATERIALIZED_VIEW_REFRESH_STRATEGIES),
1201 Builtin::MaterializedView(&MZ_NETWORK_POLICIES),
1202 Builtin::MaterializedView(&MZ_NETWORK_POLICY_RULES),
1203 Builtin::Table(&MZ_LICENSE_KEYS),
1204 Builtin::Table(&MZ_REPLACEMENTS),
1205 Builtin::View(&MZ_RELATIONS),
1206 Builtin::View(&MZ_OBJECT_OID_ALIAS),
1207 Builtin::View(&MZ_OBJECTS),
1208 Builtin::View(&MZ_OBJECT_FULLY_QUALIFIED_NAMES),
1209 Builtin::View(&MZ_OBJECTS_ID_NAMESPACE_TYPES),
1210 Builtin::View(&MZ_OBJECT_HISTORY),
1211 Builtin::View(&MZ_OBJECT_LIFETIMES),
1212 Builtin::Table(&MZ_OBJECT_GLOBAL_IDS),
1213 Builtin::View(&MZ_ARRANGEMENT_SHARING_PER_WORKER),
1214 Builtin::View(&MZ_ARRANGEMENT_SHARING),
1215 Builtin::View(&MZ_ARRANGEMENT_SIZES_PER_WORKER),
1216 Builtin::View(&MZ_ARRANGEMENT_SIZES),
1217 Builtin::View(&MZ_DATAFLOWS_PER_WORKER),
1218 Builtin::View(&MZ_DATAFLOWS),
1219 Builtin::View(&MZ_DATAFLOW_ADDRESSES),
1220 Builtin::View(&MZ_DATAFLOW_CHANNELS),
1221 Builtin::View(&MZ_DATAFLOW_OPERATORS),
1222 Builtin::View(&MZ_DATAFLOW_GLOBAL_IDS),
1223 Builtin::View(&MZ_COMPUTE_EXPORTS),
1224 Builtin::View(&MZ_MAPPABLE_OBJECTS),
1225 Builtin::View(&MZ_DATAFLOW_OPERATOR_DATAFLOWS_PER_WORKER),
1226 Builtin::View(&MZ_DATAFLOW_OPERATOR_DATAFLOWS),
1227 Builtin::View(&MZ_OBJECT_TRANSITIVE_DEPENDENCIES),
1228 Builtin::View(&MZ_DATAFLOW_OPERATOR_REACHABILITY_PER_WORKER),
1229 Builtin::View(&MZ_DATAFLOW_OPERATOR_REACHABILITY),
1230 Builtin::View(&MZ_CLUSTER_REPLICA_UTILIZATION),
1231 Builtin::View(&MZ_CLUSTER_REPLICA_UTILIZATION_HISTORY),
1232 Builtin::View(&MZ_DATAFLOW_OPERATOR_PARENTS_PER_WORKER),
1233 Builtin::View(&MZ_DATAFLOW_OPERATOR_PARENTS),
1234 Builtin::View(&MZ_DATAFLOW_ARRANGEMENT_SIZES),
1235 Builtin::View(&MZ_EXPECTED_GROUP_SIZE_ADVICE),
1236 Builtin::View(&MZ_COMPUTE_FRONTIERS),
1237 Builtin::View(&MZ_DATAFLOW_CHANNEL_OPERATORS_PER_WORKER),
1238 Builtin::View(&MZ_DATAFLOW_CHANNEL_OPERATORS),
1239 Builtin::View(&MZ_COMPUTE_IMPORT_FRONTIERS),
1240 Builtin::View(&MZ_MESSAGE_COUNTS_PER_WORKER),
1241 Builtin::View(&MZ_MESSAGE_COUNTS),
1242 Builtin::View(&MZ_ACTIVE_PEEKS),
1243 Builtin::View(&MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM_PER_WORKER),
1244 Builtin::View(&MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM),
1245 Builtin::View(&MZ_RECORDS_PER_DATAFLOW_OPERATOR_PER_WORKER),
1246 Builtin::View(&MZ_RECORDS_PER_DATAFLOW_OPERATOR),
1247 Builtin::View(&MZ_RECORDS_PER_DATAFLOW_PER_WORKER),
1248 Builtin::View(&MZ_RECORDS_PER_DATAFLOW),
1249 Builtin::View(&MZ_PEEK_DURATIONS_HISTOGRAM_PER_WORKER),
1250 Builtin::View(&MZ_PEEK_DURATIONS_HISTOGRAM),
1251 Builtin::View(&MZ_SCHEDULING_ELAPSED_PER_WORKER),
1252 Builtin::View(&MZ_SCHEDULING_ELAPSED),
1253 Builtin::View(&MZ_SCHEDULING_PARKS_HISTOGRAM_PER_WORKER),
1254 Builtin::View(&MZ_SCHEDULING_PARKS_HISTOGRAM),
1255 Builtin::View(&MZ_SHOW_ALL_OBJECTS),
1256 Builtin::View(&MZ_SHOW_COLUMNS),
1257 Builtin::View(&MZ_SHOW_CLUSTERS),
1258 Builtin::View(&MZ_SHOW_SECRETS),
1259 Builtin::View(&MZ_SHOW_DATABASES),
1260 Builtin::View(&MZ_SHOW_SCHEMAS),
1261 Builtin::View(&MZ_SHOW_TABLES),
1262 Builtin::View(&MZ_SHOW_VIEWS),
1263 Builtin::View(&MZ_SHOW_TYPES),
1264 Builtin::View(&MZ_SHOW_ROLES),
1265 Builtin::View(&MZ_SHOW_CONNECTIONS),
1266 Builtin::View(&MZ_SHOW_SOURCES),
1267 Builtin::View(&MZ_SHOW_SINKS),
1268 Builtin::View(&MZ_SHOW_MATERIALIZED_VIEWS),
1269 Builtin::View(&MZ_SHOW_INDEXES),
1270 Builtin::View(&MZ_CLUSTER_REPLICA_HISTORY),
1271 Builtin::View(&MZ_CLUSTER_REPLICA_NAME_HISTORY),
1272 Builtin::View(&MZ_TIMEZONE_NAMES),
1273 Builtin::View(&MZ_TIMEZONE_ABBREVIATIONS),
1274 Builtin::View(&PG_NAMESPACE_ALL_DATABASES),
1275 Builtin::Index(&PG_NAMESPACE_ALL_DATABASES_IND),
1276 Builtin::View(&PG_NAMESPACE),
1277 Builtin::View(&PG_CLASS_ALL_DATABASES),
1278 Builtin::Index(&PG_CLASS_ALL_DATABASES_IND),
1279 Builtin::View(&PG_CLASS),
1280 Builtin::View(&PG_DEPEND),
1281 Builtin::View(&PG_DATABASE),
1282 Builtin::View(&PG_INDEX),
1283 Builtin::View(&PG_TYPE_ALL_DATABASES),
1284 Builtin::Index(&PG_TYPE_ALL_DATABASES_IND),
1285 Builtin::View(&PG_TYPE),
1286 Builtin::View(&PG_DESCRIPTION_ALL_DATABASES),
1287 Builtin::Index(&PG_DESCRIPTION_ALL_DATABASES_IND),
1288 Builtin::View(&PG_DESCRIPTION),
1289 Builtin::View(&PG_ATTRIBUTE_ALL_DATABASES),
1290 Builtin::Index(&PG_ATTRIBUTE_ALL_DATABASES_IND),
1291 Builtin::View(&PG_ATTRIBUTE),
1292 Builtin::View(&PG_PROC),
1293 Builtin::View(&PG_OPERATOR),
1294 Builtin::View(&PG_RANGE),
1295 Builtin::View(&PG_ENUM),
1296 Builtin::View(&PG_ATTRDEF_ALL_DATABASES),
1297 Builtin::Index(&PG_ATTRDEF_ALL_DATABASES_IND),
1298 Builtin::View(&PG_ATTRDEF),
1299 Builtin::View(&PG_SETTINGS),
1300 Builtin::View(&PG_AUTH_MEMBERS),
1301 Builtin::View(&PG_CONSTRAINT),
1302 Builtin::View(&PG_TABLES),
1303 Builtin::View(&PG_TABLESPACE),
1304 Builtin::View(&PG_ACCESS_METHODS),
1305 Builtin::View(&PG_LOCKS),
1306 Builtin::View(&PG_AUTHID_CORE),
1307 Builtin::Index(&PG_AUTHID_CORE_IND),
1308 Builtin::View(&PG_AUTHID),
1309 Builtin::View(&PG_ROLES),
1310 Builtin::View(&PG_USER),
1311 Builtin::View(&PG_VIEWS),
1312 Builtin::View(&PG_MATVIEWS),
1313 Builtin::View(&PG_COLLATION),
1314 Builtin::View(&PG_POLICY),
1315 Builtin::View(&PG_INHERITS),
1316 Builtin::View(&PG_AGGREGATE),
1317 Builtin::View(&PG_TRIGGER),
1318 Builtin::View(&PG_REWRITE),
1319 Builtin::View(&PG_EXTENSION),
1320 Builtin::View(&PG_EVENT_TRIGGER),
1321 Builtin::View(&PG_LANGUAGE),
1322 Builtin::View(&PG_SHDESCRIPTION),
1323 Builtin::View(&PG_INDEXES),
1324 Builtin::View(&PG_TIMEZONE_ABBREVS),
1325 Builtin::View(&PG_TIMEZONE_NAMES),
1326 Builtin::View(&INFORMATION_SCHEMA_APPLICABLE_ROLES),
1327 Builtin::View(&INFORMATION_SCHEMA_COLUMNS),
1328 Builtin::View(&INFORMATION_SCHEMA_ENABLED_ROLES),
1329 Builtin::View(&INFORMATION_SCHEMA_KEY_COLUMN_USAGE),
1330 Builtin::View(&INFORMATION_SCHEMA_REFERENTIAL_CONSTRAINTS),
1331 Builtin::View(&INFORMATION_SCHEMA_ROUTINES),
1332 Builtin::View(&INFORMATION_SCHEMA_SCHEMATA),
1333 Builtin::View(&INFORMATION_SCHEMA_TABLES),
1334 Builtin::View(&INFORMATION_SCHEMA_TABLE_CONSTRAINTS),
1335 Builtin::View(&INFORMATION_SCHEMA_TABLE_PRIVILEGES),
1336 Builtin::View(&INFORMATION_SCHEMA_ROLE_TABLE_GRANTS),
1337 Builtin::View(&INFORMATION_SCHEMA_TRIGGERS),
1338 Builtin::View(&INFORMATION_SCHEMA_VIEWS),
1339 Builtin::View(&INFORMATION_SCHEMA_CHARACTER_SETS),
1340 Builtin::View(&MZ_SHOW_ROLE_MEMBERS),
1341 Builtin::View(&MZ_SHOW_MY_ROLE_MEMBERS),
1342 Builtin::View(&MZ_SHOW_SYSTEM_PRIVILEGES),
1343 Builtin::View(&MZ_SHOW_MY_SYSTEM_PRIVILEGES),
1344 Builtin::View(&MZ_SHOW_CLUSTER_PRIVILEGES),
1345 Builtin::View(&MZ_SHOW_MY_CLUSTER_PRIVILEGES),
1346 Builtin::View(&MZ_SHOW_DATABASE_PRIVILEGES),
1347 Builtin::View(&MZ_SHOW_MY_DATABASE_PRIVILEGES),
1348 Builtin::View(&MZ_SHOW_SCHEMA_PRIVILEGES),
1349 Builtin::View(&MZ_SHOW_MY_SCHEMA_PRIVILEGES),
1350 Builtin::View(&MZ_SHOW_OBJECT_PRIVILEGES),
1351 Builtin::View(&MZ_SHOW_MY_OBJECT_PRIVILEGES),
1352 Builtin::View(&MZ_SHOW_ALL_PRIVILEGES),
1353 Builtin::View(&MZ_SHOW_ALL_MY_PRIVILEGES),
1354 Builtin::View(&MZ_SHOW_DEFAULT_PRIVILEGES),
1355 Builtin::View(&MZ_SHOW_MY_DEFAULT_PRIVILEGES),
1356 Builtin::Source(&MZ_SINK_STATUS_HISTORY),
1357 Builtin::View(&MZ_SINK_STATUSES),
1358 Builtin::Source(&MZ_SOURCE_STATUS_HISTORY),
1359 Builtin::Source(&MZ_AWS_PRIVATELINK_CONNECTION_STATUS_HISTORY),
1360 Builtin::View(&MZ_AWS_PRIVATELINK_CONNECTION_STATUSES),
1361 Builtin::Source(&MZ_STATEMENT_EXECUTION_HISTORY),
1362 Builtin::View(&MZ_STATEMENT_EXECUTION_HISTORY_REDACTED),
1363 Builtin::Source(&MZ_PREPARED_STATEMENT_HISTORY),
1364 Builtin::Source(&MZ_SESSION_HISTORY),
1365 Builtin::Source(&MZ_SQL_TEXT),
1366 Builtin::View(&MZ_SQL_TEXT_REDACTED),
1367 Builtin::View(&MZ_RECENT_SQL_TEXT),
1368 Builtin::View(&MZ_RECENT_SQL_TEXT_REDACTED),
1369 Builtin::Index(&MZ_RECENT_SQL_TEXT_IND),
1370 Builtin::View(&MZ_ACTIVITY_LOG_THINNED),
1371 Builtin::View(&MZ_RECENT_ACTIVITY_LOG_THINNED),
1372 Builtin::View(&MZ_RECENT_ACTIVITY_LOG),
1373 Builtin::View(&MZ_RECENT_ACTIVITY_LOG_REDACTED),
1374 Builtin::Index(&MZ_RECENT_ACTIVITY_LOG_THINNED_IND),
1375 Builtin::View(&MZ_SOURCE_STATUSES),
1376 Builtin::Source(&MZ_STATEMENT_LIFECYCLE_HISTORY),
1377 Builtin::Source(&MZ_STORAGE_SHARDS),
1378 Builtin::Source(&MZ_SOURCE_STATISTICS_RAW),
1379 Builtin::Source(&MZ_SINK_STATISTICS_RAW),
1380 Builtin::View(&MZ_SOURCE_STATISTICS_WITH_HISTORY),
1381 Builtin::Index(&MZ_SOURCE_STATISTICS_WITH_HISTORY_IND),
1382 Builtin::View(&MZ_SOURCE_STATISTICS),
1383 Builtin::Index(&MZ_SOURCE_STATISTICS_IND),
1384 Builtin::View(&MZ_SINK_STATISTICS),
1385 Builtin::Index(&MZ_SINK_STATISTICS_IND),
1386 Builtin::View(&MZ_STORAGE_USAGE),
1387 Builtin::Source(&MZ_FRONTIERS),
1388 Builtin::View(&MZ_GLOBAL_FRONTIERS),
1389 Builtin::Source(&MZ_WALLCLOCK_LAG_HISTORY),
1390 Builtin::View(&MZ_WALLCLOCK_GLOBAL_LAG_HISTORY),
1391 Builtin::View(&MZ_WALLCLOCK_GLOBAL_LAG_RECENT_HISTORY),
1392 Builtin::View(&MZ_WALLCLOCK_GLOBAL_LAG),
1393 Builtin::Source(&MZ_WALLCLOCK_GLOBAL_LAG_HISTOGRAM_RAW),
1394 Builtin::View(&MZ_WALLCLOCK_GLOBAL_LAG_HISTOGRAM),
1395 Builtin::Source(&MZ_MATERIALIZED_VIEW_REFRESHES),
1396 Builtin::Source(&MZ_COMPUTE_DEPENDENCIES),
1397 Builtin::View(&MZ_MATERIALIZATION_DEPENDENCIES),
1398 Builtin::View(&MZ_MATERIALIZATION_LAG),
1399 Builtin::View(&MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW),
1400 Builtin::View(&MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW_3H),
1401 Builtin::View(&MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW_24H),
1402 Builtin::View(&MZ_COMPUTE_ERROR_COUNTS_PER_WORKER),
1403 Builtin::View(&MZ_COMPUTE_ERROR_COUNTS),
1404 Builtin::Source(&MZ_COMPUTE_ERROR_COUNTS_RAW_UNIFIED),
1405 Builtin::Source(&MZ_COMPUTE_HYDRATION_TIMES),
1406 Builtin::Source(&MZ_OBJECT_ARRANGEMENT_SIZES_UNIFIED),
1407 Builtin::Index(&MZ_OBJECT_ARRANGEMENT_SIZES_IND),
1408 Builtin::Table(&MZ_OBJECT_ARRANGEMENT_SIZE_HISTORY),
1409 Builtin::Index(&MZ_OBJECT_ARRANGEMENT_SIZE_HISTORY_OBJECT_IND),
1410 Builtin::Index(&MZ_OBJECT_ARRANGEMENT_SIZE_HISTORY_TS_IND),
1411 Builtin::Log(&MZ_COMPUTE_LIR_MAPPING_PER_WORKER),
1412 Builtin::View(&MZ_LIR_MAPPING),
1413 Builtin::Source(&MZ_COMPUTE_OPERATOR_HYDRATION_STATUSES),
1414 Builtin::Source(&MZ_CLUSTER_REPLICA_FRONTIERS),
1415 Builtin::View(&MZ_COMPUTE_HYDRATION_STATUSES),
1416 Builtin::View(&MZ_HYDRATION_STATUSES),
1417 Builtin::Index(&MZ_HYDRATION_STATUSES_IND),
1418 Builtin::View(&MZ_SHOW_CLUSTER_REPLICAS),
1419 Builtin::View(&MZ_SHOW_NETWORK_POLICIES),
1420 Builtin::View(&MZ_CLUSTER_DEPLOYMENT_LINEAGE),
1421 Builtin::Index(&MZ_SHOW_DATABASES_IND),
1422 Builtin::Index(&MZ_SHOW_SCHEMAS_IND),
1423 Builtin::Index(&MZ_SHOW_CONNECTIONS_IND),
1424 Builtin::Index(&MZ_SHOW_TABLES_IND),
1425 Builtin::Index(&MZ_SHOW_SOURCES_IND),
1426 Builtin::Index(&MZ_SHOW_VIEWS_IND),
1427 Builtin::Index(&MZ_SHOW_MATERIALIZED_VIEWS_IND),
1428 Builtin::Index(&MZ_SHOW_SINKS_IND),
1429 Builtin::Index(&MZ_SHOW_TYPES_IND),
1430 Builtin::Index(&MZ_SHOW_ALL_OBJECTS_IND),
1431 Builtin::Index(&MZ_SHOW_INDEXES_IND),
1432 Builtin::Index(&MZ_SHOW_COLUMNS_IND),
1433 Builtin::Index(&MZ_SHOW_CLUSTERS_IND),
1434 Builtin::Index(&MZ_SHOW_CLUSTER_REPLICAS_IND),
1435 Builtin::Index(&MZ_SHOW_SECRETS_IND),
1436 Builtin::Index(&MZ_SHOW_ROLES_IND),
1437 Builtin::Index(&MZ_CLUSTERS_IND),
1438 Builtin::Index(&MZ_CLUSTER_RECONFIGURATIONS_IND),
1439 Builtin::Index(&MZ_CLUSTER_AUTO_SCALING_STRATEGIES_IND),
1440 Builtin::Index(&MZ_INDEXES_IND),
1441 Builtin::Index(&MZ_ROLES_IND),
1442 Builtin::Index(&MZ_SOURCES_IND),
1443 Builtin::Index(&MZ_SINKS_IND),
1444 Builtin::Index(&MZ_MATERIALIZED_VIEWS_IND),
1445 Builtin::Index(&MZ_SOURCE_STATUSES_IND),
1446 Builtin::Index(&MZ_SOURCE_STATUS_HISTORY_IND),
1447 Builtin::Index(&MZ_SINK_STATUSES_IND),
1448 Builtin::Index(&MZ_SINK_STATUS_HISTORY_IND),
1449 Builtin::Index(&MZ_CLUSTER_REPLICAS_IND),
1450 Builtin::Index(&MZ_CLUSTER_REPLICA_SIZES_IND),
1451 Builtin::Index(&MZ_CLUSTER_REPLICA_SIZE_INTERNAL_IND),
1452 Builtin::Index(&MZ_CLUSTER_REPLICA_STATUSES_IND),
1453 Builtin::Index(&MZ_CLUSTER_REPLICA_STATUS_HISTORY_IND),
1454 Builtin::Index(&MZ_CLUSTER_REPLICA_METRICS_IND),
1455 Builtin::Index(&MZ_CLUSTER_REPLICA_METRICS_HISTORY_IND),
1456 Builtin::Index(&MZ_CLUSTER_REPLICA_HISTORY_IND),
1457 Builtin::Index(&MZ_CLUSTER_REPLICA_NAME_HISTORY_IND),
1458 Builtin::Index(&MZ_OBJECT_LIFETIMES_IND),
1459 Builtin::Index(&MZ_OBJECT_HISTORY_IND),
1460 Builtin::Index(&MZ_OBJECT_DEPENDENCIES_IND),
1461 Builtin::Index(&MZ_COMPUTE_DEPENDENCIES_IND),
1462 Builtin::Index(&MZ_OBJECT_TRANSITIVE_DEPENDENCIES_IND),
1463 Builtin::Index(&MZ_FRONTIERS_IND),
1464 Builtin::Index(&MZ_WALLCLOCK_GLOBAL_LAG_RECENT_HISTORY_IND),
1465 Builtin::Index(&MZ_KAFKA_SOURCES_IND),
1466 Builtin::Index(&MZ_WEBHOOK_SOURCES_IND),
1467 Builtin::Index(&MZ_COMMENTS_IND),
1468 Builtin::Index(&MZ_DATABASES_IND),
1469 Builtin::Index(&MZ_SCHEMAS_IND),
1470 Builtin::Index(&MZ_CONNECTIONS_IND),
1471 Builtin::Index(&MZ_TABLES_IND),
1472 Builtin::Index(&MZ_TYPES_IND),
1473 Builtin::Index(&MZ_OBJECTS_IND),
1474 Builtin::Index(&MZ_COLUMNS_IND),
1475 Builtin::Index(&MZ_SECRETS_IND),
1476 Builtin::Index(&MZ_VIEWS_IND),
1477 Builtin::Index(&MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW_IND),
1478 Builtin::Index(&MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW_3H_IND),
1479 Builtin::Index(&MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW_24H_IND),
1480 Builtin::Index(&MZ_CLUSTER_DEPLOYMENT_LINEAGE_IND),
1481 Builtin::Index(&MZ_CLUSTER_REPLICA_FRONTIERS_IND),
1482 Builtin::Index(&MZ_COMPUTE_HYDRATION_TIMES_IND),
1483 Builtin::View(&MZ_RECENT_STORAGE_USAGE),
1484 Builtin::Index(&MZ_RECENT_STORAGE_USAGE_IND),
1485 Builtin::Connection(&MZ_ANALYTICS),
1486 Builtin::View(&MZ_INDEX_ADVICE),
1487 Builtin::View(&MZ_MCP_DATA_PRODUCTS),
1488 Builtin::View(&MZ_MCP_DATA_PRODUCT_DETAILS),
1489 ];
1490
1491 builtin_items.extend(notice::builtins());
1492
1493 {
1501 let source_iter = builtin_items.iter().filter_map(|b| match b {
1502 Builtin::Source(x) => Some(*x),
1503 _ => None,
1504 });
1505 let log_iter = builtin_items.iter().filter_map(|b| match b {
1506 Builtin::Log(x) => Some(*x),
1507 _ => None,
1508 });
1509 let mz_sources = builtin::make_mz_sources(source_iter, log_iter);
1510 let mz_sources_ref: &'static BuiltinMaterializedView = Box::leak(Box::new(mz_sources));
1511 let insert_pos = builtin_items
1515 .iter()
1516 .position(|b| matches!(b, Builtin::Table(t) if t.name == "mz_source_references"))
1517 .expect("mz_source_references must be present in builtin_items");
1518 builtin_items.insert(insert_pos, Builtin::MaterializedView(mz_sources_ref));
1519 }
1520
1521 {
1531 let index_iter = builtin_items.iter().filter_map(|b| match b {
1532 Builtin::Index(x) => Some(*x),
1533 _ => None,
1534 });
1535 let log_iter = builtin_items.iter().filter_map(|b| match b {
1536 Builtin::Log(x) => Some(*x),
1537 _ => None,
1538 });
1539 let mz_indexes = mz_catalog::make_mz_indexes(index_iter, log_iter);
1540 let mz_indexes_ref: &'static BuiltinMaterializedView = Box::leak(Box::new(mz_indexes));
1541 let insert_pos = builtin_items
1542 .iter()
1543 .position(|b| matches!(b, Builtin::Table(t) if t.name == "mz_index_columns"))
1544 .expect("mz_index_columns must be present in builtin_items");
1545 builtin_items.insert(insert_pos, Builtin::MaterializedView(mz_indexes_ref));
1546 }
1547
1548 builtin_items.extend(ontology::generate_views(&builtin_items));
1550
1551 let mut builtin_builtins = builtin::builtins(&builtin_items).collect();
1554
1555 let mut builtins = Vec::new();
1557 builtins.append(&mut builtin_types);
1558 builtins.append(&mut builtin_funcs);
1559 builtins.append(&mut builtin_builtins);
1560 builtins.append(&mut builtin_items);
1561
1562 builtins
1563});
1564pub const BUILTIN_ROLES: &[&BuiltinRole] = &[
1565 &MZ_SYSTEM_ROLE,
1566 &MZ_SUPPORT_ROLE,
1567 &MZ_ANALYTICS_ROLE,
1568 &MZ_MONITOR_ROLE,
1569 &MZ_MONITOR_REDACTED,
1570 &MZ_JWT_SYNC_ROLE,
1571];
1572pub const BUILTIN_CLUSTERS: &[&BuiltinCluster] = &[
1573 &MZ_SYSTEM_CLUSTER,
1574 &MZ_CATALOG_SERVER_CLUSTER,
1575 &MZ_PROBE_CLUSTER,
1576 &MZ_SUPPORT_CLUSTER,
1577 &MZ_ANALYTICS_CLUSTER,
1578];
1579pub const BUILTIN_CLUSTER_REPLICAS: &[&BuiltinClusterReplica] = &[
1580 &MZ_SYSTEM_CLUSTER_REPLICA,
1581 &MZ_CATALOG_SERVER_CLUSTER_REPLICA,
1582 &MZ_PROBE_CLUSTER_REPLICA,
1583];
1584
1585#[allow(non_snake_case)]
1586pub mod BUILTINS {
1587 use super::*;
1588
1589 pub fn logs() -> impl Iterator<Item = &'static BuiltinLog> {
1590 BUILTINS_STATIC.iter().filter_map(|b| match b {
1591 Builtin::Log(log) => Some(*log),
1592 _ => None,
1593 })
1594 }
1595
1596 pub fn types() -> impl Iterator<Item = &'static BuiltinType<NameReference>> {
1597 BUILTINS_STATIC.iter().filter_map(|b| match b {
1598 Builtin::Type(typ) => Some(*typ),
1599 _ => None,
1600 })
1601 }
1602
1603 pub fn views() -> impl Iterator<Item = &'static BuiltinView> {
1604 BUILTINS_STATIC.iter().filter_map(|b| match b {
1605 Builtin::View(view) => Some(*view),
1606 _ => None,
1607 })
1608 }
1609
1610 pub fn materialized_views() -> impl Iterator<Item = &'static BuiltinMaterializedView> {
1611 BUILTINS_STATIC.iter().filter_map(|b| match b {
1612 Builtin::MaterializedView(mv) => Some(*mv),
1613 _ => None,
1614 })
1615 }
1616
1617 pub fn funcs() -> impl Iterator<Item = &'static BuiltinFunc> {
1618 BUILTINS_STATIC.iter().filter_map(|b| match b {
1619 Builtin::Func(func) => Some(func),
1620 _ => None,
1621 })
1622 }
1623
1624 pub fn iter() -> impl Iterator<Item = &'static Builtin<NameReference>> {
1625 BUILTINS_STATIC.iter()
1626 }
1627}
1628
1629pub static BUILTIN_LOG_LOOKUP: LazyLock<HashMap<&'static str, &'static BuiltinLog>> =
1630 LazyLock::new(|| BUILTINS::logs().map(|log| (log.name, log)).collect());
1631pub static BUILTIN_LOOKUP: LazyLock<
1634 HashMap<SystemObjectDescription, (usize, &'static Builtin<NameReference>)>,
1635> = LazyLock::new(|| {
1636 BUILTINS_STATIC
1637 .iter()
1638 .enumerate()
1639 .map(|(idx, builtin)| {
1640 (
1641 SystemObjectDescription {
1642 schema_name: builtin.schema().to_string(),
1643 object_type: builtin.catalog_item_type(),
1644 object_name: builtin.name().to_string(),
1645 },
1646 (idx, builtin),
1647 )
1648 })
1649 .collect()
1650});
1651
1652#[cfg(test)]
1653mod tests {
1654 use std::collections::{BTreeMap, BTreeSet};
1655
1656 use mz_pgrepr::oid::FIRST_MATERIALIZE_OID;
1657 use mz_sql_parser::ast::visit::{self, Visit};
1658 use mz_sql_parser::ast::{Raw, RawItemName, UnresolvedItemName};
1659
1660 use super::*;
1661
1662 #[mz_ore::test]
1663 #[cfg_attr(miri, ignore)] fn test_builtin_type_schema() {
1665 for typ in BUILTINS::types() {
1666 if typ.oid < FIRST_MATERIALIZE_OID {
1667 assert_eq!(
1668 typ.schema, PG_CATALOG_SCHEMA,
1669 "{typ:?} should be in {PG_CATALOG_SCHEMA} schema"
1670 );
1671 } else {
1672 assert_eq!(
1675 typ.schema, MZ_CATALOG_SCHEMA,
1676 "{typ:?} should be in {MZ_CATALOG_SCHEMA} schema"
1677 );
1678 }
1679 }
1680 }
1681
1682 struct ItemNameCollector {
1685 names: BTreeSet<String>,
1686 }
1687
1688 impl<'ast> Visit<'ast, Raw> for ItemNameCollector {
1689 fn visit_item_name(&mut self, name: &'ast <Raw as mz_sql_parser::ast::AstInfo>::ItemName) {
1690 let unresolved: &UnresolvedItemName = match name {
1691 RawItemName::Name(n) | RawItemName::Id(_, n, _) => n,
1692 };
1693 let parts = &unresolved.0;
1694 if !parts.is_empty() {
1695 let obj_name = parts[parts.len() - 1].as_str().to_string();
1696 self.names.insert(obj_name);
1697 }
1698 visit::visit_item_name(self, name);
1699 }
1700 }
1701
1702 #[mz_ore::test]
1707 #[cfg_attr(miri, ignore)] fn test_builtins_static_dependency_order() {
1709 let mut builtin_by_name: BTreeMap<&str, (&str, usize)> = BTreeMap::new();
1713 let mut duplicate_names = Vec::new();
1714 for (idx, builtin) in BUILTINS_STATIC.iter().enumerate() {
1715 if let Some((prev_schema, prev_idx)) =
1716 builtin_by_name.insert(builtin.name(), (builtin.schema(), idx))
1717 {
1718 if prev_schema != builtin.schema() {
1723 duplicate_names.push(format!(
1724 "name {:?} appears in both {}.{} (index \
1725 {}) and {}.{} (index {})",
1726 builtin.name(),
1727 prev_schema,
1728 builtin.name(),
1729 prev_idx,
1730 builtin.schema(),
1731 builtin.name(),
1732 idx,
1733 ));
1734 }
1735 }
1736 }
1737 assert!(
1738 duplicate_names.is_empty(),
1739 "BUILTINS_STATIC has duplicate names across different \
1740 schemas (this test needs adjustment if such duplicates \
1741 are intentional):\n{}",
1742 duplicate_names.join("\n"),
1743 );
1744
1745 let get_create_sql = |builtin: &Builtin<NameReference>| -> Option<String> {
1747 match builtin {
1748 Builtin::View(v) => Some(v.create_sql()),
1749 Builtin::MaterializedView(mv) => Some(mv.create_sql()),
1750 Builtin::Index(idx) => Some(idx.create_sql()),
1751 _ => None,
1752 }
1753 };
1754
1755 let mut violations = Vec::new();
1759 for (idx, builtin) in BUILTINS_STATIC.iter().enumerate() {
1760 let create_sql = match get_create_sql(builtin) {
1761 Some(sql) => sql,
1762 None => continue,
1763 };
1764
1765 let stmts = mz_sql_parser::parser::parse_statements(&create_sql).unwrap_or_else(|e| {
1766 panic!(
1767 "failed to parse SQL for {}.{}: \
1768 {e}\nSQL: {create_sql}",
1769 builtin.schema(),
1770 builtin.name(),
1771 )
1772 });
1773
1774 let mut collector = ItemNameCollector {
1775 names: BTreeSet::new(),
1776 };
1777 for stmt in &stmts {
1778 collector.visit_statement(&stmt.ast);
1779 }
1780
1781 for ref_name in &collector.names {
1782 if let Some(&(ref_schema, dep_idx)) = builtin_by_name.get(ref_name.as_str()) {
1783 if dep_idx > idx {
1784 violations.push(format!(
1785 "{}.{} (index {}) references \
1786 {}.{} (index {}), but the \
1787 dependency appears later in \
1788 BUILTINS_STATIC",
1789 builtin.schema(),
1790 builtin.name(),
1791 idx,
1792 ref_schema,
1793 ref_name,
1794 dep_idx,
1795 ));
1796 }
1797 }
1798 }
1799 }
1800
1801 assert!(
1802 violations.is_empty(),
1803 "BUILTINS_STATIC has dependency ordering violations:\n{}",
1804 violations.join("\n"),
1805 );
1806 }
1807
1808 #[mz_ore::test]
1813 #[cfg_attr(miri, ignore)]
1814 fn test_ontology_consistency() {
1815 let mut entity_names: BTreeSet<String> = BTreeSet::new();
1817 let mut duplicate_entities = Vec::new();
1818
1819 for builtin in BUILTINS_STATIC.iter() {
1820 let ontology = match builtin {
1821 Builtin::Table(t) => t.ontology.as_ref(),
1822 Builtin::View(v) => v.ontology.as_ref(),
1823 Builtin::MaterializedView(mv) => mv.ontology.as_ref(),
1824 Builtin::Source(s) => s.ontology.as_ref(),
1825 Builtin::Log(l) => l.ontology.as_ref(),
1826 _ => None,
1827 };
1828 if let Some(ont) = ontology {
1829 assert!(
1830 !ont.entity_name.is_empty(),
1831 "builtin {} has empty ontology entity_name",
1832 builtin.name()
1833 );
1834 assert!(
1835 !ont.description.is_empty(),
1836 "builtin {} ({}) has empty ontology description",
1837 builtin.name(),
1838 ont.entity_name
1839 );
1840 if !entity_names.insert(ont.entity_name.to_string()) {
1841 duplicate_entities.push(format!(
1842 "duplicate entity_name {:?} on builtin {}",
1843 ont.entity_name,
1844 builtin.name()
1845 ));
1846 }
1847 }
1848 }
1849 assert!(
1850 duplicate_entities.is_empty(),
1851 "ontology has duplicate entity names:\n{}",
1852 duplicate_entities.join("\n"),
1853 );
1854
1855 let mut bad_targets = Vec::new();
1857 for builtin in BUILTINS_STATIC.iter() {
1858 let ontology = match builtin {
1859 Builtin::Table(t) => t.ontology.as_ref(),
1860 Builtin::View(v) => v.ontology.as_ref(),
1861 Builtin::MaterializedView(mv) => mv.ontology.as_ref(),
1862 Builtin::Source(s) => s.ontology.as_ref(),
1863 Builtin::Log(l) => l.ontology.as_ref(),
1864 _ => None,
1865 };
1866 if let Some(ont) = ontology {
1867 for link in ont.links {
1868 if !entity_names.contains(link.target) {
1869 bad_targets.push(format!(
1870 "entity {:?} link {:?} targets {:?} which is not a known entity",
1871 ont.entity_name, link.name, link.target
1872 ));
1873 }
1874 }
1875 }
1876 }
1877 assert!(
1878 bad_targets.is_empty(),
1879 "ontology has links targeting unknown entities:\n{}",
1880 bad_targets.join("\n"),
1881 );
1882
1883 let reference_sem_types: BTreeSet<SemanticType> = BTreeSet::from([
1904 SemanticType::CatalogItemId,
1905 SemanticType::GlobalId,
1906 SemanticType::ClusterId,
1907 SemanticType::ReplicaId,
1908 SemanticType::SchemaId,
1909 SemanticType::DatabaseId,
1910 SemanticType::RoleId,
1911 SemanticType::NetworkPolicyId,
1912 ]);
1913
1914 let mut uncovered_fk_cols = Vec::new();
1915 for builtin in BUILTINS_STATIC.iter() {
1916 let desc_storage;
1917 let (name, desc, ontology): (&str, &RelationDesc, Option<&Ontology>) = match builtin {
1918 Builtin::Table(t) => (t.name, &t.desc, t.ontology.as_ref()),
1919 Builtin::View(v) => (v.name, &v.desc, v.ontology.as_ref()),
1920 Builtin::MaterializedView(mv) => (mv.name, &mv.desc, mv.ontology.as_ref()),
1921 Builtin::Source(s) => (s.name, &s.desc, s.ontology.as_ref()),
1922 Builtin::Log(l) => {
1923 desc_storage = l.variant.desc();
1924 (l.name, &desc_storage, l.ontology.as_ref())
1925 }
1926 _ => continue,
1927 };
1928 let Some(ont) = ontology else { continue };
1929
1930 let linked_cols: BTreeSet<&str> = ont
1932 .links
1933 .iter()
1934 .filter_map(|link| match &link.properties {
1935 LinkProperties::ForeignKey { source_column, .. } => Some(*source_column),
1936 LinkProperties::Measures { source_column, .. } => Some(*source_column),
1937 LinkProperties::DependsOn { source_column, .. } => Some(*source_column),
1938 LinkProperties::MapsTo { source_column, .. } => Some(*source_column),
1939 LinkProperties::Union { .. } => None,
1940 })
1941 .collect();
1942
1943 if linked_cols.is_empty() {
1947 continue;
1948 }
1949
1950 let pk_indices: BTreeSet<usize> = desc.typ().keys.iter().flatten().copied().collect();
1952
1953 for (col_name, sem) in ont.column_semantic_types {
1954 if !reference_sem_types.contains(sem) {
1955 continue;
1956 }
1957 let Some(idx) = desc.iter_names().position(|n| n.as_str() == *col_name) else {
1958 continue;
1959 };
1960 if idx == 0 && *col_name == "id" {
1964 continue;
1965 }
1966 if pk_indices.contains(&idx) {
1967 continue;
1968 }
1969 if linked_cols.contains(*col_name) {
1970 continue;
1971 }
1972 uncovered_fk_cols.push(format!(
1973 "entity {:?} (builtin {}) column {:?} has semantic type {:?} but no OntologyLink covers it (add a link with source_column: {:?})",
1974 ont.entity_name, name, col_name, sem, col_name
1975 ));
1976 }
1977 }
1978 assert!(
1979 uncovered_fk_cols.is_empty(),
1980 "ontology entities have FK-typed columns with no OntologyLink:\n{}",
1981 uncovered_fk_cols.join("\n"),
1982 );
1983
1984 let mut bad_source_cols = Vec::new();
1990 for builtin in BUILTINS_STATIC.iter() {
1991 let desc_storage;
1992 let (name, desc, ontology): (&str, &RelationDesc, Option<&Ontology>) = match builtin {
1993 Builtin::Table(t) => (t.name, &t.desc, t.ontology.as_ref()),
1994 Builtin::View(v) => (v.name, &v.desc, v.ontology.as_ref()),
1995 Builtin::MaterializedView(mv) => (mv.name, &mv.desc, mv.ontology.as_ref()),
1996 Builtin::Source(s) => (s.name, &s.desc, s.ontology.as_ref()),
1997 Builtin::Log(l) => {
1998 desc_storage = l.variant.desc();
1999 (l.name, &desc_storage, l.ontology.as_ref())
2000 }
2001 _ => continue,
2002 };
2003 let Some(ont) = ontology else { continue };
2004
2005 let col_names: BTreeSet<&str> = desc.iter_names().map(|c| c.as_str()).collect();
2006
2007 for link in ont.links {
2008 let source_col = match &link.properties {
2009 LinkProperties::ForeignKey { source_column, .. } => Some(*source_column),
2010 LinkProperties::Measures { source_column, .. } => Some(*source_column),
2011 LinkProperties::DependsOn { source_column, .. } => Some(*source_column),
2012 LinkProperties::MapsTo { source_column, .. } => Some(*source_column),
2013 LinkProperties::Union { .. } => None,
2014 };
2015 let Some(col) = source_col else { continue };
2016 if !col_names.contains(col) {
2017 bad_source_cols.push(format!(
2018 "entity {:?} (builtin {}) link {:?} references source_column {:?} which does not exist in the relation",
2019 ont.entity_name, name, link.name, col
2020 ));
2021 }
2022 let extra_key_columns = match &link.properties {
2023 LinkProperties::ForeignKey {
2024 extra_key_columns: Some(extras),
2025 ..
2026 } => Some(*extras),
2027 LinkProperties::Measures {
2028 extra_key_columns: Some(extras),
2029 ..
2030 } => Some(*extras),
2031 _ => None,
2032 };
2033 if let Some(extras) = extra_key_columns {
2034 for (src_col, _) in extras {
2035 if !col_names.contains(*src_col) {
2036 bad_source_cols.push(format!(
2037 "entity {:?} (builtin {}) link {:?} extra_key_columns references {:?} which does not exist in the relation",
2038 ont.entity_name, name, link.name, src_col
2039 ));
2040 }
2041 }
2042 }
2043 }
2044 }
2045 assert!(
2046 bad_source_cols.is_empty(),
2047 "ontology links reference non-existent source_columns:\n{}",
2048 bad_source_cols.join("\n"),
2049 );
2050
2051 assert!(
2053 entity_names.len() > 120,
2054 "expected > 120 ontology entities, found {}",
2055 entity_names.len()
2056 );
2057 }
2058
2059 #[mz_ore::test]
2065 fn test_link_properties_serialization() {
2066 let check = |props: LinkProperties, expected: &str| {
2067 let got = serde_json::to_string(&props).expect("serialize");
2068 let got_val: serde_json::Value = serde_json::from_str(&got).expect("parse got");
2069 let exp_val: serde_json::Value =
2070 serde_json::from_str(expected).expect("parse expected");
2071 assert_eq!(got_val, exp_val, "mismatch for {expected}");
2072 };
2073
2074 check(
2076 LinkProperties::fk("owner_id", "id", Cardinality::ManyToOne),
2077 r#"{"kind":"foreign_key","source_column":"owner_id","target_column":"id","cardinality":"many_to_one"}"#,
2078 );
2079 check(
2081 LinkProperties::fk_composite(
2082 "operator_id",
2083 "id",
2084 Cardinality::ManyToOne,
2085 &[("worker_id", "worker_id")],
2086 ),
2087 r#"{"kind":"foreign_key","source_column":"operator_id","target_column":"id","cardinality":"many_to_one","extra_key_columns":[["worker_id","worker_id"]]}"#,
2088 );
2089 check(
2091 LinkProperties::fk("id", "id", Cardinality::OneToOne),
2092 r#"{"kind":"foreign_key","source_column":"id","target_column":"id","cardinality":"one_to_one"}"#,
2093 );
2094 check(
2096 LinkProperties::fk_nullable("database_id", "id", Cardinality::ManyToOne),
2097 r#"{"kind":"foreign_key","source_column":"database_id","target_column":"id","cardinality":"many_to_one","nullable":true}"#,
2098 );
2099 check(
2101 LinkProperties::fk_typed(
2102 "replica_id",
2103 "id",
2104 Cardinality::ManyToOne,
2105 mz_repr::SemanticType::CatalogItemId,
2106 ),
2107 r#"{"kind":"foreign_key","source_column":"replica_id","target_column":"id","cardinality":"many_to_one","source_id_type":"CatalogItemId"}"#,
2108 );
2109 check(
2111 LinkProperties::fk_mapped(
2112 "object_id",
2113 "id",
2114 Cardinality::ManyToOne,
2115 mz_repr::SemanticType::GlobalId,
2116 "mz_internal.mz_object_global_ids",
2117 ),
2118 r#"{"kind":"foreign_key","source_column":"object_id","target_column":"id","cardinality":"many_to_one","source_id_type":"GlobalId","requires_mapping":"mz_internal.mz_object_global_ids"}"#,
2119 );
2120 check(
2122 LinkProperties::union_disc("type", "table"),
2123 r#"{"kind":"union","discriminator_column":"type","discriminator_value":"table"}"#,
2124 );
2125 check(
2127 LinkProperties::Union {
2128 discriminator_column: None,
2129 discriminator_value: None,
2130 note: Some("example note"),
2131 },
2132 r#"{"kind":"union","note":"example note"}"#,
2133 );
2134 check(
2136 LinkProperties::measures("id", "id", "cpu_time_ns"),
2137 r#"{"kind":"measures","source_column":"id","target_column":"id","metric":"cpu_time_ns"}"#,
2138 );
2139 check(
2141 LinkProperties::measures_composite(
2142 "export_id",
2143 "export_id",
2144 "time_ns",
2145 &[("worker_id", "worker_id")],
2146 ),
2147 r#"{"kind":"measures","source_column":"export_id","target_column":"export_id","metric":"time_ns","extra_key_columns":[["worker_id","worker_id"]]}"#,
2148 );
2149 check(
2151 LinkProperties::measures_mapped(
2152 "object_id",
2153 "id",
2154 "wallclock_lag",
2155 mz_repr::SemanticType::GlobalId,
2156 "mz_internal.mz_object_global_ids",
2157 ),
2158 r#"{"kind":"measures","source_column":"object_id","target_column":"id","metric":"wallclock_lag","source_id_type":"GlobalId","requires_mapping":"mz_internal.mz_object_global_ids"}"#,
2159 );
2160 check(
2162 LinkProperties::DependsOn {
2163 source_column: "object_id",
2164 target_column: "id",
2165 source_id_type: Some(mz_repr::SemanticType::GlobalId),
2166 requires_mapping: Some("mz_internal.mz_object_global_ids"),
2167 },
2168 r#"{"kind":"depends_on","source_column":"object_id","target_column":"id","source_id_type":"GlobalId","requires_mapping":"mz_internal.mz_object_global_ids"}"#,
2169 );
2170 check(
2172 LinkProperties::DependsOn {
2173 source_column: "object_id",
2174 target_column: "id",
2175 source_id_type: Some(mz_repr::SemanticType::CatalogItemId),
2176 requires_mapping: None,
2177 },
2178 r#"{"kind":"depends_on","source_column":"object_id","target_column":"id","source_id_type":"CatalogItemId"}"#,
2179 );
2180 check(
2182 LinkProperties::MapsTo {
2183 source_column: "id",
2184 target_column: "global_id",
2185 via: Some("mz_internal.mz_object_global_ids"),
2186 from_type: Some(mz_repr::SemanticType::CatalogItemId),
2187 to_type: Some(mz_repr::SemanticType::GlobalId),
2188 note: None,
2189 },
2190 r#"{"kind":"maps_to","source_column":"id","target_column":"global_id","via":"mz_internal.mz_object_global_ids","from_type":"CatalogItemId","to_type":"GlobalId"}"#,
2191 );
2192 }
2193
2194 #[mz_ore::test]
2203 #[cfg_attr(miri, ignore)]
2204 fn test_mz_sources_fingerprint_changes_with_new_builtin_source() {
2205 let sources: Vec<&'static BuiltinSource> = BUILTINS_STATIC
2206 .iter()
2207 .filter_map(|b| match b {
2208 Builtin::Source(x) => Some(*x),
2209 _ => None,
2210 })
2211 .collect();
2212 let logs: Vec<&'static BuiltinLog> = BUILTINS_STATIC
2213 .iter()
2214 .filter_map(|b| match b {
2215 Builtin::Log(x) => Some(*x),
2216 _ => None,
2217 })
2218 .collect();
2219
2220 let mv_base = builtin::make_mz_sources(sources.iter().copied(), logs.iter().copied());
2222 let fp_base = Fingerprint::fingerprint(&&mv_base);
2223
2224 let mz_sources_static = BUILTINS_STATIC
2225 .iter()
2226 .find_map(|b| match b {
2227 Builtin::MaterializedView(mv) if mv.name == "mz_sources" => Some(*mv),
2228 _ => None,
2229 })
2230 .expect("mz_sources must be present in BUILTINS_STATIC");
2231 assert_eq!(
2232 fp_base,
2233 Fingerprint::fingerprint(&mz_sources_static),
2234 "make_mz_sources fingerprint must match the BUILTINS_STATIC mz_sources fingerprint"
2235 );
2236
2237 let extra_source = sources[0];
2240 let mv_extra = builtin::make_mz_sources(
2241 sources.iter().copied().chain(std::iter::once(extra_source)),
2242 logs.iter().copied(),
2243 );
2244 assert_ne!(
2245 fp_base,
2246 Fingerprint::fingerprint(&&mv_extra),
2247 "mz_sources fingerprint must change when a builtin source is added"
2248 );
2249 }
2250
2251 #[mz_ore::test]
2261 #[cfg_attr(miri, ignore)]
2262 fn test_mz_indexes_fingerprint_changes_with_new_builtin_index() {
2263 let indexes: Vec<&'static BuiltinIndex> = BUILTINS_STATIC
2264 .iter()
2265 .filter_map(|b| match b {
2266 Builtin::Index(x) => Some(*x),
2267 _ => None,
2268 })
2269 .collect();
2270 let logs: Vec<&'static BuiltinLog> = BUILTINS_STATIC
2271 .iter()
2272 .filter_map(|b| match b {
2273 Builtin::Log(x) => Some(*x),
2274 _ => None,
2275 })
2276 .collect();
2277
2278 let mv_base = mz_catalog::make_mz_indexes(indexes.iter().copied(), logs.iter().copied());
2280 let fp_base = Fingerprint::fingerprint(&&mv_base);
2281
2282 let mz_indexes_static = BUILTINS_STATIC
2283 .iter()
2284 .find_map(|b| match b {
2285 Builtin::MaterializedView(mv) if mv.name == "mz_indexes" => Some(*mv),
2286 _ => None,
2287 })
2288 .expect("mz_indexes must be present in BUILTINS_STATIC");
2289 assert_eq!(
2290 fp_base,
2291 Fingerprint::fingerprint(&mz_indexes_static),
2292 "make_mz_indexes fingerprint must match the BUILTINS_STATIC mz_indexes fingerprint"
2293 );
2294
2295 let extra_index = indexes[0];
2298 let mv_extra_index = mz_catalog::make_mz_indexes(
2299 indexes.iter().copied().chain(std::iter::once(extra_index)),
2300 logs.iter().copied(),
2301 );
2302 assert_ne!(
2303 fp_base,
2304 Fingerprint::fingerprint(&&mv_extra_index),
2305 "mz_indexes fingerprint must change when a builtin index is added"
2306 );
2307
2308 let extra_log = logs[0];
2311 let mv_extra_log = mz_catalog::make_mz_indexes(
2312 indexes.iter().copied(),
2313 logs.iter().copied().chain(std::iter::once(extra_log)),
2314 );
2315 assert_ne!(
2316 fp_base,
2317 Fingerprint::fingerprint(&&mv_extra_log),
2318 "mz_indexes fingerprint must change when a builtin log is added"
2319 );
2320 }
2321}