diff --git a/Docs/Support/texi2html b/Docs/Support/texi2html
index 5dda7c8bbd5bdfa553e210244b0d6fec6f0deea6..8067d8f72ce818f7ef8081a3e678d383054226e9 100755
--- a/Docs/Support/texi2html
+++ b/Docs/Support/texi2html
@@ -1811,7 +1811,7 @@ sub fix_image
 {
   my($text) = @_;
   my($arg1, $ext);
-  $text =~ /^([^,]*)$/;
+  $text =~ /^([^,]*)/;
   die "error in image: '$text'" unless defined($1);
   $arg1 = $1;
   $arg1 =~ s/@@/@/g;
diff --git a/include/sql_common.h b/include/sql_common.h
index cde53786f8362d547cbfd521a1c3da641fb6b87a..c07a4a831bb4a752179530c9ffdc38901f9ef980 100644
--- a/include/sql_common.h
+++ b/include/sql_common.h
@@ -25,7 +25,6 @@ extern "C" {
 MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
 			   my_bool default_value, uint server_capabilities);
 void free_rows(MYSQL_DATA *cur);
-my_bool mysql_autenticate(MYSQL *mysql, const char *passwd);
 void free_old_query(MYSQL *mysql);
 void end_server(MYSQL *mysql);
 my_bool mysql_reconnect(MYSQL *mysql);
diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c
index fd98538d2ad9b59e2970e713bdd23d56b23be682..f670c0dc16d95c5b14f096993d3d1b50dfe98709 100644
--- a/innobase/dict/dict0dict.c
+++ b/innobase/dict/dict0dict.c
@@ -2244,7 +2244,7 @@ dict_foreign_add_to_cache(
 Scans from pointer onwards. Stops if is at the start of a copy of
 'string' where characters are compared without case sensitivity. Stops
 also at '\0'. */
-static
+
 const char*
 dict_scan_to(
 /*=========*/
diff --git a/innobase/include/dict0dict.h b/innobase/include/dict0dict.h
index 4dbbd5b4886f91c4ab30b9b90c1b614b6a2c2b63..ca63269145019754405d38d6e5aef4e07f9321a6 100644
--- a/innobase/include/dict0dict.h
+++ b/innobase/include/dict0dict.h
@@ -891,6 +891,18 @@ dict_tables_have_same_db(
 	const char*	name2);	/* in: table name in the form
 				dbname '/' tablename */
 
+/*************************************************************************
+Scans from pointer onwards. Stops if is at the start of a copy of
+'string' where characters are compared without case sensitivity. Stops
+also at '\0'. */
+
+const char*
+dict_scan_to(
+/*=========*/
+				/* out: scanned up to this */
+	const char*	ptr,	/* in: scan from */
+	const char*	string);/* in: look for this */
+
 /* Buffers for storing detailed information about the latest foreign key
 and unique key errors */
 extern FILE*	dict_foreign_err_file;
diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c
index 7b0beb9d183a68c8b78c056d4a32e60120edb003..c9c784403c8c0ab208c864d85926c8d6adf1338e 100644
--- a/innobase/row/row0ins.c
+++ b/innobase/row/row0ins.c
@@ -50,6 +50,15 @@ innobase_invalidate_query_cache(
 	ulint	full_name_len);	/* in: full name length where also the null
 				chars count */
 
+/**********************************************************************
+This function returns true if SQL-query in the current thread
+is either REPLACE or LOAD DATA INFILE REPLACE. 
+NOTE that /mysql/innobase/row/row0ins.c must contain the 
+prototype for this function ! */
+
+ibool
+innobase_query_is_replace(void);
+/*===========================*/
 
 /*************************************************************************
 Creates an insert node struct. */
@@ -1482,9 +1491,9 @@ row_ins_scan_sec_index_for_duplicate(
 	ulint		err		= DB_SUCCESS;
 	ibool		moved;
 	mtr_t		mtr;
-        trx_t           *trx;
-        ibool           success;
-
+	trx_t*		trx;
+	const char*	ptr;
+	
 	n_unique = dict_index_get_n_unique(index);
 
 	/* If the secondary index is unique, but one of the fields in the
@@ -1523,9 +1532,8 @@ row_ins_scan_sec_index_for_duplicate(
 
 		trx = thr_get_trx(thr);      
 		ut_ad(trx);
-		dict_accept(*trx->mysql_query_str, "REPLACE", &success);
 
-		if (success) {
+		if (innobase_query_is_replace()) {
 
 			/* The manual defines the REPLACE semantics that it 
 			is either an INSERT or DELETE(s) for duplicate key
@@ -1605,7 +1613,7 @@ row_ins_duplicate_error_in_clust(
 	page_t*	page;
 	ulint	n_unique;
 	trx_t*	trx	= thr_get_trx(thr);
-        ibool   success;
+	const char*	ptr;
 
 	UT_NOT_USED(mtr);
 	
@@ -1639,10 +1647,7 @@ row_ins_duplicate_error_in_clust(
 			sure that in roll-forward we get the same duplicate
 			errors as in original execution */
 
-			dict_accept(*trx->mysql_query_str, "REPLACE", 
-				    &success);
-
-			if (success) {
+			if (innobase_query_is_replace()) {
 
 				/* The manual defines the REPLACE semantics 
 				that it is either an INSERT or DELETE(s) 
@@ -1683,15 +1688,9 @@ row_ins_duplicate_error_in_clust(
 			/* The manual defines the REPLACE semantics that it 
 			is either an INSERT or DELETE(s) for duplicate key
 			+ INSERT. Therefore, we should take X-lock for
-			duplicates.
-		        */
-
-			/* Is the first word in MySQL query REPLACE ? */
-
-		 	dict_accept(*trx->mysql_query_str, "REPLACE", 
-				    &success);
+			duplicates. */
 
-			if (success) {
+			if (innobase_query_is_replace()) {
 
 				err = row_ins_set_exclusive_rec_lock(
 						LOCK_REC_NOT_GAP,
diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c
index 3ff94c8f238bc41849c598e5acd74fefba1a65fd..740241fa210e72e240ee94b41e40e8e7567352ff 100644
--- a/innobase/row/row0sel.c
+++ b/innobase/row/row0sel.c
@@ -2794,7 +2794,7 @@ row_search_for_mysql(
 	rec_t*		index_rec;
 	rec_t*		clust_rec;
 	rec_t*		old_vers;
-	ulint		err;
+	ulint		err             = DB_SUCCESS;
 	ibool		moved;
 	ibool		cons_read_requires_clust_rec;
 	ibool		was_lock_wait;
@@ -3203,26 +3203,20 @@ rec_loop:
 		if (prebuilt->select_lock_type != LOCK_NONE
 		    && set_also_gap_locks) {
 
-			/* Try to place a lock on the index record */	
+			/* Try to place a lock on the index record */
 
-                        /* If innodb_locks_unsafe_for_binlog option is used, 
-                           we lock only the record, i.e. next-key locking is
-                           not used.
-	                */
-	                if ( srv_locks_unsafe_for_binlog )
-	                {
-			    err = sel_set_rec_lock(rec, index,
-						prebuilt->select_lock_type,
-						LOCK_REC_NOT_GAP, thr);
-			}
-			else
+			/* If innodb_locks_unsafe_for_binlog option is used,
+			we do not lock gaps. Supremum record is really
+			a gap and therefore we do not set locks there. */
+			
+			if ( srv_locks_unsafe_for_binlog == FALSE )
 			{
-			    err = sel_set_rec_lock(rec, index,
+				err = sel_set_rec_lock(rec, index,
 						prebuilt->select_lock_type,
 						LOCK_ORDINARY, thr);
 			}
-			
-                        if (err != DB_SUCCESS) {
+
+			if (err != DB_SUCCESS) {
 
 				goto lock_wait_or_error;
 			}
diff --git a/libmysql/manager.c b/libmysql/manager.c
index f030eb1788928822a03f049e561c508ba74fdd75..631bfa26cb228a75ee8731998a0b2560df21d674 100644
--- a/libmysql/manager.c
+++ b/libmysql/manager.c
@@ -237,7 +237,7 @@ int STDCALL mysql_manager_fetch_line(MYSQL_MANAGER* con, char* res_buf,
   char* res_buf_end=res_buf+res_buf_size;
   char* net_buf=(char*) con->net.read_pos, *net_buf_end;
   int res_buf_shift=RES_BUF_SHIFT;
-  uint num_bytes;
+  ulong num_bytes;
 
   if (res_buf_size<RES_BUF_SHIFT)
   {
diff --git a/mysql-test/r/ps_11bugs.result b/mysql-test/r/ps_11bugs.result
index 2aa0df6a4310ddc57238e4a827d8efa99dd5006b..c0d7fe502af9067ed77fa7f89664be9ad381a9d3 100644
--- a/mysql-test/r/ps_11bugs.result
+++ b/mysql-test/r/ps_11bugs.result
@@ -1,13 +1,10 @@
-use test;
-drop table if exists test_select;
-Warnings:
-Note	1051	Unknown table 'test_select'
-CREATE TABLE test_select(session_id  char(9) NOT NULL);
-INSERT INTO test_select VALUES ("abc");
-SELECT * FROM test_select;
+drop table if exists t1, t2;
+CREATE TABLE t1(session_id  char(9) NOT NULL);
+INSERT INTO t1 VALUES ("abc");
+SELECT * FROM t1;
 session_id
 abc
-prepare st_1180 from 'SELECT * FROM test_select WHERE ?="1111" and session_id = "abc"';
+prepare st_1180 from 'SELECT * FROM t1 WHERE ?="1111" and session_id = "abc"';
 set @arg1= 'abc';
 execute st_1180 using @arg1;
 session_id
@@ -18,4 +15,104 @@ abc
 set @arg1= 'abc';
 execute st_1180 using @arg1;
 session_id
-drop table test_select;
+drop table t1;
+create table t1 (
+c_01 char(6), c_02 integer, c_03 real, c_04 int(3), c_05 varchar(20),
+c_06 date,    c_07 char(1), c_08 real, c_09 int(11), c_10 time,
+c_11 char(6), c_12 integer, c_13 real, c_14 int(3), c_15 varchar(20),
+c_16 date,    c_17 char(1), c_18 real, c_19 int(11), c_20 text);
+prepare st_1644 from 'insert into t1 values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
+set @arg01= 'row_1';
+set @arg02= 1;
+set @arg03= 1.1;
+set @arg04= 111;
+set @arg05= 'row_one';
+set @arg06= '2004-10-12';
+set @arg07= '1';
+set @arg08= 1.1;
+set @arg09= '100100100';
+set @arg10= '12:34:56';
+set @arg11= 'row_1';
+set @arg12= 1;
+set @arg13= 1.1;
+set @arg14= 111;
+set @arg15= 'row_one';
+set @arg16= '2004-10-12';
+set @arg17= '1';
+set @arg18= 1.1;
+set @arg19= '100100100';
+set @arg20= '12:34:56';
+execute st_1644 using @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, @arg07, @arg08, @arg09, @arg10,
+@arg11, @arg12, @arg13, @arg14, @arg15, @arg16, @arg17, @arg18, @arg19, @arg20;
+set @arg01= NULL;
+set @arg02= NULL;
+set @arg03= NULL;
+set @arg04= NULL;
+set @arg05= NULL;
+set @arg06= NULL;
+set @arg07= NULL;
+set @arg08= NULL;
+set @arg09= NULL;
+set @arg10= NULL;
+set @arg11= NULL;
+set @arg12= NULL;
+set @arg13= NULL;
+set @arg14= NULL;
+set @arg15= NULL;
+set @arg16= NULL;
+set @arg17= NULL;
+set @arg18= NULL;
+set @arg19= NULL;
+set @arg20= NULL;
+execute st_1644 using @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, @arg07, @arg08, @arg09, @arg10,
+@arg11, @arg12, @arg13, @arg14, @arg15, @arg16, @arg17, @arg18, @arg19, @arg20;
+set @arg01= 'row_3';
+set @arg02= 3;
+set @arg03= 3.3;
+set @arg04= 333;
+set @arg05= 'row_three';
+set @arg06= '2004-10-12';
+set @arg07= '3';
+set @arg08= 3.3;
+set @arg09= '300300300';
+set @arg10= '12:34:56';
+set @arg11= 'row_3';
+set @arg12= 3;
+set @arg13= 3.3;
+set @arg14= 333;
+set @arg15= 'row_three';
+set @arg16= '2004-10-12';
+set @arg17= '3';
+set @arg18= 3.3;
+set @arg19= '300300300';
+set @arg20= '12:34:56';
+execute st_1644 using @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, @arg07, @arg08, @arg09, @arg10,
+@arg11, @arg12, @arg13, @arg14, @arg15, @arg16, @arg17, @arg18, @arg19, @arg20;
+select * from t1;
+c_01	c_02	c_03	c_04	c_05	c_06	c_07	c_08	c_09	c_10	c_11	c_12	c_13	c_14	c_15	c_16	c_17	c_18	c_19	c_20
+row_1	1	1.1	111	row_one	2004-10-12	1	1.1	100100100	12:34:56	row_1	1	1.1	111	row_one	2004-10-12	1	1.1	100100100	12:34:56
+NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL
+row_3	3	3.3	333	row_three	2004-10-12	3	3.3	300300300	12:34:56	row_3	3	3.3	333	row_three	2004-10-12	3	3.3	300300300	12:34:56
+drop table t1;
+create table t1(
+cola varchar(50) not null,
+colb varchar(8) not null,
+colc varchar(12) not null,
+cold varchar(2) not null,
+primary key (cola, colb, cold));
+create table t2(
+cola varchar(50) not null,
+colb varchar(8) not null,
+colc varchar(2) not null,
+cold float,
+primary key (cold));
+insert into t1 values ('aaaa', 'yyyy', 'yyyy-dd-mm', 'R');
+insert into t2 values ('aaaa', 'yyyy', 'R', 203), ('bbbb', 'zzzz', 'C', 201);
+prepare st_1676 from 'select a.cola, a.colb, a.cold from t1 a, t2 b where a.cola = ? and a.colb = ? and a.cold = ? and b.cola = a.cola and b.colb = a.colb and b.colc = a.cold';
+set @arg0= "aaaa";
+set @arg1= "yyyy";
+set @arg2= "R";
+execute st_1676 using @arg0, @arg1, @arg2;
+cola	colb	cold
+aaaa	yyyy	R
+drop table t1, t2;
diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test
index fc6eb88ad68a0e3ccacb4a3e2add0dbfd09e59cc..c74bb59ae6b28b48f931d7f03d7053835a016ecc 100644
--- a/mysql-test/t/ctype_utf8.test
+++ b/mysql-test/t/ctype_utf8.test
@@ -568,6 +568,7 @@ DROP TABLE t1;
 #
 # Bug #5723: length(<varchar utf8 field>) returns varying results
 #
+--disable_warnings
 SET NAMES utf8;
 --disable_warnings
 CREATE TABLE t1 (
diff --git a/mysql-test/t/ps_11bugs.test b/mysql-test/t/ps_11bugs.test
index 53afc8b5a78513ef6eaa6d96bf2bf3156c6f122f..d0aeaf265bb73335f5eb643ba3e16c2ed82d6a85 100644
--- a/mysql-test/t/ps_11bugs.test
+++ b/mysql-test/t/ps_11bugs.test
@@ -3,19 +3,25 @@
 #   Prepared Statements                       #
 #   re-testing bug DB entries                 #
 #                                             #
+# The bugs are reported as "closed".          #
+# Command sequences taken from bug report.    #
+# No other test contains the bug# as comment. #
+#                                             #
+# Tests drop/create tables 't1', 't2', ...    #
+#                                             #
 ###############################################
 
-use test;
+--disable_warnings
+drop table if exists t1, t2;
+--enable_warnings
 
 # bug#1180: optimized away part of WHERE clause cause incorect prepared satatement results
 
-drop table if exists test_select;
+CREATE TABLE t1(session_id  char(9) NOT NULL);
+INSERT INTO t1 VALUES ("abc");
+SELECT * FROM t1;
 
-CREATE TABLE test_select(session_id  char(9) NOT NULL);
-INSERT INTO test_select VALUES ("abc");
-SELECT * FROM test_select;
-
-prepare st_1180 from 'SELECT * FROM test_select WHERE ?="1111" and session_id = "abc"';
+prepare st_1180 from 'SELECT * FROM t1 WHERE ?="1111" and session_id = "abc"';
 
 # Must not find a row
 set @arg1= 'abc';
@@ -29,4 +35,97 @@ execute st_1180 using @arg1;
 set @arg1= 'abc';
 execute st_1180 using @arg1;
 
-drop table test_select;
+drop table t1;
+
+# end of bug#1180
+
+
+# bug#1644: Insertion of more than 3 NULL columns with parameter binding fails
+
+# Using prepared statements, insertion of more than three columns with NULL
+# values fails to insert additional NULLS.  After the third column NULLS will
+# be inserted into the database as zeros.
+# First insert four columns of a value (i.e. 22) to verify binding is working
+# correctly.  Then Bind to each columns bind parameter an is_null value of 1.
+# Then insert four more columns of integers, just for sanity.
+# A subsequent select on the server will result in this:
+# mysql> select * from foo_dfr;
+# +------+------+------+------+
+# | col1 | col2 | col3 | col4 |
+# +------+------+------+------+
+# |   22 |   22 |   22 |   22 |
+# | NULL | NULL | NULL |    0 |
+# |   88 |   88 |   88 |   88 |
+# +------+------+------+------+
+
+# Test is extended to more columns - code stores bit vector in bytes.
+
+create table t1 (
+  c_01 char(6), c_02 integer, c_03 real, c_04 int(3), c_05 varchar(20),
+  c_06 date,    c_07 char(1), c_08 real, c_09 int(11), c_10 time,
+  c_11 char(6), c_12 integer, c_13 real, c_14 int(3), c_15 varchar(20),
+  c_16 date,    c_17 char(1), c_18 real, c_19 int(11), c_20 text);
+# Do not use "timestamp" type, because it has a non-NULL default as of 4.1.2
+
+prepare st_1644 from 'insert into t1 values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
+
+set @arg01= 'row_1'; set @arg02= 1; set @arg03= 1.1; set @arg04= 111; set @arg05= 'row_one';
+set @arg06= '2004-10-12'; set @arg07= '1'; set @arg08= 1.1; set @arg09= '100100100'; set @arg10= '12:34:56';
+set @arg11= 'row_1'; set @arg12= 1; set @arg13= 1.1; set @arg14= 111; set @arg15= 'row_one';
+set @arg16= '2004-10-12'; set @arg17= '1'; set @arg18= 1.1; set @arg19= '100100100'; set @arg20= '12:34:56';
+execute st_1644 using @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, @arg07, @arg08, @arg09, @arg10,
+                      @arg11, @arg12, @arg13, @arg14, @arg15, @arg16, @arg17, @arg18, @arg19, @arg20;
+
+set @arg01= NULL; set @arg02= NULL; set @arg03= NULL; set @arg04= NULL; set @arg05= NULL;
+set @arg06= NULL; set @arg07= NULL; set @arg08= NULL; set @arg09= NULL; set @arg10= NULL;
+set @arg11= NULL; set @arg12= NULL; set @arg13= NULL; set @arg14= NULL; set @arg15= NULL;
+set @arg16= NULL; set @arg17= NULL; set @arg18= NULL; set @arg19= NULL; set @arg20= NULL;
+execute st_1644 using @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, @arg07, @arg08, @arg09, @arg10,
+                      @arg11, @arg12, @arg13, @arg14, @arg15, @arg16, @arg17, @arg18, @arg19, @arg20;
+
+set @arg01= 'row_3'; set @arg02= 3; set @arg03= 3.3; set @arg04= 333; set @arg05= 'row_three';
+set @arg06= '2004-10-12'; set @arg07= '3'; set @arg08= 3.3; set @arg09= '300300300'; set @arg10= '12:34:56';
+set @arg11= 'row_3'; set @arg12= 3; set @arg13= 3.3; set @arg14= 333; set @arg15= 'row_three';
+set @arg16= '2004-10-12'; set @arg17= '3'; set @arg18= 3.3; set @arg19= '300300300'; set @arg20= '12:34:56';
+execute st_1644 using @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, @arg07, @arg08, @arg09, @arg10,
+                      @arg11, @arg12, @arg13, @arg14, @arg15, @arg16, @arg17, @arg18, @arg19, @arg20;
+
+select * from t1;
+
+drop table t1;
+
+# end of bug#1644
+
+
+# bug#1677: Prepared statement two-table join returns no rows when one is expected
+
+create table t1(
+   cola varchar(50) not null,
+   colb varchar(8) not null,
+   colc varchar(12) not null,
+   cold varchar(2) not null,
+   primary key (cola, colb, cold));
+
+create table t2(
+   cola varchar(50) not null,
+   colb varchar(8) not null,
+   colc varchar(2) not null,
+   cold float,
+   primary key (cold));
+
+insert into t1 values ('aaaa', 'yyyy', 'yyyy-dd-mm', 'R');
+
+insert into t2 values ('aaaa', 'yyyy', 'R', 203), ('bbbb', 'zzzz', 'C', 201);
+
+prepare st_1676 from 'select a.cola, a.colb, a.cold from t1 a, t2 b where a.cola = ? and a.colb = ? and a.cold = ? and b.cola = a.cola and b.colb = a.colb and b.colc = a.cold';
+
+set @arg0= "aaaa";
+set @arg1= "yyyy";
+set @arg2= "R";
+
+execute st_1676 using @arg0, @arg1, @arg2;
+
+drop table t1, t2;
+
+# end of bug#1676
+
diff --git a/sql/examples/ha_example.cc b/sql/examples/ha_example.cc
index 097abd48e051e91b8ff83991a2d829cd96ccd755..cb0780ea74d06e91eddf5b6adc395b93a40c3c15 100644
--- a/sql/examples/ha_example.cc
+++ b/sql/examples/ha_example.cc
@@ -263,8 +263,8 @@ int ha_example::write_row(byte * buf)
   clause was used. Consecutive ordering is not guarenteed.
   Currently new_data will not have an updated auto_increament record, or
   and updated timestamp field. You can do these for example by doing these:
-  if (table->timestamp_on_update_now)
-    update_timestamp(new_row+table->timestamp_on_update_now-1);
+  if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE)
+    table->timestamp_field->set_time();
   if (table->next_number_field && record == table->record[0])
     update_auto_increment();
 
diff --git a/sql/examples/ha_tina.cc b/sql/examples/ha_tina.cc
index 06a19e478ae2c4cb500597b981d622010ac0e393..0345a170c3c8317caf8f59a64690f9eb76a9514a 100644
--- a/sql/examples/ha_tina.cc
+++ b/sql/examples/ha_tina.cc
@@ -428,8 +428,8 @@ int ha_tina::write_row(byte * buf)
 
   statistic_increment(ha_write_count,&LOCK_status);
 
-  if (table->timestamp_default_now)
-    update_timestamp(buf+table->timestamp_default_now-1);
+  if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT)
+    table->timestamp_field->set_time();
 
   size= encode_quote(buf);
 
@@ -464,8 +464,8 @@ int ha_tina::update_row(const byte * old_data, byte * new_data)
 
   statistic_increment(ha_update_count,&LOCK_status);
 
-  if (table->timestamp_default_now)
-    update_timestamp(new_data+table->timestamp_default_now-1);
+  if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE)
+    table->timestamp_field->set_time();
 
   size= encode_quote(new_data);
 
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index d748c005d02d7e36bc2e713444d1e9c55ef2300b..28f95611ae761e067496877740dff63827699f14 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -5468,4 +5468,29 @@ innobase_get_at_most_n_mbchars(
 }
 }
 
+extern "C" {
+/**********************************************************************
+This function returns true if SQL-query in the current thread
+is either REPLACE or LOAD DATA INFILE REPLACE. 
+NOTE that /mysql/innobase/row/row0ins.c must contain the 
+prototype for this function ! */
+
+ibool
+innobase_query_is_replace(void)
+/*===========================*/
+{
+	THD*	thd;
+	
+	thd = (THD *)innobase_current_thd();
+	
+	if ( thd->lex->sql_command == SQLCOM_REPLACE ||
+	     ( thd->lex->sql_command == SQLCOM_LOAD &&
+	       thd->lex->duplicates == DUP_REPLACE )) {
+		return true;
+	} else {
+		return false;
+	}
+}
+}
+
 #endif /* HAVE_INNOBASE_DB */
diff --git a/sql/password.c b/sql/password.c
index 0ac91346a55dd12eba7dfe20b45e27aca8f46df3..b9f3a07e596f497b6810e5fcae5051f25d045468 100644
--- a/sql/password.c
+++ b/sql/password.c
@@ -35,7 +35,7 @@
     update user set password=PASSWORD("hello") where user="test"
   This saves a hashed number as a string in the password field.
 
-  The new autentication is performed in following manner:
+  The new authentication is performed in following manner:
 
   SERVER:  public_seed=create_random_string()
            send(public_seed)
diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c
index a41449d5e50271bdaf3466dde91b6c6e133b4532..e7527b418f5dc8e2ba6abe11c463f0787cef52ea 100644
--- a/strings/ctype-mb.c
+++ b/strings/ctype-mb.c
@@ -123,8 +123,7 @@ int my_strcasecmp_mb(CHARSET_INFO * cs,const char *s, const char *t)
 **	 1 if matched with wildcard
 */
 
-#define INC_PTR(cs,A,B) A+=((use_mb_flag && \
-                          my_ismbchar(cs,A,B)) ? my_ismbchar(cs,A,B) : 1)
+#define INC_PTR(cs,A,B) A+=(my_ismbchar(cs,A,B) ? my_ismbchar(cs,A,B) : 1)
 
 #define likeconv(s,A) (uchar) (s)->sort_order[(uchar) (A)]
 
@@ -135,8 +134,6 @@ int my_wildcmp_mb(CHARSET_INFO *cs,
 {
   int result= -1;				/* Not found, using wildcards */
 
-  bool use_mb_flag=use_mb(cs);
-
   while (wildstr != wildend)
   {
     while (*wildstr != w_many && *wildstr != w_one)
@@ -144,8 +141,7 @@ int my_wildcmp_mb(CHARSET_INFO *cs,
       int l;
       if (*wildstr == escape && wildstr+1 != wildend)
 	wildstr++;
-      if (use_mb_flag &&
-          (l = my_ismbchar(cs, wildstr, wildend)))
+      if ((l = my_ismbchar(cs, wildstr, wildend)))
       {
 	  if (str+l > str_end || memcmp(str, wildstr, l) != 0)
 	      return 1;
@@ -200,41 +196,30 @@ int my_wildcmp_mb(CHARSET_INFO *cs,
 	cmp= *++wildstr;
 	
       mb=wildstr;
-      LINT_INIT(mblen);
-      if (use_mb_flag)
-        mblen = my_ismbchar(cs, wildstr, wildend);
+      mblen= my_ismbchar(cs, wildstr, wildend);
       INC_PTR(cs,wildstr,wildend);		/* This is compared trough cmp */
       cmp=likeconv(cs,cmp);   
       do
       {
-        if (use_mb_flag)
-	{
-          for (;;)
+        for (;;)
+        {
+          if (str >= str_end)
+            return -1;
+          if (mblen)
           {
-            if (str >= str_end)
-              return -1;
-            if (mblen)
-            {
-              if (str+mblen <= str_end && memcmp(str, mb, mblen) == 0)
-              {
-                str += mblen;
-                break;
-              }
-            }
-            else if (!my_ismbchar(cs, str, str_end) &&
-                     likeconv(cs,*str) == cmp)
+            if (str+mblen <= str_end && memcmp(str, mb, mblen) == 0)
             {
-              str++;
+              str += mblen;
               break;
             }
-            INC_PTR(cs,str, str_end);
           }
-	}
-        else
-        {
-          while (str != str_end && likeconv(cs,*str) != cmp)
+          else if (!my_ismbchar(cs, str, str_end) &&
+                   likeconv(cs,*str) == cmp)
+          {
             str++;
-          if (str++ == str_end) return (-1);
+            break;
+          }
+          INC_PTR(cs,str, str_end);
         }
 	{
 	  int tmp=my_wildcmp_mb(cs,str,str_end,wildstr,wildend,escape,w_one,
@@ -555,8 +540,6 @@ static int my_wildcmp_mb_bin(CHARSET_INFO *cs,
 {
   int result= -1;				/* Not found, using wildcards */
 
-  bool use_mb_flag=use_mb(cs);
-
   while (wildstr != wildend)
   {
     while (*wildstr != w_many && *wildstr != w_one)
@@ -564,8 +547,7 @@ static int my_wildcmp_mb_bin(CHARSET_INFO *cs,
       int l;
       if (*wildstr == escape && wildstr+1 != wildend)
 	wildstr++;
-      if (use_mb_flag &&
-          (l = my_ismbchar(cs, wildstr, wildend)))
+      if ((l = my_ismbchar(cs, wildstr, wildend)))
       {
 	  if (str+l > str_end || memcmp(str, wildstr, l) != 0)
 	      return 1;
@@ -620,39 +602,28 @@ static int my_wildcmp_mb_bin(CHARSET_INFO *cs,
 	cmp= *++wildstr;
 	
       mb=wildstr;
-      LINT_INIT(mblen);
-      if (use_mb_flag)
-        mblen = my_ismbchar(cs, wildstr, wildend);
+      mblen= my_ismbchar(cs, wildstr, wildend);
       INC_PTR(cs,wildstr,wildend);		/* This is compared trough cmp */
       do
       {
-        if (use_mb_flag)
-	{
-          for (;;)
+        for (;;)
+        {
+          if (str >= str_end)
+            return -1;
+          if (mblen)
           {
-            if (str >= str_end)
-              return -1;
-            if (mblen)
-            {
-              if (str+mblen <= str_end && memcmp(str, mb, mblen) == 0)
-              {
-                str += mblen;
-                break;
-              }
-            }
-            else if (!my_ismbchar(cs, str, str_end) && *str == cmp)
+            if (str+mblen <= str_end && memcmp(str, mb, mblen) == 0)
             {
-              str++;
+              str += mblen;
               break;
             }
-            INC_PTR(cs,str, str_end);
           }
-	}
-        else
-        {
-          while (str != str_end && *str != cmp)
+          else if (!my_ismbchar(cs, str, str_end) && *str == cmp)
+          {
             str++;
-          if (str++ == str_end) return (-1);
+            break;
+          }
+          INC_PTR(cs,str, str_end);
         }
 	{
 	  int tmp=my_wildcmp_mb_bin(cs,str,str_end,wildstr,wildend,escape,w_one,w_many);