final public function formatColumnName($columnName, $matchRequired = FALSE) {
        if ($this->isStateChanged()) {
            $this->cleanInternalState();
        }

        if (isset($this->formattedColumnNames[$columnName])) {
            $formattedColumnName = $this->formattedColumnNames[$columnName];
            if ($formattedColumnName === FALSE) {
                $formattedColumnName = NULL;
            }
        }
        else {
            $formattedColumnName = $this->formatColumnNameImpl($columnName);
            if (isset($formattedColumnName) && isset($this->parent)) {
                $formattedColumnName = $this->parent->formatColumnName($formattedColumnName);
            }

            // checking if the same name is not mapped to two different columns
            if (isset($formattedColumnName) && isset($this->formattedColumnNames)) {
                $otherColumnName = array_search($formattedColumnName, $this->formattedColumnNames);
                if ($otherColumnName !== FALSE) {
                    throw new IllegalStateException(t(
                        'Name mapping is ambiguous for %columnName column: [%mappedColumnNameA, %mappedColumnNameB]',
                        array(
                            '%columnName' => $formattedColumnName,
                            '%mappedColumnNameA' => $otherColumnName,
                            '%mappedColumnNameB' => $columnName)));
                }
            }
            $this->formattedColumnNames[$columnName] = isset($formattedColumnName) ? $formattedColumnName : FALSE;
        }

        if (!isset($formattedColumnName) && $matchRequired) {
            $this->errorRequiredFormattedColumnName($columnName);
        }

        return $formattedColumnName;
    }