diff --git a/Build-tools/Do-pkg b/Build-tools/Do-pkg
index 4d0f120c6e3ef70660491a1dbf4f910ea8626cdd..2fd1946ed0e412323fe061a2df82f4aaccdf5cdd 100755
--- a/Build-tools/Do-pkg
+++ b/Build-tools/Do-pkg
@@ -61,6 +61,12 @@ else
 }
 
 $PM= "/Developer/Applications/PackageMaker.app/Contents/MacOS/PackageMaker";
+# Try another location on 10.3.3
+unless (-e "$PM")
+{
+	$PM= "/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker";
+}
+
 $TMP= $ENV{TMPDIR};
 $TMP eq "" ?  $TMP= $TMP . "/PKGBUILD.$$": $TMP= "/tmp/PKGBUILD.$$";
 $PKGROOT= "$TMP/PMROOT";
@@ -79,6 +85,9 @@ $BUILDDIR= "$PWD/$HOST";
 $SRCBASEDIR= <$BUILDDIR/mysql*-$VERSION>;
 $SUPFILEDIR= <$SRCBASEDIR/support-files/MacOSX>;
 $TAR= <$BUILDDIR/$NAME-apple-darwin*-powerpc.tar.gz>;
+$TAR =~ /.*\/$NAME(.*)\.tar\.gz$/;
+$ARCH= $1;
+$NAME= $NAME . $ARCH;
 $INFO= <$SUPFILEDIR/Info.plist>;
 $DESC= <$SUPFILEDIR/Description.plist>;
 $SI_INFO= <$SUPFILEDIR/StartupItem.Info.plist>;
@@ -167,7 +176,7 @@ unless (-f "$RESOURCE_DIR/License.txt");
 &logger("Extracting $TAR to $PKGROOT");
 &run_command("gnutar zxf $TAR -C $PKGROOT", "Unable to extract $TAR!");
 &run_command("cd $PKGROOT ; ln -s mysql* ./mysql", "Unable to create symlink!");
-&run_command("chown -R root.wheel $PKGROOT/*", "Cannot chown $PKGROOT!");
+&run_command("chown -R root:wheel $PKGROOT/*", "Cannot chown $PKGROOT!");
 
 # Now build the PGK using PackageMaker
 # The "|| true" is a nasty hack to work around a problem with Package Maker
@@ -196,7 +205,7 @@ unless ($opt_skip_si)
 		copy("$SI_PARAMS", "$PKGROOT/MySQL/")
 			or &abort("Error copying $SI_PARAMS!");
 		chmod(0644, "$PKGROOT/MySQL/" . basename("$SI_PARAMS"));
-		&run_command("chown -R root.wheel $PKGROOT/*", "Cannot chown $PKGROOT!");
+		&run_command("chown -R root:wheel $PKGROOT/*", "Cannot chown $PKGROOT!");
 		copy("$SI_POST", "$RESOURCE_DIR/postinstall")
 			or &abort("Error copying $SI_POST!");
 		chmod(0644, "$RESOURCE_DIR/postinstall");
diff --git a/innobase/btr/btr0btr.c b/innobase/btr/btr0btr.c
index ee27a171fa572fa010df454cba7caaeefa3b859c..77bb42314044b6406ab5958345750a8e663cceb3 100644
--- a/innobase/btr/btr0btr.c
+++ b/innobase/btr/btr0btr.c
@@ -5,7 +5,7 @@ The B-tree
 
 Created 6/2/1994 Heikki Tuuri
 *******************************************************/
-
+ 
 #include "btr0btr.h"
 
 #ifdef UNIV_NONINL
@@ -76,9 +76,6 @@ make them consecutive on disk if possible. From the other file segment
 we allocate pages for the non-leaf levels of the tree.
 */
 
-/* If this many inserts occur sequentially, it affects page split */
-#define BTR_PAGE_SEQ_INSERT_LIMIT	5
-
 /******************************************************************
 Creates a new index page to the tree (not the root, and also not
 used in page reorganization). */
@@ -1089,18 +1086,18 @@ btr_page_get_split_rec_to_left(
 	page = btr_cur_get_page(cursor);
 	insert_point = btr_cur_get_rec(cursor);
 
-	if ((page_header_get_ptr(page, PAGE_LAST_INSERT)
-	    == page_rec_get_next(insert_point))
-	    && (page_header_get_field(page, PAGE_DIRECTION) == PAGE_LEFT)
-	    && ((page_header_get_field(page, PAGE_N_DIRECTION)
-	     	 			>= BTR_PAGE_SEQ_INSERT_LIMIT)
-	     	|| (page_header_get_field(page, PAGE_N_DIRECTION) + 1
-	     	 			>= page_get_n_recs(page)))) {
+	if (page_header_get_ptr(page, PAGE_LAST_INSERT)
+	    == page_rec_get_next(insert_point)) {
 
 	     	infimum = page_get_infimum_rec(page);
-	     	 			
-		if ((infimum != insert_point)
-		    && (page_rec_get_next(infimum) != insert_point)) {
+		
+		/* If the convergence is in the middle of a page, include also
+		the record immediately before the new insert to the upper
+		page. Otherwise, we could repeatedly move from page to page
+		lots of records smaller than the convergence point. */
+
+		if (infimum != insert_point
+		    && page_rec_get_next(infimum) != insert_point) {
 
 			*split_rec = insert_point;
 		} else {
@@ -1134,29 +1131,29 @@ btr_page_get_split_rec_to_right(
 	page = btr_cur_get_page(cursor);
 	insert_point = btr_cur_get_rec(cursor);
 
-	if ((page_header_get_ptr(page, PAGE_LAST_INSERT) == insert_point)
-	    && (page_header_get_field(page, PAGE_DIRECTION) == PAGE_RIGHT)
-	    && ((page_header_get_field(page, PAGE_N_DIRECTION)
-	     	 			>= BTR_PAGE_SEQ_INSERT_LIMIT)
-	     	|| (page_header_get_field(page, PAGE_N_DIRECTION) + 1
-	     	 			>= page_get_n_recs(page)))) {
+	/* We use eager heuristics: if the new insert would be right after
+	the previous insert on the same page, we assume that there is a
+	pattern of sequential inserts here. */
+
+	if (page_header_get_ptr(page, PAGE_LAST_INSERT) == insert_point) {
 
 	     	supremum = page_get_supremum_rec(page);
 	     	 			
-		if ((page_rec_get_next(insert_point) != supremum)
-		    && (page_rec_get_next(page_rec_get_next(insert_point))
-			!= supremum)
-		    && (page_rec_get_next(page_rec_get_next(
-					page_rec_get_next(insert_point)))
-			!= supremum)) {
-
-			/* If there are >= 3 user records up from the insert
-			point, split all but 2 off */
-
-			*split_rec = page_rec_get_next(page_rec_get_next(
-					page_rec_get_next(insert_point)));
+		if (page_rec_get_next(insert_point) != supremum
+		    && page_rec_get_next(page_rec_get_next(insert_point))
+			!= supremum) {
+
+			/* If there are >= 2 user records up from the insert
+			point, split all but 1 off. We want to keep one because
+			then sequential inserts can use the adaptive hash
+			index, as they can do the necessary checks of the right
+			search position just by looking at the records on this
+			page. */
+		
+			*split_rec = page_rec_get_next(
+					page_rec_get_next(insert_point));
 		} else {
-			/* Else split at inserted record */
+			/* Else split at the new record to insert */
 	     		*split_rec = NULL;
 	     	}
 
diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c
index f6a4a6f38f065c20fdce2ae6715288057207bff5..fdc8343e190eeb74f2fc46ba40b48d0227c47719 100644
--- a/innobase/btr/btr0cur.c
+++ b/innobase/btr/btr0cur.c
@@ -2682,10 +2682,11 @@ btr_estimate_number_of_different_key_vals(
 
 		btr_cur_open_at_rnd_pos(index, BTR_SEARCH_LEAF, &cursor, &mtr);
 		
-		/* Count the number of different key values minus one
-		for each prefix of the key on this index page: we subtract
-		one because otherwise our algorithm would give a wrong
-		estimate for an index where there is just one key value */
+		/* Count the number of different key values for each prefix of
+		the key on this index page. If the prefix does not determine
+		the index record uniquely in te B-tree, then we subtract one
+		because otherwise our algorithm would give a wrong estimate
+		for an index where there is just one key value. */
 
 		page = btr_cur_get_page(&cursor);
 
@@ -2707,6 +2708,9 @@ btr_estimate_number_of_different_key_vals(
 						&matched_bytes);
 
 			for (j = matched_fields + 1; j <= n_cols; j++) {
+				/* We add one if this index record has
+				a different prefix from the previous */
+
 				n_diff[j]++;
 			}
 
@@ -2716,6 +2720,18 @@ btr_estimate_number_of_different_key_vals(
 			rec = page_rec_get_next(rec);
 		}
 		
+		if (n_cols == dict_index_get_n_unique_in_tree(index)) {
+			/* We add one because we know that the first record
+			on the page certainly had a different prefix than the
+			last record on the previous index page in the
+			alphabetical order. Before this fix, if there was
+			just one big record on each clustered index page, the
+			algorithm grossly underestimated the number of rows
+			in the table. */
+
+			n_diff[n_cols]++;
+		}
+
 		total_external_size +=
 				btr_rec_get_externally_stored_len(rec);
 		mtr_commit(&mtr);
diff --git a/mysys/mf_soundex.c b/mysys/mf_soundex.c
index 459e304dfd71096b213e5d63aa6b9df3353ebe7d..75d9270c5afb9af9350308c5b2119c9fe3077ef4 100644
--- a/mysys/mf_soundex.c
+++ b/mysys/mf_soundex.c
@@ -28,6 +28,10 @@
 *								*
 *	As an extension if remove_garbage is set then all non-	*
 *	alpha characters are skipped				*
+*                                                               *
+*       Note, that this implementation corresponds to the       *
+*       original version of the algorithm, not to the more      *
+*       popular "enhanced" version, described by Knuth.         *
 ****************************************************************/
 
 #include "mysys_priv.h"
diff --git a/scripts/mysql_install_db.sh b/scripts/mysql_install_db.sh
index c593957b78da8218a19c2cad7df71552b535e903..1861e8c52f85ada9e957589cbdd91443563d000b 100644
--- a/scripts/mysql_install_db.sh
+++ b/scripts/mysql_install_db.sh
@@ -151,7 +151,7 @@ then
   if [ $? -ne 0 ]
   then
     resolved=`$bindir/resolveip localhost 2>&1`
-    if [ $? -eq 0 ]
+    if [ $? -ne 0 ]
     then
       echo "Neither host '$hostname' and 'localhost' could not be looked up with"
       echo "$bindir/resolveip"