diff -ru hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/Database.java hsqldb-2.2.6/hsqldb/src//org/hsqldb/Database.java
--- hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/Database.java	2011-10-24 09:22:20.000000000 +0100
+++ hsqldb-2.2.6/hsqldb/src//org/hsqldb/Database.java	2011-12-02 08:14:00.978541600 +0000
@@ -111,6 +111,8 @@
     public boolean                sqlSyntaxMss           = false;
     public boolean                sqlSyntaxMys           = false;
     public boolean                sqlSyntaxOra           = false;
+    /** Not used now, but a placeholder in case someone turns it on */
+    public boolean                sqlSyntaxDb2           = false;
     public boolean                sqlSyntaxPgs           = false;
     private boolean               isReferentialIntegrity = true;
     public HsqlDatabaseProperties databaseProperties;
@@ -495,6 +497,10 @@
         sqlSyntaxOra = mode;
     }
 
+    public void setSyntaxDb2(boolean mode) {
+        sqlSyntaxDb2 = mode;
+    }
+
     public void setSyntaxMys(boolean mode) {
         sqlSyntaxMys = mode;
     }
diff -ru hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/ExpressionArrayAggregate.java hsqldb-2.2.6/hsqldb/src//org/hsqldb/ExpressionArrayAggregate.java
--- hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/ExpressionArrayAggregate.java	2011-10-17 20:42:56.000000000 +0100
+++ hsqldb-2.2.6/hsqldb/src//org/hsqldb/ExpressionArrayAggregate.java	2011-12-01 13:36:12.353417200 +0000
@@ -41,7 +41,6 @@
 import org.hsqldb.types.NumberType;
 import org.hsqldb.types.RowType;
 import org.hsqldb.types.Type;
-import org.hsqldb.types.Types;
 
 /**
  * Implementation of array aggregate operations
@@ -59,8 +58,9 @@
     Type         exprType;
     Expression   condition = Expression.EXPR_TRUE;
 
-    ExpressionArrayAggregate(int type, boolean distinct, Expression e,
-                             SortAndSlice sort, String separator) {
+    ExpressionArrayAggregate(Session session, int type, boolean distinct,
+                             Expression e, SortAndSlice sort,
+                             String separator) {
 
         super(type);
 
@@ -88,7 +88,7 @@
 
             nodes[list.size()] = e;
 
-            sort.prepare(1);
+            sort.prepare(session, 1);
         }
     }
 
@@ -318,7 +318,7 @@
         if (isDistinctAggregate) {
             SortAndSlice exprSort = new SortAndSlice();
 
-            exprSort.prepareSingleColumn(nodes.length - 1);
+            exprSort.prepareSingleColumn(session, nodes.length - 1);
             arrayDataType.sort(session, array, exprSort);
 
             int size = arrayDataType.deDuplicate(session, array, exprSort);
@@ -363,7 +363,7 @@
             case OpTypes.MEDIAN : {
                 SortAndSlice exprSort = new SortAndSlice();
 
-                exprSort.prepareSingleColumn(1);
+                exprSort.prepareSingleColumn(session, 1);
                 arrayDataType.sort(session, array, exprSort);
 
                 boolean even = array.length % 2 == 0;
diff -ru hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/ExpressionOrderBy.java hsqldb-2.2.6/hsqldb/src//org/hsqldb/ExpressionOrderBy.java
--- hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/ExpressionOrderBy.java	2011-05-22 07:08:38.000000000 +0100
+++ hsqldb-2.2.6/hsqldb/src//org/hsqldb/ExpressionOrderBy.java	2011-12-02 08:14:50.937537000 +0000
@@ -44,7 +44,7 @@
 public class ExpressionOrderBy extends Expression {
 
     private boolean isDescending;
-    private boolean isNullsLast;
+    private Boolean isNullsLast;
 
     ExpressionOrderBy(Expression e) {
 
@@ -73,14 +73,14 @@
     /**
      * Set an ORDER BY column NULL ordering
      */
-    void setNullsLast() {
-        isNullsLast = true;
+    void setNullsLast(boolean isNullsLast) {
+        this.isNullsLast = Boolean.valueOf(isNullsLast);
     }
 
     /**
      * Is an ORDER BY column NULL ordering
      */
-    boolean isNullsLast() {
+    Boolean isNullsLast() {
         return isNullsLast;
     }
 
diff -ru hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/FunctionCustom.java hsqldb-2.2.6/hsqldb/src//org/hsqldb/FunctionCustom.java
--- hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/FunctionCustom.java	2011-11-19 13:26:08.000000000 +0000
+++ hsqldb-2.2.6/hsqldb/src//org/hsqldb/FunctionCustom.java	2011-12-01 13:37:41.935243900 +0000
@@ -1806,7 +1806,7 @@
                 ArrayType    dt       = (ArrayType) dataType;
                 SortAndSlice exprSort = new SortAndSlice();
 
-                exprSort.prepareSingleColumn(1);
+                exprSort.prepareSingleColumn(session, 1);
 
                 exprSort.sortDescending[0] = ((Number) data[1]).intValue()
                                              == Tokens.DESC;
diff -ru hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/ParserDQL.java hsqldb-2.2.6/hsqldb/src//org/hsqldb/ParserDQL.java
--- hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/ParserDQL.java	2011-11-12 20:05:26.000000000 +0000
+++ hsqldb-2.2.6/hsqldb/src//org/hsqldb/ParserDQL.java	2011-12-02 08:18:25.357976900 +0000
@@ -1660,9 +1660,10 @@
 
                 if (token.tokenType == Tokens.FIRST) {
                     read();
+                    o.setNullsLast(false);
                 } else if (token.tokenType == Tokens.LAST) {
                     read();
-                    o.setNullsLast();
+                    o.setNullsLast(true);
                 } else {
                     throw unexpectedToken();
                 }
@@ -1998,12 +1999,12 @@
                     }
                 }
 
-                return new ExpressionArrayAggregate(type, distinct, e, sort,
-                                                    separator);
+                return new ExpressionArrayAggregate(session, type, distinct, e,
+                                                    sort, separator);
             }
             case OpTypes.MEDIAN : {
-                return new ExpressionArrayAggregate(type, distinct, e, sort,
-                                                    separator);
+                return new ExpressionArrayAggregate(session, type, distinct, e,
+                                                    sort, separator);
             }
             default :
                 if (e.getType() == OpTypes.ASTERISK) {
diff -ru hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/QueryExpression.java hsqldb-2.2.6/hsqldb/src//org/hsqldb/QueryExpression.java
--- hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/QueryExpression.java	2011-05-09 16:21:14.000000000 +0100
+++ hsqldb-2.2.6/hsqldb/src//org/hsqldb/QueryExpression.java	2011-12-01 13:27:29.360055300 +0000
@@ -231,7 +231,7 @@
                 rightQueryExpression.unionColumnMap = new int[columnCount];
 
             ArrayUtil.fillSequence(leftQueryExpression.unionColumnMap);
-            resolveColumnRefernecesInUnionOrderBy();
+            resolveColumnRefernecesInUnionOrderBy(session);
 
             accessibleColumns = leftQueryExpression.accessibleColumns;
 
@@ -308,7 +308,7 @@
         columnCount      = unionCorrespondingColumns.size();
         unionColumnTypes = new Type[columnCount];
 
-        resolveColumnRefernecesInUnionOrderBy();
+        resolveColumnRefernecesInUnionOrderBy(session);
 
         accessibleColumns = new boolean[columnCount];
 
@@ -318,7 +318,7 @@
     /**
      * Only simple column reference or column position allowed
      */
-    void resolveColumnRefernecesInUnionOrderBy() {
+    void resolveColumnRefernecesInUnionOrderBy(Session session) {
 
         int orderCount = sortAndSlice.getOrderLength();
 
@@ -356,7 +356,7 @@
             throw Error.error(ErrorCode.X_42576);
         }
 
-        sortAndSlice.prepare(null);
+        sortAndSlice.prepare(session, null);
     }
 
     private void addUnresolvedExpressions(HsqlList expressions) {
diff -ru hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/QuerySpecification.java hsqldb-2.2.6/hsqldb/src//org/hsqldb/QuerySpecification.java
--- hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/QuerySpecification.java	2011-11-18 19:55:50.000000000 +0000
+++ hsqldb-2.2.6/hsqldb/src//org/hsqldb/QuerySpecification.java	2011-12-01 13:41:07.715663800 +0000
@@ -463,7 +463,7 @@
                     outerRanges, unresolvedExpressions);
         }
 
-        sortAndSlice.prepare(this);
+        sortAndSlice.prepare(session, this);
     }
 
     private boolean resolveColumnReferences(Session session, Expression e,
diff -ru hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/SetFunction.java hsqldb-2.2.6/hsqldb/src//org/hsqldb/SetFunction.java
--- hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/SetFunction.java	2011-11-17 14:28:32.000000000 +0000
+++ hsqldb-2.2.6/hsqldb/src//org/hsqldb/SetFunction.java	2011-12-01 13:42:27.483099400 +0000
@@ -283,7 +283,7 @@
 
                 SortAndSlice sort = new SortAndSlice();
 
-                sort.prepareSingleColumn(0);
+                sort.prepareSingleColumn(session, 0);
                 arrayType.sort(session, array, sort);
 
                 count = arrayType.deDuplicate(session, array, sort);
diff -ru hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/SortAndSlice.java hsqldb-2.2.6/hsqldb/src//org/hsqldb/SortAndSlice.java
--- hsqldb-2.2.6.orig/hsqldb/src//org/hsqldb/SortAndSlice.java	2011-11-02 19:16:16.000000000 +0000
+++ hsqldb-2.2.6/hsqldb/src//org/hsqldb/SortAndSlice.java	2011-12-02 08:46:44.116835800 +0000
@@ -101,15 +101,18 @@
         zeroLimit = true;
     }
 
-    public void prepareSingleColumn(int colIndex) {
+    private void initSortMembers(Session session, int columnCount) {
+        sortOrder      = new int[columnCount];
+        sortDescending = new boolean[columnCount];
+        sortNullsLast  = getDefaultSortNulls(session, columnCount);
+    }
 
-        sortOrder      = new int[1];
-        sortDescending = new boolean[1];
-        sortNullsLast  = new boolean[1];
+    public void prepareSingleColumn(Session session, int colIndex) {
+        initSortMembers(session, 1);
         sortOrder[0]   = colIndex;
     }
 
-    public void prepare(int degree) {
+    public void prepare(Session session, int degree) {
 
         columnCount = exprList.size();
 
@@ -117,9 +120,7 @@
             return;
         }
 
-        sortOrder      = new int[columnCount + degree];
-        sortDescending = new boolean[columnCount + degree];
-        sortNullsLast  = new boolean[columnCount + degree];
+        initSortMembers(session, columnCount + degree);
 
         ArrayUtil.fillSequence(sortOrder);
 
@@ -132,7 +133,7 @@
         }
     }
 
-    public void prepare(QuerySpecification select) {
+    public void prepare(Session session, QuerySpecification select) {
 
         columnCount = exprList.size();
 
@@ -140,9 +141,7 @@
             return;
         }
 
-        sortOrder      = new int[columnCount];
-        sortDescending = new boolean[columnCount];
-        sortNullsLast  = new boolean[columnCount];
+        initSortMembers(session, columnCount);
 
         for (int i = 0; i < columnCount; i++) {
             ExpressionOrderBy sort = (ExpressionOrderBy) exprList.get(i);
@@ -154,7 +153,9 @@
             }
 
             sortDescending[i] = sort.isDescending();
-            sortNullsLast[i]  = sort.isNullsLast();
+            if (sort.isNullsLast() != null) {
+                sortNullsLast[i] = sort.isNullsLast().booleanValue();
+            }
             hasNullsLast      |= sortNullsLast[i];
 
             if (sort.collation != null) {
@@ -167,6 +168,30 @@
         }
     }
 
+    /**
+     * In different DBs, the sorting of nulls relative to other values is handled differently.
+     * <ul>
+     * <li>PostgreSQL - Nulls are considered HIGHER than non-nulls.</li>
+     * <li>DB2 - Higher</li>
+     * <li>Oracle - Higher</li>
+     * <li>MSSQL - Lower</li>
+     * <li>MySQL - Lower</li>
+     * </ul>
+     * 
+     * @param session
+     * @param columnCount
+     * @return a boolean array containing the correct defaults for sorting nulls according to the DB SQL Syntax we are using.
+     * @see https://hibernate.onjira.com/browse/HHH-465
+     */
+    private boolean[] getDefaultSortNulls(Session session, int columnCount) {
+        final boolean[] sortNullsLast = new boolean[columnCount];
+        if (session.database.sqlSyntaxPgs || session.database.sqlSyntaxOra
+                || session.database.sqlSyntaxDb2) {
+            ArrayUtil.fillArray(sortNullsLast, true);
+        }
+        return sortNullsLast;
+    }
+
     void setSortRange(QuerySpecification select) {
 
         if (isGenerated) {
@@ -319,9 +344,7 @@
         }
 
         columnCount    = 1;
-        sortOrder      = new int[columnCount];
-        sortDescending = new boolean[columnCount];
-        sortNullsLast  = new boolean[columnCount];
+        initSortMembers(session, columnCount);
         skipSort       = true;
         skipFullResult = true;
 
