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