Commit 9f30fa2c authored by bell@sanja.is.com.ua's avatar bell@sanja.is.com.ua

Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-5.0

into  sanja.is.com.ua:/home/bell/mysql/bk/work-bug4-5.0
parents 8b717937 7d7a59e4
...@@ -1923,3 +1923,20 @@ ERROR HY000: Field of view 'test.v2' underlying table doesn't have a default val ...@@ -1923,3 +1923,20 @@ ERROR HY000: Field of view 'test.v2' underlying table doesn't have a default val
set sql_mode=default; set sql_mode=default;
drop view v2,v1; drop view v2,v1;
drop table t1; drop table t1;
CREATE TABLE t1 (s1 int, s2 int);
INSERT INTO t1 VALUES (1,2);
CREATE VIEW v1 AS SELECT s2 AS s1, s1 AS s2 FROM t1;
SELECT * FROM v1;
s1 s2
2 1
CREATE PROCEDURE p1 () SELECT * FROM v1;
CALL p1();
s1 s2
2 1
ALTER VIEW v1 AS SELECT s1 AS s1, s2 AS s2 FROM t1;
CALL p1();
s1 s2
1 2
DROP PROCEDURE p1;
DROP VIEW v1;
DROP TABLE t1;
...@@ -1761,3 +1761,20 @@ INSERT INTO v2 (vcol1) VALUES(12); ...@@ -1761,3 +1761,20 @@ INSERT INTO v2 (vcol1) VALUES(12);
set sql_mode=default; set sql_mode=default;
drop view v2,v1; drop view v2,v1;
drop table t1; drop table t1;
#
# Test for bug #6120: SP cache to be invalidated when altering a view
#
CREATE TABLE t1 (s1 int, s2 int);
INSERT INTO t1 VALUES (1,2);
CREATE VIEW v1 AS SELECT s2 AS s1, s1 AS s2 FROM t1;
SELECT * FROM v1;
CREATE PROCEDURE p1 () SELECT * FROM v1;
CALL p1();
ALTER VIEW v1 AS SELECT s1 AS s1, s2 AS s2 FROM t1;
CALL p1();
DROP PROCEDURE p1;
DROP VIEW v1;
DROP TABLE t1;
...@@ -48,13 +48,14 @@ char *defaults_extra_file=0; ...@@ -48,13 +48,14 @@ char *defaults_extra_file=0;
/* Which directories are searched for options (and in which order) */ /* Which directories are searched for options (and in which order) */
#define MAX_DEFAULT_DIRS 5 #define MAX_DEFAULT_DIRS 6
const char *default_directories[MAX_DEFAULT_DIRS + 1]; const char *default_directories[MAX_DEFAULT_DIRS + 1];
#ifdef __WIN__ #ifdef __WIN__
static const char *f_extensions[]= { ".ini", ".cnf", 0 }; static const char *f_extensions[]= { ".ini", ".cnf", 0 };
#define NEWLINE "\r\n" #define NEWLINE "\r\n"
static char system_dir[FN_REFLEN], shared_system_dir[FN_REFLEN]; static char system_dir[FN_REFLEN], shared_system_dir[FN_REFLEN],
config_dir[FN_REFLEN];
#else #else
static const char *f_extensions[]= { ".cnf", 0 }; static const char *f_extensions[]= { ".cnf", 0 };
#define NEWLINE "\n" #define NEWLINE "\n"
...@@ -286,8 +287,8 @@ int load_defaults(const char *conf_file, const char **groups, ...@@ -286,8 +287,8 @@ int load_defaults(const char *conf_file, const char **groups,
{ {
DYNAMIC_ARRAY args; DYNAMIC_ARRAY args;
TYPELIB group; TYPELIB group;
my_bool found_print_defaults=0; my_bool found_print_defaults= 0;
uint args_used=0; uint args_used= 0;
int error= 0; int error= 0;
MEM_ROOT alloc; MEM_ROOT alloc;
char *ptr,**res; char *ptr,**res;
...@@ -328,8 +329,8 @@ int load_defaults(const char *conf_file, const char **groups, ...@@ -328,8 +329,8 @@ int load_defaults(const char *conf_file, const char **groups,
ctx.args= &args; ctx.args= &args;
ctx.group= &group; ctx.group= &group;
if (*argc >= 2 + args_used && if (*argc >= 2 &&
is_prefix(argv[0][1+args_used], instance_option)) is_prefix(argv[0][1], instance_option))
{ {
args_used++; args_used++;
defaults_instance= argv[0][args_used]+sizeof(instance_option)-1; defaults_instance= argv[0][args_used]+sizeof(instance_option)-1;
...@@ -870,6 +871,45 @@ void print_defaults(const char *conf_file, const char **groups) ...@@ -870,6 +871,45 @@ void print_defaults(const char *conf_file, const char **groups)
#include <help_end.h> #include <help_end.h>
#ifdef __WIN__
/*
This wrapper for GetSystemWindowsDirectory() will dynamically bind to the
function if it is available, emulate it on NT4 Terminal Server by stripping
the \SYSTEM32 from the end of the results of GetSystemDirectory(), or just
return GetSystemDirectory().
*/
typedef UINT (WINAPI *GET_SYSTEM_WINDOWS_DIRECTORY)(LPSTR, UINT);
static uint my_get_system_windows_directory(char *buffer, uint size)
{
GET_SYSTEM_WINDOWS_DIRECTORY
func_ptr= (GET_SYSTEM_WINDOWS_DIRECTORY)
GetProcAddress(GetModuleHandle("kernel32.dll"),
"GetSystemWindowsDirectoryA");
if (func_ptr)
return func_ptr(buffer, size);
else
{
/*
Windows NT 4.0 Terminal Server Edition:
To retrieve the shared Windows directory, call GetSystemDirectory and
trim the "System32" element from the end of the returned path.
*/
UINT count= GetSystemDirectory(buffer, size);
if (count > 8 && stricmp(buffer+(count-8), "\\System32") == 0)
{
count-= 8;
buffer[count] = '\0';
}
return count;
}
}
#endif
/* /*
Create the list of default directories. Create the list of default directories.
...@@ -878,7 +918,8 @@ void print_defaults(const char *conf_file, const char **groups) ...@@ -878,7 +918,8 @@ void print_defaults(const char *conf_file, const char **groups)
2. GetWindowsDirectory() 2. GetWindowsDirectory()
3. GetSystemWindowsDirectory() 3. GetSystemWindowsDirectory()
4. getenv(DEFAULT_HOME_ENV) 4. getenv(DEFAULT_HOME_ENV)
5. "" 5. Direcotry above where the executable is located
6. ""
On Novell NetWare, this is: On Novell NetWare, this is:
1. sys:/etc/ 1. sys:/etc/
...@@ -909,13 +950,10 @@ static void init_default_directories() ...@@ -909,13 +950,10 @@ static void init_default_directories()
if (GetWindowsDirectory(system_dir,sizeof(system_dir))) if (GetWindowsDirectory(system_dir,sizeof(system_dir)))
*ptr++= (char*)&system_dir; *ptr++= (char*)&system_dir;
#if defined(_MSC_VER) && (_MSC_VER >= 1300) if (my_get_system_windows_directory(shared_system_dir,
/* Only VC7 and up */ sizeof(shared_system_dir)) &&
/* Only add shared system directory if different from default. */
if (GetSystemWindowsDirectory(shared_system_dir,sizeof(shared_system_dir)) &&
strcmp(system_dir, shared_system_dir)) strcmp(system_dir, shared_system_dir))
*ptr++= (char *)&shared_system_dir; *ptr++= (char *)&shared_system_dir;
#endif
#elif defined(__NETWARE__) #elif defined(__NETWARE__)
*ptr++= "sys:/etc/"; *ptr++= "sys:/etc/";
...@@ -931,6 +969,36 @@ static void init_default_directories() ...@@ -931,6 +969,36 @@ static void init_default_directories()
*ptr++= ""; /* Place for defaults_extra_file */ *ptr++= ""; /* Place for defaults_extra_file */
#if !defined(__WIN__) && !defined(__NETWARE__) #if !defined(__WIN__) && !defined(__NETWARE__)
*ptr++= "~/";; *ptr++= "~/";;
#elif defined(__WIN__)
if (GetModuleFileName(NULL, config_dir, sizeof(config_dir)))
{
char *last= NULL, *end= strend(config_dir);
/*
Look for the second-to-last \ in the filename, but hang on
to a pointer after the last \ in case we're in the root of
a drive.
*/
for ( ; end > config_dir; end--)
{
if (*end == FN_LIBCHAR)
{
if (last)
break;
last= end;
}
}
if (last)
{
if (end != config_dir && end[-1] == FN_DEVCHAR) /* Ended up with D:\ */
end[1]= 0; /* Keep one \ */
else if (end != config_dir)
end[0]= 0;
else
last[1]= 0;
}
*ptr++= (char *)&config_dir;
}
#endif #endif
*ptr= 0; /* end marker */ *ptr= 0; /* end marker */
} }
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "parse_file.h" #include "parse_file.h"
#include "sp.h" #include "sp.h"
#include "sp_head.h" #include "sp_head.h"
#include "sp_cache.h"
#define MD5_BUFF_LENGTH 33 #define MD5_BUFF_LENGTH 33
...@@ -141,6 +142,9 @@ bool mysql_create_view(THD *thd, ...@@ -141,6 +142,9 @@ bool mysql_create_view(THD *thd,
goto err; goto err;
} }
if (mode != VIEW_CREATE_NEW)
sp_cache_invalidate();
#ifndef NO_EMBEDDED_ACCESS_CHECKS #ifndef NO_EMBEDDED_ACCESS_CHECKS
/* /*
Privilege check for view creation: Privilege check for view creation:
......
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