imay closed pull request #252: Support NULLS LAST and NULLS FIRST syntax
URL: https://github.com/apache/incubator-doris/pull/252
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/fe/src/main/cup/sql_parser.cup b/fe/src/main/cup/sql_parser.cup
index a8ad6ccb..24d5e4c3 100644
--- a/fe/src/main/cup/sql_parser.cup
+++ b/fe/src/main/cup/sql_parser.cup
@@ -205,9 +205,9 @@ terminal String KW_ADD, KW_ADMIN, KW_AFTER, KW_AGGREGATE, 
KW_ALL, KW_ALTER, KW_A
     KW_INNER, KW_INSERT, KW_INT, KW_INTERVAL, KW_INTO, KW_IS, KW_ISNULL,  
KW_ISOLATION,
     KW_JOIN,
     KW_KEY, KW_KILL,
-    KW_LABEL, KW_LARGEINT, KW_LEFT, KW_LESS, KW_LEVEL, KW_LIKE, KW_LIMIT, 
KW_LINK, KW_LOAD, KW_LOCAL, KW_LOCATION,
+    KW_LABEL, KW_LARGEINT, KW_LAST, KW_LEFT, KW_LESS, KW_LEVEL, KW_LIKE, 
KW_LIMIT, KW_LINK, KW_LOAD, KW_LOCAL, KW_LOCATION,
     KW_MAX, KW_MAX_VALUE, KW_MERGE, KW_MIN, KW_MIGRATE, KW_MIGRATIONS, 
KW_MODIFY,
-    KW_NAME, KW_NAMES, KW_NEGATIVE, KW_NO, KW_NOT, KW_NULL,
+    KW_NAME, KW_NAMES, KW_NEGATIVE, KW_NO, KW_NOT, KW_NULL, KW_NULLS,
     KW_OBSERVER, KW_OFFSET, KW_ON, KW_ONLY, KW_OPEN, KW_OR, KW_ORDER, 
KW_OUTER, KW_OVER,
     KW_PARTITION, KW_PARTITIONS, KW_PRECEDING,
     KW_PASSWORD, KW_PLUGIN, KW_PLUGINS,
@@ -299,6 +299,8 @@ nonterminal ArrayList<Expr> group_by_clause, 
opt_partition_by_clause;
 nonterminal Expr having_clause;
 nonterminal ArrayList<OrderByElement> order_by_elements, order_by_clause;
 nonterminal OrderByElement order_by_element;
+nonterminal Boolean opt_order_param;
+nonterminal Boolean opt_nulls_order_param;
 nonterminal LimitElement limit_clause;
 nonterminal Expr cast_expr, case_else_clause, analytic_expr;
 nonterminal LiteralExpr literal;
@@ -2981,12 +2983,26 @@ order_by_elements ::=
   ;
 
 order_by_element ::=
-  expr:e
-  {: RESULT = new OrderByElement(e, true); :}
-  | expr:e KW_ASC
-  {: RESULT = new OrderByElement(e, true); :}
-  | expr:e KW_DESC
-  {: RESULT = new OrderByElement(e, false); :}
+  expr:e opt_order_param:o opt_nulls_order_param:n
+  {: RESULT = new OrderByElement(e, o, n); :}
+  ;
+
+opt_order_param ::=
+  KW_ASC
+  {: RESULT = true; :}
+  | KW_DESC
+  {: RESULT = false; :}
+  | /* empty */
+  {: RESULT = true; :}
+  ;
+
+opt_nulls_order_param ::=
+  KW_NULLS KW_FIRST
+  {: RESULT = true; :}
+  | KW_NULLS KW_LAST
+  {: RESULT = false; :}
+  | /* empty */
+  {: RESULT = null; :}
   ;
 
 limit_clause ::=
@@ -3673,6 +3689,8 @@ keyword ::=
     {: RESULT = id; :}
     | KW_LABEL:id
     {: RESULT = id; :}
+    | KW_LAST:id
+    {: RESULT = id; :}
     | KW_LESS:id
     {: RESULT = id; :}
     | KW_LEVEL:id
@@ -3693,6 +3711,8 @@ keyword ::=
     {: RESULT = id; :}
     | KW_NO:id
     {: RESULT = id; :}
+    | KW_NULLS:id
+    {: RESULT = id; :}
     | KW_OFFSET:id
     {: RESULT = id; :}
     | KW_ONLY:id
diff --git a/fe/src/main/java/org/apache/doris/analysis/OrderByElement.java 
b/fe/src/main/java/org/apache/doris/analysis/OrderByElement.java
index da008994..8d041bcb 100644
--- a/fe/src/main/java/org/apache/doris/analysis/OrderByElement.java
+++ b/fe/src/main/java/org/apache/doris/analysis/OrderByElement.java
@@ -25,7 +25,7 @@
 
 
 /**
- * Combination of expr and ASC/DESC.
+ * Combination of expr and ASC/DESC, and nulls ordering.
  */
 public class OrderByElement {
     private Expr    expr;
@@ -33,12 +33,13 @@
 
     // Represents the NULLs ordering specified: true when "NULLS FIRST", false 
when
     // "NULLS LAST", and null if not specified.
-    private Boolean nullsFirstParam;
+    private final Boolean nullsFirstParam;
     
-    public OrderByElement(Expr expr, boolean isAsc) {
+    public OrderByElement(Expr expr, boolean isAsc, Boolean nullsFirstParam) {
         super();
         this.expr = expr;
         this.isAsc = isAsc;
+        this.nullsFirstParam = nullsFirstParam;
     }
     
     public void setExpr(Expr e) {
@@ -58,7 +59,7 @@ public Boolean getNullsFirstParam() {
     }
     public OrderByElement clone() {
         OrderByElement clone = new OrderByElement(
-                expr.clone(), isAsc);
+                expr.clone(), isAsc, nullsFirstParam);
         return clone;
     }
     /**
@@ -71,7 +72,7 @@ public OrderByElement clone() {
         for (int i = 0; i < src.size(); ++i) {
             OrderByElement element = src.get(i);
             OrderByElement reverseElement =
-                new OrderByElement(element.getExpr().clone(), !element.isAsc);
+                new OrderByElement(element.getExpr().clone(), !element.isAsc, 
!element.nullsFirstParam);
             result.add(reverseElement);
         }
 
@@ -101,7 +102,7 @@ public OrderByElement clone() {
 
         for (OrderByElement element: src) {
             result.add(new OrderByElement(element.getExpr().substitute(smap, 
analyzer, false),
-                    element.isAsc));
+                    element.isAsc, element.nullsFirstParam));
         }
 
         return result;
@@ -138,7 +139,7 @@ public boolean equals(Object obj) {
         }
 
         OrderByElement o = (OrderByElement)obj;
-        return expr.equals(o.expr) && isAsc == o.isAsc;
+        return expr.equals(o.expr) && isAsc == o.isAsc  && nullsFirstParam == 
o.nullsFirstParam;
     }
     /**
      * Compute nullsFirst.
diff --git a/fe/src/main/jflex/sql_scanner.flex 
b/fe/src/main/jflex/sql_scanner.flex
index 8bf045ce..bdc878b3 100644
--- a/fe/src/main/jflex/sql_scanner.flex
+++ b/fe/src/main/jflex/sql_scanner.flex
@@ -184,6 +184,7 @@ import org.apache.doris.common.util.SqlUtils;
         keywordMap.put("kill", new Integer(SqlParserSymbols.KW_KILL));
         keywordMap.put("label", new Integer(SqlParserSymbols.KW_LABEL));
         keywordMap.put("largeint", new Integer(SqlParserSymbols.KW_LARGEINT));
+        keywordMap.put("last", new Integer(SqlParserSymbols.KW_LAST));
         keywordMap.put("left", new Integer(SqlParserSymbols.KW_LEFT));
         keywordMap.put("less", new Integer(SqlParserSymbols.KW_LESS));
         keywordMap.put("level", new Integer(SqlParserSymbols.KW_LEVEL));
@@ -203,6 +204,7 @@ import org.apache.doris.common.util.SqlUtils;
         keywordMap.put("no", new Integer(SqlParserSymbols.KW_NO));
         keywordMap.put("not", new Integer(SqlParserSymbols.KW_NOT));
         keywordMap.put("null", new Integer(SqlParserSymbols.KW_NULL));
+        keywordMap.put("nulls", new Integer(SqlParserSymbols.KW_NULLS));
         keywordMap.put("observer", new Integer(SqlParserSymbols.KW_OBSERVER));
         keywordMap.put("offset", new Integer(SqlParserSymbols.KW_OFFSET));
         keywordMap.put("on", new Integer(SqlParserSymbols.KW_ON));


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@doris.apache.org
For additional commands, e-mail: dev-h...@doris.apache.org

Reply via email to