void InformationSchemaCatalog::FillTablesTable()

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);
}