Commit 4b41a187 authored by tulin@dl145b.mysql.com's avatar tulin@dl145b.mysql.com

Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.0

into dl145b.mysql.com:/home/ndbdev/tomas/mysql-5.1
parents 8df638b6 71b425be
...@@ -1133,8 +1133,6 @@ end| ...@@ -1133,8 +1133,6 @@ end|
select f5(1)| select f5(1)|
f5(1) f5(1)
1 1
select f5(2)|
ERROR HY000: Table 't1' was not locked with LOCK TABLES
create function f6() returns int create function f6() returns int
begin begin
declare n int; declare n int;
...@@ -3174,4 +3172,56 @@ a1 a2 a3 data data2 data3 ...@@ -3174,4 +3172,56 @@ a1 a2 a3 data data2 data3
DROP PROCEDURE bug6866; DROP PROCEDURE bug6866;
DROP VIEW tv| DROP VIEW tv|
DROP TABLE tt1, tt2, tt3| DROP TABLE tt1, tt2, tt3|
DROP PROCEDURE IF EXISTS bug10136|
create table t3 ( name char(5) not null primary key, val float not null)|
insert into t3 values ('aaaaa', 1), ('bbbbb', 2), ('ccccc', 3)|
create procedure bug10136()
begin
declare done int default 3;
repeat
select * from t3;
set done = done - 1;
until done <= 0 end repeat;
end|
call bug10136()|
name val
aaaaa 1
bbbbb 2
ccccc 3
name val
aaaaa 1
bbbbb 2
ccccc 3
name val
aaaaa 1
bbbbb 2
ccccc 3
call bug10136()|
name val
aaaaa 1
bbbbb 2
ccccc 3
name val
aaaaa 1
bbbbb 2
ccccc 3
name val
aaaaa 1
bbbbb 2
ccccc 3
call bug10136()|
name val
aaaaa 1
bbbbb 2
ccccc 3
name val
aaaaa 1
bbbbb 2
ccccc 3
name val
aaaaa 1
bbbbb 2
ccccc 3
drop procedure bug10136|
drop table t3|
drop table t1,t2; drop table t1,t2;
...@@ -1732,7 +1732,7 @@ INSERT INTO t1 VALUES ('a','1'), ('b','2'); ...@@ -1732,7 +1732,7 @@ INSERT INTO t1 VALUES ('a','1'), ('b','2');
INSERT INTO t2 VALUES ('a','5'), ('a','6'), ('b','5'), ('b','6'); INSERT INTO t2 VALUES ('a','5'), ('a','6'), ('b','5'), ('b','6');
CREATE VIEW v1 AS CREATE VIEW v1 AS
SELECT t1.b as c, t2.b as d FROM t1,t2 WHERE t1.a=t2.a; SELECT t1.b as c, t2.b as d FROM t1,t2 WHERE t1.a=t2.a;
SELECT d, c FROM v1 ORDER BY d; SELECT d, c FROM v1 ORDER BY d,c;
d c d c
5 1 5 1
5 2 5 2
...@@ -1826,3 +1826,8 @@ ERROR 42S21: Duplicate column name 's1' ...@@ -1826,3 +1826,8 @@ ERROR 42S21: Duplicate column name 's1'
drop table t1; drop table t1;
create view v1(k, K) as select 1,2; create view v1(k, K) as select 1,2;
ERROR 42S21: Duplicate column name 'K' ERROR 42S21: Duplicate column name 'K'
create view v1 as SELECT TIME_FORMAT(SEC_TO_TIME(3600),'%H:%i') as t;
select * from v1;
t
01:00
drop view v1;
...@@ -1364,8 +1364,9 @@ begin ...@@ -1364,8 +1364,9 @@ begin
end| end|
select f5(1)| select f5(1)|
# This should generate an error about insuficient number of tables locked # This should generate an error about insuficient number of tables locked
--error 1100 # Nuw this crash server, comented until bug#11394 fix
select f5(2)| #--error 1100
#select f5(2)|
# But now it simply miserably fails because we are trying to use the same # But now it simply miserably fails because we are trying to use the same
# lex on the next iteration :/ It should generate some error too... # lex on the next iteration :/ It should generate some error too...
# select f5(3)| # select f5(3)|
...@@ -3886,6 +3887,30 @@ DROP PROCEDURE bug6866; ...@@ -3886,6 +3887,30 @@ DROP PROCEDURE bug6866;
DROP VIEW tv| DROP VIEW tv|
DROP TABLE tt1, tt2, tt3| DROP TABLE tt1, tt2, tt3|
#
# BUG#10136: items cleunup
#
--disable_warnings
DROP PROCEDURE IF EXISTS bug10136|
--enable_warnings
create table t3 ( name char(5) not null primary key, val float not null)|
insert into t3 values ('aaaaa', 1), ('bbbbb', 2), ('ccccc', 3)|
create procedure bug10136()
begin
declare done int default 3;
repeat
select * from t3;
set done = done - 1;
until done <= 0 end repeat;
end|
call bug10136()|
call bug10136()|
call bug10136()|
drop procedure bug10136|
drop table t3|
# #
# BUG#NNNN: New bug synopsis # BUG#NNNN: New bug synopsis
# #
......
...@@ -1578,7 +1578,7 @@ INSERT INTO t1 VALUES ('a','1'), ('b','2'); ...@@ -1578,7 +1578,7 @@ INSERT INTO t1 VALUES ('a','1'), ('b','2');
INSERT INTO t2 VALUES ('a','5'), ('a','6'), ('b','5'), ('b','6'); INSERT INTO t2 VALUES ('a','5'), ('a','6'), ('b','5'), ('b','6');
CREATE VIEW v1 AS CREATE VIEW v1 AS
SELECT t1.b as c, t2.b as d FROM t1,t2 WHERE t1.a=t2.a; SELECT t1.b as c, t2.b as d FROM t1,t2 WHERE t1.a=t2.a;
SELECT d, c FROM v1 ORDER BY d; SELECT d, c FROM v1 ORDER BY d,c;
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1, t2; DROP TABLE t1, t2;
# #
...@@ -1599,6 +1599,7 @@ drop table t1; ...@@ -1599,6 +1599,7 @@ drop table t1;
create view v1 as select cast(1 as decimal); create view v1 as select cast(1 as decimal);
select * from v1; select * from v1;
drop view v1; drop view v1;
# #
# Bug#11298 insert into select from VIEW produces incorrect result when # Bug#11298 insert into select from VIEW produces incorrect result when
# using ORDER BY # using ORDER BY
...@@ -1665,3 +1666,10 @@ drop table t1; ...@@ -1665,3 +1666,10 @@ drop table t1;
# set names differ by case only # set names differ by case only
-- error 1060 -- error 1060
create view v1(k, K) as select 1,2; create view v1(k, K) as select 1,2;
#
# using time_format in view (BUG#7521)
#
create view v1 as SELECT TIME_FORMAT(SEC_TO_TIME(3600),'%H:%i') as t;
select * from v1;
drop view v1;
/* Copyright (C) 2005 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "my_global.h"
#include "mysys_priv.h"
#include "m_string.h"
#include <my_dir.h>
#define BUFF_SIZE 1024
#ifdef __WIN__
#define NEWLINE "\r\n"
#define NEWLINE_LEN 2
#else
#define NEWLINE "\n"
#define NEWLINE_LEN 1
#endif
static char *add_option(char *dst, const char *option_value,
const char *option, int remove_option);
/* /*
Add/remove option to the option file section. Add/remove option to the option file section.
...@@ -15,6 +50,8 @@ ...@@ -15,6 +50,8 @@
into a buffer. Then we look for the option within this section and into a buffer. Then we look for the option within this section and
change/remove it. In the end we get a buffer with modified version of the change/remove it. In the end we get a buffer with modified version of the
file. Then we write it to the file, truncate it if needed and close it. file. Then we write it to the file, truncate it if needed and close it.
Note that there is a small time gap, when the file is incomplete,
and this theoretically might introduce a problem.
RETURN RETURN
0 - ok 0 - ok
...@@ -22,24 +59,6 @@ ...@@ -22,24 +59,6 @@
2 - cannot open the file 2 - cannot open the file
*/ */
#include "my_global.h"
#include "mysys_priv.h"
#include "m_string.h"
#include <my_dir.h>
#define BUFF_SIZE 1024
#ifdef __WIN__
#define NEWLINE "\r\n"
#define NEWLINE_LEN 2
#else
#define NEWLINE "\n"
#define NEWLINE_LEN 1
#endif
static char *add_option(char *dst, const char *option_value,
const char *option, int remove_option);
int modify_defaults_file(const char *file_location, const char *option, int modify_defaults_file(const char *file_location, const char *option,
const char *option_value, const char *option_value,
const char *section_name, int remove_option) const char *section_name, int remove_option)
...@@ -47,7 +66,7 @@ int modify_defaults_file(const char *file_location, const char *option, ...@@ -47,7 +66,7 @@ int modify_defaults_file(const char *file_location, const char *option,
FILE *cnf_file; FILE *cnf_file;
MY_STAT file_stat; MY_STAT file_stat;
char linebuff[BUFF_SIZE], *src_ptr, *dst_ptr, *file_buffer; char linebuff[BUFF_SIZE], *src_ptr, *dst_ptr, *file_buffer;
uint optlen, optval_len, sect_len, nr_newlines= 0; uint opt_len, optval_len, sect_len, nr_newlines= 0;
my_bool in_section= FALSE, opt_applied= 0; my_bool in_section= FALSE, opt_applied= 0;
DBUG_ENTER("modify_defaults_file"); DBUG_ENTER("modify_defaults_file");
...@@ -58,7 +77,7 @@ int modify_defaults_file(const char *file_location, const char *option, ...@@ -58,7 +77,7 @@ int modify_defaults_file(const char *file_location, const char *option,
if (my_fstat(fileno(cnf_file), &file_stat, MYF(0))) if (my_fstat(fileno(cnf_file), &file_stat, MYF(0)))
goto err; goto err;
optlen= (uint) strlen(option); opt_len= (uint) strlen(option);
optval_len= (uint) strlen(option_value); optval_len= (uint) strlen(option_value);
/* /*
...@@ -66,17 +85,18 @@ int modify_defaults_file(const char *file_location, const char *option, ...@@ -66,17 +85,18 @@ int modify_defaults_file(const char *file_location, const char *option,
for the option we want to add. for the option we want to add.
*/ */
if (!(file_buffer= (char*) my_malloc(sizeof(char) * if (!(file_buffer= (char*) my_malloc(sizeof(char) *
(file_stat.st_size + (file_stat.st_size +
/* option name len */ /* option name len */
optlen + opt_len +
/* reserve space for newline */ /* reserve space for newline */
NEWLINE_LEN + NEWLINE_LEN +
/* reserve for '=' char */ /* reserve for '=' char */
1 + 1 +
/* option value len */ /* option value len */
optval_len + optval_len +
/* The ending zero plus some safety */ /* The ending zero */
FN_REFLEN), MYF(MY_WME)))) 1), MYF(MY_WME))))
goto malloc_err; goto malloc_err;
sect_len= (uint) strlen(section_name); sect_len= (uint) strlen(section_name);
...@@ -94,10 +114,11 @@ int modify_defaults_file(const char *file_location, const char *option, ...@@ -94,10 +114,11 @@ int modify_defaults_file(const char *file_location, const char *option,
continue; continue;
} }
if (!opt_applied && in_section && !strncmp(src_ptr, option, optlen) && /* correct the option */
(*(src_ptr + optlen) == '=' || if (!opt_applied && in_section && !strncmp(src_ptr, option, opt_len) &&
my_isspace(&my_charset_latin1, *(src_ptr + optlen)) || (*(src_ptr + opt_len) == '=' ||
*(src_ptr + optlen) == '\0')) my_isspace(&my_charset_latin1, *(src_ptr + opt_len)) ||
*(src_ptr + opt_len) == '\0'))
{ {
dst_ptr= add_option(dst_ptr, option_value, option, remove_option); dst_ptr= add_option(dst_ptr, option_value, option, remove_option);
opt_applied= 1; opt_applied= 1;
...@@ -107,11 +128,12 @@ int modify_defaults_file(const char *file_location, const char *option, ...@@ -107,11 +128,12 @@ int modify_defaults_file(const char *file_location, const char *option,
/* If going to new group and we have option to apply, do it now */ /* If going to new group and we have option to apply, do it now */
if (in_section && !opt_applied && *src_ptr == '[') if (in_section && !opt_applied && *src_ptr == '[')
{ {
dst_ptr= add_option(dst_ptr, option_value, option, remove_option); dst_ptr= add_option(dst_ptr, option_value, option, remove_option);
opt_applied= 1; /* set the flag to do write() later */
} }
for (; nr_newlines; nr_newlines--) for (; nr_newlines; nr_newlines--)
dst_ptr= strmov(dst_ptr, NEWLINE); dst_ptr= strmov(dst_ptr, NEWLINE);
dst_ptr= strmov(dst_ptr, linebuff); dst_ptr= strmov(dst_ptr, linebuff);
} }
/* Look for a section */ /* Look for a section */
...@@ -120,13 +142,13 @@ int modify_defaults_file(const char *file_location, const char *option, ...@@ -120,13 +142,13 @@ int modify_defaults_file(const char *file_location, const char *option,
/* Copy the line to the buffer */ /* Copy the line to the buffer */
if (!strncmp(++src_ptr, section_name, sect_len)) if (!strncmp(++src_ptr, section_name, sect_len))
{ {
src_ptr+= sect_len; src_ptr+= sect_len;
/* Skip over whitespaces. They are allowed after section name */ /* Skip over whitespaces. They are allowed after section name */
for (; my_isspace(&my_charset_latin1, *src_ptr); src_ptr++) for (; my_isspace(&my_charset_latin1, *src_ptr); src_ptr++)
{} {}
if (*src_ptr != ']') if (*src_ptr != ']')
continue; /* Missing closing parenthesis. Assume this was no group */ continue; /* Missing closing parenthesis. Assume this was no group */
in_section= TRUE; in_section= TRUE;
} }
else else
...@@ -149,10 +171,10 @@ int modify_defaults_file(const char *file_location, const char *option, ...@@ -149,10 +171,10 @@ int modify_defaults_file(const char *file_location, const char *option,
{ {
/* Don't write the file if there are no changes to be made */ /* Don't write the file if there are no changes to be made */
if (my_chsize(fileno(cnf_file), (my_off_t) (dst_ptr - file_buffer), 0, if (my_chsize(fileno(cnf_file), (my_off_t) (dst_ptr - file_buffer), 0,
MYF(MY_WME)) || MYF(MY_WME)) ||
my_fseek(cnf_file, 0, MY_SEEK_SET, MYF(0)) || my_fseek(cnf_file, 0, MY_SEEK_SET, MYF(0)) ||
my_fwrite(cnf_file, file_buffer, (uint) (dst_ptr - file_buffer), my_fwrite(cnf_file, file_buffer, (uint) (dst_ptr - file_buffer),
MYF(MY_NABP))) MYF(MY_NABP)))
goto err; goto err;
} }
if (my_fclose(cnf_file, MYF(MY_WME))) if (my_fclose(cnf_file, MYF(MY_WME)))
......
...@@ -503,7 +503,8 @@ public: ...@@ -503,7 +503,8 @@ public:
Item_func_date_format(Item *a,Item *b,bool is_time_format_arg) Item_func_date_format(Item *a,Item *b,bool is_time_format_arg)
:Item_str_func(a,b),is_time_format(is_time_format_arg) {} :Item_str_func(a,b),is_time_format(is_time_format_arg) {}
String *val_str(String *str); String *val_str(String *str);
const char *func_name() const { return "date_format"; } const char *func_name() const
{ return is_time_format ? "time_format" : "date_format"; }
void fix_length_and_dec(); void fix_length_and_dec();
uint format_length(const String *format); uint format_length(const String *format);
}; };
......
...@@ -636,7 +636,21 @@ sp_head::execute(THD *thd) ...@@ -636,7 +636,21 @@ sp_head::execute(THD *thd)
break; break;
DBUG_PRINT("execute", ("Instruction %u", ip)); DBUG_PRINT("execute", ("Instruction %u", ip));
thd->set_time(); // Make current_time() et al work thd->set_time(); // Make current_time() et al work
ret= i->execute(thd, &ip); {
/*
We have to substitute free_list of executing statement to
current_arena to store there all new items created during execution
(for example '*' expanding, or items made during permanent subquery
transformation)
Note: Every statement have to have all its items listed in free_list
for correct cleaning them up
*/
Item *save_free_list= thd->current_arena->free_list;
thd->current_arena->free_list= i->free_list;
ret= i->execute(thd, &ip);
i->free_list= thd->current_arena->free_list;
thd->current_arena->free_list= save_free_list;
}
if (i->free_list) if (i->free_list)
cleanup_items(i->free_list); cleanup_items(i->free_list);
// Check if an exception has occurred and a handler has been found // Check if an exception has occurred and a handler has been found
......
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