mz_catalog/
builtin.rs

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.
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
10//! Built-in catalog items.
11//!
12//! Builtins exist in the `mz_catalog` ambient schema. They are automatically
13//! installed into the catalog when it is opened. Their definitions are not
14//! persisted in the catalog, but hardcoded in this module. This makes it easy
15//! to add new builtins, or change the definition of existing builtins, in new
16//! versions of Materialize.
17//!
18//! Builtin's names, columns, and types are part of the stable API of
19//! Materialize. Be careful to maintain backwards compatibility when changing
20//! definitions of existing builtins!
21//!
22//! More information about builtin system tables and types can be found in
23//! <https://materialize.com/docs/sql/system-catalog/>.
24
25pub mod notice;
26
27use std::collections::BTreeMap;
28use std::hash::Hash;
29use std::string::ToString;
30use std::sync::LazyLock;
31
32use mz_compute_client::logging::{ComputeLog, DifferentialLog, LogVariant, TimelyLog};
33use mz_ore::collections::HashMap;
34use mz_pgrepr::oid;
35use mz_repr::adt::mz_acl_item::{AclMode, MzAclItem};
36use mz_repr::adt::numeric::NumericMaxScale;
37use mz_repr::namespaces::{
38    INFORMATION_SCHEMA, MZ_CATALOG_SCHEMA, MZ_INTERNAL_SCHEMA, MZ_INTROSPECTION_SCHEMA,
39    MZ_UNSAFE_SCHEMA, PG_CATALOG_SCHEMA,
40};
41use mz_repr::role_id::RoleId;
42use mz_repr::{RelationDesc, SqlRelationType, SqlScalarType};
43use mz_sql::catalog::RoleAttributesRaw;
44use mz_sql::catalog::{
45    CatalogItemType, CatalogType, CatalogTypeDetails, CatalogTypePgMetadata, NameReference,
46    ObjectType, SystemObjectType, TypeReference,
47};
48use mz_sql::rbac;
49use mz_sql::session::user::{
50    ANALYTICS_USER_NAME, MZ_ANALYTICS_ROLE_ID, MZ_MONITOR_REDACTED_ROLE_ID, MZ_MONITOR_ROLE_ID,
51    MZ_SUPPORT_ROLE_ID, MZ_SYSTEM_ROLE_ID, SUPPORT_USER_NAME, SYSTEM_USER_NAME,
52};
53use mz_storage_client::controller::IntrospectionType;
54use mz_storage_client::healthcheck::WALLCLOCK_GLOBAL_LAG_HISTOGRAM_RAW_DESC;
55use mz_storage_client::healthcheck::{
56    MZ_AWS_PRIVATELINK_CONNECTION_STATUS_HISTORY_DESC, MZ_PREPARED_STATEMENT_HISTORY_DESC,
57    MZ_SESSION_HISTORY_DESC, MZ_SINK_STATUS_HISTORY_DESC, MZ_SOURCE_STATUS_HISTORY_DESC,
58    MZ_SQL_TEXT_DESC, MZ_STATEMENT_EXECUTION_HISTORY_DESC, REPLICA_METRICS_HISTORY_DESC,
59    REPLICA_STATUS_HISTORY_DESC, WALLCLOCK_LAG_HISTORY_DESC,
60};
61use mz_storage_client::statistics::{MZ_SINK_STATISTICS_RAW_DESC, MZ_SOURCE_STATISTICS_RAW_DESC};
62use serde::Serialize;
63
64use crate::durable::objects::SystemObjectDescription;
65
66pub const BUILTIN_PREFIXES: &[&str] = &["mz_", "pg_", "external_"];
67const BUILTIN_CLUSTER_REPLICA_NAME: &str = "r1";
68
69/// A sentinel used in place of a fingerprint that indicates that a builtin
70/// object is runtime alterable. Runtime alterable objects don't have meaningful
71/// fingerprints because they may have been intentionally changed by the user
72/// after creation.
73// NOTE(benesch): ideally we'd use a fingerprint type that used a sum type
74// rather than a loosely typed string to represent the runtime alterable
75// state like so:
76//
77//     enum Fingerprint {
78//         SqlText(String),
79//         RuntimeAlterable,
80//     }
81//
82// However, that would entail a complicated migration for the existing system object
83// mapping collection stored on disk.
84pub const RUNTIME_ALTERABLE_FINGERPRINT_SENTINEL: &str = "<RUNTIME-ALTERABLE>";
85
86#[derive(Clone, Debug)]
87pub enum Builtin<T: 'static + TypeReference> {
88    Log(&'static BuiltinLog),
89    Table(&'static BuiltinTable),
90    View(&'static BuiltinView),
91    Type(&'static BuiltinType<T>),
92    Func(BuiltinFunc),
93    Source(&'static BuiltinSource),
94    ContinualTask(&'static BuiltinContinualTask),
95    Index(&'static BuiltinIndex),
96    Connection(&'static BuiltinConnection),
97}
98
99impl<T: TypeReference> Builtin<T> {
100    pub fn name(&self) -> &'static str {
101        match self {
102            Builtin::Log(log) => log.name,
103            Builtin::Table(table) => table.name,
104            Builtin::View(view) => view.name,
105            Builtin::Type(typ) => typ.name,
106            Builtin::Func(func) => func.name,
107            Builtin::Source(coll) => coll.name,
108            Builtin::ContinualTask(ct) => ct.name,
109            Builtin::Index(index) => index.name,
110            Builtin::Connection(connection) => connection.name,
111        }
112    }
113
114    pub fn schema(&self) -> &'static str {
115        match self {
116            Builtin::Log(log) => log.schema,
117            Builtin::Table(table) => table.schema,
118            Builtin::View(view) => view.schema,
119            Builtin::Type(typ) => typ.schema,
120            Builtin::Func(func) => func.schema,
121            Builtin::Source(coll) => coll.schema,
122            Builtin::ContinualTask(ct) => ct.schema,
123            Builtin::Index(index) => index.schema,
124            Builtin::Connection(connection) => connection.schema,
125        }
126    }
127
128    pub fn catalog_item_type(&self) -> CatalogItemType {
129        match self {
130            Builtin::Log(_) => CatalogItemType::Source,
131            Builtin::Source(_) => CatalogItemType::Source,
132            Builtin::ContinualTask(_) => CatalogItemType::ContinualTask,
133            Builtin::Table(_) => CatalogItemType::Table,
134            Builtin::View(_) => CatalogItemType::View,
135            Builtin::Type(_) => CatalogItemType::Type,
136            Builtin::Func(_) => CatalogItemType::Func,
137            Builtin::Index(_) => CatalogItemType::Index,
138            Builtin::Connection(_) => CatalogItemType::Connection,
139        }
140    }
141
142    /// Whether the object can be altered at runtime by its owner.
143    pub fn runtime_alterable(&self) -> bool {
144        match self {
145            Builtin::Connection(c) => c.runtime_alterable,
146            _ => false,
147        }
148    }
149}
150
151#[derive(Clone, Debug, Hash, Serialize)]
152pub struct BuiltinLog {
153    pub variant: LogVariant,
154    pub name: &'static str,
155    pub schema: &'static str,
156    pub oid: u32,
157    /// ACL items to apply to the object
158    pub access: Vec<MzAclItem>,
159}
160
161#[derive(Clone, Hash, Debug, PartialEq, Eq)]
162pub struct BuiltinTable {
163    pub name: &'static str,
164    pub schema: &'static str,
165    pub oid: u32,
166    pub desc: RelationDesc,
167    pub column_comments: BTreeMap<&'static str, &'static str>,
168    /// Whether the table's retention policy is controlled by
169    /// the system variable `METRICS_RETENTION`
170    pub is_retained_metrics_object: bool,
171    /// ACL items to apply to the object
172    pub access: Vec<MzAclItem>,
173}
174
175#[derive(Clone, Debug, Hash, Serialize)]
176pub struct BuiltinSource {
177    pub name: &'static str,
178    pub schema: &'static str,
179    pub oid: u32,
180    pub desc: RelationDesc,
181    pub column_comments: BTreeMap<&'static str, &'static str>,
182    pub data_source: IntrospectionType,
183    /// Whether the source's retention policy is controlled by
184    /// the system variable `METRICS_RETENTION`
185    pub is_retained_metrics_object: bool,
186    /// ACL items to apply to the object
187    pub access: Vec<MzAclItem>,
188}
189
190#[derive(Hash, Debug, PartialEq, Eq)]
191pub struct BuiltinContinualTask {
192    pub name: &'static str,
193    pub schema: &'static str,
194    pub oid: u32,
195    pub desc: RelationDesc,
196    pub sql: &'static str,
197    /// ACL items to apply to the object
198    pub access: Vec<MzAclItem>,
199}
200
201#[derive(Hash, Debug)]
202pub struct BuiltinView {
203    pub name: &'static str,
204    pub schema: &'static str,
205    pub oid: u32,
206    pub desc: RelationDesc,
207    pub column_comments: BTreeMap<&'static str, &'static str>,
208    pub sql: &'static str,
209    /// ACL items to apply to the object
210    pub access: Vec<MzAclItem>,
211}
212
213impl BuiltinView {
214    pub fn create_sql(&self) -> String {
215        format!("CREATE VIEW {}.{} AS {}", self.schema, self.name, self.sql)
216    }
217}
218
219#[derive(Debug)]
220pub struct BuiltinType<T: TypeReference> {
221    pub name: &'static str,
222    pub schema: &'static str,
223    pub oid: u32,
224    pub details: CatalogTypeDetails<T>,
225}
226
227#[derive(Clone, Debug)]
228pub struct BuiltinFunc {
229    pub schema: &'static str,
230    pub name: &'static str,
231    pub inner: &'static mz_sql::func::Func,
232}
233
234/// Note: When creating a built-in index, it's usually best to choose a key that has only one
235/// component. For example, if you created an index
236/// `ON mz_internal.mz_object_lifetimes (id, object_type)`, then this index couldn't be used for a
237/// lookup for `WHERE object_type = ...`, and neither for joins keyed on just `id`.
238/// See <https://materialize.com/docs/transform-data/optimization/#matching-multi-column-indexes-to-multi-column-where-clauses>
239#[derive(Debug)]
240pub struct BuiltinIndex {
241    pub name: &'static str,
242    pub schema: &'static str,
243    pub oid: u32,
244    /// SQL fragment for the index, following `CREATE INDEX [name]`
245    ///
246    /// Format: `IN CLUSTER [cluster_name] ON [table_name] ([column_exprs])`
247    pub sql: &'static str,
248    pub is_retained_metrics_object: bool,
249}
250
251impl BuiltinIndex {
252    pub fn create_sql(&self) -> String {
253        format!("CREATE INDEX {}\n{}", self.name, self.sql)
254    }
255}
256
257impl BuiltinContinualTask {
258    pub fn create_sql(&self) -> String {
259        format!(
260            "CREATE CONTINUAL TASK {}.{}\n{}",
261            self.schema, self.name, self.sql
262        )
263    }
264}
265
266#[derive(Hash, Debug)]
267pub struct BuiltinConnection {
268    pub name: &'static str,
269    pub schema: &'static str,
270    pub oid: u32,
271    pub sql: &'static str,
272    pub access: &'static [MzAclItem],
273    pub owner_id: &'static RoleId,
274    /// Whether the object can be altered at runtime by its owner.
275    ///
276    /// Note that when `runtime_alterable` is true, changing the `sql` in future
277    /// versions does not trigger a migration.
278    pub runtime_alterable: bool,
279}
280
281#[derive(Clone, Debug)]
282pub struct BuiltinRole {
283    pub id: RoleId,
284    /// Name of the builtin role.
285    ///
286    /// IMPORTANT: Must start with a prefix from [`BUILTIN_PREFIXES`].
287    pub name: &'static str,
288    pub oid: u32,
289    pub attributes: RoleAttributesRaw,
290}
291
292#[derive(Clone, Debug)]
293pub struct BuiltinCluster {
294    /// Name of the cluster.
295    ///
296    /// IMPORTANT: Must start with a prefix from [`BUILTIN_PREFIXES`].
297    pub name: &'static str,
298    pub privileges: &'static [MzAclItem],
299    pub owner_id: &'static RoleId,
300}
301
302#[derive(Clone, Debug, PartialEq, Eq)]
303pub struct BuiltinClusterReplica {
304    /// Name of the compute replica.
305    pub name: &'static str,
306    /// Name of the cluster that this replica belongs to.
307    pub cluster_name: &'static str,
308}
309
310/// Uniquely identifies the definition of a builtin object.
311pub trait Fingerprint {
312    fn fingerprint(&self) -> String;
313}
314
315impl<T: TypeReference> Fingerprint for &Builtin<T> {
316    fn fingerprint(&self) -> String {
317        match self {
318            Builtin::Log(log) => log.fingerprint(),
319            Builtin::Table(table) => table.fingerprint(),
320            Builtin::View(view) => view.fingerprint(),
321            Builtin::Type(typ) => typ.fingerprint(),
322            Builtin::Func(func) => func.fingerprint(),
323            Builtin::Source(coll) => coll.fingerprint(),
324            Builtin::ContinualTask(ct) => ct.fingerprint(),
325            Builtin::Index(index) => index.fingerprint(),
326            Builtin::Connection(connection) => connection.fingerprint(),
327        }
328    }
329}
330
331// Types and Funcs never change fingerprints so we just return constant 0
332impl<T: TypeReference> Fingerprint for &BuiltinType<T> {
333    fn fingerprint(&self) -> String {
334        "".to_string()
335    }
336}
337
338impl Fingerprint for &BuiltinFunc {
339    fn fingerprint(&self) -> String {
340        "".to_string()
341    }
342}
343
344impl Fingerprint for &BuiltinLog {
345    fn fingerprint(&self) -> String {
346        self.variant.desc().fingerprint()
347    }
348}
349
350impl Fingerprint for &BuiltinTable {
351    fn fingerprint(&self) -> String {
352        self.desc.fingerprint()
353    }
354}
355
356impl Fingerprint for &BuiltinView {
357    fn fingerprint(&self) -> String {
358        self.sql.to_string()
359    }
360}
361
362impl Fingerprint for &BuiltinSource {
363    fn fingerprint(&self) -> String {
364        self.desc.fingerprint()
365    }
366}
367
368impl Fingerprint for &BuiltinContinualTask {
369    fn fingerprint(&self) -> String {
370        self.create_sql()
371    }
372}
373
374impl Fingerprint for &BuiltinIndex {
375    fn fingerprint(&self) -> String {
376        self.create_sql()
377    }
378}
379
380impl Fingerprint for &BuiltinConnection {
381    fn fingerprint(&self) -> String {
382        self.sql.to_string()
383    }
384}
385
386impl Fingerprint for RelationDesc {
387    fn fingerprint(&self) -> String {
388        self.typ().fingerprint()
389    }
390}
391
392impl Fingerprint for SqlRelationType {
393    fn fingerprint(&self) -> String {
394        serde_json::to_string(self).expect("serialization cannot fail")
395    }
396}
397
398// Builtin definitions below. Ensure you add new builtins to the `BUILTINS` map.
399//
400// You SHOULD NOT delete a builtin. If you do, you will break any downstream
401// user objects that depended on the builtin.
402//
403// Builtins are loaded in dependency order, so a builtin must appear in `BUILTINS`
404// before any items it depends upon.
405//
406// WARNING: if you change the definition of an existing builtin item, you must
407// be careful to maintain backwards compatibility! Adding new columns is safe.
408// Removing a column, changing the name of a column, or changing the type of a
409// column is not safe, as persisted user views may depend upon that column.
410
411// The following types are the list of builtin data types available
412// in Materialize. This list is derived from the `pg_type` table in PostgreSQL.
413//
414// Builtin types cannot be created, updated, or deleted. Their OIDs
415// are static, unlike other objects, to match the type OIDs defined by Postgres.
416
417pub const TYPE_BOOL: BuiltinType<NameReference> = BuiltinType {
418    name: "bool",
419    schema: PG_CATALOG_SCHEMA,
420    oid: oid::TYPE_BOOL_OID,
421    details: CatalogTypeDetails {
422        typ: CatalogType::Bool,
423        array_id: None,
424        pg_metadata: Some(CatalogTypePgMetadata {
425            typinput_oid: 1242,
426            typreceive_oid: 2436,
427        }),
428    },
429};
430
431pub const TYPE_BYTEA: BuiltinType<NameReference> = BuiltinType {
432    name: "bytea",
433    schema: PG_CATALOG_SCHEMA,
434    oid: oid::TYPE_BYTEA_OID,
435    details: CatalogTypeDetails {
436        typ: CatalogType::Bytes,
437        array_id: None,
438        pg_metadata: Some(CatalogTypePgMetadata {
439            typinput_oid: 1244,
440            typreceive_oid: 2412,
441        }),
442    },
443};
444
445pub const TYPE_INT8: BuiltinType<NameReference> = BuiltinType {
446    name: "int8",
447    schema: PG_CATALOG_SCHEMA,
448    oid: oid::TYPE_INT8_OID,
449    details: CatalogTypeDetails {
450        typ: CatalogType::Int64,
451        array_id: None,
452        pg_metadata: Some(CatalogTypePgMetadata {
453            typinput_oid: 460,
454            typreceive_oid: 2408,
455        }),
456    },
457};
458
459pub const TYPE_INT4: BuiltinType<NameReference> = BuiltinType {
460    name: "int4",
461    schema: PG_CATALOG_SCHEMA,
462    oid: oid::TYPE_INT4_OID,
463    details: CatalogTypeDetails {
464        typ: CatalogType::Int32,
465        array_id: None,
466        pg_metadata: Some(CatalogTypePgMetadata {
467            typinput_oid: 42,
468            typreceive_oid: 2406,
469        }),
470    },
471};
472
473pub const TYPE_TEXT: BuiltinType<NameReference> = BuiltinType {
474    name: "text",
475    schema: PG_CATALOG_SCHEMA,
476    oid: oid::TYPE_TEXT_OID,
477    details: CatalogTypeDetails {
478        typ: CatalogType::String,
479        array_id: None,
480        pg_metadata: Some(CatalogTypePgMetadata {
481            typinput_oid: 46,
482            typreceive_oid: 2414,
483        }),
484    },
485};
486
487pub const TYPE_OID: BuiltinType<NameReference> = BuiltinType {
488    name: "oid",
489    schema: PG_CATALOG_SCHEMA,
490    oid: oid::TYPE_OID_OID,
491    details: CatalogTypeDetails {
492        typ: CatalogType::Oid,
493        array_id: None,
494        pg_metadata: Some(CatalogTypePgMetadata {
495            typinput_oid: 1798,
496            typreceive_oid: 2418,
497        }),
498    },
499};
500
501pub const TYPE_FLOAT4: BuiltinType<NameReference> = BuiltinType {
502    name: "float4",
503    schema: PG_CATALOG_SCHEMA,
504    oid: oid::TYPE_FLOAT4_OID,
505    details: CatalogTypeDetails {
506        typ: CatalogType::Float32,
507        array_id: None,
508        pg_metadata: Some(CatalogTypePgMetadata {
509            typinput_oid: 200,
510            typreceive_oid: 2424,
511        }),
512    },
513};
514
515pub const TYPE_FLOAT8: BuiltinType<NameReference> = BuiltinType {
516    name: "float8",
517    schema: PG_CATALOG_SCHEMA,
518    oid: oid::TYPE_FLOAT8_OID,
519    details: CatalogTypeDetails {
520        typ: CatalogType::Float64,
521        array_id: None,
522        pg_metadata: Some(CatalogTypePgMetadata {
523            typinput_oid: 214,
524            typreceive_oid: 2426,
525        }),
526    },
527};
528
529pub const TYPE_BOOL_ARRAY: BuiltinType<NameReference> = BuiltinType {
530    name: "_bool",
531    schema: PG_CATALOG_SCHEMA,
532    oid: oid::TYPE_BOOL_ARRAY_OID,
533    details: CatalogTypeDetails {
534        typ: CatalogType::Array {
535            element_reference: TYPE_BOOL.name,
536        },
537        array_id: None,
538        pg_metadata: Some(CatalogTypePgMetadata {
539            typinput_oid: 750,
540            typreceive_oid: 2400,
541        }),
542    },
543};
544
545pub const TYPE_BYTEA_ARRAY: BuiltinType<NameReference> = BuiltinType {
546    name: "_bytea",
547    schema: PG_CATALOG_SCHEMA,
548    oid: oid::TYPE_BYTEA_ARRAY_OID,
549    details: CatalogTypeDetails {
550        typ: CatalogType::Array {
551            element_reference: TYPE_BYTEA.name,
552        },
553        array_id: None,
554        pg_metadata: Some(CatalogTypePgMetadata {
555            typinput_oid: 750,
556            typreceive_oid: 2400,
557        }),
558    },
559};
560
561pub const TYPE_INT4_ARRAY: BuiltinType<NameReference> = BuiltinType {
562    name: "_int4",
563    schema: PG_CATALOG_SCHEMA,
564    oid: oid::TYPE_INT4_ARRAY_OID,
565    details: CatalogTypeDetails {
566        typ: CatalogType::Array {
567            element_reference: TYPE_INT4.name,
568        },
569        array_id: None,
570        pg_metadata: Some(CatalogTypePgMetadata {
571            typinput_oid: 750,
572            typreceive_oid: 2400,
573        }),
574    },
575};
576
577pub const TYPE_TEXT_ARRAY: BuiltinType<NameReference> = BuiltinType {
578    name: "_text",
579    schema: PG_CATALOG_SCHEMA,
580    oid: oid::TYPE_TEXT_ARRAY_OID,
581    details: CatalogTypeDetails {
582        typ: CatalogType::Array {
583            element_reference: TYPE_TEXT.name,
584        },
585        array_id: None,
586        pg_metadata: Some(CatalogTypePgMetadata {
587            typinput_oid: 750,
588            typreceive_oid: 2400,
589        }),
590    },
591};
592
593pub const TYPE_INT8_ARRAY: BuiltinType<NameReference> = BuiltinType {
594    name: "_int8",
595    schema: PG_CATALOG_SCHEMA,
596    oid: oid::TYPE_INT8_ARRAY_OID,
597    details: CatalogTypeDetails {
598        typ: CatalogType::Array {
599            element_reference: TYPE_INT8.name,
600        },
601        array_id: None,
602        pg_metadata: Some(CatalogTypePgMetadata {
603            typinput_oid: 750,
604            typreceive_oid: 2400,
605        }),
606    },
607};
608
609pub const TYPE_FLOAT4_ARRAY: BuiltinType<NameReference> = BuiltinType {
610    name: "_float4",
611    schema: PG_CATALOG_SCHEMA,
612    oid: oid::TYPE_FLOAT4_ARRAY_OID,
613    details: CatalogTypeDetails {
614        typ: CatalogType::Array {
615            element_reference: TYPE_FLOAT4.name,
616        },
617        array_id: None,
618        pg_metadata: Some(CatalogTypePgMetadata {
619            typinput_oid: 750,
620            typreceive_oid: 2400,
621        }),
622    },
623};
624
625pub const TYPE_FLOAT8_ARRAY: BuiltinType<NameReference> = BuiltinType {
626    name: "_float8",
627    schema: PG_CATALOG_SCHEMA,
628    oid: oid::TYPE_FLOAT8_ARRAY_OID,
629    details: CatalogTypeDetails {
630        typ: CatalogType::Array {
631            element_reference: TYPE_FLOAT8.name,
632        },
633        array_id: None,
634        pg_metadata: Some(CatalogTypePgMetadata {
635            typinput_oid: 750,
636            typreceive_oid: 2400,
637        }),
638    },
639};
640
641pub const TYPE_OID_ARRAY: BuiltinType<NameReference> = BuiltinType {
642    name: "_oid",
643    schema: PG_CATALOG_SCHEMA,
644    oid: oid::TYPE_OID_ARRAY_OID,
645    details: CatalogTypeDetails {
646        typ: CatalogType::Array {
647            element_reference: TYPE_OID.name,
648        },
649        array_id: None,
650        pg_metadata: Some(CatalogTypePgMetadata {
651            typinput_oid: 750,
652            typreceive_oid: 2400,
653        }),
654    },
655};
656
657pub const TYPE_DATE: BuiltinType<NameReference> = BuiltinType {
658    name: "date",
659    schema: PG_CATALOG_SCHEMA,
660    oid: oid::TYPE_DATE_OID,
661    details: CatalogTypeDetails {
662        typ: CatalogType::Date,
663        array_id: None,
664        pg_metadata: Some(CatalogTypePgMetadata {
665            typinput_oid: 1084,
666            typreceive_oid: 2468,
667        }),
668    },
669};
670
671pub const TYPE_TIME: BuiltinType<NameReference> = BuiltinType {
672    name: "time",
673    schema: PG_CATALOG_SCHEMA,
674    oid: oid::TYPE_TIME_OID,
675    details: CatalogTypeDetails {
676        typ: CatalogType::Time,
677        array_id: None,
678        pg_metadata: Some(CatalogTypePgMetadata {
679            typinput_oid: 1143,
680            typreceive_oid: 2470,
681        }),
682    },
683};
684
685pub const TYPE_TIMESTAMP: BuiltinType<NameReference> = BuiltinType {
686    name: "timestamp",
687    schema: PG_CATALOG_SCHEMA,
688    oid: oid::TYPE_TIMESTAMP_OID,
689    details: CatalogTypeDetails {
690        typ: CatalogType::Timestamp,
691        array_id: None,
692        pg_metadata: Some(CatalogTypePgMetadata {
693            typinput_oid: 1312,
694            typreceive_oid: 2474,
695        }),
696    },
697};
698
699pub const TYPE_TIMESTAMP_ARRAY: BuiltinType<NameReference> = BuiltinType {
700    name: "_timestamp",
701    schema: PG_CATALOG_SCHEMA,
702    oid: oid::TYPE_TIMESTAMP_ARRAY_OID,
703    details: CatalogTypeDetails {
704        typ: CatalogType::Array {
705            element_reference: TYPE_TIMESTAMP.name,
706        },
707        array_id: None,
708        pg_metadata: Some(CatalogTypePgMetadata {
709            typinput_oid: 750,
710            typreceive_oid: 2400,
711        }),
712    },
713};
714
715pub const TYPE_DATE_ARRAY: BuiltinType<NameReference> = BuiltinType {
716    name: "_date",
717    schema: PG_CATALOG_SCHEMA,
718    oid: oid::TYPE_DATE_ARRAY_OID,
719    details: CatalogTypeDetails {
720        typ: CatalogType::Array {
721            element_reference: TYPE_DATE.name,
722        },
723        array_id: None,
724        pg_metadata: Some(CatalogTypePgMetadata {
725            typinput_oid: 750,
726            typreceive_oid: 2400,
727        }),
728    },
729};
730
731pub const TYPE_TIME_ARRAY: BuiltinType<NameReference> = BuiltinType {
732    name: "_time",
733    schema: PG_CATALOG_SCHEMA,
734    oid: oid::TYPE_TIME_ARRAY_OID,
735    details: CatalogTypeDetails {
736        typ: CatalogType::Array {
737            element_reference: TYPE_TIME.name,
738        },
739        array_id: None,
740        pg_metadata: Some(CatalogTypePgMetadata {
741            typinput_oid: 750,
742            typreceive_oid: 2400,
743        }),
744    },
745};
746
747pub const TYPE_TIMESTAMPTZ: BuiltinType<NameReference> = BuiltinType {
748    name: "timestamptz",
749    schema: PG_CATALOG_SCHEMA,
750    oid: oid::TYPE_TIMESTAMPTZ_OID,
751    details: CatalogTypeDetails {
752        typ: CatalogType::TimestampTz,
753        array_id: None,
754        pg_metadata: Some(CatalogTypePgMetadata {
755            typinput_oid: 1150,
756            typreceive_oid: 2476,
757        }),
758    },
759};
760
761pub const TYPE_TIMESTAMPTZ_ARRAY: BuiltinType<NameReference> = BuiltinType {
762    name: "_timestamptz",
763    schema: PG_CATALOG_SCHEMA,
764    oid: oid::TYPE_TIMESTAMPTZ_ARRAY_OID,
765    details: CatalogTypeDetails {
766        typ: CatalogType::Array {
767            element_reference: TYPE_TIMESTAMPTZ.name,
768        },
769        array_id: None,
770        pg_metadata: Some(CatalogTypePgMetadata {
771            typinput_oid: 750,
772            typreceive_oid: 2400,
773        }),
774    },
775};
776
777pub const TYPE_INTERVAL: BuiltinType<NameReference> = BuiltinType {
778    name: "interval",
779    schema: PG_CATALOG_SCHEMA,
780    oid: oid::TYPE_INTERVAL_OID,
781    details: CatalogTypeDetails {
782        typ: CatalogType::Interval,
783        array_id: None,
784        pg_metadata: Some(CatalogTypePgMetadata {
785            typinput_oid: 1160,
786            typreceive_oid: 2478,
787        }),
788    },
789};
790
791pub const TYPE_INTERVAL_ARRAY: BuiltinType<NameReference> = BuiltinType {
792    name: "_interval",
793    schema: PG_CATALOG_SCHEMA,
794    oid: oid::TYPE_INTERVAL_ARRAY_OID,
795    details: CatalogTypeDetails {
796        typ: CatalogType::Array {
797            element_reference: TYPE_INTERVAL.name,
798        },
799        array_id: None,
800        pg_metadata: Some(CatalogTypePgMetadata {
801            typinput_oid: 750,
802            typreceive_oid: 2400,
803        }),
804    },
805};
806
807pub const TYPE_NAME: BuiltinType<NameReference> = BuiltinType {
808    name: "name",
809    schema: PG_CATALOG_SCHEMA,
810    oid: oid::TYPE_NAME_OID,
811    details: CatalogTypeDetails {
812        typ: CatalogType::PgLegacyName,
813        array_id: None,
814        pg_metadata: Some(CatalogTypePgMetadata {
815            typinput_oid: 34,
816            typreceive_oid: 2422,
817        }),
818    },
819};
820
821pub const TYPE_NAME_ARRAY: BuiltinType<NameReference> = BuiltinType {
822    name: "_name",
823    schema: PG_CATALOG_SCHEMA,
824    oid: oid::TYPE_NAME_ARRAY_OID,
825    details: CatalogTypeDetails {
826        typ: CatalogType::Array {
827            element_reference: TYPE_NAME.name,
828        },
829        array_id: None,
830        pg_metadata: Some(CatalogTypePgMetadata {
831            typinput_oid: 750,
832            typreceive_oid: 2400,
833        }),
834    },
835};
836
837pub const TYPE_NUMERIC: BuiltinType<NameReference> = BuiltinType {
838    name: "numeric",
839    schema: PG_CATALOG_SCHEMA,
840    oid: oid::TYPE_NUMERIC_OID,
841    details: CatalogTypeDetails {
842        typ: CatalogType::Numeric,
843        array_id: None,
844        pg_metadata: Some(CatalogTypePgMetadata {
845            typinput_oid: 1701,
846            typreceive_oid: 2460,
847        }),
848    },
849};
850
851pub const TYPE_NUMERIC_ARRAY: BuiltinType<NameReference> = BuiltinType {
852    name: "_numeric",
853    schema: PG_CATALOG_SCHEMA,
854    oid: oid::TYPE_NUMERIC_ARRAY_OID,
855    details: CatalogTypeDetails {
856        typ: CatalogType::Array {
857            element_reference: TYPE_NUMERIC.name,
858        },
859        array_id: None,
860        pg_metadata: Some(CatalogTypePgMetadata {
861            typinput_oid: 750,
862            typreceive_oid: 2400,
863        }),
864    },
865};
866
867pub const TYPE_RECORD: BuiltinType<NameReference> = BuiltinType {
868    name: "record",
869    schema: PG_CATALOG_SCHEMA,
870    oid: oid::TYPE_RECORD_OID,
871    details: CatalogTypeDetails {
872        typ: CatalogType::Pseudo,
873        array_id: None,
874        pg_metadata: Some(CatalogTypePgMetadata {
875            typinput_oid: 2290,
876            typreceive_oid: 2402,
877        }),
878    },
879};
880
881pub const TYPE_RECORD_ARRAY: BuiltinType<NameReference> = BuiltinType {
882    name: "_record",
883    schema: PG_CATALOG_SCHEMA,
884    oid: oid::TYPE_RECORD_ARRAY_OID,
885    details: CatalogTypeDetails {
886        typ: CatalogType::Array {
887            element_reference: TYPE_RECORD.name,
888        },
889        array_id: None,
890        pg_metadata: Some(CatalogTypePgMetadata {
891            typinput_oid: 750,
892            typreceive_oid: 2400,
893        }),
894    },
895};
896
897pub const TYPE_UUID: BuiltinType<NameReference> = BuiltinType {
898    name: "uuid",
899    schema: PG_CATALOG_SCHEMA,
900    oid: oid::TYPE_UUID_OID,
901    details: CatalogTypeDetails {
902        typ: CatalogType::Uuid,
903        array_id: None,
904        pg_metadata: Some(CatalogTypePgMetadata {
905            typinput_oid: 2952,
906            typreceive_oid: 2961,
907        }),
908    },
909};
910
911pub const TYPE_UUID_ARRAY: BuiltinType<NameReference> = BuiltinType {
912    name: "_uuid",
913    schema: PG_CATALOG_SCHEMA,
914    oid: oid::TYPE_UUID_ARRAY_OID,
915    details: CatalogTypeDetails {
916        typ: CatalogType::Array {
917            element_reference: TYPE_UUID.name,
918        },
919        array_id: None,
920        pg_metadata: Some(CatalogTypePgMetadata {
921            typinput_oid: 750,
922            typreceive_oid: 2400,
923        }),
924    },
925};
926
927pub const TYPE_JSONB: BuiltinType<NameReference> = BuiltinType {
928    name: "jsonb",
929    schema: PG_CATALOG_SCHEMA,
930    oid: oid::TYPE_JSONB_OID,
931    details: CatalogTypeDetails {
932        typ: CatalogType::Jsonb,
933        array_id: None,
934        pg_metadata: Some(CatalogTypePgMetadata {
935            typinput_oid: 3806,
936            typreceive_oid: 3805,
937        }),
938    },
939};
940
941pub const TYPE_JSONB_ARRAY: BuiltinType<NameReference> = BuiltinType {
942    name: "_jsonb",
943    schema: PG_CATALOG_SCHEMA,
944    oid: oid::TYPE_JSONB_ARRAY_OID,
945    details: CatalogTypeDetails {
946        typ: CatalogType::Array {
947            element_reference: TYPE_JSONB.name,
948        },
949        array_id: None,
950        pg_metadata: Some(CatalogTypePgMetadata {
951            typinput_oid: 750,
952            typreceive_oid: 2400,
953        }),
954    },
955};
956
957pub const TYPE_ANY: BuiltinType<NameReference> = BuiltinType {
958    name: "any",
959    schema: PG_CATALOG_SCHEMA,
960    oid: oid::TYPE_ANY_OID,
961    details: CatalogTypeDetails {
962        typ: CatalogType::Pseudo,
963        array_id: None,
964        pg_metadata: Some(CatalogTypePgMetadata {
965            typinput_oid: 2294,
966            typreceive_oid: 0,
967        }),
968    },
969};
970
971pub const TYPE_ANYARRAY: BuiltinType<NameReference> = BuiltinType {
972    name: "anyarray",
973    schema: PG_CATALOG_SCHEMA,
974    oid: oid::TYPE_ANYARRAY_OID,
975    details: CatalogTypeDetails {
976        typ: CatalogType::Pseudo,
977        array_id: None,
978        pg_metadata: Some(CatalogTypePgMetadata {
979            typinput_oid: 2296,
980            typreceive_oid: 2502,
981        }),
982    },
983};
984
985pub const TYPE_ANYELEMENT: BuiltinType<NameReference> = BuiltinType {
986    name: "anyelement",
987    schema: PG_CATALOG_SCHEMA,
988    oid: oid::TYPE_ANYELEMENT_OID,
989    details: CatalogTypeDetails {
990        typ: CatalogType::Pseudo,
991        array_id: None,
992        pg_metadata: Some(CatalogTypePgMetadata {
993            typinput_oid: 2312,
994            typreceive_oid: 0,
995        }),
996    },
997};
998
999pub const TYPE_ANYNONARRAY: BuiltinType<NameReference> = BuiltinType {
1000    name: "anynonarray",
1001    schema: PG_CATALOG_SCHEMA,
1002    oid: oid::TYPE_ANYNONARRAY_OID,
1003    details: CatalogTypeDetails {
1004        typ: CatalogType::Pseudo,
1005        array_id: None,
1006        pg_metadata: Some(CatalogTypePgMetadata {
1007            typinput_oid: 2777,
1008            typreceive_oid: 0,
1009        }),
1010    },
1011};
1012
1013pub const TYPE_ANYRANGE: BuiltinType<NameReference> = BuiltinType {
1014    name: "anyrange",
1015    schema: PG_CATALOG_SCHEMA,
1016    oid: oid::TYPE_ANYRANGE_OID,
1017    details: CatalogTypeDetails {
1018        typ: CatalogType::Pseudo,
1019        array_id: None,
1020        pg_metadata: Some(CatalogTypePgMetadata {
1021            typinput_oid: 3832,
1022            typreceive_oid: 0,
1023        }),
1024    },
1025};
1026
1027pub const TYPE_CHAR: BuiltinType<NameReference> = BuiltinType {
1028    name: "char",
1029    schema: PG_CATALOG_SCHEMA,
1030    oid: oid::TYPE_CHAR_OID,
1031    details: CatalogTypeDetails {
1032        typ: CatalogType::PgLegacyChar,
1033        array_id: None,
1034        pg_metadata: Some(CatalogTypePgMetadata {
1035            typinput_oid: 1245,
1036            typreceive_oid: 2434,
1037        }),
1038    },
1039};
1040
1041pub const TYPE_VARCHAR: BuiltinType<NameReference> = BuiltinType {
1042    name: "varchar",
1043    schema: PG_CATALOG_SCHEMA,
1044    oid: oid::TYPE_VARCHAR_OID,
1045    details: CatalogTypeDetails {
1046        typ: CatalogType::VarChar,
1047        array_id: None,
1048        pg_metadata: Some(CatalogTypePgMetadata {
1049            typinput_oid: 1046,
1050            typreceive_oid: 2432,
1051        }),
1052    },
1053};
1054
1055pub const TYPE_INT2: BuiltinType<NameReference> = BuiltinType {
1056    name: "int2",
1057    schema: PG_CATALOG_SCHEMA,
1058    oid: oid::TYPE_INT2_OID,
1059    details: CatalogTypeDetails {
1060        typ: CatalogType::Int16,
1061        array_id: None,
1062        pg_metadata: Some(CatalogTypePgMetadata {
1063            typinput_oid: 38,
1064            typreceive_oid: 2404,
1065        }),
1066    },
1067};
1068
1069pub const TYPE_INT2_ARRAY: BuiltinType<NameReference> = BuiltinType {
1070    name: "_int2",
1071    schema: PG_CATALOG_SCHEMA,
1072    oid: oid::TYPE_INT2_ARRAY_OID,
1073    details: CatalogTypeDetails {
1074        typ: CatalogType::Array {
1075            element_reference: TYPE_INT2.name,
1076        },
1077        array_id: None,
1078        pg_metadata: Some(CatalogTypePgMetadata {
1079            typinput_oid: 750,
1080            typreceive_oid: 2400,
1081        }),
1082    },
1083};
1084
1085pub const TYPE_BPCHAR: BuiltinType<NameReference> = BuiltinType {
1086    name: "bpchar",
1087    schema: PG_CATALOG_SCHEMA,
1088    oid: oid::TYPE_BPCHAR_OID,
1089    details: CatalogTypeDetails {
1090        typ: CatalogType::Char,
1091        array_id: None,
1092        pg_metadata: Some(CatalogTypePgMetadata {
1093            typinput_oid: 1044,
1094            typreceive_oid: 2430,
1095        }),
1096    },
1097};
1098
1099pub const TYPE_CHAR_ARRAY: BuiltinType<NameReference> = BuiltinType {
1100    name: "_char",
1101    schema: PG_CATALOG_SCHEMA,
1102    oid: oid::TYPE_CHAR_ARRAY_OID,
1103    details: CatalogTypeDetails {
1104        typ: CatalogType::Array {
1105            element_reference: TYPE_CHAR.name,
1106        },
1107        array_id: None,
1108        pg_metadata: Some(CatalogTypePgMetadata {
1109            typinput_oid: 750,
1110            typreceive_oid: 2400,
1111        }),
1112    },
1113};
1114
1115pub const TYPE_VARCHAR_ARRAY: BuiltinType<NameReference> = BuiltinType {
1116    name: "_varchar",
1117    schema: PG_CATALOG_SCHEMA,
1118    oid: oid::TYPE_VARCHAR_ARRAY_OID,
1119    details: CatalogTypeDetails {
1120        typ: CatalogType::Array {
1121            element_reference: TYPE_VARCHAR.name,
1122        },
1123        array_id: None,
1124        pg_metadata: Some(CatalogTypePgMetadata {
1125            typinput_oid: 750,
1126            typreceive_oid: 2400,
1127        }),
1128    },
1129};
1130
1131pub const TYPE_BPCHAR_ARRAY: BuiltinType<NameReference> = BuiltinType {
1132    name: "_bpchar",
1133    schema: PG_CATALOG_SCHEMA,
1134    oid: oid::TYPE_BPCHAR_ARRAY_OID,
1135    details: CatalogTypeDetails {
1136        typ: CatalogType::Array {
1137            element_reference: TYPE_BPCHAR.name,
1138        },
1139        array_id: None,
1140        pg_metadata: Some(CatalogTypePgMetadata {
1141            typinput_oid: 750,
1142            typreceive_oid: 2400,
1143        }),
1144    },
1145};
1146
1147pub const TYPE_REGPROC: BuiltinType<NameReference> = BuiltinType {
1148    name: "regproc",
1149    schema: PG_CATALOG_SCHEMA,
1150    oid: oid::TYPE_REGPROC_OID,
1151    details: CatalogTypeDetails {
1152        typ: CatalogType::RegProc,
1153        array_id: None,
1154        pg_metadata: Some(CatalogTypePgMetadata {
1155            typinput_oid: 44,
1156            typreceive_oid: 2444,
1157        }),
1158    },
1159};
1160
1161pub const TYPE_REGPROC_ARRAY: BuiltinType<NameReference> = BuiltinType {
1162    name: "_regproc",
1163    schema: PG_CATALOG_SCHEMA,
1164    oid: oid::TYPE_REGPROC_ARRAY_OID,
1165    details: CatalogTypeDetails {
1166        typ: CatalogType::Array {
1167            element_reference: TYPE_REGPROC.name,
1168        },
1169        array_id: None,
1170        pg_metadata: Some(CatalogTypePgMetadata {
1171            typinput_oid: 750,
1172            typreceive_oid: 2400,
1173        }),
1174    },
1175};
1176
1177pub const TYPE_REGTYPE: BuiltinType<NameReference> = BuiltinType {
1178    name: "regtype",
1179    schema: PG_CATALOG_SCHEMA,
1180    oid: oid::TYPE_REGTYPE_OID,
1181    details: CatalogTypeDetails {
1182        typ: CatalogType::RegType,
1183        array_id: None,
1184        pg_metadata: Some(CatalogTypePgMetadata {
1185            typinput_oid: 2220,
1186            typreceive_oid: 2454,
1187        }),
1188    },
1189};
1190
1191pub const TYPE_REGTYPE_ARRAY: BuiltinType<NameReference> = BuiltinType {
1192    name: "_regtype",
1193    schema: PG_CATALOG_SCHEMA,
1194    oid: oid::TYPE_REGTYPE_ARRAY_OID,
1195    details: CatalogTypeDetails {
1196        typ: CatalogType::Array {
1197            element_reference: TYPE_REGTYPE.name,
1198        },
1199        array_id: None,
1200        pg_metadata: Some(CatalogTypePgMetadata {
1201            typinput_oid: 750,
1202            typreceive_oid: 2400,
1203        }),
1204    },
1205};
1206
1207pub const TYPE_REGCLASS: BuiltinType<NameReference> = BuiltinType {
1208    name: "regclass",
1209    schema: PG_CATALOG_SCHEMA,
1210    oid: oid::TYPE_REGCLASS_OID,
1211    details: CatalogTypeDetails {
1212        typ: CatalogType::RegClass,
1213        array_id: None,
1214        pg_metadata: Some(CatalogTypePgMetadata {
1215            typinput_oid: 2218,
1216            typreceive_oid: 2452,
1217        }),
1218    },
1219};
1220
1221pub const TYPE_REGCLASS_ARRAY: BuiltinType<NameReference> = BuiltinType {
1222    name: "_regclass",
1223    schema: PG_CATALOG_SCHEMA,
1224    oid: oid::TYPE_REGCLASS_ARRAY_OID,
1225    details: CatalogTypeDetails {
1226        typ: CatalogType::Array {
1227            element_reference: TYPE_REGCLASS.name,
1228        },
1229        array_id: None,
1230        pg_metadata: Some(CatalogTypePgMetadata {
1231            typinput_oid: 750,
1232            typreceive_oid: 2400,
1233        }),
1234    },
1235};
1236
1237pub const TYPE_INT2_VECTOR: BuiltinType<NameReference> = BuiltinType {
1238    name: "int2vector",
1239    schema: PG_CATALOG_SCHEMA,
1240    oid: oid::TYPE_INT2_VECTOR_OID,
1241    details: CatalogTypeDetails {
1242        typ: CatalogType::Int2Vector,
1243        array_id: None,
1244        pg_metadata: Some(CatalogTypePgMetadata {
1245            typinput_oid: 40,
1246            typreceive_oid: 2410,
1247        }),
1248    },
1249};
1250
1251pub const TYPE_INT2_VECTOR_ARRAY: BuiltinType<NameReference> = BuiltinType {
1252    name: "_int2vector",
1253    schema: PG_CATALOG_SCHEMA,
1254    oid: oid::TYPE_INT2_VECTOR_ARRAY_OID,
1255    details: CatalogTypeDetails {
1256        typ: CatalogType::Array {
1257            element_reference: TYPE_INT2_VECTOR.name,
1258        },
1259        array_id: None,
1260        pg_metadata: Some(CatalogTypePgMetadata {
1261            typinput_oid: 750,
1262            typreceive_oid: 2400,
1263        }),
1264    },
1265};
1266
1267pub const TYPE_ANYCOMPATIBLE: BuiltinType<NameReference> = BuiltinType {
1268    name: "anycompatible",
1269    schema: PG_CATALOG_SCHEMA,
1270    oid: oid::TYPE_ANYCOMPATIBLE_OID,
1271    details: CatalogTypeDetails {
1272        typ: CatalogType::Pseudo,
1273        array_id: None,
1274        pg_metadata: Some(CatalogTypePgMetadata {
1275            typinput_oid: 5086,
1276            typreceive_oid: 0,
1277        }),
1278    },
1279};
1280
1281pub const TYPE_ANYCOMPATIBLEARRAY: BuiltinType<NameReference> = BuiltinType {
1282    name: "anycompatiblearray",
1283    schema: PG_CATALOG_SCHEMA,
1284    oid: oid::TYPE_ANYCOMPATIBLEARRAY_OID,
1285    details: CatalogTypeDetails {
1286        typ: CatalogType::Pseudo,
1287        array_id: None,
1288        pg_metadata: Some(CatalogTypePgMetadata {
1289            typinput_oid: 5088,
1290            typreceive_oid: 5090,
1291        }),
1292    },
1293};
1294
1295pub const TYPE_ANYCOMPATIBLENONARRAY: BuiltinType<NameReference> = BuiltinType {
1296    name: "anycompatiblenonarray",
1297    schema: PG_CATALOG_SCHEMA,
1298    oid: oid::TYPE_ANYCOMPATIBLENONARRAY_OID,
1299    details: CatalogTypeDetails {
1300        typ: CatalogType::Pseudo,
1301        array_id: None,
1302        pg_metadata: Some(CatalogTypePgMetadata {
1303            typinput_oid: 5092,
1304            typreceive_oid: 0,
1305        }),
1306    },
1307};
1308
1309pub const TYPE_ANYCOMPATIBLERANGE: BuiltinType<NameReference> = BuiltinType {
1310    name: "anycompatiblerange",
1311    schema: PG_CATALOG_SCHEMA,
1312    oid: oid::TYPE_ANYCOMPATIBLERANGE_OID,
1313    details: CatalogTypeDetails {
1314        typ: CatalogType::Pseudo,
1315        array_id: None,
1316        pg_metadata: Some(CatalogTypePgMetadata {
1317            typinput_oid: 5094,
1318            typreceive_oid: 0,
1319        }),
1320    },
1321};
1322
1323pub const TYPE_LIST: BuiltinType<NameReference> = BuiltinType {
1324    name: "list",
1325    schema: MZ_CATALOG_SCHEMA,
1326    oid: mz_pgrepr::oid::TYPE_LIST_OID,
1327    details: CatalogTypeDetails {
1328        typ: CatalogType::Pseudo,
1329        array_id: None,
1330        pg_metadata: None,
1331    },
1332};
1333
1334pub const TYPE_MAP: BuiltinType<NameReference> = BuiltinType {
1335    name: "map",
1336    schema: MZ_CATALOG_SCHEMA,
1337    oid: mz_pgrepr::oid::TYPE_MAP_OID,
1338    details: CatalogTypeDetails {
1339        typ: CatalogType::Pseudo,
1340        array_id: None,
1341        pg_metadata: None,
1342    },
1343};
1344
1345pub const TYPE_ANYCOMPATIBLELIST: BuiltinType<NameReference> = BuiltinType {
1346    name: "anycompatiblelist",
1347    schema: MZ_CATALOG_SCHEMA,
1348    oid: mz_pgrepr::oid::TYPE_ANYCOMPATIBLELIST_OID,
1349    details: CatalogTypeDetails {
1350        typ: CatalogType::Pseudo,
1351        array_id: None,
1352        pg_metadata: None,
1353    },
1354};
1355
1356pub const TYPE_ANYCOMPATIBLEMAP: BuiltinType<NameReference> = BuiltinType {
1357    name: "anycompatiblemap",
1358    schema: MZ_CATALOG_SCHEMA,
1359    oid: mz_pgrepr::oid::TYPE_ANYCOMPATIBLEMAP_OID,
1360    details: CatalogTypeDetails {
1361        typ: CatalogType::Pseudo,
1362        array_id: None,
1363        pg_metadata: None,
1364    },
1365};
1366
1367pub const TYPE_UINT2: BuiltinType<NameReference> = BuiltinType {
1368    name: "uint2",
1369    schema: MZ_CATALOG_SCHEMA,
1370    oid: mz_pgrepr::oid::TYPE_UINT2_OID,
1371    details: CatalogTypeDetails {
1372        typ: CatalogType::UInt16,
1373        array_id: None,
1374        pg_metadata: None,
1375    },
1376};
1377
1378pub const TYPE_UINT2_ARRAY: BuiltinType<NameReference> = BuiltinType {
1379    name: "_uint2",
1380    schema: MZ_CATALOG_SCHEMA,
1381    oid: mz_pgrepr::oid::TYPE_UINT2_ARRAY_OID,
1382    details: CatalogTypeDetails {
1383        typ: CatalogType::Array {
1384            element_reference: TYPE_UINT2.name,
1385        },
1386        array_id: None,
1387        pg_metadata: None,
1388    },
1389};
1390
1391pub const TYPE_UINT4: BuiltinType<NameReference> = BuiltinType {
1392    name: "uint4",
1393    schema: MZ_CATALOG_SCHEMA,
1394    oid: mz_pgrepr::oid::TYPE_UINT4_OID,
1395    details: CatalogTypeDetails {
1396        typ: CatalogType::UInt32,
1397        array_id: None,
1398        pg_metadata: None,
1399    },
1400};
1401
1402pub const TYPE_UINT4_ARRAY: BuiltinType<NameReference> = BuiltinType {
1403    name: "_uint4",
1404    schema: MZ_CATALOG_SCHEMA,
1405    oid: mz_pgrepr::oid::TYPE_UINT4_ARRAY_OID,
1406    details: CatalogTypeDetails {
1407        typ: CatalogType::Array {
1408            element_reference: TYPE_UINT4.name,
1409        },
1410        array_id: None,
1411        pg_metadata: None,
1412    },
1413};
1414
1415pub const TYPE_UINT8: BuiltinType<NameReference> = BuiltinType {
1416    name: "uint8",
1417    schema: MZ_CATALOG_SCHEMA,
1418    oid: mz_pgrepr::oid::TYPE_UINT8_OID,
1419    details: CatalogTypeDetails {
1420        typ: CatalogType::UInt64,
1421        array_id: None,
1422        pg_metadata: None,
1423    },
1424};
1425
1426pub const TYPE_UINT8_ARRAY: BuiltinType<NameReference> = BuiltinType {
1427    name: "_uint8",
1428    schema: MZ_CATALOG_SCHEMA,
1429    oid: mz_pgrepr::oid::TYPE_UINT8_ARRAY_OID,
1430    details: CatalogTypeDetails {
1431        typ: CatalogType::Array {
1432            element_reference: TYPE_UINT8.name,
1433        },
1434        array_id: None,
1435        pg_metadata: None,
1436    },
1437};
1438
1439pub const TYPE_MZ_TIMESTAMP: BuiltinType<NameReference> = BuiltinType {
1440    name: "mz_timestamp",
1441    schema: MZ_CATALOG_SCHEMA,
1442    oid: mz_pgrepr::oid::TYPE_MZ_TIMESTAMP_OID,
1443    details: CatalogTypeDetails {
1444        typ: CatalogType::MzTimestamp,
1445        array_id: None,
1446        pg_metadata: None,
1447    },
1448};
1449
1450pub const TYPE_MZ_TIMESTAMP_ARRAY: BuiltinType<NameReference> = BuiltinType {
1451    name: "_mz_timestamp",
1452    schema: MZ_CATALOG_SCHEMA,
1453    oid: mz_pgrepr::oid::TYPE_MZ_TIMESTAMP_ARRAY_OID,
1454    details: CatalogTypeDetails {
1455        typ: CatalogType::Array {
1456            element_reference: TYPE_MZ_TIMESTAMP.name,
1457        },
1458        array_id: None,
1459        pg_metadata: None,
1460    },
1461};
1462
1463pub const TYPE_INT4_RANGE: BuiltinType<NameReference> = BuiltinType {
1464    name: "int4range",
1465    schema: PG_CATALOG_SCHEMA,
1466    oid: mz_pgrepr::oid::TYPE_INT4RANGE_OID,
1467    details: CatalogTypeDetails {
1468        typ: CatalogType::Range {
1469            element_reference: TYPE_INT4.name,
1470        },
1471        array_id: None,
1472        pg_metadata: Some(CatalogTypePgMetadata {
1473            typinput_oid: 3834,
1474            typreceive_oid: 3836,
1475        }),
1476    },
1477};
1478
1479pub const TYPE_INT4_RANGE_ARRAY: BuiltinType<NameReference> = BuiltinType {
1480    name: "_int4range",
1481    schema: PG_CATALOG_SCHEMA,
1482    oid: mz_pgrepr::oid::TYPE_INT4RANGE_ARRAY_OID,
1483    details: CatalogTypeDetails {
1484        typ: CatalogType::Array {
1485            element_reference: TYPE_INT4_RANGE.name,
1486        },
1487        array_id: None,
1488        pg_metadata: Some(CatalogTypePgMetadata {
1489            typinput_oid: 750,
1490            typreceive_oid: 2400,
1491        }),
1492    },
1493};
1494
1495pub const TYPE_INT8_RANGE: BuiltinType<NameReference> = BuiltinType {
1496    name: "int8range",
1497    schema: PG_CATALOG_SCHEMA,
1498    oid: mz_pgrepr::oid::TYPE_INT8RANGE_OID,
1499    details: CatalogTypeDetails {
1500        typ: CatalogType::Range {
1501            element_reference: TYPE_INT8.name,
1502        },
1503        array_id: None,
1504        pg_metadata: Some(CatalogTypePgMetadata {
1505            typinput_oid: 3834,
1506            typreceive_oid: 3836,
1507        }),
1508    },
1509};
1510
1511pub const TYPE_INT8_RANGE_ARRAY: BuiltinType<NameReference> = BuiltinType {
1512    name: "_int8range",
1513    schema: PG_CATALOG_SCHEMA,
1514    oid: mz_pgrepr::oid::TYPE_INT8RANGE_ARRAY_OID,
1515    details: CatalogTypeDetails {
1516        typ: CatalogType::Array {
1517            element_reference: TYPE_INT8_RANGE.name,
1518        },
1519        array_id: None,
1520        pg_metadata: Some(CatalogTypePgMetadata {
1521            typinput_oid: 750,
1522            typreceive_oid: 2400,
1523        }),
1524    },
1525};
1526
1527pub const TYPE_DATE_RANGE: BuiltinType<NameReference> = BuiltinType {
1528    name: "daterange",
1529    schema: PG_CATALOG_SCHEMA,
1530    oid: mz_pgrepr::oid::TYPE_DATERANGE_OID,
1531    details: CatalogTypeDetails {
1532        typ: CatalogType::Range {
1533            element_reference: TYPE_DATE.name,
1534        },
1535        array_id: None,
1536        pg_metadata: Some(CatalogTypePgMetadata {
1537            typinput_oid: 3834,
1538            typreceive_oid: 3836,
1539        }),
1540    },
1541};
1542
1543pub const TYPE_DATE_RANGE_ARRAY: BuiltinType<NameReference> = BuiltinType {
1544    name: "_daterange",
1545    schema: PG_CATALOG_SCHEMA,
1546    oid: mz_pgrepr::oid::TYPE_DATERANGE_ARRAY_OID,
1547    details: CatalogTypeDetails {
1548        typ: CatalogType::Array {
1549            element_reference: TYPE_DATE_RANGE.name,
1550        },
1551        array_id: None,
1552        pg_metadata: Some(CatalogTypePgMetadata {
1553            typinput_oid: 750,
1554            typreceive_oid: 2400,
1555        }),
1556    },
1557};
1558
1559pub const TYPE_NUM_RANGE: BuiltinType<NameReference> = BuiltinType {
1560    name: "numrange",
1561    schema: PG_CATALOG_SCHEMA,
1562    oid: mz_pgrepr::oid::TYPE_NUMRANGE_OID,
1563    details: CatalogTypeDetails {
1564        typ: CatalogType::Range {
1565            element_reference: TYPE_NUMERIC.name,
1566        },
1567        array_id: None,
1568        pg_metadata: Some(CatalogTypePgMetadata {
1569            typinput_oid: 3834,
1570            typreceive_oid: 3836,
1571        }),
1572    },
1573};
1574
1575pub const TYPE_NUM_RANGE_ARRAY: BuiltinType<NameReference> = BuiltinType {
1576    name: "_numrange",
1577    schema: PG_CATALOG_SCHEMA,
1578    oid: mz_pgrepr::oid::TYPE_NUMRANGE_ARRAY_OID,
1579    details: CatalogTypeDetails {
1580        typ: CatalogType::Array {
1581            element_reference: TYPE_NUM_RANGE.name,
1582        },
1583        array_id: None,
1584        pg_metadata: Some(CatalogTypePgMetadata {
1585            typinput_oid: 750,
1586            typreceive_oid: 2400,
1587        }),
1588    },
1589};
1590
1591pub const TYPE_TS_RANGE: BuiltinType<NameReference> = BuiltinType {
1592    name: "tsrange",
1593    schema: PG_CATALOG_SCHEMA,
1594    oid: mz_pgrepr::oid::TYPE_TSRANGE_OID,
1595    details: CatalogTypeDetails {
1596        typ: CatalogType::Range {
1597            element_reference: TYPE_TIMESTAMP.name,
1598        },
1599        array_id: None,
1600        pg_metadata: Some(CatalogTypePgMetadata {
1601            typinput_oid: 3834,
1602            typreceive_oid: 3836,
1603        }),
1604    },
1605};
1606
1607pub const TYPE_TS_RANGE_ARRAY: BuiltinType<NameReference> = BuiltinType {
1608    name: "_tsrange",
1609    schema: PG_CATALOG_SCHEMA,
1610    oid: mz_pgrepr::oid::TYPE_TSRANGE_ARRAY_OID,
1611    details: CatalogTypeDetails {
1612        typ: CatalogType::Array {
1613            element_reference: TYPE_TS_RANGE.name,
1614        },
1615        array_id: None,
1616        pg_metadata: Some(CatalogTypePgMetadata {
1617            typinput_oid: 750,
1618            typreceive_oid: 2400,
1619        }),
1620    },
1621};
1622
1623pub const TYPE_TSTZ_RANGE: BuiltinType<NameReference> = BuiltinType {
1624    name: "tstzrange",
1625    schema: PG_CATALOG_SCHEMA,
1626    oid: mz_pgrepr::oid::TYPE_TSTZRANGE_OID,
1627    details: CatalogTypeDetails {
1628        typ: CatalogType::Range {
1629            element_reference: TYPE_TIMESTAMPTZ.name,
1630        },
1631        array_id: None,
1632        pg_metadata: Some(CatalogTypePgMetadata {
1633            typinput_oid: 3834,
1634            typreceive_oid: 3836,
1635        }),
1636    },
1637};
1638
1639pub const TYPE_TSTZ_RANGE_ARRAY: BuiltinType<NameReference> = BuiltinType {
1640    name: "_tstzrange",
1641    schema: PG_CATALOG_SCHEMA,
1642    oid: mz_pgrepr::oid::TYPE_TSTZRANGE_ARRAY_OID,
1643    details: CatalogTypeDetails {
1644        typ: CatalogType::Array {
1645            element_reference: TYPE_TSTZ_RANGE.name,
1646        },
1647        array_id: None,
1648        pg_metadata: Some(CatalogTypePgMetadata {
1649            typinput_oid: 750,
1650            typreceive_oid: 2400,
1651        }),
1652    },
1653};
1654
1655pub const TYPE_MZ_ACL_ITEM: BuiltinType<NameReference> = BuiltinType {
1656    name: "mz_aclitem",
1657    schema: MZ_CATALOG_SCHEMA,
1658    oid: mz_pgrepr::oid::TYPE_MZ_ACL_ITEM_OID,
1659    details: CatalogTypeDetails {
1660        typ: CatalogType::MzAclItem,
1661        array_id: None,
1662        pg_metadata: None,
1663    },
1664};
1665
1666pub const TYPE_MZ_ACL_ITEM_ARRAY: BuiltinType<NameReference> = BuiltinType {
1667    name: "_mz_aclitem",
1668    schema: MZ_CATALOG_SCHEMA,
1669    oid: mz_pgrepr::oid::TYPE_MZ_ACL_ITEM_ARRAY_OID,
1670    details: CatalogTypeDetails {
1671        typ: CatalogType::Array {
1672            element_reference: TYPE_MZ_ACL_ITEM.name,
1673        },
1674        array_id: None,
1675        pg_metadata: Some(CatalogTypePgMetadata {
1676            typinput_oid: 750,
1677            typreceive_oid: 2400,
1678        }),
1679    },
1680};
1681
1682pub const TYPE_ACL_ITEM: BuiltinType<NameReference> = BuiltinType {
1683    name: "aclitem",
1684    schema: PG_CATALOG_SCHEMA,
1685    oid: 1033,
1686    details: CatalogTypeDetails {
1687        typ: CatalogType::AclItem,
1688        array_id: None,
1689        pg_metadata: Some(CatalogTypePgMetadata {
1690            typinput_oid: 1031,
1691            typreceive_oid: 0,
1692        }),
1693    },
1694};
1695
1696pub const TYPE_ACL_ITEM_ARRAY: BuiltinType<NameReference> = BuiltinType {
1697    name: "_aclitem",
1698    schema: PG_CATALOG_SCHEMA,
1699    oid: 1034,
1700    details: CatalogTypeDetails {
1701        typ: CatalogType::Array {
1702            element_reference: TYPE_ACL_ITEM.name,
1703        },
1704        array_id: None,
1705        pg_metadata: Some(CatalogTypePgMetadata {
1706            typinput_oid: 750,
1707            typreceive_oid: 2400,
1708        }),
1709    },
1710};
1711
1712pub const TYPE_INTERNAL: BuiltinType<NameReference> = BuiltinType {
1713    name: "internal",
1714    schema: PG_CATALOG_SCHEMA,
1715    oid: 2281,
1716    details: CatalogTypeDetails {
1717        typ: CatalogType::Pseudo,
1718        array_id: None,
1719        pg_metadata: Some(CatalogTypePgMetadata {
1720            typinput_oid: 2304,
1721            typreceive_oid: 0,
1722        }),
1723    },
1724};
1725
1726const PUBLIC_SELECT: MzAclItem = MzAclItem {
1727    grantee: RoleId::Public,
1728    grantor: MZ_SYSTEM_ROLE_ID,
1729    acl_mode: AclMode::SELECT,
1730};
1731
1732const SUPPORT_SELECT: MzAclItem = MzAclItem {
1733    grantee: MZ_SUPPORT_ROLE_ID,
1734    grantor: MZ_SYSTEM_ROLE_ID,
1735    acl_mode: AclMode::SELECT,
1736};
1737
1738const ANALYTICS_SELECT: MzAclItem = MzAclItem {
1739    grantee: MZ_ANALYTICS_ROLE_ID,
1740    grantor: MZ_SYSTEM_ROLE_ID,
1741    acl_mode: AclMode::SELECT,
1742};
1743
1744const MONITOR_SELECT: MzAclItem = MzAclItem {
1745    grantee: MZ_MONITOR_ROLE_ID,
1746    grantor: MZ_SYSTEM_ROLE_ID,
1747    acl_mode: AclMode::SELECT,
1748};
1749
1750const MONITOR_REDACTED_SELECT: MzAclItem = MzAclItem {
1751    grantee: MZ_MONITOR_REDACTED_ROLE_ID,
1752    grantor: MZ_SYSTEM_ROLE_ID,
1753    acl_mode: AclMode::SELECT,
1754};
1755
1756pub static MZ_DATAFLOW_OPERATORS_PER_WORKER: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1757    name: "mz_dataflow_operators_per_worker",
1758    schema: MZ_INTROSPECTION_SCHEMA,
1759    oid: oid::LOG_MZ_DATAFLOW_OPERATORS_PER_WORKER_OID,
1760    variant: LogVariant::Timely(TimelyLog::Operates),
1761    access: vec![PUBLIC_SELECT],
1762});
1763
1764pub static MZ_DATAFLOW_ADDRESSES_PER_WORKER: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1765    name: "mz_dataflow_addresses_per_worker",
1766    schema: MZ_INTROSPECTION_SCHEMA,
1767    oid: oid::LOG_MZ_DATAFLOW_ADDRESSES_PER_WORKER_OID,
1768    variant: LogVariant::Timely(TimelyLog::Addresses),
1769    access: vec![PUBLIC_SELECT],
1770});
1771
1772pub static MZ_DATAFLOW_CHANNELS_PER_WORKER: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1773    name: "mz_dataflow_channels_per_worker",
1774    schema: MZ_INTROSPECTION_SCHEMA,
1775    oid: oid::LOG_MZ_DATAFLOW_CHANNELS_PER_WORKER_OID,
1776    variant: LogVariant::Timely(TimelyLog::Channels),
1777    access: vec![PUBLIC_SELECT],
1778});
1779
1780pub static MZ_SCHEDULING_ELAPSED_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1781    name: "mz_scheduling_elapsed_raw",
1782    schema: MZ_INTROSPECTION_SCHEMA,
1783    oid: oid::LOG_MZ_SCHEDULING_ELAPSED_RAW_OID,
1784    variant: LogVariant::Timely(TimelyLog::Elapsed),
1785    access: vec![PUBLIC_SELECT],
1786});
1787
1788pub static MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM_RAW: LazyLock<BuiltinLog> =
1789    LazyLock::new(|| BuiltinLog {
1790        name: "mz_compute_operator_durations_histogram_raw",
1791        schema: MZ_INTROSPECTION_SCHEMA,
1792        oid: oid::LOG_MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM_RAW_OID,
1793        variant: LogVariant::Timely(TimelyLog::Histogram),
1794        access: vec![PUBLIC_SELECT],
1795    });
1796
1797pub static MZ_SCHEDULING_PARKS_HISTOGRAM_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1798    name: "mz_scheduling_parks_histogram_raw",
1799    schema: MZ_INTROSPECTION_SCHEMA,
1800    oid: oid::LOG_MZ_SCHEDULING_PARKS_HISTOGRAM_RAW_OID,
1801    variant: LogVariant::Timely(TimelyLog::Parks),
1802    access: vec![PUBLIC_SELECT],
1803});
1804
1805pub static MZ_ARRANGEMENT_RECORDS_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1806    name: "mz_arrangement_records_raw",
1807    schema: MZ_INTROSPECTION_SCHEMA,
1808    oid: oid::LOG_MZ_ARRANGEMENT_RECORDS_RAW_OID,
1809    variant: LogVariant::Differential(DifferentialLog::ArrangementRecords),
1810    access: vec![PUBLIC_SELECT],
1811});
1812
1813pub static MZ_ARRANGEMENT_BATCHES_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1814    name: "mz_arrangement_batches_raw",
1815    schema: MZ_INTROSPECTION_SCHEMA,
1816    oid: oid::LOG_MZ_ARRANGEMENT_BATCHES_RAW_OID,
1817    variant: LogVariant::Differential(DifferentialLog::ArrangementBatches),
1818    access: vec![PUBLIC_SELECT],
1819});
1820
1821pub static MZ_ARRANGEMENT_SHARING_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1822    name: "mz_arrangement_sharing_raw",
1823    schema: MZ_INTROSPECTION_SCHEMA,
1824    oid: oid::LOG_MZ_ARRANGEMENT_SHARING_RAW_OID,
1825    variant: LogVariant::Differential(DifferentialLog::Sharing),
1826    access: vec![PUBLIC_SELECT],
1827});
1828
1829pub static MZ_ARRANGEMENT_BATCHER_RECORDS_RAW: LazyLock<BuiltinLog> =
1830    LazyLock::new(|| BuiltinLog {
1831        name: "mz_arrangement_batcher_records_raw",
1832        schema: MZ_INTROSPECTION_SCHEMA,
1833        oid: oid::LOG_MZ_ARRANGEMENT_BATCHER_RECORDS_RAW_OID,
1834        variant: LogVariant::Differential(DifferentialLog::BatcherRecords),
1835        access: vec![PUBLIC_SELECT],
1836    });
1837
1838pub static MZ_ARRANGEMENT_BATCHER_SIZE_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1839    name: "mz_arrangement_batcher_size_raw",
1840    schema: MZ_INTROSPECTION_SCHEMA,
1841    oid: oid::LOG_MZ_ARRANGEMENT_BATCHER_SIZE_RAW_OID,
1842    variant: LogVariant::Differential(DifferentialLog::BatcherSize),
1843    access: vec![PUBLIC_SELECT],
1844});
1845
1846pub static MZ_ARRANGEMENT_BATCHER_CAPACITY_RAW: LazyLock<BuiltinLog> =
1847    LazyLock::new(|| BuiltinLog {
1848        name: "mz_arrangement_batcher_capacity_raw",
1849        schema: MZ_INTROSPECTION_SCHEMA,
1850        oid: oid::LOG_MZ_ARRANGEMENT_BATCHER_CAPACITY_RAW_OID,
1851        variant: LogVariant::Differential(DifferentialLog::BatcherCapacity),
1852        access: vec![PUBLIC_SELECT],
1853    });
1854
1855pub static MZ_ARRANGEMENT_BATCHER_ALLOCATIONS_RAW: LazyLock<BuiltinLog> =
1856    LazyLock::new(|| BuiltinLog {
1857        name: "mz_arrangement_batcher_allocations_raw",
1858        schema: MZ_INTROSPECTION_SCHEMA,
1859        oid: oid::LOG_MZ_ARRANGEMENT_BATCHER_ALLOCATIONS_RAW_OID,
1860        variant: LogVariant::Differential(DifferentialLog::BatcherAllocations),
1861        access: vec![PUBLIC_SELECT],
1862    });
1863
1864pub static MZ_COMPUTE_EXPORTS_PER_WORKER: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1865    name: "mz_compute_exports_per_worker",
1866    schema: MZ_INTROSPECTION_SCHEMA,
1867    oid: oid::LOG_MZ_COMPUTE_EXPORTS_PER_WORKER_OID,
1868    variant: LogVariant::Compute(ComputeLog::DataflowCurrent),
1869    access: vec![PUBLIC_SELECT],
1870});
1871
1872pub static MZ_COMPUTE_DATAFLOW_GLOBAL_IDS_PER_WORKER: LazyLock<BuiltinLog> =
1873    LazyLock::new(|| BuiltinLog {
1874        name: "mz_compute_dataflow_global_ids_per_worker",
1875        schema: MZ_INTROSPECTION_SCHEMA,
1876        oid: oid::LOG_MZ_COMPUTE_DATAFLOW_GLOBAL_IDS_PER_WORKER_OID,
1877        variant: LogVariant::Compute(ComputeLog::DataflowGlobal),
1878        access: vec![PUBLIC_SELECT],
1879    });
1880
1881pub static MZ_COMPUTE_FRONTIERS_PER_WORKER: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1882    name: "mz_compute_frontiers_per_worker",
1883    schema: MZ_INTROSPECTION_SCHEMA,
1884    oid: oid::LOG_MZ_COMPUTE_FRONTIERS_PER_WORKER_OID,
1885    variant: LogVariant::Compute(ComputeLog::FrontierCurrent),
1886    access: vec![PUBLIC_SELECT],
1887});
1888
1889pub static MZ_COMPUTE_IMPORT_FRONTIERS_PER_WORKER: LazyLock<BuiltinLog> =
1890    LazyLock::new(|| BuiltinLog {
1891        name: "mz_compute_import_frontiers_per_worker",
1892        schema: MZ_INTROSPECTION_SCHEMA,
1893        oid: oid::LOG_MZ_COMPUTE_IMPORT_FRONTIERS_PER_WORKER_OID,
1894        variant: LogVariant::Compute(ComputeLog::ImportFrontierCurrent),
1895        access: vec![PUBLIC_SELECT],
1896    });
1897
1898pub static MZ_COMPUTE_ERROR_COUNTS_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1899    name: "mz_compute_error_counts_raw",
1900    schema: MZ_INTROSPECTION_SCHEMA,
1901    oid: oid::LOG_MZ_COMPUTE_ERROR_COUNTS_RAW_OID,
1902    variant: LogVariant::Compute(ComputeLog::ErrorCount),
1903    access: vec![PUBLIC_SELECT],
1904});
1905
1906pub static MZ_COMPUTE_HYDRATION_TIMES_PER_WORKER: LazyLock<BuiltinLog> =
1907    LazyLock::new(|| BuiltinLog {
1908        name: "mz_compute_hydration_times_per_worker",
1909        schema: MZ_INTROSPECTION_SCHEMA,
1910        oid: oid::LOG_MZ_COMPUTE_HYDRATION_TIMES_PER_WORKER_OID,
1911        variant: LogVariant::Compute(ComputeLog::HydrationTime),
1912        access: vec![PUBLIC_SELECT],
1913    });
1914
1915pub static MZ_COMPUTE_OPERATOR_HYDRATION_STATUSES_PER_WORKER: LazyLock<BuiltinLog> =
1916    LazyLock::new(|| BuiltinLog {
1917        name: "mz_compute_operator_hydration_statuses_per_worker",
1918        schema: MZ_INTROSPECTION_SCHEMA,
1919        oid: oid::LOG_MZ_COMPUTE_OPERATOR_HYDRATION_STATUSES_PER_WORKER_OID,
1920        variant: LogVariant::Compute(ComputeLog::OperatorHydrationStatus),
1921        access: vec![PUBLIC_SELECT],
1922    });
1923
1924pub static MZ_ACTIVE_PEEKS_PER_WORKER: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1925    name: "mz_active_peeks_per_worker",
1926    schema: MZ_INTROSPECTION_SCHEMA,
1927    oid: oid::LOG_MZ_ACTIVE_PEEKS_PER_WORKER_OID,
1928    variant: LogVariant::Compute(ComputeLog::PeekCurrent),
1929    access: vec![PUBLIC_SELECT],
1930});
1931
1932pub static MZ_COMPUTE_LIR_MAPPING_PER_WORKER: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1933    name: "mz_compute_lir_mapping_per_worker",
1934    schema: MZ_INTROSPECTION_SCHEMA,
1935    oid: oid::LOG_MZ_COMPUTE_LIR_MAPPING_PER_WORKER_OID,
1936    variant: LogVariant::Compute(ComputeLog::LirMapping),
1937    access: vec![PUBLIC_SELECT],
1938});
1939
1940pub static MZ_PEEK_DURATIONS_HISTOGRAM_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1941    name: "mz_peek_durations_histogram_raw",
1942    schema: MZ_INTROSPECTION_SCHEMA,
1943    oid: oid::LOG_MZ_PEEK_DURATIONS_HISTOGRAM_RAW_OID,
1944    variant: LogVariant::Compute(ComputeLog::PeekDuration),
1945    access: vec![PUBLIC_SELECT],
1946});
1947
1948pub static MZ_DATAFLOW_SHUTDOWN_DURATIONS_HISTOGRAM_RAW: LazyLock<BuiltinLog> =
1949    LazyLock::new(|| BuiltinLog {
1950        name: "mz_dataflow_shutdown_durations_histogram_raw",
1951        schema: MZ_INTROSPECTION_SCHEMA,
1952        oid: oid::LOG_MZ_DATAFLOW_SHUTDOWN_DURATIONS_HISTOGRAM_RAW_OID,
1953        variant: LogVariant::Compute(ComputeLog::ShutdownDuration),
1954        access: vec![PUBLIC_SELECT],
1955    });
1956
1957pub static MZ_ARRANGEMENT_HEAP_SIZE_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1958    name: "mz_arrangement_heap_size_raw",
1959    schema: MZ_INTROSPECTION_SCHEMA,
1960    oid: oid::LOG_MZ_ARRANGEMENT_HEAP_SIZE_RAW_OID,
1961    variant: LogVariant::Compute(ComputeLog::ArrangementHeapSize),
1962    access: vec![PUBLIC_SELECT],
1963});
1964
1965pub static MZ_ARRANGEMENT_HEAP_CAPACITY_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1966    name: "mz_arrangement_heap_capacity_raw",
1967    schema: MZ_INTROSPECTION_SCHEMA,
1968    oid: oid::LOG_MZ_ARRANGEMENT_HEAP_CAPACITY_RAW_OID,
1969    variant: LogVariant::Compute(ComputeLog::ArrangementHeapCapacity),
1970    access: vec![PUBLIC_SELECT],
1971});
1972
1973pub static MZ_ARRANGEMENT_HEAP_ALLOCATIONS_RAW: LazyLock<BuiltinLog> =
1974    LazyLock::new(|| BuiltinLog {
1975        name: "mz_arrangement_heap_allocations_raw",
1976        schema: MZ_INTROSPECTION_SCHEMA,
1977        oid: oid::LOG_MZ_ARRANGEMENT_HEAP_ALLOCATIONS_RAW_OID,
1978        variant: LogVariant::Compute(ComputeLog::ArrangementHeapAllocations),
1979        access: vec![PUBLIC_SELECT],
1980    });
1981
1982pub static MZ_MESSAGE_BATCH_COUNTS_RECEIVED_RAW: LazyLock<BuiltinLog> =
1983    LazyLock::new(|| BuiltinLog {
1984        name: "mz_message_batch_counts_received_raw",
1985        schema: MZ_INTROSPECTION_SCHEMA,
1986        oid: oid::LOG_MZ_MESSAGE_BATCH_COUNTS_RECEIVED_RAW_OID,
1987        variant: LogVariant::Timely(TimelyLog::BatchesReceived),
1988        access: vec![PUBLIC_SELECT],
1989    });
1990
1991pub static MZ_MESSAGE_BATCH_COUNTS_SENT_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
1992    name: "mz_message_batch_counts_sent_raw",
1993    schema: MZ_INTROSPECTION_SCHEMA,
1994    oid: oid::LOG_MZ_MESSAGE_BATCH_COUNTS_SENT_RAW_OID,
1995    variant: LogVariant::Timely(TimelyLog::BatchesSent),
1996    access: vec![PUBLIC_SELECT],
1997});
1998
1999pub static MZ_MESSAGE_COUNTS_RECEIVED_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
2000    name: "mz_message_counts_received_raw",
2001    schema: MZ_INTROSPECTION_SCHEMA,
2002    oid: oid::LOG_MZ_MESSAGE_COUNTS_RECEIVED_RAW_OID,
2003    variant: LogVariant::Timely(TimelyLog::MessagesReceived),
2004    access: vec![PUBLIC_SELECT],
2005});
2006
2007pub static MZ_MESSAGE_COUNTS_SENT_RAW: LazyLock<BuiltinLog> = LazyLock::new(|| BuiltinLog {
2008    name: "mz_message_counts_sent_raw",
2009    schema: MZ_INTROSPECTION_SCHEMA,
2010    oid: oid::LOG_MZ_MESSAGE_COUNTS_SENT_RAW_OID,
2011    variant: LogVariant::Timely(TimelyLog::MessagesSent),
2012    access: vec![PUBLIC_SELECT],
2013});
2014
2015pub static MZ_DATAFLOW_OPERATOR_REACHABILITY_RAW: LazyLock<BuiltinLog> =
2016    LazyLock::new(|| BuiltinLog {
2017        name: "mz_dataflow_operator_reachability_raw",
2018        schema: MZ_INTROSPECTION_SCHEMA,
2019        oid: oid::LOG_MZ_DATAFLOW_OPERATOR_REACHABILITY_RAW_OID,
2020        variant: LogVariant::Timely(TimelyLog::Reachability),
2021        access: vec![PUBLIC_SELECT],
2022    });
2023
2024pub static MZ_ICEBERG_SINKS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2025    name: "mz_iceberg_sinks",
2026    schema: MZ_CATALOG_SCHEMA,
2027    oid: oid::TABLE_MZ_ICEBERG_SINKS_OID,
2028    desc: RelationDesc::builder()
2029        .with_column("id", SqlScalarType::String.nullable(false))
2030        .with_column("namespace", SqlScalarType::String.nullable(false))
2031        .with_column("table", SqlScalarType::String.nullable(false))
2032        .finish(),
2033    column_comments: BTreeMap::from_iter([
2034        ("id", "The ID of the sink."),
2035        ("namespace", "The namespace of the sink."),
2036        ("table", "The table the sink is writing to."),
2037    ]),
2038    is_retained_metrics_object: false,
2039    access: vec![PUBLIC_SELECT],
2040});
2041
2042pub static MZ_KAFKA_SINKS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2043    name: "mz_kafka_sinks",
2044    schema: MZ_CATALOG_SCHEMA,
2045    oid: oid::TABLE_MZ_KAFKA_SINKS_OID,
2046    desc: RelationDesc::builder()
2047        .with_column("id", SqlScalarType::String.nullable(false))
2048        .with_column("topic", SqlScalarType::String.nullable(false))
2049        .with_key(vec![0])
2050        .finish(),
2051    column_comments: BTreeMap::from_iter([
2052        ("id", "The ID of the sink."),
2053        (
2054            "topic",
2055            "The name of the Kafka topic into which the sink is writing.",
2056        ),
2057    ]),
2058    is_retained_metrics_object: false,
2059    access: vec![PUBLIC_SELECT],
2060});
2061pub static MZ_KAFKA_CONNECTIONS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2062    name: "mz_kafka_connections",
2063    schema: MZ_CATALOG_SCHEMA,
2064    oid: oid::TABLE_MZ_KAFKA_CONNECTIONS_OID,
2065    desc: RelationDesc::builder()
2066        .with_column("id", SqlScalarType::String.nullable(false))
2067        .with_column(
2068            "brokers",
2069            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(false),
2070        )
2071        .with_column("sink_progress_topic", SqlScalarType::String.nullable(false))
2072        .finish(),
2073    column_comments: BTreeMap::from_iter([
2074        ("id", "The ID of the connection."),
2075        (
2076            "brokers",
2077            "The addresses of the Kafka brokers to connect to.",
2078        ),
2079        (
2080            "sink_progress_topic",
2081            "The name of the Kafka topic where any sinks associated with this connection will track their progress information and other metadata. The contents of this topic are unspecified.",
2082        ),
2083    ]),
2084    is_retained_metrics_object: false,
2085    access: vec![PUBLIC_SELECT],
2086});
2087pub static MZ_KAFKA_SOURCES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2088    name: "mz_kafka_sources",
2089    schema: MZ_CATALOG_SCHEMA,
2090    oid: oid::TABLE_MZ_KAFKA_SOURCES_OID,
2091    desc: RelationDesc::builder()
2092        .with_column("id", SqlScalarType::String.nullable(false))
2093        .with_column("group_id_prefix", SqlScalarType::String.nullable(false))
2094        .with_column("topic", SqlScalarType::String.nullable(false))
2095        .finish(),
2096    column_comments: BTreeMap::from_iter([
2097        (
2098            "id",
2099            "The ID of the Kafka source. Corresponds to `mz_catalog.mz_sources.id`.",
2100        ),
2101        (
2102            "group_id_prefix",
2103            "The value of the `GROUP ID PREFIX` connection option.",
2104        ),
2105        (
2106            "topic",
2107            "The name of the Kafka topic the source is reading from.",
2108        ),
2109    ]),
2110    is_retained_metrics_object: false,
2111    access: vec![PUBLIC_SELECT],
2112});
2113pub static MZ_POSTGRES_SOURCES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2114    name: "mz_postgres_sources",
2115    schema: MZ_INTERNAL_SCHEMA,
2116    oid: oid::TABLE_MZ_POSTGRES_SOURCES_OID,
2117    desc: RelationDesc::builder()
2118        .with_column("id", SqlScalarType::String.nullable(false))
2119        .with_column("replication_slot", SqlScalarType::String.nullable(false))
2120        .with_column("timeline_id", SqlScalarType::UInt64.nullable(true))
2121        .finish(),
2122    column_comments: BTreeMap::from_iter([
2123        (
2124            "id",
2125            "The ID of the source. Corresponds to `mz_catalog.mz_sources.id`.",
2126        ),
2127        (
2128            "replication_slot",
2129            "The name of the replication slot in the PostgreSQL database that Materialize will create and stream data from.",
2130        ),
2131        (
2132            "timeline_id",
2133            "The PostgreSQL timeline ID determined on source creation.",
2134        ),
2135    ]),
2136    is_retained_metrics_object: false,
2137    access: vec![PUBLIC_SELECT],
2138});
2139pub static MZ_POSTGRES_SOURCE_TABLES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2140    name: "mz_postgres_source_tables",
2141    schema: MZ_INTERNAL_SCHEMA,
2142    oid: oid::TABLE_MZ_POSTGRES_SOURCE_TABLES_OID,
2143    desc: RelationDesc::builder()
2144        .with_column("id", SqlScalarType::String.nullable(false))
2145        .with_column("schema_name", SqlScalarType::String.nullable(false))
2146        .with_column("table_name", SqlScalarType::String.nullable(false))
2147        .finish(),
2148    column_comments: BTreeMap::from_iter([
2149        (
2150            "id",
2151            "The ID of the subsource or table. Corresponds to `mz_catalog.mz_sources.id` or `mz_catalog.mz_tables.id`.",
2152        ),
2153        (
2154            "schema_name",
2155            "The schema of the upstream table being ingested.",
2156        ),
2157        (
2158            "table_name",
2159            "The name of the upstream table being ingested.",
2160        ),
2161    ]),
2162    is_retained_metrics_object: true,
2163    access: vec![PUBLIC_SELECT],
2164});
2165pub static MZ_MYSQL_SOURCE_TABLES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2166    name: "mz_mysql_source_tables",
2167    schema: MZ_INTERNAL_SCHEMA,
2168    oid: oid::TABLE_MZ_MYSQL_SOURCE_TABLES_OID,
2169    desc: RelationDesc::builder()
2170        .with_column("id", SqlScalarType::String.nullable(false))
2171        .with_column("schema_name", SqlScalarType::String.nullable(false))
2172        .with_column("table_name", SqlScalarType::String.nullable(false))
2173        .finish(),
2174    column_comments: BTreeMap::from_iter([
2175        (
2176            "id",
2177            "The ID of the subsource or table. Corresponds to `mz_catalog.mz_sources.id` or `mz_catalog.mz_tables.id`.",
2178        ),
2179        (
2180            "schema_name",
2181            "The schema (or, database) of the upstream table being ingested.",
2182        ),
2183        (
2184            "table_name",
2185            "The name of the upstream table being ingested.",
2186        ),
2187    ]),
2188    is_retained_metrics_object: true,
2189    access: vec![PUBLIC_SELECT],
2190});
2191pub static MZ_SQL_SERVER_SOURCE_TABLES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2192    name: "mz_sql_server_source_tables",
2193    schema: MZ_INTERNAL_SCHEMA,
2194    oid: oid::TABLE_MZ_SQL_SERVER_SOURCE_TABLES_OID,
2195    desc: RelationDesc::builder()
2196        .with_column("id", SqlScalarType::String.nullable(false))
2197        .with_column("schema_name", SqlScalarType::String.nullable(false))
2198        .with_column("table_name", SqlScalarType::String.nullable(false))
2199        .finish(),
2200    column_comments: BTreeMap::from_iter([
2201        (
2202            "id",
2203            "The ID of the subsource or table. Corresponds to `mz_catalog.mz_sources.id` or `mz_catalog.mz_tables.id`.",
2204        ),
2205        (
2206            "schema_name",
2207            "The schema (or, database) of the upstream table being ingested.",
2208        ),
2209        (
2210            "table_name",
2211            "The name of the upstream table being ingested.",
2212        ),
2213    ]),
2214    is_retained_metrics_object: true,
2215    access: vec![PUBLIC_SELECT],
2216});
2217pub static MZ_KAFKA_SOURCE_TABLES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2218    name: "mz_kafka_source_tables",
2219    schema: MZ_INTERNAL_SCHEMA,
2220    oid: oid::TABLE_MZ_KAFKA_SOURCE_TABLES_OID,
2221    desc: RelationDesc::builder()
2222        .with_column("id", SqlScalarType::String.nullable(false))
2223        .with_column("topic", SqlScalarType::String.nullable(false))
2224        .with_column("envelope_type", SqlScalarType::String.nullable(true))
2225        .with_column("key_format", SqlScalarType::String.nullable(true))
2226        .with_column("value_format", SqlScalarType::String.nullable(true))
2227        .finish(),
2228    column_comments: BTreeMap::from_iter([
2229        (
2230            "id",
2231            "The ID of the table. Corresponds to `mz_catalog.mz_tables.id`.",
2232        ),
2233        ("topic", "The topic being ingested."),
2234        (
2235            "envelope_type",
2236            "The envelope type: `none`, `upsert`, or `debezium`. `NULL` for other source types.",
2237        ),
2238        (
2239            "key_format",
2240            "The format of the Kafka message key: `avro`, `protobuf`, `csv`, `regex`, `bytes`, `json`, `text`, or `NULL`.",
2241        ),
2242        (
2243            "value_format",
2244            "The format of the Kafka message value: `avro`, `protobuf`, `csv`, `regex`, `bytes`, `json`, `text`. `NULL` for other source types.",
2245        ),
2246    ]),
2247    is_retained_metrics_object: true,
2248    access: vec![PUBLIC_SELECT],
2249});
2250pub static MZ_OBJECT_DEPENDENCIES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2251    name: "mz_object_dependencies",
2252    schema: MZ_INTERNAL_SCHEMA,
2253    oid: oid::TABLE_MZ_OBJECT_DEPENDENCIES_OID,
2254    desc: RelationDesc::builder()
2255        .with_column("object_id", SqlScalarType::String.nullable(false))
2256        .with_column(
2257            "referenced_object_id",
2258            SqlScalarType::String.nullable(false),
2259        )
2260        .finish(),
2261    column_comments: BTreeMap::from_iter([
2262        (
2263            "object_id",
2264            "The ID of the dependent object. Corresponds to `mz_objects.id`.",
2265        ),
2266        (
2267            "referenced_object_id",
2268            "The ID of the referenced object. Corresponds to `mz_objects.id`.",
2269        ),
2270    ]),
2271    is_retained_metrics_object: true,
2272    access: vec![PUBLIC_SELECT],
2273});
2274pub static MZ_COMPUTE_DEPENDENCIES: LazyLock<BuiltinSource> = LazyLock::new(|| BuiltinSource {
2275    name: "mz_compute_dependencies",
2276    schema: MZ_INTERNAL_SCHEMA,
2277    oid: oid::SOURCE_MZ_COMPUTE_DEPENDENCIES_OID,
2278    data_source: IntrospectionType::ComputeDependencies,
2279    desc: RelationDesc::builder()
2280        .with_column("object_id", SqlScalarType::String.nullable(false))
2281        .with_column("dependency_id", SqlScalarType::String.nullable(false))
2282        .finish(),
2283    column_comments: BTreeMap::from_iter([
2284        (
2285            "object_id",
2286            "The ID of a compute object. Corresponds to `mz_catalog.mz_indexes.id`, `mz_catalog.mz_materialized_views.id`, or `mz_internal.mz_subscriptions`.",
2287        ),
2288        (
2289            "dependency_id",
2290            "The ID of a compute dependency. Corresponds to `mz_catalog.mz_indexes.id`, `mz_catalog.mz_materialized_views.id`, `mz_catalog.mz_sources.id`, or `mz_catalog.mz_tables.id`.",
2291        ),
2292    ]),
2293    is_retained_metrics_object: false,
2294    access: vec![PUBLIC_SELECT],
2295});
2296
2297pub static MZ_DATABASES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2298    name: "mz_databases",
2299    schema: MZ_CATALOG_SCHEMA,
2300    oid: oid::TABLE_MZ_DATABASES_OID,
2301    desc: RelationDesc::builder()
2302        .with_column("id", SqlScalarType::String.nullable(false))
2303        .with_column("oid", SqlScalarType::Oid.nullable(false))
2304        .with_column("name", SqlScalarType::String.nullable(false))
2305        .with_column("owner_id", SqlScalarType::String.nullable(false))
2306        .with_column(
2307            "privileges",
2308            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
2309        )
2310        .with_key(vec![0])
2311        .with_key(vec![1])
2312        .finish(),
2313    column_comments: BTreeMap::from_iter([
2314        ("id", "Materialize's unique ID for the database."),
2315        (
2316            "oid",
2317            "A [PostgreSQL-compatible OID][`oid`] for the database.",
2318        ),
2319        ("name", "The name of the database."),
2320        (
2321            "owner_id",
2322            "The role ID of the owner of the database. Corresponds to `mz_roles.id`.",
2323        ),
2324        ("privileges", "The privileges belonging to the database."),
2325    ]),
2326    is_retained_metrics_object: false,
2327    access: vec![PUBLIC_SELECT],
2328});
2329pub static MZ_SCHEMAS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2330    name: "mz_schemas",
2331    schema: MZ_CATALOG_SCHEMA,
2332    oid: oid::TABLE_MZ_SCHEMAS_OID,
2333    desc: RelationDesc::builder()
2334        .with_column("id", SqlScalarType::String.nullable(false))
2335        .with_column("oid", SqlScalarType::Oid.nullable(false))
2336        .with_column("database_id", SqlScalarType::String.nullable(true))
2337        .with_column("name", SqlScalarType::String.nullable(false))
2338        .with_column("owner_id", SqlScalarType::String.nullable(false))
2339        .with_column(
2340            "privileges",
2341            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
2342        )
2343        .with_key(vec![0])
2344        .with_key(vec![1])
2345        .finish(),
2346    column_comments: BTreeMap::from_iter([
2347        ("id", "Materialize's unique ID for the schema."),
2348        (
2349            "oid",
2350            "A [PostgreSQL-compatible oid][`oid`] for the schema.",
2351        ),
2352        (
2353            "database_id",
2354            "The ID of the database containing the schema. Corresponds to `mz_databases.id`.",
2355        ),
2356        ("name", "The name of the schema."),
2357        (
2358            "owner_id",
2359            "The role ID of the owner of the schema. Corresponds to `mz_roles.id`.",
2360        ),
2361        ("privileges", "The privileges belonging to the schema."),
2362    ]),
2363    is_retained_metrics_object: false,
2364    access: vec![PUBLIC_SELECT],
2365});
2366pub static MZ_COLUMNS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2367    name: "mz_columns",
2368    schema: MZ_CATALOG_SCHEMA,
2369    oid: oid::TABLE_MZ_COLUMNS_OID,
2370    desc: RelationDesc::builder()
2371        .with_column("id", SqlScalarType::String.nullable(false)) // not a key
2372        .with_column("name", SqlScalarType::String.nullable(false))
2373        .with_column("position", SqlScalarType::UInt64.nullable(false))
2374        .with_column("nullable", SqlScalarType::Bool.nullable(false))
2375        .with_column("type", SqlScalarType::String.nullable(false))
2376        .with_column("default", SqlScalarType::String.nullable(true))
2377        .with_column("type_oid", SqlScalarType::Oid.nullable(false))
2378        .with_column("type_mod", SqlScalarType::Int32.nullable(false))
2379        .finish(),
2380    column_comments: BTreeMap::from_iter([
2381        (
2382            "id",
2383            "The unique ID of the table, source, or view containing the column.",
2384        ),
2385        ("name", "The name of the column."),
2386        (
2387            "position",
2388            "The 1-indexed position of the column in its containing table, source, or view.",
2389        ),
2390        ("nullable", "Can the column contain a `NULL` value?"),
2391        ("type", "The data type of the column."),
2392        ("default", "The default expression of the column."),
2393        (
2394            "type_oid",
2395            "The OID of the type of the column (references `mz_types`).",
2396        ),
2397        ("type_mod", "The packed type identifier of the column."),
2398    ]),
2399    is_retained_metrics_object: false,
2400    access: vec![PUBLIC_SELECT],
2401});
2402pub static MZ_INDEXES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2403    name: "mz_indexes",
2404    schema: MZ_CATALOG_SCHEMA,
2405    oid: oid::TABLE_MZ_INDEXES_OID,
2406    desc: RelationDesc::builder()
2407        .with_column("id", SqlScalarType::String.nullable(false))
2408        .with_column("oid", SqlScalarType::Oid.nullable(false))
2409        .with_column("name", SqlScalarType::String.nullable(false))
2410        .with_column("on_id", SqlScalarType::String.nullable(false))
2411        .with_column("cluster_id", SqlScalarType::String.nullable(false))
2412        .with_column("owner_id", SqlScalarType::String.nullable(false))
2413        .with_column("create_sql", SqlScalarType::String.nullable(false))
2414        .with_column("redacted_create_sql", SqlScalarType::String.nullable(false))
2415        .with_key(vec![0])
2416        .with_key(vec![1])
2417        .finish(),
2418    column_comments: BTreeMap::from_iter([
2419        ("id", "Materialize's unique ID for the index."),
2420        ("oid", "A [PostgreSQL-compatible OID][`oid`] for the index."),
2421        ("name", "The name of the index."),
2422        (
2423            "on_id",
2424            "The ID of the relation on which the index is built.",
2425        ),
2426        (
2427            "cluster_id",
2428            "The ID of the cluster in which the index is built.",
2429        ),
2430        (
2431            "owner_id",
2432            "The role ID of the owner of the index. Corresponds to `mz_roles.id`.",
2433        ),
2434        ("create_sql", "The `CREATE` SQL statement for the index."),
2435        (
2436            "redacted_create_sql",
2437            "The redacted `CREATE` SQL statement for the index.",
2438        ),
2439    ]),
2440    is_retained_metrics_object: false,
2441    access: vec![PUBLIC_SELECT],
2442});
2443pub static MZ_INDEX_COLUMNS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2444    name: "mz_index_columns",
2445    schema: MZ_CATALOG_SCHEMA,
2446    oid: oid::TABLE_MZ_INDEX_COLUMNS_OID,
2447    desc: RelationDesc::builder()
2448        .with_column("index_id", SqlScalarType::String.nullable(false))
2449        .with_column("index_position", SqlScalarType::UInt64.nullable(false))
2450        .with_column("on_position", SqlScalarType::UInt64.nullable(true))
2451        .with_column("on_expression", SqlScalarType::String.nullable(true))
2452        .with_column("nullable", SqlScalarType::Bool.nullable(false))
2453        .finish(),
2454    column_comments: BTreeMap::from_iter([
2455        (
2456            "index_id",
2457            "The ID of the index which contains this column. Corresponds to `mz_indexes.id`.",
2458        ),
2459        (
2460            "index_position",
2461            "The 1-indexed position of this column within the index. (The order of columns in an index does not necessarily match the order of columns in the relation on which the index is built.)",
2462        ),
2463        (
2464            "on_position",
2465            "If not `NULL`, specifies the 1-indexed position of a column in the relation on which this index is built that determines the value of this index column.",
2466        ),
2467        (
2468            "on_expression",
2469            "If not `NULL`, specifies a SQL expression that is evaluated to compute the value of this index column. The expression may contain references to any of the columns of the relation.",
2470        ),
2471        (
2472            "nullable",
2473            "Can this column of the index evaluate to `NULL`?",
2474        ),
2475    ]),
2476    is_retained_metrics_object: false,
2477    access: vec![PUBLIC_SELECT],
2478});
2479pub static MZ_TABLES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2480    name: "mz_tables",
2481    schema: MZ_CATALOG_SCHEMA,
2482    oid: oid::TABLE_MZ_TABLES_OID,
2483    desc: RelationDesc::builder()
2484        .with_column("id", SqlScalarType::String.nullable(false))
2485        .with_column("oid", SqlScalarType::Oid.nullable(false))
2486        .with_column("schema_id", SqlScalarType::String.nullable(false))
2487        .with_column("name", SqlScalarType::String.nullable(false))
2488        .with_column("owner_id", SqlScalarType::String.nullable(false))
2489        .with_column(
2490            "privileges",
2491            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
2492        )
2493        .with_column("create_sql", SqlScalarType::String.nullable(true))
2494        .with_column("redacted_create_sql", SqlScalarType::String.nullable(true))
2495        .with_column("source_id", SqlScalarType::String.nullable(true))
2496        .with_key(vec![0])
2497        .with_key(vec![1])
2498        .finish(),
2499    column_comments: BTreeMap::from_iter([
2500        ("id", "Materialize's unique ID for the table."),
2501        ("oid", "A [PostgreSQL-compatible OID][`oid`] for the table."),
2502        (
2503            "schema_id",
2504            "The ID of the schema to which the table belongs. Corresponds to `mz_schemas.id`.",
2505        ),
2506        ("name", "The name of the table."),
2507        (
2508            "owner_id",
2509            "The role ID of the owner of the table. Corresponds to `mz_roles.id`.",
2510        ),
2511        ("privileges", "The privileges belonging to the table."),
2512        ("create_sql", "The `CREATE` SQL statement for the table."),
2513        (
2514            "redacted_create_sql",
2515            "The redacted `CREATE` SQL statement for the table.",
2516        ),
2517        (
2518            "source_id",
2519            "The ID of the source associated with the table, if any. Corresponds to `mz_sources.id`.",
2520        ),
2521    ]),
2522    is_retained_metrics_object: true,
2523    access: vec![PUBLIC_SELECT],
2524});
2525pub static MZ_CONNECTIONS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2526    name: "mz_connections",
2527    schema: MZ_CATALOG_SCHEMA,
2528    oid: oid::TABLE_MZ_CONNECTIONS_OID,
2529    desc: RelationDesc::builder()
2530        .with_column("id", SqlScalarType::String.nullable(false))
2531        .with_column("oid", SqlScalarType::Oid.nullable(false))
2532        .with_column("schema_id", SqlScalarType::String.nullable(false))
2533        .with_column("name", SqlScalarType::String.nullable(false))
2534        .with_column("type", SqlScalarType::String.nullable(false))
2535        .with_column("owner_id", SqlScalarType::String.nullable(false))
2536        .with_column(
2537            "privileges",
2538            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
2539        )
2540        .with_column("create_sql", SqlScalarType::String.nullable(false))
2541        .with_column("redacted_create_sql", SqlScalarType::String.nullable(false))
2542        .with_key(vec![0])
2543        .with_key(vec![1])
2544        .finish(),
2545    column_comments: BTreeMap::from_iter([
2546        ("id", "The unique ID of the connection."),
2547        (
2548            "oid",
2549            "A [PostgreSQL-compatible OID][`oid`] for the connection.",
2550        ),
2551        (
2552            "schema_id",
2553            "The ID of the schema to which the connection belongs. Corresponds to `mz_schemas.id`.",
2554        ),
2555        ("name", "The name of the connection."),
2556        (
2557            "type",
2558            "The type of the connection: `confluent-schema-registry`, `kafka`, `postgres`, or `ssh-tunnel`.",
2559        ),
2560        (
2561            "owner_id",
2562            "The role ID of the owner of the connection. Corresponds to `mz_roles.id`.",
2563        ),
2564        ("privileges", "The privileges belonging to the connection."),
2565        (
2566            "create_sql",
2567            "The `CREATE` SQL statement for the connection.",
2568        ),
2569        (
2570            "redacted_create_sql",
2571            "The redacted `CREATE` SQL statement for the connection.",
2572        ),
2573    ]),
2574    is_retained_metrics_object: false,
2575    access: vec![PUBLIC_SELECT],
2576});
2577pub static MZ_SSH_TUNNEL_CONNECTIONS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2578    name: "mz_ssh_tunnel_connections",
2579    schema: MZ_CATALOG_SCHEMA,
2580    oid: oid::TABLE_MZ_SSH_TUNNEL_CONNECTIONS_OID,
2581    desc: RelationDesc::builder()
2582        .with_column("id", SqlScalarType::String.nullable(false))
2583        .with_column("public_key_1", SqlScalarType::String.nullable(false))
2584        .with_column("public_key_2", SqlScalarType::String.nullable(false))
2585        .finish(),
2586    column_comments: BTreeMap::from_iter([
2587        ("id", "The ID of the connection."),
2588        (
2589            "public_key_1",
2590            "The first public key associated with the SSH tunnel.",
2591        ),
2592        (
2593            "public_key_2",
2594            "The second public key associated with the SSH tunnel.",
2595        ),
2596    ]),
2597    is_retained_metrics_object: false,
2598    access: vec![PUBLIC_SELECT],
2599});
2600pub static MZ_SOURCES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2601    name: "mz_sources",
2602    schema: MZ_CATALOG_SCHEMA,
2603    oid: oid::TABLE_MZ_SOURCES_OID,
2604    desc: RelationDesc::builder()
2605        .with_column("id", SqlScalarType::String.nullable(false))
2606        .with_column("oid", SqlScalarType::Oid.nullable(false))
2607        .with_column("schema_id", SqlScalarType::String.nullable(false))
2608        .with_column("name", SqlScalarType::String.nullable(false))
2609        .with_column("type", SqlScalarType::String.nullable(false))
2610        .with_column("connection_id", SqlScalarType::String.nullable(true))
2611        .with_column("size", SqlScalarType::String.nullable(true))
2612        .with_column("envelope_type", SqlScalarType::String.nullable(true))
2613        .with_column("key_format", SqlScalarType::String.nullable(true))
2614        .with_column("value_format", SqlScalarType::String.nullable(true))
2615        .with_column("cluster_id", SqlScalarType::String.nullable(true))
2616        .with_column("owner_id", SqlScalarType::String.nullable(false))
2617        .with_column(
2618            "privileges",
2619            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
2620        )
2621        .with_column("create_sql", SqlScalarType::String.nullable(true))
2622        .with_column("redacted_create_sql", SqlScalarType::String.nullable(true))
2623        .with_key(vec![0])
2624        .with_key(vec![1])
2625        .finish(),
2626    column_comments: BTreeMap::from_iter([
2627        ("id", "Materialize's unique ID for the source."),
2628        (
2629            "oid",
2630            "A [PostgreSQL-compatible OID][`oid`] for the source.",
2631        ),
2632        (
2633            "schema_id",
2634            "The ID of the schema to which the source belongs. Corresponds to `mz_schemas.id`.",
2635        ),
2636        ("name", "The name of the source."),
2637        (
2638            "type",
2639            "The type of the source: `kafka`, `mysql`, `postgres`, `load-generator`, `progress`, or `subsource`.",
2640        ),
2641        (
2642            "connection_id",
2643            "The ID of the connection associated with the source, if any. Corresponds to `mz_connections.id`.",
2644        ),
2645        ("size", "Deprecated The size of the source."),
2646        (
2647            "envelope_type",
2648            "For Kafka sources, the envelope type: `none`, `upsert`, or `debezium`. `NULL` for other source types.",
2649        ),
2650        (
2651            "key_format",
2652            "For Kafka sources, the format of the Kafka message key: `avro`, `protobuf`, `csv`, `regex`, `bytes`, `json`, `text`, or `NULL`.",
2653        ),
2654        (
2655            "value_format",
2656            "For Kafka sources, the format of the Kafka message value: `avro`, `protobuf`, `csv`, `regex`, `bytes`, `json`, `text`. `NULL` for other source types.",
2657        ),
2658        (
2659            "cluster_id",
2660            "The ID of the cluster maintaining the source. Corresponds to `mz_clusters.id`.",
2661        ),
2662        (
2663            "owner_id",
2664            "The role ID of the owner of the source. Corresponds to `mz_roles.id`.",
2665        ),
2666        ("privileges", "The privileges granted on the source."),
2667        ("create_sql", "The `CREATE` SQL statement for the source."),
2668        (
2669            "redacted_create_sql",
2670            "The redacted `CREATE` SQL statement for the source.",
2671        ),
2672    ]),
2673    is_retained_metrics_object: true,
2674    access: vec![PUBLIC_SELECT],
2675});
2676pub static MZ_SINKS: LazyLock<BuiltinTable> = LazyLock::new(|| {
2677    BuiltinTable {
2678        name: "mz_sinks",
2679        schema: MZ_CATALOG_SCHEMA,
2680        oid: oid::TABLE_MZ_SINKS_OID,
2681        desc: RelationDesc::builder()
2682            .with_column("id", SqlScalarType::String.nullable(false))
2683            .with_column("oid", SqlScalarType::Oid.nullable(false))
2684            .with_column("schema_id", SqlScalarType::String.nullable(false))
2685            .with_column("name", SqlScalarType::String.nullable(false))
2686            .with_column("type", SqlScalarType::String.nullable(false))
2687            .with_column("connection_id", SqlScalarType::String.nullable(true))
2688            .with_column("size", SqlScalarType::String.nullable(true))
2689            .with_column("envelope_type", SqlScalarType::String.nullable(true))
2690            // This `format` column is deprecated and replaced by the `key_format` and `value_format` columns
2691            // below. This should be removed in the future.
2692            .with_column("format", SqlScalarType::String.nullable(true))
2693            .with_column("key_format", SqlScalarType::String.nullable(true))
2694            .with_column("value_format", SqlScalarType::String.nullable(true))
2695            .with_column("cluster_id", SqlScalarType::String.nullable(false))
2696            .with_column("owner_id", SqlScalarType::String.nullable(false))
2697            .with_column("create_sql", SqlScalarType::String.nullable(false))
2698            .with_column("redacted_create_sql", SqlScalarType::String.nullable(false))
2699            .with_key(vec![0])
2700            .with_key(vec![1])
2701            .finish(),
2702        column_comments: BTreeMap::from_iter([
2703            ("id", "Materialize's unique ID for the sink."),
2704            ("oid", "A [PostgreSQL-compatible OID][`oid`] for the sink."),
2705            (
2706                "schema_id",
2707                "The ID of the schema to which the sink belongs. Corresponds to `mz_schemas.id`.",
2708            ),
2709            ("name", "The name of the sink."),
2710            ("type", "The type of the sink: `kafka`."),
2711            (
2712                "connection_id",
2713                "The ID of the connection associated with the sink, if any. Corresponds to `mz_connections.id`.",
2714            ),
2715            ("size", "The size of the sink."),
2716            (
2717                "envelope_type",
2718                "The envelope of the sink: `upsert`, or `debezium`.",
2719            ),
2720            (
2721                "format",
2722                "Deprecated The format of the Kafka messages produced by the sink: `avro`, `json`, `text`, or `bytes`.",
2723            ),
2724            (
2725                "key_format",
2726                "The format of the Kafka message key for messages produced by the sink: `avro`, `json`, `bytes`, `text`, or `NULL`.",
2727            ),
2728            (
2729                "value_format",
2730                "The format of the Kafka message value for messages produced by the sink: `avro`, `json`, `text`, or `bytes`.",
2731            ),
2732            (
2733                "cluster_id",
2734                "The ID of the cluster maintaining the sink. Corresponds to `mz_clusters.id`.",
2735            ),
2736            (
2737                "owner_id",
2738                "The role ID of the owner of the sink. Corresponds to `mz_roles.id`.",
2739            ),
2740            ("create_sql", "The `CREATE` SQL statement for the sink."),
2741            (
2742                "redacted_create_sql",
2743                "The redacted `CREATE` SQL statement for the sink.",
2744            ),
2745        ]),
2746        is_retained_metrics_object: true,
2747        access: vec![PUBLIC_SELECT],
2748    }
2749});
2750pub static MZ_VIEWS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2751    name: "mz_views",
2752    schema: MZ_CATALOG_SCHEMA,
2753    oid: oid::TABLE_MZ_VIEWS_OID,
2754    desc: RelationDesc::builder()
2755        .with_column("id", SqlScalarType::String.nullable(false))
2756        .with_column("oid", SqlScalarType::Oid.nullable(false))
2757        .with_column("schema_id", SqlScalarType::String.nullable(false))
2758        .with_column("name", SqlScalarType::String.nullable(false))
2759        .with_column("definition", SqlScalarType::String.nullable(false))
2760        .with_column("owner_id", SqlScalarType::String.nullable(false))
2761        .with_column(
2762            "privileges",
2763            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
2764        )
2765        .with_column("create_sql", SqlScalarType::String.nullable(false))
2766        .with_column("redacted_create_sql", SqlScalarType::String.nullable(false))
2767        .with_key(vec![0])
2768        .with_key(vec![1])
2769        .finish(),
2770    column_comments: BTreeMap::from_iter([
2771        ("id", "Materialize's unique ID for the view."),
2772        ("oid", "A [PostgreSQL-compatible OID][`oid`] for the view."),
2773        (
2774            "schema_id",
2775            "The ID of the schema to which the view belongs. Corresponds to `mz_schemas.id`.",
2776        ),
2777        ("name", "The name of the view."),
2778        ("definition", "The view definition (a `SELECT` query)."),
2779        (
2780            "owner_id",
2781            "The role ID of the owner of the view. Corresponds to `mz_roles.id`.",
2782        ),
2783        ("privileges", "The privileges belonging to the view."),
2784        ("create_sql", "The `CREATE` SQL statement for the view."),
2785        (
2786            "redacted_create_sql",
2787            "The redacted `CREATE` SQL statement for the view.",
2788        ),
2789    ]),
2790    is_retained_metrics_object: false,
2791    access: vec![PUBLIC_SELECT],
2792});
2793pub static MZ_MATERIALIZED_VIEWS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2794    name: "mz_materialized_views",
2795    schema: MZ_CATALOG_SCHEMA,
2796    oid: oid::TABLE_MZ_MATERIALIZED_VIEWS_OID,
2797    desc: RelationDesc::builder()
2798        .with_column("id", SqlScalarType::String.nullable(false))
2799        .with_column("oid", SqlScalarType::Oid.nullable(false))
2800        .with_column("schema_id", SqlScalarType::String.nullable(false))
2801        .with_column("name", SqlScalarType::String.nullable(false))
2802        .with_column("cluster_id", SqlScalarType::String.nullable(false))
2803        .with_column("definition", SqlScalarType::String.nullable(false))
2804        .with_column("owner_id", SqlScalarType::String.nullable(false))
2805        .with_column(
2806            "privileges",
2807            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
2808        )
2809        .with_column("create_sql", SqlScalarType::String.nullable(false))
2810        .with_column("redacted_create_sql", SqlScalarType::String.nullable(false))
2811        .with_key(vec![0])
2812        .with_key(vec![1])
2813        .finish(),
2814    column_comments: BTreeMap::from_iter([
2815        ("id", "Materialize's unique ID for the materialized view."),
2816        (
2817            "oid",
2818            "A [PostgreSQL-compatible OID][`oid`] for the materialized view.",
2819        ),
2820        (
2821            "schema_id",
2822            "The ID of the schema to which the materialized view belongs. Corresponds to `mz_schemas.id`.",
2823        ),
2824        ("name", "The name of the materialized view."),
2825        (
2826            "cluster_id",
2827            "The ID of the cluster maintaining the materialized view. Corresponds to `mz_clusters.id`.",
2828        ),
2829        (
2830            "definition",
2831            "The materialized view definition (a `SELECT` query).",
2832        ),
2833        (
2834            "owner_id",
2835            "The role ID of the owner of the materialized view. Corresponds to `mz_roles.id`.",
2836        ),
2837        (
2838            "privileges",
2839            "The privileges belonging to the materialized view.",
2840        ),
2841        (
2842            "create_sql",
2843            "The `CREATE` SQL statement for the materialized view.",
2844        ),
2845        (
2846            "redacted_create_sql",
2847            "The redacted `CREATE` SQL statement for the materialized view.",
2848        ),
2849    ]),
2850    is_retained_metrics_object: false,
2851    access: vec![PUBLIC_SELECT],
2852});
2853pub static MZ_MATERIALIZED_VIEW_REFRESH_STRATEGIES: LazyLock<BuiltinTable> = LazyLock::new(|| {
2854    BuiltinTable {
2855        name: "mz_materialized_view_refresh_strategies",
2856        schema: MZ_INTERNAL_SCHEMA,
2857        oid: oid::TABLE_MZ_MATERIALIZED_VIEW_REFRESH_STRATEGIES_OID,
2858        desc: RelationDesc::builder()
2859            .with_column(
2860                "materialized_view_id",
2861                SqlScalarType::String.nullable(false),
2862            )
2863            .with_column("type", SqlScalarType::String.nullable(false))
2864            .with_column("interval", SqlScalarType::Interval.nullable(true))
2865            .with_column(
2866                "aligned_to",
2867                SqlScalarType::TimestampTz { precision: None }.nullable(true),
2868            )
2869            .with_column(
2870                "at",
2871                SqlScalarType::TimestampTz { precision: None }.nullable(true),
2872            )
2873            .finish(),
2874        column_comments: BTreeMap::from_iter([
2875            (
2876                "materialized_view_id",
2877                "The ID of the materialized view. Corresponds to `mz_catalog.mz_materialized_views.id`",
2878            ),
2879            (
2880                "type",
2881                "`at`, `every`, or `on-commit`. Default: `on-commit`",
2882            ),
2883            (
2884                "interval",
2885                "The refresh interval of a `REFRESH EVERY` option, or `NULL` if the `type` is not `every`.",
2886            ),
2887            (
2888                "aligned_to",
2889                "The `ALIGNED TO` option of a `REFRESH EVERY` option, or `NULL` if the `type` is not `every`.",
2890            ),
2891            (
2892                "at",
2893                "The time of a `REFRESH AT`, or `NULL` if the `type` is not `at`.",
2894            ),
2895        ]),
2896        is_retained_metrics_object: false,
2897        access: vec![PUBLIC_SELECT],
2898    }
2899});
2900pub static MZ_TYPES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2901    name: "mz_types",
2902    schema: MZ_CATALOG_SCHEMA,
2903    oid: oid::TABLE_MZ_TYPES_OID,
2904    desc: RelationDesc::builder()
2905        .with_column("id", SqlScalarType::String.nullable(false))
2906        .with_column("oid", SqlScalarType::Oid.nullable(false))
2907        .with_column("schema_id", SqlScalarType::String.nullable(false))
2908        .with_column("name", SqlScalarType::String.nullable(false))
2909        .with_column("category", SqlScalarType::String.nullable(false))
2910        .with_column("owner_id", SqlScalarType::String.nullable(false))
2911        .with_column(
2912            "privileges",
2913            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
2914        )
2915        .with_column("create_sql", SqlScalarType::String.nullable(true))
2916        .with_column("redacted_create_sql", SqlScalarType::String.nullable(true))
2917        .with_key(vec![0])
2918        .with_key(vec![1])
2919        .finish(),
2920    column_comments: BTreeMap::from_iter([
2921        ("id", "Materialize's unique ID for the type."),
2922        ("oid", "A [PostgreSQL-compatible OID][`oid`] for the type."),
2923        (
2924            "schema_id",
2925            "The ID of the schema to which the type belongs. Corresponds to `mz_schemas.id`.",
2926        ),
2927        ("name", "The name of the type."),
2928        ("category", "The category of the type."),
2929        (
2930            "owner_id",
2931            "The role ID of the owner of the type. Corresponds to `mz_roles.id`.",
2932        ),
2933        ("privileges", "The privileges belonging to the type."),
2934        ("create_sql", "The `CREATE` SQL statement for the type."),
2935        (
2936            "redacted_create_sql",
2937            "The redacted `CREATE` SQL statement for the type.",
2938        ),
2939    ]),
2940    is_retained_metrics_object: false,
2941    access: vec![PUBLIC_SELECT],
2942});
2943pub static MZ_CONTINUAL_TASKS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2944    name: "mz_continual_tasks",
2945    schema: MZ_INTERNAL_SCHEMA,
2946    oid: oid::TABLE_MZ_CONTINUAL_TASKS_OID,
2947    desc: RelationDesc::builder()
2948        .with_column("id", SqlScalarType::String.nullable(false))
2949        .with_column("oid", SqlScalarType::Oid.nullable(false))
2950        .with_column("schema_id", SqlScalarType::String.nullable(false))
2951        .with_column("name", SqlScalarType::String.nullable(false))
2952        .with_column("cluster_id", SqlScalarType::String.nullable(false))
2953        .with_column("definition", SqlScalarType::String.nullable(false))
2954        .with_column("owner_id", SqlScalarType::String.nullable(false))
2955        .with_column(
2956            "privileges",
2957            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
2958        )
2959        .with_column("create_sql", SqlScalarType::String.nullable(false))
2960        .with_column("redacted_create_sql", SqlScalarType::String.nullable(false))
2961        .with_key(vec![0])
2962        .with_key(vec![1])
2963        .finish(),
2964    column_comments: BTreeMap::new(),
2965    is_retained_metrics_object: false,
2966    access: vec![PUBLIC_SELECT],
2967});
2968pub static MZ_NETWORK_POLICIES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
2969    name: "mz_network_policies",
2970    schema: MZ_INTERNAL_SCHEMA,
2971    oid: oid::TABLE_MZ_NETWORK_POLICIES_OID,
2972    desc: RelationDesc::builder()
2973        .with_column("id", SqlScalarType::String.nullable(false))
2974        .with_column("name", SqlScalarType::String.nullable(false))
2975        .with_column("owner_id", SqlScalarType::String.nullable(false))
2976        .with_column(
2977            "privileges",
2978            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
2979        )
2980        .with_column("oid", SqlScalarType::Oid.nullable(false))
2981        .finish(),
2982    column_comments: BTreeMap::from_iter([
2983        ("id", "The ID of the network policy."),
2984        ("name", "The name of the network policy."),
2985        (
2986            "owner_id",
2987            "The role ID of the owner of the network policy. Corresponds to `mz_catalog.mz_roles.id`.",
2988        ),
2989        (
2990            "privileges",
2991            "The privileges belonging to the network policy.",
2992        ),
2993        (
2994            "oid",
2995            "A [PostgreSQL-compatible OID][`oid`] for the network policy.",
2996        ),
2997    ]),
2998    is_retained_metrics_object: false,
2999    access: vec![PUBLIC_SELECT],
3000});
3001pub static MZ_NETWORK_POLICY_RULES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3002    name: "mz_network_policy_rules",
3003    schema: MZ_INTERNAL_SCHEMA,
3004    oid: oid::TABLE_MZ_NETWORK_POLICY_RULES_OID,
3005    desc: RelationDesc::builder()
3006        .with_column("name", SqlScalarType::String.nullable(false))
3007        .with_column("policy_id", SqlScalarType::String.nullable(false))
3008        .with_column("action", SqlScalarType::String.nullable(false))
3009        .with_column("address", SqlScalarType::String.nullable(false))
3010        .with_column("direction", SqlScalarType::String.nullable(false))
3011        .finish(),
3012    column_comments: BTreeMap::from_iter([
3013        (
3014            "name",
3015            "The name of the network policy rule. Can be combined with `policy_id` to form a unique identifier.",
3016        ),
3017        (
3018            "policy_id",
3019            "The ID the network policy the rule is part of. Corresponds to `mz_network_policy_rules.id`.",
3020        ),
3021        (
3022            "action",
3023            "The action of the rule. `allow` is the only supported action.",
3024        ),
3025        ("address", "The address the rule will take action on."),
3026        (
3027            "direction",
3028            "The direction of traffic the rule applies to. `ingress` is the only supported direction.",
3029        ),
3030    ]),
3031    is_retained_metrics_object: false,
3032    access: vec![PUBLIC_SELECT],
3033});
3034/// PostgreSQL-specific metadata about types that doesn't make sense to expose
3035/// in the `mz_types` table as part of our public, stable API.
3036pub static MZ_TYPE_PG_METADATA: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3037    name: "mz_type_pg_metadata",
3038    schema: MZ_INTERNAL_SCHEMA,
3039    oid: oid::TABLE_MZ_TYPE_PG_METADATA_OID,
3040    desc: RelationDesc::builder()
3041        .with_column("id", SqlScalarType::String.nullable(false))
3042        .with_column("typinput", SqlScalarType::Oid.nullable(false))
3043        .with_column("typreceive", SqlScalarType::Oid.nullable(false))
3044        .finish(),
3045    column_comments: BTreeMap::new(),
3046    is_retained_metrics_object: false,
3047    access: vec![PUBLIC_SELECT],
3048});
3049pub static MZ_ARRAY_TYPES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3050    name: "mz_array_types",
3051    schema: MZ_CATALOG_SCHEMA,
3052    oid: oid::TABLE_MZ_ARRAY_TYPES_OID,
3053    desc: RelationDesc::builder()
3054        .with_column("id", SqlScalarType::String.nullable(false))
3055        .with_column("element_id", SqlScalarType::String.nullable(false))
3056        .finish(),
3057    column_comments: BTreeMap::from_iter([
3058        ("id", "The ID of the array type."),
3059        ("element_id", "The ID of the array's element type."),
3060    ]),
3061    is_retained_metrics_object: false,
3062    access: vec![PUBLIC_SELECT],
3063});
3064pub static MZ_BASE_TYPES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3065    name: "mz_base_types",
3066    schema: MZ_CATALOG_SCHEMA,
3067    oid: oid::TABLE_MZ_BASE_TYPES_OID,
3068    desc: RelationDesc::builder()
3069        .with_column("id", SqlScalarType::String.nullable(false))
3070        .finish(),
3071    column_comments: BTreeMap::from_iter([("id", "The ID of the type.")]),
3072    is_retained_metrics_object: false,
3073    access: vec![PUBLIC_SELECT],
3074});
3075pub static MZ_LIST_TYPES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3076    name: "mz_list_types",
3077    schema: MZ_CATALOG_SCHEMA,
3078    oid: oid::TABLE_MZ_LIST_TYPES_OID,
3079    desc: RelationDesc::builder()
3080        .with_column("id", SqlScalarType::String.nullable(false))
3081        .with_column("element_id", SqlScalarType::String.nullable(false))
3082        .with_column(
3083            "element_modifiers",
3084            SqlScalarType::List {
3085                element_type: Box::new(SqlScalarType::Int64),
3086                custom_id: None,
3087            }
3088            .nullable(true),
3089        )
3090        .finish(),
3091    column_comments: BTreeMap::from_iter([
3092        ("id", "The ID of the list type."),
3093        ("element_id", "The IID of the list's element type."),
3094        (
3095            "element_modifiers",
3096            "The element type modifiers, or `NULL` if none.",
3097        ),
3098    ]),
3099    is_retained_metrics_object: false,
3100    access: vec![PUBLIC_SELECT],
3101});
3102pub static MZ_MAP_TYPES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3103    name: "mz_map_types",
3104    schema: MZ_CATALOG_SCHEMA,
3105    oid: oid::TABLE_MZ_MAP_TYPES_OID,
3106    desc: RelationDesc::builder()
3107        .with_column("id", SqlScalarType::String.nullable(false))
3108        .with_column("key_id", SqlScalarType::String.nullable(false))
3109        .with_column("value_id", SqlScalarType::String.nullable(false))
3110        .with_column(
3111            "key_modifiers",
3112            SqlScalarType::List {
3113                element_type: Box::new(SqlScalarType::Int64),
3114                custom_id: None,
3115            }
3116            .nullable(true),
3117        )
3118        .with_column(
3119            "value_modifiers",
3120            SqlScalarType::List {
3121                element_type: Box::new(SqlScalarType::Int64),
3122                custom_id: None,
3123            }
3124            .nullable(true),
3125        )
3126        .finish(),
3127    column_comments: BTreeMap::from_iter([
3128        ("id", "The ID of the map type."),
3129        ("key_id", "The ID of the map's key type."),
3130        ("value_id", "The ID of the map's value type."),
3131        (
3132            "key_modifiers",
3133            "The key type modifiers, or `NULL` if none.",
3134        ),
3135        (
3136            "value_modifiers",
3137            "The value type modifiers, or `NULL` if none.",
3138        ),
3139    ]),
3140    is_retained_metrics_object: false,
3141    access: vec![PUBLIC_SELECT],
3142});
3143pub static MZ_ROLES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3144    name: "mz_roles",
3145    schema: MZ_CATALOG_SCHEMA,
3146    oid: oid::TABLE_MZ_ROLES_OID,
3147    desc: RelationDesc::builder()
3148        .with_column("id", SqlScalarType::String.nullable(false))
3149        .with_column("oid", SqlScalarType::Oid.nullable(false))
3150        .with_column("name", SqlScalarType::String.nullable(false))
3151        .with_column("inherit", SqlScalarType::Bool.nullable(false))
3152        .with_column("rolcanlogin", SqlScalarType::Bool.nullable(true))
3153        .with_column("rolsuper", SqlScalarType::Bool.nullable(true))
3154        .with_key(vec![0])
3155        .with_key(vec![1])
3156        .finish(),
3157    column_comments: BTreeMap::from_iter([
3158        ("id", "Materialize's unique ID for the role."),
3159        ("oid", "A [PostgreSQL-compatible OID][`oid`] for the role."),
3160        ("name", "The name of the role."),
3161        (
3162            "inherit",
3163            "Indicates whether the role has inheritance of privileges.",
3164        ),
3165        (
3166            "rolcanlogin",
3167            "Indicates whether the role can log in (i.e., is a user).",
3168        ),
3169        ("rolsuper", "Indicates whether the role is a superuser."),
3170    ]),
3171    is_retained_metrics_object: false,
3172    access: vec![PUBLIC_SELECT],
3173});
3174pub static MZ_ROLE_MEMBERS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3175    name: "mz_role_members",
3176    schema: MZ_CATALOG_SCHEMA,
3177    oid: oid::TABLE_MZ_ROLE_MEMBERS_OID,
3178    desc: RelationDesc::builder()
3179        .with_column("role_id", SqlScalarType::String.nullable(false))
3180        .with_column("member", SqlScalarType::String.nullable(false))
3181        .with_column("grantor", SqlScalarType::String.nullable(false))
3182        .finish(),
3183    column_comments: BTreeMap::from_iter([
3184        (
3185            "role_id",
3186            "The ID of the role the `member` is a member of. Corresponds to `mz_roles.id`.",
3187        ),
3188        (
3189            "member",
3190            "The ID of the role that is a member of `role_id`. Corresponds to `mz_roles.id`.",
3191        ),
3192        (
3193            "grantor",
3194            "The ID of the role that granted membership of `member` to `role_id`. Corresponds to `mz_roles.id`.",
3195        ),
3196    ]),
3197    is_retained_metrics_object: false,
3198    access: vec![PUBLIC_SELECT],
3199});
3200pub static MZ_ROLE_PARAMETERS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3201    name: "mz_role_parameters",
3202    schema: MZ_CATALOG_SCHEMA,
3203    oid: oid::TABLE_MZ_ROLE_PARAMETERS_OID,
3204    desc: RelationDesc::builder()
3205        .with_column("role_id", SqlScalarType::String.nullable(false))
3206        .with_column("parameter_name", SqlScalarType::String.nullable(false))
3207        .with_column("parameter_value", SqlScalarType::String.nullable(false))
3208        .finish(),
3209    column_comments: BTreeMap::from_iter([
3210        (
3211            "role_id",
3212            "The ID of the role whose configuration parameter default is set. Corresponds to `mz_roles.id`.",
3213        ),
3214        (
3215            "parameter_name",
3216            "The configuration parameter name. One of the supported configuration parameters.",
3217        ),
3218        (
3219            "parameter_value",
3220            "The default value of the parameter for the given role. Can be either a single value, or a comma-separated list of values for configuration parameters that accept a list.",
3221        ),
3222    ]),
3223    is_retained_metrics_object: false,
3224    access: vec![PUBLIC_SELECT],
3225});
3226pub static MZ_ROLE_AUTH: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3227    name: "mz_role_auth",
3228    schema: MZ_CATALOG_SCHEMA,
3229    oid: oid::TABLE_MZ_ROLE_AUTH_OID,
3230    desc: RelationDesc::builder()
3231        .with_column("role_id", SqlScalarType::String.nullable(false))
3232        .with_column("role_oid", SqlScalarType::Oid.nullable(false))
3233        .with_column("password_hash", SqlScalarType::String.nullable(true))
3234        .with_column(
3235            "updated_at",
3236            SqlScalarType::TimestampTz { precision: None }.nullable(false),
3237        )
3238        .finish(),
3239    column_comments: BTreeMap::from_iter([
3240        (
3241            "role_id",
3242            "The ID of the role. Corresponds to `mz_roles.id`.",
3243        ),
3244        (
3245            "role_oid",
3246            "The OID of the role whose configuration parameter default is set. Corresponds to `mz_roles.oid`.",
3247        ),
3248        ("password_hash", "The hashed password for the role"),
3249        (
3250            "updated_at",
3251            "The timestamp when the password was last updated.",
3252        ),
3253    ]),
3254    is_retained_metrics_object: false,
3255    access: vec![rbac::owner_privilege(ObjectType::Table, MZ_SYSTEM_ROLE_ID)],
3256});
3257pub static MZ_PSEUDO_TYPES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3258    name: "mz_pseudo_types",
3259    schema: MZ_CATALOG_SCHEMA,
3260    oid: oid::TABLE_MZ_PSEUDO_TYPES_OID,
3261    desc: RelationDesc::builder()
3262        .with_column("id", SqlScalarType::String.nullable(false))
3263        .finish(),
3264    column_comments: BTreeMap::from_iter([("id", "The ID of the type.")]),
3265    is_retained_metrics_object: false,
3266    access: vec![PUBLIC_SELECT],
3267});
3268pub static MZ_FUNCTIONS: LazyLock<BuiltinTable> = LazyLock::new(|| {
3269    BuiltinTable {
3270        name: "mz_functions",
3271        schema: MZ_CATALOG_SCHEMA,
3272        oid: oid::TABLE_MZ_FUNCTIONS_OID,
3273        desc: RelationDesc::builder()
3274            .with_column("id", SqlScalarType::String.nullable(false)) // not a key!
3275            .with_column("oid", SqlScalarType::Oid.nullable(false))
3276            .with_column("schema_id", SqlScalarType::String.nullable(false))
3277            .with_column("name", SqlScalarType::String.nullable(false))
3278            .with_column(
3279                "argument_type_ids",
3280                SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(false),
3281            )
3282            .with_column(
3283                "variadic_argument_type_id",
3284                SqlScalarType::String.nullable(true),
3285            )
3286            .with_column("return_type_id", SqlScalarType::String.nullable(true))
3287            .with_column("returns_set", SqlScalarType::Bool.nullable(false))
3288            .with_column("owner_id", SqlScalarType::String.nullable(false))
3289            .finish(),
3290        column_comments: BTreeMap::from_iter([
3291            ("id", "Materialize's unique ID for the function."),
3292            (
3293                "oid",
3294                "A [PostgreSQL-compatible OID][`oid`] for the function.",
3295            ),
3296            (
3297                "schema_id",
3298                "The ID of the schema to which the function belongs. Corresponds to `mz_schemas.id`.",
3299            ),
3300            ("name", "The name of the function."),
3301            (
3302                "argument_type_ids",
3303                "The ID of each argument's type. Each entry refers to `mz_types.id`.",
3304            ),
3305            (
3306                "variadic_argument_type_id",
3307                "The ID of the variadic argument's type, or `NULL` if the function does not have a variadic argument. Refers to `mz_types.id`.",
3308            ),
3309            (
3310                "return_type_id",
3311                "The returned value's type, or `NULL` if the function does not return a value. Refers to `mz_types.id`. Note that for table functions with > 1 column, this type corresponds to [`record`].",
3312            ),
3313            (
3314                "returns_set",
3315                "Whether the function returns a set, i.e. the function is a table function.",
3316            ),
3317            (
3318                "owner_id",
3319                "The role ID of the owner of the function. Corresponds to `mz_roles.id`.",
3320            ),
3321        ]),
3322        is_retained_metrics_object: false,
3323        access: vec![PUBLIC_SELECT],
3324    }
3325});
3326pub static MZ_OPERATORS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3327    name: "mz_operators",
3328    schema: MZ_CATALOG_SCHEMA,
3329    oid: oid::TABLE_MZ_OPERATORS_OID,
3330    desc: RelationDesc::builder()
3331        .with_column("oid", SqlScalarType::Oid.nullable(false))
3332        .with_column("name", SqlScalarType::String.nullable(false))
3333        .with_column(
3334            "argument_type_ids",
3335            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(false),
3336        )
3337        .with_column("return_type_id", SqlScalarType::String.nullable(true))
3338        .finish(),
3339    column_comments: BTreeMap::new(),
3340    is_retained_metrics_object: false,
3341    access: vec![PUBLIC_SELECT],
3342});
3343pub static MZ_AGGREGATES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3344    name: "mz_aggregates",
3345    schema: MZ_INTERNAL_SCHEMA,
3346    oid: oid::TABLE_MZ_AGGREGATES_OID,
3347    desc: RelationDesc::builder()
3348        .with_column("oid", SqlScalarType::Oid.nullable(false))
3349        .with_column("agg_kind", SqlScalarType::String.nullable(false))
3350        .with_column("agg_num_direct_args", SqlScalarType::Int16.nullable(false))
3351        .finish(),
3352    column_comments: BTreeMap::new(),
3353    is_retained_metrics_object: false,
3354    access: vec![PUBLIC_SELECT],
3355});
3356
3357pub static MZ_CLUSTERS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3358    name: "mz_clusters",
3359    schema: MZ_CATALOG_SCHEMA,
3360    oid: oid::TABLE_MZ_CLUSTERS_OID,
3361    desc: RelationDesc::builder()
3362        .with_column("id", SqlScalarType::String.nullable(false))
3363        .with_column("name", SqlScalarType::String.nullable(false))
3364        .with_column("owner_id", SqlScalarType::String.nullable(false))
3365        .with_column(
3366            "privileges",
3367            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
3368        )
3369        .with_column("managed", SqlScalarType::Bool.nullable(false))
3370        .with_column("size", SqlScalarType::String.nullable(true))
3371        .with_column("replication_factor", SqlScalarType::UInt32.nullable(true))
3372        .with_column("disk", SqlScalarType::Bool.nullable(true))
3373        .with_column(
3374            "availability_zones",
3375            SqlScalarType::List {
3376                element_type: Box::new(SqlScalarType::String),
3377                custom_id: None,
3378            }
3379            .nullable(true),
3380        )
3381        .with_column(
3382            "introspection_debugging",
3383            SqlScalarType::Bool.nullable(true),
3384        )
3385        .with_column(
3386            "introspection_interval",
3387            SqlScalarType::Interval.nullable(true),
3388        )
3389        .with_key(vec![0])
3390        .finish(),
3391    column_comments: BTreeMap::from_iter([
3392        ("id", "Materialize's unique ID for the cluster."),
3393        ("name", "The name of the cluster."),
3394        (
3395            "owner_id",
3396            "The role ID of the owner of the cluster. Corresponds to `mz_roles.id`.",
3397        ),
3398        ("privileges", "The privileges belonging to the cluster."),
3399        (
3400            "managed",
3401            "Whether the cluster is a managed cluster with automatically managed replicas.",
3402        ),
3403        (
3404            "size",
3405            "If the cluster is managed, the desired size of the cluster's replicas. `NULL` for unmanaged clusters.",
3406        ),
3407        (
3408            "replication_factor",
3409            "If the cluster is managed, the desired number of replicas of the cluster. `NULL` for unmanaged clusters.",
3410        ),
3411        (
3412            "disk",
3413            "Unstable If the cluster is managed, `true` if the replicas have the `DISK` option . `NULL` for unmanaged clusters.",
3414        ),
3415        (
3416            "availability_zones",
3417            "Unstable If the cluster is managed, the list of availability zones specified in `AVAILABILITY ZONES`. `NULL` for unmanaged clusters.",
3418        ),
3419        (
3420            "introspection_debugging",
3421            "Whether introspection of the gathering of the introspection data is enabled.",
3422        ),
3423        (
3424            "introspection_interval",
3425            "The interval at which to collect introspection data.",
3426        ),
3427    ]),
3428    is_retained_metrics_object: false,
3429    access: vec![PUBLIC_SELECT],
3430});
3431
3432pub static MZ_CLUSTER_WORKLOAD_CLASSES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3433    name: "mz_cluster_workload_classes",
3434    schema: MZ_INTERNAL_SCHEMA,
3435    oid: oid::TABLE_MZ_CLUSTER_WORKLOAD_CLASSES_OID,
3436    desc: RelationDesc::builder()
3437        .with_column("id", SqlScalarType::String.nullable(false))
3438        .with_column("workload_class", SqlScalarType::String.nullable(true))
3439        .with_key(vec![0])
3440        .finish(),
3441    column_comments: BTreeMap::new(),
3442    is_retained_metrics_object: false,
3443    access: vec![PUBLIC_SELECT],
3444});
3445
3446pub const MZ_CLUSTER_WORKLOAD_CLASSES_IND: BuiltinIndex = BuiltinIndex {
3447    name: "mz_cluster_workload_classes_ind",
3448    schema: MZ_INTERNAL_SCHEMA,
3449    oid: oid::INDEX_MZ_CLUSTER_WORKLOAD_CLASSES_IND_OID,
3450    sql: "IN CLUSTER mz_catalog_server
3451ON mz_internal.mz_cluster_workload_classes (id)",
3452    is_retained_metrics_object: false,
3453};
3454
3455pub static MZ_CLUSTER_SCHEDULES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3456    name: "mz_cluster_schedules",
3457    schema: MZ_INTERNAL_SCHEMA,
3458    oid: oid::TABLE_MZ_CLUSTER_SCHEDULES_OID,
3459    desc: RelationDesc::builder()
3460        .with_column("cluster_id", SqlScalarType::String.nullable(false))
3461        .with_column("type", SqlScalarType::String.nullable(false))
3462        .with_column(
3463            "refresh_hydration_time_estimate",
3464            SqlScalarType::Interval.nullable(true),
3465        )
3466        .finish(),
3467    column_comments: BTreeMap::from_iter([
3468        (
3469            "cluster_id",
3470            "The ID of the cluster. Corresponds to `mz_clusters.id`.",
3471        ),
3472        ("type", "`on-refresh`, or `manual`. Default: `manual`"),
3473        (
3474            "refresh_hydration_time_estimate",
3475            "The interval given in the `HYDRATION TIME ESTIMATE` option.",
3476        ),
3477    ]),
3478    is_retained_metrics_object: false,
3479    access: vec![PUBLIC_SELECT],
3480});
3481
3482pub static MZ_SECRETS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3483    name: "mz_secrets",
3484    schema: MZ_CATALOG_SCHEMA,
3485    oid: oid::TABLE_MZ_SECRETS_OID,
3486    desc: RelationDesc::builder()
3487        .with_column("id", SqlScalarType::String.nullable(false))
3488        .with_column("oid", SqlScalarType::Oid.nullable(false))
3489        .with_column("schema_id", SqlScalarType::String.nullable(false))
3490        .with_column("name", SqlScalarType::String.nullable(false))
3491        .with_column("owner_id", SqlScalarType::String.nullable(false))
3492        .with_column(
3493            "privileges",
3494            SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false),
3495        )
3496        .finish(),
3497    column_comments: BTreeMap::from_iter([
3498        ("id", "The unique ID of the secret."),
3499        (
3500            "oid",
3501            "A [PostgreSQL-compatible oid][`oid`] for the secret.",
3502        ),
3503        (
3504            "schema_id",
3505            "The ID of the schema to which the secret belongs. Corresponds to `mz_schemas.id`.",
3506        ),
3507        ("name", "The name of the secret."),
3508        (
3509            "owner_id",
3510            "The role ID of the owner of the secret. Corresponds to `mz_roles.id`.",
3511        ),
3512        ("privileges", "The privileges belonging to the secret."),
3513    ]),
3514    is_retained_metrics_object: false,
3515    access: vec![PUBLIC_SELECT],
3516});
3517
3518pub static MZ_CLUSTER_REPLICAS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3519    name: "mz_cluster_replicas",
3520    schema: MZ_CATALOG_SCHEMA,
3521    oid: oid::TABLE_MZ_CLUSTER_REPLICAS_OID,
3522    desc: RelationDesc::builder()
3523        .with_column("id", SqlScalarType::String.nullable(false))
3524        .with_column("name", SqlScalarType::String.nullable(false))
3525        .with_column("cluster_id", SqlScalarType::String.nullable(false))
3526        .with_column("size", SqlScalarType::String.nullable(true))
3527        // `NULL` for un-orchestrated clusters and for replicas where the user
3528        // hasn't specified them.
3529        .with_column("availability_zone", SqlScalarType::String.nullable(true))
3530        .with_column("owner_id", SqlScalarType::String.nullable(false))
3531        .with_column("disk", SqlScalarType::Bool.nullable(true))
3532        .finish(),
3533    column_comments: BTreeMap::from_iter([
3534        ("id", "Materialize's unique ID for the cluster replica."),
3535        ("name", "The name of the cluster replica."),
3536        (
3537            "cluster_id",
3538            "The ID of the cluster to which the replica belongs. Corresponds to `mz_clusters.id`.",
3539        ),
3540        (
3541            "size",
3542            "The cluster replica's size, selected during creation.",
3543        ),
3544        (
3545            "availability_zone",
3546            "The availability zone in which the cluster is running.",
3547        ),
3548        (
3549            "owner_id",
3550            "The role ID of the owner of the cluster replica. Corresponds to `mz_roles.id`.",
3551        ),
3552        ("disk", "If the replica has a local disk."),
3553    ]),
3554    is_retained_metrics_object: true,
3555    access: vec![PUBLIC_SELECT],
3556});
3557
3558pub static MZ_INTERNAL_CLUSTER_REPLICAS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3559    name: "mz_internal_cluster_replicas",
3560    schema: MZ_INTERNAL_SCHEMA,
3561    oid: oid::TABLE_MZ_INTERNAL_CLUSTER_REPLICAS_OID,
3562    desc: RelationDesc::builder()
3563        .with_column("id", SqlScalarType::String.nullable(false))
3564        .finish(),
3565    column_comments: BTreeMap::from_iter([(
3566        "id",
3567        "The ID of a cluster replica. Corresponds to `mz_cluster_replicas.id`.",
3568    )]),
3569    is_retained_metrics_object: false,
3570    access: vec![PUBLIC_SELECT],
3571});
3572
3573pub static MZ_PENDING_CLUSTER_REPLICAS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3574    name: "mz_pending_cluster_replicas",
3575    schema: MZ_INTERNAL_SCHEMA,
3576    oid: oid::TABLE_MZ_PENDING_CLUSTER_REPLICAS_OID,
3577    desc: RelationDesc::builder()
3578        .with_column("id", SqlScalarType::String.nullable(false))
3579        .finish(),
3580    column_comments: BTreeMap::from_iter([(
3581        "id",
3582        "The ID of a cluster replica. Corresponds to `mz_cluster_replicas.id`.",
3583    )]),
3584    is_retained_metrics_object: false,
3585    access: vec![PUBLIC_SELECT],
3586});
3587
3588pub static MZ_CLUSTER_REPLICA_STATUS_HISTORY: LazyLock<BuiltinSource> = LazyLock::new(|| {
3589    BuiltinSource {
3590        name: "mz_cluster_replica_status_history",
3591        schema: MZ_INTERNAL_SCHEMA,
3592        oid: oid::SOURCE_MZ_CLUSTER_REPLICA_STATUS_HISTORY_OID,
3593        data_source: IntrospectionType::ReplicaStatusHistory,
3594        desc: REPLICA_STATUS_HISTORY_DESC.clone(),
3595        column_comments: BTreeMap::from_iter([
3596            ("replica_id", "The ID of a cluster replica."),
3597            ("process_id", "The ID of a process within the replica."),
3598            (
3599                "status",
3600                "The status of the cluster replica: `online` or `offline`.",
3601            ),
3602            (
3603                "reason",
3604                "If the cluster replica is in an `offline` state, the reason (if available). For example, `oom-killed`.",
3605            ),
3606            (
3607                "occurred_at",
3608                "Wall-clock timestamp at which the event occurred.",
3609            ),
3610        ]),
3611        is_retained_metrics_object: false,
3612        access: vec![PUBLIC_SELECT],
3613    }
3614});
3615
3616pub static MZ_CLUSTER_REPLICA_STATUS_HISTORY_CT: LazyLock<BuiltinContinualTask> = LazyLock::new(
3617    || {
3618        BuiltinContinualTask {
3619            name: "mz_cluster_replica_status_history_ct",
3620            schema: MZ_INTERNAL_SCHEMA,
3621            oid: oid::CT_MZ_CLUSTER_REPLICA_STATUS_HISTORY_OID,
3622            desc: REPLICA_STATUS_HISTORY_DESC.clone(),
3623            sql: "
3624IN CLUSTER mz_catalog_server
3625ON INPUT mz_internal.mz_cluster_replica_status_history AS (
3626    DELETE FROM mz_internal.mz_cluster_replica_status_history_ct WHERE occurred_at + '30d' < mz_now();
3627    INSERT INTO mz_internal.mz_cluster_replica_status_history_ct SELECT * FROM mz_internal.mz_cluster_replica_status_history;
3628)",
3629            access: vec![PUBLIC_SELECT],
3630        }
3631    },
3632);
3633
3634pub static MZ_CLUSTER_REPLICA_STATUSES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
3635    name: "mz_cluster_replica_statuses",
3636    schema: MZ_INTERNAL_SCHEMA,
3637    oid: oid::VIEW_MZ_CLUSTER_REPLICA_STATUSES_OID,
3638    desc: RelationDesc::builder()
3639        .with_column("replica_id", SqlScalarType::String.nullable(false))
3640        .with_column("process_id", SqlScalarType::UInt64.nullable(false))
3641        .with_column("status", SqlScalarType::String.nullable(false))
3642        .with_column("reason", SqlScalarType::String.nullable(true))
3643        .with_column(
3644            "updated_at",
3645            SqlScalarType::TimestampTz { precision: None }.nullable(false),
3646        )
3647        .with_key(vec![0, 1])
3648        .finish(),
3649    column_comments: BTreeMap::from_iter([
3650        (
3651            "replica_id",
3652            "Materialize's unique ID for the cluster replica.",
3653        ),
3654        (
3655            "process_id",
3656            "The ID of the process within the cluster replica.",
3657        ),
3658        (
3659            "status",
3660            "The status of the cluster replica: `online` or `offline`.",
3661        ),
3662        (
3663            "reason",
3664            "If the cluster replica is in a `offline` state, the reason (if available). For example, `oom-killed`.",
3665        ),
3666        (
3667            "updated_at",
3668            "The time at which the status was last updated.",
3669        ),
3670    ]),
3671    sql: "
3672SELECT
3673    DISTINCT ON (replica_id, process_id)
3674    replica_id,
3675    process_id,
3676    status,
3677    reason,
3678    occurred_at as updated_at
3679FROM mz_internal.mz_cluster_replica_status_history
3680JOIN mz_cluster_replicas r ON r.id = replica_id
3681ORDER BY replica_id, process_id, occurred_at DESC",
3682    access: vec![PUBLIC_SELECT],
3683});
3684
3685pub static MZ_CLUSTER_REPLICA_SIZES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3686    name: "mz_cluster_replica_sizes",
3687    schema: MZ_CATALOG_SCHEMA,
3688    oid: oid::TABLE_MZ_CLUSTER_REPLICA_SIZES_OID,
3689    desc: RelationDesc::builder()
3690        .with_column("size", SqlScalarType::String.nullable(false))
3691        .with_column("processes", SqlScalarType::UInt64.nullable(false))
3692        .with_column("workers", SqlScalarType::UInt64.nullable(false))
3693        .with_column("cpu_nano_cores", SqlScalarType::UInt64.nullable(false))
3694        .with_column("memory_bytes", SqlScalarType::UInt64.nullable(false))
3695        .with_column("disk_bytes", SqlScalarType::UInt64.nullable(true))
3696        .with_column(
3697            "credits_per_hour",
3698            SqlScalarType::Numeric { max_scale: None }.nullable(false),
3699        )
3700        .finish(),
3701    column_comments: BTreeMap::from_iter([
3702        ("size", "The human-readable replica size."),
3703        ("processes", "The number of processes in the replica."),
3704        (
3705            "workers",
3706            "The number of Timely Dataflow workers per process.",
3707        ),
3708        (
3709            "cpu_nano_cores",
3710            "The CPU allocation per process, in billionths of a vCPU core.",
3711        ),
3712        (
3713            "memory_bytes",
3714            "The RAM allocation per process, in billionths of a vCPU core.",
3715        ),
3716        ("disk_bytes", "The disk allocation per process."),
3717        (
3718            "credits_per_hour",
3719            "The number of compute credits consumed per hour.",
3720        ),
3721    ]),
3722    is_retained_metrics_object: true,
3723    access: vec![PUBLIC_SELECT],
3724});
3725
3726pub static MZ_AUDIT_EVENTS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
3727    name: "mz_audit_events",
3728    schema: MZ_CATALOG_SCHEMA,
3729    oid: oid::TABLE_MZ_AUDIT_EVENTS_OID,
3730    desc: RelationDesc::builder()
3731        .with_column("id", SqlScalarType::UInt64.nullable(false))
3732        .with_column("event_type", SqlScalarType::String.nullable(false))
3733        .with_column("object_type", SqlScalarType::String.nullable(false))
3734        .with_column("details", SqlScalarType::Jsonb.nullable(false))
3735        .with_column("user", SqlScalarType::String.nullable(true))
3736        .with_column(
3737            "occurred_at",
3738            SqlScalarType::TimestampTz { precision: None }.nullable(false),
3739        )
3740        .with_key(vec![0])
3741        .finish(),
3742    column_comments: BTreeMap::from_iter([
3743        (
3744            "id",
3745            "Materialize's unique, monotonically increasing ID for the event.",
3746        ),
3747        (
3748            "event_type",
3749            "The type of the event: `create`, `drop`, or `alter`.",
3750        ),
3751        (
3752            "object_type",
3753            "The type of the affected object: `cluster`, `cluster-replica`, `connection`, `database`, `function`, `index`, `materialized-view`, `role`, `schema`, `secret`, `sink`, `source`, `table`, `type`, or `view`.",
3754        ),
3755        (
3756            "details",
3757            "Additional details about the event. The shape of the details varies based on `event_type` and `object_type`.",
3758        ),
3759        (
3760            "user",
3761            "The user who triggered the event, or `NULL` if triggered by the system.",
3762        ),
3763        (
3764            "occurred_at",
3765            "The time at which the event occurred. Guaranteed to be in order of event creation. Events created in the same transaction will have identical values.",
3766        ),
3767    ]),
3768    is_retained_metrics_object: false,
3769    access: vec![PUBLIC_SELECT],
3770});
3771
3772pub static MZ_SOURCE_STATUS_HISTORY: LazyLock<BuiltinSource> = LazyLock::new(|| BuiltinSource {
3773    name: "mz_source_status_history",
3774    schema: MZ_INTERNAL_SCHEMA,
3775    oid: oid::SOURCE_MZ_SOURCE_STATUS_HISTORY_OID,
3776    data_source: IntrospectionType::SourceStatusHistory,
3777    desc: MZ_SOURCE_STATUS_HISTORY_DESC.clone(),
3778    column_comments: BTreeMap::from_iter([
3779        (
3780            "occurred_at",
3781            "Wall-clock timestamp of the source status change.",
3782        ),
3783        (
3784            "source_id",
3785            "The ID of the source. Corresponds to `mz_catalog.mz_sources.id`.",
3786        ),
3787        (
3788            "status",
3789            "The status of the source: one of `created`, `starting`, `running`, `paused`, `stalled`, `failed`, or `dropped`.",
3790        ),
3791        (
3792            "error",
3793            "If the source is in an error state, the error message.",
3794        ),
3795        (
3796            "details",
3797            "Additional metadata provided by the source. In case of error, may contain a `hint` field with helpful suggestions.",
3798        ),
3799        (
3800            "replica_id",
3801            "The ID of the replica that an instance of a source is running on.",
3802        ),
3803    ]),
3804    is_retained_metrics_object: false,
3805    access: vec![PUBLIC_SELECT],
3806});
3807
3808pub static MZ_AWS_PRIVATELINK_CONNECTION_STATUS_HISTORY: LazyLock<BuiltinSource> = LazyLock::new(
3809    || BuiltinSource {
3810        name: "mz_aws_privatelink_connection_status_history",
3811        schema: MZ_INTERNAL_SCHEMA,
3812        oid: oid::SOURCE_MZ_AWS_PRIVATELINK_CONNECTION_STATUS_HISTORY_OID,
3813        data_source: IntrospectionType::PrivatelinkConnectionStatusHistory,
3814        desc: MZ_AWS_PRIVATELINK_CONNECTION_STATUS_HISTORY_DESC.clone(),
3815        column_comments: BTreeMap::from_iter([
3816            ("occurred_at", "Wall-clock timestamp of the status change."),
3817            (
3818                "connection_id",
3819                "The unique identifier of the AWS PrivateLink connection. Corresponds to `mz_catalog.mz_connections.id`.",
3820            ),
3821            (
3822                "status",
3823                "The status of the connection: one of `pending-service-discovery`, `creating-endpoint`, `recreating-endpoint`, `updating-endpoint`, `available`, `deleted`, `deleting`, `expired`, `failed`, `pending`, `pending-acceptance`, `rejected`, or `unknown`.",
3824            ),
3825        ]),
3826        is_retained_metrics_object: false,
3827        access: vec![PUBLIC_SELECT],
3828    },
3829);
3830
3831pub static MZ_AWS_PRIVATELINK_CONNECTION_STATUSES: LazyLock<BuiltinView> =
3832    LazyLock::new(|| BuiltinView {
3833        name: "mz_aws_privatelink_connection_statuses",
3834        schema: MZ_INTERNAL_SCHEMA,
3835        oid: oid::VIEW_MZ_AWS_PRIVATELINK_CONNECTION_STATUSES_OID,
3836        desc: RelationDesc::builder()
3837            .with_column("id", SqlScalarType::String.nullable(false))
3838            .with_column("name", SqlScalarType::String.nullable(false))
3839            .with_column(
3840                "last_status_change_at",
3841                SqlScalarType::TimestampTz { precision: None }.nullable(true),
3842            )
3843            .with_column("status", SqlScalarType::String.nullable(true))
3844            .with_key(vec![0])
3845            .finish(),
3846        column_comments: BTreeMap::from_iter([
3847            (
3848                "id",
3849                "The ID of the connection. Corresponds to `mz_catalog.mz_connections.id`.",
3850            ),
3851            ("name", "The name of the connection."),
3852            (
3853                "last_status_change_at",
3854                "Wall-clock timestamp of the connection status change.",
3855            ),
3856            ("status", ""),
3857        ]),
3858        sql: "
3859    WITH statuses_w_last_status AS (
3860        SELECT
3861            connection_id,
3862            occurred_at,
3863            status,
3864            lag(status) OVER (PARTITION BY connection_id ORDER BY occurred_at) AS last_status
3865        FROM mz_internal.mz_aws_privatelink_connection_status_history
3866    ),
3867    latest_events AS (
3868        -- Only take the most recent transition for each ID
3869        SELECT DISTINCT ON(connection_id) connection_id, occurred_at, status
3870        FROM statuses_w_last_status
3871        -- Only keep first status transitions
3872        WHERE status <> last_status OR last_status IS NULL
3873        ORDER BY connection_id, occurred_at DESC
3874    )
3875    SELECT
3876        conns.id,
3877        name,
3878        occurred_at as last_status_change_at,
3879        status
3880    FROM latest_events
3881    JOIN mz_catalog.mz_connections AS conns
3882    ON conns.id = latest_events.connection_id",
3883        access: vec![PUBLIC_SELECT],
3884    });
3885
3886pub static MZ_STATEMENT_EXECUTION_HISTORY: LazyLock<BuiltinSource> =
3887    LazyLock::new(|| BuiltinSource {
3888        name: "mz_statement_execution_history",
3889        schema: MZ_INTERNAL_SCHEMA,
3890        oid: oid::SOURCE_MZ_STATEMENT_EXECUTION_HISTORY_OID,
3891        data_source: IntrospectionType::StatementExecutionHistory,
3892        desc: MZ_STATEMENT_EXECUTION_HISTORY_DESC.clone(),
3893        column_comments: BTreeMap::new(),
3894        is_retained_metrics_object: false,
3895        access: vec![MONITOR_SELECT],
3896    });
3897
3898pub static MZ_STATEMENT_EXECUTION_HISTORY_REDACTED: LazyLock<BuiltinView> = LazyLock::new(|| {
3899    BuiltinView {
3900    name: "mz_statement_execution_history_redacted",
3901    schema: MZ_INTERNAL_SCHEMA,
3902    oid: oid::VIEW_MZ_STATEMENT_EXECUTION_HISTORY_REDACTED_OID,
3903    // everything but `params` and `error_message`
3904    desc: RelationDesc::builder()
3905        .with_column("id", SqlScalarType::Uuid.nullable(false))
3906        .with_column("prepared_statement_id", SqlScalarType::Uuid.nullable(false))
3907        .with_column("sample_rate", SqlScalarType::Float64.nullable(false))
3908        .with_column("cluster_id", SqlScalarType::String.nullable(true))
3909        .with_column("application_name", SqlScalarType::String.nullable(false))
3910        .with_column("cluster_name", SqlScalarType::String.nullable(true))
3911        .with_column("database_name", SqlScalarType::String.nullable(false))
3912        .with_column("search_path", SqlScalarType::List { element_type: Box::new(SqlScalarType::String), custom_id: None }.nullable(false))
3913        .with_column("transaction_isolation", SqlScalarType::String.nullable(false))
3914        .with_column("execution_timestamp", SqlScalarType::UInt64.nullable(true))
3915        .with_column("transaction_id", SqlScalarType::UInt64.nullable(false))
3916        .with_column("transient_index_id", SqlScalarType::String.nullable(true))
3917        .with_column("mz_version", SqlScalarType::String.nullable(false))
3918        .with_column("began_at", SqlScalarType::TimestampTz { precision: None }.nullable(false))
3919        .with_column("finished_at", SqlScalarType::TimestampTz { precision: None }.nullable(true))
3920        .with_column("finished_status", SqlScalarType::String.nullable(true))
3921        .with_column("result_size", SqlScalarType::Int64.nullable(true))
3922        .with_column("rows_returned", SqlScalarType::Int64.nullable(true))
3923        .with_column("execution_strategy", SqlScalarType::String.nullable(true))
3924        .finish(),
3925    column_comments: BTreeMap::new(),
3926    sql: "
3927SELECT id, prepared_statement_id, sample_rate, cluster_id, application_name,
3928cluster_name, database_name, search_path, transaction_isolation, execution_timestamp, transaction_id,
3929transient_index_id, mz_version, began_at, finished_at, finished_status,
3930result_size, rows_returned, execution_strategy
3931FROM mz_internal.mz_statement_execution_history",
3932    access: vec![SUPPORT_SELECT, ANALYTICS_SELECT, MONITOR_REDACTED_SELECT, MONITOR_SELECT],
3933}
3934});
3935
3936pub static MZ_PREPARED_STATEMENT_HISTORY: LazyLock<BuiltinSource> =
3937    LazyLock::new(|| BuiltinSource {
3938        name: "mz_prepared_statement_history",
3939        schema: MZ_INTERNAL_SCHEMA,
3940        oid: oid::SOURCE_MZ_PREPARED_STATEMENT_HISTORY_OID,
3941        data_source: IntrospectionType::PreparedStatementHistory,
3942        desc: MZ_PREPARED_STATEMENT_HISTORY_DESC.clone(),
3943        column_comments: BTreeMap::new(),
3944        is_retained_metrics_object: false,
3945        access: vec![
3946            SUPPORT_SELECT,
3947            ANALYTICS_SELECT,
3948            MONITOR_REDACTED_SELECT,
3949            MONITOR_SELECT,
3950        ],
3951    });
3952
3953pub static MZ_SQL_TEXT: LazyLock<BuiltinSource> = LazyLock::new(|| BuiltinSource {
3954    name: "mz_sql_text",
3955    schema: MZ_INTERNAL_SCHEMA,
3956    oid: oid::SOURCE_MZ_SQL_TEXT_OID,
3957    desc: MZ_SQL_TEXT_DESC.clone(),
3958    data_source: IntrospectionType::SqlText,
3959    column_comments: BTreeMap::new(),
3960    is_retained_metrics_object: false,
3961    access: vec![MONITOR_SELECT],
3962});
3963
3964pub static MZ_SQL_TEXT_REDACTED: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
3965    name: "mz_sql_text_redacted",
3966    schema: MZ_INTERNAL_SCHEMA,
3967    oid: oid::VIEW_MZ_SQL_TEXT_REDACTED_OID,
3968    desc: RelationDesc::builder()
3969        .with_column("sql_hash", SqlScalarType::Bytes.nullable(false))
3970        .with_column("redacted_sql", SqlScalarType::String.nullable(false))
3971        .finish(),
3972    column_comments: BTreeMap::new(),
3973    sql: "SELECT sql_hash, redacted_sql FROM mz_internal.mz_sql_text",
3974    access: vec![
3975        MONITOR_SELECT,
3976        MONITOR_REDACTED_SELECT,
3977        SUPPORT_SELECT,
3978        ANALYTICS_SELECT,
3979    ],
3980});
3981
3982pub static MZ_RECENT_SQL_TEXT: LazyLock<BuiltinView> = LazyLock::new(|| {
3983    BuiltinView {
3984        name: "mz_recent_sql_text",
3985        schema: MZ_INTERNAL_SCHEMA,
3986        oid: oid::VIEW_MZ_RECENT_SQL_TEXT_OID,
3987        // This should always be 1 day more than the interval in
3988        // `MZ_RECENT_THINNED_ACTIVITY_LOG` , because `prepared_day`
3989        // is rounded down to the nearest day.  Thus something that actually happened three days ago
3990        // could have a `prepared day` anywhere from 3 to 4 days back.
3991        desc: RelationDesc::builder()
3992            .with_column("sql_hash", SqlScalarType::Bytes.nullable(false))
3993            .with_column("sql", SqlScalarType::String.nullable(false))
3994            .with_column("redacted_sql", SqlScalarType::String.nullable(false))
3995            .with_key(vec![0, 1, 2])
3996            .finish(),
3997        column_comments: BTreeMap::new(),
3998        sql: "SELECT DISTINCT sql_hash, sql, redacted_sql FROM mz_internal.mz_sql_text WHERE prepared_day + INTERVAL '4 days' >= mz_now()",
3999        access: vec![MONITOR_SELECT],
4000    }
4001});
4002
4003pub static MZ_RECENT_SQL_TEXT_REDACTED: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
4004    name: "mz_recent_sql_text_redacted",
4005    schema: MZ_INTERNAL_SCHEMA,
4006    oid: oid::VIEW_MZ_RECENT_SQL_TEXT_REDACTED_OID,
4007    desc: RelationDesc::builder()
4008        .with_column("sql_hash", SqlScalarType::Bytes.nullable(false))
4009        .with_column("redacted_sql", SqlScalarType::String.nullable(false))
4010        .finish(),
4011    column_comments: BTreeMap::new(),
4012    sql: "SELECT sql_hash, redacted_sql FROM mz_internal.mz_recent_sql_text",
4013    access: vec![
4014        MONITOR_SELECT,
4015        MONITOR_REDACTED_SELECT,
4016        SUPPORT_SELECT,
4017        ANALYTICS_SELECT,
4018    ],
4019});
4020
4021pub static MZ_RECENT_SQL_TEXT_IND: LazyLock<BuiltinIndex> = LazyLock::new(|| BuiltinIndex {
4022    name: "mz_recent_sql_text_ind",
4023    schema: MZ_INTERNAL_SCHEMA,
4024    oid: oid::INDEX_MZ_RECENT_SQL_TEXT_IND_OID,
4025    sql: "IN CLUSTER mz_catalog_server ON mz_internal.mz_recent_sql_text (sql_hash)",
4026    is_retained_metrics_object: false,
4027});
4028
4029pub static MZ_SESSION_HISTORY: LazyLock<BuiltinSource> = LazyLock::new(|| BuiltinSource {
4030    name: "mz_session_history",
4031    schema: MZ_INTERNAL_SCHEMA,
4032    oid: oid::SOURCE_MZ_SESSION_HISTORY_OID,
4033    data_source: IntrospectionType::SessionHistory,
4034    desc: MZ_SESSION_HISTORY_DESC.clone(),
4035    column_comments: BTreeMap::new(),
4036    is_retained_metrics_object: false,
4037    access: vec![PUBLIC_SELECT],
4038});
4039
4040pub static MZ_ACTIVITY_LOG_THINNED: LazyLock<BuiltinView> = LazyLock::new(|| {
4041    BuiltinView {
4042        name: "mz_activity_log_thinned",
4043        schema: MZ_INTERNAL_SCHEMA,
4044        oid: oid::VIEW_MZ_ACTIVITY_LOG_THINNED_OID,
4045        desc: RelationDesc::builder()
4046            .with_column("execution_id", SqlScalarType::Uuid.nullable(false))
4047            .with_column("sample_rate", SqlScalarType::Float64.nullable(false))
4048            .with_column("cluster_id", SqlScalarType::String.nullable(true))
4049            .with_column("application_name", SqlScalarType::String.nullable(false))
4050            .with_column("cluster_name", SqlScalarType::String.nullable(true))
4051            .with_column("database_name", SqlScalarType::String.nullable(false))
4052            .with_column("search_path", SqlScalarType::List { element_type: Box::new(SqlScalarType::String), custom_id: None }.nullable(false))
4053            .with_column("transaction_isolation", SqlScalarType::String.nullable(false))
4054            .with_column("execution_timestamp", SqlScalarType::UInt64.nullable(true))
4055            .with_column("transient_index_id", SqlScalarType::String.nullable(true))
4056            .with_column("params", SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(false))
4057            .with_column("mz_version", SqlScalarType::String.nullable(false))
4058            .with_column("began_at", SqlScalarType::TimestampTz { precision: None }.nullable(false))
4059            .with_column("finished_at", SqlScalarType::TimestampTz { precision: None }.nullable(true))
4060            .with_column("finished_status", SqlScalarType::String.nullable(true))
4061            .with_column("error_message", SqlScalarType::String.nullable(true))
4062            .with_column("result_size", SqlScalarType::Int64.nullable(true))
4063            .with_column("rows_returned", SqlScalarType::Int64.nullable(true))
4064            .with_column("execution_strategy", SqlScalarType::String.nullable(true))
4065            .with_column("transaction_id", SqlScalarType::UInt64.nullable(false))
4066            .with_column("prepared_statement_id", SqlScalarType::Uuid.nullable(false))
4067            .with_column("sql_hash", SqlScalarType::Bytes.nullable(false))
4068            .with_column("prepared_statement_name", SqlScalarType::String.nullable(false))
4069            .with_column("session_id", SqlScalarType::Uuid.nullable(false))
4070            .with_column("prepared_at", SqlScalarType::TimestampTz { precision: None }.nullable(false))
4071            .with_column("statement_type", SqlScalarType::String.nullable(true))
4072            .with_column("throttled_count", SqlScalarType::UInt64.nullable(false))
4073            .with_column("connected_at", SqlScalarType::TimestampTz { precision: None }.nullable(false))
4074            .with_column("initial_application_name", SqlScalarType::String.nullable(false))
4075            .with_column("authenticated_user", SqlScalarType::String.nullable(false))
4076            .finish(),
4077        column_comments: BTreeMap::new(),
4078        sql: "
4079SELECT mseh.id AS execution_id, sample_rate, cluster_id, application_name, cluster_name, database_name, search_path,
4080transaction_isolation, execution_timestamp, transient_index_id, params, mz_version, began_at, finished_at, finished_status,
4081error_message, result_size, rows_returned, execution_strategy, transaction_id,
4082mpsh.id AS prepared_statement_id, sql_hash, mpsh.name AS prepared_statement_name,
4083mpsh.session_id, prepared_at, statement_type, throttled_count,
4084connected_at, initial_application_name, authenticated_user
4085FROM mz_internal.mz_statement_execution_history mseh,
4086     mz_internal.mz_prepared_statement_history mpsh,
4087     mz_internal.mz_session_history msh
4088WHERE mseh.prepared_statement_id = mpsh.id
4089AND mpsh.session_id = msh.session_id",
4090        access: vec![MONITOR_SELECT],
4091    }
4092});
4093
4094pub static MZ_RECENT_ACTIVITY_LOG_THINNED: LazyLock<BuiltinView> = LazyLock::new(|| {
4095    BuiltinView {
4096        name: "mz_recent_activity_log_thinned",
4097        schema: MZ_INTERNAL_SCHEMA,
4098        oid: oid::VIEW_MZ_RECENT_ACTIVITY_LOG_THINNED_OID,
4099        desc: RelationDesc::builder()
4100            .with_column("execution_id", SqlScalarType::Uuid.nullable(false))
4101            .with_column("sample_rate", SqlScalarType::Float64.nullable(false))
4102            .with_column("cluster_id", SqlScalarType::String.nullable(true))
4103            .with_column("application_name", SqlScalarType::String.nullable(false))
4104            .with_column("cluster_name", SqlScalarType::String.nullable(true))
4105            .with_column("database_name", SqlScalarType::String.nullable(false))
4106            .with_column("search_path", SqlScalarType::List { element_type: Box::new(SqlScalarType::String), custom_id: None }.nullable(false))
4107            .with_column("transaction_isolation", SqlScalarType::String.nullable(false))
4108            .with_column("execution_timestamp", SqlScalarType::UInt64.nullable(true))
4109            .with_column("transient_index_id", SqlScalarType::String.nullable(true))
4110            .with_column("params", SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(false))
4111            .with_column("mz_version", SqlScalarType::String.nullable(false))
4112            .with_column("began_at", SqlScalarType::TimestampTz { precision: None }.nullable(false))
4113            .with_column("finished_at", SqlScalarType::TimestampTz { precision: None }.nullable(true))
4114            .with_column("finished_status", SqlScalarType::String.nullable(true))
4115            .with_column("error_message", SqlScalarType::String.nullable(true))
4116            .with_column("result_size", SqlScalarType::Int64.nullable(true))
4117            .with_column("rows_returned", SqlScalarType::Int64.nullable(true))
4118            .with_column("execution_strategy", SqlScalarType::String.nullable(true))
4119            .with_column("transaction_id", SqlScalarType::UInt64.nullable(false))
4120            .with_column("prepared_statement_id", SqlScalarType::Uuid.nullable(false))
4121            .with_column("sql_hash", SqlScalarType::Bytes.nullable(false))
4122            .with_column("prepared_statement_name", SqlScalarType::String.nullable(false))
4123            .with_column("session_id", SqlScalarType::Uuid.nullable(false))
4124            .with_column("prepared_at", SqlScalarType::TimestampTz { precision: None }.nullable(false))
4125            .with_column("statement_type", SqlScalarType::String.nullable(true))
4126            .with_column("throttled_count", SqlScalarType::UInt64.nullable(false))
4127            .with_column("connected_at", SqlScalarType::TimestampTz { precision: None }.nullable(false))
4128            .with_column("initial_application_name", SqlScalarType::String.nullable(false))
4129            .with_column("authenticated_user", SqlScalarType::String.nullable(false))
4130            .finish(),
4131        column_comments: BTreeMap::new(),
4132        // We use a temporal window of 2 days rather than 1 day for `mz_session_history`'s `connected_at` since a statement execution at
4133        // the edge of the 1 day temporal window could've been executed in a session that was established an hour before the 1 day window.
4134        sql:
4135        "SELECT * FROM mz_internal.mz_activity_log_thinned WHERE prepared_at + INTERVAL '1 day' > mz_now()
4136AND began_at + INTERVAL '1 day' > mz_now() AND connected_at + INTERVAL '2 days' > mz_now()",
4137        access: vec![MONITOR_SELECT],
4138    }
4139});
4140
4141pub static MZ_RECENT_ACTIVITY_LOG: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
4142    name: "mz_recent_activity_log",
4143    schema: MZ_INTERNAL_SCHEMA,
4144    oid: oid::VIEW_MZ_RECENT_ACTIVITY_LOG_OID,
4145    desc: RelationDesc::builder()
4146        .with_column("execution_id", SqlScalarType::Uuid.nullable(false))
4147        .with_column("sample_rate", SqlScalarType::Float64.nullable(false))
4148        .with_column("cluster_id", SqlScalarType::String.nullable(true))
4149        .with_column("application_name", SqlScalarType::String.nullable(false))
4150        .with_column("cluster_name", SqlScalarType::String.nullable(true))
4151        .with_column("database_name", SqlScalarType::String.nullable(false))
4152        .with_column(
4153            "search_path",
4154            SqlScalarType::List {
4155                element_type: Box::new(SqlScalarType::String),
4156                custom_id: None,
4157            }
4158            .nullable(false),
4159        )
4160        .with_column(
4161            "transaction_isolation",
4162            SqlScalarType::String.nullable(false),
4163        )
4164        .with_column("execution_timestamp", SqlScalarType::UInt64.nullable(true))
4165        .with_column("transient_index_id", SqlScalarType::String.nullable(true))
4166        .with_column(
4167            "params",
4168            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(false),
4169        )
4170        .with_column("mz_version", SqlScalarType::String.nullable(false))
4171        .with_column(
4172            "began_at",
4173            SqlScalarType::TimestampTz { precision: None }.nullable(false),
4174        )
4175        .with_column(
4176            "finished_at",
4177            SqlScalarType::TimestampTz { precision: None }.nullable(true),
4178        )
4179        .with_column("finished_status", SqlScalarType::String.nullable(true))
4180        .with_column("error_message", SqlScalarType::String.nullable(true))
4181        .with_column("result_size", SqlScalarType::Int64.nullable(true))
4182        .with_column("rows_returned", SqlScalarType::Int64.nullable(true))
4183        .with_column("execution_strategy", SqlScalarType::String.nullable(true))
4184        .with_column("transaction_id", SqlScalarType::UInt64.nullable(false))
4185        .with_column("prepared_statement_id", SqlScalarType::Uuid.nullable(false))
4186        .with_column("sql_hash", SqlScalarType::Bytes.nullable(false))
4187        .with_column(
4188            "prepared_statement_name",
4189            SqlScalarType::String.nullable(false),
4190        )
4191        .with_column("session_id", SqlScalarType::Uuid.nullable(false))
4192        .with_column(
4193            "prepared_at",
4194            SqlScalarType::TimestampTz { precision: None }.nullable(false),
4195        )
4196        .with_column("statement_type", SqlScalarType::String.nullable(true))
4197        .with_column("throttled_count", SqlScalarType::UInt64.nullable(false))
4198        .with_column(
4199            "connected_at",
4200            SqlScalarType::TimestampTz { precision: None }.nullable(false),
4201        )
4202        .with_column(
4203            "initial_application_name",
4204            SqlScalarType::String.nullable(false),
4205        )
4206        .with_column("authenticated_user", SqlScalarType::String.nullable(false))
4207        .with_column("sql", SqlScalarType::String.nullable(false))
4208        .finish(),
4209    column_comments: BTreeMap::from_iter([
4210        (
4211            "execution_id",
4212            "An ID that is unique for each executed statement.",
4213        ),
4214        (
4215            "sample_rate",
4216            "The actual rate at which the statement was sampled.",
4217        ),
4218        (
4219            "cluster_id",
4220            "The ID of the cluster the statement execution was directed to. Corresponds to mz_clusters.id.",
4221        ),
4222        (
4223            "application_name",
4224            "The value of the `application_name` configuration parameter at execution time.",
4225        ),
4226        (
4227            "cluster_name",
4228            "The name of the cluster with ID `cluster_id` at execution time.",
4229        ),
4230        (
4231            "database_name",
4232            "The value of the `database` configuration parameter at execution time.",
4233        ),
4234        (
4235            "search_path",
4236            "The value of the `search_path` configuration parameter at execution time.",
4237        ),
4238        (
4239            "transaction_isolation",
4240            "The value of the `transaction_isolation` configuration parameter at execution time.",
4241        ),
4242        (
4243            "execution_timestamp",
4244            "The logical timestamp at which execution was scheduled.",
4245        ),
4246        (
4247            "transient_index_id",
4248            "The internal index of the compute dataflow created for the query, if any.",
4249        ),
4250        (
4251            "params",
4252            "The parameters with which the statement was executed.",
4253        ),
4254        (
4255            "mz_version",
4256            "The version of Materialize that was running when the statement was executed.",
4257        ),
4258        (
4259            "began_at",
4260            "The wall-clock time at which the statement began executing.",
4261        ),
4262        (
4263            "finished_at",
4264            "The wall-clock time at which the statement finished executing.",
4265        ),
4266        (
4267            "finished_status",
4268            "The final status of the statement (e.g., `success`, `canceled`, `error`, or `aborted`). `aborted` means that Materialize exited before the statement finished executing.",
4269        ),
4270        (
4271            "error_message",
4272            "The error message, if the statement failed.",
4273        ),
4274        (
4275            "result_size",
4276            "The size in bytes of the result, for statements that return rows.",
4277        ),
4278        (
4279            "rows_returned",
4280            "The number of rows returned, for statements that return rows.",
4281        ),
4282        (
4283            "execution_strategy",
4284            "For `SELECT` queries, the strategy for executing the query. `constant` means computed in the control plane without the involvement of a cluster, `fast-path` means read by a cluster directly from an in-memory index, and `standard` means computed by a temporary dataflow.",
4285        ),
4286        (
4287            "transaction_id",
4288            "The ID of the transaction that the statement was part of. Note that transaction IDs are only unique per session.",
4289        ),
4290        (
4291            "prepared_statement_id",
4292            "An ID that is unique for each prepared statement. For example, if a statement is prepared once and then executed multiple times, all executions will have the same value for this column (but different values for `execution_id`).",
4293        ),
4294        (
4295            "sql_hash",
4296            "An opaque value uniquely identifying the text of the query.",
4297        ),
4298        (
4299            "prepared_statement_name",
4300            "The name given by the client library to the prepared statement.",
4301        ),
4302        (
4303            "session_id",
4304            "An ID that is unique for each session. Corresponds to mz_sessions.id.",
4305        ),
4306        (
4307            "prepared_at",
4308            "The time at which the statement was prepared.",
4309        ),
4310        (
4311            "statement_type",
4312            "The type of the statement, e.g. `select` for a `SELECT` query, or `NULL` if the statement was empty.",
4313        ),
4314        (
4315            "throttled_count",
4316            "The number of statements that were dropped due to throttling before the current one was seen. If you have a very high volume of queries and need to log them without throttling, contact our team.",
4317        ),
4318        (
4319            "connected_at",
4320            "The time at which the session was established.",
4321        ),
4322        (
4323            "initial_application_name",
4324            "The initial value of `application_name` at the beginning of the session.",
4325        ),
4326        (
4327            "authenticated_user",
4328            "The name of the user for which the session was established.",
4329        ),
4330        ("sql", "The SQL text of the statement."),
4331    ]),
4332    sql: "SELECT mralt.*, mrst.sql
4333FROM mz_internal.mz_recent_activity_log_thinned mralt,
4334     mz_internal.mz_recent_sql_text mrst
4335WHERE mralt.sql_hash = mrst.sql_hash",
4336    access: vec![MONITOR_SELECT],
4337});
4338
4339pub static MZ_RECENT_ACTIVITY_LOG_REDACTED: LazyLock<BuiltinView> = LazyLock::new(|| {
4340    BuiltinView {
4341    name: "mz_recent_activity_log_redacted",
4342    schema: MZ_INTERNAL_SCHEMA,
4343    oid: oid::VIEW_MZ_RECENT_ACTIVITY_LOG_REDACTED_OID,
4344    // Includes all the columns in mz_recent_activity_log_thinned except 'error_message'.
4345    desc: RelationDesc::builder()
4346        .with_column("execution_id", SqlScalarType::Uuid.nullable(false))
4347        .with_column("sample_rate", SqlScalarType::Float64.nullable(false))
4348        .with_column("cluster_id", SqlScalarType::String.nullable(true))
4349        .with_column("application_name", SqlScalarType::String.nullable(false))
4350        .with_column("cluster_name", SqlScalarType::String.nullable(true))
4351        .with_column("database_name", SqlScalarType::String.nullable(false))
4352        .with_column("search_path", SqlScalarType::List { element_type: Box::new(SqlScalarType::String), custom_id: None }.nullable(false))
4353        .with_column("transaction_isolation", SqlScalarType::String.nullable(false))
4354        .with_column("execution_timestamp", SqlScalarType::UInt64.nullable(true))
4355        .with_column("transient_index_id", SqlScalarType::String.nullable(true))
4356        .with_column("params", SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(false))
4357        .with_column("mz_version", SqlScalarType::String.nullable(false))
4358        .with_column("began_at", SqlScalarType::TimestampTz { precision: None }.nullable(false))
4359        .with_column("finished_at", SqlScalarType::TimestampTz { precision: None }.nullable(true))
4360        .with_column("finished_status", SqlScalarType::String.nullable(true))
4361        .with_column("result_size", SqlScalarType::Int64.nullable(true))
4362        .with_column("rows_returned", SqlScalarType::Int64.nullable(true))
4363        .with_column("execution_strategy", SqlScalarType::String.nullable(true))
4364        .with_column("transaction_id", SqlScalarType::UInt64.nullable(false))
4365        .with_column("prepared_statement_id", SqlScalarType::Uuid.nullable(false))
4366        .with_column("sql_hash", SqlScalarType::Bytes.nullable(false))
4367        .with_column("prepared_statement_name", SqlScalarType::String.nullable(false))
4368        .with_column("session_id", SqlScalarType::Uuid.nullable(false))
4369        .with_column("prepared_at", SqlScalarType::TimestampTz { precision: None }.nullable(false))
4370        .with_column("statement_type", SqlScalarType::String.nullable(true))
4371        .with_column("throttled_count", SqlScalarType::UInt64.nullable(false))
4372        .with_column("initial_application_name", SqlScalarType::String.nullable(false))
4373        .with_column("authenticated_user", SqlScalarType::String.nullable(false))
4374        .with_column("redacted_sql", SqlScalarType::String.nullable(false))
4375        .finish(),
4376    column_comments: BTreeMap::new(),
4377    sql: "SELECT mralt.execution_id, mralt.sample_rate, mralt.cluster_id, mralt.application_name,
4378    mralt.cluster_name, mralt.database_name, mralt.search_path, mralt.transaction_isolation, mralt.execution_timestamp,
4379    mralt.transient_index_id, mralt.params, mralt.mz_version, mralt.began_at, mralt.finished_at,
4380    mralt.finished_status, mralt.result_size, mralt.rows_returned, mralt.execution_strategy, mralt.transaction_id,
4381    mralt.prepared_statement_id, mralt.sql_hash, mralt.prepared_statement_name, mralt.session_id,
4382    mralt.prepared_at, mralt.statement_type, mralt.throttled_count,
4383    mralt.initial_application_name, mralt.authenticated_user,
4384    mrst.redacted_sql
4385FROM mz_internal.mz_recent_activity_log_thinned mralt,
4386     mz_internal.mz_recent_sql_text mrst
4387WHERE mralt.sql_hash = mrst.sql_hash",
4388    access: vec![MONITOR_SELECT, MONITOR_REDACTED_SELECT, SUPPORT_SELECT, ANALYTICS_SELECT],
4389}
4390});
4391
4392pub static MZ_STATEMENT_LIFECYCLE_HISTORY: LazyLock<BuiltinSource> = LazyLock::new(|| {
4393    BuiltinSource {
4394        name: "mz_statement_lifecycle_history",
4395        schema: MZ_INTERNAL_SCHEMA,
4396        oid: oid::SOURCE_MZ_STATEMENT_LIFECYCLE_HISTORY_OID,
4397        desc: RelationDesc::builder()
4398            .with_column("statement_id", SqlScalarType::Uuid.nullable(false))
4399            .with_column("event_type", SqlScalarType::String.nullable(false))
4400            .with_column(
4401                "occurred_at",
4402                SqlScalarType::TimestampTz { precision: None }.nullable(false),
4403            )
4404            .finish(),
4405        data_source: IntrospectionType::StatementLifecycleHistory,
4406        column_comments: BTreeMap::from_iter([
4407            (
4408                "statement_id",
4409                "The ID of the execution event. Corresponds to `mz_recent_activity_log.execution_id`",
4410            ),
4411            (
4412                "event_type",
4413                "The type of lifecycle event, e.g. `'execution-began'`, `'storage-dependencies-finished'`, `'compute-dependencies-finished'`, or `'execution-finished'`",
4414            ),
4415            ("occurred_at", "The time at which the event took place."),
4416        ]),
4417        is_retained_metrics_object: false,
4418        // TODO[btv]: Maybe this should be public instead of
4419        // `MONITOR_REDACTED`, but since that would be a backwards-compatible
4420        // change, we probably don't need to worry about it now.
4421        access: vec![
4422            SUPPORT_SELECT,
4423            ANALYTICS_SELECT,
4424            MONITOR_REDACTED_SELECT,
4425            MONITOR_SELECT,
4426        ],
4427    }
4428});
4429
4430pub static MZ_SOURCE_STATUSES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
4431    name: "mz_source_statuses",
4432    schema: MZ_INTERNAL_SCHEMA,
4433    oid: oid::VIEW_MZ_SOURCE_STATUSES_OID,
4434    desc: RelationDesc::builder()
4435        .with_column("id", SqlScalarType::String.nullable(false))
4436        .with_column("name", SqlScalarType::String.nullable(false))
4437        .with_column("type", SqlScalarType::String.nullable(false))
4438        .with_column(
4439            "last_status_change_at",
4440            SqlScalarType::TimestampTz { precision: None }.nullable(true),
4441        )
4442        .with_column("status", SqlScalarType::String.nullable(false))
4443        .with_column("error", SqlScalarType::String.nullable(true))
4444        .with_column("details", SqlScalarType::Jsonb.nullable(true))
4445        .finish(),
4446    column_comments: BTreeMap::from_iter([
4447        (
4448            "id",
4449            "The ID of the source. Corresponds to `mz_catalog.mz_sources.id`.",
4450        ),
4451        ("name", "The name of the source."),
4452        ("type", "The type of the source."),
4453        (
4454            "last_status_change_at",
4455            "Wall-clock timestamp of the source status change.",
4456        ),
4457        (
4458            "status",
4459            "The status of the source: one of `created`, `starting`, `running`, `paused`, `stalled`, `failed`, or `dropped`.",
4460        ),
4461        (
4462            "error",
4463            "If the source is in an error state, the error message.",
4464        ),
4465        (
4466            "details",
4467            "Additional metadata provided by the source. In case of error, may contain a `hint` field with helpful suggestions.",
4468        ),
4469    ]),
4470    sql: "
4471    WITH
4472    -- The status history contains per-replica events and source-global events.
4473    -- For the latter, replica_id is NULL. We turn these into '<source>', so that
4474    -- we can treat them uniformly below.
4475    uniform_status_history AS
4476    (
4477        SELECT
4478            s.source_id,
4479            COALESCE(s.replica_id, '<source>') as replica_id,
4480            s.occurred_at,
4481            s.status,
4482            s.error,
4483            s.details
4484        FROM mz_internal.mz_source_status_history s
4485    ),
4486    -- For getting the latest events, we first determine the latest per-replica
4487    -- events here and then apply precedence rules below.
4488    latest_per_replica_events AS
4489    (
4490        SELECT DISTINCT ON (source_id, replica_id)
4491            occurred_at, source_id, replica_id, status, error, details
4492        FROM uniform_status_history
4493        ORDER BY source_id, replica_id, occurred_at DESC
4494    ),
4495    -- We have a precedence list that determines the overall status in case
4496    -- there is differing per-replica (including source-global) statuses. If
4497    -- there is no 'dropped' status, and any replica reports 'running', the
4498    -- overall status is 'running' even if there might be some replica that has
4499    -- errors or is paused.
4500    latest_events AS
4501    (
4502       SELECT DISTINCT ON (source_id)
4503            source_id,
4504            occurred_at,
4505            status,
4506            error,
4507            details
4508        FROM latest_per_replica_events
4509        ORDER BY source_id, CASE status
4510                    WHEN 'dropped' THEN 1
4511                    WHEN 'running' THEN 2
4512                    WHEN 'stalled' THEN 3
4513                    WHEN 'starting' THEN 4
4514                    WHEN 'paused' THEN 5
4515                    WHEN 'ceased' THEN 6
4516                    ELSE 7  -- For any other status values
4517                END
4518    ),
4519    -- Determine which sources are subsources and which are parent sources
4520    subsources AS
4521    (
4522        SELECT subsources.id AS self, sources.id AS parent
4523        FROM
4524            mz_catalog.mz_sources AS subsources
4525                JOIN
4526                    mz_internal.mz_object_dependencies AS deps
4527                    ON subsources.id = deps.object_id
4528                JOIN mz_catalog.mz_sources AS sources ON sources.id = deps.referenced_object_id
4529    ),
4530    -- Determine which sources are source tables
4531    tables AS
4532    (
4533        SELECT tables.id AS self, tables.source_id AS parent, tables.name
4534        FROM mz_catalog.mz_tables AS tables
4535        WHERE tables.source_id IS NOT NULL
4536    ),
4537    -- Determine which collection's ID to use for the status
4538    id_of_status_to_use AS
4539    (
4540        SELECT
4541            self_events.source_id,
4542            -- If self not errored, but parent is, use parent; else self
4543            CASE
4544                WHEN
4545                    self_events.status <> 'ceased' AND
4546                    parent_events.status = 'stalled'
4547                THEN parent_events.source_id
4548                ELSE self_events.source_id
4549            END AS id_to_use
4550        FROM
4551            latest_events AS self_events
4552                LEFT JOIN subsources ON self_events.source_id = subsources.self
4553                LEFT JOIN tables ON self_events.source_id = tables.self
4554                LEFT JOIN
4555                    latest_events AS parent_events
4556                    ON parent_events.source_id = COALESCE(subsources.parent, tables.parent)
4557    ),
4558    -- Swap out events for the ID of the event we plan to use instead
4559    latest_events_to_use AS
4560    (
4561        SELECT occurred_at, s.source_id, status, error, details
4562        FROM
4563            id_of_status_to_use AS s
4564                JOIN latest_events AS e ON e.source_id = s.id_to_use
4565    ),
4566    combined AS (
4567        SELECT
4568            mz_sources.id,
4569            mz_sources.name,
4570            mz_sources.type,
4571            occurred_at,
4572            status,
4573            error,
4574            details
4575        FROM
4576            mz_catalog.mz_sources
4577            LEFT JOIN latest_events_to_use AS e ON mz_sources.id = e.source_id
4578        UNION ALL
4579        SELECT
4580            tables.self AS id,
4581            tables.name,
4582            'table' AS type,
4583            occurred_at,
4584            status,
4585            error,
4586            details
4587        FROM
4588            tables
4589            LEFT JOIN latest_events_to_use AS e ON tables.self = e.source_id
4590    )
4591SELECT
4592    id,
4593    name,
4594    type,
4595    occurred_at AS last_status_change_at,
4596    -- TODO(parkmycar): Report status of webhook source once database-issues#5986 is closed.
4597    CASE
4598        WHEN
4599            type = 'webhook' OR
4600            type = 'progress'
4601        THEN 'running'
4602        ELSE COALESCE(status, 'created')
4603    END AS status,
4604    error,
4605    details
4606FROM combined
4607WHERE id NOT LIKE 's%';",
4608    access: vec![PUBLIC_SELECT],
4609});
4610
4611pub static MZ_SINK_STATUS_HISTORY: LazyLock<BuiltinSource> = LazyLock::new(|| BuiltinSource {
4612    name: "mz_sink_status_history",
4613    schema: MZ_INTERNAL_SCHEMA,
4614    oid: oid::SOURCE_MZ_SINK_STATUS_HISTORY_OID,
4615    data_source: IntrospectionType::SinkStatusHistory,
4616    desc: MZ_SINK_STATUS_HISTORY_DESC.clone(),
4617    column_comments: BTreeMap::from_iter([
4618        (
4619            "occurred_at",
4620            "Wall-clock timestamp of the sink status change.",
4621        ),
4622        (
4623            "sink_id",
4624            "The ID of the sink. Corresponds to `mz_catalog.mz_sinks.id`.",
4625        ),
4626        (
4627            "status",
4628            "The status of the sink: one of `created`, `starting`, `running`, `stalled`, `failed`, or `dropped`.",
4629        ),
4630        (
4631            "error",
4632            "If the sink is in an error state, the error message.",
4633        ),
4634        (
4635            "details",
4636            "Additional metadata provided by the sink. In case of error, may contain a `hint` field with helpful suggestions.",
4637        ),
4638        (
4639            "replica_id",
4640            "The ID of the replica that an instance of a sink is running on.",
4641        ),
4642    ]),
4643    is_retained_metrics_object: false,
4644    access: vec![PUBLIC_SELECT],
4645});
4646
4647pub static MZ_SINK_STATUSES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
4648    name: "mz_sink_statuses",
4649    schema: MZ_INTERNAL_SCHEMA,
4650    oid: oid::VIEW_MZ_SINK_STATUSES_OID,
4651    desc: RelationDesc::builder()
4652        .with_column("id", SqlScalarType::String.nullable(false))
4653        .with_column("name", SqlScalarType::String.nullable(false))
4654        .with_column("type", SqlScalarType::String.nullable(false))
4655        .with_column(
4656            "last_status_change_at",
4657            SqlScalarType::TimestampTz { precision: None }.nullable(true),
4658        )
4659        .with_column("status", SqlScalarType::String.nullable(false))
4660        .with_column("error", SqlScalarType::String.nullable(true))
4661        .with_column("details", SqlScalarType::Jsonb.nullable(true))
4662        .finish(),
4663    column_comments: BTreeMap::from_iter([
4664        (
4665            "id",
4666            "The ID of the sink. Corresponds to `mz_catalog.mz_sinks.id`.",
4667        ),
4668        ("name", "The name of the sink."),
4669        ("type", "The type of the sink."),
4670        (
4671            "last_status_change_at",
4672            "Wall-clock timestamp of the sink status change.",
4673        ),
4674        (
4675            "status",
4676            "The status of the sink: one of `created`, `starting`, `running`, `stalled`, `failed`, or `dropped`.",
4677        ),
4678        (
4679            "error",
4680            "If the sink is in an error state, the error message.",
4681        ),
4682        (
4683            "details",
4684            "Additional metadata provided by the sink. In case of error, may contain a `hint` field with helpful suggestions.",
4685        ),
4686    ]),
4687    sql: "
4688WITH
4689-- The status history contains per-replica events and sink-global events.
4690-- For the latter, replica_id is NULL. We turn these into '<sink>', so that
4691-- we can treat them uniformly below.
4692uniform_status_history AS
4693(
4694    SELECT
4695        s.sink_id,
4696        COALESCE(s.replica_id, '<sink>') as replica_id,
4697        s.occurred_at,
4698        s.status,
4699        s.error,
4700        s.details
4701    FROM mz_internal.mz_sink_status_history s
4702),
4703-- For getting the latest events, we first determine the latest per-replica
4704-- events here and then apply precedence rules below.
4705latest_per_replica_events AS
4706(
4707    SELECT DISTINCT ON (sink_id, replica_id)
4708        occurred_at, sink_id, replica_id, status, error, details
4709    FROM uniform_status_history
4710    ORDER BY sink_id, replica_id, occurred_at DESC
4711),
4712-- We have a precedence list that determines the overall status in case
4713-- there is differing per-replica (including sink-global) statuses. If
4714-- there is no 'dropped' status, and any replica reports 'running', the
4715-- overall status is 'running' even if there might be some replica that has
4716-- errors or is paused.
4717latest_events AS
4718(
4719    SELECT DISTINCT ON (sink_id)
4720        sink_id,
4721        occurred_at,
4722        status,
4723        error,
4724        details
4725    FROM latest_per_replica_events
4726    ORDER BY sink_id, CASE status
4727                WHEN 'dropped' THEN 1
4728                WHEN 'running' THEN 2
4729                WHEN 'stalled' THEN 3
4730                WHEN 'starting' THEN 4
4731                WHEN 'paused' THEN 5
4732                WHEN 'ceased' THEN 6
4733                ELSE 7  -- For any other status values
4734            END
4735)
4736SELECT
4737    mz_sinks.id,
4738    name,
4739    mz_sinks.type,
4740    occurred_at as last_status_change_at,
4741    coalesce(status, 'created') as status,
4742    error,
4743    details
4744FROM mz_catalog.mz_sinks
4745LEFT JOIN latest_events ON mz_sinks.id = latest_events.sink_id
4746WHERE
4747    -- This is a convenient way to filter out system sinks, like the status_history table itself.
4748    mz_sinks.id NOT LIKE 's%'",
4749    access: vec![PUBLIC_SELECT],
4750});
4751
4752pub static MZ_STORAGE_USAGE_BY_SHARD_DESCRIPTION: LazyLock<SystemObjectDescription> =
4753    LazyLock::new(|| SystemObjectDescription {
4754        schema_name: MZ_STORAGE_USAGE_BY_SHARD.schema.to_string(),
4755        object_type: CatalogItemType::Table,
4756        object_name: MZ_STORAGE_USAGE_BY_SHARD.name.to_string(),
4757    });
4758
4759pub static MZ_STORAGE_USAGE_BY_SHARD: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
4760    name: "mz_storage_usage_by_shard",
4761    schema: MZ_INTERNAL_SCHEMA,
4762    oid: oid::TABLE_MZ_STORAGE_USAGE_BY_SHARD_OID,
4763    desc: RelationDesc::builder()
4764        .with_column("id", SqlScalarType::UInt64.nullable(false))
4765        .with_column("shard_id", SqlScalarType::String.nullable(true))
4766        .with_column("size_bytes", SqlScalarType::UInt64.nullable(false))
4767        .with_column(
4768            "collection_timestamp",
4769            SqlScalarType::TimestampTz { precision: None }.nullable(false),
4770        )
4771        .finish(),
4772    column_comments: BTreeMap::new(),
4773    is_retained_metrics_object: false,
4774    access: vec![PUBLIC_SELECT],
4775});
4776
4777pub static MZ_EGRESS_IPS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
4778    name: "mz_egress_ips",
4779    schema: MZ_CATALOG_SCHEMA,
4780    oid: oid::TABLE_MZ_EGRESS_IPS_OID,
4781    desc: RelationDesc::builder()
4782        .with_column("egress_ip", SqlScalarType::String.nullable(false))
4783        .with_column("prefix_length", SqlScalarType::Int32.nullable(false))
4784        .with_column("cidr", SqlScalarType::String.nullable(false))
4785        .finish(),
4786    column_comments: BTreeMap::from_iter([
4787        ("egress_ip", "The start of the range of IP addresses."),
4788        (
4789            "prefix_length",
4790            "The number of leading bits in the CIDR netmask.",
4791        ),
4792        ("cidr", "The CIDR representation."),
4793    ]),
4794    is_retained_metrics_object: false,
4795    access: vec![PUBLIC_SELECT],
4796});
4797
4798pub static MZ_AWS_PRIVATELINK_CONNECTIONS: LazyLock<BuiltinTable> =
4799    LazyLock::new(|| BuiltinTable {
4800        name: "mz_aws_privatelink_connections",
4801        schema: MZ_CATALOG_SCHEMA,
4802        oid: oid::TABLE_MZ_AWS_PRIVATELINK_CONNECTIONS_OID,
4803        desc: RelationDesc::builder()
4804            .with_column("id", SqlScalarType::String.nullable(false))
4805            .with_column("principal", SqlScalarType::String.nullable(false))
4806            .finish(),
4807        column_comments: BTreeMap::from_iter([
4808            ("id", "The ID of the connection."),
4809            (
4810                "principal",
4811                "The AWS Principal that Materialize will use to connect to the VPC endpoint.",
4812            ),
4813        ]),
4814        is_retained_metrics_object: false,
4815        access: vec![PUBLIC_SELECT],
4816    });
4817
4818pub static MZ_AWS_CONNECTIONS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
4819    name: "mz_aws_connections",
4820    schema: MZ_INTERNAL_SCHEMA,
4821    oid: oid::TABLE_MZ_AWS_CONNECTIONS_OID,
4822    desc: RelationDesc::builder()
4823        .with_column("id", SqlScalarType::String.nullable(false))
4824        .with_column("endpoint", SqlScalarType::String.nullable(true))
4825        .with_column("region", SqlScalarType::String.nullable(true))
4826        .with_column("access_key_id", SqlScalarType::String.nullable(true))
4827        .with_column(
4828            "access_key_id_secret_id",
4829            SqlScalarType::String.nullable(true),
4830        )
4831        .with_column(
4832            "secret_access_key_secret_id",
4833            SqlScalarType::String.nullable(true),
4834        )
4835        .with_column("session_token", SqlScalarType::String.nullable(true))
4836        .with_column(
4837            "session_token_secret_id",
4838            SqlScalarType::String.nullable(true),
4839        )
4840        .with_column("assume_role_arn", SqlScalarType::String.nullable(true))
4841        .with_column(
4842            "assume_role_session_name",
4843            SqlScalarType::String.nullable(true),
4844        )
4845        .with_column("principal", SqlScalarType::String.nullable(true))
4846        .with_column("external_id", SqlScalarType::String.nullable(true))
4847        .with_column("example_trust_policy", SqlScalarType::Jsonb.nullable(true))
4848        .finish(),
4849    column_comments: BTreeMap::from_iter([
4850        ("id", "The ID of the connection."),
4851        ("endpoint", "The value of the `ENDPOINT` option, if set."),
4852        ("region", "The value of the `REGION` option, if set."),
4853        (
4854            "access_key_id",
4855            "The value of the `ACCESS KEY ID` option, if provided in line.",
4856        ),
4857        (
4858            "access_key_id_secret_id",
4859            "The ID of the secret referenced by the `ACCESS KEY ID` option, if provided via a secret.",
4860        ),
4861        (
4862            "secret_access_key_secret_id",
4863            "The ID of the secret referenced by the `SECRET ACCESS KEY` option, if set.",
4864        ),
4865        (
4866            "session_token",
4867            "The value of the `SESSION TOKEN` option, if provided in line.",
4868        ),
4869        (
4870            "session_token_secret_id",
4871            "The ID of the secret referenced by the `SESSION TOKEN` option, if provided via a secret.",
4872        ),
4873        (
4874            "assume_role_arn",
4875            "The value of the `ASSUME ROLE ARN` option, if set.",
4876        ),
4877        (
4878            "assume_role_session_name",
4879            "The value of the `ASSUME ROLE SESSION NAME` option, if set.",
4880        ),
4881        (
4882            "principal",
4883            "The ARN of the AWS principal Materialize will use when assuming the provided role, if the connection is configured to use role assumption.",
4884        ),
4885        (
4886            "external_id",
4887            "The external ID Materialize will use when assuming the provided role, if the connection is configured to use role assumption.",
4888        ),
4889        (
4890            "example_trust_policy",
4891            "An example of an IAM role trust policy that allows this connection's principal and external ID to assume the role.",
4892        ),
4893    ]),
4894    is_retained_metrics_object: false,
4895    access: vec![PUBLIC_SELECT],
4896});
4897
4898pub static MZ_CLUSTER_REPLICA_METRICS_HISTORY: LazyLock<BuiltinSource> =
4899    LazyLock::new(|| BuiltinSource {
4900        name: "mz_cluster_replica_metrics_history",
4901        schema: MZ_INTERNAL_SCHEMA,
4902        oid: oid::SOURCE_MZ_CLUSTER_REPLICA_METRICS_HISTORY_OID,
4903        data_source: IntrospectionType::ReplicaMetricsHistory,
4904        desc: REPLICA_METRICS_HISTORY_DESC.clone(),
4905        column_comments: BTreeMap::from_iter([
4906            ("replica_id", "The ID of a cluster replica."),
4907            ("process_id", "The ID of a process within the replica."),
4908            (
4909                "cpu_nano_cores",
4910                "Approximate CPU usage, in billionths of a vCPU core.",
4911            ),
4912            ("memory_bytes", "Approximate memory usage, in bytes."),
4913            ("disk_bytes", "Approximate disk usage, in bytes."),
4914            (
4915                "occurred_at",
4916                "Wall-clock timestamp at which the event occurred.",
4917            ),
4918            (
4919                "heap_bytes",
4920                "Approximate heap (RAM + swap) usage, in bytes.",
4921            ),
4922            ("heap_limit", "Available heap (RAM + swap) space, in bytes."),
4923        ]),
4924        is_retained_metrics_object: false,
4925        access: vec![PUBLIC_SELECT],
4926    });
4927
4928pub static MZ_CLUSTER_REPLICA_METRICS_HISTORY_CT: LazyLock<BuiltinContinualTask> = LazyLock::new(
4929    || {
4930        BuiltinContinualTask {
4931            name: "mz_cluster_replica_metrics_history_ct",
4932            schema: MZ_INTERNAL_SCHEMA,
4933            oid: oid::CT_MZ_CLUSTER_REPLICA_METRICS_HISTORY_OID,
4934            desc: REPLICA_METRICS_HISTORY_DESC.clone(),
4935            sql: "
4936IN CLUSTER mz_catalog_server
4937ON INPUT mz_internal.mz_cluster_replica_metrics_history AS (
4938    DELETE FROM mz_internal.mz_cluster_replica_metrics_history_ct WHERE occurred_at + '30d' < mz_now();
4939    INSERT INTO mz_internal.mz_cluster_replica_metrics_history_ct SELECT * FROM mz_internal.mz_cluster_replica_metrics_history;
4940)",
4941            access: vec![PUBLIC_SELECT],
4942        }
4943    },
4944);
4945
4946pub static MZ_CLUSTER_REPLICA_METRICS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
4947    name: "mz_cluster_replica_metrics",
4948    schema: MZ_INTERNAL_SCHEMA,
4949    oid: oid::VIEW_MZ_CLUSTER_REPLICA_METRICS_OID,
4950    desc: RelationDesc::builder()
4951        .with_column("replica_id", SqlScalarType::String.nullable(false))
4952        .with_column("process_id", SqlScalarType::UInt64.nullable(false))
4953        .with_column("cpu_nano_cores", SqlScalarType::UInt64.nullable(true))
4954        .with_column("memory_bytes", SqlScalarType::UInt64.nullable(true))
4955        .with_column("disk_bytes", SqlScalarType::UInt64.nullable(true))
4956        .with_column("heap_bytes", SqlScalarType::UInt64.nullable(true))
4957        .with_column("heap_limit", SqlScalarType::UInt64.nullable(true))
4958        .with_key(vec![0, 1])
4959        .finish(),
4960    column_comments: BTreeMap::from_iter([
4961        ("replica_id", "The ID of a cluster replica."),
4962        ("process_id", "The ID of a process within the replica."),
4963        (
4964            "cpu_nano_cores",
4965            "Approximate CPU usage, in billionths of a vCPU core.",
4966        ),
4967        ("memory_bytes", "Approximate RAM usage, in bytes."),
4968        ("disk_bytes", "Approximate disk usage, in bytes."),
4969        (
4970            "heap_bytes",
4971            "Approximate heap (RAM + swap) usage, in bytes.",
4972        ),
4973        ("heap_limit", "Available heap (RAM + swap) space, in bytes."),
4974    ]),
4975    sql: "
4976SELECT
4977    DISTINCT ON (replica_id, process_id)
4978    replica_id,
4979    process_id,
4980    cpu_nano_cores,
4981    memory_bytes,
4982    disk_bytes,
4983    heap_bytes,
4984    heap_limit
4985FROM mz_internal.mz_cluster_replica_metrics_history
4986JOIN mz_cluster_replicas r ON r.id = replica_id
4987ORDER BY replica_id, process_id, occurred_at DESC",
4988    access: vec![PUBLIC_SELECT],
4989});
4990
4991pub static MZ_CLUSTER_REPLICA_FRONTIERS: LazyLock<BuiltinSource> =
4992    LazyLock::new(|| BuiltinSource {
4993        name: "mz_cluster_replica_frontiers",
4994        schema: MZ_CATALOG_SCHEMA,
4995        oid: oid::SOURCE_MZ_CLUSTER_REPLICA_FRONTIERS_OID,
4996        data_source: IntrospectionType::ReplicaFrontiers,
4997        desc: RelationDesc::builder()
4998            .with_column("object_id", SqlScalarType::String.nullable(false))
4999            .with_column("replica_id", SqlScalarType::String.nullable(false))
5000            .with_column("write_frontier", SqlScalarType::MzTimestamp.nullable(true))
5001            .finish(),
5002        column_comments: BTreeMap::from_iter([
5003            (
5004                "object_id",
5005                "The ID of the source, sink, index, materialized view, or subscription.",
5006            ),
5007            ("replica_id", "The ID of a cluster replica."),
5008            (
5009                "write_frontier",
5010                "The next timestamp at which the output may change.",
5011            ),
5012        ]),
5013        is_retained_metrics_object: false,
5014        access: vec![PUBLIC_SELECT],
5015    });
5016
5017pub static MZ_CLUSTER_REPLICA_FRONTIERS_IND: LazyLock<BuiltinIndex> =
5018    LazyLock::new(|| BuiltinIndex {
5019        name: "mz_cluster_replica_frontiers_ind",
5020        schema: MZ_CATALOG_SCHEMA,
5021        oid: oid::INDEX_MZ_CLUSTER_REPLICA_FRONTIERS_IND_OID,
5022        sql: "IN CLUSTER mz_catalog_server ON mz_catalog.mz_cluster_replica_frontiers (object_id)",
5023        is_retained_metrics_object: false,
5024    });
5025
5026pub static MZ_FRONTIERS: LazyLock<BuiltinSource> = LazyLock::new(|| BuiltinSource {
5027    name: "mz_frontiers",
5028    schema: MZ_INTERNAL_SCHEMA,
5029    oid: oid::SOURCE_MZ_FRONTIERS_OID,
5030    data_source: IntrospectionType::Frontiers,
5031    desc: RelationDesc::builder()
5032        .with_column("object_id", SqlScalarType::String.nullable(false))
5033        .with_column("read_frontier", SqlScalarType::MzTimestamp.nullable(true))
5034        .with_column("write_frontier", SqlScalarType::MzTimestamp.nullable(true))
5035        .finish(),
5036    column_comments: BTreeMap::from_iter([
5037        (
5038            "object_id",
5039            "The ID of the source, sink, table, index, materialized view, or subscription.",
5040        ),
5041        (
5042            "read_frontier",
5043            "The earliest timestamp at which the output is still readable.",
5044        ),
5045        (
5046            "write_frontier",
5047            "The next timestamp at which the output may change.",
5048        ),
5049    ]),
5050    is_retained_metrics_object: false,
5051    access: vec![PUBLIC_SELECT],
5052});
5053
5054/// DEPRECATED and scheduled for removal! Use `mz_frontiers` instead.
5055pub static MZ_GLOBAL_FRONTIERS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
5056    name: "mz_global_frontiers",
5057    schema: MZ_INTERNAL_SCHEMA,
5058    oid: oid::VIEW_MZ_GLOBAL_FRONTIERS_OID,
5059    desc: RelationDesc::builder()
5060        .with_column("object_id", SqlScalarType::String.nullable(false))
5061        .with_column("time", SqlScalarType::MzTimestamp.nullable(false))
5062        .finish(),
5063    column_comments: BTreeMap::new(),
5064    sql: "
5065SELECT object_id, write_frontier AS time
5066FROM mz_internal.mz_frontiers
5067WHERE write_frontier IS NOT NULL",
5068    access: vec![PUBLIC_SELECT],
5069});
5070
5071pub static MZ_WALLCLOCK_LAG_HISTORY: LazyLock<BuiltinSource> = LazyLock::new(|| BuiltinSource {
5072    name: "mz_wallclock_lag_history",
5073    schema: MZ_INTERNAL_SCHEMA,
5074    oid: oid::SOURCE_MZ_WALLCLOCK_LAG_HISTORY_OID,
5075    desc: WALLCLOCK_LAG_HISTORY_DESC.clone(),
5076    data_source: IntrospectionType::WallclockLagHistory,
5077    column_comments: BTreeMap::from_iter([
5078        (
5079            "object_id",
5080            "The ID of the table, source, materialized view, index, or sink. Corresponds to `mz_objects.id`.",
5081        ),
5082        (
5083            "replica_id",
5084            "The ID of a replica computing the object, or `NULL` for persistent objects. Corresponds to `mz_cluster_replicas.id`.",
5085        ),
5086        (
5087            "lag",
5088            "The amount of time the object's write frontier lags behind wallclock time.",
5089        ),
5090        (
5091            "occurred_at",
5092            "Wall-clock timestamp at which the event occurred.",
5093        ),
5094    ]),
5095    is_retained_metrics_object: false,
5096    access: vec![PUBLIC_SELECT],
5097});
5098
5099pub static MZ_WALLCLOCK_LAG_HISTORY_CT: LazyLock<BuiltinContinualTask> = LazyLock::new(|| {
5100    BuiltinContinualTask {
5101    name: "mz_wallclock_lag_history_ct",
5102    schema: MZ_INTERNAL_SCHEMA,
5103    oid: oid::CT_MZ_WALLCLOCK_LAG_HISTORY_OID,
5104    desc: WALLCLOCK_LAG_HISTORY_DESC.clone(),
5105    sql: "
5106IN CLUSTER mz_catalog_server
5107ON INPUT mz_internal.mz_wallclock_lag_history AS (
5108    DELETE FROM mz_internal.mz_wallclock_lag_history_ct WHERE occurred_at + '30d' < mz_now();
5109    INSERT INTO mz_internal.mz_wallclock_lag_history_ct SELECT * FROM mz_internal.mz_wallclock_lag_history;
5110)",
5111            access: vec![PUBLIC_SELECT],
5112        }
5113});
5114
5115pub static MZ_WALLCLOCK_GLOBAL_LAG_HISTORY: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
5116    name: "mz_wallclock_global_lag_history",
5117    schema: MZ_INTERNAL_SCHEMA,
5118    oid: oid::VIEW_MZ_WALLCLOCK_GLOBAL_LAG_HISTORY_OID,
5119    desc: RelationDesc::builder()
5120        .with_column("object_id", SqlScalarType::String.nullable(false))
5121        .with_column("lag", SqlScalarType::Interval.nullable(true))
5122        .with_column(
5123            "occurred_at",
5124            SqlScalarType::TimestampTz { precision: None }.nullable(false),
5125        )
5126        .with_key(vec![0, 2])
5127        .finish(),
5128    column_comments: BTreeMap::new(),
5129    sql: "
5130WITH times_binned AS (
5131    SELECT
5132        object_id,
5133        lag,
5134        date_trunc('minute', occurred_at) AS occurred_at
5135    FROM mz_internal.mz_wallclock_lag_history
5136)
5137SELECT
5138    object_id,
5139    min(lag) AS lag,
5140    occurred_at
5141FROM times_binned
5142GROUP BY object_id, occurred_at
5143OPTIONS (AGGREGATE INPUT GROUP SIZE = 1)",
5144    access: vec![PUBLIC_SELECT],
5145});
5146
5147pub static MZ_WALLCLOCK_GLOBAL_LAG_RECENT_HISTORY: LazyLock<BuiltinView> =
5148    LazyLock::new(|| BuiltinView {
5149        name: "mz_wallclock_global_lag_recent_history",
5150        schema: MZ_INTERNAL_SCHEMA,
5151        oid: oid::VIEW_MZ_WALLCLOCK_GLOBAL_LAG_RECENT_HISTORY_OID,
5152        desc: RelationDesc::builder()
5153            .with_column("object_id", SqlScalarType::String.nullable(false))
5154            .with_column("lag", SqlScalarType::Interval.nullable(true))
5155            .with_column(
5156                "occurred_at",
5157                SqlScalarType::TimestampTz { precision: None }.nullable(false),
5158            )
5159            .with_key(vec![0, 2])
5160            .finish(),
5161        column_comments: BTreeMap::new(),
5162        sql: "
5163SELECT object_id, lag, occurred_at
5164FROM mz_internal.mz_wallclock_global_lag_history
5165WHERE occurred_at + '1 day' > mz_now()",
5166        access: vec![PUBLIC_SELECT],
5167    });
5168
5169pub static MZ_WALLCLOCK_GLOBAL_LAG: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
5170    name: "mz_wallclock_global_lag",
5171    schema: MZ_INTERNAL_SCHEMA,
5172    oid: oid::VIEW_MZ_WALLCLOCK_GLOBAL_LAG_OID,
5173    desc: RelationDesc::builder()
5174        .with_column("object_id", SqlScalarType::String.nullable(false))
5175        .with_column("lag", SqlScalarType::Interval.nullable(true))
5176        .with_key(vec![0])
5177        .finish(),
5178    column_comments: BTreeMap::from_iter([
5179        (
5180            "object_id",
5181            "The ID of the table, source, materialized view, index, or sink. Corresponds to `mz_objects.id`.",
5182        ),
5183        (
5184            "lag",
5185            "The amount of time the object's write frontier lags behind wallclock time.",
5186        ),
5187    ]),
5188    sql: "
5189SELECT DISTINCT ON (object_id) object_id, lag
5190FROM mz_internal.mz_wallclock_global_lag_recent_history
5191WHERE occurred_at + '5 minutes' > mz_now()
5192ORDER BY object_id, occurred_at DESC",
5193    access: vec![PUBLIC_SELECT],
5194});
5195
5196pub static MZ_WALLCLOCK_GLOBAL_LAG_HISTOGRAM_RAW: LazyLock<BuiltinSource> =
5197    LazyLock::new(|| BuiltinSource {
5198        name: "mz_wallclock_global_lag_histogram_raw",
5199        schema: MZ_INTERNAL_SCHEMA,
5200        oid: oid::SOURCE_MZ_WALLCLOCK_GLOBAL_LAG_HISTOGRAM_RAW_OID,
5201        desc: WALLCLOCK_GLOBAL_LAG_HISTOGRAM_RAW_DESC.clone(),
5202        column_comments: BTreeMap::new(),
5203        data_source: IntrospectionType::WallclockLagHistogram,
5204        is_retained_metrics_object: false,
5205        access: vec![PUBLIC_SELECT],
5206    });
5207
5208pub static MZ_WALLCLOCK_GLOBAL_LAG_HISTOGRAM: LazyLock<BuiltinView> =
5209    LazyLock::new(|| BuiltinView {
5210        name: "mz_wallclock_global_lag_histogram",
5211        schema: MZ_INTERNAL_SCHEMA,
5212        oid: oid::VIEW_MZ_WALLCLOCK_GLOBAL_LAG_HISTOGRAM_OID,
5213        desc: RelationDesc::builder()
5214            .with_column(
5215                "period_start",
5216                SqlScalarType::TimestampTz { precision: None }.nullable(false),
5217            )
5218            .with_column(
5219                "period_end",
5220                SqlScalarType::TimestampTz { precision: None }.nullable(false),
5221            )
5222            .with_column("object_id", SqlScalarType::String.nullable(false))
5223            .with_column("lag_seconds", SqlScalarType::UInt64.nullable(true))
5224            .with_column("labels", SqlScalarType::Jsonb.nullable(false))
5225            .with_column("count", SqlScalarType::Int64.nullable(false))
5226            .with_key(vec![0, 1, 2, 3, 4])
5227            .finish(),
5228        column_comments: BTreeMap::new(),
5229        sql: "
5230SELECT *, count(*) AS count
5231FROM mz_internal.mz_wallclock_global_lag_histogram_raw
5232GROUP BY period_start, period_end, object_id, lag_seconds, labels",
5233        access: vec![PUBLIC_SELECT],
5234    });
5235
5236pub static MZ_MATERIALIZED_VIEW_REFRESHES: LazyLock<BuiltinSource> = LazyLock::new(|| {
5237    BuiltinSource {
5238        name: "mz_materialized_view_refreshes",
5239        schema: MZ_INTERNAL_SCHEMA,
5240        oid: oid::SOURCE_MZ_MATERIALIZED_VIEW_REFRESHES_OID,
5241        data_source: IntrospectionType::ComputeMaterializedViewRefreshes,
5242        desc: RelationDesc::builder()
5243            .with_column(
5244                "materialized_view_id",
5245                SqlScalarType::String.nullable(false),
5246            )
5247            .with_column(
5248                "last_completed_refresh",
5249                SqlScalarType::MzTimestamp.nullable(true),
5250            )
5251            .with_column("next_refresh", SqlScalarType::MzTimestamp.nullable(true))
5252            .finish(),
5253        column_comments: BTreeMap::from_iter([
5254            (
5255                "materialized_view_id",
5256                "The ID of the materialized view. Corresponds to `mz_catalog.mz_materialized_views.id`",
5257            ),
5258            (
5259                "last_completed_refresh",
5260                "The time of the last successfully completed refresh. `NULL` if the materialized view hasn't completed any refreshes yet.",
5261            ),
5262            (
5263                "next_refresh",
5264                "The time of the next scheduled refresh. `NULL` if the materialized view has no future scheduled refreshes.",
5265            ),
5266        ]),
5267        is_retained_metrics_object: false,
5268        access: vec![PUBLIC_SELECT],
5269    }
5270});
5271
5272pub static MZ_SUBSCRIPTIONS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
5273    name: "mz_subscriptions",
5274    schema: MZ_INTERNAL_SCHEMA,
5275    oid: oid::TABLE_MZ_SUBSCRIPTIONS_OID,
5276    desc: RelationDesc::builder()
5277        .with_column("id", SqlScalarType::String.nullable(false))
5278        .with_column("session_id", SqlScalarType::Uuid.nullable(false))
5279        .with_column("cluster_id", SqlScalarType::String.nullable(false))
5280        .with_column(
5281            "created_at",
5282            SqlScalarType::TimestampTz { precision: None }.nullable(false),
5283        )
5284        .with_column(
5285            "referenced_object_ids",
5286            SqlScalarType::List {
5287                element_type: Box::new(SqlScalarType::String),
5288                custom_id: None,
5289            }
5290            .nullable(false),
5291        )
5292        .finish(),
5293    column_comments: BTreeMap::from_iter([
5294        ("id", "The ID of the subscription."),
5295        (
5296            "session_id",
5297            "The ID of the session that runs the subscription. Corresponds to `mz_sessions.id`.",
5298        ),
5299        (
5300            "cluster_id",
5301            "The ID of the cluster on which the subscription is running. Corresponds to `mz_clusters.id`.",
5302        ),
5303        (
5304            "created_at",
5305            "The time at which the subscription was created.",
5306        ),
5307        (
5308            "referenced_object_ids",
5309            "The IDs of objects referenced by the subscription. Corresponds to `mz_objects.id`",
5310        ),
5311    ]),
5312    is_retained_metrics_object: false,
5313    access: vec![PUBLIC_SELECT],
5314});
5315
5316pub static MZ_SESSIONS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
5317    name: "mz_sessions",
5318    schema: MZ_INTERNAL_SCHEMA,
5319    oid: oid::TABLE_MZ_SESSIONS_OID,
5320    desc: RelationDesc::builder()
5321        .with_column("id", SqlScalarType::Uuid.nullable(false))
5322        .with_column("connection_id", SqlScalarType::UInt32.nullable(false))
5323        .with_column("role_id", SqlScalarType::String.nullable(false))
5324        .with_column("client_ip", SqlScalarType::String.nullable(true))
5325        .with_column(
5326            "connected_at",
5327            SqlScalarType::TimestampTz { precision: None }.nullable(false),
5328        )
5329        .finish(),
5330    column_comments: BTreeMap::from_iter([
5331        ("id", "The globally unique ID of the session."),
5332        (
5333            "connection_id",
5334            "The connection ID of the session. Unique only for active sessions and can be recycled. Corresponds to `pg_backend_pid()`.",
5335        ),
5336        (
5337            "role_id",
5338            "The role ID of the role that the session is logged in as. Corresponds to `mz_catalog.mz_roles`.",
5339        ),
5340        (
5341            "client_ip",
5342            "The IP address of the client that initiated the session.",
5343        ),
5344        (
5345            "connected_at",
5346            "The time at which the session connected to the system.",
5347        ),
5348    ]),
5349    is_retained_metrics_object: false,
5350    access: vec![PUBLIC_SELECT],
5351});
5352
5353pub static MZ_DEFAULT_PRIVILEGES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
5354    name: "mz_default_privileges",
5355    schema: MZ_CATALOG_SCHEMA,
5356    oid: oid::TABLE_MZ_DEFAULT_PRIVILEGES_OID,
5357    desc: RelationDesc::builder()
5358        .with_column("role_id", SqlScalarType::String.nullable(false))
5359        .with_column("database_id", SqlScalarType::String.nullable(true))
5360        .with_column("schema_id", SqlScalarType::String.nullable(true))
5361        .with_column("object_type", SqlScalarType::String.nullable(false))
5362        .with_column("grantee", SqlScalarType::String.nullable(false))
5363        .with_column("privileges", SqlScalarType::String.nullable(false))
5364        .finish(),
5365    column_comments: BTreeMap::from_iter([
5366        (
5367            "role_id",
5368            "Privileges described in this row will be granted on objects created by `role_id`. The role ID `p` stands for the `PUBLIC` pseudo-role and applies to all roles.",
5369        ),
5370        (
5371            "database_id",
5372            "Privileges described in this row will be granted only on objects in the database identified by `database_id` if non-null.",
5373        ),
5374        (
5375            "schema_id",
5376            "Privileges described in this row will be granted only on objects in the schema identified by `schema_id` if non-null.",
5377        ),
5378        (
5379            "object_type",
5380            "Privileges described in this row will be granted only on objects of type `object_type`.",
5381        ),
5382        (
5383            "grantee",
5384            "Privileges described in this row will be granted to `grantee`. The role ID `p` stands for the `PUBLIC` pseudo-role and applies to all roles.",
5385        ),
5386        ("privileges", "The set of privileges that will be granted."),
5387    ]),
5388    is_retained_metrics_object: false,
5389    access: vec![PUBLIC_SELECT],
5390});
5391
5392pub static MZ_SYSTEM_PRIVILEGES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
5393    name: "mz_system_privileges",
5394    schema: MZ_CATALOG_SCHEMA,
5395    oid: oid::TABLE_MZ_SYSTEM_PRIVILEGES_OID,
5396    desc: RelationDesc::builder()
5397        .with_column("privileges", SqlScalarType::MzAclItem.nullable(false))
5398        .finish(),
5399    column_comments: BTreeMap::from_iter([(
5400        "privileges",
5401        "The privileges belonging to the system.",
5402    )]),
5403    is_retained_metrics_object: false,
5404    access: vec![PUBLIC_SELECT],
5405});
5406
5407pub static MZ_COMMENTS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
5408    name: "mz_comments",
5409    schema: MZ_INTERNAL_SCHEMA,
5410    oid: oid::TABLE_MZ_COMMENTS_OID,
5411    desc: RelationDesc::builder()
5412        .with_column("id", SqlScalarType::String.nullable(false))
5413        .with_column("object_type", SqlScalarType::String.nullable(false))
5414        .with_column("object_sub_id", SqlScalarType::Int32.nullable(true))
5415        .with_column("comment", SqlScalarType::String.nullable(false))
5416        .finish(),
5417    column_comments: BTreeMap::from_iter([
5418        (
5419            "id",
5420            "The ID of the object. Corresponds to `mz_objects.id`.",
5421        ),
5422        (
5423            "object_type",
5424            "The type of object the comment is associated with.",
5425        ),
5426        (
5427            "object_sub_id",
5428            "For a comment on a column of a relation, the column number. `NULL` for other object types.",
5429        ),
5430        ("comment", "The comment itself."),
5431    ]),
5432    is_retained_metrics_object: false,
5433    access: vec![PUBLIC_SELECT],
5434});
5435
5436pub static MZ_SOURCE_REFERENCES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
5437    name: "mz_source_references",
5438    schema: MZ_INTERNAL_SCHEMA,
5439    oid: oid::TABLE_MZ_SOURCE_REFERENCES_OID,
5440    desc: RelationDesc::builder()
5441        .with_column("source_id", SqlScalarType::String.nullable(false))
5442        .with_column("namespace", SqlScalarType::String.nullable(true))
5443        .with_column("name", SqlScalarType::String.nullable(false))
5444        .with_column(
5445            "updated_at",
5446            SqlScalarType::TimestampTz { precision: None }.nullable(false),
5447        )
5448        .with_column(
5449            "columns",
5450            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(true),
5451        )
5452        .finish(),
5453    column_comments: BTreeMap::new(),
5454    is_retained_metrics_object: false,
5455    access: vec![PUBLIC_SELECT],
5456});
5457
5458pub static MZ_WEBHOOKS_SOURCES: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
5459    name: "mz_webhook_sources",
5460    schema: MZ_INTERNAL_SCHEMA,
5461    oid: oid::TABLE_MZ_WEBHOOK_SOURCES_OID,
5462    desc: RelationDesc::builder()
5463        .with_column("id", SqlScalarType::String.nullable(false))
5464        .with_column("name", SqlScalarType::String.nullable(false))
5465        .with_column("url", SqlScalarType::String.nullable(false))
5466        .finish(),
5467    column_comments: BTreeMap::from_iter([
5468        (
5469            "id",
5470            "The ID of the webhook source. Corresponds to `mz_sources.id`.",
5471        ),
5472        ("name", "The name of the webhook source."),
5473        (
5474            "url",
5475            "The URL which can be used to send events to the source.",
5476        ),
5477    ]),
5478    is_retained_metrics_object: false,
5479    access: vec![PUBLIC_SELECT],
5480});
5481
5482pub static MZ_HISTORY_RETENTION_STRATEGIES: LazyLock<BuiltinTable> = LazyLock::new(|| {
5483    BuiltinTable {
5484        name: "mz_history_retention_strategies",
5485        schema: MZ_INTERNAL_SCHEMA,
5486        oid: oid::TABLE_MZ_HISTORY_RETENTION_STRATEGIES_OID,
5487        desc: RelationDesc::builder()
5488            .with_column("id", SqlScalarType::String.nullable(false))
5489            .with_column("strategy", SqlScalarType::String.nullable(false))
5490            .with_column("value", SqlScalarType::Jsonb.nullable(false))
5491            .finish(),
5492        column_comments: BTreeMap::from_iter([
5493            ("id", "The ID of the object."),
5494            (
5495                "strategy",
5496                "The strategy. `FOR` is the only strategy, and means the object's compaction window is the duration of the `value` field.",
5497            ),
5498            (
5499                "value",
5500                "The value of the strategy. For `FOR`, is a number of milliseconds.",
5501            ),
5502        ]),
5503        is_retained_metrics_object: false,
5504        access: vec![PUBLIC_SELECT],
5505    }
5506});
5507
5508pub static MZ_LICENSE_KEYS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
5509    name: "mz_license_keys",
5510    schema: MZ_INTERNAL_SCHEMA,
5511    oid: oid::TABLE_MZ_LICENSE_KEYS_OID,
5512    desc: RelationDesc::builder()
5513        .with_column("id", SqlScalarType::String.nullable(false))
5514        .with_column("organization", SqlScalarType::String.nullable(false))
5515        .with_column("environment_id", SqlScalarType::String.nullable(false))
5516        .with_column(
5517            "expiration",
5518            SqlScalarType::TimestampTz { precision: None }.nullable(false),
5519        )
5520        .with_column(
5521            "not_before",
5522            SqlScalarType::TimestampTz { precision: None }.nullable(false),
5523        )
5524        .finish(),
5525    column_comments: BTreeMap::from_iter([
5526        ("id", "The identifier of the license key."),
5527        (
5528            "organization",
5529            "The name of the organization that this license key was issued to.",
5530        ),
5531        (
5532            "environment_id",
5533            "The environment ID that this license key was issued for.",
5534        ),
5535        (
5536            "expiration",
5537            "The date and time when this license key expires.",
5538        ),
5539        (
5540            "not_before",
5541            "The start of the validity period for this license key.",
5542        ),
5543    ]),
5544    is_retained_metrics_object: false,
5545    access: vec![PUBLIC_SELECT],
5546});
5547
5548pub static MZ_REPLACEMENTS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
5549    name: "mz_replacements",
5550    schema: MZ_INTERNAL_SCHEMA,
5551    oid: oid::TABLE_MZ_REPLACEMENTS_OID,
5552    desc: RelationDesc::builder()
5553        .with_column("id", SqlScalarType::String.nullable(false))
5554        .with_column("target_id", SqlScalarType::String.nullable(false))
5555        .finish(),
5556    column_comments: BTreeMap::from_iter([
5557        (
5558            "id",
5559            "The ID of the replacement object. Corresponds to `mz_objects.id`.",
5560        ),
5561        (
5562            "target_id",
5563            "The ID of the replacement target. Corresponds to `mz_objects.id`.",
5564        ),
5565    ]),
5566    is_retained_metrics_object: false,
5567    access: vec![PUBLIC_SELECT],
5568});
5569
5570// These will be replaced with per-replica tables once source/sink multiplexing on
5571// a single cluster is supported.
5572pub static MZ_SOURCE_STATISTICS_RAW: LazyLock<BuiltinSource> = LazyLock::new(|| BuiltinSource {
5573    name: "mz_source_statistics_raw",
5574    schema: MZ_INTERNAL_SCHEMA,
5575    oid: oid::SOURCE_MZ_SOURCE_STATISTICS_RAW_OID,
5576    data_source: IntrospectionType::StorageSourceStatistics,
5577    desc: MZ_SOURCE_STATISTICS_RAW_DESC.clone(),
5578    column_comments: BTreeMap::new(),
5579    is_retained_metrics_object: true,
5580    access: vec![PUBLIC_SELECT],
5581});
5582pub static MZ_SINK_STATISTICS_RAW: LazyLock<BuiltinSource> = LazyLock::new(|| BuiltinSource {
5583    name: "mz_sink_statistics_raw",
5584    schema: MZ_INTERNAL_SCHEMA,
5585    oid: oid::SOURCE_MZ_SINK_STATISTICS_RAW_OID,
5586    data_source: IntrospectionType::StorageSinkStatistics,
5587    desc: MZ_SINK_STATISTICS_RAW_DESC.clone(),
5588    column_comments: BTreeMap::new(),
5589    is_retained_metrics_object: true,
5590    access: vec![PUBLIC_SELECT],
5591});
5592
5593pub static MZ_STORAGE_SHARDS: LazyLock<BuiltinSource> = LazyLock::new(|| BuiltinSource {
5594    name: "mz_storage_shards",
5595    schema: MZ_INTERNAL_SCHEMA,
5596    oid: oid::SOURCE_MZ_STORAGE_SHARDS_OID,
5597    data_source: IntrospectionType::ShardMapping,
5598    desc: RelationDesc::builder()
5599        .with_column("object_id", SqlScalarType::String.nullable(false))
5600        .with_column("shard_id", SqlScalarType::String.nullable(false))
5601        .finish(),
5602    column_comments: BTreeMap::new(),
5603    is_retained_metrics_object: false,
5604    access: vec![PUBLIC_SELECT],
5605});
5606
5607pub static MZ_STORAGE_USAGE: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
5608    name: "mz_storage_usage",
5609    schema: MZ_CATALOG_SCHEMA,
5610    oid: oid::VIEW_MZ_STORAGE_USAGE_OID,
5611    desc: RelationDesc::builder()
5612        .with_column("object_id", SqlScalarType::String.nullable(false))
5613        .with_column("size_bytes", SqlScalarType::UInt64.nullable(false))
5614        .with_column(
5615            "collection_timestamp",
5616            SqlScalarType::TimestampTz { precision: None }.nullable(false),
5617        )
5618        .with_key(vec![0, 2])
5619        .finish(),
5620    column_comments: BTreeMap::from_iter([
5621        (
5622            "object_id",
5623            "The ID of the table, source, or materialized view.",
5624        ),
5625        (
5626            "size_bytes",
5627            "The number of storage bytes used by the object.",
5628        ),
5629        (
5630            "collection_timestamp",
5631            "The time at which storage usage of the object was assessed.",
5632        ),
5633    ]),
5634    sql: "
5635SELECT
5636    object_id,
5637    sum(size_bytes)::uint8 AS size_bytes,
5638    collection_timestamp
5639FROM
5640    mz_internal.mz_storage_shards
5641    JOIN mz_internal.mz_storage_usage_by_shard USING (shard_id)
5642GROUP BY object_id, collection_timestamp",
5643    access: vec![PUBLIC_SELECT],
5644});
5645
5646pub static MZ_RECENT_STORAGE_USAGE: LazyLock<BuiltinView> = LazyLock::new(|| {
5647    BuiltinView {
5648    name: "mz_recent_storage_usage",
5649    schema: MZ_CATALOG_SCHEMA,
5650    oid: oid::VIEW_MZ_RECENT_STORAGE_USAGE_OID,
5651    desc: RelationDesc::builder()
5652        .with_column("object_id", SqlScalarType::String.nullable(false))
5653        .with_column("size_bytes", SqlScalarType::UInt64.nullable(true))
5654        .with_key(vec![0])
5655        .finish(),
5656    column_comments: BTreeMap::from_iter([
5657        ("object_id", "The ID of the table, source, or materialized view."),
5658        ("size_bytes", "The number of storage bytes used by the object in the most recent assessment."),
5659    ]),
5660    sql: "
5661WITH
5662
5663recent_storage_usage_by_shard AS (
5664    SELECT shard_id, size_bytes, collection_timestamp
5665    FROM mz_internal.mz_storage_usage_by_shard
5666    -- Restricting to the last 6 hours makes it feasible to index the view.
5667    WHERE collection_timestamp + '6 hours' >= mz_now()
5668),
5669
5670most_recent_collection_timestamp_by_shard AS (
5671    SELECT shard_id, max(collection_timestamp) AS collection_timestamp
5672    FROM recent_storage_usage_by_shard
5673    GROUP BY shard_id
5674)
5675
5676SELECT
5677    object_id,
5678    sum(size_bytes)::uint8 AS size_bytes
5679FROM
5680    mz_internal.mz_storage_shards
5681    LEFT JOIN most_recent_collection_timestamp_by_shard
5682        ON mz_storage_shards.shard_id = most_recent_collection_timestamp_by_shard.shard_id
5683    LEFT JOIN recent_storage_usage_by_shard
5684        ON mz_storage_shards.shard_id = recent_storage_usage_by_shard.shard_id
5685        AND most_recent_collection_timestamp_by_shard.collection_timestamp = recent_storage_usage_by_shard.collection_timestamp
5686GROUP BY object_id",
5687    access: vec![PUBLIC_SELECT],
5688}
5689});
5690
5691pub static MZ_RECENT_STORAGE_USAGE_IND: LazyLock<BuiltinIndex> = LazyLock::new(|| BuiltinIndex {
5692    name: "mz_recent_storage_usage_ind",
5693    schema: MZ_CATALOG_SCHEMA,
5694    oid: oid::INDEX_MZ_RECENT_STORAGE_USAGE_IND_OID,
5695    sql: "IN CLUSTER mz_catalog_server ON mz_catalog.mz_recent_storage_usage (object_id)",
5696    is_retained_metrics_object: false,
5697});
5698
5699pub static MZ_RELATIONS: LazyLock<BuiltinView> = LazyLock::new(|| {
5700    BuiltinView {
5701        name: "mz_relations",
5702        schema: MZ_CATALOG_SCHEMA,
5703        oid: oid::VIEW_MZ_RELATIONS_OID,
5704        desc: RelationDesc::builder()
5705            .with_column("id", SqlScalarType::String.nullable(false))
5706            .with_column("oid", SqlScalarType::Oid.nullable(false))
5707            .with_column("schema_id", SqlScalarType::String.nullable(false))
5708            .with_column("name", SqlScalarType::String.nullable(false))
5709            .with_column("type", SqlScalarType::String.nullable(false))
5710            .with_column("owner_id", SqlScalarType::String.nullable(false))
5711            .with_column("cluster_id", SqlScalarType::String.nullable(true))
5712            .with_column("privileges", SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(false))
5713            .finish(),
5714        column_comments: BTreeMap::from_iter([
5715            ("id", "Materialize's unique ID for the relation."),
5716            ("oid", "A [PostgreSQL-compatible OID][`oid`] for the relation."),
5717            ("schema_id", "The ID of the schema to which the relation belongs. Corresponds to `mz_schemas.id`."),
5718            ("name", "The name of the relation."),
5719            ("type", "The type of the relation: either `table`, `source`, `view`, or `materialized view`."),
5720            ("owner_id", "The role ID of the owner of the relation. Corresponds to `mz_roles.id`."),
5721            ("cluster_id", "The ID of the cluster maintaining the source, materialized view, index, or sink. Corresponds to `mz_clusters.id`. `NULL` for other object types."),
5722            ("privileges", "The privileges belonging to the relation."),
5723        ]),
5724        sql: "
5725      SELECT id, oid, schema_id, name, 'table' AS type, owner_id, NULL::text AS cluster_id, privileges FROM mz_catalog.mz_tables
5726UNION ALL SELECT id, oid, schema_id, name, 'source', owner_id, cluster_id, privileges FROM mz_catalog.mz_sources
5727UNION ALL SELECT id, oid, schema_id, name, 'view', owner_id, NULL::text, privileges FROM mz_catalog.mz_views
5728UNION ALL SELECT id, oid, schema_id, name, 'materialized-view', owner_id, cluster_id, privileges FROM mz_catalog.mz_materialized_views
5729UNION ALL SELECT id, oid, schema_id, name, 'continual-task', owner_id, cluster_id, privileges FROM mz_internal.mz_continual_tasks",
5730        access: vec![PUBLIC_SELECT],
5731    }
5732});
5733
5734pub static MZ_OBJECTS_ID_NAMESPACE_TYPES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
5735    name: "mz_objects_id_namespace_types",
5736    schema: MZ_INTERNAL_SCHEMA,
5737    oid: oid::VIEW_MZ_OBJECTS_ID_NAMESPACE_TYPES_OID,
5738    desc: RelationDesc::builder()
5739        .with_column("object_type", SqlScalarType::String.nullable(false))
5740        .with_key(vec![0])
5741        .finish(),
5742    column_comments: BTreeMap::new(),
5743    sql: r#"SELECT *
5744    FROM (
5745        VALUES
5746            ('table'),
5747            ('view'),
5748            ('materialized-view'),
5749            ('source'),
5750            ('sink'),
5751            ('index'),
5752            ('connection'),
5753            ('type'),
5754            ('function'),
5755            ('secret')
5756    )
5757    AS _ (object_type)"#,
5758    access: vec![PUBLIC_SELECT],
5759});
5760
5761pub static MZ_OBJECT_OID_ALIAS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
5762    name: "mz_object_oid_alias",
5763    schema: MZ_INTERNAL_SCHEMA,
5764    oid: oid::VIEW_MZ_OBJECT_OID_ALIAS_OID,
5765    desc: RelationDesc::builder()
5766        .with_column("object_type", SqlScalarType::String.nullable(false))
5767        .with_column("oid_alias", SqlScalarType::String.nullable(false))
5768        .with_key(vec![0])
5769        .finish(),
5770    column_comments: BTreeMap::new(),
5771    sql: "SELECT object_type, oid_alias
5772    FROM (
5773        VALUES
5774            (
5775                'table'::pg_catalog.text,
5776                'regclass'::pg_catalog.text
5777            ),
5778            ('source', 'regclass'),
5779            ('view', 'regclass'),
5780            ('materialized-view', 'regclass'),
5781            ('index', 'regclass'),
5782            ('type', 'regtype'),
5783            ('function', 'regproc')
5784    )
5785    AS _ (object_type, oid_alias);",
5786    access: vec![PUBLIC_SELECT],
5787});
5788
5789pub static MZ_OBJECTS: LazyLock<BuiltinView> = LazyLock::new(|| {
5790    BuiltinView {
5791        name: "mz_objects",
5792        schema: MZ_CATALOG_SCHEMA,
5793        oid: oid::VIEW_MZ_OBJECTS_OID,
5794        desc: RelationDesc::builder()
5795            .with_column("id", SqlScalarType::String.nullable(false))
5796            .with_column("oid", SqlScalarType::Oid.nullable(false))
5797            .with_column("schema_id", SqlScalarType::String.nullable(false))
5798            .with_column("name", SqlScalarType::String.nullable(false))
5799            .with_column("type", SqlScalarType::String.nullable(false))
5800            .with_column("owner_id", SqlScalarType::String.nullable(false))
5801            .with_column("cluster_id", SqlScalarType::String.nullable(true))
5802            .with_column("privileges", SqlScalarType::Array(Box::new(SqlScalarType::MzAclItem)).nullable(true))
5803            .finish(),
5804        column_comments: BTreeMap::from_iter([
5805            ("id", "Materialize's unique ID for the object."),
5806            ("oid", "A [PostgreSQL-compatible OID][`oid`] for the object."),
5807            ("schema_id", "The ID of the schema to which the object belongs. Corresponds to `mz_schemas.id`."),
5808            ("name", "The name of the object."),
5809            ("type", "The type of the object: one of `table`, `source`, `view`, `materialized-view`, `sink`, `index`, `connection`, `secret`, `type`, or `function`."),
5810            ("owner_id", "The role ID of the owner of the object. Corresponds to `mz_roles.id`."),
5811            ("cluster_id", "The ID of the cluster maintaining the source, materialized view, index, or sink. Corresponds to `mz_clusters.id`. `NULL` for other object types."),
5812            ("privileges", "The privileges belonging to the object."),
5813        ]),
5814        sql:
5815        "SELECT id, oid, schema_id, name, type, owner_id, cluster_id, privileges FROM mz_catalog.mz_relations
5816UNION ALL
5817    SELECT id, oid, schema_id, name, 'sink', owner_id, cluster_id, NULL::mz_catalog.mz_aclitem[] FROM mz_catalog.mz_sinks
5818UNION ALL
5819    SELECT mz_indexes.id, mz_indexes.oid, mz_relations.schema_id, mz_indexes.name, 'index', mz_indexes.owner_id, mz_indexes.cluster_id, NULL::mz_catalog.mz_aclitem[]
5820    FROM mz_catalog.mz_indexes
5821    JOIN mz_catalog.mz_relations ON mz_indexes.on_id = mz_relations.id
5822UNION ALL
5823    SELECT id, oid, schema_id, name, 'connection', owner_id, NULL::text, privileges FROM mz_catalog.mz_connections
5824UNION ALL
5825    SELECT id, oid, schema_id, name, 'type', owner_id, NULL::text, privileges FROM mz_catalog.mz_types
5826UNION ALL
5827    SELECT id, oid, schema_id, name, 'function', owner_id, NULL::text, NULL::mz_catalog.mz_aclitem[] FROM mz_catalog.mz_functions
5828UNION ALL
5829    SELECT id, oid, schema_id, name, 'secret', owner_id, NULL::text, privileges FROM mz_catalog.mz_secrets",
5830        access: vec![PUBLIC_SELECT],
5831    }
5832});
5833
5834pub static MZ_OBJECT_FULLY_QUALIFIED_NAMES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
5835    name: "mz_object_fully_qualified_names",
5836    schema: MZ_INTERNAL_SCHEMA,
5837    oid: oid::VIEW_MZ_OBJECT_FULLY_QUALIFIED_NAMES_OID,
5838    desc: RelationDesc::builder()
5839        .with_column("id", SqlScalarType::String.nullable(false))
5840        .with_column("name", SqlScalarType::String.nullable(false))
5841        .with_column("object_type", SqlScalarType::String.nullable(false))
5842        .with_column("schema_id", SqlScalarType::String.nullable(false))
5843        .with_column("schema_name", SqlScalarType::String.nullable(false))
5844        .with_column("database_id", SqlScalarType::String.nullable(true))
5845        .with_column("database_name", SqlScalarType::String.nullable(true))
5846        .with_column("cluster_id", SqlScalarType::String.nullable(true))
5847        .finish(),
5848    column_comments: BTreeMap::from_iter([
5849        ("id", "Materialize's unique ID for the object."),
5850        ("name", "The name of the object."),
5851        (
5852            "object_type",
5853            "The type of the object: one of `table`, `source`, `view`, `materialized view`, `sink`, `index`, `connection`, `secret`, `type`, or `function`.",
5854        ),
5855        (
5856            "schema_id",
5857            "The ID of the schema to which the object belongs. Corresponds to `mz_schemas.id`.",
5858        ),
5859        (
5860            "schema_name",
5861            "The name of the schema to which the object belongs. Corresponds to `mz_schemas.name`.",
5862        ),
5863        (
5864            "database_id",
5865            "The ID of the database to which the object belongs. Corresponds to `mz_databases.id`.",
5866        ),
5867        (
5868            "database_name",
5869            "The name of the database to which the object belongs. Corresponds to `mz_databases.name`.",
5870        ),
5871        (
5872            "cluster_id",
5873            "The ID of the cluster maintaining the source, materialized view, index, or sink. Corresponds to `mz_clusters.id`. `NULL` for other object types.",
5874        ),
5875    ]),
5876    sql: "
5877    SELECT o.id,
5878        o.name,
5879        o.type as object_type,
5880        sc.id as schema_id,
5881        sc.name as schema_name,
5882        db.id as database_id,
5883        db.name as database_name,
5884        o.cluster_id
5885    FROM mz_catalog.mz_objects o
5886    INNER JOIN mz_catalog.mz_schemas sc ON sc.id = o.schema_id
5887    -- LEFT JOIN accounts for objects in the ambient database.
5888    LEFT JOIN mz_catalog.mz_databases db ON db.id = sc.database_id",
5889    access: vec![PUBLIC_SELECT],
5890});
5891
5892pub static MZ_OBJECT_GLOBAL_IDS: LazyLock<BuiltinTable> = LazyLock::new(|| BuiltinTable {
5893    name: "mz_object_global_ids",
5894    schema: MZ_INTERNAL_SCHEMA,
5895    oid: oid::VIEW_MZ_OBJECT_GLOBAL_IDS_OID,
5896    desc: RelationDesc::builder()
5897        .with_column("id", SqlScalarType::String.nullable(false))
5898        .with_column("global_id", SqlScalarType::String.nullable(false))
5899        .finish(),
5900    column_comments: BTreeMap::from_iter([
5901        ("id", "Materialize's unique catalog item ID for the object."),
5902        ("global_id", "A global ID for the object."),
5903    ]),
5904    is_retained_metrics_object: false,
5905    access: vec![PUBLIC_SELECT],
5906});
5907
5908// TODO (SangJunBak): Remove once mz_object_history is released and used in the Console https://github.com/MaterializeInc/console/issues/3342
5909pub static MZ_OBJECT_LIFETIMES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
5910    name: "mz_object_lifetimes",
5911    schema: MZ_INTERNAL_SCHEMA,
5912    oid: oid::VIEW_MZ_OBJECT_LIFETIMES_OID,
5913    desc: RelationDesc::builder()
5914        .with_column("id", SqlScalarType::String.nullable(true))
5915        .with_column("previous_id", SqlScalarType::String.nullable(true))
5916        .with_column("object_type", SqlScalarType::String.nullable(false))
5917        .with_column("event_type", SqlScalarType::String.nullable(false))
5918        .with_column(
5919            "occurred_at",
5920            SqlScalarType::TimestampTz { precision: None }.nullable(false),
5921        )
5922        .finish(),
5923    column_comments: BTreeMap::from_iter([
5924        ("id", "Materialize's unique ID for the object."),
5925        ("previous_id", "The object's previous ID, if one exists."),
5926        (
5927            "object_type",
5928            "The type of the object: one of `table`, `source`, `view`, `materialized view`, `sink`, `index`, `connection`, `secret`, `type`, or `function`.",
5929        ),
5930        (
5931            "event_type",
5932            "The lifetime event, either `create` or `drop`.",
5933        ),
5934        (
5935            "occurred_at",
5936            "Wall-clock timestamp of when the event occurred.",
5937        ),
5938    ]),
5939    sql: "
5940    SELECT
5941        CASE
5942            WHEN a.object_type = 'cluster-replica' THEN a.details ->> 'replica_id'
5943            ELSE a.details ->> 'id'
5944        END id,
5945        a.details ->> 'previous_id' as previous_id,
5946        a.object_type,
5947        a.event_type,
5948        a.occurred_at
5949    FROM mz_catalog.mz_audit_events a
5950    WHERE a.event_type = 'create' OR a.event_type = 'drop'",
5951    access: vec![PUBLIC_SELECT],
5952});
5953
5954pub static MZ_OBJECT_HISTORY: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
5955    name: "mz_object_history",
5956    schema: MZ_INTERNAL_SCHEMA,
5957    oid: oid::VIEW_MZ_OBJECT_HISTORY_OID,
5958    desc: RelationDesc::builder()
5959        .with_column("id", SqlScalarType::String.nullable(true))
5960        .with_column("cluster_id", SqlScalarType::String.nullable(true))
5961        .with_column("object_type", SqlScalarType::String.nullable(false))
5962        .with_column(
5963            "created_at",
5964            SqlScalarType::TimestampTz { precision: None }.nullable(true),
5965        )
5966        .with_column(
5967            "dropped_at",
5968            SqlScalarType::TimestampTz { precision: None }.nullable(true),
5969        )
5970        .finish(),
5971    column_comments: BTreeMap::from_iter([
5972        ("id", "Materialize's unique ID for the object."),
5973        (
5974            "cluster_id",
5975            "The object's cluster ID. `NULL` if the object has no associated cluster.",
5976        ),
5977        (
5978            "object_type",
5979            "The type of the object: one of `table`, `source`, `view`, `materialized view`, `sink`, `index`, `connection`, `secret`, `type`, or `function`.",
5980        ),
5981        (
5982            "created_at",
5983            "Wall-clock timestamp of when the object was created. `NULL` for built in system objects.",
5984        ),
5985        (
5986            "dropped_at",
5987            "Wall-clock timestamp of when the object was dropped. `NULL` for built in system objects or if the object hasn't been dropped.",
5988        ),
5989    ]),
5990    sql: r#"
5991    WITH
5992        creates AS
5993        (
5994            SELECT
5995                details ->> 'id' AS id,
5996                -- We need to backfill cluster_id since older object create events don't include the cluster ID in the audit log
5997                COALESCE(details ->> 'cluster_id', objects.cluster_id) AS cluster_id,
5998                object_type,
5999                occurred_at
6000            FROM
6001                mz_catalog.mz_audit_events AS events
6002                    LEFT JOIN mz_catalog.mz_objects AS objects ON details ->> 'id' = objects.id
6003            WHERE event_type = 'create' AND object_type IN ( SELECT object_type FROM mz_internal.mz_objects_id_namespace_types )
6004        ),
6005        drops AS
6006        (
6007            SELECT details ->> 'id' AS id, occurred_at
6008            FROM mz_catalog.mz_audit_events
6009            WHERE event_type = 'drop' AND object_type IN ( SELECT object_type FROM mz_internal.mz_objects_id_namespace_types )
6010        ),
6011        user_object_history AS
6012        (
6013            SELECT
6014                creates.id,
6015                creates.cluster_id,
6016                creates.object_type,
6017                creates.occurred_at AS created_at,
6018                drops.occurred_at AS dropped_at
6019            FROM creates LEFT JOIN drops ON creates.id = drops.id
6020            WHERE creates.id LIKE 'u%'
6021        ),
6022        -- We need to union built in objects since they aren't in the audit log
6023        built_in_objects AS
6024        (
6025            -- Functions that accept different arguments have different oids but the same id. We deduplicate in this case.
6026            SELECT DISTINCT ON (objects.id)
6027                objects.id,
6028                objects.cluster_id,
6029                objects.type AS object_type,
6030                NULL::timestamptz AS created_at,
6031                NULL::timestamptz AS dropped_at
6032            FROM mz_catalog.mz_objects AS objects
6033            WHERE objects.id LIKE 's%'
6034        )
6035    SELECT * FROM user_object_history UNION ALL (SELECT * FROM built_in_objects)"#,
6036    access: vec![PUBLIC_SELECT],
6037});
6038
6039pub static MZ_DATAFLOWS_PER_WORKER: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6040    name: "mz_dataflows_per_worker",
6041    schema: MZ_INTROSPECTION_SCHEMA,
6042    oid: oid::VIEW_MZ_DATAFLOWS_PER_WORKER_OID,
6043    desc: RelationDesc::builder()
6044        .with_column("id", SqlScalarType::UInt64.nullable(true))
6045        .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
6046        .with_column("name", SqlScalarType::String.nullable(false))
6047        .finish(),
6048    column_comments: BTreeMap::new(),
6049    sql: "SELECT
6050    addrs.address[1] AS id,
6051    ops.worker_id,
6052    ops.name
6053FROM
6054    mz_introspection.mz_dataflow_addresses_per_worker addrs,
6055    mz_introspection.mz_dataflow_operators_per_worker ops
6056WHERE
6057    addrs.id = ops.id AND
6058    addrs.worker_id = ops.worker_id AND
6059    mz_catalog.list_length(addrs.address) = 1",
6060    access: vec![PUBLIC_SELECT],
6061});
6062
6063pub static MZ_DATAFLOWS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6064    name: "mz_dataflows",
6065    schema: MZ_INTROSPECTION_SCHEMA,
6066    oid: oid::VIEW_MZ_DATAFLOWS_OID,
6067    desc: RelationDesc::builder()
6068        .with_column("id", SqlScalarType::UInt64.nullable(true))
6069        .with_column("name", SqlScalarType::String.nullable(false))
6070        .finish(),
6071    column_comments: BTreeMap::from_iter([
6072        ("id", "The ID of the dataflow."),
6073        ("name", "The internal name of the dataflow."),
6074    ]),
6075    sql: "
6076SELECT id, name
6077FROM mz_introspection.mz_dataflows_per_worker
6078WHERE worker_id = 0",
6079    access: vec![PUBLIC_SELECT],
6080});
6081
6082pub static MZ_DATAFLOW_ADDRESSES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6083    name: "mz_dataflow_addresses",
6084    schema: MZ_INTROSPECTION_SCHEMA,
6085    oid: oid::VIEW_MZ_DATAFLOW_ADDRESSES_OID,
6086    desc: RelationDesc::builder()
6087        .with_column("id", SqlScalarType::UInt64.nullable(false))
6088        .with_column(
6089            "address",
6090            SqlScalarType::List {
6091                element_type: Box::new(SqlScalarType::UInt64),
6092                custom_id: None,
6093            }
6094            .nullable(false),
6095        )
6096        .finish(),
6097    column_comments: BTreeMap::from_iter([
6098        (
6099            "id",
6100            "The ID of the channel or operator. Corresponds to `mz_dataflow_channels.id` or `mz_dataflow_operators.id`.",
6101        ),
6102        (
6103            "address",
6104            "A list of scope-local indexes indicating the path from the root to this channel or operator.",
6105        ),
6106    ]),
6107    sql: "
6108SELECT id, address
6109FROM mz_introspection.mz_dataflow_addresses_per_worker
6110WHERE worker_id = 0",
6111    access: vec![PUBLIC_SELECT],
6112});
6113
6114pub static MZ_DATAFLOW_CHANNELS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6115    name: "mz_dataflow_channels",
6116    schema: MZ_INTROSPECTION_SCHEMA,
6117    oid: oid::VIEW_MZ_DATAFLOW_CHANNELS_OID,
6118    desc: RelationDesc::builder()
6119        .with_column("id", SqlScalarType::UInt64.nullable(false))
6120        .with_column("from_index", SqlScalarType::UInt64.nullable(false))
6121        .with_column("from_port", SqlScalarType::UInt64.nullable(false))
6122        .with_column("to_index", SqlScalarType::UInt64.nullable(false))
6123        .with_column("to_port", SqlScalarType::UInt64.nullable(false))
6124        .with_column("type", SqlScalarType::String.nullable(false))
6125        .finish(),
6126    column_comments: BTreeMap::from_iter([
6127        ("id", "The ID of the channel."),
6128        (
6129            "from_index",
6130            "The scope-local index of the source operator. Corresponds to `mz_dataflow_addresses.address`.",
6131        ),
6132        ("from_port", "The source operator's output port."),
6133        (
6134            "to_index",
6135            "The scope-local index of the target operator. Corresponds to `mz_dataflow_addresses.address`.",
6136        ),
6137        ("to_port", "The target operator's input port."),
6138        ("type", "The container type of the channel."),
6139    ]),
6140    sql: "
6141SELECT id, from_index, from_port, to_index, to_port, type
6142FROM mz_introspection.mz_dataflow_channels_per_worker
6143WHERE worker_id = 0",
6144    access: vec![PUBLIC_SELECT],
6145});
6146
6147pub static MZ_DATAFLOW_OPERATORS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6148    name: "mz_dataflow_operators",
6149    schema: MZ_INTROSPECTION_SCHEMA,
6150    oid: oid::VIEW_MZ_DATAFLOW_OPERATORS_OID,
6151    desc: RelationDesc::builder()
6152        .with_column("id", SqlScalarType::UInt64.nullable(false))
6153        .with_column("name", SqlScalarType::String.nullable(false))
6154        .finish(),
6155    column_comments: BTreeMap::from_iter([
6156        ("id", "The ID of the operator."),
6157        ("name", "The internal name of the operator."),
6158    ]),
6159    sql: "
6160SELECT id, name
6161FROM mz_introspection.mz_dataflow_operators_per_worker
6162WHERE worker_id = 0",
6163    access: vec![PUBLIC_SELECT],
6164});
6165
6166pub static MZ_DATAFLOW_GLOBAL_IDS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6167    name: "mz_dataflow_global_ids",
6168    schema: MZ_INTROSPECTION_SCHEMA,
6169    oid: oid::VIEW_MZ_DATAFLOW_GLOBAL_IDS_OID,
6170    desc: RelationDesc::builder()
6171        .with_column("id", SqlScalarType::UInt64.nullable(false))
6172        .with_column("global_id", SqlScalarType::String.nullable(false))
6173        .finish(),
6174    column_comments: BTreeMap::from_iter([
6175        ("id", "The dataflow ID."),
6176        ("global_id", "A global ID associated with that dataflow."),
6177    ]),
6178    sql: "
6179SELECT id, global_id
6180FROM mz_introspection.mz_compute_dataflow_global_ids_per_worker
6181WHERE worker_id = 0",
6182    access: vec![PUBLIC_SELECT],
6183});
6184
6185pub static MZ_MAPPABLE_OBJECTS: LazyLock<BuiltinView> = LazyLock::new(|| {
6186    BuiltinView {
6187    name: "mz_mappable_objects",
6188    schema: MZ_INTROSPECTION_SCHEMA,
6189    oid: oid::VIEW_MZ_MAPPABLE_OBJECTS_OID,
6190    desc: RelationDesc::builder()
6191        .with_column("name", SqlScalarType::String.nullable(false))
6192        .with_column("global_id", SqlScalarType::String.nullable(false))
6193        .finish(),
6194    column_comments: BTreeMap::from_iter([
6195        ("name", "The name of the object."),
6196        ("global_id", "The global ID of the object."),
6197    ]),
6198    sql: "
6199SELECT COALESCE(quote_ident(md.name) || '.', '') || quote_ident(ms.name) || '.' || quote_ident(mo.name) AS name, mgi.global_id AS global_id
6200FROM      mz_catalog.mz_objects mo
6201          JOIN mz_introspection.mz_compute_exports mce ON (mo.id = mce.export_id)
6202          JOIN mz_catalog.mz_schemas ms ON (mo.schema_id = ms.id)
6203          JOIN mz_introspection.mz_dataflow_global_ids mgi ON (mce.dataflow_id = mgi.id)
6204     LEFT JOIN mz_catalog.mz_databases md ON (ms.database_id = md.id);",
6205    access: vec![PUBLIC_SELECT],
6206}
6207});
6208
6209pub static MZ_LIR_MAPPING: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6210    name: "mz_lir_mapping",
6211    schema: MZ_INTROSPECTION_SCHEMA,
6212    oid: oid::VIEW_MZ_LIR_MAPPING_OID,
6213    desc: RelationDesc::builder()
6214        .with_column("global_id", SqlScalarType::String.nullable(false))
6215        .with_column("lir_id", SqlScalarType::UInt64.nullable(false))
6216        .with_column("operator", SqlScalarType::String.nullable(false))
6217        .with_column("parent_lir_id", SqlScalarType::UInt64.nullable(true))
6218        .with_column("nesting", SqlScalarType::UInt16.nullable(false))
6219        .with_column("operator_id_start", SqlScalarType::UInt64.nullable(false))
6220        .with_column("operator_id_end", SqlScalarType::UInt64.nullable(false))
6221        .finish(),
6222    column_comments: BTreeMap::from_iter([
6223        ("global_id", "The global ID."),
6224        ("lir_id", "The LIR node ID."),
6225        (
6226            "operator",
6227            "The LIR operator, in the format `OperatorName INPUTS [OPTIONS]`.",
6228        ),
6229        (
6230            "parent_lir_id",
6231            "The parent of this LIR node. May be `NULL`.",
6232        ),
6233        ("nesting", "The nesting level of this LIR node."),
6234        (
6235            "operator_id_start",
6236            "The first dataflow operator ID implementing this LIR operator (inclusive).",
6237        ),
6238        (
6239            "operator_id_end",
6240            "The first dataflow operator ID after this LIR operator (exclusive).",
6241        ),
6242    ]),
6243    sql: "
6244SELECT global_id, lir_id, operator, parent_lir_id, nesting, operator_id_start, operator_id_end
6245FROM mz_introspection.mz_compute_lir_mapping_per_worker
6246WHERE worker_id = 0",
6247    access: vec![PUBLIC_SELECT],
6248});
6249
6250pub static MZ_DATAFLOW_OPERATOR_DATAFLOWS_PER_WORKER: LazyLock<BuiltinView> =
6251    LazyLock::new(|| BuiltinView {
6252        name: "mz_dataflow_operator_dataflows_per_worker",
6253        schema: MZ_INTROSPECTION_SCHEMA,
6254        oid: oid::VIEW_MZ_DATAFLOW_OPERATOR_DATAFLOWS_PER_WORKER_OID,
6255        desc: RelationDesc::builder()
6256            .with_column("id", SqlScalarType::UInt64.nullable(false))
6257            .with_column("name", SqlScalarType::String.nullable(false))
6258            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
6259            .with_column("dataflow_id", SqlScalarType::UInt64.nullable(false))
6260            .with_column("dataflow_name", SqlScalarType::String.nullable(false))
6261            .finish(),
6262        column_comments: BTreeMap::new(),
6263        sql: "SELECT
6264    ops.id,
6265    ops.name,
6266    ops.worker_id,
6267    dfs.id as dataflow_id,
6268    dfs.name as dataflow_name
6269FROM
6270    mz_introspection.mz_dataflow_operators_per_worker ops,
6271    mz_introspection.mz_dataflow_addresses_per_worker addrs,
6272    mz_introspection.mz_dataflows_per_worker dfs
6273WHERE
6274    ops.id = addrs.id AND
6275    ops.worker_id = addrs.worker_id AND
6276    dfs.id = addrs.address[1] AND
6277    dfs.worker_id = addrs.worker_id",
6278        access: vec![PUBLIC_SELECT],
6279    });
6280
6281pub static MZ_DATAFLOW_OPERATOR_DATAFLOWS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6282    name: "mz_dataflow_operator_dataflows",
6283    schema: MZ_INTROSPECTION_SCHEMA,
6284    oid: oid::VIEW_MZ_DATAFLOW_OPERATOR_DATAFLOWS_OID,
6285    desc: RelationDesc::builder()
6286        .with_column("id", SqlScalarType::UInt64.nullable(false))
6287        .with_column("name", SqlScalarType::String.nullable(false))
6288        .with_column("dataflow_id", SqlScalarType::UInt64.nullable(false))
6289        .with_column("dataflow_name", SqlScalarType::String.nullable(false))
6290        .finish(),
6291    column_comments: BTreeMap::from_iter([
6292        (
6293            "id",
6294            "The ID of the operator. Corresponds to `mz_dataflow_operators.id`.",
6295        ),
6296        ("name", "The internal name of the operator."),
6297        (
6298            "dataflow_id",
6299            "The ID of the dataflow hosting the operator. Corresponds to `mz_dataflows.id`.",
6300        ),
6301        (
6302            "dataflow_name",
6303            "The internal name of the dataflow hosting the operator.",
6304        ),
6305    ]),
6306    sql: "
6307SELECT id, name, dataflow_id, dataflow_name
6308FROM mz_introspection.mz_dataflow_operator_dataflows_per_worker
6309WHERE worker_id = 0",
6310    access: vec![PUBLIC_SELECT],
6311});
6312
6313pub static MZ_OBJECT_TRANSITIVE_DEPENDENCIES: LazyLock<BuiltinView> = LazyLock::new(|| {
6314    BuiltinView {
6315        name: "mz_object_transitive_dependencies",
6316        schema: MZ_INTERNAL_SCHEMA,
6317        oid: oid::VIEW_MZ_OBJECT_TRANSITIVE_DEPENDENCIES_OID,
6318        desc: RelationDesc::builder()
6319            .with_column("object_id", SqlScalarType::String.nullable(false))
6320            .with_column(
6321                "referenced_object_id",
6322                SqlScalarType::String.nullable(false),
6323            )
6324            .with_key(vec![0, 1])
6325            .finish(),
6326        column_comments: BTreeMap::from_iter([
6327            (
6328                "object_id",
6329                "The ID of the dependent object. Corresponds to `mz_objects.id`.",
6330            ),
6331            (
6332                "referenced_object_id",
6333                "The ID of the (possibly transitively) referenced object. Corresponds to `mz_objects.id`.",
6334            ),
6335        ]),
6336        sql: "
6337WITH MUTUALLY RECURSIVE
6338  reach(object_id text, referenced_object_id text) AS (
6339    SELECT object_id, referenced_object_id FROM mz_internal.mz_object_dependencies
6340    UNION
6341    SELECT x, z FROM reach r1(x, y) JOIN reach r2(y, z) USING(y)
6342  )
6343SELECT object_id, referenced_object_id FROM reach;",
6344        access: vec![PUBLIC_SELECT],
6345    }
6346});
6347
6348pub static MZ_COMPUTE_EXPORTS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6349    name: "mz_compute_exports",
6350    schema: MZ_INTROSPECTION_SCHEMA,
6351    oid: oid::VIEW_MZ_COMPUTE_EXPORTS_OID,
6352    desc: RelationDesc::builder()
6353        .with_column("export_id", SqlScalarType::String.nullable(false))
6354        .with_column("dataflow_id", SqlScalarType::UInt64.nullable(false))
6355        .finish(),
6356    column_comments: BTreeMap::from_iter([
6357        (
6358            "export_id",
6359            "The ID of the index, materialized view, or subscription exported by the dataflow. Corresponds to `mz_catalog.mz_indexes.id`, `mz_catalog.mz_materialized_views.id`, or `mz_internal.mz_subscriptions`.",
6360        ),
6361        (
6362            "dataflow_id",
6363            "The ID of the dataflow. Corresponds to `mz_dataflows.id`.",
6364        ),
6365    ]),
6366    sql: "
6367SELECT export_id, dataflow_id
6368FROM mz_introspection.mz_compute_exports_per_worker
6369WHERE worker_id = 0",
6370    access: vec![PUBLIC_SELECT],
6371});
6372
6373pub static MZ_COMPUTE_FRONTIERS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6374    name: "mz_compute_frontiers",
6375    schema: MZ_INTROSPECTION_SCHEMA,
6376    oid: oid::VIEW_MZ_COMPUTE_FRONTIERS_OID,
6377    desc: RelationDesc::builder()
6378        .with_column("export_id", SqlScalarType::String.nullable(false))
6379        .with_column("time", SqlScalarType::MzTimestamp.nullable(false))
6380        .with_key(vec![0])
6381        .finish(),
6382    column_comments: BTreeMap::from_iter([
6383        (
6384            "export_id",
6385            "The ID of the dataflow export. Corresponds to `mz_compute_exports.export_id`.",
6386        ),
6387        (
6388            "time",
6389            "The next timestamp at which the dataflow output may change.",
6390        ),
6391    ]),
6392    sql: "SELECT
6393    export_id, pg_catalog.min(time) AS time
6394FROM mz_introspection.mz_compute_frontiers_per_worker
6395GROUP BY export_id",
6396    access: vec![PUBLIC_SELECT],
6397});
6398
6399pub static MZ_DATAFLOW_CHANNEL_OPERATORS_PER_WORKER: LazyLock<BuiltinView> =
6400    LazyLock::new(|| BuiltinView {
6401        name: "mz_dataflow_channel_operators_per_worker",
6402        schema: MZ_INTROSPECTION_SCHEMA,
6403        oid: oid::VIEW_MZ_DATAFLOW_CHANNEL_OPERATORS_PER_WORKER_OID,
6404        desc: RelationDesc::builder()
6405            .with_column("id", SqlScalarType::UInt64.nullable(false))
6406            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
6407            .with_column("from_operator_id", SqlScalarType::UInt64.nullable(true))
6408            .with_column(
6409                "from_operator_address",
6410                SqlScalarType::List {
6411                    element_type: Box::new(SqlScalarType::UInt64),
6412                    custom_id: None,
6413                }
6414                .nullable(true),
6415            )
6416            .with_column("to_operator_id", SqlScalarType::UInt64.nullable(true))
6417            .with_column(
6418                "to_operator_address",
6419                SqlScalarType::List {
6420                    element_type: Box::new(SqlScalarType::UInt64),
6421                    custom_id: None,
6422                }
6423                .nullable(true),
6424            )
6425            .with_column("type", SqlScalarType::String.nullable(false))
6426            .finish(),
6427        column_comments: BTreeMap::new(),
6428        sql: "
6429WITH
6430channel_addresses(id, worker_id, address, from_index, to_index, type) AS (
6431     SELECT id, worker_id, address, from_index, to_index, type
6432     FROM mz_introspection.mz_dataflow_channels_per_worker mdc
6433     INNER JOIN mz_introspection.mz_dataflow_addresses_per_worker mda
6434     USING (id, worker_id)
6435),
6436channel_operator_addresses(id, worker_id, from_address, to_address, type) AS (
6437     SELECT id, worker_id,
6438            address || from_index AS from_address,
6439            address || to_index AS to_address,
6440            type
6441     FROM channel_addresses
6442),
6443operator_addresses(id, worker_id, address) AS (
6444     SELECT id, worker_id, address
6445     FROM mz_introspection.mz_dataflow_addresses_per_worker mda
6446     INNER JOIN mz_introspection.mz_dataflow_operators_per_worker mdo
6447     USING (id, worker_id)
6448)
6449SELECT coa.id,
6450       coa.worker_id,
6451       from_ops.id AS from_operator_id,
6452       coa.from_address AS from_operator_address,
6453       to_ops.id AS to_operator_id,
6454       coa.to_address AS to_operator_address,
6455       coa.type
6456FROM channel_operator_addresses coa
6457     LEFT OUTER JOIN operator_addresses from_ops
6458          ON coa.from_address = from_ops.address AND
6459             coa.worker_id = from_ops.worker_id
6460     LEFT OUTER JOIN operator_addresses to_ops
6461          ON coa.to_address = to_ops.address AND
6462             coa.worker_id = to_ops.worker_id
6463",
6464        access: vec![PUBLIC_SELECT],
6465    });
6466
6467pub static MZ_DATAFLOW_CHANNEL_OPERATORS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6468    name: "mz_dataflow_channel_operators",
6469    schema: MZ_INTROSPECTION_SCHEMA,
6470    oid: oid::VIEW_MZ_DATAFLOW_CHANNEL_OPERATORS_OID,
6471    desc: RelationDesc::builder()
6472        .with_column("id", SqlScalarType::UInt64.nullable(false))
6473        .with_column("from_operator_id", SqlScalarType::UInt64.nullable(true))
6474        .with_column(
6475            "from_operator_address",
6476            SqlScalarType::List {
6477                element_type: Box::new(SqlScalarType::UInt64),
6478                custom_id: None,
6479            }
6480            .nullable(true),
6481        )
6482        .with_column("to_operator_id", SqlScalarType::UInt64.nullable(true))
6483        .with_column(
6484            "to_operator_address",
6485            SqlScalarType::List {
6486                element_type: Box::new(SqlScalarType::UInt64),
6487                custom_id: None,
6488            }
6489            .nullable(true),
6490        )
6491        .with_column("type", SqlScalarType::String.nullable(false))
6492        .finish(),
6493    column_comments: BTreeMap::from_iter([
6494        (
6495            "id",
6496            "The ID of the channel. Corresponds to `mz_dataflow_channels.id`.",
6497        ),
6498        (
6499            "from_operator_id",
6500            "The ID of the source of the channel. Corresponds to `mz_dataflow_operators.id`.",
6501        ),
6502        (
6503            "from_operator_address",
6504            "The address of the source of the channel. Corresponds to `mz_dataflow_addresses.address`.",
6505        ),
6506        (
6507            "to_operator_id",
6508            "The ID of the target of the channel. Corresponds to `mz_dataflow_operators.id`.",
6509        ),
6510        (
6511            "to_operator_address",
6512            "The address of the target of the channel. Corresponds to `mz_dataflow_addresses.address`.",
6513        ),
6514        ("type", "The container type of the channel."),
6515    ]),
6516    sql: "
6517SELECT id, from_operator_id, from_operator_address, to_operator_id, to_operator_address, type
6518FROM mz_introspection.mz_dataflow_channel_operators_per_worker
6519WHERE worker_id = 0",
6520    access: vec![PUBLIC_SELECT],
6521});
6522
6523pub static MZ_COMPUTE_IMPORT_FRONTIERS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6524    name: "mz_compute_import_frontiers",
6525    schema: MZ_INTROSPECTION_SCHEMA,
6526    oid: oid::VIEW_MZ_COMPUTE_IMPORT_FRONTIERS_OID,
6527    desc: RelationDesc::builder()
6528        .with_column("export_id", SqlScalarType::String.nullable(false))
6529        .with_column("import_id", SqlScalarType::String.nullable(false))
6530        .with_column("time", SqlScalarType::MzTimestamp.nullable(false))
6531        .with_key(vec![0, 1])
6532        .finish(),
6533    column_comments: BTreeMap::from_iter([
6534        (
6535            "export_id",
6536            "The ID of the dataflow export. Corresponds to `mz_compute_exports.export_id`.",
6537        ),
6538        (
6539            "import_id",
6540            "The ID of the dataflow import. Corresponds to `mz_catalog.mz_sources.id` or `mz_catalog.mz_tables.id` or `mz_compute_exports.export_id`.",
6541        ),
6542        (
6543            "time",
6544            "The next timestamp at which the dataflow input may change.",
6545        ),
6546    ]),
6547    sql: "SELECT
6548    export_id, import_id, pg_catalog.min(time) AS time
6549FROM mz_introspection.mz_compute_import_frontiers_per_worker
6550GROUP BY export_id, import_id",
6551    access: vec![PUBLIC_SELECT],
6552});
6553
6554pub static MZ_RECORDS_PER_DATAFLOW_OPERATOR_PER_WORKER: LazyLock<BuiltinView> =
6555    LazyLock::new(|| BuiltinView {
6556        name: "mz_records_per_dataflow_operator_per_worker",
6557        schema: MZ_INTROSPECTION_SCHEMA,
6558        oid: oid::VIEW_MZ_RECORDS_PER_DATAFLOW_OPERATOR_PER_WORKER_OID,
6559        desc: RelationDesc::builder()
6560            .with_column("id", SqlScalarType::UInt64.nullable(false))
6561            .with_column("name", SqlScalarType::String.nullable(false))
6562            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
6563            .with_column("dataflow_id", SqlScalarType::UInt64.nullable(false))
6564            .with_column("records", SqlScalarType::Int64.nullable(true))
6565            .with_column("batches", SqlScalarType::Int64.nullable(true))
6566            .with_column("size", SqlScalarType::Int64.nullable(true))
6567            .with_column("capacity", SqlScalarType::Int64.nullable(true))
6568            .with_column("allocations", SqlScalarType::Int64.nullable(true))
6569            .finish(),
6570        column_comments: BTreeMap::new(),
6571        sql: "
6572SELECT
6573    dod.id,
6574    dod.name,
6575    dod.worker_id,
6576    dod.dataflow_id,
6577    ar_size.records AS records,
6578    ar_size.batches AS batches,
6579    ar_size.size AS size,
6580    ar_size.capacity AS capacity,
6581    ar_size.allocations AS allocations
6582FROM
6583    mz_introspection.mz_dataflow_operator_dataflows_per_worker dod
6584    LEFT OUTER JOIN mz_introspection.mz_arrangement_sizes_per_worker ar_size ON
6585        dod.id = ar_size.operator_id AND
6586        dod.worker_id = ar_size.worker_id",
6587        access: vec![PUBLIC_SELECT],
6588    });
6589
6590pub static MZ_RECORDS_PER_DATAFLOW_OPERATOR: LazyLock<BuiltinView> =
6591    LazyLock::new(|| BuiltinView {
6592        name: "mz_records_per_dataflow_operator",
6593        schema: MZ_INTROSPECTION_SCHEMA,
6594        oid: oid::VIEW_MZ_RECORDS_PER_DATAFLOW_OPERATOR_OID,
6595        desc: RelationDesc::builder()
6596            .with_column("id", SqlScalarType::UInt64.nullable(false))
6597            .with_column("name", SqlScalarType::String.nullable(false))
6598            .with_column("dataflow_id", SqlScalarType::UInt64.nullable(false))
6599            .with_column("records", SqlScalarType::Int64.nullable(true))
6600            .with_column("batches", SqlScalarType::Int64.nullable(true))
6601            .with_column("size", SqlScalarType::Int64.nullable(true))
6602            .with_column("capacity", SqlScalarType::Int64.nullable(true))
6603            .with_column("allocations", SqlScalarType::Int64.nullable(true))
6604            .with_key(vec![0, 1, 2])
6605            .finish(),
6606        column_comments: BTreeMap::from_iter([
6607            (
6608                "id",
6609                "The ID of the operator. Corresponds to `mz_dataflow_operators.id`.",
6610            ),
6611            ("name", "The internal name of the operator."),
6612            (
6613                "dataflow_id",
6614                "The ID of the dataflow. Corresponds to `mz_dataflows.id`.",
6615            ),
6616            ("records", "The number of records in the operator."),
6617            ("batches", "The number of batches in the dataflow."),
6618            ("size", "The utilized size in bytes of the arrangement."),
6619            (
6620                "capacity",
6621                "The capacity in bytes of the arrangement. Can be larger than the size.",
6622            ),
6623            (
6624                "allocations",
6625                "The number of separate memory allocations backing the arrangement.",
6626            ),
6627        ]),
6628        sql: "
6629SELECT
6630    id,
6631    name,
6632    dataflow_id,
6633    SUM(records)::int8 AS records,
6634    SUM(batches)::int8 AS batches,
6635    SUM(size)::int8 AS size,
6636    SUM(capacity)::int8 AS capacity,
6637    SUM(allocations)::int8 AS allocations
6638FROM mz_introspection.mz_records_per_dataflow_operator_per_worker
6639GROUP BY id, name, dataflow_id",
6640        access: vec![PUBLIC_SELECT],
6641    });
6642
6643pub static MZ_RECORDS_PER_DATAFLOW_PER_WORKER: LazyLock<BuiltinView> =
6644    LazyLock::new(|| BuiltinView {
6645        name: "mz_records_per_dataflow_per_worker",
6646        schema: MZ_INTROSPECTION_SCHEMA,
6647        oid: oid::VIEW_MZ_RECORDS_PER_DATAFLOW_PER_WORKER_OID,
6648        desc: RelationDesc::builder()
6649            .with_column("id", SqlScalarType::UInt64.nullable(false))
6650            .with_column("name", SqlScalarType::String.nullable(false))
6651            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
6652            .with_column("records", SqlScalarType::Int64.nullable(true))
6653            .with_column("batches", SqlScalarType::Int64.nullable(true))
6654            .with_column("size", SqlScalarType::Int64.nullable(true))
6655            .with_column("capacity", SqlScalarType::Int64.nullable(true))
6656            .with_column("allocations", SqlScalarType::Int64.nullable(true))
6657            .with_key(vec![0, 1, 2])
6658            .finish(),
6659        column_comments: BTreeMap::new(),
6660        sql: "
6661SELECT
6662    rdo.dataflow_id as id,
6663    dfs.name,
6664    rdo.worker_id,
6665    SUM(rdo.records)::int8 as records,
6666    SUM(rdo.batches)::int8 as batches,
6667    SUM(rdo.size)::int8 as size,
6668    SUM(rdo.capacity)::int8 as capacity,
6669    SUM(rdo.allocations)::int8 as allocations
6670FROM
6671    mz_introspection.mz_records_per_dataflow_operator_per_worker rdo,
6672    mz_introspection.mz_dataflows_per_worker dfs
6673WHERE
6674    rdo.dataflow_id = dfs.id AND
6675    rdo.worker_id = dfs.worker_id
6676GROUP BY
6677    rdo.dataflow_id,
6678    dfs.name,
6679    rdo.worker_id",
6680        access: vec![PUBLIC_SELECT],
6681    });
6682
6683pub static MZ_RECORDS_PER_DATAFLOW: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6684    name: "mz_records_per_dataflow",
6685    schema: MZ_INTROSPECTION_SCHEMA,
6686    oid: oid::VIEW_MZ_RECORDS_PER_DATAFLOW_OID,
6687    desc: RelationDesc::builder()
6688        .with_column("id", SqlScalarType::UInt64.nullable(false))
6689        .with_column("name", SqlScalarType::String.nullable(false))
6690        .with_column("records", SqlScalarType::Int64.nullable(true))
6691        .with_column("batches", SqlScalarType::Int64.nullable(true))
6692        .with_column("size", SqlScalarType::Int64.nullable(true))
6693        .with_column("capacity", SqlScalarType::Int64.nullable(true))
6694        .with_column("allocations", SqlScalarType::Int64.nullable(true))
6695        .with_key(vec![0, 1])
6696        .finish(),
6697    column_comments: BTreeMap::from_iter([
6698        (
6699            "id",
6700            "The ID of the dataflow. Corresponds to `mz_dataflows.id`.",
6701        ),
6702        ("name", "The internal name of the dataflow."),
6703        ("records", "The number of records in the dataflow."),
6704        ("batches", "The number of batches in the dataflow."),
6705        ("size", "The utilized size in bytes of the arrangements."),
6706        (
6707            "capacity",
6708            "The capacity in bytes of the arrangements. Can be larger than the size.",
6709        ),
6710        (
6711            "allocations",
6712            "The number of separate memory allocations backing the arrangements.",
6713        ),
6714    ]),
6715    sql: "
6716SELECT
6717    id,
6718    name,
6719    SUM(records)::int8 as records,
6720    SUM(batches)::int8 as batches,
6721    SUM(size)::int8 as size,
6722    SUM(capacity)::int8 as capacity,
6723    SUM(allocations)::int8 as allocations
6724FROM
6725    mz_introspection.mz_records_per_dataflow_per_worker
6726GROUP BY
6727    id,
6728    name",
6729    access: vec![PUBLIC_SELECT],
6730});
6731
6732/// Peeled version of `PG_NAMESPACE`:
6733/// - This doesn't check `mz_schemas.database_id IS NULL OR d.name = pg_catalog.current_database()`,
6734///   in order to make this view indexable.
6735/// - This has the database name as an extra column, so that downstream views can check it against
6736///  `current_database()`.
6737pub static PG_NAMESPACE_ALL_DATABASES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6738    name: "pg_namespace_all_databases",
6739    schema: MZ_INTERNAL_SCHEMA,
6740    oid: oid::VIEW_PG_NAMESPACE_ALL_DATABASES_OID,
6741    desc: RelationDesc::builder()
6742        .with_column("oid", SqlScalarType::Oid.nullable(false))
6743        .with_column("nspname", SqlScalarType::String.nullable(false))
6744        .with_column("nspowner", SqlScalarType::Oid.nullable(false))
6745        .with_column(
6746            "nspacl",
6747            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(true),
6748        )
6749        .with_column("database_name", SqlScalarType::String.nullable(true))
6750        .finish(),
6751    column_comments: BTreeMap::new(),
6752    sql: "
6753SELECT
6754    s.oid AS oid,
6755    s.name AS nspname,
6756    role_owner.oid AS nspowner,
6757    NULL::pg_catalog.text[] AS nspacl,
6758    d.name as database_name
6759FROM mz_catalog.mz_schemas s
6760LEFT JOIN mz_catalog.mz_databases d ON d.id = s.database_id
6761JOIN mz_catalog.mz_roles role_owner ON role_owner.id = s.owner_id",
6762    access: vec![PUBLIC_SELECT],
6763});
6764
6765pub const PG_NAMESPACE_ALL_DATABASES_IND: BuiltinIndex = BuiltinIndex {
6766    name: "pg_namespace_all_databases_ind",
6767    schema: MZ_INTERNAL_SCHEMA,
6768    oid: oid::INDEX_PG_NAMESPACE_ALL_DATABASES_IND_OID,
6769    sql: "IN CLUSTER mz_catalog_server
6770ON mz_internal.pg_namespace_all_databases (nspname)",
6771    is_retained_metrics_object: false,
6772};
6773
6774pub static PG_NAMESPACE: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6775    name: "pg_namespace",
6776    schema: PG_CATALOG_SCHEMA,
6777    oid: oid::VIEW_PG_NAMESPACE_OID,
6778    desc: RelationDesc::builder()
6779        .with_column("oid", SqlScalarType::Oid.nullable(false))
6780        .with_column("nspname", SqlScalarType::String.nullable(false))
6781        .with_column("nspowner", SqlScalarType::Oid.nullable(false))
6782        .with_column(
6783            "nspacl",
6784            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(true),
6785        )
6786        .finish(),
6787    column_comments: BTreeMap::new(),
6788    sql: "
6789SELECT
6790    oid, nspname, nspowner, nspacl
6791FROM mz_internal.pg_namespace_all_databases
6792WHERE database_name IS NULL OR database_name = pg_catalog.current_database();",
6793    access: vec![PUBLIC_SELECT],
6794});
6795
6796/// Peeled version of `PG_CLASS`:
6797/// - This doesn't check `mz_schemas.database_id IS NULL OR d.name = pg_catalog.current_database()`,
6798///   in order to make this view indexable.
6799/// - This has the database name as an extra column, so that downstream views can check it against
6800///  `current_database()`.
6801pub static PG_CLASS_ALL_DATABASES: LazyLock<BuiltinView> = LazyLock::new(|| {
6802    BuiltinView {
6803        name: "pg_class_all_databases",
6804        schema: MZ_INTERNAL_SCHEMA,
6805        oid: oid::VIEW_PG_CLASS_ALL_DATABASES_OID,
6806        desc: RelationDesc::builder()
6807            .with_column("oid", SqlScalarType::Oid.nullable(false))
6808            .with_column("relname", SqlScalarType::String.nullable(false))
6809            .with_column("relnamespace", SqlScalarType::Oid.nullable(false))
6810            .with_column("reloftype", SqlScalarType::Oid.nullable(false))
6811            .with_column("relowner", SqlScalarType::Oid.nullable(false))
6812            .with_column("relam", SqlScalarType::Oid.nullable(false))
6813            .with_column("reltablespace", SqlScalarType::Oid.nullable(false))
6814            .with_column("reltuples", SqlScalarType::Float32.nullable(false))
6815            .with_column("reltoastrelid", SqlScalarType::Oid.nullable(false))
6816            .with_column("relhasindex", SqlScalarType::Bool.nullable(false))
6817            .with_column("relpersistence", SqlScalarType::PgLegacyChar.nullable(false))
6818            .with_column("relkind", SqlScalarType::String.nullable(true))
6819            .with_column("relnatts", SqlScalarType::Int16.nullable(false))
6820            .with_column("relchecks", SqlScalarType::Int16.nullable(false))
6821            .with_column("relhasrules", SqlScalarType::Bool.nullable(false))
6822            .with_column("relhastriggers", SqlScalarType::Bool.nullable(false))
6823            .with_column("relhassubclass", SqlScalarType::Bool.nullable(false))
6824            .with_column("relrowsecurity", SqlScalarType::Bool.nullable(false))
6825            .with_column("relforcerowsecurity", SqlScalarType::Bool.nullable(false))
6826            .with_column("relreplident", SqlScalarType::PgLegacyChar.nullable(false))
6827            .with_column("relispartition", SqlScalarType::Bool.nullable(false))
6828            .with_column("relhasoids", SqlScalarType::Bool.nullable(false))
6829            .with_column("reloptions", SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(true))
6830            .with_column("database_name", SqlScalarType::String.nullable(true))
6831            .finish(),
6832        column_comments: BTreeMap::new(),
6833        sql: "
6834SELECT
6835    class_objects.oid,
6836    class_objects.name AS relname,
6837    mz_schemas.oid AS relnamespace,
6838    -- MZ doesn't support typed tables so reloftype is filled with 0
6839    0::pg_catalog.oid AS reloftype,
6840    role_owner.oid AS relowner,
6841    0::pg_catalog.oid AS relam,
6842    -- MZ doesn't have tablespaces so reltablespace is filled in with 0 implying the default tablespace
6843    0::pg_catalog.oid AS reltablespace,
6844    -- MZ doesn't support (estimated) row counts currently.
6845    -- Postgres defines a value of -1 as unknown.
6846    -1::float4 as reltuples,
6847    -- MZ doesn't use TOAST tables so reltoastrelid is filled with 0
6848    0::pg_catalog.oid AS reltoastrelid,
6849    EXISTS (SELECT id, oid, name, on_id, cluster_id FROM mz_catalog.mz_indexes where mz_indexes.on_id = class_objects.id) AS relhasindex,
6850    -- MZ doesn't have unlogged tables and because of (https://github.com/MaterializeInc/database-issues/issues/2689)
6851    -- temporary objects don't show up here, so relpersistence is filled with 'p' for permanent.
6852    -- TODO(jkosh44): update this column when issue is resolved.
6853    'p'::pg_catalog.\"char\" AS relpersistence,
6854    CASE
6855        WHEN class_objects.type = 'table' THEN 'r'
6856        WHEN class_objects.type = 'source' THEN 'r'
6857        WHEN class_objects.type = 'index' THEN 'i'
6858        WHEN class_objects.type = 'view' THEN 'v'
6859        WHEN class_objects.type = 'materialized-view' THEN 'm'
6860    END relkind,
6861    COALESCE(
6862        (
6863            SELECT count(*)::pg_catalog.int2
6864            FROM mz_catalog.mz_columns
6865            WHERE mz_columns.id = class_objects.id
6866        ),
6867        0::pg_catalog.int2
6868    ) AS relnatts,
6869    -- MZ doesn't support CHECK constraints so relchecks is filled with 0
6870    0::pg_catalog.int2 AS relchecks,
6871    -- MZ doesn't support creating rules so relhasrules is filled with false
6872    false AS relhasrules,
6873    -- MZ doesn't support creating triggers so relhastriggers is filled with false
6874    false AS relhastriggers,
6875    -- MZ doesn't support table inheritance or partitions so relhassubclass is filled with false
6876    false AS relhassubclass,
6877    -- MZ doesn't have row level security so relrowsecurity and relforcerowsecurity is filled with false
6878    false AS relrowsecurity,
6879    false AS relforcerowsecurity,
6880    -- MZ doesn't support replication so relreplident is filled with 'd' for default
6881    'd'::pg_catalog.\"char\" AS relreplident,
6882    -- MZ doesn't support table partitioning so relispartition is filled with false
6883    false AS relispartition,
6884    -- PG removed relhasoids in v12 so it's filled with false
6885    false AS relhasoids,
6886    -- MZ doesn't support options for relations
6887    NULL::pg_catalog.text[] as reloptions,
6888    d.name as database_name
6889FROM (
6890    -- pg_class catalogs relations and indexes
6891    SELECT id, oid, schema_id, name, type, owner_id FROM mz_catalog.mz_relations
6892    UNION ALL
6893        SELECT mz_indexes.id, mz_indexes.oid, mz_relations.schema_id, mz_indexes.name, 'index' AS type, mz_indexes.owner_id
6894        FROM mz_catalog.mz_indexes
6895        JOIN mz_catalog.mz_relations ON mz_indexes.on_id = mz_relations.id
6896) AS class_objects
6897JOIN mz_catalog.mz_schemas ON mz_schemas.id = class_objects.schema_id
6898LEFT JOIN mz_catalog.mz_databases d ON d.id = mz_schemas.database_id
6899JOIN mz_catalog.mz_roles role_owner ON role_owner.id = class_objects.owner_id",
6900        access: vec![PUBLIC_SELECT],
6901    }
6902});
6903
6904pub const PG_CLASS_ALL_DATABASES_IND: BuiltinIndex = BuiltinIndex {
6905    name: "pg_class_all_databases_ind",
6906    schema: MZ_INTERNAL_SCHEMA,
6907    oid: oid::INDEX_PG_CLASS_ALL_DATABASES_IND_OID,
6908    sql: "IN CLUSTER mz_catalog_server
6909ON mz_internal.pg_class_all_databases (relname)",
6910    is_retained_metrics_object: false,
6911};
6912
6913pub static PG_CLASS: LazyLock<BuiltinView> = LazyLock::new(|| {
6914    BuiltinView {
6915    name: "pg_class",
6916    schema: PG_CATALOG_SCHEMA,
6917    oid: oid::VIEW_PG_CLASS_OID,
6918    desc: RelationDesc::builder()
6919        .with_column("oid", SqlScalarType::Oid.nullable(false))
6920        .with_column("relname", SqlScalarType::String.nullable(false))
6921        .with_column("relnamespace", SqlScalarType::Oid.nullable(false))
6922        .with_column("reloftype", SqlScalarType::Oid.nullable(false))
6923        .with_column("relowner", SqlScalarType::Oid.nullable(false))
6924        .with_column("relam", SqlScalarType::Oid.nullable(false))
6925        .with_column("reltablespace", SqlScalarType::Oid.nullable(false))
6926        .with_column("reltuples", SqlScalarType::Float32.nullable(false))
6927        .with_column("reltoastrelid", SqlScalarType::Oid.nullable(false))
6928        .with_column("relhasindex", SqlScalarType::Bool.nullable(false))
6929        .with_column("relpersistence", SqlScalarType::PgLegacyChar.nullable(false))
6930        .with_column("relkind", SqlScalarType::String.nullable(true))
6931        .with_column("relnatts", SqlScalarType::Int16.nullable(false))
6932        .with_column("relchecks", SqlScalarType::Int16.nullable(false))
6933        .with_column("relhasrules", SqlScalarType::Bool.nullable(false))
6934        .with_column("relhastriggers", SqlScalarType::Bool.nullable(false))
6935        .with_column("relhassubclass", SqlScalarType::Bool.nullable(false))
6936        .with_column("relrowsecurity", SqlScalarType::Bool.nullable(false))
6937        .with_column("relforcerowsecurity", SqlScalarType::Bool.nullable(false))
6938        .with_column("relreplident", SqlScalarType::PgLegacyChar.nullable(false))
6939        .with_column("relispartition", SqlScalarType::Bool.nullable(false))
6940        .with_column("relhasoids", SqlScalarType::Bool.nullable(false))
6941        .with_column(
6942            "reloptions",
6943            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(true),
6944        )
6945        .finish(),
6946    column_comments: BTreeMap::new(),
6947    sql: "
6948SELECT
6949    oid, relname, relnamespace, reloftype, relowner, relam, reltablespace, reltuples, reltoastrelid,
6950    relhasindex, relpersistence, relkind, relnatts, relchecks, relhasrules, relhastriggers, relhassubclass,
6951    relrowsecurity, relforcerowsecurity, relreplident, relispartition, relhasoids, reloptions
6952FROM mz_internal.pg_class_all_databases
6953WHERE database_name IS NULL OR database_name = pg_catalog.current_database();
6954",
6955    access: vec![PUBLIC_SELECT],
6956}
6957});
6958
6959pub static PG_DEPEND: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
6960    name: "pg_depend",
6961    schema: PG_CATALOG_SCHEMA,
6962    oid: oid::VIEW_PG_DEPEND_OID,
6963    desc: RelationDesc::builder()
6964        .with_column("classid", SqlScalarType::Oid.nullable(true))
6965        .with_column("objid", SqlScalarType::Oid.nullable(false))
6966        .with_column("objsubid", SqlScalarType::Int32.nullable(false))
6967        .with_column("refclassid", SqlScalarType::Oid.nullable(true))
6968        .with_column("refobjid", SqlScalarType::Oid.nullable(false))
6969        .with_column("refobjsubid", SqlScalarType::Int32.nullable(false))
6970        .with_column("deptype", SqlScalarType::PgLegacyChar.nullable(false))
6971        .finish(),
6972    column_comments: BTreeMap::new(),
6973    sql: "
6974WITH class_objects AS (
6975    SELECT
6976        CASE
6977            WHEN type = 'table' THEN 'pg_tables'::pg_catalog.regclass::pg_catalog.oid
6978            WHEN type = 'source' THEN 'pg_tables'::pg_catalog.regclass::pg_catalog.oid
6979            WHEN type = 'view' THEN 'pg_views'::pg_catalog.regclass::pg_catalog.oid
6980            WHEN type = 'materialized-view' THEN 'pg_matviews'::pg_catalog.regclass::pg_catalog.oid
6981        END classid,
6982        id,
6983        oid,
6984        schema_id
6985    FROM mz_catalog.mz_relations
6986    UNION ALL
6987    SELECT
6988        'pg_index'::pg_catalog.regclass::pg_catalog.oid AS classid,
6989        i.id,
6990        i.oid,
6991        r.schema_id
6992    FROM mz_catalog.mz_indexes i
6993    JOIN mz_catalog.mz_relations r ON i.on_id = r.id
6994),
6995
6996current_objects AS (
6997    SELECT class_objects.*
6998    FROM class_objects
6999    JOIN mz_catalog.mz_schemas ON mz_schemas.id = class_objects.schema_id
7000    LEFT JOIN mz_catalog.mz_databases d ON d.id = mz_schemas.database_id
7001    -- This filter is tricky, as it filters out not just objects outside the
7002    -- database, but *dependencies* on objects outside this database. It's not
7003    -- clear that this is the right choice, but because PostgreSQL doesn't
7004    -- support cross-database references, it's not clear that the other choice
7005    -- is better.
7006    WHERE mz_schemas.database_id IS NULL OR d.name = pg_catalog.current_database()
7007)
7008
7009SELECT
7010    objects.classid::pg_catalog.oid,
7011    objects.oid::pg_catalog.oid AS objid,
7012    0::pg_catalog.int4 AS objsubid,
7013    dependents.classid::pg_catalog.oid AS refclassid,
7014    dependents.oid::pg_catalog.oid AS refobjid,
7015    0::pg_catalog.int4 AS refobjsubid,
7016    'n'::pg_catalog.char AS deptype
7017FROM mz_internal.mz_object_dependencies
7018JOIN current_objects objects ON object_id = objects.id
7019JOIN current_objects dependents ON referenced_object_id = dependents.id",
7020    access: vec![PUBLIC_SELECT],
7021});
7022
7023pub static PG_DATABASE: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7024    name: "pg_database",
7025    schema: PG_CATALOG_SCHEMA,
7026    oid: oid::VIEW_PG_DATABASE_OID,
7027    desc: RelationDesc::builder()
7028        .with_column("oid", SqlScalarType::Oid.nullable(false))
7029        .with_column("datname", SqlScalarType::String.nullable(false))
7030        .with_column("datdba", SqlScalarType::Oid.nullable(false))
7031        .with_column("encoding", SqlScalarType::Int32.nullable(false))
7032        .with_column("datistemplate", SqlScalarType::Bool.nullable(false))
7033        .with_column("datallowconn", SqlScalarType::Bool.nullable(false))
7034        .with_column("datcollate", SqlScalarType::String.nullable(false))
7035        .with_column("datctype", SqlScalarType::String.nullable(false))
7036        .with_column(
7037            "datacl",
7038            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(true),
7039        )
7040        .with_key(vec![0])
7041        .finish(),
7042    column_comments: BTreeMap::new(),
7043    sql: "SELECT
7044    d.oid as oid,
7045    d.name as datname,
7046    role_owner.oid as datdba,
7047    6 as encoding,
7048    -- Materialize doesn't support database cloning.
7049    FALSE AS datistemplate,
7050    TRUE AS datallowconn,
7051    'C' as datcollate,
7052    'C' as datctype,
7053    NULL::pg_catalog.text[] as datacl
7054FROM mz_catalog.mz_databases d
7055JOIN mz_catalog.mz_roles role_owner ON role_owner.id = d.owner_id",
7056    access: vec![PUBLIC_SELECT],
7057});
7058
7059pub static PG_INDEX: LazyLock<BuiltinView> = LazyLock::new(|| {
7060    BuiltinView {
7061        name: "pg_index",
7062        schema: PG_CATALOG_SCHEMA,
7063        oid: oid::VIEW_PG_INDEX_OID,
7064        desc: RelationDesc::builder()
7065            .with_column("indexrelid", SqlScalarType::Oid.nullable(false))
7066            .with_column("indrelid", SqlScalarType::Oid.nullable(false))
7067            .with_column("indnatts", SqlScalarType::Int16.nullable(false))
7068            .with_column("indisunique", SqlScalarType::Bool.nullable(false))
7069            .with_column("indisprimary", SqlScalarType::Bool.nullable(false))
7070            .with_column("indimmediate", SqlScalarType::Bool.nullable(false))
7071            .with_column("indisclustered", SqlScalarType::Bool.nullable(false))
7072            .with_column("indisvalid", SqlScalarType::Bool.nullable(false))
7073            .with_column("indisreplident", SqlScalarType::Bool.nullable(false))
7074            .with_column("indkey", SqlScalarType::Int2Vector.nullable(false))
7075            .with_column("indoption", SqlScalarType::Int2Vector.nullable(false))
7076            .with_column("indexprs", SqlScalarType::String.nullable(true))
7077            .with_column("indpred", SqlScalarType::String.nullable(true))
7078            .with_key(vec![0, 1])
7079            .finish(),
7080        column_comments: BTreeMap::new(),
7081        sql: "SELECT
7082    mz_indexes.oid AS indexrelid,
7083    mz_relations.oid AS indrelid,
7084    COALESCE(
7085        (
7086            SELECT count(*)::pg_catalog.int2
7087            FROM mz_catalog.mz_columns
7088            JOIN mz_catalog.mz_relations mri ON mz_columns.id = mri.id
7089            WHERE mri.oid = mz_catalog.mz_relations.oid
7090        ),
7091        0::pg_catalog.int2
7092    ) AS indnatts,
7093    -- MZ doesn't support creating unique indexes so indisunique is filled with false
7094    false::pg_catalog.bool AS indisunique,
7095    false::pg_catalog.bool AS indisprimary,
7096    -- MZ doesn't support unique indexes so indimmediate is filled with false
7097    false::pg_catalog.bool AS indimmediate,
7098    -- MZ doesn't support CLUSTER so indisclustered is filled with false
7099    false::pg_catalog.bool AS indisclustered,
7100    -- MZ never creates invalid indexes so indisvalid is filled with true
7101    true::pg_catalog.bool AS indisvalid,
7102    -- MZ doesn't support replication so indisreplident is filled with false
7103    false::pg_catalog.bool AS indisreplident,
7104    -- Return zero if the index attribute is not a simple column reference, column position otherwise
7105    pg_catalog.string_agg(coalesce(mz_index_columns.on_position::int8, 0)::pg_catalog.text, ' ' ORDER BY mz_index_columns.index_position::int8)::pg_catalog.int2vector AS indkey,
7106    -- MZ doesn't have per-column flags, so returning a 0 for each column in the index
7107    pg_catalog.string_agg('0', ' ')::pg_catalog.int2vector AS indoption,
7108    -- Index expressions are returned in MZ format
7109    CASE pg_catalog.string_agg(mz_index_columns.on_expression, ' ' ORDER BY mz_index_columns.index_position::int8)
7110    WHEN NULL THEN NULL
7111    ELSE '{' || pg_catalog.string_agg(mz_index_columns.on_expression, '}, {' ORDER BY mz_index_columns.index_position::int8) || '}'
7112    END AS indexprs,
7113    -- MZ doesn't support indexes with predicates
7114    NULL::pg_catalog.text AS indpred
7115FROM mz_catalog.mz_indexes
7116JOIN mz_catalog.mz_relations ON mz_indexes.on_id = mz_relations.id
7117JOIN mz_catalog.mz_index_columns ON mz_index_columns.index_id = mz_indexes.id
7118JOIN mz_catalog.mz_schemas ON mz_schemas.id = mz_relations.schema_id
7119LEFT JOIN mz_catalog.mz_databases d ON d.id = mz_schemas.database_id
7120WHERE mz_schemas.database_id IS NULL OR d.name = pg_catalog.current_database()
7121GROUP BY mz_indexes.oid, mz_relations.oid",
7122        access: vec![PUBLIC_SELECT],
7123    }
7124});
7125
7126pub static PG_INDEXES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7127    name: "pg_indexes",
7128    schema: PG_CATALOG_SCHEMA,
7129    oid: oid::VIEW_PG_INDEXES_OID,
7130    desc: RelationDesc::builder()
7131        .with_column("table_catalog", SqlScalarType::String.nullable(false))
7132        .with_column("schemaname", SqlScalarType::String.nullable(false))
7133        .with_column("tablename", SqlScalarType::String.nullable(false))
7134        .with_column("indexname", SqlScalarType::String.nullable(false))
7135        .with_column("tablespace", SqlScalarType::String.nullable(true))
7136        .with_column("indexdef", SqlScalarType::String.nullable(true))
7137        .finish(),
7138    column_comments: BTreeMap::new(),
7139    sql: "SELECT
7140    current_database() as table_catalog,
7141    s.name AS schemaname,
7142    r.name AS tablename,
7143    i.name AS indexname,
7144    NULL::text AS tablespace,
7145    -- TODO(jkosh44) Fill in with actual index definition.
7146    NULL::text AS indexdef
7147FROM mz_catalog.mz_indexes i
7148JOIN mz_catalog.mz_relations r ON i.on_id = r.id
7149JOIN mz_catalog.mz_schemas s ON s.id = r.schema_id
7150LEFT JOIN mz_catalog.mz_databases d ON d.id = s.database_id
7151WHERE s.database_id IS NULL OR d.name = current_database()",
7152    access: vec![PUBLIC_SELECT],
7153});
7154
7155/// Peeled version of `PG_DESCRIPTION`:
7156/// - This doesn't check `mz_schemas.database_id IS NULL OR d.name = pg_catalog.current_database()`,
7157///   in order to make this view indexable.
7158/// - This has 2 extra columns for the database names, so that downstream views can check them
7159///   against `current_database()`.
7160pub static PG_DESCRIPTION_ALL_DATABASES: LazyLock<BuiltinView> = LazyLock::new(|| {
7161    BuiltinView {
7162        name: "pg_description_all_databases",
7163        schema: MZ_INTERNAL_SCHEMA,
7164        oid: oid::VIEW_PG_DESCRIPTION_ALL_DATABASES_OID,
7165        desc: RelationDesc::builder()
7166            .with_column("objoid", SqlScalarType::Oid.nullable(false))
7167            .with_column("classoid", SqlScalarType::Oid.nullable(true))
7168            .with_column("objsubid", SqlScalarType::Int32.nullable(false))
7169            .with_column("description", SqlScalarType::String.nullable(false))
7170            .with_column("oid_database_name", SqlScalarType::String.nullable(true))
7171            .with_column("class_database_name", SqlScalarType::String.nullable(true))
7172            .finish(),
7173        column_comments: BTreeMap::new(),
7174        sql: "
7175(
7176    -- Gather all of the class oid's for objects that can have comments.
7177    WITH pg_classoids AS (
7178        SELECT oid, database_name as oid_database_name,
7179          (SELECT oid FROM mz_internal.pg_class_all_databases WHERE relname = 'pg_class') AS classoid,
7180          (SELECT database_name FROM mz_internal.pg_class_all_databases WHERE relname = 'pg_class') AS class_database_name
7181        FROM mz_internal.pg_class_all_databases
7182        UNION ALL
7183        SELECT oid, database_name as oid_database_name,
7184          (SELECT oid FROM mz_internal.pg_class_all_databases WHERE relname = 'pg_type') AS classoid,
7185          (SELECT database_name FROM mz_internal.pg_class_all_databases WHERE relname = 'pg_type') AS class_database_name
7186        FROM mz_internal.pg_type_all_databases
7187        UNION ALL
7188        SELECT oid, database_name as oid_database_name,
7189          (SELECT oid FROM mz_internal.pg_class_all_databases WHERE relname = 'pg_namespace') AS classoid,
7190          (SELECT database_name FROM mz_internal.pg_class_all_databases WHERE relname = 'pg_namespace') AS class_database_name
7191        FROM mz_internal.pg_namespace_all_databases
7192    ),
7193
7194    -- Gather all of the MZ ids for objects that can have comments.
7195    mz_objects AS (
7196        SELECT id, oid, type FROM mz_catalog.mz_objects
7197        UNION ALL
7198        SELECT id, oid, 'schema' AS type FROM mz_catalog.mz_schemas
7199    )
7200    SELECT
7201        pg_classoids.oid AS objoid,
7202        pg_classoids.classoid as classoid,
7203        COALESCE(cmt.object_sub_id, 0) AS objsubid,
7204        cmt.comment AS description,
7205        -- Columns added because of the peeling. (Note that there are 2 of these here.)
7206        oid_database_name,
7207        class_database_name
7208    FROM
7209        pg_classoids
7210    JOIN
7211        mz_objects ON pg_classoids.oid = mz_objects.oid
7212    JOIN
7213        mz_internal.mz_comments AS cmt ON mz_objects.id = cmt.id AND lower(mz_objects.type) = lower(cmt.object_type)
7214)",
7215        access: vec![PUBLIC_SELECT],
7216    }
7217});
7218
7219pub const PG_DESCRIPTION_ALL_DATABASES_IND: BuiltinIndex = BuiltinIndex {
7220    name: "pg_description_all_databases_ind",
7221    schema: MZ_INTERNAL_SCHEMA,
7222    oid: oid::INDEX_PG_DESCRIPTION_ALL_DATABASES_IND_OID,
7223    sql: "IN CLUSTER mz_catalog_server
7224ON mz_internal.pg_description_all_databases (objoid, classoid, objsubid, description, oid_database_name, class_database_name)",
7225    is_retained_metrics_object: false,
7226};
7227
7228/// Note: Databases, Roles, Clusters, Cluster Replicas, Secrets, and Connections are excluded from
7229/// this view for Postgres compatibility. Specifically, there is no classoid for these objects,
7230/// which is required for this view.
7231pub static PG_DESCRIPTION: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7232    name: "pg_description",
7233    schema: PG_CATALOG_SCHEMA,
7234    oid: oid::VIEW_PG_DESCRIPTION_OID,
7235    desc: RelationDesc::builder()
7236        .with_column("objoid", SqlScalarType::Oid.nullable(false))
7237        .with_column("classoid", SqlScalarType::Oid.nullable(true))
7238        .with_column("objsubid", SqlScalarType::Int32.nullable(false))
7239        .with_column("description", SqlScalarType::String.nullable(false))
7240        .finish(),
7241    column_comments: BTreeMap::new(),
7242    sql: "
7243SELECT
7244    objoid,
7245    classoid,
7246    objsubid,
7247    description
7248FROM
7249    mz_internal.pg_description_all_databases
7250WHERE
7251    (oid_database_name IS NULL OR oid_database_name = pg_catalog.current_database()) AND
7252    (class_database_name IS NULL OR class_database_name = pg_catalog.current_database());",
7253    access: vec![PUBLIC_SELECT],
7254});
7255
7256/// Peeled version of `PG_TYPE`:
7257/// - This doesn't check `mz_schemas.database_id IS NULL OR d.name = pg_catalog.current_database()`,
7258///   in order to make this view indexable.
7259/// - This has the database name as an extra column, so that downstream views can check it against
7260///  `current_database()`.
7261pub static PG_TYPE_ALL_DATABASES: LazyLock<BuiltinView> = LazyLock::new(|| {
7262    BuiltinView {
7263        name: "pg_type_all_databases",
7264        schema: MZ_INTERNAL_SCHEMA,
7265        oid: oid::VIEW_PG_TYPE_ALL_DATABASES_OID,
7266        desc: RelationDesc::builder()
7267            .with_column("oid", SqlScalarType::Oid.nullable(false))
7268            .with_column("typname", SqlScalarType::String.nullable(false))
7269            .with_column("typnamespace", SqlScalarType::Oid.nullable(false))
7270            .with_column("typowner", SqlScalarType::Oid.nullable(false))
7271            .with_column("typlen", SqlScalarType::Int16.nullable(true))
7272            .with_column("typtype", SqlScalarType::PgLegacyChar.nullable(false))
7273            .with_column("typcategory", SqlScalarType::PgLegacyChar.nullable(true))
7274            .with_column("typdelim", SqlScalarType::PgLegacyChar.nullable(false))
7275            .with_column("typrelid", SqlScalarType::Oid.nullable(false))
7276            .with_column("typelem", SqlScalarType::Oid.nullable(false))
7277            .with_column("typarray", SqlScalarType::Oid.nullable(false))
7278            .with_column("typinput", SqlScalarType::RegProc.nullable(true))
7279            .with_column("typreceive", SqlScalarType::Oid.nullable(false))
7280            .with_column("typnotnull", SqlScalarType::Bool.nullable(false))
7281            .with_column("typbasetype", SqlScalarType::Oid.nullable(false))
7282            .with_column("typtypmod", SqlScalarType::Int32.nullable(false))
7283            .with_column("typcollation", SqlScalarType::Oid.nullable(false))
7284            .with_column("typdefault", SqlScalarType::String.nullable(true))
7285            .with_column("database_name", SqlScalarType::String.nullable(true))
7286            .finish(),
7287        column_comments: BTreeMap::new(),
7288        sql: "
7289SELECT
7290    mz_types.oid,
7291    mz_types.name AS typname,
7292    mz_schemas.oid AS typnamespace,
7293    role_owner.oid AS typowner,
7294    NULL::pg_catalog.int2 AS typlen,
7295    -- 'a' is used internally to denote an array type, but in postgres they show up
7296    -- as 'b'.
7297    (CASE mztype WHEN 'a' THEN 'b' ELSE mztype END)::pg_catalog.char AS typtype,
7298    (CASE category
7299        WHEN 'array' THEN 'A'
7300        WHEN 'bit-string' THEN 'V'
7301        WHEN 'boolean' THEN 'B'
7302        WHEN 'composite' THEN 'C'
7303        WHEN 'date-time' THEN 'D'
7304        WHEN 'enum' THEN 'E'
7305        WHEN 'geometric' THEN 'G'
7306        WHEN 'list' THEN 'U' -- List types are user-defined from PostgreSQL's perspective.
7307        WHEN 'network-address' THEN 'I'
7308        WHEN 'numeric' THEN 'N'
7309        WHEN 'pseudo' THEN 'P'
7310        WHEN 'string' THEN 'S'
7311        WHEN 'timespan' THEN 'T'
7312        WHEN 'user-defined' THEN 'U'
7313        WHEN 'unknown' THEN 'X'
7314    END)::pg_catalog.char AS typcategory,
7315    -- In pg only the 'box' type is not ','.
7316    ','::pg_catalog.char AS typdelim,
7317    0::pg_catalog.oid AS typrelid,
7318    coalesce(
7319        (
7320            SELECT t.oid
7321            FROM mz_catalog.mz_array_types a
7322            JOIN mz_catalog.mz_types t ON a.element_id = t.id
7323            WHERE a.id = mz_types.id
7324        ),
7325        0
7326    ) AS typelem,
7327    coalesce(
7328        (
7329            SELECT
7330                t.oid
7331            FROM
7332                mz_catalog.mz_array_types AS a
7333                JOIN mz_catalog.mz_types AS t ON a.id = t.id
7334            WHERE
7335                a.element_id = mz_types.id
7336        ),
7337        0
7338    )
7339        AS typarray,
7340    mz_internal.mz_type_pg_metadata.typinput::pg_catalog.regproc AS typinput,
7341    COALESCE(mz_internal.mz_type_pg_metadata.typreceive, 0) AS typreceive,
7342    false::pg_catalog.bool AS typnotnull,
7343    0::pg_catalog.oid AS typbasetype,
7344    -1::pg_catalog.int4 AS typtypmod,
7345    -- MZ doesn't support COLLATE so typcollation is filled with 0
7346    0::pg_catalog.oid AS typcollation,
7347    NULL::pg_catalog.text AS typdefault,
7348    d.name as database_name
7349FROM
7350    mz_catalog.mz_types
7351    LEFT JOIN mz_internal.mz_type_pg_metadata ON mz_catalog.mz_types.id = mz_internal.mz_type_pg_metadata.id
7352    JOIN mz_catalog.mz_schemas ON mz_schemas.id = mz_types.schema_id
7353    JOIN (
7354            -- 'a' is not a supported typtype, but we use it to denote an array. It is
7355            -- converted to the correct value above.
7356            SELECT id, 'a' AS mztype FROM mz_catalog.mz_array_types
7357            UNION ALL SELECT id, 'b' FROM mz_catalog.mz_base_types
7358            UNION ALL SELECT id, 'l' FROM mz_catalog.mz_list_types
7359            UNION ALL SELECT id, 'm' FROM mz_catalog.mz_map_types
7360            UNION ALL SELECT id, 'p' FROM mz_catalog.mz_pseudo_types
7361        )
7362            AS t ON mz_types.id = t.id
7363    LEFT JOIN mz_catalog.mz_databases d ON d.id = mz_schemas.database_id
7364    JOIN mz_catalog.mz_roles role_owner ON role_owner.id = mz_types.owner_id",
7365        access: vec![PUBLIC_SELECT],
7366    }
7367});
7368
7369pub const PG_TYPE_ALL_DATABASES_IND: BuiltinIndex = BuiltinIndex {
7370    name: "pg_type_all_databases_ind",
7371    schema: MZ_INTERNAL_SCHEMA,
7372    oid: oid::INDEX_PG_TYPE_ALL_DATABASES_IND_OID,
7373    sql: "IN CLUSTER mz_catalog_server
7374ON mz_internal.pg_type_all_databases (oid)",
7375    is_retained_metrics_object: false,
7376};
7377
7378pub static PG_TYPE: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7379    name: "pg_type",
7380    schema: PG_CATALOG_SCHEMA,
7381    oid: oid::VIEW_PG_TYPE_OID,
7382    desc: RelationDesc::builder()
7383        .with_column("oid", SqlScalarType::Oid.nullable(false))
7384        .with_column("typname", SqlScalarType::String.nullable(false))
7385        .with_column("typnamespace", SqlScalarType::Oid.nullable(false))
7386        .with_column("typowner", SqlScalarType::Oid.nullable(false))
7387        .with_column("typlen", SqlScalarType::Int16.nullable(true))
7388        .with_column("typtype", SqlScalarType::PgLegacyChar.nullable(false))
7389        .with_column("typcategory", SqlScalarType::PgLegacyChar.nullable(true))
7390        .with_column("typdelim", SqlScalarType::PgLegacyChar.nullable(false))
7391        .with_column("typrelid", SqlScalarType::Oid.nullable(false))
7392        .with_column("typelem", SqlScalarType::Oid.nullable(false))
7393        .with_column("typarray", SqlScalarType::Oid.nullable(false))
7394        .with_column("typinput", SqlScalarType::RegProc.nullable(true))
7395        .with_column("typreceive", SqlScalarType::Oid.nullable(false))
7396        .with_column("typnotnull", SqlScalarType::Bool.nullable(false))
7397        .with_column("typbasetype", SqlScalarType::Oid.nullable(false))
7398        .with_column("typtypmod", SqlScalarType::Int32.nullable(false))
7399        .with_column("typcollation", SqlScalarType::Oid.nullable(false))
7400        .with_column("typdefault", SqlScalarType::String.nullable(true))
7401        .finish(),
7402    column_comments: BTreeMap::new(),
7403    sql: "SELECT
7404    oid, typname, typnamespace, typowner, typlen, typtype, typcategory, typdelim, typrelid, typelem,
7405    typarray, typinput, typreceive, typnotnull, typbasetype, typtypmod, typcollation, typdefault
7406FROM mz_internal.pg_type_all_databases
7407WHERE database_name IS NULL OR database_name = pg_catalog.current_database();",
7408    access: vec![PUBLIC_SELECT],
7409});
7410
7411/// Peeled version of `PG_ATTRIBUTE`:
7412/// - This doesn't check `mz_schemas.database_id IS NULL OR d.name = pg_catalog.current_database()`,
7413///   in order to make this view indexable.
7414/// - This has 2 extra columns for the database names, so that downstream views can check them
7415///   against `current_database()`.
7416pub static PG_ATTRIBUTE_ALL_DATABASES: LazyLock<BuiltinView> = LazyLock::new(|| {
7417    BuiltinView {
7418        name: "pg_attribute_all_databases",
7419        schema: MZ_INTERNAL_SCHEMA,
7420        oid: oid::VIEW_PG_ATTRIBUTE_ALL_DATABASES_OID,
7421        desc: RelationDesc::builder()
7422            .with_column("attrelid", SqlScalarType::Oid.nullable(false))
7423            .with_column("attname", SqlScalarType::String.nullable(false))
7424            .with_column("atttypid", SqlScalarType::Oid.nullable(false))
7425            .with_column("attlen", SqlScalarType::Int16.nullable(true))
7426            .with_column("attnum", SqlScalarType::Int16.nullable(false))
7427            .with_column("atttypmod", SqlScalarType::Int32.nullable(false))
7428            .with_column("attnotnull", SqlScalarType::Bool.nullable(false))
7429            .with_column("atthasdef", SqlScalarType::Bool.nullable(false))
7430            .with_column("attidentity", SqlScalarType::PgLegacyChar.nullable(false))
7431            .with_column("attgenerated", SqlScalarType::PgLegacyChar.nullable(false))
7432            .with_column("attisdropped", SqlScalarType::Bool.nullable(false))
7433            .with_column("attcollation", SqlScalarType::Oid.nullable(false))
7434            .with_column("database_name", SqlScalarType::String.nullable(true))
7435            .with_column("pg_type_database_name", SqlScalarType::String.nullable(true))
7436            .finish(),
7437        column_comments: BTreeMap::new(),
7438        sql: "
7439SELECT
7440    class_objects.oid as attrelid,
7441    mz_columns.name as attname,
7442    mz_columns.type_oid AS atttypid,
7443    pg_type_all_databases.typlen AS attlen,
7444    position::int8::int2 as attnum,
7445    mz_columns.type_mod as atttypmod,
7446    NOT nullable as attnotnull,
7447    mz_columns.default IS NOT NULL as atthasdef,
7448    ''::pg_catalog.\"char\" as attidentity,
7449    -- MZ doesn't support generated columns so attgenerated is filled with ''
7450    ''::pg_catalog.\"char\" as attgenerated,
7451    FALSE as attisdropped,
7452    -- MZ doesn't support COLLATE so attcollation is filled with 0
7453    0::pg_catalog.oid as attcollation,
7454    -- Columns added because of the peeling. (Note that there are 2 of these here.)
7455    d.name as database_name,
7456    pg_type_all_databases.database_name as pg_type_database_name
7457FROM (
7458    -- pg_attribute catalogs columns on relations and indexes
7459    SELECT id, oid, schema_id, name, type FROM mz_catalog.mz_relations
7460    UNION ALL
7461        SELECT mz_indexes.id, mz_indexes.oid, mz_relations.schema_id, mz_indexes.name, 'index' AS type
7462        FROM mz_catalog.mz_indexes
7463        JOIN mz_catalog.mz_relations ON mz_indexes.on_id = mz_relations.id
7464) AS class_objects
7465JOIN mz_catalog.mz_columns ON class_objects.id = mz_columns.id
7466JOIN mz_internal.pg_type_all_databases ON pg_type_all_databases.oid = mz_columns.type_oid
7467JOIN mz_catalog.mz_schemas ON mz_schemas.id = class_objects.schema_id
7468LEFT JOIN mz_catalog.mz_databases d ON d.id = mz_schemas.database_id",
7469        // Since this depends on pg_type, its id must be higher due to initialization
7470        // ordering.
7471        access: vec![PUBLIC_SELECT],
7472    }
7473});
7474
7475pub const PG_ATTRIBUTE_ALL_DATABASES_IND: BuiltinIndex = BuiltinIndex {
7476    name: "pg_attribute_all_databases_ind",
7477    schema: MZ_INTERNAL_SCHEMA,
7478    oid: oid::INDEX_PG_ATTRIBUTE_ALL_DATABASES_IND_OID,
7479    sql: "IN CLUSTER mz_catalog_server
7480ON mz_internal.pg_attribute_all_databases (
7481    attrelid, attname, atttypid, attlen, attnum, atttypmod, attnotnull, atthasdef, attidentity,
7482    attgenerated, attisdropped, attcollation, database_name, pg_type_database_name
7483)",
7484    is_retained_metrics_object: false,
7485};
7486
7487pub static PG_ATTRIBUTE: LazyLock<BuiltinView> = LazyLock::new(|| {
7488    BuiltinView {
7489        name: "pg_attribute",
7490        schema: PG_CATALOG_SCHEMA,
7491        oid: oid::VIEW_PG_ATTRIBUTE_OID,
7492        desc: RelationDesc::builder()
7493            .with_column("attrelid", SqlScalarType::Oid.nullable(false))
7494            .with_column("attname", SqlScalarType::String.nullable(false))
7495            .with_column("atttypid", SqlScalarType::Oid.nullable(false))
7496            .with_column("attlen", SqlScalarType::Int16.nullable(true))
7497            .with_column("attnum", SqlScalarType::Int16.nullable(false))
7498            .with_column("atttypmod", SqlScalarType::Int32.nullable(false))
7499            .with_column("attnotnull", SqlScalarType::Bool.nullable(false))
7500            .with_column("atthasdef", SqlScalarType::Bool.nullable(false))
7501            .with_column("attidentity", SqlScalarType::PgLegacyChar.nullable(false))
7502            .with_column("attgenerated", SqlScalarType::PgLegacyChar.nullable(false))
7503            .with_column("attisdropped", SqlScalarType::Bool.nullable(false))
7504            .with_column("attcollation", SqlScalarType::Oid.nullable(false))
7505            .finish(),
7506        column_comments: BTreeMap::new(),
7507        sql: "
7508SELECT
7509    attrelid, attname, atttypid, attlen, attnum, atttypmod, attnotnull, atthasdef, attidentity,
7510    attgenerated, attisdropped, attcollation
7511FROM mz_internal.pg_attribute_all_databases
7512WHERE
7513  (database_name IS NULL OR database_name = pg_catalog.current_database()) AND
7514  (pg_type_database_name IS NULL OR pg_type_database_name = pg_catalog.current_database());",
7515        // Since this depends on pg_type, its id must be higher due to initialization
7516        // ordering.
7517        access: vec![PUBLIC_SELECT],
7518    }
7519});
7520
7521pub static PG_PROC: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7522    name: "pg_proc",
7523    schema: PG_CATALOG_SCHEMA,
7524    oid: oid::VIEW_PG_PROC_OID,
7525    desc: RelationDesc::builder()
7526        .with_column("oid", SqlScalarType::Oid.nullable(false))
7527        .with_column("proname", SqlScalarType::String.nullable(false))
7528        .with_column("pronamespace", SqlScalarType::Oid.nullable(false))
7529        .with_column("proowner", SqlScalarType::Oid.nullable(false))
7530        .with_column("proargdefaults", SqlScalarType::String.nullable(true))
7531        .with_column("prorettype", SqlScalarType::Oid.nullable(false))
7532        .finish(),
7533    column_comments: BTreeMap::new(),
7534    sql: "SELECT
7535    mz_functions.oid,
7536    mz_functions.name AS proname,
7537    mz_schemas.oid AS pronamespace,
7538    role_owner.oid AS proowner,
7539    NULL::pg_catalog.text AS proargdefaults,
7540    ret_type.oid AS prorettype
7541FROM mz_catalog.mz_functions
7542JOIN mz_catalog.mz_schemas ON mz_functions.schema_id = mz_schemas.id
7543LEFT JOIN mz_catalog.mz_databases d ON d.id = mz_schemas.database_id
7544JOIN mz_catalog.mz_types AS ret_type ON mz_functions.return_type_id = ret_type.id
7545JOIN mz_catalog.mz_roles role_owner ON role_owner.id = mz_functions.owner_id
7546WHERE mz_schemas.database_id IS NULL OR d.name = pg_catalog.current_database()",
7547    access: vec![PUBLIC_SELECT],
7548});
7549
7550pub static PG_OPERATOR: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7551    name: "pg_operator",
7552    schema: PG_CATALOG_SCHEMA,
7553    oid: oid::VIEW_PG_OPERATOR_OID,
7554    desc: RelationDesc::builder()
7555        .with_column("oid", SqlScalarType::Oid.nullable(false))
7556        .with_column("oprname", SqlScalarType::String.nullable(false))
7557        .with_column("oprresult", SqlScalarType::Oid.nullable(false))
7558        .with_column("oprleft", SqlScalarType::Oid.nullable(false))
7559        .with_column("oprright", SqlScalarType::Oid.nullable(false))
7560        .with_key(vec![0, 1, 2, 3, 4])
7561        .finish(),
7562    column_comments: BTreeMap::new(),
7563    sql: "SELECT
7564    mz_operators.oid,
7565    mz_operators.name AS oprname,
7566    ret_type.oid AS oprresult,
7567    left_type.oid as oprleft,
7568    right_type.oid as oprright
7569FROM mz_catalog.mz_operators
7570JOIN mz_catalog.mz_types AS ret_type ON mz_operators.return_type_id = ret_type.id
7571JOIN mz_catalog.mz_types AS left_type ON mz_operators.argument_type_ids[1] = left_type.id
7572JOIN mz_catalog.mz_types AS right_type ON mz_operators.argument_type_ids[2] = right_type.id
7573WHERE array_length(mz_operators.argument_type_ids, 1) = 2
7574UNION SELECT
7575    mz_operators.oid,
7576    mz_operators.name AS oprname,
7577    ret_type.oid AS oprresult,
7578    0 as oprleft,
7579    right_type.oid as oprright
7580FROM mz_catalog.mz_operators
7581JOIN mz_catalog.mz_types AS ret_type ON mz_operators.return_type_id = ret_type.id
7582JOIN mz_catalog.mz_types AS right_type ON mz_operators.argument_type_ids[1] = right_type.id
7583WHERE array_length(mz_operators.argument_type_ids, 1) = 1",
7584    access: vec![PUBLIC_SELECT],
7585});
7586
7587pub static PG_RANGE: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7588    name: "pg_range",
7589    schema: PG_CATALOG_SCHEMA,
7590    oid: oid::VIEW_PG_RANGE_OID,
7591    desc: RelationDesc::builder()
7592        .with_column("rngtypid", SqlScalarType::Oid.nullable(false))
7593        .with_column("rngsubtype", SqlScalarType::Oid.nullable(false))
7594        .with_key(vec![])
7595        .finish(),
7596    column_comments: BTreeMap::new(),
7597    sql: "SELECT
7598    NULL::pg_catalog.oid AS rngtypid,
7599    NULL::pg_catalog.oid AS rngsubtype
7600WHERE false",
7601    access: vec![PUBLIC_SELECT],
7602});
7603
7604pub static PG_ENUM: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7605    name: "pg_enum",
7606    schema: PG_CATALOG_SCHEMA,
7607    oid: oid::VIEW_PG_ENUM_OID,
7608    desc: RelationDesc::builder()
7609        .with_column("oid", SqlScalarType::Oid.nullable(false))
7610        .with_column("enumtypid", SqlScalarType::Oid.nullable(false))
7611        .with_column("enumsortorder", SqlScalarType::Float32.nullable(false))
7612        .with_column("enumlabel", SqlScalarType::String.nullable(false))
7613        .with_key(vec![])
7614        .finish(),
7615    column_comments: BTreeMap::new(),
7616    sql: "SELECT
7617    NULL::pg_catalog.oid AS oid,
7618    NULL::pg_catalog.oid AS enumtypid,
7619    NULL::pg_catalog.float4 AS enumsortorder,
7620    NULL::pg_catalog.text AS enumlabel
7621WHERE false",
7622    access: vec![PUBLIC_SELECT],
7623});
7624
7625/// Peeled version of `PG_ATTRDEF`:
7626/// - This doesn't check `mz_schemas.database_id IS NULL OR d.name = pg_catalog.current_database()`,
7627///   in order to make this view indexable.
7628pub static PG_ATTRDEF_ALL_DATABASES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7629    name: "pg_attrdef_all_databases",
7630    schema: MZ_INTERNAL_SCHEMA,
7631    oid: oid::VIEW_PG_ATTRDEF_ALL_DATABASES_OID,
7632    desc: RelationDesc::builder()
7633        .with_column("oid", SqlScalarType::Oid.nullable(true))
7634        .with_column("adrelid", SqlScalarType::Oid.nullable(false))
7635        .with_column("adnum", SqlScalarType::Int64.nullable(false))
7636        .with_column("adbin", SqlScalarType::String.nullable(false))
7637        .with_column("adsrc", SqlScalarType::String.nullable(false))
7638        .finish(),
7639    column_comments: BTreeMap::new(),
7640    sql: "
7641SELECT
7642    NULL::pg_catalog.oid AS oid,
7643    mz_objects.oid AS adrelid,
7644    mz_columns.position::int8 AS adnum,
7645    mz_columns.default AS adbin,
7646    mz_columns.default AS adsrc
7647FROM mz_catalog.mz_columns
7648    JOIN mz_catalog.mz_objects ON mz_columns.id = mz_objects.id
7649WHERE default IS NOT NULL",
7650    access: vec![PUBLIC_SELECT],
7651});
7652
7653pub const PG_ATTRDEF_ALL_DATABASES_IND: BuiltinIndex = BuiltinIndex {
7654    name: "pg_attrdef_all_databases_ind",
7655    schema: MZ_INTERNAL_SCHEMA,
7656    oid: oid::INDEX_PG_ATTRDEF_ALL_DATABASES_IND_OID,
7657    sql: "IN CLUSTER mz_catalog_server
7658ON mz_internal.pg_attrdef_all_databases (oid, adrelid, adnum, adbin, adsrc)",
7659    is_retained_metrics_object: false,
7660};
7661
7662pub static PG_ATTRDEF: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7663    name: "pg_attrdef",
7664    schema: PG_CATALOG_SCHEMA,
7665    oid: oid::VIEW_PG_ATTRDEF_OID,
7666    desc: RelationDesc::builder()
7667        .with_column("oid", SqlScalarType::Oid.nullable(true))
7668        .with_column("adrelid", SqlScalarType::Oid.nullable(false))
7669        .with_column("adnum", SqlScalarType::Int64.nullable(false))
7670        .with_column("adbin", SqlScalarType::String.nullable(false))
7671        .with_column("adsrc", SqlScalarType::String.nullable(false))
7672        .finish(),
7673    column_comments: BTreeMap::new(),
7674    sql: "
7675SELECT
7676    pg_attrdef_all_databases.oid as oid,
7677    adrelid,
7678    adnum,
7679    adbin,
7680    adsrc
7681FROM mz_internal.pg_attrdef_all_databases
7682    JOIN mz_catalog.mz_databases d ON (d.id IS NULL OR d.name = pg_catalog.current_database());",
7683    access: vec![PUBLIC_SELECT],
7684});
7685
7686pub static PG_SETTINGS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7687    name: "pg_settings",
7688    schema: PG_CATALOG_SCHEMA,
7689    oid: oid::VIEW_PG_SETTINGS_OID,
7690    desc: RelationDesc::builder()
7691        .with_column("name", SqlScalarType::String.nullable(false))
7692        .with_column("setting", SqlScalarType::String.nullable(false))
7693        .with_key(vec![])
7694        .finish(),
7695    column_comments: BTreeMap::new(),
7696    sql: "SELECT
7697    name, setting
7698FROM (VALUES
7699    ('max_index_keys'::pg_catalog.text, '1000'::pg_catalog.text)
7700) AS _ (name, setting)",
7701    access: vec![PUBLIC_SELECT],
7702});
7703
7704pub static PG_AUTH_MEMBERS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7705    name: "pg_auth_members",
7706    schema: PG_CATALOG_SCHEMA,
7707    oid: oid::VIEW_PG_AUTH_MEMBERS_OID,
7708    desc: RelationDesc::builder()
7709        .with_column("roleid", SqlScalarType::Oid.nullable(false))
7710        .with_column("member", SqlScalarType::Oid.nullable(false))
7711        .with_column("grantor", SqlScalarType::Oid.nullable(false))
7712        .with_column("admin_option", SqlScalarType::Bool.nullable(false))
7713        .finish(),
7714    column_comments: BTreeMap::new(),
7715    sql: "SELECT
7716    role.oid AS roleid,
7717    member.oid AS member,
7718    grantor.oid AS grantor,
7719    -- Materialize hasn't implemented admin_option.
7720    false as admin_option
7721FROM mz_catalog.mz_role_members membership
7722JOIN mz_catalog.mz_roles role ON membership.role_id = role.id
7723JOIN mz_catalog.mz_roles member ON membership.member = member.id
7724JOIN mz_catalog.mz_roles grantor ON membership.grantor = grantor.id",
7725    access: vec![PUBLIC_SELECT],
7726});
7727
7728pub static PG_EVENT_TRIGGER: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7729    name: "pg_event_trigger",
7730    schema: PG_CATALOG_SCHEMA,
7731    oid: oid::VIEW_PG_EVENT_TRIGGER_OID,
7732    desc: RelationDesc::builder()
7733        .with_column("oid", SqlScalarType::Oid.nullable(false))
7734        .with_column("evtname", SqlScalarType::String.nullable(false))
7735        .with_column("evtevent", SqlScalarType::String.nullable(false))
7736        .with_column("evtowner", SqlScalarType::Oid.nullable(false))
7737        .with_column("evtfoid", SqlScalarType::Oid.nullable(false))
7738        .with_column("evtenabled", SqlScalarType::PgLegacyChar.nullable(false))
7739        .with_column(
7740            "evttags",
7741            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(false),
7742        )
7743        .with_key(vec![])
7744        .finish(),
7745    column_comments: BTreeMap::new(),
7746    sql: "SELECT
7747        NULL::pg_catalog.oid AS oid,
7748        NULL::pg_catalog.text AS evtname,
7749        NULL::pg_catalog.text AS evtevent,
7750        NULL::pg_catalog.oid AS evtowner,
7751        NULL::pg_catalog.oid AS evtfoid,
7752        NULL::pg_catalog.char AS evtenabled,
7753        NULL::pg_catalog.text[] AS evttags
7754    WHERE false",
7755    access: vec![PUBLIC_SELECT],
7756});
7757
7758pub static PG_LANGUAGE: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7759    name: "pg_language",
7760    schema: PG_CATALOG_SCHEMA,
7761    oid: oid::VIEW_PG_LANGUAGE_OID,
7762    desc: RelationDesc::builder()
7763        .with_column("oid", SqlScalarType::Oid.nullable(false))
7764        .with_column("lanname", SqlScalarType::String.nullable(false))
7765        .with_column("lanowner", SqlScalarType::Oid.nullable(false))
7766        .with_column("lanispl", SqlScalarType::Bool.nullable(false))
7767        .with_column("lanpltrusted", SqlScalarType::Bool.nullable(false))
7768        .with_column("lanplcallfoid", SqlScalarType::Oid.nullable(false))
7769        .with_column("laninline", SqlScalarType::Oid.nullable(false))
7770        .with_column("lanvalidator", SqlScalarType::Oid.nullable(false))
7771        .with_column(
7772            "lanacl",
7773            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(false),
7774        )
7775        .with_key(vec![])
7776        .finish(),
7777    column_comments: BTreeMap::new(),
7778    sql: "SELECT
7779        NULL::pg_catalog.oid  AS oid,
7780        NULL::pg_catalog.text AS lanname,
7781        NULL::pg_catalog.oid  AS lanowner,
7782        NULL::pg_catalog.bool AS lanispl,
7783        NULL::pg_catalog.bool AS lanpltrusted,
7784        NULL::pg_catalog.oid  AS lanplcallfoid,
7785        NULL::pg_catalog.oid  AS laninline,
7786        NULL::pg_catalog.oid  AS lanvalidator,
7787        NULL::pg_catalog.text[] AS lanacl
7788    WHERE false",
7789    access: vec![PUBLIC_SELECT],
7790});
7791
7792pub static PG_SHDESCRIPTION: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7793    name: "pg_shdescription",
7794    schema: PG_CATALOG_SCHEMA,
7795    oid: oid::VIEW_PG_SHDESCRIPTION_OID,
7796    desc: RelationDesc::builder()
7797        .with_column("objoid", SqlScalarType::Oid.nullable(false))
7798        .with_column("classoid", SqlScalarType::Oid.nullable(false))
7799        .with_column("description", SqlScalarType::String.nullable(false))
7800        .with_key(vec![])
7801        .finish(),
7802    column_comments: BTreeMap::new(),
7803    sql: "SELECT
7804        NULL::pg_catalog.oid AS objoid,
7805        NULL::pg_catalog.oid AS classoid,
7806        NULL::pg_catalog.text AS description
7807    WHERE false",
7808    access: vec![PUBLIC_SELECT],
7809});
7810
7811pub static PG_TIMEZONE_ABBREVS: LazyLock<BuiltinView> = LazyLock::new(|| {
7812    BuiltinView {
7813        name: "pg_timezone_abbrevs",
7814        schema: PG_CATALOG_SCHEMA,
7815        oid: oid::VIEW_PG_TIMEZONE_ABBREVS_OID,
7816        desc: RelationDesc::builder()
7817            .with_column("abbrev", SqlScalarType::String.nullable(false))
7818            .with_column("utc_offset", SqlScalarType::Interval.nullable(true))
7819            .with_column("is_dst", SqlScalarType::Bool.nullable(true))
7820            .with_key(vec![0])
7821            .finish(),
7822        column_comments: BTreeMap::new(),
7823        sql: "SELECT
7824    abbreviation AS abbrev,
7825    COALESCE(utc_offset, timezone_offset(timezone_name, now()).base_utc_offset + timezone_offset(timezone_name, now()).dst_offset)
7826        AS utc_offset,
7827    COALESCE(dst, timezone_offset(timezone_name, now()).dst_offset <> INTERVAL '0')
7828        AS is_dst
7829FROM mz_catalog.mz_timezone_abbreviations",
7830        access: vec![PUBLIC_SELECT],
7831    }
7832});
7833
7834pub static PG_TIMEZONE_NAMES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7835    name: "pg_timezone_names",
7836    schema: PG_CATALOG_SCHEMA,
7837    oid: oid::VIEW_PG_TIMEZONE_NAMES_OID,
7838    desc: RelationDesc::builder()
7839        .with_column("name", SqlScalarType::String.nullable(false))
7840        .with_column("abbrev", SqlScalarType::String.nullable(true))
7841        .with_column("utc_offset", SqlScalarType::Interval.nullable(true))
7842        .with_column("is_dst", SqlScalarType::Bool.nullable(true))
7843        .with_key(vec![0])
7844        .finish(),
7845    column_comments: BTreeMap::new(),
7846    sql: "SELECT
7847    name,
7848    timezone_offset(name, now()).abbrev AS abbrev,
7849    timezone_offset(name, now()).base_utc_offset + timezone_offset(name, now()).dst_offset
7850        AS utc_offset,
7851    timezone_offset(name, now()).dst_offset <> INTERVAL '0'
7852        AS is_dst
7853FROM mz_catalog.mz_timezone_names",
7854    access: vec![PUBLIC_SELECT],
7855});
7856
7857pub static MZ_TIMEZONE_ABBREVIATIONS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7858    name: "mz_timezone_abbreviations",
7859    schema: MZ_CATALOG_SCHEMA,
7860    oid: oid::VIEW_MZ_TIMEZONE_ABBREVIATIONS_OID,
7861    desc: RelationDesc::builder()
7862        .with_column("abbreviation", SqlScalarType::String.nullable(false))
7863        .with_column("utc_offset", SqlScalarType::Interval.nullable(true))
7864        .with_column("dst", SqlScalarType::Bool.nullable(true))
7865        .with_column("timezone_name", SqlScalarType::String.nullable(true))
7866        .with_key(vec![0])
7867        .finish(),
7868    column_comments: BTreeMap::from_iter([
7869        ("abbreviation", "The timezone abbreviation."),
7870        (
7871            "utc_offset",
7872            "The UTC offset of the timezone or `NULL` if fixed.",
7873        ),
7874        (
7875            "dst",
7876            "Whether the timezone is in daylight savings or `NULL` if fixed.",
7877        ),
7878        (
7879            "timezone_name",
7880            "The full name of the non-fixed timezone or `NULL` if not fixed.",
7881        ),
7882    ]),
7883    sql: format!(
7884        "SELECT * FROM ({}) _ (abbreviation, utc_offset, dst, timezone_name)",
7885        mz_pgtz::abbrev::MZ_CATALOG_TIMEZONE_ABBREVIATIONS_SQL,
7886    )
7887    .leak(),
7888    access: vec![PUBLIC_SELECT],
7889});
7890
7891pub static MZ_TIMEZONE_NAMES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7892    name: "mz_timezone_names",
7893    schema: MZ_CATALOG_SCHEMA,
7894    oid: oid::VIEW_MZ_TIMEZONE_NAMES_OID,
7895    desc: RelationDesc::builder()
7896        .with_column("name", SqlScalarType::String.nullable(false))
7897        .with_key(vec![0])
7898        .finish(),
7899    column_comments: BTreeMap::from_iter([("name", "The timezone name.")]),
7900    sql: format!(
7901        "SELECT * FROM ({}) _ (name)",
7902        mz_pgtz::timezone::MZ_CATALOG_TIMEZONE_NAMES_SQL,
7903    )
7904    .leak(),
7905    access: vec![PUBLIC_SELECT],
7906});
7907
7908pub static MZ_PEEK_DURATIONS_HISTOGRAM_PER_WORKER: LazyLock<BuiltinView> =
7909    LazyLock::new(|| BuiltinView {
7910        name: "mz_peek_durations_histogram_per_worker",
7911        schema: MZ_INTROSPECTION_SCHEMA,
7912        oid: oid::VIEW_MZ_PEEK_DURATIONS_HISTOGRAM_PER_WORKER_OID,
7913        desc: RelationDesc::builder()
7914            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
7915            .with_column("type", SqlScalarType::String.nullable(false))
7916            .with_column("duration_ns", SqlScalarType::UInt64.nullable(false))
7917            .with_column("count", SqlScalarType::Int64.nullable(false))
7918            .with_key(vec![0, 1, 2])
7919            .finish(),
7920        column_comments: BTreeMap::new(),
7921        sql: "SELECT
7922    worker_id, type, duration_ns, pg_catalog.count(*) AS count
7923FROM
7924    mz_introspection.mz_peek_durations_histogram_raw
7925GROUP BY
7926    worker_id, type, duration_ns",
7927        access: vec![PUBLIC_SELECT],
7928    });
7929
7930pub static MZ_PEEK_DURATIONS_HISTOGRAM: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
7931    name: "mz_peek_durations_histogram",
7932    schema: MZ_INTROSPECTION_SCHEMA,
7933    oid: oid::VIEW_MZ_PEEK_DURATIONS_HISTOGRAM_OID,
7934    desc: RelationDesc::builder()
7935        .with_column("type", SqlScalarType::String.nullable(false))
7936        .with_column("duration_ns", SqlScalarType::UInt64.nullable(false))
7937        .with_column(
7938            "count",
7939            SqlScalarType::Numeric {
7940                max_scale: Some(NumericMaxScale::ZERO),
7941            }
7942            .nullable(false),
7943        )
7944        .with_key(vec![0, 1])
7945        .finish(),
7946    column_comments: BTreeMap::from_iter([
7947        ("type", "The peek variant: `index` or `persist`."),
7948        (
7949            "duration_ns",
7950            "The upper bound of the bucket in nanoseconds.",
7951        ),
7952        (
7953            "count",
7954            "The (noncumulative) count of peeks in this bucket.",
7955        ),
7956    ]),
7957    sql: "
7958SELECT
7959    type, duration_ns,
7960    pg_catalog.sum(count) AS count
7961FROM mz_introspection.mz_peek_durations_histogram_per_worker
7962GROUP BY type, duration_ns",
7963    access: vec![PUBLIC_SELECT],
7964});
7965
7966pub static MZ_DATAFLOW_SHUTDOWN_DURATIONS_HISTOGRAM_PER_WORKER: LazyLock<BuiltinView> =
7967    LazyLock::new(|| BuiltinView {
7968        name: "mz_dataflow_shutdown_durations_histogram_per_worker",
7969        schema: MZ_INTROSPECTION_SCHEMA,
7970        oid: oid::VIEW_MZ_DATAFLOW_SHUTDOWN_DURATIONS_HISTOGRAM_PER_WORKER_OID,
7971        desc: RelationDesc::builder()
7972            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
7973            .with_column("duration_ns", SqlScalarType::UInt64.nullable(false))
7974            .with_column("count", SqlScalarType::Int64.nullable(false))
7975            .with_key(vec![0, 1])
7976            .finish(),
7977        column_comments: BTreeMap::new(),
7978        sql: "SELECT
7979    worker_id, duration_ns, pg_catalog.count(*) AS count
7980FROM
7981    mz_introspection.mz_dataflow_shutdown_durations_histogram_raw
7982GROUP BY
7983    worker_id, duration_ns",
7984        access: vec![PUBLIC_SELECT],
7985    });
7986
7987pub static MZ_DATAFLOW_SHUTDOWN_DURATIONS_HISTOGRAM: LazyLock<BuiltinView> =
7988    LazyLock::new(|| BuiltinView {
7989        name: "mz_dataflow_shutdown_durations_histogram",
7990        schema: MZ_INTROSPECTION_SCHEMA,
7991        oid: oid::VIEW_MZ_DATAFLOW_SHUTDOWN_DURATIONS_HISTOGRAM_OID,
7992        desc: RelationDesc::builder()
7993            .with_column("duration_ns", SqlScalarType::UInt64.nullable(false))
7994            .with_column(
7995                "count",
7996                SqlScalarType::Numeric {
7997                    max_scale: Some(NumericMaxScale::ZERO),
7998                }
7999                .nullable(false),
8000            )
8001            .with_key(vec![0])
8002            .finish(),
8003        column_comments: BTreeMap::from_iter([
8004            (
8005                "duration_ns",
8006                "The upper bound of the bucket in nanoseconds.",
8007            ),
8008            (
8009                "count",
8010                "The (noncumulative) count of dataflows in this bucket.",
8011            ),
8012        ]),
8013        sql: "
8014SELECT
8015    duration_ns,
8016    pg_catalog.sum(count) AS count
8017FROM mz_introspection.mz_dataflow_shutdown_durations_histogram_per_worker
8018GROUP BY duration_ns",
8019        access: vec![PUBLIC_SELECT],
8020    });
8021
8022pub static MZ_SCHEDULING_ELAPSED_PER_WORKER: LazyLock<BuiltinView> =
8023    LazyLock::new(|| BuiltinView {
8024        name: "mz_scheduling_elapsed_per_worker",
8025        schema: MZ_INTROSPECTION_SCHEMA,
8026        oid: oid::VIEW_MZ_SCHEDULING_ELAPSED_PER_WORKER_OID,
8027        desc: RelationDesc::builder()
8028            .with_column("id", SqlScalarType::UInt64.nullable(false))
8029            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
8030            .with_column("elapsed_ns", SqlScalarType::Int64.nullable(false))
8031            .with_key(vec![0, 1])
8032            .finish(),
8033        column_comments: BTreeMap::new(),
8034        sql: "SELECT
8035    id, worker_id, pg_catalog.count(*) AS elapsed_ns
8036FROM
8037    mz_introspection.mz_scheduling_elapsed_raw
8038GROUP BY
8039    id, worker_id",
8040        access: vec![PUBLIC_SELECT],
8041    });
8042
8043pub static MZ_SCHEDULING_ELAPSED: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
8044    name: "mz_scheduling_elapsed",
8045    schema: MZ_INTROSPECTION_SCHEMA,
8046    oid: oid::VIEW_MZ_SCHEDULING_ELAPSED_OID,
8047    desc: RelationDesc::builder()
8048        .with_column("id", SqlScalarType::UInt64.nullable(false))
8049        .with_column(
8050            "elapsed_ns",
8051            SqlScalarType::Numeric {
8052                max_scale: Some(NumericMaxScale::ZERO),
8053            }
8054            .nullable(false),
8055        )
8056        .with_key(vec![0])
8057        .finish(),
8058    column_comments: BTreeMap::from_iter([
8059        (
8060            "id",
8061            "The ID of the operator. Corresponds to `mz_dataflow_operators.id`.",
8062        ),
8063        (
8064            "elapsed_ns",
8065            "The total elapsed time spent in the operator in nanoseconds.",
8066        ),
8067    ]),
8068    sql: "
8069SELECT
8070    id,
8071    pg_catalog.sum(elapsed_ns) AS elapsed_ns
8072FROM mz_introspection.mz_scheduling_elapsed_per_worker
8073GROUP BY id",
8074    access: vec![PUBLIC_SELECT],
8075});
8076
8077pub static MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM_PER_WORKER: LazyLock<BuiltinView> =
8078    LazyLock::new(|| BuiltinView {
8079        name: "mz_compute_operator_durations_histogram_per_worker",
8080        schema: MZ_INTROSPECTION_SCHEMA,
8081        oid: oid::VIEW_MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM_PER_WORKER_OID,
8082        desc: RelationDesc::builder()
8083            .with_column("id", SqlScalarType::UInt64.nullable(false))
8084            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
8085            .with_column("duration_ns", SqlScalarType::UInt64.nullable(false))
8086            .with_column("count", SqlScalarType::Int64.nullable(false))
8087            .with_key(vec![0, 1, 2])
8088            .finish(),
8089        column_comments: BTreeMap::new(),
8090        sql: "SELECT
8091    id, worker_id, duration_ns, pg_catalog.count(*) AS count
8092FROM
8093    mz_introspection.mz_compute_operator_durations_histogram_raw
8094GROUP BY
8095    id, worker_id, duration_ns",
8096        access: vec![PUBLIC_SELECT],
8097    });
8098
8099pub static MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM: LazyLock<BuiltinView> =
8100    LazyLock::new(|| BuiltinView {
8101        name: "mz_compute_operator_durations_histogram",
8102        schema: MZ_INTROSPECTION_SCHEMA,
8103        oid: oid::VIEW_MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM_OID,
8104        desc: RelationDesc::builder()
8105            .with_column("id", SqlScalarType::UInt64.nullable(false))
8106            .with_column("duration_ns", SqlScalarType::UInt64.nullable(false))
8107            .with_column(
8108                "count",
8109                SqlScalarType::Numeric {
8110                    max_scale: Some(NumericMaxScale::ZERO),
8111                }
8112                .nullable(false),
8113            )
8114            .with_key(vec![0, 1])
8115            .finish(),
8116        column_comments: BTreeMap::from_iter([
8117            (
8118                "id",
8119                "The ID of the operator. Corresponds to `mz_dataflow_operators.id`.",
8120            ),
8121            (
8122                "duration_ns",
8123                "The upper bound of the duration bucket in nanoseconds.",
8124            ),
8125            (
8126                "count",
8127                "The (noncumulative) count of invocations in the bucket.",
8128            ),
8129        ]),
8130        sql: "
8131SELECT
8132    id,
8133    duration_ns,
8134    pg_catalog.sum(count) AS count
8135FROM mz_introspection.mz_compute_operator_durations_histogram_per_worker
8136GROUP BY id, duration_ns",
8137        access: vec![PUBLIC_SELECT],
8138    });
8139
8140pub static MZ_SCHEDULING_PARKS_HISTOGRAM_PER_WORKER: LazyLock<BuiltinView> =
8141    LazyLock::new(|| BuiltinView {
8142        name: "mz_scheduling_parks_histogram_per_worker",
8143        schema: MZ_INTROSPECTION_SCHEMA,
8144        oid: oid::VIEW_MZ_SCHEDULING_PARKS_HISTOGRAM_PER_WORKER_OID,
8145        desc: RelationDesc::builder()
8146            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
8147            .with_column("slept_for_ns", SqlScalarType::UInt64.nullable(false))
8148            .with_column("requested_ns", SqlScalarType::UInt64.nullable(false))
8149            .with_column("count", SqlScalarType::Int64.nullable(false))
8150            .with_key(vec![0, 1, 2])
8151            .finish(),
8152        column_comments: BTreeMap::new(),
8153        sql: "SELECT
8154    worker_id, slept_for_ns, requested_ns, pg_catalog.count(*) AS count
8155FROM
8156    mz_introspection.mz_scheduling_parks_histogram_raw
8157GROUP BY
8158    worker_id, slept_for_ns, requested_ns",
8159        access: vec![PUBLIC_SELECT],
8160    });
8161
8162pub static MZ_SCHEDULING_PARKS_HISTOGRAM: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
8163    name: "mz_scheduling_parks_histogram",
8164    schema: MZ_INTROSPECTION_SCHEMA,
8165    oid: oid::VIEW_MZ_SCHEDULING_PARKS_HISTOGRAM_OID,
8166    desc: RelationDesc::builder()
8167        .with_column("slept_for_ns", SqlScalarType::UInt64.nullable(false))
8168        .with_column("requested_ns", SqlScalarType::UInt64.nullable(false))
8169        .with_column(
8170            "count",
8171            SqlScalarType::Numeric {
8172                max_scale: Some(NumericMaxScale::ZERO),
8173            }
8174            .nullable(false),
8175        )
8176        .with_key(vec![0, 1])
8177        .finish(),
8178    column_comments: BTreeMap::from_iter([
8179        (
8180            "slept_for_ns",
8181            "The actual length of the park event in nanoseconds.",
8182        ),
8183        (
8184            "requested_ns",
8185            "The requested length of the park event in nanoseconds.",
8186        ),
8187        (
8188            "count",
8189            "The (noncumulative) count of park events in this bucket.",
8190        ),
8191    ]),
8192    sql: "
8193SELECT
8194    slept_for_ns,
8195    requested_ns,
8196    pg_catalog.sum(count) AS count
8197FROM mz_introspection.mz_scheduling_parks_histogram_per_worker
8198GROUP BY slept_for_ns, requested_ns",
8199    access: vec![PUBLIC_SELECT],
8200});
8201
8202pub static MZ_COMPUTE_ERROR_COUNTS_PER_WORKER: LazyLock<BuiltinView> =
8203    LazyLock::new(|| BuiltinView {
8204        name: "mz_compute_error_counts_per_worker",
8205        schema: MZ_INTROSPECTION_SCHEMA,
8206        oid: oid::VIEW_MZ_COMPUTE_ERROR_COUNTS_PER_WORKER_OID,
8207        desc: RelationDesc::builder()
8208            .with_column("export_id", SqlScalarType::String.nullable(false))
8209            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
8210            .with_column("count", SqlScalarType::Int64.nullable(false))
8211            .with_key(vec![0, 1, 2])
8212            .finish(),
8213        column_comments: BTreeMap::new(),
8214        sql: "
8215WITH MUTUALLY RECURSIVE
8216    -- Indexes that reuse existing indexes rather than maintaining separate dataflows.
8217    -- For these we don't log error counts separately, so we need to forward the error counts from
8218    -- their dependencies instead.
8219    index_reuses(reuse_id text, index_id text) AS (
8220        SELECT d.object_id, d.dependency_id
8221        FROM mz_internal.mz_compute_dependencies d
8222        JOIN mz_introspection.mz_compute_exports e ON (e.export_id = d.object_id)
8223        WHERE NOT EXISTS (
8224            SELECT 1 FROM mz_introspection.mz_dataflows
8225            WHERE id = e.dataflow_id
8226        )
8227    ),
8228    -- Error counts that were directly logged on compute exports.
8229    direct_errors(export_id text, worker_id uint8, count int8) AS (
8230        SELECT export_id, worker_id, count
8231        FROM mz_introspection.mz_compute_error_counts_raw
8232    ),
8233    -- Error counts propagated to index reused.
8234    all_errors(export_id text, worker_id uint8, count int8) AS (
8235        SELECT * FROM direct_errors
8236        UNION
8237        SELECT r.reuse_id, e.worker_id, e.count
8238        FROM all_errors e
8239        JOIN index_reuses r ON (r.index_id = e.export_id)
8240    )
8241SELECT * FROM all_errors",
8242        access: vec![PUBLIC_SELECT],
8243    });
8244
8245pub static MZ_COMPUTE_ERROR_COUNTS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
8246    name: "mz_compute_error_counts",
8247    schema: MZ_INTROSPECTION_SCHEMA,
8248    oid: oid::VIEW_MZ_COMPUTE_ERROR_COUNTS_OID,
8249    desc: RelationDesc::builder()
8250        .with_column("export_id", SqlScalarType::String.nullable(false))
8251        .with_column(
8252            "count",
8253            SqlScalarType::Numeric {
8254                max_scale: Some(NumericMaxScale::ZERO),
8255            }
8256            .nullable(false),
8257        )
8258        .with_key(vec![0])
8259        .finish(),
8260    column_comments: BTreeMap::from_iter([
8261        (
8262            "export_id",
8263            "The ID of the dataflow export. Corresponds to `mz_compute_exports.export_id`.",
8264        ),
8265        (
8266            "count",
8267            "The count of errors present in this dataflow export.",
8268        ),
8269    ]),
8270    sql: "
8271SELECT
8272    export_id,
8273    pg_catalog.sum(count) AS count
8274FROM mz_introspection.mz_compute_error_counts_per_worker
8275GROUP BY export_id
8276HAVING pg_catalog.sum(count) != 0",
8277    access: vec![PUBLIC_SELECT],
8278});
8279
8280pub static MZ_COMPUTE_ERROR_COUNTS_RAW_UNIFIED: LazyLock<BuiltinSource> =
8281    LazyLock::new(|| BuiltinSource {
8282        // TODO(database-issues#8173): Rename this source to `mz_compute_error_counts_raw`. Currently this causes a
8283        // naming conflict because the resolver stumbles over the source with the same name in
8284        // `mz_introspection` due to the automatic schema translation.
8285        name: "mz_compute_error_counts_raw_unified",
8286        schema: MZ_INTERNAL_SCHEMA,
8287        oid: oid::SOURCE_MZ_COMPUTE_ERROR_COUNTS_RAW_UNIFIED_OID,
8288        desc: RelationDesc::builder()
8289            .with_column("replica_id", SqlScalarType::String.nullable(false))
8290            .with_column("object_id", SqlScalarType::String.nullable(false))
8291            .with_column(
8292                "count",
8293                SqlScalarType::Numeric { max_scale: None }.nullable(false),
8294            )
8295            .finish(),
8296        data_source: IntrospectionType::ComputeErrorCounts,
8297        column_comments: BTreeMap::new(),
8298        is_retained_metrics_object: false,
8299        access: vec![PUBLIC_SELECT],
8300    });
8301
8302pub static MZ_COMPUTE_HYDRATION_TIMES: LazyLock<BuiltinSource> = LazyLock::new(|| BuiltinSource {
8303    name: "mz_compute_hydration_times",
8304    schema: MZ_INTERNAL_SCHEMA,
8305    oid: oid::SOURCE_MZ_COMPUTE_HYDRATION_TIMES_OID,
8306    desc: RelationDesc::builder()
8307        .with_column("replica_id", SqlScalarType::String.nullable(false))
8308        .with_column("object_id", SqlScalarType::String.nullable(false))
8309        .with_column("time_ns", SqlScalarType::UInt64.nullable(true))
8310        .finish(),
8311    data_source: IntrospectionType::ComputeHydrationTimes,
8312    column_comments: BTreeMap::new(),
8313    is_retained_metrics_object: true,
8314    access: vec![PUBLIC_SELECT],
8315});
8316
8317pub static MZ_COMPUTE_HYDRATION_TIMES_IND: LazyLock<BuiltinIndex> =
8318    LazyLock::new(|| BuiltinIndex {
8319        name: "mz_compute_hydration_times_ind",
8320        schema: MZ_INTERNAL_SCHEMA,
8321        oid: oid::INDEX_MZ_COMPUTE_HYDRATION_TIMES_IND_OID,
8322        sql: "IN CLUSTER mz_catalog_server
8323    ON mz_internal.mz_compute_hydration_times (replica_id)",
8324        is_retained_metrics_object: true,
8325    });
8326
8327pub static MZ_COMPUTE_HYDRATION_STATUSES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
8328    name: "mz_compute_hydration_statuses",
8329    schema: MZ_INTERNAL_SCHEMA,
8330    oid: oid::SOURCE_MZ_COMPUTE_HYDRATION_STATUSES_OID,
8331    desc: RelationDesc::builder()
8332        .with_column("object_id", SqlScalarType::String.nullable(false))
8333        .with_column("replica_id", SqlScalarType::String.nullable(false))
8334        .with_column("hydrated", SqlScalarType::Bool.nullable(false))
8335        .with_column("hydration_time", SqlScalarType::Interval.nullable(true))
8336        .finish(),
8337    column_comments: BTreeMap::from_iter([
8338        (
8339            "object_id",
8340            "The ID of a compute object. Corresponds to `mz_catalog.mz_indexes.id` or `mz_catalog.mz_materialized_views.id`",
8341        ),
8342        ("replica_id", "The ID of a cluster replica."),
8343        (
8344            "hydrated",
8345            "Whether the compute object is hydrated on the replica.",
8346        ),
8347        (
8348            "hydration_time",
8349            "The amount of time it took for the replica to hydrate the compute object.",
8350        ),
8351    ]),
8352    sql: "
8353WITH
8354    dataflows AS (
8355        SELECT
8356            object_id,
8357            replica_id,
8358            time_ns IS NOT NULL AS hydrated,
8359            ((time_ns / 1000) || 'microseconds')::interval AS hydration_time
8360        FROM mz_internal.mz_compute_hydration_times
8361    ),
8362    -- MVs that have advanced to the empty frontier don't have a dataflow installed anymore and
8363    -- therefore don't show up in `mz_compute_hydration_times`. We still want to show them here to
8364    -- avoid surprises for people joining `mz_materialized_views` against this relation (like the
8365    -- blue-green readiness query does), so we include them as 'hydrated'.
8366    complete_mvs AS (
8367        SELECT
8368            mv.id,
8369            f.replica_id,
8370            true AS hydrated,
8371            NULL::interval AS hydration_time
8372        FROM mz_materialized_views mv
8373        JOIN mz_catalog.mz_cluster_replica_frontiers f ON f.object_id = mv.id
8374        WHERE f.write_frontier IS NULL
8375    ),
8376    -- Ditto CTs
8377    complete_cts AS (
8378        SELECT
8379            ct.id,
8380            f.replica_id,
8381            true AS hydrated,
8382            NULL::interval AS hydration_time
8383        FROM mz_internal.mz_continual_tasks ct
8384        JOIN mz_catalog.mz_cluster_replica_frontiers f ON f.object_id = ct.id
8385        WHERE f.write_frontier IS NULL
8386    )
8387SELECT * FROM dataflows
8388UNION ALL
8389SELECT * FROM complete_mvs
8390UNION ALL
8391SELECT * FROM complete_cts",
8392    access: vec![PUBLIC_SELECT],
8393});
8394
8395pub static MZ_COMPUTE_OPERATOR_HYDRATION_STATUSES: LazyLock<BuiltinSource> = LazyLock::new(|| {
8396    BuiltinSource {
8397        name: "mz_compute_operator_hydration_statuses",
8398        schema: MZ_INTERNAL_SCHEMA,
8399        oid: oid::SOURCE_MZ_COMPUTE_OPERATOR_HYDRATION_STATUSES_OID,
8400        desc: RelationDesc::builder()
8401            .with_column("replica_id", SqlScalarType::String.nullable(false))
8402            .with_column("object_id", SqlScalarType::String.nullable(false))
8403            .with_column(
8404                "physical_plan_node_id",
8405                SqlScalarType::UInt64.nullable(false),
8406            )
8407            .with_column("hydrated", SqlScalarType::Bool.nullable(false))
8408            .with_key(vec![0, 1, 2])
8409            .finish(),
8410        data_source: IntrospectionType::ComputeOperatorHydrationStatus,
8411        column_comments: BTreeMap::from_iter([
8412            ("replica_id", "The ID of a cluster replica."),
8413            (
8414                "object_id",
8415                "The ID of a compute object. Corresponds to `mz_catalog.mz_indexes.id` or `mz_catalog.mz_materialized_views.id`.",
8416            ),
8417            (
8418                "physical_plan_node_id",
8419                "The ID of a node in the physical plan of the compute object. Corresponds to a `node_id` displayed in the output of `EXPLAIN PHYSICAL PLAN WITH (node identifiers)`.",
8420            ),
8421            ("hydrated", "Whether the node is hydrated on the replica."),
8422        ]),
8423        is_retained_metrics_object: false,
8424        access: vec![PUBLIC_SELECT],
8425    }
8426});
8427
8428pub static MZ_MESSAGE_COUNTS_PER_WORKER: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
8429    name: "mz_message_counts_per_worker",
8430    schema: MZ_INTROSPECTION_SCHEMA,
8431    oid: oid::VIEW_MZ_MESSAGE_COUNTS_PER_WORKER_OID,
8432    desc: RelationDesc::builder()
8433        .with_column("channel_id", SqlScalarType::UInt64.nullable(false))
8434        .with_column("from_worker_id", SqlScalarType::UInt64.nullable(false))
8435        .with_column("to_worker_id", SqlScalarType::UInt64.nullable(false))
8436        .with_column("sent", SqlScalarType::Int64.nullable(false))
8437        .with_column("received", SqlScalarType::Int64.nullable(false))
8438        .with_column("batch_sent", SqlScalarType::Int64.nullable(false))
8439        .with_column("batch_received", SqlScalarType::Int64.nullable(false))
8440        .with_key(vec![0, 1, 2])
8441        .finish(),
8442    column_comments: BTreeMap::new(),
8443    sql: "
8444WITH batch_sent_cte AS (
8445    SELECT
8446        channel_id,
8447        from_worker_id,
8448        to_worker_id,
8449        pg_catalog.count(*) AS sent
8450    FROM
8451        mz_introspection.mz_message_batch_counts_sent_raw
8452    GROUP BY
8453        channel_id, from_worker_id, to_worker_id
8454),
8455batch_received_cte AS (
8456    SELECT
8457        channel_id,
8458        from_worker_id,
8459        to_worker_id,
8460        pg_catalog.count(*) AS received
8461    FROM
8462        mz_introspection.mz_message_batch_counts_received_raw
8463    GROUP BY
8464        channel_id, from_worker_id, to_worker_id
8465),
8466sent_cte AS (
8467    SELECT
8468        channel_id,
8469        from_worker_id,
8470        to_worker_id,
8471        pg_catalog.count(*) AS sent
8472    FROM
8473        mz_introspection.mz_message_counts_sent_raw
8474    GROUP BY
8475        channel_id, from_worker_id, to_worker_id
8476),
8477received_cte AS (
8478    SELECT
8479        channel_id,
8480        from_worker_id,
8481        to_worker_id,
8482        pg_catalog.count(*) AS received
8483    FROM
8484        mz_introspection.mz_message_counts_received_raw
8485    GROUP BY
8486        channel_id, from_worker_id, to_worker_id
8487)
8488SELECT
8489    sent_cte.channel_id,
8490    sent_cte.from_worker_id,
8491    sent_cte.to_worker_id,
8492    sent_cte.sent,
8493    received_cte.received,
8494    batch_sent_cte.sent AS batch_sent,
8495    batch_received_cte.received AS batch_received
8496FROM sent_cte
8497JOIN received_cte USING (channel_id, from_worker_id, to_worker_id)
8498JOIN batch_sent_cte USING (channel_id, from_worker_id, to_worker_id)
8499JOIN batch_received_cte USING (channel_id, from_worker_id, to_worker_id)",
8500    access: vec![PUBLIC_SELECT],
8501});
8502
8503pub static MZ_MESSAGE_COUNTS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
8504    name: "mz_message_counts",
8505    schema: MZ_INTROSPECTION_SCHEMA,
8506    oid: oid::VIEW_MZ_MESSAGE_COUNTS_OID,
8507    desc: RelationDesc::builder()
8508        .with_column("channel_id", SqlScalarType::UInt64.nullable(false))
8509        .with_column(
8510            "sent",
8511            SqlScalarType::Numeric {
8512                max_scale: Some(NumericMaxScale::ZERO),
8513            }
8514            .nullable(false),
8515        )
8516        .with_column(
8517            "received",
8518            SqlScalarType::Numeric {
8519                max_scale: Some(NumericMaxScale::ZERO),
8520            }
8521            .nullable(false),
8522        )
8523        .with_column(
8524            "batch_sent",
8525            SqlScalarType::Numeric {
8526                max_scale: Some(NumericMaxScale::ZERO),
8527            }
8528            .nullable(false),
8529        )
8530        .with_column(
8531            "batch_received",
8532            SqlScalarType::Numeric {
8533                max_scale: Some(NumericMaxScale::ZERO),
8534            }
8535            .nullable(false),
8536        )
8537        .with_key(vec![0])
8538        .finish(),
8539    column_comments: BTreeMap::from_iter([
8540        (
8541            "channel_id",
8542            "The ID of the channel. Corresponds to `mz_dataflow_channels.id`.",
8543        ),
8544        ("sent", "The number of messages sent."),
8545        ("received", "The number of messages received."),
8546        ("batch_sent", "The number of batches sent."),
8547        ("batch_received", "The number of batches received."),
8548    ]),
8549    sql: "
8550SELECT
8551    channel_id,
8552    pg_catalog.sum(sent) AS sent,
8553    pg_catalog.sum(received) AS received,
8554    pg_catalog.sum(batch_sent) AS batch_sent,
8555    pg_catalog.sum(batch_received) AS batch_received
8556FROM mz_introspection.mz_message_counts_per_worker
8557GROUP BY channel_id",
8558    access: vec![PUBLIC_SELECT],
8559});
8560
8561pub static MZ_ACTIVE_PEEKS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
8562    name: "mz_active_peeks",
8563    schema: MZ_INTROSPECTION_SCHEMA,
8564    oid: oid::VIEW_MZ_ACTIVE_PEEKS_OID,
8565    desc: RelationDesc::builder()
8566        .with_column("id", SqlScalarType::Uuid.nullable(false))
8567        .with_column("object_id", SqlScalarType::String.nullable(false))
8568        .with_column("type", SqlScalarType::String.nullable(false))
8569        .with_column("time", SqlScalarType::MzTimestamp.nullable(false))
8570        .finish(),
8571    column_comments: BTreeMap::from_iter([
8572        ("id", "The ID of the peek request."),
8573        (
8574            "object_id",
8575            "The ID of the collection the peek is targeting. Corresponds to `mz_catalog.mz_indexes.id`, `mz_catalog.mz_materialized_views.id`, `mz_catalog.mz_sources.id`, or `mz_catalog.mz_tables.id`.",
8576        ),
8577        (
8578            "type",
8579            "The type of the corresponding peek: `index` if targeting an index or temporary dataflow; `persist` for a source, materialized view, or table.",
8580        ),
8581        ("time", "The timestamp the peek has requested."),
8582    ]),
8583    sql: "
8584SELECT id, object_id, type, time
8585FROM mz_introspection.mz_active_peeks_per_worker
8586WHERE worker_id = 0",
8587    access: vec![PUBLIC_SELECT],
8588});
8589
8590pub static MZ_DATAFLOW_OPERATOR_REACHABILITY_PER_WORKER: LazyLock<BuiltinView> =
8591    LazyLock::new(|| BuiltinView {
8592        name: "mz_dataflow_operator_reachability_per_worker",
8593        schema: MZ_INTROSPECTION_SCHEMA,
8594        oid: oid::VIEW_MZ_DATAFLOW_OPERATOR_REACHABILITY_PER_WORKER_OID,
8595        desc: RelationDesc::builder()
8596            .with_column("id", SqlScalarType::UInt64.nullable(false))
8597            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
8598            .with_column("port", SqlScalarType::UInt64.nullable(false))
8599            .with_column("update_type", SqlScalarType::String.nullable(false))
8600            .with_column("time", SqlScalarType::MzTimestamp.nullable(true))
8601            .with_column("count", SqlScalarType::Int64.nullable(false))
8602            .with_key(vec![0, 1, 2, 3, 4])
8603            .finish(),
8604        column_comments: BTreeMap::new(),
8605        sql: "SELECT
8606    addr2.id,
8607    reachability.worker_id,
8608    port,
8609    update_type,
8610    time,
8611    pg_catalog.count(*) as count
8612FROM
8613    mz_introspection.mz_dataflow_operator_reachability_raw reachability,
8614    mz_introspection.mz_dataflow_addresses_per_worker addr1,
8615    mz_introspection.mz_dataflow_addresses_per_worker addr2
8616WHERE
8617    addr2.address =
8618    CASE
8619        WHEN source = 0 THEN addr1.address
8620        ELSE addr1.address || reachability.source
8621    END
8622    AND addr1.id = reachability.id
8623    AND addr1.worker_id = reachability.worker_id
8624    AND addr2.worker_id = reachability.worker_id
8625GROUP BY addr2.id, reachability.worker_id, port, update_type, time",
8626        access: vec![PUBLIC_SELECT],
8627    });
8628
8629pub static MZ_DATAFLOW_OPERATOR_REACHABILITY: LazyLock<BuiltinView> =
8630    LazyLock::new(|| BuiltinView {
8631        name: "mz_dataflow_operator_reachability",
8632        schema: MZ_INTROSPECTION_SCHEMA,
8633        oid: oid::VIEW_MZ_DATAFLOW_OPERATOR_REACHABILITY_OID,
8634        desc: RelationDesc::builder()
8635            .with_column("id", SqlScalarType::UInt64.nullable(false))
8636            .with_column("port", SqlScalarType::UInt64.nullable(false))
8637            .with_column("update_type", SqlScalarType::String.nullable(false))
8638            .with_column("time", SqlScalarType::MzTimestamp.nullable(true))
8639            .with_column(
8640                "count",
8641                SqlScalarType::Numeric {
8642                    max_scale: Some(NumericMaxScale::ZERO),
8643                }
8644                .nullable(false),
8645            )
8646            .with_key(vec![0, 1, 2, 3])
8647            .finish(),
8648        column_comments: BTreeMap::new(),
8649        sql: "
8650SELECT
8651    id,
8652    port,
8653    update_type,
8654    time,
8655    pg_catalog.sum(count) as count
8656FROM mz_introspection.mz_dataflow_operator_reachability_per_worker
8657GROUP BY id, port, update_type, time",
8658        access: vec![PUBLIC_SELECT],
8659    });
8660
8661pub static MZ_ARRANGEMENT_SIZES_PER_WORKER: LazyLock<BuiltinView> = LazyLock::new(|| {
8662    BuiltinView {
8663        name: "mz_arrangement_sizes_per_worker",
8664        schema: MZ_INTROSPECTION_SCHEMA,
8665        oid: oid::VIEW_MZ_ARRANGEMENT_SIZES_PER_WORKER_OID,
8666        desc: RelationDesc::builder()
8667            .with_column("operator_id", SqlScalarType::UInt64.nullable(false))
8668            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
8669            .with_column("records", SqlScalarType::Int64.nullable(true))
8670            .with_column("batches", SqlScalarType::Int64.nullable(true))
8671            .with_column("size", SqlScalarType::Int64.nullable(true))
8672            .with_column("capacity", SqlScalarType::Int64.nullable(true))
8673            .with_column("allocations", SqlScalarType::Int64.nullable(true))
8674            .finish(),
8675        column_comments: BTreeMap::new(),
8676        sql: "
8677WITH operators_per_worker_cte AS (
8678    SELECT
8679        id AS operator_id,
8680        worker_id
8681    FROM
8682        mz_introspection.mz_dataflow_operators_per_worker
8683),
8684batches_cte AS (
8685    SELECT
8686        operator_id,
8687        worker_id,
8688        COUNT(*) AS batches
8689    FROM
8690        mz_introspection.mz_arrangement_batches_raw
8691    GROUP BY
8692        operator_id, worker_id
8693),
8694records_cte AS (
8695    SELECT
8696        operator_id,
8697        worker_id,
8698        COUNT(*) AS records
8699    FROM
8700        mz_introspection.mz_arrangement_records_raw
8701    GROUP BY
8702        operator_id, worker_id
8703),
8704heap_size_cte AS (
8705    SELECT
8706        operator_id,
8707        worker_id,
8708        COUNT(*) AS size
8709    FROM
8710        mz_introspection.mz_arrangement_heap_size_raw
8711    GROUP BY
8712        operator_id, worker_id
8713),
8714heap_capacity_cte AS (
8715    SELECT
8716        operator_id,
8717        worker_id,
8718        COUNT(*) AS capacity
8719    FROM
8720        mz_introspection.mz_arrangement_heap_capacity_raw
8721    GROUP BY
8722        operator_id, worker_id
8723),
8724heap_allocations_cte AS (
8725    SELECT
8726        operator_id,
8727        worker_id,
8728        COUNT(*) AS allocations
8729    FROM
8730        mz_introspection.mz_arrangement_heap_allocations_raw
8731    GROUP BY
8732        operator_id, worker_id
8733),
8734batcher_records_cte AS (
8735    SELECT
8736        operator_id,
8737        worker_id,
8738        COUNT(*) AS records
8739    FROM
8740        mz_introspection.mz_arrangement_batcher_records_raw
8741    GROUP BY
8742        operator_id, worker_id
8743),
8744batcher_size_cte AS (
8745    SELECT
8746        operator_id,
8747        worker_id,
8748        COUNT(*) AS size
8749    FROM
8750        mz_introspection.mz_arrangement_batcher_size_raw
8751    GROUP BY
8752        operator_id, worker_id
8753),
8754batcher_capacity_cte AS (
8755    SELECT
8756        operator_id,
8757        worker_id,
8758        COUNT(*) AS capacity
8759    FROM
8760        mz_introspection.mz_arrangement_batcher_capacity_raw
8761    GROUP BY
8762        operator_id, worker_id
8763),
8764batcher_allocations_cte AS (
8765    SELECT
8766        operator_id,
8767        worker_id,
8768        COUNT(*) AS allocations
8769    FROM
8770        mz_introspection.mz_arrangement_batcher_allocations_raw
8771    GROUP BY
8772        operator_id, worker_id
8773),
8774combined AS (
8775    SELECT
8776        opw.operator_id,
8777        opw.worker_id,
8778        CASE
8779            WHEN records_cte.records IS NULL AND batcher_records_cte.records IS NULL THEN NULL
8780            ELSE COALESCE(records_cte.records, 0) + COALESCE(batcher_records_cte.records, 0)
8781        END AS records,
8782        batches_cte.batches AS batches,
8783        CASE
8784            WHEN heap_size_cte.size IS NULL AND batcher_size_cte.size IS NULL THEN NULL
8785            ELSE COALESCE(heap_size_cte.size, 0) + COALESCE(batcher_size_cte.size, 0)
8786        END AS size,
8787        CASE
8788            WHEN heap_capacity_cte.capacity IS NULL AND batcher_capacity_cte.capacity IS NULL THEN NULL
8789            ELSE COALESCE(heap_capacity_cte.capacity, 0) + COALESCE(batcher_capacity_cte.capacity, 0)
8790        END AS capacity,
8791        CASE
8792            WHEN heap_allocations_cte.allocations IS NULL AND batcher_allocations_cte.allocations IS NULL THEN NULL
8793            ELSE COALESCE(heap_allocations_cte.allocations, 0) + COALESCE(batcher_allocations_cte.allocations, 0)
8794        END AS allocations
8795    FROM
8796                    operators_per_worker_cte opw
8797    LEFT OUTER JOIN batches_cte USING (operator_id, worker_id)
8798    LEFT OUTER JOIN records_cte USING (operator_id, worker_id)
8799    LEFT OUTER JOIN heap_size_cte USING (operator_id, worker_id)
8800    LEFT OUTER JOIN heap_capacity_cte USING (operator_id, worker_id)
8801    LEFT OUTER JOIN heap_allocations_cte USING (operator_id, worker_id)
8802    LEFT OUTER JOIN batcher_records_cte USING (operator_id, worker_id)
8803    LEFT OUTER JOIN batcher_size_cte USING (operator_id, worker_id)
8804    LEFT OUTER JOIN batcher_capacity_cte USING (operator_id, worker_id)
8805    LEFT OUTER JOIN batcher_allocations_cte USING (operator_id, worker_id)
8806)
8807SELECT
8808    operator_id, worker_id, records, batches, size, capacity, allocations
8809FROM combined
8810WHERE
8811       records     IS NOT NULL
8812    OR batches     IS NOT NULL
8813    OR size        IS NOT NULL
8814    OR capacity    IS NOT NULL
8815    OR allocations IS NOT NULL
8816",
8817        access: vec![PUBLIC_SELECT],
8818    }
8819});
8820
8821pub static MZ_ARRANGEMENT_SIZES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
8822    name: "mz_arrangement_sizes",
8823    schema: MZ_INTROSPECTION_SCHEMA,
8824    oid: oid::VIEW_MZ_ARRANGEMENT_SIZES_OID,
8825    desc: RelationDesc::builder()
8826        .with_column("operator_id", SqlScalarType::UInt64.nullable(false))
8827        .with_column("records", SqlScalarType::Int64.nullable(true))
8828        .with_column("batches", SqlScalarType::Int64.nullable(true))
8829        .with_column("size", SqlScalarType::Int64.nullable(true))
8830        .with_column("capacity", SqlScalarType::Int64.nullable(true))
8831        .with_column("allocations", SqlScalarType::Int64.nullable(true))
8832        .with_key(vec![0])
8833        .finish(),
8834    column_comments: BTreeMap::from_iter([
8835        (
8836            "operator_id",
8837            "The ID of the operator that created the arrangement. Corresponds to `mz_dataflow_operators.id`.",
8838        ),
8839        ("records", "The number of records in the arrangement."),
8840        ("batches", "The number of batches in the arrangement."),
8841        ("size", "The utilized size in bytes of the arrangement."),
8842        (
8843            "capacity",
8844            "The capacity in bytes of the arrangement. Can be larger than the size.",
8845        ),
8846        (
8847            "allocations",
8848            "The number of separate memory allocations backing the arrangement.",
8849        ),
8850    ]),
8851    sql: "
8852SELECT
8853    operator_id,
8854    SUM(records)::int8 AS records,
8855    SUM(batches)::int8 AS batches,
8856    SUM(size)::int8 AS size,
8857    SUM(capacity)::int8 AS capacity,
8858    SUM(allocations)::int8 AS allocations
8859FROM mz_introspection.mz_arrangement_sizes_per_worker
8860GROUP BY operator_id",
8861    access: vec![PUBLIC_SELECT],
8862});
8863
8864pub static MZ_ARRANGEMENT_SHARING_PER_WORKER: LazyLock<BuiltinView> =
8865    LazyLock::new(|| BuiltinView {
8866        name: "mz_arrangement_sharing_per_worker",
8867        schema: MZ_INTROSPECTION_SCHEMA,
8868        oid: oid::VIEW_MZ_ARRANGEMENT_SHARING_PER_WORKER_OID,
8869        desc: RelationDesc::builder()
8870            .with_column("operator_id", SqlScalarType::UInt64.nullable(false))
8871            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
8872            .with_column("count", SqlScalarType::Int64.nullable(false))
8873            .with_key(vec![0, 1])
8874            .finish(),
8875        column_comments: BTreeMap::new(),
8876        sql: "
8877SELECT
8878    operator_id,
8879    worker_id,
8880    pg_catalog.count(*) AS count
8881FROM mz_introspection.mz_arrangement_sharing_raw
8882GROUP BY operator_id, worker_id",
8883        access: vec![PUBLIC_SELECT],
8884    });
8885
8886pub static MZ_ARRANGEMENT_SHARING: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
8887    name: "mz_arrangement_sharing",
8888    schema: MZ_INTROSPECTION_SCHEMA,
8889    oid: oid::VIEW_MZ_ARRANGEMENT_SHARING_OID,
8890    desc: RelationDesc::builder()
8891        .with_column("operator_id", SqlScalarType::UInt64.nullable(false))
8892        .with_column("count", SqlScalarType::Int64.nullable(false))
8893        .finish(),
8894    column_comments: BTreeMap::from_iter([
8895        (
8896            "operator_id",
8897            "The ID of the operator that created the arrangement. Corresponds to `mz_dataflow_operators.id`.",
8898        ),
8899        (
8900            "count",
8901            "The number of operators that share the arrangement.",
8902        ),
8903    ]),
8904    sql: "
8905SELECT operator_id, count
8906FROM mz_introspection.mz_arrangement_sharing_per_worker
8907WHERE worker_id = 0",
8908    access: vec![PUBLIC_SELECT],
8909});
8910
8911pub static MZ_CLUSTER_REPLICA_UTILIZATION: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
8912    name: "mz_cluster_replica_utilization",
8913    schema: MZ_INTERNAL_SCHEMA,
8914    oid: oid::VIEW_MZ_CLUSTER_REPLICA_UTILIZATION_OID,
8915    desc: RelationDesc::builder()
8916        .with_column("replica_id", SqlScalarType::String.nullable(false))
8917        .with_column("process_id", SqlScalarType::UInt64.nullable(false))
8918        .with_column("cpu_percent", SqlScalarType::Float64.nullable(true))
8919        .with_column("memory_percent", SqlScalarType::Float64.nullable(true))
8920        .with_column("disk_percent", SqlScalarType::Float64.nullable(true))
8921        .with_column("heap_percent", SqlScalarType::Float64.nullable(true))
8922        .finish(),
8923    column_comments: BTreeMap::from_iter([
8924        ("replica_id", "The ID of a cluster replica."),
8925        ("process_id", "The ID of a process within the replica."),
8926        (
8927            "cpu_percent",
8928            "Approximate CPU usage, in percent of the total allocation.",
8929        ),
8930        (
8931            "memory_percent",
8932            "Approximate RAM usage, in percent of the total allocation.",
8933        ),
8934        (
8935            "disk_percent",
8936            "Approximate disk usage, in percent of the total allocation.",
8937        ),
8938        (
8939            "heap_percent",
8940            "Approximate heap (RAM + swap) usage, in percent of the total allocation.",
8941        ),
8942    ]),
8943    sql: "
8944SELECT
8945    r.id AS replica_id,
8946    m.process_id,
8947    m.cpu_nano_cores::float8 / NULLIF(s.cpu_nano_cores, 0) * 100 AS cpu_percent,
8948    m.memory_bytes::float8 / NULLIF(s.memory_bytes, 0) * 100 AS memory_percent,
8949    m.disk_bytes::float8 / NULLIF(s.disk_bytes, 0) * 100 AS disk_percent,
8950    m.heap_bytes::float8 / NULLIF(m.heap_limit, 0) * 100 AS heap_percent
8951FROM
8952    mz_catalog.mz_cluster_replicas AS r
8953        JOIN mz_catalog.mz_cluster_replica_sizes AS s ON r.size = s.size
8954        JOIN mz_internal.mz_cluster_replica_metrics AS m ON m.replica_id = r.id",
8955    access: vec![PUBLIC_SELECT],
8956});
8957
8958pub static MZ_CLUSTER_REPLICA_UTILIZATION_HISTORY: LazyLock<BuiltinView> =
8959    LazyLock::new(|| BuiltinView {
8960        name: "mz_cluster_replica_utilization_history",
8961        schema: MZ_INTERNAL_SCHEMA,
8962        oid: oid::VIEW_MZ_CLUSTER_REPLICA_UTILIZATION_HISTORY_OID,
8963        desc: RelationDesc::builder()
8964            .with_column("replica_id", SqlScalarType::String.nullable(false))
8965            .with_column("process_id", SqlScalarType::UInt64.nullable(false))
8966            .with_column("cpu_percent", SqlScalarType::Float64.nullable(true))
8967            .with_column("memory_percent", SqlScalarType::Float64.nullable(true))
8968            .with_column("disk_percent", SqlScalarType::Float64.nullable(true))
8969            .with_column("heap_percent", SqlScalarType::Float64.nullable(true))
8970            .with_column(
8971                "occurred_at",
8972                SqlScalarType::TimestampTz { precision: None }.nullable(false),
8973            )
8974            .finish(),
8975        column_comments: BTreeMap::from_iter([
8976            ("replica_id", "The ID of a cluster replica."),
8977            ("process_id", "The ID of a process within the replica."),
8978            (
8979                "cpu_percent",
8980                "Approximate CPU usage, in percent of the total allocation.",
8981            ),
8982            (
8983                "memory_percent",
8984                "Approximate RAM usage, in percent of the total allocation.",
8985            ),
8986            (
8987                "disk_percent",
8988                "Approximate disk usage, in percent of the total allocation.",
8989            ),
8990            (
8991                "heap_percent",
8992                "Approximate heap (RAM + swap) usage, in percent of the total allocation.",
8993            ),
8994            (
8995                "occurred_at",
8996                "Wall-clock timestamp at which the event occurred.",
8997            ),
8998        ]),
8999        sql: "
9000SELECT
9001    r.id AS replica_id,
9002    m.process_id,
9003    m.cpu_nano_cores::float8 / NULLIF(s.cpu_nano_cores, 0) * 100 AS cpu_percent,
9004    m.memory_bytes::float8 / NULLIF(s.memory_bytes, 0) * 100 AS memory_percent,
9005    m.disk_bytes::float8 / NULLIF(s.disk_bytes, 0) * 100 AS disk_percent,
9006    m.heap_bytes::float8 / NULLIF(m.heap_limit, 0) * 100 AS heap_percent,
9007    m.occurred_at
9008FROM
9009    mz_catalog.mz_cluster_replicas AS r
9010        JOIN mz_catalog.mz_cluster_replica_sizes AS s ON r.size = s.size
9011        JOIN mz_internal.mz_cluster_replica_metrics_history AS m ON m.replica_id = r.id",
9012        access: vec![PUBLIC_SELECT],
9013    });
9014
9015pub static MZ_DATAFLOW_OPERATOR_PARENTS_PER_WORKER: LazyLock<BuiltinView> =
9016    LazyLock::new(|| BuiltinView {
9017        name: "mz_dataflow_operator_parents_per_worker",
9018        schema: MZ_INTROSPECTION_SCHEMA,
9019        oid: oid::VIEW_MZ_DATAFLOW_OPERATOR_PARENTS_PER_WORKER_OID,
9020        desc: RelationDesc::builder()
9021            .with_column("id", SqlScalarType::UInt64.nullable(false))
9022            .with_column("parent_id", SqlScalarType::UInt64.nullable(false))
9023            .with_column("worker_id", SqlScalarType::UInt64.nullable(false))
9024            .finish(),
9025        column_comments: BTreeMap::new(),
9026        sql: "
9027WITH operator_addrs AS(
9028    SELECT
9029        id, address, worker_id
9030    FROM mz_introspection.mz_dataflow_addresses_per_worker
9031        INNER JOIN mz_introspection.mz_dataflow_operators_per_worker
9032            USING (id, worker_id)
9033),
9034parent_addrs AS (
9035    SELECT
9036        id,
9037        address[1:list_length(address) - 1] AS parent_address,
9038        worker_id
9039    FROM operator_addrs
9040)
9041SELECT pa.id, oa.id AS parent_id, pa.worker_id
9042FROM parent_addrs AS pa
9043    INNER JOIN operator_addrs AS oa
9044        ON pa.parent_address = oa.address
9045        AND pa.worker_id = oa.worker_id",
9046        access: vec![PUBLIC_SELECT],
9047    });
9048
9049pub static MZ_DATAFLOW_OPERATOR_PARENTS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9050    name: "mz_dataflow_operator_parents",
9051    schema: MZ_INTROSPECTION_SCHEMA,
9052    oid: oid::VIEW_MZ_DATAFLOW_OPERATOR_PARENTS_OID,
9053    desc: RelationDesc::builder()
9054        .with_column("id", SqlScalarType::UInt64.nullable(false))
9055        .with_column("parent_id", SqlScalarType::UInt64.nullable(false))
9056        .finish(),
9057    column_comments: BTreeMap::from_iter([
9058        (
9059            "id",
9060            "The ID of the operator. Corresponds to `mz_dataflow_operators.id`.",
9061        ),
9062        (
9063            "parent_id",
9064            "The ID of the operator's parent operator. Corresponds to `mz_dataflow_operators.id`.",
9065        ),
9066    ]),
9067    sql: "
9068SELECT id, parent_id
9069FROM mz_introspection.mz_dataflow_operator_parents_per_worker
9070WHERE worker_id = 0",
9071    access: vec![PUBLIC_SELECT],
9072});
9073
9074pub static MZ_DATAFLOW_ARRANGEMENT_SIZES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9075    name: "mz_dataflow_arrangement_sizes",
9076    schema: MZ_INTROSPECTION_SCHEMA,
9077    oid: oid::VIEW_MZ_DATAFLOW_ARRANGEMENT_SIZES_OID,
9078    desc: RelationDesc::builder()
9079        .with_column("id", SqlScalarType::UInt64.nullable(false))
9080        .with_column("name", SqlScalarType::String.nullable(false))
9081        .with_column("records", SqlScalarType::Int64.nullable(true))
9082        .with_column("batches", SqlScalarType::Int64.nullable(true))
9083        .with_column("size", SqlScalarType::Int64.nullable(true))
9084        .with_column("capacity", SqlScalarType::Int64.nullable(true))
9085        .with_column("allocations", SqlScalarType::Int64.nullable(true))
9086        .with_key(vec![0, 1])
9087        .finish(),
9088    column_comments: BTreeMap::from_iter([
9089        (
9090            "id",
9091            "The ID of the [dataflow]. Corresponds to `mz_dataflows.id`.",
9092        ),
9093        ("name", "The name of the [dataflow]."),
9094        (
9095            "records",
9096            "The number of records in all arrangements in the dataflow.",
9097        ),
9098        (
9099            "batches",
9100            "The number of batches in all arrangements in the dataflow.",
9101        ),
9102        ("size", "The utilized size in bytes of the arrangements."),
9103        (
9104            "capacity",
9105            "The capacity in bytes of the arrangements. Can be larger than the size.",
9106        ),
9107        (
9108            "allocations",
9109            "The number of separate memory allocations backing the arrangements.",
9110        ),
9111    ]),
9112    sql: "
9113SELECT
9114    mdod.dataflow_id AS id,
9115    mdod.dataflow_name AS name,
9116    SUM(mas.records)::int8 AS records,
9117    SUM(mas.batches)::int8 AS batches,
9118    SUM(mas.size)::int8 AS size,
9119    SUM(mas.capacity)::int8 AS capacity,
9120    SUM(mas.allocations)::int8 AS allocations
9121FROM mz_introspection.mz_dataflow_operator_dataflows AS mdod
9122LEFT JOIN mz_introspection.mz_arrangement_sizes AS mas
9123    ON mdod.id = mas.operator_id
9124GROUP BY mdod.dataflow_id, mdod.dataflow_name",
9125    access: vec![PUBLIC_SELECT],
9126});
9127
9128pub static MZ_EXPECTED_GROUP_SIZE_ADVICE: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9129    name: "mz_expected_group_size_advice",
9130    schema: MZ_INTROSPECTION_SCHEMA,
9131    oid: oid::VIEW_MZ_EXPECTED_GROUP_SIZE_ADVICE_OID,
9132    desc: RelationDesc::builder()
9133        .with_column("dataflow_id", SqlScalarType::UInt64.nullable(false))
9134        .with_column("dataflow_name", SqlScalarType::String.nullable(false))
9135        .with_column("region_id", SqlScalarType::UInt64.nullable(false))
9136        .with_column("region_name", SqlScalarType::String.nullable(false))
9137        .with_column("levels", SqlScalarType::Int64.nullable(false))
9138        .with_column("to_cut", SqlScalarType::Int64.nullable(false))
9139        .with_column(
9140            "savings",
9141            SqlScalarType::Numeric {
9142                max_scale: Some(NumericMaxScale::ZERO),
9143            }
9144            .nullable(true),
9145        )
9146        .with_column("hint", SqlScalarType::Float64.nullable(false))
9147        .finish(),
9148    column_comments: BTreeMap::from_iter([
9149        (
9150            "dataflow_id",
9151            "The ID of the [dataflow]. Corresponds to `mz_dataflows.id`.",
9152        ),
9153        (
9154            "dataflow_name",
9155            "The internal name of the dataflow hosting the min/max aggregation or Top K.",
9156        ),
9157        (
9158            "region_id",
9159            "The ID of the root operator scope. Corresponds to `mz_dataflow_operators.id`.",
9160        ),
9161        (
9162            "region_name",
9163            "The internal name of the root operator scope for the min/max aggregation or Top K.",
9164        ),
9165        (
9166            "levels",
9167            "The number of levels in the hierarchical scheme implemented by the region.",
9168        ),
9169        (
9170            "to_cut",
9171            "The number of levels that can be eliminated (cut) from the region's hierarchy.",
9172        ),
9173        (
9174            "savings",
9175            "A conservative estimate of the amount of memory in bytes to be saved by applying the hint.",
9176        ),
9177        (
9178            "hint",
9179            "The hint value that will eliminate `to_cut` levels from the region's hierarchy.",
9180        ),
9181    ]),
9182    sql: "
9183        -- The mz_expected_group_size_advice view provides tuning suggestions for the GROUP SIZE
9184        -- query hints. This tuning hint is effective for min/max/top-k patterns, where a stack
9185        -- of arrangements must be built. For each dataflow and region corresponding to one
9186        -- such pattern, we look for how many levels can be eliminated without hitting a level
9187        -- that actually substantially filters the input. The advice is constructed so that
9188        -- setting the hint for the affected region will eliminate these redundant levels of
9189        -- the hierarchical rendering.
9190        --
9191        -- A number of helper CTEs are used for the view definition. The first one, operators,
9192        -- looks for operator names that comprise arrangements of inputs to each level of a
9193        -- min/max/top-k hierarchy.
9194        WITH operators AS (
9195            SELECT
9196                dod.dataflow_id,
9197                dor.id AS region_id,
9198                dod.id,
9199                ars.records,
9200                ars.size
9201            FROM
9202                mz_introspection.mz_dataflow_operator_dataflows dod
9203                JOIN mz_introspection.mz_dataflow_addresses doa
9204                    ON dod.id = doa.id
9205                JOIN mz_introspection.mz_dataflow_addresses dra
9206                    ON dra.address = doa.address[:list_length(doa.address) - 1]
9207                JOIN mz_introspection.mz_dataflow_operators dor
9208                    ON dor.id = dra.id
9209                JOIN mz_introspection.mz_arrangement_sizes ars
9210                    ON ars.operator_id = dod.id
9211            WHERE
9212                dod.name = 'Arranged TopK input'
9213                OR dod.name = 'Arranged MinsMaxesHierarchical input'
9214                OR dod.name = 'Arrange ReduceMinsMaxes'
9215            ),
9216        -- The second CTE, levels, simply computes the heights of the min/max/top-k hierarchies
9217        -- identified in operators above.
9218        levels AS (
9219            SELECT o.dataflow_id, o.region_id, COUNT(*) AS levels
9220            FROM operators o
9221            GROUP BY o.dataflow_id, o.region_id
9222        ),
9223        -- The third CTE, pivot, determines for each min/max/top-k hierarchy, the first input
9224        -- operator. This operator is crucially important, as it records the number of records
9225        -- that was given as input to the gadget as a whole.
9226        pivot AS (
9227            SELECT
9228                o1.dataflow_id,
9229                o1.region_id,
9230                o1.id,
9231                o1.records
9232            FROM operators o1
9233            WHERE
9234                o1.id = (
9235                    SELECT MIN(o2.id)
9236                    FROM operators o2
9237                    WHERE
9238                        o2.dataflow_id = o1.dataflow_id
9239                        AND o2.region_id = o1.region_id
9240                    OPTIONS (AGGREGATE INPUT GROUP SIZE = 8)
9241                )
9242        ),
9243        -- The fourth CTE, candidates, will look for operators where the number of records
9244        -- maintained is not significantly different from the number at the pivot (excluding
9245        -- the pivot itself). These are the candidates for being cut from the dataflow region
9246        -- by adjusting the hint. The query includes a constant, heuristically tuned on TPC-H
9247        -- load generator data, to give some room for small deviations in number of records.
9248        -- The intuition for allowing for this deviation is that we are looking for a strongly
9249        -- reducing point in the hierarchy. To see why one such operator ought to exist in an
9250        -- untuned hierarchy, consider that at each level, we use hashing to distribute rows
9251        -- among groups where the min/max/top-k computation is (partially) applied. If the
9252        -- hierarchy has too many levels, the first-level (pivot) groups will be such that many
9253        -- groups might be empty or contain only one row. Each subsequent level will have a number
9254        -- of groups that is reduced exponentially. So at some point, we will find the level where
9255        -- we actually start having a few rows per group. That's where we will see the row counts
9256        -- significantly drop off.
9257        candidates AS (
9258            SELECT
9259                o.dataflow_id,
9260                o.region_id,
9261                o.id,
9262                o.records,
9263                o.size
9264            FROM
9265                operators o
9266                JOIN pivot p
9267                    ON o.dataflow_id = p.dataflow_id
9268                        AND o.region_id = p.region_id
9269                        AND o.id <> p.id
9270            WHERE o.records >= p.records * (1 - 0.15)
9271        ),
9272        -- The fifth CTE, cuts, computes for each relevant dataflow region, the number of
9273        -- candidate levels that should be cut. We only return here dataflow regions where at
9274        -- least one level must be cut. Note that once we hit a point where the hierarchy starts
9275        -- to have a filtering effect, i.e., after the last candidate, it is dangerous to suggest
9276        -- cutting the height of the hierarchy further. This is because we will have way less
9277        -- groups in the next level, so there should be even further reduction happening or there
9278        -- is some substantial skew in the data. But if the latter is the case, then we should not
9279        -- tune the GROUP SIZE hints down anyway to avoid hurting latency upon updates directed
9280        -- at these unusually large groups. In addition to selecting the levels to cut, we also
9281        -- compute a conservative estimate of the memory savings in bytes that will result from
9282        -- cutting these levels from the hierarchy. The estimate is based on the sizes of the
9283        -- input arrangements for each level to be cut. These arrangements should dominate the
9284        -- size of each level that can be cut, since the reduction gadget internal to the level
9285        -- does not remove much data at these levels.
9286        cuts AS (
9287            SELECT c.dataflow_id, c.region_id, COUNT(*) AS to_cut, SUM(c.size) AS savings
9288            FROM candidates c
9289            GROUP BY c.dataflow_id, c.region_id
9290            HAVING COUNT(*) > 0
9291        )
9292        -- Finally, we compute the hint suggestion for each dataflow region based on the number of
9293        -- levels and the number of candidates to be cut. The hint is computed taking into account
9294        -- the fan-in used in rendering for the hash partitioning and reduction of the groups,
9295        -- currently equal to 16.
9296        SELECT
9297            dod.dataflow_id,
9298            dod.dataflow_name,
9299            dod.id AS region_id,
9300            dod.name AS region_name,
9301            l.levels,
9302            c.to_cut,
9303            c.savings,
9304            pow(16, l.levels - c.to_cut) - 1 AS hint
9305        FROM cuts c
9306            JOIN levels l
9307                ON c.dataflow_id = l.dataflow_id AND c.region_id = l.region_id
9308            JOIN mz_introspection.mz_dataflow_operator_dataflows dod
9309                ON dod.dataflow_id = c.dataflow_id AND dod.id = c.region_id",
9310    access: vec![PUBLIC_SELECT],
9311});
9312
9313pub static MZ_INDEX_ADVICE: LazyLock<BuiltinView> = LazyLock::new(|| {
9314    BuiltinView {
9315        name: "mz_index_advice",
9316        schema: MZ_INTERNAL_SCHEMA,
9317        oid: oid::VIEW_MZ_INDEX_ADVICE_OID,
9318        desc: RelationDesc::builder()
9319            .with_column("object_id", SqlScalarType::String.nullable(true))
9320            .with_column("hint", SqlScalarType::String.nullable(false))
9321            .with_column("details", SqlScalarType::String.nullable(false))
9322            .with_column("referenced_object_ids", SqlScalarType::List { element_type: Box::new(SqlScalarType::String), custom_id: None }.nullable(true))
9323            .finish(),
9324        column_comments: BTreeMap::from_iter([
9325            ("object_id", "The ID of the object. Corresponds to mz_objects.id."),
9326            ("hint", "A suggestion to either change the object (e.g. create an index, turn a materialized view into an indexed view) or keep the object unchanged."),
9327            ("details", "Additional details on why the `hint` was proposed based on the dependencies of the object."),
9328            ("referenced_object_ids", "The IDs of objects referenced by `details`. Corresponds to mz_objects.id."),
9329        ]),
9330        sql: "
9331-- To avoid confusion with sources and sinks in the materialize sense,
9332-- the following uses the terms leafs (instead of sinks) and roots (instead of sources)
9333-- when referring to the object dependency graph.
9334--
9335-- The basic idea is to walk up the dependency graph to propagate the transitive dependencies
9336-- of maintained objected upwards. The leaves of the dependency graph are maintained objects
9337-- that are not depended on by other maintained objects and have a justification why they must
9338-- be maintained (e.g. a materialized view that is depended on by a sink).
9339-- Starting from these leaves, the dependencies are propagated upwards towards the roots according
9340-- to the object dependencies. Whenever there is a node that is being depended on by multiple
9341-- downstream objects, that node is marked to be converted into a maintained object and this
9342-- node is then propagated further up. Once completed, the list of objects that are marked as
9343-- maintained is checked against all objects to generate appropriate recommendations.
9344--
9345-- Note that the recommendations only incorporate dependencies between objects.
9346-- This can lead to bad recommendations, e.g. filters can no longer be pushed into (or close to)
9347-- a sink if an index is added in between the sink and the filter. For very selective filters,
9348-- this can lead to redundant work: the index is computing stuff only to discarded by the selective
9349-- filter later on. But these kind of aspects cannot be understood by merely looking at the
9350-- dependencies.
9351WITH MUTUALLY RECURSIVE
9352    -- for all objects, understand if they have an index on them and on which cluster they are running
9353    -- this avoids having different cases for views with an index and materialized views later on
9354    objects(id text, type text, cluster_id text, indexes text list) AS (
9355        -- views and materialized views without an index
9356        SELECT
9357            o.id,
9358            o.type,
9359            o.cluster_id,
9360            '{}'::text list AS indexes
9361        FROM mz_catalog.mz_objects o
9362        WHERE o.id LIKE 'u%' AND o.type IN ('materialized-view', 'view') AND NOT EXISTS (
9363            SELECT FROM mz_internal.mz_object_dependencies d
9364            JOIN mz_catalog.mz_objects AS i
9365                ON (i.id = d.object_id AND i.type = 'index')
9366            WHERE (o.id = d.referenced_object_id)
9367        )
9368
9369        UNION ALL
9370
9371        -- views and materialized views with an index
9372        SELECT
9373            o.id,
9374            o.type,
9375            -- o.cluster_id is always NULL for views, so use the cluster of the index instead
9376            COALESCE(o.cluster_id, i.cluster_id) AS cluster_id,
9377            list_agg(i.id) AS indexes
9378        FROM mz_catalog.mz_objects o
9379        JOIN mz_internal.mz_object_dependencies AS d
9380            ON (o.id = d.referenced_object_id)
9381        JOIN mz_catalog.mz_objects AS i
9382            ON (i.id = d.object_id AND i.type = 'index')
9383        WHERE o.id LIKE 'u%' AND o.type IN ('materialized-view', 'view', 'source')
9384        GROUP BY o.id, o.type, o.cluster_id, i.cluster_id
9385    ),
9386
9387    -- maintained objects that are at the leafs of the dependency graph with respect to a specific cluster
9388    maintained_leafs(id text, justification text) AS (
9389        -- materialized views that are connected to a sink
9390        SELECT
9391            m.id,
9392            s.id AS justification
9393        FROM objects AS m
9394        JOIN mz_internal.mz_object_dependencies AS d
9395            ON (m.id = d.referenced_object_id)
9396        JOIN mz_catalog.mz_objects AS s
9397            ON (s.id = d.object_id AND s.type = 'sink')
9398        WHERE m.type = 'materialized-view'
9399
9400        UNION ALL
9401
9402        -- (materialized) views with an index that are not transitively depend on by maintained objects on the same cluster
9403        SELECT
9404            v.id,
9405            unnest(v.indexes) AS justification
9406        FROM objects AS v
9407        WHERE v.type IN ('view', 'materialized-view', 'source') AND NOT EXISTS (
9408            SELECT FROM mz_internal.mz_object_transitive_dependencies AS d
9409            INNER JOIN mz_catalog.mz_objects AS child
9410                ON (d.object_id = child.id)
9411            WHERE d.referenced_object_id = v.id AND child.type IN ('materialized-view', 'index') AND v.cluster_id = child.cluster_id AND NOT v.indexes @> LIST[child.id]
9412        )
9413    ),
9414
9415    -- this is just a helper cte to union multiple lists as part of an aggregation, which is not directly possible in SQL
9416    agg_maintained_children(id text, maintained_children text list) AS (
9417        SELECT
9418            parent_id AS id,
9419            list_agg(maintained_child) AS maintained_leafs
9420        FROM (
9421            SELECT DISTINCT
9422                d.referenced_object_id AS parent_id,
9423                -- it's not possible to union lists in an aggregation, so we have to unnest the list first
9424                unnest(child.maintained_children) AS maintained_child
9425            FROM propagate_dependencies AS child
9426            INNER JOIN mz_internal.mz_object_dependencies AS d
9427                ON (child.id = d.object_id)
9428        )
9429        GROUP BY parent_id
9430    ),
9431
9432    -- propagate dependencies of maintained objects from the leafs to the roots of the dependency graph and
9433    -- record a justification when an object should be maintained, e.g. when it is depended on by more than one maintained object
9434    -- when an object should be maintained, maintained_children will just contain that object so that further upstream objects refer to it in their maintained_children
9435    propagate_dependencies(id text, maintained_children text list, justification text list) AS (
9436        -- base case: start with the leafs
9437        SELECT DISTINCT
9438            id,
9439            LIST[id] AS maintained_children,
9440            list_agg(justification) AS justification
9441        FROM maintained_leafs
9442        GROUP BY id
9443
9444        UNION
9445
9446        -- recursive case: if there is a child with the same dependencies as the parent,
9447        -- the parent is only reused by a single child
9448        SELECT
9449            parent.id,
9450            child.maintained_children,
9451            NULL::text list AS justification
9452        FROM agg_maintained_children AS parent
9453        INNER JOIN mz_internal.mz_object_dependencies AS d
9454            ON (parent.id = d.referenced_object_id)
9455        INNER JOIN propagate_dependencies AS child
9456            ON (d.object_id = child.id)
9457        WHERE parent.maintained_children = child.maintained_children
9458
9459        UNION
9460
9461        -- recursive case: if there is NO child with the same dependencies as the parent,
9462        -- different children are reusing the parent so maintaining the object is justified by itself
9463        SELECT DISTINCT
9464            parent.id,
9465            LIST[parent.id] AS maintained_children,
9466            parent.maintained_children AS justification
9467        FROM agg_maintained_children AS parent
9468        WHERE NOT EXISTS (
9469            SELECT FROM mz_internal.mz_object_dependencies AS d
9470            INNER JOIN propagate_dependencies AS child
9471                ON (d.object_id = child.id AND d.referenced_object_id = parent.id)
9472            WHERE parent.maintained_children = child.maintained_children
9473        )
9474    ),
9475
9476    objects_with_justification(id text, type text, cluster_id text, maintained_children text list, justification text list, indexes text list) AS (
9477        SELECT
9478            p.id,
9479            o.type,
9480            o.cluster_id,
9481            p.maintained_children,
9482            p.justification,
9483            o.indexes
9484        FROM propagate_dependencies p
9485        JOIN objects AS o
9486            ON (p.id = o.id)
9487    ),
9488
9489    hints(id text, hint text, details text, justification text list) AS (
9490        -- materialized views that are not required
9491        SELECT
9492            id,
9493            'convert to a view' AS hint,
9494            'no dependencies from sinks nor from objects on different clusters' AS details,
9495            justification
9496        FROM objects_with_justification
9497        WHERE type = 'materialized-view' AND justification IS NULL
9498
9499        UNION ALL
9500
9501        -- materialized views that are required because a sink or a maintained object from a different cluster depends on them
9502        SELECT
9503            id,
9504            'keep' AS hint,
9505            'dependencies from sinks or objects on different clusters: ' AS details,
9506            justification
9507        FROM objects_with_justification AS m
9508        WHERE type = 'materialized-view' AND justification IS NOT NULL AND EXISTS (
9509            SELECT FROM unnest(justification) AS dependency
9510            JOIN mz_catalog.mz_objects s ON (s.type = 'sink' AND s.id = dependency)
9511
9512            UNION ALL
9513
9514            SELECT FROM unnest(justification) AS dependency
9515            JOIN mz_catalog.mz_objects AS d ON (d.id = dependency)
9516            WHERE d.cluster_id != m.cluster_id
9517        )
9518
9519        UNION ALL
9520
9521        -- materialized views that can be converted to a view with or without an index because NO sink or a maintained object from a different cluster depends on them
9522        SELECT
9523            id,
9524            'convert to a view with an index' AS hint,
9525            'no dependencies from sinks nor from objects on different clusters, but maintained dependencies on the same cluster: ' AS details,
9526            justification
9527        FROM objects_with_justification AS m
9528        WHERE type = 'materialized-view' AND justification IS NOT NULL AND NOT EXISTS (
9529            SELECT FROM unnest(justification) AS dependency
9530            JOIN mz_catalog.mz_objects s ON (s.type = 'sink' AND s.id = dependency)
9531
9532            UNION ALL
9533
9534            SELECT FROM unnest(justification) AS dependency
9535            JOIN mz_catalog.mz_objects AS d ON (d.id = dependency)
9536            WHERE d.cluster_id != m.cluster_id
9537        )
9538
9539        UNION ALL
9540
9541        -- views that have indexes on different clusters should be a materialized view
9542        SELECT
9543            o.id,
9544            'convert to materialized view' AS hint,
9545            'dependencies on multiple clusters: ' AS details,
9546            o.justification
9547        FROM objects_with_justification o,
9548            LATERAL unnest(o.justification) j
9549        LEFT JOIN mz_catalog.mz_objects AS m
9550            ON (m.id = j AND m.type IN ('index', 'materialized-view'))
9551        WHERE o.type = 'view' AND o.justification IS NOT NULL
9552        GROUP BY o.id, o.justification
9553        HAVING count(DISTINCT m.cluster_id) >= 2
9554
9555        UNION ALL
9556
9557        -- views without an index that should be maintained
9558        SELECT
9559            id,
9560            'add index' AS hint,
9561            'multiple downstream dependencies: ' AS details,
9562            justification
9563        FROM objects_with_justification
9564        WHERE type = 'view' AND justification IS NOT NULL AND indexes = '{}'::text list
9565
9566        UNION ALL
9567
9568        -- index inside the dependency graph (not a leaf)
9569        SELECT
9570            unnest(indexes) AS id,
9571            'drop unless queried directly' AS hint,
9572            'fewer than two downstream dependencies: ' AS details,
9573            maintained_children AS justification
9574        FROM objects_with_justification
9575        WHERE type = 'view' AND NOT indexes = '{}'::text list AND justification IS NULL
9576
9577        UNION ALL
9578
9579        -- index on a leaf of the dependency graph
9580        SELECT
9581            unnest(indexes) AS id,
9582            'drop unless queried directly' AS hint,
9583            'associated object does not have any dependencies (maintained or not maintained)' AS details,
9584            NULL::text list AS justification
9585        FROM objects_with_justification
9586        -- indexes can only be part of justification for leaf nodes
9587        WHERE type IN ('view', 'materialized-view') AND NOT indexes = '{}'::text list AND justification @> indexes
9588
9589        UNION ALL
9590
9591        -- index on a source
9592        SELECT
9593            unnest(indexes) AS id,
9594            'drop unless queried directly' AS hint,
9595            'sources do not transform data and can expose data directly' AS details,
9596            NULL::text list AS justification
9597        FROM objects_with_justification
9598        -- indexes can only be part of justification for leaf nodes
9599        WHERE type = 'source' AND NOT indexes = '{}'::text list
9600
9601        UNION ALL
9602
9603        -- indexes on views inside the dependency graph
9604        SELECT
9605            unnest(indexes) AS id,
9606            'keep' AS hint,
9607            'multiple downstream dependencies: ' AS details,
9608            justification
9609        FROM objects_with_justification
9610        -- indexes can only be part of justification for leaf nodes
9611        WHERE type = 'view' AND justification IS NOT NULL AND NOT indexes = '{}'::text list AND NOT justification @> indexes
9612    ),
9613
9614    hints_resolved_ids(id text, hint text, details text, justification text list) AS (
9615        SELECT
9616            h.id,
9617            h.hint,
9618            h.details || list_agg(o.name)::text AS details,
9619            h.justification
9620        FROM hints AS h,
9621            LATERAL unnest(h.justification) j
9622        JOIN mz_catalog.mz_objects AS o
9623            ON (o.id = j)
9624        GROUP BY h.id, h.hint, h.details, h.justification
9625
9626        UNION ALL
9627
9628        SELECT
9629            id,
9630            hint,
9631            details,
9632            justification
9633        FROM hints
9634        WHERE justification IS NULL
9635    )
9636
9637SELECT
9638    h.id AS object_id,
9639    h.hint AS hint,
9640    h.details,
9641    h.justification AS referenced_object_ids
9642FROM hints_resolved_ids AS h",
9643        access: vec![PUBLIC_SELECT],
9644    }
9645});
9646
9647// NOTE: If you add real data to this implementation, then please update
9648// the related `pg_` function implementations (like `pg_get_constraintdef`)
9649pub static PG_CONSTRAINT: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9650    name: "pg_constraint",
9651    schema: PG_CATALOG_SCHEMA,
9652    oid: oid::VIEW_PG_CONSTRAINT_OID,
9653    desc: RelationDesc::builder()
9654        .with_column("oid", SqlScalarType::Oid.nullable(false))
9655        .with_column("conname", SqlScalarType::String.nullable(false))
9656        .with_column("connamespace", SqlScalarType::Oid.nullable(false))
9657        .with_column("contype", SqlScalarType::PgLegacyChar.nullable(false))
9658        .with_column("condeferrable", SqlScalarType::Bool.nullable(false))
9659        .with_column("condeferred", SqlScalarType::Bool.nullable(false))
9660        .with_column("convalidated", SqlScalarType::Bool.nullable(false))
9661        .with_column("conrelid", SqlScalarType::Oid.nullable(false))
9662        .with_column("contypid", SqlScalarType::Oid.nullable(false))
9663        .with_column("conindid", SqlScalarType::Oid.nullable(false))
9664        .with_column("conparentid", SqlScalarType::Oid.nullable(false))
9665        .with_column("confrelid", SqlScalarType::Oid.nullable(false))
9666        .with_column("confupdtype", SqlScalarType::PgLegacyChar.nullable(false))
9667        .with_column("confdeltype", SqlScalarType::PgLegacyChar.nullable(false))
9668        .with_column("confmatchtype", SqlScalarType::PgLegacyChar.nullable(false))
9669        .with_column("conislocal", SqlScalarType::Bool.nullable(false))
9670        .with_column("coninhcount", SqlScalarType::Int32.nullable(false))
9671        .with_column("connoinherit", SqlScalarType::Bool.nullable(false))
9672        .with_column(
9673            "conkey",
9674            SqlScalarType::Array(Box::new(SqlScalarType::Int16)).nullable(false),
9675        )
9676        .with_column(
9677            "confkey",
9678            SqlScalarType::Array(Box::new(SqlScalarType::Int16)).nullable(false),
9679        )
9680        .with_column(
9681            "conpfeqop",
9682            SqlScalarType::Array(Box::new(SqlScalarType::Oid)).nullable(false),
9683        )
9684        .with_column(
9685            "conppeqop",
9686            SqlScalarType::Array(Box::new(SqlScalarType::Oid)).nullable(false),
9687        )
9688        .with_column(
9689            "conffeqop",
9690            SqlScalarType::Array(Box::new(SqlScalarType::Oid)).nullable(false),
9691        )
9692        .with_column(
9693            "conexclop",
9694            SqlScalarType::Array(Box::new(SqlScalarType::Oid)).nullable(false),
9695        )
9696        .with_column("conbin", SqlScalarType::String.nullable(false))
9697        .with_key(vec![])
9698        .finish(),
9699    column_comments: BTreeMap::new(),
9700    sql: "SELECT
9701    NULL::pg_catalog.oid as oid,
9702    NULL::pg_catalog.text as conname,
9703    NULL::pg_catalog.oid as connamespace,
9704    NULL::pg_catalog.\"char\" as contype,
9705    NULL::pg_catalog.bool as condeferrable,
9706    NULL::pg_catalog.bool as condeferred,
9707    NULL::pg_catalog.bool as convalidated,
9708    NULL::pg_catalog.oid as conrelid,
9709    NULL::pg_catalog.oid as contypid,
9710    NULL::pg_catalog.oid as conindid,
9711    NULL::pg_catalog.oid as conparentid,
9712    NULL::pg_catalog.oid as confrelid,
9713    NULL::pg_catalog.\"char\" as confupdtype,
9714    NULL::pg_catalog.\"char\" as confdeltype,
9715    NULL::pg_catalog.\"char\" as confmatchtype,
9716    NULL::pg_catalog.bool as conislocal,
9717    NULL::pg_catalog.int4 as coninhcount,
9718    NULL::pg_catalog.bool as connoinherit,
9719    NULL::pg_catalog.int2[] as conkey,
9720    NULL::pg_catalog.int2[] as confkey,
9721    NULL::pg_catalog.oid[] as conpfeqop,
9722    NULL::pg_catalog.oid[] as conppeqop,
9723    NULL::pg_catalog.oid[] as conffeqop,
9724    NULL::pg_catalog.oid[] as conexclop,
9725    NULL::pg_catalog.text as conbin
9726WHERE false",
9727    access: vec![PUBLIC_SELECT],
9728});
9729
9730pub static PG_TABLES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9731    name: "pg_tables",
9732    schema: PG_CATALOG_SCHEMA,
9733    oid: oid::VIEW_PG_TABLES_OID,
9734    desc: RelationDesc::builder()
9735        .with_column("schemaname", SqlScalarType::String.nullable(true))
9736        .with_column("tablename", SqlScalarType::String.nullable(false))
9737        .with_column("tableowner", SqlScalarType::String.nullable(false))
9738        .finish(),
9739    column_comments: BTreeMap::new(),
9740    sql: "
9741SELECT n.nspname AS schemaname,
9742    c.relname AS tablename,
9743    pg_catalog.pg_get_userbyid(c.relowner) AS tableowner
9744FROM pg_catalog.pg_class c
9745LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
9746WHERE c.relkind IN ('r', 'p')",
9747    access: vec![PUBLIC_SELECT],
9748});
9749
9750pub static PG_TABLESPACE: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9751    name: "pg_tablespace",
9752    schema: PG_CATALOG_SCHEMA,
9753    oid: oid::VIEW_PG_TABLESPACE_OID,
9754    desc: RelationDesc::builder()
9755        .with_column("oid", SqlScalarType::Oid.nullable(false))
9756        .with_column("spcname", SqlScalarType::String.nullable(false))
9757        .with_column("spcowner", SqlScalarType::Oid.nullable(true))
9758        .with_column(
9759            "spcacl",
9760            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(true),
9761        )
9762        .with_column(
9763            "spcoptions",
9764            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(true),
9765        )
9766        .with_key(vec![])
9767        .finish(),
9768    column_comments: BTreeMap::new(),
9769    sql: "
9770    SELECT oid, spcname, spcowner, spcacl, spcoptions
9771    FROM (
9772        VALUES (
9773            --These are the same defaults CockroachDB uses.
9774            0::pg_catalog.oid,
9775            'pg_default'::pg_catalog.text,
9776            NULL::pg_catalog.oid,
9777            NULL::pg_catalog.text[],
9778            NULL::pg_catalog.text[]
9779        )
9780    ) AS _ (oid, spcname, spcowner, spcacl, spcoptions)
9781",
9782    access: vec![PUBLIC_SELECT],
9783});
9784
9785pub static PG_ACCESS_METHODS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9786    name: "pg_am",
9787    schema: PG_CATALOG_SCHEMA,
9788    oid: oid::VIEW_PG_AM_OID,
9789    desc: RelationDesc::builder()
9790        .with_column("oid", SqlScalarType::Oid.nullable(false))
9791        .with_column("amname", SqlScalarType::String.nullable(false))
9792        .with_column("amhandler", SqlScalarType::RegProc.nullable(false))
9793        .with_column("amtype", SqlScalarType::PgLegacyChar.nullable(false))
9794        .with_key(vec![])
9795        .finish(),
9796    column_comments: BTreeMap::new(),
9797    sql: "
9798SELECT NULL::pg_catalog.oid AS oid,
9799    NULL::pg_catalog.text AS amname,
9800    NULL::pg_catalog.regproc AS amhandler,
9801    NULL::pg_catalog.\"char\" AS amtype
9802WHERE false",
9803    access: vec![PUBLIC_SELECT],
9804});
9805
9806pub static PG_ROLES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9807    name: "pg_roles",
9808    schema: PG_CATALOG_SCHEMA,
9809    oid: oid::VIEW_PG_ROLES_OID,
9810    desc: RelationDesc::builder()
9811        .with_column("rolname", SqlScalarType::String.nullable(false))
9812        .with_column("rolsuper", SqlScalarType::Bool.nullable(true))
9813        .with_column("rolinherit", SqlScalarType::Bool.nullable(false))
9814        .with_column("rolcreaterole", SqlScalarType::Bool.nullable(true))
9815        .with_column("rolcreatedb", SqlScalarType::Bool.nullable(true))
9816        .with_column("rolcanlogin", SqlScalarType::Bool.nullable(false))
9817        .with_column("rolreplication", SqlScalarType::Bool.nullable(false))
9818        .with_column("rolconnlimit", SqlScalarType::Int32.nullable(false))
9819        .with_column("rolpassword", SqlScalarType::String.nullable(false))
9820        .with_column(
9821            "rolvaliduntil",
9822            SqlScalarType::TimestampTz { precision: None }.nullable(true),
9823        )
9824        .with_column("rolbypassrls", SqlScalarType::Bool.nullable(false))
9825        .with_column(
9826            "rolconfig",
9827            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(true),
9828        )
9829        .with_column("oid", SqlScalarType::Oid.nullable(false))
9830        .finish(),
9831    column_comments: BTreeMap::new(),
9832    sql: "SELECT
9833    rolname,
9834    rolsuper,
9835    rolinherit,
9836    rolcreaterole,
9837    rolcreatedb,
9838    COALESCE(rolcanlogin, false) AS rolcanlogin,
9839    rolreplication,
9840    rolconnlimit,
9841    '********' as rolpassword,
9842    rolvaliduntil,
9843    rolbypassrls,
9844    (
9845        SELECT array_agg(parameter_name || '=' || parameter_value)
9846        FROM mz_catalog.mz_role_parameters rp
9847        JOIN mz_catalog.mz_roles r ON r.id = rp.role_id
9848        WHERE ai.oid = r.oid
9849    ) AS rolconfig,
9850    oid
9851FROM pg_catalog.pg_authid ai",
9852    access: vec![PUBLIC_SELECT],
9853});
9854
9855pub static PG_USER: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9856    name: "pg_user",
9857    schema: PG_CATALOG_SCHEMA,
9858    oid: oid::VIEW_PG_USER_OID,
9859    desc: RelationDesc::builder()
9860        .with_column("usename", SqlScalarType::String.nullable(false))
9861        .with_column("usesysid", SqlScalarType::Oid.nullable(false))
9862        .with_column("usecreatedb", SqlScalarType::Bool.nullable(true))
9863        .with_column("usesuper", SqlScalarType::Bool.nullable(true))
9864        .with_column("userepl", SqlScalarType::Bool.nullable(false))
9865        .with_column("usebypassrls", SqlScalarType::Bool.nullable(false))
9866        .with_column("passwd", SqlScalarType::String.nullable(true))
9867        .with_column(
9868            "valuntil",
9869            SqlScalarType::TimestampTz { precision: None }.nullable(true),
9870        )
9871        .with_column(
9872            "useconfig",
9873            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(true),
9874        )
9875        .finish(),
9876    column_comments: BTreeMap::new(),
9877    sql: "
9878SELECT
9879    rolname as usename,
9880    ai.oid as usesysid,
9881    rolcreatedb AS usecreatedb,
9882    rolsuper AS usesuper,
9883    rolreplication AS userepl,
9884    rolbypassrls AS usebypassrls,
9885    rolpassword as passwd,
9886    rolvaliduntil as valuntil,
9887    (
9888        SELECT array_agg(parameter_name || '=' || parameter_value)
9889        FROM mz_catalog.mz_role_parameters rp
9890        JOIN mz_catalog.mz_roles r ON r.id = rp.role_id
9891        WHERE ai.oid = r.oid
9892    ) AS useconfig
9893FROM pg_catalog.pg_authid ai
9894WHERE rolcanlogin",
9895    access: vec![PUBLIC_SELECT],
9896});
9897
9898pub static PG_VIEWS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9899    name: "pg_views",
9900    schema: PG_CATALOG_SCHEMA,
9901    oid: oid::VIEW_PG_VIEWS_OID,
9902    desc: RelationDesc::builder()
9903        .with_column("schemaname", SqlScalarType::String.nullable(true))
9904        .with_column("viewname", SqlScalarType::String.nullable(false))
9905        .with_column("viewowner", SqlScalarType::Oid.nullable(false))
9906        .with_column("definition", SqlScalarType::String.nullable(false))
9907        .finish(),
9908    column_comments: BTreeMap::new(),
9909    sql: "SELECT
9910    s.name AS schemaname,
9911    v.name AS viewname,
9912    role_owner.oid AS viewowner,
9913    v.definition AS definition
9914FROM mz_catalog.mz_views v
9915LEFT JOIN mz_catalog.mz_schemas s ON s.id = v.schema_id
9916LEFT JOIN mz_catalog.mz_databases d ON d.id = s.database_id
9917JOIN mz_catalog.mz_roles role_owner ON role_owner.id = v.owner_id
9918WHERE s.database_id IS NULL OR d.name = current_database()",
9919    access: vec![PUBLIC_SELECT],
9920});
9921
9922pub static PG_MATVIEWS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9923    name: "pg_matviews",
9924    schema: PG_CATALOG_SCHEMA,
9925    oid: oid::VIEW_PG_MATVIEWS_OID,
9926    desc: RelationDesc::builder()
9927        .with_column("schemaname", SqlScalarType::String.nullable(true))
9928        .with_column("matviewname", SqlScalarType::String.nullable(false))
9929        .with_column("matviewowner", SqlScalarType::Oid.nullable(false))
9930        .with_column("definition", SqlScalarType::String.nullable(false))
9931        .finish(),
9932    column_comments: BTreeMap::new(),
9933    sql: "SELECT
9934    s.name AS schemaname,
9935    m.name AS matviewname,
9936    role_owner.oid AS matviewowner,
9937    m.definition AS definition
9938FROM mz_catalog.mz_materialized_views m
9939LEFT JOIN mz_catalog.mz_schemas s ON s.id = m.schema_id
9940LEFT JOIN mz_catalog.mz_databases d ON d.id = s.database_id
9941JOIN mz_catalog.mz_roles role_owner ON role_owner.id = m.owner_id
9942WHERE s.database_id IS NULL OR d.name = current_database()",
9943    access: vec![PUBLIC_SELECT],
9944});
9945
9946pub static INFORMATION_SCHEMA_APPLICABLE_ROLES: LazyLock<BuiltinView> =
9947    LazyLock::new(|| BuiltinView {
9948        name: "applicable_roles",
9949        schema: INFORMATION_SCHEMA,
9950        oid: oid::VIEW_APPLICABLE_ROLES_OID,
9951        desc: RelationDesc::builder()
9952            .with_column("grantee", SqlScalarType::String.nullable(false))
9953            .with_column("role_name", SqlScalarType::String.nullable(false))
9954            .with_column("is_grantable", SqlScalarType::String.nullable(false))
9955            .finish(),
9956        column_comments: BTreeMap::new(),
9957        sql: "
9958SELECT
9959    member.name AS grantee,
9960    role.name AS role_name,
9961    -- ADMIN OPTION isn't implemented.
9962    'NO' AS is_grantable
9963FROM mz_catalog.mz_role_members membership
9964JOIN mz_catalog.mz_roles role ON membership.role_id = role.id
9965JOIN mz_catalog.mz_roles member ON membership.member = member.id
9966WHERE mz_catalog.mz_is_superuser() OR pg_has_role(current_role, member.oid, 'USAGE')",
9967        access: vec![PUBLIC_SELECT],
9968    });
9969
9970pub static INFORMATION_SCHEMA_COLUMNS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
9971    name: "columns",
9972    schema: INFORMATION_SCHEMA,
9973    oid: oid::VIEW_COLUMNS_OID,
9974    desc: RelationDesc::builder()
9975        .with_column("table_catalog", SqlScalarType::String.nullable(false))
9976        .with_column("table_schema", SqlScalarType::String.nullable(false))
9977        .with_column("table_name", SqlScalarType::String.nullable(false))
9978        .with_column("column_name", SqlScalarType::String.nullable(false))
9979        .with_column("ordinal_position", SqlScalarType::Int64.nullable(false))
9980        .with_column("column_default", SqlScalarType::String.nullable(true))
9981        .with_column("is_nullable", SqlScalarType::String.nullable(false))
9982        .with_column("data_type", SqlScalarType::String.nullable(false))
9983        .with_column(
9984            "character_maximum_length",
9985            SqlScalarType::Int32.nullable(true),
9986        )
9987        .with_column("numeric_precision", SqlScalarType::Int32.nullable(true))
9988        .with_column("numeric_scale", SqlScalarType::Int32.nullable(true))
9989        .finish(),
9990    column_comments: BTreeMap::new(),
9991    sql: "
9992SELECT
9993    current_database() as table_catalog,
9994    s.name AS table_schema,
9995    o.name AS table_name,
9996    c.name AS column_name,
9997    c.position::int8 AS ordinal_position,
9998    c.default AS column_default,
9999    CASE WHEN c.nullable THEN 'YES' ELSE 'NO' END AS is_nullable,
10000    c.type AS data_type,
10001    NULL::pg_catalog.int4 AS character_maximum_length,
10002    NULL::pg_catalog.int4 AS numeric_precision,
10003    NULL::pg_catalog.int4 AS numeric_scale
10004FROM mz_catalog.mz_columns c
10005JOIN mz_catalog.mz_objects o ON o.id = c.id
10006JOIN mz_catalog.mz_schemas s ON s.id = o.schema_id
10007LEFT JOIN mz_catalog.mz_databases d ON d.id = s.database_id
10008WHERE s.database_id IS NULL OR d.name = current_database()",
10009    access: vec![PUBLIC_SELECT],
10010});
10011
10012pub static INFORMATION_SCHEMA_ENABLED_ROLES: LazyLock<BuiltinView> =
10013    LazyLock::new(|| BuiltinView {
10014        name: "enabled_roles",
10015        schema: INFORMATION_SCHEMA,
10016        oid: oid::VIEW_ENABLED_ROLES_OID,
10017        desc: RelationDesc::builder()
10018            .with_column("role_name", SqlScalarType::String.nullable(false))
10019            .finish(),
10020        column_comments: BTreeMap::new(),
10021        sql: "
10022SELECT name AS role_name
10023FROM mz_catalog.mz_roles
10024WHERE mz_catalog.mz_is_superuser() OR pg_has_role(current_role, oid, 'USAGE')",
10025        access: vec![PUBLIC_SELECT],
10026    });
10027
10028pub static INFORMATION_SCHEMA_ROLE_TABLE_GRANTS: LazyLock<BuiltinView> = LazyLock::new(|| {
10029    BuiltinView {
10030        name: "role_table_grants",
10031        schema: INFORMATION_SCHEMA,
10032        oid: oid::VIEW_ROLE_TABLE_GRANTS_OID,
10033        desc: RelationDesc::builder()
10034            .with_column("grantor", SqlScalarType::String.nullable(false))
10035            .with_column("grantee", SqlScalarType::String.nullable(true))
10036            .with_column("table_catalog", SqlScalarType::String.nullable(true))
10037            .with_column("table_schema", SqlScalarType::String.nullable(false))
10038            .with_column("table_name", SqlScalarType::String.nullable(false))
10039            .with_column("privilege_type", SqlScalarType::String.nullable(true))
10040            .with_column("is_grantable", SqlScalarType::String.nullable(false))
10041            .with_column("with_hierarchy", SqlScalarType::String.nullable(false))
10042            .finish(),
10043        column_comments: BTreeMap::new(),
10044        sql: "
10045SELECT grantor, grantee, table_catalog, table_schema, table_name, privilege_type, is_grantable, with_hierarchy
10046FROM information_schema.table_privileges
10047WHERE
10048    grantor IN (SELECT role_name FROM information_schema.enabled_roles)
10049    OR grantee IN (SELECT role_name FROM information_schema.enabled_roles)",
10050        access: vec![PUBLIC_SELECT],
10051    }
10052});
10053
10054pub static INFORMATION_SCHEMA_KEY_COLUMN_USAGE: LazyLock<BuiltinView> =
10055    LazyLock::new(|| BuiltinView {
10056        name: "key_column_usage",
10057        schema: INFORMATION_SCHEMA,
10058        oid: oid::VIEW_KEY_COLUMN_USAGE_OID,
10059        desc: RelationDesc::builder()
10060            .with_column("constraint_catalog", SqlScalarType::String.nullable(false))
10061            .with_column("constraint_schema", SqlScalarType::String.nullable(false))
10062            .with_column("constraint_name", SqlScalarType::String.nullable(false))
10063            .with_column("table_catalog", SqlScalarType::String.nullable(false))
10064            .with_column("table_schema", SqlScalarType::String.nullable(false))
10065            .with_column("table_name", SqlScalarType::String.nullable(false))
10066            .with_column("column_name", SqlScalarType::String.nullable(false))
10067            .with_column("ordinal_position", SqlScalarType::Int32.nullable(false))
10068            .with_column(
10069                "position_in_unique_constraint",
10070                SqlScalarType::Int32.nullable(false),
10071            )
10072            .with_key(vec![])
10073            .finish(),
10074        column_comments: BTreeMap::new(),
10075        sql: "SELECT
10076    NULL::text AS constraint_catalog,
10077    NULL::text AS constraint_schema,
10078    NULL::text AS constraint_name,
10079    NULL::text AS table_catalog,
10080    NULL::text AS table_schema,
10081    NULL::text AS table_name,
10082    NULL::text AS column_name,
10083    NULL::integer AS ordinal_position,
10084    NULL::integer AS position_in_unique_constraint
10085WHERE false",
10086        access: vec![PUBLIC_SELECT],
10087    });
10088
10089pub static INFORMATION_SCHEMA_REFERENTIAL_CONSTRAINTS: LazyLock<BuiltinView> =
10090    LazyLock::new(|| BuiltinView {
10091        name: "referential_constraints",
10092        schema: INFORMATION_SCHEMA,
10093        oid: oid::VIEW_REFERENTIAL_CONSTRAINTS_OID,
10094        desc: RelationDesc::builder()
10095            .with_column("constraint_catalog", SqlScalarType::String.nullable(false))
10096            .with_column("constraint_schema", SqlScalarType::String.nullable(false))
10097            .with_column("constraint_name", SqlScalarType::String.nullable(false))
10098            .with_column(
10099                "unique_constraint_catalog",
10100                SqlScalarType::String.nullable(false),
10101            )
10102            .with_column(
10103                "unique_constraint_schema",
10104                SqlScalarType::String.nullable(false),
10105            )
10106            .with_column(
10107                "unique_constraint_name",
10108                SqlScalarType::String.nullable(false),
10109            )
10110            .with_column("match_option", SqlScalarType::String.nullable(false))
10111            .with_column("update_rule", SqlScalarType::String.nullable(false))
10112            .with_column("delete_rule", SqlScalarType::String.nullable(false))
10113            .with_key(vec![])
10114            .finish(),
10115        column_comments: BTreeMap::new(),
10116        sql: "SELECT
10117    NULL::text AS constraint_catalog,
10118    NULL::text AS constraint_schema,
10119    NULL::text AS constraint_name,
10120    NULL::text AS unique_constraint_catalog,
10121    NULL::text AS unique_constraint_schema,
10122    NULL::text AS unique_constraint_name,
10123    NULL::text AS match_option,
10124    NULL::text AS update_rule,
10125    NULL::text AS delete_rule
10126WHERE false",
10127        access: vec![PUBLIC_SELECT],
10128    });
10129
10130pub static INFORMATION_SCHEMA_ROUTINES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10131    name: "routines",
10132    schema: INFORMATION_SCHEMA,
10133    oid: oid::VIEW_ROUTINES_OID,
10134    desc: RelationDesc::builder()
10135        .with_column("routine_catalog", SqlScalarType::String.nullable(false))
10136        .with_column("routine_schema", SqlScalarType::String.nullable(false))
10137        .with_column("routine_name", SqlScalarType::String.nullable(false))
10138        .with_column("routine_type", SqlScalarType::String.nullable(false))
10139        .with_column("routine_definition", SqlScalarType::String.nullable(true))
10140        .finish(),
10141    column_comments: BTreeMap::new(),
10142    sql: "SELECT
10143    current_database() as routine_catalog,
10144    s.name AS routine_schema,
10145    f.name AS routine_name,
10146    'FUNCTION' AS routine_type,
10147    NULL::text AS routine_definition
10148FROM mz_catalog.mz_functions f
10149JOIN mz_catalog.mz_schemas s ON s.id = f.schema_id
10150LEFT JOIN mz_catalog.mz_databases d ON d.id = s.database_id
10151WHERE s.database_id IS NULL OR d.name = current_database()",
10152    access: vec![PUBLIC_SELECT],
10153});
10154
10155pub static INFORMATION_SCHEMA_SCHEMATA: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10156    name: "schemata",
10157    schema: INFORMATION_SCHEMA,
10158    oid: oid::VIEW_SCHEMATA_OID,
10159    desc: RelationDesc::builder()
10160        .with_column("catalog_name", SqlScalarType::String.nullable(false))
10161        .with_column("schema_name", SqlScalarType::String.nullable(false))
10162        .finish(),
10163    column_comments: BTreeMap::new(),
10164    sql: "
10165SELECT
10166    current_database() as catalog_name,
10167    s.name AS schema_name
10168FROM mz_catalog.mz_schemas s
10169LEFT JOIN mz_catalog.mz_databases d ON d.id = s.database_id
10170WHERE s.database_id IS NULL OR d.name = current_database()",
10171    access: vec![PUBLIC_SELECT],
10172});
10173
10174pub static INFORMATION_SCHEMA_TABLES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10175    name: "tables",
10176    schema: INFORMATION_SCHEMA,
10177    oid: oid::VIEW_TABLES_OID,
10178    desc: RelationDesc::builder()
10179        .with_column("table_catalog", SqlScalarType::String.nullable(false))
10180        .with_column("table_schema", SqlScalarType::String.nullable(false))
10181        .with_column("table_name", SqlScalarType::String.nullable(false))
10182        .with_column("table_type", SqlScalarType::String.nullable(false))
10183        .finish(),
10184    column_comments: BTreeMap::new(),
10185    sql: "SELECT
10186    current_database() as table_catalog,
10187    s.name AS table_schema,
10188    r.name AS table_name,
10189    CASE r.type
10190        WHEN 'materialized-view' THEN 'MATERIALIZED VIEW'
10191        WHEN 'table' THEN 'BASE TABLE'
10192        ELSE pg_catalog.upper(r.type)
10193    END AS table_type
10194FROM mz_catalog.mz_relations r
10195JOIN mz_catalog.mz_schemas s ON s.id = r.schema_id
10196LEFT JOIN mz_catalog.mz_databases d ON d.id = s.database_id
10197WHERE s.database_id IS NULL OR d.name = current_database()",
10198    access: vec![PUBLIC_SELECT],
10199});
10200
10201pub static INFORMATION_SCHEMA_TABLE_CONSTRAINTS: LazyLock<BuiltinView> =
10202    LazyLock::new(|| BuiltinView {
10203        name: "table_constraints",
10204        schema: INFORMATION_SCHEMA,
10205        oid: oid::VIEW_TABLE_CONSTRAINTS_OID,
10206        desc: RelationDesc::builder()
10207            .with_column("constraint_catalog", SqlScalarType::String.nullable(false))
10208            .with_column("constraint_schema", SqlScalarType::String.nullable(false))
10209            .with_column("constraint_name", SqlScalarType::String.nullable(false))
10210            .with_column("table_catalog", SqlScalarType::String.nullable(false))
10211            .with_column("table_schema", SqlScalarType::String.nullable(false))
10212            .with_column("table_name", SqlScalarType::String.nullable(false))
10213            .with_column("constraint_type", SqlScalarType::String.nullable(false))
10214            .with_column("is_deferrable", SqlScalarType::String.nullable(false))
10215            .with_column("initially_deferred", SqlScalarType::String.nullable(false))
10216            .with_column("enforced", SqlScalarType::String.nullable(false))
10217            .with_column("nulls_distinct", SqlScalarType::String.nullable(false))
10218            .with_key(vec![])
10219            .finish(),
10220        column_comments: BTreeMap::new(),
10221        sql: "SELECT
10222    NULL::text AS constraint_catalog,
10223    NULL::text AS constraint_schema,
10224    NULL::text AS constraint_name,
10225    NULL::text AS table_catalog,
10226    NULL::text AS table_schema,
10227    NULL::text AS table_name,
10228    NULL::text AS constraint_type,
10229    NULL::text AS is_deferrable,
10230    NULL::text AS initially_deferred,
10231    NULL::text AS enforced,
10232    NULL::text AS nulls_distinct
10233WHERE false",
10234        access: vec![PUBLIC_SELECT],
10235    });
10236
10237pub static INFORMATION_SCHEMA_TABLE_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| {
10238    BuiltinView {
10239        name: "table_privileges",
10240        schema: INFORMATION_SCHEMA,
10241        oid: oid::VIEW_TABLE_PRIVILEGES_OID,
10242        desc: RelationDesc::builder()
10243            .with_column("grantor", SqlScalarType::String.nullable(false))
10244            .with_column("grantee", SqlScalarType::String.nullable(true))
10245            .with_column("table_catalog", SqlScalarType::String.nullable(true))
10246            .with_column("table_schema", SqlScalarType::String.nullable(false))
10247            .with_column("table_name", SqlScalarType::String.nullable(false))
10248            .with_column("privilege_type", SqlScalarType::String.nullable(true))
10249            .with_column("is_grantable", SqlScalarType::String.nullable(false))
10250            .with_column("with_hierarchy", SqlScalarType::String.nullable(false))
10251            .finish(),
10252        column_comments: BTreeMap::new(),
10253        sql: "
10254SELECT
10255    grantor,
10256    grantee,
10257    table_catalog,
10258    table_schema,
10259    table_name,
10260    privilege_type,
10261    is_grantable,
10262    CASE privilege_type
10263        WHEN 'SELECT' THEN 'YES'
10264        ELSE 'NO'
10265    END AS with_hierarchy
10266FROM
10267    (SELECT
10268        grantor.name AS grantor,
10269        CASE mz_internal.mz_aclitem_grantee(privileges)
10270            WHEN 'p' THEN 'PUBLIC'
10271            ELSE grantee.name
10272        END AS grantee,
10273        table_catalog,
10274        table_schema,
10275        table_name,
10276        unnest(mz_internal.mz_format_privileges(mz_internal.mz_aclitem_privileges(privileges))) AS privilege_type,
10277        -- ADMIN OPTION isn't implemented.
10278        'NO' AS is_grantable
10279    FROM
10280        (SELECT
10281            unnest(relations.privileges) AS privileges,
10282            CASE
10283                WHEN schemas.database_id IS NULL THEN current_database()
10284                ELSE databases.name
10285            END AS table_catalog,
10286            schemas.name AS table_schema,
10287            relations.name AS table_name
10288        FROM mz_catalog.mz_relations AS relations
10289        JOIN mz_catalog.mz_schemas AS schemas ON relations.schema_id = schemas.id
10290        LEFT JOIN mz_catalog.mz_databases AS databases ON schemas.database_id = databases.id
10291        WHERE schemas.database_id IS NULL OR databases.name = current_database())
10292    JOIN mz_catalog.mz_roles AS grantor ON mz_internal.mz_aclitem_grantor(privileges) = grantor.id
10293    LEFT JOIN mz_catalog.mz_roles AS grantee ON mz_internal.mz_aclitem_grantee(privileges) = grantee.id)
10294WHERE
10295    -- WHERE clause is not guaranteed to short-circuit and 'PUBLIC' will cause an error when passed
10296    -- to pg_has_role. Therefore we need to use a CASE statement.
10297    CASE
10298        WHEN grantee = 'PUBLIC' THEN true
10299        ELSE mz_catalog.mz_is_superuser()
10300            OR pg_has_role(current_role, grantee, 'USAGE')
10301            OR pg_has_role(current_role, grantor, 'USAGE')
10302    END",
10303        access: vec![PUBLIC_SELECT],
10304    }
10305});
10306
10307pub static INFORMATION_SCHEMA_TRIGGERS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10308    name: "triggers",
10309    schema: INFORMATION_SCHEMA,
10310    oid: oid::VIEW_TRIGGERS_OID,
10311    desc: RelationDesc::builder()
10312        .with_column("trigger_catalog", SqlScalarType::String.nullable(false))
10313        .with_column("trigger_schema", SqlScalarType::String.nullable(false))
10314        .with_column("trigger_name", SqlScalarType::String.nullable(false))
10315        .with_column("event_manipulation", SqlScalarType::String.nullable(false))
10316        .with_column(
10317            "event_object_catalog",
10318            SqlScalarType::String.nullable(false),
10319        )
10320        .with_column("event_object_schema", SqlScalarType::String.nullable(false))
10321        .with_column("event_object_table", SqlScalarType::String.nullable(false))
10322        .with_column("action_order", SqlScalarType::Int32.nullable(false))
10323        .with_column("action_condition", SqlScalarType::String.nullable(false))
10324        .with_column("action_statement", SqlScalarType::String.nullable(false))
10325        .with_column("action_orientation", SqlScalarType::String.nullable(false))
10326        .with_column("action_timing", SqlScalarType::String.nullable(false))
10327        .with_column(
10328            "action_reference_old_table",
10329            SqlScalarType::String.nullable(false),
10330        )
10331        .with_column(
10332            "action_reference_new_table",
10333            SqlScalarType::String.nullable(false),
10334        )
10335        .with_key(vec![])
10336        .finish(),
10337    column_comments: BTreeMap::new(),
10338    sql: "SELECT
10339    NULL::text as trigger_catalog,
10340    NULL::text AS trigger_schema,
10341    NULL::text AS trigger_name,
10342    NULL::text AS event_manipulation,
10343    NULL::text AS event_object_catalog,
10344    NULL::text AS event_object_schema,
10345    NULL::text AS event_object_table,
10346    NULL::integer AS action_order,
10347    NULL::text AS action_condition,
10348    NULL::text AS action_statement,
10349    NULL::text AS action_orientation,
10350    NULL::text AS action_timing,
10351    NULL::text AS action_reference_old_table,
10352    NULL::text AS action_reference_new_table
10353WHERE FALSE",
10354    access: vec![PUBLIC_SELECT],
10355});
10356
10357pub static INFORMATION_SCHEMA_VIEWS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10358    name: "views",
10359    schema: INFORMATION_SCHEMA,
10360    oid: oid::VIEW_VIEWS_OID,
10361    desc: RelationDesc::builder()
10362        .with_column("table_catalog", SqlScalarType::String.nullable(false))
10363        .with_column("table_schema", SqlScalarType::String.nullable(false))
10364        .with_column("table_name", SqlScalarType::String.nullable(false))
10365        .with_column("view_definition", SqlScalarType::String.nullable(false))
10366        .finish(),
10367    column_comments: BTreeMap::new(),
10368    sql: "SELECT
10369    current_database() as table_catalog,
10370    s.name AS table_schema,
10371    v.name AS table_name,
10372    v.definition AS view_definition
10373FROM mz_catalog.mz_views v
10374JOIN mz_catalog.mz_schemas s ON s.id = v.schema_id
10375LEFT JOIN mz_catalog.mz_databases d ON d.id = s.database_id
10376WHERE s.database_id IS NULL OR d.name = current_database()",
10377    access: vec![PUBLIC_SELECT],
10378});
10379
10380pub static INFORMATION_SCHEMA_CHARACTER_SETS: LazyLock<BuiltinView> =
10381    LazyLock::new(|| BuiltinView {
10382        name: "character_sets",
10383        schema: INFORMATION_SCHEMA,
10384        oid: oid::VIEW_CHARACTER_SETS_OID,
10385        desc: RelationDesc::builder()
10386            .with_column(
10387                "character_set_catalog",
10388                SqlScalarType::String.nullable(true),
10389            )
10390            .with_column("character_set_schema", SqlScalarType::String.nullable(true))
10391            .with_column("character_set_name", SqlScalarType::String.nullable(false))
10392            .with_column(
10393                "character_repertoire",
10394                SqlScalarType::String.nullable(false),
10395            )
10396            .with_column("form_of_use", SqlScalarType::String.nullable(false))
10397            .with_column(
10398                "default_collate_catalog",
10399                SqlScalarType::String.nullable(false),
10400            )
10401            .with_column(
10402                "default_collate_schema",
10403                SqlScalarType::String.nullable(false),
10404            )
10405            .with_column(
10406                "default_collate_name",
10407                SqlScalarType::String.nullable(false),
10408            )
10409            .with_key(vec![])
10410            .finish(),
10411        column_comments: BTreeMap::new(),
10412        sql: "SELECT
10413    NULL as character_set_catalog,
10414    NULL as character_set_schema,
10415    'UTF8' as character_set_name,
10416    'UCS' as character_repertoire,
10417    'UTF8' as form_of_use,
10418    current_database() as default_collate_catalog,
10419    'pg_catalog' as default_collate_schema,
10420    'en_US.utf8' as default_collate_name",
10421        access: vec![PUBLIC_SELECT],
10422    });
10423
10424// MZ doesn't support COLLATE so the table is filled with NULLs and made empty. pg_database hard
10425// codes a collation of 'C' for every database, so we could copy that here.
10426pub static PG_COLLATION: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10427    name: "pg_collation",
10428    schema: PG_CATALOG_SCHEMA,
10429    oid: oid::VIEW_PG_COLLATION_OID,
10430    desc: RelationDesc::builder()
10431        .with_column("oid", SqlScalarType::Oid.nullable(false))
10432        .with_column("collname", SqlScalarType::String.nullable(false))
10433        .with_column("collnamespace", SqlScalarType::Oid.nullable(false))
10434        .with_column("collowner", SqlScalarType::Oid.nullable(false))
10435        .with_column("collprovider", SqlScalarType::PgLegacyChar.nullable(false))
10436        .with_column("collisdeterministic", SqlScalarType::Bool.nullable(false))
10437        .with_column("collencoding", SqlScalarType::Int32.nullable(false))
10438        .with_column("collcollate", SqlScalarType::String.nullable(false))
10439        .with_column("collctype", SqlScalarType::String.nullable(false))
10440        .with_column("collversion", SqlScalarType::String.nullable(false))
10441        .with_key(vec![])
10442        .finish(),
10443    column_comments: BTreeMap::new(),
10444    sql: "
10445SELECT
10446    NULL::pg_catalog.oid AS oid,
10447    NULL::pg_catalog.text AS collname,
10448    NULL::pg_catalog.oid AS collnamespace,
10449    NULL::pg_catalog.oid AS collowner,
10450    NULL::pg_catalog.\"char\" AS collprovider,
10451    NULL::pg_catalog.bool AS collisdeterministic,
10452    NULL::pg_catalog.int4 AS collencoding,
10453    NULL::pg_catalog.text AS collcollate,
10454    NULL::pg_catalog.text AS collctype,
10455    NULL::pg_catalog.text AS collversion
10456WHERE false",
10457    access: vec![PUBLIC_SELECT],
10458});
10459
10460// MZ doesn't support row level security policies so the table is filled in with NULLs and made empty.
10461pub static PG_POLICY: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10462    name: "pg_policy",
10463    schema: PG_CATALOG_SCHEMA,
10464    oid: oid::VIEW_PG_POLICY_OID,
10465    desc: RelationDesc::builder()
10466        .with_column("oid", SqlScalarType::Oid.nullable(false))
10467        .with_column("polname", SqlScalarType::String.nullable(false))
10468        .with_column("polrelid", SqlScalarType::Oid.nullable(false))
10469        .with_column("polcmd", SqlScalarType::PgLegacyChar.nullable(false))
10470        .with_column("polpermissive", SqlScalarType::Bool.nullable(false))
10471        .with_column(
10472            "polroles",
10473            SqlScalarType::Array(Box::new(SqlScalarType::Oid)).nullable(false),
10474        )
10475        .with_column("polqual", SqlScalarType::String.nullable(false))
10476        .with_column("polwithcheck", SqlScalarType::String.nullable(false))
10477        .with_key(vec![])
10478        .finish(),
10479    column_comments: BTreeMap::new(),
10480    sql: "
10481SELECT
10482    NULL::pg_catalog.oid AS oid,
10483    NULL::pg_catalog.text AS polname,
10484    NULL::pg_catalog.oid AS polrelid,
10485    NULL::pg_catalog.\"char\" AS polcmd,
10486    NULL::pg_catalog.bool AS polpermissive,
10487    NULL::pg_catalog.oid[] AS polroles,
10488    NULL::pg_catalog.text AS polqual,
10489    NULL::pg_catalog.text AS polwithcheck
10490WHERE false",
10491    access: vec![PUBLIC_SELECT],
10492});
10493
10494// MZ doesn't support table inheritance so the table is filled in with NULLs and made empty.
10495pub static PG_INHERITS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10496    name: "pg_inherits",
10497    schema: PG_CATALOG_SCHEMA,
10498    oid: oid::VIEW_PG_INHERITS_OID,
10499    desc: RelationDesc::builder()
10500        .with_column("inhrelid", SqlScalarType::Oid.nullable(false))
10501        .with_column("inhparent", SqlScalarType::Oid.nullable(false))
10502        .with_column("inhseqno", SqlScalarType::Int32.nullable(false))
10503        .with_column("inhdetachpending", SqlScalarType::Bool.nullable(false))
10504        .with_key(vec![])
10505        .finish(),
10506    column_comments: BTreeMap::new(),
10507    sql: "
10508SELECT
10509    NULL::pg_catalog.oid AS inhrelid,
10510    NULL::pg_catalog.oid AS inhparent,
10511    NULL::pg_catalog.int4 AS inhseqno,
10512    NULL::pg_catalog.bool AS inhdetachpending
10513WHERE false",
10514    access: vec![PUBLIC_SELECT],
10515});
10516
10517pub static PG_LOCKS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10518    name: "pg_locks",
10519    schema: PG_CATALOG_SCHEMA,
10520    oid: oid::VIEW_PG_LOCKS_OID,
10521    desc: RelationDesc::builder()
10522        .with_column("locktype", SqlScalarType::String.nullable(false))
10523        .with_column("database", SqlScalarType::Oid.nullable(false))
10524        .with_column("relation", SqlScalarType::Oid.nullable(false))
10525        .with_column("page", SqlScalarType::Int32.nullable(false))
10526        .with_column("tuple", SqlScalarType::Int16.nullable(false))
10527        .with_column("virtualxid", SqlScalarType::String.nullable(false))
10528        .with_column("transactionid", SqlScalarType::String.nullable(false))
10529        .with_column("classid", SqlScalarType::Oid.nullable(false))
10530        .with_column("objid", SqlScalarType::Oid.nullable(false))
10531        .with_column("objsubid", SqlScalarType::Int16.nullable(false))
10532        .with_column("virtualtransaction", SqlScalarType::String.nullable(false))
10533        .with_column("pid", SqlScalarType::Int32.nullable(false))
10534        .with_column("mode", SqlScalarType::String.nullable(false))
10535        .with_column("granted", SqlScalarType::Bool.nullable(false))
10536        .with_column("fastpath", SqlScalarType::Bool.nullable(false))
10537        .with_column(
10538            "waitstart",
10539            SqlScalarType::TimestampTz { precision: None }.nullable(false),
10540        )
10541        .with_key(vec![])
10542        .finish(),
10543    column_comments: BTreeMap::new(),
10544    sql: "
10545SELECT
10546-- While there exist locks in Materialize, we don't expose them, so all of these fields are NULL.
10547    NULL::pg_catalog.text AS locktype,
10548    NULL::pg_catalog.oid AS database,
10549    NULL::pg_catalog.oid AS relation,
10550    NULL::pg_catalog.int4 AS page,
10551    NULL::pg_catalog.int2 AS tuple,
10552    NULL::pg_catalog.text AS virtualxid,
10553    NULL::pg_catalog.text AS transactionid,
10554    NULL::pg_catalog.oid AS classid,
10555    NULL::pg_catalog.oid AS objid,
10556    NULL::pg_catalog.int2 AS objsubid,
10557    NULL::pg_catalog.text AS virtualtransaction,
10558    NULL::pg_catalog.int4 AS pid,
10559    NULL::pg_catalog.text AS mode,
10560    NULL::pg_catalog.bool AS granted,
10561    NULL::pg_catalog.bool AS fastpath,
10562    NULL::pg_catalog.timestamptz AS waitstart
10563WHERE false",
10564    access: vec![PUBLIC_SELECT],
10565});
10566
10567pub static PG_AUTHID: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10568    name: "pg_authid",
10569    schema: PG_CATALOG_SCHEMA,
10570    oid: oid::VIEW_PG_AUTHID_OID,
10571    desc: RelationDesc::builder()
10572        .with_column("oid", SqlScalarType::Oid.nullable(false))
10573        .with_column("rolname", SqlScalarType::String.nullable(false))
10574        .with_column("rolsuper", SqlScalarType::Bool.nullable(true))
10575        .with_column("rolinherit", SqlScalarType::Bool.nullable(false))
10576        .with_column("rolcreaterole", SqlScalarType::Bool.nullable(true))
10577        .with_column("rolcreatedb", SqlScalarType::Bool.nullable(true))
10578        .with_column("rolcanlogin", SqlScalarType::Bool.nullable(false))
10579        .with_column("rolreplication", SqlScalarType::Bool.nullable(false))
10580        .with_column("rolbypassrls", SqlScalarType::Bool.nullable(false))
10581        .with_column("rolconnlimit", SqlScalarType::Int32.nullable(false))
10582        .with_column("rolpassword", SqlScalarType::String.nullable(true))
10583        .with_column(
10584            "rolvaliduntil",
10585            SqlScalarType::TimestampTz { precision: None }.nullable(true),
10586        )
10587        .finish(),
10588    column_comments: BTreeMap::new(),
10589    sql: r#"
10590SELECT
10591    r.oid AS oid,
10592    r.name AS rolname,
10593    rolsuper,
10594    inherit AS rolinherit,
10595    mz_catalog.has_system_privilege(r.oid, 'CREATEROLE') AS rolcreaterole,
10596    mz_catalog.has_system_privilege(r.oid, 'CREATEDB') AS rolcreatedb,
10597    COALESCE(r.rolcanlogin, false) AS rolcanlogin,
10598    -- MZ doesn't support replication in the same way Postgres does
10599    false AS rolreplication,
10600    -- MZ doesn't how row level security
10601    false AS rolbypassrls,
10602    -- MZ doesn't have a connection limit
10603    -1 AS rolconnlimit,
10604    a.password_hash AS rolpassword,
10605    NULL::pg_catalog.timestamptz AS rolvaliduntil
10606FROM mz_catalog.mz_roles r
10607LEFT JOIN mz_catalog.mz_role_auth a ON r.oid = a.role_oid"#,
10608    access: vec![rbac::owner_privilege(ObjectType::Table, MZ_SYSTEM_ROLE_ID)],
10609});
10610
10611pub static PG_AGGREGATE: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10612    name: "pg_aggregate",
10613    schema: PG_CATALOG_SCHEMA,
10614    oid: oid::VIEW_PG_AGGREGATE_OID,
10615    desc: RelationDesc::builder()
10616        .with_column("aggfnoid", SqlScalarType::Oid.nullable(false))
10617        .with_column("aggkind", SqlScalarType::String.nullable(false))
10618        .with_column("aggnumdirectargs", SqlScalarType::Int16.nullable(false))
10619        .with_column("aggtransfn", SqlScalarType::RegProc.nullable(true))
10620        .with_column("aggfinalfn", SqlScalarType::RegProc.nullable(false))
10621        .with_column("aggcombinefn", SqlScalarType::RegProc.nullable(false))
10622        .with_column("aggserialfn", SqlScalarType::RegProc.nullable(false))
10623        .with_column("aggdeserialfn", SqlScalarType::RegProc.nullable(false))
10624        .with_column("aggmtransfn", SqlScalarType::RegProc.nullable(false))
10625        .with_column("aggminvtransfn", SqlScalarType::RegProc.nullable(false))
10626        .with_column("aggmfinalfn", SqlScalarType::RegProc.nullable(false))
10627        .with_column("aggfinalextra", SqlScalarType::Bool.nullable(false))
10628        .with_column("aggmfinalextra", SqlScalarType::Bool.nullable(false))
10629        .with_column("aggfinalmodify", SqlScalarType::PgLegacyChar.nullable(true))
10630        .with_column(
10631            "aggmfinalmodify",
10632            SqlScalarType::PgLegacyChar.nullable(true),
10633        )
10634        .with_column("aggsortop", SqlScalarType::Oid.nullable(false))
10635        .with_column("aggtranstype", SqlScalarType::Oid.nullable(true))
10636        .with_column("aggtransspace", SqlScalarType::Int32.nullable(true))
10637        .with_column("aggmtranstype", SqlScalarType::Oid.nullable(false))
10638        .with_column("aggmtransspace", SqlScalarType::Int32.nullable(true))
10639        .with_column("agginitval", SqlScalarType::String.nullable(true))
10640        .with_column("aggminitval", SqlScalarType::String.nullable(true))
10641        .finish(),
10642    column_comments: BTreeMap::new(),
10643    sql: "SELECT
10644    a.oid as aggfnoid,
10645    -- Currently Materialize only support 'normal' aggregate functions.
10646    a.agg_kind as aggkind,
10647    a.agg_num_direct_args as aggnumdirectargs,
10648    -- Materialize doesn't support these fields.
10649    NULL::pg_catalog.regproc as aggtransfn,
10650    '0'::pg_catalog.regproc as aggfinalfn,
10651    '0'::pg_catalog.regproc as aggcombinefn,
10652    '0'::pg_catalog.regproc as aggserialfn,
10653    '0'::pg_catalog.regproc as aggdeserialfn,
10654    '0'::pg_catalog.regproc as aggmtransfn,
10655    '0'::pg_catalog.regproc as aggminvtransfn,
10656    '0'::pg_catalog.regproc as aggmfinalfn,
10657    false as aggfinalextra,
10658    false as aggmfinalextra,
10659    NULL::pg_catalog.\"char\" AS aggfinalmodify,
10660    NULL::pg_catalog.\"char\" AS aggmfinalmodify,
10661    '0'::pg_catalog.oid as aggsortop,
10662    NULL::pg_catalog.oid as aggtranstype,
10663    NULL::pg_catalog.int4 as aggtransspace,
10664    '0'::pg_catalog.oid as aggmtranstype,
10665    NULL::pg_catalog.int4 as aggmtransspace,
10666    NULL::pg_catalog.text as agginitval,
10667    NULL::pg_catalog.text as aggminitval
10668FROM mz_internal.mz_aggregates a",
10669    access: vec![PUBLIC_SELECT],
10670});
10671
10672pub static PG_TRIGGER: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10673    name: "pg_trigger",
10674    schema: PG_CATALOG_SCHEMA,
10675    oid: oid::VIEW_PG_TRIGGER_OID,
10676    desc: RelationDesc::builder()
10677        .with_column("oid", SqlScalarType::Oid.nullable(false))
10678        .with_column("tgrelid", SqlScalarType::Oid.nullable(false))
10679        .with_column("tgparentid", SqlScalarType::Oid.nullable(false))
10680        .with_column("tgname", SqlScalarType::String.nullable(false))
10681        .with_column("tgfoid", SqlScalarType::Oid.nullable(false))
10682        .with_column("tgtype", SqlScalarType::Int16.nullable(false))
10683        .with_column("tgenabled", SqlScalarType::PgLegacyChar.nullable(false))
10684        .with_column("tgisinternal", SqlScalarType::Bool.nullable(false))
10685        .with_column("tgconstrrelid", SqlScalarType::Oid.nullable(false))
10686        .with_column("tgconstrindid", SqlScalarType::Oid.nullable(false))
10687        .with_column("tgconstraint", SqlScalarType::Oid.nullable(false))
10688        .with_column("tgdeferrable", SqlScalarType::Bool.nullable(false))
10689        .with_column("tginitdeferred", SqlScalarType::Bool.nullable(false))
10690        .with_column("tgnargs", SqlScalarType::Int16.nullable(false))
10691        .with_column("tgattr", SqlScalarType::Int2Vector.nullable(false))
10692        .with_column("tgargs", SqlScalarType::Bytes.nullable(false))
10693        .with_column("tgqual", SqlScalarType::String.nullable(false))
10694        .with_column("tgoldtable", SqlScalarType::String.nullable(false))
10695        .with_column("tgnewtable", SqlScalarType::String.nullable(false))
10696        .with_key(vec![])
10697        .finish(),
10698    column_comments: BTreeMap::new(),
10699    sql: "SELECT
10700    -- MZ doesn't support triggers so all of these fields are NULL.
10701    NULL::pg_catalog.oid AS oid,
10702    NULL::pg_catalog.oid AS tgrelid,
10703    NULL::pg_catalog.oid AS tgparentid,
10704    NULL::pg_catalog.text AS tgname,
10705    NULL::pg_catalog.oid AS tgfoid,
10706    NULL::pg_catalog.int2 AS tgtype,
10707    NULL::pg_catalog.\"char\" AS tgenabled,
10708    NULL::pg_catalog.bool AS tgisinternal,
10709    NULL::pg_catalog.oid AS tgconstrrelid,
10710    NULL::pg_catalog.oid AS tgconstrindid,
10711    NULL::pg_catalog.oid AS tgconstraint,
10712    NULL::pg_catalog.bool AS tgdeferrable,
10713    NULL::pg_catalog.bool AS tginitdeferred,
10714    NULL::pg_catalog.int2 AS tgnargs,
10715    NULL::pg_catalog.int2vector AS tgattr,
10716    NULL::pg_catalog.bytea AS tgargs,
10717    -- NOTE: The tgqual column is actually type `pg_node_tree` which we don't support. CockroachDB
10718    -- uses text as a placeholder, so we'll follow their lead here.
10719    NULL::pg_catalog.text AS tgqual,
10720    NULL::pg_catalog.text AS tgoldtable,
10721    NULL::pg_catalog.text AS tgnewtable
10722WHERE false
10723    ",
10724    access: vec![PUBLIC_SELECT],
10725});
10726
10727pub static PG_REWRITE: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10728    name: "pg_rewrite",
10729    schema: PG_CATALOG_SCHEMA,
10730    oid: oid::VIEW_PG_REWRITE_OID,
10731    desc: RelationDesc::builder()
10732        .with_column("oid", SqlScalarType::Oid.nullable(false))
10733        .with_column("rulename", SqlScalarType::String.nullable(false))
10734        .with_column("ev_class", SqlScalarType::Oid.nullable(false))
10735        .with_column("ev_type", SqlScalarType::PgLegacyChar.nullable(false))
10736        .with_column("ev_enabled", SqlScalarType::PgLegacyChar.nullable(false))
10737        .with_column("is_instead", SqlScalarType::Bool.nullable(false))
10738        .with_column("ev_qual", SqlScalarType::String.nullable(false))
10739        .with_column("ev_action", SqlScalarType::String.nullable(false))
10740        .with_key(vec![])
10741        .finish(),
10742    column_comments: BTreeMap::new(),
10743    sql: "SELECT
10744    -- MZ doesn't support rewrite rules so all of these fields are NULL.
10745    NULL::pg_catalog.oid AS oid,
10746    NULL::pg_catalog.text AS rulename,
10747    NULL::pg_catalog.oid AS ev_class,
10748    NULL::pg_catalog.\"char\" AS ev_type,
10749    NULL::pg_catalog.\"char\" AS ev_enabled,
10750    NULL::pg_catalog.bool AS is_instead,
10751    -- NOTE: The ev_qual and ev_action columns are actually type `pg_node_tree` which we don't
10752    -- support. CockroachDB uses text as a placeholder, so we'll follow their lead here.
10753    NULL::pg_catalog.text AS ev_qual,
10754    NULL::pg_catalog.text AS ev_action
10755WHERE false
10756    ",
10757    access: vec![PUBLIC_SELECT],
10758});
10759
10760pub static PG_EXTENSION: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10761    name: "pg_extension",
10762    schema: PG_CATALOG_SCHEMA,
10763    oid: oid::VIEW_PG_EXTENSION_OID,
10764    desc: RelationDesc::builder()
10765        .with_column("oid", SqlScalarType::Oid.nullable(false))
10766        .with_column("extname", SqlScalarType::String.nullable(false))
10767        .with_column("extowner", SqlScalarType::Oid.nullable(false))
10768        .with_column("extnamespace", SqlScalarType::Oid.nullable(false))
10769        .with_column("extrelocatable", SqlScalarType::Bool.nullable(false))
10770        .with_column("extversion", SqlScalarType::String.nullable(false))
10771        .with_column(
10772            "extconfig",
10773            SqlScalarType::Array(Box::new(SqlScalarType::Oid)).nullable(false),
10774        )
10775        .with_column(
10776            "extcondition",
10777            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(false),
10778        )
10779        .with_key(vec![])
10780        .finish(),
10781    column_comments: BTreeMap::new(),
10782    sql: "SELECT
10783    -- MZ doesn't support extensions so all of these fields are NULL.
10784    NULL::pg_catalog.oid AS oid,
10785    NULL::pg_catalog.text AS extname,
10786    NULL::pg_catalog.oid AS extowner,
10787    NULL::pg_catalog.oid AS extnamespace,
10788    NULL::pg_catalog.bool AS extrelocatable,
10789    NULL::pg_catalog.text AS extversion,
10790    NULL::pg_catalog.oid[] AS extconfig,
10791    NULL::pg_catalog.text[] AS extcondition
10792WHERE false
10793    ",
10794    access: vec![PUBLIC_SELECT],
10795});
10796
10797pub static MZ_SHOW_ALL_OBJECTS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10798    name: "mz_show_all_objects",
10799    schema: MZ_INTERNAL_SCHEMA,
10800    oid: oid::VIEW_MZ_SHOW_ALL_OBJECTS_OID,
10801    desc: RelationDesc::builder()
10802        .with_column("schema_id", SqlScalarType::String.nullable(false))
10803        .with_column("name", SqlScalarType::String.nullable(false))
10804        .with_column("type", SqlScalarType::String.nullable(false))
10805        .with_column("comment", SqlScalarType::String.nullable(false))
10806        .finish(),
10807    column_comments: BTreeMap::new(),
10808    sql: "WITH comments AS (
10809        SELECT id, object_type, comment
10810        FROM mz_internal.mz_comments
10811        WHERE object_sub_id IS NULL
10812    )
10813    SELECT schema_id, name, type, COALESCE(comment, '') AS comment
10814    FROM mz_catalog.mz_objects AS objs
10815    LEFT JOIN comments ON objs.id = comments.id
10816    WHERE (comments.object_type = objs.type OR comments.object_type IS NULL)",
10817    access: vec![PUBLIC_SELECT],
10818});
10819
10820pub static MZ_SHOW_CLUSTERS: LazyLock<BuiltinView> = LazyLock::new(|| {
10821    BuiltinView {
10822    name: "mz_show_clusters",
10823    schema: MZ_INTERNAL_SCHEMA,
10824    oid: oid::VIEW_MZ_SHOW_CLUSTERS_OID,
10825    desc: RelationDesc::builder()
10826        .with_column("name", SqlScalarType::String.nullable(false))
10827        .with_column("replicas", SqlScalarType::String.nullable(true))
10828        .with_column("comment", SqlScalarType::String.nullable(false))
10829        .finish(),
10830    column_comments: BTreeMap::new(),
10831    sql: "
10832    WITH clusters AS (
10833        SELECT
10834            mc.id,
10835            mc.name,
10836            pg_catalog.string_agg(mcr.name || ' (' || mcr.size || ')', ', ' ORDER BY mcr.name) AS replicas
10837        FROM mz_catalog.mz_clusters mc
10838        LEFT JOIN mz_catalog.mz_cluster_replicas mcr
10839        ON mc.id = mcr.cluster_id
10840        GROUP BY mc.id, mc.name
10841    ),
10842    comments AS (
10843        SELECT id, comment
10844        FROM mz_internal.mz_comments
10845        WHERE object_type = 'cluster' AND object_sub_id IS NULL
10846    )
10847    SELECT name, replicas, COALESCE(comment, '') as comment
10848    FROM clusters
10849    LEFT JOIN comments ON clusters.id = comments.id",
10850    access: vec![PUBLIC_SELECT],
10851}
10852});
10853
10854pub static MZ_SHOW_SECRETS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10855    name: "mz_show_secrets",
10856    schema: MZ_INTERNAL_SCHEMA,
10857    oid: oid::VIEW_MZ_SHOW_SECRETS_OID,
10858    desc: RelationDesc::builder()
10859        .with_column("schema_id", SqlScalarType::String.nullable(false))
10860        .with_column("name", SqlScalarType::String.nullable(false))
10861        .with_column("comment", SqlScalarType::String.nullable(false))
10862        .finish(),
10863    column_comments: BTreeMap::new(),
10864    sql: "WITH comments AS (
10865        SELECT id, comment
10866        FROM mz_internal.mz_comments
10867        WHERE object_type = 'secret' AND object_sub_id IS NULL
10868    )
10869    SELECT schema_id, name, COALESCE(comment, '') as comment
10870    FROM mz_catalog.mz_secrets secrets
10871    LEFT JOIN comments ON secrets.id = comments.id",
10872    access: vec![PUBLIC_SELECT],
10873});
10874
10875pub static MZ_SHOW_COLUMNS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10876    name: "mz_show_columns",
10877    schema: MZ_INTERNAL_SCHEMA,
10878    oid: oid::VIEW_MZ_SHOW_COLUMNS_OID,
10879    desc: RelationDesc::builder()
10880        .with_column("id", SqlScalarType::String.nullable(false))
10881        .with_column("name", SqlScalarType::String.nullable(false))
10882        .with_column("nullable", SqlScalarType::Bool.nullable(false))
10883        .with_column("type", SqlScalarType::String.nullable(false))
10884        .with_column("position", SqlScalarType::UInt64.nullable(false))
10885        .with_column("comment", SqlScalarType::String.nullable(false))
10886        .finish(),
10887    column_comments: BTreeMap::new(),
10888    sql: "
10889    SELECT columns.id, name, nullable, type, position, COALESCE(comment, '') as comment
10890    FROM mz_catalog.mz_columns columns
10891    LEFT JOIN mz_internal.mz_comments comments
10892    ON columns.id = comments.id AND columns.position = comments.object_sub_id",
10893    access: vec![PUBLIC_SELECT],
10894});
10895
10896pub static MZ_SHOW_DATABASES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10897    name: "mz_show_databases",
10898    schema: MZ_INTERNAL_SCHEMA,
10899    oid: oid::VIEW_MZ_SHOW_DATABASES_OID,
10900    desc: RelationDesc::builder()
10901        .with_column("name", SqlScalarType::String.nullable(false))
10902        .with_column("comment", SqlScalarType::String.nullable(false))
10903        .finish(),
10904    column_comments: BTreeMap::new(),
10905    sql: "WITH comments AS (
10906        SELECT id, comment
10907        FROM mz_internal.mz_comments
10908        WHERE object_type = 'database' AND object_sub_id IS NULL
10909    )
10910    SELECT name, COALESCE(comment, '') as comment
10911    FROM mz_catalog.mz_databases databases
10912    LEFT JOIN comments ON databases.id = comments.id",
10913    access: vec![PUBLIC_SELECT],
10914});
10915
10916pub static MZ_SHOW_SCHEMAS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10917    name: "mz_show_schemas",
10918    schema: MZ_INTERNAL_SCHEMA,
10919    oid: oid::VIEW_MZ_SHOW_SCHEMAS_OID,
10920    desc: RelationDesc::builder()
10921        .with_column("database_id", SqlScalarType::String.nullable(true))
10922        .with_column("name", SqlScalarType::String.nullable(false))
10923        .with_column("comment", SqlScalarType::String.nullable(false))
10924        .finish(),
10925    column_comments: BTreeMap::new(),
10926    sql: "WITH comments AS (
10927        SELECT id, comment
10928        FROM mz_internal.mz_comments
10929        WHERE object_type = 'schema' AND object_sub_id IS NULL
10930    )
10931    SELECT database_id, name, COALESCE(comment, '') as comment
10932    FROM mz_catalog.mz_schemas schemas
10933    LEFT JOIN comments ON schemas.id = comments.id",
10934    access: vec![PUBLIC_SELECT],
10935});
10936
10937pub static MZ_SHOW_ROLES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10938    name: "mz_show_roles",
10939    schema: MZ_INTERNAL_SCHEMA,
10940    oid: oid::VIEW_MZ_SHOW_ROLES_OID,
10941    desc: RelationDesc::builder()
10942        .with_column("name", SqlScalarType::String.nullable(false))
10943        .with_column("comment", SqlScalarType::String.nullable(false))
10944        .finish(),
10945    column_comments: BTreeMap::new(),
10946    sql: "WITH comments AS (
10947        SELECT id, comment
10948        FROM mz_internal.mz_comments
10949        WHERE object_type = 'role' AND object_sub_id IS NULL
10950    )
10951    SELECT name, COALESCE(comment, '') as comment
10952    FROM mz_catalog.mz_roles roles
10953    LEFT JOIN comments ON roles.id = comments.id
10954    WHERE roles.id NOT LIKE 's%'
10955      AND roles.id NOT LIKE 'g%'",
10956    access: vec![PUBLIC_SELECT],
10957});
10958
10959pub static MZ_SHOW_TABLES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10960    name: "mz_show_tables",
10961    schema: MZ_INTERNAL_SCHEMA,
10962    oid: oid::VIEW_MZ_SHOW_TABLES_OID,
10963    desc: RelationDesc::builder()
10964        .with_column("schema_id", SqlScalarType::String.nullable(false))
10965        .with_column("name", SqlScalarType::String.nullable(false))
10966        .with_column("comment", SqlScalarType::String.nullable(false))
10967        .with_column("source_id", SqlScalarType::String.nullable(true))
10968        .finish(),
10969    column_comments: BTreeMap::new(),
10970    sql: "WITH comments AS (
10971        SELECT id, comment
10972        FROM mz_internal.mz_comments
10973        WHERE object_type = 'table' AND object_sub_id IS NULL
10974    )
10975    SELECT schema_id, name, COALESCE(comment, '') as comment, source_id
10976    FROM mz_catalog.mz_tables tables
10977    LEFT JOIN comments ON tables.id = comments.id",
10978    access: vec![PUBLIC_SELECT],
10979});
10980
10981pub static MZ_SHOW_VIEWS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
10982    name: "mz_show_views",
10983    schema: MZ_INTERNAL_SCHEMA,
10984    oid: oid::VIEW_MZ_SHOW_VIEWS_OID,
10985    desc: RelationDesc::builder()
10986        .with_column("schema_id", SqlScalarType::String.nullable(false))
10987        .with_column("name", SqlScalarType::String.nullable(false))
10988        .with_column("comment", SqlScalarType::String.nullable(false))
10989        .finish(),
10990    column_comments: BTreeMap::new(),
10991    sql: "WITH comments AS (
10992        SELECT id, comment
10993        FROM mz_internal.mz_comments
10994        WHERE object_type = 'view' AND object_sub_id IS NULL
10995    )
10996    SELECT schema_id, name, COALESCE(comment, '') as comment
10997    FROM mz_catalog.mz_views views
10998    LEFT JOIN comments ON views.id = comments.id",
10999    access: vec![PUBLIC_SELECT],
11000});
11001
11002pub static MZ_SHOW_TYPES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11003    name: "mz_show_types",
11004    schema: MZ_INTERNAL_SCHEMA,
11005    oid: oid::VIEW_MZ_SHOW_TYPES_OID,
11006    desc: RelationDesc::builder()
11007        .with_column("schema_id", SqlScalarType::String.nullable(false))
11008        .with_column("name", SqlScalarType::String.nullable(false))
11009        .with_column("comment", SqlScalarType::String.nullable(false))
11010        .finish(),
11011    column_comments: BTreeMap::new(),
11012    sql: "WITH comments AS (
11013        SELECT id, comment
11014        FROM mz_internal.mz_comments
11015        WHERE object_type = 'type' AND object_sub_id IS NULL
11016    )
11017    SELECT schema_id, name, COALESCE(comment, '') as comment
11018    FROM mz_catalog.mz_types types
11019    LEFT JOIN comments ON types.id = comments.id",
11020    access: vec![PUBLIC_SELECT],
11021});
11022
11023pub static MZ_SHOW_CONNECTIONS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11024    name: "mz_show_connections",
11025    schema: MZ_INTERNAL_SCHEMA,
11026    oid: oid::VIEW_MZ_SHOW_CONNECTIONS_OID,
11027    desc: RelationDesc::builder()
11028        .with_column("schema_id", SqlScalarType::String.nullable(false))
11029        .with_column("name", SqlScalarType::String.nullable(false))
11030        .with_column("type", SqlScalarType::String.nullable(false))
11031        .with_column("comment", SqlScalarType::String.nullable(false))
11032        .finish(),
11033    column_comments: BTreeMap::new(),
11034    sql: "WITH comments AS (
11035        SELECT id, comment
11036        FROM mz_internal.mz_comments
11037        WHERE object_type = 'connection' AND object_sub_id IS NULL
11038    )
11039    SELECT schema_id, name, type, COALESCE(comment, '') as comment
11040    FROM mz_catalog.mz_connections connections
11041    LEFT JOIN comments ON connections.id = comments.id",
11042    access: vec![PUBLIC_SELECT],
11043});
11044
11045pub static MZ_SHOW_SOURCES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11046    name: "mz_show_sources",
11047    schema: MZ_INTERNAL_SCHEMA,
11048    oid: oid::VIEW_MZ_SHOW_SOURCES_OID,
11049    desc: RelationDesc::builder()
11050        .with_column("id", SqlScalarType::String.nullable(false))
11051        .with_column("name", SqlScalarType::String.nullable(false))
11052        .with_column("type", SqlScalarType::String.nullable(false))
11053        .with_column("cluster", SqlScalarType::String.nullable(true))
11054        .with_column("schema_id", SqlScalarType::String.nullable(false))
11055        .with_column("cluster_id", SqlScalarType::String.nullable(true))
11056        .with_column("comment", SqlScalarType::String.nullable(false))
11057        .finish(),
11058    column_comments: BTreeMap::new(),
11059    sql: "
11060WITH comments AS (
11061    SELECT id, comment
11062    FROM mz_internal.mz_comments
11063    WHERE object_type = 'source' AND object_sub_id IS NULL
11064)
11065SELECT
11066    sources.id,
11067    sources.name,
11068    sources.type,
11069    clusters.name AS cluster,
11070    schema_id,
11071    cluster_id,
11072    COALESCE(comments.comment, '') as comment
11073FROM
11074    mz_catalog.mz_sources AS sources
11075        LEFT JOIN
11076            mz_catalog.mz_clusters AS clusters
11077            ON clusters.id = sources.cluster_id
11078        LEFT JOIN comments ON sources.id = comments.id",
11079    access: vec![PUBLIC_SELECT],
11080});
11081
11082pub static MZ_SHOW_SINKS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11083    name: "mz_show_sinks",
11084    schema: MZ_INTERNAL_SCHEMA,
11085    oid: oid::VIEW_MZ_SHOW_SINKS_OID,
11086    desc: RelationDesc::builder()
11087        .with_column("id", SqlScalarType::String.nullable(false))
11088        .with_column("name", SqlScalarType::String.nullable(false))
11089        .with_column("type", SqlScalarType::String.nullable(false))
11090        .with_column("cluster", SqlScalarType::String.nullable(false))
11091        .with_column("schema_id", SqlScalarType::String.nullable(false))
11092        .with_column("cluster_id", SqlScalarType::String.nullable(false))
11093        .with_column("comment", SqlScalarType::String.nullable(false))
11094        .finish(),
11095    column_comments: BTreeMap::new(),
11096    sql: "
11097WITH comments AS (
11098    SELECT id, comment
11099    FROM mz_internal.mz_comments
11100    WHERE object_type = 'sink' AND object_sub_id IS NULL
11101)
11102SELECT
11103    sinks.id,
11104    sinks.name,
11105    sinks.type,
11106    clusters.name AS cluster,
11107    schema_id,
11108    cluster_id,
11109    COALESCE(comments.comment, '') as comment
11110FROM
11111    mz_catalog.mz_sinks AS sinks
11112    JOIN
11113        mz_catalog.mz_clusters AS clusters
11114        ON clusters.id = sinks.cluster_id
11115    LEFT JOIN comments ON sinks.id = comments.id",
11116    access: vec![PUBLIC_SELECT],
11117});
11118
11119pub static MZ_SHOW_MATERIALIZED_VIEWS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11120    name: "mz_show_materialized_views",
11121    schema: MZ_INTERNAL_SCHEMA,
11122    oid: oid::VIEW_MZ_SHOW_MATERIALIZED_VIEWS_OID,
11123    desc: RelationDesc::builder()
11124        .with_column("id", SqlScalarType::String.nullable(false))
11125        .with_column("name", SqlScalarType::String.nullable(false))
11126        .with_column("cluster", SqlScalarType::String.nullable(false))
11127        .with_column("schema_id", SqlScalarType::String.nullable(false))
11128        .with_column("cluster_id", SqlScalarType::String.nullable(false))
11129        .with_column("comment", SqlScalarType::String.nullable(false))
11130        .with_column("replacing", SqlScalarType::String.nullable(true))
11131        .finish(),
11132    column_comments: BTreeMap::new(),
11133    sql: "
11134WITH
11135    comments AS (
11136        SELECT id, comment
11137        FROM mz_internal.mz_comments
11138        WHERE object_type = 'materialized-view' AND object_sub_id IS NULL
11139    ),
11140    replacements AS (
11141        SELECT r.id, mv.name AS target_name
11142        FROM mz_internal.mz_replacements r
11143        JOIN mz_materialized_views mv ON r.target_id = mv.id
11144    )
11145SELECT
11146    mviews.id as id,
11147    mviews.name,
11148    clusters.name AS cluster,
11149    schema_id,
11150    cluster_id,
11151    COALESCE(comments.comment, '') as comment,
11152    replacements.target_name as replacing
11153FROM
11154    mz_catalog.mz_materialized_views AS mviews
11155    JOIN mz_catalog.mz_clusters AS clusters ON clusters.id = mviews.cluster_id
11156    LEFT JOIN comments ON mviews.id = comments.id
11157    LEFT JOIN replacements ON mviews.id = replacements.id",
11158    access: vec![PUBLIC_SELECT],
11159});
11160
11161pub static MZ_SHOW_INDEXES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11162    name: "mz_show_indexes",
11163    schema: MZ_INTERNAL_SCHEMA,
11164    oid: oid::VIEW_MZ_SHOW_INDEXES_OID,
11165    desc: RelationDesc::builder()
11166        .with_column("id", SqlScalarType::String.nullable(false))
11167        .with_column("name", SqlScalarType::String.nullable(false))
11168        .with_column("on", SqlScalarType::String.nullable(false))
11169        .with_column("cluster", SqlScalarType::String.nullable(false))
11170        .with_column(
11171            "key",
11172            SqlScalarType::Array(Box::new(SqlScalarType::String)).nullable(false),
11173        )
11174        .with_column("on_id", SqlScalarType::String.nullable(false))
11175        .with_column("schema_id", SqlScalarType::String.nullable(false))
11176        .with_column("cluster_id", SqlScalarType::String.nullable(false))
11177        .with_column("comment", SqlScalarType::String.nullable(false))
11178        .finish(),
11179    column_comments: BTreeMap::new(),
11180    sql: "
11181WITH comments AS (
11182    SELECT id, comment
11183    FROM mz_internal.mz_comments
11184    WHERE object_type = 'index' AND object_sub_id IS NULL
11185)
11186SELECT
11187    idxs.id AS id,
11188    idxs.name AS name,
11189    objs.name AS on,
11190    clusters.name AS cluster,
11191    COALESCE(keys.key, '{}'::_text) AS key,
11192    idxs.on_id AS on_id,
11193    objs.schema_id AS schema_id,
11194    clusters.id AS cluster_id,
11195    COALESCE(comments.comment, '') as comment
11196FROM
11197    mz_catalog.mz_indexes AS idxs
11198    JOIN mz_catalog.mz_objects AS objs ON idxs.on_id = objs.id
11199    JOIN mz_catalog.mz_clusters AS clusters ON clusters.id = idxs.cluster_id
11200    LEFT JOIN
11201        (SELECT
11202            idxs.id,
11203            ARRAY_AGG(
11204                CASE
11205                    WHEN idx_cols.on_expression IS NULL THEN obj_cols.name
11206                    ELSE idx_cols.on_expression
11207                END
11208                ORDER BY idx_cols.index_position ASC
11209            ) AS key
11210        FROM
11211            mz_catalog.mz_indexes AS idxs
11212            JOIN mz_catalog.mz_index_columns idx_cols ON idxs.id = idx_cols.index_id
11213            LEFT JOIN mz_catalog.mz_columns obj_cols ON
11214                idxs.on_id = obj_cols.id AND idx_cols.on_position = obj_cols.position
11215        GROUP BY idxs.id) AS keys
11216    ON idxs.id = keys.id
11217    LEFT JOIN comments ON idxs.id = comments.id",
11218    access: vec![PUBLIC_SELECT],
11219});
11220
11221pub static MZ_SHOW_CLUSTER_REPLICAS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11222    name: "mz_show_cluster_replicas",
11223    schema: MZ_INTERNAL_SCHEMA,
11224    oid: oid::VIEW_MZ_SHOW_CLUSTER_REPLICAS_OID,
11225    desc: RelationDesc::builder()
11226        .with_column("cluster", SqlScalarType::String.nullable(false))
11227        .with_column("replica", SqlScalarType::String.nullable(false))
11228        .with_column("replica_id", SqlScalarType::String.nullable(false))
11229        .with_column("size", SqlScalarType::String.nullable(true))
11230        .with_column("ready", SqlScalarType::Bool.nullable(false))
11231        .with_column("comment", SqlScalarType::String.nullable(false))
11232        .finish(),
11233    column_comments: BTreeMap::new(),
11234    sql: r#"SELECT
11235    mz_catalog.mz_clusters.name AS cluster,
11236    mz_catalog.mz_cluster_replicas.name AS replica,
11237    mz_catalog.mz_cluster_replicas.id as replica_id,
11238    mz_catalog.mz_cluster_replicas.size AS size,
11239    coalesce(statuses.ready, FALSE) AS ready,
11240    coalesce(comments.comment, '') as comment
11241FROM
11242    mz_catalog.mz_cluster_replicas
11243        JOIN mz_catalog.mz_clusters
11244            ON mz_catalog.mz_cluster_replicas.cluster_id = mz_catalog.mz_clusters.id
11245        LEFT JOIN
11246            (
11247                SELECT
11248                    replica_id,
11249                    bool_and(hydrated) AS ready
11250                FROM mz_internal.mz_hydration_statuses
11251                WHERE replica_id is not null
11252                GROUP BY replica_id
11253            ) AS statuses
11254            ON mz_catalog.mz_cluster_replicas.id = statuses.replica_id
11255        LEFT JOIN mz_internal.mz_comments comments
11256            ON mz_catalog.mz_cluster_replicas.id = comments.id
11257WHERE (comments.object_type = 'cluster-replica' OR comments.object_type IS NULL)
11258ORDER BY 1, 2"#,
11259    access: vec![PUBLIC_SELECT],
11260});
11261
11262pub static MZ_SHOW_CONTINUAL_TASKS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11263    name: "mz_show_continual_tasks",
11264    schema: MZ_INTERNAL_SCHEMA,
11265    oid: oid::VIEW_MZ_SHOW_CONTINUAL_TASKS_OID,
11266    desc: RelationDesc::builder()
11267        .with_column("id", SqlScalarType::String.nullable(false))
11268        .with_column("name", SqlScalarType::String.nullable(false))
11269        .with_column("cluster", SqlScalarType::String.nullable(false))
11270        .with_column("schema_id", SqlScalarType::String.nullable(false))
11271        .with_column("cluster_id", SqlScalarType::String.nullable(false))
11272        .with_column("comment", SqlScalarType::String.nullable(false))
11273        .finish(),
11274    column_comments: BTreeMap::new(),
11275    sql: "
11276WITH comments AS (
11277    SELECT id, comment
11278    FROM mz_internal.mz_comments
11279    WHERE object_type = 'continual-task' AND object_sub_id IS NULL
11280)
11281SELECT
11282    cts.id as id,
11283    cts.name,
11284    clusters.name AS cluster,
11285    schema_id,
11286    cluster_id,
11287    COALESCE(comments.comment, '') as comment
11288FROM
11289    mz_internal.mz_continual_tasks AS cts
11290    JOIN mz_catalog.mz_clusters AS clusters ON clusters.id = cts.cluster_id
11291    LEFT JOIN comments ON cts.id = comments.id",
11292    access: vec![PUBLIC_SELECT],
11293});
11294
11295pub static MZ_SHOW_ROLE_MEMBERS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11296    name: "mz_show_role_members",
11297    schema: MZ_INTERNAL_SCHEMA,
11298    oid: oid::VIEW_MZ_SHOW_ROLE_MEMBERS_OID,
11299    desc: RelationDesc::builder()
11300        .with_column("role", SqlScalarType::String.nullable(false))
11301        .with_column("member", SqlScalarType::String.nullable(false))
11302        .with_column("grantor", SqlScalarType::String.nullable(false))
11303        .finish(),
11304    column_comments: BTreeMap::from_iter([
11305        ("role", "The role that `member` is a member of."),
11306        ("member", "The role that is a member of `role`."),
11307        (
11308            "grantor",
11309            "The role that granted membership of `member` to `role`.",
11310        ),
11311    ]),
11312    sql: r#"SELECT
11313    r1.name AS role,
11314    r2.name AS member,
11315    r3.name AS grantor
11316FROM mz_catalog.mz_role_members rm
11317JOIN mz_catalog.mz_roles r1 ON r1.id = rm.role_id
11318JOIN mz_catalog.mz_roles r2 ON r2.id = rm.member
11319JOIN mz_catalog.mz_roles r3 ON r3.id = rm.grantor
11320ORDER BY role"#,
11321    access: vec![PUBLIC_SELECT],
11322});
11323
11324pub static MZ_SHOW_MY_ROLE_MEMBERS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11325    name: "mz_show_my_role_members",
11326    schema: MZ_INTERNAL_SCHEMA,
11327    oid: oid::VIEW_MZ_SHOW_MY_ROLE_MEMBERS_OID,
11328    desc: RelationDesc::builder()
11329        .with_column("role", SqlScalarType::String.nullable(false))
11330        .with_column("member", SqlScalarType::String.nullable(false))
11331        .with_column("grantor", SqlScalarType::String.nullable(false))
11332        .finish(),
11333    column_comments: BTreeMap::from_iter([
11334        ("role", "The role that `member` is a member of."),
11335        ("member", "The role that is a member of `role`."),
11336        (
11337            "grantor",
11338            "The role that granted membership of `member` to `role`.",
11339        ),
11340    ]),
11341    sql: r#"SELECT role, member, grantor
11342FROM mz_internal.mz_show_role_members
11343WHERE pg_has_role(member, 'USAGE')"#,
11344    access: vec![PUBLIC_SELECT],
11345});
11346
11347pub static MZ_SHOW_SYSTEM_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11348    name: "mz_show_system_privileges",
11349    schema: MZ_INTERNAL_SCHEMA,
11350    oid: oid::VIEW_MZ_SHOW_SYSTEM_PRIVILEGES_OID,
11351    desc: RelationDesc::builder()
11352        .with_column("grantor", SqlScalarType::String.nullable(true))
11353        .with_column("grantee", SqlScalarType::String.nullable(true))
11354        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11355        .finish(),
11356    column_comments: BTreeMap::from_iter([
11357        ("grantor", "The role that granted the privilege."),
11358        ("grantee", "The role that the privilege was granted to."),
11359        ("privilege_type", "They type of privilege granted."),
11360    ]),
11361    sql: r#"SELECT
11362    grantor.name AS grantor,
11363    CASE privileges.grantee
11364        WHEN 'p' THEN 'PUBLIC'
11365        ELSE grantee.name
11366    END AS grantee,
11367    privileges.privilege_type AS privilege_type
11368FROM
11369    (SELECT mz_internal.mz_aclexplode(ARRAY[privileges]).*
11370    FROM mz_catalog.mz_system_privileges) AS privileges
11371LEFT JOIN mz_catalog.mz_roles grantor ON privileges.grantor = grantor.id
11372LEFT JOIN mz_catalog.mz_roles grantee ON privileges.grantee = grantee.id
11373WHERE privileges.grantee NOT LIKE 's%'"#,
11374    access: vec![PUBLIC_SELECT],
11375});
11376
11377pub static MZ_SHOW_MY_SYSTEM_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11378    name: "mz_show_my_system_privileges",
11379    schema: MZ_INTERNAL_SCHEMA,
11380    oid: oid::VIEW_MZ_SHOW_MY_SYSTEM_PRIVILEGES_OID,
11381    desc: RelationDesc::builder()
11382        .with_column("grantor", SqlScalarType::String.nullable(true))
11383        .with_column("grantee", SqlScalarType::String.nullable(true))
11384        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11385        .finish(),
11386    column_comments: BTreeMap::from_iter([
11387        ("grantor", "The role that granted the privilege."),
11388        ("grantee", "The role that the privilege was granted to."),
11389        ("privilege_type", "They type of privilege granted."),
11390    ]),
11391    sql: r#"SELECT grantor, grantee, privilege_type
11392FROM mz_internal.mz_show_system_privileges
11393WHERE
11394    CASE
11395        WHEN grantee = 'PUBLIC' THEN true
11396        ELSE pg_has_role(grantee, 'USAGE')
11397    END"#,
11398    access: vec![PUBLIC_SELECT],
11399});
11400
11401pub static MZ_SHOW_CLUSTER_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11402    name: "mz_show_cluster_privileges",
11403    schema: MZ_INTERNAL_SCHEMA,
11404    oid: oid::VIEW_MZ_SHOW_CLUSTER_PRIVILEGES_OID,
11405    desc: RelationDesc::builder()
11406        .with_column("grantor", SqlScalarType::String.nullable(true))
11407        .with_column("grantee", SqlScalarType::String.nullable(true))
11408        .with_column("name", SqlScalarType::String.nullable(false))
11409        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11410        .finish(),
11411    column_comments: BTreeMap::from_iter([
11412        ("grantor", "The role that granted the privilege."),
11413        ("grantee", "The role that the privilege was granted to."),
11414        ("name", "The name of the cluster."),
11415        ("privilege_type", "They type of privilege granted."),
11416    ]),
11417    sql: r#"SELECT
11418    grantor.name AS grantor,
11419    CASE privileges.grantee
11420        WHEN 'p' THEN 'PUBLIC'
11421        ELSE grantee.name
11422    END AS grantee,
11423    privileges.name AS name,
11424    privileges.privilege_type AS privilege_type
11425FROM
11426    (SELECT mz_internal.mz_aclexplode(privileges).*, name
11427    FROM mz_catalog.mz_clusters
11428    WHERE id NOT LIKE 's%') AS privileges
11429LEFT JOIN mz_catalog.mz_roles grantor ON privileges.grantor = grantor.id
11430LEFT JOIN mz_catalog.mz_roles grantee ON privileges.grantee = grantee.id
11431WHERE privileges.grantee NOT LIKE 's%'"#,
11432    access: vec![PUBLIC_SELECT],
11433});
11434
11435pub static MZ_SHOW_MY_CLUSTER_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11436    name: "mz_show_my_cluster_privileges",
11437    schema: MZ_INTERNAL_SCHEMA,
11438    oid: oid::VIEW_MZ_SHOW_MY_CLUSTER_PRIVILEGES_OID,
11439    desc: RelationDesc::builder()
11440        .with_column("grantor", SqlScalarType::String.nullable(true))
11441        .with_column("grantee", SqlScalarType::String.nullable(true))
11442        .with_column("name", SqlScalarType::String.nullable(false))
11443        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11444        .finish(),
11445    column_comments: BTreeMap::from_iter([
11446        ("grantor", "The role that granted the privilege."),
11447        ("grantee", "The role that the privilege was granted to."),
11448        ("name", "The name of the cluster."),
11449        ("privilege_type", "They type of privilege granted."),
11450    ]),
11451    sql: r#"SELECT grantor, grantee, name, privilege_type
11452FROM mz_internal.mz_show_cluster_privileges
11453WHERE
11454    CASE
11455        WHEN grantee = 'PUBLIC' THEN true
11456        ELSE pg_has_role(grantee, 'USAGE')
11457    END"#,
11458    access: vec![PUBLIC_SELECT],
11459});
11460
11461pub static MZ_SHOW_DATABASE_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11462    name: "mz_show_database_privileges",
11463    schema: MZ_INTERNAL_SCHEMA,
11464    oid: oid::VIEW_MZ_SHOW_DATABASE_PRIVILEGES_OID,
11465    desc: RelationDesc::builder()
11466        .with_column("grantor", SqlScalarType::String.nullable(true))
11467        .with_column("grantee", SqlScalarType::String.nullable(true))
11468        .with_column("name", SqlScalarType::String.nullable(false))
11469        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11470        .finish(),
11471    column_comments: BTreeMap::from_iter([
11472        ("grantor", "The role that granted the privilege."),
11473        ("grantee", "The role that the privilege was granted to."),
11474        ("name", "The name of the database."),
11475        ("privilege_type", "They type of privilege granted."),
11476    ]),
11477    sql: r#"SELECT
11478    grantor.name AS grantor,
11479    CASE privileges.grantee
11480        WHEN 'p' THEN 'PUBLIC'
11481        ELSE grantee.name
11482    END AS grantee,
11483    privileges.name AS name,
11484    privileges.privilege_type AS privilege_type
11485FROM
11486    (SELECT mz_internal.mz_aclexplode(privileges).*, name
11487    FROM mz_catalog.mz_databases
11488    WHERE id NOT LIKE 's%') AS privileges
11489LEFT JOIN mz_catalog.mz_roles grantor ON privileges.grantor = grantor.id
11490LEFT JOIN mz_catalog.mz_roles grantee ON privileges.grantee = grantee.id
11491WHERE privileges.grantee NOT LIKE 's%'"#,
11492    access: vec![PUBLIC_SELECT],
11493});
11494
11495pub static MZ_SHOW_MY_DATABASE_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11496    name: "mz_show_my_database_privileges",
11497    schema: MZ_INTERNAL_SCHEMA,
11498    oid: oid::VIEW_MZ_SHOW_MY_DATABASE_PRIVILEGES_OID,
11499    desc: RelationDesc::builder()
11500        .with_column("grantor", SqlScalarType::String.nullable(true))
11501        .with_column("grantee", SqlScalarType::String.nullable(true))
11502        .with_column("name", SqlScalarType::String.nullable(false))
11503        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11504        .finish(),
11505    column_comments: BTreeMap::from_iter([
11506        ("grantor", "The role that granted the privilege."),
11507        ("grantee", "The role that the privilege was granted to."),
11508        ("name", "The name of the cluster."),
11509        ("privilege_type", "They type of privilege granted."),
11510    ]),
11511    sql: r#"SELECT grantor, grantee, name, privilege_type
11512FROM mz_internal.mz_show_database_privileges
11513WHERE
11514    CASE
11515        WHEN grantee = 'PUBLIC' THEN true
11516        ELSE pg_has_role(grantee, 'USAGE')
11517    END"#,
11518    access: vec![PUBLIC_SELECT],
11519});
11520
11521pub static MZ_SHOW_SCHEMA_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11522    name: "mz_show_schema_privileges",
11523    schema: MZ_INTERNAL_SCHEMA,
11524    oid: oid::VIEW_MZ_SHOW_SCHEMA_PRIVILEGES_OID,
11525    desc: RelationDesc::builder()
11526        .with_column("grantor", SqlScalarType::String.nullable(true))
11527        .with_column("grantee", SqlScalarType::String.nullable(true))
11528        .with_column("database", SqlScalarType::String.nullable(true))
11529        .with_column("name", SqlScalarType::String.nullable(false))
11530        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11531        .finish(),
11532    column_comments: BTreeMap::from_iter([
11533        ("grantor", "The role that granted the privilege."),
11534        ("grantee", "The role that the privilege was granted to."),
11535        (
11536            "database",
11537            "The name of the database containing the schema.",
11538        ),
11539        ("name", "The name of the schema."),
11540        ("privilege_type", "They type of privilege granted."),
11541    ]),
11542    sql: r#"SELECT
11543    grantor.name AS grantor,
11544    CASE privileges.grantee
11545        WHEN 'p' THEN 'PUBLIC'
11546        ELSE grantee.name
11547    END AS grantee,
11548    databases.name AS database,
11549    privileges.name AS name,
11550    privileges.privilege_type AS privilege_type
11551FROM
11552    (SELECT mz_internal.mz_aclexplode(privileges).*, database_id, name
11553    FROM mz_catalog.mz_schemas
11554    WHERE id NOT LIKE 's%') AS privileges
11555LEFT JOIN mz_catalog.mz_roles grantor ON privileges.grantor = grantor.id
11556LEFT JOIN mz_catalog.mz_roles grantee ON privileges.grantee = grantee.id
11557LEFT JOIN mz_catalog.mz_databases databases ON privileges.database_id = databases.id
11558WHERE privileges.grantee NOT LIKE 's%'"#,
11559    access: vec![PUBLIC_SELECT],
11560});
11561
11562pub static MZ_SHOW_MY_SCHEMA_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11563    name: "mz_show_my_schema_privileges",
11564    schema: MZ_INTERNAL_SCHEMA,
11565    oid: oid::VIEW_MZ_SHOW_MY_SCHEMA_PRIVILEGES_OID,
11566    desc: RelationDesc::builder()
11567        .with_column("grantor", SqlScalarType::String.nullable(true))
11568        .with_column("grantee", SqlScalarType::String.nullable(true))
11569        .with_column("database", SqlScalarType::String.nullable(true))
11570        .with_column("name", SqlScalarType::String.nullable(false))
11571        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11572        .finish(),
11573    column_comments: BTreeMap::from_iter([
11574        ("grantor", "The role that granted the privilege."),
11575        ("grantee", "The role that the privilege was granted to."),
11576        (
11577            "database",
11578            "The name of the database containing the schema.",
11579        ),
11580        ("name", "The name of the schema."),
11581        ("privilege_type", "They type of privilege granted."),
11582    ]),
11583    sql: r#"SELECT grantor, grantee, database, name, privilege_type
11584FROM mz_internal.mz_show_schema_privileges
11585WHERE
11586    CASE
11587        WHEN grantee = 'PUBLIC' THEN true
11588        ELSE pg_has_role(grantee, 'USAGE')
11589    END"#,
11590    access: vec![PUBLIC_SELECT],
11591});
11592
11593pub static MZ_SHOW_OBJECT_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11594    name: "mz_show_object_privileges",
11595    schema: MZ_INTERNAL_SCHEMA,
11596    oid: oid::VIEW_MZ_SHOW_OBJECT_PRIVILEGES_OID,
11597    desc: RelationDesc::builder()
11598        .with_column("grantor", SqlScalarType::String.nullable(true))
11599        .with_column("grantee", SqlScalarType::String.nullable(true))
11600        .with_column("database", SqlScalarType::String.nullable(true))
11601        .with_column("schema", SqlScalarType::String.nullable(true))
11602        .with_column("name", SqlScalarType::String.nullable(false))
11603        .with_column("object_type", SqlScalarType::String.nullable(false))
11604        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11605        .finish(),
11606    column_comments: BTreeMap::from_iter([
11607        ("grantor", "The role that granted the privilege."),
11608        ("grantee", "The role that the privilege was granted to."),
11609        (
11610            "database",
11611            "The name of the database containing the object.",
11612        ),
11613        ("schema", "The name of the schema containing the object."),
11614        ("name", "The name of the object."),
11615        (
11616            "object_type",
11617            "The type of object the privilege is granted on.",
11618        ),
11619        ("privilege_type", "They type of privilege granted."),
11620    ]),
11621    sql: r#"SELECT
11622    grantor.name AS grantor,
11623    CASE privileges.grantee
11624            WHEN 'p' THEN 'PUBLIC'
11625            ELSE grantee.name
11626        END AS grantee,
11627    databases.name AS database,
11628    schemas.name AS schema,
11629    privileges.name AS name,
11630    privileges.type AS object_type,
11631    privileges.privilege_type AS privilege_type
11632FROM
11633    (SELECT mz_internal.mz_aclexplode(privileges).*, schema_id, name, type
11634    FROM mz_catalog.mz_objects
11635    WHERE id NOT LIKE 's%') AS privileges
11636LEFT JOIN mz_catalog.mz_roles grantor ON privileges.grantor = grantor.id
11637LEFT JOIN mz_catalog.mz_roles grantee ON privileges.grantee = grantee.id
11638LEFT JOIN mz_catalog.mz_schemas schemas ON privileges.schema_id = schemas.id
11639LEFT JOIN mz_catalog.mz_databases databases ON schemas.database_id = databases.id
11640WHERE privileges.grantee NOT LIKE 's%'"#,
11641    access: vec![PUBLIC_SELECT],
11642});
11643
11644pub static MZ_SHOW_MY_OBJECT_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11645    name: "mz_show_my_object_privileges",
11646    schema: MZ_INTERNAL_SCHEMA,
11647    oid: oid::VIEW_MZ_SHOW_MY_OBJECT_PRIVILEGES_OID,
11648    desc: RelationDesc::builder()
11649        .with_column("grantor", SqlScalarType::String.nullable(true))
11650        .with_column("grantee", SqlScalarType::String.nullable(true))
11651        .with_column("database", SqlScalarType::String.nullable(true))
11652        .with_column("schema", SqlScalarType::String.nullable(true))
11653        .with_column("name", SqlScalarType::String.nullable(false))
11654        .with_column("object_type", SqlScalarType::String.nullable(false))
11655        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11656        .finish(),
11657    column_comments: BTreeMap::from_iter([
11658        ("grantor", "The role that granted the privilege."),
11659        ("grantee", "The role that the privilege was granted to."),
11660        (
11661            "database",
11662            "The name of the database containing the object.",
11663        ),
11664        ("schema", "The name of the schema containing the object."),
11665        ("name", "The name of the object."),
11666        (
11667            "object_type",
11668            "The type of object the privilege is granted on.",
11669        ),
11670        ("privilege_type", "They type of privilege granted."),
11671    ]),
11672    sql: r#"SELECT grantor, grantee, database, schema, name, object_type, privilege_type
11673FROM mz_internal.mz_show_object_privileges
11674WHERE
11675    CASE
11676        WHEN grantee = 'PUBLIC' THEN true
11677        ELSE pg_has_role(grantee, 'USAGE')
11678    END"#,
11679    access: vec![PUBLIC_SELECT],
11680});
11681
11682pub static MZ_SHOW_ALL_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11683    name: "mz_show_all_privileges",
11684    schema: MZ_INTERNAL_SCHEMA,
11685    oid: oid::VIEW_MZ_SHOW_ALL_PRIVILEGES_OID,
11686    desc: RelationDesc::builder()
11687        .with_column("grantor", SqlScalarType::String.nullable(true))
11688        .with_column("grantee", SqlScalarType::String.nullable(true))
11689        .with_column("database", SqlScalarType::String.nullable(true))
11690        .with_column("schema", SqlScalarType::String.nullable(true))
11691        .with_column("name", SqlScalarType::String.nullable(true))
11692        .with_column("object_type", SqlScalarType::String.nullable(false))
11693        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11694        .finish(),
11695    column_comments: BTreeMap::from_iter([
11696        ("grantor", "The role that granted the privilege."),
11697        ("grantee", "The role that the privilege was granted to."),
11698        (
11699            "database",
11700            "The name of the database containing the object.",
11701        ),
11702        ("schema", "The name of the schema containing the object."),
11703        ("name", "The name of the privilege target."),
11704        (
11705            "object_type",
11706            "The type of object the privilege is granted on.",
11707        ),
11708        ("privilege_type", "They type of privilege granted."),
11709    ]),
11710    sql: r#"SELECT grantor, grantee, NULL AS database, NULL AS schema, NULL AS name, 'system' AS object_type, privilege_type
11711FROM mz_internal.mz_show_system_privileges
11712UNION ALL
11713SELECT grantor, grantee, NULL AS database, NULL AS schema, name, 'cluster' AS object_type, privilege_type
11714FROM mz_internal.mz_show_cluster_privileges
11715UNION ALL
11716SELECT grantor, grantee, NULL AS database, NULL AS schema, name, 'database' AS object_type, privilege_type
11717FROM mz_internal.mz_show_database_privileges
11718UNION ALL
11719SELECT grantor, grantee, database, NULL AS schema, name, 'schema' AS object_type, privilege_type
11720FROM mz_internal.mz_show_schema_privileges
11721UNION ALL
11722SELECT grantor, grantee, database, schema, name, object_type, privilege_type
11723FROM mz_internal.mz_show_object_privileges"#,
11724    access: vec![PUBLIC_SELECT],
11725});
11726
11727pub static MZ_SHOW_ALL_MY_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11728    name: "mz_show_all_my_privileges",
11729    schema: MZ_INTERNAL_SCHEMA,
11730    oid: oid::VIEW_MZ_SHOW_ALL_MY_PRIVILEGES_OID,
11731    desc: RelationDesc::builder()
11732        .with_column("grantor", SqlScalarType::String.nullable(true))
11733        .with_column("grantee", SqlScalarType::String.nullable(true))
11734        .with_column("database", SqlScalarType::String.nullable(true))
11735        .with_column("schema", SqlScalarType::String.nullable(true))
11736        .with_column("name", SqlScalarType::String.nullable(true))
11737        .with_column("object_type", SqlScalarType::String.nullable(false))
11738        .with_column("privilege_type", SqlScalarType::String.nullable(false))
11739        .finish(),
11740    column_comments: BTreeMap::from_iter([
11741        ("grantor", "The role that granted the privilege."),
11742        ("grantee", "The role that the privilege was granted to."),
11743        (
11744            "database",
11745            "The name of the database containing the object.",
11746        ),
11747        ("schema", "The name of the schema containing the object."),
11748        ("name", "The name of the privilege target."),
11749        (
11750            "object_type",
11751            "The type of object the privilege is granted on.",
11752        ),
11753        ("privilege_type", "They type of privilege granted."),
11754    ]),
11755    sql: r#"SELECT grantor, grantee, database, schema, name, object_type, privilege_type
11756FROM mz_internal.mz_show_all_privileges
11757WHERE
11758    CASE
11759        WHEN grantee = 'PUBLIC' THEN true
11760        ELSE pg_has_role(grantee, 'USAGE')
11761    END"#,
11762    access: vec![PUBLIC_SELECT],
11763});
11764
11765pub static MZ_SHOW_DEFAULT_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11766    name: "mz_show_default_privileges",
11767    schema: MZ_INTERNAL_SCHEMA,
11768    oid: oid::VIEW_MZ_SHOW_DEFAULT_PRIVILEGES_OID,
11769    desc: RelationDesc::builder()
11770        .with_column("object_owner", SqlScalarType::String.nullable(true))
11771        .with_column("database", SqlScalarType::String.nullable(true))
11772        .with_column("schema", SqlScalarType::String.nullable(true))
11773        .with_column("object_type", SqlScalarType::String.nullable(false))
11774        .with_column("grantee", SqlScalarType::String.nullable(true))
11775        .with_column("privilege_type", SqlScalarType::String.nullable(true))
11776        .finish(),
11777    column_comments: BTreeMap::from_iter([
11778        (
11779            "object_owner",
11780            "Privileges described in this row will be granted on objects created by `object_owner`.",
11781        ),
11782        (
11783            "database",
11784            "Privileges described in this row will be granted only on objects created in `database` if non-null.",
11785        ),
11786        (
11787            "schema",
11788            "Privileges described in this row will be granted only on objects created in `schema` if non-null.",
11789        ),
11790        (
11791            "object_type",
11792            "Privileges described in this row will be granted only on objects of type `object_type`.",
11793        ),
11794        (
11795            "grantee",
11796            "Privileges described in this row will be granted to `grantee`.",
11797        ),
11798        ("privilege_type", "They type of privilege to be granted."),
11799    ]),
11800    sql: r#"SELECT
11801    CASE defaults.role_id
11802        WHEN 'p' THEN 'PUBLIC'
11803        ELSE object_owner.name
11804    END AS object_owner,
11805    databases.name AS database,
11806    schemas.name AS schema,
11807    object_type,
11808    CASE defaults.grantee
11809        WHEN 'p' THEN 'PUBLIC'
11810        ELSE grantee.name
11811    END AS grantee,
11812    unnest(mz_internal.mz_format_privileges(defaults.privileges)) AS privilege_type
11813FROM mz_catalog.mz_default_privileges defaults
11814LEFT JOIN mz_catalog.mz_roles AS object_owner ON defaults.role_id = object_owner.id
11815LEFT JOIN mz_catalog.mz_roles AS grantee ON defaults.grantee = grantee.id
11816LEFT JOIN mz_catalog.mz_databases AS databases ON defaults.database_id = databases.id
11817LEFT JOIN mz_catalog.mz_schemas AS schemas ON defaults.schema_id = schemas.id
11818WHERE defaults.grantee NOT LIKE 's%'
11819    AND defaults.database_id IS NULL OR defaults.database_id NOT LIKE 's%'
11820    AND defaults.schema_id IS NULL OR defaults.schema_id NOT LIKE 's%'"#,
11821    access: vec![PUBLIC_SELECT],
11822});
11823
11824pub static MZ_SHOW_MY_DEFAULT_PRIVILEGES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11825    name: "mz_show_my_default_privileges",
11826    schema: MZ_INTERNAL_SCHEMA,
11827    oid: oid::VIEW_MZ_SHOW_MY_DEFAULT_PRIVILEGES_OID,
11828    desc: RelationDesc::builder()
11829        .with_column("object_owner", SqlScalarType::String.nullable(true))
11830        .with_column("database", SqlScalarType::String.nullable(true))
11831        .with_column("schema", SqlScalarType::String.nullable(true))
11832        .with_column("object_type", SqlScalarType::String.nullable(false))
11833        .with_column("grantee", SqlScalarType::String.nullable(true))
11834        .with_column("privilege_type", SqlScalarType::String.nullable(true))
11835        .finish(),
11836    column_comments: BTreeMap::from_iter([
11837        (
11838            "object_owner",
11839            "Privileges described in this row will be granted on objects created by `object_owner`.",
11840        ),
11841        (
11842            "database",
11843            "Privileges described in this row will be granted only on objects created in `database` if non-null.",
11844        ),
11845        (
11846            "schema",
11847            "Privileges described in this row will be granted only on objects created in `schema` if non-null.",
11848        ),
11849        (
11850            "object_type",
11851            "Privileges described in this row will be granted only on objects of type `object_type`.",
11852        ),
11853        (
11854            "grantee",
11855            "Privileges described in this row will be granted to `grantee`.",
11856        ),
11857        ("privilege_type", "They type of privilege to be granted."),
11858    ]),
11859    sql: r#"SELECT object_owner, database, schema, object_type, grantee, privilege_type
11860FROM mz_internal.mz_show_default_privileges
11861WHERE
11862    CASE
11863        WHEN grantee = 'PUBLIC' THEN true
11864        ELSE pg_has_role(grantee, 'USAGE')
11865    END"#,
11866    access: vec![PUBLIC_SELECT],
11867});
11868
11869pub static MZ_SHOW_NETWORK_POLICIES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11870    name: "mz_show_network_policies",
11871    schema: MZ_INTERNAL_SCHEMA,
11872    oid: oid::VIEW_MZ_SHOW_NETWORK_POLICIES_OID,
11873    desc: RelationDesc::builder()
11874        .with_column("name", SqlScalarType::String.nullable(false))
11875        .with_column("rules", SqlScalarType::String.nullable(true))
11876        .with_column("comment", SqlScalarType::String.nullable(false))
11877        .finish(),
11878    column_comments: BTreeMap::new(),
11879    sql: "
11880WITH comments AS (
11881    SELECT id, comment
11882    FROM mz_internal.mz_comments
11883    WHERE object_type = 'network-policy' AND object_sub_id IS NULL
11884)
11885SELECT
11886    policy.name,
11887    pg_catalog.string_agg(rule.name,',' ORDER BY rule.name) as rules,
11888    COALESCE(comment, '') as comment
11889FROM
11890    mz_internal.mz_network_policies as policy
11891LEFT JOIN
11892    mz_internal.mz_network_policy_rules as rule ON policy.id = rule.policy_id
11893LEFT JOIN
11894    comments ON policy.id = comments.id
11895WHERE
11896    policy.id NOT LIKE 's%'
11897AND
11898    policy.id NOT LIKE 'g%'
11899GROUP BY policy.name, comments.comment;",
11900    access: vec![PUBLIC_SELECT],
11901});
11902
11903pub static MZ_CLUSTER_REPLICA_HISTORY: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11904    name: "mz_cluster_replica_history",
11905    schema: MZ_INTERNAL_SCHEMA,
11906    oid: oid::VIEW_MZ_CLUSTER_REPLICA_HISTORY_OID,
11907    desc: RelationDesc::builder()
11908        .with_column("replica_id", SqlScalarType::String.nullable(true))
11909        .with_column("size", SqlScalarType::String.nullable(true))
11910        .with_column("cluster_id", SqlScalarType::String.nullable(true))
11911        .with_column("cluster_name", SqlScalarType::String.nullable(true))
11912        .with_column("replica_name", SqlScalarType::String.nullable(true))
11913        .with_column(
11914            "created_at",
11915            SqlScalarType::TimestampTz { precision: None }.nullable(false),
11916        )
11917        .with_column(
11918            "dropped_at",
11919            SqlScalarType::TimestampTz { precision: None }.nullable(true),
11920        )
11921        .with_column(
11922            "credits_per_hour",
11923            SqlScalarType::Numeric { max_scale: None }.nullable(true),
11924        )
11925        .finish(),
11926    column_comments: BTreeMap::from_iter([
11927        ("replica_id", "The ID of a cluster replica."),
11928        (
11929            "size",
11930            "The size of the cluster replica. Corresponds to `mz_cluster_replica_sizes.size`.",
11931        ),
11932        (
11933            "cluster_id",
11934            "The ID of the cluster associated with the replica.",
11935        ),
11936        (
11937            "cluster_name",
11938            "The name of the cluster associated with the replica.",
11939        ),
11940        ("replica_name", "The name of the replica."),
11941        ("created_at", "The time at which the replica was created."),
11942        (
11943            "dropped_at",
11944            "The time at which the replica was dropped, or `NULL` if it still exists.",
11945        ),
11946        (
11947            "credits_per_hour",
11948            "The number of compute credits consumed per hour. Corresponds to `mz_cluster_replica_sizes.credits_per_hour`.",
11949        ),
11950    ]),
11951    sql: r#"
11952        WITH
11953            creates AS
11954            (
11955                SELECT
11956                    details ->> 'logical_size' AS size,
11957                    details ->> 'replica_id' AS replica_id,
11958                    details ->> 'replica_name' AS replica_name,
11959                    details ->> 'cluster_name' AS cluster_name,
11960                    details ->> 'cluster_id' AS cluster_id,
11961                    occurred_at
11962                FROM mz_catalog.mz_audit_events
11963                WHERE
11964                    object_type = 'cluster-replica' AND event_type = 'create'
11965                        AND
11966                    details ->> 'replica_id' IS NOT NULL
11967                        AND
11968                    details ->> 'cluster_id' !~~ 's%'
11969            ),
11970            drops AS
11971            (
11972                SELECT details ->> 'replica_id' AS replica_id, occurred_at
11973                FROM mz_catalog.mz_audit_events
11974                WHERE object_type = 'cluster-replica' AND event_type = 'drop'
11975            )
11976        SELECT
11977            creates.replica_id,
11978            creates.size,
11979            creates.cluster_id,
11980            creates.cluster_name,
11981            creates.replica_name,
11982            creates.occurred_at AS created_at,
11983            drops.occurred_at AS dropped_at,
11984            mz_cluster_replica_sizes.credits_per_hour as credits_per_hour
11985        FROM
11986            creates
11987                LEFT JOIN drops ON creates.replica_id = drops.replica_id
11988                LEFT JOIN
11989                    mz_catalog.mz_cluster_replica_sizes
11990                    ON mz_cluster_replica_sizes.size = creates.size"#,
11991    access: vec![PUBLIC_SELECT],
11992});
11993
11994pub static MZ_CLUSTER_REPLICA_NAME_HISTORY: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
11995    name: "mz_cluster_replica_name_history",
11996    schema: MZ_INTERNAL_SCHEMA,
11997    oid: oid::VIEW_MZ_CLUSTER_REPLICA_NAME_HISTORY_OID,
11998    desc: RelationDesc::builder()
11999        .with_column(
12000            "occurred_at",
12001            SqlScalarType::TimestampTz { precision: None }.nullable(true),
12002        )
12003        .with_column("id", SqlScalarType::String.nullable(true))
12004        .with_column("previous_name", SqlScalarType::String.nullable(true))
12005        .with_column("new_name", SqlScalarType::String.nullable(true))
12006        .finish(),
12007    column_comments: BTreeMap::from_iter([
12008        (
12009            "occurred_at",
12010            "The time at which the cluster replica was created or renamed. `NULL` if it's a built in system cluster replica.",
12011        ),
12012        ("id", "The ID of the cluster replica."),
12013        (
12014            "previous_name",
12015            "The previous name of the cluster replica. `NULL` if there was no previous name.",
12016        ),
12017        ("new_name", "The new name of the cluster replica."),
12018    ]),
12019    sql: r#"WITH user_replica_alter_history AS (
12020  SELECT occurred_at,
12021    audit_events.details->>'replica_id' AS id,
12022    audit_events.details->>'old_name' AS previous_name,
12023    audit_events.details->>'new_name' AS new_name
12024  FROM mz_catalog.mz_audit_events AS audit_events
12025  WHERE object_type = 'cluster-replica'
12026    AND audit_events.event_type = 'alter'
12027    AND audit_events.details->>'replica_id' like 'u%'
12028),
12029user_replica_create_history AS (
12030  SELECT occurred_at,
12031    audit_events.details->>'replica_id' AS id,
12032    NULL AS previous_name,
12033    audit_events.details->>'replica_name' AS new_name
12034  FROM mz_catalog.mz_audit_events AS audit_events
12035  WHERE object_type = 'cluster-replica'
12036    AND audit_events.event_type = 'create'
12037    AND audit_events.details->>'replica_id' like 'u%'
12038),
12039-- Because built in system cluster replicas don't have audit events, we need to manually add them
12040system_replicas AS (
12041  -- We assume that the system cluster replicas were created at the beginning of time
12042  SELECT NULL::timestamptz AS occurred_at,
12043    id,
12044    NULL AS previous_name,
12045    name AS new_name
12046  FROM mz_catalog.mz_cluster_replicas
12047  WHERE id LIKE 's%'
12048)
12049SELECT *
12050FROM user_replica_alter_history
12051UNION ALL
12052SELECT *
12053FROM user_replica_create_history
12054UNION ALL
12055SELECT *
12056FROM system_replicas"#,
12057    access: vec![PUBLIC_SELECT],
12058});
12059
12060pub static MZ_HYDRATION_STATUSES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
12061    name: "mz_hydration_statuses",
12062    schema: MZ_INTERNAL_SCHEMA,
12063    oid: oid::VIEW_MZ_HYDRATION_STATUSES_OID,
12064    desc: RelationDesc::builder()
12065        .with_column("object_id", SqlScalarType::String.nullable(false))
12066        .with_column("replica_id", SqlScalarType::String.nullable(true))
12067        .with_column("hydrated", SqlScalarType::Bool.nullable(true))
12068        .finish(),
12069    column_comments: BTreeMap::from_iter([
12070        (
12071            "object_id",
12072            "The ID of a dataflow-powered object. Corresponds to `mz_catalog.mz_indexes.id`, `mz_catalog.mz_materialized_views.id`, `mz_internal.mz_subscriptions`, `mz_catalog.mz_sources.id`, or `mz_catalog.mz_sinks.id`.",
12073        ),
12074        ("replica_id", "The ID of a cluster replica."),
12075        ("hydrated", "Whether the object is hydrated on the replica."),
12076    ]),
12077    sql: r#"WITH
12078-- Joining against the linearizable catalog tables ensures that this view
12079-- always contains the set of installed objects, even when it depends
12080-- on introspection relations that may received delayed updates.
12081--
12082-- Note that this view only includes objects that are maintained by dataflows.
12083-- In particular, some source types (webhook, introspection, ...) are not and
12084-- are therefore omitted.
12085indexes AS (
12086    SELECT
12087        i.id AS object_id,
12088        h.replica_id,
12089        COALESCE(h.hydrated, false) AS hydrated
12090    FROM mz_catalog.mz_indexes i
12091    LEFT JOIN mz_internal.mz_compute_hydration_statuses h
12092        ON (h.object_id = i.id)
12093),
12094materialized_views AS (
12095    SELECT
12096        i.id AS object_id,
12097        h.replica_id,
12098        COALESCE(h.hydrated, false) AS hydrated
12099    FROM mz_catalog.mz_materialized_views i
12100    LEFT JOIN mz_internal.mz_compute_hydration_statuses h
12101        ON (h.object_id = i.id)
12102),
12103continual_tasks AS (
12104    SELECT
12105        i.id AS object_id,
12106        h.replica_id,
12107        COALESCE(h.hydrated, false) AS hydrated
12108    FROM mz_internal.mz_continual_tasks i
12109    LEFT JOIN mz_internal.mz_compute_hydration_statuses h
12110        ON (h.object_id = i.id)
12111),
12112-- Hydration is a dataflow concept and not all sources are maintained by
12113-- dataflows, so we need to find the ones that are. Generally, sources that
12114-- have a cluster ID are maintained by a dataflow running on that cluster.
12115-- Webhook sources are an exception to this rule.
12116sources_with_clusters AS (
12117    SELECT id, cluster_id
12118    FROM mz_catalog.mz_sources
12119    WHERE cluster_id IS NOT NULL AND type != 'webhook'
12120),
12121sources AS (
12122    SELECT
12123        s.id AS object_id,
12124        ss.replica_id AS replica_id,
12125        ss.rehydration_latency IS NOT NULL AS hydrated
12126    FROM sources_with_clusters s
12127    LEFT JOIN mz_internal.mz_source_statistics ss USING (id)
12128),
12129-- We don't yet report sink hydration status (database-issues#8331), so we do a best effort attempt here and
12130-- define a sink as hydrated when it's both "running" and has a frontier greater than the minimum.
12131-- There is likely still a possibility of FPs.
12132sinks AS (
12133    SELECT
12134        s.id AS object_id,
12135        r.id AS replica_id,
12136        ss.status = 'running' AND COALESCE(f.write_frontier, 0) > 0 AS hydrated
12137    FROM mz_catalog.mz_sinks s
12138    LEFT JOIN mz_internal.mz_sink_statuses ss USING (id)
12139    JOIN mz_catalog.mz_cluster_replicas r
12140        ON (r.cluster_id = s.cluster_id)
12141    LEFT JOIN mz_catalog.mz_cluster_replica_frontiers f
12142        ON (f.object_id = s.id AND f.replica_id = r.id)
12143)
12144SELECT * FROM indexes
12145UNION ALL
12146SELECT * FROM materialized_views
12147UNION ALL
12148SELECT * FROM continual_tasks
12149UNION ALL
12150SELECT * FROM sources
12151UNION ALL
12152SELECT * FROM sinks"#,
12153    access: vec![PUBLIC_SELECT],
12154});
12155
12156pub static MZ_MATERIALIZATION_DEPENDENCIES: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
12157    name: "mz_materialization_dependencies",
12158    schema: MZ_INTERNAL_SCHEMA,
12159    oid: oid::VIEW_MZ_MATERIALIZATION_DEPENDENCIES_OID,
12160    desc: RelationDesc::builder()
12161        .with_column("object_id", SqlScalarType::String.nullable(false))
12162        .with_column("dependency_id", SqlScalarType::String.nullable(false))
12163        .finish(),
12164    column_comments: BTreeMap::from_iter([
12165        (
12166            "object_id",
12167            "The ID of a materialization. Corresponds to `mz_catalog.mz_indexes.id`, `mz_catalog.mz_materialized_views.id`, or `mz_catalog.mz_sinks.id`.",
12168        ),
12169        (
12170            "dependency_id",
12171            "The ID of a dataflow dependency. Corresponds to `mz_catalog.mz_indexes.id`, `mz_catalog.mz_materialized_views.id`, `mz_catalog.mz_sources.id`, or `mz_catalog.mz_tables.id`.",
12172        ),
12173    ]),
12174    sql: "
12175SELECT object_id, dependency_id
12176FROM mz_internal.mz_compute_dependencies
12177UNION ALL
12178SELECT s.id, d.referenced_object_id AS dependency_id
12179FROM mz_internal.mz_object_dependencies d
12180JOIN mz_catalog.mz_sinks s ON (s.id = d.object_id)
12181JOIN mz_catalog.mz_relations r ON (r.id = d.referenced_object_id)",
12182    access: vec![PUBLIC_SELECT],
12183});
12184
12185pub static MZ_MATERIALIZATION_LAG: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
12186    name: "mz_materialization_lag",
12187    schema: MZ_INTERNAL_SCHEMA,
12188    oid: oid::VIEW_MZ_MATERIALIZATION_LAG_OID,
12189    desc: RelationDesc::builder()
12190        .with_column("object_id", SqlScalarType::String.nullable(false))
12191        .with_column("local_lag", SqlScalarType::Interval.nullable(true))
12192        .with_column("global_lag", SqlScalarType::Interval.nullable(true))
12193        .with_column(
12194            "slowest_local_input_id",
12195            SqlScalarType::String.nullable(false),
12196        )
12197        .with_column(
12198            "slowest_global_input_id",
12199            SqlScalarType::String.nullable(false),
12200        )
12201        .finish(),
12202    column_comments: BTreeMap::from_iter([
12203        (
12204            "object_id",
12205            "The ID of the materialized view, index, or sink.",
12206        ),
12207        (
12208            "local_lag",
12209            "The amount of time the materialization lags behind its direct inputs.",
12210        ),
12211        (
12212            "global_lag",
12213            "The amount of time the materialization lags behind its root inputs (sources and tables).",
12214        ),
12215        (
12216            "slowest_local_input_id",
12217            "The ID of the slowest direct input.",
12218        ),
12219        (
12220            "slowest_global_input_id",
12221            "The ID of the slowest root input.",
12222        ),
12223    ]),
12224    sql: "
12225WITH MUTUALLY RECURSIVE
12226    -- IDs of objects for which we want to know the lag.
12227    materializations (id text) AS (
12228        SELECT id FROM mz_catalog.mz_indexes
12229        UNION ALL
12230        SELECT id FROM mz_catalog.mz_materialized_views
12231        UNION ALL
12232        SELECT id FROM mz_internal.mz_continual_tasks
12233        UNION ALL
12234        SELECT id FROM mz_catalog.mz_sinks
12235    ),
12236    -- Direct dependencies of materializations.
12237    direct_dependencies (id text, dep_id text) AS (
12238        SELECT m.id, d.dependency_id
12239        FROM materializations m
12240        JOIN mz_internal.mz_materialization_dependencies d ON (m.id = d.object_id)
12241    ),
12242    -- All transitive dependencies of materializations.
12243    transitive_dependencies (id text, dep_id text) AS (
12244        SELECT id, dep_id FROM direct_dependencies
12245        UNION
12246        SELECT td.id, dd.dep_id
12247        FROM transitive_dependencies td
12248        JOIN direct_dependencies dd ON (dd.id = td.dep_id)
12249    ),
12250    -- Root dependencies of materializations (sources and tables).
12251    root_dependencies (id text, dep_id text) AS (
12252        SELECT *
12253        FROM transitive_dependencies td
12254        WHERE NOT EXISTS (
12255            SELECT 1
12256            FROM direct_dependencies dd
12257            WHERE dd.id = td.dep_id
12258        )
12259    ),
12260    -- Write progress times of materializations.
12261    materialization_times (id text, time timestamptz) AS (
12262        SELECT m.id, to_timestamp(f.write_frontier::text::double / 1000)
12263        FROM materializations m
12264        JOIN mz_internal.mz_frontiers f ON (m.id = f.object_id)
12265    ),
12266    -- Write progress times of direct dependencies of materializations.
12267    input_times (id text, slowest_dep text, time timestamptz) AS (
12268        SELECT DISTINCT ON (d.id)
12269            d.id,
12270            d.dep_id,
12271            to_timestamp(f.write_frontier::text::double / 1000)
12272        FROM direct_dependencies d
12273        JOIN mz_internal.mz_frontiers f ON (d.dep_id = f.object_id)
12274        ORDER BY d.id, f.write_frontier ASC
12275    ),
12276    -- Write progress times of root dependencies of materializations.
12277    root_times (id text, slowest_dep text, time timestamptz) AS (
12278        SELECT DISTINCT ON (d.id)
12279            d.id,
12280            d.dep_id,
12281            to_timestamp(f.write_frontier::text::double / 1000)
12282        FROM root_dependencies d
12283        JOIN mz_internal.mz_frontiers f ON (d.dep_id = f.object_id)
12284        ORDER BY d.id, f.write_frontier ASC
12285    )
12286SELECT
12287    id AS object_id,
12288    -- Ensure that lag values are always NULL for materializations that have reached the empty
12289    -- frontier, as those have processed all their input data.
12290    -- Also make sure that lag values are never negative, even when input frontiers are before
12291    -- output frontiers (as can happen during hydration).
12292    CASE
12293        WHEN m.time IS NULL THEN INTERVAL '0'
12294        WHEN i.time IS NULL THEN NULL
12295        ELSE greatest(i.time - m.time, INTERVAL '0')
12296    END AS local_lag,
12297    CASE
12298        WHEN m.time IS NULL THEN INTERVAL '0'
12299        WHEN r.time IS NULL THEN NULL
12300        ELSE greatest(r.time - m.time, INTERVAL '0')
12301    END AS global_lag,
12302    i.slowest_dep AS slowest_local_input_id,
12303    r.slowest_dep AS slowest_global_input_id
12304FROM materialization_times m
12305JOIN input_times i USING (id)
12306JOIN root_times r USING (id)",
12307    access: vec![PUBLIC_SELECT],
12308});
12309
12310/**
12311 * This view is used to display the cluster utilization over 14 days bucketed by 8 hours.
12312 * It's specifically for the Console's environment overview page to speed up load times.
12313 * This query should be kept in sync with MaterializeInc/console/src/api/materialize/cluster/replicaUtilizationHistory.ts
12314 */
12315pub static MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW: LazyLock<BuiltinView> = LazyLock::new(|| {
12316    BuiltinView {
12317        name: "mz_console_cluster_utilization_overview",
12318        schema: MZ_INTERNAL_SCHEMA,
12319        oid: oid::VIEW_MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW_OID,
12320        desc: RelationDesc::builder()
12321            .with_column(
12322                "bucket_start",
12323                SqlScalarType::TimestampTz { precision: None }.nullable(false),
12324            )
12325            .with_column("replica_id", SqlScalarType::String.nullable(false))
12326            .with_column("memory_percent", SqlScalarType::Float64.nullable(true))
12327            .with_column(
12328                "max_memory_at",
12329                SqlScalarType::TimestampTz { precision: None }.nullable(false),
12330            )
12331            .with_column("disk_percent", SqlScalarType::Float64.nullable(true))
12332            .with_column(
12333                "max_disk_at",
12334                SqlScalarType::TimestampTz { precision: None }.nullable(false),
12335            )
12336            .with_column(
12337                "memory_and_disk_percent",
12338                SqlScalarType::Float64.nullable(true),
12339            )
12340            .with_column(
12341                "max_memory_and_disk_memory_percent",
12342                SqlScalarType::Float64.nullable(true),
12343            )
12344            .with_column(
12345                "max_memory_and_disk_disk_percent",
12346                SqlScalarType::Float64.nullable(true),
12347            )
12348            .with_column(
12349                "max_memory_and_disk_at",
12350                SqlScalarType::TimestampTz { precision: None }.nullable(false),
12351            )
12352            .with_column("heap_percent", SqlScalarType::Float64.nullable(true))
12353            .with_column(
12354                "max_heap_at",
12355                SqlScalarType::TimestampTz { precision: None }.nullable(false),
12356            )
12357            .with_column("max_cpu_percent", SqlScalarType::Float64.nullable(true))
12358            .with_column(
12359                "max_cpu_at",
12360                SqlScalarType::TimestampTz { precision: None }.nullable(false),
12361            )
12362            .with_column("offline_events", SqlScalarType::Jsonb.nullable(true))
12363            .with_column(
12364                "bucket_end",
12365                SqlScalarType::TimestampTz { precision: None }.nullable(false),
12366            )
12367            .with_column("name", SqlScalarType::String.nullable(true))
12368            .with_column("cluster_id", SqlScalarType::String.nullable(true))
12369            .with_column("size", SqlScalarType::String.nullable(true))
12370            .finish(),
12371        column_comments: BTreeMap::new(),
12372        sql: r#"WITH replica_history AS (
12373  SELECT replica_id,
12374    size,
12375    cluster_id
12376  FROM mz_internal.mz_cluster_replica_history
12377  UNION
12378  -- We need to union the current set of cluster replicas since mz_cluster_replica_history doesn't include system clusters
12379  SELECT id AS replica_id,
12380    size,
12381    cluster_id
12382  FROM mz_catalog.mz_cluster_replicas
12383),
12384replica_metrics_history AS (
12385  SELECT
12386    m.occurred_at,
12387    m.replica_id,
12388    r.size,
12389    (SUM(m.cpu_nano_cores::float8) / NULLIF(s.cpu_nano_cores, 0)) / NULLIF(s.processes, 0) AS cpu_percent,
12390    (SUM(m.memory_bytes::float8) / NULLIF(s.memory_bytes, 0)) / NULLIF(s.processes, 0) AS memory_percent,
12391    (SUM(m.disk_bytes::float8) / NULLIF(s.disk_bytes, 0)) / NULLIF(s.processes, 0) AS disk_percent,
12392    (SUM(m.heap_bytes::float8) / NULLIF(m.heap_limit, 0)) / NULLIF(s.processes, 0) AS heap_percent,
12393    SUM(m.disk_bytes::float8) AS disk_bytes,
12394    SUM(m.memory_bytes::float8) AS memory_bytes,
12395    s.disk_bytes::numeric * s.processes AS total_disk_bytes,
12396    s.memory_bytes::numeric * s.processes AS total_memory_bytes
12397  FROM
12398    replica_history AS r
12399    INNER JOIN mz_catalog.mz_cluster_replica_sizes AS s ON r.size = s.size
12400    INNER JOIN mz_internal.mz_cluster_replica_metrics_history AS m ON m.replica_id = r.replica_id
12401  GROUP BY
12402    m.occurred_at,
12403    m.replica_id,
12404    r.size,
12405    s.cpu_nano_cores,
12406    s.memory_bytes,
12407    s.disk_bytes,
12408    m.heap_limit,
12409    s.processes
12410),
12411replica_utilization_history_binned AS (
12412  SELECT m.occurred_at,
12413    m.replica_id,
12414    m.cpu_percent,
12415    m.memory_percent,
12416    m.memory_bytes,
12417    m.disk_percent,
12418    m.disk_bytes,
12419    m.heap_percent,
12420    m.total_disk_bytes,
12421    m.total_memory_bytes,
12422    m.size,
12423    date_bin(
12424      '8 HOURS',
12425      occurred_at,
12426      '1970-01-01'::timestamp
12427    ) AS bucket_start
12428  FROM replica_history AS r
12429    JOIN replica_metrics_history AS m ON m.replica_id = r.replica_id
12430  WHERE mz_now() <= date_bin(
12431      '8 HOURS',
12432      occurred_at,
12433      '1970-01-01'::timestamp
12434    ) + INTERVAL '14 DAYS'
12435),
12436-- For each (replica, bucket), take the (replica, bucket) with the highest memory
12437max_memory AS (
12438  SELECT DISTINCT ON (bucket_start, replica_id) bucket_start,
12439    replica_id,
12440    memory_percent,
12441    occurred_at
12442  FROM replica_utilization_history_binned
12443  OPTIONS (DISTINCT ON INPUT GROUP SIZE = 480)
12444  ORDER BY bucket_start,
12445    replica_id,
12446    COALESCE(memory_bytes, 0) DESC
12447),
12448max_disk AS (
12449  SELECT DISTINCT ON (bucket_start, replica_id) bucket_start,
12450    replica_id,
12451    disk_percent,
12452    occurred_at
12453  FROM replica_utilization_history_binned
12454  OPTIONS (DISTINCT ON INPUT GROUP SIZE = 480)
12455  ORDER BY bucket_start,
12456    replica_id,
12457    COALESCE(disk_bytes, 0) DESC
12458),
12459max_cpu AS (
12460  SELECT DISTINCT ON (bucket_start, replica_id) bucket_start,
12461    replica_id,
12462    cpu_percent,
12463    occurred_at
12464  FROM replica_utilization_history_binned
12465  OPTIONS (DISTINCT ON INPUT GROUP SIZE = 480)
12466  ORDER BY bucket_start,
12467    replica_id,
12468    COALESCE(cpu_percent, 0) DESC
12469),
12470/*
12471 This is different
12472 from adding max_memory
12473 and max_disk per bucket because both
12474 values may not occur at the same time if the bucket interval is large.
12475 */
12476max_memory_and_disk AS (
12477  SELECT DISTINCT ON (bucket_start, replica_id) bucket_start,
12478    replica_id,
12479    memory_percent,
12480    disk_percent,
12481    memory_and_disk_percent,
12482    occurred_at
12483  FROM (
12484      SELECT *,
12485        CASE
12486          WHEN disk_bytes IS NULL
12487          AND memory_bytes IS NULL THEN NULL
12488          ELSE (COALESCE(disk_bytes, 0) + COALESCE(memory_bytes, 0))
12489               / (total_disk_bytes::numeric + total_memory_bytes::numeric)
12490        END AS memory_and_disk_percent
12491      FROM replica_utilization_history_binned
12492    ) AS max_memory_and_disk_inner
12493  OPTIONS (DISTINCT ON INPUT GROUP SIZE = 480)
12494  ORDER BY bucket_start,
12495    replica_id,
12496    COALESCE(memory_and_disk_percent, 0) DESC
12497),
12498max_heap AS (
12499  SELECT DISTINCT ON (bucket_start, replica_id)
12500    bucket_start,
12501    replica_id,
12502    heap_percent,
12503    occurred_at
12504  FROM replica_utilization_history_binned
12505  OPTIONS (DISTINCT ON INPUT GROUP SIZE = 480)
12506  ORDER BY bucket_start, replica_id, COALESCE(heap_percent, 0) DESC
12507),
12508-- For each (replica, bucket), get its offline events at that time
12509replica_offline_event_history AS (
12510  SELECT date_bin(
12511      '8 HOURS',
12512      occurred_at,
12513      '1970-01-01'::timestamp
12514    ) AS bucket_start,
12515    replica_id,
12516    jsonb_agg(
12517      jsonb_build_object(
12518        'replicaId',
12519        rsh.replica_id,
12520        'occurredAt',
12521        rsh.occurred_at,
12522        'status',
12523        rsh.status,
12524        'reason',
12525        rsh.reason
12526      )
12527    ) AS offline_events
12528  FROM mz_internal.mz_cluster_replica_status_history AS rsh -- We assume the statuses for process 0 are the same as all processes
12529  WHERE process_id = '0'
12530    AND status = 'offline'
12531    AND mz_now() <= date_bin(
12532      '8 HOURS',
12533      occurred_at,
12534      '1970-01-01'::timestamp
12535    ) + INTERVAL '14 DAYS'
12536  GROUP BY bucket_start,
12537    replica_id
12538)
12539SELECT
12540  bucket_start,
12541  replica_id,
12542  max_memory.memory_percent,
12543  max_memory.occurred_at as max_memory_at,
12544  max_disk.disk_percent,
12545  max_disk.occurred_at as max_disk_at,
12546  max_memory_and_disk.memory_and_disk_percent as memory_and_disk_percent,
12547  max_memory_and_disk.memory_percent as max_memory_and_disk_memory_percent,
12548  max_memory_and_disk.disk_percent as max_memory_and_disk_disk_percent,
12549  max_memory_and_disk.occurred_at as max_memory_and_disk_at,
12550  max_heap.heap_percent,
12551  max_heap.occurred_at as max_heap_at,
12552  max_cpu.cpu_percent as max_cpu_percent,
12553  max_cpu.occurred_at as max_cpu_at,
12554  replica_offline_event_history.offline_events,
12555  bucket_start + INTERVAL '8 HOURS' as bucket_end,
12556  replica_name_history.new_name AS name,
12557  replica_history.cluster_id,
12558  replica_history.size
12559FROM max_memory
12560JOIN max_disk USING (bucket_start, replica_id)
12561JOIN max_cpu USING (bucket_start, replica_id)
12562JOIN max_memory_and_disk USING (bucket_start, replica_id)
12563JOIN max_heap USING (bucket_start, replica_id)
12564JOIN replica_history USING (replica_id)
12565CROSS JOIN LATERAL (
12566  SELECT new_name
12567  FROM mz_internal.mz_cluster_replica_name_history as replica_name_history
12568  WHERE replica_id = replica_name_history.id -- We treat NULLs as the beginning of time
12569    AND bucket_start + INTERVAL '8 HOURS' >= COALESCE(
12570      replica_name_history.occurred_at,
12571      '1970-01-01'::timestamp
12572    )
12573  ORDER BY replica_name_history.occurred_at DESC
12574  LIMIT '1'
12575) AS replica_name_history
12576LEFT JOIN replica_offline_event_history USING (bucket_start, replica_id)"#,
12577        access: vec![PUBLIC_SELECT],
12578    }
12579});
12580
12581/**
12582 * Traces the blue/green deployment lineage in the audit log to determine all cluster
12583 * IDs that are logically the same cluster.
12584 * cluster_id: The ID of a cluster.
12585 * current_deployment_cluster_id: The cluster ID of the last cluster in
12586 *   cluster_id's blue/green lineage.
12587 * cluster_name: The name of the cluster.
12588 * The approach taken is as follows. First, find all extant clusters and add them
12589 * to the result set. Per cluster, we do the following:
12590 * 1. Find the most recent create or rename event. This moment represents when the
12591 *    cluster took on its final logical identity.
12592 * 2. Look for a cluster that had the same name (or the same name with `_dbt_deploy`
12593 *    appended) that was dropped within one minute of that moment. That cluster is
12594 *    almost certainly the logical predecessor of the current cluster. Add the cluster
12595 *    to the result set.
12596 * 3. Repeat the procedure until a cluster with no logical predecessor is discovered.
12597 * Limiting the search for a dropped cluster to a window of one minute is a heuristic,
12598 * but one that's likely to be pretty good one. If a name is reused after more
12599 * than one minute, that's a good sign that it wasn't an automatic blue/green
12600 * process, but someone turning on a new use case that happens to have the same
12601 * name as a previous but logically distinct use case.
12602 */
12603pub static MZ_CLUSTER_DEPLOYMENT_LINEAGE: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
12604    name: "mz_cluster_deployment_lineage",
12605    schema: MZ_INTERNAL_SCHEMA,
12606    oid: oid::VIEW_MZ_CLUSTER_DEPLOYMENT_LINEAGE_OID,
12607    desc: RelationDesc::builder()
12608        .with_column("cluster_id", SqlScalarType::String.nullable(true))
12609        .with_column(
12610            "current_deployment_cluster_id",
12611            SqlScalarType::String.nullable(false),
12612        )
12613        .with_column("cluster_name", SqlScalarType::String.nullable(false))
12614        .with_key(vec![0, 1, 2])
12615        .finish(),
12616    column_comments: BTreeMap::from_iter([
12617        (
12618            "cluster_id",
12619            "The ID of the cluster. Corresponds to `mz_clusters.id` (though the cluster may no longer exist).",
12620        ),
12621        (
12622            "current_deployment_cluster_id",
12623            "The cluster ID of the last cluster in `cluster_id`'s blue/green lineage (the cluster is guaranteed to exist).",
12624        ),
12625        ("cluster_name", "The name of the cluster"),
12626    ]),
12627    sql: r#"WITH MUTUALLY RECURSIVE cluster_events (
12628  cluster_id text,
12629  cluster_name text,
12630  event_type text,
12631  occurred_at timestamptz
12632) AS (
12633  SELECT coalesce(details->>'id', details->>'cluster_id') AS cluster_id,
12634    coalesce(details->>'name', details->>'new_name') AS cluster_name,
12635    event_type,
12636    occurred_at
12637  FROM mz_audit_events
12638  WHERE (
12639      event_type IN ('create', 'drop')
12640      OR (
12641        event_type = 'alter'
12642        AND details ? 'new_name'
12643      )
12644    )
12645    AND object_type = 'cluster'
12646    AND mz_now() < occurred_at + INTERVAL '30 days'
12647),
12648mz_cluster_deployment_lineage (
12649  cluster_id text,
12650  current_deployment_cluster_id text,
12651  cluster_name text
12652) AS (
12653  SELECT c.id,
12654    c.id,
12655    c.name
12656  FROM mz_clusters c
12657  WHERE c.id LIKE 'u%'
12658  UNION
12659  SELECT *
12660  FROM dropped_clusters
12661),
12662-- Closest create or rename event based on the current clusters in the result set
12663most_recent_create_or_rename (
12664  cluster_id text,
12665  current_deployment_cluster_id text,
12666  cluster_name text,
12667  occurred_at timestamptz
12668) AS (
12669  SELECT DISTINCT ON (e.cluster_id) e.cluster_id,
12670    c.current_deployment_cluster_id,
12671    e.cluster_name,
12672    e.occurred_at
12673  FROM mz_cluster_deployment_lineage c
12674    JOIN cluster_events e ON c.cluster_id = e.cluster_id
12675    AND c.cluster_name = e.cluster_name
12676  WHERE e.event_type <> 'drop'
12677  ORDER BY e.cluster_id,
12678    e.occurred_at DESC
12679),
12680-- Clusters that were dropped most recently within 1 minute of most_recent_create_or_rename
12681dropped_clusters (
12682  cluster_id text,
12683  current_deployment_cluster_id text,
12684  cluster_name text
12685) AS (
12686  SELECT DISTINCT ON (cr.cluster_id) e.cluster_id,
12687    cr.current_deployment_cluster_id,
12688    cr.cluster_name
12689  FROM most_recent_create_or_rename cr
12690    JOIN cluster_events e ON e.occurred_at BETWEEN cr.occurred_at - interval '1 minute'
12691    AND cr.occurred_at + interval '1 minute'
12692    AND (
12693      e.cluster_name = cr.cluster_name
12694      OR e.cluster_name = cr.cluster_name || '_dbt_deploy'
12695    )
12696  WHERE e.event_type = 'drop'
12697  ORDER BY cr.cluster_id,
12698    abs(
12699      extract(
12700        epoch
12701        FROM cr.occurred_at - e.occurred_at
12702      )
12703    )
12704)
12705SELECT *
12706FROM mz_cluster_deployment_lineage"#,
12707    access: vec![PUBLIC_SELECT],
12708});
12709
12710pub const MZ_SHOW_DATABASES_IND: BuiltinIndex = BuiltinIndex {
12711    name: "mz_show_databases_ind",
12712    schema: MZ_INTERNAL_SCHEMA,
12713    oid: oid::INDEX_MZ_SHOW_DATABASES_IND_OID,
12714    sql: "IN CLUSTER mz_catalog_server
12715ON mz_internal.mz_show_databases (name)",
12716    is_retained_metrics_object: false,
12717};
12718
12719pub const MZ_SHOW_SCHEMAS_IND: BuiltinIndex = BuiltinIndex {
12720    name: "mz_show_schemas_ind",
12721    schema: MZ_INTERNAL_SCHEMA,
12722    oid: oid::INDEX_MZ_SHOW_SCHEMAS_IND_OID,
12723    sql: "IN CLUSTER mz_catalog_server
12724ON mz_internal.mz_show_schemas (database_id)",
12725    is_retained_metrics_object: false,
12726};
12727
12728pub const MZ_SHOW_CONNECTIONS_IND: BuiltinIndex = BuiltinIndex {
12729    name: "mz_show_connections_ind",
12730    schema: MZ_INTERNAL_SCHEMA,
12731    oid: oid::INDEX_MZ_SHOW_CONNECTIONS_IND_OID,
12732    sql: "IN CLUSTER mz_catalog_server
12733ON mz_internal.mz_show_connections (schema_id)",
12734    is_retained_metrics_object: false,
12735};
12736
12737pub const MZ_SHOW_TABLES_IND: BuiltinIndex = BuiltinIndex {
12738    name: "mz_show_tables_ind",
12739    schema: MZ_INTERNAL_SCHEMA,
12740    oid: oid::INDEX_MZ_SHOW_TABLES_IND_OID,
12741    sql: "IN CLUSTER mz_catalog_server
12742ON mz_internal.mz_show_tables (schema_id)",
12743    is_retained_metrics_object: false,
12744};
12745
12746pub const MZ_SHOW_SOURCES_IND: BuiltinIndex = BuiltinIndex {
12747    name: "mz_show_sources_ind",
12748    schema: MZ_INTERNAL_SCHEMA,
12749    oid: oid::INDEX_MZ_SHOW_SOURCES_IND_OID,
12750    sql: "IN CLUSTER mz_catalog_server
12751ON mz_internal.mz_show_sources (schema_id)",
12752    is_retained_metrics_object: false,
12753};
12754
12755pub const MZ_SHOW_VIEWS_IND: BuiltinIndex = BuiltinIndex {
12756    name: "mz_show_views_ind",
12757    schema: MZ_INTERNAL_SCHEMA,
12758    oid: oid::INDEX_MZ_SHOW_VIEWS_IND_OID,
12759    sql: "IN CLUSTER mz_catalog_server
12760ON mz_internal.mz_show_views (schema_id)",
12761    is_retained_metrics_object: false,
12762};
12763
12764pub const MZ_SHOW_MATERIALIZED_VIEWS_IND: BuiltinIndex = BuiltinIndex {
12765    name: "mz_show_materialized_views_ind",
12766    schema: MZ_INTERNAL_SCHEMA,
12767    oid: oid::INDEX_MZ_SHOW_MATERIALIZED_VIEWS_IND_OID,
12768    sql: "IN CLUSTER mz_catalog_server
12769ON mz_internal.mz_show_materialized_views (schema_id)",
12770    is_retained_metrics_object: false,
12771};
12772
12773pub const MZ_SHOW_SINKS_IND: BuiltinIndex = BuiltinIndex {
12774    name: "mz_show_sinks_ind",
12775    schema: MZ_INTERNAL_SCHEMA,
12776    oid: oid::INDEX_MZ_SHOW_SINKS_IND_OID,
12777    sql: "IN CLUSTER mz_catalog_server
12778ON mz_internal.mz_show_sinks (schema_id)",
12779    is_retained_metrics_object: false,
12780};
12781
12782pub const MZ_SHOW_TYPES_IND: BuiltinIndex = BuiltinIndex {
12783    name: "mz_show_types_ind",
12784    schema: MZ_INTERNAL_SCHEMA,
12785    oid: oid::INDEX_MZ_SHOW_TYPES_IND_OID,
12786    sql: "IN CLUSTER mz_catalog_server
12787ON mz_internal.mz_show_types (schema_id)",
12788    is_retained_metrics_object: false,
12789};
12790
12791pub const MZ_SHOW_ROLES_IND: BuiltinIndex = BuiltinIndex {
12792    name: "mz_show_roles_ind",
12793    schema: MZ_INTERNAL_SCHEMA,
12794    oid: oid::INDEX_MZ_SHOW_ROLES_IND_OID,
12795    sql: "IN CLUSTER mz_catalog_server
12796ON mz_internal.mz_show_roles (name)",
12797    is_retained_metrics_object: false,
12798};
12799
12800pub const MZ_SHOW_ALL_OBJECTS_IND: BuiltinIndex = BuiltinIndex {
12801    name: "mz_show_all_objects_ind",
12802    schema: MZ_INTERNAL_SCHEMA,
12803    oid: oid::INDEX_MZ_SHOW_ALL_OBJECTS_IND_OID,
12804    sql: "IN CLUSTER mz_catalog_server
12805ON mz_internal.mz_show_all_objects (schema_id)",
12806    is_retained_metrics_object: false,
12807};
12808
12809pub const MZ_SHOW_INDEXES_IND: BuiltinIndex = BuiltinIndex {
12810    name: "mz_show_indexes_ind",
12811    schema: MZ_INTERNAL_SCHEMA,
12812    oid: oid::INDEX_MZ_SHOW_INDEXES_IND_OID,
12813    sql: "IN CLUSTER mz_catalog_server
12814ON mz_internal.mz_show_indexes (schema_id)",
12815    is_retained_metrics_object: false,
12816};
12817
12818pub const MZ_SHOW_COLUMNS_IND: BuiltinIndex = BuiltinIndex {
12819    name: "mz_show_columns_ind",
12820    schema: MZ_INTERNAL_SCHEMA,
12821    oid: oid::INDEX_MZ_SHOW_COLUMNS_IND_OID,
12822    sql: "IN CLUSTER mz_catalog_server
12823ON mz_internal.mz_show_columns (id)",
12824    is_retained_metrics_object: false,
12825};
12826
12827pub const MZ_SHOW_CLUSTERS_IND: BuiltinIndex = BuiltinIndex {
12828    name: "mz_show_clusters_ind",
12829    schema: MZ_INTERNAL_SCHEMA,
12830    oid: oid::INDEX_MZ_SHOW_CLUSTERS_IND_OID,
12831    sql: "IN CLUSTER mz_catalog_server
12832ON mz_internal.mz_show_clusters (name)",
12833    is_retained_metrics_object: false,
12834};
12835
12836pub const MZ_SHOW_CLUSTER_REPLICAS_IND: BuiltinIndex = BuiltinIndex {
12837    name: "mz_show_cluster_replicas_ind",
12838    schema: MZ_INTERNAL_SCHEMA,
12839    oid: oid::INDEX_MZ_SHOW_CLUSTER_REPLICAS_IND_OID,
12840    sql: "IN CLUSTER mz_catalog_server
12841ON mz_internal.mz_show_cluster_replicas (cluster)",
12842    is_retained_metrics_object: false,
12843};
12844
12845pub const MZ_SHOW_SECRETS_IND: BuiltinIndex = BuiltinIndex {
12846    name: "mz_show_secrets_ind",
12847    schema: MZ_INTERNAL_SCHEMA,
12848    oid: oid::INDEX_MZ_SHOW_SECRETS_IND_OID,
12849    sql: "IN CLUSTER mz_catalog_server
12850ON mz_internal.mz_show_secrets (schema_id)",
12851    is_retained_metrics_object: false,
12852};
12853
12854pub const MZ_DATABASES_IND: BuiltinIndex = BuiltinIndex {
12855    name: "mz_databases_ind",
12856    schema: MZ_CATALOG_SCHEMA,
12857    oid: oid::INDEX_MZ_DATABASES_IND_OID,
12858    sql: "IN CLUSTER mz_catalog_server
12859ON mz_catalog.mz_databases (name)",
12860    is_retained_metrics_object: false,
12861};
12862
12863pub const MZ_SCHEMAS_IND: BuiltinIndex = BuiltinIndex {
12864    name: "mz_schemas_ind",
12865    schema: MZ_CATALOG_SCHEMA,
12866    oid: oid::INDEX_MZ_SCHEMAS_IND_OID,
12867    sql: "IN CLUSTER mz_catalog_server
12868ON mz_catalog.mz_schemas (database_id)",
12869    is_retained_metrics_object: false,
12870};
12871
12872pub const MZ_CONNECTIONS_IND: BuiltinIndex = BuiltinIndex {
12873    name: "mz_connections_ind",
12874    schema: MZ_CATALOG_SCHEMA,
12875    oid: oid::INDEX_MZ_CONNECTIONS_IND_OID,
12876    sql: "IN CLUSTER mz_catalog_server
12877ON mz_catalog.mz_connections (schema_id)",
12878    is_retained_metrics_object: false,
12879};
12880
12881pub const MZ_TABLES_IND: BuiltinIndex = BuiltinIndex {
12882    name: "mz_tables_ind",
12883    schema: MZ_CATALOG_SCHEMA,
12884    oid: oid::INDEX_MZ_TABLES_IND_OID,
12885    sql: "IN CLUSTER mz_catalog_server
12886ON mz_catalog.mz_tables (schema_id)",
12887    is_retained_metrics_object: false,
12888};
12889
12890pub const MZ_TYPES_IND: BuiltinIndex = BuiltinIndex {
12891    name: "mz_types_ind",
12892    schema: MZ_CATALOG_SCHEMA,
12893    oid: oid::INDEX_MZ_TYPES_IND_OID,
12894    sql: "IN CLUSTER mz_catalog_server
12895ON mz_catalog.mz_types (schema_id)",
12896    is_retained_metrics_object: false,
12897};
12898
12899pub const MZ_OBJECTS_IND: BuiltinIndex = BuiltinIndex {
12900    name: "mz_objects_ind",
12901    schema: MZ_CATALOG_SCHEMA,
12902    oid: oid::INDEX_MZ_OBJECTS_IND_OID,
12903    sql: "IN CLUSTER mz_catalog_server
12904ON mz_catalog.mz_objects (schema_id)",
12905    is_retained_metrics_object: false,
12906};
12907
12908pub const MZ_COLUMNS_IND: BuiltinIndex = BuiltinIndex {
12909    name: "mz_columns_ind",
12910    schema: MZ_CATALOG_SCHEMA,
12911    oid: oid::INDEX_MZ_COLUMNS_IND_OID,
12912    sql: "IN CLUSTER mz_catalog_server
12913ON mz_catalog.mz_columns (name)",
12914    is_retained_metrics_object: false,
12915};
12916
12917pub const MZ_SECRETS_IND: BuiltinIndex = BuiltinIndex {
12918    name: "mz_secrets_ind",
12919    schema: MZ_CATALOG_SCHEMA,
12920    oid: oid::INDEX_MZ_SECRETS_IND_OID,
12921    sql: "IN CLUSTER mz_catalog_server
12922ON mz_catalog.mz_secrets (name)",
12923    is_retained_metrics_object: false,
12924};
12925
12926pub const MZ_VIEWS_IND: BuiltinIndex = BuiltinIndex {
12927    name: "mz_views_ind",
12928    schema: MZ_CATALOG_SCHEMA,
12929    oid: oid::INDEX_MZ_VIEWS_IND_OID,
12930    sql: "IN CLUSTER mz_catalog_server
12931ON mz_catalog.mz_views (schema_id)",
12932    is_retained_metrics_object: false,
12933};
12934
12935pub const MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW_IND: BuiltinIndex = BuiltinIndex {
12936    name: "mz_console_cluster_utilization_overview_ind",
12937    schema: MZ_INTERNAL_SCHEMA,
12938    oid: oid::INDEX_MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW_IND_OID,
12939    sql: "IN CLUSTER mz_catalog_server
12940ON mz_internal.mz_console_cluster_utilization_overview (cluster_id)",
12941    is_retained_metrics_object: false,
12942};
12943
12944pub const MZ_CLUSTER_DEPLOYMENT_LINEAGE_IND: BuiltinIndex = BuiltinIndex {
12945    name: "mz_cluster_deployment_lineage_ind",
12946    schema: MZ_INTERNAL_SCHEMA,
12947    oid: oid::INDEX_MZ_CLUSTER_DEPLOYMENT_LINEAGE_IND_OID,
12948    sql: "IN CLUSTER mz_catalog_server
12949ON mz_internal.mz_cluster_deployment_lineage (cluster_id)",
12950    is_retained_metrics_object: false,
12951};
12952
12953pub const MZ_CLUSTERS_IND: BuiltinIndex = BuiltinIndex {
12954    name: "mz_clusters_ind",
12955    schema: MZ_CATALOG_SCHEMA,
12956    oid: oid::INDEX_MZ_CLUSTERS_IND_OID,
12957    sql: "IN CLUSTER mz_catalog_server
12958ON mz_catalog.mz_clusters (id)",
12959    is_retained_metrics_object: false,
12960};
12961
12962pub const MZ_INDEXES_IND: BuiltinIndex = BuiltinIndex {
12963    name: "mz_indexes_ind",
12964    schema: MZ_CATALOG_SCHEMA,
12965    oid: oid::INDEX_MZ_INDEXES_IND_OID,
12966    sql: "IN CLUSTER mz_catalog_server
12967ON mz_catalog.mz_indexes (id)",
12968    is_retained_metrics_object: false,
12969};
12970
12971pub const MZ_ROLES_IND: BuiltinIndex = BuiltinIndex {
12972    name: "mz_roles_ind",
12973    schema: MZ_CATALOG_SCHEMA,
12974    oid: oid::INDEX_MZ_ROLES_IND_OID,
12975    sql: "IN CLUSTER mz_catalog_server
12976ON mz_catalog.mz_roles (id)",
12977    is_retained_metrics_object: false,
12978};
12979
12980pub const MZ_SOURCES_IND: BuiltinIndex = BuiltinIndex {
12981    name: "mz_sources_ind",
12982    schema: MZ_CATALOG_SCHEMA,
12983    oid: oid::INDEX_MZ_SOURCES_IND_OID,
12984    sql: "IN CLUSTER mz_catalog_server
12985ON mz_catalog.mz_sources (id)",
12986    is_retained_metrics_object: true,
12987};
12988
12989pub const MZ_SINKS_IND: BuiltinIndex = BuiltinIndex {
12990    name: "mz_sinks_ind",
12991    schema: MZ_CATALOG_SCHEMA,
12992    oid: oid::INDEX_MZ_SINKS_IND_OID,
12993    sql: "IN CLUSTER mz_catalog_server
12994ON mz_catalog.mz_sinks (id)",
12995    is_retained_metrics_object: true,
12996};
12997
12998pub const MZ_MATERIALIZED_VIEWS_IND: BuiltinIndex = BuiltinIndex {
12999    name: "mz_materialized_views_ind",
13000    schema: MZ_CATALOG_SCHEMA,
13001    oid: oid::INDEX_MZ_MATERIALIZED_VIEWS_IND_OID,
13002    sql: "IN CLUSTER mz_catalog_server
13003ON mz_catalog.mz_materialized_views (id)",
13004    is_retained_metrics_object: false,
13005};
13006
13007pub const MZ_CONTINUAL_TASKS_IND: BuiltinIndex = BuiltinIndex {
13008    name: "mz_continual_tasks_ind",
13009    schema: MZ_INTERNAL_SCHEMA,
13010    oid: oid::INDEX_MZ_CONTINUAL_TASKS_IND_OID,
13011    sql: "IN CLUSTER mz_catalog_server
13012ON mz_internal.mz_continual_tasks (id)",
13013    is_retained_metrics_object: false,
13014};
13015
13016pub const MZ_SOURCE_STATUSES_IND: BuiltinIndex = BuiltinIndex {
13017    name: "mz_source_statuses_ind",
13018    schema: MZ_INTERNAL_SCHEMA,
13019    oid: oid::INDEX_MZ_SOURCE_STATUSES_IND_OID,
13020    sql: "IN CLUSTER mz_catalog_server
13021ON mz_internal.mz_source_statuses (id)",
13022    is_retained_metrics_object: false,
13023};
13024
13025pub const MZ_SINK_STATUSES_IND: BuiltinIndex = BuiltinIndex {
13026    name: "mz_sink_statuses_ind",
13027    schema: MZ_INTERNAL_SCHEMA,
13028    oid: oid::INDEX_MZ_SINK_STATUSES_IND_OID,
13029    sql: "IN CLUSTER mz_catalog_server
13030ON mz_internal.mz_sink_statuses (id)",
13031    is_retained_metrics_object: false,
13032};
13033
13034pub const MZ_SOURCE_STATUS_HISTORY_IND: BuiltinIndex = BuiltinIndex {
13035    name: "mz_source_status_history_ind",
13036    schema: MZ_INTERNAL_SCHEMA,
13037    oid: oid::INDEX_MZ_SOURCE_STATUS_HISTORY_IND_OID,
13038    sql: "IN CLUSTER mz_catalog_server
13039ON mz_internal.mz_source_status_history (source_id)",
13040    is_retained_metrics_object: false,
13041};
13042
13043pub const MZ_SINK_STATUS_HISTORY_IND: BuiltinIndex = BuiltinIndex {
13044    name: "mz_sink_status_history_ind",
13045    schema: MZ_INTERNAL_SCHEMA,
13046    oid: oid::INDEX_MZ_SINK_STATUS_HISTORY_IND_OID,
13047    sql: "IN CLUSTER mz_catalog_server
13048ON mz_internal.mz_sink_status_history (sink_id)",
13049    is_retained_metrics_object: false,
13050};
13051
13052pub const MZ_SHOW_CONTINUAL_TASKS_IND: BuiltinIndex = BuiltinIndex {
13053    name: "mz_show_continual_tasks_ind",
13054    schema: MZ_INTERNAL_SCHEMA,
13055    oid: oid::INDEX_MZ_SHOW_CONTINUAL_TASKS_OID,
13056    sql: "IN CLUSTER mz_catalog_server
13057ON mz_internal.mz_show_continual_tasks (id)",
13058    is_retained_metrics_object: false,
13059};
13060
13061// In both `mz_source_statistics` and `mz_sink_statistics` we cast the `SUM` of
13062// uint8's to `uint8` instead of leaving them as `numeric`. This is because we want to
13063// save index space, and we don't expect the sum to be > 2^63
13064// (even if a source with 2000 workers, that each produce 400 terabytes in a month ~ 2^61).
13065//
13066//
13067// These aggregations are just to make `GROUP BY` happy. Each id has a single row in the
13068// underlying relation.
13069//
13070// We append WITH_HISTORY because we want to build a separate view + index that doesn't
13071// retain history. This is because retaining its history causes MZ_SOURCE_STATISTICS_WITH_HISTORY_IND
13072// to hold all records/updates, which causes CPU and latency of querying it to spike.
13073pub static MZ_SOURCE_STATISTICS_WITH_HISTORY: LazyLock<BuiltinView> =
13074    LazyLock::new(|| BuiltinView {
13075        name: "mz_source_statistics_with_history",
13076        schema: MZ_INTERNAL_SCHEMA,
13077        oid: oid::VIEW_MZ_SOURCE_STATISTICS_WITH_HISTORY_OID,
13078        desc: RelationDesc::builder()
13079            .with_column("id", SqlScalarType::String.nullable(false))
13080            .with_column("replica_id", SqlScalarType::String.nullable(true))
13081            .with_column("messages_received", SqlScalarType::UInt64.nullable(false))
13082            .with_column("bytes_received", SqlScalarType::UInt64.nullable(false))
13083            .with_column("updates_staged", SqlScalarType::UInt64.nullable(false))
13084            .with_column("updates_committed", SqlScalarType::UInt64.nullable(false))
13085            .with_column("records_indexed", SqlScalarType::UInt64.nullable(false))
13086            .with_column("bytes_indexed", SqlScalarType::UInt64.nullable(false))
13087            .with_column(
13088                "rehydration_latency",
13089                SqlScalarType::Interval.nullable(true),
13090            )
13091            .with_column(
13092                "snapshot_records_known",
13093                SqlScalarType::UInt64.nullable(true),
13094            )
13095            .with_column(
13096                "snapshot_records_staged",
13097                SqlScalarType::UInt64.nullable(true),
13098            )
13099            .with_column("snapshot_committed", SqlScalarType::Bool.nullable(false))
13100            .with_column("offset_known", SqlScalarType::UInt64.nullable(true))
13101            .with_column("offset_committed", SqlScalarType::UInt64.nullable(true))
13102            .with_key(vec![0, 1])
13103            .finish(),
13104        column_comments: BTreeMap::new(),
13105        sql: "
13106WITH
13107    -- For each subsource, statistics are reported as its parent source
13108    subsource_to_parent AS
13109    (
13110        SELECT subsource.id AS id, parent.id AS report_id
13111        FROM mz_catalog.mz_sources AS subsource
13112            JOIN mz_internal.mz_object_dependencies AS dep ON subsource.id = dep.object_id
13113            JOIN mz_catalog.mz_sources AS parent ON parent.id = dep.referenced_object_id
13114        WHERE subsource.type = 'subsource'
13115    ),
13116    -- For each table from source, statistics are reported as its parent source
13117    table_to_parent AS
13118    (
13119        SELECT id, source_id AS report_id
13120        FROM mz_catalog.mz_tables
13121        WHERE source_id IS NOT NULL
13122    ),
13123    -- For each source and subsource, statistics are reported as itself
13124    source_refl AS
13125    (
13126        SELECT id, id AS report_id
13127        FROM mz_catalog.mz_sources
13128        WHERE type NOT IN ('progress', 'log')
13129    ),
13130    -- For each table from source, statistics are reported as itself
13131    table_refl AS
13132    (
13133        SELECT id, id AS report_id
13134        FROM mz_catalog.mz_tables
13135        WHERE source_id IS NOT NULL
13136    ),
13137    report_paths AS
13138    (
13139        SELECT id, report_id FROM subsource_to_parent
13140        UNION ALL SELECT id, report_id FROM table_to_parent
13141        UNION ALL SELECT id, report_id FROM source_refl
13142        UNION ALL SELECT id, report_id FROM table_refl
13143    )
13144SELECT
13145    report_paths.report_id AS id,
13146    replica_id,
13147    -- Counters
13148    SUM(messages_received)::uint8 AS messages_received,
13149    SUM(bytes_received)::uint8 AS bytes_received,
13150    SUM(updates_staged)::uint8 AS updates_staged,
13151    SUM(updates_committed)::uint8 AS updates_committed,
13152    -- Resetting Gauges
13153    SUM(records_indexed)::uint8 AS records_indexed,
13154    SUM(bytes_indexed)::uint8 AS bytes_indexed,
13155    -- Ensure we aggregate to NULL when not all workers are done rehydrating.
13156    CASE
13157        WHEN bool_or(rehydration_latency IS NULL) THEN NULL
13158        ELSE MAX(rehydration_latency)::interval
13159    END AS rehydration_latency,
13160    SUM(snapshot_records_known)::uint8 AS snapshot_records_known,
13161    SUM(snapshot_records_staged)::uint8 AS snapshot_records_staged,
13162    bool_and(snapshot_committed) as snapshot_committed,
13163    -- Gauges
13164    MAX(offset_known)::uint8 AS offset_known,
13165    MIN(offset_committed)::uint8 AS offset_committed
13166FROM mz_internal.mz_source_statistics_raw
13167    JOIN report_paths USING (id)
13168GROUP BY report_paths.report_id, replica_id",
13169        access: vec![PUBLIC_SELECT],
13170    });
13171
13172pub const MZ_SOURCE_STATISTICS_WITH_HISTORY_IND: BuiltinIndex = BuiltinIndex {
13173    name: "mz_source_statistics_with_history_ind",
13174    schema: MZ_INTERNAL_SCHEMA,
13175    oid: oid::INDEX_MZ_SOURCE_STATISTICS_WITH_HISTORY_IND_OID,
13176    sql: "IN CLUSTER mz_catalog_server
13177ON mz_internal.mz_source_statistics_with_history (id, replica_id)",
13178    is_retained_metrics_object: true,
13179};
13180
13181// The non historical version of MZ_SOURCE_STATISTICS_WITH_HISTORY.
13182// Used to query MZ_SOURCE_STATISTICS at the current time.
13183pub static MZ_SOURCE_STATISTICS: LazyLock<BuiltinView> = LazyLock::new(|| {
13184    BuiltinView {
13185        name: "mz_source_statistics",
13186        schema: MZ_INTERNAL_SCHEMA,
13187        oid: oid::VIEW_MZ_SOURCE_STATISTICS_OID,
13188        // We need to add a redundant where clause for a new dataflow to be created.
13189        desc: RelationDesc::builder()
13190            .with_column("id", SqlScalarType::String.nullable(false))
13191            .with_column("replica_id", SqlScalarType::String.nullable(true))
13192            .with_column("messages_received", SqlScalarType::UInt64.nullable(false))
13193            .with_column("bytes_received", SqlScalarType::UInt64.nullable(false))
13194            .with_column("updates_staged", SqlScalarType::UInt64.nullable(false))
13195            .with_column("updates_committed", SqlScalarType::UInt64.nullable(false))
13196            .with_column("records_indexed", SqlScalarType::UInt64.nullable(false))
13197            .with_column("bytes_indexed", SqlScalarType::UInt64.nullable(false))
13198            .with_column(
13199                "rehydration_latency",
13200                SqlScalarType::Interval.nullable(true),
13201            )
13202            .with_column(
13203                "snapshot_records_known",
13204                SqlScalarType::UInt64.nullable(true),
13205            )
13206            .with_column(
13207                "snapshot_records_staged",
13208                SqlScalarType::UInt64.nullable(true),
13209            )
13210            .with_column("snapshot_committed", SqlScalarType::Bool.nullable(false))
13211            .with_column("offset_known", SqlScalarType::UInt64.nullable(true))
13212            .with_column("offset_committed", SqlScalarType::UInt64.nullable(true))
13213            .with_key(vec![0, 1])
13214            .finish(),
13215        column_comments: BTreeMap::from_iter([
13216            (
13217                "id",
13218                "The ID of the source. Corresponds to `mz_catalog.mz_sources.id`.",
13219            ),
13220            (
13221                "replica_id",
13222                "The ID of a replica running the source. Corresponds to `mz_catalog.mz_cluster_replicas.id`.",
13223            ),
13224            (
13225                "messages_received",
13226                "The number of messages the source has received from the external system. Messages are counted in a source type-specific manner. Messages do not correspond directly to updates: some messages produce multiple updates, while other messages may be coalesced into a single update.",
13227            ),
13228            (
13229                "bytes_received",
13230                "The number of bytes the source has read from the external system. Bytes are counted in a source type-specific manner and may or may not include protocol overhead.",
13231            ),
13232            (
13233                "updates_staged",
13234                "The number of updates (insertions plus deletions) the source has written but not yet committed to the storage layer.",
13235            ),
13236            (
13237                "updates_committed",
13238                "The number of updates (insertions plus deletions) the source has committed to the storage layer.",
13239            ),
13240            (
13241                "records_indexed",
13242                "The number of individual records indexed in the source envelope state.",
13243            ),
13244            (
13245                "bytes_indexed",
13246                "The number of bytes stored in the source's internal index, if any.",
13247            ),
13248            (
13249                "rehydration_latency",
13250                "The amount of time it took for the source to rehydrate its internal index, if any, after the source last restarted.",
13251            ),
13252            (
13253                "snapshot_records_known",
13254                "The size of the source's snapshot, measured in number of records. See below to learn what constitutes a record.",
13255            ),
13256            (
13257                "snapshot_records_staged",
13258                "The number of records in the source's snapshot that Materialize has read. See below to learn what constitutes a record.",
13259            ),
13260            (
13261                "snapshot_committed",
13262                "Whether the source has committed the initial snapshot for a source.",
13263            ),
13264            (
13265                "offset_known",
13266                "The offset of the most recent data in the source's upstream service that Materialize knows about. See below to learn what constitutes an offset.",
13267            ),
13268            (
13269                "offset_committed",
13270                "The offset of the the data that Materialize has durably ingested. See below to learn what constitutes an offset.",
13271            ),
13272        ]),
13273        sql: "SELECT * FROM mz_internal.mz_source_statistics_with_history WHERE length(id) > 0",
13274        access: vec![PUBLIC_SELECT],
13275    }
13276});
13277
13278pub const MZ_SOURCE_STATISTICS_IND: BuiltinIndex = BuiltinIndex {
13279    name: "mz_source_statistics_ind",
13280    schema: MZ_INTERNAL_SCHEMA,
13281    oid: oid::INDEX_MZ_SOURCE_STATISTICS_IND_OID,
13282    sql: "IN CLUSTER mz_catalog_server
13283ON mz_internal.mz_source_statistics (id, replica_id)",
13284    is_retained_metrics_object: false,
13285};
13286
13287pub static MZ_SINK_STATISTICS: LazyLock<BuiltinView> = LazyLock::new(|| BuiltinView {
13288    name: "mz_sink_statistics",
13289    schema: MZ_INTERNAL_SCHEMA,
13290    oid: oid::VIEW_MZ_SINK_STATISTICS_OID,
13291    desc: RelationDesc::builder()
13292        .with_column("id", SqlScalarType::String.nullable(false))
13293        .with_column("replica_id", SqlScalarType::String.nullable(true))
13294        .with_column("messages_staged", SqlScalarType::UInt64.nullable(false))
13295        .with_column("messages_committed", SqlScalarType::UInt64.nullable(false))
13296        .with_column("bytes_staged", SqlScalarType::UInt64.nullable(false))
13297        .with_column("bytes_committed", SqlScalarType::UInt64.nullable(false))
13298        .with_key(vec![0, 1])
13299        .finish(),
13300    column_comments: BTreeMap::from_iter([
13301        (
13302            "id",
13303            "The ID of the sink. Corresponds to `mz_catalog.mz_sources.id`.",
13304        ),
13305        (
13306            "replica_id",
13307            "The ID of a replica running the sink. Corresponds to `mz_catalog.mz_cluster_replicas.id`.",
13308        ),
13309        (
13310            "messages_staged",
13311            "The number of messages staged but possibly not committed to the sink.",
13312        ),
13313        (
13314            "messages_committed",
13315            "The number of messages committed to the sink.",
13316        ),
13317        (
13318            "bytes_staged",
13319            "The number of bytes staged but possibly not committed to the sink. This counts both keys and values, if applicable.",
13320        ),
13321        (
13322            "bytes_committed",
13323            "The number of bytes committed to the sink. This counts both keys and values, if applicable.",
13324        ),
13325    ]),
13326    sql: "
13327SELECT
13328    id,
13329    replica_id,
13330    SUM(messages_staged)::uint8 AS messages_staged,
13331    SUM(messages_committed)::uint8 AS messages_committed,
13332    SUM(bytes_staged)::uint8 AS bytes_staged,
13333    SUM(bytes_committed)::uint8 AS bytes_committed
13334FROM mz_internal.mz_sink_statistics_raw
13335GROUP BY id, replica_id",
13336    access: vec![PUBLIC_SELECT],
13337});
13338
13339pub const MZ_SINK_STATISTICS_IND: BuiltinIndex = BuiltinIndex {
13340    name: "mz_sink_statistics_ind",
13341    schema: MZ_INTERNAL_SCHEMA,
13342    oid: oid::INDEX_MZ_SINK_STATISTICS_IND_OID,
13343    sql: "IN CLUSTER mz_catalog_server
13344ON mz_internal.mz_sink_statistics (id, replica_id)",
13345    is_retained_metrics_object: true,
13346};
13347
13348pub const MZ_CLUSTER_REPLICAS_IND: BuiltinIndex = BuiltinIndex {
13349    name: "mz_cluster_replicas_ind",
13350    schema: MZ_CATALOG_SCHEMA,
13351    oid: oid::INDEX_MZ_CLUSTER_REPLICAS_IND_OID,
13352    sql: "IN CLUSTER mz_catalog_server
13353ON mz_catalog.mz_cluster_replicas (id)",
13354    is_retained_metrics_object: true,
13355};
13356
13357pub const MZ_CLUSTER_REPLICA_SIZES_IND: BuiltinIndex = BuiltinIndex {
13358    name: "mz_cluster_replica_sizes_ind",
13359    schema: MZ_CATALOG_SCHEMA,
13360    oid: oid::INDEX_MZ_CLUSTER_REPLICA_SIZES_IND_OID,
13361    sql: "IN CLUSTER mz_catalog_server
13362ON mz_catalog.mz_cluster_replica_sizes (size)",
13363    is_retained_metrics_object: true,
13364};
13365
13366pub const MZ_CLUSTER_REPLICA_STATUSES_IND: BuiltinIndex = BuiltinIndex {
13367    name: "mz_cluster_replica_statuses_ind",
13368    schema: MZ_INTERNAL_SCHEMA,
13369    oid: oid::INDEX_MZ_CLUSTER_REPLICA_STATUSES_IND_OID,
13370    sql: "IN CLUSTER mz_catalog_server
13371ON mz_internal.mz_cluster_replica_statuses (replica_id)",
13372    is_retained_metrics_object: false,
13373};
13374
13375pub const MZ_CLUSTER_REPLICA_STATUS_HISTORY_IND: BuiltinIndex = BuiltinIndex {
13376    name: "mz_cluster_replica_status_history_ind",
13377    schema: MZ_INTERNAL_SCHEMA,
13378    oid: oid::INDEX_MZ_CLUSTER_REPLICA_STATUS_HISTORY_IND_OID,
13379    sql: "IN CLUSTER mz_catalog_server
13380ON mz_internal.mz_cluster_replica_status_history (replica_id)",
13381    is_retained_metrics_object: false,
13382};
13383
13384pub const MZ_CLUSTER_REPLICA_METRICS_IND: BuiltinIndex = BuiltinIndex {
13385    name: "mz_cluster_replica_metrics_ind",
13386    schema: MZ_INTERNAL_SCHEMA,
13387    oid: oid::INDEX_MZ_CLUSTER_REPLICA_METRICS_IND_OID,
13388    sql: "IN CLUSTER mz_catalog_server
13389ON mz_internal.mz_cluster_replica_metrics (replica_id)",
13390    is_retained_metrics_object: false,
13391};
13392
13393pub const MZ_CLUSTER_REPLICA_METRICS_HISTORY_IND: BuiltinIndex = BuiltinIndex {
13394    name: "mz_cluster_replica_metrics_history_ind",
13395    schema: MZ_INTERNAL_SCHEMA,
13396    oid: oid::INDEX_MZ_CLUSTER_REPLICA_METRICS_HISTORY_IND_OID,
13397    sql: "IN CLUSTER mz_catalog_server
13398ON mz_internal.mz_cluster_replica_metrics_history (replica_id)",
13399    is_retained_metrics_object: false,
13400};
13401
13402pub const MZ_CLUSTER_REPLICA_HISTORY_IND: BuiltinIndex = BuiltinIndex {
13403    name: "mz_cluster_replica_history_ind",
13404    schema: MZ_INTERNAL_SCHEMA,
13405    oid: oid::INDEX_MZ_CLUSTER_REPLICA_HISTORY_IND_OID,
13406    sql: "IN CLUSTER mz_catalog_server
13407ON mz_internal.mz_cluster_replica_history (dropped_at)",
13408    is_retained_metrics_object: true,
13409};
13410
13411pub const MZ_CLUSTER_REPLICA_NAME_HISTORY_IND: BuiltinIndex = BuiltinIndex {
13412    name: "mz_cluster_replica_name_history_ind",
13413    schema: MZ_INTERNAL_SCHEMA,
13414    oid: oid::INDEX_MZ_CLUSTER_REPLICA_NAME_HISTORY_IND_OID,
13415    sql: "IN CLUSTER mz_catalog_server
13416ON mz_internal.mz_cluster_replica_name_history (id)",
13417    is_retained_metrics_object: false,
13418};
13419
13420pub const MZ_OBJECT_LIFETIMES_IND: BuiltinIndex = BuiltinIndex {
13421    name: "mz_object_lifetimes_ind",
13422    schema: MZ_INTERNAL_SCHEMA,
13423    oid: oid::INDEX_MZ_OBJECT_LIFETIMES_IND_OID,
13424    sql: "IN CLUSTER mz_catalog_server
13425ON mz_internal.mz_object_lifetimes (id)",
13426    is_retained_metrics_object: false,
13427};
13428
13429pub const MZ_OBJECT_HISTORY_IND: BuiltinIndex = BuiltinIndex {
13430    name: "mz_object_history_ind",
13431    schema: MZ_INTERNAL_SCHEMA,
13432    oid: oid::INDEX_MZ_OBJECT_HISTORY_IND_OID,
13433    sql: "IN CLUSTER mz_catalog_server
13434ON mz_internal.mz_object_history (id)",
13435    is_retained_metrics_object: false,
13436};
13437
13438pub const MZ_OBJECT_DEPENDENCIES_IND: BuiltinIndex = BuiltinIndex {
13439    name: "mz_object_dependencies_ind",
13440    schema: MZ_INTERNAL_SCHEMA,
13441    oid: oid::INDEX_MZ_OBJECT_DEPENDENCIES_IND_OID,
13442    sql: "IN CLUSTER mz_catalog_server
13443ON mz_internal.mz_object_dependencies (object_id)",
13444    is_retained_metrics_object: true,
13445};
13446
13447pub const MZ_COMPUTE_DEPENDENCIES_IND: BuiltinIndex = BuiltinIndex {
13448    name: "mz_compute_dependencies_ind",
13449    schema: MZ_INTERNAL_SCHEMA,
13450    oid: oid::INDEX_MZ_COMPUTE_DEPENDENCIES_IND_OID,
13451    sql: "IN CLUSTER mz_catalog_server
13452ON mz_internal.mz_compute_dependencies (dependency_id)",
13453    is_retained_metrics_object: false,
13454};
13455
13456pub const MZ_OBJECT_TRANSITIVE_DEPENDENCIES_IND: BuiltinIndex = BuiltinIndex {
13457    name: "mz_object_transitive_dependencies_ind",
13458    schema: MZ_INTERNAL_SCHEMA,
13459    oid: oid::INDEX_MZ_OBJECT_TRANSITIVE_DEPENDENCIES_IND_OID,
13460    sql: "IN CLUSTER mz_catalog_server
13461ON mz_internal.mz_object_transitive_dependencies (object_id)",
13462    is_retained_metrics_object: false,
13463};
13464
13465pub const MZ_FRONTIERS_IND: BuiltinIndex = BuiltinIndex {
13466    name: "mz_frontiers_ind",
13467    schema: MZ_INTERNAL_SCHEMA,
13468    oid: oid::INDEX_MZ_FRONTIERS_IND_OID,
13469    sql: "IN CLUSTER mz_catalog_server
13470ON mz_internal.mz_frontiers (object_id)",
13471    is_retained_metrics_object: false,
13472};
13473
13474pub const MZ_WALLCLOCK_GLOBAL_LAG_RECENT_HISTORY_IND: BuiltinIndex = BuiltinIndex {
13475    name: "mz_wallclock_global_lag_recent_history_ind",
13476    schema: MZ_INTERNAL_SCHEMA,
13477    oid: oid::INDEX_MZ_WALLCLOCK_GLOBAL_LAG_RECENT_HISTORY_IND_OID,
13478    sql: "IN CLUSTER mz_catalog_server
13479ON mz_internal.mz_wallclock_global_lag_recent_history (object_id)",
13480    is_retained_metrics_object: false,
13481};
13482
13483pub const MZ_RECENT_ACTIVITY_LOG_THINNED_IND: BuiltinIndex = BuiltinIndex {
13484    name: "mz_recent_activity_log_thinned_ind",
13485    schema: MZ_INTERNAL_SCHEMA,
13486    oid: oid::INDEX_MZ_RECENT_ACTIVITY_LOG_THINNED_IND_OID,
13487    sql: "IN CLUSTER mz_catalog_server
13488-- sql_hash because we plan to join
13489-- this against mz_internal.mz_sql_text
13490ON mz_internal.mz_recent_activity_log_thinned (sql_hash)",
13491    is_retained_metrics_object: false,
13492};
13493
13494pub const MZ_KAFKA_SOURCES_IND: BuiltinIndex = BuiltinIndex {
13495    name: "mz_kafka_sources_ind",
13496    schema: MZ_CATALOG_SCHEMA,
13497    oid: oid::INDEX_MZ_KAFKA_SOURCES_IND_OID,
13498    sql: "IN CLUSTER mz_catalog_server
13499ON mz_catalog.mz_kafka_sources (id)",
13500    is_retained_metrics_object: true,
13501};
13502
13503pub const MZ_WEBHOOK_SOURCES_IND: BuiltinIndex = BuiltinIndex {
13504    name: "mz_webhook_sources_ind",
13505    schema: MZ_INTERNAL_SCHEMA,
13506    oid: oid::INDEX_MZ_WEBHOOK_SOURCES_IND_OID,
13507    sql: "IN CLUSTER mz_catalog_server
13508ON mz_internal.mz_webhook_sources (id)",
13509    is_retained_metrics_object: true,
13510};
13511
13512pub const MZ_COMMENTS_IND: BuiltinIndex = BuiltinIndex {
13513    name: "mz_comments_ind",
13514    schema: MZ_INTERNAL_SCHEMA,
13515    oid: oid::INDEX_MZ_COMMENTS_IND_OID,
13516    sql: "IN CLUSTER mz_catalog_server
13517ON mz_internal.mz_comments (id)",
13518    is_retained_metrics_object: true,
13519};
13520
13521pub static MZ_ANALYTICS: BuiltinConnection = BuiltinConnection {
13522    name: "mz_analytics",
13523    schema: MZ_INTERNAL_SCHEMA,
13524    oid: oid::CONNECTION_MZ_ANALYTICS_OID,
13525    sql: "CREATE CONNECTION mz_internal.mz_analytics TO AWS (ASSUME ROLE ARN = '')",
13526    access: &[MzAclItem {
13527        grantee: MZ_SYSTEM_ROLE_ID,
13528        grantor: MZ_ANALYTICS_ROLE_ID,
13529        acl_mode: rbac::all_object_privileges(SystemObjectType::Object(ObjectType::Connection)),
13530    }],
13531    owner_id: &MZ_ANALYTICS_ROLE_ID,
13532    runtime_alterable: true,
13533};
13534
13535pub const MZ_SYSTEM_ROLE: BuiltinRole = BuiltinRole {
13536    id: MZ_SYSTEM_ROLE_ID,
13537    name: SYSTEM_USER_NAME,
13538    oid: oid::ROLE_MZ_SYSTEM_OID,
13539    attributes: RoleAttributesRaw::new().with_all(),
13540};
13541
13542pub const MZ_SUPPORT_ROLE: BuiltinRole = BuiltinRole {
13543    id: MZ_SUPPORT_ROLE_ID,
13544    name: SUPPORT_USER_NAME,
13545    oid: oid::ROLE_MZ_SUPPORT_OID,
13546    attributes: RoleAttributesRaw::new(),
13547};
13548
13549pub const MZ_ANALYTICS_ROLE: BuiltinRole = BuiltinRole {
13550    id: MZ_ANALYTICS_ROLE_ID,
13551    name: ANALYTICS_USER_NAME,
13552    oid: oid::ROLE_MZ_ANALYTICS_OID,
13553    attributes: RoleAttributesRaw::new(),
13554};
13555
13556/// This role can `SELECT` from various query history objects,
13557/// e.g. `mz_prepared_statement_history`.
13558pub const MZ_MONITOR_ROLE: BuiltinRole = BuiltinRole {
13559    id: MZ_MONITOR_ROLE_ID,
13560    name: "mz_monitor",
13561    oid: oid::ROLE_MZ_MONITOR_OID,
13562    attributes: RoleAttributesRaw::new(),
13563};
13564
13565/// This role is like [`MZ_MONITOR_ROLE`], but can only query
13566/// the redacted versions of the objects.
13567pub const MZ_MONITOR_REDACTED: BuiltinRole = BuiltinRole {
13568    id: MZ_MONITOR_REDACTED_ROLE_ID,
13569    name: "mz_monitor_redacted",
13570    oid: oid::ROLE_MZ_MONITOR_REDACTED_OID,
13571    attributes: RoleAttributesRaw::new(),
13572};
13573
13574pub const MZ_SYSTEM_CLUSTER: BuiltinCluster = BuiltinCluster {
13575    name: SYSTEM_USER_NAME,
13576    owner_id: &MZ_SYSTEM_ROLE_ID,
13577    privileges: &[
13578        MzAclItem {
13579            grantee: MZ_SUPPORT_ROLE_ID,
13580            grantor: MZ_SYSTEM_ROLE_ID,
13581            acl_mode: AclMode::USAGE,
13582        },
13583        rbac::owner_privilege(ObjectType::Cluster, MZ_SYSTEM_ROLE_ID),
13584    ],
13585};
13586
13587pub const MZ_SYSTEM_CLUSTER_REPLICA: BuiltinClusterReplica = BuiltinClusterReplica {
13588    name: BUILTIN_CLUSTER_REPLICA_NAME,
13589    cluster_name: MZ_SYSTEM_CLUSTER.name,
13590};
13591
13592pub const MZ_CATALOG_SERVER_CLUSTER: BuiltinCluster = BuiltinCluster {
13593    name: "mz_catalog_server",
13594    owner_id: &MZ_SYSTEM_ROLE_ID,
13595    privileges: &[
13596        MzAclItem {
13597            grantee: RoleId::Public,
13598            grantor: MZ_SYSTEM_ROLE_ID,
13599            acl_mode: AclMode::USAGE,
13600        },
13601        MzAclItem {
13602            grantee: MZ_SUPPORT_ROLE_ID,
13603            grantor: MZ_SYSTEM_ROLE_ID,
13604            acl_mode: AclMode::USAGE.union(AclMode::CREATE),
13605        },
13606        rbac::owner_privilege(ObjectType::Cluster, MZ_SYSTEM_ROLE_ID),
13607    ],
13608};
13609
13610pub const MZ_CATALOG_SERVER_CLUSTER_REPLICA: BuiltinClusterReplica = BuiltinClusterReplica {
13611    name: BUILTIN_CLUSTER_REPLICA_NAME,
13612    cluster_name: MZ_CATALOG_SERVER_CLUSTER.name,
13613};
13614
13615pub const MZ_PROBE_CLUSTER: BuiltinCluster = BuiltinCluster {
13616    name: "mz_probe",
13617    owner_id: &MZ_SYSTEM_ROLE_ID,
13618    privileges: &[
13619        MzAclItem {
13620            grantee: MZ_SUPPORT_ROLE_ID,
13621            grantor: MZ_SYSTEM_ROLE_ID,
13622            acl_mode: AclMode::USAGE,
13623        },
13624        MzAclItem {
13625            grantee: MZ_MONITOR_ROLE_ID,
13626            grantor: MZ_SYSTEM_ROLE_ID,
13627            acl_mode: AclMode::USAGE,
13628        },
13629        rbac::owner_privilege(ObjectType::Cluster, MZ_SYSTEM_ROLE_ID),
13630    ],
13631};
13632pub const MZ_PROBE_CLUSTER_REPLICA: BuiltinClusterReplica = BuiltinClusterReplica {
13633    name: BUILTIN_CLUSTER_REPLICA_NAME,
13634    cluster_name: MZ_PROBE_CLUSTER.name,
13635};
13636
13637pub const MZ_SUPPORT_CLUSTER: BuiltinCluster = BuiltinCluster {
13638    name: "mz_support",
13639    owner_id: &MZ_SUPPORT_ROLE_ID,
13640    privileges: &[
13641        MzAclItem {
13642            grantee: MZ_SYSTEM_ROLE_ID,
13643            grantor: MZ_SUPPORT_ROLE_ID,
13644            acl_mode: rbac::all_object_privileges(SystemObjectType::Object(ObjectType::Cluster)),
13645        },
13646        rbac::owner_privilege(ObjectType::Cluster, MZ_SUPPORT_ROLE_ID),
13647    ],
13648};
13649
13650pub const MZ_ANALYTICS_CLUSTER: BuiltinCluster = BuiltinCluster {
13651    name: "mz_analytics",
13652    owner_id: &MZ_ANALYTICS_ROLE_ID,
13653    privileges: &[
13654        MzAclItem {
13655            grantee: MZ_SYSTEM_ROLE_ID,
13656            grantor: MZ_ANALYTICS_ROLE_ID,
13657            acl_mode: rbac::all_object_privileges(SystemObjectType::Object(ObjectType::Cluster)),
13658        },
13659        rbac::owner_privilege(ObjectType::Cluster, MZ_ANALYTICS_ROLE_ID),
13660    ],
13661};
13662
13663/// List of all builtin objects sorted topologically by dependency.
13664pub static BUILTINS_STATIC: LazyLock<Vec<Builtin<NameReference>>> = LazyLock::new(|| {
13665    let mut builtins = vec![
13666        Builtin::Type(&TYPE_ANY),
13667        Builtin::Type(&TYPE_ANYARRAY),
13668        Builtin::Type(&TYPE_ANYELEMENT),
13669        Builtin::Type(&TYPE_ANYNONARRAY),
13670        Builtin::Type(&TYPE_ANYRANGE),
13671        Builtin::Type(&TYPE_BOOL),
13672        Builtin::Type(&TYPE_BOOL_ARRAY),
13673        Builtin::Type(&TYPE_BYTEA),
13674        Builtin::Type(&TYPE_BYTEA_ARRAY),
13675        Builtin::Type(&TYPE_BPCHAR),
13676        Builtin::Type(&TYPE_BPCHAR_ARRAY),
13677        Builtin::Type(&TYPE_CHAR),
13678        Builtin::Type(&TYPE_CHAR_ARRAY),
13679        Builtin::Type(&TYPE_DATE),
13680        Builtin::Type(&TYPE_DATE_ARRAY),
13681        Builtin::Type(&TYPE_FLOAT4),
13682        Builtin::Type(&TYPE_FLOAT4_ARRAY),
13683        Builtin::Type(&TYPE_FLOAT8),
13684        Builtin::Type(&TYPE_FLOAT8_ARRAY),
13685        Builtin::Type(&TYPE_INT4),
13686        Builtin::Type(&TYPE_INT4_ARRAY),
13687        Builtin::Type(&TYPE_INT8),
13688        Builtin::Type(&TYPE_INT8_ARRAY),
13689        Builtin::Type(&TYPE_INTERVAL),
13690        Builtin::Type(&TYPE_INTERVAL_ARRAY),
13691        Builtin::Type(&TYPE_JSONB),
13692        Builtin::Type(&TYPE_JSONB_ARRAY),
13693        Builtin::Type(&TYPE_LIST),
13694        Builtin::Type(&TYPE_MAP),
13695        Builtin::Type(&TYPE_NAME),
13696        Builtin::Type(&TYPE_NAME_ARRAY),
13697        Builtin::Type(&TYPE_NUMERIC),
13698        Builtin::Type(&TYPE_NUMERIC_ARRAY),
13699        Builtin::Type(&TYPE_OID),
13700        Builtin::Type(&TYPE_OID_ARRAY),
13701        Builtin::Type(&TYPE_RECORD),
13702        Builtin::Type(&TYPE_RECORD_ARRAY),
13703        Builtin::Type(&TYPE_REGCLASS),
13704        Builtin::Type(&TYPE_REGCLASS_ARRAY),
13705        Builtin::Type(&TYPE_REGPROC),
13706        Builtin::Type(&TYPE_REGPROC_ARRAY),
13707        Builtin::Type(&TYPE_REGTYPE),
13708        Builtin::Type(&TYPE_REGTYPE_ARRAY),
13709        Builtin::Type(&TYPE_INT2),
13710        Builtin::Type(&TYPE_INT2_ARRAY),
13711        Builtin::Type(&TYPE_TEXT),
13712        Builtin::Type(&TYPE_TEXT_ARRAY),
13713        Builtin::Type(&TYPE_TIME),
13714        Builtin::Type(&TYPE_TIME_ARRAY),
13715        Builtin::Type(&TYPE_TIMESTAMP),
13716        Builtin::Type(&TYPE_TIMESTAMP_ARRAY),
13717        Builtin::Type(&TYPE_TIMESTAMPTZ),
13718        Builtin::Type(&TYPE_TIMESTAMPTZ_ARRAY),
13719        Builtin::Type(&TYPE_UUID),
13720        Builtin::Type(&TYPE_UUID_ARRAY),
13721        Builtin::Type(&TYPE_VARCHAR),
13722        Builtin::Type(&TYPE_VARCHAR_ARRAY),
13723        Builtin::Type(&TYPE_INT2_VECTOR),
13724        Builtin::Type(&TYPE_INT2_VECTOR_ARRAY),
13725        Builtin::Type(&TYPE_ANYCOMPATIBLE),
13726        Builtin::Type(&TYPE_ANYCOMPATIBLEARRAY),
13727        Builtin::Type(&TYPE_ANYCOMPATIBLENONARRAY),
13728        Builtin::Type(&TYPE_ANYCOMPATIBLELIST),
13729        Builtin::Type(&TYPE_ANYCOMPATIBLEMAP),
13730        Builtin::Type(&TYPE_ANYCOMPATIBLERANGE),
13731        Builtin::Type(&TYPE_UINT2),
13732        Builtin::Type(&TYPE_UINT2_ARRAY),
13733        Builtin::Type(&TYPE_UINT4),
13734        Builtin::Type(&TYPE_UINT4_ARRAY),
13735        Builtin::Type(&TYPE_UINT8),
13736        Builtin::Type(&TYPE_UINT8_ARRAY),
13737        Builtin::Type(&TYPE_MZ_TIMESTAMP),
13738        Builtin::Type(&TYPE_MZ_TIMESTAMP_ARRAY),
13739        Builtin::Type(&TYPE_INT4_RANGE),
13740        Builtin::Type(&TYPE_INT4_RANGE_ARRAY),
13741        Builtin::Type(&TYPE_INT8_RANGE),
13742        Builtin::Type(&TYPE_INT8_RANGE_ARRAY),
13743        Builtin::Type(&TYPE_DATE_RANGE),
13744        Builtin::Type(&TYPE_DATE_RANGE_ARRAY),
13745        Builtin::Type(&TYPE_NUM_RANGE),
13746        Builtin::Type(&TYPE_NUM_RANGE_ARRAY),
13747        Builtin::Type(&TYPE_TS_RANGE),
13748        Builtin::Type(&TYPE_TS_RANGE_ARRAY),
13749        Builtin::Type(&TYPE_TSTZ_RANGE),
13750        Builtin::Type(&TYPE_TSTZ_RANGE_ARRAY),
13751        Builtin::Type(&TYPE_MZ_ACL_ITEM),
13752        Builtin::Type(&TYPE_MZ_ACL_ITEM_ARRAY),
13753        Builtin::Type(&TYPE_ACL_ITEM),
13754        Builtin::Type(&TYPE_ACL_ITEM_ARRAY),
13755        Builtin::Type(&TYPE_INTERNAL),
13756    ];
13757    for (schema, funcs) in &[
13758        (PG_CATALOG_SCHEMA, &*mz_sql::func::PG_CATALOG_BUILTINS),
13759        (
13760            INFORMATION_SCHEMA,
13761            &*mz_sql::func::INFORMATION_SCHEMA_BUILTINS,
13762        ),
13763        (MZ_CATALOG_SCHEMA, &*mz_sql::func::MZ_CATALOG_BUILTINS),
13764        (MZ_INTERNAL_SCHEMA, &*mz_sql::func::MZ_INTERNAL_BUILTINS),
13765        (MZ_UNSAFE_SCHEMA, &*mz_sql::func::MZ_UNSAFE_BUILTINS),
13766    ] {
13767        for (name, func) in funcs.iter() {
13768            builtins.push(Builtin::Func(BuiltinFunc {
13769                name,
13770                schema,
13771                inner: func,
13772            }));
13773        }
13774    }
13775    builtins.append(&mut vec![
13776        Builtin::Log(&MZ_ARRANGEMENT_SHARING_RAW),
13777        Builtin::Log(&MZ_ARRANGEMENT_BATCHES_RAW),
13778        Builtin::Log(&MZ_ARRANGEMENT_RECORDS_RAW),
13779        Builtin::Log(&MZ_ARRANGEMENT_BATCHER_RECORDS_RAW),
13780        Builtin::Log(&MZ_ARRANGEMENT_BATCHER_SIZE_RAW),
13781        Builtin::Log(&MZ_ARRANGEMENT_BATCHER_CAPACITY_RAW),
13782        Builtin::Log(&MZ_ARRANGEMENT_BATCHER_ALLOCATIONS_RAW),
13783        Builtin::Log(&MZ_DATAFLOW_CHANNELS_PER_WORKER),
13784        Builtin::Log(&MZ_DATAFLOW_OPERATORS_PER_WORKER),
13785        Builtin::Log(&MZ_DATAFLOW_ADDRESSES_PER_WORKER),
13786        Builtin::Log(&MZ_DATAFLOW_OPERATOR_REACHABILITY_RAW),
13787        Builtin::Log(&MZ_COMPUTE_EXPORTS_PER_WORKER),
13788        Builtin::Log(&MZ_COMPUTE_DATAFLOW_GLOBAL_IDS_PER_WORKER),
13789        Builtin::Log(&MZ_MESSAGE_COUNTS_RECEIVED_RAW),
13790        Builtin::Log(&MZ_MESSAGE_COUNTS_SENT_RAW),
13791        Builtin::Log(&MZ_MESSAGE_BATCH_COUNTS_RECEIVED_RAW),
13792        Builtin::Log(&MZ_MESSAGE_BATCH_COUNTS_SENT_RAW),
13793        Builtin::Log(&MZ_ACTIVE_PEEKS_PER_WORKER),
13794        Builtin::Log(&MZ_PEEK_DURATIONS_HISTOGRAM_RAW),
13795        Builtin::Log(&MZ_DATAFLOW_SHUTDOWN_DURATIONS_HISTOGRAM_RAW),
13796        Builtin::Log(&MZ_ARRANGEMENT_HEAP_CAPACITY_RAW),
13797        Builtin::Log(&MZ_ARRANGEMENT_HEAP_ALLOCATIONS_RAW),
13798        Builtin::Log(&MZ_ARRANGEMENT_HEAP_SIZE_RAW),
13799        Builtin::Log(&MZ_SCHEDULING_ELAPSED_RAW),
13800        Builtin::Log(&MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM_RAW),
13801        Builtin::Log(&MZ_SCHEDULING_PARKS_HISTOGRAM_RAW),
13802        Builtin::Log(&MZ_COMPUTE_FRONTIERS_PER_WORKER),
13803        Builtin::Log(&MZ_COMPUTE_IMPORT_FRONTIERS_PER_WORKER),
13804        Builtin::Log(&MZ_COMPUTE_ERROR_COUNTS_RAW),
13805        Builtin::Log(&MZ_COMPUTE_HYDRATION_TIMES_PER_WORKER),
13806        Builtin::Log(&MZ_COMPUTE_OPERATOR_HYDRATION_STATUSES_PER_WORKER),
13807        Builtin::Table(&MZ_KAFKA_SINKS),
13808        Builtin::Table(&MZ_KAFKA_CONNECTIONS),
13809        Builtin::Table(&MZ_KAFKA_SOURCES),
13810        Builtin::Table(&MZ_OBJECT_DEPENDENCIES),
13811        Builtin::Table(&MZ_ICEBERG_SINKS),
13812        Builtin::Table(&MZ_DATABASES),
13813        Builtin::Table(&MZ_SCHEMAS),
13814        Builtin::Table(&MZ_COLUMNS),
13815        Builtin::Table(&MZ_INDEXES),
13816        Builtin::Table(&MZ_INDEX_COLUMNS),
13817        Builtin::Table(&MZ_TABLES),
13818        Builtin::Table(&MZ_SOURCES),
13819        Builtin::Table(&MZ_SOURCE_REFERENCES),
13820        Builtin::Table(&MZ_POSTGRES_SOURCES),
13821        Builtin::Table(&MZ_POSTGRES_SOURCE_TABLES),
13822        Builtin::Table(&MZ_MYSQL_SOURCE_TABLES),
13823        Builtin::Table(&MZ_SQL_SERVER_SOURCE_TABLES),
13824        Builtin::Table(&MZ_KAFKA_SOURCE_TABLES),
13825        Builtin::Table(&MZ_SINKS),
13826        Builtin::Table(&MZ_VIEWS),
13827        Builtin::Table(&MZ_MATERIALIZED_VIEWS),
13828        Builtin::Table(&MZ_MATERIALIZED_VIEW_REFRESH_STRATEGIES),
13829        Builtin::Table(&MZ_TYPES),
13830        Builtin::Table(&MZ_TYPE_PG_METADATA),
13831        Builtin::Table(&MZ_ARRAY_TYPES),
13832        Builtin::Table(&MZ_BASE_TYPES),
13833        Builtin::Table(&MZ_LIST_TYPES),
13834        Builtin::Table(&MZ_MAP_TYPES),
13835        Builtin::Table(&MZ_ROLES),
13836        Builtin::Table(&MZ_ROLE_AUTH),
13837        Builtin::Table(&MZ_ROLE_MEMBERS),
13838        Builtin::Table(&MZ_ROLE_PARAMETERS),
13839        Builtin::Table(&MZ_PSEUDO_TYPES),
13840        Builtin::Table(&MZ_FUNCTIONS),
13841        Builtin::Table(&MZ_OPERATORS),
13842        Builtin::Table(&MZ_AGGREGATES),
13843        Builtin::Table(&MZ_CLUSTERS),
13844        Builtin::Table(&MZ_CLUSTER_WORKLOAD_CLASSES),
13845        Builtin::Table(&MZ_CLUSTER_SCHEDULES),
13846        Builtin::Table(&MZ_SECRETS),
13847        Builtin::Table(&MZ_CONNECTIONS),
13848        Builtin::Table(&MZ_SSH_TUNNEL_CONNECTIONS),
13849        Builtin::Table(&MZ_CLUSTER_REPLICAS),
13850        Builtin::Source(&MZ_CLUSTER_REPLICA_METRICS_HISTORY),
13851        Builtin::View(&MZ_CLUSTER_REPLICA_METRICS),
13852        Builtin::Table(&MZ_CLUSTER_REPLICA_SIZES),
13853        Builtin::Source(&MZ_CLUSTER_REPLICA_STATUS_HISTORY),
13854        Builtin::View(&MZ_CLUSTER_REPLICA_STATUSES),
13855        Builtin::Table(&MZ_INTERNAL_CLUSTER_REPLICAS),
13856        Builtin::Table(&MZ_PENDING_CLUSTER_REPLICAS),
13857        Builtin::Table(&MZ_AUDIT_EVENTS),
13858        Builtin::Table(&MZ_STORAGE_USAGE_BY_SHARD),
13859        Builtin::Table(&MZ_EGRESS_IPS),
13860        Builtin::Table(&MZ_AWS_PRIVATELINK_CONNECTIONS),
13861        Builtin::Table(&MZ_AWS_CONNECTIONS),
13862        Builtin::Table(&MZ_SUBSCRIPTIONS),
13863        Builtin::Table(&MZ_SESSIONS),
13864        Builtin::Table(&MZ_DEFAULT_PRIVILEGES),
13865        Builtin::Table(&MZ_SYSTEM_PRIVILEGES),
13866        Builtin::Table(&MZ_COMMENTS),
13867        Builtin::Table(&MZ_WEBHOOKS_SOURCES),
13868        Builtin::Table(&MZ_HISTORY_RETENTION_STRATEGIES),
13869        Builtin::Table(&MZ_CONTINUAL_TASKS),
13870        Builtin::Table(&MZ_NETWORK_POLICIES),
13871        Builtin::Table(&MZ_NETWORK_POLICY_RULES),
13872        Builtin::Table(&MZ_LICENSE_KEYS),
13873        Builtin::Table(&MZ_REPLACEMENTS),
13874        Builtin::View(&MZ_RELATIONS),
13875        Builtin::View(&MZ_OBJECT_OID_ALIAS),
13876        Builtin::View(&MZ_OBJECTS),
13877        Builtin::View(&MZ_OBJECT_FULLY_QUALIFIED_NAMES),
13878        Builtin::View(&MZ_OBJECTS_ID_NAMESPACE_TYPES),
13879        Builtin::View(&MZ_OBJECT_HISTORY),
13880        Builtin::View(&MZ_OBJECT_LIFETIMES),
13881        Builtin::Table(&MZ_OBJECT_GLOBAL_IDS),
13882        Builtin::View(&MZ_ARRANGEMENT_SHARING_PER_WORKER),
13883        Builtin::View(&MZ_ARRANGEMENT_SHARING),
13884        Builtin::View(&MZ_ARRANGEMENT_SIZES_PER_WORKER),
13885        Builtin::View(&MZ_ARRANGEMENT_SIZES),
13886        Builtin::View(&MZ_DATAFLOWS_PER_WORKER),
13887        Builtin::View(&MZ_DATAFLOWS),
13888        Builtin::View(&MZ_DATAFLOW_ADDRESSES),
13889        Builtin::View(&MZ_DATAFLOW_CHANNELS),
13890        Builtin::View(&MZ_DATAFLOW_OPERATORS),
13891        Builtin::View(&MZ_DATAFLOW_GLOBAL_IDS),
13892        Builtin::View(&MZ_MAPPABLE_OBJECTS),
13893        Builtin::View(&MZ_DATAFLOW_OPERATOR_DATAFLOWS_PER_WORKER),
13894        Builtin::View(&MZ_DATAFLOW_OPERATOR_DATAFLOWS),
13895        Builtin::View(&MZ_OBJECT_TRANSITIVE_DEPENDENCIES),
13896        Builtin::View(&MZ_DATAFLOW_OPERATOR_REACHABILITY_PER_WORKER),
13897        Builtin::View(&MZ_DATAFLOW_OPERATOR_REACHABILITY),
13898        Builtin::View(&MZ_CLUSTER_REPLICA_UTILIZATION),
13899        Builtin::View(&MZ_CLUSTER_REPLICA_UTILIZATION_HISTORY),
13900        Builtin::View(&MZ_DATAFLOW_OPERATOR_PARENTS_PER_WORKER),
13901        Builtin::View(&MZ_DATAFLOW_OPERATOR_PARENTS),
13902        Builtin::View(&MZ_COMPUTE_EXPORTS),
13903        Builtin::View(&MZ_DATAFLOW_ARRANGEMENT_SIZES),
13904        Builtin::View(&MZ_EXPECTED_GROUP_SIZE_ADVICE),
13905        Builtin::View(&MZ_COMPUTE_FRONTIERS),
13906        Builtin::View(&MZ_DATAFLOW_CHANNEL_OPERATORS_PER_WORKER),
13907        Builtin::View(&MZ_DATAFLOW_CHANNEL_OPERATORS),
13908        Builtin::View(&MZ_COMPUTE_IMPORT_FRONTIERS),
13909        Builtin::View(&MZ_MESSAGE_COUNTS_PER_WORKER),
13910        Builtin::View(&MZ_MESSAGE_COUNTS),
13911        Builtin::View(&MZ_ACTIVE_PEEKS),
13912        Builtin::View(&MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM_PER_WORKER),
13913        Builtin::View(&MZ_COMPUTE_OPERATOR_DURATIONS_HISTOGRAM),
13914        Builtin::View(&MZ_RECORDS_PER_DATAFLOW_OPERATOR_PER_WORKER),
13915        Builtin::View(&MZ_RECORDS_PER_DATAFLOW_OPERATOR),
13916        Builtin::View(&MZ_RECORDS_PER_DATAFLOW_PER_WORKER),
13917        Builtin::View(&MZ_RECORDS_PER_DATAFLOW),
13918        Builtin::View(&MZ_PEEK_DURATIONS_HISTOGRAM_PER_WORKER),
13919        Builtin::View(&MZ_PEEK_DURATIONS_HISTOGRAM),
13920        Builtin::View(&MZ_DATAFLOW_SHUTDOWN_DURATIONS_HISTOGRAM_PER_WORKER),
13921        Builtin::View(&MZ_DATAFLOW_SHUTDOWN_DURATIONS_HISTOGRAM),
13922        Builtin::View(&MZ_SCHEDULING_ELAPSED_PER_WORKER),
13923        Builtin::View(&MZ_SCHEDULING_ELAPSED),
13924        Builtin::View(&MZ_SCHEDULING_PARKS_HISTOGRAM_PER_WORKER),
13925        Builtin::View(&MZ_SCHEDULING_PARKS_HISTOGRAM),
13926        Builtin::View(&MZ_SHOW_ALL_OBJECTS),
13927        Builtin::View(&MZ_SHOW_COLUMNS),
13928        Builtin::View(&MZ_SHOW_CLUSTERS),
13929        Builtin::View(&MZ_SHOW_SECRETS),
13930        Builtin::View(&MZ_SHOW_DATABASES),
13931        Builtin::View(&MZ_SHOW_SCHEMAS),
13932        Builtin::View(&MZ_SHOW_TABLES),
13933        Builtin::View(&MZ_SHOW_VIEWS),
13934        Builtin::View(&MZ_SHOW_TYPES),
13935        Builtin::View(&MZ_SHOW_ROLES),
13936        Builtin::View(&MZ_SHOW_CONNECTIONS),
13937        Builtin::View(&MZ_SHOW_SOURCES),
13938        Builtin::View(&MZ_SHOW_SINKS),
13939        Builtin::View(&MZ_SHOW_MATERIALIZED_VIEWS),
13940        Builtin::View(&MZ_SHOW_INDEXES),
13941        Builtin::View(&MZ_SHOW_CONTINUAL_TASKS),
13942        Builtin::View(&MZ_CLUSTER_REPLICA_HISTORY),
13943        Builtin::View(&MZ_CLUSTER_REPLICA_NAME_HISTORY),
13944        Builtin::View(&MZ_TIMEZONE_NAMES),
13945        Builtin::View(&MZ_TIMEZONE_ABBREVIATIONS),
13946        Builtin::View(&PG_NAMESPACE_ALL_DATABASES),
13947        Builtin::Index(&PG_NAMESPACE_ALL_DATABASES_IND),
13948        Builtin::View(&PG_NAMESPACE),
13949        Builtin::View(&PG_CLASS_ALL_DATABASES),
13950        Builtin::Index(&PG_CLASS_ALL_DATABASES_IND),
13951        Builtin::View(&PG_CLASS),
13952        Builtin::View(&PG_DEPEND),
13953        Builtin::View(&PG_DATABASE),
13954        Builtin::View(&PG_INDEX),
13955        Builtin::View(&PG_TYPE_ALL_DATABASES),
13956        Builtin::Index(&PG_TYPE_ALL_DATABASES_IND),
13957        Builtin::View(&PG_TYPE),
13958        Builtin::View(&PG_DESCRIPTION_ALL_DATABASES),
13959        Builtin::Index(&PG_DESCRIPTION_ALL_DATABASES_IND),
13960        Builtin::View(&PG_DESCRIPTION),
13961        Builtin::View(&PG_ATTRIBUTE_ALL_DATABASES),
13962        Builtin::Index(&PG_ATTRIBUTE_ALL_DATABASES_IND),
13963        Builtin::View(&PG_ATTRIBUTE),
13964        Builtin::View(&PG_PROC),
13965        Builtin::View(&PG_OPERATOR),
13966        Builtin::View(&PG_RANGE),
13967        Builtin::View(&PG_ENUM),
13968        Builtin::View(&PG_ATTRDEF_ALL_DATABASES),
13969        Builtin::Index(&PG_ATTRDEF_ALL_DATABASES_IND),
13970        Builtin::View(&PG_ATTRDEF),
13971        Builtin::View(&PG_SETTINGS),
13972        Builtin::View(&PG_AUTH_MEMBERS),
13973        Builtin::View(&PG_CONSTRAINT),
13974        Builtin::View(&PG_TABLES),
13975        Builtin::View(&PG_TABLESPACE),
13976        Builtin::View(&PG_ACCESS_METHODS),
13977        Builtin::View(&PG_LOCKS),
13978        Builtin::View(&PG_AUTHID),
13979        Builtin::View(&PG_ROLES),
13980        Builtin::View(&PG_USER),
13981        Builtin::View(&PG_VIEWS),
13982        Builtin::View(&PG_MATVIEWS),
13983        Builtin::View(&PG_COLLATION),
13984        Builtin::View(&PG_POLICY),
13985        Builtin::View(&PG_INHERITS),
13986        Builtin::View(&PG_AGGREGATE),
13987        Builtin::View(&PG_TRIGGER),
13988        Builtin::View(&PG_REWRITE),
13989        Builtin::View(&PG_EXTENSION),
13990        Builtin::View(&PG_EVENT_TRIGGER),
13991        Builtin::View(&PG_LANGUAGE),
13992        Builtin::View(&PG_SHDESCRIPTION),
13993        Builtin::View(&PG_INDEXES),
13994        Builtin::View(&PG_TIMEZONE_ABBREVS),
13995        Builtin::View(&PG_TIMEZONE_NAMES),
13996        Builtin::View(&INFORMATION_SCHEMA_APPLICABLE_ROLES),
13997        Builtin::View(&INFORMATION_SCHEMA_COLUMNS),
13998        Builtin::View(&INFORMATION_SCHEMA_ENABLED_ROLES),
13999        Builtin::View(&INFORMATION_SCHEMA_KEY_COLUMN_USAGE),
14000        Builtin::View(&INFORMATION_SCHEMA_REFERENTIAL_CONSTRAINTS),
14001        Builtin::View(&INFORMATION_SCHEMA_ROUTINES),
14002        Builtin::View(&INFORMATION_SCHEMA_SCHEMATA),
14003        Builtin::View(&INFORMATION_SCHEMA_TABLES),
14004        Builtin::View(&INFORMATION_SCHEMA_TABLE_CONSTRAINTS),
14005        Builtin::View(&INFORMATION_SCHEMA_TABLE_PRIVILEGES),
14006        Builtin::View(&INFORMATION_SCHEMA_ROLE_TABLE_GRANTS),
14007        Builtin::View(&INFORMATION_SCHEMA_TRIGGERS),
14008        Builtin::View(&INFORMATION_SCHEMA_VIEWS),
14009        Builtin::View(&INFORMATION_SCHEMA_CHARACTER_SETS),
14010        Builtin::View(&MZ_SHOW_ROLE_MEMBERS),
14011        Builtin::View(&MZ_SHOW_MY_ROLE_MEMBERS),
14012        Builtin::View(&MZ_SHOW_SYSTEM_PRIVILEGES),
14013        Builtin::View(&MZ_SHOW_MY_SYSTEM_PRIVILEGES),
14014        Builtin::View(&MZ_SHOW_CLUSTER_PRIVILEGES),
14015        Builtin::View(&MZ_SHOW_MY_CLUSTER_PRIVILEGES),
14016        Builtin::View(&MZ_SHOW_DATABASE_PRIVILEGES),
14017        Builtin::View(&MZ_SHOW_MY_DATABASE_PRIVILEGES),
14018        Builtin::View(&MZ_SHOW_SCHEMA_PRIVILEGES),
14019        Builtin::View(&MZ_SHOW_MY_SCHEMA_PRIVILEGES),
14020        Builtin::View(&MZ_SHOW_OBJECT_PRIVILEGES),
14021        Builtin::View(&MZ_SHOW_MY_OBJECT_PRIVILEGES),
14022        Builtin::View(&MZ_SHOW_ALL_PRIVILEGES),
14023        Builtin::View(&MZ_SHOW_ALL_MY_PRIVILEGES),
14024        Builtin::View(&MZ_SHOW_DEFAULT_PRIVILEGES),
14025        Builtin::View(&MZ_SHOW_MY_DEFAULT_PRIVILEGES),
14026        Builtin::Source(&MZ_SINK_STATUS_HISTORY),
14027        Builtin::View(&MZ_SINK_STATUSES),
14028        Builtin::Source(&MZ_SOURCE_STATUS_HISTORY),
14029        Builtin::Source(&MZ_AWS_PRIVATELINK_CONNECTION_STATUS_HISTORY),
14030        Builtin::View(&MZ_AWS_PRIVATELINK_CONNECTION_STATUSES),
14031        Builtin::Source(&MZ_STATEMENT_EXECUTION_HISTORY),
14032        Builtin::View(&MZ_STATEMENT_EXECUTION_HISTORY_REDACTED),
14033        Builtin::Source(&MZ_PREPARED_STATEMENT_HISTORY),
14034        Builtin::Source(&MZ_SESSION_HISTORY),
14035        Builtin::Source(&MZ_SQL_TEXT),
14036        Builtin::View(&MZ_SQL_TEXT_REDACTED),
14037        Builtin::View(&MZ_RECENT_SQL_TEXT),
14038        Builtin::View(&MZ_RECENT_SQL_TEXT_REDACTED),
14039        Builtin::Index(&MZ_RECENT_SQL_TEXT_IND),
14040        Builtin::View(&MZ_ACTIVITY_LOG_THINNED),
14041        Builtin::View(&MZ_RECENT_ACTIVITY_LOG_THINNED),
14042        Builtin::View(&MZ_RECENT_ACTIVITY_LOG),
14043        Builtin::View(&MZ_RECENT_ACTIVITY_LOG_REDACTED),
14044        Builtin::Index(&MZ_RECENT_ACTIVITY_LOG_THINNED_IND),
14045        Builtin::View(&MZ_SOURCE_STATUSES),
14046        Builtin::Source(&MZ_STATEMENT_LIFECYCLE_HISTORY),
14047        Builtin::Source(&MZ_STORAGE_SHARDS),
14048        Builtin::Source(&MZ_SOURCE_STATISTICS_RAW),
14049        Builtin::Source(&MZ_SINK_STATISTICS_RAW),
14050        Builtin::View(&MZ_SOURCE_STATISTICS_WITH_HISTORY),
14051        Builtin::Index(&MZ_SOURCE_STATISTICS_WITH_HISTORY_IND),
14052        Builtin::View(&MZ_SOURCE_STATISTICS),
14053        Builtin::Index(&MZ_SOURCE_STATISTICS_IND),
14054        Builtin::View(&MZ_SINK_STATISTICS),
14055        Builtin::Index(&MZ_SINK_STATISTICS_IND),
14056        Builtin::View(&MZ_STORAGE_USAGE),
14057        Builtin::Source(&MZ_FRONTIERS),
14058        Builtin::View(&MZ_GLOBAL_FRONTIERS),
14059        Builtin::Source(&MZ_WALLCLOCK_LAG_HISTORY),
14060        Builtin::View(&MZ_WALLCLOCK_GLOBAL_LAG_HISTORY),
14061        Builtin::View(&MZ_WALLCLOCK_GLOBAL_LAG_RECENT_HISTORY),
14062        Builtin::View(&MZ_WALLCLOCK_GLOBAL_LAG),
14063        Builtin::Source(&MZ_WALLCLOCK_GLOBAL_LAG_HISTOGRAM_RAW),
14064        Builtin::View(&MZ_WALLCLOCK_GLOBAL_LAG_HISTOGRAM),
14065        Builtin::Source(&MZ_MATERIALIZED_VIEW_REFRESHES),
14066        Builtin::Source(&MZ_COMPUTE_DEPENDENCIES),
14067        Builtin::View(&MZ_MATERIALIZATION_DEPENDENCIES),
14068        Builtin::View(&MZ_MATERIALIZATION_LAG),
14069        Builtin::View(&MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW),
14070        Builtin::View(&MZ_COMPUTE_ERROR_COUNTS_PER_WORKER),
14071        Builtin::View(&MZ_COMPUTE_ERROR_COUNTS),
14072        Builtin::Source(&MZ_COMPUTE_ERROR_COUNTS_RAW_UNIFIED),
14073        Builtin::Source(&MZ_COMPUTE_HYDRATION_TIMES),
14074        Builtin::Log(&MZ_COMPUTE_LIR_MAPPING_PER_WORKER),
14075        Builtin::View(&MZ_LIR_MAPPING),
14076        Builtin::Source(&MZ_COMPUTE_OPERATOR_HYDRATION_STATUSES),
14077        Builtin::Source(&MZ_CLUSTER_REPLICA_FRONTIERS),
14078        Builtin::View(&MZ_COMPUTE_HYDRATION_STATUSES),
14079        Builtin::View(&MZ_HYDRATION_STATUSES),
14080        Builtin::View(&MZ_SHOW_CLUSTER_REPLICAS),
14081        Builtin::View(&MZ_SHOW_NETWORK_POLICIES),
14082        Builtin::View(&MZ_CLUSTER_DEPLOYMENT_LINEAGE),
14083        Builtin::Index(&MZ_SHOW_DATABASES_IND),
14084        Builtin::Index(&MZ_SHOW_SCHEMAS_IND),
14085        Builtin::Index(&MZ_SHOW_CONNECTIONS_IND),
14086        Builtin::Index(&MZ_SHOW_TABLES_IND),
14087        Builtin::Index(&MZ_SHOW_SOURCES_IND),
14088        Builtin::Index(&MZ_SHOW_VIEWS_IND),
14089        Builtin::Index(&MZ_SHOW_MATERIALIZED_VIEWS_IND),
14090        Builtin::Index(&MZ_SHOW_SINKS_IND),
14091        Builtin::Index(&MZ_SHOW_TYPES_IND),
14092        Builtin::Index(&MZ_SHOW_ALL_OBJECTS_IND),
14093        Builtin::Index(&MZ_SHOW_INDEXES_IND),
14094        Builtin::Index(&MZ_SHOW_COLUMNS_IND),
14095        Builtin::Index(&MZ_SHOW_CLUSTERS_IND),
14096        Builtin::Index(&MZ_SHOW_CLUSTER_REPLICAS_IND),
14097        Builtin::Index(&MZ_SHOW_SECRETS_IND),
14098        Builtin::Index(&MZ_SHOW_ROLES_IND),
14099        Builtin::Index(&MZ_CLUSTERS_IND),
14100        Builtin::Index(&MZ_INDEXES_IND),
14101        Builtin::Index(&MZ_ROLES_IND),
14102        Builtin::Index(&MZ_SOURCES_IND),
14103        Builtin::Index(&MZ_SINKS_IND),
14104        Builtin::Index(&MZ_MATERIALIZED_VIEWS_IND),
14105        Builtin::Index(&MZ_CONTINUAL_TASKS_IND),
14106        Builtin::Index(&MZ_SOURCE_STATUSES_IND),
14107        Builtin::Index(&MZ_SOURCE_STATUS_HISTORY_IND),
14108        Builtin::Index(&MZ_SINK_STATUSES_IND),
14109        Builtin::Index(&MZ_SINK_STATUS_HISTORY_IND),
14110        Builtin::Index(&MZ_CLUSTER_REPLICAS_IND),
14111        Builtin::Index(&MZ_CLUSTER_REPLICA_SIZES_IND),
14112        Builtin::Index(&MZ_CLUSTER_REPLICA_STATUSES_IND),
14113        Builtin::Index(&MZ_CLUSTER_REPLICA_STATUS_HISTORY_IND),
14114        Builtin::Index(&MZ_CLUSTER_REPLICA_METRICS_IND),
14115        Builtin::Index(&MZ_CLUSTER_REPLICA_METRICS_HISTORY_IND),
14116        Builtin::Index(&MZ_CLUSTER_REPLICA_HISTORY_IND),
14117        Builtin::Index(&MZ_CLUSTER_REPLICA_NAME_HISTORY_IND),
14118        Builtin::Index(&MZ_OBJECT_LIFETIMES_IND),
14119        Builtin::Index(&MZ_OBJECT_HISTORY_IND),
14120        Builtin::Index(&MZ_OBJECT_DEPENDENCIES_IND),
14121        Builtin::Index(&MZ_COMPUTE_DEPENDENCIES_IND),
14122        Builtin::Index(&MZ_OBJECT_TRANSITIVE_DEPENDENCIES_IND),
14123        Builtin::Index(&MZ_FRONTIERS_IND),
14124        Builtin::Index(&MZ_WALLCLOCK_GLOBAL_LAG_RECENT_HISTORY_IND),
14125        Builtin::Index(&MZ_KAFKA_SOURCES_IND),
14126        Builtin::Index(&MZ_WEBHOOK_SOURCES_IND),
14127        Builtin::Index(&MZ_COMMENTS_IND),
14128        Builtin::Index(&MZ_DATABASES_IND),
14129        Builtin::Index(&MZ_SCHEMAS_IND),
14130        Builtin::Index(&MZ_CONNECTIONS_IND),
14131        Builtin::Index(&MZ_TABLES_IND),
14132        Builtin::Index(&MZ_TYPES_IND),
14133        Builtin::Index(&MZ_OBJECTS_IND),
14134        Builtin::Index(&MZ_COLUMNS_IND),
14135        Builtin::Index(&MZ_SECRETS_IND),
14136        Builtin::Index(&MZ_VIEWS_IND),
14137        Builtin::Index(&MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW_IND),
14138        Builtin::Index(&MZ_CLUSTER_DEPLOYMENT_LINEAGE_IND),
14139        Builtin::Index(&MZ_CLUSTER_REPLICA_FRONTIERS_IND),
14140        Builtin::Index(&MZ_COMPUTE_HYDRATION_TIMES_IND),
14141        Builtin::View(&MZ_RECENT_STORAGE_USAGE),
14142        Builtin::Index(&MZ_RECENT_STORAGE_USAGE_IND),
14143        Builtin::Connection(&MZ_ANALYTICS),
14144        Builtin::ContinualTask(&MZ_CLUSTER_REPLICA_METRICS_HISTORY_CT),
14145        Builtin::ContinualTask(&MZ_CLUSTER_REPLICA_STATUS_HISTORY_CT),
14146        Builtin::ContinualTask(&MZ_WALLCLOCK_LAG_HISTORY_CT),
14147        Builtin::View(&MZ_INDEX_ADVICE),
14148    ]);
14149
14150    builtins.extend(notice::builtins());
14151
14152    builtins
14153});
14154pub const BUILTIN_ROLES: &[&BuiltinRole] = &[
14155    &MZ_SYSTEM_ROLE,
14156    &MZ_SUPPORT_ROLE,
14157    &MZ_ANALYTICS_ROLE,
14158    &MZ_MONITOR_ROLE,
14159    &MZ_MONITOR_REDACTED,
14160];
14161pub const BUILTIN_CLUSTERS: &[&BuiltinCluster] = &[
14162    &MZ_SYSTEM_CLUSTER,
14163    &MZ_CATALOG_SERVER_CLUSTER,
14164    &MZ_PROBE_CLUSTER,
14165    &MZ_SUPPORT_CLUSTER,
14166    &MZ_ANALYTICS_CLUSTER,
14167];
14168pub const BUILTIN_CLUSTER_REPLICAS: &[&BuiltinClusterReplica] = &[
14169    &MZ_SYSTEM_CLUSTER_REPLICA,
14170    &MZ_CATALOG_SERVER_CLUSTER_REPLICA,
14171    &MZ_PROBE_CLUSTER_REPLICA,
14172];
14173
14174#[allow(non_snake_case)]
14175pub mod BUILTINS {
14176    use mz_sql::catalog::BuiltinsConfig;
14177
14178    use super::*;
14179
14180    pub fn logs() -> impl Iterator<Item = &'static BuiltinLog> {
14181        BUILTINS_STATIC.iter().filter_map(|b| match b {
14182            Builtin::Log(log) => Some(*log),
14183            _ => None,
14184        })
14185    }
14186
14187    pub fn types() -> impl Iterator<Item = &'static BuiltinType<NameReference>> {
14188        BUILTINS_STATIC.iter().filter_map(|b| match b {
14189            Builtin::Type(typ) => Some(*typ),
14190            _ => None,
14191        })
14192    }
14193
14194    pub fn views() -> impl Iterator<Item = &'static BuiltinView> {
14195        BUILTINS_STATIC.iter().filter_map(|b| match b {
14196            Builtin::View(view) => Some(*view),
14197            _ => None,
14198        })
14199    }
14200
14201    pub fn funcs() -> impl Iterator<Item = &'static BuiltinFunc> {
14202        BUILTINS_STATIC.iter().filter_map(|b| match b {
14203            Builtin::Func(func) => Some(func),
14204            _ => None,
14205        })
14206    }
14207
14208    pub fn iter(cfg: &BuiltinsConfig) -> impl Iterator<Item = &'static Builtin<NameReference>> {
14209        let include_continual_tasks = cfg.include_continual_tasks;
14210        BUILTINS_STATIC.iter().filter(move |x| match x {
14211            Builtin::ContinualTask(_) if !include_continual_tasks => false,
14212            _ => true,
14213        })
14214    }
14215}
14216
14217pub static BUILTIN_LOG_LOOKUP: LazyLock<HashMap<&'static str, &'static BuiltinLog>> =
14218    LazyLock::new(|| BUILTINS::logs().map(|log| (log.name, log)).collect());
14219/// Keys are builtin object description, values are the builtin index when sorted by dependency and
14220/// the builtin itself.
14221pub static BUILTIN_LOOKUP: LazyLock<
14222    HashMap<SystemObjectDescription, (usize, &'static Builtin<NameReference>)>,
14223> = LazyLock::new(|| {
14224    // BUILTIN_LOOKUP is only ever used for lookups by key, it's not iterated,
14225    // so it's safe to include all of them, regardless of BuiltinConfig. We
14226    // enforce this statically by using the mz_ore HashMap which disallows
14227    // iteration.
14228    BUILTINS_STATIC
14229        .iter()
14230        .enumerate()
14231        .map(|(idx, builtin)| {
14232            (
14233                SystemObjectDescription {
14234                    schema_name: builtin.schema().to_string(),
14235                    object_type: builtin.catalog_item_type(),
14236                    object_name: builtin.name().to_string(),
14237                },
14238                (idx, builtin),
14239            )
14240        })
14241        .collect()
14242});
14243
14244#[mz_ore::test]
14245#[cfg_attr(miri, ignore)] // unsupported operation: can't call foreign function `rust_psm_stack_pointer` on OS `linux`
14246fn test_builtin_type_schema() {
14247    use mz_pgrepr::oid::FIRST_MATERIALIZE_OID;
14248
14249    for typ in BUILTINS::types() {
14250        if typ.oid < FIRST_MATERIALIZE_OID {
14251            assert_eq!(
14252                typ.schema, PG_CATALOG_SCHEMA,
14253                "{typ:?} should be in {PG_CATALOG_SCHEMA} schema"
14254            );
14255        } else {
14256            // `mz_pgrepr::Type` resolution relies on all non-PG types existing in the mz_catalog
14257            // schema.
14258            assert_eq!(
14259                typ.schema, MZ_CATALOG_SCHEMA,
14260                "{typ:?} should be in {MZ_CATALOG_SCHEMA} schema"
14261            );
14262        }
14263    }
14264}