- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/db/pgsqlconnection.php
- Класс: BitrixMainDBPgsqlConnection
- Вызов: PgsqlConnection::getIndexName
public function getIndexName($tableName, array $columns, $strict = false)
{
if (empty($columns))
{
return null;
}
$tableColumns = [];
$r = $this->query("
SELECT a.attnum, a.attname
FROM pg_class t
LEFT JOIN pg_attribute a ON a.attrelid = t.oid
WHERE t.relname = '".$this->getSqlHelper()->forSql($tableName)."'
");
while ($a = $r->fetch())
{
if ($a['ATTNUM']> 0)
{
$tableColumns[$a['ATTNUM']] = $a['ATTNAME'];
}
}
$r = $this->query("
SELECT relname, indkey, pg_get_expr(pg_index.indexprs, pg_index.indrelid) full_text
FROM pg_class, pg_index
WHERE pg_class.oid = pg_index.indexrelid
AND pg_class.oid IN (
SELECT indexrelid
FROM pg_index, pg_class
WHERE pg_class.relname = '".$this->getSqlHelper()->forSql($tableName)."'
AND pg_class.oid = pg_index.indrelid
)
");
$indexes = [];
while ($a = $r->fetch())
{
$indexes[$a['RELNAME']] = [];
if ($a['FULL_TEXT'])
{
$match = [];
if (preg_match_all('/,s*([a-z0-9_]+)/i', $a['FULL_TEXT'], $match))
{
foreach ($match[1] as $i => $colName)
{
$indexes[$a['RELNAME']][$i] = mb_strtoupper($colName);
}
}
}
else
{
foreach (explode(' ', $a['INDKEY']) as $i => $indkey)
{
$indexes[$a['RELNAME']][$i] = mb_strtoupper($tableColumns[$indkey]);
}
}
}
return static::findIndex($indexes, $columns, $strict);
}