• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/db/pgsqlsqlhelper.php
  • Класс: BitrixMainDBPgsqlSqlHelper
  • Вызов: PgsqlSqlHelper::prepareMergeSelect
public function prepareMergeSelect($tableName, array $primaryFields, array $selectFields, $select, $updateFields)
{
	$updateColumns = [];
	$updateValues = [];

	$tableFields = $this->connection->getTableFields($tableName);
	// one registry
	$tableFields = array_change_key_case($tableFields, CASE_UPPER);
	$updateFields = array_change_key_case($updateFields, CASE_UPPER);
	foreach ($updateFields as $columnName => $value)
	{
		if (isset($tableFields[$columnName]))
		{
			$updateColumns[] = $this->quote($columnName);
			$updateValues[] = $this->convertToDb($value, $tableFields[$columnName]);
		}
		else
		{
			trigger_error("Column `{$columnName}` is not found in the `{$tableName}` table", E_USER_WARNING);
		}
	}

	$sql = 'INSERT INTO ' . $this->quote($tableName) . ' (' . implode(',', array_map([$this, 'quote'], $selectFields)) . ') ';
	$sql .= $select;
	$sql .= ' ON CONFLICT (' . implode(',', array_map([$this, 'quote'], $primaryFields)) . ') DO UPDATE SET (' . implode(', ', $updateColumns) . ') = (' . implode(', ', $updateValues) . ')';

	return $sql;
}