Doctrine 1
  1. Doctrine 1
  2. DC-1034

ORA-00904 in Doctrine_Connection_Oracle

    Details

    • Type: Bug Bug
    • Status: Open
    • Priority: Blocker Blocker
    • Resolution: Unresolved
    • Affects Version/s: 1.2.4
    • Fix Version/s: 1.2.4
    • Component/s: Connection
    • Labels:
      None
    • Environment:
      Windows 7 64 bits, PHP 5.2.11, Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi, Symfony 1.4.13

      Description

      When i execute this code:

       
      $q = Doctrine_Query::create()
                  ->from('AGENT ag')
                  ->leftJoin('ag.CHANTIER_AGENT cag)
                  ->orderBy('ag.nom')
                  ->limit(10)
                  ->offset(10)
                  ->execute();
      

      Doctrine executes :

       
      SELECT a.pk AS a__pk, a.ts AS a__ts, a.ck_agent AS a__ck_agent, a.matricule AS a__matricule, a.nom AS a__nom, a.prenom AS a__prenom, a.agent_maitrise AS a__agent_maitrise, 
      c.pk AS c__pk, c.ts AS c__ts, c.ck_chantier_agent AS c__ck_chantier_agent, c.ek_chantier AS c__ek_chantier, c.fk_chantier AS c__fk_chantier, c.ek_agent AS c__ek_agent, c.fk_agent AS c__fk_agent 
      FROM AGENT a 
      LEFT JOIN CHANTIER_AGENT c ON a.ck_agent = c.ek_agent 
      WHERE a.ck_agent IN 
      (SELECT b.ck_agent 
      FROM ( SELECT a.*, ROWNUM AS doctrine_rownum 
      FROM ( SELECT DISTINCT a2.ck_agent, a2.nom FROM AGENT a2 LEFT JOIN CHANTIER_AGENT c2 ON a2.ck_agent = c2.ek_agent ORDER BY a2.nom ) 
      a2 ) 
      b 
      WHERE doctrine_rownum BETWEEN 11 AND 20) 
      ORDER BY a.nom
      

      The problem is in function _createLimitSubquery in Doctrine_Connection_Oracle :

       
                          $query= 'SELECT '.$this->quoteIdentifier('b').'.'.$column.' FROM ( '.
                                       'SELECT '.$this->quoteIdentifier('a').'.*, ROWNUM AS doctrine_rownum FROM ( '
                                         . $query . ' ) ' . $this->quoteIdentifier('a') . ' '.
                                    ' ) ' . $this->quoteIdentifier('b') . ' '.
                                    'WHERE doctrine_rownum BETWEEN ' . $min .  ' AND ' . $max;
      

      Error occures, because table name is AGENT and Doctrine give the first letter of the table name for identifier.
      To correct this. Use more than one letter in the quoteIdentifier.

       
                          $query = 'SELECT '.$this->quoteIdentifier('limb').'.'.$column.' FROM ( '.
                                       'SELECT '.$this->quoteIdentifier('lima').'.*, ROWNUM AS doctrine_rownum FROM ( '
                                         . $query . ' ) ' . $this->quoteIdentifier('lima') . ' '.
                                    ' ) ' . $this->quoteIdentifier('limb') . ' '.
                                    'WHERE doctrine_rownum BETWEEN ' . $min .  ' AND ' . $max;
      

        Activity

          People

          • Assignee:
            Jonathan H. Wage
            Reporter:
            Jayson LE PAPE
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated: