mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
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
This commit is contained in:
@ -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);
|
|||||||
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;
|
|||||||
|
|
||||||
/* 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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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)
|
|||||||
#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)
|
|||||||
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()
|
|||||||
|
|
||||||
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()
|
|||||||
*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 @@
|
|||||||
#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,
|
|||||||
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:
|
||||||
|
Reference in New Issue
Block a user