Repository: trafodion Updated Branches: refs/heads/master 4fdc74241 -> 5dfbe30ce
[TRAFODION-3025] support order by in subquery if there is limit N Project: http://git-wip-us.apache.org/repos/asf/trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/trafodion/commit/e45745fe Tree: http://git-wip-us.apache.org/repos/asf/trafodion/tree/e45745fe Diff: http://git-wip-us.apache.org/repos/asf/trafodion/diff/e45745fe Branch: refs/heads/master Commit: e45745fece09450f59a1adebc7b3413b35e54c50 Parents: 397fd2d Author: Liu Ming <ovis_p...@sina.com> Authored: Sat Jun 2 02:37:54 2018 -0400 Committer: Liu Ming <ovis_p...@sina.com> Committed: Sat Jun 2 02:37:54 2018 -0400 ---------------------------------------------------------------------- core/sql/optimizer/NormRelExpr.cpp | 19 ++++++++++++++++++- core/sql/optimizer/RelMisc.h | 2 ++ 2 files changed, 20 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafodion/blob/e45745fe/core/sql/optimizer/NormRelExpr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/NormRelExpr.cpp b/core/sql/optimizer/NormRelExpr.cpp index 974c055..07df1b0 100644 --- a/core/sql/optimizer/NormRelExpr.cpp +++ b/core/sql/optimizer/NormRelExpr.cpp @@ -7471,7 +7471,15 @@ void RelRoot::transformNode(NormWA & normWARef, } else updatableSelect() = FALSE; - + + if ((child(0)->castToRelExpr()->getOperatorType() == REL_FIRST_N) ) + { + FirstN* firstn = (FirstN *)child(0)->castToRelExpr(); + if(firstn->reqdOrderInSubquery().entries() >0 ) + { + reqdOrder().insert( firstn->reqdOrderInSubquery()); + } + } } else { @@ -7490,6 +7498,14 @@ void RelRoot::transformNode(NormWA & normWARef, locationOfPointerToMe = child(0); // my parent now -> my child child(0)->setFirstNRows(getFirstNRows()); + + //keep the order if there is FIRSTN + if (child(0)->getOperatorType()==REL_FIRST_N) + { + FirstN* firstn = (FirstN *)child(0)->castToRelExpr(); + firstn->reqdOrderInSubquery().insert(reqdOrder()) ; + } + deleteInstance(); // Goodbye! @@ -7676,6 +7692,7 @@ RelExpr * RelRoot::normalizeNode(NormWA & normWARef) if ((reqdOrder().entries() > 0) && (child(0)->getOperatorType() == REL_FIRST_N)) { +printf("LMDBG root push order by to firstn\n"); FirstN * firstn = (FirstN *)child(0)->castToRelExpr(); if (firstn->isFirstN()) // that is, [first n], not [any n] or [last n] firstn->reqdOrder().insert(reqdOrder()); http://git-wip-us.apache.org/repos/asf/trafodion/blob/e45745fe/core/sql/optimizer/RelMisc.h ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/RelMisc.h b/core/sql/optimizer/RelMisc.h index 9ea9782..9275cac 100644 --- a/core/sql/optimizer/RelMisc.h +++ b/core/sql/optimizer/RelMisc.h @@ -1662,6 +1662,7 @@ public: NABoolean isFirstN() { return isFirstN_; } ValueIdList & reqdOrder() { return reqdOrder_; } + ValueIdList & reqdOrderInSubquery() { return reqdOrderInSubquery_; } private: // Otherwise, return firstNRows_ at runtime. @@ -1673,6 +1674,7 @@ private: // Optional ORDER BY to force ordering before applying First N; populated // at normalizeNode time. ValueIdList reqdOrder_; + ValueIdList reqdOrderInSubquery_; }; // class FirstN