feat: upgraded pg_catalog support (#6918)

* refactor: add datafusion-postgres dependency

* refactor: move and include pg_catalog udfs

* chore: update upstream

* feat: register table function pg_get_keywords

* feat: bridge CatalogInfo for our CatalogManager

Signed-off-by: Ning Sun <sunning@greptime.com>

* feat: convert pg_catalog table to our system table

* feat: bridge system catalog with datafusion-postgres

Signed-off-by: Ning Sun <sunning@greptime.com>

* feat: add more udfs

* feat: add compatibility rewriter to postgres handler

* fix: various fix

* fmt: fix

* fix: use functions from pg_catalog library

* fmt

* fix: sqlness runner

Signed-off-by: Ning Sun <sunning@greptime.com>

* test: adopt arrow 56.0 to 56.1 memory size change

* fix: add additional udfs

* chore: format

* refactor: return None when creating system table failed

Signed-off-by: Ning Sun <sunning@greptime.com>

* chore: provide safety comments about expect usage

---------

Signed-off-by: Ning Sun <sunning@greptime.com>
This commit is contained in:
Ning Sun
2025-09-25 12:05:34 +08:00
committed by GitHub
parent 91a727790d
commit 964dc254aa
31 changed files with 1294 additions and 1412 deletions

145
Cargo.lock generated
View File

@@ -300,9 +300,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
[[package]]
name = "arrow"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd798aea3553913a5986813e9c6ad31a2d2b04e931fe8ea4a37155eb541cebb5"
checksum = "c26b57282a08ae92f727497805122fec964c6245cfa0e13f0e75452eaf3bc41f"
dependencies = [
"arrow-arith",
"arrow-array",
@@ -321,9 +321,9 @@ dependencies = [
[[package]]
name = "arrow-arith"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "508dafb53e5804a238cab7fd97a59ddcbfab20cc4d9814b1ab5465b9fa147f2e"
checksum = "cebf38ca279120ff522f4954b81a39527425b6e9f615e6b72842f4de1ffe02b8"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -335,9 +335,9 @@ dependencies = [
[[package]]
name = "arrow-array"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2730bc045d62bb2e53ef8395b7d4242f5c8102f41ceac15e8395b9ac3d08461"
checksum = "744109142cdf8e7b02795e240e20756c2a782ac9180d4992802954a8f871c0de"
dependencies = [
"ahash 0.8.12",
"arrow-buffer",
@@ -352,9 +352,9 @@ dependencies = [
[[package]]
name = "arrow-buffer"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54295b93beb702ee9a6f6fbced08ad7f4d76ec1c297952d4b83cf68755421d1d"
checksum = "601bb103c4c374bcd1f62c66bcea67b42a2ee91a690486c37d4c180236f11ccc"
dependencies = [
"bytes",
"half",
@@ -363,9 +363,9 @@ dependencies = [
[[package]]
name = "arrow-cast"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67e8bcb7dc971d779a7280593a1bf0c2743533b8028909073e804552e85e75b5"
checksum = "eed61d9d73eda8df9e3014843def37af3050b5080a9acbe108f045a316d5a0be"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -384,9 +384,9 @@ dependencies = [
[[package]]
name = "arrow-csv"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "673fd2b5fb57a1754fdbfac425efd7cf54c947ac9950c1cce86b14e248f1c458"
checksum = "fa95b96ce0c06b4d33ac958370db8c0d31e88e54f9d6e08b0353d18374d9f991"
dependencies = [
"arrow-array",
"arrow-cast",
@@ -399,9 +399,9 @@ dependencies = [
[[package]]
name = "arrow-data"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97c22fe3da840039c69e9f61f81e78092ea36d57037b4900151f063615a2f6b4"
checksum = "43407f2c6ba2367f64d85d4603d6fb9c4b92ed79d2ffd21021b37efa96523e12"
dependencies = [
"arrow-buffer",
"arrow-schema",
@@ -411,9 +411,9 @@ dependencies = [
[[package]]
name = "arrow-flight"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6808d235786b721e49e228c44dd94242f2e8b46b7e95b233b0733c46e758bfee"
checksum = "d7c66c5e4a7aedc2bfebffeabc2116d76adb22e08d230b968b995da97f8b11ca"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -430,14 +430,15 @@ dependencies = [
[[package]]
name = "arrow-ipc"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "778de14c5a69aedb27359e3dd06dd5f9c481d5f6ee9fbae912dba332fd64636b"
checksum = "e4b0487c4d2ad121cbc42c4db204f1509f8618e589bc77e635e9c40b502e3b90"
dependencies = [
"arrow-array",
"arrow-buffer",
"arrow-data",
"arrow-schema",
"arrow-select",
"flatbuffers",
"lz4_flex",
"zstd 0.13.3",
@@ -445,9 +446,9 @@ dependencies = [
[[package]]
name = "arrow-json"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3860db334fe7b19fcf81f6b56f8d9d95053f3839ffe443d56b5436f7a29a1794"
checksum = "26d747573390905905a2dc4c5a61a96163fe2750457f90a04ee2a88680758c79"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -467,9 +468,9 @@ dependencies = [
[[package]]
name = "arrow-ord"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "425fa0b42a39d3ff55160832e7c25553e7f012c3f187def3d70313e7a29ba5d9"
checksum = "c142a147dceb59d057bad82400f1693847c80dca870d008bf7b91caf902810ae"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -478,11 +479,25 @@ dependencies = [
"arrow-select",
]
[[package]]
name = "arrow-pg"
version = "0.5.0"
source = "git+https://github.com/datafusion-contrib/datafusion-postgres?rev=412dad6b88ca83d11498338896044319ddac676c#412dad6b88ca83d11498338896044319ddac676c"
dependencies = [
"bytes",
"chrono",
"datafusion",
"futures",
"pgwire",
"postgres-types",
"rust_decimal",
]
[[package]]
name = "arrow-row"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df9c9423c9e71abd1b08a7f788fcd203ba2698ac8e72a1f236f1faa1a06a7414"
checksum = "dac6620667fccdab4204689ca173bd84a15de6bb6b756c3a8764d4d7d0c2fc04"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -493,9 +508,9 @@ dependencies = [
[[package]]
name = "arrow-schema"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85fa1babc4a45fdc64a92175ef51ff00eba5ebbc0007962fecf8022ac1c6ce28"
checksum = "dfa93af9ff2bb80de539e6eb2c1c8764abd0f4b73ffb0d7c82bf1f9868785e66"
dependencies = [
"serde",
"serde_json",
@@ -503,9 +518,9 @@ dependencies = [
[[package]]
name = "arrow-select"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8854d15f1cf5005b4b358abeb60adea17091ff5bdd094dca5d3f73787d81170"
checksum = "be8b2e0052cd20d36d64f32640b68a5ab54d805d24a473baee5d52017c85536c"
dependencies = [
"ahash 0.8.12",
"arrow-array",
@@ -517,9 +532,9 @@ dependencies = [
[[package]]
name = "arrow-string"
version = "56.0.0"
version = "56.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c477e8b89e1213d5927a2a84a72c384a9bf4dd0dbf15f9fd66d821aafd9e95e"
checksum = "c2155e26e17f053c8975c546fc70cf19c00542f9abf43c23a88a46ef7204204f"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -1450,6 +1465,7 @@ dependencies = [
"common-workload",
"dashmap",
"datafusion",
"datafusion-postgres",
"datatypes",
"futures",
"futures-util",
@@ -1464,7 +1480,6 @@ dependencies = [
"prometheus",
"promql-parser",
"rand 0.9.1",
"rustc-hash 2.1.1",
"serde",
"serde_json",
"session",
@@ -1974,7 +1989,7 @@ checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81"
dependencies = [
"serde",
"termcolor",
"unicode-width 0.2.1",
"unicode-width 0.1.14",
]
[[package]]
@@ -2183,6 +2198,7 @@ dependencies = [
"datafusion-expr",
"datafusion-functions-aggregate-common",
"datafusion-physical-expr",
"datafusion-postgres",
"datatypes",
"derive_more",
"futures",
@@ -3794,6 +3810,28 @@ dependencies = [
"tokio",
]
[[package]]
name = "datafusion-postgres"
version = "0.9.0"
source = "git+https://github.com/datafusion-contrib/datafusion-postgres?rev=412dad6b88ca83d11498338896044319ddac676c#412dad6b88ca83d11498338896044319ddac676c"
dependencies = [
"arrow-pg",
"async-trait",
"bytes",
"chrono",
"datafusion",
"futures",
"getset",
"log",
"pgwire",
"postgres-types",
"rust_decimal",
"rustls-pemfile",
"rustls-pki-types",
"tokio",
"tokio-rustls",
]
[[package]]
name = "datafusion-pruning"
version = "49.0.0"
@@ -5276,6 +5314,18 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "getset"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912"
dependencies = [
"proc-macro-error2",
"proc-macro2",
"quote",
"syn 2.0.104",
]
[[package]]
name = "gimli"
version = "0.31.1"
@@ -5890,7 +5940,7 @@ dependencies = [
"js-sys",
"log",
"wasm-bindgen",
"windows-core 0.61.2",
"windows-core 0.57.0",
]
[[package]]
@@ -9166,6 +9216,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddf403a6ee31cf7f2217b2bd8447cb13dbb6c268d7e81501bc78a4d3daafd294"
dependencies = [
"async-trait",
"base64 0.22.1",
"bytes",
"chrono",
"derive-new",
@@ -9178,10 +9229,12 @@ dependencies = [
"ring",
"rust_decimal",
"rustls-pki-types",
"stringprep",
"thiserror 2.0.12",
"tokio",
"tokio-rustls",
"tokio-util",
"x509-certificate 0.24.0",
]
[[package]]
@@ -10924,9 +10977,9 @@ dependencies = [
[[package]]
name = "rust_decimal"
version = "1.37.2"
version = "1.38.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b203a6425500a03e0919c42d3c47caca51e79f1132046626d2c8871c5092035d"
checksum = "c8975fc98059f365204d635119cf9c5a60ae67b841ed49b5422a9a7e56cdfac0"
dependencies = [
"arrayvec",
"borsh",
@@ -11548,6 +11601,7 @@ dependencies = [
"datafusion",
"datafusion-common",
"datafusion-expr",
"datafusion-postgres",
"datatypes",
"derive_builder 0.20.2",
"futures",
@@ -13367,7 +13421,7 @@ dependencies = [
"tokio",
"tokio-postgres",
"tokio-rustls",
"x509-certificate",
"x509-certificate 0.23.1",
]
[[package]]
@@ -15008,6 +15062,25 @@ dependencies = [
"zeroize",
]
[[package]]
name = "x509-certificate"
version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e57b9f8bcae7c1f36479821ae826d75050c60ce55146fd86d3553ed2573e2762"
dependencies = [
"bcder",
"bytes",
"chrono",
"der",
"hex",
"pem",
"ring",
"signature",
"spki",
"thiserror 1.0.69",
"zeroize",
]
[[package]]
name = "xattr"
version = "1.5.1"

View File

@@ -123,17 +123,18 @@ clap = { version = "4.4", features = ["derive"] }
config = "0.13.0"
crossbeam-utils = "0.8"
dashmap = "6.1"
datafusion = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-common = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-expr = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-functions = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-functions-aggregate-common = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-optimizer = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion = "49"
datafusion-common = "49"
datafusion-expr = "49"
datafusion-functions = "49"
datafusion-functions-aggregate-common = "49"
datafusion-optimizer = "49"
datafusion-orc = { git = "https://github.com/GreptimeTeam/datafusion-orc", rev = "a0a5f902158f153119316eaeec868cff3fc8a99d" }
datafusion-physical-expr = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-physical-plan = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-sql = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-substrait = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-physical-expr = "49"
datafusion-physical-plan = "49"
datafusion-postgres = { git = "https://github.com/datafusion-contrib/datafusion-postgres", rev = "412dad6b88ca83d11498338896044319ddac676c" }
datafusion-sql = "49"
datafusion-substrait = "49"
deadpool = "0.12"
deadpool-postgres = "0.14"
derive_builder = "0.20"
@@ -175,6 +176,9 @@ opentelemetry-proto = { version = "0.30", features = [
"logs",
] }
ordered-float = { version = "4.3", features = ["serde"] }
otel-arrow-rust = { git = "https://github.com/GreptimeTeam/otel-arrow", rev = "2d64b7c0fa95642028a8205b36fe9ea0b023ec59", features = [
"server",
] }
parking_lot = "0.12"
parquet = { version = "56.0", default-features = false, features = ["arrow", "async", "object_store"] }
paste = "1.0"
@@ -297,9 +301,6 @@ mito-codec = { path = "src/mito-codec" }
mito2 = { path = "src/mito2" }
object-store = { path = "src/object-store" }
operator = { path = "src/operator" }
otel-arrow-rust = { git = "https://github.com/GreptimeTeam/otel-arrow", rev = "2d64b7c0fa95642028a8205b36fe9ea0b023ec59", features = [
"server",
] }
partition = { path = "src/partition" }
pipeline = { path = "src/pipeline" }
plugins = { path = "src/plugins" }
@@ -319,6 +320,18 @@ table = { path = "src/table" }
git = "https://github.com/GreptimeTeam/greptime-meter.git"
rev = "5618e779cf2bb4755b499c630fba4c35e91898cb"
[patch.crates-io]
datafusion = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-common = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-expr = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-functions = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-functions-aggregate-common = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-optimizer = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-physical-expr = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-physical-plan = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-sql = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
datafusion-substrait = { git = "https://github.com/GreptimeTeam/datafusion.git", rev = "7d5214512740b4dfb742b6b3d91ed9affcc2c9d0" }
[profile.release]
debug = 1

View File

@@ -35,6 +35,7 @@ common-version.workspace = true
common-workload.workspace = true
dashmap.workspace = true
datafusion.workspace = true
datafusion-postgres.workspace = true
datatypes.workspace = true
futures.workspace = true
futures-util.workspace = true
@@ -48,7 +49,6 @@ paste.workspace = true
prometheus.workspace = true
promql-parser.workspace = true
rand.workspace = true
rustc-hash.workspace = true
serde.workspace = true
serde_json.workspace = true
session.workspace = true

View File

@@ -12,53 +12,41 @@
// See the License for the specific language governing permissions and
// limitations under the License.
mod pg_catalog_memory_table;
mod pg_class;
mod pg_database;
mod pg_namespace;
mod table_names;
use std::collections::HashMap;
use std::sync::{Arc, LazyLock, Weak};
use std::sync::{Arc, Weak};
use common_catalog::consts::{self, DEFAULT_CATALOG_NAME, DEFAULT_SCHEMA_NAME, PG_CATALOG_NAME};
use datatypes::schema::ColumnSchema;
use lazy_static::lazy_static;
use paste::paste;
use pg_catalog_memory_table::get_schema_columns;
use pg_class::PGClass;
use pg_database::PGDatabase;
use pg_namespace::PGNamespace;
use session::context::{Channel, QueryContext};
use arrow_schema::SchemaRef;
use async_trait::async_trait;
use common_catalog::consts::{DEFAULT_CATALOG_NAME, PG_CATALOG_NAME, PG_CATALOG_TABLE_ID_START};
use common_error::ext::BoxedError;
use common_recordbatch::SendableRecordBatchStream;
use common_recordbatch::adapter::RecordBatchStreamAdapter;
use common_telemetry::warn;
use datafusion::datasource::TableType;
use datafusion::error::DataFusionError;
use datafusion::execution::TaskContext;
use datafusion::physical_plan::stream::RecordBatchStreamAdapter as DfRecordBatchStreamAdapter;
use datafusion_postgres::pg_catalog::catalog_info::CatalogInfo;
use datafusion_postgres::pg_catalog::{
PgCatalogSchemaProvider, PgCatalogStaticTables, PgCatalogTable,
};
use snafu::ResultExt;
use store_api::storage::ScanRequest;
use table::TableRef;
pub use table_names::*;
use table::metadata::TableId;
use self::pg_namespace::oid_map::{PGNamespaceOidMap, PGNamespaceOidMapRef};
use crate::CatalogManager;
use crate::system_schema::memory_table::MemoryTable;
use crate::system_schema::utils::tables::u32_column;
use crate::system_schema::{SystemSchemaProvider, SystemSchemaProviderInner, SystemTableRef};
lazy_static! {
static ref MEMORY_TABLES: &'static [&'static str] = &[table_names::PG_TYPE];
}
/// The column name for the OID column.
/// The OID column is a unique identifier of type u32 for each object in the database.
const OID_COLUMN_NAME: &str = "oid";
fn oid_column() -> ColumnSchema {
u32_column(OID_COLUMN_NAME)
}
use crate::error::{InternalSnafu, ProjectSchemaSnafu, Result};
use crate::system_schema::{
SystemSchemaProvider, SystemSchemaProviderInner, SystemTable, SystemTableRef,
};
/// [`PGCatalogProvider`] is the provider for a schema named `pg_catalog`, it is not a catalog.
pub struct PGCatalogProvider {
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
inner: PgCatalogSchemaProvider<CatalogManagerWrapper>,
tables: HashMap<String, TableRef>,
// Workaround to store mapping of schema_name to a numeric id
namespace_oid_map: PGNamespaceOidMapRef,
table_ids: HashMap<&'static str, u32>,
}
impl SystemSchemaProvider for PGCatalogProvider {
@@ -69,30 +57,33 @@ impl SystemSchemaProvider for PGCatalogProvider {
}
}
// TODO(j0hn50n133): Not sure whether to avoid duplication with `information_schema` or not.
macro_rules! setup_memory_table {
($name: expr) => {
paste! {
{
let (schema, columns) = get_schema_columns($name);
Some(Arc::new(MemoryTable::new(
consts::[<PG_CATALOG_ $name _TABLE_ID>],
$name,
schema,
columns
)) as _)
}
}
};
}
impl PGCatalogProvider {
pub fn new(catalog_name: String, catalog_manager: Weak<dyn CatalogManager>) -> Self {
// safe to expect/unwrap because it contains only schema read, this can
// be ensured by sqlness tests
let static_tables =
PgCatalogStaticTables::try_new().expect("Failed to initialize static tables");
let inner = PgCatalogSchemaProvider::try_new(
CatalogManagerWrapper {
catalog_name: catalog_name.clone(),
catalog_manager,
},
Arc::new(static_tables),
)
.expect("Failed to initialize PgCatalogSchemaProvider");
let mut table_ids = HashMap::new();
let mut table_id = PG_CATALOG_TABLE_ID_START;
for name in datafusion_postgres::pg_catalog::PG_CATALOG_TABLES {
table_ids.insert(*name, table_id);
table_id += 1;
}
let mut provider = Self {
catalog_name,
catalog_manager,
inner,
tables: HashMap::new(),
namespace_oid_map: Arc::new(PGNamespaceOidMap::new()),
table_ids,
};
provider.build_tables();
provider
@@ -102,23 +93,13 @@ impl PGCatalogProvider {
// SECURITY NOTE:
// Must follow the same security rules as [`InformationSchemaProvider::build_tables`].
let mut tables = HashMap::new();
// TODO(J0HN50N133): modeling the table_name as a enum type to get rid of expect/unwrap here
// It's safe to unwrap here because we are sure that the constants have been handle correctly inside system_table.
for name in MEMORY_TABLES.iter() {
tables.insert(name.to_string(), self.build_table(name).expect(name));
for name in datafusion_postgres::pg_catalog::PG_CATALOG_TABLES {
if let Some(table) = self.build_table(name) {
tables.insert(name.to_string(), table);
}
}
tables.insert(
PG_NAMESPACE.to_string(),
self.build_table(PG_NAMESPACE).expect(PG_NAMESPACE),
);
tables.insert(
PG_CLASS.to_string(),
self.build_table(PG_CLASS).expect(PG_NAMESPACE),
);
tables.insert(
PG_DATABASE.to_string(),
self.build_table(PG_DATABASE).expect(PG_DATABASE),
);
self.tables = tables;
}
}
@@ -129,24 +110,26 @@ impl SystemSchemaProviderInner for PGCatalogProvider {
}
fn system_table(&self, name: &str) -> Option<SystemTableRef> {
match name {
table_names::PG_TYPE => setup_memory_table!(PG_TYPE),
table_names::PG_NAMESPACE => Some(Arc::new(PGNamespace::new(
self.catalog_name.clone(),
self.catalog_manager.clone(),
self.namespace_oid_map.clone(),
))),
table_names::PG_CLASS => Some(Arc::new(PGClass::new(
self.catalog_name.clone(),
self.catalog_manager.clone(),
self.namespace_oid_map.clone(),
))),
table_names::PG_DATABASE => Some(Arc::new(PGDatabase::new(
self.catalog_name.clone(),
self.catalog_manager.clone(),
self.namespace_oid_map.clone(),
))),
_ => None,
if let Some((table_name, table_id)) = self.table_ids.get_key_value(name) {
let table = self.inner.build_table_by_name(name).expect(name);
if let Some(table) = table {
if let Ok(system_table) = DFTableProviderAsSystemTable::try_new(
*table_id,
table_name,
table::metadata::TableType::Temporary,
table,
) {
Some(Arc::new(system_table))
} else {
warn!("failed to create pg_catalog system table {}", name);
None
}
} else {
None
}
} else {
None
}
}
@@ -155,11 +138,177 @@ impl SystemSchemaProviderInner for PGCatalogProvider {
}
}
/// Provide query context to call the [`CatalogManager`]'s method.
static PG_QUERY_CTX: LazyLock<QueryContext> = LazyLock::new(|| {
QueryContext::with_channel(DEFAULT_CATALOG_NAME, DEFAULT_SCHEMA_NAME, Channel::Postgres)
});
fn query_ctx() -> Option<&'static QueryContext> {
Some(&PG_QUERY_CTX)
#[derive(Clone)]
pub struct CatalogManagerWrapper {
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
}
impl CatalogManagerWrapper {
fn catalog_manager(&self) -> std::result::Result<Arc<dyn CatalogManager>, DataFusionError> {
self.catalog_manager.upgrade().ok_or_else(|| {
DataFusionError::Internal("Failed to access catalog manager".to_string())
})
}
}
impl std::fmt::Debug for CatalogManagerWrapper {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("CatalogManagerWrapper").finish()
}
}
#[async_trait]
impl CatalogInfo for CatalogManagerWrapper {
async fn catalog_names(&self) -> std::result::Result<Vec<String>, DataFusionError> {
if self.catalog_name == DEFAULT_CATALOG_NAME {
CatalogManager::catalog_names(self.catalog_manager()?.as_ref())
.await
.map_err(|e| DataFusionError::External(Box::new(e)))
} else {
Ok(vec![self.catalog_name.to_string()])
}
}
async fn schema_names(
&self,
catalog_name: &str,
) -> std::result::Result<Option<Vec<String>>, DataFusionError> {
self.catalog_manager()?
.schema_names(catalog_name, None)
.await
.map(Some)
.map_err(|e| DataFusionError::External(Box::new(e)))
}
async fn table_names(
&self,
catalog_name: &str,
schema_name: &str,
) -> std::result::Result<Option<Vec<String>>, DataFusionError> {
self.catalog_manager()?
.table_names(catalog_name, schema_name, None)
.await
.map(Some)
.map_err(|e| DataFusionError::External(Box::new(e)))
}
async fn table_schema(
&self,
catalog_name: &str,
schema_name: &str,
table_name: &str,
) -> std::result::Result<Option<SchemaRef>, DataFusionError> {
let table = self
.catalog_manager()?
.table(catalog_name, schema_name, table_name, None)
.await
.map_err(|e| DataFusionError::External(Box::new(e)))?;
Ok(table.map(|t| t.schema().arrow_schema().clone()))
}
async fn table_type(
&self,
catalog_name: &str,
schema_name: &str,
table_name: &str,
) -> std::result::Result<Option<TableType>, DataFusionError> {
let table = self
.catalog_manager()?
.table(catalog_name, schema_name, table_name, None)
.await
.map_err(|e| DataFusionError::External(Box::new(e)))?;
Ok(table.map(|t| t.table_type().into()))
}
}
struct DFTableProviderAsSystemTable {
pub table_id: TableId,
pub table_name: &'static str,
pub table_type: table::metadata::TableType,
pub schema: Arc<datatypes::schema::Schema>,
pub table_provider: PgCatalogTable,
}
impl DFTableProviderAsSystemTable {
pub fn try_new(
table_id: TableId,
table_name: &'static str,
table_type: table::metadata::TableType,
table_provider: PgCatalogTable,
) -> Result<Self> {
let arrow_schema = table_provider.schema();
let schema = Arc::new(arrow_schema.try_into().context(ProjectSchemaSnafu)?);
Ok(Self {
table_id,
table_name,
table_type,
schema,
table_provider,
})
}
}
impl SystemTable for DFTableProviderAsSystemTable {
fn table_id(&self) -> TableId {
self.table_id
}
fn table_name(&self) -> &'static str {
self.table_name
}
fn schema(&self) -> Arc<datatypes::schema::Schema> {
self.schema.clone()
}
fn table_type(&self) -> table::metadata::TableType {
self.table_type
}
fn to_stream(&self, _request: ScanRequest) -> Result<SendableRecordBatchStream> {
match &self.table_provider {
PgCatalogTable::Static(table) => {
let schema = self.schema.arrow_schema().clone();
let data = table
.data()
.iter()
.map(|rb| Ok(rb.clone()))
.collect::<Vec<_>>();
let stream = Box::pin(DfRecordBatchStreamAdapter::new(
schema,
futures::stream::iter(data),
));
Ok(Box::pin(
RecordBatchStreamAdapter::try_new(stream)
.map_err(BoxedError::new)
.context(InternalSnafu)?,
))
}
PgCatalogTable::Dynamic(table) => {
let stream = table.execute(Arc::new(TaskContext::default()));
Ok(Box::pin(
RecordBatchStreamAdapter::try_new(stream)
.map_err(BoxedError::new)
.context(InternalSnafu)?,
))
}
PgCatalogTable::Empty(_) => {
let schema = self.schema.arrow_schema().clone();
let stream = Box::pin(DfRecordBatchStreamAdapter::new(
schema,
futures::stream::iter(vec![]),
));
Ok(Box::pin(
RecordBatchStreamAdapter::try_new(stream)
.map_err(BoxedError::new)
.context(InternalSnafu)?,
))
}
}
}
}

View File

@@ -1,69 +0,0 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::sync::Arc;
use datatypes::schema::{ColumnSchema, Schema, SchemaRef};
use datatypes::vectors::{Int16Vector, StringVector, UInt32Vector, VectorRef};
use crate::memory_table_cols;
use crate::system_schema::pg_catalog::oid_column;
use crate::system_schema::pg_catalog::table_names::PG_TYPE;
use crate::system_schema::utils::tables::{i16_column, string_column};
fn pg_type_schema_columns() -> (Vec<ColumnSchema>, Vec<VectorRef>) {
// TODO(j0hn50n133): acquire this information from `DataType` instead of hardcoding it to avoid regression.
memory_table_cols!(
[oid, typname, typlen],
[
(1, "String", -1),
(2, "Binary", -1),
(3, "Int8", 1),
(4, "Int16", 2),
(5, "Int32", 4),
(6, "Int64", 8),
(7, "UInt8", 1),
(8, "UInt16", 2),
(9, "UInt32", 4),
(10, "UInt64", 8),
(11, "Float32", 4),
(12, "Float64", 8),
(13, "Decimal", 16),
(14, "Date", 4),
(15, "DateTime", 8),
(16, "Timestamp", 8),
(17, "Time", 8),
(18, "Duration", 8),
(19, "Interval", 16),
(20, "List", -1),
]
);
(
// not quiet identical with pg, we only follow the definition in pg
vec![oid_column(), string_column("typname"), i16_column("typlen")],
vec![
Arc::new(UInt32Vector::from_vec(oid)), // oid
Arc::new(StringVector::from(typname)),
Arc::new(Int16Vector::from_vec(typlen)), // typlen in bytes
],
)
}
pub(super) fn get_schema_columns(table_name: &str) -> (SchemaRef, Vec<VectorRef>) {
let (column_schemas, columns): (_, Vec<VectorRef>) = match table_name {
PG_TYPE => pg_type_schema_columns(),
_ => unreachable!("Unknown table in pg_catalog: {}", table_name),
};
(Arc::new(Schema::new(column_schemas)), columns)
}

View File

@@ -1,276 +0,0 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::fmt;
use std::sync::{Arc, Weak};
use arrow_schema::SchemaRef as ArrowSchemaRef;
use common_catalog::consts::PG_CATALOG_PG_CLASS_TABLE_ID;
use common_error::ext::BoxedError;
use common_recordbatch::adapter::RecordBatchStreamAdapter;
use common_recordbatch::{DfSendableRecordBatchStream, RecordBatch};
use datafusion::execution::TaskContext;
use datafusion::physical_plan::stream::RecordBatchStreamAdapter as DfRecordBatchStreamAdapter;
use datafusion::physical_plan::streaming::PartitionStream as DfPartitionStream;
use datatypes::scalars::ScalarVectorBuilder;
use datatypes::schema::{Schema, SchemaRef};
use datatypes::value::Value;
use datatypes::vectors::{StringVectorBuilder, UInt32VectorBuilder, VectorRef};
use futures::TryStreamExt;
use snafu::{OptionExt, ResultExt};
use store_api::storage::ScanRequest;
use table::metadata::TableType;
use crate::CatalogManager;
use crate::error::{
CreateRecordBatchSnafu, InternalSnafu, Result, UpgradeWeakCatalogManagerRefSnafu,
};
use crate::information_schema::Predicates;
use crate::system_schema::SystemTable;
use crate::system_schema::pg_catalog::pg_namespace::oid_map::PGNamespaceOidMapRef;
use crate::system_schema::pg_catalog::{OID_COLUMN_NAME, PG_CLASS, query_ctx};
use crate::system_schema::utils::tables::{string_column, u32_column};
// === column name ===
pub const RELNAME: &str = "relname";
pub const RELNAMESPACE: &str = "relnamespace";
pub const RELKIND: &str = "relkind";
pub const RELOWNER: &str = "relowner";
// === enum value of relkind ===
pub const RELKIND_TABLE: &str = "r";
pub const RELKIND_VIEW: &str = "v";
/// The initial capacity of the vector builders.
const INIT_CAPACITY: usize = 42;
/// The dummy owner id for the namespace.
const DUMMY_OWNER_ID: u32 = 0;
/// The `pg_catalog.pg_class` table implementation.
pub(super) struct PGClass {
schema: SchemaRef,
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
// Workaround to convert schema_name to a numeric id
namespace_oid_map: PGNamespaceOidMapRef,
}
impl PGClass {
pub(super) fn new(
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
namespace_oid_map: PGNamespaceOidMapRef,
) -> Self {
Self {
schema: Self::schema(),
catalog_name,
catalog_manager,
namespace_oid_map,
}
}
fn schema() -> SchemaRef {
Arc::new(Schema::new(vec![
u32_column(OID_COLUMN_NAME),
string_column(RELNAME),
u32_column(RELNAMESPACE),
string_column(RELKIND),
u32_column(RELOWNER),
]))
}
fn builder(&self) -> PGClassBuilder {
PGClassBuilder::new(
self.schema.clone(),
self.catalog_name.clone(),
self.catalog_manager.clone(),
self.namespace_oid_map.clone(),
)
}
}
impl fmt::Debug for PGClass {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("PGClass")
.field("schema", &self.schema)
.field("catalog_name", &self.catalog_name)
.finish()
}
}
impl SystemTable for PGClass {
fn table_id(&self) -> table::metadata::TableId {
PG_CATALOG_PG_CLASS_TABLE_ID
}
fn table_name(&self) -> &'static str {
PG_CLASS
}
fn schema(&self) -> SchemaRef {
self.schema.clone()
}
fn to_stream(
&self,
request: ScanRequest,
) -> Result<common_recordbatch::SendableRecordBatchStream> {
let schema = self.schema.arrow_schema().clone();
let mut builder = self.builder();
let stream = Box::pin(DfRecordBatchStreamAdapter::new(
schema,
futures::stream::once(async move {
builder
.make_class(Some(request))
.await
.map(|x| x.into_df_record_batch())
.map_err(Into::into)
}),
));
Ok(Box::pin(
RecordBatchStreamAdapter::try_new(stream)
.map_err(BoxedError::new)
.context(InternalSnafu)?,
))
}
}
impl DfPartitionStream for PGClass {
fn schema(&self) -> &ArrowSchemaRef {
self.schema.arrow_schema()
}
fn execute(&self, _: Arc<TaskContext>) -> DfSendableRecordBatchStream {
let schema = self.schema.arrow_schema().clone();
let mut builder = self.builder();
Box::pin(DfRecordBatchStreamAdapter::new(
schema,
futures::stream::once(async move {
builder
.make_class(None)
.await
.map(|x| x.into_df_record_batch())
.map_err(Into::into)
}),
))
}
}
/// Builds the `pg_catalog.pg_class` table row by row
/// TODO(J0HN50N133): `relowner` is always the [`DUMMY_OWNER_ID`] because we don't have users.
/// Once we have user system, make it the actual owner of the table.
struct PGClassBuilder {
schema: SchemaRef,
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
namespace_oid_map: PGNamespaceOidMapRef,
oid: UInt32VectorBuilder,
relname: StringVectorBuilder,
relnamespace: UInt32VectorBuilder,
relkind: StringVectorBuilder,
relowner: UInt32VectorBuilder,
}
impl PGClassBuilder {
fn new(
schema: SchemaRef,
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
namespace_oid_map: PGNamespaceOidMapRef,
) -> Self {
Self {
schema,
catalog_name,
catalog_manager,
namespace_oid_map,
oid: UInt32VectorBuilder::with_capacity(INIT_CAPACITY),
relname: StringVectorBuilder::with_capacity(INIT_CAPACITY),
relnamespace: UInt32VectorBuilder::with_capacity(INIT_CAPACITY),
relkind: StringVectorBuilder::with_capacity(INIT_CAPACITY),
relowner: UInt32VectorBuilder::with_capacity(INIT_CAPACITY),
}
}
async fn make_class(&mut self, request: Option<ScanRequest>) -> Result<RecordBatch> {
let catalog_name = self.catalog_name.clone();
let catalog_manager = self
.catalog_manager
.upgrade()
.context(UpgradeWeakCatalogManagerRefSnafu)?;
let predicates = Predicates::from_scan_request(&request);
for schema_name in catalog_manager
.schema_names(&catalog_name, query_ctx())
.await?
{
let mut stream = catalog_manager.tables(&catalog_name, &schema_name, query_ctx());
while let Some(table) = stream.try_next().await? {
let table_info = table.table_info();
self.add_class(
&predicates,
table_info.table_id(),
&schema_name,
&table_info.name,
if table_info.table_type == TableType::View {
RELKIND_VIEW
} else {
RELKIND_TABLE
},
);
}
}
self.finish()
}
fn add_class(
&mut self,
predicates: &Predicates,
oid: u32,
schema: &str,
table: &str,
kind: &str,
) {
let namespace_oid = self.namespace_oid_map.get_oid(schema);
let row = [
(OID_COLUMN_NAME, &Value::from(oid)),
(RELNAMESPACE, &Value::from(schema)),
(RELNAME, &Value::from(table)),
(RELKIND, &Value::from(kind)),
(RELOWNER, &Value::from(DUMMY_OWNER_ID)),
];
if !predicates.eval(&row) {
return;
}
self.oid.push(Some(oid));
self.relnamespace.push(Some(namespace_oid));
self.relname.push(Some(table));
self.relkind.push(Some(kind));
self.relowner.push(Some(DUMMY_OWNER_ID));
}
fn finish(&mut self) -> Result<RecordBatch> {
let columns: Vec<VectorRef> = vec![
Arc::new(self.oid.finish()),
Arc::new(self.relname.finish()),
Arc::new(self.relnamespace.finish()),
Arc::new(self.relkind.finish()),
Arc::new(self.relowner.finish()),
];
RecordBatch::new(self.schema.clone(), columns).context(CreateRecordBatchSnafu)
}
}

View File

@@ -1,223 +0,0 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::sync::{Arc, Weak};
use arrow_schema::SchemaRef as ArrowSchemaRef;
use common_catalog::consts::PG_CATALOG_PG_DATABASE_TABLE_ID;
use common_error::ext::BoxedError;
use common_recordbatch::adapter::RecordBatchStreamAdapter;
use common_recordbatch::{DfSendableRecordBatchStream, RecordBatch};
use datafusion::execution::TaskContext;
use datafusion::physical_plan::stream::RecordBatchStreamAdapter as DfRecordBatchStreamAdapter;
use datafusion::physical_plan::streaming::PartitionStream as DfPartitionStream;
use datatypes::scalars::ScalarVectorBuilder;
use datatypes::schema::{Schema, SchemaRef};
use datatypes::value::Value;
use datatypes::vectors::{StringVectorBuilder, UInt32VectorBuilder, VectorRef};
use snafu::{OptionExt, ResultExt};
use store_api::storage::ScanRequest;
use crate::CatalogManager;
use crate::error::{
CreateRecordBatchSnafu, InternalSnafu, Result, UpgradeWeakCatalogManagerRefSnafu,
};
use crate::information_schema::Predicates;
use crate::system_schema::SystemTable;
use crate::system_schema::pg_catalog::pg_namespace::oid_map::PGNamespaceOidMapRef;
use crate::system_schema::pg_catalog::{OID_COLUMN_NAME, PG_DATABASE, query_ctx};
use crate::system_schema::utils::tables::{string_column, u32_column};
// === column name ===
pub const DATNAME: &str = "datname";
/// The initial capacity of the vector builders.
const INIT_CAPACITY: usize = 42;
/// The `pg_catalog.database` table implementation.
pub(super) struct PGDatabase {
schema: SchemaRef,
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
// Workaround to convert schema_name to a numeric id
namespace_oid_map: PGNamespaceOidMapRef,
}
impl std::fmt::Debug for PGDatabase {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("PGDatabase")
.field("schema", &self.schema)
.field("catalog_name", &self.catalog_name)
.finish()
}
}
impl PGDatabase {
pub(super) fn new(
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
namespace_oid_map: PGNamespaceOidMapRef,
) -> Self {
Self {
schema: Self::schema(),
catalog_name,
catalog_manager,
namespace_oid_map,
}
}
fn schema() -> SchemaRef {
Arc::new(Schema::new(vec![
u32_column(OID_COLUMN_NAME),
string_column(DATNAME),
]))
}
fn builder(&self) -> PGCDatabaseBuilder {
PGCDatabaseBuilder::new(
self.schema.clone(),
self.catalog_name.clone(),
self.catalog_manager.clone(),
self.namespace_oid_map.clone(),
)
}
}
impl DfPartitionStream for PGDatabase {
fn schema(&self) -> &ArrowSchemaRef {
self.schema.arrow_schema()
}
fn execute(&self, _: Arc<TaskContext>) -> DfSendableRecordBatchStream {
let schema = self.schema.arrow_schema().clone();
let mut builder = self.builder();
Box::pin(DfRecordBatchStreamAdapter::new(
schema,
futures::stream::once(async move {
builder
.make_database(None)
.await
.map(|x| x.into_df_record_batch())
.map_err(Into::into)
}),
))
}
}
impl SystemTable for PGDatabase {
fn table_id(&self) -> table::metadata::TableId {
PG_CATALOG_PG_DATABASE_TABLE_ID
}
fn table_name(&self) -> &'static str {
PG_DATABASE
}
fn schema(&self) -> SchemaRef {
self.schema.clone()
}
fn to_stream(
&self,
request: ScanRequest,
) -> Result<common_recordbatch::SendableRecordBatchStream> {
let schema = self.schema.arrow_schema().clone();
let mut builder = self.builder();
let stream = Box::pin(DfRecordBatchStreamAdapter::new(
schema,
futures::stream::once(async move {
builder
.make_database(Some(request))
.await
.map(|x| x.into_df_record_batch())
.map_err(Into::into)
}),
));
Ok(Box::pin(
RecordBatchStreamAdapter::try_new(stream)
.map_err(BoxedError::new)
.context(InternalSnafu)?,
))
}
}
/// Builds the `pg_catalog.pg_database` table row by row
/// `oid` use schema name as a workaround since we don't have numeric schema id.
/// `nspname` is the schema name.
struct PGCDatabaseBuilder {
schema: SchemaRef,
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
namespace_oid_map: PGNamespaceOidMapRef,
oid: UInt32VectorBuilder,
datname: StringVectorBuilder,
}
impl PGCDatabaseBuilder {
fn new(
schema: SchemaRef,
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
namespace_oid_map: PGNamespaceOidMapRef,
) -> Self {
Self {
schema,
catalog_name,
catalog_manager,
namespace_oid_map,
oid: UInt32VectorBuilder::with_capacity(INIT_CAPACITY),
datname: StringVectorBuilder::with_capacity(INIT_CAPACITY),
}
}
async fn make_database(&mut self, request: Option<ScanRequest>) -> Result<RecordBatch> {
let catalog_name = self.catalog_name.clone();
let catalog_manager = self
.catalog_manager
.upgrade()
.context(UpgradeWeakCatalogManagerRefSnafu)?;
let predicates = Predicates::from_scan_request(&request);
for schema_name in catalog_manager
.schema_names(&catalog_name, query_ctx())
.await?
{
self.add_database(&predicates, &schema_name);
}
self.finish()
}
fn add_database(&mut self, predicates: &Predicates, schema_name: &str) {
let oid = self.namespace_oid_map.get_oid(schema_name);
let row: [(&str, &Value); 2] = [
(OID_COLUMN_NAME, &Value::from(oid)),
(DATNAME, &Value::from(schema_name)),
];
if !predicates.eval(&row) {
return;
}
self.oid.push(Some(oid));
self.datname.push(Some(schema_name));
}
fn finish(&mut self) -> Result<RecordBatch> {
let columns: Vec<VectorRef> =
vec![Arc::new(self.oid.finish()), Arc::new(self.datname.finish())];
RecordBatch::new(self.schema.clone(), columns).context(CreateRecordBatchSnafu)
}
}

View File

@@ -1,221 +0,0 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! The `pg_catalog.pg_namespace` table implementation.
//! namespace is a schema in greptime
pub(super) mod oid_map;
use std::fmt;
use std::sync::{Arc, Weak};
use arrow_schema::SchemaRef as ArrowSchemaRef;
use common_catalog::consts::PG_CATALOG_PG_NAMESPACE_TABLE_ID;
use common_error::ext::BoxedError;
use common_recordbatch::adapter::RecordBatchStreamAdapter;
use common_recordbatch::{DfSendableRecordBatchStream, RecordBatch, SendableRecordBatchStream};
use datafusion::execution::TaskContext;
use datafusion::physical_plan::stream::RecordBatchStreamAdapter as DfRecordBatchStreamAdapter;
use datafusion::physical_plan::streaming::PartitionStream as DfPartitionStream;
use datatypes::scalars::ScalarVectorBuilder;
use datatypes::schema::{Schema, SchemaRef};
use datatypes::value::Value;
use datatypes::vectors::{StringVectorBuilder, UInt32VectorBuilder, VectorRef};
use snafu::{OptionExt, ResultExt};
use store_api::storage::ScanRequest;
use crate::CatalogManager;
use crate::error::{
CreateRecordBatchSnafu, InternalSnafu, Result, UpgradeWeakCatalogManagerRefSnafu,
};
use crate::information_schema::Predicates;
use crate::system_schema::SystemTable;
use crate::system_schema::pg_catalog::{
OID_COLUMN_NAME, PG_NAMESPACE, PGNamespaceOidMapRef, query_ctx,
};
use crate::system_schema::utils::tables::{string_column, u32_column};
const NSPNAME: &str = "nspname";
const INIT_CAPACITY: usize = 42;
pub(super) struct PGNamespace {
schema: SchemaRef,
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
// Workaround to convert schema_name to a numeric id
oid_map: PGNamespaceOidMapRef,
}
impl PGNamespace {
pub(super) fn new(
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
oid_map: PGNamespaceOidMapRef,
) -> Self {
Self {
schema: Self::schema(),
catalog_name,
catalog_manager,
oid_map,
}
}
fn schema() -> SchemaRef {
Arc::new(Schema::new(vec![
// TODO(J0HN50N133): we do not have a numeric schema id, use schema name as a workaround. Use a proper schema id once we have it.
u32_column(OID_COLUMN_NAME),
string_column(NSPNAME),
]))
}
fn builder(&self) -> PGNamespaceBuilder {
PGNamespaceBuilder::new(
self.schema.clone(),
self.catalog_name.clone(),
self.catalog_manager.clone(),
self.oid_map.clone(),
)
}
}
impl fmt::Debug for PGNamespace {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("PGNamespace")
.field("schema", &self.schema)
.field("catalog_name", &self.catalog_name)
.finish()
}
}
impl SystemTable for PGNamespace {
fn schema(&self) -> SchemaRef {
self.schema.clone()
}
fn table_id(&self) -> table::metadata::TableId {
PG_CATALOG_PG_NAMESPACE_TABLE_ID
}
fn table_name(&self) -> &'static str {
PG_NAMESPACE
}
fn to_stream(&self, request: ScanRequest) -> Result<SendableRecordBatchStream> {
let schema = self.schema.arrow_schema().clone();
let mut builder = self.builder();
let stream = Box::pin(DfRecordBatchStreamAdapter::new(
schema,
futures::stream::once(async move {
builder
.make_namespace(Some(request))
.await
.map(|x| x.into_df_record_batch())
.map_err(Into::into)
}),
));
Ok(Box::pin(
RecordBatchStreamAdapter::try_new(stream)
.map_err(BoxedError::new)
.context(InternalSnafu)?,
))
}
}
impl DfPartitionStream for PGNamespace {
fn schema(&self) -> &ArrowSchemaRef {
self.schema.arrow_schema()
}
fn execute(&self, _: Arc<TaskContext>) -> DfSendableRecordBatchStream {
let schema = self.schema.arrow_schema().clone();
let mut builder = self.builder();
Box::pin(DfRecordBatchStreamAdapter::new(
schema,
futures::stream::once(async move {
builder
.make_namespace(None)
.await
.map(|x| x.into_df_record_batch())
.map_err(Into::into)
}),
))
}
}
/// Builds the `pg_catalog.pg_namespace` table row by row
/// `oid` use schema name as a workaround since we don't have numeric schema id.
/// `nspname` is the schema name.
struct PGNamespaceBuilder {
schema: SchemaRef,
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
namespace_oid_map: PGNamespaceOidMapRef,
oid: UInt32VectorBuilder,
nspname: StringVectorBuilder,
}
impl PGNamespaceBuilder {
fn new(
schema: SchemaRef,
catalog_name: String,
catalog_manager: Weak<dyn CatalogManager>,
namespace_oid_map: PGNamespaceOidMapRef,
) -> Self {
Self {
schema,
catalog_name,
catalog_manager,
namespace_oid_map,
oid: UInt32VectorBuilder::with_capacity(INIT_CAPACITY),
nspname: StringVectorBuilder::with_capacity(INIT_CAPACITY),
}
}
/// Construct the `pg_catalog.pg_namespace` virtual table
async fn make_namespace(&mut self, request: Option<ScanRequest>) -> Result<RecordBatch> {
let catalog_name = self.catalog_name.clone();
let catalog_manager = self
.catalog_manager
.upgrade()
.context(UpgradeWeakCatalogManagerRefSnafu)?;
let predicates = Predicates::from_scan_request(&request);
for schema_name in catalog_manager
.schema_names(&catalog_name, query_ctx())
.await?
{
self.add_namespace(&predicates, &schema_name);
}
self.finish()
}
fn finish(&mut self) -> Result<RecordBatch> {
let columns: Vec<VectorRef> =
vec![Arc::new(self.oid.finish()), Arc::new(self.nspname.finish())];
RecordBatch::new(self.schema.clone(), columns).context(CreateRecordBatchSnafu)
}
fn add_namespace(&mut self, predicates: &Predicates, schema_name: &str) {
let oid = self.namespace_oid_map.get_oid(schema_name);
let row = [
(OID_COLUMN_NAME, &Value::from(oid)),
(NSPNAME, &Value::from(schema_name)),
];
if !predicates.eval(&row) {
return;
}
self.oid.push(Some(oid));
self.nspname.push(Some(schema_name));
}
}

View File

@@ -1,94 +0,0 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::hash::BuildHasher;
use std::sync::Arc;
use dashmap::DashMap;
use rustc_hash::FxSeededState;
pub type PGNamespaceOidMapRef = Arc<PGNamespaceOidMap>;
// Workaround to convert schema_name to a numeric id,
// remove this when we have numeric schema id in greptime
pub struct PGNamespaceOidMap {
oid_map: DashMap<String, u32>,
// Rust use SipHasher by default, which provides resistance against DOS attacks.
// This will produce different hash value between each greptime instance. This will
// cause the sqlness test fail. We need a deterministic hash here to provide
// same oid for the same schema name with best effort and DOS attacks aren't concern here.
hasher: FxSeededState,
}
impl PGNamespaceOidMap {
pub fn new() -> Self {
Self {
oid_map: DashMap::new(),
hasher: FxSeededState::with_seed(0), // PLEASE DO NOT MODIFY THIS SEED VALUE!!!
}
}
fn oid_is_used(&self, oid: u32) -> bool {
self.oid_map.iter().any(|e| *e.value() == oid)
}
pub fn get_oid(&self, schema_name: &str) -> u32 {
if let Some(oid) = self.oid_map.get(schema_name) {
*oid
} else {
let mut oid = self.hasher.hash_one(schema_name) as u32;
while self.oid_is_used(oid) {
oid = self.hasher.hash_one(oid) as u32;
}
self.oid_map.insert(schema_name.to_string(), oid);
oid
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn oid_is_stable() {
let oid_map_1 = PGNamespaceOidMap::new();
let oid_map_2 = PGNamespaceOidMap::new();
let schema = "schema";
let oid = oid_map_1.get_oid(schema);
// oid keep stable in the same instance
assert_eq!(oid, oid_map_1.get_oid(schema));
// oid keep stable between different instances
assert_eq!(oid, oid_map_2.get_oid(schema));
}
#[test]
fn oid_collision() {
let oid_map = PGNamespaceOidMap::new();
let key1 = "3178510";
let key2 = "4215648";
// insert them into oid_map
let oid1 = oid_map.get_oid(key1);
let oid2 = oid_map.get_oid(key2);
// they should have different id
assert_ne!(oid1, oid2);
}
}

View File

@@ -1,22 +0,0 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// https://www.postgresql.org/docs/current/catalog-pg-database.html
pub const PG_DATABASE: &str = "pg_database";
// https://www.postgresql.org/docs/current/catalog-pg-namespace.html
pub const PG_NAMESPACE: &str = "pg_namespace";
// https://www.postgresql.org/docs/current/catalog-pg-class.html
pub const PG_CLASS: &str = "pg_class";
// https://www.postgresql.org/docs/current/catalog-pg-type.html
pub const PG_TYPE: &str = "pg_type";

View File

@@ -27,22 +27,6 @@ pub fn string_column(name: &str) -> ColumnSchema {
)
}
pub fn u32_column(name: &str) -> ColumnSchema {
ColumnSchema::new(
str::to_lowercase(name),
ConcreteDataType::uint32_datatype(),
false,
)
}
pub fn i16_column(name: &str) -> ColumnSchema {
ColumnSchema::new(
str::to_lowercase(name),
ConcreteDataType::int16_datatype(),
false,
)
}
pub fn bigint_column(name: &str) -> ColumnSchema {
ColumnSchema::new(
str::to_lowercase(name),

View File

@@ -112,11 +112,8 @@ pub const INFORMATION_SCHEMA_SSTS_STORAGE_TABLE_ID: u32 = 38;
// ----- End of information_schema tables -----
/// ----- Begin of pg_catalog tables -----
pub const PG_CATALOG_PG_CLASS_TABLE_ID: u32 = 256;
pub const PG_CATALOG_PG_TYPE_TABLE_ID: u32 = 257;
pub const PG_CATALOG_PG_NAMESPACE_TABLE_ID: u32 = 258;
pub const PG_CATALOG_PG_DATABASE_TABLE_ID: u32 = 259;
pub const PG_CATALOG_TABLE_ID_START: u32 = 256;
// Please leave at 128 table ids for Postgres
// ----- End of pg_catalog tables -----
pub const MITO_ENGINE: &str = "mito";

View File

@@ -37,6 +37,7 @@ datafusion-common.workspace = true
datafusion-expr.workspace = true
datafusion-functions-aggregate-common.workspace = true
datafusion-physical-expr.workspace = true
datafusion-postgres.workspace = true
datatypes.workspace = true
derive_more = { version = "1", default-features = false, features = ["display"] }
geo = { version = "0.29", optional = true }

View File

@@ -21,8 +21,7 @@ mod version;
use build::BuildFunction;
use database::{
ConnectionIdFunction, CurrentSchemaFunction, DatabaseFunction, PgBackendPidFunction,
ReadPreferenceFunction, SessionUserFunction,
ConnectionIdFunction, DatabaseFunction, PgBackendPidFunction, ReadPreferenceFunction,
};
use pg_catalog::PGCatalogFunction;
use procedure_state::ProcedureStateFunction;
@@ -37,9 +36,7 @@ impl SystemFunction {
pub fn register(registry: &FunctionRegistry) {
registry.register_scalar(BuildFunction);
registry.register_scalar(VersionFunction);
registry.register_scalar(CurrentSchemaFunction);
registry.register_scalar(DatabaseFunction);
registry.register_scalar(SessionUserFunction);
registry.register_scalar(ReadPreferenceFunction);
registry.register_scalar(PgBackendPidFunction);
registry.register_scalar(ConnectionIdFunction);

View File

@@ -26,10 +26,6 @@ use crate::function::{Function, find_function_context};
#[derive(Clone, Debug, Default)]
pub struct DatabaseFunction;
#[derive(Clone, Debug, Default)]
pub struct CurrentSchemaFunction;
pub struct SessionUserFunction;
pub struct ReadPreferenceFunction;
#[derive(Display)]
@@ -41,8 +37,6 @@ pub struct PgBackendPidFunction;
pub struct ConnectionIdFunction;
const DATABASE_FUNCTION_NAME: &str = "database";
const CURRENT_SCHEMA_FUNCTION_NAME: &str = "current_schema";
const SESSION_USER_FUNCTION_NAME: &str = "session_user";
const READ_PREFERENCE_FUNCTION_NAME: &str = "read_preference";
const PG_BACKEND_PID: &str = "pg_backend_pid";
const CONNECTION_ID: &str = "connection_id";
@@ -71,58 +65,6 @@ impl Function for DatabaseFunction {
}
}
// Though "current_schema" can be aliased to "database", to not cause any breaking changes,
// we are not doing it: not until https://github.com/apache/datafusion/issues/17469 is resolved.
impl Function for CurrentSchemaFunction {
fn name(&self) -> &str {
CURRENT_SCHEMA_FUNCTION_NAME
}
fn return_type(&self, _: &[DataType]) -> Result<DataType> {
Ok(DataType::Utf8View)
}
fn signature(&self) -> Signature {
Signature::nullary(Volatility::Immutable)
}
fn invoke_with_args(
&self,
args: ScalarFunctionArgs,
) -> datafusion_common::Result<ColumnarValue> {
let func_ctx = find_function_context(&args)?;
let db = func_ctx.query_ctx.current_schema();
Ok(ColumnarValue::Scalar(ScalarValue::Utf8View(Some(db))))
}
}
impl Function for SessionUserFunction {
fn name(&self) -> &str {
SESSION_USER_FUNCTION_NAME
}
fn return_type(&self, _: &[DataType]) -> Result<DataType> {
Ok(DataType::Utf8View)
}
fn signature(&self) -> Signature {
Signature::nullary(Volatility::Immutable)
}
fn invoke_with_args(
&self,
args: ScalarFunctionArgs,
) -> datafusion_common::Result<ColumnarValue> {
let func_ctx = find_function_context(&args)?;
let user = func_ctx.query_ctx.current_user();
Ok(ColumnarValue::Scalar(ScalarValue::Utf8View(Some(
user.username().to_string(),
))))
}
}
impl Function for ReadPreferenceFunction {
fn name(&self) -> &str {
READ_PREFERENCE_FUNCTION_NAME
@@ -203,18 +145,6 @@ impl fmt::Display for DatabaseFunction {
}
}
impl fmt::Display for CurrentSchemaFunction {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "CURRENT_SCHEMA")
}
}
impl fmt::Display for SessionUserFunction {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "SESSION_USER")
}
}
impl fmt::Display for ReadPreferenceFunction {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "READ_PREFERENCE")

View File

@@ -12,29 +12,168 @@
// See the License for the specific language governing permissions and
// limitations under the License.
mod pg_get_userbyid;
mod table_is_visible;
mod version;
use pg_get_userbyid::PGGetUserByIdFunction;
use table_is_visible::PGTableIsVisibleFunction;
use std::sync::Arc;
use common_query::error::Result;
use datafusion::arrow::array::{ArrayRef, StringArray, as_boolean_array};
use datafusion::catalog::TableFunction;
use datafusion::common::ScalarValue;
use datafusion::common::utils::SingleRowListArrayBuilder;
use datafusion_expr::{ColumnarValue, ScalarFunctionArgs, Signature, Volatility};
use datafusion_postgres::pg_catalog::{self, PgCatalogStaticTables};
use datatypes::arrow::datatypes::{DataType, Field};
use derive_more::Display;
use version::PGVersionFunction;
use crate::function::{Function, find_function_context};
use crate::function_registry::FunctionRegistry;
#[macro_export]
macro_rules! pg_catalog_func_fullname {
($name:literal) => {
concat!("pg_catalog.", $name)
};
const CURRENT_SCHEMA_FUNCTION_NAME: &str = "current_schema";
const CURRENT_SCHEMAS_FUNCTION_NAME: &str = "current_schemas";
const SESSION_USER_FUNCTION_NAME: &str = "session_user";
#[derive(Clone, Debug, Default, Display)]
#[display("{}", self.name())]
pub struct CurrentSchemaFunction;
#[derive(Clone, Debug, Default, Display)]
#[display("{}", self.name())]
pub struct CurrentSchemasFunction;
#[derive(Clone, Debug, Default, Display)]
#[display("{}", self.name())]
pub struct SessionUserFunction;
// Though "current_schema" can be aliased to "database", to not cause any breaking changes,
// we are not doing it: not until https://github.com/apache/datafusion/issues/17469 is resolved.
impl Function for CurrentSchemaFunction {
fn name(&self) -> &str {
CURRENT_SCHEMA_FUNCTION_NAME
}
fn return_type(&self, _: &[DataType]) -> Result<DataType> {
Ok(DataType::Utf8View)
}
fn signature(&self) -> Signature {
Signature::nullary(Volatility::Immutable)
}
fn invoke_with_args(
&self,
args: ScalarFunctionArgs,
) -> datafusion_common::Result<ColumnarValue> {
let func_ctx = find_function_context(&args)?;
let db = func_ctx.query_ctx.current_schema();
Ok(ColumnarValue::Scalar(ScalarValue::Utf8View(Some(db))))
}
}
impl Function for SessionUserFunction {
fn name(&self) -> &str {
SESSION_USER_FUNCTION_NAME
}
fn return_type(&self, _: &[DataType]) -> Result<DataType> {
Ok(DataType::Utf8View)
}
fn signature(&self) -> Signature {
Signature::nullary(Volatility::Immutable)
}
fn invoke_with_args(
&self,
args: ScalarFunctionArgs,
) -> datafusion_common::Result<ColumnarValue> {
let func_ctx = find_function_context(&args)?;
let user = func_ctx.query_ctx.current_user();
Ok(ColumnarValue::Scalar(ScalarValue::Utf8View(Some(
user.username().to_string(),
))))
}
}
impl Function for CurrentSchemasFunction {
fn name(&self) -> &str {
CURRENT_SCHEMAS_FUNCTION_NAME
}
fn return_type(&self, _: &[DataType]) -> Result<DataType> {
Ok(DataType::List(Arc::new(Field::new(
"x",
DataType::Utf8View,
false,
))))
}
fn signature(&self) -> Signature {
Signature::exact(vec![DataType::Boolean], Volatility::Immutable)
}
fn invoke_with_args(
&self,
args: ScalarFunctionArgs,
) -> datafusion_common::Result<ColumnarValue> {
let args = ColumnarValue::values_to_arrays(&args.args)?;
let input = as_boolean_array(&args[0]);
// Create a UTF8 array with a single value
let mut values = vec!["public"];
// include implicit schemas
if input.value(0) {
values.push("information_schema");
values.push("pg_catalog");
values.push("greptime_private");
}
let list_array = SingleRowListArrayBuilder::new(Arc::new(StringArray::from(values)));
let array: ArrayRef = Arc::new(list_array.build_list_array());
Ok(ColumnarValue::Array(array))
}
}
pub(super) struct PGCatalogFunction;
impl PGCatalogFunction {
pub fn register(registry: &FunctionRegistry) {
registry.register_scalar(PGTableIsVisibleFunction);
registry.register_scalar(PGGetUserByIdFunction);
let static_tables =
Arc::new(PgCatalogStaticTables::try_new().expect("load postgres static tables"));
registry.register_scalar(PGVersionFunction);
registry.register_scalar(CurrentSchemaFunction);
registry.register_scalar(CurrentSchemasFunction);
registry.register_scalar(SessionUserFunction);
registry.register(pg_catalog::format_type::create_format_type_udf());
registry.register(pg_catalog::create_pg_get_partkeydef_udf());
registry.register(pg_catalog::has_privilege_udf::create_has_privilege_udf(
"has_table_privilege",
));
registry.register(pg_catalog::has_privilege_udf::create_has_privilege_udf(
"has_schema_privilege",
));
registry.register(pg_catalog::has_privilege_udf::create_has_privilege_udf(
"has_database_privilege",
));
registry.register(pg_catalog::has_privilege_udf::create_has_privilege_udf(
"has_any_column_privilege",
));
registry.register_table_function(TableFunction::new(
"pg_get_keywords".to_string(),
static_tables.pg_get_keywords.clone(),
));
registry.register(pg_catalog::create_pg_relation_is_publishable_udf());
registry.register(pg_catalog::create_pg_get_statisticsobjdef_columns_udf());
registry.register(pg_catalog::create_pg_get_userbyid_udf());
registry.register(pg_catalog::create_pg_table_is_visible());
registry.register(pg_catalog::pg_get_expr_udf::create_pg_get_expr_udf());
// TODO(sunng87): upgrade datafusion to add
//registry.register(pg_catalog::create_pg_encoding_to_char_udf());
}
}

View File

@@ -1,73 +0,0 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::fmt::{self};
use std::sync::Arc;
use common_query::error::Result;
use datafusion::arrow::datatypes::DataType as ArrowDataType;
use datafusion_expr::{Signature, Volatility};
use datatypes::prelude::{DataType, VectorRef};
use datatypes::types::LogicalPrimitiveType;
use datatypes::with_match_primitive_type_id;
use num_traits::AsPrimitive;
use crate::function::{Function, FunctionContext};
use crate::scalars::expression::{EvalContext, scalar_unary_op};
#[derive(Clone, Debug, Default)]
pub struct PGGetUserByIdFunction;
const NAME: &str = crate::pg_catalog_func_fullname!("pg_get_userbyid");
impl fmt::Display for PGGetUserByIdFunction {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, crate::pg_catalog_func_fullname!("PG_GET_USERBYID"))
}
}
impl Function for PGGetUserByIdFunction {
fn name(&self) -> &str {
NAME
}
fn return_type(&self, _: &[ArrowDataType]) -> Result<ArrowDataType> {
Ok(ArrowDataType::Utf8)
}
fn signature(&self) -> Signature {
Signature::uniform(
1,
vec![arrow::datatypes::DataType::UInt32],
Volatility::Immutable,
)
}
fn eval(&self, _func_ctx: &FunctionContext, columns: &[VectorRef]) -> Result<VectorRef> {
with_match_primitive_type_id!(columns[0].data_type().logical_type_id(), |$T| {
let col = scalar_unary_op::<<$T as LogicalPrimitiveType>::Native, String, _>(&columns[0], pg_get_user_by_id, &mut EvalContext::default())?;
Ok(Arc::new(col))
}, {
unreachable!()
})
}
}
fn pg_get_user_by_id<I>(table_oid: Option<I>, _ctx: &mut EvalContext) -> Option<String>
where
I: AsPrimitive<u32>,
{
// TODO(J0HN50N133): We lack way to get the user_info by a numeric value. Once we have it, we can implement this function.
table_oid.map(|_| "".to_string())
}

View File

@@ -1,73 +0,0 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::fmt::{self};
use std::sync::Arc;
use common_query::error::Result;
use datafusion::arrow::datatypes::DataType as ArrowDataType;
use datafusion_expr::{Signature, Volatility};
use datatypes::prelude::{DataType, VectorRef};
use datatypes::types::LogicalPrimitiveType;
use datatypes::with_match_primitive_type_id;
use num_traits::AsPrimitive;
use crate::function::{Function, FunctionContext};
use crate::scalars::expression::{EvalContext, scalar_unary_op};
#[derive(Clone, Debug, Default)]
pub struct PGTableIsVisibleFunction;
const NAME: &str = crate::pg_catalog_func_fullname!("pg_table_is_visible");
impl fmt::Display for PGTableIsVisibleFunction {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, crate::pg_catalog_func_fullname!("PG_TABLE_IS_VISIBLE"))
}
}
impl Function for PGTableIsVisibleFunction {
fn name(&self) -> &str {
NAME
}
fn return_type(&self, _: &[ArrowDataType]) -> Result<ArrowDataType> {
Ok(ArrowDataType::Boolean)
}
fn signature(&self) -> Signature {
Signature::uniform(
1,
vec![arrow::datatypes::DataType::UInt32],
Volatility::Immutable,
)
}
fn eval(&self, _func_ctx: &FunctionContext, columns: &[VectorRef]) -> Result<VectorRef> {
with_match_primitive_type_id!(columns[0].data_type().logical_type_id(), |$T| {
let col = scalar_unary_op::<<$T as LogicalPrimitiveType>::Native, bool, _>(&columns[0], pg_table_is_visible, &mut EvalContext::default())?;
Ok(Arc::new(col))
}, {
unreachable!()
})
}
}
fn pg_table_is_visible<I>(table_oid: Option<I>, _ctx: &mut EvalContext) -> Option<bool>
where
I: AsPrimitive<u32>,
{
// There is no table visibility in greptime, so we always return true
table_oid.map(|_| true)
}

View File

@@ -27,13 +27,13 @@ pub(crate) struct PGVersionFunction;
impl fmt::Display for PGVersionFunction {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, crate::pg_catalog_func_fullname!("VERSION"))
write!(f, "pg_catalog.VERSION")
}
}
impl Function for PGVersionFunction {
fn name(&self) -> &str {
crate::pg_catalog_func_fullname!("version")
"pg_catalog.version"
}
fn return_type(&self, _: &[DataType]) -> Result<DataType> {

View File

@@ -335,6 +335,14 @@ impl Value {
}
}
/// Cast value to Boolean. Return None if value is not a boolean type.
pub fn as_bool(&self) -> Option<bool> {
match self {
Value::Boolean(b) => Some(*b),
_ => None,
}
}
/// Returns the logical type of the value.
pub fn logical_type_id(&self) -> LogicalTypeId {
match self {
@@ -2781,21 +2789,21 @@ mod tests {
vector: &vector,
idx: 0,
}),
85,
74,
);
check_value_ref_size_eq(
&ValueRef::List(ListValueRef::Indexed {
vector: &vector,
idx: 1,
}),
85,
74,
);
check_value_ref_size_eq(
&ValueRef::List(ListValueRef::Indexed {
vector: &vector,
idx: 2,
}),
85,
74,
);
check_value_ref_size_eq(&ValueRef::Decimal128(Decimal128::new(1234, 3, 1)), 32)
}

View File

@@ -553,7 +553,7 @@ pub mod tests {
assert!(validity.is_set(0));
assert!(!validity.is_set(1));
assert!(validity.is_set(2));
assert_eq!(256, list_vector.memory_size());
assert_eq!(224, list_vector.memory_size());
let slice = list_vector.slice(0, 2).to_arrow_array();
let sliced_array = slice.as_any().downcast_ref::<ListArray>().unwrap();

View File

@@ -314,7 +314,7 @@ mod tests {
assert!(!v.is_const());
assert!(v.validity().is_all_valid());
assert!(!v.only_null());
assert_eq!(1088, v.memory_size());
assert_eq!(1040, v.memory_size());
for (i, s) in strs.iter().enumerate() {
assert_eq!(Value::from(*s), v.get(i));

View File

@@ -450,7 +450,7 @@ mod tests {
let key_bytes = num_keys as usize * 5;
assert_eq!(key_bytes * 2, metrics.key_bytes);
assert_eq!(key_bytes, builder.key_bytes_in_index);
assert_eq!(8850, builder.memory_size());
assert_eq!(8730, builder.memory_size());
let (dict, _) = builder.finish().unwrap();
assert_eq!(0, builder.key_bytes_in_index);

View File

@@ -56,6 +56,7 @@ dashmap.workspace = true
datafusion.workspace = true
datafusion-common.workspace = true
datafusion-expr.workspace = true
datafusion-postgres.workspace = true
datatypes.workspace = true
derive_builder.workspace = true
futures.workspace = true

View File

@@ -12,7 +12,6 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use std::borrow::Cow;
use std::collections::HashMap;
use std::sync::Arc;
@@ -115,17 +114,6 @@ pub(crate) fn process<'a>(query: &str, query_ctx: QueryContextRef) -> Option<Vec
}
}
pub(crate) fn rewrite_sql(query: &str) -> Cow<'_, str> {
// DBeaver tricky replacement for datafusion not support sql
// TODO: add more here
query
.replace(
"SELECT db.oid,db.* FROM pg_catalog.pg_database db",
"SELECT db.oid as _oid,db.* FROM pg_catalog.pg_database db",
)
.into()
}
#[cfg(test)]
mod test {
use session::context::{QueryContext, QueryContextRef};
@@ -211,12 +199,4 @@ mod test {
assert!(process("SHOW TABLES ", query_context.clone()).is_none());
assert!(process("SET TIME_ZONE=utc ", query_context.clone()).is_none());
}
#[test]
fn test_rewrite() {
assert_eq!(
"SELECT db.oid as _oid,db.* FROM pg_catalog.pg_database db",
rewrite_sql("SELECT db.oid,db.* FROM pg_catalog.pg_database db")
);
}
}

View File

@@ -21,6 +21,7 @@ use common_recordbatch::RecordBatch;
use common_recordbatch::error::Result as RecordBatchResult;
use common_telemetry::{debug, tracing};
use datafusion_common::ParamValues;
use datafusion_postgres::sql::PostgresCompatibilityParser;
use datatypes::prelude::ConcreteDataType;
use datatypes::schema::SchemaRef;
use futures::{Sink, SinkExt, Stream, StreamExt, future, stream};
@@ -67,14 +68,21 @@ impl SimpleQueryHandler for PostgresServerHandlerInner {
return Ok(vec![Response::EmptyQuery]);
}
let query = fixtures::rewrite_sql(query);
let query = query.as_ref();
let query = if let Ok(statements) = self.query_parser.compatibility_parser.parse(query) {
statements
.iter()
.map(|s| s.to_string())
.collect::<Vec<_>>()
.join(";")
} else {
query.to_string()
};
if let Some(resps) = fixtures::process(query, query_ctx.clone()) {
if let Some(resps) = fixtures::process(&query, query_ctx.clone()) {
send_warning_opt(client, query_ctx).await?;
Ok(resps)
} else {
let outputs = self.query_handler.do_query(query, query_ctx.clone()).await;
let outputs = self.query_handler.do_query(&query, query_ctx.clone()).await;
let mut results = Vec::with_capacity(outputs.len());
@@ -181,6 +189,7 @@ where
pub struct DefaultQueryParser {
query_handler: ServerSqlQueryHandlerRef,
session: Arc<Session>,
compatibility_parser: PostgresCompatibilityParser,
}
impl DefaultQueryParser {
@@ -188,6 +197,7 @@ impl DefaultQueryParser {
DefaultQueryParser {
query_handler,
session,
compatibility_parser: PostgresCompatibilityParser::new(),
}
}
}
@@ -215,12 +225,20 @@ impl QueryParser for DefaultQueryParser {
});
}
let sql = fixtures::rewrite_sql(sql);
let sql = sql.as_ref();
let sql = if let Ok(mut statements) = self.compatibility_parser.parse(sql) {
statements.remove(0).to_string()
} else {
// bypass the error: it can run into error because of different
// versions of sqlparser
sql.to_string()
};
let mut stmts =
ParserContext::create_with_dialect(sql, &PostgreSqlDialect {}, ParseOptions::default())
.map_err(convert_err)?;
let mut stmts = ParserContext::create_with_dialect(
&sql,
&PostgreSqlDialect {},
ParseOptions::default(),
)
.map_err(convert_err)?;
if stmts.len() != 1 {
Err(PgWireError::UserError(Box::new(ErrorInfo::from(
PgErrorCode::Ec42P14,
@@ -245,7 +263,7 @@ impl QueryParser for DefaultQueryParser {
};
Ok(SqlPlan {
query: sql.to_owned(),
query: sql.clone(),
statement: Some(stmt),
plan,
schema,

View File

@@ -68,7 +68,9 @@ impl ParserContext<'_> {
.parser
.parse_literal_uint()
.context(error::SyntaxSnafu)?;
let _ = self.parser.parse_keyword(Keyword::FROM);
let _ = self
.parser
.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]);
let cursor_name = self
.parser

View File

@@ -130,7 +130,14 @@ impl ParserContext<'_> {
} else if self.consume_token("PROCESSLIST") {
self.parse_show_processlist(false)
} else {
self.unsupported(self.peek_token_as_string())
// follow postgres dialect and assume the next token is the variable
let variable = self
.parse_object_name()
.with_context(|_| error::UnexpectedSnafu {
expected: "a variable name",
actual: self.peek_token_as_string(),
})?;
Ok(Statement::ShowVariables(ShowVariables { variable }))
}
}

View File

@@ -101,6 +101,16 @@ impl std::fmt::Display for TableType {
}
}
impl From<TableType> for datafusion::datasource::TableType {
fn from(t: TableType) -> datafusion::datasource::TableType {
match t {
TableType::Base => datafusion::datasource::TableType::Base,
TableType::View => datafusion::datasource::TableType::View,
TableType::Temporary => datafusion::datasource::TableType::Temporary,
}
}
}
/// Identifier of the table.
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, Default)]
pub struct TableIdent {

View File

@@ -86,40 +86,636 @@ Error: 4001(TableNotFound), Failed to plan SQL: Table not found: greptime.pg_cat
-- SQLNESS PROTOCOL POSTGRES
select * from pg_catalog.pg_type order by oid;
+-----+-----------+--------+
| oid | typname | typlen |
+-----+-----------+--------+
| 1 | String | -1 |
| 2 | Binary | -1 |
| 3 | Int8 | 1 |
| 4 | Int16 | 2 |
| 5 | Int32 | 4 |
| 6 | Int64 | 8 |
| 7 | UInt8 | 1 |
| 8 | UInt16 | 2 |
| 9 | UInt32 | 4 |
| 10 | UInt64 | 8 |
| 11 | Float32 | 4 |
| 12 | Float64 | 8 |
| 13 | Decimal | 16 |
| 14 | Date | 4 |
| 15 | DateTime | 8 |
| 16 | Timestamp | 8 |
| 17 | Time | 8 |
| 18 | Duration | 8 |
| 19 | Interval | 16 |
| 20 | List | -1 |
+-----+-----------+--------+
+-------+----------------------------------------+--------------+----------+--------+----------+---------+-------------+----------------+--------------+----------+----------+-----------------------------+---------+----------+------------------------------+-------------------------------+--------------------------------+--------------------------------+---------------------+----------------------+-----------------------+----------+------------+------------+-------------+-----------+----------+--------------+------------------------------------------------------------+----------------------+--------+
| oid | typname | typnamespace | typowner | typlen | typbyval | typtype | typcategory | typispreferred | typisdefined | typdelim | typrelid | typsubscript | typelem | typarray | typinput | typoutput | typreceive | typsend | typmodin | typmodout | typanalyze | typalign | typstorage | typnotnull | typbasetype | typtypmod | typndims | typcollation | typdefaultbin | typdefault | typacl |
+-------+----------------------------------------+--------------+----------+--------+----------+---------+-------------+----------------+--------------+----------+----------+-----------------------------+---------+----------+------------------------------+-------------------------------+--------------------------------+--------------------------------+---------------------+----------------------+-----------------------+----------+------------+------------+-------------+-----------+----------+--------------+------------------------------------------------------------+----------------------+--------+
| 16 | bool | 11 | 10 | 1 | t | b | B | t | t | , | 0 | - | 0 | 1000 | boolin | boolout | boolrecv | boolsend | - | - | - | c | p | f | 0 | -1 | 0 | 0 | | | |
| 17 | bytea | 11 | 10 | -1 | f | b | U | f | t | , | 0 | - | 0 | 1001 | byteain | byteaout | bytearecv | byteasend | - | - | - | i | x | f | 0 | -1 | 0 | 0 | | | |
| 18 | char | 11 | 10 | 1 | t | b | Z | f | t | , | 0 | - | 0 | 1002 | charin | charout | charrecv | charsend | - | - | - | c | p | f | 0 | -1 | 0 | 0 | | | |
| 19 | name | 11 | 10 | 64 | f | b | S | f | t | , | 0 | raw_array_subscript_handler | 18 | 1003 | namein | nameout | namerecv | namesend | - | - | - | c | p | f | 0 | -1 | 0 | 950 | | | |
| 20 | int8 | 11 | 10 | 8 | t | b | N | f | t | , | 0 | - | 0 | 1016 | int8in | int8out | int8recv | int8send | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 21 | int2 | 11 | 10 | 2 | t | b | N | f | t | , | 0 | - | 0 | 1005 | int2in | int2out | int2recv | int2send | - | - | - | s | p | f | 0 | -1 | 0 | 0 | | | |
| 22 | int2vector | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 21 | 1006 | int2vectorin | int2vectorout | int2vectorrecv | int2vectorsend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 23 | int4 | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 1007 | int4in | int4out | int4recv | int4send | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 24 | regproc | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 1008 | regprocin | regprocout | regprocrecv | regprocsend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 25 | text | 11 | 10 | -1 | f | b | S | t | t | , | 0 | - | 0 | 1009 | textin | textout | textrecv | textsend | - | - | - | i | x | f | 0 | -1 | 0 | 100 | | | |
| 26 | oid | 11 | 10 | 4 | t | b | N | t | t | , | 0 | - | 0 | 1028 | oidin | oidout | oidrecv | oidsend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 27 | tid | 11 | 10 | 6 | f | b | U | f | t | , | 0 | - | 0 | 1010 | tidin | tidout | tidrecv | tidsend | - | - | - | s | p | f | 0 | -1 | 0 | 0 | | | |
| 28 | xid | 11 | 10 | 4 | t | b | U | f | t | , | 0 | - | 0 | 1011 | xidin | xidout | xidrecv | xidsend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 29 | cid | 11 | 10 | 4 | t | b | U | f | t | , | 0 | - | 0 | 1012 | cidin | cidout | cidrecv | cidsend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 30 | oidvector | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 26 | 1013 | oidvectorin | oidvectorout | oidvectorrecv | oidvectorsend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 32 | pg_ddl_command | 11 | 10 | 8 | t | p | P | f | t | , | 0 | - | 0 | 0 | pg_ddl_command_in | pg_ddl_command_out | pg_ddl_command_recv | pg_ddl_command_send | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 71 | pg_type | 11 | 10 | -1 | f | c | C | f | t | , | 1247 | - | 0 | 210 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 75 | pg_attribute | 11 | 10 | -1 | f | c | C | f | t | , | 1249 | - | 0 | 270 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 81 | pg_proc | 11 | 10 | -1 | f | c | C | f | t | , | 1255 | - | 0 | 272 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 83 | pg_class | 11 | 10 | -1 | f | c | C | f | t | , | 1259 | - | 0 | 273 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 114 | json | 11 | 10 | -1 | f | b | U | f | t | , | 0 | - | 0 | 199 | json_in | json_out | json_recv | json_send | - | - | - | i | x | f | 0 | -1 | 0 | 0 | | | |
| 142 | xml | 11 | 10 | -1 | f | b | U | f | t | , | 0 | - | 0 | 143 | xml_in | xml_out | xml_recv | xml_send | - | - | - | i | x | f | 0 | -1 | 0 | 0 | | | |
| 143 | _xml | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 142 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 194 | pg_node_tree | 11 | 10 | -1 | f | b | Z | f | t | , | 0 | - | 0 | 0 | pg_node_tree_in | pg_node_tree_out | pg_node_tree_recv | pg_node_tree_send | - | - | - | i | x | f | 0 | -1 | 0 | 100 | | | |
| 199 | _json | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 114 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 210 | _pg_type | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 71 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 269 | table_am_handler | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | table_am_handler_in | table_am_handler_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 270 | _pg_attribute | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 75 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 271 | _xid8 | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 5069 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 272 | _pg_proc | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 81 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 273 | _pg_class | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 83 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 325 | index_am_handler | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | index_am_handler_in | index_am_handler_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 600 | point | 11 | 10 | 16 | f | b | G | f | t | , | 0 | raw_array_subscript_handler | 701 | 1017 | point_in | point_out | point_recv | point_send | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 601 | lseg | 11 | 10 | 32 | f | b | G | f | t | , | 0 | raw_array_subscript_handler | 600 | 1018 | lseg_in | lseg_out | lseg_recv | lseg_send | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 602 | path | 11 | 10 | -1 | f | b | G | f | t | , | 0 | - | 0 | 1019 | path_in | path_out | path_recv | path_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 603 | box | 11 | 10 | 32 | f | b | G | f | t | ; | 0 | raw_array_subscript_handler | 600 | 1020 | box_in | box_out | box_recv | box_send | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 604 | polygon | 11 | 10 | -1 | f | b | G | f | t | , | 0 | - | 0 | 1027 | poly_in | poly_out | poly_recv | poly_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 628 | line | 11 | 10 | 24 | f | b | G | f | t | , | 0 | raw_array_subscript_handler | 701 | 629 | line_in | line_out | line_recv | line_send | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 629 | _line | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 628 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 650 | cidr | 11 | 10 | -1 | f | b | I | f | t | , | 0 | - | 0 | 651 | cidr_in | cidr_out | cidr_recv | cidr_send | - | - | - | i | m | f | 0 | -1 | 0 | 0 | | | |
| 651 | _cidr | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 650 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 700 | float4 | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 1021 | float4in | float4out | float4recv | float4send | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 701 | float8 | 11 | 10 | 8 | t | b | N | t | t | , | 0 | - | 0 | 1022 | float8in | float8out | float8recv | float8send | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 705 | unknown | 11 | 10 | -2 | f | p | X | f | t | , | 0 | - | 0 | 0 | unknownin | unknownout | unknownrecv | unknownsend | - | - | - | c | p | f | 0 | -1 | 0 | 0 | | | |
| 718 | circle | 11 | 10 | 24 | f | b | G | f | t | , | 0 | - | 0 | 719 | circle_in | circle_out | circle_recv | circle_send | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 719 | _circle | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 718 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 774 | macaddr8 | 11 | 10 | 8 | f | b | U | f | t | , | 0 | - | 0 | 775 | macaddr8_in | macaddr8_out | macaddr8_recv | macaddr8_send | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 775 | _macaddr8 | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 774 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 790 | money | 11 | 10 | 8 | t | b | N | f | t | , | 0 | - | 0 | 791 | cash_in | cash_out | cash_recv | cash_send | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 791 | _money | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 790 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 829 | macaddr | 11 | 10 | 6 | f | b | U | f | t | , | 0 | - | 0 | 1040 | macaddr_in | macaddr_out | macaddr_recv | macaddr_send | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 869 | inet | 11 | 10 | -1 | f | b | I | t | t | , | 0 | - | 0 | 1041 | inet_in | inet_out | inet_recv | inet_send | - | - | - | i | m | f | 0 | -1 | 0 | 0 | | | |
| 1000 | _bool | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 16 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1001 | _bytea | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 17 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1002 | _char | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 18 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1003 | _name | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 19 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 950 | | | |
| 1005 | _int2 | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 21 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1006 | _int2vector | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 22 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1007 | _int4 | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 23 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1008 | _regproc | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 24 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1009 | _text | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 25 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 100 | | | |
| 1010 | _tid | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 27 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1011 | _xid | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 28 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1012 | _cid | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 29 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1013 | _oidvector | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 30 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1014 | _bpchar | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1042 | 0 | array_in | array_out | array_recv | array_send | bpchartypmodin | bpchartypmodout | array_typanalyze | i | x | f | 0 | -1 | 0 | 100 | | | |
| 1015 | _varchar | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1043 | 0 | array_in | array_out | array_recv | array_send | varchartypmodin | varchartypmodout | array_typanalyze | i | x | f | 0 | -1 | 0 | 100 | | | |
| 1016 | _int8 | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 20 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1017 | _point | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 600 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1018 | _lseg | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 601 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1019 | _path | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 602 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1020 | _box | 11 | 10 | -1 | f | b | A | f | t | ; | 0 | array_subscript_handler | 603 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1021 | _float4 | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 700 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1022 | _float8 | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 701 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1027 | _polygon | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 604 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1028 | _oid | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 26 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1033 | aclitem | 11 | 10 | 16 | f | b | U | f | t | , | 0 | - | 0 | 1034 | aclitemin | aclitemout | - | - | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 1034 | _aclitem | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1033 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1040 | _macaddr | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 829 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1041 | _inet | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 869 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1042 | bpchar | 11 | 10 | -1 | f | b | S | f | t | , | 0 | - | 0 | 1014 | bpcharin | bpcharout | bpcharrecv | bpcharsend | bpchartypmodin | bpchartypmodout | - | i | x | f | 0 | -1 | 0 | 100 | | | |
| 1043 | varchar | 11 | 10 | -1 | f | b | S | f | t | , | 0 | - | 0 | 1015 | varcharin | varcharout | varcharrecv | varcharsend | varchartypmodin | varchartypmodout | - | i | x | f | 0 | -1 | 0 | 100 | | | |
| 1082 | date | 11 | 10 | 4 | t | b | D | f | t | , | 0 | - | 0 | 1182 | date_in | date_out | date_recv | date_send | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 1083 | time | 11 | 10 | 8 | t | b | D | f | t | , | 0 | - | 0 | 1183 | time_in | time_out | time_recv | time_send | timetypmodin | timetypmodout | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 1114 | timestamp | 11 | 10 | 8 | t | b | D | f | t | , | 0 | - | 0 | 1115 | timestamp_in | timestamp_out | timestamp_recv | timestamp_send | timestamptypmodin | timestamptypmodout | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 1115 | _timestamp | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1114 | 0 | array_in | array_out | array_recv | array_send | timestamptypmodin | timestamptypmodout | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1182 | _date | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1082 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1183 | _time | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1083 | 0 | array_in | array_out | array_recv | array_send | timetypmodin | timetypmodout | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1184 | timestamptz | 11 | 10 | 8 | t | b | D | t | t | , | 0 | - | 0 | 1185 | timestamptz_in | timestamptz_out | timestamptz_recv | timestamptz_send | timestamptztypmodin | timestamptztypmodout | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 1185 | _timestamptz | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1184 | 0 | array_in | array_out | array_recv | array_send | timestamptztypmodin | timestamptztypmodout | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1186 | interval | 11 | 10 | 16 | f | b | T | t | t | , | 0 | - | 0 | 1187 | interval_in | interval_out | interval_recv | interval_send | intervaltypmodin | intervaltypmodout | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 1187 | _interval | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1186 | 0 | array_in | array_out | array_recv | array_send | intervaltypmodin | intervaltypmodout | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1231 | _numeric | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1700 | 0 | array_in | array_out | array_recv | array_send | numerictypmodin | numerictypmodout | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1248 | pg_database | 11 | 10 | -1 | f | c | C | f | t | , | 1262 | - | 0 | 10052 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1263 | _cstring | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 2275 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1266 | timetz | 11 | 10 | 12 | f | b | D | f | t | , | 0 | - | 0 | 1270 | timetz_in | timetz_out | timetz_recv | timetz_send | timetztypmodin | timetztypmodout | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 1270 | _timetz | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1266 | 0 | array_in | array_out | array_recv | array_send | timetztypmodin | timetztypmodout | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 1560 | bit | 11 | 10 | -1 | f | b | V | f | t | , | 0 | - | 0 | 1561 | bit_in | bit_out | bit_recv | bit_send | bittypmodin | bittypmodout | - | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1561 | _bit | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1560 | 0 | array_in | array_out | array_recv | array_send | bittypmodin | bittypmodout | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1562 | varbit | 11 | 10 | -1 | f | b | V | t | t | , | 0 | - | 0 | 1563 | varbit_in | varbit_out | varbit_recv | varbit_send | varbittypmodin | varbittypmodout | - | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1563 | _varbit | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1562 | 0 | array_in | array_out | array_recv | array_send | varbittypmodin | varbittypmodout | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 1700 | numeric | 11 | 10 | -1 | f | b | N | f | t | , | 0 | - | 0 | 1231 | numeric_in | numeric_out | numeric_recv | numeric_send | numerictypmodin | numerictypmodout | - | i | m | f | 0 | -1 | 0 | 0 | | | |
| 1790 | refcursor | 11 | 10 | -1 | f | b | U | f | t | , | 0 | - | 0 | 2201 | textin | textout | textrecv | textsend | - | - | - | i | x | f | 0 | -1 | 0 | 0 | | | |
| 2201 | _refcursor | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1790 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 2202 | regprocedure | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 2207 | regprocedurein | regprocedureout | regprocedurerecv | regproceduresend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 2203 | regoper | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 2208 | regoperin | regoperout | regoperrecv | regopersend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 2204 | regoperator | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 2209 | regoperatorin | regoperatorout | regoperatorrecv | regoperatorsend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 2205 | regclass | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 2210 | regclassin | regclassout | regclassrecv | regclasssend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 2206 | regtype | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 2211 | regtypein | regtypeout | regtyperecv | regtypesend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 2207 | _regprocedure | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 2202 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 2208 | _regoper | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 2203 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 2209 | _regoperator | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 2204 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 2210 | _regclass | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 2205 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 2211 | _regtype | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 2206 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 2249 | record | 11 | 10 | -1 | f | p | P | f | t | , | 0 | - | 0 | 2287 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 2275 | cstring | 11 | 10 | -2 | f | p | P | f | t | , | 0 | - | 0 | 1263 | cstring_in | cstring_out | cstring_recv | cstring_send | - | - | - | c | p | f | 0 | -1 | 0 | 0 | | | |
| 2276 | any | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | any_in | any_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 2277 | anyarray | 11 | 10 | -1 | f | p | P | f | t | , | 0 | - | 0 | 0 | anyarray_in | anyarray_out | anyarray_recv | anyarray_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 2278 | void | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | void_in | void_out | void_recv | void_send | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 2279 | trigger | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | trigger_in | trigger_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 2280 | language_handler | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | language_handler_in | language_handler_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 2281 | internal | 11 | 10 | 8 | t | p | P | f | t | , | 0 | - | 0 | 0 | internal_in | internal_out | - | - | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 2283 | anyelement | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | anyelement_in | anyelement_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 2287 | _record | 11 | 10 | -1 | f | p | P | f | t | , | 0 | array_subscript_handler | 2249 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 2776 | anynonarray | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | anynonarray_in | anynonarray_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 2842 | pg_authid | 11 | 10 | -1 | f | c | C | f | t | , | 1260 | - | 0 | 10057 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 2843 | pg_auth_members | 11 | 10 | -1 | f | c | C | f | t | , | 1261 | - | 0 | 10058 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 2949 | _txid_snapshot | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 2970 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 2950 | uuid | 11 | 10 | 16 | f | b | U | f | t | , | 0 | - | 0 | 2951 | uuid_in | uuid_out | uuid_recv | uuid_send | - | - | - | c | p | f | 0 | -1 | 0 | 0 | | | |
| 2951 | _uuid | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 2950 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 2970 | txid_snapshot | 11 | 10 | -1 | f | b | U | f | t | , | 0 | - | 0 | 2949 | txid_snapshot_in | txid_snapshot_out | txid_snapshot_recv | txid_snapshot_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 3115 | fdw_handler | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | fdw_handler_in | fdw_handler_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 3220 | pg_lsn | 11 | 10 | 8 | t | b | U | f | t | , | 0 | - | 0 | 3221 | pg_lsn_in | pg_lsn_out | pg_lsn_recv | pg_lsn_send | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 3221 | _pg_lsn | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3220 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 3310 | tsm_handler | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | tsm_handler_in | tsm_handler_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 3361 | pg_ndistinct | 11 | 10 | -1 | f | b | Z | f | t | , | 0 | - | 0 | 0 | pg_ndistinct_in | pg_ndistinct_out | pg_ndistinct_recv | pg_ndistinct_send | - | - | - | i | x | f | 0 | -1 | 0 | 100 | | | |
| 3402 | pg_dependencies | 11 | 10 | -1 | f | b | Z | f | t | , | 0 | - | 0 | 0 | pg_dependencies_in | pg_dependencies_out | pg_dependencies_recv | pg_dependencies_send | - | - | - | i | x | f | 0 | -1 | 0 | 100 | | | |
| 3500 | anyenum | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | anyenum_in | anyenum_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 3614 | tsvector | 11 | 10 | -1 | f | b | U | f | t | , | 0 | - | 0 | 3643 | tsvectorin | tsvectorout | tsvectorrecv | tsvectorsend | - | - | ts_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3615 | tsquery | 11 | 10 | -1 | f | b | U | f | t | , | 0 | - | 0 | 3645 | tsqueryin | tsqueryout | tsqueryrecv | tsquerysend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 3642 | gtsvector | 11 | 10 | -1 | f | b | U | f | t | , | 0 | - | 0 | 3644 | gtsvectorin | gtsvectorout | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 3643 | _tsvector | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3614 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3644 | _gtsvector | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3642 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3645 | _tsquery | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3615 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3734 | regconfig | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 3735 | regconfigin | regconfigout | regconfigrecv | regconfigsend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 3735 | _regconfig | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3734 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3769 | regdictionary | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 3770 | regdictionaryin | regdictionaryout | regdictionaryrecv | regdictionarysend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 3770 | _regdictionary | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3769 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3802 | jsonb | 11 | 10 | -1 | f | b | U | f | t | , | 0 | jsonb_subscript_handler | 0 | 3807 | jsonb_in | jsonb_out | jsonb_recv | jsonb_send | - | - | - | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3807 | _jsonb | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3802 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3831 | anyrange | 11 | 10 | -1 | f | p | P | f | t | , | 0 | - | 0 | 0 | anyrange_in | anyrange_out | - | - | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 3838 | event_trigger | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | event_trigger_in | event_trigger_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 3904 | int4range | 11 | 10 | -1 | f | r | R | f | t | , | 0 | - | 0 | 3905 | range_in | range_out | range_recv | range_send | - | - | range_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3905 | _int4range | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3904 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3906 | numrange | 11 | 10 | -1 | f | r | R | f | t | , | 0 | - | 0 | 3907 | range_in | range_out | range_recv | range_send | - | - | range_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3907 | _numrange | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3906 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3908 | tsrange | 11 | 10 | -1 | f | r | R | f | t | , | 0 | - | 0 | 3909 | range_in | range_out | range_recv | range_send | - | - | range_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 3909 | _tsrange | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3908 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 3910 | tstzrange | 11 | 10 | -1 | f | r | R | f | t | , | 0 | - | 0 | 3911 | range_in | range_out | range_recv | range_send | - | - | range_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 3911 | _tstzrange | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3910 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 3912 | daterange | 11 | 10 | -1 | f | r | R | f | t | , | 0 | - | 0 | 3913 | range_in | range_out | range_recv | range_send | - | - | range_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3913 | _daterange | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3912 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 3926 | int8range | 11 | 10 | -1 | f | r | R | f | t | , | 0 | - | 0 | 3927 | range_in | range_out | range_recv | range_send | - | - | range_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 3927 | _int8range | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 3926 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 4066 | pg_shseclabel | 11 | 10 | -1 | f | c | C | f | t | , | 3592 | - | 0 | 10093 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 4072 | jsonpath | 11 | 10 | -1 | f | b | U | f | t | , | 0 | - | 0 | 4073 | jsonpath_in | jsonpath_out | jsonpath_recv | jsonpath_send | - | - | - | i | x | f | 0 | -1 | 0 | 0 | | | |
| 4073 | _jsonpath | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 4072 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 4089 | regnamespace | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 4090 | regnamespacein | regnamespaceout | regnamespacerecv | regnamespacesend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 4090 | _regnamespace | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 4089 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 4096 | regrole | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 4097 | regrolein | regroleout | regrolerecv | regrolesend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 4097 | _regrole | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 4096 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 4191 | regcollation | 11 | 10 | 4 | t | b | N | f | t | , | 0 | - | 0 | 4192 | regcollationin | regcollationout | regcollationrecv | regcollationsend | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 4192 | _regcollation | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 4191 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 4451 | int4multirange | 11 | 10 | -1 | f | m | R | f | t | , | 0 | - | 0 | 6150 | multirange_in | multirange_out | multirange_recv | multirange_send | - | - | multirange_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 4532 | nummultirange | 11 | 10 | -1 | f | m | R | f | t | , | 0 | - | 0 | 6151 | multirange_in | multirange_out | multirange_recv | multirange_send | - | - | multirange_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 4533 | tsmultirange | 11 | 10 | -1 | f | m | R | f | t | , | 0 | - | 0 | 6152 | multirange_in | multirange_out | multirange_recv | multirange_send | - | - | multirange_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 4534 | tstzmultirange | 11 | 10 | -1 | f | m | R | f | t | , | 0 | - | 0 | 6153 | multirange_in | multirange_out | multirange_recv | multirange_send | - | - | multirange_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 4535 | datemultirange | 11 | 10 | -1 | f | m | R | f | t | , | 0 | - | 0 | 6155 | multirange_in | multirange_out | multirange_recv | multirange_send | - | - | multirange_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 4536 | int8multirange | 11 | 10 | -1 | f | m | R | f | t | , | 0 | - | 0 | 6157 | multirange_in | multirange_out | multirange_recv | multirange_send | - | - | multirange_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 4537 | anymultirange | 11 | 10 | -1 | f | p | P | f | t | , | 0 | - | 0 | 0 | anymultirange_in | anymultirange_out | - | - | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 4538 | anycompatiblemultirange | 11 | 10 | -1 | f | p | P | f | t | , | 0 | - | 0 | 0 | anycompatiblemultirange_in | anycompatiblemultirange_out | - | - | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 4600 | pg_brin_bloom_summary | 11 | 10 | -1 | f | b | Z | f | t | , | 0 | - | 0 | 0 | brin_bloom_summary_in | brin_bloom_summary_out | brin_bloom_summary_recv | brin_bloom_summary_send | - | - | - | i | x | f | 0 | -1 | 0 | 100 | | | |
| 4601 | pg_brin_minmax_multi_summary | 11 | 10 | -1 | f | b | Z | f | t | , | 0 | - | 0 | 0 | brin_minmax_multi_summary_in | brin_minmax_multi_summary_out | brin_minmax_multi_summary_recv | brin_minmax_multi_summary_send | - | - | - | i | x | f | 0 | -1 | 0 | 100 | | | |
| 5017 | pg_mcv_list | 11 | 10 | -1 | f | b | Z | f | t | , | 0 | - | 0 | 0 | pg_mcv_list_in | pg_mcv_list_out | pg_mcv_list_recv | pg_mcv_list_send | - | - | - | i | x | f | 0 | -1 | 0 | 100 | | | |
| 5038 | pg_snapshot | 11 | 10 | -1 | f | b | U | f | t | , | 0 | - | 0 | 5039 | pg_snapshot_in | pg_snapshot_out | pg_snapshot_recv | pg_snapshot_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 5039 | _pg_snapshot | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 5038 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 5069 | xid8 | 11 | 10 | 8 | t | b | U | f | t | , | 0 | - | 0 | 271 | xid8in | xid8out | xid8recv | xid8send | - | - | - | d | p | f | 0 | -1 | 0 | 0 | | | |
| 5077 | anycompatible | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | anycompatible_in | anycompatible_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 5078 | anycompatiblearray | 11 | 10 | -1 | f | p | P | f | t | , | 0 | - | 0 | 0 | anycompatiblearray_in | anycompatiblearray_out | anycompatiblearray_recv | anycompatiblearray_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 5079 | anycompatiblenonarray | 11 | 10 | 4 | t | p | P | f | t | , | 0 | - | 0 | 0 | anycompatiblenonarray_in | anycompatiblenonarray_out | - | - | - | - | - | i | p | f | 0 | -1 | 0 | 0 | | | |
| 5080 | anycompatiblerange | 11 | 10 | -1 | f | p | P | f | t | , | 0 | - | 0 | 0 | anycompatiblerange_in | anycompatiblerange_out | - | - | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 6101 | pg_subscription | 11 | 10 | -1 | f | c | C | f | t | , | 6100 | - | 0 | 10112 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 6150 | _int4multirange | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 4451 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 6151 | _nummultirange | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 4532 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 6152 | _tsmultirange | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 4533 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 6153 | _tstzmultirange | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 4534 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 6155 | _datemultirange | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 4535 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 6157 | _int8multirange | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 4536 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10000 | _pg_attrdef | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10001 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10001 | pg_attrdef | 11 | 10 | -1 | f | c | C | f | t | , | 2604 | - | 0 | 10000 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10002 | _pg_constraint | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10003 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10003 | pg_constraint | 11 | 10 | -1 | f | c | C | f | t | , | 2606 | - | 0 | 10002 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10004 | _pg_inherits | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10005 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10005 | pg_inherits | 11 | 10 | -1 | f | c | C | f | t | , | 2611 | - | 0 | 10004 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10006 | _pg_index | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10007 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10007 | pg_index | 11 | 10 | -1 | f | c | C | f | t | , | 2610 | - | 0 | 10006 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10008 | _pg_operator | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10009 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10009 | pg_operator | 11 | 10 | -1 | f | c | C | f | t | , | 2617 | - | 0 | 10008 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10010 | _pg_opfamily | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10011 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10011 | pg_opfamily | 11 | 10 | -1 | f | c | C | f | t | , | 2753 | - | 0 | 10010 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10012 | _pg_opclass | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10013 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10013 | pg_opclass | 11 | 10 | -1 | f | c | C | f | t | , | 2616 | - | 0 | 10012 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10014 | _pg_am | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10015 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10015 | pg_am | 11 | 10 | -1 | f | c | C | f | t | , | 2601 | - | 0 | 10014 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10016 | _pg_amop | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10017 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10017 | pg_amop | 11 | 10 | -1 | f | c | C | f | t | , | 2602 | - | 0 | 10016 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10018 | _pg_amproc | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10019 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10019 | pg_amproc | 11 | 10 | -1 | f | c | C | f | t | , | 2603 | - | 0 | 10018 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10020 | _pg_language | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10021 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10021 | pg_language | 11 | 10 | -1 | f | c | C | f | t | , | 2612 | - | 0 | 10020 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10022 | _pg_largeobject_metadata | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10023 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10023 | pg_largeobject_metadata | 11 | 10 | -1 | f | c | C | f | t | , | 2995 | - | 0 | 10022 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10024 | _pg_largeobject | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10025 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10025 | pg_largeobject | 11 | 10 | -1 | f | c | C | f | t | , | 2613 | - | 0 | 10024 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10026 | _pg_aggregate | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10027 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10027 | pg_aggregate | 11 | 10 | -1 | f | c | C | f | t | , | 2600 | - | 0 | 10026 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10028 | _pg_statistic | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10029 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10029 | pg_statistic | 11 | 10 | -1 | f | c | C | f | t | , | 2619 | - | 0 | 10028 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10030 | _pg_statistic_ext | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10031 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10031 | pg_statistic_ext | 11 | 10 | -1 | f | c | C | f | t | , | 3381 | - | 0 | 10030 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10032 | _pg_statistic_ext_data | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10033 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10033 | pg_statistic_ext_data | 11 | 10 | -1 | f | c | C | f | t | , | 3429 | - | 0 | 10032 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10034 | _pg_rewrite | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10035 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10035 | pg_rewrite | 11 | 10 | -1 | f | c | C | f | t | , | 2618 | - | 0 | 10034 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10036 | _pg_trigger | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10037 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10037 | pg_trigger | 11 | 10 | -1 | f | c | C | f | t | , | 2620 | - | 0 | 10036 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10038 | _pg_event_trigger | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10039 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10039 | pg_event_trigger | 11 | 10 | -1 | f | c | C | f | t | , | 3466 | - | 0 | 10038 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10040 | _pg_description | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10041 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10041 | pg_description | 11 | 10 | -1 | f | c | C | f | t | , | 2609 | - | 0 | 10040 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10042 | _pg_cast | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10043 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10043 | pg_cast | 11 | 10 | -1 | f | c | C | f | t | , | 2605 | - | 0 | 10042 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10044 | _pg_enum | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10045 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10045 | pg_enum | 11 | 10 | -1 | f | c | C | f | t | , | 3501 | - | 0 | 10044 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10046 | _pg_namespace | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10047 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10047 | pg_namespace | 11 | 10 | -1 | f | c | C | f | t | , | 2615 | - | 0 | 10046 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10048 | _pg_conversion | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10049 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10049 | pg_conversion | 11 | 10 | -1 | f | c | C | f | t | , | 2607 | - | 0 | 10048 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10050 | _pg_depend | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10051 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10051 | pg_depend | 11 | 10 | -1 | f | c | C | f | t | , | 2608 | - | 0 | 10050 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10052 | _pg_database | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 1248 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10053 | _pg_db_role_setting | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10054 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10054 | pg_db_role_setting | 11 | 10 | -1 | f | c | C | f | t | , | 2964 | - | 0 | 10053 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10055 | _pg_tablespace | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10056 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10056 | pg_tablespace | 11 | 10 | -1 | f | c | C | f | t | , | 1213 | - | 0 | 10055 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10057 | _pg_authid | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 2842 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10058 | _pg_auth_members | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 2843 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10059 | _pg_shdepend | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10060 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10060 | pg_shdepend | 11 | 10 | -1 | f | c | C | f | t | , | 1214 | - | 0 | 10059 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10061 | _pg_shdescription | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10062 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10062 | pg_shdescription | 11 | 10 | -1 | f | c | C | f | t | , | 2396 | - | 0 | 10061 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10063 | _pg_ts_config | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10064 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10064 | pg_ts_config | 11 | 10 | -1 | f | c | C | f | t | , | 3602 | - | 0 | 10063 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10065 | _pg_ts_config_map | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10066 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10066 | pg_ts_config_map | 11 | 10 | -1 | f | c | C | f | t | , | 3603 | - | 0 | 10065 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10067 | _pg_ts_dict | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10068 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10068 | pg_ts_dict | 11 | 10 | -1 | f | c | C | f | t | , | 3600 | - | 0 | 10067 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10069 | _pg_ts_parser | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10070 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10070 | pg_ts_parser | 11 | 10 | -1 | f | c | C | f | t | , | 3601 | - | 0 | 10069 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10071 | _pg_ts_template | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10072 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10072 | pg_ts_template | 11 | 10 | -1 | f | c | C | f | t | , | 3764 | - | 0 | 10071 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10073 | _pg_extension | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10074 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10074 | pg_extension | 11 | 10 | -1 | f | c | C | f | t | , | 3079 | - | 0 | 10073 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10075 | _pg_foreign_data_wrapper | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10076 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10076 | pg_foreign_data_wrapper | 11 | 10 | -1 | f | c | C | f | t | , | 2328 | - | 0 | 10075 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10077 | _pg_foreign_server | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10078 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10078 | pg_foreign_server | 11 | 10 | -1 | f | c | C | f | t | , | 1417 | - | 0 | 10077 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10079 | _pg_user_mapping | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10080 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10080 | pg_user_mapping | 11 | 10 | -1 | f | c | C | f | t | , | 1418 | - | 0 | 10079 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10081 | _pg_foreign_table | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10082 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10082 | pg_foreign_table | 11 | 10 | -1 | f | c | C | f | t | , | 3118 | - | 0 | 10081 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10083 | _pg_policy | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10084 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10084 | pg_policy | 11 | 10 | -1 | f | c | C | f | t | , | 3256 | - | 0 | 10083 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10085 | _pg_replication_origin | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10086 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10086 | pg_replication_origin | 11 | 10 | -1 | f | c | C | f | t | , | 6000 | - | 0 | 10085 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10087 | _pg_default_acl | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10088 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10088 | pg_default_acl | 11 | 10 | -1 | f | c | C | f | t | , | 826 | - | 0 | 10087 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10089 | _pg_init_privs | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10090 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10090 | pg_init_privs | 11 | 10 | -1 | f | c | C | f | t | , | 3394 | - | 0 | 10089 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10091 | _pg_seclabel | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10092 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10092 | pg_seclabel | 11 | 10 | -1 | f | c | C | f | t | , | 3596 | - | 0 | 10091 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10093 | _pg_shseclabel | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 4066 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10094 | _pg_collation | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10095 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10095 | pg_collation | 11 | 10 | -1 | f | c | C | f | t | , | 3456 | - | 0 | 10094 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10096 | _pg_parameter_acl | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10097 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10097 | pg_parameter_acl | 11 | 10 | -1 | f | c | C | f | t | , | 6243 | - | 0 | 10096 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10098 | _pg_partitioned_table | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10099 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10099 | pg_partitioned_table | 11 | 10 | -1 | f | c | C | f | t | , | 3350 | - | 0 | 10098 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10100 | _pg_range | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10101 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10101 | pg_range | 11 | 10 | -1 | f | c | C | f | t | , | 3541 | - | 0 | 10100 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10102 | _pg_transform | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10103 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10103 | pg_transform | 11 | 10 | -1 | f | c | C | f | t | , | 3576 | - | 0 | 10102 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10104 | _pg_sequence | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10105 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10105 | pg_sequence | 11 | 10 | -1 | f | c | C | f | t | , | 2224 | - | 0 | 10104 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10106 | _pg_publication | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10107 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10107 | pg_publication | 11 | 10 | -1 | f | c | C | f | t | , | 6104 | - | 0 | 10106 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10108 | _pg_publication_namespace | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10109 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10109 | pg_publication_namespace | 11 | 10 | -1 | f | c | C | f | t | , | 6237 | - | 0 | 10108 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10110 | _pg_publication_rel | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10111 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10111 | pg_publication_rel | 11 | 10 | -1 | f | c | C | f | t | , | 6106 | - | 0 | 10110 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10112 | _pg_subscription | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 6101 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10113 | _pg_subscription_rel | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 10114 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 10114 | pg_subscription_rel | 11 | 10 | -1 | f | c | C | f | t | , | 6102 | - | 0 | 10113 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12001 | _pg_roles | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12002 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12002 | pg_roles | 11 | 10 | -1 | f | c | C | f | t | , | 12000 | - | 0 | 12001 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12006 | _pg_shadow | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12007 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12007 | pg_shadow | 11 | 10 | -1 | f | c | C | f | t | , | 12005 | - | 0 | 12006 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12011 | _pg_group | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12012 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12012 | pg_group | 11 | 10 | -1 | f | c | C | f | t | , | 12010 | - | 0 | 12011 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12015 | _pg_user | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12016 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12016 | pg_user | 11 | 10 | -1 | f | c | C | f | t | , | 12014 | - | 0 | 12015 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12019 | _pg_policies | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12020 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12020 | pg_policies | 11 | 10 | -1 | f | c | C | f | t | , | 12018 | - | 0 | 12019 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12024 | _pg_rules | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12025 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12025 | pg_rules | 11 | 10 | -1 | f | c | C | f | t | , | 12023 | - | 0 | 12024 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12029 | _pg_views | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12030 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12030 | pg_views | 11 | 10 | -1 | f | c | C | f | t | , | 12028 | - | 0 | 12029 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12034 | _pg_tables | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12035 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12035 | pg_tables | 11 | 10 | -1 | f | c | C | f | t | , | 12033 | - | 0 | 12034 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12039 | _pg_matviews | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12040 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12040 | pg_matviews | 11 | 10 | -1 | f | c | C | f | t | , | 12038 | - | 0 | 12039 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12044 | _pg_indexes | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12045 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12045 | pg_indexes | 11 | 10 | -1 | f | c | C | f | t | , | 12043 | - | 0 | 12044 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12049 | _pg_sequences | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12050 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12050 | pg_sequences | 11 | 10 | -1 | f | c | C | f | t | , | 12048 | - | 0 | 12049 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12054 | _pg_stats | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12055 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12055 | pg_stats | 11 | 10 | -1 | f | c | C | f | t | , | 12053 | - | 0 | 12054 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12059 | _pg_stats_ext | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12060 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12060 | pg_stats_ext | 11 | 10 | -1 | f | c | C | f | t | , | 12058 | - | 0 | 12059 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12064 | _pg_stats_ext_exprs | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12065 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12065 | pg_stats_ext_exprs | 11 | 10 | -1 | f | c | C | f | t | , | 12063 | - | 0 | 12064 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12069 | _pg_publication_tables | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12070 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12070 | pg_publication_tables | 11 | 10 | -1 | f | c | C | f | t | , | 12068 | - | 0 | 12069 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12074 | _pg_locks | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12075 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12075 | pg_locks | 11 | 10 | -1 | f | c | C | f | t | , | 12073 | - | 0 | 12074 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12078 | _pg_cursors | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12079 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12079 | pg_cursors | 11 | 10 | -1 | f | c | C | f | t | , | 12077 | - | 0 | 12078 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12082 | _pg_available_extensions | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12083 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12083 | pg_available_extensions | 11 | 10 | -1 | f | c | C | f | t | , | 12081 | - | 0 | 12082 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12086 | _pg_available_extension_versions | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12087 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12087 | pg_available_extension_versions | 11 | 10 | -1 | f | c | C | f | t | , | 12085 | - | 0 | 12086 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12091 | _pg_prepared_xacts | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12092 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12092 | pg_prepared_xacts | 11 | 10 | -1 | f | c | C | f | t | , | 12090 | - | 0 | 12091 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12096 | _pg_prepared_statements | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12097 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12097 | pg_prepared_statements | 11 | 10 | -1 | f | c | C | f | t | , | 12095 | - | 0 | 12096 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12100 | _pg_seclabels | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12101 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12101 | pg_seclabels | 11 | 10 | -1 | f | c | C | f | t | , | 12099 | - | 0 | 12100 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12105 | _pg_settings | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12106 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12106 | pg_settings | 11 | 10 | -1 | f | c | C | f | t | , | 12104 | - | 0 | 12105 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12111 | _pg_file_settings | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12112 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12112 | pg_file_settings | 11 | 10 | -1 | f | c | C | f | t | , | 12110 | - | 0 | 12111 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12115 | _pg_hba_file_rules | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12116 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12116 | pg_hba_file_rules | 11 | 10 | -1 | f | c | C | f | t | , | 12114 | - | 0 | 12115 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12119 | _pg_ident_file_mappings | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12120 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12120 | pg_ident_file_mappings | 11 | 10 | -1 | f | c | C | f | t | , | 12118 | - | 0 | 12119 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12123 | _pg_timezone_abbrevs | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12124 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12124 | pg_timezone_abbrevs | 11 | 10 | -1 | f | c | C | f | t | , | 12122 | - | 0 | 12123 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12127 | _pg_timezone_names | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12128 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12128 | pg_timezone_names | 11 | 10 | -1 | f | c | C | f | t | , | 12126 | - | 0 | 12127 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12131 | _pg_config | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12132 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12132 | pg_config | 11 | 10 | -1 | f | c | C | f | t | , | 12130 | - | 0 | 12131 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12135 | _pg_shmem_allocations | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12136 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12136 | pg_shmem_allocations | 11 | 10 | -1 | f | c | C | f | t | , | 12134 | - | 0 | 12135 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12139 | _pg_backend_memory_contexts | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12140 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12140 | pg_backend_memory_contexts | 11 | 10 | -1 | f | c | C | f | t | , | 12138 | - | 0 | 12139 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12143 | _pg_stat_all_tables | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12144 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12144 | pg_stat_all_tables | 11 | 10 | -1 | f | c | C | f | t | , | 12142 | - | 0 | 12143 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12148 | _pg_stat_xact_all_tables | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12149 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12149 | pg_stat_xact_all_tables | 11 | 10 | -1 | f | c | C | f | t | , | 12147 | - | 0 | 12148 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12153 | _pg_stat_sys_tables | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12154 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12154 | pg_stat_sys_tables | 11 | 10 | -1 | f | c | C | f | t | , | 12152 | - | 0 | 12153 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12158 | _pg_stat_xact_sys_tables | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12159 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12159 | pg_stat_xact_sys_tables | 11 | 10 | -1 | f | c | C | f | t | , | 12157 | - | 0 | 12158 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12162 | _pg_stat_user_tables | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12163 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12163 | pg_stat_user_tables | 11 | 10 | -1 | f | c | C | f | t | , | 12161 | - | 0 | 12162 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12167 | _pg_stat_xact_user_tables | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12168 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12168 | pg_stat_xact_user_tables | 11 | 10 | -1 | f | c | C | f | t | , | 12166 | - | 0 | 12167 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12171 | _pg_statio_all_tables | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12172 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12172 | pg_statio_all_tables | 11 | 10 | -1 | f | c | C | f | t | , | 12170 | - | 0 | 12171 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12176 | _pg_statio_sys_tables | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12177 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12177 | pg_statio_sys_tables | 11 | 10 | -1 | f | c | C | f | t | , | 12175 | - | 0 | 12176 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12180 | _pg_statio_user_tables | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12181 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12181 | pg_statio_user_tables | 11 | 10 | -1 | f | c | C | f | t | , | 12179 | - | 0 | 12180 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12184 | _pg_stat_all_indexes | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12185 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12185 | pg_stat_all_indexes | 11 | 10 | -1 | f | c | C | f | t | , | 12183 | - | 0 | 12184 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12189 | _pg_stat_sys_indexes | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12190 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12190 | pg_stat_sys_indexes | 11 | 10 | -1 | f | c | C | f | t | , | 12188 | - | 0 | 12189 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12193 | _pg_stat_user_indexes | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12194 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12194 | pg_stat_user_indexes | 11 | 10 | -1 | f | c | C | f | t | , | 12192 | - | 0 | 12193 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12197 | _pg_statio_all_indexes | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12198 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12198 | pg_statio_all_indexes | 11 | 10 | -1 | f | c | C | f | t | , | 12196 | - | 0 | 12197 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12202 | _pg_statio_sys_indexes | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12203 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12203 | pg_statio_sys_indexes | 11 | 10 | -1 | f | c | C | f | t | , | 12201 | - | 0 | 12202 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12206 | _pg_statio_user_indexes | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12207 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12207 | pg_statio_user_indexes | 11 | 10 | -1 | f | c | C | f | t | , | 12205 | - | 0 | 12206 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12210 | _pg_statio_all_sequences | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12211 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12211 | pg_statio_all_sequences | 11 | 10 | -1 | f | c | C | f | t | , | 12209 | - | 0 | 12210 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12215 | _pg_statio_sys_sequences | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12216 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12216 | pg_statio_sys_sequences | 11 | 10 | -1 | f | c | C | f | t | , | 12214 | - | 0 | 12215 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12219 | _pg_statio_user_sequences | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12220 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12220 | pg_statio_user_sequences | 11 | 10 | -1 | f | c | C | f | t | , | 12218 | - | 0 | 12219 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12223 | _pg_stat_activity | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12224 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12224 | pg_stat_activity | 11 | 10 | -1 | f | c | C | f | t | , | 12222 | - | 0 | 12223 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12228 | _pg_stat_replication | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12229 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12229 | pg_stat_replication | 11 | 10 | -1 | f | c | C | f | t | , | 12227 | - | 0 | 12228 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12233 | _pg_stat_slru | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12234 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12234 | pg_stat_slru | 11 | 10 | -1 | f | c | C | f | t | , | 12232 | - | 0 | 12233 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12237 | _pg_stat_wal_receiver | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12238 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12238 | pg_stat_wal_receiver | 11 | 10 | -1 | f | c | C | f | t | , | 12236 | - | 0 | 12237 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12241 | _pg_stat_recovery_prefetch | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12242 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12242 | pg_stat_recovery_prefetch | 11 | 10 | -1 | f | c | C | f | t | , | 12240 | - | 0 | 12241 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12245 | _pg_stat_subscription | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12246 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12246 | pg_stat_subscription | 11 | 10 | -1 | f | c | C | f | t | , | 12244 | - | 0 | 12245 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12250 | _pg_stat_ssl | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12251 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12251 | pg_stat_ssl | 11 | 10 | -1 | f | c | C | f | t | , | 12249 | - | 0 | 12250 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12254 | _pg_stat_gssapi | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12255 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12255 | pg_stat_gssapi | 11 | 10 | -1 | f | c | C | f | t | , | 12253 | - | 0 | 12254 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12258 | _pg_replication_slots | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12259 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12259 | pg_replication_slots | 11 | 10 | -1 | f | c | C | f | t | , | 12257 | - | 0 | 12258 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12263 | _pg_stat_replication_slots | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12264 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12264 | pg_stat_replication_slots | 11 | 10 | -1 | f | c | C | f | t | , | 12262 | - | 0 | 12263 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12267 | _pg_stat_database | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12268 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12268 | pg_stat_database | 11 | 10 | -1 | f | c | C | f | t | , | 12266 | - | 0 | 12267 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12272 | _pg_stat_database_conflicts | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12273 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12273 | pg_stat_database_conflicts | 11 | 10 | -1 | f | c | C | f | t | , | 12271 | - | 0 | 12272 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12276 | _pg_stat_user_functions | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12277 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12277 | pg_stat_user_functions | 11 | 10 | -1 | f | c | C | f | t | , | 12275 | - | 0 | 12276 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12281 | _pg_stat_xact_user_functions | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12282 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12282 | pg_stat_xact_user_functions | 11 | 10 | -1 | f | c | C | f | t | , | 12280 | - | 0 | 12281 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12286 | _pg_stat_archiver | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12287 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12287 | pg_stat_archiver | 11 | 10 | -1 | f | c | C | f | t | , | 12285 | - | 0 | 12286 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12290 | _pg_stat_bgwriter | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12291 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12291 | pg_stat_bgwriter | 11 | 10 | -1 | f | c | C | f | t | , | 12289 | - | 0 | 12290 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12294 | _pg_stat_checkpointer | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12295 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12295 | pg_stat_checkpointer | 11 | 10 | -1 | f | c | C | f | t | , | 12293 | - | 0 | 12294 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12298 | _pg_stat_io | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12299 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12299 | pg_stat_io | 11 | 10 | -1 | f | c | C | f | t | , | 12297 | - | 0 | 12298 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12302 | _pg_stat_wal | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12303 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12303 | pg_stat_wal | 11 | 10 | -1 | f | c | C | f | t | , | 12301 | - | 0 | 12302 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12306 | _pg_stat_progress_analyze | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12307 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12307 | pg_stat_progress_analyze | 11 | 10 | -1 | f | c | C | f | t | , | 12305 | - | 0 | 12306 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12311 | _pg_stat_progress_vacuum | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12312 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12312 | pg_stat_progress_vacuum | 11 | 10 | -1 | f | c | C | f | t | , | 12310 | - | 0 | 12311 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12316 | _pg_stat_progress_cluster | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12317 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12317 | pg_stat_progress_cluster | 11 | 10 | -1 | f | c | C | f | t | , | 12315 | - | 0 | 12316 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12321 | _pg_stat_progress_create_index | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12322 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12322 | pg_stat_progress_create_index | 11 | 10 | -1 | f | c | C | f | t | , | 12320 | - | 0 | 12321 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12326 | _pg_stat_progress_basebackup | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12327 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12327 | pg_stat_progress_basebackup | 11 | 10 | -1 | f | c | C | f | t | , | 12325 | - | 0 | 12326 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12330 | _pg_stat_progress_copy | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12331 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12331 | pg_stat_progress_copy | 11 | 10 | -1 | f | c | C | f | t | , | 12329 | - | 0 | 12330 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12335 | _pg_user_mappings | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12336 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12336 | pg_user_mappings | 11 | 10 | -1 | f | c | C | f | t | , | 12334 | - | 0 | 12335 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12340 | _pg_replication_origin_status | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12341 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12341 | pg_replication_origin_status | 11 | 10 | -1 | f | c | C | f | t | , | 12339 | - | 0 | 12340 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12344 | _pg_stat_subscription_stats | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12345 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12345 | pg_stat_subscription_stats | 11 | 10 | -1 | f | c | C | f | t | , | 12343 | - | 0 | 12344 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12348 | _pg_wait_events | 11 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 12349 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 12349 | pg_wait_events | 11 | 10 | -1 | f | c | C | f | t | , | 12347 | - | 0 | 12348 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13296 | _cardinal_number | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13297 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 0 | | | |
| 13297 | cardinal_number | 13283 | 10 | 4 | t | d | N | f | t | , | 0 | - | 0 | 13296 | domain_in | int4out | domain_recv | int4send | - | - | - | i | p | f | 23 | -1 | 0 | 0 | | | |
| 13299 | _character_data | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13300 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 950 | | | |
| 13300 | character_data | 13283 | 10 | -1 | f | d | S | f | t | , | 0 | - | 0 | 13299 | domain_in | varcharout | domain_recv | varcharsend | - | - | - | i | x | f | 1043 | -1 | 0 | 950 | | | |
| 13301 | _sql_identifier | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13302 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 950 | | | |
| 13302 | sql_identifier | 13283 | 10 | 64 | f | d | S | f | t | , | 0 | - | 0 | 13301 | domain_in | nameout | domain_recv | namesend | - | - | - | c | p | f | 19 | -1 | 0 | 950 | | | |
| 13304 | _information_schema_catalog_name | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13305 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13305 | information_schema_catalog_name | 13283 | 10 | -1 | f | c | C | f | t | , | 13303 | - | 0 | 13304 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13307 | _time_stamp | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13308 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13308 | time_stamp | 13283 | 10 | 8 | t | d | D | f | t | , | 0 | - | 0 | 13307 | domain_in | timestamptz_out | domain_recv | timestamptz_send | - | - | - | d | p | f | 1184 | 2 | 0 | 0 | {SQLVALUEFUNCTION :op 4 :type 1184 :typmod 2 :location -1} | CURRENT_TIMESTAMP(2) | |
| 13309 | _yes_or_no | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13310 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | i | x | f | 0 | -1 | 0 | 950 | | | |
| 13310 | yes_or_no | 13283 | 10 | -1 | f | d | S | f | t | , | 0 | - | 0 | 13309 | domain_in | varcharout | domain_recv | varcharsend | - | - | - | i | x | f | 1043 | 7 | 0 | 950 | | | |
| 13313 | _applicable_roles | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13314 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13314 | applicable_roles | 13283 | 10 | -1 | f | c | C | f | t | , | 13312 | - | 0 | 13313 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13318 | _administrable_role_authorizations | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13319 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13319 | administrable_role_authorizations | 13283 | 10 | -1 | f | c | C | f | t | , | 13317 | - | 0 | 13318 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13322 | _attributes | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13323 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13323 | attributes | 13283 | 10 | -1 | f | c | C | f | t | , | 13321 | - | 0 | 13322 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13327 | _character_sets | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13328 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13328 | character_sets | 13283 | 10 | -1 | f | c | C | f | t | , | 13326 | - | 0 | 13327 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13332 | _check_constraint_routine_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13333 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13333 | check_constraint_routine_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13331 | - | 0 | 13332 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13337 | _check_constraints | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13338 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13338 | check_constraints | 13283 | 10 | -1 | f | c | C | f | t | , | 13336 | - | 0 | 13337 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13342 | _collations | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13343 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13343 | collations | 13283 | 10 | -1 | f | c | C | f | t | , | 13341 | - | 0 | 13342 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13347 | _collation_character_set_applicability | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13348 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13348 | collation_character_set_applicability | 13283 | 10 | -1 | f | c | C | f | t | , | 13346 | - | 0 | 13347 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13352 | _column_column_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13353 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13353 | column_column_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13351 | - | 0 | 13352 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13357 | _column_domain_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13358 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13358 | column_domain_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13356 | - | 0 | 13357 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13362 | _column_privileges | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13363 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13363 | column_privileges | 13283 | 10 | -1 | f | c | C | f | t | , | 13361 | - | 0 | 13362 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13367 | _column_udt_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13368 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13368 | column_udt_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13366 | - | 0 | 13367 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13372 | _columns | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13373 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13373 | columns | 13283 | 10 | -1 | f | c | C | f | t | , | 13371 | - | 0 | 13372 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13377 | _constraint_column_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13378 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13378 | constraint_column_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13376 | - | 0 | 13377 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13382 | _constraint_table_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13383 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13383 | constraint_table_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13381 | - | 0 | 13382 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13387 | _domain_constraints | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13388 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13388 | domain_constraints | 13283 | 10 | -1 | f | c | C | f | t | , | 13386 | - | 0 | 13387 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13392 | _domain_udt_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13393 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13393 | domain_udt_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13391 | - | 0 | 13392 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13396 | _domains | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13397 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13397 | domains | 13283 | 10 | -1 | f | c | C | f | t | , | 13395 | - | 0 | 13396 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13401 | _enabled_roles | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13402 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13402 | enabled_roles | 13283 | 10 | -1 | f | c | C | f | t | , | 13400 | - | 0 | 13401 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13405 | _key_column_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13406 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13406 | key_column_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13404 | - | 0 | 13405 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13410 | _parameters | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13411 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13411 | parameters | 13283 | 10 | -1 | f | c | C | f | t | , | 13409 | - | 0 | 13410 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13415 | _referential_constraints | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13416 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13416 | referential_constraints | 13283 | 10 | -1 | f | c | C | f | t | , | 13414 | - | 0 | 13415 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13420 | _role_column_grants | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13421 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13421 | role_column_grants | 13283 | 10 | -1 | f | c | C | f | t | , | 13419 | - | 0 | 13420 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13424 | _routine_column_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13425 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13425 | routine_column_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13423 | - | 0 | 13424 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13429 | _routine_privileges | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13430 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13430 | routine_privileges | 13283 | 10 | -1 | f | c | C | f | t | , | 13428 | - | 0 | 13429 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13434 | _role_routine_grants | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13435 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13435 | role_routine_grants | 13283 | 10 | -1 | f | c | C | f | t | , | 13433 | - | 0 | 13434 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13438 | _routine_routine_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13439 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13439 | routine_routine_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13437 | - | 0 | 13438 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13443 | _routine_sequence_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13444 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13444 | routine_sequence_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13442 | - | 0 | 13443 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13448 | _routine_table_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13449 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13449 | routine_table_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13447 | - | 0 | 13448 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13453 | _routines | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13454 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13454 | routines | 13283 | 10 | -1 | f | c | C | f | t | , | 13452 | - | 0 | 13453 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13458 | _schemata | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13459 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13459 | schemata | 13283 | 10 | -1 | f | c | C | f | t | , | 13457 | - | 0 | 13458 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13462 | _sequences | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13463 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13463 | sequences | 13283 | 10 | -1 | f | c | C | f | t | , | 13461 | - | 0 | 13462 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13467 | _sql_features | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13468 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13468 | sql_features | 13283 | 10 | -1 | f | c | C | f | t | , | 13466 | - | 0 | 13467 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13472 | _sql_implementation_info | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13473 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13473 | sql_implementation_info | 13283 | 10 | -1 | f | c | C | f | t | , | 13471 | - | 0 | 13472 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13477 | _sql_parts | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13478 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13478 | sql_parts | 13283 | 10 | -1 | f | c | C | f | t | , | 13476 | - | 0 | 13477 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13482 | _sql_sizing | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13483 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13483 | sql_sizing | 13283 | 10 | -1 | f | c | C | f | t | , | 13481 | - | 0 | 13482 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13487 | _table_constraints | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13488 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13488 | table_constraints | 13283 | 10 | -1 | f | c | C | f | t | , | 13486 | - | 0 | 13487 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13492 | _table_privileges | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13493 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13493 | table_privileges | 13283 | 10 | -1 | f | c | C | f | t | , | 13491 | - | 0 | 13492 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13497 | _role_table_grants | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13498 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13498 | role_table_grants | 13283 | 10 | -1 | f | c | C | f | t | , | 13496 | - | 0 | 13497 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13501 | _tables | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13502 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13502 | tables | 13283 | 10 | -1 | f | c | C | f | t | , | 13500 | - | 0 | 13501 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13506 | _transforms | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13507 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13507 | transforms | 13283 | 10 | -1 | f | c | C | f | t | , | 13505 | - | 0 | 13506 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13511 | _triggered_update_columns | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13512 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13512 | triggered_update_columns | 13283 | 10 | -1 | f | c | C | f | t | , | 13510 | - | 0 | 13511 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13516 | _triggers | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13517 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13517 | triggers | 13283 | 10 | -1 | f | c | C | f | t | , | 13515 | - | 0 | 13516 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13521 | _udt_privileges | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13522 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13522 | udt_privileges | 13283 | 10 | -1 | f | c | C | f | t | , | 13520 | - | 0 | 13521 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13526 | _role_udt_grants | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13527 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13527 | role_udt_grants | 13283 | 10 | -1 | f | c | C | f | t | , | 13525 | - | 0 | 13526 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13530 | _usage_privileges | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13531 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13531 | usage_privileges | 13283 | 10 | -1 | f | c | C | f | t | , | 13529 | - | 0 | 13530 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13535 | _role_usage_grants | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13536 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13536 | role_usage_grants | 13283 | 10 | -1 | f | c | C | f | t | , | 13534 | - | 0 | 13535 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13539 | _user_defined_types | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13540 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13540 | user_defined_types | 13283 | 10 | -1 | f | c | C | f | t | , | 13538 | - | 0 | 13539 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13544 | _view_column_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13545 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13545 | view_column_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13543 | - | 0 | 13544 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13549 | _view_routine_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13550 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13550 | view_routine_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13548 | - | 0 | 13549 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13554 | _view_table_usage | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13555 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13555 | view_table_usage | 13283 | 10 | -1 | f | c | C | f | t | , | 13553 | - | 0 | 13554 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13559 | _views | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13560 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13560 | views | 13283 | 10 | -1 | f | c | C | f | t | , | 13558 | - | 0 | 13559 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13564 | _data_type_privileges | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13565 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13565 | data_type_privileges | 13283 | 10 | -1 | f | c | C | f | t | , | 13563 | - | 0 | 13564 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13569 | _element_types | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13570 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13570 | element_types | 13283 | 10 | -1 | f | c | C | f | t | , | 13568 | - | 0 | 13569 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13574 | __pg_foreign_table_columns | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13575 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13575 | _pg_foreign_table_columns | 13283 | 10 | -1 | f | c | C | f | t | , | 13573 | - | 0 | 13574 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13579 | _column_options | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13580 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13580 | column_options | 13283 | 10 | -1 | f | c | C | f | t | , | 13578 | - | 0 | 13579 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13583 | __pg_foreign_data_wrappers | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13584 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13584 | _pg_foreign_data_wrappers | 13283 | 10 | -1 | f | c | C | f | t | , | 13582 | - | 0 | 13583 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13587 | _foreign_data_wrapper_options | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13588 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13588 | foreign_data_wrapper_options | 13283 | 10 | -1 | f | c | C | f | t | , | 13586 | - | 0 | 13587 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13591 | _foreign_data_wrappers | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13592 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13592 | foreign_data_wrappers | 13283 | 10 | -1 | f | c | C | f | t | , | 13590 | - | 0 | 13591 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13595 | __pg_foreign_servers | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13596 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13596 | _pg_foreign_servers | 13283 | 10 | -1 | f | c | C | f | t | , | 13594 | - | 0 | 13595 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13599 | _foreign_server_options | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13600 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13600 | foreign_server_options | 13283 | 10 | -1 | f | c | C | f | t | , | 13598 | - | 0 | 13599 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13603 | _foreign_servers | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13604 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13604 | foreign_servers | 13283 | 10 | -1 | f | c | C | f | t | , | 13602 | - | 0 | 13603 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13607 | __pg_foreign_tables | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13608 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13608 | _pg_foreign_tables | 13283 | 10 | -1 | f | c | C | f | t | , | 13606 | - | 0 | 13607 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13612 | _foreign_table_options | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13613 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13613 | foreign_table_options | 13283 | 10 | -1 | f | c | C | f | t | , | 13611 | - | 0 | 13612 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13616 | _foreign_tables | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13617 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13617 | foreign_tables | 13283 | 10 | -1 | f | c | C | f | t | , | 13615 | - | 0 | 13616 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13620 | __pg_user_mappings | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13621 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13621 | _pg_user_mappings | 13283 | 10 | -1 | f | c | C | f | t | , | 13619 | - | 0 | 13620 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13625 | _user_mapping_options | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13626 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13626 | user_mapping_options | 13283 | 10 | -1 | f | c | C | f | t | , | 13624 | - | 0 | 13625 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13630 | _user_mappings | 13283 | 10 | -1 | f | b | A | f | t | , | 0 | array_subscript_handler | 13631 | 0 | array_in | array_out | array_recv | array_send | - | - | array_typanalyze | d | x | f | 0 | -1 | 0 | 0 | | | |
| 13631 | user_mappings | 13283 | 10 | -1 | f | c | C | f | t | , | 13629 | - | 0 | 13630 | record_in | record_out | record_recv | record_send | - | - | - | d | x | f | 0 | -1 | 0 | 0 | | | |
+-------+----------------------------------------+--------------+----------+--------+----------+---------+-------------+----------------+--------------+----------+----------+-----------------------------+---------+----------+------------------------------+-------------------------------+--------------------------------+--------------------------------+---------------------+----------------------+-----------------------+----------+------------+------------+-------------+-----------+----------+--------------+------------------------------------------------------------+----------------------+--------+
-- SQLNESS PROTOCOL POSTGRES
-- SQLNESS REPLACE (\d+\s*) OID
select * from pg_catalog.pg_database where datname = 'public';
+------------+---------+
| oid | datname |
+------------+---------+
| OID| public |
+------------+---------+
+-----+---------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+------------+---------------+--------+
| oid | datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace | datacl |
+-----+---------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+------------+---------------+--------+
+-----+---------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+------------+---------------+--------+
-- \d
-- SQLNESS PROTOCOL POSTGRES
@@ -136,11 +732,11 @@ WHERE c.relkind IN ('r','p','v','m','S','f','')
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
+--------+---------+-------+-------+
| Schema | Name | Type | Owner |
+--------+---------+-------+-------+
| public | numbers | table | |
+--------+---------+-------+-------+
+--------+---------+-------+----------+
| Schema | Name | Type | Owner |
+--------+---------+-------+----------+
| public | numbers | table | postgres |
+--------+---------+-------+----------+
-- \dt
-- SQLNESS PROTOCOL POSTGRES
@@ -157,25 +753,24 @@ WHERE c.relkind IN ('r','p','')
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
+--------+---------+-------+-------+
| Schema | Name | Type | Owner |
+--------+---------+-------+-------+
| public | numbers | table | |
+--------+---------+-------+-------+
+--------+---------+-------+----------+
| Schema | Name | Type | Owner |
+--------+---------+-------+----------+
| public | numbers | table | postgres |
+--------+---------+-------+----------+
-- make sure oid of namespace keep stable
-- SQLNESS PROTOCOL POSTGRES
-- SQLNESS REPLACE (\d+\s*) OID
SELECT * FROM pg_namespace ORDER BY nspname;
+------------+--------------------+
| oid | nspname |
+------------+--------------------+
| OID| greptime_private |
| OID| information_schema |
| OID| pg_catalog |
| OID| public |
+------------+--------------------+
+-------+--------------------+----------+--------+---------+
| oid | nspname | nspowner | nspacl | options |
+-------+--------------------+----------+--------+---------+
| OID| greptime_private | OID| | |
| OID| information_schema | OID| | |
| OID| public | OID| | |
+-------+--------------------+----------+--------+---------+
-- SQLNESS PROTOCOL POSTGRES
create database my_db;
@@ -226,12 +821,12 @@ WHERE c.relkind IN ('r','p','')
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
+--------+---------+-------+-------+
| Schema | Name | Type | Owner |
+--------+---------+-------+-------+
| my_db | foo | table | |
| public | numbers | table | |
+--------+---------+-------+-------+
+--------+---------+-------+----------+
| Schema | Name | Type | Owner |
+--------+---------+-------+----------+
| my_db | foo | table | postgres |
| public | numbers | table | postgres |
+--------+---------+-------+----------+
-- show tables in `my_db`, `public`
-- SQLNESS PROTOCOL POSTGRES
@@ -304,25 +899,54 @@ use pg_catalog;
-- SQLNESS PROTOCOL POSTGRES
desc table pg_class;
+--------------+--------+-----+------+---------+---------------+
| Column | Type | Key | Null | Default | Semantic Type |
+--------------+--------+-----+------+---------+---------------+
| oid | UInt32 | | NO | | FIELD |
| relname | String | | NO | | FIELD |
| relnamespace | UInt32 | | NO | | FIELD |
| relkind | String | | NO | | FIELD |
| relowner | UInt32 | | NO | | FIELD |
+--------------+--------+-----+------+---------+---------------+
+---------------------+---------+-----+------+---------+---------------+
| Column | Type | Key | Null | Default | Semantic Type |
+---------------------+---------+-----+------+---------+---------------+
| oid | Int32 | | NO | | FIELD |
| relname | String | | NO | | FIELD |
| relnamespace | Int32 | | NO | | FIELD |
| reltype | Int32 | | NO | | FIELD |
| reloftype | Int32 | | YES | | FIELD |
| relowner | Int32 | | NO | | FIELD |
| relam | Int32 | | NO | | FIELD |
| relfilenode | Int32 | | NO | | FIELD |
| reltablespace | Int32 | | NO | | FIELD |
| relpages | Int32 | | NO | | FIELD |
| reltuples | Float64 | | NO | | FIELD |
| relallvisible | Int32 | | NO | | FIELD |
| reltoastrelid | Int32 | | NO | | FIELD |
| relhasindex | Boolean | | NO | | FIELD |
| relisshared | Boolean | | NO | | FIELD |
| relpersistence | String | | NO | | FIELD |
| relkind | String | | NO | | FIELD |
| relnatts | Int16 | | NO | | FIELD |
| relchecks | Int16 | | NO | | FIELD |
| relhasrules | Boolean | | NO | | FIELD |
| relhastriggers | Boolean | | NO | | FIELD |
| relhassubclass | Boolean | | NO | | FIELD |
| relrowsecurity | Boolean | | NO | | FIELD |
| relforcerowsecurity | Boolean | | NO | | FIELD |
| relispopulated | Boolean | | NO | | FIELD |
| relreplident | String | | NO | | FIELD |
| relispartition | Boolean | | NO | | FIELD |
| relrewrite | Int32 | | YES | | FIELD |
| relfrozenxid | Int32 | | NO | | FIELD |
| relminmxid | Int32 | | NO | | FIELD |
| relpartbound | String | | YES | | FIELD |
+---------------------+---------+-----+------+---------+---------------+
-- SQLNESS PROTOCOL POSTGRES
desc table pg_namespace;
+---------+--------+-----+------+---------+---------------+
| Column | Type | Key | Null | Default | Semantic Type |
+---------+--------+-----+------+---------+---------------+
| oid | UInt32 | | NO | | FIELD |
| nspname | String | | NO | | FIELD |
+---------+--------+-----+------+---------+---------------+
+----------+--------+-----+------+---------+---------------+
| Column | Type | Key | Null | Default | Semantic Type |
+----------+--------+-----+------+---------+---------------+
| oid | Int32 | | NO | | FIELD |
| nspname | String | | NO | | FIELD |
| nspowner | Int32 | | NO | | FIELD |
| nspacl | String | | YES | | FIELD |
| options | String | | YES | | FIELD |
+----------+--------+-----+------+---------+---------------+
-- SQLNESS PROTOCOL POSTGRES
drop table my_db.foo;

View File

@@ -921,7 +921,7 @@ impl Display for PostgresqlFormatter {
PgRow::RowDescription(desc) => Arc::new(Schema::new(
desc.iter()
.map(|column| {
ColumnSchema::new(column.name(), ConcreteDataType::string_datatype(), false)
ColumnSchema::new(column.name(), ConcreteDataType::string_datatype(), true)
})
.collect(),
)),