void PGCatalog::FillPGIndexTable()

in backend/query/pg_catalog.cc [1654:1774]


void PGCatalog::FillPGIndexTable() {
  auto pg_index = tables_by_name_.at(kPGIndex).get();

  std::vector<std::vector<zetasql::Value>> rows;
  for (const Table* table : default_schema_->tables()) {
    // Columns don't track their index in the table, so we need to build a map
    // to get the index.
    std::map<std::string, int> column_name_to_index;
    for (int i = 0; i < table->columns().size(); ++i) {
      column_name_to_index[table->columns()[i]->Name()] = i + 1;
    }
    for (const Index* index : table->indexes()) {
      std::vector<int64_t> key_columns;
      key_columns.reserve(index->key_columns().size());
      for (const auto& key_column : index->key_columns()) {
        key_columns.push_back(
            column_name_to_index[key_column->column()->Name()]);
      }
      for (const auto& stored_column : index->stored_columns()) {
        key_columns.push_back(
            column_name_to_index[stored_column->Name()]);
      }
      rows.push_back({
          // indexrelid
          CreatePgOidValue(index->postgresql_oid().value()).value(),
          // indrelid
          CreatePgOidValue(table->postgresql_oid().value()).value(),
          // indnatts
          Int64(index->key_columns().size() + index->stored_columns().size()),
          // indnkeyatts
          Int64(index->key_columns().size()),
          // indisunique
          Bool(index->is_unique()),
          // indisprimary
          Bool(false),
          // indisexclusion
          Bool(false),
          // indimmediate
          NullBool(),
          // indisclustered
          Bool(false),
          // indisvalid
          Bool(true),
          // indcheckxmin
          Bool(false),
          // indisready
          Bool(true),
          // indislive
          Bool(true),
          // indisreplident
          Bool(false),
          // indkey
          Int64Array(key_columns),
          // indcollation
          Null(GetPgOidArrayType()),
          // indclass
          Null(GetPgOidArrayType()),
          // indoption
          Null(Int64ArrayType()),
          // indexprs
          NullString(),
          // indpred
          NullString(),
      });
    }
    // Add primary key index.
    std::vector<int64_t> key_columns;
    for (const KeyColumn* key_column : table->primary_key()) {
      key_columns.push_back(column_name_to_index[key_column->column()->Name()]);
    }
    if (!table->primary_key_index_postgresql_oid().has_value()) {
      ZETASQL_VLOG(1) << "Primary key index for table " << table->Name()
              << " does not have a PostgreSQL OID.";
      continue;
    }
    rows.push_back({
        // indexrelid
        CreatePgOidValue(table->primary_key_index_postgresql_oid().value())
            .value(),
        // indrelid
        CreatePgOidValue(table->postgresql_oid().value()).value(),
        // indnatts
        Int64(table->primary_key().size()),
        // indnkeyatts
        Int64(table->primary_key().size()),
        // indisunique
        Bool(true),
        // indisprimary
        Bool(true),
        // indisexclusion
        Bool(false),
        // indimmediate
        NullBool(),
        // indisclustered
        Bool(false),
        // indisvalid
        Bool(true),
        // indcheckxmin
        Bool(false),
        // indisready
        Bool(true),
        // indislive
        Bool(true),
        // indisreplident
        Bool(false),
        // indkey
        Int64Array(key_columns),
        // indcollation
        Null(GetPgOidArrayType()),
        // indclass
        Null(GetPgOidArrayType()),
        // indoption
        Null(Int64ArrayType()),
        // indexprs
        NullString(),
        // indpred
        NullString(),
    });
  }
  pg_index->SetContents(rows);
}