(Retrofit from trunk) N.539 Regression introduced in [r4451] on oct 7th. Some OQL were issuing a notice and some were generating a SQL query that would fail with error "Column 'functionalci_id' in where clause is ambiguous" (See CI details)

SVN:2.3[4493]
This commit is contained in:
Romain Quetiez
2016-12-05 12:54:32 +00:00
parent 73bedb1522
commit d651196eae
2 changed files with 59 additions and 1 deletions

View File

@@ -1237,7 +1237,16 @@ class DBObjectSearch extends DBSearch
$oConditionTree = $oOqlQuery->GetCondition();
if ($oConditionTree instanceof Expression)
{
$this->m_oSearchCondition = $this->OQLExpressionToCondition($sQuery, $oConditionTree, $aAliases);
$aRawAliases = array($sClassAlias => $sClass);
$aJoinSpecs = $oOqlQuery->GetJoins();
if (is_array($aJoinSpecs))
{
foreach ($aJoinSpecs as $oJoinSpec)
{
$aRawAliases[$oJoinSpec->GetClassAlias()] = $oJoinSpec->GetClass();
}
}
$this->m_oSearchCondition = $this->OQLExpressionToCondition($sQuery, $oConditionTree, $aRawAliases);
}
// Maintain an array of filters, because the flat list is in fact referring to a tree

View File

@@ -5401,6 +5401,55 @@ class TestUnions extends TestBizModel
catch (OQLException $e)
{
if ($bSuccess) throw $e;
echo "<p>Failed as expected.</p>\n";
}
}
}
}
class TestImplicitAlias extends TestBizModel
{
static public function GetName()
{
return 'OQLImplicitAliases';
}
static public function GetDescription()
{
return 'Checking implicit aliases resolution';
}
protected function DoExecute()
{
// The two first items did reveal an issue with the query cache,
//because SELECT Person on the second line must not give the same query as SELECT Person on the first line
$aQueries = array(
"SELECT Person WHERE org_id = 1" => true,
"SELECT Person WHERE s.org_id = 1" => false,
"SELECT Person AS p WHERE p.org_id = 1" => true,
"SELECT Person AS p WHERE Person.org_id = 1" => false,
"SELECT P FROM Organization AS O JOIN Person AS P ON P.org_id = O.id WHERE org_id = 2" => true, // Bug N.539
"SELECT Server JOIN Location ON Server.location_id = Location.id" => true,
"SELECT Server JOIN Location ON Server.location_id = id" => false,
"SELECT Server JOIN Location ON Server = Location.id" => false,
"SELECT Server JOIN Location ON Server.location_id = Location.id WHERE Server.org_id = 1" => true,
"SELECT Server JOIN Location ON Server.location_id = Location.id WHERE org_id = 1" => false,
);
foreach ($aQueries as $sQuery => $bSuccess)
{
echo "<h5>To Parse: ".htmlentities($sQuery, ENT_QUOTES, 'UTF-8')."</h5>\n";
try
{
$oSearch = DBSearch::FromOQL($sQuery);
if (!$bSuccess) throw new Exception('This query should not be parsable!');
CMDBSource::TestQuery($oSearch->MakeSelectQuery());
echo "<p>Successfully tested the SQL query.</p>\n";
}
catch (OQLException $e)
{
if ($bSuccess) throw $e;
echo "<p>Failed as expected.</p>\n";
}
}
}