Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Blocker Blocker
    • Resolution: Invalid
    • Affects Version/s: 2.3
    • Fix Version/s: None
    • Component/s: ORM
    • Labels:
      None

      Description

      There is an undefined method called in Doctrine\ORM\Query\SqlWalker

      Fatal error: Call to undefined method Doctrine\ORM\Query\AST\PathExpression::isSimpleArithmeticExpression() in vendor\doctrine\orm\lib\Doctrine\ORM\Query\SqlWalker.php on line 2091

      1. SqlWalker.patch
        0.7 kB
        Daniel Huss
      2. SqlWalkerTest.php
        1 kB
        Daniel Huss

        Activity

        Hide
        Fabio B. Silva added a comment -

        Hi Karma

        Could you provide the failing DQL ?

        Cheers

        Show
        Fabio B. Silva added a comment - Hi Karma Could you provide the failing DQL ? Cheers
        Hide
        Karma Dordrak (Drak) added a comment -

        It's generating SQL from a Doctrine Collection in a proxy class. Here is a link to the example: https://github.com/zikula/core/pull/674#discussion_r2696186

        The SQL being generated is

        `SELECT t0.name AS name1, t0.value AS value2, t0.user_id AS user_id3 FROM users_attributes t0 WHERE t0.user_id = ?`

        The ? should be the value 2, but for some reason it's not being added. I've checked the files in the stack-trace below and the right values are entering into the process, just the wrong SQL seems to be generated.

        Exception Trace
        #0 Exception thrown in C:\xampp\htdocs\core13\src\vendor\doctrine\dbal\lib\Doctrine\DBAL\DBALException.php, line 47.
        #1 C:\xampp\htdocs\core13\src\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php(1599): Doctrine\DBAL\Connection->executeQuery('SELECT t0.name ...', Array, Array)
        #2 C:\xampp\htdocs\core13\src\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php(1558): Doctrine\ORM\Persisters\BasicEntityPersister->getOneToManyStatement(Array, Object(Users\Entity\User))
        #3 C:\xampp\htdocs\core13\src\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php(2673): Doctrine\ORM\Persisters\BasicEntityPersister->loadOneToManyCollection(Array, Object(Users\Entity\User), Object(Doctrine\ORM\PersistentCollection))
        #4 C:\xampp\htdocs\core13\src\vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php(224): Doctrine\ORM\UnitOfWork->loadCollection(Object(Doctrine\ORM\PersistentCollection))
        #5 C:\xampp\htdocs\core13\src\vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php(576): Doctrine\ORM\PersistentCollection->initialize()
        #6 C:\xampp\htdocs\core13\src\lib\util\UserUtil.php(1152): Doctrine\ORM\PersistentCollection->getIterator()
        #7 C:\xampp\htdocs\core13\src\lib\util\UserUtil.php(2007): UserUtil::getVars('admin', false, 'uname', false)

        Show
        Karma Dordrak (Drak) added a comment - It's generating SQL from a Doctrine Collection in a proxy class. Here is a link to the example: https://github.com/zikula/core/pull/674#discussion_r2696186 The SQL being generated is `SELECT t0.name AS name1, t0.value AS value2, t0.user_id AS user_id3 FROM users_attributes t0 WHERE t0.user_id = ?` The ? should be the value 2, but for some reason it's not being added. I've checked the files in the stack-trace below and the right values are entering into the process, just the wrong SQL seems to be generated. Exception Trace #0 Exception thrown in C:\xampp\htdocs\core13\src\vendor\doctrine\dbal\lib\Doctrine\DBAL\DBALException.php, line 47. #1 C:\xampp\htdocs\core13\src\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php(1599): Doctrine\DBAL\Connection->executeQuery('SELECT t0.name ...', Array, Array) #2 C:\xampp\htdocs\core13\src\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php(1558): Doctrine\ORM\Persisters\BasicEntityPersister->getOneToManyStatement(Array, Object(Users\Entity\User)) #3 C:\xampp\htdocs\core13\src\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php(2673): Doctrine\ORM\Persisters\BasicEntityPersister->loadOneToManyCollection(Array, Object(Users\Entity\User), Object(Doctrine\ORM\PersistentCollection)) #4 C:\xampp\htdocs\core13\src\vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php(224): Doctrine\ORM\UnitOfWork->loadCollection(Object(Doctrine\ORM\PersistentCollection)) #5 C:\xampp\htdocs\core13\src\vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php(576): Doctrine\ORM\PersistentCollection->initialize() #6 C:\xampp\htdocs\core13\src\lib\util\UserUtil.php(1152): Doctrine\ORM\PersistentCollection->getIterator() #7 C:\xampp\htdocs\core13\src\lib\util\UserUtil.php(2007): UserUtil::getVars('admin', false, 'uname', false)
        Hide
        Fabio B. Silva added a comment -

        Hi Drak,

        Could you try to write a failing test case please ?

        Cheers

        Show
        Fabio B. Silva added a comment - Hi Drak, Could you try to write a failing test case please ? Cheers
        Hide
        Alexander added a comment -

        ping!

        Show
        Alexander added a comment - ping!
        Hide
        Daniel Huss added a comment -

        SqlWalker::walkInExpression() does this:

        $sql = $this->walkArithmeticExpression($inExpr->expression)

        However, $inExpr->expression could be an instance of PathExpression. The grammar allows this case:

        InExpression             ::= SingleValuedPathExpression ["NOT"] "IN" "(" (InParameter {"," InParameter}* | Subselect) ")"

        PathExpression and ArithmeticExpression both extend Node, but a PathExpression is not an ArithmeticExpression, and therefore it has no method isSimpleArithmeticExpression.

        If you still need a failing test case, I'll write one when I get home from work.

        Show
        Daniel Huss added a comment - SqlWalker::walkInExpression() does this: $sql = $this->walkArithmeticExpression($inExpr->expression) However, $inExpr->expression could be an instance of PathExpression . The grammar allows this case: InExpression ::= SingleValuedPathExpression [ "NOT" ] "IN" "(" (InParameter { "," InParameter}* | Subselect) ")" PathExpression and ArithmeticExpression both extend Node , but a PathExpression is not an ArithmeticExpression , and therefore it has no method isSimpleArithmeticExpression . If you still need a failing test case, I'll write one when I get home from work.
        Hide
        Fabio B. Silva added a comment -

        Please Daniel Huss, A test case will be very useful..

        Show
        Fabio B. Silva added a comment - Please Daniel Huss, A test case will be very useful..
        Hide
        Daniel Huss added a comment -

        failing test case

        Show
        Daniel Huss added a comment - failing test case
        Hide
        Daniel Huss added a comment -

        Bug still present in release 2.3.3

        Is someone taking care of this? It seems easy enough to fix.

        Show
        Daniel Huss added a comment - Bug still present in release 2.3.3 Is someone taking care of this? It seems easy enough to fix.
        Hide
        Marco Pivetta added a comment -

        Daniel Huss you can open a PR with the attached patch + test. Can you do it or should I take care of it?

        Show
        Marco Pivetta added a comment - Daniel Huss you can open a PR with the attached patch + test. Can you do it or should I take care of it?
        Hide
        Daniel Huss added a comment -

        Please take care of it for me this time. I'd rather avoid the git setup until I have a significant contribution to make.

        Show
        Daniel Huss added a comment - Please take care of it for me this time. I'd rather avoid the git setup until I have a significant contribution to make.
        Hide
        Benjamin Eberlei added a comment -

        This is invalid, you need to set the path expression differently, this is pseudo code:

        new ArtihmeticExpression(new SimpleArithmeticExpression(arithmeticsTerms => new PathExpression)));
        
        Show
        Benjamin Eberlei added a comment - This is invalid, you need to set the path expression differently, this is pseudo code: new ArtihmeticExpression( new SimpleArithmeticExpression(arithmeticsTerms => new PathExpression)));
        Hide
        Daniel Huss added a comment -

        Could this be bug in the DQL grammar, then? If I'm not mistaken, the resolution of an InExpression cannot involve an ArithmeticPrimary non-terminal. I find the correct solution as shown by Benjamin Eberlei to be quite astonishing, since a path expression like "alias.field" is not something I'd associate with the term "arithmetic".

        Show
        Daniel Huss added a comment - Could this be bug in the DQL grammar, then? If I'm not mistaken, the resolution of an InExpression cannot involve an ArithmeticPrimary non-terminal. I find the correct solution as shown by Benjamin Eberlei to be quite astonishing, since a path expression like "alias.field" is not something I'd associate with the term "arithmetic".

          People

          • Assignee:
            Benjamin Eberlei
            Reporter:
            Karma Dordrak (Drak)
          • Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: