in backend/query/information_schema_catalog.cc [714:808]
void InformationSchemaCatalog::FillTablesTable() {
auto tables = tables_by_name_.at(GetNameForDialect(kTables)).get();
// Add table rows.
std::vector<std::vector<zetasql::Value>> rows;
for (const Table* table : default_schema_->tables()) {
absl::flat_hash_map<std::string, zetasql::Value> specific_kvs;
if (dialect_ == DatabaseDialect::POSTGRESQL) {
zetasql::Value row_deletion_policy_value = NullString();
if (table->row_deletion_policy().has_value()) {
// Use the PG schema printer to get the row deletion policy in a format
// expected by the PG dialect.
absl::StatusOr<std::string> row_deletion_policy =
pg_schema_printer_->PrintRowDeletionPolicyForEmulator(
table->row_deletion_policy().value());
ABSL_CHECK_OK(row_deletion_policy.status()); // crash ok
row_deletion_policy_value = String(*row_deletion_policy);
}
specific_kvs[kRowDeletionPolicyExpression] = row_deletion_policy_value;
} else {
specific_kvs[kRowDeletionPolicyExpression] =
table->row_deletion_policy().has_value()
? String(RowDeletionPolicyToString(
table->row_deletion_policy().value()))
: NullString();
}
const auto& [table_schema_part, table_name_part] =
GetSchemaAndNameForInformationSchema(table->Name());
specific_kvs[kTableCatalog] = DialectTableCatalog();
specific_kvs[kTableSchema] = String(table_schema_part);
specific_kvs[kTableName] = String(table_name_part);
specific_kvs[kTableType] = String(kBaseTable);
specific_kvs[kParentTableName] =
table->parent()
? String(SDLObjectName::GetInSchemaName(table->parent()->Name()))
: NullString();
specific_kvs[kOnDeleteAction] =
table->parent()
? String(OnDeleteActionToString(table->on_delete_action()))
: NullString();
specific_kvs[kSpannerState] = String(kCommitted);
// The emulator only supports INTERLEAVE IN PARENT.
specific_kvs[kInterleaveType] = String(kInParent);
rows.push_back(GetRowFromRowKVs(tables, specific_kvs));
}
for (const View* view : default_schema_->views()) {
absl::flat_hash_map<std::string, zetasql::Value> specific_kvs;
const auto& [schema_part, name_part] =
GetSchemaAndNameForInformationSchema(view->Name());
specific_kvs[kTableCatalog] = DialectTableCatalog();
specific_kvs[kTableSchema] = String(schema_part);
specific_kvs[kTableName] = String(name_part);
specific_kvs[kTableType] = String(kView);
specific_kvs[kSpannerState] = NullString();
specific_kvs[kParentTableName] = NullString();
specific_kvs[kOnDeleteAction] = NullString();
specific_kvs[kRowDeletionPolicyExpression] = NullString();
rows.push_back(GetRowFromRowKVs(tables, specific_kvs));
}
for (const auto& table : spanner_sys_catalog_->tables()) {
absl::flat_hash_map<std::string, zetasql::Value> specific_kvs;
specific_kvs[kTableCatalog] = DialectTableCatalog();
specific_kvs[kTableSchema] =
String(GetNameForDialect(SpannerSysCatalog::kName));
specific_kvs[kTableType] = String(kView);
specific_kvs[kTableName] = String(table->Name());
specific_kvs[kParentTableName] = NullString();
specific_kvs[kOnDeleteAction] = NullString();
specific_kvs[kSpannerState] = NullString();
specific_kvs[kRowDeletionPolicyExpression] = NullString();
rows.push_back(GetRowFromRowKVs(tables, specific_kvs));
}
for (const auto& table : this->tables()) {
absl::flat_hash_map<std::string, zetasql::Value> specific_kvs;
specific_kvs[kTableCatalog] = DialectTableCatalog();
specific_kvs[kTableSchema] = String(GetNameForDialect(kInformationSchema));
specific_kvs[kTableName] = String(GetNameForDialect(table->Name()));
specific_kvs[kTableType] = String(kView);
specific_kvs[kParentTableName] = NullString();
specific_kvs[kOnDeleteAction] = NullString();
specific_kvs[kSpannerState] = NullString();
specific_kvs[kRowDeletionPolicyExpression] = NullString();
rows.push_back(GetRowFromRowKVs(tables, specific_kvs));
}
tables->SetContents(rows);
}