Commit 59ddd8c7 authored by monty@mysql.com's avatar monty@mysql.com

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.
parent 661aeb5a
......@@ -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",
......@@ -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]);
......
......@@ -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;
}
......
......@@ -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;
......@@ -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");
......
......@@ -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;
......@@ -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;
......
......@@ -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");
......
......@@ -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;
......@@ -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;
......@@ -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,
......
......@@ -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)
......
......@@ -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;
......
......@@ -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");
......
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment