Description
Using PHQL to make a query with joins generates broken PDO query.
For example, next code:
$res = $this->modelsManager->executeQuery('select p.payOrderPosId, o.payDate, a.lastName ' .
'from HL\\PayOrderPos p join HL\\PayOrder o on p.payOrderId = o.payOrderId ' .
'join HL\\Anketa a on a.anketaId = o.anketaId limit 50');
Generates the following query:
SELECT * FROM (SELECT Z1.*, ROWNUM PHALCON_RN FROM
(SELECT p.PAY_ORDER_POS_ID AS payOrderPosId,
o.PAY_DATE AS payDate, a.LAST_NAME AS lastName FROM PAY_ORDER_POS AS p
INNER JOIN PAY_ORDER AS o ON p.PAY_ORDER_ID = o.PAY_ORDER_ID
INNER JOIN ANKETA AS a ON a.ANKETA_ID = o.ANKETA_ID)
Z1 WHERE ROWNUM <= 50)
SELECT * FROM (SELECT Z1.*, ROWNUM PHALCON_RN FROM (SELECT p.PAY_ORDER_POS_ID AS payOrderPosId, o.PAY_DATE AS payDate, a.LAST_NAME AS lastName FROM PAY_ORDER_POS AS p INNER JOIN PAY_ORDER AS o ON p.PAY_ORDER_ID = o.PAY_ORDER_ID INNER JOIN ANKETA AS a ON a.ANKETA_ID = o.ANKETA_ID) Z1 WHERE ROWNUM <= 50)
which results in error:
SQLSTATE[HY000]: General error: 907 OCIStmtExecute: ORA-00907: missing right parenthesis (/root/build/php-5.6.17/ext/pdo_oci/oci_statement.c:148)
Trying to query without limit gives another error:
$res = $this->modelsManager->executeQuery('select p.payOrderPosId, o.payDate, a.lastName ' .
'from HL\\PayOrderPos p join HL\\PayOrder o on p.payOrderId = o.payOrderId ' .
'join HL\\Anketa a on a.anketaId = o.anketaId');
SELECT p.PAY_ORDER_POS_ID AS payOrderPosId, o.PAY_DATE AS payDate, a.LAST_NAME AS lastName
FROM PAY_ORDER_POS AS p
INNER JOIN PAY_ORDER AS o ON p.PAY_ORDER_ID = o.PAY_ORDER_ID
INNER JOIN ANKETA AS a ON a.ANKETA_ID = o.ANKETA_ID
SELECT p.PAY_ORDER_POS_ID AS payOrderPosId, o.PAY_DATE AS payDate, a.LAST_NAME AS lastName FROM PAY_ORDER_POS AS p INNER JOIN PAY_ORDER AS o ON p.PAY_ORDER_ID = o.PAY_ORDER_ID INNER JOIN ANKETA AS a ON a.ANKETA_ID = o.ANKETA_ID
SQLSTATE[HY000]: General error: 933 OCIStmtExecute: ORA-00933: SQL command not properly ended (/root/build/php-5.6.17/ext/pdo_oci/oci_statement.c:148)
Checking this with SQLDeveloper i figured that AS in the table naming should be omitted for Oracle. Therefore correct query is following:
SELECT p.PAY_ORDER_POS_ID AS payOrderPosId, o.PAY_DATE AS payDate, a.LAST_NAME AS lastName
FROM PAY_ORDER_POS p
INNER JOIN PAY_ORDER o ON p.PAY_ORDER_ID = o.PAY_ORDER_ID
INNER JOIN ANKETA a ON a.ANKETA_ID = o.ANKETA_ID
A little more investigation is that the first error about "right paranthesis" is as well caused by extra "AS"es in the query.
Phalcon version: 2.1.0 RC 1