diff options
author | unknown <monty@mysql.com> | 2004-05-04 15:02:38 +0300 |
---|---|---|
committer | unknown <monty@mysql.com> | 2004-05-04 15:02:38 +0300 |
commit | 030587a7a62e9aa9711cbceb5c8da45cbe041eb5 (patch) | |
tree | 05ce49a5f256144b2831c0deca15ee425d42d9b6 | |
parent | 7bf15f4b7956b6f57ec6f695382e4589814c2d79 (diff) | |
download | mariadb-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.txt | 142 | ||||
-rw-r--r-- | client/mysqlcheck.c | 3 | ||||
-rw-r--r-- | libmysql/libmysql.c | 24 | ||||
-rw-r--r-- | mysql-test/r/analyse.result | 65 | ||||
-rw-r--r-- | mysql-test/r/bdb.result | 2 | ||||
-rw-r--r-- | mysql-test/r/ctype_ujis.result | 19 | ||||
-rw-r--r-- | mysql-test/r/isam.result | 6 | ||||
-rw-r--r-- | mysql-test/r/repair.result | 2 | ||||
-rw-r--r-- | mysql-test/t/analyse.test | 23 | ||||
-rw-r--r-- | mysql-test/t/ctype_ujis.test | 12 | ||||
-rw-r--r-- | sql/sql_acl.cc | 3 | ||||
-rw-r--r-- | sql/sql_select.cc | 5 | ||||
-rw-r--r-- | sql/sql_table.cc | 2 | ||||
-rw-r--r-- | sql/sql_update.cc | 4 | ||||
-rw-r--r-- | tests/client_test.c | 33 |
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); |