Author: bandaram
Date: Fri Apr  1 16:12:48 2005
New Revision: 159746

URL: http://svn.apache.org/viewcvs?view=rev&rev=159746
Log:
Derby-134: Improvement to allow ordering by expressions, instead of correlation 
names or column positions only.

Submitted by Tomohito Nakayama. ([EMAIL PROTECTED])

Modified:
    
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/IntersectOrExceptNode.java
    
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OrderByColumn.java
    
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/TableName.java
    
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
    
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/orderby.out
    
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/orderby.sql

Modified: 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/IntersectOrExceptNode.java
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/IntersectOrExceptNode.java?view=diff&r1=159745&r2=159746
==============================================================================
--- 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/IntersectOrExceptNode.java
 (original)
+++ 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/IntersectOrExceptNode.java
 Fri Apr  1 16:12:48 2005
@@ -202,7 +202,9 @@
         {
             OrderByColumn orderByColumn = (OrderByColumn)
               nf.getNode( C_NodeTypes.ORDER_BY_COLUMN,
-                          ReuseFactory.getInteger( 
intermediateOrderByColumns[i] + 1),
+                         nf.getNode(C_NodeTypes.INT_CONSTANT_NODE,
+                                    ReuseFactory.getInteger( 
intermediateOrderByColumns[i] + 1),
+                                    cm),
                           cm);
             if( intermediateOrderByDirection[i] < 0)
                 orderByColumn.setDescending();

Modified: 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OrderByColumn.java
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OrderByColumn.java?view=diff&r1=159745&r2=159746
==============================================================================
--- 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OrderByColumn.java
 (original)
+++ 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OrderByColumn.java
 Fri Apr  1 16:12:48 2005
@@ -42,36 +42,20 @@
 public class OrderByColumn extends OrderedColumn {
 
        private ResultColumn    resultCol;
-       private String                  columnName;
-       private String                  correlationName;
-       private String  schemaName;
        private boolean                 ascending = true;
+       private ValueNode expression;
 
-       /**
-        * Initializer.
-        *
-        * @param columnName            The name of the column being referenced
-        * @param correlationName       The correlation name, if any
-        */
-       public void init(
-                                               Object columnName, 
-                                               Object correlationName,
-                                               Object schemaName) 
-       {
-               this.columnName = (String) columnName;
-               this.correlationName = (String) correlationName;
-               this.schemaName = (String) schemaName;
-       }
 
-       /**
+       /**
         * Initializer.
         *
-        * @param columnPosition        The position of the column being 
referenced
+        * @param expression            Expression of this column
         */
-       public void init(Object columnPosition) {
-               this.columnPosition = ((Integer) columnPosition).intValue();
+       public void init(Object expression)
+       {
+               this.expression = (ValueNode)expression;
        }
-
+       
        /**
         * Convert this object to a String.  See comments in QueryTreeNode.java
         * for how this should be done for tree printing.
@@ -80,25 +64,13 @@
         */
        public String toString() {
                if (SanityManager.DEBUG) {
-                       return "columnName: " + columnName + "\n" +
-                               "correlationName: " + correlationName + "\n" +
-                               "schemaName: " + schemaName + "\n" +
-                               super.toString();
+                       return expression.toString();
                } else {
                        return "";
                }
        }
 
        /**
-        * Get the name of this column
-        *
-        * @return      The name of this column
-        */
-       public String getColumnName() {
-               return columnName;
-       }
-
-       /**
         * Mark the column as descending order
         */
        public void setDescending() {
@@ -168,80 +140,46 @@
        public void bindOrderByColumn(ResultSetNode target)
                                throws StandardException 
        {
-               int                                     sourceTableNumber = -1;
-               ResultColumnList        targetCols = target.getResultColumns();
-
-               //bug 5716 - for db2 compatibility - no qualified names allowed 
in order by clause when union/union all operator is used 
-               if (target instanceof SetOperatorNode && correlationName != 
null)
-               {
-                       String fullName = (schemaName != null) ?
-                               (schemaName + "." + correlationName + "." + 
columnName) :
-                               (correlationName + "." + columnName);
-                       throw 
StandardException.newException(SQLState.LANG_QUALIFIED_COLUMN_NAME_NOT_ALLOWED, 
fullName);
-               }
-               /* If the correlation name is non-null then we need to verify 
that it
-                * is a valid exposed name.  
-                */
-               if (correlationName != null)
-               {
-                       /* Find the matching FromTable visible in the current 
scope.
-                        * We first try a full match on both schema and table 
name.  If no
-                        * match, then we go for same table id.
-                        */
-                       FromTable fromTable = 
target.getFromTableByName(correlationName, schemaName, true);
-                       if (fromTable == null)
-                       {
-                               fromTable = 
target.getFromTableByName(correlationName, schemaName, false);
-                               if (fromTable == null)
-                               {
-                                       String fullName = (schemaName != null) ?
-                                                                               
(schemaName + "." + correlationName) : 
-                                                                               
correlationName;
-                                       // correlation name is not an exposed 
name in the current scope
-                                       throw 
StandardException.newException(SQLState.LANG_EXPOSED_NAME_NOT_FOUND, fullName);
-                               }
-                       }
+               if(expression instanceof ColumnReference){
+               
+                       ColumnReference cr = (ColumnReference) expression;
+                       
+                       resultCol = resolveColumnReference(target,
+                                                          cr);
                        
-                       /* HACK - if the target is a UnionNode, then we have to
-                        * have special code to get the sourceTableNumber.  
This is
-                        * because of the gyrations we go to with building the 
RCLs
-                        * for a UnionNode.
-                        */
-                       if (target instanceof SetOperatorNode)
-                       {
-                               sourceTableNumber = ((FromTable) 
target).getTableNumber();
-                       }
-                       else
-                       {
-                               sourceTableNumber = fromTable.getTableNumber();
-                       }
-               }
-
-               if (columnName != null) 
-               {
-                       /* If correlation name is not null, then we look an RC 
whose expression is a
-                        * ColumnReference with the same table number as the 
FromTable with 
-                        * correlationName as its exposed name.
-                        * If correlation name is null, then we simply look for 
an RC whose name matches
-                        * columnName.
-                        */
-                       resultCol = targetCols.getOrderByColumn(columnName, 
correlationName, sourceTableNumber);
-
-                       /* DB2 doesn't allow ordering using generated column 
name */
-                       if ((resultCol == null) || resultCol.isNameGenerated())
-                       {
-                               String errString = (correlationName == null) ?
-                                                                       
columnName :
-                                                                       
correlationName + "." + columnName;
-                               throw 
StandardException.newException(SQLState.LANG_ORDER_BY_COLUMN_NOT_FOUND, 
errString);
-                       }
                        columnPosition = resultCol.getColumnPosition();
-               }
-               else {
+
+               }else if(isReferedColByNum(expression)){
+                       
+                       ResultColumnList targetCols = target.getResultColumns();
+                       columnPosition = 
((Integer)expression.getConstantValueAsObject()).intValue();
                        resultCol = targetCols.getOrderByColumn(columnPosition);
+                       
                        if (resultCol == null) {
-                               throw 
StandardException.newException(SQLState.LANG_COLUMN_OUT_OF_RANGE, 
String.valueOf(columnPosition));
+                               throw 
StandardException.newException(SQLState.LANG_COLUMN_OUT_OF_RANGE, 
+                                                                    
String.valueOf(columnPosition));
                        }
+
+               }else{
+                       ResultColumnList targetCols = target.getResultColumns();
+                       ResultColumn col = null;
+                       int i = 1;
+                       
+                       for(i = 1;
+                           i <= targetCols.size();
+                           i  ++){
+                               
+                               col = targetCols.getOrderByColumn(i);
+                               if(col != null && 
+                                  col.getExpression() == expression){
+                                       
+                                       break;
+                               }
+                       }
+                       
+                       resultCol = col;
+                       columnPosition = i;
+                   
                }
 
                // Verify that the column is orderable
@@ -257,44 +195,33 @@
        public void pullUpOrderByColumn(ResultSetNode target)
                                throws StandardException 
        {
-               if (columnName != null) 
-               {
-                       /* If correlation name is not null, then we look an RC 
whose expression is a
-                        * ColumnReference with the same table number as the 
FromTable with 
-                        * correlationName as its exposed name.
-                        * If correlation name is null, then we simply look for 
an RC whose name matches
-                        * columnName.
-                        */
-                       ResultColumnList        targetCols = 
target.getResultColumns();
-                       resultCol = targetCols.getOrderByColumn(columnName, 
correlationName);
-                       if (resultCol == null) 
-                       {// add this order by column to the result set
+               if(expression instanceof ColumnReference){
 
-                               TableName tabName = null;
-                               if (schemaName != null || correlationName != 
null)
-                               {
-                                       tabName = (TableName) 
getNodeFactory().getNode(
-                                                                               
                                                   C_NodeTypes.TABLE_NAME,
-                                                                               
                                                   schemaName,
-                                                                               
                                                   correlationName,
-                                                                               
                                                   getContextManager());
-                               }
-
-                               ColumnReference cr = (ColumnReference) 
getNodeFactory().getNode(
-                                                                               
                                                                   
C_NodeTypes.COLUMN_REFERENCE,
-                                                                               
                                                                   columnName,
-                                                                               
                                                                   tabName,
-                                                                               
                                                                   
getContextManager());
-                               
-                               resultCol = (ResultColumn) 
getNodeFactory().getNode(
-                                                                               
                                           C_NodeTypes.RESULT_COLUMN,
-                                                                               
                                           columnName,
-                                                                               
                                           cr, // column reference
-                                                                               
                                           getContextManager());
+                       ColumnReference cr = (ColumnReference) expression;
 
+                       ResultColumnList targetCols = target.getResultColumns();
+                       resultCol = 
targetCols.getOrderByColumn(cr.getColumnName(),
+                                                               cr.tableName != 
null ? 
+                                                               
cr.tableName.getFullTableName():
+                                                               null);
+
+                       if(resultCol == null){
+                               resultCol = (ResultColumn) 
getNodeFactory().getNode(C_NodeTypes.RESULT_COLUMN,
+                                                                               
    cr.getColumnName(),
+                                                                               
    cr,
+                                                                               
    getContextManager());
                                targetCols.addResultColumn(resultCol);
                                targetCols.incOrderBySelect();
                        }
+                       
+               }else if(!isReferedColByNum(expression)){
+                       ResultColumnList        targetCols = 
target.getResultColumns();
+                       resultCol = (ResultColumn) 
getNodeFactory().getNode(C_NodeTypes.RESULT_COLUMN,
+                                                                           
null,
+                                                                           
expression,
+                                                                           
getContextManager());
+                       targetCols.addResultColumn(resultCol);
+                       targetCols.incOrderBySelect();
                }
        }
 
@@ -345,4 +272,80 @@
                resultCol.setExpression(
                        
resultCol.getExpression().remapColumnReferencesToExpressions());
        }
+
+       private static boolean isReferedColByNum(ValueNode expression) 
+       throws StandardException{
+               
+               if(!expression.isConstantExpression()){
+                       return false;
+               }
+               
+               return expression.getConstantValueAsObject() instanceof Integer;
+       }
+
+       
+       private static ResultColumn resolveColumnReference(ResultSetNode target,
+                                                          ColumnReference cr)
+       throws StandardException{
+               
+               ResultColumn resultCol = null;
+               
+               int                                     sourceTableNumber = -1;
+               
+               //bug 5716 - for db2 compatibility - no qualified names allowed 
in order by clause when union/union all operator is used 
+
+               if (target instanceof SetOperatorNode && cr.getTableName() != 
null){
+                       String fullName = cr.getSQLColumnName();
+                       throw 
StandardException.newException(SQLState.LANG_QUALIFIED_COLUMN_NAME_NOT_ALLOWED, 
fullName);
+               }
+
+               if(cr.getTableNameNode() != null){
+                       TableName tableNameNode = cr.getTableNameNode();
+
+                       FromTable fromTable = 
target.getFromTableByName(tableNameNode.getTableName(),
+                                                                       
(tableNameNode.hasSchema() ?
+                                                                        
tableNameNode.getSchemaName():null),
+                                                                       true);
+                       if(fromTable == null){
+                               fromTable = 
target.getFromTableByName(tableNameNode.getTableName(),
+                                                                     
(tableNameNode.hasSchema() ?
+                                                                      
tableNameNode.getSchemaName():null),
+                                                                     false);
+                               if(fromTable == null){
+                                       String fullName = 
cr.getTableNameNode().toString();
+                                       throw 
StandardException.newException(SQLState.LANG_EXPOSED_NAME_NOT_FOUND, fullName);
+                               }
+                       }
+
+                       /* HACK - if the target is a UnionNode, then we have to
+                        * have special code to get the sourceTableNumber.  
This is
+                        * because of the gyrations we go to with building the 
RCLs
+                        * for a UnionNode.
+                        */
+                       if (target instanceof SetOperatorNode)
+                       {
+                               sourceTableNumber = ((FromTable) 
target).getTableNumber();
+                       }
+                       else
+                       {
+                               sourceTableNumber = fromTable.getTableNumber();
+                       }
+                       
+               }
+
+               ResultColumnList        targetCols = target.getResultColumns();
+
+               resultCol = targetCols.getOrderByColumn(cr.getColumnName(),
+                                                       cr.getTableName(),
+                                                       sourceTableNumber);
+                                                       
+               if (resultCol == null || resultCol.isNameGenerated()){
+                       String errString = cr.columnName;
+                       throw 
StandardException.newException(SQLState.LANG_ORDER_BY_COLUMN_NOT_FOUND, 
errString);
+               }
+
+               return resultCol;
+
+       }
+
 }

Modified: 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/TableName.java
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/TableName.java?view=diff&r1=159745&r2=159746
==============================================================================
--- 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/TableName.java
 (original)
+++ 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/TableName.java
 Fri Apr  1 16:12:48 2005
@@ -107,6 +107,16 @@
        }
 
        /**
+        * Return true if this instance was initialized with not null 
schemaName.
+        *
+        * @return true if this instance was initialized with not null 
schemaName
+        */
+       
+       public boolean hasSchema(){
+               return hasSchema;
+       }
+
+       /**
         * Get the schema name.
         *
         * @return Schema name as a String

Modified: 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj?view=diff&r1=159745&r2=159746
==============================================================================
--- 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
 (original)
+++ 
incubator/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
 Fri Apr  1 16:12:48 2005
@@ -6584,71 +6584,20 @@
        orderCol = sortKey() /* [ collateClause() ] */ [ 
orderingSpecification(orderCol) ]
        {
                orderCols.addOrderByColumn(orderCol);
-       }
+       } 
 }
 
 OrderByColumn
 sortKey() throws StandardException :
 {
-       String firstName;
-       String secondName = null;
-       String thirdName = null;
-       String columnName = null;
-       String correlationName = null;
-       String schemaName = null;
-       int columnPosition;
+       ValueNode columnExpression;
 } 
 {
-       firstName = identifier(DB2Limit.DB2_MAX_IDENTIFIER_LENGTH128, false)
-       [
-               <PERIOD> secondName = 
identifier(DB2Limit.DB2_MAX_IDENTIFIER_LENGTH128, false)
-               [
-                       <PERIOD> thirdName = 
identifier(DB2Limit.DB2_MAX_IDENTIFIER_LENGTH128, false)
-               ]
-       ]
-       {
-               // Figure out what each name stands for
-               if (thirdName == null)
-               {
-                       if (secondName == null)
-                       {
-                               // only one name, so must be column name
-                               columnName = firstName;
-                       }
-                       else
-                       {
-                               // Two names: correlation.column
-                               correlationName = firstName;
-                               columnName = secondName;
-                       }
-               }
-               else
-               {
-                       // Three names: schema.correlation.column
-                       schemaName = firstName;
-                       correlationName = secondName;
-                       columnName = thirdName;
-               }
-
-               //column name and schema name can not be longer than 30 
characters and correlation name can not be longer than 128 characters
-               checkIdentifierLengthLimit(columnName, 
DB2Limit.DB2_MAX_IDENTIFIER_LENGTH30);
-               if (schemaName != null)
-                       checkIdentifierLengthLimit(schemaName, 
DB2Limit.DB2_MAX_IDENTIFIER_LENGTH30);
-               if (correlationName != null)
-                       checkIdentifierLengthLimit(correlationName, 
DB2Limit.DB2_MAX_IDENTIFIER_LENGTH128);
-               return (OrderByColumn) nodeFactory.getNode(
-                                                               
C_NodeTypes.ORDER_BY_COLUMN,
-                                                               columnName,
-                                                               correlationName,
-                                                               schemaName,
-                                                               
getContextManager());
-       }
-|
-       columnPosition = uint_value()
+       columnExpression = additiveExpression(null,0,true)
        {
                return (OrderByColumn) nodeFactory.getNode(
                                                                
C_NodeTypes.ORDER_BY_COLUMN,
-                                                               
ReuseFactory.getInteger(columnPosition),
+                                                               
columnExpression,
                                                                
getContextManager());
        }
 }

Modified: 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/orderby.out
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/orderby.out?view=diff&r1=159745&r2=159746
==============================================================================
--- 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/orderby.out
 (original)
+++ 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/orderby.out
 Fri Apr  1 16:12:48 2005
@@ -345,9 +345,15 @@
 2          
 1          
 NULL       
-ij> -- . order by on expression (not allowed)
+ij> -- . order by on expression (allowed)
 select i from obt order by i+1;
-ERROR 42X01: Syntax error: Encountered "+" at line 2, column 29.
+I          
+-----------
+1          
+1          
+2          
+3          
+NULL       
 ij> -- . order by on qualified column name, incorrect correlation name (not 
allowed)
 select i from obt t order by obt.i;
 ERROR 42X04: Column 'OBT.I' is not in any table in the FROM list or it appears 
within a join specification and is outside the scope of the join specification 
or it appears in a HAVING clause and is not in the GROUP BY list.  If this is a 
CREATE or ALTER TABLE statement then 'OBT.I' is not a column in the target 
table.
@@ -863,6 +869,352 @@
 2          |NULL       
 3          |NULL       
 0          |NULL       
+ij> --Test addtive expression in order clause
+create table test_word(value varchar(32));
+0 rows inserted/updated/deleted
+ij> insert into test_word(value) values('anaconda');
+1 row inserted/updated/deleted
+ij> insert into test_word(value) values('America');
+1 row inserted/updated/deleted
+ij> insert into test_word(value) values('camel');
+1 row inserted/updated/deleted
+ij> insert into test_word(value) values('Canada');
+1 row inserted/updated/deleted
+ij> select * from test_word order by value;
+VALUE                           
+--------------------------------
+America                         
+Canada                          
+anaconda                        
+camel                           
+ij> select * from test_word order by upper(value);
+VALUE                           
+--------------------------------
+America                         
+anaconda                        
+camel                           
+Canada                          
+ij> drop table test_word;
+0 rows inserted/updated/deleted
+ij> create table test_number(value integer);
+0 rows inserted/updated/deleted
+ij> insert into test_number(value) values(-1);
+1 row inserted/updated/deleted
+ij> insert into test_number(value) values(0);
+1 row inserted/updated/deleted
+ij> insert into test_number(value) values(1);
+1 row inserted/updated/deleted
+ij> insert into test_number(value) values(2);
+1 row inserted/updated/deleted
+ij> insert into test_number(value) values(3);
+1 row inserted/updated/deleted
+ij> insert into test_number(value) values(100);
+1 row inserted/updated/deleted
+ij> insert into test_number(value) values(1000);
+1 row inserted/updated/deleted
+ij> select * from test_number order by value;
+VALUE      
+-----------
+-1         
+0          
+1          
+2          
+3          
+100        
+1000       
+ij> select * from test_number order by value + 1;
+VALUE      
+-----------
+-1         
+0          
+1          
+2          
+3          
+100        
+1000       
+ij> select * from test_number order by value - 1;
+VALUE      
+-----------
+-1         
+0          
+1          
+2          
+3          
+100        
+1000       
+ij> select * from test_number order by value * 1;
+VALUE      
+-----------
+-1         
+0          
+1          
+2          
+3          
+100        
+1000       
+ij> select * from test_number order by value / 1;
+VALUE      
+-----------
+-1         
+0          
+1          
+2          
+3          
+100        
+1000       
+ij> select * from test_number order by 1 + value;
+VALUE      
+-----------
+-1         
+0          
+1          
+2          
+3          
+100        
+1000       
+ij> select * from test_number order by 1 - value;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+0          
+-1         
+ij> select * from test_number order by 1 * value;
+VALUE      
+-----------
+-1         
+0          
+1          
+2          
+3          
+100        
+1000       
+ij> select * from test_number where value <> 0 order by 6000 / value;
+VALUE      
+-----------
+-1         
+1000       
+100        
+3          
+2          
+1          
+ij> select * from test_number order by -1 + value;
+VALUE      
+-----------
+-1         
+0          
+1          
+2          
+3          
+100        
+1000       
+ij> select * from test_number order by -1 - value;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+0          
+-1         
+ij> select * from test_number order by - 1 * value;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+0          
+-1         
+ij> select * from test_number where value <> 0 order by - 6000 / value;
+VALUE      
+-----------
+1          
+2          
+3          
+100        
+1000       
+-1         
+ij> select * from test_number order by abs(value);
+VALUE      
+-----------
+0          
+1          
+-1         
+2          
+3          
+100        
+1000       
+ij> select * from test_number order by value desc;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+0          
+-1         
+ij> select * from test_number order by value + 1 desc;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+0          
+-1         
+ij> select * from test_number order by value - 1 desc;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+0          
+-1         
+ij> select * from test_number order by value * 1 desc;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+0          
+-1         
+ij> select * from test_number order by value / 1 desc;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+0          
+-1         
+ij> select * from test_number order by 1 + value desc;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+0          
+-1         
+ij> select * from test_number order by 1 - value desc;
+VALUE      
+-----------
+-1         
+0          
+1          
+2          
+3          
+100        
+1000       
+ij> select * from test_number order by 1 * value desc;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+0          
+-1         
+ij> select * from test_number where value <> 0 order by 6000 / value desc;
+VALUE      
+-----------
+1          
+2          
+3          
+100        
+1000       
+-1         
+ij> select * from test_number order by -1 + value desc;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+0          
+-1         
+ij> select * from test_number order by -1 - value desc;
+VALUE      
+-----------
+-1         
+0          
+1          
+2          
+3          
+100        
+1000       
+ij> select * from test_number order by - 1 * value desc;
+VALUE      
+-----------
+-1         
+0          
+1          
+2          
+3          
+100        
+1000       
+ij> select * from test_number where value <> 0 order by - 6000 / value desc;
+VALUE      
+-----------
+-1         
+1000       
+100        
+3          
+2          
+1          
+ij> select * from test_number order by abs(value) desc;
+VALUE      
+-----------
+1000       
+100        
+3          
+2          
+1          
+-1         
+0          
+ij> drop table test_number;
+0 rows inserted/updated/deleted
+ij> create table test_number2(value1 integer,value2 integer);
+0 rows inserted/updated/deleted
+ij> insert into test_number2(value1,value2) values(-2,2);
+1 row inserted/updated/deleted
+ij> insert into test_number2(value1,value2) values(-1,2);
+1 row inserted/updated/deleted
+ij> insert into test_number2(value1,value2) values(0,1);
+1 row inserted/updated/deleted
+ij> insert into test_number2(value1,value2) values(0,2);
+1 row inserted/updated/deleted
+ij> insert into test_number2(value1,value2) values(1,1);
+1 row inserted/updated/deleted
+ij> insert into test_number2(value1,value2) values(2,1);
+1 row inserted/updated/deleted
+ij> select * from test_number2 order by abs(value1),mod(value2,2);
+VALUE1     |VALUE2     
+-----------------------
+0          |2          
+0          |1          
+-1         |2          
+1          |1          
+-2         |2          
+2          |1          
+ij> drop table test_number2;
+0 rows inserted/updated/deleted
 ij> -- error case
 select * from t order by d;
 ERROR 42X04: Column 'D' is not in any table in the FROM list or it appears 
within a join specification and is outside the scope of the join specification 
or it appears in a HAVING clause and is not in the GROUP BY list.  If this is a 
CREATE or ALTER TABLE statement then 'D' is not a column in the target table.
@@ -895,5 +1247,47 @@
 ij> select s.a from t s order by s.d;
 ERROR 42X04: Column 'S.D' is not in any table in the FROM list or it appears 
within a join specification and is outside the scope of the join specification 
or it appears in a HAVING clause and is not in the GROUP BY list.  If this is a 
CREATE or ALTER TABLE statement then 'S.D' is not a column in the target table.
 ij> drop table t;
+0 rows inserted/updated/deleted
+ij> -- test fof using table correlation names 
+select * from (values (2),(1)) as t(x) order by t.x;
+X          
+-----------
+1          
+2          
+ij> create table ta(id int);
+0 rows inserted/updated/deleted
+ij> create table tb(id int,c1 int,c2 int);
+0 rows inserted/updated/deleted
+ij> insert into ta(id)  values(1);
+1 row inserted/updated/deleted
+ij> insert into ta(id)  values(2);
+1 row inserted/updated/deleted
+ij> insert into ta(id)  values(3);
+1 row inserted/updated/deleted
+ij> insert into ta(id)  values(4);
+1 row inserted/updated/deleted
+ij> insert into ta(id)  values(5);
+1 row inserted/updated/deleted
+ij> insert into tb(id,c1,c2) values(1,5,3);
+1 row inserted/updated/deleted
+ij> insert into tb(id,c1,c2) values(2,4,3);
+1 row inserted/updated/deleted
+ij> insert into tb(id,c1,c2) values(3,4,2);
+1 row inserted/updated/deleted
+ij> insert into tb(id,c1,c2) values(4,4,1);
+1 row inserted/updated/deleted
+ij> insert into tb(id,c1,c2) values(5,4,2);
+1 row inserted/updated/deleted
+ij> select t1.id,t2.c1 from ta as t1 join tb as t2 on t1.id = t2.id order by 
t2.c1,t2.c2,t1.id;
+ID         |C1         
+-----------------------
+4          |4          
+3          |4          
+5          |4          
+2          |4          
+1          |5          
+ij> drop table ta;
+0 rows inserted/updated/deleted
+ij> drop table tb;
 0 rows inserted/updated/deleted
 ij> 

Modified: 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/orderby.sql
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/orderby.sql?view=diff&r1=159745&r2=159746
==============================================================================
--- 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/orderby.sql
 (original)
+++ 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/orderby.sql
 Fri Apr  1 16:12:48 2005
@@ -133,7 +133,7 @@
 -- . order by on column not in select, in table (error)
 select i from obt order by v;
 
--- . order by on expression (not allowed)
+-- . order by on expression (allowed)
 select i from obt order by i+1;
 
 -- . order by on qualified column name, incorrect correlation name (not 
allowed)
@@ -350,6 +350,66 @@
 select a, b, c from t order by b, c;
 select b, c from t order by app.t.a;
 
+
+--Test addtive expression in order clause
+
+create table test_word(value varchar(32));
+insert into test_word(value) values('anaconda');
+insert into test_word(value) values('America');
+insert into test_word(value) values('camel');
+insert into test_word(value) values('Canada');
+
+select * from test_word order by value;
+select * from test_word order by upper(value);
+
+drop table test_word;
+
+create table test_number(value integer);
+insert into test_number(value) values(-1);
+insert into test_number(value) values(0);
+insert into test_number(value) values(1);
+insert into test_number(value) values(2);
+insert into test_number(value) values(3);
+insert into test_number(value) values(100);
+insert into test_number(value) values(1000);
+select * from test_number order by value;
+select * from test_number order by value + 1;
+select * from test_number order by value - 1;
+select * from test_number order by value * 1;
+select * from test_number order by value / 1;
+select * from test_number order by 1 + value;
+select * from test_number order by 1 - value;
+select * from test_number order by 1 * value;
+select * from test_number where value <> 0 order by 6000 / value;
+select * from test_number order by -1 + value;
+select * from test_number order by -1 - value;
+select * from test_number order by - 1 * value;
+select * from test_number where value <> 0 order by - 6000 / value;
+select * from test_number order by abs(value);
+select * from test_number order by value desc;
+select * from test_number order by value + 1 desc;
+select * from test_number order by value - 1 desc;
+select * from test_number order by value * 1 desc;
+select * from test_number order by value / 1 desc;
+select * from test_number order by 1 + value desc;
+select * from test_number order by 1 - value desc;
+select * from test_number order by 1 * value desc;
+select * from test_number where value <> 0 order by 6000 / value desc;
+select * from test_number order by -1 + value desc;
+select * from test_number order by -1 - value desc;
+select * from test_number order by - 1 * value desc;
+select * from test_number where value <> 0 order by - 6000 / value desc;
+select * from test_number order by abs(value) desc;
+drop table test_number;
+create table test_number2(value1 integer,value2 integer);
+insert into test_number2(value1,value2) values(-2,2);
+insert into test_number2(value1,value2) values(-1,2);
+insert into test_number2(value1,value2) values(0,1);
+insert into test_number2(value1,value2) values(0,2);
+insert into test_number2(value1,value2) values(1,1);
+insert into test_number2(value1,value2) values(2,1);
+select * from test_number2 order by abs(value1),mod(value2,2);
+drop table test_number2;
 -- error case
 select * from t order by d;
 select t.* from t order by d;
@@ -371,3 +431,23 @@
 select s.a from t s order by s.d;
 
 drop table t;
+
+-- test fof using table correlation names 
+select * from (values (2),(1)) as t(x) order by t.x;
+
+create table ta(id int);
+create table tb(id int,c1 int,c2 int);
+insert into ta(id)  values(1);
+insert into ta(id)  values(2);
+insert into ta(id)  values(3);
+insert into ta(id)  values(4);
+insert into ta(id)  values(5);
+insert into tb(id,c1,c2) values(1,5,3);
+insert into tb(id,c1,c2) values(2,4,3);
+insert into tb(id,c1,c2) values(3,4,2);
+insert into tb(id,c1,c2) values(4,4,1);
+insert into tb(id,c1,c2) values(5,4,2);
+select t1.id,t2.c1 from ta as t1 join tb as t2 on t1.id = t2.id order by 
t2.c1,t2.c2,t1.id;
+
+drop table ta;
+drop table tb;


Reply via email to