diff -ru dbxml-2.3.10-original/dbxml/src/dbxml/optimizer/CostBasedOptimizer.cpp dbxml-2.3.10/dbxml/src/dbxml/optimizer/CostBasedOptimizer.cpp --- dbxml-2.3.10-original/dbxml/src/dbxml/optimizer/CostBasedOptimizer.cpp 2007-02-02 20:11:55.000000000 +0000 +++ dbxml-2.3.10/dbxml/src/dbxml/optimizer/CostBasedOptimizer.cpp 2007-03-21 20:30:20.000000000 +0000 @@ -352,7 +352,7 @@ } DbXmlNav::Steps::reverse_iterator CostBasedOptimizer::findBestIndex(DbXmlNav::Steps::reverse_iterator start, - DbXmlNav::Steps::reverse_iterator end) + DbXmlNav::Steps::reverse_iterator end, bool findJoin) { DbXmlNav::Steps::reverse_iterator found_it = end; QueryPlan::Cost found_cost; @@ -374,7 +374,7 @@ } } } - } else if((*i)->getType() == (ASTNode::whichType)DbXmlASTNode::JOIN) { + } else if(findJoin && (*i)->getType() == (ASTNode::whichType)DbXmlASTNode::JOIN) { LookupIndex *index = findLookupIndex(*i); if(index != 0 && index->isSuitableForLookupIndex()) { @@ -448,7 +448,7 @@ } DbXmlNav::Steps &args = const_cast(nav->getSteps()); - DbXmlNav::Steps::reverse_iterator found_it = findBestIndex(args.rbegin(), args.rend()); + DbXmlNav::Steps::reverse_iterator found_it = findBestIndex(args.rbegin(), args.rend(), /*findJoin*/false); if(found_it != args.rend()) { // Create a navigation for the forward steps, @@ -568,7 +568,7 @@ args.push_back(const_cast(item->getArgument())); } - DbXmlNav::Steps::reverse_iterator found_it = findBestIndex(args.rbegin(), args.rend()); + DbXmlNav::Steps::reverse_iterator found_it = findBestIndex(args.rbegin(), args.rend(), /*findJoin*/true); if(found_it == args.rend()) { found_it = findLastJoin(args.rbegin(), args.rend()); diff -ru dbxml-2.3.10-original/dbxml/src/dbxml/optimizer/CostBasedOptimizer.hpp dbxml-2.3.10/dbxml/src/dbxml/optimizer/CostBasedOptimizer.hpp --- dbxml-2.3.10-original/dbxml/src/dbxml/optimizer/CostBasedOptimizer.hpp 2006-10-30 17:45:59.000000000 +0000 +++ dbxml-2.3.10/dbxml/src/dbxml/optimizer/CostBasedOptimizer.hpp 2007-03-21 20:29:19.000000000 +0000 @@ -34,7 +34,7 @@ private: void compressSteps(DbXmlNav *nav); DbXmlNav::Steps::reverse_iterator findBestIndex(DbXmlNav::Steps::reverse_iterator start, - DbXmlNav::Steps::reverse_iterator end); + DbXmlNav::Steps::reverse_iterator end, bool findJoin); bool isASTNodeReversible(ASTNode *ast); bool reverseASTNode(ASTNode *ast, Join::Type &axis, LookupIndex *index, DbXmlNav *&reverse);