Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.0
into poseidon.ndb.mysql.com:/home/tomas/mysql-5.1 sql/field.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_class.h: Auto merged
This commit is contained in:
commit
22545f4777
@ -1774,6 +1774,7 @@ static int stmt_read_row_unbuffered(MYSQL_STMT *stmt, unsigned char **row);
|
||||
static int stmt_read_row_buffered(MYSQL_STMT *stmt, unsigned char **row);
|
||||
static int stmt_read_row_from_cursor(MYSQL_STMT *stmt, unsigned char **row);
|
||||
static int stmt_read_row_no_data(MYSQL_STMT *stmt, unsigned char **row);
|
||||
static int stmt_read_row_no_result_set(MYSQL_STMT *stmt, unsigned char **row);
|
||||
|
||||
/*
|
||||
This function is used in mysql_stmt_store_result if
|
||||
@ -2036,7 +2037,7 @@ mysql_stmt_init(MYSQL *mysql)
|
||||
stmt->list.data= stmt;
|
||||
stmt->state= MYSQL_STMT_INIT_DONE;
|
||||
stmt->mysql= mysql;
|
||||
stmt->read_row_func= stmt_read_row_no_data;
|
||||
stmt->read_row_func= stmt_read_row_no_result_set;
|
||||
stmt->prefetch_rows= DEFAULT_PREFETCH_ROWS;
|
||||
/* The rest of statement members was bzeroed inside malloc */
|
||||
|
||||
@ -2778,6 +2779,13 @@ stmt_read_row_from_cursor(MYSQL_STMT *stmt, unsigned char **row)
|
||||
static int
|
||||
stmt_read_row_no_data(MYSQL_STMT *stmt __attribute__((unused)),
|
||||
unsigned char **row __attribute__((unused)))
|
||||
{
|
||||
return MYSQL_NO_DATA;
|
||||
}
|
||||
|
||||
static int
|
||||
stmt_read_row_no_result_set(MYSQL_STMT *stmt __attribute__((unused)),
|
||||
unsigned char **row __attribute__((unused)))
|
||||
{
|
||||
set_stmt_error(stmt, CR_NO_RESULT_SET, unknown_sqlstate);
|
||||
return 1;
|
||||
@ -4600,7 +4608,8 @@ int STDCALL mysql_stmt_fetch(MYSQL_STMT *stmt)
|
||||
((rc= stmt_fetch_row(stmt, row)) && rc != MYSQL_DATA_TRUNCATED))
|
||||
{
|
||||
stmt->state= MYSQL_STMT_PREPARE_DONE; /* XXX: this is buggy */
|
||||
stmt->read_row_func= stmt_read_row_no_data;
|
||||
stmt->read_row_func= (rc == MYSQL_NO_DATA) ?
|
||||
stmt_read_row_no_data : stmt_read_row_no_result_set;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4937,7 +4946,7 @@ static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags)
|
||||
for (; param < param_end; param++)
|
||||
param->long_data_used= 0;
|
||||
}
|
||||
stmt->read_row_func= stmt_read_row_no_data;
|
||||
stmt->read_row_func= stmt_read_row_no_result_set;
|
||||
if (mysql)
|
||||
{
|
||||
if ((int) stmt->state > (int) MYSQL_STMT_PREPARE_DONE)
|
||||
|
@ -657,3 +657,22 @@ a b
|
||||
1.1 1.100
|
||||
2.1 2.100
|
||||
DROP TABLE t1;
|
||||
create table t1 (utext varchar(20) character set ucs2);
|
||||
insert into t1 values ("lily");
|
||||
insert into t1 values ("river");
|
||||
prepare stmt from 'select utext from t1 where utext like ?';
|
||||
set @param1='%%';
|
||||
execute stmt using @param1;
|
||||
utext
|
||||
lily
|
||||
river
|
||||
execute stmt using @param1;
|
||||
utext
|
||||
lily
|
||||
river
|
||||
select utext from t1 where utext like '%%';
|
||||
utext
|
||||
lily
|
||||
river
|
||||
drop table t1;
|
||||
deallocate prepare stmt;
|
||||
|
@ -759,25 +759,6 @@ execute stmt using @a, @b;
|
||||
?=?
|
||||
1
|
||||
deallocate prepare stmt;
|
||||
create table t1 (utext varchar(20) character set ucs2);
|
||||
insert into t1 values ("lily");
|
||||
insert into t1 values ("river");
|
||||
prepare stmt from 'select utext from t1 where utext like ?';
|
||||
set @param1='%%';
|
||||
execute stmt using @param1;
|
||||
utext
|
||||
lily
|
||||
river
|
||||
execute stmt using @param1;
|
||||
utext
|
||||
lily
|
||||
river
|
||||
select utext from t1 where utext like '%%';
|
||||
utext
|
||||
lily
|
||||
river
|
||||
drop table t1;
|
||||
deallocate prepare stmt;
|
||||
create table t1 (a int);
|
||||
prepare stmt from "select ??";
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
|
||||
|
@ -3062,4 +3062,21 @@ l
|
||||
drop procedure bug6063|
|
||||
drop procedure bug7088_1|
|
||||
drop procedure bug7088_2|
|
||||
drop procedure if exists bug9565_sub|
|
||||
drop procedure if exists bug9565|
|
||||
create procedure bug9565_sub()
|
||||
begin
|
||||
select * from t1;
|
||||
end|
|
||||
create procedure bug9565()
|
||||
begin
|
||||
insert into t1 values ("one", 1);
|
||||
call bug9565_sub();
|
||||
end|
|
||||
call bug9565()|
|
||||
id data
|
||||
one 1
|
||||
delete from t1|
|
||||
drop procedure bug9565_sub|
|
||||
drop procedure bug9565|
|
||||
drop table t1,t2;
|
||||
|
@ -1235,3 +1235,13 @@ create table t1(a varchar(65537));
|
||||
ERROR 42000: Column length too big for column 'a' (max = 65535); use BLOB or TEXT instead
|
||||
create table t1(a varbinary(65537));
|
||||
ERROR 42000: Column length too big for column 'a' (max = 65535); use BLOB or TEXT instead
|
||||
set @@sql_mode='traditional';
|
||||
create table t1(a int, b date not null);
|
||||
alter table t1 modify a bigint unsigned not null;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` bigint(20) unsigned NOT NULL,
|
||||
`b` date NOT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1;
|
||||
|
@ -1977,3 +1977,17 @@ A
|
||||
B
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 ( bug_table_seq INTEGER NOT NULL);
|
||||
CREATE OR REPLACE VIEW v1 AS SELECT * from t1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE p1 does not exist
|
||||
CREATE PROCEDURE p1 ( )
|
||||
BEGIN
|
||||
DO (SELECT @next := IFNULL(max(bug_table_seq),0) + 1 FROM v1);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
END //
|
||||
CALL p1();
|
||||
DROP PROCEDURE p1;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
@ -427,3 +427,17 @@ INSERT INTO t1 VALUES ("1.1", 0), ("2.1", 0);
|
||||
update t1 set b=a;
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#9442 Set parameter make query fail if column character set is UCS2
|
||||
#
|
||||
create table t1 (utext varchar(20) character set ucs2);
|
||||
insert into t1 values ("lily");
|
||||
insert into t1 values ("river");
|
||||
prepare stmt from 'select utext from t1 where utext like ?';
|
||||
set @param1='%%';
|
||||
execute stmt using @param1;
|
||||
execute stmt using @param1;
|
||||
select utext from t1 where utext like '%%';
|
||||
drop table t1;
|
||||
deallocate prepare stmt;
|
||||
|
@ -789,19 +789,6 @@ set @b='CHRISTINE';
|
||||
execute stmt using @a, @b;
|
||||
deallocate prepare stmt;
|
||||
#
|
||||
# Bug#9442 Set parameter make query fail if column character set is UCS2
|
||||
#
|
||||
create table t1 (utext varchar(20) character set ucs2);
|
||||
insert into t1 values ("lily");
|
||||
insert into t1 values ("river");
|
||||
prepare stmt from 'select utext from t1 where utext like ?';
|
||||
set @param1='%%';
|
||||
execute stmt using @param1;
|
||||
execute stmt using @param1;
|
||||
select utext from t1 where utext like '%%';
|
||||
drop table t1;
|
||||
deallocate prepare stmt;
|
||||
#
|
||||
# Bug#11299 "prepared statement makes wrong SQL syntax in binlog which stops
|
||||
# replication": check that errouneous queries with placeholders are not
|
||||
# allowed
|
||||
|
@ -3832,6 +3832,28 @@ drop procedure bug6063|
|
||||
drop procedure bug7088_1|
|
||||
drop procedure bug7088_2|
|
||||
|
||||
#
|
||||
# BUG#9565: "Wrong locking in stored procedure if a sub-sequent procedure
|
||||
# is called".
|
||||
#
|
||||
--disable_warnings
|
||||
drop procedure if exists bug9565_sub|
|
||||
drop procedure if exists bug9565|
|
||||
--enable_warnings
|
||||
create procedure bug9565_sub()
|
||||
begin
|
||||
select * from t1;
|
||||
end|
|
||||
create procedure bug9565()
|
||||
begin
|
||||
insert into t1 values ("one", 1);
|
||||
call bug9565_sub();
|
||||
end|
|
||||
call bug9565()|
|
||||
delete from t1|
|
||||
drop procedure bug9565_sub|
|
||||
drop procedure bug9565|
|
||||
|
||||
|
||||
#
|
||||
# BUG#NNNN: New bug synopsis
|
||||
|
@ -1093,3 +1093,13 @@ set @@sql_mode='traditional';
|
||||
create table t1(a varchar(65537));
|
||||
--error 1074
|
||||
create table t1(a varbinary(65537));
|
||||
|
||||
#
|
||||
# Bug #9881: problem with altering table
|
||||
#
|
||||
|
||||
set @@sql_mode='traditional';
|
||||
create table t1(a int, b date not null);
|
||||
alter table t1 modify a bigint unsigned not null;
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
|
@ -1804,7 +1804,6 @@ drop table t1;
|
||||
#
|
||||
# Test for bug #11771: wrong query_id in SELECT * FROM <view>
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (f1 char) ENGINE = innodb;
|
||||
INSERT INTO t1 VALUES ('A');
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
@ -1815,3 +1814,21 @@ SELECT * FROM t1;
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# opening table in correct locking mode (BUG#9597)
|
||||
#
|
||||
CREATE TABLE t1 ( bug_table_seq INTEGER NOT NULL);
|
||||
CREATE OR REPLACE VIEW v1 AS SELECT * from t1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
delimiter //;
|
||||
CREATE PROCEDURE p1 ( )
|
||||
BEGIN
|
||||
DO (SELECT @next := IFNULL(max(bug_table_seq),0) + 1 FROM v1);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
END //
|
||||
delimiter ;//
|
||||
CALL p1();
|
||||
DROP PROCEDURE p1;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
@ -8488,7 +8488,8 @@ create_field::create_field(Field *old_field,Field *orig_field)
|
||||
else
|
||||
interval=0;
|
||||
def=0;
|
||||
if (!old_field->is_real_null() && ! (flags & BLOB_FLAG) &&
|
||||
if (!(flags & (NO_DEFAULT_VALUE_FLAG | BLOB_FLAG)) &&
|
||||
!old_field->is_real_null() &&
|
||||
old_field->ptr && orig_field)
|
||||
{
|
||||
char buff[MAX_FIELD_WIDTH],*pos;
|
||||
|
@ -1041,6 +1041,8 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
|
||||
|
||||
if (thd->locked_tables || thd->prelocked_mode)
|
||||
{ // Using table locks
|
||||
TABLE *best_table= 0;
|
||||
int best_distance= INT_MIN, distance;
|
||||
for (table=thd->open_tables; table ; table=table->next)
|
||||
{
|
||||
if (table->s->key_length == key_length &&
|
||||
@ -1049,11 +1051,37 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
|
||||
table->query_id != thd->query_id && /* skip tables already used by this query */
|
||||
!(thd->prelocked_mode && table->query_id))
|
||||
{
|
||||
table->query_id= thd->query_id;
|
||||
DBUG_PRINT("info",("Using locked table"));
|
||||
goto reset;
|
||||
distance= ((int) table->reginfo.lock_type -
|
||||
(int) table_list->lock_type);
|
||||
/*
|
||||
Find a table that either has the exact lock type requested,
|
||||
or has the best suitable lock. In case there is no locked
|
||||
table that has an equal or higher lock than requested,
|
||||
we still maitain the best_table to produce an error message
|
||||
about wrong lock mode on the table. The best_table is changed
|
||||
if bd < 0 <= d or bd < d < 0 or 0 <= d < bd.
|
||||
|
||||
distance < 0 - we have not enough high lock mode
|
||||
distance > 0 - we have lock mode higher then we require
|
||||
distance == 0 - we have lock mode exactly which we need
|
||||
*/
|
||||
if (best_distance < 0 && distance > best_distance ||
|
||||
distance >= 0 && distance < best_distance)
|
||||
{
|
||||
best_distance= distance;
|
||||
best_table= table;
|
||||
if (best_distance == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (best_table)
|
||||
{
|
||||
table= best_table;
|
||||
table->query_id= thd->query_id;
|
||||
DBUG_PRINT("info",("Using locked table"));
|
||||
goto reset;
|
||||
}
|
||||
/*
|
||||
is it view?
|
||||
(it is work around to allow to open view with locked tables,
|
||||
|
@ -1170,12 +1170,22 @@ public:
|
||||
This is to track items changed during execution of a prepared
|
||||
statement/stored procedure. It's created by
|
||||
register_item_tree_change() in memory root of THD, and freed in
|
||||
rollback_item_tree_changes(). For conventional execution it's always 0.
|
||||
rollback_item_tree_changes(). For conventional execution it's always
|
||||
empty.
|
||||
*/
|
||||
Item_change_list change_list;
|
||||
|
||||
/*
|
||||
Current prepared Query_arena if there one, or 0
|
||||
A permanent memory area of the statement. For conventional
|
||||
execution, the parsed tree and execution runtime reside in the same
|
||||
memory root. In this case current_arena points to THD. In case of
|
||||
a prepared statement or a stored procedure statement, thd->mem_root
|
||||
conventionally points to runtime memory, and thd->current_arena
|
||||
points to the memory of the PS/SP, where the parsed tree of the
|
||||
statement resides. Whenever you need to perform a permanent
|
||||
transformation of a parsed tree, you should allocate new memory in
|
||||
current_arena, to allow correct re-execution of PS/SP.
|
||||
Note: in the parser, current_arena == thd, even for PS/SP.
|
||||
*/
|
||||
Query_arena *current_arena;
|
||||
/*
|
||||
|
@ -13315,7 +13315,7 @@ static void test_bug9992()
|
||||
DIE_UNLESS(rc == 1); /* Got errors, as expected */
|
||||
|
||||
if (!opt_silent)
|
||||
fprintf(stdout, "Got error, sa expected:\n [%d] %s\n",
|
||||
fprintf(stdout, "Got error, as expected:\n [%d] %s\n",
|
||||
mysql_errno(mysql1), mysql_error(mysql1));
|
||||
|
||||
mysql_close(mysql1);
|
||||
@ -13705,6 +13705,51 @@ static void test_bug11183()
|
||||
myquery(rc);
|
||||
}
|
||||
|
||||
static void test_bug11037()
|
||||
{
|
||||
MYSQL_STMT *stmt;
|
||||
int rc;
|
||||
const char *stmt_text;
|
||||
|
||||
myheader("test_bug11037");
|
||||
|
||||
mysql_query(mysql, "drop table if exists t1");
|
||||
|
||||
rc= mysql_query(mysql, "create table t1 (id int not null)");
|
||||
myquery(rc);
|
||||
|
||||
rc= mysql_query(mysql, "insert into t1 values (1)");
|
||||
myquery(rc);
|
||||
|
||||
stmt_text= "select id FROM t1";
|
||||
stmt= mysql_stmt_init(mysql);
|
||||
rc= mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text));
|
||||
|
||||
/* expected error */
|
||||
rc = mysql_stmt_fetch(stmt);
|
||||
DIE_UNLESS(rc==1);
|
||||
if (!opt_silent)
|
||||
fprintf(stdout, "Got error, as expected:\n [%d] %s\n",
|
||||
mysql_stmt_errno(stmt), mysql_stmt_error(stmt));
|
||||
|
||||
rc = mysql_stmt_execute(stmt);
|
||||
check_execute(stmt, rc);
|
||||
|
||||
rc = mysql_stmt_fetch(stmt);
|
||||
DIE_UNLESS(rc==0);
|
||||
|
||||
rc = mysql_stmt_fetch(stmt);
|
||||
DIE_UNLESS(rc==MYSQL_NO_DATA);
|
||||
|
||||
rc = mysql_stmt_fetch(stmt);
|
||||
DIE_UNLESS(rc==MYSQL_NO_DATA);
|
||||
|
||||
mysql_stmt_close(stmt);
|
||||
rc= mysql_query(mysql, "drop table t1");
|
||||
myquery(rc);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Read and parse arguments and MySQL options from my.cnf
|
||||
*/
|
||||
@ -13948,6 +13993,7 @@ static struct my_tests_st my_tests[]= {
|
||||
{ "test_bug10214", test_bug10214 },
|
||||
{ "test_bug9735", test_bug9735 },
|
||||
{ "test_bug11183", test_bug11183 },
|
||||
{ "test_bug11037", test_bug11037 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user