diff --git a/crates/pgls_catalog/src/catalog/materialize.rs b/crates/pgls_catalog/src/catalog/materialize.rs index 6687441d8..50dad2672 100644 --- a/crates/pgls_catalog/src/catalog/materialize.rs +++ b/crates/pgls_catalog/src/catalog/materialize.rs @@ -3,7 +3,7 @@ use std::sync::Arc; -use rustc_hash::FxHashMap; +use rustc_hash::{FxHashMap, FxHashSet}; use super::{Catalog, Entry, Key}; use crate::lookup::{FunctionInfo, FunctionKind, Origin, RelationInfo, RelationKind, TypeInfo}; @@ -33,7 +33,11 @@ impl Catalog { let mut builder = Builder { snapshot: Snapshot::clone(base.snapshot()), next_id: -1, - type_ids: rustc_hash::FxHashMap::default(), + type_ids: FxHashMap::default(), + tables: FxHashMap::default(), + types: FxHashMap::default(), + type_names: FxHashMap::default(), + sequences: FxHashSet::default(), }; for schema in &self.dropped_schemas { @@ -44,6 +48,7 @@ impl Catalog { builder.create_schema(name); } } + builder.index(); for entry in self.types.values() { if let Entry::Defined(type_) = entry && type_.origin == Origin::File @@ -51,23 +56,39 @@ impl Catalog { builder.allocate_type(type_); } } + // The relations have different names, so dropping them all after defining the others + // removes the same objects as dropping them in between. + let mut defined = Vec::new(); + let mut dropped = FxHashSet::default(); for ((schema, name), entry) in &self.relations { match entry { - Entry::Defined(relation) => builder.define_relation(relation), - Entry::Dropped => builder.drop_relation(schema, name), + Entry::Defined(relation) => { + if let Some((table_id, class_kind)) = builder.define_relation(relation) { + defined.push((table_id, class_kind, relation.as_ref())); + } + } + Entry::Dropped => { + dropped.insert((schema.as_str(), name.as_str())); + } Entry::Unknown => {} } } - for (key, entry) in &self.types { - match entry { - Entry::Defined(type_) if type_.origin == Origin::File => {} - Entry::Dropped => builder - .snapshot - .types - .retain(|type_| (&type_.schema, &type_.name) != (&key.0, &key.1)), - _ => {} - } + builder.drop_relations(&dropped); + builder.define_columns(&defined); + + let dropped: FxHashSet<(&str, &str)> = self + .types + .iter() + .filter(|(_, entry)| matches!(entry, Entry::Dropped)) + .map(|((schema, name), _)| (schema.as_str(), name.as_str())) + .collect(); + if !dropped.is_empty() { + builder + .snapshot + .types + .retain(|type_| !dropped.contains(&(type_.schema.as_str(), type_.name.as_str()))); } + builder.index(); for (key, entry) in &self.types { if let Entry::Defined(type_) = entry && type_.origin == Origin::File @@ -75,6 +96,8 @@ impl Catalog { builder.define_type(key, type_); } } + // The same holds for the functions. + let mut dropped = FxHashSet::default(); for (key, entry) in &self.functions { match entry { Entry::Defined(overloads) => { @@ -84,13 +107,17 @@ impl Catalog { } } } - Entry::Dropped => builder - .snapshot - .functions - .retain(|function| (&function.schema, &function.name) != (&key.0, &key.1)), + Entry::Dropped => { + dropped.insert((key.0.as_str(), key.1.as_str())); + } Entry::Unknown => {} } } + if !dropped.is_empty() { + builder.snapshot.functions.retain(|function| { + !dropped.contains(&(function.schema.as_str(), function.name.as_str())) + }); + } Some(Arc::new(builder.snapshot)) } @@ -112,10 +139,43 @@ struct Builder { snapshot: Snapshot, /// Ids of objects created by the file are negative, so they never collide with oids. next_id: i64, - type_ids: rustc_hash::FxHashMap, + type_ids: FxHashMap, + /// The ids of the tables and types of `snapshot` by schema and name, and of the types by + /// name, see [`Self::index`]. Each keeps the first object of a name in `snapshot`. + tables: FxHashMap, + types: FxHashMap, + type_names: FxHashMap, + sequences: FxHashSet, } impl Builder { + /// Indexes the tables, types and sequences of the snapshot, so that finding one by name + /// doesn't search all of them. + fn index(&mut self) { + let snapshot = &self.snapshot; + self.tables.clear(); + for table in &snapshot.tables { + self.tables + .entry((table.schema.clone(), table.name.clone())) + .or_insert(table.id); + } + self.types.clear(); + self.type_names.clear(); + for type_ in &snapshot.types { + index_type(&mut self.types, &mut self.type_names, type_); + } + self.sequences = snapshot + .sequences + .iter() + .map(|sequence| (sequence.schema.clone(), sequence.name.clone())) + .collect(); + } + + fn push_type(&mut self, type_: PostgresType) { + index_type(&mut self.types, &mut self.type_names, &type_); + self.snapshot.types.push(type_); + } + fn next_id(&mut self) -> i64 { let id = self.next_id; self.next_id -= 1; @@ -160,30 +220,35 @@ impl Builder { }); } - fn drop_relation(&mut self, schema: &str, name: &str) { + fn drop_relations(&mut self, dropped: &FxHashSet<(&str, &str)>) { + if dropped.is_empty() { + return; + } let snapshot = &mut self.snapshot; - let is_relation = |s: &str, n: &str| s == schema && n == name; + let is_dropped = |schema: &str, name: &str| dropped.contains(&(schema, name)); snapshot .tables - .retain(|table| !is_relation(&table.schema, &table.name)); + .retain(|table| !is_dropped(&table.schema, &table.name)); snapshot .columns - .retain(|column| !is_relation(&column.schema_name, &column.table_name)); + .retain(|column| !is_dropped(&column.schema_name, &column.table_name)); snapshot .sequences - .retain(|sequence| !is_relation(&sequence.schema, &sequence.name)); + .retain(|sequence| !is_dropped(&sequence.schema, &sequence.name)); snapshot .indexes - .retain(|index| !is_relation(&index.schema, &index.table_name)); + .retain(|index| !is_dropped(&index.schema, &index.table_name)); snapshot .policies - .retain(|policy| !is_relation(&policy.schema_name, &policy.table_name)); + .retain(|policy| !is_dropped(&policy.schema_name, &policy.table_name)); snapshot .triggers - .retain(|trigger| !is_relation(&trigger.table_schema, &trigger.table_name)); + .retain(|trigger| !is_dropped(&trigger.table_schema, &trigger.table_name)); } - fn define_relation(&mut self, relation: &RelationInfo) { + /// Adds the table of a relation, or finds the one of the database. Returns its id and the + /// class of its columns when the columns are known, for [`Self::define_columns`]. + fn define_relation(&mut self, relation: &RelationInfo) -> Option<(i64, ColumnClassKind)> { let (table_kind, class_kind) = match relation.kind { RelationKind::Table => (TableKind::Ordinary, ColumnClassKind::OrdinaryTable), RelationKind::PartitionedTable => { @@ -197,18 +262,13 @@ impl Builder { RelationKind::ForeignTable => (TableKind::Ordinary, ColumnClassKind::ForeignTable), RelationKind::Other => { self.define_sequence(relation); - return; + return None; } }; - let existing = self - .snapshot - .tables - .iter() - .find(|table| table.schema == relation.schema && table.name == relation.name) - .map(|table| table.id); - let table_id = match existing { - Some(id) => id, + let key = (relation.schema.clone(), relation.name.clone()); + let table_id = match self.tables.get(&key) { + Some(id) => *id, None => { let id = self.next_id(); self.snapshot.tables.push(Table { @@ -218,66 +278,75 @@ impl Builder { table_kind, ..Default::default() }); + self.tables.insert(key, id); id } }; // Without known columns, a database table keeps its columns. - let Some(columns) = &relation.columns else { - return; - }; + relation.columns.is_some().then_some((table_id, class_kind)) + } - let mut previous: FxHashMap = FxHashMap::default(); + /// Replaces the columns of the tables of `defined`, in its order, keeping the database + /// definition of the columns that keep their type. + fn define_columns(&mut self, defined: &[(i64, ColumnClassKind, &RelationInfo)]) { + let table_ids: FxHashSet = defined.iter().map(|(id, _, _)| *id).collect(); + let mut previous: FxHashMap> = FxHashMap::default(); self.snapshot.columns.retain(|column| { - if column.table_oid == table_id { - previous.insert(column.name.clone(), column.clone()); + if table_ids.contains(&column.table_oid) { + previous + .entry(column.table_oid) + .or_default() + .insert(column.name.clone(), column.clone()); false } else { true } }); - for (number, column) in columns.iter().enumerate() { - let column = match previous.remove(&column.name) { - Some(mut previous) if previous.type_name == column.type_name => { - previous.number = number as i64 + 1; - previous - } - _ => Column { - name: column.name.clone(), - table_name: relation.name.clone(), - table_oid: table_id, - class_kind: class_kind.clone(), - number: number as i64 + 1, - schema_name: relation.schema.clone(), - type_id: column - .ty - .as_ref() - .and_then(|ty| match ty { - Type::Named(id) => self.id_for(id), - _ => None, - }) - .unwrap_or_else(|| self.type_id(column.type_name.as_deref())), + for (table_id, class_kind, relation) in defined { + let table_id = *table_id; + let mut previous = previous.remove(&table_id).unwrap_or_default(); + for (number, column) in relation.columns.iter().flatten().enumerate() { + let column = match previous.remove(&column.name) { + Some(mut previous) if previous.type_name == column.type_name => { + previous.number = number as i64 + 1; + previous + } + _ => Column { + name: column.name.clone(), + table_name: relation.name.clone(), + table_oid: table_id, + class_kind: class_kind.clone(), + number: number as i64 + 1, + schema_name: relation.schema.clone(), + type_id: column + .ty + .as_ref() + .and_then(|ty| match ty { + Type::Named(id) => self.id_for(id), + _ => None, + }) + .unwrap_or_else(|| self.type_id(column.type_name.as_deref())), - type_name: column.type_name.clone(), - is_nullable: true, - is_primary_key: false, - is_unique: false, - default_expr: None, - varchar_length: None, - comment: None, - }, - }; - self.snapshot.columns.push(column); + type_name: column.type_name.clone(), + is_nullable: true, + is_primary_key: false, + is_unique: false, + default_expr: None, + varchar_length: None, + comment: None, + }, + }; + self.snapshot.columns.push(column); + } } } fn define_sequence(&mut self, relation: &RelationInfo) { - let exists = - self.snapshot.sequences.iter().any(|sequence| { - sequence.schema == relation.schema && sequence.name == relation.name - }); - if !exists { + let key = (relation.schema.clone(), relation.name.clone()); + if !self.sequences.contains(&key) { + self.sequences.insert(key); let id = self.next_id(); self.snapshot.sequences.push(Sequence { id, @@ -292,10 +361,8 @@ impl Builder { return; }; if self - .snapshot .types - .iter() - .any(|type_| type_.schema == info.schema && type_.name == info.name) + .contains_key(&(info.schema.clone(), info.name.clone())) { return; } @@ -304,12 +371,7 @@ impl Builder { } fn define_type(&mut self, (schema, name): &Key, info: &TypeInfo) { - let exists = self - .snapshot - .types - .iter() - .any(|type_| &type_.schema == schema && &type_.name == name); - if exists { + if self.types.contains_key(&(schema.clone(), name.clone())) { return; } let Some(id) = info.id.as_ref().and_then(|id| self.id_for(id)) else { @@ -362,14 +424,13 @@ impl Builder { .and_then(|id| self.id_for(id)) .unwrap_or(0); type_.typrelid = info.relation.unwrap_or_else(|| { - self.snapshot - .tables - .iter() - .find(|table| table.schema == *schema && table.name == *name) - .map_or(0, |table| table.id) + self.tables + .get(&(schema.clone(), name.clone())) + .copied() + .unwrap_or(0) }); type_.is_array = info.element.is_some(); - self.snapshot.types.push(type_); + self.push_type(type_); } fn add_function(&mut self, (schema, name): &Key, info: &FunctionInfo) { @@ -440,15 +501,26 @@ impl Builder { Some((schema, name)) => (Some(schema), name), None => (None, type_name), }; - let matches = |type_: &&PostgresType| { - type_.name == name && schema.is_none_or(|schema| type_.schema == schema) + // An unqualified name is the type in `pg_catalog`, or else the first of that name. + let found = match schema { + Some(schema) => self.types.get(&(schema.to_owned(), name.to_owned())), + None => self + .types + .get(&("pg_catalog".to_owned(), name.to_owned())) + .or_else(|| self.type_names.get(name)), }; - let types = &self.snapshot.types; - types - .iter() - .filter(matches) - .find(|type_| schema.is_some() || type_.schema == "pg_catalog") - .or_else(|| types.iter().find(matches)) - .map_or(0, |type_| type_.id) + found.copied().unwrap_or(0) } } + +/// Adds a type to the indexes of [`Builder`], unless they have one of its name already. +fn index_type( + types: &mut FxHashMap, + type_names: &mut FxHashMap, + type_: &PostgresType, +) { + types + .entry((type_.schema.clone(), type_.name.clone())) + .or_insert(type_.id); + type_names.entry(type_.name.clone()).or_insert(type_.id); +} diff --git a/crates/pgls_catalog/src/catalog/snapshots/pgls_catalog__catalog__tests__snapshot_of_a_file_with_many_changes.snap b/crates/pgls_catalog/src/catalog/snapshots/pgls_catalog__catalog__tests__snapshot_of_a_file_with_many_changes.snap new file mode 100644 index 000000000..645f15b19 --- /dev/null +++ b/crates/pgls_catalog/src/catalog/snapshots/pgls_catalog__catalog__tests__snapshot_of_a_file_with_many_changes.snap @@ -0,0 +1,242 @@ +--- +source: crates/pgls_catalog/src/catalog/tests.rs +expression: rendered +--- +schema {"allowed_creators":[],"allowed_users":[],"comment":null,"function_count":0,"id":"","name":"reporting","owner":"","table_count":0,"total_size":"","view_count":0} +schema {"allowed_creators":[],"allowed_users":[],"comment":null,"function_count":0,"id":0,"name":"app","owner":"","table_count":0,"total_size":"","view_count":0} +schema {"allowed_creators":[],"allowed_users":[],"comment":null,"function_count":0,"id":0,"name":"pg_catalog","owner":"","table_count":0,"total_size":"","view_count":0} +schema {"allowed_creators":[],"allowed_users":[],"comment":null,"function_count":0,"id":0,"name":"public","owner":"","table_count":0,"total_size":"","view_count":0} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"","is_inheritance_child":false,"live_rows_estimate":0,"name":"renamed_t13","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"renamed_t17","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"renamed_t1","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"renamed_t5","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"renamed_t9","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"t10","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"t14","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"t18","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"t2","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"t6","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v0","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v10","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v11","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v12","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v13","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v14","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v15","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v16","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v17","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v18","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v19","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v1","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v2","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v3","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v4","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v5","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v6","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v7","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v8","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"v9","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"View"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"t11","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"reporting","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"t15","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"reporting","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"t19","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"reporting","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"t3","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"reporting","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":"
","is_inheritance_child":false,"live_rows_estimate":0,"name":"t7","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"reporting","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":1,"is_inheritance_child":false,"live_rows_estimate":0,"name":"users","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"public","size":"","table_kind":"Ordinary"} +table {"bytes":0,"comment":null,"dead_rows_estimate":0,"id":2,"is_inheritance_child":false,"live_rows_estimate":0,"name":"settings","replica_identity":"Default","rls_enabled":false,"rls_forced":false,"schema":"app","size":"","table_kind":"Ordinary"} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"renamed_t1","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"renamed_t13","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"renamed_t17","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"renamed_t5","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"renamed_t9","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"t10","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"t14","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"t18","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"t2","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"t6","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"users","table_oid":1,"type_id":25,"type_name":"text","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"reporting","table_name":"t11","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"reporting","table_name":"t15","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"reporting","table_name":"t19","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"reporting","table_name":"t3","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"reporting","table_name":"t7","table_oid":"
","type_id":100,"type_name":"int4","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":2,"schema_name":"public","table_name":"t10","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":2,"schema_name":"public","table_name":"t14","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":2,"schema_name":"public","table_name":"t18","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":2,"schema_name":"public","table_name":"t2","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":2,"schema_name":"public","table_name":"t6","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":3,"schema_name":"public","table_name":"renamed_t1","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":3,"schema_name":"public","table_name":"renamed_t13","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":3,"schema_name":"public","table_name":"renamed_t17","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":3,"schema_name":"public","table_name":"renamed_t5","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":3,"schema_name":"public","table_name":"renamed_t9","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":3,"schema_name":"reporting","table_name":"t11","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":3,"schema_name":"reporting","table_name":"t15","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":3,"schema_name":"reporting","table_name":"t19","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":3,"schema_name":"reporting","table_name":"t3","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"mood","number":3,"schema_name":"reporting","table_name":"t7","table_oid":"
","type_id":"","type_name":"mood","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"renamed_t1","table_oid":"
","type_id":102,"type_name":"text","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"renamed_t13","table_oid":"
","type_id":102,"type_name":"text","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"renamed_t17","table_oid":"
","type_id":102,"type_name":"text","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"renamed_t5","table_oid":"
","type_id":102,"type_name":"text","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"renamed_t9","table_oid":"
","type_id":102,"type_name":"text","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"reporting","table_name":"t11","table_oid":"
","type_id":102,"type_name":"text","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"reporting","table_name":"t15","table_oid":"
","type_id":102,"type_name":"text","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"reporting","table_name":"t19","table_oid":"
","type_id":102,"type_name":"text","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"reporting","table_name":"t3","table_oid":"
","type_id":102,"type_name":"text","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"reporting","table_name":"t7","table_oid":"
","type_id":102,"type_name":"text","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"point","number":2,"schema_name":"public","table_name":"users","table_oid":1,"type_id":"","type_name":"point2","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"total","number":3,"schema_name":"public","table_name":"t10","table_oid":"
","type_id":101,"type_name":"int8","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"total","number":3,"schema_name":"public","table_name":"t14","table_oid":"
","type_id":101,"type_name":"int8","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"total","number":3,"schema_name":"public","table_name":"t18","table_oid":"
","type_id":101,"type_name":"int8","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"total","number":3,"schema_name":"public","table_name":"t2","table_oid":"
","type_id":101,"type_name":"int8","varchar_length":null} +column {"class_kind":"OrdinaryTable","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"total","number":3,"schema_name":"public","table_name":"t6","table_oid":"
","type_id":101,"type_name":"int8","varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v0","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v1","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v10","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v11","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v12","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v13","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v14","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v15","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v16","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v17","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v18","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v19","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v2","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v3","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v4","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v5","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v6","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v7","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v8","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"id","number":1,"schema_name":"public","table_name":"v9","table_oid":"
","type_id":100,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v0","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v1","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v10","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v11","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v12","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v13","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v14","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v15","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v16","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v17","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v18","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v19","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v2","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v3","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v4","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v5","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v6","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v7","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v8","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +column {"class_kind":"View","comment":null,"default_expr":null,"is_nullable":true,"is_primary_key":false,"is_unique":false,"name":"name","number":2,"schema_name":"public","table_name":"v9","table_oid":"
","type_id":102,"type_name":null,"varchar_length":null} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_mood","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_point2","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_renamed_t13","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_renamed_t17","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_renamed_t1","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_renamed_t5","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_renamed_t9","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t0","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":0,"typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t10","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t12","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":0,"typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t14","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t16","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":0,"typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t18","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t2","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t4","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":0,"typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t6","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t8","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":0,"typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_users","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v0","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v10","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v11","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v12","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v13","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v14","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v15","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v16","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v17","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v18","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v19","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v1","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v2","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v3","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v4","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v5","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v6","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v7","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v8","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_v9","schema":"public","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"mood","schema":"public","typarray":"","typbasetype":0,"typcategory":"E","typelem":0,"typispreferred":false,"typrelid":0,"typtype":"e"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t11","schema":"reporting","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t15","schema":"reporting","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t19","schema":"reporting","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t3","schema":"reporting","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":true,"name":"_t7","schema":"reporting","typarray":0,"typbasetype":0,"typcategory":"A","typelem":"","typispreferred":false,"typrelid":0,"typtype":"b"} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":100,"is_array":false,"name":"int4","schema":"pg_catalog","typarray":0,"typbasetype":0,"typcategory":"","typelem":0,"typispreferred":false,"typrelid":0,"typtype":""} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":101,"is_array":false,"name":"int8","schema":"pg_catalog","typarray":0,"typbasetype":0,"typcategory":"","typelem":0,"typispreferred":false,"typrelid":0,"typtype":""} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":102,"is_array":false,"name":"text","schema":"pg_catalog","typarray":0,"typbasetype":0,"typcategory":"","typelem":0,"typispreferred":false,"typrelid":0,"typtype":""} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":103,"is_array":false,"name":"date","schema":"pg_catalog","typarray":0,"typbasetype":0,"typcategory":"","typelem":0,"typispreferred":false,"typrelid":0,"typtype":""} +type {"attributes":{"attrs":[]},"comment":null,"enums":{"values":[]},"format":"","id":104,"is_array":false,"name":"text","schema":"public","typarray":0,"typbasetype":0,"typcategory":"","typelem":0,"typispreferred":false,"typrelid":0,"typtype":""} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"mood","type_id":""},{"name":"total","type_id":101}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"t10","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"mood","type_id":""},{"name":"total","type_id":101}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"t14","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"mood","type_id":""},{"name":"total","type_id":101}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"t18","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"mood","type_id":""},{"name":"total","type_id":101}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"t2","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"mood","type_id":""},{"name":"total","type_id":101}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"t6","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102},{"name":"mood","type_id":""}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"renamed_t13","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102},{"name":"mood","type_id":""}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"renamed_t17","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102},{"name":"mood","type_id":""}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"renamed_t1","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102},{"name":"mood","type_id":""}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"renamed_t5","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102},{"name":"mood","type_id":""}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"renamed_t9","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102},{"name":"mood","type_id":""}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"t11","schema":"reporting","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102},{"name":"mood","type_id":""}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"t15","schema":"reporting","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102},{"name":"mood","type_id":""}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"t19","schema":"reporting","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102},{"name":"mood","type_id":""}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"t3","schema":"reporting","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102},{"name":"mood","type_id":""}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"t7","schema":"reporting","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v0","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v10","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v11","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v12","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v13","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v14","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v15","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v16","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v17","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v18","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v19","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v1","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v2","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v3","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v4","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v5","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v6","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v7","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v8","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":100},{"name":"name","type_id":102}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"v9","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":"
","typtype":"c"} +type {"attributes":{"attrs":[{"name":"id","type_id":102},{"name":"point","type_id":""}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"users","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":1,"typtype":"c"} +type {"attributes":{"attrs":[{"name":"x","type_id":100},{"name":"y","type_id":100}]},"comment":null,"enums":{"values":[]},"format":"","id":"","is_array":false,"name":"point2","schema":"public","typarray":"","typbasetype":0,"typcategory":"C","typelem":0,"typispreferred":false,"typrelid":0,"typtype":"c"} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"","type_id":100}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"greet","return_type":null,"return_type_id":102,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f0","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f1","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f10","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f11","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f12","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f13","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f14","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f15","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f16","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f17","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f18","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f19","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f2","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f3","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f4","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f5","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f6","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f7","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f8","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"a","type_id":100},{"has_default":false,"mode":"in","name":"b","type_id":102}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":"","identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"f9","return_type":null,"return_type_id":100,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +function {"args":{"args":[{"has_default":false,"mode":"in","name":"first","type_id":25},{"has_default":true,"mode":"in","name":"last","type_id":25}]},"argument_types":null,"behavior":"Volatile","body":null,"definition":null,"id":0,"identity_argument_types":null,"input_defaults":0,"is_set_returning_function":false,"kind":"Function","language":"","name":"greet","return_type":null,"return_type_id":null,"return_type_relation_id":null,"schema":"public","security_definer":false,"variadic_type_id":0} +index {"id":200,"name":"users_name_idx","schema":"public","table_name":"users"} +sequence {"id":"","name":"orders_seq","schema":"public"} diff --git a/crates/pgls_catalog/src/catalog/tests.rs b/crates/pgls_catalog/src/catalog/tests.rs index 34b155167..17dc88d0f 100644 --- a/crates/pgls_catalog/src/catalog/tests.rs +++ b/crates/pgls_catalog/src/catalog/tests.rs @@ -1,5 +1,7 @@ use std::sync::Arc; +use rustc_hash::FxHashMap; + use crate::Snapshot; use super::{Catalog, CatalogBase}; @@ -741,6 +743,145 @@ fn snapshot_excludes_dropped_objects() { assert_eq!(tables, ["people"]); assert_eq!(table_columns(&snapshot, "public", "people"), ["id", "name"]); } +/// The snapshot of a file with many changes, one line per object with every field. +#[test] +fn snapshot_of_a_file_with_many_changes() { + let base = base(); + let mut database = Snapshot::clone(base.snapshot()); + for (i, (schema, name)) in [ + ("pg_catalog", "int4"), + ("pg_catalog", "int8"), + ("pg_catalog", "text"), + ("pg_catalog", "date"), + ("public", "text"), + ("public", "status"), + ] + .into_iter() + .enumerate() + { + database.types.push(crate::PostgresType { + id: 100 + i as i64, + schema: schema.into(), + name: name.into(), + ..Default::default() + }); + } + database.indexes.push(crate::Index { + id: 200, + schema: "public".into(), + name: "users_name_idx".into(), + table_name: "users".into(), + }); + database.sequences.push(crate::Sequence { + id: 300, + schema: "public".into(), + name: "users_id_seq".into(), + }); + database.tables.push(crate::Table { + id: 2, + schema: "app".into(), + name: "settings".into(), + ..Default::default() + }); + + let mut sql = String::from( + "alter table users add column created_at date; + alter table users alter column name type int8; + drop type status; + create type mood as enum ('happy', 'sad'); + create type point2 as (x int4, y int4); + drop function greet; + create function greet(int4) returns text language sql as 'select ''hi'''; + drop sequence users_id_seq; + create sequence orders_seq; + create schema reporting;", + ); + for i in 0..20 { + sql.push_str(&format!( + "create table t{i} (id int4, name text, mood mood); + create index t{i}_name_idx on t{i} (name); + create function f{i}(a int4, b text) returns int4 language sql as 'select a'; + create view v{i} as select id, name from t{i};" + )); + match i % 4 { + 0 => sql.push_str(&format!("drop table t{i} cascade;")), + 1 => sql.push_str(&format!("alter table t{i} rename to renamed_t{i};")), + 2 => sql.push_str(&format!( + "alter table t{i} drop column name, add column total int8;" + )), + _ => sql.push_str(&format!("alter table t{i} set schema reporting;")), + } + } + sql.push_str("drop table users; create table users (id text, point point2);"); + + let mut catalog = Catalog::new(Some(Arc::new(CatalogBase::new(Arc::new(database))))); + let search_path = path(&["public"]); + for stmt in pgls_query::parse(&sql).expect("valid sql").stmts() { + catalog.apply(stmt, &search_path); + } + let snapshot = catalog.snapshot().unwrap(); + + // The file's objects get their ids in the order of a hash map, which depends on the + // platform. The ids are written as the object they stand for, and the lines are sorted. + let mut labels: FxHashMap = FxHashMap::default(); + for table in &snapshot.tables { + labels.insert(table.id, format!("
", table.schema, table.name)); + } + for type_ in &snapshot.types { + labels.insert(type_.id, format!("", type_.schema, type_.name)); + } + fn label_ids(value: &mut serde_json::Value, labels: &FxHashMap) { + match value { + serde_json::Value::Number(number) => { + if let Some(id) = number.as_i64().filter(|id| *id < 0) { + let label = labels.get(&id).map_or("", String::as_str); + *value = label.into(); + } + } + serde_json::Value::Array(values) => { + values.iter_mut().for_each(|value| label_ids(value, labels)); + } + // In the order of the keys, also when another crate enables `preserve_order`. + serde_json::Value::Object(fields) => { + let mut entries: Vec<_> = std::mem::take(fields).into_iter().collect(); + entries.sort_by(|(a, _), (b, _)| a.cmp(b)); + for (key, mut value) in entries { + label_ids(&mut value, labels); + fields.insert(key, value); + } + } + _ => {} + } + } + fn lines( + name: &str, + objects: &[T], + labels: &FxHashMap, + ) -> String { + let mut lines: Vec = objects + .iter() + .map(|object| { + let mut object = serde_json::to_value(object).unwrap(); + label_ids(&mut object, labels); + format!("{name} {object}\n") + }) + .collect(); + lines.sort(); + lines.concat() + } + let rendered = [ + lines("schema", &snapshot.schemas, &labels), + lines("table", &snapshot.tables, &labels), + lines("column", &snapshot.columns, &labels), + lines("type", &snapshot.types, &labels), + lines("function", &snapshot.functions, &labels), + lines("index", &snapshot.indexes, &labels), + lines("sequence", &snapshot.sequences, &labels), + ] + .concat(); + insta::assert_snapshot!(rendered); +} + #[cfg(feature = "db")] mod typing_overlay_tests { use super::path;