h2/src/main/org/h2/command/dml/Query.java
/**
     * Initialize the order by list. This call may extend the expressions list.
     *
     * @param session the session
     * @param expressions the select list expressions
     * @param expressionSQL the select list SQL snippets
     * @param orderList the order by list
     * @param visible the number of visible columns in the select list
     * @param mustBeInResult all order by expressions must be in the select list
     * @param filters the table filters
     */
Initialize the order by list. This call may extend the expressions list.
Initialize the order by list . This call may extend the expressions list .
static void initOrder(Session session,
            ArrayList<Expression> expressions,
            ArrayList<String> expressionSQL,
            ArrayList<SelectOrderBy> orderList,
            int visible,
            boolean mustBeInResult,
            ArrayList<TableFilter> filters) {
        Database db = session.getDatabase();
        for (SelectOrderBy o : orderList) {
            Expression e = o.expression;
            if (e == null) {
                continue;
            }
            boolean isAlias = false;
            int idx = expressions.size();
            if (e instanceof ExpressionColumn) {
                ExpressionColumn exprCol = (ExpressionColumn) e;
                String tableAlias = exprCol.getOriginalTableAliasName();
                String col = exprCol.getOriginalColumnName();
                for (int j = 0; j < visible; j++) {
                    boolean found = false;
                    Expression ec = expressions.get(j);
                    if (ec instanceof ExpressionColumn) {
                        ExpressionColumn c = (ExpressionColumn) ec;
                        found = db.equalsIdentifiers(col, c.getColumnName());
                        if (found && tableAlias != null) {
                            String ca = c.getOriginalTableAliasName();
                            if (ca == null) {
                                found = false;
                                if (filters != null) {
                                    for (int i = 0, size = filters.size(); i < size; i++) {
                                        TableFilter f = filters.get(i);
                                        if (db.equalsIdentifiers(f.getTableAlias(), tableAlias)) {
                                            found = true;
                                            break;
                                        }
                                    }
                                }
                            } else {
                                found = db.equalsIdentifiers(ca, tableAlias);
                            }
                        }
                    } else if (!(ec instanceof Alias)) {
                        continue;
                    } else if (tableAlias == null && db.equalsIdentifiers(col, ec.getAlias())) {
                        found = true;
                    } else {
                        Expression ec2 = ec.getNonAliasExpression();
                        if (ec2 instanceof ExpressionColumn) {
                            ExpressionColumn c2 = (ExpressionColumn) ec2;
                            String ta = exprCol.getSQL();
                            String tb = c2.getSQL();
                            String s2 = c2.getColumnName();
                            found = db.equalsIdentifiers(col, s2);
                            if (!db.equalsIdentifiers(ta, tb)) {
                                found = false;
                            }
                        }
                    }
                    if (found) {
                        idx = j;
                        isAlias = true;
                        break;
                    }
                }
            } else {
                String s = e.getSQL();
                if (expressionSQL != null) {
                    for (int j = 0, size = expressionSQL.size(); j < size; j++) {
                        String s2 = expressionSQL.get(j);
                        if (db.equalsIdentifiers(s2, s)) {
                            idx = j;
                            isAlias = true;
                            break;
                        }
                    }
                }
            }
            if (!isAlias) {
                if (mustBeInResult) {
                    throw DbException.get(ErrorCode.ORDER_BY_NOT_IN_RESULT, e.getSQL());
                }
                expressions.add(e);
                String sql = e.getSQL();
                expressionSQL.add(sql);
            }
            o.columnIndexExpr = ValueExpression.get(ValueInt.get(idx + 1));
            Expression expr = expressions.get(idx).getNonAliasExpression();
            o.expression = expr;
        }
    }
static void initOrder ( Session session , ArrayList < Expression > expressions , ArrayList < String > expressionSQL , ArrayList < SelectOrderBy > orderList , int visible , boolean mustBeInResult , ArrayList < TableFilter > filters ) { Database db = session . getDatabase ( ) ; for ( SelectOrderBy o : orderList ) { Expression e = o . expression ; if ( e == null ) { continue ; } boolean isAlias = false ; int idx = expressions . size ( ) ; if ( e instanceof ExpressionColumn ) { ExpressionColumn exprCol = ( ExpressionColumn ) e ; String tableAlias = exprCol . getOriginalTableAliasName ( ) ; String col = exprCol . getOriginalColumnName ( ) ; for ( int j = 0 ; j < visible ; j ++ ) { boolean found = false ; Expression ec = expressions . get ( j ) ; if ( ec instanceof ExpressionColumn ) { ExpressionColumn c = ( ExpressionColumn ) ec ; found = db . equalsIdentifiers ( col , c . getColumnName ( ) ) ; if ( found && tableAlias != null ) { String ca = c . getOriginalTableAliasName ( ) ; if ( ca == null ) { found = false ; if ( filters != null ) { for ( int i = 0 , size = filters . size ( ) ; i < size ; i ++ ) { TableFilter f = filters . get ( i ) ; if ( db . equalsIdentifiers ( f . getTableAlias ( ) , tableAlias ) ) { found = true ; break ; } } } } else { found = db . equalsIdentifiers ( ca , tableAlias ) ; } } } else if ( ! ( ec instanceof Alias ) ) { continue ; } else if ( tableAlias == null && db . equalsIdentifiers ( col , ec . getAlias ( ) ) ) { found = true ; } else { Expression ec2 = ec . getNonAliasExpression ( ) ; if ( ec2 instanceof ExpressionColumn ) { ExpressionColumn c2 = ( ExpressionColumn ) ec2 ; String ta = exprCol . getSQL ( ) ; String tb = c2 . getSQL ( ) ; String s2 = c2 . getColumnName ( ) ; found = db . equalsIdentifiers ( col , s2 ) ; if ( ! db . equalsIdentifiers ( ta , tb ) ) { found = false ; } } } if ( found ) { idx = j ; isAlias = true ; break ; } } } else { String s = e . getSQL ( ) ; if ( expressionSQL != null ) { for ( int j = 0 , size = expressionSQL . size ( ) ; j < size ; j ++ ) { String s2 = expressionSQL . get ( j ) ; if ( db . equalsIdentifiers ( s2 , s ) ) { idx = j ; isAlias = true ; break ; } } } } if ( ! isAlias ) { if ( mustBeInResult ) { throw DbException . get ( ErrorCode . ORDER_BY_NOT_IN_RESULT , e . getSQL ( ) ) ; } expressions . add ( e ) ; String sql = e . getSQL ( ) ; expressionSQL . add ( sql ) ; } o . columnIndexExpr = ValueExpression . get ( ValueInt . get ( idx + 1 ) ) ; Expression expr = expressions . get ( idx ) . getNonAliasExpression ( ) ; o . expression = expr ; } }
Initialize the order by list.
Initialize the order by list .
// special case: SELECT 1 AS A FROM DUAL ORDER BY A // (oracle supports it, but only in order by, not in group by and // not in having): // SELECT 1 AS A FROM DUAL ORDER BY -A // order by expression // select expression // select id from test order by test.id