Commit f536f361 authored by kostja@bodhi.local's avatar kostja@bodhi.local

Merge bodhi.local:/opt/local/work/tmp_merge

into  bodhi.local:/opt/local/work/mysql-5.1-runtime-merge-5.0
parents 2834bc1e 1c4dffc8
...@@ -361,12 +361,6 @@ extract(SECOND FROM "1999-01-02 10:11:12") ...@@ -361,12 +361,6 @@ extract(SECOND FROM "1999-01-02 10:11:12")
select extract(MONTH FROM "2001-02-00"); select extract(MONTH FROM "2001-02-00");
extract(MONTH FROM "2001-02-00") extract(MONTH FROM "2001-02-00")
2 2
SELECT DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE)
9999-12-31 00:00:00
SELECT DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE)
9999-12-31 00:00:00
SELECT EXTRACT(QUARTER FROM '2004-01-15') AS quarter; SELECT EXTRACT(QUARTER FROM '2004-01-15') AS quarter;
quarter quarter
1 1
...@@ -403,6 +397,12 @@ quarter ...@@ -403,6 +397,12 @@ quarter
SELECT EXTRACT(QUARTER FROM '2004-12-15') AS quarter; SELECT EXTRACT(QUARTER FROM '2004-12-15') AS quarter;
quarter quarter
4 4
SELECT DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE)
9999-12-31 00:00:00
SELECT DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE)
9999-12-31 00:00:00
SELECT "1900-01-01 00:00:00" + INTERVAL 2147483648 SECOND; SELECT "1900-01-01 00:00:00" + INTERVAL 2147483648 SECOND;
"1900-01-01 00:00:00" + INTERVAL 2147483648 SECOND "1900-01-01 00:00:00" + INTERVAL 2147483648 SECOND
1968-01-20 03:14:08 1968-01-20 03:14:08
......
...@@ -1075,3 +1075,18 @@ SELECT f1(); ...@@ -1075,3 +1075,18 @@ SELECT f1();
f1() f1()
abc abc
DROP FUNCTION f1; DROP FUNCTION f1;
DROP PROCEDURE IF EXISTS p1;
CREATE PROCEDURE p1()
BEGIN
DECLARE v_char VARCHAR(255);
DECLARE v_text TEXT DEFAULT '';
SET v_char = 'abc';
SET v_text = v_char;
SET v_char = 'def';
SET v_text = concat(v_text, '|', v_char);
SELECT v_text;
END|
CALL p1();
v_text
abc|def
DROP PROCEDURE p1;
...@@ -143,10 +143,6 @@ select extract(SECOND FROM "1999-01-02 10:11:12"); ...@@ -143,10 +143,6 @@ select extract(SECOND FROM "1999-01-02 10:11:12");
select extract(MONTH FROM "2001-02-00"); select extract(MONTH FROM "2001-02-00");
# #
# MySQL Bugs: #12356: DATE_SUB or DATE_ADD incorrectly returns null
#
SELECT DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
SELECT DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
# test EXTRACT QUARTER (Bug #18100) # test EXTRACT QUARTER (Bug #18100)
# #
...@@ -162,7 +158,11 @@ SELECT EXTRACT(QUARTER FROM '2004-09-15') AS quarter; ...@@ -162,7 +158,11 @@ SELECT EXTRACT(QUARTER FROM '2004-09-15') AS quarter;
SELECT EXTRACT(QUARTER FROM '2004-10-15') AS quarter; SELECT EXTRACT(QUARTER FROM '2004-10-15') AS quarter;
SELECT EXTRACT(QUARTER FROM '2004-11-15') AS quarter; SELECT EXTRACT(QUARTER FROM '2004-11-15') AS quarter;
SELECT EXTRACT(QUARTER FROM '2004-12-15') AS quarter; SELECT EXTRACT(QUARTER FROM '2004-12-15') AS quarter;
#
# MySQL Bugs: #12356: DATE_SUB or DATE_ADD incorrectly returns null
#
SELECT DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
SELECT DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
# #
# Test big intervals (Bug #3498) # Test big intervals (Bug #3498)
......
...@@ -859,7 +859,40 @@ select concat(@a, table_name), @a, table_name ...@@ -859,7 +859,40 @@ select concat(@a, table_name), @a, table_name
from information_schema.tables where table_schema = 'test'; from information_schema.tables where table_schema = 'test';
drop table t1,t2; drop table t1,t2;
# End of 5.0 tests. #
# Bug#20230: routine_definition is not null
#
--disable_warnings
DROP PROCEDURE IF EXISTS p1;
DROP FUNCTION IF EXISTS f1;
--enable_warnings
CREATE PROCEDURE p1() SET @a= 1;
CREATE FUNCTION f1() RETURNS INT RETURN @a + 1;
CREATE USER mysql_bug20230@localhost;
GRANT EXECUTE ON PROCEDURE p1 TO mysql_bug20230@localhost;
GRANT EXECUTE ON FUNCTION f1 TO mysql_bug20230@localhost;
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES;
SHOW CREATE PROCEDURE p1;
SHOW CREATE FUNCTION f1;
connect (conn1, localhost, mysql_bug20230,,);
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES;
SHOW CREATE PROCEDURE p1;
SHOW CREATE FUNCTION f1;
CALL p1();
SELECT f1();
disconnect conn1;
connection default;
DROP FUNCTION f1;
DROP PROCEDURE p1;
DROP USER mysql_bug20230@localhost;
--echo End of 5.0 tests.
# #
# Show engines # Show engines
# #
...@@ -877,3 +910,5 @@ select user,db from information_schema.processlist; ...@@ -877,3 +910,5 @@ select user,db from information_schema.processlist;
connection default; connection default;
drop user user3148@localhost; drop user user3148@localhost;
--echo End of 5.1 tests.
...@@ -1271,3 +1271,39 @@ SELECT f1(); ...@@ -1271,3 +1271,39 @@ SELECT f1();
# #
DROP FUNCTION f1; DROP FUNCTION f1;
#
# Bug#17226: Variable set in cursor on first iteration is assigned
# second iterations value
#
# The problem was in incorrect handling of local variables of type
# TEXT (BLOB).
#
--disable_warnings
DROP PROCEDURE IF EXISTS p1;
--enable_warnings
delimiter |;
CREATE PROCEDURE p1()
BEGIN
DECLARE v_char VARCHAR(255);
DECLARE v_text TEXT DEFAULT '';
SET v_char = 'abc';
SET v_text = v_char;
SET v_char = 'def';
SET v_text = concat(v_text, '|', v_char);
SELECT v_text;
END|
delimiter ;|
CALL p1();
DROP PROCEDURE p1;
# End of 5.0 tests.
...@@ -674,9 +674,14 @@ void field_conv(Field *to,Field *from) ...@@ -674,9 +674,14 @@ void field_conv(Field *to,Field *from)
{ // Be sure the value is stored { // Be sure the value is stored
Field_blob *blob=(Field_blob*) to; Field_blob *blob=(Field_blob*) to;
from->val_str(&blob->value); from->val_str(&blob->value);
if (!blob->value.is_alloced() && /*
from->real_type() != MYSQL_TYPE_STRING && Copy value if copy_blobs is set, or source is not a string and
from->real_type() != MYSQL_TYPE_VARCHAR) we have a pointer to its internal string conversion buffer.
*/
if (to->table->copy_blobs ||
(!blob->value.is_alloced() &&
from->real_type() != MYSQL_TYPE_STRING &&
from->real_type() != MYSQL_TYPE_VARCHAR))
blob->value.copy(); blob->value.copy();
blob->store(blob->value.ptr(),blob->value.length(),from->charset()); blob->store(blob->value.ptr(),blob->value.length(),from->charset());
return; return;
......
...@@ -890,13 +890,6 @@ class Item_sp_variable :public Item ...@@ -890,13 +890,6 @@ class Item_sp_variable :public Item
public: public:
LEX_STRING m_name; LEX_STRING m_name;
/*
Buffer, pointing to the string value of the item. We need it to
protect internal buffer from changes. See comment to analogous
member in Item_param for more details.
*/
String str_value_ptr;
public: public:
#ifndef DBUG_OFF #ifndef DBUG_OFF
/* /*
......
...@@ -1933,8 +1933,11 @@ sp_head::show_create_procedure(THD *thd) ...@@ -1933,8 +1933,11 @@ sp_head::show_create_procedure(THD *thd)
field_list.push_back(new Item_empty_string("Procedure", NAME_LEN)); field_list.push_back(new Item_empty_string("Procedure", NAME_LEN));
field_list.push_back(new Item_empty_string("sql_mode", sql_mode_len)); field_list.push_back(new Item_empty_string("sql_mode", sql_mode_len));
// 1024 is for not to confuse old clients // 1024 is for not to confuse old clients
field_list.push_back(new Item_empty_string("Create Procedure", Item_empty_string *definition=
max(buffer.length(), 1024))); new Item_empty_string("Create Procedure", max(buffer.length(),1024));
definition->maybe_null= TRUE;
field_list.push_back(definition);
if (protocol->send_fields(&field_list, Protocol::SEND_NUM_ROWS | if (protocol->send_fields(&field_list, Protocol::SEND_NUM_ROWS |
Protocol::SEND_EOF)) Protocol::SEND_EOF))
DBUG_RETURN(1); DBUG_RETURN(1);
...@@ -1943,6 +1946,8 @@ sp_head::show_create_procedure(THD *thd) ...@@ -1943,6 +1946,8 @@ sp_head::show_create_procedure(THD *thd)
protocol->store((char*) sql_mode_str, sql_mode_len, system_charset_info); protocol->store((char*) sql_mode_str, sql_mode_len, system_charset_info);
if (full_access) if (full_access)
protocol->store(m_defstr.str, m_defstr.length, system_charset_info); protocol->store(m_defstr.str, m_defstr.length, system_charset_info);
else
protocol->store_null();
res= protocol->write(); res= protocol->write();
send_eof(thd); send_eof(thd);
...@@ -1998,8 +2003,11 @@ sp_head::show_create_function(THD *thd) ...@@ -1998,8 +2003,11 @@ sp_head::show_create_function(THD *thd)
&sql_mode_len); &sql_mode_len);
field_list.push_back(new Item_empty_string("Function",NAME_LEN)); field_list.push_back(new Item_empty_string("Function",NAME_LEN));
field_list.push_back(new Item_empty_string("sql_mode", sql_mode_len)); field_list.push_back(new Item_empty_string("sql_mode", sql_mode_len));
field_list.push_back(new Item_empty_string("Create Function", Item_empty_string *definition=
max(buffer.length(),1024))); new Item_empty_string("Create Function", max(buffer.length(),1024));
definition->maybe_null= TRUE;
field_list.push_back(definition);
if (protocol->send_fields(&field_list, if (protocol->send_fields(&field_list,
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
DBUG_RETURN(1); DBUG_RETURN(1);
...@@ -2008,6 +2016,8 @@ sp_head::show_create_function(THD *thd) ...@@ -2008,6 +2016,8 @@ sp_head::show_create_function(THD *thd)
protocol->store((char*) sql_mode_str, sql_mode_len, system_charset_info); protocol->store((char*) sql_mode_str, sql_mode_len, system_charset_info);
if (full_access) if (full_access)
protocol->store(m_defstr.str, m_defstr.length, system_charset_info); protocol->store(m_defstr.str, m_defstr.length, system_charset_info);
else
protocol->store_null();
res= protocol->write(); res= protocol->write();
send_eof(thd); send_eof(thd);
......
...@@ -42,8 +42,6 @@ sys_var *trg_new_row_fake_var= (sys_var*) 0x01; ...@@ -42,8 +42,6 @@ sys_var *trg_new_row_fake_var= (sys_var*) 0x01;
#define yySkip() lex->ptr++ #define yySkip() lex->ptr++
#define yyLength() ((uint) (lex->ptr - lex->tok_start)-1) #define yyLength() ((uint) (lex->ptr - lex->tok_start)-1)
pthread_key(LEX*,THR_LEX);
/* Longest standard keyword name */ /* Longest standard keyword name */
#define TOCK_NAME_LENGTH 24 #define TOCK_NAME_LENGTH 24
...@@ -92,8 +90,6 @@ void lex_init(void) ...@@ -92,8 +90,6 @@ void lex_init(void)
for (i=0 ; i < array_elements(sql_functions) ; i++) for (i=0 ; i < array_elements(sql_functions) ; i++)
sql_functions[i].length=(uchar) strlen(sql_functions[i].name); sql_functions[i].length=(uchar) strlen(sql_functions[i].name);
VOID(pthread_key_create(&THR_LEX,NULL));
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -1191,8 +1191,4 @@ extern void lex_start(THD *thd, const uchar *buf, uint length); ...@@ -1191,8 +1191,4 @@ extern void lex_start(THD *thd, const uchar *buf, uint length);
extern void lex_end(LEX *lex); extern void lex_end(LEX *lex);
extern int MYSQLlex(void *arg, void *yythd); extern int MYSQLlex(void *arg, void *yythd);
extern pthread_key(LEX*,THR_LEX); #endif /* MYSQL_SERVER */
#define current_lex (current_thd->lex)
#endif
...@@ -2431,7 +2431,7 @@ static void reset_one_shot_variables(THD *thd) ...@@ -2431,7 +2431,7 @@ static void reset_one_shot_variables(THD *thd)
/* /*
Execute command saved in thd and current_lex->sql_command Execute command saved in thd and lex->sql_command
SYNOPSIS SYNOPSIS
mysql_execute_command() mysql_execute_command()
...@@ -5780,7 +5780,7 @@ bool check_stack_overrun(THD *thd, long margin, ...@@ -5780,7 +5780,7 @@ bool check_stack_overrun(THD *thd, long margin,
bool my_yyoverflow(short **yyss, YYSTYPE **yyvs, ulong *yystacksize) bool my_yyoverflow(short **yyss, YYSTYPE **yyvs, ulong *yystacksize)
{ {
LEX *lex=current_lex; LEX *lex= current_thd->lex;
ulong old_info=0; ulong old_info=0;
if ((uint) *yystacksize >= MY_YACC_MAX) if ((uint) *yystacksize >= MY_YACC_MAX)
return 1; return 1;
...@@ -6245,7 +6245,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, ...@@ -6245,7 +6245,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
void store_position_for_column(const char *name) void store_position_for_column(const char *name)
{ {
current_lex->last_field->after=my_const_cast(char*) (name); current_thd->lex->last_field->after=my_const_cast(char*) (name);
} }
bool bool
......
...@@ -3330,6 +3330,7 @@ bool store_schema_proc(THD *thd, TABLE *table, TABLE *proc_table, ...@@ -3330,6 +3330,7 @@ bool store_schema_proc(THD *thd, TABLE *table, TABLE *proc_table,
{ {
get_field(thd->mem_root, proc_table->field[10], &tmp_string); get_field(thd->mem_root, proc_table->field[10], &tmp_string);
table->field[7]->store(tmp_string.ptr(), tmp_string.length(), cs); table->field[7]->store(tmp_string.ptr(), tmp_string.length(), cs);
table->field[7]->set_notnull();
} }
table->field[6]->store(STRING_WITH_LEN("SQL"), cs); table->field[6]->store(STRING_WITH_LEN("SQL"), cs);
table->field[10]->store(STRING_WITH_LEN("SQL"), cs); table->field[10]->store(STRING_WITH_LEN("SQL"), cs);
...@@ -5283,7 +5284,7 @@ ST_FIELD_INFO proc_fields_info[]= ...@@ -5283,7 +5284,7 @@ ST_FIELD_INFO proc_fields_info[]=
{"ROUTINE_TYPE", 9, MYSQL_TYPE_STRING, 0, 0, "Type"}, {"ROUTINE_TYPE", 9, MYSQL_TYPE_STRING, 0, 0, "Type"},
{"DTD_IDENTIFIER", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, 0}, {"DTD_IDENTIFIER", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, 0},
{"ROUTINE_BODY", 8, MYSQL_TYPE_STRING, 0, 0, 0}, {"ROUTINE_BODY", 8, MYSQL_TYPE_STRING, 0, 0, 0},
{"ROUTINE_DEFINITION", 65535, MYSQL_TYPE_STRING, 0, 0, 0}, {"ROUTINE_DEFINITION", 65535, MYSQL_TYPE_STRING, 0, 1, 0},
{"EXTERNAL_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, 0}, {"EXTERNAL_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, 0},
{"EXTERNAL_LANGUAGE", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, 0}, {"EXTERNAL_LANGUAGE", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, 0},
{"PARAMETER_STYLE", 8, MYSQL_TYPE_STRING, 0, 0, 0}, {"PARAMETER_STYLE", 8, MYSQL_TYPE_STRING, 0, 0, 0},
......
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