summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2004-05-04 15:02:38 +0300
committerunknown <monty@mysql.com>2004-05-04 15:02:38 +0300
commit030587a7a62e9aa9711cbceb5c8da45cbe041eb5 (patch)
tree05ce49a5f256144b2831c0deca15ee425d42d9b6
parent7bf15f4b7956b6f57ec6f695382e4589814c2d79 (diff)
downloadmariadb-git-030587a7a62e9aa9711cbceb5c8da45cbe041eb5.tar.gz
Fix to handle unsigned data in prepared statements (Bug #3447)
Fixed security problem that password was temporarly reset when someone changed GRANT for a user. (Bug #3404) Fixed problem with PROCEDURE analyse() and impossible WHERE (Bug #2238) Don't auto-repair tables in mysqlcheck if table type doesn't support 'check' command. Docs/mysqld_error.txt: Updated error values client/mysqlcheck.c: Don't cause auto-repair on 'note' (Tables that doesn't support 'check') libmysql/libmysql.c: Fix to handle unsigned data in prepared statements (Bug #3447) mysql-test/r/analyse.result: Test of analyze + impossible where (Bug #2238) mysql-test/r/bdb.result: Update results mysql-test/r/ctype_ujis.result: Update results mysql-test/r/isam.result: Update results mysql-test/r/repair.result: Update results mysql-test/t/analyse.test: Test of analyze + impossible where (Bug #2238) mysql-test/t/ctype_ujis.test: Added test for LIKE (Bug #3438) sql/sql_acl.cc: Fixed security problem that password was temporarly reset when someone changed GRANT for a user. (Bug #3404) sql/sql_select.cc: Fixed problem with PROCEDURE analyse() and impossible WHERE (Bug #2238) sql/sql_table.cc: Changed 'error' to 'note' when table doesn't support admin command. sql/sql_update.cc: Indentaion cleanup tests/client_test.c: Added test for handling unsigned/signed strings with prepared statements
-rw-r--r--Docs/mysqld_error.txt142
-rw-r--r--client/mysqlcheck.c3
-rw-r--r--libmysql/libmysql.c24
-rw-r--r--mysql-test/r/analyse.result65
-rw-r--r--mysql-test/r/bdb.result2
-rw-r--r--mysql-test/r/ctype_ujis.result19
-rw-r--r--mysql-test/r/isam.result6
-rw-r--r--mysql-test/r/repair.result2
-rw-r--r--mysql-test/t/analyse.test23
-rw-r--r--mysql-test/t/ctype_ujis.test12
-rw-r--r--sql/sql_acl.cc3
-rw-r--r--sql/sql_select.cc5
-rw-r--r--sql/sql_table.cc2
-rw-r--r--sql/sql_update.cc4
-rw-r--r--tests/client_test.c33
15 files changed, 256 insertions, 89 deletions
diff --git a/Docs/mysqld_error.txt b/Docs/mysqld_error.txt
index e567d5676aa..c164e8bd3a0 100644
--- a/Docs/mysqld_error.txt
+++ b/Docs/mysqld_error.txt
@@ -142,11 +142,11 @@ character-set=latin1
#define ER_MULTIPLE_PRI_KEY 1068
"Multiple primary key defined",
#define ER_TOO_MANY_KEYS 1069
-"Too many keys specified. Max %d keys allowed",
+"Too many keys specified; max %d keys allowed",
#define ER_TOO_MANY_KEY_PARTS 1070
"Too many key parts specified. Max %d parts allowed",
#define ER_TOO_LONG_KEY 1071
-"Specified key was too long. Max key length is %d",
+"Specified key was too long; max key length is %d bytes",
#define ER_KEY_COLUMN_DOES_NOT_EXITS 1072
"Key column '%-.64s' doesn't exist in table",
#define ER_BLOB_USED_AS_KEY 1073
@@ -406,7 +406,7 @@ character-set=latin1
#define ER_BAD_SLAVE 1200
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
#define ER_MASTER_INFO 1201
-"Could not initialize master info structure, check permisions on master.info",
+"Could not initialize master info structure, more error messages can be found in the MySQL error log",
#define ER_SLAVE_THREAD 1202
"Could not create slave thread, check system resources",
#define ER_TOO_MANY_USER_CONNECTIONS 1203
@@ -460,7 +460,7 @@ character-set=latin1
#define ER_SPECIFIC_ACCESS_DENIED_ERROR 1227
"Access denied. You need the %-.128s privilege for this operation",
#define ER_LOCAL_VARIABLE 1228
-"Variable '%-.64s' is a LOCAL variable and can't be used with SET GLOBAL",
+"Variable '%-.64s' is a SESSION variable and can't be used with SET GLOBAL",
#define ER_GLOBAL_VARIABLE 1229
"Variable '%-.64s' is a GLOBAL variable and should be set with SET GLOBAL",
#define ER_NO_DEFAULT 1230
@@ -479,95 +479,119 @@ character-set=latin1
"Got fatal error %d: '%-.128s' from master when reading data from binary log",
#define ER_SLAVE_IGNORED_TABLE 1237
"Slave SQL thread ignored the query because of replicate-*-table rules",
-#define ER_WRONG_FK_DEF 1238
+#define ER_INCORRECT_GLOBAL_LOCAL_VAR 1238
+"Variable '%-.64s' is a %s variable",
+#define ER_WRONG_FK_DEF 1239
"Wrong foreign key definition for '%-.64s': %s",
-#define ER_KEY_REF_DO_NOT_MATCH_TABLE_REF 1239
+#define ER_KEY_REF_DO_NOT_MATCH_TABLE_REF 1240
"Key reference and table reference doesn't match",
-#define ER_OPERAND_COLUMNS 1240
+#define ER_OPERAND_COLUMNS 1241
"Operand should contain %d column(s)",
-#define ER_SUBQUERY_NO_1_ROW 1241
+#define ER_SUBQUERY_NO_1_ROW 1242
"Subquery returns more than 1 row",
-#define ER_UNKNOWN_STMT_HANDLER 1242
+#define ER_UNKNOWN_STMT_HANDLER 1243
"Unknown prepared statement handler (%ld) given to %s",
-#define ER_CORRUPT_HELP_DB 1243
+#define ER_CORRUPT_HELP_DB 1244
"Help database is corrupt or does not exist",
-#define ER_CYCLIC_REFERENCE 1244
+#define ER_CYCLIC_REFERENCE 1245
"Cyclic reference on subqueries",
-#define ER_AUTO_CONVERT 1245
+#define ER_AUTO_CONVERT 1246
"Converting column '%s' from %s to %s",
-#define ER_ILLEGAL_REFERENCE 1246
+#define ER_ILLEGAL_REFERENCE 1247
"Reference '%-.64s' not supported (%s)",
-#define ER_DERIVED_MUST_HAVE_ALIAS 1247
+#define ER_DERIVED_MUST_HAVE_ALIAS 1248
"Every derived table must have it's own alias",
-#define ER_SELECT_REDUCED 1248
+#define ER_SELECT_REDUCED 1249
"Select %u was reduced during optimisation",
-#define ER_TABLENAME_NOT_ALLOWED_HERE 1249
+#define ER_TABLENAME_NOT_ALLOWED_HERE 1250
"Table '%-.64s' from one of SELECT's can not be used in %-.32s",
-#define ER_NOT_SUPPORTED_AUTH_MODE 1250
+#define ER_NOT_SUPPORTED_AUTH_MODE 1251
"Client does not support authentication protocol requested by server; consider upgrading MySQL client",
-#define ER_SPATIAL_CANT_HAVE_NULL 1251
+#define ER_SPATIAL_CANT_HAVE_NULL 1252
"All parts of a SPATIAL KEY must be NOT NULL",
-#define ER_COLLATION_CHARSET_MISMATCH 1252
+#define ER_COLLATION_CHARSET_MISMATCH 1253
"COLLATION '%s' is not valid for CHARACTER SET '%s'",
-#define ER_SLAVE_WAS_RUNNING 1253
+#define ER_SLAVE_WAS_RUNNING 1254
"Slave is already running",
-#define ER_SLAVE_WAS_NOT_RUNNING 1254
+#define ER_SLAVE_WAS_NOT_RUNNING 1255
"Slave has already been stopped",
-#define ER_TOO_BIG_FOR_UNCOMPRESS 1255
+#define ER_TOO_BIG_FOR_UNCOMPRESS 1256
"Too big size of uncompressed data. The maximum size is %d. (probably, length of uncompressed data was corrupted)",
-#define ER_ZLIB_Z_MEM_ERROR 1256
-"ZLIB: Not enough memory available for zlib",
-#define ER_ZLIB_Z_BUF_ERROR 1257
-"ZLIB: Not enough room in the output buffer for zlib (probably, length of uncompressed data was corrupted)",
-#define ER_ZLIB_Z_DATA_ERROR 1258
-"ZLIB: Input data was corrupted for zlib",
-#define ER_CUT_VALUE_GROUP_CONCAT 1259
+#define ER_ZLIB_Z_MEM_ERROR 1257
+"ZLIB: Not enough memory",
+#define ER_ZLIB_Z_BUF_ERROR 1258
+"ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted)",
+#define ER_ZLIB_Z_DATA_ERROR 1259
+"ZLIB: Input data corrupted",
+#define ER_CUT_VALUE_GROUP_CONCAT 1260
"%d line(s) was(were) cut by group_concat()",
-#define ER_WARN_TOO_FEW_RECORDS 1260
-"Record count is fewer than the column count at row %ld";
-#define ER_WARN_TOO_MANY_RECORDS 1261
-"Record count is more than the column count at row %ld";
-#define ER_WARN_NULL_TO_NOTNULL 1262
-"Data truncated, NULL supplied to NOT NULL column '%s' at row %ld";
-#define ER_WARN_DATA_OUT_OF_RANGE 1263
-"Data truncated, out of range for column '%s' at row %ld";
-#define ER_WARN_DATA_TRUNCATED 1264
+#define ER_WARN_TOO_FEW_RECORDS 1261
+"Row %ld doesn't contain data for all columns",
+#define ER_WARN_TOO_MANY_RECORDS 1262
+"Row %ld was truncated; It contained more data than there were input columns",
+#define ER_WARN_NULL_TO_NOTNULL 1263
+"Data truncated, NULL supplied to NOT NULL column '%s' at row %ld",
+#define ER_WARN_DATA_OUT_OF_RANGE 1264
+"Data truncated, out of range for column '%s' at row %ld",
+#define ER_WARN_DATA_TRUNCATED 1265
"Data truncated for column '%s' at row %ld",
-#define ER_WARN_USING_OTHER_HANDLER 1265
+#define ER_WARN_USING_OTHER_HANDLER 1266
"Using storage engine %s for table '%s'",
-#define ER_CANT_AGGREGATE_2COLLATIONS 1266
+#define ER_CANT_AGGREGATE_2COLLATIONS 1267
"Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'",
-#define ER_DROP_USER 1267
+#define ER_DROP_USER 1268
"Can't drop one or more of the requested users",
-#define ER_REVOKE_GRANTS 1268
+#define ER_REVOKE_GRANTS 1269
"Can't revoke all privileges, grant for one or more of the requested users",
-#define ER_CANT_AGGREGATE_3COLLATIONS 1269
+#define ER_CANT_AGGREGATE_3COLLATIONS 1270
"Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'",
-#define ER_CANT_AGGREGATE_NCOLLATIONS 1270
+#define ER_CANT_AGGREGATE_NCOLLATIONS 1271
"Illegal mix of collations for operation '%s'",
-#define ER_VARIABLE_IS_NOT_STRUCT 1271
+#define ER_VARIABLE_IS_NOT_STRUCT 1272
"Variable '%-.64s' is not a variable component (Can't be used as XXXX.variable_name)",
-#define ER_UNKNOWN_COLLATION 1272
+#define ER_UNKNOWN_COLLATION 1273
"Unknown collation: '%-.64s'",
-#define ER_SLAVE_IGNORED_SSL_PARAMS 1273
-"SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support. They can be used later when MySQL slave with SSL will be started.",
-#define ER_SERVER_IS_IN_SECURE_AUTH_MODE 1274
-"Server is running in --secure-auth mode, but '%s@%s' has a password in the old format; please change the password to the new format",
-#define ER_WARN_FIELD_RESOLVED 1275
+#define ER_SLAVE_IGNORED_SSL_PARAMS 1274
+"SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support; they can be used later when MySQL slave with SSL will be started",
+#define ER_SERVER_IS_IN_SECURE_AUTH_MODE 1275
+"Server is running in --secure-auth mode, but '%s'@'%s' has a password in the old format; please change the password to the new format",
+#define ER_WARN_FIELD_RESOLVED 1276
"Field or reference '%-.64s%s%-.64s%s%-.64s' of SELECT #%d was resolved in SELECT #%d",
-#define ER_BAD_SLAVE_UNTIL_COND 1276
+#define ER_BAD_SLAVE_UNTIL_COND 1277
"Wrong parameter or combination of parameters for START SLAVE UNTIL",
-#define ER_MISSING_SKIP_SLAVE 1277
+#define ER_MISSING_SKIP_SLAVE 1278
"It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL. Otherwise you will get problems if you get an unexpected slave's mysqld restart",
-#define ER_UNTIL_COND_IGNORED 1278
+#define ER_UNTIL_COND_IGNORED 1279
"SQL thread is not to be started so UNTIL options are ignored",
-#define ER_WRONG_NAME_FOR_INDEX 1279
+#define ER_WRONG_NAME_FOR_INDEX 1280
"Incorrect index name '%-.100s'",
-#define ER_WRONG_NAME_FOR_CATALOG 1280
+#define ER_WRONG_NAME_FOR_CATALOG 1281
"Incorrect catalog name '%-.100s'",
-#define ER_WARN_QC_RESIZE 1281
+#define ER_WARN_QC_RESIZE 1282
"Query cache failed to set size %lu, new query cache size is %lu",
-#define ER_BAD_FT_COLUMN 1282
+#define ER_BAD_FT_COLUMN 1283
"Column '%-.64s' cannot be part of FULLTEXT index",
-#define ER_UNKNOWN_KEY_CACHE 1283
+#define ER_UNKNOWN_KEY_CACHE 1284
"Unknown key cache '%-.100s'",
+#define ER_WARN_HOSTNAME_WONT_WORK 1285
+"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
+#define ER_UNKNOWN_STORAGE_ENGINE 1286
+"Unknown table engine '%s'",
+#define ER_WARN_DEPRECATED_SYNTAX 1287
+"'%s' is deprecated, use '%s' instead",
+#define ER_NON_UPDATABLE_TABLE 1288
+"The target table %-.100s of the %s is not updatable",
+#define ER_FEATURE_DISABLED 1289
+"The '%s' feature was disabled; you need MySQL built with '%s' to have it working",
+#define ER_OPTION_PREVENTS_STATEMENT 1290
+"The MySQL server is running with the %s option so it cannot execute this statement",
+#define ER_DUPLICATED_VALUE_IN_TYPE 1291
+"Column '%-.100s' has duplicated value '%-.64s' in %s"
+#define ER_TRUNCATED_WRONG_VALUE 1292
+"Truncated wrong %-.32s value: '%-.128s'"
+#define ER_TOO_MUCH_AUTO_TIMESTAMP_COLS 1293
+"Incorrect table definition; There can only be one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause"
+#define ER_INVALID_ON_UPDATE 1294
+"Invalid ON UPDATE clause for '%-.64s' field",
+#define ER_UNSUPPORTED_PS 1295
+"This command is not supported in the prepared statement protocol yet",
diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c
index 03ab45957d4..aa4c1282cc1 100644
--- a/client/mysqlcheck.c
+++ b/client/mysqlcheck.c
@@ -576,7 +576,8 @@ static void print_result()
else if (!status && changed)
{
printf("%s\n%-9s: %s", row[0], row[2], row[3]);
- found_error=1;
+ if (strcmp(row[2],"note"))
+ found_error=1;
}
else
printf("%-9s: %s", row[2], row[3]);
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index 83346f46c5e..6ee2ba438bd 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -2929,10 +2929,12 @@ static uint read_binary_date(MYSQL_TIME *tm, uchar **pos)
}
/* Convert Numeric to buffer types */
-static void send_data_long(MYSQL_BIND *param, longlong value)
+static void send_data_long(MYSQL_BIND *param, MYSQL_FIELD *field,
+ longlong value)
{
char *buffer= param->buffer;
-
+ uint field_is_unsigned= (field->flags & UNSIGNED_FLAG);
+
switch (param->buffer_type) {
case MYSQL_TYPE_NULL: /* do nothing */
break;
@@ -2950,20 +2952,24 @@ static void send_data_long(MYSQL_BIND *param, longlong value)
break;
case MYSQL_TYPE_FLOAT:
{
- float data= (float)value;
+ float data= (field_is_unsigned ? (float) ulonglong2double(value) :
+ (float) value);
float4store(buffer, data);
break;
}
case MYSQL_TYPE_DOUBLE:
{
- double data= (double)value;
+ double data= (field_is_unsigned ? ulonglong2double(value) :
+ (double) value);
float8store(buffer, data);
break;
}
default:
{
char tmp[22]; /* Enough for longlong */
- uint length= (uint)(longlong10_to_str(value,(char *)tmp,10)-tmp);
+ uint length= (uint)(longlong10_to_str(value,(char *)tmp,
+ field_is_unsigned ? 10: -10) -
+ tmp);
ulong copy_length= min((ulong)length-param->offset, param->buffer_length);
if ((long) copy_length < 0)
copy_length=0;
@@ -3170,7 +3176,7 @@ static void fetch_results(MYSQL_BIND *param, MYSQL_FIELD *field, uchar **row)
uint field_is_unsigned= (field->flags & UNSIGNED_FLAG);
longlong data= ((field_is_unsigned) ? (longlong) (unsigned char) value:
(longlong) value);
- send_data_long(param,data);
+ send_data_long(param, field, data);
length= 1;
break;
}
@@ -3181,7 +3187,7 @@ static void fetch_results(MYSQL_BIND *param, MYSQL_FIELD *field, uchar **row)
uint field_is_unsigned= (field->flags & UNSIGNED_FLAG);
longlong data= ((field_is_unsigned) ? (longlong) (unsigned short) value:
(longlong) value);
- send_data_long(param,data);
+ send_data_long(param, field, data);
length= 2;
break;
}
@@ -3191,14 +3197,14 @@ static void fetch_results(MYSQL_BIND *param, MYSQL_FIELD *field, uchar **row)
uint field_is_unsigned= (field->flags & UNSIGNED_FLAG);
longlong data= ((field_is_unsigned) ? (longlong) (unsigned long) value:
(longlong) value);
- send_data_long(param,data);
+ send_data_long(param, field, data);
length= 4;
break;
}
case MYSQL_TYPE_LONGLONG:
{
longlong value= (longlong)sint8korr(*row);
- send_data_long(param,value);
+ send_data_long(param, field, value);
length= 8;
break;
}
diff --git a/mysql-test/r/analyse.result b/mysql-test/r/analyse.result
index f18b925460c..b51afab5b54 100644
--- a/mysql-test/r/analyse.result
+++ b/mysql-test/r/analyse.result
@@ -31,3 +31,68 @@ EXPLAIN SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE();
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> system NULL NULL NULL NULL 1
2 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used
+create table t1 (a int not null);
+create table t2 select * from t1 where 0=1 procedure analyse();
+show create table t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `Field_name` char(255) NOT NULL default '',
+ `Min_value` char(255) default NULL,
+ `Max_value` char(255) default NULL,
+ `Min_length` bigint(11) NOT NULL default '0',
+ `Max_length` bigint(11) NOT NULL default '0',
+ `Empties_or_zeros` bigint(11) NOT NULL default '0',
+ `Nulls` bigint(11) NOT NULL default '0',
+ `Avg_value_or_avg_length` char(255) NOT NULL default '',
+ `Std` char(255) default NULL,
+ `Optimal_fieldtype` char(64) NOT NULL default ''
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+select * from t1 where 0=1 procedure analyse();
+Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
+insert into t1 values(1);
+drop table t2;
+create table t2 select * from t1 where 0=1 procedure analyse();
+show create table t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `Field_name` char(255) NOT NULL default '',
+ `Min_value` char(255) default NULL,
+ `Max_value` char(255) default NULL,
+ `Min_length` bigint(11) NOT NULL default '0',
+ `Max_length` bigint(11) NOT NULL default '0',
+ `Empties_or_zeros` bigint(11) NOT NULL default '0',
+ `Nulls` bigint(11) NOT NULL default '0',
+ `Avg_value_or_avg_length` char(255) NOT NULL default '',
+ `Std` char(255) default NULL,
+ `Optimal_fieldtype` char(64) NOT NULL default ''
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+select * from t2;
+Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
+insert into t2 select * from t1 procedure analyse();
+select * from t2;
+Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
+test.t1.a 1 1 1 1 0 0 1.0000 0.0000 ENUM('1') NOT NULL
+insert into t1 values(2);
+drop table t2;
+create table t2 select * from t1 where 0=1 procedure analyse();
+show create table t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `Field_name` char(255) NOT NULL default '',
+ `Min_value` char(255) default NULL,
+ `Max_value` char(255) default NULL,
+ `Min_length` bigint(11) NOT NULL default '0',
+ `Max_length` bigint(11) NOT NULL default '0',
+ `Empties_or_zeros` bigint(11) NOT NULL default '0',
+ `Nulls` bigint(11) NOT NULL default '0',
+ `Avg_value_or_avg_length` char(255) NOT NULL default '',
+ `Std` char(255) default NULL,
+ `Optimal_fieldtype` char(64) NOT NULL default ''
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+select * from t2;
+Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
+insert into t2 select * from t1 procedure analyse();
+select * from t2;
+Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
+test.t1.a 1 2 1 1 0 0 1.5000 0.5000 ENUM('1','2') NOT NULL
+drop table t1,t2;
diff --git a/mysql-test/r/bdb.result b/mysql-test/r/bdb.result
index bee40eac30d..a544bbbf0b7 100644
--- a/mysql-test/r/bdb.result
+++ b/mysql-test/r/bdb.result
@@ -203,7 +203,7 @@ a
2
check table t1;
Table Op Msg_type Msg_text
-test.t1 check error The storage engine for the table doesn't support check
+test.t1 check note The storage engine for the table doesn't support check
drop table t1;
create table t1 (a int,b varchar(20)) engine=bdb;
insert into t1 values (1,""), (2,"testing");
diff --git a/mysql-test/r/ctype_ujis.result b/mysql-test/r/ctype_ujis.result
index b66ede3bed4..cc062094535 100644
--- a/mysql-test/r/ctype_ujis.result
+++ b/mysql-test/r/ctype_ujis.result
@@ -92,3 +92,22 @@ select @ujis3 = CONVERT(@utf83 USING ujis);
select @ujis4 = CONVERT(@utf84 USING ujis);
@ujis4 = CONVERT(@utf84 USING ujis)
1
+drop table if exists t1;
+Warnings:
+Note 1051 Unknown table 't1'
+create table t1 (c1 varchar(8)) default character set 'ujis';
+insert into t1 values (0xA4A2),(0xA2A2),(0xA4A2);
+select c1 as 'no index' from t1 where c1 like cast(concat(0xA4A2, '%') as char character set ujis);
+no index
+あ
+あ
+create index idx_c1 on t1(c1);
+select c1 as 'using index' from t1 where c1 like cast(concat(0xA4A2, '%') as char character set ujis);
+using index
+あ
+あ
+select c1 as 'no index' from t1 where c1 like cast(concat('%',0xA4A2, '%') as char character set ujis);
+no index
+あ
+あ
+drop table t1;
diff --git a/mysql-test/r/isam.result b/mysql-test/r/isam.result
index 4c698075150..2c7b3a4a568 100644
--- a/mysql-test/r/isam.result
+++ b/mysql-test/r/isam.result
@@ -49,14 +49,14 @@ test.t1 optimize status OK
check table t1,t2;
Table Op Msg_type Msg_text
test.t1 check status OK
-test.t2 check error The storage engine for the table doesn't support check
+test.t2 check note The storage engine for the table doesn't support check
repair table t1,t2;
Table Op Msg_type Msg_text
test.t1 repair status OK
-test.t2 repair error The storage engine for the table doesn't support repair
+test.t2 repair note The storage engine for the table doesn't support repair
check table t2,t1;
Table Op Msg_type Msg_text
-test.t2 check error The storage engine for the table doesn't support check
+test.t2 check note The storage engine for the table doesn't support check
test.t1 check status OK
lock tables t1 write;
check table t2,t1;
diff --git a/mysql-test/r/repair.result b/mysql-test/r/repair.result
index f81bbd063ea..dbca5c39a6c 100644
--- a/mysql-test/r/repair.result
+++ b/mysql-test/r/repair.result
@@ -7,7 +7,7 @@ test.t1 repair status OK
alter table t1 ENGINE=HEAP;
repair table t1 use_frm;
Table Op Msg_type Msg_text
-test.t1 repair error The storage engine for the table doesn't support repair
+test.t1 repair note The storage engine for the table doesn't support repair
drop table t1;
create table t1(id int PRIMARY KEY, st varchar(10), KEY st_key(st));
insert into t1 values(1, "One");
diff --git a/mysql-test/t/analyse.test b/mysql-test/t/analyse.test
index 6aca345b282..47f3473584b 100644
--- a/mysql-test/t/analyse.test
+++ b/mysql-test/t/analyse.test
@@ -15,3 +15,26 @@ select * from t2;
drop table t1,t2;
EXPLAIN SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE();
+
+#
+# Test with impossible where
+#
+create table t1 (a int not null);
+create table t2 select * from t1 where 0=1 procedure analyse();
+show create table t2;
+select * from t1 where 0=1 procedure analyse();
+insert into t1 values(1);
+drop table t2;
+create table t2 select * from t1 where 0=1 procedure analyse();
+show create table t2;
+select * from t2;
+insert into t2 select * from t1 procedure analyse();
+select * from t2;
+insert into t1 values(2);
+drop table t2;
+create table t2 select * from t1 where 0=1 procedure analyse();
+show create table t2;
+select * from t2;
+insert into t2 select * from t1 procedure analyse();
+select * from t2;
+drop table t1,t2;
diff --git a/mysql-test/t/ctype_ujis.test b/mysql-test/t/ctype_ujis.test
index abfded5a6c2..6281f2a4249 100644
--- a/mysql-test/t/ctype_ujis.test
+++ b/mysql-test/t/ctype_ujis.test
@@ -61,3 +61,15 @@ select @ujis2 = CONVERT(@utf82 USING ujis);
select @ujis3 = CONVERT(@utf83 USING ujis);
select @ujis4 = CONVERT(@utf84 USING ujis);
+#
+# Testing with '%' and index (Bug #3438)
+#
+
+drop table if exists t1;
+create table t1 (c1 varchar(8)) default character set 'ujis';
+insert into t1 values (0xA4A2),(0xA2A2),(0xA4A2);
+select c1 as 'no index' from t1 where c1 like cast(concat(0xA4A2, '%') as char character set ujis);
+create index idx_c1 on t1(c1);
+select c1 as 'using index' from t1 where c1 like cast(concat(0xA4A2, '%') as char character set ujis);
+select c1 as 'no index' from t1 where c1 like cast(concat('%',0xA4A2, '%') as char character set ujis);
+drop table t1;
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 72a68af54c0..f8dca1133cc 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -1560,7 +1560,8 @@ end:
{
acl_cache->clear(1); // Clear privilege cache
if (old_row_exists)
- acl_update_user(combo.user.str, combo.host.str, password, password_len,
+ acl_update_user(combo.user.str, combo.host.str,
+ combo.password.str, password_len,
thd->lex->ssl_type,
thd->lex->ssl_cipher,
thd->lex->x509_issuer,
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index bdc5091d386..d3867d1d909 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -4116,11 +4116,6 @@ return_zero_rows(JOIN *join, select_result *result,TABLE_LIST *tables,
DBUG_RETURN(0);
}
- if (procedure)
- {
- if (result->prepare(fields, unit)) // This hasn't been done yet
- DBUG_RETURN(-1);
- }
if (send_row)
{
for (TABLE_LIST *table=tables; table ; table=table->next)
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index c46a9823a52..0d0be1b7e10 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1759,7 +1759,7 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
char buf[ERRMSGSIZE+20];
uint length=my_snprintf(buf, ERRMSGSIZE,
ER(ER_CHECK_NOT_IMPLEMENTED), operator_name);
- protocol->store("error", 5, system_charset_info);
+ protocol->store("note", 4, system_charset_info);
protocol->store(buf, length, system_charset_info);
}
break;
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 55ea15f1af4..4966788f21e 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -461,9 +461,7 @@ int mysql_multi_update(THD *thd,
int res;
multi_update *result;
TABLE_LIST *tl;
- TABLE_LIST *update_list=
- (TABLE_LIST*)thd->lex->select_lex.table_list.first;
-
+ TABLE_LIST *update_list= (TABLE_LIST*) thd->lex->select_lex.table_list.first;
table_map item_tables= 0, derived_tables= 0;
DBUG_ENTER("mysql_multi_update");
diff --git a/tests/client_test.c b/tests/client_test.c
index 8aaa9983bc9..0e1dde81c1c 100644
--- a/tests/client_test.c
+++ b/tests/client_test.c
@@ -9182,8 +9182,7 @@ static void test_bug3035()
{
MYSQL_STMT *stmt;
int rc;
-
- MYSQL_BIND bind_array[8];
+ MYSQL_BIND bind_array[12];
int8 int8_val;
uint8 uint8_val;
int16 int16_val;
@@ -9192,6 +9191,8 @@ static void test_bug3035()
uint32 uint32_val;
longlong int64_val;
ulonglong uint64_val;
+ double double_val, udouble_val;
+ char longlong_as_string[22],ulonglong_as_string[22];
/* mins and maxes */
const int8 int8_min= -128;
@@ -9210,11 +9211,11 @@ static void test_bug3035()
const uint32 uint32_max= 4294967295U;
/* it might not work okay everyplace */
- const longlong int64_max= 9223372036854775807LL;
+ const longlong int64_max= LL(9223372036854775807);
const longlong int64_min= -int64_max - 1;
const ulonglong uint64_min= 0U;
- const ulonglong uint64_max= 18446744073709551615ULL;
+ const ulonglong uint64_max= ULL(18446744073709551615);
const char *stmt_text;
@@ -9296,7 +9297,7 @@ static void test_bug3035()
mysql_stmt_execute(stmt);
check_execute(stmt, rc);
- stmt_text= "SELECT i8, ui8, i16, ui16, i32, ui32, i64, ui64 "
+ stmt_text= "SELECT i8, ui8, i16, ui16, i32, ui32, i64, ui64, ui64, cast(ui64 as signed),ui64, cast(ui64 as signed)"
"FROM t1 ORDER BY id ASC";
mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text));
@@ -9305,6 +9306,20 @@ static void test_bug3035()
mysql_stmt_execute(stmt);
check_execute(stmt, rc);
+ bind_array[8].buffer_type= MYSQL_TYPE_DOUBLE;
+ bind_array[8].buffer= (char*) &udouble_val;
+
+ bind_array[9].buffer_type= MYSQL_TYPE_DOUBLE;
+ bind_array[9].buffer= (char*) &double_val;
+
+ bind_array[10].buffer_type= MYSQL_TYPE_STRING;
+ bind_array[10].buffer= (char*) &ulonglong_as_string;
+ bind_array[10].buffer_length= sizeof(ulonglong_as_string);
+
+ bind_array[11].buffer_type= MYSQL_TYPE_STRING;
+ bind_array[11].buffer= (char*) &longlong_as_string;
+ bind_array[11].buffer_length= sizeof(longlong_as_string);
+
mysql_stmt_bind_result(stmt, bind_array);
rc= mysql_stmt_fetch(stmt);
@@ -9318,6 +9333,10 @@ static void test_bug3035()
assert(uint32_val == uint32_min);
assert(int64_val == int64_min);
assert(uint64_val == uint64_min);
+ assert(double_val == (longlong) uint64_min);
+ assert(udouble_val == ulonglong2double(uint64_val));
+ assert(!strcmp(longlong_as_string, "0"));
+ assert(!strcmp(ulonglong_as_string, "0"));
rc= mysql_stmt_fetch(stmt);
check_execute(stmt, rc);
@@ -9330,6 +9349,10 @@ static void test_bug3035()
assert(uint32_val == uint32_max);
assert(int64_val == int64_max);
assert(uint64_val == uint64_max);
+ assert(double_val == (longlong) uint64_val);
+ assert(udouble_val == ulonglong2double(uint64_val));
+ assert(!strcmp(longlong_as_string, "-1"));
+ assert(!strcmp(ulonglong_as_string, "18446744073709551615"));
rc= mysql_stmt_fetch(stmt);
assert(rc == MYSQL_NO_DATA);