Skip to content

Loading…

DDC-1384: ORA-00972: identifier is too long #2004

Closed
doctrinebot opened this Issue · 11 comments

2 participants

@doctrinebot

Jira issue originally created by user matheus.souza:

Hi,

When the query is executed the follow problem occur:
ORA-00972:identifier is too long
The problem occur because a column name has 30 characters and the
Doctrine creates an alias with +
becoming 31 characters, in Oracle the max allowed characters in the name
is 30.
Is there any configuration that disable this mechanism?
How can I solve this issue?
Thanks!
Regards,

Matheus Souza.

@doctrinebot

Comment created by @beberlei:

This is tricky. No way for you to reduce the column length to < 30 chars? The problem with a fix for this would be that we would need to execute a bunch of functions for every database vendor and every column alias used in every SQL statement: quite some overhead :-(

@doctrinebot

Comment created by matheus.souza:

I get it. :-(
I don't know the implementation, but is there a possibilty to create a property that disable the "suffix field position" in alias, staying just ?

Tks!

@doctrinebot

Comment created by @beberlei:

The following workaround will get you around this problem until i find a better solution.

  1. Create a MyOraclePlatform extends \Doctrine\DBAL\Platforms\OraclePlatform
  2. Override the "getSQLResultCasing($string)" to do:
$val = parent::getSQLResultCasing($string);
return substr($val, -30);

This substrings every result alias to 30 chars.

@doctrinebot

Comment created by matheus.souza:

But how does the Doctrine will know about my implementation?
I will have to change the Driver too?

Thanks!

@doctrinebot

Comment created by @beberlei:

no, you can pass the "platform" into the DriverManager::create method as "platform" parameter for the $params AFAIK, relevant code is Doctrine\DBAL\Connection::**construct if you want to check it out.

@doctrinebot

Comment created by matheus.souza:

In some cases it works, but it doesn't work when the SqlWalker is invoked, I think that the problem is in walkSelectClause($selectClause) method in the else clause for this verification:

if ($class->isInheritanceTypeSingleTable() || $class->isInheritanceTypeJoined()) {
if ($class->isInheritanceTypeSingleTable() || $class->isInheritanceTypeJoined()) {
...
} else {
                // Add foreign key columns to SQL, if necessary
                if ($addMetaColumns) {
                    $sqlTableAlias = $this->getSqlTableAlias($class->table['name'], $dqlAlias);
                    foreach ($class->associationMappings as $assoc) {
                        if ($assoc['isOwningSide'] && $assoc['type'] & ClassMetadata::TO_ONE) {
                            foreach ($assoc['targetToSourceKeyColumns'] as $srcColumn) {
                                $columnAlias = $this->getSqlColumnAlias($srcColumn);
                                $sql .= ', ' . $sqlTableAlias . '.' . $srcColumn . ' AS ' . $columnAlias;
                                $columnAlias = $this->_platform->getSQLResultCasing($columnAlias);
                                $this->*rsm->addMetaResult($dqlAlias, $this->*platform->getSQLResultCasing($columnAlias), $srcColumn);
                            }
                        }
                    }
                }
            }
        }

the problem is in the follow lines, because the getSQLResultCasing has no effect in $sql variable that is returned:

$columnAlias = $this->getSqlColumnAlias($srcColumn);
$sql .= ', ' . $sqlTableAlias . '.' . $srcColumn . ' AS ' . $columnAlias;
$columnAlias = $this->_platform->getSQLResultCasing($columnAlias);

The correct would be this way, wouldn't be?

$columnAlias = $this->getSqlColumnAlias($srcColumn);
$columnAlias = $this->_platform->getSQLResultCasing($columnAlias);
$sql .= ', ' . $sqlTableAlias . '.' . $srcColumn . ' AS ' . $columnAlias;
  • In the version of Doctrine that I'm using, there is no DriverManager::create method, I'm using DriverManager::getConnection(array $params,Configuration $config = null,EventManager $eventManager = null) instead.

Tks!!

@doctrinebot

Comment created by @beberlei:

Narf, sorry that this doesn't work.

This is rather unreliable if this fails here, can we trust it in other places? I think i have to work on this by hard, its just very problematic to test this, it may be easy to miss a location.

@doctrinebot

Comment created by @beberlei:

we found a simple way to fix this, expect a patch for this soon!

@doctrinebot

Comment created by @asm89:

The issue should be fixed with the code over here:
#167

I haven't been able to test it on a real Oracle DB yet. Maybe you guys can give it a go?

@doctrinebot

Comment created by @beberlei:

Fixed, however will not be merged into 2.1.x because the patch is really large

@doctrinebot

Issue was closed with resolution "Fixed"

@beberlei beberlei was assigned by doctrinebot
@doctrinebot doctrinebot added this to the 2.2 milestone
@doctrinebot doctrinebot closed this
@doctrinebot doctrinebot added the Bug label
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.