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
 

Reply via email to