diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c
index 7495ea8ce4b47c143b6a61e596eedf248846e195..a4472ee20e7ed8863ef14a671a5d5405c1189ca9 100644
--- a/contrib/cube/cube.c
+++ b/contrib/cube/cube.c
@@ -1,5 +1,5 @@
 /******************************************************************************
-  $PostgreSQL: pgsql/contrib/cube/cube.c,v 1.27 2006/07/25 23:23:44 momjian Exp $
+  $PostgreSQL: pgsql/contrib/cube/cube.c,v 1.28 2006/07/27 21:55:09 tgl Exp $
 
   This file contains routines that can be bound to a Postgres backend and
   called by the backend in the process of processing queries.  The calling
@@ -14,12 +14,19 @@
 #include "access/gist.h"
 #include "access/skey.h"
 #include "lib/stringinfo.h"
+#include "utils/array.h"
 #include "utils/builtins.h"
 
 #include "cubedata.h"
 
 PG_MODULE_MAGIC;
 
+/*
+ * Taken from the intarray contrib header
+ */
+#define ARRPTR(x)  ( (double *) ARR_DATA_PTR(x) )
+#define ARRNELEMS(x)  ArrayGetNItems( ARR_NDIM(x), ARR_DIMS(x))
+
 extern int	cube_yyparse();
 extern void cube_yyerror(const char *message);
 extern void cube_scanner_init(const char *str);
@@ -179,15 +186,6 @@ cube(PG_FUNCTION_ARGS)
 }
 
 
-#include "utils/array.h"
-
-/*
-** Taken from the intarray contrib header
-*/
-#define ARRPTR(x)  ( (double *) ARR_DATA_PTR(x) )
-#define ARRNELEMS(x)  ArrayGetNItems( ARR_NDIM(x), ARR_DIMS(x))
-
-
 /*
 ** Allows the construction of a cube from 2 float[]'s
 */
@@ -1000,7 +998,7 @@ cube_cmp(PG_FUNCTION_ARGS)
 	a = (NDBOX *) PG_GETARG_POINTER(0);
 	b = (NDBOX *) PG_GETARG_POINTER(1);
 
-	PG_RETURN_INT16(cube_cmp_v0(a, b));
+	PG_RETURN_INT32(cube_cmp_v0(a, b));
 }
 
 
@@ -1285,7 +1283,7 @@ cube_dim(PG_FUNCTION_ARGS)
 
 	c = (NDBOX *) PG_GETARG_POINTER(0);
 
-	PG_RETURN_INT16 (c->dim);
+	PG_RETURN_INT32(c->dim);
 }
 
 /* Return a specific normalized LL coordinate */
diff --git a/contrib/cube/expected/cube.out b/contrib/cube/expected/cube.out
index 4b20b400bdf723fae753c03376e6aeb9b48987fb..59d5114861e75bdc8e11b976c0f19628934a5cc0 100644
--- a/contrib/cube/expected/cube.out
+++ b/contrib/cube/expected/cube.out
@@ -1054,10 +1054,10 @@ CREATE INDEX test_cube_ix ON test_cube USING gist (c);
 SELECT * FROM test_cube	WHERE c && '(3000,1000),(0,0)' ORDER BY c;
             c             
 --------------------------
- (1594, 1043),(1517, 971)
  (337, 455),(240, 359)
- (1444, 403),(1346, 344)
  (759, 187),(662, 163)
+ (1444, 403),(1346, 344)
+ (1594, 1043),(1517, 971)
  (2424, 160),(2424, 81)
 (5 rows)
 
@@ -1065,10 +1065,10 @@ SELECT * FROM test_cube	WHERE c && '(3000,1000),(0,0)' ORDER BY c;
 SELECT * FROM test_cube	WHERE c && '(3000,1000),(0,0)' GROUP BY c ORDER BY c;
             c             
 --------------------------
- (1594, 1043),(1517, 971)
  (337, 455),(240, 359)
- (1444, 403),(1346, 344)
  (759, 187),(662, 163)
+ (1444, 403),(1346, 344)
+ (1594, 1043),(1517, 971)
  (2424, 160),(2424, 81)
 (5 rows)
 
diff --git a/contrib/cube/expected/cube_1.out b/contrib/cube/expected/cube_1.out
index e935fd281b7003d129911a05214615d4e977be9d..a7a8d8d64f0c04360cb7fe393f4337e5af3609d8 100644
--- a/contrib/cube/expected/cube_1.out
+++ b/contrib/cube/expected/cube_1.out
@@ -1054,10 +1054,10 @@ CREATE INDEX test_cube_ix ON test_cube USING gist (c);
 SELECT * FROM test_cube	WHERE c && '(3000,1000),(0,0)' ORDER BY c;
             c             
 --------------------------
- (1594, 1043),(1517, 971)
  (337, 455),(240, 359)
- (1444, 403),(1346, 344)
  (759, 187),(662, 163)
+ (1444, 403),(1346, 344)
+ (1594, 1043),(1517, 971)
  (2424, 160),(2424, 81)
 (5 rows)
 
@@ -1065,10 +1065,10 @@ SELECT * FROM test_cube	WHERE c && '(3000,1000),(0,0)' ORDER BY c;
 SELECT * FROM test_cube	WHERE c && '(3000,1000),(0,0)' GROUP BY c ORDER BY c;
             c             
 --------------------------
- (1594, 1043),(1517, 971)
  (337, 455),(240, 359)
- (1444, 403),(1346, 344)
  (759, 187),(662, 163)
+ (1444, 403),(1346, 344)
+ (1594, 1043),(1517, 971)
  (2424, 160),(2424, 81)
 (5 rows)
 
diff --git a/contrib/cube/expected/cube_2.out b/contrib/cube/expected/cube_2.out
index 42723e40046b278f7773115f05ca7730488564e7..0c1aba4972963ba5125348cafbb9997816dd7cee 100644
--- a/contrib/cube/expected/cube_2.out
+++ b/contrib/cube/expected/cube_2.out
@@ -5,10 +5,9 @@
 -- first, define the datatype.  Turn off echoing so that expected file
 -- does not depend on contents of cube.sql.
 --
+SET client_min_messages = warning;
 \set ECHO none
-psql:cube.sql:10: NOTICE:  type "cube" is not yet defined
-DETAIL:  Creating a shell type definition.
-psql:cube.sql:15: NOTICE:  argument type cube is only a shell
+RESET client_min_messages;
 --
 -- testing the input and output functions
 --
@@ -395,6 +394,37 @@ SELECT '(0)'::text::cube;
  (0)
 (1 row)
 
+--
+-- Test the float[] -> cube cast
+--
+SELECT cube('{0,1,2}'::float[], '{3,4,5}'::float[]);
+        cube         
+---------------------
+ (0, 1, 2),(3, 4, 5)
+(1 row)
+
+SELECT cube('{0,1,2}'::float[], '{3}'::float[]);
+ERROR:  UR and LL arrays must be of same length
+SELECT cube(NULL::float[], '{3}'::float[]);
+ cube 
+------
+ 
+(1 row)
+
+SELECT cube('{0,1,2}'::float[]);
+   cube    
+-----------
+ (0, 1, 2)
+(1 row)
+
+SELECT cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1]); 
+        cube_subset        
+---------------------------
+ (5, 3, 1, 1),(8, 7, 6, 6)
+(1 row)
+
+SELECT cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[4,0]); 
+ERROR:  Index out of bounds
 --
 -- Testing limit of CUBE_MAX_DIM dimensions check in cube_in.
 --
@@ -1021,18 +1051,18 @@ SELECT cube_enlarge('(2,-2),(-3,7)'::cube, -3, 2);
 CREATE TABLE test_cube (c cube);
 \copy test_cube from 'data/test_cube.data'
 CREATE INDEX test_cube_ix ON test_cube USING gist (c);
-SELECT * FROM test_cube	WHERE c && '(3000,1000),(0,0)';
+SELECT * FROM test_cube	WHERE c && '(3000,1000),(0,0)' ORDER BY c;
             c             
 --------------------------
- (2424, 160),(2424, 81)
+ (337, 455),(240, 359)
  (759, 187),(662, 163)
  (1444, 403),(1346, 344)
- (337, 455),(240, 359)
  (1594, 1043),(1517, 971)
+ (2424, 160),(2424, 81)
 (5 rows)
 
 -- Test sorting 
-SELECT * FROM test_cube	WHERE c && '(3000,1000),(0,0)' GROUP BY c;
+SELECT * FROM test_cube	WHERE c && '(3000,1000),(0,0)' GROUP BY c ORDER BY c;
             c             
 --------------------------
  (337, 455),(240, 359)