mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
d10877ce8c
#9728 'Decreased functionality in "on duplicate key update #8147 'a column proclaimed ambigous in INSERT ... SELECT .. ON DUPLICATE' This ensures fields are uniquely qualified and also that one can't update other tables in the ON DUPLICATE KEY UPDATE part mysql-test/r/insert_select.result: More tests for bug #9728 and #8147 mysql-test/r/insert_update.result: Updated tests after changing how INSERT ... SELECT .. ON DUPLICATE KEY works mysql-test/t/insert_select.test: More tests for bug #9728 and #8147 mysql-test/t/insert_update.test: Updated tests after changing how INSERT ... SELECT .. ON DUPLICATE KEY works mysys/my_access.c: Cleanup (shorter loop variable names) sql/ha_ndbcluster.cc: Indentation fixes sql/item.cc: Remove item_flags sql/item.h: Remove item_flags sql/mysql_priv.h: New arguments to mysql_prepare_insert sql/sql_base.cc: Remove old fix for bug #8147 sql/sql_insert.cc: Extend mysql_prepare_insert() with new field list for tables that can be used in the values port of ON DUPLICATE KEY UPDATE sql/sql_parse.cc: Revert fix for #9728 Allow one to use other tables in ON DUPLICATE_KEY for INSERT ... SELECT if there is no GROUP BY clause sql/sql_prepare.cc: New arguments to mysql_prepare_insert sql/sql_yacc.yy: Revert bug fix for #9728
122 lines
3.1 KiB
C
122 lines
3.1 KiB
C
/* Copyright (C) 2000 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 "mysys_priv.h"
|
|
#include <m_string.h>
|
|
|
|
#ifdef __WIN__
|
|
|
|
/*
|
|
Check a file or path for accessability.
|
|
|
|
SYNOPSIS
|
|
file_access()
|
|
path Path to file
|
|
amode Access method
|
|
|
|
DESCRIPTION
|
|
This function wraps the normal access method because the access
|
|
available in MSVCRT> +reports that filenames such as LPT1 and
|
|
COM1 are valid (they are but should not be so for us).
|
|
|
|
RETURN VALUES
|
|
0 ok
|
|
-1 error (We use -1 as my_access is mapped to access on other platforms)
|
|
*/
|
|
|
|
int my_access(const char *path, int amode)
|
|
{
|
|
WIN32_FILE_ATTRIBUTE_DATA fileinfo;
|
|
BOOL result;
|
|
|
|
result= GetFileAttributesEx(path, GetFileExInfoStandard, &fileinfo);
|
|
if (! result ||
|
|
(fileinfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY) && (amode & F_OK))
|
|
{
|
|
my_errno= errno= EACCES;
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#endif /* __WIN__ */
|
|
|
|
#if defined(MSDOS) || defined(__WIN__) || defined(__EMX__)
|
|
|
|
/*
|
|
List of file names that causes problem on windows
|
|
|
|
NOTE that one can also not have file names of type CON.TXT
|
|
*/
|
|
|
|
static const char *reserved_names[]=
|
|
{
|
|
"CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6",
|
|
"COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6",
|
|
"LPT7", "LPT8", "LPT9", "CLOCK$",
|
|
NullS
|
|
};
|
|
|
|
#define MAX_RESERVED_NAME_LENGTH 6
|
|
|
|
/*
|
|
Check if a path will access a reserverd file name that may cause problems
|
|
|
|
SYNOPSIS
|
|
check_if_legal_filename
|
|
path Path to file
|
|
|
|
RETURN
|
|
0 ok
|
|
1 reserved file name
|
|
*/
|
|
|
|
int check_if_legal_filename(const char *path)
|
|
{
|
|
const char *end;
|
|
const char **reserved_name;
|
|
DBUG_ENTER("check_if_legal_filename");
|
|
|
|
path+= dirname_length(path); /* To start of filename */
|
|
if (!(end= strchr(path, FN_EXTCHAR)))
|
|
end= strend(path);
|
|
if (path == end || (uint) (end - path) > MAX_RESERVED_NAME_LENGTH)
|
|
DBUG_RETURN(0); /* Simplify inner loop */
|
|
|
|
for (reserved_name= reserved_names; *reserved_name; reserved_name++)
|
|
{
|
|
const char *reserved= *reserved_name; /* never empty */
|
|
const char *name= path;
|
|
|
|
do
|
|
{
|
|
if (*reserved != my_toupper(&my_charset_latin1, *name))
|
|
break;
|
|
if (++name == end)
|
|
DBUG_RETURN(1); /* Found wrong path */
|
|
} while (*++reserved);
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef OS2
|
|
int check_if_legal_filename(const char *path)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif /* OS2 */
|