mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
Merge quadxeon.mysql.com:/benchmarks/ext3/TOSAVE/tsmith/bk/50
into quadxeon.mysql.com:/benchmarks/ext3/TOSAVE/tsmith/bk/maint/50
This commit is contained in:
commit
168515a179
102 changed files with 3079 additions and 1081 deletions
|
@ -114,6 +114,10 @@ check_cpu () {
|
|||
*i386*i486*)
|
||||
cpu_arg="pentium-m";
|
||||
;;
|
||||
#Core 2 Duo
|
||||
*Intel*Core\(TM\)2*)
|
||||
cpu_arg="nocona";
|
||||
;;
|
||||
|
||||
# Intel ia64
|
||||
*Itanium*)
|
||||
|
|
|
@ -4,7 +4,7 @@ The MySQL AB Exception for Free/Libre and Open Source
|
|||
Software-only Applications Using MySQL Client Libraries (the
|
||||
"FLOSS Exception").
|
||||
|
||||
Version 0.5, 30 August 2006
|
||||
Version 0.6, 7 March 2007
|
||||
|
||||
Exception Intent
|
||||
|
||||
|
@ -59,10 +59,12 @@ Apache Software License 1.0/1.1/2.0
|
|||
Apple Public Source License 2.0
|
||||
Artistic license From Perl 5.8.0
|
||||
BSD license "July 22 1999"
|
||||
Common Development and Distribution License (CDDL) 1.0
|
||||
Common Public License 1.0
|
||||
Eclipse Public License 1.0
|
||||
GNU Library or "Lesser" General Public License (LGPL) 2.0/2.1
|
||||
Jabber Open Source License 1.0
|
||||
MIT license ---
|
||||
MIT license (As listed in file MIT-License.txt) ---
|
||||
Mozilla Public License (MPL) 1.0/1.1
|
||||
Open Software License 2.0
|
||||
OpenSSL license (with original SSLeay license) "2003" ("1998")
|
||||
|
|
|
@ -557,10 +557,6 @@ SOURCE=.\my_windac.c
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\my_winsem.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\my_winthread.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
|
|
@ -4323,49 +4323,6 @@
|
|||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="my_winsem.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Max|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="TLS_DEBUG|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="TLS|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="my_winthread.c">
|
||||
<FileConfiguration
|
||||
|
|
|
@ -538,10 +538,6 @@ SOURCE=.\my_wincond.c
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\my_winsem.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\my_winthread.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
|
|
@ -7,7 +7,7 @@ AC_INIT(sql/mysqld.cc)
|
|||
AC_CANONICAL_SYSTEM
|
||||
# The Docs Makefile.am parses this line!
|
||||
# remember to also change ndb version below and update version.c in ndb
|
||||
AM_INIT_AUTOMAKE(mysql, 5.0.38)
|
||||
AM_INIT_AUTOMAKE(mysql, 5.0.40)
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
|
||||
PROTOCOL_VERSION=10
|
||||
|
@ -23,7 +23,7 @@ NDB_SHARED_LIB_VERSION=$NDB_SHARED_LIB_MAJOR_VERSION:0:0
|
|||
# ndb version
|
||||
NDB_VERSION_MAJOR=5
|
||||
NDB_VERSION_MINOR=0
|
||||
NDB_VERSION_BUILD=38
|
||||
NDB_VERSION_BUILD=40
|
||||
NDB_VERSION_STATUS=""
|
||||
|
||||
# Set all version vars based on $VERSION. How do we do this more elegant ?
|
||||
|
@ -778,8 +778,9 @@ AC_CHECK_FUNC(bind, , AC_CHECK_LIB(bind, bind))
|
|||
# Check if crypt() exists in libc or libcrypt, sets LIBS if needed
|
||||
AC_SEARCH_LIBS(crypt, crypt, AC_DEFINE(HAVE_CRYPT, 1, [crypt]))
|
||||
|
||||
# For sem_xxx functions on Solaris 2.6
|
||||
AC_CHECK_FUNC(sem_init, , AC_CHECK_LIB(posix4, sem_init))
|
||||
# For the sched_yield() function on Solaris
|
||||
AC_CHECK_FUNC(sched_yield, , AC_CHECK_LIB(posix4, sched_yield))
|
||||
|
||||
MYSQL_CHECK_ZLIB_WITH_COMPRESS
|
||||
|
||||
# For large pages support
|
||||
|
|
|
@ -21,7 +21,7 @@ HEADERS_ABI = mysql.h mysql_com.h mysql_time.h \
|
|||
my_list.h my_alloc.h typelib.h
|
||||
pkginclude_HEADERS = $(HEADERS_ABI) my_dbug.h m_string.h my_sys.h \
|
||||
my_xml.h mysql_embed.h \
|
||||
my_semaphore.h my_pthread.h my_no_pthread.h raid.h \
|
||||
my_pthread.h my_no_pthread.h raid.h \
|
||||
errmsg.h my_global.h my_net.h \
|
||||
my_getopt.h sslopt-longopts.h my_dir.h \
|
||||
sslopt-vars.h sslopt-case.h sql_common.h keycache.h \
|
||||
|
|
|
@ -1,64 +0,0 @@
|
|||
/*
|
||||
* Module: semaphore.h
|
||||
*
|
||||
* Purpose:
|
||||
* Semaphores aren't actually part of the PThreads standard.
|
||||
* They are defined by the POSIX Standard:
|
||||
*
|
||||
* POSIX 1003.1b-1993 (POSIX.1b)
|
||||
*
|
||||
* Pthreads-win32 - POSIX Threads Library for Win32
|
||||
* Copyright (C) 1998
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
/* This is hacked by Monty to be included in mysys library */
|
||||
|
||||
#ifndef _my_semaphore_h_
|
||||
#define _my_semaphore_h_
|
||||
|
||||
#ifdef THREAD
|
||||
|
||||
C_MODE_START
|
||||
#ifdef HAVE_SEMAPHORE_H
|
||||
#include <semaphore.h>
|
||||
#elif !defined(__bsdi__)
|
||||
#ifdef __WIN__
|
||||
typedef HANDLE sem_t;
|
||||
#else
|
||||
typedef struct {
|
||||
pthread_mutex_t mutex;
|
||||
pthread_cond_t cond;
|
||||
uint count;
|
||||
} sem_t;
|
||||
#endif /* __WIN__ */
|
||||
|
||||
int sem_init(sem_t * sem, int pshared, unsigned int value);
|
||||
int sem_destroy(sem_t * sem);
|
||||
int sem_trywait(sem_t * sem);
|
||||
int sem_wait(sem_t * sem);
|
||||
int sem_post(sem_t * sem);
|
||||
int sem_post_multiple(sem_t * sem, unsigned int count);
|
||||
int sem_getvalue(sem_t * sem, unsigned int * sval);
|
||||
|
||||
#endif /* !__bsdi__ */
|
||||
|
||||
C_MODE_END
|
||||
|
||||
#endif /* THREAD */
|
||||
|
||||
#endif /* !_my_semaphore_h_ */
|
|
@ -157,6 +157,10 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
rec--;
|
||||
if (rec->type == (int) FIELD_SKIP_ZERO && rec->length == 1)
|
||||
{
|
||||
/*
|
||||
NOTE1: here we change a field type FIELD_SKIP_ZERO ->
|
||||
FIELD_NORMAL
|
||||
*/
|
||||
rec->type=(int) FIELD_NORMAL;
|
||||
packed--;
|
||||
min_pack_length++;
|
||||
|
|
|
@ -1199,7 +1199,7 @@ int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share, File file_to_dup __attr
|
|||
int mi_open_keyfile(MYISAM_SHARE *share)
|
||||
{
|
||||
if ((share->kfile=my_open(share->unique_file_name, share->mode | O_SHARE,
|
||||
MYF(MY_WME))) < 0)
|
||||
MYF(MY_WME))) < 0)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -184,6 +184,7 @@ int rtree_find_first(MI_INFO *info, uint keynr, uchar *key, uint key_length,
|
|||
/*
|
||||
Save searched key, include data pointer.
|
||||
The data pointer is required if the search_flag contains MBR_DATA.
|
||||
(minimum bounding rectangle)
|
||||
*/
|
||||
memcpy(info->first_mbr_key, key, keyinfo->keylength);
|
||||
info->last_rkey_length = key_length;
|
||||
|
@ -538,16 +539,19 @@ static int rtree_insert_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key,
|
|||
uint nod_flag;
|
||||
uchar *page_buf;
|
||||
int res;
|
||||
DBUG_ENTER("rtree_insert_req");
|
||||
|
||||
if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length +
|
||||
MI_MAX_KEY_BUFF)))
|
||||
{
|
||||
my_errno = HA_ERR_OUT_OF_MEM;
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
if (!_mi_fetch_keypage(info, keyinfo, page, DFLT_INIT_HITS, page_buf, 0))
|
||||
goto err1;
|
||||
nod_flag = mi_test_if_nod(page_buf);
|
||||
DBUG_PRINT("rtree", ("page: %lu level: %d ins_level: %d nod_flag: %u",
|
||||
(ulong) page, level, ins_level, nod_flag));
|
||||
|
||||
if ((ins_level == -1 && nod_flag) || /* key: go down to leaf */
|
||||
(ins_level > -1 && ins_level > level)) /* branch: go down to ins_level */
|
||||
|
@ -599,11 +603,11 @@ static int rtree_insert_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key,
|
|||
|
||||
ok:
|
||||
my_afree((byte*)page_buf);
|
||||
return res;
|
||||
DBUG_RETURN(res);
|
||||
|
||||
err1:
|
||||
my_afree((byte*)page_buf);
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
|
||||
|
||||
|
@ -623,18 +627,19 @@ static int rtree_insert_level(MI_INFO *info, uint keynr, uchar *key,
|
|||
MI_KEYDEF *keyinfo = info->s->keyinfo + keynr;
|
||||
int res;
|
||||
my_off_t new_page;
|
||||
|
||||
DBUG_ENTER("rtree_insert_level");
|
||||
|
||||
if ((old_root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR)
|
||||
{
|
||||
if ((old_root = _mi_new(info, keyinfo, DFLT_INIT_HITS)) == HA_OFFSET_ERROR)
|
||||
return -1;
|
||||
DBUG_RETURN(-1);
|
||||
info->buff_used = 1;
|
||||
mi_putint(info->buff, 2, 0);
|
||||
res = rtree_add_key(info, keyinfo, key, key_length, info->buff, NULL);
|
||||
if (_mi_write_keypage(info, keyinfo, old_root, DFLT_INIT_HITS, info->buff))
|
||||
return 1;
|
||||
DBUG_RETURN(1);
|
||||
info->s->state.key_root[keynr] = old_root;
|
||||
return res;
|
||||
DBUG_RETURN(res);
|
||||
}
|
||||
|
||||
switch ((res = rtree_insert_req(info, keyinfo, key, key_length,
|
||||
|
@ -651,11 +656,12 @@ static int rtree_insert_level(MI_INFO *info, uint keynr, uchar *key,
|
|||
uchar *new_key;
|
||||
uint nod_flag = info->s->base.key_reflength;
|
||||
|
||||
DBUG_PRINT("rtree", ("root was split, grow a new root"));
|
||||
if (!(new_root_buf = (uchar*)my_alloca((uint)keyinfo->block_length +
|
||||
MI_MAX_KEY_BUFF)))
|
||||
{
|
||||
my_errno = HA_ERR_OUT_OF_MEM;
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
|
||||
mi_putint(new_root_buf, 2, nod_flag);
|
||||
|
@ -681,12 +687,14 @@ static int rtree_insert_level(MI_INFO *info, uint keynr, uchar *key,
|
|||
DFLT_INIT_HITS, new_root_buf))
|
||||
goto err1;
|
||||
info->s->state.key_root[keynr] = new_root;
|
||||
DBUG_PRINT("rtree", ("new root page: %lu level: %d nod_flag: %u",
|
||||
(ulong) new_root, 0, mi_test_if_nod(new_root_buf)));
|
||||
|
||||
my_afree((byte*)new_root_buf);
|
||||
break;
|
||||
err1:
|
||||
my_afree((byte*)new_root_buf);
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
default:
|
||||
case -1: /* error */
|
||||
|
@ -694,7 +702,7 @@ err1:
|
|||
break;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
DBUG_RETURN(res);
|
||||
}
|
||||
|
||||
|
||||
|
@ -708,8 +716,10 @@ err1:
|
|||
|
||||
int rtree_insert(MI_INFO *info, uint keynr, uchar *key, uint key_length)
|
||||
{
|
||||
return (!key_length ||
|
||||
(rtree_insert_level(info, keynr, key, key_length, -1) == -1)) ? -1 : 0;
|
||||
DBUG_ENTER("rtree_insert");
|
||||
DBUG_RETURN((!key_length ||
|
||||
(rtree_insert_level(info, keynr, key, key_length, -1) == -1)) ?
|
||||
-1 : 0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -724,6 +734,8 @@ int rtree_insert(MI_INFO *info, uint keynr, uchar *key, uint key_length)
|
|||
static int rtree_fill_reinsert_list(stPageList *ReinsertList, my_off_t page,
|
||||
int level)
|
||||
{
|
||||
DBUG_ENTER("rtree_fill_reinsert_list");
|
||||
DBUG_PRINT("rtree", ("page: %lu level: %d", (ulong) page, level));
|
||||
if (ReinsertList->n_pages == ReinsertList->m_pages)
|
||||
{
|
||||
ReinsertList->m_pages += REINSERT_BUFFER_INC;
|
||||
|
@ -735,10 +747,10 @@ static int rtree_fill_reinsert_list(stPageList *ReinsertList, my_off_t page,
|
|||
ReinsertList->pages[ReinsertList->n_pages].offs = page;
|
||||
ReinsertList->pages[ReinsertList->n_pages].level = level;
|
||||
ReinsertList->n_pages++;
|
||||
return 0;
|
||||
DBUG_RETURN(0);
|
||||
|
||||
err1:
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
|
||||
|
||||
|
@ -762,15 +774,18 @@ static int rtree_delete_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key,
|
|||
uint nod_flag;
|
||||
uchar *page_buf;
|
||||
int res;
|
||||
DBUG_ENTER("rtree_delete_req");
|
||||
|
||||
if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length)))
|
||||
{
|
||||
my_errno = HA_ERR_OUT_OF_MEM;
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
if (!_mi_fetch_keypage(info, keyinfo, page, DFLT_INIT_HITS, page_buf, 0))
|
||||
goto err1;
|
||||
nod_flag = mi_test_if_nod(page_buf);
|
||||
DBUG_PRINT("rtree", ("page: %lu level: %d nod_flag: %u",
|
||||
(ulong) page, level, nod_flag));
|
||||
|
||||
k = rt_PAGE_FIRST_KEY(page_buf, nod_flag);
|
||||
last = rt_PAGE_END(page_buf);
|
||||
|
@ -791,6 +806,7 @@ static int rtree_delete_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key,
|
|||
if (*page_size + key_length >= rt_PAGE_MIN_SIZE(keyinfo->block_length))
|
||||
{
|
||||
/* OK */
|
||||
/* Calculate a new key value (MBR) for the shrinked block. */
|
||||
if (rtree_set_key_mbr(info, keyinfo, k, key_length,
|
||||
_mi_kpos(nod_flag, k)))
|
||||
goto err1;
|
||||
|
@ -800,10 +816,23 @@ static int rtree_delete_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key,
|
|||
}
|
||||
else
|
||||
{
|
||||
/* too small: delete key & add it descendant to reinsert list */
|
||||
/*
|
||||
Too small: delete key & add it descendant to reinsert list.
|
||||
Store position and level of the block so that it can be
|
||||
accessed later for inserting the remaining keys.
|
||||
*/
|
||||
DBUG_PRINT("rtree", ("too small. move block to reinsert list"));
|
||||
if (rtree_fill_reinsert_list(ReinsertList, _mi_kpos(nod_flag, k),
|
||||
level + 1))
|
||||
goto err1;
|
||||
/*
|
||||
Delete the key that references the block. This makes the
|
||||
block disappear from the index. Hence we need to insert
|
||||
its remaining keys later. Note: if the block is a branch
|
||||
block, we do not only remove this block, but the whole
|
||||
subtree. So we need to re-insert its keys on the same
|
||||
level later to reintegrate the subtrees.
|
||||
*/
|
||||
rtree_delete_key(info, page_buf, k, key_length, nod_flag);
|
||||
if (_mi_write_keypage(info, keyinfo, page,
|
||||
DFLT_INIT_HITS, page_buf))
|
||||
|
@ -863,11 +892,11 @@ static int rtree_delete_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key,
|
|||
|
||||
ok:
|
||||
my_afree((byte*)page_buf);
|
||||
return res;
|
||||
DBUG_RETURN(res);
|
||||
|
||||
err1:
|
||||
my_afree((byte*)page_buf);
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
|
||||
|
||||
|
@ -885,12 +914,15 @@ int rtree_delete(MI_INFO *info, uint keynr, uchar *key, uint key_length)
|
|||
stPageList ReinsertList;
|
||||
my_off_t old_root;
|
||||
MI_KEYDEF *keyinfo = info->s->keyinfo + keynr;
|
||||
DBUG_ENTER("rtree_delete");
|
||||
|
||||
if ((old_root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR)
|
||||
{
|
||||
my_errno= HA_ERR_END_OF_FILE;
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
DBUG_PRINT("rtree", ("starting deletion at root page: %lu",
|
||||
(ulong) old_root));
|
||||
|
||||
ReinsertList.pages = NULL;
|
||||
ReinsertList.n_pages = 0;
|
||||
|
@ -899,12 +931,12 @@ int rtree_delete(MI_INFO *info, uint keynr, uchar *key, uint key_length)
|
|||
switch (rtree_delete_req(info, keyinfo, key, key_length, old_root,
|
||||
&page_size, &ReinsertList, 0))
|
||||
{
|
||||
case 2:
|
||||
case 2: /* empty */
|
||||
{
|
||||
info->s->state.key_root[keynr] = HA_OFFSET_ERROR;
|
||||
return 0;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
case 0:
|
||||
case 0: /* deleted */
|
||||
{
|
||||
uint nod_flag;
|
||||
ulong i;
|
||||
|
@ -923,16 +955,34 @@ int rtree_delete(MI_INFO *info, uint keynr, uchar *key, uint key_length)
|
|||
DFLT_INIT_HITS, page_buf, 0))
|
||||
goto err1;
|
||||
nod_flag = mi_test_if_nod(page_buf);
|
||||
DBUG_PRINT("rtree", ("reinserting keys from "
|
||||
"page: %lu level: %d nod_flag: %u",
|
||||
(ulong) ReinsertList.pages[i].offs,
|
||||
ReinsertList.pages[i].level, nod_flag));
|
||||
|
||||
k = rt_PAGE_FIRST_KEY(page_buf, nod_flag);
|
||||
last = rt_PAGE_END(page_buf);
|
||||
for (; k < last; k = rt_PAGE_NEXT_KEY(k, key_length, nod_flag))
|
||||
{
|
||||
if (rtree_insert_level(info, keynr, k, key_length,
|
||||
ReinsertList.pages[i].level) == -1)
|
||||
int res;
|
||||
if ((res= rtree_insert_level(info, keynr, k, key_length,
|
||||
ReinsertList.pages[i].level)) == -1)
|
||||
{
|
||||
my_afree((byte*)page_buf);
|
||||
goto err1;
|
||||
}
|
||||
if (res)
|
||||
{
|
||||
ulong j;
|
||||
DBUG_PRINT("rtree", ("root has been split, adjust levels"));
|
||||
for (j= i; j < ReinsertList.n_pages; j++)
|
||||
{
|
||||
ReinsertList.pages[j].level++;
|
||||
DBUG_PRINT("rtree", ("keys from page: %lu now level: %d",
|
||||
(ulong) ReinsertList.pages[i].offs,
|
||||
ReinsertList.pages[i].level));
|
||||
}
|
||||
}
|
||||
}
|
||||
my_afree((byte*)page_buf);
|
||||
if (_mi_dispose(info, keyinfo, ReinsertList.pages[i].offs,
|
||||
|
@ -959,20 +1009,20 @@ int rtree_delete(MI_INFO *info, uint keynr, uchar *key, uint key_length)
|
|||
info->s->state.key_root[keynr] = new_root;
|
||||
}
|
||||
info->update= HA_STATE_DELETED;
|
||||
return 0;
|
||||
DBUG_RETURN(0);
|
||||
|
||||
err1:
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
case 1: /* not found */
|
||||
{
|
||||
my_errno = HA_ERR_KEY_NOT_FOUND;
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
default:
|
||||
case -1: /* error */
|
||||
{
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@ int rtree_add_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key,
|
|||
{
|
||||
uint page_size = mi_getint(page_buf);
|
||||
uint nod_flag = mi_test_if_nod(page_buf);
|
||||
DBUG_ENTER("rtree_add_key");
|
||||
|
||||
if (page_size + key_length + info->s->base.rec_reflength <=
|
||||
keyinfo->block_length)
|
||||
|
@ -42,22 +43,26 @@ int rtree_add_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key,
|
|||
if (nod_flag)
|
||||
{
|
||||
/* save key */
|
||||
DBUG_ASSERT(_mi_kpos(nod_flag, key) < info->state->key_file_length);
|
||||
memcpy(rt_PAGE_END(page_buf), key - nod_flag, key_length + nod_flag);
|
||||
page_size += key_length + nod_flag;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* save key */
|
||||
DBUG_ASSERT(_mi_dpos(info, nod_flag, key + key_length +
|
||||
info->s->base.rec_reflength) <
|
||||
info->state->data_file_length + info->s->base.pack_reclength);
|
||||
memcpy(rt_PAGE_END(page_buf), key, key_length +
|
||||
info->s->base.rec_reflength);
|
||||
page_size += key_length + info->s->base.rec_reflength;
|
||||
}
|
||||
mi_putint(page_buf, page_size, nod_flag);
|
||||
return 0;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
return (rtree_split_page(info, keyinfo, page_buf, key, key_length,
|
||||
new_page) ? -1 : 1);
|
||||
DBUG_RETURN((rtree_split_page(info, keyinfo, page_buf, key, key_length,
|
||||
new_page) ? -1 : 1));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -89,11 +94,13 @@ int rtree_delete_key(MI_INFO *info, uchar *page_buf, uchar *key,
|
|||
int rtree_set_key_mbr(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key,
|
||||
uint key_length, my_off_t child_page)
|
||||
{
|
||||
DBUG_ENTER("rtree_set_key_mbr");
|
||||
|
||||
if (!_mi_fetch_keypage(info, keyinfo, child_page,
|
||||
DFLT_INIT_HITS, info->buff, 0))
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
|
||||
return rtree_page_mbr(info, keyinfo->seg, info->buff, key, key_length);
|
||||
DBUG_RETURN(rtree_page_mbr(info, keyinfo->seg, info->buff, key, key_length));
|
||||
}
|
||||
|
||||
#endif /*HAVE_RTREE_KEYS*/
|
||||
|
|
|
@ -264,13 +264,15 @@ int rtree_split_page(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, uchar *key,
|
|||
uint full_length= key_length + (nod_flag ? nod_flag :
|
||||
info->s->base.rec_reflength);
|
||||
int max_keys= (mi_getint(page)-2) / (full_length);
|
||||
DBUG_ENTER("rtree_split_page");
|
||||
DBUG_PRINT("rtree", ("splitting block"));
|
||||
|
||||
n_dim = keyinfo->keysegs / 2;
|
||||
|
||||
if (!(coord_buf= (double*) my_alloca(n_dim * 2 * sizeof(double) *
|
||||
(max_keys + 1 + 4) +
|
||||
sizeof(SplitStruct) * (max_keys + 1))))
|
||||
return -1;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
|
||||
task= (SplitStruct *)(coord_buf + n_dim * 2 * (max_keys + 1 + 4));
|
||||
|
||||
|
@ -341,12 +343,13 @@ int rtree_split_page(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, uchar *key,
|
|||
else
|
||||
err_code= _mi_write_keypage(info, keyinfo, *new_page_offs,
|
||||
DFLT_INIT_HITS, new_page);
|
||||
DBUG_PRINT("rtree", ("split new block: %lu", (ulong) *new_page_offs));
|
||||
|
||||
my_afree((byte*)new_page);
|
||||
|
||||
split_err:
|
||||
my_afree((byte*) coord_buf);
|
||||
return err_code;
|
||||
DBUG_RETURN(err_code);
|
||||
}
|
||||
|
||||
#endif /*HAVE_RTREE_KEYS*/
|
||||
|
|
|
@ -826,3 +826,37 @@ create table t1 (t varchar(255) default null, key t (t(80)))
|
|||
engine=myisam default charset=latin1;
|
||||
alter table t1 change t t text;
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (a varchar(500));
|
||||
ALTER TABLE t1 ADD b GEOMETRY NOT NULL, ADD SPATIAL INDEX(b);
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` varchar(500) default NULL,
|
||||
`b` geometry NOT NULL,
|
||||
SPATIAL KEY `b` (`b`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
ALTER TABLE t1 ADD KEY(b(50));
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` varchar(500) default NULL,
|
||||
`b` geometry NOT NULL,
|
||||
SPATIAL KEY `b` (`b`),
|
||||
KEY `b_2` (`b`(50))
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
ALTER TABLE t1 ADD c POINT;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` varchar(500) default NULL,
|
||||
`b` geometry NOT NULL,
|
||||
`c` point default NULL,
|
||||
SPATIAL KEY `b` (`b`),
|
||||
KEY `b_2` (`b`(50))
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
CREATE TABLE t2 (a INT, KEY (a(20)));
|
||||
ERROR HY000: Incorrect sub part key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique sub keys
|
||||
ALTER TABLE t1 ADD d INT;
|
||||
ALTER TABLE t1 ADD KEY (d(20));
|
||||
ERROR HY000: Incorrect sub part key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique sub keys
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -243,3 +243,10 @@ SET @@session.auto_increment_offset=
|
|||
@bug20830_old_session_auto_increment_offset;
|
||||
SET @@session.auto_increment_increment=
|
||||
@bug20830_old_session_auto_increment_increment;
|
||||
CREATE TABLE t1(a BIT);
|
||||
INSERT DELAYED INTO t1 VALUES(1);
|
||||
FLUSH TABLE t1;
|
||||
SELECT HEX(a) FROM t1;
|
||||
HEX(a)
|
||||
1
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -57,3 +57,33 @@ select 3 into @v1;
|
|||
explain select 3 into @v1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
create table t1(f1 int, f2 int);
|
||||
insert into t1 values (1,1);
|
||||
create view v1 as select * from t1 where f1=1;
|
||||
explain extended select * from v1 where f2=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 1
|
||||
Warnings:
|
||||
Note 1003 select '1' AS `f1`,'1' AS `f2` from `test`.`t1` where 1
|
||||
explain extended select * from t1 where 0;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`f1` AS `f1`,`test`.`t1`.`f2` AS `f2` from `test`.`t1` where 0
|
||||
explain extended select * from t1 where 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 1
|
||||
Warnings:
|
||||
Note 1003 select '1' AS `f1`,'1' AS `f2` from `test`.`t1` where 1
|
||||
explain extended select * from t1 having 0;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible HAVING
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`f1` AS `f1`,`test`.`t1`.`f2` AS `f2` from `test`.`t1` having 0
|
||||
explain extended select * from t1 having 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 1
|
||||
Warnings:
|
||||
Note 1003 select '1' AS `f1`,'1' AS `f2` from `test`.`t1` having 1
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
|
|
|
@ -8,7 +8,7 @@ explain extended select default(str), default(strnull), default(intg), default(r
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 1
|
||||
Warnings:
|
||||
Note 1003 select default(`test`.`t1`.`str`) AS `default(str)`,default(`test`.`t1`.`strnull`) AS `default(strnull)`,default(`test`.`t1`.`intg`) AS `default(intg)`,default(`test`.`t1`.`rel`) AS `default(rel)` from `test`.`t1`
|
||||
Note 1003 select default('') AS `default(str)`,default('') AS `default(strnull)`,default('0') AS `default(intg)`,default('0') AS `default(rel)` from `test`.`t1`
|
||||
select * from t1 where str <> default(str);
|
||||
str strnull intg rel
|
||||
0 0
|
||||
|
|
|
@ -398,4 +398,76 @@ WHERE t3.a=t1.a AND t3.a=t2.a;
|
|||
3
|
||||
3
|
||||
DROP TABLE t1,t2,t3,t4;
|
||||
CREATE TABLE t1(a BIGINT UNSIGNED);
|
||||
INSERT INTO t1 VALUES (0xFFFFFFFFFFFFFFFF);
|
||||
SELECT * FROM t1 WHERE a=-1 OR a=-2 ;
|
||||
a
|
||||
SELECT * FROM t1 WHERE a IN (-1, -2);
|
||||
a
|
||||
CREATE TABLE t2 (a BIGINT UNSIGNED);
|
||||
insert into t2 values(13491727406643098568),
|
||||
(0x7fffffefffffffff),
|
||||
(0x7ffffffeffffffff),
|
||||
(0x7fffffffefffffff),
|
||||
(0x7ffffffffeffffff),
|
||||
(0x7fffffffffefffff),
|
||||
(0x7ffffffffffeffff),
|
||||
(0x7fffffffffffefff),
|
||||
(0x7ffffffffffffeff),
|
||||
(0x7fffffffffffffef),
|
||||
(0x7ffffffffffffffe),
|
||||
(0x7fffffffffffffff),
|
||||
(0x8000000000000000),
|
||||
(0x8000000000000001),
|
||||
(0x8000000000000002),
|
||||
(0x8000000000000300),
|
||||
(0x8000000000000400),
|
||||
(0x8000000000000401),
|
||||
(0x8000000000004001),
|
||||
(0x8000000000040001),
|
||||
(0x8000000000400001),
|
||||
(0x8000000004000001),
|
||||
(0x8000000040000001),
|
||||
(0x8000000400000001),
|
||||
(0x8000004000000001),
|
||||
(0x8000040000000001);
|
||||
SELECT HEX(a) FROM t2 WHERE a IN (0xBB3C3E98175D33C8, 42);
|
||||
HEX(a)
|
||||
BB3C3E98175D33C8
|
||||
SELECT HEX(a) FROM t2 WHERE a IN
|
||||
(0xBB3C3E98175D33C8,
|
||||
0x7fffffffffffffff,
|
||||
0x8000000000000000,
|
||||
0x8000000000000400,
|
||||
0x8000000000000401,
|
||||
42);
|
||||
HEX(a)
|
||||
BB3C3E98175D33C8
|
||||
7FFFFFFFFFFFFFFF
|
||||
8000000000000000
|
||||
8000000000000400
|
||||
8000000000000401
|
||||
SELECT HEX(a) FROM t2 WHERE a IN (0x7fffffffffffffff,0x8000000000000001);
|
||||
HEX(a)
|
||||
7FFFFFFFFFFFFFFF
|
||||
8000000000000001
|
||||
SELECT HEX(a) FROM t2 WHERE a IN (0x7ffffffffffffffe,0x7fffffffffffffff);
|
||||
HEX(a)
|
||||
7FFFFFFFFFFFFFFE
|
||||
7FFFFFFFFFFFFFFF
|
||||
SELECT HEX(a) FROM t2 WHERE a IN (0x7ffffffffffffffe,0x7fffffffffffffff,'abc');
|
||||
HEX(a)
|
||||
7FFFFFFFFFFFFFFE
|
||||
7FFFFFFFFFFFFFFF
|
||||
CREATE TABLE t3 (a BIGINT UNSIGNED);
|
||||
INSERT INTO t3 VALUES (9223372036854775551);
|
||||
SELECT HEX(a) FROM t3 WHERE a IN (9223372036854775807, 42);
|
||||
HEX(a)
|
||||
CREATE TABLE t4 (a DATE);
|
||||
INSERT INTO t4 VALUES ('1972-02-06'), ('1972-07-29');
|
||||
SELECT * FROM t4 WHERE a IN ('1972-02-06','19772-07-29');
|
||||
a
|
||||
Warnings:
|
||||
Warning 1292 Incorrect date value: '19772-07-29' for column 'a' at row 1
|
||||
DROP TABLE t1,t2,t3,t4;
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -40,7 +40,7 @@ explain extended select * from t1 where xxx regexp('is a test of some long text
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 1
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`xxx` AS `xxx` from `test`.`t1` where (`test`.`t1`.`xxx` regexp _latin1'is a test of some long text to')
|
||||
Note 1003 select 'this is a test of some long text to see what happens' AS `xxx` from `test`.`t1` where ('this is a test of some long text to see what happens' regexp _latin1'is a test of some long text to')
|
||||
select * from t1 where xxx regexp('is a test of some long text to ');
|
||||
xxx
|
||||
this is a test of some long text to see what happens
|
||||
|
|
|
@ -1089,12 +1089,12 @@ explain extended select encode(f1,'zxcv') as 'enc' from t1;
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 0 const row not found
|
||||
Warnings:
|
||||
Note 1003 select encode(`test`.`t1`.`f1`,'zxcv') AS `enc` from `test`.`t1`
|
||||
Note 1003 select encode('','zxcv') AS `enc` from `test`.`t1`
|
||||
explain extended select decode(f1,'zxcv') as 'enc' from t1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 0 const row not found
|
||||
Warnings:
|
||||
Note 1003 select decode(`test`.`t1`.`f1`,'zxcv') AS `enc` from `test`.`t1`
|
||||
Note 1003 select decode('','zxcv') AS `enc` from `test`.`t1`
|
||||
drop table t1;
|
||||
End of 4.1 tests
|
||||
create table t1 (d decimal default null);
|
||||
|
@ -1158,7 +1158,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 SIMPLE t2 const PRIMARY PRIMARY 12 const 1 Using index
|
||||
1 SIMPLE t1 ref code code 13 const 3 Using where; Using index
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`code` AS `code`,`test`.`t2`.`id` AS `id` from `test`.`t1` join `test`.`t2` where ((`test`.`t1`.`code` = _latin1'a12') and (length(`test`.`t1`.`code`) = 5))
|
||||
Note 1003 select `test`.`t1`.`code` AS `code`,'a12' AS `id` from `test`.`t1` join `test`.`t2` where ((`test`.`t1`.`code` = _latin1'a12') and (length(`test`.`t1`.`code`) = 5))
|
||||
DROP TABLE t1,t2;
|
||||
select locate('he','hello',-2);
|
||||
locate('he','hello',-2)
|
||||
|
@ -1940,6 +1940,17 @@ abcxx
|
|||
select lpad('abc', cast(5 as unsigned integer), 'x');
|
||||
lpad('abc', cast(5 as unsigned integer), 'x')
|
||||
xxabc
|
||||
create table t1(f1 longtext);
|
||||
insert into t1 values ("123"),("456");
|
||||
select substring(f1,1,1) from t1 group by 1;
|
||||
substring(f1,1,1)
|
||||
1
|
||||
4
|
||||
create table t2(f1 varchar(3));
|
||||
insert into t1 values ("123"),("456");
|
||||
select substring(f1,4,1), substring(f1,-4,1) from t2;
|
||||
substring(f1,4,1) substring(f1,-4,1)
|
||||
drop table t1,t2;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE `t1` (
|
||||
`id` varchar(20) NOT NULL,
|
||||
|
@ -1954,4 +1965,22 @@ A B tire
|
|||
# # 1
|
||||
## ## 2
|
||||
DROP TABLE t1;
|
||||
SELECT UNHEX('G');
|
||||
UNHEX('G')
|
||||
NULL
|
||||
SELECT UNHEX('G') IS NULL;
|
||||
UNHEX('G') IS NULL
|
||||
1
|
||||
SELECT INSERT('abc', 3, 3, '1234');
|
||||
INSERT('abc', 3, 3, '1234')
|
||||
ab1234
|
||||
SELECT INSERT('abc', 4, 3, '1234');
|
||||
INSERT('abc', 4, 3, '1234')
|
||||
abc1234
|
||||
SELECT INSERT('abc', 5, 3, '1234');
|
||||
INSERT('abc', 5, 3, '1234')
|
||||
abc
|
||||
SELECT INSERT('abc', 6, 3, '1234');
|
||||
INSERT('abc', 6, 3, '1234')
|
||||
abc
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -79,7 +79,7 @@ explain extended select * from t1 where 1 xor 1;
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1`
|
||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where 0
|
||||
select - a from t1;
|
||||
- a
|
||||
-1
|
||||
|
@ -87,7 +87,7 @@ explain extended select - a from t1;
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 1
|
||||
Warnings:
|
||||
Note 1003 select -(`test`.`t1`.`a`) AS `- a` from `test`.`t1`
|
||||
Note 1003 select -('1') AS `- a` from `test`.`t1`
|
||||
drop table t1;
|
||||
select 5 between 0 and 10 between 0 and 1,(5 between 0 and 10) between 0 and 1;
|
||||
5 between 0 and 10 between 0 and 1 (5 between 0 and 10) between 0 and 1
|
||||
|
|
|
@ -10,7 +10,7 @@ t1 CREATE TABLE `t1` (
|
|||
`fid` int(11) NOT NULL auto_increment,
|
||||
`g` geometry NOT NULL,
|
||||
PRIMARY KEY (`fid`),
|
||||
SPATIAL KEY `g` (`g`(32))
|
||||
SPATIAL KEY `g` (`g`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(150 150, 150 150)'));
|
||||
INSERT INTO t1 (g) VALUES (GeomFromText('LineString(149 149, 151 151)'));
|
||||
|
@ -293,7 +293,7 @@ t2 CREATE TABLE `t2` (
|
|||
`fid` int(11) NOT NULL auto_increment,
|
||||
`g` geometry NOT NULL,
|
||||
PRIMARY KEY (`fid`),
|
||||
SPATIAL KEY `g` (`g`(32))
|
||||
SPATIAL KEY `g` (`g`)
|
||||
) ENGINE=MyISAM AUTO_INCREMENT=101 DEFAULT CHARSET=latin1
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
|
@ -873,6 +873,558 @@ SELECT 1 FROM t1 WHERE foo != PointFromWKB(POINT(0,0));
|
|||
1
|
||||
1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (id bigint(12) unsigned NOT NULL auto_increment,
|
||||
c2 varchar(15) collate utf8_bin default NULL,
|
||||
c1 varchar(15) collate utf8_bin default NULL,
|
||||
c3 varchar(10) collate utf8_bin default NULL,
|
||||
spatial_point point NOT NULL,
|
||||
PRIMARY KEY(id),
|
||||
SPATIAL KEY (spatial_point(32))
|
||||
)ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
|
||||
INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES
|
||||
('y', 's', 'j', GeomFromText('POINT(167 74)')),
|
||||
('r', 'n', 'd', GeomFromText('POINT(215 118)')),
|
||||
('g', 'n', 'e', GeomFromText('POINT(203 98)')),
|
||||
('h', 'd', 'd', GeomFromText('POINT(54 193)')),
|
||||
('r', 'x', 'y', GeomFromText('POINT(47 69)')),
|
||||
('t', 'q', 'r', GeomFromText('POINT(109 42)')),
|
||||
('a', 'z', 'd', GeomFromText('POINT(0 154)')),
|
||||
('x', 'v', 'o', GeomFromText('POINT(174 131)')),
|
||||
('b', 'r', 'a', GeomFromText('POINT(114 253)')),
|
||||
('x', 'z', 'i', GeomFromText('POINT(163 21)')),
|
||||
('w', 'p', 'i', GeomFromText('POINT(42 102)')),
|
||||
('g', 'j', 'j', GeomFromText('POINT(170 133)')),
|
||||
('m', 'g', 'n', GeomFromText('POINT(28 22)')),
|
||||
('b', 'z', 'h', GeomFromText('POINT(174 28)')),
|
||||
('q', 'k', 'f', GeomFromText('POINT(233 73)')),
|
||||
('w', 'w', 'a', GeomFromText('POINT(124 200)')),
|
||||
('t', 'j', 'w', GeomFromText('POINT(252 101)')),
|
||||
('d', 'r', 'd', GeomFromText('POINT(98 18)')),
|
||||
('w', 'o', 'y', GeomFromText('POINT(165 31)')),
|
||||
('y', 'h', 't', GeomFromText('POINT(14 220)')),
|
||||
('d', 'p', 'u', GeomFromText('POINT(223 196)')),
|
||||
('g', 'y', 'g', GeomFromText('POINT(207 96)')),
|
||||
('x', 'm', 'n', GeomFromText('POINT(214 3)')),
|
||||
('g', 'v', 'e', GeomFromText('POINT(140 205)')),
|
||||
('g', 'm', 'm', GeomFromText('POINT(10 236)')),
|
||||
('i', 'r', 'j', GeomFromText('POINT(137 228)')),
|
||||
('w', 's', 'p', GeomFromText('POINT(115 6)')),
|
||||
('o', 'n', 'k', GeomFromText('POINT(158 129)')),
|
||||
('j', 'h', 'l', GeomFromText('POINT(129 72)')),
|
||||
('f', 'x', 'l', GeomFromText('POINT(139 207)')),
|
||||
('u', 'd', 'n', GeomFromText('POINT(125 109)')),
|
||||
('b', 'a', 'z', GeomFromText('POINT(30 32)')),
|
||||
('m', 'h', 'o', GeomFromText('POINT(251 251)')),
|
||||
('f', 'r', 'd', GeomFromText('POINT(243 211)')),
|
||||
('b', 'd', 'r', GeomFromText('POINT(232 80)')),
|
||||
('g', 'k', 'v', GeomFromText('POINT(15 100)')),
|
||||
('i', 'f', 'c', GeomFromText('POINT(109 66)')),
|
||||
('r', 't', 'j', GeomFromText('POINT(178 6)')),
|
||||
('y', 'n', 'f', GeomFromText('POINT(233 211)')),
|
||||
('f', 'y', 'm', GeomFromText('POINT(99 16)')),
|
||||
('z', 'q', 'l', GeomFromText('POINT(39 49)')),
|
||||
('j', 'c', 'r', GeomFromText('POINT(75 187)')),
|
||||
('c', 'y', 'y', GeomFromText('POINT(246 253)')),
|
||||
('w', 'u', 'd', GeomFromText('POINT(56 190)')),
|
||||
('n', 'q', 'm', GeomFromText('POINT(73 149)')),
|
||||
('d', 'y', 'a', GeomFromText('POINT(134 6)')),
|
||||
('z', 's', 'w', GeomFromText('POINT(216 225)')),
|
||||
('d', 'u', 'k', GeomFromText('POINT(132 70)')),
|
||||
('f', 'v', 't', GeomFromText('POINT(187 141)')),
|
||||
('r', 'r', 'a', GeomFromText('POINT(152 39)')),
|
||||
('y', 'p', 'o', GeomFromText('POINT(45 27)')),
|
||||
('p', 'n', 'm', GeomFromText('POINT(228 148)')),
|
||||
('e', 'g', 'e', GeomFromText('POINT(88 81)')),
|
||||
('m', 'a', 'h', GeomFromText('POINT(35 29)')),
|
||||
('m', 'h', 'f', GeomFromText('POINT(30 71)')),
|
||||
('h', 'k', 'i', GeomFromText('POINT(244 78)')),
|
||||
('z', 'v', 'd', GeomFromText('POINT(241 38)')),
|
||||
('q', 'l', 'j', GeomFromText('POINT(13 71)')),
|
||||
('s', 'p', 'g', GeomFromText('POINT(108 38)')),
|
||||
('q', 's', 'j', GeomFromText('POINT(92 101)')),
|
||||
('l', 'h', 'g', GeomFromText('POINT(120 78)')),
|
||||
('w', 't', 'b', GeomFromText('POINT(193 109)')),
|
||||
('b', 's', 's', GeomFromText('POINT(223 211)')),
|
||||
('w', 'w', 'y', GeomFromText('POINT(122 42)')),
|
||||
('q', 'c', 'c', GeomFromText('POINT(104 102)')),
|
||||
('w', 'g', 'n', GeomFromText('POINT(213 120)')),
|
||||
('p', 'q', 'a', GeomFromText('POINT(247 148)')),
|
||||
('c', 'z', 'e', GeomFromText('POINT(18 106)')),
|
||||
('z', 'u', 'n', GeomFromText('POINT(70 133)')),
|
||||
('j', 'n', 'x', GeomFromText('POINT(232 13)')),
|
||||
('e', 'h', 'f', GeomFromText('POINT(22 135)')),
|
||||
('w', 'l', 'f', GeomFromText('POINT(9 180)')),
|
||||
('a', 'v', 'q', GeomFromText('POINT(163 228)')),
|
||||
('i', 'z', 'o', GeomFromText('POINT(180 100)')),
|
||||
('e', 'c', 'l', GeomFromText('POINT(182 231)')),
|
||||
('c', 'k', 'o', GeomFromText('POINT(19 60)')),
|
||||
('q', 'f', 'p', GeomFromText('POINT(79 95)')),
|
||||
('m', 'd', 'r', GeomFromText('POINT(3 127)')),
|
||||
('m', 'e', 't', GeomFromText('POINT(136 154)')),
|
||||
('w', 'w', 'w', GeomFromText('POINT(102 15)')),
|
||||
('l', 'n', 'q', GeomFromText('POINT(71 196)')),
|
||||
('p', 'k', 'c', GeomFromText('POINT(47 139)')),
|
||||
('j', 'o', 'r', GeomFromText('POINT(177 128)')),
|
||||
('j', 'q', 'a', GeomFromText('POINT(170 6)')),
|
||||
('b', 'a', 'o', GeomFromText('POINT(63 211)')),
|
||||
('g', 's', 'o', GeomFromText('POINT(144 251)')),
|
||||
('w', 'u', 'w', GeomFromText('POINT(221 214)')),
|
||||
('g', 'a', 'm', GeomFromText('POINT(14 102)')),
|
||||
('u', 'q', 'z', GeomFromText('POINT(86 200)')),
|
||||
('k', 'a', 'm', GeomFromText('POINT(144 222)')),
|
||||
('j', 'u', 'r', GeomFromText('POINT(216 142)')),
|
||||
('q', 'k', 'v', GeomFromText('POINT(121 236)')),
|
||||
('p', 'o', 'r', GeomFromText('POINT(108 102)')),
|
||||
('b', 'd', 'x', GeomFromText('POINT(127 198)')),
|
||||
('k', 's', 'a', GeomFromText('POINT(2 150)')),
|
||||
('f', 'm', 'f', GeomFromText('POINT(160 191)')),
|
||||
('q', 'y', 'x', GeomFromText('POINT(98 111)')),
|
||||
('o', 'f', 'm', GeomFromText('POINT(232 218)')),
|
||||
('c', 'w', 'j', GeomFromText('POINT(156 165)')),
|
||||
('s', 'q', 'v', GeomFromText('POINT(98 161)'));
|
||||
SET @@RAND_SEED1=692635050, @@RAND_SEED2=297339954;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=159925977, @@RAND_SEED2=942570618;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=328169745, @@RAND_SEED2=410451954;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=178507359, @@RAND_SEED2=332493072;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=1034033013, @@RAND_SEED2=558966507;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(230 9)') where c1 like 'y%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(95 35)') where c1 like 'j%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(93 99)') where c1 like 'a%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(19 81)') where c1 like 'r%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(20 177)') where c1 like 'h%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(221 193)') where c1 like 'u%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(195 205)') where c1 like 'd%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(15 213)') where c1 like 'u%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(214 63)') where c1 like 'n%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(243 171)') where c1 like 'c%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(198 82)') where c1 like 'y%';
|
||||
INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES
|
||||
('f', 'y', 'p', GeomFromText('POINT(109 235)')),
|
||||
('b', 'e', 'v', GeomFromText('POINT(20 48)')),
|
||||
('i', 'u', 'f', GeomFromText('POINT(15 55)')),
|
||||
('o', 'r', 'z', GeomFromText('POINT(105 64)')),
|
||||
('a', 'p', 'a', GeomFromText('POINT(142 236)')),
|
||||
('g', 'i', 'k', GeomFromText('POINT(10 49)')),
|
||||
('x', 'z', 'x', GeomFromText('POINT(192 200)')),
|
||||
('c', 'v', 'r', GeomFromText('POINT(94 168)')),
|
||||
('y', 'z', 'e', GeomFromText('POINT(141 51)')),
|
||||
('h', 'm', 'd', GeomFromText('POINT(35 251)')),
|
||||
('v', 'm', 'q', GeomFromText('POINT(44 90)')),
|
||||
('j', 'l', 'z', GeomFromText('POINT(67 237)')),
|
||||
('i', 'v', 'a', GeomFromText('POINT(75 14)')),
|
||||
('b', 'q', 't', GeomFromText('POINT(153 33)')),
|
||||
('e', 'm', 'a', GeomFromText('POINT(247 49)')),
|
||||
('l', 'y', 'g', GeomFromText('POINT(56 203)')),
|
||||
('v', 'o', 'r', GeomFromText('POINT(90 54)')),
|
||||
('r', 'n', 'd', GeomFromText('POINT(135 83)')),
|
||||
('j', 't', 'u', GeomFromText('POINT(174 239)')),
|
||||
('u', 'n', 'g', GeomFromText('POINT(104 191)')),
|
||||
('p', 'q', 'y', GeomFromText('POINT(63 171)')),
|
||||
('o', 'q', 'p', GeomFromText('POINT(192 103)')),
|
||||
('f', 'x', 'e', GeomFromText('POINT(244 30)')),
|
||||
('n', 'x', 'c', GeomFromText('POINT(92 103)')),
|
||||
('r', 'q', 'z', GeomFromText('POINT(166 20)')),
|
||||
('s', 'a', 'j', GeomFromText('POINT(137 205)')),
|
||||
('z', 't', 't', GeomFromText('POINT(99 134)')),
|
||||
('o', 'm', 'j', GeomFromText('POINT(217 3)')),
|
||||
('n', 'h', 'j', GeomFromText('POINT(211 17)')),
|
||||
('v', 'v', 'a', GeomFromText('POINT(41 137)')),
|
||||
('q', 'o', 'j', GeomFromText('POINT(5 92)')),
|
||||
('z', 'y', 'e', GeomFromText('POINT(175 212)')),
|
||||
('j', 'z', 'h', GeomFromText('POINT(224 194)')),
|
||||
('a', 'g', 'm', GeomFromText('POINT(31 119)')),
|
||||
('p', 'c', 'f', GeomFromText('POINT(17 221)')),
|
||||
('t', 'h', 'k', GeomFromText('POINT(26 203)')),
|
||||
('u', 'w', 'p', GeomFromText('POINT(47 185)')),
|
||||
('z', 'a', 'c', GeomFromText('POINT(61 133)')),
|
||||
('u', 'k', 'a', GeomFromText('POINT(210 115)')),
|
||||
('k', 'f', 'h', GeomFromText('POINT(125 113)')),
|
||||
('t', 'v', 'y', GeomFromText('POINT(12 239)')),
|
||||
('u', 'v', 'd', GeomFromText('POINT(90 24)')),
|
||||
('m', 'y', 'w', GeomFromText('POINT(25 243)')),
|
||||
('d', 'n', 'g', GeomFromText('POINT(122 92)')),
|
||||
('z', 'm', 'f', GeomFromText('POINT(235 110)')),
|
||||
('q', 'd', 'f', GeomFromText('POINT(233 217)')),
|
||||
('a', 'v', 'u', GeomFromText('POINT(69 59)')),
|
||||
('x', 'k', 'p', GeomFromText('POINT(240 14)')),
|
||||
('i', 'v', 'r', GeomFromText('POINT(154 42)')),
|
||||
('w', 'h', 'l', GeomFromText('POINT(178 156)')),
|
||||
('d', 'h', 'n', GeomFromText('POINT(65 157)')),
|
||||
('c', 'k', 'z', GeomFromText('POINT(62 33)')),
|
||||
('e', 'l', 'w', GeomFromText('POINT(162 1)')),
|
||||
('r', 'f', 'i', GeomFromText('POINT(127 71)')),
|
||||
('q', 'm', 'c', GeomFromText('POINT(63 118)')),
|
||||
('c', 'h', 'u', GeomFromText('POINT(205 203)')),
|
||||
('d', 't', 'p', GeomFromText('POINT(234 87)')),
|
||||
('s', 'g', 'h', GeomFromText('POINT(149 34)')),
|
||||
('o', 'b', 'q', GeomFromText('POINT(159 179)')),
|
||||
('k', 'u', 'f', GeomFromText('POINT(202 254)')),
|
||||
('u', 'f', 'g', GeomFromText('POINT(70 15)')),
|
||||
('x', 's', 'b', GeomFromText('POINT(25 181)')),
|
||||
('s', 'c', 'g', GeomFromText('POINT(252 17)')),
|
||||
('a', 'c', 'f', GeomFromText('POINT(89 67)')),
|
||||
('r', 'e', 'q', GeomFromText('POINT(55 54)')),
|
||||
('f', 'i', 'k', GeomFromText('POINT(178 230)')),
|
||||
('p', 'e', 'l', GeomFromText('POINT(198 28)')),
|
||||
('w', 'o', 'd', GeomFromText('POINT(204 189)')),
|
||||
('c', 'a', 'g', GeomFromText('POINT(230 178)')),
|
||||
('r', 'o', 'e', GeomFromText('POINT(61 116)')),
|
||||
('w', 'a', 'a', GeomFromText('POINT(178 237)')),
|
||||
('v', 'd', 'e', GeomFromText('POINT(70 85)')),
|
||||
('k', 'c', 'e', GeomFromText('POINT(147 118)')),
|
||||
('d', 'q', 't', GeomFromText('POINT(218 77)')),
|
||||
('k', 'g', 'f', GeomFromText('POINT(192 113)')),
|
||||
('w', 'n', 'e', GeomFromText('POINT(92 124)')),
|
||||
('r', 'm', 'q', GeomFromText('POINT(130 65)')),
|
||||
('o', 'r', 'r', GeomFromText('POINT(174 233)')),
|
||||
('k', 'n', 't', GeomFromText('POINT(175 147)')),
|
||||
('q', 'm', 'r', GeomFromText('POINT(18 208)')),
|
||||
('l', 'd', 'i', GeomFromText('POINT(13 104)')),
|
||||
('w', 'o', 'y', GeomFromText('POINT(207 39)')),
|
||||
('p', 'u', 'o', GeomFromText('POINT(114 31)')),
|
||||
('y', 'a', 'p', GeomFromText('POINT(106 59)')),
|
||||
('a', 'x', 'z', GeomFromText('POINT(17 57)')),
|
||||
('v', 'h', 'x', GeomFromText('POINT(170 13)')),
|
||||
('t', 's', 'u', GeomFromText('POINT(84 18)')),
|
||||
('z', 'z', 'f', GeomFromText('POINT(250 197)')),
|
||||
('l', 'z', 't', GeomFromText('POINT(59 80)')),
|
||||
('j', 'g', 's', GeomFromText('POINT(54 26)')),
|
||||
('g', 'v', 'm', GeomFromText('POINT(89 98)')),
|
||||
('q', 'v', 'b', GeomFromText('POINT(39 240)')),
|
||||
('x', 'k', 'v', GeomFromText('POINT(246 207)')),
|
||||
('k', 'u', 'i', GeomFromText('POINT(105 111)')),
|
||||
('w', 'z', 's', GeomFromText('POINT(235 8)')),
|
||||
('d', 'd', 'd', GeomFromText('POINT(105 4)')),
|
||||
('c', 'z', 'q', GeomFromText('POINT(13 140)')),
|
||||
('m', 'k', 'i', GeomFromText('POINT(208 120)')),
|
||||
('g', 'a', 'g', GeomFromText('POINT(9 182)')),
|
||||
('z', 'j', 'r', GeomFromText('POINT(149 153)')),
|
||||
('h', 'f', 'g', GeomFromText('POINT(81 236)')),
|
||||
('m', 'e', 'q', GeomFromText('POINT(209 215)')),
|
||||
('c', 'h', 'y', GeomFromText('POINT(235 70)')),
|
||||
('i', 'e', 'g', GeomFromText('POINT(138 26)')),
|
||||
('m', 't', 'u', GeomFromText('POINT(119 237)')),
|
||||
('o', 'w', 's', GeomFromText('POINT(193 166)')),
|
||||
('f', 'm', 'q', GeomFromText('POINT(85 96)')),
|
||||
('x', 'l', 'x', GeomFromText('POINT(58 115)')),
|
||||
('x', 'q', 'u', GeomFromText('POINT(108 210)')),
|
||||
('b', 'h', 'i', GeomFromText('POINT(250 139)')),
|
||||
('y', 'd', 'x', GeomFromText('POINT(199 135)')),
|
||||
('w', 'h', 'p', GeomFromText('POINT(247 233)')),
|
||||
('p', 'z', 't', GeomFromText('POINT(148 249)')),
|
||||
('q', 'a', 'u', GeomFromText('POINT(174 78)')),
|
||||
('v', 't', 'm', GeomFromText('POINT(70 228)')),
|
||||
('t', 'n', 'f', GeomFromText('POINT(123 2)')),
|
||||
('x', 't', 'b', GeomFromText('POINT(35 50)')),
|
||||
('r', 'j', 'f', GeomFromText('POINT(200 51)')),
|
||||
('s', 'q', 'o', GeomFromText('POINT(23 184)')),
|
||||
('u', 'v', 'z', GeomFromText('POINT(7 113)')),
|
||||
('v', 'u', 'l', GeomFromText('POINT(145 190)')),
|
||||
('o', 'k', 'i', GeomFromText('POINT(161 122)')),
|
||||
('l', 'y', 'e', GeomFromText('POINT(17 232)')),
|
||||
('t', 'b', 'e', GeomFromText('POINT(120 50)')),
|
||||
('e', 's', 'u', GeomFromText('POINT(254 1)')),
|
||||
('d', 'd', 'u', GeomFromText('POINT(167 140)')),
|
||||
('o', 'b', 'x', GeomFromText('POINT(186 237)')),
|
||||
('m', 's', 's', GeomFromText('POINT(172 149)')),
|
||||
('t', 'y', 'a', GeomFromText('POINT(149 85)')),
|
||||
('x', 't', 'r', GeomFromText('POINT(10 165)')),
|
||||
('g', 'c', 'e', GeomFromText('POINT(95 165)')),
|
||||
('e', 'e', 'z', GeomFromText('POINT(98 65)')),
|
||||
('f', 'v', 'i', GeomFromText('POINT(149 144)')),
|
||||
('o', 'p', 'm', GeomFromText('POINT(233 67)')),
|
||||
('t', 'u', 'b', GeomFromText('POINT(109 215)')),
|
||||
('o', 'o', 'b', GeomFromText('POINT(130 48)')),
|
||||
('e', 'm', 'h', GeomFromText('POINT(88 189)')),
|
||||
('e', 'v', 'y', GeomFromText('POINT(55 29)')),
|
||||
('e', 't', 'm', GeomFromText('POINT(129 55)')),
|
||||
('p', 'p', 'i', GeomFromText('POINT(126 222)')),
|
||||
('c', 'i', 'c', GeomFromText('POINT(19 158)')),
|
||||
('c', 'b', 's', GeomFromText('POINT(13 19)')),
|
||||
('u', 'y', 'a', GeomFromText('POINT(114 5)')),
|
||||
('a', 'o', 'f', GeomFromText('POINT(227 232)')),
|
||||
('t', 'c', 'z', GeomFromText('POINT(63 62)')),
|
||||
('d', 'o', 'k', GeomFromText('POINT(48 228)')),
|
||||
('x', 'c', 'e', GeomFromText('POINT(204 2)')),
|
||||
('e', 'e', 'g', GeomFromText('POINT(125 43)')),
|
||||
('o', 'r', 'f', GeomFromText('POINT(171 140)'));
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(163 157)') where c1 like 'w%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(53 151)') where c1 like 'd%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(96 183)') where c1 like 'r%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(57 91)') where c1 like 'q%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(202 110)') where c1 like 'c%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(120 137)') where c1 like 'w%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(207 147)') where c1 like 'c%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(31 125)') where c1 like 'e%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(27 36)') where c1 like 'r%';
|
||||
INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES
|
||||
('b', 'c', 'e', GeomFromText('POINT(41 137)')),
|
||||
('p', 'y', 'k', GeomFromText('POINT(50 22)')),
|
||||
('s', 'c', 'h', GeomFromText('POINT(208 173)')),
|
||||
('x', 'u', 'l', GeomFromText('POINT(199 175)')),
|
||||
('s', 'r', 'h', GeomFromText('POINT(85 192)')),
|
||||
('j', 'k', 'u', GeomFromText('POINT(18 25)')),
|
||||
('p', 'w', 'h', GeomFromText('POINT(152 197)')),
|
||||
('e', 'd', 'c', GeomFromText('POINT(229 3)')),
|
||||
('o', 'x', 'k', GeomFromText('POINT(187 155)')),
|
||||
('o', 'b', 'k', GeomFromText('POINT(208 150)')),
|
||||
('d', 'a', 'j', GeomFromText('POINT(70 87)')),
|
||||
('f', 'e', 'k', GeomFromText('POINT(156 96)')),
|
||||
('u', 'y', 'p', GeomFromText('POINT(239 193)')),
|
||||
('n', 'v', 'p', GeomFromText('POINT(223 98)')),
|
||||
('z', 'j', 'r', GeomFromText('POINT(87 89)')),
|
||||
('h', 'x', 'x', GeomFromText('POINT(92 0)')),
|
||||
('r', 'v', 'r', GeomFromText('POINT(159 139)')),
|
||||
('v', 'g', 'g', GeomFromText('POINT(16 229)')),
|
||||
('z', 'k', 'u', GeomFromText('POINT(99 52)')),
|
||||
('p', 'p', 'o', GeomFromText('POINT(105 125)')),
|
||||
('w', 'h', 'y', GeomFromText('POINT(105 154)')),
|
||||
('v', 'y', 'z', GeomFromText('POINT(134 238)')),
|
||||
('x', 'o', 'o', GeomFromText('POINT(178 88)')),
|
||||
('z', 'w', 'd', GeomFromText('POINT(123 60)')),
|
||||
('q', 'f', 'u', GeomFromText('POINT(64 90)')),
|
||||
('s', 'n', 't', GeomFromText('POINT(50 138)')),
|
||||
('v', 'p', 't', GeomFromText('POINT(114 91)')),
|
||||
('a', 'o', 'n', GeomFromText('POINT(78 43)')),
|
||||
('k', 'u', 'd', GeomFromText('POINT(185 161)')),
|
||||
('w', 'd', 'n', GeomFromText('POINT(25 92)')),
|
||||
('k', 'w', 'a', GeomFromText('POINT(59 238)')),
|
||||
('t', 'c', 'f', GeomFromText('POINT(65 87)')),
|
||||
('g', 's', 'p', GeomFromText('POINT(238 126)')),
|
||||
('d', 'n', 'y', GeomFromText('POINT(107 173)')),
|
||||
('l', 'a', 'w', GeomFromText('POINT(125 152)')),
|
||||
('m', 'd', 'j', GeomFromText('POINT(146 53)')),
|
||||
('q', 'm', 'c', GeomFromText('POINT(217 187)')),
|
||||
('i', 'r', 'r', GeomFromText('POINT(6 113)')),
|
||||
('e', 'j', 'b', GeomFromText('POINT(37 83)')),
|
||||
('w', 'w', 'h', GeomFromText('POINT(83 199)')),
|
||||
('k', 'b', 's', GeomFromText('POINT(170 64)')),
|
||||
('s', 'b', 'c', GeomFromText('POINT(163 130)')),
|
||||
('c', 'h', 'a', GeomFromText('POINT(141 3)')),
|
||||
('k', 'j', 'u', GeomFromText('POINT(143 76)')),
|
||||
('r', 'h', 'o', GeomFromText('POINT(243 92)')),
|
||||
('i', 'd', 'b', GeomFromText('POINT(205 13)')),
|
||||
('r', 'y', 'q', GeomFromText('POINT(138 8)')),
|
||||
('m', 'o', 'i', GeomFromText('POINT(36 45)')),
|
||||
('v', 'g', 'm', GeomFromText('POINT(0 40)')),
|
||||
('f', 'e', 'i', GeomFromText('POINT(76 6)')),
|
||||
('c', 'q', 'q', GeomFromText('POINT(115 248)')),
|
||||
('x', 'c', 'i', GeomFromText('POINT(29 74)')),
|
||||
('l', 's', 't', GeomFromText('POINT(83 18)')),
|
||||
('t', 't', 'a', GeomFromText('POINT(26 168)')),
|
||||
('u', 'n', 'x', GeomFromText('POINT(200 110)')),
|
||||
('j', 'b', 'd', GeomFromText('POINT(216 136)')),
|
||||
('s', 'p', 'w', GeomFromText('POINT(38 156)')),
|
||||
('f', 'b', 'v', GeomFromText('POINT(29 186)')),
|
||||
('v', 'e', 'r', GeomFromText('POINT(149 40)')),
|
||||
('v', 't', 'm', GeomFromText('POINT(184 24)')),
|
||||
('y', 'g', 'a', GeomFromText('POINT(219 105)')),
|
||||
('s', 'f', 'i', GeomFromText('POINT(114 130)')),
|
||||
('e', 'q', 'h', GeomFromText('POINT(203 135)')),
|
||||
('h', 'g', 'b', GeomFromText('POINT(9 208)')),
|
||||
('o', 'l', 'r', GeomFromText('POINT(245 79)')),
|
||||
('s', 's', 'v', GeomFromText('POINT(238 198)')),
|
||||
('w', 'w', 'z', GeomFromText('POINT(209 232)')),
|
||||
('v', 'd', 'n', GeomFromText('POINT(30 193)')),
|
||||
('q', 'w', 'k', GeomFromText('POINT(133 18)')),
|
||||
('o', 'h', 'o', GeomFromText('POINT(42 140)')),
|
||||
('f', 'f', 'h', GeomFromText('POINT(145 1)')),
|
||||
('u', 's', 'r', GeomFromText('POINT(70 62)')),
|
||||
('x', 'n', 'q', GeomFromText('POINT(33 86)')),
|
||||
('u', 'p', 'v', GeomFromText('POINT(232 220)')),
|
||||
('z', 'e', 'a', GeomFromText('POINT(130 69)')),
|
||||
('r', 'u', 'z', GeomFromText('POINT(243 241)')),
|
||||
('b', 'n', 't', GeomFromText('POINT(120 12)')),
|
||||
('u', 'f', 's', GeomFromText('POINT(190 212)')),
|
||||
('a', 'd', 'q', GeomFromText('POINT(235 191)')),
|
||||
('f', 'q', 'm', GeomFromText('POINT(176 2)')),
|
||||
('n', 'c', 's', GeomFromText('POINT(218 163)')),
|
||||
('e', 'm', 'h', GeomFromText('POINT(163 108)')),
|
||||
('c', 'f', 'l', GeomFromText('POINT(220 115)')),
|
||||
('c', 'v', 'q', GeomFromText('POINT(66 45)')),
|
||||
('w', 'v', 'x', GeomFromText('POINT(251 220)')),
|
||||
('f', 'w', 'z', GeomFromText('POINT(146 149)')),
|
||||
('h', 'n', 'h', GeomFromText('POINT(148 128)')),
|
||||
('y', 'k', 'v', GeomFromText('POINT(28 110)')),
|
||||
('c', 'x', 'q', GeomFromText('POINT(13 13)')),
|
||||
('e', 'd', 's', GeomFromText('POINT(91 190)')),
|
||||
('c', 'w', 'c', GeomFromText('POINT(10 231)')),
|
||||
('u', 'j', 'n', GeomFromText('POINT(250 21)')),
|
||||
('w', 'n', 'x', GeomFromText('POINT(141 69)')),
|
||||
('f', 'p', 'y', GeomFromText('POINT(228 246)')),
|
||||
('d', 'q', 'f', GeomFromText('POINT(194 22)')),
|
||||
('d', 'z', 'l', GeomFromText('POINT(233 181)')),
|
||||
('c', 'a', 'q', GeomFromText('POINT(183 96)')),
|
||||
('m', 'i', 'd', GeomFromText('POINT(117 226)')),
|
||||
('z', 'y', 'y', GeomFromText('POINT(62 81)')),
|
||||
('g', 'v', 'm', GeomFromText('POINT(66 158)'));
|
||||
SET @@RAND_SEED1=481064922, @@RAND_SEED2=438133497;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=280535103, @@RAND_SEED2=444518646;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=1072017234, @@RAND_SEED2=484203885;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=358851897, @@RAND_SEED2=358495224;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=509031459, @@RAND_SEED2=675962925;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(61 203)') where c1 like 'y%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(202 194)') where c1 like 'f%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(228 18)') where c1 like 'h%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(88 18)') where c1 like 'l%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(176 94)') where c1 like 'e%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(44 47)') where c1 like 'g%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(95 191)') where c1 like 'b%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(179 218)') where c1 like 'y%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(239 40)') where c1 like 'g%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(248 41)') where c1 like 'q%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(167 82)') where c1 like 't%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(13 104)') where c1 like 'u%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(139 84)') where c1 like 'a%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(145 108)') where c1 like 'p%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(147 57)') where c1 like 't%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(217 144)') where c1 like 'n%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(160 224)') where c1 like 'w%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(38 28)') where c1 like 'j%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(104 114)') where c1 like 'q%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(88 19)') where c1 like 'c%';
|
||||
INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES
|
||||
('f', 'x', 'p', GeomFromText('POINT(92 181)')),
|
||||
('s', 'i', 'c', GeomFromText('POINT(49 60)')),
|
||||
('c', 'c', 'i', GeomFromText('POINT(7 57)')),
|
||||
('n', 'g', 'k', GeomFromText('POINT(252 105)')),
|
||||
('g', 'b', 'm', GeomFromText('POINT(180 11)')),
|
||||
('u', 'l', 'r', GeomFromText('POINT(32 90)')),
|
||||
('c', 'x', 'e', GeomFromText('POINT(143 24)')),
|
||||
('x', 'u', 'a', GeomFromText('POINT(123 92)')),
|
||||
('s', 'b', 'h', GeomFromText('POINT(190 108)')),
|
||||
('c', 'x', 'b', GeomFromText('POINT(104 100)')),
|
||||
('i', 'd', 't', GeomFromText('POINT(214 104)')),
|
||||
('r', 'w', 'g', GeomFromText('POINT(29 67)')),
|
||||
('b', 'f', 'g', GeomFromText('POINT(149 46)')),
|
||||
('r', 'r', 'd', GeomFromText('POINT(242 196)')),
|
||||
('j', 'l', 'a', GeomFromText('POINT(90 196)')),
|
||||
('e', 't', 'b', GeomFromText('POINT(190 64)')),
|
||||
('l', 'x', 'w', GeomFromText('POINT(250 73)')),
|
||||
('q', 'y', 'r', GeomFromText('POINT(120 182)')),
|
||||
('s', 'j', 'a', GeomFromText('POINT(180 175)')),
|
||||
('n', 'i', 'y', GeomFromText('POINT(124 136)')),
|
||||
('s', 'x', 's', GeomFromText('POINT(176 209)')),
|
||||
('u', 'f', 's', GeomFromText('POINT(215 173)')),
|
||||
('m', 'j', 'x', GeomFromText('POINT(44 140)')),
|
||||
('v', 'g', 'x', GeomFromText('POINT(177 233)')),
|
||||
('u', 't', 'b', GeomFromText('POINT(136 197)')),
|
||||
('f', 'g', 'b', GeomFromText('POINT(10 8)')),
|
||||
('v', 'c', 'j', GeomFromText('POINT(13 81)')),
|
||||
('d', 's', 'q', GeomFromText('POINT(200 100)')),
|
||||
('a', 'p', 'j', GeomFromText('POINT(33 40)')),
|
||||
('i', 'c', 'g', GeomFromText('POINT(168 204)')),
|
||||
('k', 'h', 'i', GeomFromText('POINT(93 243)')),
|
||||
('s', 'b', 's', GeomFromText('POINT(157 13)')),
|
||||
('v', 'l', 'l', GeomFromText('POINT(103 6)')),
|
||||
('r', 'b', 'k', GeomFromText('POINT(244 137)')),
|
||||
('l', 'd', 'r', GeomFromText('POINT(162 254)')),
|
||||
('q', 'b', 'z', GeomFromText('POINT(136 246)')),
|
||||
('x', 'x', 'p', GeomFromText('POINT(120 37)')),
|
||||
('m', 'e', 'z', GeomFromText('POINT(203 167)')),
|
||||
('q', 'n', 'p', GeomFromText('POINT(94 119)')),
|
||||
('b', 'g', 'u', GeomFromText('POINT(93 248)')),
|
||||
('r', 'v', 'v', GeomFromText('POINT(53 88)')),
|
||||
('y', 'a', 'i', GeomFromText('POINT(98 219)')),
|
||||
('a', 's', 'g', GeomFromText('POINT(173 138)')),
|
||||
('c', 'a', 't', GeomFromText('POINT(235 135)')),
|
||||
('q', 'm', 'd', GeomFromText('POINT(224 208)')),
|
||||
('e', 'p', 'k', GeomFromText('POINT(161 238)')),
|
||||
('n', 'g', 'q', GeomFromText('POINT(35 204)')),
|
||||
('t', 't', 'x', GeomFromText('POINT(230 178)')),
|
||||
('w', 'f', 'a', GeomFromText('POINT(150 221)')),
|
||||
('z', 'm', 'z', GeomFromText('POINT(119 42)')),
|
||||
('l', 'j', 's', GeomFromText('POINT(97 96)')),
|
||||
('f', 'z', 'x', GeomFromText('POINT(208 65)')),
|
||||
('i', 'v', 'c', GeomFromText('POINT(145 79)')),
|
||||
('l', 'f', 'k', GeomFromText('POINT(83 234)')),
|
||||
('u', 'a', 's', GeomFromText('POINT(250 49)')),
|
||||
('o', 'k', 'p', GeomFromText('POINT(46 50)')),
|
||||
('d', 'e', 'z', GeomFromText('POINT(30 198)')),
|
||||
('r', 'r', 'l', GeomFromText('POINT(78 189)')),
|
||||
('y', 'l', 'f', GeomFromText('POINT(188 132)')),
|
||||
('d', 'q', 'm', GeomFromText('POINT(247 107)')),
|
||||
('p', 'j', 'n', GeomFromText('POINT(148 227)')),
|
||||
('b', 'o', 'i', GeomFromText('POINT(172 25)')),
|
||||
('e', 'v', 'd', GeomFromText('POINT(94 248)')),
|
||||
('q', 'd', 'f', GeomFromText('POINT(15 29)')),
|
||||
('w', 'b', 'b', GeomFromText('POINT(74 111)')),
|
||||
('g', 'q', 'f', GeomFromText('POINT(107 215)')),
|
||||
('o', 'h', 'r', GeomFromText('POINT(25 168)')),
|
||||
('u', 't', 'w', GeomFromText('POINT(251 188)')),
|
||||
('h', 's', 'w', GeomFromText('POINT(254 247)')),
|
||||
('f', 'f', 'b', GeomFromText('POINT(166 103)'));
|
||||
SET @@RAND_SEED1=866613816, @@RAND_SEED2=92289615;
|
||||
INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES
|
||||
('l', 'c', 'l', GeomFromText('POINT(202 98)')),
|
||||
('k', 'c', 'b', GeomFromText('POINT(46 206)')),
|
||||
('r', 'y', 'm', GeomFromText('POINT(74 140)')),
|
||||
('y', 'z', 'd', GeomFromText('POINT(200 160)')),
|
||||
('s', 'y', 's', GeomFromText('POINT(156 205)')),
|
||||
('u', 'v', 'p', GeomFromText('POINT(86 82)')),
|
||||
('j', 's', 's', GeomFromText('POINT(91 233)')),
|
||||
('x', 'j', 'f', GeomFromText('POINT(3 14)')),
|
||||
('l', 'z', 'v', GeomFromText('POINT(123 156)')),
|
||||
('h', 'i', 'o', GeomFromText('POINT(145 229)')),
|
||||
('o', 'r', 'd', GeomFromText('POINT(15 22)')),
|
||||
('f', 'x', 't', GeomFromText('POINT(21 60)')),
|
||||
('t', 'g', 'h', GeomFromText('POINT(50 153)')),
|
||||
('g', 'u', 'b', GeomFromText('POINT(82 85)')),
|
||||
('v', 'a', 'p', GeomFromText('POINT(231 178)')),
|
||||
('n', 'v', 'o', GeomFromText('POINT(183 25)')),
|
||||
('j', 'n', 'm', GeomFromText('POINT(50 144)')),
|
||||
('e', 'f', 'i', GeomFromText('POINT(46 16)')),
|
||||
('d', 'w', 'a', GeomFromText('POINT(66 6)')),
|
||||
('f', 'x', 'a', GeomFromText('POINT(107 197)')),
|
||||
('m', 'o', 'a', GeomFromText('POINT(142 80)')),
|
||||
('q', 'l', 'g', GeomFromText('POINT(251 23)')),
|
||||
('c', 's', 's', GeomFromText('POINT(158 43)')),
|
||||
('y', 'd', 'o', GeomFromText('POINT(196 228)')),
|
||||
('d', 'p', 'l', GeomFromText('POINT(107 5)')),
|
||||
('h', 'a', 'b', GeomFromText('POINT(183 166)')),
|
||||
('m', 'w', 'p', GeomFromText('POINT(19 59)')),
|
||||
('b', 'y', 'o', GeomFromText('POINT(178 30)')),
|
||||
('x', 'w', 'i', GeomFromText('POINT(168 94)')),
|
||||
('t', 'k', 'z', GeomFromText('POINT(171 5)')),
|
||||
('r', 'm', 'a', GeomFromText('POINT(222 19)')),
|
||||
('u', 'v', 'e', GeomFromText('POINT(224 80)')),
|
||||
('q', 'r', 'k', GeomFromText('POINT(212 218)')),
|
||||
('d', 'p', 'j', GeomFromText('POINT(169 7)')),
|
||||
('d', 'r', 'v', GeomFromText('POINT(193 23)')),
|
||||
('n', 'y', 'y', GeomFromText('POINT(130 178)')),
|
||||
('m', 'z', 'r', GeomFromText('POINT(81 200)')),
|
||||
('j', 'e', 'w', GeomFromText('POINT(145 239)')),
|
||||
('v', 'h', 'x', GeomFromText('POINT(24 105)')),
|
||||
('z', 'm', 'a', GeomFromText('POINT(175 129)')),
|
||||
('b', 'c', 'v', GeomFromText('POINT(213 10)')),
|
||||
('t', 't', 'u', GeomFromText('POINT(2 129)')),
|
||||
('r', 's', 'v', GeomFromText('POINT(209 192)')),
|
||||
('x', 'p', 'g', GeomFromText('POINT(43 63)')),
|
||||
('t', 'e', 'u', GeomFromText('POINT(139 210)')),
|
||||
('l', 'e', 't', GeomFromText('POINT(245 148)')),
|
||||
('a', 'i', 'k', GeomFromText('POINT(167 195)')),
|
||||
('m', 'o', 'h', GeomFromText('POINT(206 120)')),
|
||||
('g', 'z', 's', GeomFromText('POINT(169 240)')),
|
||||
('z', 'u', 's', GeomFromText('POINT(202 120)')),
|
||||
('i', 'b', 'a', GeomFromText('POINT(216 18)')),
|
||||
('w', 'y', 'g', GeomFromText('POINT(119 236)')),
|
||||
('h', 'y', 'p', GeomFromText('POINT(161 24)'));
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(33 100)') where c1 like 't%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(41 46)') where c1 like 'f%';
|
||||
CHECK TABLE t1 EXTENDED;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(foo GEOMETRY NOT NULL, SPATIAL INDEX(foo) );
|
||||
INSERT INTO t1(foo) VALUES (NULL);
|
||||
ERROR 23000: Column 'foo' cannot be null
|
||||
|
|
|
@ -12,7 +12,7 @@ explain extended select count(a) as b from t1 where a=0 having b >=0;
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
Warnings:
|
||||
Note 1003 select count(`test`.`t1`.`a`) AS `b` from `test`.`t1` where 0 having (`b` >= 0)
|
||||
Note 1003 select count('0') AS `b` from `test`.`t1` where 0 having (`b` >= 0)
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
raw_id int(10) NOT NULL default '0',
|
||||
|
|
|
@ -236,3 +236,25 @@ INSERT INTO t2 VALUES (1), (3);
|
|||
INSERT INTO t1 SELECT 1, COUNT(*) FROM t2 ON DUPLICATE KEY UPDATE j= a;
|
||||
ERROR 42S22: Unknown column 'a' in 'field list'
|
||||
DROP TABLE t1,t2;
|
||||
SET SQL_MODE = 'TRADITIONAL';
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY, b INT NOT NULL);
|
||||
INSERT INTO t1 (a) VALUES (1);
|
||||
ERROR HY000: Field 'b' doesn't have a default value
|
||||
INSERT INTO t1 (a) VALUES (1) ON DUPLICATE KEY UPDATE a = b;
|
||||
ERROR HY000: Field 'b' doesn't have a default value
|
||||
INSERT INTO t1 (a) VALUES (1) ON DUPLICATE KEY UPDATE b = b;
|
||||
ERROR HY000: Field 'b' doesn't have a default value
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (f1 INT AUTO_INCREMENT PRIMARY KEY,
|
||||
f2 VARCHAR(5) NOT NULL UNIQUE);
|
||||
INSERT t1 (f2) VALUES ('test') ON DUPLICATE KEY UPDATE f1 = LAST_INSERT_ID(f1);
|
||||
SELECT LAST_INSERT_ID();
|
||||
LAST_INSERT_ID()
|
||||
1
|
||||
INSERT t1 (f2) VALUES ('test') ON DUPLICATE KEY UPDATE f1 = LAST_INSERT_ID(f1);
|
||||
SELECT LAST_INSERT_ID();
|
||||
LAST_INSERT_ID()
|
||||
1
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -803,6 +803,24 @@ CREATE TABLE tm1(a SMALLINT, b SMALLINT, KEY(a)) ENGINE=MERGE UNION=(t1);
|
|||
SELECT * FROM tm1;
|
||||
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||
DROP TABLE t1, tm1;
|
||||
CREATE TABLE t1(c1 INT) ENGINE=MyISAM;
|
||||
CREATE TABLE t2(c1 INT) ENGINE=MERGE UNION=(t1);
|
||||
INSERT DELAYED INTO t2 VALUES(1);
|
||||
ERROR HY000: Table storage engine for 't2' doesn't have this option
|
||||
DROP TABLE t1, t2;
|
||||
CREATE TABLE t1(c1 VARCHAR(1));
|
||||
CREATE TABLE m1 LIKE t1;
|
||||
ALTER TABLE m1 ENGINE=MERGE UNION=(t1);
|
||||
SELECT * FROM m1;
|
||||
c1
|
||||
DROP TABLE t1, m1;
|
||||
CREATE TABLE t1(c1 VARCHAR(4), c2 TINYINT, c3 TINYINT, c4 TINYINT,
|
||||
c5 TINYINT, c6 TINYINT, c7 TINYINT, c8 TINYINT, c9 TINYINT);
|
||||
CREATE TABLE m1 LIKE t1;
|
||||
ALTER TABLE m1 ENGINE=MERGE UNION=(t1);
|
||||
SELECT * FROM m1;
|
||||
c1 c2 c3 c4 c5 c6 c7 c8 c9
|
||||
DROP TABLE t1, m1;
|
||||
create table t1 (b bit(1));
|
||||
create table t2 (b bit(1));
|
||||
create table tm (b bit(1)) engine = merge union = (t1,t2);
|
||||
|
|
46
mysql-test/r/ndb_single_user.result
Normal file
46
mysql-test/r/ndb_single_user.result
Normal file
|
@ -0,0 +1,46 @@
|
|||
use test;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
|
||||
create table t1 (a int key, b int unique, c int) engine ndb;
|
||||
ERROR HY000: Can't create table './test/t1.frm' (errno: 155)
|
||||
create table t1 (a int key, b int unique, c int) engine ndb;
|
||||
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
|
||||
create table t2 as select * from t1;
|
||||
select * from t1 where a = 1;
|
||||
a b c
|
||||
1 1 0
|
||||
select * from t1 where b = 4;
|
||||
a b c
|
||||
4 4 0
|
||||
select * from t1 where a > 4 order by a;
|
||||
a b c
|
||||
5 5 0
|
||||
6 6 0
|
||||
7 7 0
|
||||
8 8 0
|
||||
9 9 0
|
||||
10 10 0
|
||||
update t1 set b=102 where a = 2;
|
||||
update t1 set b=103 where b = 3;
|
||||
update t1 set b=b+100;
|
||||
update t1 set b=b+100 where a > 7;
|
||||
delete from t1;
|
||||
insert into t1 select * from t2;
|
||||
drop table t1;
|
||||
ERROR 42S02: Unknown table 't1'
|
||||
create index new_index on t1 (c);
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
select * from t1 where a = 1;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
select * from t1 where b = 4;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
update t1 set b=102 where a = 2;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
update t1 set b=103 where b = 3;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
update t1 set b=b+100;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
update t1 set b=b+100 where a > 7;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
drop table t1;
|
|
@ -645,3 +645,12 @@ a LENGTH(a) COUNT(*)
|
|||
NULL NULL 2
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a int, KEY (a));
|
||||
INSERT INTO t1 VALUES (3), (1), (4), (1), (3), (1), (1);
|
||||
SELECT * FROM (SELECT a, SUM(a) FROM t1 GROUP BY a WITH ROLLUP) as t;
|
||||
a SUM(a)
|
||||
1 4
|
||||
3 6
|
||||
4 4
|
||||
NULL 14
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -950,3 +950,33 @@ NULL
|
|||
2
|
||||
3
|
||||
DROP TABLE t1,t2,t3,t4;
|
||||
create table t1 (a int, b int, c int);
|
||||
insert into t1 values (1,2,3), (9,8,3), (19,4,3), (1,4,9);
|
||||
select a,(sum(b)/sum(c)) as ratio from t1 group by a order by sum(b)/sum(c) asc;
|
||||
a ratio
|
||||
1 0.5000
|
||||
19 1.3333
|
||||
9 2.6667
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (a INT UNSIGNED NOT NULL, b TIME);
|
||||
INSERT INTO t1 (a) VALUES (100000), (0), (100), (1000000),(10000), (1000), (10);
|
||||
UPDATE t1 SET b = SEC_TO_TIME(a);
|
||||
SELECT a, b FROM t1 ORDER BY b DESC;
|
||||
a b
|
||||
1000000 277:46:40
|
||||
100000 27:46:40
|
||||
10000 02:46:40
|
||||
1000 00:16:40
|
||||
100 00:01:40
|
||||
10 00:00:10
|
||||
0 00:00:00
|
||||
SELECT a, b FROM t1 ORDER BY SEC_TO_TIME(a) DESC;
|
||||
a b
|
||||
1000000 277:46:40
|
||||
100000 27:46:40
|
||||
10000 02:46:40
|
||||
1000 00:16:40
|
||||
100 00:01:40
|
||||
10 00:00:10
|
||||
0 00:00:00
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -3628,6 +3628,15 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 SIMPLE t2 range si,ai si 5 NULL 2 Using where
|
||||
1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where
|
||||
DROP TABLE t1,t2,t3;
|
||||
CREATE TABLE t1 (a INT, b INT, KEY (a));
|
||||
INSERT INTO t1 VALUES (1,1),(2,2);
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a = 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref a a 5 const 1 Using where; Using index
|
||||
EXPLAIN SELECT 1 FROM t1 IGNORE INDEX FOR JOIN (a) WHERE a = 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 ( f1 int primary key, f2 int, f3 int, f4 int, f5 int, f6 int, checked_out int);
|
||||
CREATE TABLE t2 ( f11 int PRIMARY KEY );
|
||||
INSERT INTO t1 VALUES (1,1,1,0,0,0,0),(2,1,1,3,8,1,0),(3,1,1,4,12,1,0);
|
||||
|
@ -3933,4 +3942,42 @@ cc cc 7
|
|||
aa aa 2
|
||||
aa aa 2
|
||||
DROP TABLE t1,t2;
|
||||
CREATE TABLE t1 (
|
||||
access_id int NOT NULL default '0',
|
||||
name varchar(20) default NULL,
|
||||
rank int NOT NULL default '0',
|
||||
KEY idx (access_id)
|
||||
);
|
||||
CREATE TABLE t2 (
|
||||
faq_group_id int NOT NULL default '0',
|
||||
faq_id int NOT NULL default '0',
|
||||
access_id int default NULL,
|
||||
UNIQUE KEY idx1 (faq_id),
|
||||
KEY idx2 (faq_group_id,faq_id)
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
(1,'Everyone',2),(2,'Help',3),(3,'Technical Support',1),(4,'Chat User',4);
|
||||
INSERT INTO t2 VALUES
|
||||
(261,265,1),(490,494,1);
|
||||
SELECT t2.faq_id
|
||||
FROM t1 INNER JOIN t2 IGNORE INDEX (idx1)
|
||||
ON (t1.access_id = t2.access_id)
|
||||
LEFT JOIN t2 t
|
||||
ON (t.faq_group_id = t2.faq_group_id AND
|
||||
find_in_set(t.access_id, '1,4') < find_in_set(t2.access_id, '1,4'))
|
||||
WHERE
|
||||
t2.access_id IN (1,4) AND t.access_id IS NULL AND t2.faq_id in (265);
|
||||
faq_id
|
||||
265
|
||||
SELECT t2.faq_id
|
||||
FROM t1 INNER JOIN t2
|
||||
ON (t1.access_id = t2.access_id)
|
||||
LEFT JOIN t2 t
|
||||
ON (t.faq_group_id = t2.faq_group_id AND
|
||||
find_in_set(t.access_id, '1,4') < find_in_set(t2.access_id, '1,4'))
|
||||
WHERE
|
||||
t2.access_id IN (1,4) AND t.access_id IS NULL AND t2.faq_id in (265);
|
||||
faq_id
|
||||
265
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -58,3 +58,15 @@ DROP PROCEDURE p3;
|
|||
DROP FUNCTION f1;
|
||||
DROP FUNCTION f2;
|
||||
DROP FUNCTION f3;
|
||||
select count(*) from information_schema.COLUMN_PRIVILEGES;
|
||||
count(*)
|
||||
0
|
||||
select count(*) from information_schema.SCHEMA_PRIVILEGES;
|
||||
count(*)
|
||||
0
|
||||
select count(*) from information_schema.TABLE_PRIVILEGES;
|
||||
count(*)
|
||||
0
|
||||
select count(*) from information_schema.USER_PRIVILEGES;
|
||||
count(*)
|
||||
0
|
||||
|
|
|
@ -5765,4 +5765,17 @@ func_8407_b()
|
|||
1500
|
||||
drop function func_8407_a|
|
||||
drop function func_8407_b|
|
||||
DROP FUNCTION IF EXISTS bug25373|
|
||||
CREATE FUNCTION bug25373(p1 INTEGER) RETURNS INTEGER
|
||||
LANGUAGE SQL DETERMINISTIC
|
||||
RETURN p1;|
|
||||
CREATE TABLE t3 (f1 INT, f2 FLOAT)|
|
||||
INSERT INTO t3 VALUES (1, 3.4), (1, 2), (1, 0.9), (2, 8), (2, 7)|
|
||||
SELECT SUM(f2), bug25373(f1) FROM t3 GROUP BY bug25373(f1) WITH ROLLUP|
|
||||
SUM(f2) bug25373(f1)
|
||||
6.3000000715256 1
|
||||
15 2
|
||||
21.300000071526 NULL
|
||||
DROP FUNCTION bug25373|
|
||||
DROP TABLE t3|
|
||||
drop table t1,t2;
|
||||
|
|
|
@ -50,7 +50,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
Warnings:
|
||||
Note 1276 Field or reference 'a' of SELECT #3 was resolved in SELECT #1
|
||||
Note 1276 Field or reference 'b.a' of SELECT #3 was resolved in SELECT #1
|
||||
Note 1003 select 1 AS `1` from (select 1 AS `a`) `b` having ((select `b`.`a` AS `a`) = 1)
|
||||
Note 1003 select 1 AS `1` from (select 1 AS `a`) `b` having ((select '1' AS `a`) = 1)
|
||||
SELECT 1 FROM (SELECT 1 as a) as b HAVING (SELECT a)=1;
|
||||
1
|
||||
1
|
||||
|
@ -204,7 +204,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
3 DERIVED t2 ALL NULL NULL NULL NULL 2 Using where
|
||||
2 SUBQUERY t3 ALL NULL NULL NULL NULL 3 Using where; Using filesort
|
||||
Warnings:
|
||||
Note 1003 select (select `test`.`t3`.`a` AS `a` from `test`.`t3` where (`test`.`t3`.`a` < 8) order by 1 desc limit 1) AS `(select t3.a from t3 where a<8 order by 1 desc limit 1)`,`tt`.`a` AS `a` from (select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t2` where (`test`.`t2`.`a` > 1)) `tt`
|
||||
Note 1003 select (select `test`.`t3`.`a` AS `a` from `test`.`t3` where (`test`.`t3`.`a` < 8) order by 1 desc limit 1) AS `(select t3.a from t3 where a<8 order by 1 desc limit 1)`,'2' AS `a` from (select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t2` where (`test`.`t2`.`a` > 1)) `tt`
|
||||
select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3) order by 1 desc limit 1);
|
||||
a
|
||||
2
|
||||
|
@ -315,7 +315,7 @@ NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
|||
Warnings:
|
||||
Note 1276 Field or reference 'test.t2.a' of SELECT #2 was resolved in SELECT #1
|
||||
Note 1276 Field or reference 'test.t2.a' of SELECT #3 was resolved in SELECT #1
|
||||
Note 1003 select (select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` = `test`.`t2`.`a`) union select `test`.`t5`.`a` AS `a` from `test`.`t5` where (`test`.`t5`.`a` = `test`.`t2`.`a`)) AS `(select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a)`,`test`.`t2`.`a` AS `a` from `test`.`t2`
|
||||
Note 1003 select (select '2' AS `a` from `test`.`t1` where ('2' = `test`.`t2`.`a`) union select `test`.`t5`.`a` AS `a` from `test`.`t5` where (`test`.`t5`.`a` = `test`.`t2`.`a`)) AS `(select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a)`,`test`.`t2`.`a` AS `a` from `test`.`t2`
|
||||
select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2;
|
||||
ERROR 21000: Subquery returns more than 1 row
|
||||
create table t6 (patient_uq int, clinic_uq int, index i1 (clinic_uq));
|
||||
|
@ -368,7 +368,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
2 SUBQUERY t8 const PRIMARY PRIMARY 37 const 1
|
||||
3 SUBQUERY t8 const PRIMARY PRIMARY 37 1 Using index
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t8`.`pseudo` AS `pseudo`,(select `test`.`t8`.`email` AS `email` from `test`.`t8` where 1) AS `(SELECT email FROM t8 WHERE pseudo=(SELECT pseudo FROM t8 WHERE pseudo='joce'))` from `test`.`t8` where 1
|
||||
Note 1003 select 'joce' AS `pseudo`,(select 'test' AS `email` from `test`.`t8` where 1) AS `(SELECT email FROM t8 WHERE pseudo=(SELECT pseudo FROM t8 WHERE pseudo='joce'))` from `test`.`t8` where 1
|
||||
SELECT pseudo FROM t8 WHERE pseudo=(SELECT pseudo,email FROM
|
||||
t8 WHERE pseudo='joce');
|
||||
ERROR 21000: Operand should contain 1 column(s)
|
||||
|
@ -421,7 +421,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
||||
Warnings:
|
||||
Note 1003 select 1 AS `1` from `test`.`t1`
|
||||
Note 1003 select 1 AS `1` from `test`.`t1` where 1
|
||||
drop table t1;
|
||||
CREATE TABLE `t1` (
|
||||
`numeropost` mediumint(8) unsigned NOT NULL auto_increment,
|
||||
|
@ -547,7 +547,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY t1 const PRIMARY,numreponse PRIMARY 7 const,const 1 Using index
|
||||
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`numreponse` AS `numreponse` from `test`.`t1` where ((`test`.`t1`.`numeropost` = _latin1'1'))
|
||||
Note 1003 select '3' AS `numreponse` from `test`.`t1` where (('1' = _latin1'1'))
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (a int(1));
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
@ -1180,7 +1180,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
Warnings:
|
||||
Note 1003 select <in_optimizer>(0,<exists>(select 1 AS `Not_used` from `test`.`t1` `a`)) AS `0 IN (SELECT 1 FROM t1 a)`
|
||||
Note 1003 select <in_optimizer>(0,<exists>(select 1 AS `Not_used` from `test`.`t1` `a` where 0)) AS `0 IN (SELECT 1 FROM t1 a)`
|
||||
INSERT INTO t1 (pseudo) VALUES ('test1');
|
||||
SELECT 0 IN (SELECT 1 FROM t1 a);
|
||||
0 IN (SELECT 1 FROM t1 a)
|
||||
|
@ -1190,7 +1190,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
Warnings:
|
||||
Note 1003 select <in_optimizer>(0,<exists>(select 1 AS `Not_used` from `test`.`t1` `a`)) AS `0 IN (SELECT 1 FROM t1 a)`
|
||||
Note 1003 select <in_optimizer>(0,<exists>(select 1 AS `Not_used` from `test`.`t1` `a` where 0)) AS `0 IN (SELECT 1 FROM t1 a)`
|
||||
drop table t1;
|
||||
CREATE TABLE `t1` (
|
||||
`i` int(11) NOT NULL default '0',
|
||||
|
@ -1430,7 +1430,7 @@ explain extended (select * from t1);
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 1
|
||||
Warnings:
|
||||
Note 1003 (select `test`.`t1`.`s1` AS `s1` from `test`.`t1`)
|
||||
Note 1003 (select 'tttt' AS `s1` from `test`.`t1`)
|
||||
(select * from t1);
|
||||
s1
|
||||
tttt
|
||||
|
@ -1497,7 +1497,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < (select max(`test`.`t2`.`b`) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < (select max('0') from `test`.`t2`)))
|
||||
select * from t3 where a >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2);
|
||||
|
@ -1505,7 +1505,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min('0') from `test`.`t2`)))
|
||||
select * from t3 where a >= all (select b from t2 group by 1);
|
||||
a
|
||||
6
|
||||
|
@ -1516,7 +1516,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < <max>(select `test`.`t2`.`b` AS `b` from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < <max>(select '0' AS `b` from `test`.`t2` group by 1)))
|
||||
select * from t3 where a >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2 group by 1);
|
||||
|
@ -1524,7 +1524,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= <min>(select `test`.`t2`.`b` AS `b` from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= <min>(select '0' AS `b` from `test`.`t2` group by 1)))
|
||||
select * from t3 where NULL >= any (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2);
|
||||
|
@ -1532,7 +1532,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3`
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where 0
|
||||
select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
|
@ -1540,7 +1540,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3`
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where 0
|
||||
select * from t3 where NULL >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2);
|
||||
|
@ -1548,7 +1548,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3`
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where 0
|
||||
select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
|
@ -1556,7 +1556,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3`
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where 0
|
||||
insert into t2 values (2,2), (2,1), (3,3), (3,1);
|
||||
select * from t3 where a > all (select max(b) from t2 group by a);
|
||||
a
|
||||
|
@ -1618,7 +1618,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
3 UNION t1 system NULL NULL NULL NULL 1
|
||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`s1` AS `s1` from `test`.`t1`
|
||||
Note 1003 select 'e' AS `s1` from `test`.`t1` where 1
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (number char(11) NOT NULL default '') ENGINE=MyISAM CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES ('69294728265'),('18621828126'),('89356874041'),('95895001874');
|
||||
|
@ -3867,3 +3867,16 @@ id_1
|
|||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t1xt2;
|
||||
CREATE TABLE t1 (a int);
|
||||
INSERT INTO t1 VALUES (3), (1), (2);
|
||||
SELECT 'this is ' 'a test.' AS col1, a AS col2 FROM t1;
|
||||
col1 col2
|
||||
this is a test. 3
|
||||
this is a test. 1
|
||||
this is a test. 2
|
||||
SELECT * FROM (SELECT 'this is ' 'a test.' AS col1, a AS t2 FROM t1) t;
|
||||
col1 t2
|
||||
this is a test. 3
|
||||
this is a test. 1
|
||||
this is a test. 2
|
||||
DROP table t1;
|
||||
|
|
|
@ -1372,4 +1372,45 @@ INSERT INTO bug22580_t1 VALUES (1,1);
|
|||
DROP TABLE bug22580_t1;
|
||||
DROP PROCEDURE bug22580_proc_1;
|
||||
DROP PROCEDURE bug22580_proc_2;
|
||||
DROP TRIGGER IF EXISTS trg27006_a_update;
|
||||
DROP TRIGGER IF EXISTS trg27006_a_insert;
|
||||
CREATE TABLE t1 (
|
||||
`id` int(10) unsigned NOT NULL auto_increment,
|
||||
`val` varchar(10) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
CREATE TABLE t2 like t1;
|
||||
CREATE TRIGGER trg27006_a_insert AFTER INSERT ON t1 FOR EACH ROW
|
||||
BEGIN
|
||||
insert into t2 values (NULL,new.val);
|
||||
END |
|
||||
CREATE TRIGGER trg27006_a_update AFTER UPDATE ON t1 FOR EACH ROW
|
||||
BEGIN
|
||||
insert into t2 values (NULL,new.val);
|
||||
END |
|
||||
INSERT INTO t1(val) VALUES ('test1'),('test2');
|
||||
SELECT * FROM t1;
|
||||
id val
|
||||
1 test1
|
||||
2 test2
|
||||
SELECT * FROM t2;
|
||||
id val
|
||||
1 test1
|
||||
2 test2
|
||||
INSERT INTO t1 VALUES (2,'test2') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
INSERT INTO t1 VALUES (3,'test3') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
SELECT * FROM t1;
|
||||
id val
|
||||
1 test1
|
||||
2 test2
|
||||
3 test3
|
||||
SELECT * FROM t2;
|
||||
id val
|
||||
1 test1
|
||||
2 test2
|
||||
3 test2
|
||||
4 test3
|
||||
DROP TRIGGER trg27006_a_insert;
|
||||
DROP TRIGGER trg27006_a_update;
|
||||
drop table t1,t2;
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -480,7 +480,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
2 UNION t2 const PRIMARY PRIMARY 4 const 1
|
||||
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL
|
||||
Warnings:
|
||||
Note 1003 (select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where (`test`.`t1`.`a` = 1)) union (select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t2` where (`test`.`t2`.`a` = 1))
|
||||
Note 1003 (select '1' AS `a`,'1' AS `b` from `test`.`t1` where ('1' = 1)) union (select '1' AS `a`,'10' AS `b` from `test`.`t2` where ('1' = 1))
|
||||
(select * from t1 where a=5) union (select * from t2 where a=1);
|
||||
a b
|
||||
1 10
|
||||
|
@ -1370,4 +1370,15 @@ select _utf8'12' union select _latin1'12345';
|
|||
12
|
||||
12
|
||||
12345
|
||||
CREATE TABLE t1 (a int);
|
||||
INSERT INTO t1 VALUES (3),(1),(2),(4),(1);
|
||||
SELECT a FROM (SELECT a FROM t1 UNION SELECT a FROM t1 ORDER BY a) AS test;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
SELECT a FROM (SELECT a FROM t1 UNION SELECT a FROM t1 ORDER BY c) AS test;
|
||||
ERROR 42S22: Unknown column 'c' in 'order clause'
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -377,6 +377,10 @@ create table t1(f1 int, `*f2` int);
|
|||
insert into t1 values (1,1);
|
||||
update t1 set `*f2`=1;
|
||||
drop table t1;
|
||||
create table t1(f1 int);
|
||||
update t1 set f2=1 order by f2;
|
||||
ERROR 42S22: Unknown column 'f2' in 'order clause'
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
request_id int unsigned NOT NULL auto_increment,
|
||||
user_id varchar(12) default NULL,
|
||||
|
|
|
@ -15,7 +15,7 @@ explain extended select * from t1 where UNIQ=0x38afba1d73e6a18a;
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 const UNIQ UNIQ 8 const 1
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`ID` AS `ID`,`test`.`t1`.`UNIQ` AS `UNIQ` from `test`.`t1` where 1
|
||||
Note 1003 select '00000001' AS `ID`,'004084688022709641610' AS `UNIQ` from `test`.`t1` where 1
|
||||
drop table t1;
|
||||
select x'hello';
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'x'hello'' at line 1
|
||||
|
|
|
@ -3272,4 +3272,41 @@ a IS TRUE old_istrue a IS NOT TRUE old_isnottrue a IS FALSE old_isfalse a IS NOT
|
|||
drop view view_24532_a;
|
||||
drop view view_24532_b;
|
||||
drop table table_24532;
|
||||
CREATE TABLE t1 (
|
||||
lid int NOT NULL PRIMARY KEY,
|
||||
name char(10) NOT NULL
|
||||
);
|
||||
INSERT INTO t1 (lid, name) VALUES
|
||||
(1, 'YES'), (2, 'NO');
|
||||
CREATE TABLE t2 (
|
||||
id int NOT NULL PRIMARY KEY,
|
||||
gid int NOT NULL,
|
||||
lid int NOT NULL,
|
||||
dt date
|
||||
);
|
||||
INSERT INTO t2 (id, gid, lid, dt) VALUES
|
||||
(1, 1, 1, '2007-01-01'),(2, 1, 2, '2007-01-02'),
|
||||
(3, 2, 2, '2007-02-01'),(4, 2, 1, '2007-02-02');
|
||||
SELECT DISTINCT t2.gid AS lgid,
|
||||
(SELECT t1.name FROM t1, t2
|
||||
WHERE t1.lid = t2.lid AND t2.gid = lgid
|
||||
ORDER BY t2.dt DESC LIMIT 1
|
||||
) as clid
|
||||
FROM t2;
|
||||
lgid clid
|
||||
1 NO
|
||||
2 YES
|
||||
CREATE VIEW v1 AS
|
||||
SELECT DISTINCT t2.gid AS lgid,
|
||||
(SELECT t1.name FROM t1, t2
|
||||
WHERE t1.lid = t2.lid AND t2.gid = lgid
|
||||
ORDER BY t2.dt DESC LIMIT 1
|
||||
) as clid
|
||||
FROM t2;
|
||||
SELECT * FROM v1;
|
||||
lgid clid
|
||||
1 NO
|
||||
2 YES
|
||||
DROP VIEW v1;
|
||||
DROP table t1,t2;
|
||||
End of 5.0 tests.
|
||||
|
|
|
@ -613,3 +613,26 @@ create table t1 (t varchar(255) default null, key t (t(80)))
|
|||
engine=myisam default charset=latin1;
|
||||
alter table t1 change t t text;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #26794: Adding an index with a prefix on a SPATIAL type breaks ALTER
|
||||
# TABLE
|
||||
#
|
||||
CREATE TABLE t1 (a varchar(500));
|
||||
|
||||
ALTER TABLE t1 ADD b GEOMETRY NOT NULL, ADD SPATIAL INDEX(b);
|
||||
SHOW CREATE TABLE t1;
|
||||
ALTER TABLE t1 ADD KEY(b(50));
|
||||
SHOW CREATE TABLE t1;
|
||||
|
||||
ALTER TABLE t1 ADD c POINT;
|
||||
SHOW CREATE TABLE t1;
|
||||
|
||||
--error ER_WRONG_SUB_KEY
|
||||
CREATE TABLE t2 (a INT, KEY (a(20)));
|
||||
|
||||
ALTER TABLE t1 ADD d INT;
|
||||
--error ER_WRONG_SUB_KEY
|
||||
ALTER TABLE t1 ADD KEY (d(20));
|
||||
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -234,3 +234,11 @@ SET @@session.auto_increment_offset=
|
|||
SET @@session.auto_increment_increment=
|
||||
@bug20830_old_session_auto_increment_increment;
|
||||
|
||||
#
|
||||
# BUG#26238 - inserted delayed always inserts 0 for BIT columns
|
||||
#
|
||||
CREATE TABLE t1(a BIT);
|
||||
INSERT DELAYED INTO t1 VALUES(1);
|
||||
FLUSH TABLE t1;
|
||||
SELECT HEX(a) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -12,3 +12,4 @@
|
|||
|
||||
ndb_load : Bug#17233
|
||||
user_limits : Bug#23921 random failure of user_limits.test
|
||||
ndb_single_user : Bug#27021 Error codes in mysqld in single user mode varies
|
||||
|
|
|
@ -51,4 +51,19 @@ set names latin1;
|
|||
select 3 into @v1;
|
||||
explain select 3 into @v1;
|
||||
|
||||
#
|
||||
# Bug#22331: Wrong WHERE in EXPLAIN EXTENDED when all expressions were
|
||||
# optimized away.
|
||||
#
|
||||
create table t1(f1 int, f2 int);
|
||||
insert into t1 values (1,1);
|
||||
create view v1 as select * from t1 where f1=1;
|
||||
explain extended select * from v1 where f2=1;
|
||||
explain extended select * from t1 where 0;
|
||||
explain extended select * from t1 where 1;
|
||||
explain extended select * from t1 having 0;
|
||||
explain extended select * from t1 having 1;
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
|
||||
# End of 5.0 tests.
|
||||
|
|
|
@ -298,4 +298,66 @@ SELECT STRAIGHT_JOIN
|
|||
|
||||
DROP TABLE t1,t2,t3,t4;
|
||||
|
||||
#
|
||||
# BUG#19342: IN works incorrectly for BIGINT UNSIGNED values
|
||||
#
|
||||
CREATE TABLE t1(a BIGINT UNSIGNED);
|
||||
INSERT INTO t1 VALUES (0xFFFFFFFFFFFFFFFF);
|
||||
|
||||
SELECT * FROM t1 WHERE a=-1 OR a=-2 ;
|
||||
SELECT * FROM t1 WHERE a IN (-1, -2);
|
||||
|
||||
CREATE TABLE t2 (a BIGINT UNSIGNED);
|
||||
insert into t2 values(13491727406643098568),
|
||||
(0x7fffffefffffffff),
|
||||
(0x7ffffffeffffffff),
|
||||
(0x7fffffffefffffff),
|
||||
(0x7ffffffffeffffff),
|
||||
(0x7fffffffffefffff),
|
||||
(0x7ffffffffffeffff),
|
||||
(0x7fffffffffffefff),
|
||||
(0x7ffffffffffffeff),
|
||||
(0x7fffffffffffffef),
|
||||
(0x7ffffffffffffffe),
|
||||
(0x7fffffffffffffff),
|
||||
(0x8000000000000000),
|
||||
(0x8000000000000001),
|
||||
(0x8000000000000002),
|
||||
(0x8000000000000300),
|
||||
(0x8000000000000400),
|
||||
(0x8000000000000401),
|
||||
(0x8000000000004001),
|
||||
(0x8000000000040001),
|
||||
(0x8000000000400001),
|
||||
(0x8000000004000001),
|
||||
(0x8000000040000001),
|
||||
(0x8000000400000001),
|
||||
(0x8000004000000001),
|
||||
(0x8000040000000001);
|
||||
|
||||
SELECT HEX(a) FROM t2 WHERE a IN (0xBB3C3E98175D33C8, 42);
|
||||
|
||||
SELECT HEX(a) FROM t2 WHERE a IN
|
||||
(0xBB3C3E98175D33C8,
|
||||
0x7fffffffffffffff,
|
||||
0x8000000000000000,
|
||||
0x8000000000000400,
|
||||
0x8000000000000401,
|
||||
42);
|
||||
|
||||
SELECT HEX(a) FROM t2 WHERE a IN (0x7fffffffffffffff,0x8000000000000001);
|
||||
SELECT HEX(a) FROM t2 WHERE a IN (0x7ffffffffffffffe,0x7fffffffffffffff);
|
||||
SELECT HEX(a) FROM t2 WHERE a IN (0x7ffffffffffffffe,0x7fffffffffffffff,'abc');
|
||||
|
||||
CREATE TABLE t3 (a BIGINT UNSIGNED);
|
||||
INSERT INTO t3 VALUES (9223372036854775551);
|
||||
|
||||
SELECT HEX(a) FROM t3 WHERE a IN (9223372036854775807, 42);
|
||||
|
||||
CREATE TABLE t4 (a DATE);
|
||||
INSERT INTO t4 VALUES ('1972-02-06'), ('1972-07-29');
|
||||
SELECT * FROM t4 WHERE a IN ('1972-02-06','19772-07-29');
|
||||
|
||||
DROP TABLE t1,t2,t3,t4;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
|
|
@ -1008,6 +1008,16 @@ select repeat('a', cast(2 as unsigned int));
|
|||
select rpad('abc', cast(5 as unsigned integer), 'x');
|
||||
select lpad('abc', cast(5 as unsigned integer), 'x');
|
||||
|
||||
#
|
||||
# Bug#15757: Wrong SUBSTRING() result when a tmp table was employed.
|
||||
#
|
||||
create table t1(f1 longtext);
|
||||
insert into t1 values ("123"),("456");
|
||||
select substring(f1,1,1) from t1 group by 1;
|
||||
create table t2(f1 varchar(3));
|
||||
insert into t1 values ("123"),("456");
|
||||
select substring(f1,4,1), substring(f1,-4,1) from t2;
|
||||
drop table t1,t2;
|
||||
|
||||
#
|
||||
# Bug #25197 :repeat function returns null when using table field directly as count
|
||||
|
@ -1030,4 +1040,18 @@ SELECT REPEAT( '#', tire ) AS A,
|
|||
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug #26537: UNHEX() IS NULL comparison fails
|
||||
#
|
||||
SELECT UNHEX('G');
|
||||
SELECT UNHEX('G') IS NULL;
|
||||
|
||||
#
|
||||
# Bug #26281: INSERT() function mishandles NUL on boundary condition
|
||||
#
|
||||
SELECT INSERT('abc', 3, 3, '1234');
|
||||
SELECT INSERT('abc', 4, 3, '1234');
|
||||
SELECT INSERT('abc', 5, 3, '1234');
|
||||
SELECT INSERT('abc', 6, 3, '1234');
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
|
|
@ -241,6 +241,562 @@ INSERT INTO t1 (foo) VALUES (PointFromWKB(POINT(0,1)));
|
|||
INSERT INTO t1 (foo) VALUES (PointFromWKB(POINT(0,0)));
|
||||
SELECT 1 FROM t1 WHERE foo != PointFromWKB(POINT(0,0));
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#25673 - spatial index corruption, error 126 incorrect key file for table
|
||||
#
|
||||
CREATE TABLE t1 (id bigint(12) unsigned NOT NULL auto_increment,
|
||||
c2 varchar(15) collate utf8_bin default NULL,
|
||||
c1 varchar(15) collate utf8_bin default NULL,
|
||||
c3 varchar(10) collate utf8_bin default NULL,
|
||||
spatial_point point NOT NULL,
|
||||
PRIMARY KEY(id),
|
||||
SPATIAL KEY (spatial_point(32))
|
||||
)ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
|
||||
#
|
||||
INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES
|
||||
('y', 's', 'j', GeomFromText('POINT(167 74)')),
|
||||
('r', 'n', 'd', GeomFromText('POINT(215 118)')),
|
||||
('g', 'n', 'e', GeomFromText('POINT(203 98)')),
|
||||
('h', 'd', 'd', GeomFromText('POINT(54 193)')),
|
||||
('r', 'x', 'y', GeomFromText('POINT(47 69)')),
|
||||
('t', 'q', 'r', GeomFromText('POINT(109 42)')),
|
||||
('a', 'z', 'd', GeomFromText('POINT(0 154)')),
|
||||
('x', 'v', 'o', GeomFromText('POINT(174 131)')),
|
||||
('b', 'r', 'a', GeomFromText('POINT(114 253)')),
|
||||
('x', 'z', 'i', GeomFromText('POINT(163 21)')),
|
||||
('w', 'p', 'i', GeomFromText('POINT(42 102)')),
|
||||
('g', 'j', 'j', GeomFromText('POINT(170 133)')),
|
||||
('m', 'g', 'n', GeomFromText('POINT(28 22)')),
|
||||
('b', 'z', 'h', GeomFromText('POINT(174 28)')),
|
||||
('q', 'k', 'f', GeomFromText('POINT(233 73)')),
|
||||
('w', 'w', 'a', GeomFromText('POINT(124 200)')),
|
||||
('t', 'j', 'w', GeomFromText('POINT(252 101)')),
|
||||
('d', 'r', 'd', GeomFromText('POINT(98 18)')),
|
||||
('w', 'o', 'y', GeomFromText('POINT(165 31)')),
|
||||
('y', 'h', 't', GeomFromText('POINT(14 220)')),
|
||||
('d', 'p', 'u', GeomFromText('POINT(223 196)')),
|
||||
('g', 'y', 'g', GeomFromText('POINT(207 96)')),
|
||||
('x', 'm', 'n', GeomFromText('POINT(214 3)')),
|
||||
('g', 'v', 'e', GeomFromText('POINT(140 205)')),
|
||||
('g', 'm', 'm', GeomFromText('POINT(10 236)')),
|
||||
('i', 'r', 'j', GeomFromText('POINT(137 228)')),
|
||||
('w', 's', 'p', GeomFromText('POINT(115 6)')),
|
||||
('o', 'n', 'k', GeomFromText('POINT(158 129)')),
|
||||
('j', 'h', 'l', GeomFromText('POINT(129 72)')),
|
||||
('f', 'x', 'l', GeomFromText('POINT(139 207)')),
|
||||
('u', 'd', 'n', GeomFromText('POINT(125 109)')),
|
||||
('b', 'a', 'z', GeomFromText('POINT(30 32)')),
|
||||
('m', 'h', 'o', GeomFromText('POINT(251 251)')),
|
||||
('f', 'r', 'd', GeomFromText('POINT(243 211)')),
|
||||
('b', 'd', 'r', GeomFromText('POINT(232 80)')),
|
||||
('g', 'k', 'v', GeomFromText('POINT(15 100)')),
|
||||
('i', 'f', 'c', GeomFromText('POINT(109 66)')),
|
||||
('r', 't', 'j', GeomFromText('POINT(178 6)')),
|
||||
('y', 'n', 'f', GeomFromText('POINT(233 211)')),
|
||||
('f', 'y', 'm', GeomFromText('POINT(99 16)')),
|
||||
('z', 'q', 'l', GeomFromText('POINT(39 49)')),
|
||||
('j', 'c', 'r', GeomFromText('POINT(75 187)')),
|
||||
('c', 'y', 'y', GeomFromText('POINT(246 253)')),
|
||||
('w', 'u', 'd', GeomFromText('POINT(56 190)')),
|
||||
('n', 'q', 'm', GeomFromText('POINT(73 149)')),
|
||||
('d', 'y', 'a', GeomFromText('POINT(134 6)')),
|
||||
('z', 's', 'w', GeomFromText('POINT(216 225)')),
|
||||
('d', 'u', 'k', GeomFromText('POINT(132 70)')),
|
||||
('f', 'v', 't', GeomFromText('POINT(187 141)')),
|
||||
('r', 'r', 'a', GeomFromText('POINT(152 39)')),
|
||||
('y', 'p', 'o', GeomFromText('POINT(45 27)')),
|
||||
('p', 'n', 'm', GeomFromText('POINT(228 148)')),
|
||||
('e', 'g', 'e', GeomFromText('POINT(88 81)')),
|
||||
('m', 'a', 'h', GeomFromText('POINT(35 29)')),
|
||||
('m', 'h', 'f', GeomFromText('POINT(30 71)')),
|
||||
('h', 'k', 'i', GeomFromText('POINT(244 78)')),
|
||||
('z', 'v', 'd', GeomFromText('POINT(241 38)')),
|
||||
('q', 'l', 'j', GeomFromText('POINT(13 71)')),
|
||||
('s', 'p', 'g', GeomFromText('POINT(108 38)')),
|
||||
('q', 's', 'j', GeomFromText('POINT(92 101)')),
|
||||
('l', 'h', 'g', GeomFromText('POINT(120 78)')),
|
||||
('w', 't', 'b', GeomFromText('POINT(193 109)')),
|
||||
('b', 's', 's', GeomFromText('POINT(223 211)')),
|
||||
('w', 'w', 'y', GeomFromText('POINT(122 42)')),
|
||||
('q', 'c', 'c', GeomFromText('POINT(104 102)')),
|
||||
('w', 'g', 'n', GeomFromText('POINT(213 120)')),
|
||||
('p', 'q', 'a', GeomFromText('POINT(247 148)')),
|
||||
('c', 'z', 'e', GeomFromText('POINT(18 106)')),
|
||||
('z', 'u', 'n', GeomFromText('POINT(70 133)')),
|
||||
('j', 'n', 'x', GeomFromText('POINT(232 13)')),
|
||||
('e', 'h', 'f', GeomFromText('POINT(22 135)')),
|
||||
('w', 'l', 'f', GeomFromText('POINT(9 180)')),
|
||||
('a', 'v', 'q', GeomFromText('POINT(163 228)')),
|
||||
('i', 'z', 'o', GeomFromText('POINT(180 100)')),
|
||||
('e', 'c', 'l', GeomFromText('POINT(182 231)')),
|
||||
('c', 'k', 'o', GeomFromText('POINT(19 60)')),
|
||||
('q', 'f', 'p', GeomFromText('POINT(79 95)')),
|
||||
('m', 'd', 'r', GeomFromText('POINT(3 127)')),
|
||||
('m', 'e', 't', GeomFromText('POINT(136 154)')),
|
||||
('w', 'w', 'w', GeomFromText('POINT(102 15)')),
|
||||
('l', 'n', 'q', GeomFromText('POINT(71 196)')),
|
||||
('p', 'k', 'c', GeomFromText('POINT(47 139)')),
|
||||
('j', 'o', 'r', GeomFromText('POINT(177 128)')),
|
||||
('j', 'q', 'a', GeomFromText('POINT(170 6)')),
|
||||
('b', 'a', 'o', GeomFromText('POINT(63 211)')),
|
||||
('g', 's', 'o', GeomFromText('POINT(144 251)')),
|
||||
('w', 'u', 'w', GeomFromText('POINT(221 214)')),
|
||||
('g', 'a', 'm', GeomFromText('POINT(14 102)')),
|
||||
('u', 'q', 'z', GeomFromText('POINT(86 200)')),
|
||||
('k', 'a', 'm', GeomFromText('POINT(144 222)')),
|
||||
('j', 'u', 'r', GeomFromText('POINT(216 142)')),
|
||||
('q', 'k', 'v', GeomFromText('POINT(121 236)')),
|
||||
('p', 'o', 'r', GeomFromText('POINT(108 102)')),
|
||||
('b', 'd', 'x', GeomFromText('POINT(127 198)')),
|
||||
('k', 's', 'a', GeomFromText('POINT(2 150)')),
|
||||
('f', 'm', 'f', GeomFromText('POINT(160 191)')),
|
||||
('q', 'y', 'x', GeomFromText('POINT(98 111)')),
|
||||
('o', 'f', 'm', GeomFromText('POINT(232 218)')),
|
||||
('c', 'w', 'j', GeomFromText('POINT(156 165)')),
|
||||
('s', 'q', 'v', GeomFromText('POINT(98 161)'));
|
||||
SET @@RAND_SEED1=692635050, @@RAND_SEED2=297339954;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=159925977, @@RAND_SEED2=942570618;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=328169745, @@RAND_SEED2=410451954;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=178507359, @@RAND_SEED2=332493072;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=1034033013, @@RAND_SEED2=558966507;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(230 9)') where c1 like 'y%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(95 35)') where c1 like 'j%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(93 99)') where c1 like 'a%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(19 81)') where c1 like 'r%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(20 177)') where c1 like 'h%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(221 193)') where c1 like 'u%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(195 205)') where c1 like 'd%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(15 213)') where c1 like 'u%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(214 63)') where c1 like 'n%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(243 171)') where c1 like 'c%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(198 82)') where c1 like 'y%';
|
||||
INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES
|
||||
('f', 'y', 'p', GeomFromText('POINT(109 235)')),
|
||||
('b', 'e', 'v', GeomFromText('POINT(20 48)')),
|
||||
('i', 'u', 'f', GeomFromText('POINT(15 55)')),
|
||||
('o', 'r', 'z', GeomFromText('POINT(105 64)')),
|
||||
('a', 'p', 'a', GeomFromText('POINT(142 236)')),
|
||||
('g', 'i', 'k', GeomFromText('POINT(10 49)')),
|
||||
('x', 'z', 'x', GeomFromText('POINT(192 200)')),
|
||||
('c', 'v', 'r', GeomFromText('POINT(94 168)')),
|
||||
('y', 'z', 'e', GeomFromText('POINT(141 51)')),
|
||||
('h', 'm', 'd', GeomFromText('POINT(35 251)')),
|
||||
('v', 'm', 'q', GeomFromText('POINT(44 90)')),
|
||||
('j', 'l', 'z', GeomFromText('POINT(67 237)')),
|
||||
('i', 'v', 'a', GeomFromText('POINT(75 14)')),
|
||||
('b', 'q', 't', GeomFromText('POINT(153 33)')),
|
||||
('e', 'm', 'a', GeomFromText('POINT(247 49)')),
|
||||
('l', 'y', 'g', GeomFromText('POINT(56 203)')),
|
||||
('v', 'o', 'r', GeomFromText('POINT(90 54)')),
|
||||
('r', 'n', 'd', GeomFromText('POINT(135 83)')),
|
||||
('j', 't', 'u', GeomFromText('POINT(174 239)')),
|
||||
('u', 'n', 'g', GeomFromText('POINT(104 191)')),
|
||||
('p', 'q', 'y', GeomFromText('POINT(63 171)')),
|
||||
('o', 'q', 'p', GeomFromText('POINT(192 103)')),
|
||||
('f', 'x', 'e', GeomFromText('POINT(244 30)')),
|
||||
('n', 'x', 'c', GeomFromText('POINT(92 103)')),
|
||||
('r', 'q', 'z', GeomFromText('POINT(166 20)')),
|
||||
('s', 'a', 'j', GeomFromText('POINT(137 205)')),
|
||||
('z', 't', 't', GeomFromText('POINT(99 134)')),
|
||||
('o', 'm', 'j', GeomFromText('POINT(217 3)')),
|
||||
('n', 'h', 'j', GeomFromText('POINT(211 17)')),
|
||||
('v', 'v', 'a', GeomFromText('POINT(41 137)')),
|
||||
('q', 'o', 'j', GeomFromText('POINT(5 92)')),
|
||||
('z', 'y', 'e', GeomFromText('POINT(175 212)')),
|
||||
('j', 'z', 'h', GeomFromText('POINT(224 194)')),
|
||||
('a', 'g', 'm', GeomFromText('POINT(31 119)')),
|
||||
('p', 'c', 'f', GeomFromText('POINT(17 221)')),
|
||||
('t', 'h', 'k', GeomFromText('POINT(26 203)')),
|
||||
('u', 'w', 'p', GeomFromText('POINT(47 185)')),
|
||||
('z', 'a', 'c', GeomFromText('POINT(61 133)')),
|
||||
('u', 'k', 'a', GeomFromText('POINT(210 115)')),
|
||||
('k', 'f', 'h', GeomFromText('POINT(125 113)')),
|
||||
('t', 'v', 'y', GeomFromText('POINT(12 239)')),
|
||||
('u', 'v', 'd', GeomFromText('POINT(90 24)')),
|
||||
('m', 'y', 'w', GeomFromText('POINT(25 243)')),
|
||||
('d', 'n', 'g', GeomFromText('POINT(122 92)')),
|
||||
('z', 'm', 'f', GeomFromText('POINT(235 110)')),
|
||||
('q', 'd', 'f', GeomFromText('POINT(233 217)')),
|
||||
('a', 'v', 'u', GeomFromText('POINT(69 59)')),
|
||||
('x', 'k', 'p', GeomFromText('POINT(240 14)')),
|
||||
('i', 'v', 'r', GeomFromText('POINT(154 42)')),
|
||||
('w', 'h', 'l', GeomFromText('POINT(178 156)')),
|
||||
('d', 'h', 'n', GeomFromText('POINT(65 157)')),
|
||||
('c', 'k', 'z', GeomFromText('POINT(62 33)')),
|
||||
('e', 'l', 'w', GeomFromText('POINT(162 1)')),
|
||||
('r', 'f', 'i', GeomFromText('POINT(127 71)')),
|
||||
('q', 'm', 'c', GeomFromText('POINT(63 118)')),
|
||||
('c', 'h', 'u', GeomFromText('POINT(205 203)')),
|
||||
('d', 't', 'p', GeomFromText('POINT(234 87)')),
|
||||
('s', 'g', 'h', GeomFromText('POINT(149 34)')),
|
||||
('o', 'b', 'q', GeomFromText('POINT(159 179)')),
|
||||
('k', 'u', 'f', GeomFromText('POINT(202 254)')),
|
||||
('u', 'f', 'g', GeomFromText('POINT(70 15)')),
|
||||
('x', 's', 'b', GeomFromText('POINT(25 181)')),
|
||||
('s', 'c', 'g', GeomFromText('POINT(252 17)')),
|
||||
('a', 'c', 'f', GeomFromText('POINT(89 67)')),
|
||||
('r', 'e', 'q', GeomFromText('POINT(55 54)')),
|
||||
('f', 'i', 'k', GeomFromText('POINT(178 230)')),
|
||||
('p', 'e', 'l', GeomFromText('POINT(198 28)')),
|
||||
('w', 'o', 'd', GeomFromText('POINT(204 189)')),
|
||||
('c', 'a', 'g', GeomFromText('POINT(230 178)')),
|
||||
('r', 'o', 'e', GeomFromText('POINT(61 116)')),
|
||||
('w', 'a', 'a', GeomFromText('POINT(178 237)')),
|
||||
('v', 'd', 'e', GeomFromText('POINT(70 85)')),
|
||||
('k', 'c', 'e', GeomFromText('POINT(147 118)')),
|
||||
('d', 'q', 't', GeomFromText('POINT(218 77)')),
|
||||
('k', 'g', 'f', GeomFromText('POINT(192 113)')),
|
||||
('w', 'n', 'e', GeomFromText('POINT(92 124)')),
|
||||
('r', 'm', 'q', GeomFromText('POINT(130 65)')),
|
||||
('o', 'r', 'r', GeomFromText('POINT(174 233)')),
|
||||
('k', 'n', 't', GeomFromText('POINT(175 147)')),
|
||||
('q', 'm', 'r', GeomFromText('POINT(18 208)')),
|
||||
('l', 'd', 'i', GeomFromText('POINT(13 104)')),
|
||||
('w', 'o', 'y', GeomFromText('POINT(207 39)')),
|
||||
('p', 'u', 'o', GeomFromText('POINT(114 31)')),
|
||||
('y', 'a', 'p', GeomFromText('POINT(106 59)')),
|
||||
('a', 'x', 'z', GeomFromText('POINT(17 57)')),
|
||||
('v', 'h', 'x', GeomFromText('POINT(170 13)')),
|
||||
('t', 's', 'u', GeomFromText('POINT(84 18)')),
|
||||
('z', 'z', 'f', GeomFromText('POINT(250 197)')),
|
||||
('l', 'z', 't', GeomFromText('POINT(59 80)')),
|
||||
('j', 'g', 's', GeomFromText('POINT(54 26)')),
|
||||
('g', 'v', 'm', GeomFromText('POINT(89 98)')),
|
||||
('q', 'v', 'b', GeomFromText('POINT(39 240)')),
|
||||
('x', 'k', 'v', GeomFromText('POINT(246 207)')),
|
||||
('k', 'u', 'i', GeomFromText('POINT(105 111)')),
|
||||
('w', 'z', 's', GeomFromText('POINT(235 8)')),
|
||||
('d', 'd', 'd', GeomFromText('POINT(105 4)')),
|
||||
('c', 'z', 'q', GeomFromText('POINT(13 140)')),
|
||||
('m', 'k', 'i', GeomFromText('POINT(208 120)')),
|
||||
('g', 'a', 'g', GeomFromText('POINT(9 182)')),
|
||||
('z', 'j', 'r', GeomFromText('POINT(149 153)')),
|
||||
('h', 'f', 'g', GeomFromText('POINT(81 236)')),
|
||||
('m', 'e', 'q', GeomFromText('POINT(209 215)')),
|
||||
('c', 'h', 'y', GeomFromText('POINT(235 70)')),
|
||||
('i', 'e', 'g', GeomFromText('POINT(138 26)')),
|
||||
('m', 't', 'u', GeomFromText('POINT(119 237)')),
|
||||
('o', 'w', 's', GeomFromText('POINT(193 166)')),
|
||||
('f', 'm', 'q', GeomFromText('POINT(85 96)')),
|
||||
('x', 'l', 'x', GeomFromText('POINT(58 115)')),
|
||||
('x', 'q', 'u', GeomFromText('POINT(108 210)')),
|
||||
('b', 'h', 'i', GeomFromText('POINT(250 139)')),
|
||||
('y', 'd', 'x', GeomFromText('POINT(199 135)')),
|
||||
('w', 'h', 'p', GeomFromText('POINT(247 233)')),
|
||||
('p', 'z', 't', GeomFromText('POINT(148 249)')),
|
||||
('q', 'a', 'u', GeomFromText('POINT(174 78)')),
|
||||
('v', 't', 'm', GeomFromText('POINT(70 228)')),
|
||||
('t', 'n', 'f', GeomFromText('POINT(123 2)')),
|
||||
('x', 't', 'b', GeomFromText('POINT(35 50)')),
|
||||
('r', 'j', 'f', GeomFromText('POINT(200 51)')),
|
||||
('s', 'q', 'o', GeomFromText('POINT(23 184)')),
|
||||
('u', 'v', 'z', GeomFromText('POINT(7 113)')),
|
||||
('v', 'u', 'l', GeomFromText('POINT(145 190)')),
|
||||
('o', 'k', 'i', GeomFromText('POINT(161 122)')),
|
||||
('l', 'y', 'e', GeomFromText('POINT(17 232)')),
|
||||
('t', 'b', 'e', GeomFromText('POINT(120 50)')),
|
||||
('e', 's', 'u', GeomFromText('POINT(254 1)')),
|
||||
('d', 'd', 'u', GeomFromText('POINT(167 140)')),
|
||||
('o', 'b', 'x', GeomFromText('POINT(186 237)')),
|
||||
('m', 's', 's', GeomFromText('POINT(172 149)')),
|
||||
('t', 'y', 'a', GeomFromText('POINT(149 85)')),
|
||||
('x', 't', 'r', GeomFromText('POINT(10 165)')),
|
||||
('g', 'c', 'e', GeomFromText('POINT(95 165)')),
|
||||
('e', 'e', 'z', GeomFromText('POINT(98 65)')),
|
||||
('f', 'v', 'i', GeomFromText('POINT(149 144)')),
|
||||
('o', 'p', 'm', GeomFromText('POINT(233 67)')),
|
||||
('t', 'u', 'b', GeomFromText('POINT(109 215)')),
|
||||
('o', 'o', 'b', GeomFromText('POINT(130 48)')),
|
||||
('e', 'm', 'h', GeomFromText('POINT(88 189)')),
|
||||
('e', 'v', 'y', GeomFromText('POINT(55 29)')),
|
||||
('e', 't', 'm', GeomFromText('POINT(129 55)')),
|
||||
('p', 'p', 'i', GeomFromText('POINT(126 222)')),
|
||||
('c', 'i', 'c', GeomFromText('POINT(19 158)')),
|
||||
('c', 'b', 's', GeomFromText('POINT(13 19)')),
|
||||
('u', 'y', 'a', GeomFromText('POINT(114 5)')),
|
||||
('a', 'o', 'f', GeomFromText('POINT(227 232)')),
|
||||
('t', 'c', 'z', GeomFromText('POINT(63 62)')),
|
||||
('d', 'o', 'k', GeomFromText('POINT(48 228)')),
|
||||
('x', 'c', 'e', GeomFromText('POINT(204 2)')),
|
||||
('e', 'e', 'g', GeomFromText('POINT(125 43)')),
|
||||
('o', 'r', 'f', GeomFromText('POINT(171 140)'));
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(163 157)') where c1 like 'w%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(53 151)') where c1 like 'd%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(96 183)') where c1 like 'r%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(57 91)') where c1 like 'q%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(202 110)') where c1 like 'c%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(120 137)') where c1 like 'w%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(207 147)') where c1 like 'c%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(31 125)') where c1 like 'e%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(27 36)') where c1 like 'r%';
|
||||
INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES
|
||||
('b', 'c', 'e', GeomFromText('POINT(41 137)')),
|
||||
('p', 'y', 'k', GeomFromText('POINT(50 22)')),
|
||||
('s', 'c', 'h', GeomFromText('POINT(208 173)')),
|
||||
('x', 'u', 'l', GeomFromText('POINT(199 175)')),
|
||||
('s', 'r', 'h', GeomFromText('POINT(85 192)')),
|
||||
('j', 'k', 'u', GeomFromText('POINT(18 25)')),
|
||||
('p', 'w', 'h', GeomFromText('POINT(152 197)')),
|
||||
('e', 'd', 'c', GeomFromText('POINT(229 3)')),
|
||||
('o', 'x', 'k', GeomFromText('POINT(187 155)')),
|
||||
('o', 'b', 'k', GeomFromText('POINT(208 150)')),
|
||||
('d', 'a', 'j', GeomFromText('POINT(70 87)')),
|
||||
('f', 'e', 'k', GeomFromText('POINT(156 96)')),
|
||||
('u', 'y', 'p', GeomFromText('POINT(239 193)')),
|
||||
('n', 'v', 'p', GeomFromText('POINT(223 98)')),
|
||||
('z', 'j', 'r', GeomFromText('POINT(87 89)')),
|
||||
('h', 'x', 'x', GeomFromText('POINT(92 0)')),
|
||||
('r', 'v', 'r', GeomFromText('POINT(159 139)')),
|
||||
('v', 'g', 'g', GeomFromText('POINT(16 229)')),
|
||||
('z', 'k', 'u', GeomFromText('POINT(99 52)')),
|
||||
('p', 'p', 'o', GeomFromText('POINT(105 125)')),
|
||||
('w', 'h', 'y', GeomFromText('POINT(105 154)')),
|
||||
('v', 'y', 'z', GeomFromText('POINT(134 238)')),
|
||||
('x', 'o', 'o', GeomFromText('POINT(178 88)')),
|
||||
('z', 'w', 'd', GeomFromText('POINT(123 60)')),
|
||||
('q', 'f', 'u', GeomFromText('POINT(64 90)')),
|
||||
('s', 'n', 't', GeomFromText('POINT(50 138)')),
|
||||
('v', 'p', 't', GeomFromText('POINT(114 91)')),
|
||||
('a', 'o', 'n', GeomFromText('POINT(78 43)')),
|
||||
('k', 'u', 'd', GeomFromText('POINT(185 161)')),
|
||||
('w', 'd', 'n', GeomFromText('POINT(25 92)')),
|
||||
('k', 'w', 'a', GeomFromText('POINT(59 238)')),
|
||||
('t', 'c', 'f', GeomFromText('POINT(65 87)')),
|
||||
('g', 's', 'p', GeomFromText('POINT(238 126)')),
|
||||
('d', 'n', 'y', GeomFromText('POINT(107 173)')),
|
||||
('l', 'a', 'w', GeomFromText('POINT(125 152)')),
|
||||
('m', 'd', 'j', GeomFromText('POINT(146 53)')),
|
||||
('q', 'm', 'c', GeomFromText('POINT(217 187)')),
|
||||
('i', 'r', 'r', GeomFromText('POINT(6 113)')),
|
||||
('e', 'j', 'b', GeomFromText('POINT(37 83)')),
|
||||
('w', 'w', 'h', GeomFromText('POINT(83 199)')),
|
||||
('k', 'b', 's', GeomFromText('POINT(170 64)')),
|
||||
('s', 'b', 'c', GeomFromText('POINT(163 130)')),
|
||||
('c', 'h', 'a', GeomFromText('POINT(141 3)')),
|
||||
('k', 'j', 'u', GeomFromText('POINT(143 76)')),
|
||||
('r', 'h', 'o', GeomFromText('POINT(243 92)')),
|
||||
('i', 'd', 'b', GeomFromText('POINT(205 13)')),
|
||||
('r', 'y', 'q', GeomFromText('POINT(138 8)')),
|
||||
('m', 'o', 'i', GeomFromText('POINT(36 45)')),
|
||||
('v', 'g', 'm', GeomFromText('POINT(0 40)')),
|
||||
('f', 'e', 'i', GeomFromText('POINT(76 6)')),
|
||||
('c', 'q', 'q', GeomFromText('POINT(115 248)')),
|
||||
('x', 'c', 'i', GeomFromText('POINT(29 74)')),
|
||||
('l', 's', 't', GeomFromText('POINT(83 18)')),
|
||||
('t', 't', 'a', GeomFromText('POINT(26 168)')),
|
||||
('u', 'n', 'x', GeomFromText('POINT(200 110)')),
|
||||
('j', 'b', 'd', GeomFromText('POINT(216 136)')),
|
||||
('s', 'p', 'w', GeomFromText('POINT(38 156)')),
|
||||
('f', 'b', 'v', GeomFromText('POINT(29 186)')),
|
||||
('v', 'e', 'r', GeomFromText('POINT(149 40)')),
|
||||
('v', 't', 'm', GeomFromText('POINT(184 24)')),
|
||||
('y', 'g', 'a', GeomFromText('POINT(219 105)')),
|
||||
('s', 'f', 'i', GeomFromText('POINT(114 130)')),
|
||||
('e', 'q', 'h', GeomFromText('POINT(203 135)')),
|
||||
('h', 'g', 'b', GeomFromText('POINT(9 208)')),
|
||||
('o', 'l', 'r', GeomFromText('POINT(245 79)')),
|
||||
('s', 's', 'v', GeomFromText('POINT(238 198)')),
|
||||
('w', 'w', 'z', GeomFromText('POINT(209 232)')),
|
||||
('v', 'd', 'n', GeomFromText('POINT(30 193)')),
|
||||
('q', 'w', 'k', GeomFromText('POINT(133 18)')),
|
||||
('o', 'h', 'o', GeomFromText('POINT(42 140)')),
|
||||
('f', 'f', 'h', GeomFromText('POINT(145 1)')),
|
||||
('u', 's', 'r', GeomFromText('POINT(70 62)')),
|
||||
('x', 'n', 'q', GeomFromText('POINT(33 86)')),
|
||||
('u', 'p', 'v', GeomFromText('POINT(232 220)')),
|
||||
('z', 'e', 'a', GeomFromText('POINT(130 69)')),
|
||||
('r', 'u', 'z', GeomFromText('POINT(243 241)')),
|
||||
('b', 'n', 't', GeomFromText('POINT(120 12)')),
|
||||
('u', 'f', 's', GeomFromText('POINT(190 212)')),
|
||||
('a', 'd', 'q', GeomFromText('POINT(235 191)')),
|
||||
('f', 'q', 'm', GeomFromText('POINT(176 2)')),
|
||||
('n', 'c', 's', GeomFromText('POINT(218 163)')),
|
||||
('e', 'm', 'h', GeomFromText('POINT(163 108)')),
|
||||
('c', 'f', 'l', GeomFromText('POINT(220 115)')),
|
||||
('c', 'v', 'q', GeomFromText('POINT(66 45)')),
|
||||
('w', 'v', 'x', GeomFromText('POINT(251 220)')),
|
||||
('f', 'w', 'z', GeomFromText('POINT(146 149)')),
|
||||
('h', 'n', 'h', GeomFromText('POINT(148 128)')),
|
||||
('y', 'k', 'v', GeomFromText('POINT(28 110)')),
|
||||
('c', 'x', 'q', GeomFromText('POINT(13 13)')),
|
||||
('e', 'd', 's', GeomFromText('POINT(91 190)')),
|
||||
('c', 'w', 'c', GeomFromText('POINT(10 231)')),
|
||||
('u', 'j', 'n', GeomFromText('POINT(250 21)')),
|
||||
('w', 'n', 'x', GeomFromText('POINT(141 69)')),
|
||||
('f', 'p', 'y', GeomFromText('POINT(228 246)')),
|
||||
('d', 'q', 'f', GeomFromText('POINT(194 22)')),
|
||||
('d', 'z', 'l', GeomFromText('POINT(233 181)')),
|
||||
('c', 'a', 'q', GeomFromText('POINT(183 96)')),
|
||||
('m', 'i', 'd', GeomFromText('POINT(117 226)')),
|
||||
('z', 'y', 'y', GeomFromText('POINT(62 81)')),
|
||||
('g', 'v', 'm', GeomFromText('POINT(66 158)'));
|
||||
SET @@RAND_SEED1=481064922, @@RAND_SEED2=438133497;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=280535103, @@RAND_SEED2=444518646;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=1072017234, @@RAND_SEED2=484203885;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=358851897, @@RAND_SEED2=358495224;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
SET @@RAND_SEED1=509031459, @@RAND_SEED2=675962925;
|
||||
DELETE FROM t1 ORDER BY RAND() LIMIT 10;
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(61 203)') where c1 like 'y%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(202 194)') where c1 like 'f%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(228 18)') where c1 like 'h%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(88 18)') where c1 like 'l%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(176 94)') where c1 like 'e%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(44 47)') where c1 like 'g%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(95 191)') where c1 like 'b%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(179 218)') where c1 like 'y%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(239 40)') where c1 like 'g%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(248 41)') where c1 like 'q%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(167 82)') where c1 like 't%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(13 104)') where c1 like 'u%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(139 84)') where c1 like 'a%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(145 108)') where c1 like 'p%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(147 57)') where c1 like 't%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(217 144)') where c1 like 'n%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(160 224)') where c1 like 'w%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(38 28)') where c1 like 'j%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(104 114)') where c1 like 'q%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(88 19)') where c1 like 'c%';
|
||||
INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES
|
||||
('f', 'x', 'p', GeomFromText('POINT(92 181)')),
|
||||
('s', 'i', 'c', GeomFromText('POINT(49 60)')),
|
||||
('c', 'c', 'i', GeomFromText('POINT(7 57)')),
|
||||
('n', 'g', 'k', GeomFromText('POINT(252 105)')),
|
||||
('g', 'b', 'm', GeomFromText('POINT(180 11)')),
|
||||
('u', 'l', 'r', GeomFromText('POINT(32 90)')),
|
||||
('c', 'x', 'e', GeomFromText('POINT(143 24)')),
|
||||
('x', 'u', 'a', GeomFromText('POINT(123 92)')),
|
||||
('s', 'b', 'h', GeomFromText('POINT(190 108)')),
|
||||
('c', 'x', 'b', GeomFromText('POINT(104 100)')),
|
||||
('i', 'd', 't', GeomFromText('POINT(214 104)')),
|
||||
('r', 'w', 'g', GeomFromText('POINT(29 67)')),
|
||||
('b', 'f', 'g', GeomFromText('POINT(149 46)')),
|
||||
('r', 'r', 'd', GeomFromText('POINT(242 196)')),
|
||||
('j', 'l', 'a', GeomFromText('POINT(90 196)')),
|
||||
('e', 't', 'b', GeomFromText('POINT(190 64)')),
|
||||
('l', 'x', 'w', GeomFromText('POINT(250 73)')),
|
||||
('q', 'y', 'r', GeomFromText('POINT(120 182)')),
|
||||
('s', 'j', 'a', GeomFromText('POINT(180 175)')),
|
||||
('n', 'i', 'y', GeomFromText('POINT(124 136)')),
|
||||
('s', 'x', 's', GeomFromText('POINT(176 209)')),
|
||||
('u', 'f', 's', GeomFromText('POINT(215 173)')),
|
||||
('m', 'j', 'x', GeomFromText('POINT(44 140)')),
|
||||
('v', 'g', 'x', GeomFromText('POINT(177 233)')),
|
||||
('u', 't', 'b', GeomFromText('POINT(136 197)')),
|
||||
('f', 'g', 'b', GeomFromText('POINT(10 8)')),
|
||||
('v', 'c', 'j', GeomFromText('POINT(13 81)')),
|
||||
('d', 's', 'q', GeomFromText('POINT(200 100)')),
|
||||
('a', 'p', 'j', GeomFromText('POINT(33 40)')),
|
||||
('i', 'c', 'g', GeomFromText('POINT(168 204)')),
|
||||
('k', 'h', 'i', GeomFromText('POINT(93 243)')),
|
||||
('s', 'b', 's', GeomFromText('POINT(157 13)')),
|
||||
('v', 'l', 'l', GeomFromText('POINT(103 6)')),
|
||||
('r', 'b', 'k', GeomFromText('POINT(244 137)')),
|
||||
('l', 'd', 'r', GeomFromText('POINT(162 254)')),
|
||||
('q', 'b', 'z', GeomFromText('POINT(136 246)')),
|
||||
('x', 'x', 'p', GeomFromText('POINT(120 37)')),
|
||||
('m', 'e', 'z', GeomFromText('POINT(203 167)')),
|
||||
('q', 'n', 'p', GeomFromText('POINT(94 119)')),
|
||||
('b', 'g', 'u', GeomFromText('POINT(93 248)')),
|
||||
('r', 'v', 'v', GeomFromText('POINT(53 88)')),
|
||||
('y', 'a', 'i', GeomFromText('POINT(98 219)')),
|
||||
('a', 's', 'g', GeomFromText('POINT(173 138)')),
|
||||
('c', 'a', 't', GeomFromText('POINT(235 135)')),
|
||||
('q', 'm', 'd', GeomFromText('POINT(224 208)')),
|
||||
('e', 'p', 'k', GeomFromText('POINT(161 238)')),
|
||||
('n', 'g', 'q', GeomFromText('POINT(35 204)')),
|
||||
('t', 't', 'x', GeomFromText('POINT(230 178)')),
|
||||
('w', 'f', 'a', GeomFromText('POINT(150 221)')),
|
||||
('z', 'm', 'z', GeomFromText('POINT(119 42)')),
|
||||
('l', 'j', 's', GeomFromText('POINT(97 96)')),
|
||||
('f', 'z', 'x', GeomFromText('POINT(208 65)')),
|
||||
('i', 'v', 'c', GeomFromText('POINT(145 79)')),
|
||||
('l', 'f', 'k', GeomFromText('POINT(83 234)')),
|
||||
('u', 'a', 's', GeomFromText('POINT(250 49)')),
|
||||
('o', 'k', 'p', GeomFromText('POINT(46 50)')),
|
||||
('d', 'e', 'z', GeomFromText('POINT(30 198)')),
|
||||
('r', 'r', 'l', GeomFromText('POINT(78 189)')),
|
||||
('y', 'l', 'f', GeomFromText('POINT(188 132)')),
|
||||
('d', 'q', 'm', GeomFromText('POINT(247 107)')),
|
||||
('p', 'j', 'n', GeomFromText('POINT(148 227)')),
|
||||
('b', 'o', 'i', GeomFromText('POINT(172 25)')),
|
||||
('e', 'v', 'd', GeomFromText('POINT(94 248)')),
|
||||
('q', 'd', 'f', GeomFromText('POINT(15 29)')),
|
||||
('w', 'b', 'b', GeomFromText('POINT(74 111)')),
|
||||
('g', 'q', 'f', GeomFromText('POINT(107 215)')),
|
||||
('o', 'h', 'r', GeomFromText('POINT(25 168)')),
|
||||
('u', 't', 'w', GeomFromText('POINT(251 188)')),
|
||||
('h', 's', 'w', GeomFromText('POINT(254 247)')),
|
||||
('f', 'f', 'b', GeomFromText('POINT(166 103)'));
|
||||
SET @@RAND_SEED1=866613816, @@RAND_SEED2=92289615;
|
||||
INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES
|
||||
('l', 'c', 'l', GeomFromText('POINT(202 98)')),
|
||||
('k', 'c', 'b', GeomFromText('POINT(46 206)')),
|
||||
('r', 'y', 'm', GeomFromText('POINT(74 140)')),
|
||||
('y', 'z', 'd', GeomFromText('POINT(200 160)')),
|
||||
('s', 'y', 's', GeomFromText('POINT(156 205)')),
|
||||
('u', 'v', 'p', GeomFromText('POINT(86 82)')),
|
||||
('j', 's', 's', GeomFromText('POINT(91 233)')),
|
||||
('x', 'j', 'f', GeomFromText('POINT(3 14)')),
|
||||
('l', 'z', 'v', GeomFromText('POINT(123 156)')),
|
||||
('h', 'i', 'o', GeomFromText('POINT(145 229)')),
|
||||
('o', 'r', 'd', GeomFromText('POINT(15 22)')),
|
||||
('f', 'x', 't', GeomFromText('POINT(21 60)')),
|
||||
('t', 'g', 'h', GeomFromText('POINT(50 153)')),
|
||||
('g', 'u', 'b', GeomFromText('POINT(82 85)')),
|
||||
('v', 'a', 'p', GeomFromText('POINT(231 178)')),
|
||||
('n', 'v', 'o', GeomFromText('POINT(183 25)')),
|
||||
('j', 'n', 'm', GeomFromText('POINT(50 144)')),
|
||||
('e', 'f', 'i', GeomFromText('POINT(46 16)')),
|
||||
('d', 'w', 'a', GeomFromText('POINT(66 6)')),
|
||||
('f', 'x', 'a', GeomFromText('POINT(107 197)')),
|
||||
('m', 'o', 'a', GeomFromText('POINT(142 80)')),
|
||||
('q', 'l', 'g', GeomFromText('POINT(251 23)')),
|
||||
('c', 's', 's', GeomFromText('POINT(158 43)')),
|
||||
('y', 'd', 'o', GeomFromText('POINT(196 228)')),
|
||||
('d', 'p', 'l', GeomFromText('POINT(107 5)')),
|
||||
('h', 'a', 'b', GeomFromText('POINT(183 166)')),
|
||||
('m', 'w', 'p', GeomFromText('POINT(19 59)')),
|
||||
('b', 'y', 'o', GeomFromText('POINT(178 30)')),
|
||||
('x', 'w', 'i', GeomFromText('POINT(168 94)')),
|
||||
('t', 'k', 'z', GeomFromText('POINT(171 5)')),
|
||||
('r', 'm', 'a', GeomFromText('POINT(222 19)')),
|
||||
('u', 'v', 'e', GeomFromText('POINT(224 80)')),
|
||||
('q', 'r', 'k', GeomFromText('POINT(212 218)')),
|
||||
('d', 'p', 'j', GeomFromText('POINT(169 7)')),
|
||||
('d', 'r', 'v', GeomFromText('POINT(193 23)')),
|
||||
('n', 'y', 'y', GeomFromText('POINT(130 178)')),
|
||||
('m', 'z', 'r', GeomFromText('POINT(81 200)')),
|
||||
('j', 'e', 'w', GeomFromText('POINT(145 239)')),
|
||||
('v', 'h', 'x', GeomFromText('POINT(24 105)')),
|
||||
('z', 'm', 'a', GeomFromText('POINT(175 129)')),
|
||||
('b', 'c', 'v', GeomFromText('POINT(213 10)')),
|
||||
('t', 't', 'u', GeomFromText('POINT(2 129)')),
|
||||
('r', 's', 'v', GeomFromText('POINT(209 192)')),
|
||||
('x', 'p', 'g', GeomFromText('POINT(43 63)')),
|
||||
('t', 'e', 'u', GeomFromText('POINT(139 210)')),
|
||||
('l', 'e', 't', GeomFromText('POINT(245 148)')),
|
||||
('a', 'i', 'k', GeomFromText('POINT(167 195)')),
|
||||
('m', 'o', 'h', GeomFromText('POINT(206 120)')),
|
||||
('g', 'z', 's', GeomFromText('POINT(169 240)')),
|
||||
('z', 'u', 's', GeomFromText('POINT(202 120)')),
|
||||
('i', 'b', 'a', GeomFromText('POINT(216 18)')),
|
||||
('w', 'y', 'g', GeomFromText('POINT(119 236)')),
|
||||
('h', 'y', 'p', GeomFromText('POINT(161 24)'));
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(33 100)') where c1 like 't%';
|
||||
UPDATE t1 set spatial_point=GeomFromText('POINT(41 46)') where c1 like 'f%';
|
||||
CHECK TABLE t1 EXTENDED;
|
||||
DROP TABLE t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
|
|
|
@ -162,3 +162,36 @@ INSERT INTO t2 VALUES (1), (3);
|
|||
--error ER_BAD_FIELD_ERROR
|
||||
INSERT INTO t1 SELECT 1, COUNT(*) FROM t2 ON DUPLICATE KEY UPDATE j= a;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
#
|
||||
# Bug #26261: Missing default value isn't noticed in
|
||||
# insert ... on duplicate key update
|
||||
#
|
||||
SET SQL_MODE = 'TRADITIONAL';
|
||||
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY, b INT NOT NULL);
|
||||
|
||||
--error 1364
|
||||
INSERT INTO t1 (a) VALUES (1);
|
||||
|
||||
--error 1364
|
||||
INSERT INTO t1 (a) VALUES (1) ON DUPLICATE KEY UPDATE a = b;
|
||||
|
||||
--error 1364
|
||||
INSERT INTO t1 (a) VALUES (1) ON DUPLICATE KEY UPDATE b = b;
|
||||
|
||||
SELECT * FROM t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#27033: 0 as LAST_INSERT_ID() after INSERT .. ON DUPLICATE if rows were
|
||||
# touched but not actually changed.
|
||||
#
|
||||
CREATE TABLE t1 (f1 INT AUTO_INCREMENT PRIMARY KEY,
|
||||
f2 VARCHAR(5) NOT NULL UNIQUE);
|
||||
INSERT t1 (f2) VALUES ('test') ON DUPLICATE KEY UPDATE f1 = LAST_INSERT_ID(f1);
|
||||
SELECT LAST_INSERT_ID();
|
||||
INSERT t1 (f2) VALUES ('test') ON DUPLICATE KEY UPDATE f1 = LAST_INSERT_ID(f1);
|
||||
SELECT LAST_INSERT_ID();
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -430,6 +430,32 @@ CREATE TABLE tm1(a SMALLINT, b SMALLINT, KEY(a)) ENGINE=MERGE UNION=(t1);
|
|||
SELECT * FROM tm1;
|
||||
DROP TABLE t1, tm1;
|
||||
|
||||
#
|
||||
# Bug#26464 - insert delayed + update + merge = corruption
|
||||
#
|
||||
CREATE TABLE t1(c1 INT) ENGINE=MyISAM;
|
||||
CREATE TABLE t2(c1 INT) ENGINE=MERGE UNION=(t1);
|
||||
--error 1031
|
||||
INSERT DELAYED INTO t2 VALUES(1);
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
#
|
||||
# BUG#26881 - Large MERGE tables report incorrect specification when no
|
||||
# differences in tables
|
||||
#
|
||||
CREATE TABLE t1(c1 VARCHAR(1));
|
||||
CREATE TABLE m1 LIKE t1;
|
||||
ALTER TABLE m1 ENGINE=MERGE UNION=(t1);
|
||||
SELECT * FROM m1;
|
||||
DROP TABLE t1, m1;
|
||||
|
||||
CREATE TABLE t1(c1 VARCHAR(4), c2 TINYINT, c3 TINYINT, c4 TINYINT,
|
||||
c5 TINYINT, c6 TINYINT, c7 TINYINT, c8 TINYINT, c9 TINYINT);
|
||||
CREATE TABLE m1 LIKE t1;
|
||||
ALTER TABLE m1 ENGINE=MERGE UNION=(t1);
|
||||
SELECT * FROM m1;
|
||||
DROP TABLE t1, m1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
|
|
84
mysql-test/t/ndb_single_user.test
Normal file
84
mysql-test/t/ndb_single_user.test
Normal file
|
@ -0,0 +1,84 @@
|
|||
-- source include/have_ndb.inc
|
||||
-- source include/have_multi_ndb.inc
|
||||
-- source include/ndb_default_cluster.inc
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
--disable_warnings
|
||||
use test;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
|
||||
--enable_warnings
|
||||
|
||||
# operations allowed while cluster is in single user mode
|
||||
|
||||
--connection server1
|
||||
--let $node_id= `SHOW STATUS LIKE 'Ndb_cluster_node_id'`
|
||||
--disable_query_log
|
||||
--eval set @node_id= SUBSTRING('$node_id', 20)+0
|
||||
--enable_query_log
|
||||
--let $node_id= `SELECT @node_id`
|
||||
--exec $NDB_MGM --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" -e "enter single user mode $node_id" >> $NDB_TOOLS_OUTPUT
|
||||
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" --single-user >> $NDB_TOOLS_OUTPUT
|
||||
|
||||
# verify that we are indeed in single user mode
|
||||
--connection server2
|
||||
--error 1005
|
||||
create table t1 (a int key, b int unique, c int) engine ndb;
|
||||
|
||||
# test some sql on first mysqld
|
||||
--connection server1
|
||||
create table t1 (a int key, b int unique, c int) engine ndb;
|
||||
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
|
||||
create table t2 as select * from t1;
|
||||
# read with pk
|
||||
select * from t1 where a = 1;
|
||||
# read with unique index
|
||||
select * from t1 where b = 4;
|
||||
# read with ordered index
|
||||
select * from t1 where a > 4 order by a;
|
||||
# update with pk
|
||||
update t1 set b=102 where a = 2;
|
||||
# update with unique index
|
||||
update t1 set b=103 where b = 3;
|
||||
# update with full table scan
|
||||
update t1 set b=b+100;
|
||||
# update with ordered insex scan
|
||||
update t1 set b=b+100 where a > 7;
|
||||
# delete with full table scan
|
||||
delete from t1;
|
||||
insert into t1 select * from t2;
|
||||
|
||||
# test some sql on other mysqld
|
||||
--connection server2
|
||||
--error 1051
|
||||
drop table t1;
|
||||
--error 1146
|
||||
#--error 1296
|
||||
create index new_index on t1 (c);
|
||||
--error 1146
|
||||
#--error 1296
|
||||
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
|
||||
--error 1146
|
||||
#--error 1296
|
||||
select * from t1 where a = 1;
|
||||
--error 1146
|
||||
#--error 1296
|
||||
select * from t1 where b = 4;
|
||||
--error 1146
|
||||
#--error 1296
|
||||
update t1 set b=102 where a = 2;
|
||||
--error 1146
|
||||
#--error 1296
|
||||
update t1 set b=103 where b = 3;
|
||||
--error 1146
|
||||
#--error 1296
|
||||
update t1 set b=b+100;
|
||||
--error 1146
|
||||
#--error 1296
|
||||
update t1 set b=b+100 where a > 7;
|
||||
|
||||
--exec $NDB_MGM --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" -e "exit single user mode" >> $NDB_TOOLS_OUTPUT
|
||||
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults >> $NDB_TOOLS_OUTPUT
|
||||
|
||||
# cleanup
|
||||
--connection server1
|
||||
drop table t1;
|
|
@ -327,3 +327,18 @@ SELECT * FROM v1;
|
|||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug #26830: derived table with ROLLUP
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a int, KEY (a));
|
||||
INSERT INTO t1 VALUES (3), (1), (4), (1), (3), (1), (1);
|
||||
|
||||
SELECT * FROM (SELECT a, SUM(a) FROM t1 GROUP BY a WITH ROLLUP) as t;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -669,3 +669,26 @@ SELECT t2.b FROM t1 LEFT JOIN (t2, t3 LEFT JOIN t4 ON t3.a=t4.a)
|
|||
ON (t1.a=t2.a AND t1.b=t3.b) order by t2.b;
|
||||
|
||||
DROP TABLE t1,t2,t3,t4;
|
||||
|
||||
#
|
||||
# Bug#25376: Incomplete setup of ORDER BY clause results in a wrong result.
|
||||
#
|
||||
create table t1 (a int, b int, c int);
|
||||
insert into t1 values (1,2,3), (9,8,3), (19,4,3), (1,4,9);
|
||||
select a,(sum(b)/sum(c)) as ratio from t1 group by a order by sum(b)/sum(c) asc;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#26672: Incorrect SEC_TO_TIME() casting in ORDER BY
|
||||
#
|
||||
CREATE TABLE t1 (a INT UNSIGNED NOT NULL, b TIME);
|
||||
INSERT INTO t1 (a) VALUES (100000), (0), (100), (1000000),(10000), (1000), (10);
|
||||
UPDATE t1 SET b = SEC_TO_TIME(a);
|
||||
|
||||
-- Correct ORDER
|
||||
SELECT a, b FROM t1 ORDER BY b DESC;
|
||||
|
||||
-- must be ordered as the above
|
||||
SELECT a, b FROM t1 ORDER BY SEC_TO_TIME(a) DESC;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -3103,7 +3103,16 @@ SELECT t3.a FROM t1,t2,t3
|
|||
t3.c IN ('bb','ee');
|
||||
|
||||
DROP TABLE t1,t2,t3;
|
||||
|
||||
|
||||
#
|
||||
# WL3527: Extend IGNORE INDEX so places where index is ignored can
|
||||
# be specified
|
||||
#
|
||||
CREATE TABLE t1 (a INT, b INT, KEY (a)); INSERT INTO t1 VALUES (1,1),(2,2);
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a = 1;
|
||||
EXPLAIN SELECT 1 FROM t1 IGNORE INDEX FOR JOIN (a) WHERE a = 1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#25172: Not checked buffer size leads to a server crash
|
||||
#
|
||||
|
@ -3299,4 +3308,51 @@ SELECT * FROM t1 LEFT JOIN t2 ON t1.name=t2.name;
|
|||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
|
||||
#
|
||||
# Bug #26963: join with predicates that contain fields from equalities evaluated
|
||||
# to constants after constant table substitution
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (
|
||||
access_id int NOT NULL default '0',
|
||||
name varchar(20) default NULL,
|
||||
rank int NOT NULL default '0',
|
||||
KEY idx (access_id)
|
||||
);
|
||||
|
||||
CREATE TABLE t2 (
|
||||
faq_group_id int NOT NULL default '0',
|
||||
faq_id int NOT NULL default '0',
|
||||
access_id int default NULL,
|
||||
UNIQUE KEY idx1 (faq_id),
|
||||
KEY idx2 (faq_group_id,faq_id)
|
||||
);
|
||||
|
||||
INSERT INTO t1 VALUES
|
||||
(1,'Everyone',2),(2,'Help',3),(3,'Technical Support',1),(4,'Chat User',4);
|
||||
INSERT INTO t2 VALUES
|
||||
(261,265,1),(490,494,1);
|
||||
|
||||
|
||||
SELECT t2.faq_id
|
||||
FROM t1 INNER JOIN t2 IGNORE INDEX (idx1)
|
||||
ON (t1.access_id = t2.access_id)
|
||||
LEFT JOIN t2 t
|
||||
ON (t.faq_group_id = t2.faq_group_id AND
|
||||
find_in_set(t.access_id, '1,4') < find_in_set(t2.access_id, '1,4'))
|
||||
WHERE
|
||||
t2.access_id IN (1,4) AND t.access_id IS NULL AND t2.faq_id in (265);
|
||||
|
||||
SELECT t2.faq_id
|
||||
FROM t1 INNER JOIN t2
|
||||
ON (t1.access_id = t2.access_id)
|
||||
LEFT JOIN t2 t
|
||||
ON (t.faq_group_id = t2.faq_group_id AND
|
||||
find_in_set(t.access_id, '1,4') < find_in_set(t2.access_id, '1,4'))
|
||||
WHERE
|
||||
t2.access_id IN (1,4) AND t.access_id IS NULL AND t2.faq_id in (265);
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
|
|
@ -108,3 +108,11 @@ DROP PROCEDURE p3;
|
|||
DROP FUNCTION f1;
|
||||
DROP FUNCTION f2;
|
||||
DROP FUNCTION f3;
|
||||
|
||||
#
|
||||
# Bug#26285 Selecting information_schema crahes server
|
||||
#
|
||||
select count(*) from information_schema.COLUMN_PRIVILEGES;
|
||||
select count(*) from information_schema.SCHEMA_PRIVILEGES;
|
||||
select count(*) from information_schema.TABLE_PRIVILEGES;
|
||||
select count(*) from information_schema.USER_PRIVILEGES;
|
||||
|
|
|
@ -6738,6 +6738,21 @@ select func_8407_b()|
|
|||
drop function func_8407_a|
|
||||
drop function func_8407_b|
|
||||
|
||||
#
|
||||
# Bug#25373: Stored functions wasn't compared correctly which leads to a wrong
|
||||
# result.
|
||||
#
|
||||
--disable_warnings
|
||||
DROP FUNCTION IF EXISTS bug25373|
|
||||
--disable_warnings
|
||||
CREATE FUNCTION bug25373(p1 INTEGER) RETURNS INTEGER
|
||||
LANGUAGE SQL DETERMINISTIC
|
||||
RETURN p1;|
|
||||
CREATE TABLE t3 (f1 INT, f2 FLOAT)|
|
||||
INSERT INTO t3 VALUES (1, 3.4), (1, 2), (1, 0.9), (2, 8), (2, 7)|
|
||||
SELECT SUM(f2), bug25373(f1) FROM t3 GROUP BY bug25373(f1) WITH ROLLUP|
|
||||
DROP FUNCTION bug25373|
|
||||
DROP TABLE t3|
|
||||
#
|
||||
# NOTE: The delimiter is `|`, and not `;`. It is changed to `;`
|
||||
# at the end of the file!
|
||||
|
|
|
@ -2729,3 +2729,16 @@ DROP TABLE t1;
|
|||
DROP TABLE t2;
|
||||
DROP TABLE t1xt2;
|
||||
|
||||
#
|
||||
# Bug #26728: derived table with concatanation of literals in select list
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a int);
|
||||
INSERT INTO t1 VALUES (3), (1), (2);
|
||||
|
||||
SELECT 'this is ' 'a test.' AS col1, a AS col2 FROM t1;
|
||||
SELECT * FROM (SELECT 'this is ' 'a test.' AS col1, a AS t2 FROM t1) t;
|
||||
|
||||
DROP table t1;
|
||||
|
||||
|
||||
|
|
|
@ -1699,4 +1699,42 @@ DROP TABLE bug22580_t1;
|
|||
DROP PROCEDURE bug22580_proc_1;
|
||||
DROP PROCEDURE bug22580_proc_2;
|
||||
|
||||
#
|
||||
# Bug#27006: AFTER UPDATE triggers not fired with INSERT ... ON DUPLICATE KEY
|
||||
# UPDATE if the row wasn't actually changed.
|
||||
#
|
||||
--disable_warnings
|
||||
DROP TRIGGER IF EXISTS trg27006_a_update;
|
||||
DROP TRIGGER IF EXISTS trg27006_a_insert;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (
|
||||
`id` int(10) unsigned NOT NULL auto_increment,
|
||||
`val` varchar(10) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
CREATE TABLE t2 like t1;
|
||||
DELIMITER |;
|
||||
|
||||
CREATE TRIGGER trg27006_a_insert AFTER INSERT ON t1 FOR EACH ROW
|
||||
BEGIN
|
||||
insert into t2 values (NULL,new.val);
|
||||
END |
|
||||
CREATE TRIGGER trg27006_a_update AFTER UPDATE ON t1 FOR EACH ROW
|
||||
BEGIN
|
||||
insert into t2 values (NULL,new.val);
|
||||
END |
|
||||
DELIMITER ;|
|
||||
|
||||
INSERT INTO t1(val) VALUES ('test1'),('test2');
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
INSERT INTO t1 VALUES (2,'test2') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
INSERT INTO t1 VALUES (3,'test3') ON DUPLICATE KEY UPDATE val=VALUES(val);
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
DROP TRIGGER trg27006_a_insert;
|
||||
DROP TRIGGER trg27006_a_update;
|
||||
drop table t1,t2;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
|
|
@ -855,4 +855,17 @@ drop table t1, t2;
|
|||
#
|
||||
select _utf8'12' union select _latin1'12345';
|
||||
|
||||
#
|
||||
# Bug #26661: UNION with ORDER BY undefined column in FROM list
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a int);
|
||||
INSERT INTO t1 VALUES (3),(1),(2),(4),(1);
|
||||
|
||||
SELECT a FROM (SELECT a FROM t1 UNION SELECT a FROM t1 ORDER BY a) AS test;
|
||||
--error 1054
|
||||
SELECT a FROM (SELECT a FROM t1 UNION SELECT a FROM t1 ORDER BY c) AS test;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
|
|
@ -306,6 +306,14 @@ create table t1(f1 int, `*f2` int);
|
|||
insert into t1 values (1,1);
|
||||
update t1 set `*f2`=1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#25126: Wrongly resolved field leads to a crash
|
||||
#
|
||||
create table t1(f1 int);
|
||||
--error 1054
|
||||
update t1 set f2=1 order by f2;
|
||||
drop table t1;
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
|
|
|
@ -3163,4 +3163,44 @@ drop view view_24532_a;
|
|||
drop view view_24532_b;
|
||||
drop table table_24532;
|
||||
|
||||
#
|
||||
# Bug#26560: view using subquery with a reference to an outer alias
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (
|
||||
lid int NOT NULL PRIMARY KEY,
|
||||
name char(10) NOT NULL
|
||||
);
|
||||
INSERT INTO t1 (lid, name) VALUES
|
||||
(1, 'YES'), (2, 'NO');
|
||||
|
||||
CREATE TABLE t2 (
|
||||
id int NOT NULL PRIMARY KEY,
|
||||
gid int NOT NULL,
|
||||
lid int NOT NULL,
|
||||
dt date
|
||||
);
|
||||
INSERT INTO t2 (id, gid, lid, dt) VALUES
|
||||
(1, 1, 1, '2007-01-01'),(2, 1, 2, '2007-01-02'),
|
||||
(3, 2, 2, '2007-02-01'),(4, 2, 1, '2007-02-02');
|
||||
|
||||
SELECT DISTINCT t2.gid AS lgid,
|
||||
(SELECT t1.name FROM t1, t2
|
||||
WHERE t1.lid = t2.lid AND t2.gid = lgid
|
||||
ORDER BY t2.dt DESC LIMIT 1
|
||||
) as clid
|
||||
FROM t2;
|
||||
|
||||
CREATE VIEW v1 AS
|
||||
SELECT DISTINCT t2.gid AS lgid,
|
||||
(SELECT t1.name FROM t1, t2
|
||||
WHERE t1.lid = t2.lid AND t2.gid = lgid
|
||||
ORDER BY t2.dt DESC LIMIT 1
|
||||
) as clid
|
||||
FROM t2;
|
||||
SELECT * FROM v1;
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP table t1,t2;
|
||||
|
||||
--echo End of 5.0 tests.
|
||||
|
|
|
@ -39,7 +39,7 @@ ADD_LIBRARY(mysys array.c charset-def.c charset.c checksum.c default.c default_m
|
|||
my_mkdir.c my_mmap.c my_net.c my_once.c my_open.c my_pread.c my_pthread.c
|
||||
my_quick.c my_read.c my_realloc.c my_redel.c my_rename.c my_seek.c my_sleep.c
|
||||
my_static.c my_symlink.c my_symlink2.c my_sync.c my_thr_init.c my_wincond.c
|
||||
my_windac.c my_winsem.c my_winthread.c my_write.c ptr_cmp.c queues.c
|
||||
my_windac.c my_winthread.c my_write.c ptr_cmp.c queues.c
|
||||
rijndael.c safemalloc.c sha1.c string.c thr_alarm.c thr_lock.c thr_mutex.c
|
||||
thr_rwlock.c tree.c typelib.c base64.c my_memmem.c
|
||||
my_getpagesize.c)
|
||||
|
|
|
@ -50,7 +50,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \
|
|||
my_sync.c my_getopt.c my_mkdir.c \
|
||||
default_modify.c default.c \
|
||||
my_compress.c checksum.c raid.cc \
|
||||
my_net.c my_semaphore.c my_port.c my_sleep.c \
|
||||
my_net.c my_port.c my_sleep.c \
|
||||
charset.c charset-def.c my_bitmap.c my_bit.c md5.c \
|
||||
my_gethostbyname.c rijndael.c my_aes.c sha1.c \
|
||||
my_handler.c my_netware.c my_largepage.c \
|
||||
|
@ -58,7 +58,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \
|
|||
my_windac.c my_access.c base64.c my_libwrap.c
|
||||
EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \
|
||||
thr_mutex.c thr_rwlock.c mf_soundex.c my_conio.c \
|
||||
my_wincond.c my_winsem.c my_winthread.c CMakeLists.txt
|
||||
my_wincond.c my_winthread.c CMakeLists.txt
|
||||
libmysys_a_LIBADD = @THREAD_LOBJECTS@
|
||||
# test_dir_DEPENDENCIES= $(LIBRARIES)
|
||||
# testhash_DEPENDENCIES= $(LIBRARIES)
|
||||
|
|
|
@ -1,103 +0,0 @@
|
|||
/* Copyright (C) 2002-2003 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; version 2 of the License.
|
||||
|
||||
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 */
|
||||
|
||||
/*
|
||||
Simple implementation of semaphores, needed to compile MySQL on systems
|
||||
that doesn't support semaphores.
|
||||
*/
|
||||
|
||||
#include <my_global.h>
|
||||
#include <my_semaphore.h>
|
||||
#include <errno.h>
|
||||
|
||||
#if !defined(__WIN__) && !defined(HAVE_SEMAPHORE_H) && defined(THREAD)
|
||||
|
||||
int sem_init(sem_t * sem, int pshared, uint value)
|
||||
{
|
||||
sem->count=value;
|
||||
pthread_cond_init(&sem->cond, 0);
|
||||
pthread_mutex_init(&sem->mutex, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sem_destroy(sem_t * sem)
|
||||
{
|
||||
int err1,err2;
|
||||
err1=pthread_cond_destroy(&sem->cond);
|
||||
err2=pthread_mutex_destroy(&sem->mutex);
|
||||
if (err1 || err2)
|
||||
{
|
||||
errno=err1 ? err1 : err2;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sem_wait(sem_t * sem)
|
||||
{
|
||||
if ((errno=pthread_mutex_lock(&sem->mutex)))
|
||||
return -1;
|
||||
while (!sem->count)
|
||||
pthread_cond_wait(&sem->cond, &sem->mutex);
|
||||
if (errno)
|
||||
return -1;
|
||||
sem->count--; /* mutex is locked here */
|
||||
pthread_mutex_unlock(&sem->mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sem_trywait(sem_t * sem)
|
||||
{
|
||||
if ((errno=pthread_mutex_lock(&sem->mutex)))
|
||||
return -1;
|
||||
if (sem->count)
|
||||
sem->count--;
|
||||
else
|
||||
errno=EAGAIN;
|
||||
pthread_mutex_unlock(&sem->mutex);
|
||||
return errno ? -1 : 0;
|
||||
}
|
||||
|
||||
|
||||
int sem_post(sem_t * sem)
|
||||
{
|
||||
if ((errno=pthread_mutex_lock(&sem->mutex)))
|
||||
return -1;
|
||||
sem->count++;
|
||||
pthread_mutex_unlock(&sem->mutex); /* does it really matter what to do */
|
||||
pthread_cond_signal(&sem->cond); /* first: x_unlock or x_signal ? */
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sem_post_multiple(sem_t * sem, uint count)
|
||||
{
|
||||
if ((errno=pthread_mutex_lock(&sem->mutex)))
|
||||
return -1;
|
||||
sem->count+=count;
|
||||
pthread_mutex_unlock(&sem->mutex); /* does it really matter what to do */
|
||||
pthread_cond_broadcast(&sem->cond); /* first: x_unlock or x_broadcast ? */
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sem_getvalue(sem_t * sem, uint *sval)
|
||||
{
|
||||
if ((errno=pthread_mutex_lock(&sem->mutex)))
|
||||
return -1;
|
||||
*sval=sem->count;
|
||||
pthread_mutex_unlock(&sem->mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* !defined(__WIN__) && !defined(HAVE_SEMAPHORE_H) && defined(THREAD) */
|
|
@ -1,406 +0,0 @@
|
|||
/*
|
||||
* -------------------------------------------------------------
|
||||
*
|
||||
* Module: my_semaphore.c (Original: semaphore.c from pthreads library)
|
||||
*
|
||||
* Purpose:
|
||||
* Semaphores aren't actually part of the PThreads standard.
|
||||
* They are defined by the POSIX Standard:
|
||||
*
|
||||
* POSIX 1003.1b-1993 (POSIX.1b)
|
||||
*
|
||||
* -------------------------------------------------------------
|
||||
*
|
||||
* Pthreads-win32 - POSIX Threads Library for Win32
|
||||
* Copyright (C) 1998
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
/*
|
||||
NEED_SEM is not used in MySQL and should only be needed under
|
||||
Windows CE.
|
||||
|
||||
The big changes compared to the original version was to not allocate
|
||||
any additional memory in sem_init() but to instead store everthing
|
||||
we need in sem_t.
|
||||
|
||||
TODO:
|
||||
To get HAVE_CREATESEMAPHORE we have to define the struct
|
||||
in my_semaphore.h
|
||||
*/
|
||||
|
||||
#include "mysys_priv.h"
|
||||
#ifdef __WIN__
|
||||
#include "my_semaphore.h"
|
||||
#include <errno.h>
|
||||
|
||||
/*
|
||||
DOCPUBLIC
|
||||
This function initializes an unnamed semaphore. the
|
||||
initial value of the semaphore is 'value'
|
||||
|
||||
PARAMETERS
|
||||
sem Pointer to an instance of sem_t
|
||||
|
||||
pshared If zero, this semaphore may only be shared between
|
||||
threads in the same process.
|
||||
If nonzero, the semaphore can be shared between
|
||||
processes
|
||||
|
||||
value Initial value of the semaphore counter
|
||||
|
||||
RESULTS
|
||||
0 Successfully created semaphore,
|
||||
-1 Failed, error in errno
|
||||
|
||||
ERRNO
|
||||
EINVAL 'sem' is not a valid semaphore,
|
||||
ENOSPC A required resource has been exhausted,
|
||||
ENOSYS Semaphores are not supported,
|
||||
EPERM The process lacks appropriate privilege
|
||||
|
||||
*/
|
||||
|
||||
int
|
||||
sem_init (sem_t *sem, int pshared, unsigned int value)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (pshared != 0)
|
||||
{
|
||||
/*
|
||||
We don't support creating a semaphore that can be shared between
|
||||
processes
|
||||
*/
|
||||
result = EPERM;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifndef HAVE_CREATESEMAPHORE
|
||||
sem->value = value;
|
||||
sem->event = CreateEvent(NULL,
|
||||
FALSE, /* manual reset */
|
||||
FALSE, /* initial state */
|
||||
NULL);
|
||||
if (!sem->event)
|
||||
result = ENOSPC;
|
||||
else
|
||||
{
|
||||
if (value)
|
||||
SetEvent(sem->event);
|
||||
InitializeCriticalSection(&sem->sem_lock_cs);
|
||||
}
|
||||
#else /* HAVE_CREATESEMAPHORE */
|
||||
*sem = CreateSemaphore (NULL, /* Always NULL */
|
||||
value, /* Initial value */
|
||||
0x7FFFFFFFL, /* Maximum value */
|
||||
NULL); /* Name */
|
||||
if (!*sem)
|
||||
result = ENOSPC;
|
||||
#endif /* HAVE_CREATESEMAPHORE */
|
||||
}
|
||||
if (result != 0)
|
||||
{
|
||||
errno = result;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
} /* sem_init */
|
||||
|
||||
|
||||
/*
|
||||
DOCPUBLIC
|
||||
This function destroys an unnamed semaphore.
|
||||
|
||||
PARAMETERS
|
||||
sem Pointer to an instance of sem_t
|
||||
|
||||
RESULTS
|
||||
0 Successfully destroyed semaphore,
|
||||
-1 Failed, error in errno
|
||||
ERRNO
|
||||
EINVAL 'sem' is not a valid semaphore,
|
||||
ENOSYS Semaphores are not supported,
|
||||
EBUSY Threads (or processes) are currently blocked on 'sem'
|
||||
*/
|
||||
|
||||
int
|
||||
sem_destroy (sem_t * sem)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
#ifdef EXTRA_DEBUG
|
||||
if (sem == NULL || *sem == NULL)
|
||||
{
|
||||
errno=EINVAL;
|
||||
return;
|
||||
}
|
||||
#endif /* EXTRA_DEBUG */
|
||||
|
||||
#ifndef HAVE_CREATESEMAPHORE
|
||||
if (! CloseHandle(sem->event))
|
||||
result = EINVAL;
|
||||
else
|
||||
DeleteCriticalSection(&sem->sem_lock_cs);
|
||||
#else /* HAVE_CREATESEMAPHORE */
|
||||
if (!CloseHandle(*sem))
|
||||
result = EINVAL;
|
||||
#endif /* HAVE_CREATESEMAPHORE */
|
||||
if (result)
|
||||
{
|
||||
errno = result;
|
||||
return -1;
|
||||
}
|
||||
*sem=0; /* Safety */
|
||||
return 0;
|
||||
} /* sem_destroy */
|
||||
|
||||
|
||||
/*
|
||||
DOCPUBLIC
|
||||
This function tries to wait on a semaphore. If the
|
||||
semaphore value is greater than zero, it decreases
|
||||
its value by one. If the semaphore value is zero, then
|
||||
this function returns immediately with the error EAGAIN
|
||||
|
||||
PARAMETERS
|
||||
sem Pointer to an instance of sem_t
|
||||
|
||||
RESULTS
|
||||
0 Successfully decreased semaphore,
|
||||
-1 Failed, error in errno
|
||||
|
||||
ERRNO
|
||||
EAGAIN The semaphore was already locked,
|
||||
EINVAL 'sem' is not a valid semaphore,
|
||||
ENOSYS Semaphores are not supported,
|
||||
EINTR The function was interrupted by a signal,
|
||||
EDEADLK A deadlock condition was detected.
|
||||
*/
|
||||
|
||||
int
|
||||
sem_trywait(sem_t * sem)
|
||||
{
|
||||
#ifndef HAVE_CREATESEMAPHORE
|
||||
/* not yet implemented! */
|
||||
int errno = EINVAL;
|
||||
return -1;
|
||||
#else /* HAVE_CREATESEMAPHORE */
|
||||
#ifdef EXTRA_DEBUG
|
||||
if (sem == NULL || *sem == NULL)
|
||||
{
|
||||
errno=EINVAL;
|
||||
return -1;
|
||||
}
|
||||
#endif /* EXTRA_DEBUG */
|
||||
if (WaitForSingleObject (*sem, 0) == WAIT_TIMEOUT)
|
||||
{
|
||||
errno= EAGAIN;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
#endif /* HAVE_CREATESEMAPHORE */
|
||||
|
||||
} /* sem_trywait */
|
||||
|
||||
|
||||
#ifndef HAVE_CREATESEMAPHORE
|
||||
|
||||
static void
|
||||
ptw32_decrease_semaphore(sem_t * sem)
|
||||
{
|
||||
EnterCriticalSection(&sem->sem_lock_cs);
|
||||
DBUG_ASSERT(sem->value != 0);
|
||||
sem->value--;
|
||||
if (sem->value != 0)
|
||||
SetEvent(sem->event);
|
||||
LeaveCriticalSection(&sem->sem_lock_cs);
|
||||
}
|
||||
|
||||
static BOOL
|
||||
ptw32_increase_semaphore(sem_t * sem, unsigned int n)
|
||||
{
|
||||
BOOL result=FALSE;
|
||||
|
||||
EnterCriticalSection(&sem->sem_lock_cs);
|
||||
if (sem->value + n > sem->value)
|
||||
{
|
||||
sem->value += n;
|
||||
SetEvent(sem->event);
|
||||
result = TRUE;
|
||||
}
|
||||
LeaveCriticalSection(&sem->sem_lock_cs);
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif /* HAVE_CREATESEMAPHORE */
|
||||
|
||||
|
||||
/*
|
||||
------------------------------------------------------
|
||||
DOCPUBLIC
|
||||
This function waits on a semaphore. If the
|
||||
semaphore value is greater than zero, it decreases
|
||||
its value by one. If the semaphore value is zero, then
|
||||
the calling thread (or process) is blocked until it can
|
||||
successfully decrease the value or until interrupted by
|
||||
a signal.
|
||||
|
||||
PARAMETERS
|
||||
sem Pointer to an instance of sem_t
|
||||
|
||||
RESULTS
|
||||
0 Successfully decreased semaphore,
|
||||
-1 Failed, error in errno
|
||||
|
||||
ERRNO
|
||||
EINVAL 'Sem' is not a valid semaphore,
|
||||
ENOSYS Semaphores are not supported,
|
||||
EINTR The function was interrupted by a signal,
|
||||
EDEADLK A deadlock condition was detected.
|
||||
*/
|
||||
|
||||
int
|
||||
sem_wait(sem_t *sem)
|
||||
{
|
||||
int result;
|
||||
|
||||
#ifdef EXTRA_DEBUG
|
||||
if (sem == NULL || *sem == NULL)
|
||||
{
|
||||
errno=EINVAL;
|
||||
return -1;
|
||||
}
|
||||
#endif /* EXTRA_DEBUG */
|
||||
|
||||
#ifndef HAVE_CREATESEMAPHORE
|
||||
result=WaitForSingleObject(sem->event, INFINITE);
|
||||
#else
|
||||
result=WaitForSingleObject(*sem, INFINITE);
|
||||
#endif
|
||||
if (result == WAIT_FAILED || result == WAIT_ABANDONED_0)
|
||||
result = EINVAL;
|
||||
else if (result == WAIT_TIMEOUT)
|
||||
result = ETIMEDOUT;
|
||||
else
|
||||
result=0;
|
||||
if (result)
|
||||
{
|
||||
errno = result;
|
||||
return -1;
|
||||
}
|
||||
#ifndef HAVE_CREATESEMAPHORE
|
||||
ptw32_decrease_semaphore(sem);
|
||||
#endif /* HAVE_CREATESEMAPHORE */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
------------------------------------------------------
|
||||
DOCPUBLIC
|
||||
This function posts a wakeup to a semaphore. If there
|
||||
are waiting threads (or processes), one is awakened;
|
||||
otherwise, the semaphore value is incremented by one.
|
||||
|
||||
PARAMETERS
|
||||
sem Pointer to an instance of sem_t
|
||||
|
||||
RESULTS
|
||||
0 Successfully posted semaphore,
|
||||
-1 Failed, error in errno
|
||||
|
||||
ERRNO
|
||||
EINVAL 'sem' is not a valid semaphore,
|
||||
ENOSYS Semaphores are not supported,
|
||||
|
||||
*/
|
||||
|
||||
int
|
||||
sem_post (sem_t * sem)
|
||||
{
|
||||
#ifdef EXTRA_DEBUG
|
||||
if (sem == NULL || *sem == NULL)
|
||||
{
|
||||
errno=EINVAL;
|
||||
return -1;
|
||||
}
|
||||
#endif /* EXTRA_DEBUG */
|
||||
|
||||
#ifndef HAVE_CREATESEMAPHORE
|
||||
if (! ptw32_increase_semaphore(sem, 1))
|
||||
#else /* HAVE_CREATESEMAPHORE */
|
||||
if (! ReleaseSemaphore(*sem, 1, 0))
|
||||
#endif /* HAVE_CREATESEMAPHORE */
|
||||
{
|
||||
errno=EINVAL;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
------------------------------------------------------
|
||||
DOCPUBLIC
|
||||
This function posts multiple wakeups to a semaphore. If there
|
||||
are waiting threads (or processes), n <= count are awakened;
|
||||
the semaphore value is incremented by count - n.
|
||||
|
||||
PARAMETERS
|
||||
sem Pointer to an instance of sem_t
|
||||
count Counter, must be greater than zero.
|
||||
|
||||
RESULTS
|
||||
0 Successfully posted semaphore,
|
||||
-1 Failed, error in errno
|
||||
|
||||
ERRNO
|
||||
EINVAL 'sem' is not a valid semaphore or count is less
|
||||
than or equal to zero.
|
||||
*/
|
||||
|
||||
int
|
||||
sem_post_multiple (sem_t * sem, unsigned int count)
|
||||
{
|
||||
#ifdef EXTRA_DEBUG
|
||||
if (sem == NULL || *sem == NULL || count <= 0)
|
||||
{
|
||||
errno=EINVAL;
|
||||
return -1;
|
||||
}
|
||||
#endif /* EXTRA_DEBUG */
|
||||
#ifndef HAVE_CREATESEMAPHORE
|
||||
if (! ptw32_increase_semaphore (sem, count))
|
||||
#else /* HAVE_CREATESEMAPHORE */
|
||||
if (! ReleaseSemaphore(*sem, count, 0))
|
||||
#endif /* HAVE_CREATESEMAPHORE */
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sem_getvalue (sem_t *sem, unsigned int *sval)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
} /* sem_getvalue */
|
||||
|
||||
#endif /* __WIN__ */
|
|
@ -2910,9 +2910,7 @@ Dbdict::execCREATE_TABLE_REQ(Signal* signal){
|
|||
break;
|
||||
}
|
||||
|
||||
if(getNodeState().getSingleUserMode() &&
|
||||
(refToNode(signal->getSendersBlockRef()) !=
|
||||
getNodeState().getSingleUserApi()))
|
||||
if (checkSingleUserMode(signal->getSendersBlockRef()))
|
||||
{
|
||||
jam();
|
||||
parseRecord.errorCode = CreateTableRef::SingleUser;
|
||||
|
@ -3081,9 +3079,7 @@ Dbdict::execALTER_TABLE_REQ(Signal* signal)
|
|||
return;
|
||||
}
|
||||
|
||||
if(getNodeState().getSingleUserMode() &&
|
||||
(refToNode(signal->getSendersBlockRef()) !=
|
||||
getNodeState().getSingleUserApi()))
|
||||
if (checkSingleUserMode(signal->getSendersBlockRef()))
|
||||
{
|
||||
jam();
|
||||
alterTableRef(signal, req, AlterTableRef::SingleUser);
|
||||
|
@ -5414,9 +5410,7 @@ Dbdict::execDROP_TABLE_REQ(Signal* signal){
|
|||
return;
|
||||
}
|
||||
|
||||
if(getNodeState().getSingleUserMode() &&
|
||||
(refToNode(signal->getSendersBlockRef()) !=
|
||||
getNodeState().getSingleUserApi()))
|
||||
if (checkSingleUserMode(signal->getSendersBlockRef()))
|
||||
{
|
||||
jam();
|
||||
dropTableRef(signal, req, DropTableRef::SingleUser);
|
||||
|
@ -6553,9 +6547,7 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal)
|
|||
jam();
|
||||
tmperr = CreateIndxRef::Busy;
|
||||
}
|
||||
else if(getNodeState().getSingleUserMode() &&
|
||||
(refToNode(senderRef) !=
|
||||
getNodeState().getSingleUserApi()))
|
||||
else if (checkSingleUserMode(senderRef))
|
||||
{
|
||||
jam();
|
||||
tmperr = CreateIndxRef::SingleUser;
|
||||
|
@ -7130,9 +7122,7 @@ Dbdict::execDROP_INDX_REQ(Signal* signal)
|
|||
jam();
|
||||
tmperr = DropIndxRef::Busy;
|
||||
}
|
||||
else if(getNodeState().getSingleUserMode() &&
|
||||
(refToNode(senderRef) !=
|
||||
getNodeState().getSingleUserApi()))
|
||||
else if (checkSingleUserMode(senderRef))
|
||||
{
|
||||
jam();
|
||||
tmperr = DropIndxRef::SingleUser;
|
||||
|
@ -10574,4 +10564,20 @@ Dbdict::getMetaAttribute(MetaData::Attribute& attr, const MetaData::Table& table
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
return 1 if all of the below is true
|
||||
a) node in single user mode
|
||||
b) senderRef is not a db node
|
||||
c) senderRef nodeid is not the singleUserApi
|
||||
*/
|
||||
|
||||
int Dbdict::checkSingleUserMode(Uint32 senderRef)
|
||||
{
|
||||
Uint32 nodeId = refToNode(senderRef);
|
||||
return
|
||||
getNodeState().getSingleUserMode() &&
|
||||
(getNodeInfo(nodeId).m_type != NodeInfo::DB) &&
|
||||
(nodeId != getNodeState().getSingleUserApi());
|
||||
}
|
||||
|
||||
CArray<KeyDescriptor> g_key_descriptor_pool;
|
||||
|
|
|
@ -2003,6 +2003,8 @@ private:
|
|||
int getMetaTable(MetaData::Table& table, const char* tableName);
|
||||
int getMetaAttribute(MetaData::Attribute& attribute, const MetaData::Table& table, Uint32 attributeId);
|
||||
int getMetaAttribute(MetaData::Attribute& attribute, const MetaData::Table& table, const char* attributeName);
|
||||
|
||||
int checkSingleUserMode(Uint32 senderRef);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -800,7 +800,9 @@ NdbBlob::writeDataPrivate(const char* buf, Uint32 bytes)
|
|||
DBUG_RETURN(-1);
|
||||
Uint32 n = thePartSize - off;
|
||||
if (n > len) {
|
||||
memset(thePartBuf.data + off + len, theFillChar, n - len);
|
||||
/* If we are adding data at the end, fill rest of part. */
|
||||
if (pos + len >= theLength)
|
||||
memset(thePartBuf.data + off + len, theFillChar, n - len);
|
||||
n = len;
|
||||
}
|
||||
memcpy(thePartBuf.data + off, buf, n);
|
||||
|
|
|
@ -880,6 +880,7 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal,
|
|||
r = m_transporter->sendSignal(signal, aNodeId);
|
||||
}
|
||||
if(r != 0){
|
||||
m_error.code= 4007;
|
||||
m_transporter->unlock_mutex();
|
||||
continue;
|
||||
}
|
||||
|
@ -903,7 +904,10 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal,
|
|||
* Handle error codes
|
||||
*/
|
||||
if(m_waiter.m_state == WAIT_NODE_FAILURE)
|
||||
{
|
||||
m_error.code = 4013;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(m_waiter.m_state == WST_WAIT_TIMEOUT)
|
||||
{
|
||||
|
|
|
@ -55,7 +55,7 @@ NdbRecAttr::setup(const NdbColumnImpl* anAttrInfo, char* aValue)
|
|||
|
||||
if (theStorageX)
|
||||
delete[] theStorageX;
|
||||
|
||||
|
||||
// check alignment to signal data
|
||||
// a future version could check alignment per data type as well
|
||||
|
||||
|
@ -181,7 +181,7 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
|
|||
out << "[NULL]";
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
const NdbDictionary::Column* c = r.getColumn();
|
||||
uint length = c->getLength();
|
||||
if (length > 1)
|
||||
|
@ -192,196 +192,200 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
|
|||
if (j > 0)
|
||||
out << " ";
|
||||
|
||||
switch(r.getType())
|
||||
{
|
||||
case NdbDictionary::Column::Bigunsigned:
|
||||
out << r.u_64_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Bit:
|
||||
out << hex << "H'" << r.u_32_value() << dec;
|
||||
break;
|
||||
case NdbDictionary::Column::Unsigned:
|
||||
out << r.u_32_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Smallunsigned:
|
||||
out << r.u_short_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Tinyunsigned:
|
||||
out << (unsigned) r.u_char_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Bigint:
|
||||
out << r.int64_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Int:
|
||||
out << r.int32_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Smallint:
|
||||
out << r.short_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Tinyint:
|
||||
out << (int) r.char_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Binary:
|
||||
ndbrecattr_print_string(out,"Binary",r.aRef(),r.arraySize());
|
||||
j = r.arraySize();
|
||||
break;
|
||||
case NdbDictionary::Column::Char:
|
||||
ndbrecattr_print_string(out,"Char",r.aRef(),r.arraySize());
|
||||
j = length;
|
||||
break;
|
||||
case NdbDictionary::Column::Varchar:
|
||||
{
|
||||
unsigned len = *(const unsigned char*)r.aRef();
|
||||
ndbrecattr_print_string(out,"Varchar", r.aRef()+1,len);
|
||||
j = length;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Varbinary:
|
||||
{
|
||||
unsigned len = *(const unsigned char*)r.aRef();
|
||||
ndbrecattr_print_string(out,"Varbinary", r.aRef()+1,len);
|
||||
j = length;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Float:
|
||||
out << r.float_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Double:
|
||||
out << r.double_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Olddecimal:
|
||||
{
|
||||
short len = 1 + c->getPrecision() + (c->getScale() > 0);
|
||||
out.print("%.*s", len, r.aRef());
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Olddecimalunsigned:
|
||||
{
|
||||
short len = 0 + c->getPrecision() + (c->getScale() > 0);
|
||||
out.print("%.*s", len, r.aRef());
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Decimal:
|
||||
case NdbDictionary::Column::Decimalunsigned:
|
||||
goto unknown; // TODO
|
||||
break;
|
||||
// for dates cut-and-paste from field.cc
|
||||
case NdbDictionary::Column::Datetime:
|
||||
{
|
||||
ulonglong tmp=r.u_64_value();
|
||||
long part1,part2,part3;
|
||||
part1=(long) (tmp/LL(1000000));
|
||||
part2=(long) (tmp - (ulonglong) part1*LL(1000000));
|
||||
char buf[40];
|
||||
char* pos=(char*) buf+19;
|
||||
*pos--=0;
|
||||
*pos--= (char) ('0'+(char) (part2%10)); part2/=10;
|
||||
*pos--= (char) ('0'+(char) (part2%10)); part3= (int) (part2 / 10);
|
||||
*pos--= ':';
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos--= ':';
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos--= (char) ('0'+(char) part3);
|
||||
*pos--= '/';
|
||||
*pos--= (char) ('0'+(char) (part1%10)); part1/=10;
|
||||
*pos--= (char) ('0'+(char) (part1%10)); part1/=10;
|
||||
*pos--= '-';
|
||||
*pos--= (char) ('0'+(char) (part1%10)); part1/=10;
|
||||
*pos--= (char) ('0'+(char) (part1%10)); part3= (int) (part1/10);
|
||||
*pos--= '-';
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos=(char) ('0'+(char) part3);
|
||||
out << buf;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Date:
|
||||
{
|
||||
uint32 tmp=(uint32) uint3korr(r.aRef());
|
||||
int part;
|
||||
char buf[40];
|
||||
char *pos=(char*) buf+10;
|
||||
*pos--=0;
|
||||
part=(int) (tmp & 31);
|
||||
*pos--= (char) ('0'+part%10);
|
||||
*pos--= (char) ('0'+part/10);
|
||||
*pos--= '-';
|
||||
part=(int) (tmp >> 5 & 15);
|
||||
*pos--= (char) ('0'+part%10);
|
||||
*pos--= (char) ('0'+part/10);
|
||||
*pos--= '-';
|
||||
part=(int) (tmp >> 9);
|
||||
*pos--= (char) ('0'+part%10); part/=10;
|
||||
*pos--= (char) ('0'+part%10); part/=10;
|
||||
*pos--= (char) ('0'+part%10); part/=10;
|
||||
*pos= (char) ('0'+part);
|
||||
out << buf;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Time:
|
||||
{
|
||||
long tmp=(long) sint3korr(r.aRef());
|
||||
int hour=(uint) (tmp/10000);
|
||||
int minute=(uint) (tmp/100 % 100);
|
||||
int second=(uint) (tmp % 100);
|
||||
char buf[40];
|
||||
sprintf(buf, "%02d:%02d:%02d", hour, minute, second);
|
||||
out << buf;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Year:
|
||||
{
|
||||
uint year = 1900 + r.u_char_value();
|
||||
char buf[40];
|
||||
sprintf(buf, "%04d", year);
|
||||
out << buf;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Timestamp:
|
||||
{
|
||||
time_t time = r.u_32_value();
|
||||
out << (uint)time;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Blob:
|
||||
case NdbDictionary::Column::Text:
|
||||
{
|
||||
// user defined aRef() may not be aligned to Uint64
|
||||
NdbBlob::Head head;
|
||||
memcpy(&head, r.aRef(), sizeof(head));
|
||||
out << head.length << ":";
|
||||
const unsigned char* p = (const unsigned char*)r.aRef() + sizeof(head);
|
||||
if (r.arraySize() < sizeof(head))
|
||||
out << "***error***"; // really cannot happen
|
||||
else {
|
||||
unsigned n = r.arraySize() - sizeof(head);
|
||||
for (unsigned k = 0; k < n && k < head.length; k++) {
|
||||
if (r.getType() == NdbDictionary::Column::Blob)
|
||||
out.print("%02X", (int)p[k]);
|
||||
else
|
||||
out.print("%c", (int)p[k]);
|
||||
}
|
||||
}
|
||||
j = length;
|
||||
}
|
||||
switch(r.getType()){
|
||||
case NdbDictionary::Column::Bigunsigned:
|
||||
out << r.u_64_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Longvarchar:
|
||||
{
|
||||
unsigned len = uint2korr(r.aRef());
|
||||
ndbrecattr_print_string(out,"Longvarchar", r.aRef()+2,len);
|
||||
j = length;
|
||||
case NdbDictionary::Column::Bit:
|
||||
out << hex << "H'" << r.u_32_value() << dec;
|
||||
break;
|
||||
case NdbDictionary::Column::Unsigned:
|
||||
out << r.u_32_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Smallunsigned:
|
||||
out << r.u_short_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Tinyunsigned:
|
||||
out << (unsigned) r.u_char_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Bigint:
|
||||
out << r.int64_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Int:
|
||||
out << r.int32_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Smallint:
|
||||
out << r.short_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Tinyint:
|
||||
out << (int) r.char_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Binary:
|
||||
j = r.arraySize();
|
||||
ndbrecattr_print_string(out,"Binary", r.aRef(), j);
|
||||
break;
|
||||
case NdbDictionary::Column::Char:
|
||||
j = length;
|
||||
ndbrecattr_print_string(out,"Char", r.aRef(), r.arraySize());
|
||||
break;
|
||||
case NdbDictionary::Column::Varchar:
|
||||
{
|
||||
unsigned len = *(const unsigned char*)r.aRef();
|
||||
ndbrecattr_print_string(out,"Varchar", r.aRef()+1,len);
|
||||
j = length;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Varbinary:
|
||||
{
|
||||
unsigned len = *(const unsigned char*)r.aRef();
|
||||
ndbrecattr_print_string(out,"Varbinary", r.aRef()+1,len);
|
||||
j = length;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Float:
|
||||
out << r.float_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Double:
|
||||
out << r.double_value();
|
||||
break;
|
||||
case NdbDictionary::Column::Olddecimal:
|
||||
{
|
||||
short len = 1 + c->getPrecision() + (c->getScale() > 0);
|
||||
out.print("%.*s", len, r.aRef());
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Olddecimalunsigned:
|
||||
{
|
||||
short len = 0 + c->getPrecision() + (c->getScale() > 0);
|
||||
out.print("%.*s", len, r.aRef());
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Decimal:
|
||||
case NdbDictionary::Column::Decimalunsigned:
|
||||
goto unknown; // TODO
|
||||
break;
|
||||
// for dates cut-and-paste from field.cc
|
||||
case NdbDictionary::Column::Datetime:
|
||||
{
|
||||
ulonglong tmp=r.u_64_value();
|
||||
long part1,part2,part3;
|
||||
part1=(long) (tmp/LL(1000000));
|
||||
part2=(long) (tmp - (ulonglong) part1*LL(1000000));
|
||||
char buf[40];
|
||||
char* pos=(char*) buf+19;
|
||||
*pos--=0;
|
||||
*pos--= (char) ('0'+(char) (part2%10)); part2/=10;
|
||||
*pos--= (char) ('0'+(char) (part2%10)); part3= (int) (part2 / 10);
|
||||
*pos--= ':';
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos--= ':';
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos--= (char) ('0'+(char) part3);
|
||||
*pos--= '/';
|
||||
*pos--= (char) ('0'+(char) (part1%10)); part1/=10;
|
||||
*pos--= (char) ('0'+(char) (part1%10)); part1/=10;
|
||||
*pos--= '-';
|
||||
*pos--= (char) ('0'+(char) (part1%10)); part1/=10;
|
||||
*pos--= (char) ('0'+(char) (part1%10)); part3= (int) (part1/10);
|
||||
*pos--= '-';
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
|
||||
*pos=(char) ('0'+(char) part3);
|
||||
out << buf;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Date:
|
||||
{
|
||||
uint32 tmp=(uint32) uint3korr(r.aRef());
|
||||
int part;
|
||||
char buf[40];
|
||||
char *pos=(char*) buf+10;
|
||||
*pos--=0;
|
||||
part=(int) (tmp & 31);
|
||||
*pos--= (char) ('0'+part%10);
|
||||
*pos--= (char) ('0'+part/10);
|
||||
*pos--= '-';
|
||||
part=(int) (tmp >> 5 & 15);
|
||||
*pos--= (char) ('0'+part%10);
|
||||
*pos--= (char) ('0'+part/10);
|
||||
*pos--= '-';
|
||||
part=(int) (tmp >> 9);
|
||||
*pos--= (char) ('0'+part%10); part/=10;
|
||||
*pos--= (char) ('0'+part%10); part/=10;
|
||||
*pos--= (char) ('0'+part%10); part/=10;
|
||||
*pos= (char) ('0'+part);
|
||||
out << buf;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Time:
|
||||
{
|
||||
long tmp=(long) sint3korr(r.aRef());
|
||||
int hour=(uint) (tmp/10000);
|
||||
int minute=(uint) (tmp/100 % 100);
|
||||
int second=(uint) (tmp % 100);
|
||||
char buf[40];
|
||||
sprintf(buf, "%02d:%02d:%02d", hour, minute, second);
|
||||
out << buf;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Year:
|
||||
{
|
||||
uint year = 1900 + r.u_char_value();
|
||||
char buf[40];
|
||||
sprintf(buf, "%04d", year);
|
||||
out << buf;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Timestamp:
|
||||
{
|
||||
time_t time = r.u_32_value();
|
||||
out << (uint)time;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Blob:
|
||||
case NdbDictionary::Column::Text:
|
||||
{
|
||||
// user defined aRef() may not be aligned to Uint64
|
||||
NdbBlob::Head head;
|
||||
memcpy(&head, r.aRef(), sizeof(head));
|
||||
out << head.length << ":";
|
||||
const unsigned char* p = (const unsigned char*)r.aRef() + sizeof(head);
|
||||
if (r.arraySize() < sizeof(head))
|
||||
out << "***error***"; // really cannot happen
|
||||
else {
|
||||
unsigned n = r.arraySize() - sizeof(head);
|
||||
for (unsigned k = 0; k < n && k < head.length; k++) {
|
||||
if (r.getType() == NdbDictionary::Column::Blob)
|
||||
out.print("%02X", (int)p[k]);
|
||||
else
|
||||
out.print("%c", (int)p[k]);
|
||||
}
|
||||
break;
|
||||
unknown:
|
||||
default: /* no print functions for the rest, just print type */
|
||||
out << (int) r.getType();
|
||||
j = length;
|
||||
if (j > 1)
|
||||
out << " " << j << " times";
|
||||
break;
|
||||
}
|
||||
j = length;
|
||||
}
|
||||
break;
|
||||
case NdbDictionary::Column::Longvarchar:
|
||||
{
|
||||
unsigned len = uint2korr(r.aRef());
|
||||
ndbrecattr_print_string(out,"Longvarchar", r.aRef()+2,len);
|
||||
j = length;
|
||||
}
|
||||
break;
|
||||
|
||||
case NdbDictionary::Column::Undefined:
|
||||
case NdbDictionary::Column::Mediumint:
|
||||
case NdbDictionary::Column::Mediumunsigned:
|
||||
case NdbDictionary::Column::Longvarbinary:
|
||||
unknown:
|
||||
//default: /* no print functions for the rest, just print type */
|
||||
out << (int) r.getType();
|
||||
j = length;
|
||||
if (j > 1)
|
||||
out << " " << j << " times";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (length > 1)
|
||||
|
|
|
@ -137,10 +137,12 @@ ErrorBundle ErrorCodes[] = {
|
|||
/**
|
||||
* Unknown result
|
||||
*/
|
||||
{ 4007, UR, "Send to ndbd node failed" },
|
||||
{ 4008, UR, "Receive from NDB failed" },
|
||||
{ 4009, UR, "Cluster Failure" },
|
||||
{ 4012, UR,
|
||||
"Request ndbd time-out, maybe due to high load or communication problems"},
|
||||
{ 4013, UR, "Request timed out in waiting for node failure"},
|
||||
{ 4024, UR,
|
||||
"Time-out, most likely caused by simple read or cluster failure" },
|
||||
|
||||
|
|
|
@ -138,6 +138,7 @@ printusage()
|
|||
<< " 2 readData / writeData" << endl
|
||||
<< "bug tests (no blob test)" << endl
|
||||
<< " -bug 4088 ndb api hang with mixed ops on index table" << endl
|
||||
<< " -bug 27018 middle partial part write clobbers rest of part" << endl
|
||||
<< " -bug nnnn delete + write gives 626" << endl
|
||||
<< " -bug nnnn acc crash on delete and long key" << endl
|
||||
;
|
||||
|
@ -1806,6 +1807,56 @@ bugtest_4088()
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bugtest_27018()
|
||||
{
|
||||
DBG("bug test 27018 - middle partial part write clobbers rest of part");
|
||||
|
||||
// insert rows
|
||||
calcTups(false);
|
||||
CHK(insertPk(false) == 0);
|
||||
// new trans
|
||||
for (unsigned k= 0; k < g_opt.m_rows; k++)
|
||||
{
|
||||
Tup& tup= g_tups[k];
|
||||
|
||||
CHK((g_con= g_ndb->startTransaction()) != 0);
|
||||
CHK((g_opr= g_con->getNdbOperation(g_opt.m_tname)) != 0);
|
||||
CHK(g_opr->updateTuple() == 0);
|
||||
CHK(g_opr->equal("PK1", tup.m_pk1) == 0);
|
||||
if (g_opt.m_pk2len != 0)
|
||||
CHK(g_opr->equal("PK2", tup.m_pk2) == 0);
|
||||
CHK(getBlobHandles(g_opr) == 0);
|
||||
CHK(g_con->execute(NoCommit) == 0);
|
||||
|
||||
/* Update one byte in random position. */
|
||||
Uint32 offset= urandom(tup.m_blob1.m_len);
|
||||
tup.m_blob1.m_buf[0]= 0xff ^ tup.m_blob1.m_val[offset];
|
||||
CHK(g_bh1->setPos(offset) == 0);
|
||||
CHK(g_bh1->writeData(&(tup.m_blob1.m_buf[0]), 1) == 0);
|
||||
CHK(g_con->execute(Commit) == 0);
|
||||
g_ndb->closeTransaction(g_con);
|
||||
|
||||
CHK((g_con= g_ndb->startTransaction()) != 0);
|
||||
CHK((g_opr= g_con->getNdbOperation(g_opt.m_tname)) != 0);
|
||||
CHK(g_opr->readTuple() == 0);
|
||||
CHK(g_opr->equal("PK1", tup.m_pk1) == 0);
|
||||
if (g_opt.m_pk2len != 0)
|
||||
CHK(g_opr->equal("PK2", tup.m_pk2) == 0);
|
||||
CHK(getBlobHandles(g_opr) == 0);
|
||||
|
||||
CHK(g_bh1->getValue(tup.m_blob1.m_buf, tup.m_blob1.m_len) == 0);
|
||||
CHK(g_con->execute(Commit) == 0);
|
||||
Uint64 len= ~0;
|
||||
CHK(g_bh1->getLength(len) == 0 && len == tup.m_blob1.m_len);
|
||||
tup.m_blob1.m_buf[offset]^= 0xff;
|
||||
CHK(memcmp(tup.m_blob1.m_buf, tup.m_blob1.m_val, tup.m_blob1.m_len) == 0);
|
||||
g_ndb->closeTransaction(g_con);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bugtest_2222()
|
||||
{
|
||||
|
@ -1822,7 +1873,8 @@ static struct {
|
|||
int m_bug;
|
||||
int (*m_test)();
|
||||
} g_bugtest[] = {
|
||||
{ 4088, bugtest_4088 }
|
||||
{ 4088, bugtest_4088 },
|
||||
{ 27018, bugtest_27018 }
|
||||
};
|
||||
|
||||
NDB_COMMAND(testOdbcDriver, "testBlobs", "testBlobs", "testBlobs", 65535)
|
||||
|
|
|
@ -30,12 +30,14 @@ waitClusterStatus(const char* _addr, ndb_mgm_node_status _status,
|
|||
unsigned int _timeout);
|
||||
|
||||
enum ndb_waiter_options {
|
||||
OPT_WAIT_STATUS_NOT_STARTED = NDB_STD_OPTIONS_LAST
|
||||
OPT_WAIT_STATUS_NOT_STARTED = NDB_STD_OPTIONS_LAST,
|
||||
OPT_WAIT_STATUS_SINGLE_USER
|
||||
};
|
||||
NDB_STD_OPTS_VARS;
|
||||
|
||||
static int _no_contact = 0;
|
||||
static int _not_started = 0;
|
||||
static int _single_user = 0;
|
||||
static int _timeout = 120;
|
||||
|
||||
const char *load_default_groups[]= { "mysql_cluster",0 };
|
||||
|
@ -49,6 +51,10 @@ static struct my_option my_long_options[] =
|
|||
{ "not-started", OPT_WAIT_STATUS_NOT_STARTED, "Wait for cluster not started",
|
||||
(gptr*) &_not_started, (gptr*) &_not_started, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
|
||||
{ "single-user", OPT_WAIT_STATUS_SINGLE_USER,
|
||||
"Wait for cluster to enter single user mode",
|
||||
(gptr*) &_single_user, (gptr*) &_single_user, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
|
||||
{ "timeout", 't', "Timeout to wait",
|
||||
(gptr*) &_timeout, (gptr*) &_timeout, 0,
|
||||
GET_INT, REQUIRED_ARG, 120, 0, 0, 0, 0, 0 },
|
||||
|
@ -90,6 +96,10 @@ int main(int argc, char** argv){
|
|||
{
|
||||
wait_status= NDB_MGM_NODE_STATUS_NOT_STARTED;
|
||||
}
|
||||
else if (_single_user)
|
||||
{
|
||||
wait_status= NDB_MGM_NODE_STATUS_SINGLEUSER;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait_status= NDB_MGM_NODE_STATUS_STARTED;
|
||||
|
|
|
@ -1011,6 +1011,7 @@ bool Field::type_can_have_key_part(enum enum_field_types type)
|
|||
case MYSQL_TYPE_BLOB:
|
||||
case MYSQL_TYPE_VAR_STRING:
|
||||
case MYSQL_TYPE_STRING:
|
||||
case MYSQL_TYPE_GEOMETRY:
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
|
|
|
@ -225,7 +225,7 @@ public:
|
|||
ptr=ptr_arg; null_ptr=null_ptr_arg; null_bit=null_bit_arg;
|
||||
}
|
||||
inline void move_field(char *ptr_arg) { ptr=ptr_arg; }
|
||||
inline void move_field(my_ptrdiff_t ptr_diff)
|
||||
virtual inline void move_field(my_ptrdiff_t ptr_diff)
|
||||
{
|
||||
ptr=ADD_TO_PTR(ptr,ptr_diff,char*);
|
||||
if (null_ptr)
|
||||
|
@ -1407,6 +1407,11 @@ public:
|
|||
Field *new_key_field(MEM_ROOT *root, struct st_table *new_table,
|
||||
char *new_ptr, uchar *new_null_ptr,
|
||||
uint new_null_bit);
|
||||
inline void move_field(my_ptrdiff_t ptr_diff)
|
||||
{
|
||||
Field::move_field(ptr_diff);
|
||||
bit_ptr= ADD_TO_PTR(bit_ptr, ptr_diff, uchar*);
|
||||
}
|
||||
void set_bit_ptr(uchar *bit_ptr_arg, uchar bit_ofs_arg)
|
||||
{
|
||||
bit_ptr= bit_ptr_arg;
|
||||
|
|
|
@ -1298,7 +1298,10 @@ sortlength(THD *thd, SORT_FIELD *sortorder, uint s_length,
|
|||
}
|
||||
else
|
||||
{
|
||||
switch ((sortorder->result_type=sortorder->item->result_type())) {
|
||||
sortorder->result_type= sortorder->item->result_type();
|
||||
if (sortorder->item->result_as_longlong())
|
||||
sortorder->result_type= INT_RESULT;
|
||||
switch (sortorder->result_type) {
|
||||
case STRING_RESULT:
|
||||
sortorder->length=sortorder->item->max_length;
|
||||
set_if_smaller(sortorder->length, thd->variables.max_sort_length);
|
||||
|
|
|
@ -342,6 +342,12 @@ int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out,
|
|||
RETURN VALUE
|
||||
0 - Equal definitions.
|
||||
1 - Different definitions.
|
||||
|
||||
TODO
|
||||
- compare FULLTEXT keys;
|
||||
- compare SPATIAL keys;
|
||||
- compare FIELD_SKIP_ZERO which is converted to FIELD_NORMAL correctly
|
||||
(should be corretly detected in table2myisam).
|
||||
*/
|
||||
|
||||
int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo,
|
||||
|
@ -367,6 +373,28 @@ int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo,
|
|||
{
|
||||
HA_KEYSEG *t1_keysegs= t1_keyinfo[i].seg;
|
||||
HA_KEYSEG *t2_keysegs= t2_keyinfo[i].seg;
|
||||
if (t1_keyinfo[i].flag & HA_FULLTEXT && t2_keyinfo[i].flag & HA_FULLTEXT)
|
||||
continue;
|
||||
else if (t1_keyinfo[i].flag & HA_FULLTEXT ||
|
||||
t2_keyinfo[i].flag & HA_FULLTEXT)
|
||||
{
|
||||
DBUG_PRINT("error", ("Key %d has different definition", i));
|
||||
DBUG_PRINT("error", ("t1_fulltext= %d, t2_fulltext=%d",
|
||||
test(t1_keyinfo[i].flag & HA_FULLTEXT),
|
||||
test(t2_keyinfo[i].flag & HA_FULLTEXT)));
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
if (t1_keyinfo[i].flag & HA_SPATIAL && t2_keyinfo[i].flag & HA_SPATIAL)
|
||||
continue;
|
||||
else if (t1_keyinfo[i].flag & HA_SPATIAL ||
|
||||
t2_keyinfo[i].flag & HA_SPATIAL)
|
||||
{
|
||||
DBUG_PRINT("error", ("Key %d has different definition", i));
|
||||
DBUG_PRINT("error", ("t1_spatial= %d, t2_spatial=%d",
|
||||
test(t1_keyinfo[i].flag & HA_SPATIAL),
|
||||
test(t2_keyinfo[i].flag & HA_SPATIAL)));
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
if (t1_keyinfo[i].keysegs != t2_keyinfo[i].keysegs ||
|
||||
t1_keyinfo[i].key_alg != t2_keyinfo[i].key_alg)
|
||||
{
|
||||
|
@ -403,7 +431,14 @@ int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo,
|
|||
{
|
||||
MI_COLUMNDEF *t1_rec= &t1_recinfo[i];
|
||||
MI_COLUMNDEF *t2_rec= &t2_recinfo[i];
|
||||
if (t1_rec->type != t2_rec->type ||
|
||||
/*
|
||||
FIELD_SKIP_ZERO can be changed to FIELD_NORMAL in mi_create,
|
||||
see NOTE1 in mi_create.c
|
||||
*/
|
||||
if ((t1_rec->type != t2_rec->type &&
|
||||
!(t1_rec->type == (int) FIELD_SKIP_ZERO &&
|
||||
t1_rec->length == 1 &&
|
||||
t2_rec->type == (int) FIELD_NORMAL)) ||
|
||||
t1_rec->length != t2_rec->length ||
|
||||
t1_rec->null_bit != t2_rec->null_bit)
|
||||
{
|
||||
|
|
|
@ -36,8 +36,7 @@ class ha_myisammrg: public handler
|
|||
{
|
||||
return (HA_REC_NOT_IN_SEQ | HA_AUTO_PART_KEY | HA_READ_RND_SAME |
|
||||
HA_NULL_IN_KEY | HA_CAN_INDEX_BLOBS | HA_FILE_BASED |
|
||||
HA_CAN_INSERT_DELAYED | HA_ANY_INDEX_MAY_BE_UNIQUE |
|
||||
HA_CAN_BIT_FIELD);
|
||||
HA_ANY_INDEX_MAY_BE_UNIQUE | HA_CAN_BIT_FIELD);
|
||||
}
|
||||
ulong index_flags(uint inx, uint part, bool all_parts) const
|
||||
{
|
||||
|
|
69
sql/item.cc
69
sql/item.cc
|
@ -1758,9 +1758,10 @@ void Item_ident::print(String *str)
|
|||
}
|
||||
}
|
||||
|
||||
if (!table_name || !field_name)
|
||||
if (!table_name || !field_name || !field_name[0])
|
||||
{
|
||||
const char *nm= field_name ? field_name : name ? name : "tmp_field";
|
||||
const char *nm= (field_name && field_name[0]) ?
|
||||
field_name : name ? name : "tmp_field";
|
||||
append_identifier(thd, str, nm, (uint) strlen(nm));
|
||||
return;
|
||||
}
|
||||
|
@ -3320,7 +3321,7 @@ resolve_ref_in_select_and_group(THD *thd, Item_ident *ref, SELECT_LEX *select)
|
|||
ORDER *group_list= (ORDER*) select->group_list.first;
|
||||
bool ambiguous_fields= FALSE;
|
||||
uint counter;
|
||||
bool not_used;
|
||||
enum_resolution_type resolution;
|
||||
|
||||
/*
|
||||
Search for a column or derived column named as 'ref' in the SELECT
|
||||
|
@ -3328,8 +3329,10 @@ resolve_ref_in_select_and_group(THD *thd, Item_ident *ref, SELECT_LEX *select)
|
|||
*/
|
||||
if (!(select_ref= find_item_in_list(ref, *(select->get_item_list()),
|
||||
&counter, REPORT_EXCEPT_NOT_FOUND,
|
||||
¬_used)))
|
||||
&resolution)))
|
||||
return NULL; /* Some error occurred. */
|
||||
if (resolution == RESOLVED_AGAINST_ALIAS)
|
||||
ref->alias_name_used= TRUE;
|
||||
|
||||
/* If this is a non-aggregated field inside HAVING, search in GROUP BY. */
|
||||
if (select->having_fix_field && !ref->with_sum_func && group_list)
|
||||
|
@ -3439,7 +3442,12 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
|
|||
*/
|
||||
Name_resolution_context *last_checked_context= context;
|
||||
Item **ref= (Item **) not_found_item;
|
||||
Name_resolution_context *outer_context= context->outer_context;
|
||||
SELECT_LEX *current_sel= (SELECT_LEX *) thd->lex->current_select;
|
||||
Name_resolution_context *outer_context= 0;
|
||||
/* Currently derived tables cannot be correlated */
|
||||
if (current_sel->master_unit()->first_select()->linkage !=
|
||||
DERIVED_TABLE_TYPE)
|
||||
outer_context= context->outer_context;
|
||||
for (;
|
||||
outer_context;
|
||||
outer_context= outer_context->outer_context)
|
||||
|
@ -3630,9 +3638,9 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
|
|||
*ref= NULL; // Don't call set_properties()
|
||||
rf= (place == IN_HAVING ?
|
||||
new Item_ref(context, ref, (char*) table_name,
|
||||
(char*) field_name) :
|
||||
(char*) field_name, alias_name_used) :
|
||||
new Item_direct_ref(context, ref, (char*) table_name,
|
||||
(char*) field_name));
|
||||
(char*) field_name, alias_name_used));
|
||||
*ref= save;
|
||||
if (!rf)
|
||||
return -1;
|
||||
|
@ -3750,12 +3758,14 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
|
|||
if (thd->lex->current_select->is_item_list_lookup)
|
||||
{
|
||||
uint counter;
|
||||
bool not_used;
|
||||
enum_resolution_type resolution;
|
||||
Item** res= find_item_in_list(this, thd->lex->current_select->item_list,
|
||||
&counter, REPORT_EXCEPT_NOT_FOUND,
|
||||
¬_used);
|
||||
&resolution);
|
||||
if (!res)
|
||||
return 1;
|
||||
if (resolution == RESOLVED_AGAINST_ALIAS)
|
||||
alias_name_used= TRUE;
|
||||
if (res != (Item **)not_found_item)
|
||||
{
|
||||
if ((*res)->type() == Item::FIELD_ITEM)
|
||||
|
@ -4065,7 +4075,9 @@ bool Item_field::set_no_const_sub(byte *arg)
|
|||
DESCRIPTION
|
||||
The function returns a pointer to an item that is taken from
|
||||
the very beginning of the item_equal list which the Item_field
|
||||
object refers to (belongs to).
|
||||
object refers to (belongs to) unless item_equal contains a constant
|
||||
item. In this case the function returns this constant item,
|
||||
(if the substitution does not require conversion).
|
||||
If the Item_field object does not refer any Item_equal object
|
||||
'this' is returned
|
||||
|
||||
|
@ -4074,7 +4086,8 @@ bool Item_field::set_no_const_sub(byte *arg)
|
|||
of the thransformer method.
|
||||
|
||||
RETURN VALUES
|
||||
pointer to a replacement Item_field if there is a better equal item;
|
||||
pointer to a replacement Item_field if there is a better equal item or
|
||||
a pointer to a constant equal item;
|
||||
this - otherwise.
|
||||
*/
|
||||
|
||||
|
@ -4082,6 +4095,14 @@ Item *Item_field::replace_equal_field(byte *arg)
|
|||
{
|
||||
if (item_equal)
|
||||
{
|
||||
Item *const_item= item_equal->get_const();
|
||||
if (const_item)
|
||||
{
|
||||
if (cmp_context != (Item_result)-1 &&
|
||||
const_item->cmp_context != cmp_context)
|
||||
return this;
|
||||
return const_item;
|
||||
}
|
||||
Item_field *subst= item_equal->get_first();
|
||||
if (subst && !field->eq(subst->field))
|
||||
return subst;
|
||||
|
@ -4907,12 +4928,30 @@ Item *Item_field::update_value_transformer(byte *select_arg)
|
|||
}
|
||||
|
||||
|
||||
void Item_field::print(String *str)
|
||||
{
|
||||
if (field && field->table->const_table)
|
||||
{
|
||||
char buff[MAX_FIELD_WIDTH];
|
||||
String tmp(buff,sizeof(buff),str->charset());
|
||||
field->val_str(&tmp);
|
||||
str->append('\'');
|
||||
str->append(tmp);
|
||||
str->append('\'');
|
||||
return;
|
||||
}
|
||||
Item_ident::print(str);
|
||||
}
|
||||
|
||||
|
||||
Item_ref::Item_ref(Name_resolution_context *context_arg,
|
||||
Item **item, const char *table_name_arg,
|
||||
const char *field_name_arg)
|
||||
const char *field_name_arg,
|
||||
bool alias_name_used_arg)
|
||||
:Item_ident(context_arg, NullS, table_name_arg, field_name_arg),
|
||||
result_field(0), ref(item)
|
||||
{
|
||||
alias_name_used= alias_name_used_arg;
|
||||
/*
|
||||
This constructor used to create some internals references over fixed items
|
||||
*/
|
||||
|
@ -5195,11 +5234,13 @@ void Item_ref::set_properties()
|
|||
*/
|
||||
with_sum_func= (*ref)->with_sum_func;
|
||||
unsigned_flag= (*ref)->unsigned_flag;
|
||||
fixed= 1;
|
||||
if (alias_name_used)
|
||||
return;
|
||||
if ((*ref)->type() == FIELD_ITEM)
|
||||
alias_name_used= ((Item_ident *) (*ref))->alias_name_used;
|
||||
else
|
||||
alias_name_used= TRUE; // it is not field, so it is was resolved by alias
|
||||
fixed= 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -5217,7 +5258,7 @@ void Item_ref::print(String *str)
|
|||
if (ref)
|
||||
{
|
||||
if ((*ref)->type() != Item::CACHE_ITEM && ref_type() != VIEW_REF &&
|
||||
ref_type() != OUTER_REF && name && alias_name_used)
|
||||
!table_name && name && alias_name_used)
|
||||
{
|
||||
THD *thd= current_thd;
|
||||
append_identifier(thd, str, name, (uint) strlen(name));
|
||||
|
|
22
sql/item.h
22
sql/item.h
|
@ -1303,6 +1303,7 @@ public:
|
|||
Item *safe_charset_converter(CHARSET_INFO *tocs);
|
||||
int fix_outer_field(THD *thd, Field **field, Item **reference);
|
||||
virtual Item *update_value_transformer(byte *select_arg);
|
||||
void print(String *str);
|
||||
friend class Item_default_value;
|
||||
friend class Item_insert_value;
|
||||
friend class st_select_lex_unit;
|
||||
|
@ -1712,7 +1713,11 @@ public:
|
|||
str_value.length(), collation.collation);
|
||||
}
|
||||
Item *safe_charset_converter(CHARSET_INFO *tocs);
|
||||
inline void append(char *str, uint length) { str_value.append(str, length); }
|
||||
inline void append(char *str, uint length)
|
||||
{
|
||||
str_value.append(str, length);
|
||||
max_length= str_value.numchars() * collation.collation->mbmaxlen;
|
||||
}
|
||||
void print(String *str);
|
||||
// to prevent drop fixed flag (no need parent cleanup call)
|
||||
void cleanup() {}
|
||||
|
@ -1774,7 +1779,10 @@ public:
|
|||
Item_hex_string(const char *str,uint str_length);
|
||||
enum Type type() const { return VARBIN_ITEM; }
|
||||
double val_real()
|
||||
{ DBUG_ASSERT(fixed == 1); return (double) Item_hex_string::val_int(); }
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
return (double) (ulonglong) Item_hex_string::val_int();
|
||||
}
|
||||
longlong val_int();
|
||||
bool basic_const_item() const { return 1; }
|
||||
String *val_str(String*) { DBUG_ASSERT(fixed == 1); return &str_value; }
|
||||
|
@ -1848,7 +1856,8 @@ public:
|
|||
with Bar, and if we have a more broader set of problems like this.
|
||||
*/
|
||||
Item_ref(Name_resolution_context *context_arg, Item **item,
|
||||
const char *table_name_arg, const char *field_name_arg);
|
||||
const char *table_name_arg, const char *field_name_arg,
|
||||
bool alias_name_used_arg= FALSE);
|
||||
|
||||
/* Constructor need to process subselect with temporary tables (see Item) */
|
||||
Item_ref(THD *thd, Item_ref *item)
|
||||
|
@ -1923,8 +1932,11 @@ class Item_direct_ref :public Item_ref
|
|||
public:
|
||||
Item_direct_ref(Name_resolution_context *context_arg, Item **item,
|
||||
const char *table_name_arg,
|
||||
const char *field_name_arg)
|
||||
:Item_ref(context_arg, item, table_name_arg, field_name_arg) {}
|
||||
const char *field_name_arg,
|
||||
bool alias_name_used_arg= FALSE)
|
||||
:Item_ref(context_arg, item, table_name_arg,
|
||||
field_name_arg, alias_name_used_arg)
|
||||
{}
|
||||
/* Constructor need to process subselect with temporary tables (see Item) */
|
||||
Item_direct_ref(THD *thd, Item_direct_ref *item) : Item_ref(thd, item) {}
|
||||
|
||||
|
|
|
@ -2155,9 +2155,100 @@ void Item_func_coalesce::fix_length_and_dec()
|
|||
Classes and function for the IN operator
|
||||
****************************************************************************/
|
||||
|
||||
static int cmp_longlong(void *cmp_arg, longlong *a,longlong *b)
|
||||
/*
|
||||
Determine which of the signed longlong arguments is bigger
|
||||
|
||||
SYNOPSIS
|
||||
cmp_longs()
|
||||
a_val left argument
|
||||
b_val right argument
|
||||
|
||||
DESCRIPTION
|
||||
This function will compare two signed longlong arguments
|
||||
and will return -1, 0, or 1 if left argument is smaller than,
|
||||
equal to or greater than the right argument.
|
||||
|
||||
RETURN VALUE
|
||||
-1 left argument is smaller than the right argument.
|
||||
0 left argument is equal to the right argument.
|
||||
1 left argument is greater than the right argument.
|
||||
*/
|
||||
static inline int cmp_longs (longlong a_val, longlong b_val)
|
||||
{
|
||||
return *a < *b ? -1 : *a == *b ? 0 : 1;
|
||||
return a_val < b_val ? -1 : a_val == b_val ? 0 : 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Determine which of the unsigned longlong arguments is bigger
|
||||
|
||||
SYNOPSIS
|
||||
cmp_ulongs()
|
||||
a_val left argument
|
||||
b_val right argument
|
||||
|
||||
DESCRIPTION
|
||||
This function will compare two unsigned longlong arguments
|
||||
and will return -1, 0, or 1 if left argument is smaller than,
|
||||
equal to or greater than the right argument.
|
||||
|
||||
RETURN VALUE
|
||||
-1 left argument is smaller than the right argument.
|
||||
0 left argument is equal to the right argument.
|
||||
1 left argument is greater than the right argument.
|
||||
*/
|
||||
static inline int cmp_ulongs (ulonglong a_val, ulonglong b_val)
|
||||
{
|
||||
return a_val < b_val ? -1 : a_val == b_val ? 0 : 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Compare two integers in IN value list format (packed_longlong)
|
||||
|
||||
SYNOPSIS
|
||||
cmp_longlong()
|
||||
cmp_arg an argument passed to the calling function (qsort2)
|
||||
a left argument
|
||||
b right argument
|
||||
|
||||
DESCRIPTION
|
||||
This function will compare two integer arguments in the IN value list
|
||||
format and will return -1, 0, or 1 if left argument is smaller than,
|
||||
equal to or greater than the right argument.
|
||||
It's used in sorting the IN values list and finding an element in it.
|
||||
Depending on the signedness of the arguments cmp_longlong() will
|
||||
compare them as either signed (using cmp_longs()) or unsigned (using
|
||||
cmp_ulongs()).
|
||||
|
||||
RETURN VALUE
|
||||
-1 left argument is smaller than the right argument.
|
||||
0 left argument is equal to the right argument.
|
||||
1 left argument is greater than the right argument.
|
||||
*/
|
||||
int cmp_longlong(void *cmp_arg,
|
||||
in_longlong::packed_longlong *a,
|
||||
in_longlong::packed_longlong *b)
|
||||
{
|
||||
if (a->unsigned_flag != b->unsigned_flag)
|
||||
{
|
||||
/*
|
||||
One of the args is unsigned and is too big to fit into the
|
||||
positive signed range. Report no match.
|
||||
*/
|
||||
if (a->unsigned_flag && ((ulonglong) a->val) > LONGLONG_MAX ||
|
||||
b->unsigned_flag && ((ulonglong) b->val) > LONGLONG_MAX)
|
||||
return a->unsigned_flag ? 1 : -1;
|
||||
/*
|
||||
Although the signedness differs both args can fit into the signed
|
||||
positive range. Make them signed and compare as usual.
|
||||
*/
|
||||
return cmp_longs (a->val, b->val);
|
||||
}
|
||||
if (a->unsigned_flag)
|
||||
return cmp_ulongs ((ulonglong) a->val, (ulonglong) b->val);
|
||||
else
|
||||
return cmp_longs (a->val, b->val);
|
||||
}
|
||||
|
||||
static int cmp_double(void *cmp_arg, double *a,double *b)
|
||||
|
@ -2282,19 +2373,23 @@ void in_row::set(uint pos, Item *item)
|
|||
}
|
||||
|
||||
in_longlong::in_longlong(uint elements)
|
||||
:in_vector(elements,sizeof(longlong),(qsort2_cmp) cmp_longlong, 0)
|
||||
:in_vector(elements,sizeof(packed_longlong),(qsort2_cmp) cmp_longlong, 0)
|
||||
{}
|
||||
|
||||
void in_longlong::set(uint pos,Item *item)
|
||||
{
|
||||
((longlong*) base)[pos]=item->val_int();
|
||||
struct packed_longlong *buff= &((packed_longlong*) base)[pos];
|
||||
|
||||
buff->val= item->val_int();
|
||||
buff->unsigned_flag= item->unsigned_flag;
|
||||
}
|
||||
|
||||
byte *in_longlong::get_value(Item *item)
|
||||
{
|
||||
tmp= item->val_int();
|
||||
tmp.val= item->val_int();
|
||||
if (item->null_value)
|
||||
return 0;
|
||||
tmp.unsigned_flag= item->unsigned_flag;
|
||||
return (byte*) &tmp;
|
||||
}
|
||||
|
||||
|
@ -2615,6 +2710,31 @@ void Item_func_in::fix_length_and_dec()
|
|||
*/
|
||||
if (const_itm && !nulls_in_row())
|
||||
{
|
||||
/*
|
||||
IN must compare INT/DATE/DATETIME/TIMESTAMP columns and constants
|
||||
as int values (the same way as equality does).
|
||||
So we must check here if the column on the left and all the constant
|
||||
values on the right can be compared as integers and adjust the
|
||||
comparison type accordingly.
|
||||
*/
|
||||
if (args[0]->real_item()->type() == FIELD_ITEM &&
|
||||
thd->lex->sql_command != SQLCOM_CREATE_VIEW &&
|
||||
thd->lex->sql_command != SQLCOM_SHOW_CREATE &&
|
||||
cmp_type != INT_RESULT)
|
||||
{
|
||||
Field *field= ((Item_field*) (args[0]->real_item()))->field;
|
||||
if (field->can_be_compared_as_longlong())
|
||||
{
|
||||
bool all_converted= TRUE;
|
||||
for (arg=args+1, arg_end=args+arg_count; arg != arg_end ; arg++)
|
||||
{
|
||||
if (!convert_constant_item (thd, field, &arg[0]))
|
||||
all_converted= FALSE;
|
||||
}
|
||||
if (all_converted)
|
||||
cmp_type= INT_RESULT;
|
||||
}
|
||||
}
|
||||
switch (cmp_type) {
|
||||
case STRING_RESULT:
|
||||
array=new in_string(arg_count-1,(qsort2_cmp) srtcmp_in,
|
||||
|
|
|
@ -820,7 +820,16 @@ public:
|
|||
|
||||
class in_longlong :public in_vector
|
||||
{
|
||||
longlong tmp;
|
||||
/*
|
||||
Here we declare a temporary variable (tmp) of the same type as the
|
||||
elements of this vector. tmp is used in finding if a given value is in
|
||||
the list.
|
||||
*/
|
||||
struct packed_longlong
|
||||
{
|
||||
longlong val;
|
||||
longlong unsigned_flag; // Use longlong, not bool, to preserve alignment
|
||||
} tmp;
|
||||
public:
|
||||
in_longlong(uint elements);
|
||||
void set(uint pos,Item *item);
|
||||
|
@ -836,8 +845,12 @@ public:
|
|||
}
|
||||
void value_to_item(uint pos, Item *item)
|
||||
{
|
||||
((Item_int*)item)->value= ((longlong*)base)[pos];
|
||||
((Item_int*) item)->value= ((packed_longlong*) base)[pos].val;
|
||||
((Item_int*) item)->unsigned_flag= (my_bool)
|
||||
((packed_longlong*) base)[pos].unsigned_flag;
|
||||
}
|
||||
|
||||
friend int cmp_longlong(void *cmp_arg, packed_longlong *a,packed_longlong *b);
|
||||
};
|
||||
|
||||
class in_double :public in_vector
|
||||
|
|
|
@ -409,8 +409,13 @@ bool Item_func::eq(const Item *item, bool binary_cmp) const
|
|||
if (item->type() != FUNC_ITEM)
|
||||
return 0;
|
||||
Item_func *item_func=(Item_func*) item;
|
||||
if (arg_count != item_func->arg_count ||
|
||||
func_name() != item_func->func_name())
|
||||
Item_func::Functype func_type;
|
||||
if ((func_type= functype()) != item_func->functype() ||
|
||||
arg_count != item_func->arg_count ||
|
||||
(func_type != Item_func::FUNC_SP &&
|
||||
func_name() != item_func->func_name()) ||
|
||||
(func_type == Item_func::FUNC_SP &&
|
||||
my_strcasecmp(system_charset_info, func_name(), item_func->func_name())))
|
||||
return 0;
|
||||
for (uint i=0; i < arg_count ; i++)
|
||||
if (!args[i]->eq(item_func->args[i], binary_cmp))
|
||||
|
|
|
@ -967,18 +967,18 @@ String *Item_func_insert::val_str(String *str)
|
|||
args[3]->null_value)
|
||||
goto null; /* purecov: inspected */
|
||||
|
||||
if ((start < 0) || (start > res->length() + 1))
|
||||
if ((start < 0) || (start > res->length()))
|
||||
return res; // Wrong param; skip insert
|
||||
if ((length < 0) || (length > res->length() + 1))
|
||||
length= res->length() + 1;
|
||||
if ((length < 0) || (length > res->length()))
|
||||
length= res->length();
|
||||
|
||||
/* start and length are now sufficiently valid to pass to charpos function */
|
||||
start= res->charpos((int) start);
|
||||
length= res->charpos((int) length, (uint32) start);
|
||||
|
||||
/* Re-testing with corrected params */
|
||||
if (start > res->length() + 1)
|
||||
return res; // Wrong param; skip insert
|
||||
if (start > res->length())
|
||||
return res; /* purecov: inspected */ // Wrong param; skip insert
|
||||
if (length > res->length() - start)
|
||||
length= res->length() - start;
|
||||
|
||||
|
@ -1184,11 +1184,10 @@ void Item_func_substr::fix_length_and_dec()
|
|||
if (args[1]->const_item())
|
||||
{
|
||||
int32 start= (int32) args[1]->val_int();
|
||||
start= (int32)((start < 0) ? max_length + start : start - 1);
|
||||
if (start < 0 || start >= (int32) max_length)
|
||||
max_length=0; /* purecov: inspected */
|
||||
if (start < 0)
|
||||
max_length= ((uint)(-start) > max_length) ? 0 : (uint)(-start);
|
||||
else
|
||||
max_length-= (uint) start;
|
||||
max_length-= min((uint)(start - 1), max_length);
|
||||
}
|
||||
if (arg_count == 3 && args[2]->const_item())
|
||||
{
|
||||
|
|
|
@ -605,7 +605,11 @@ class Item_func_unhex :public Item_str_func
|
|||
{
|
||||
String tmp_value;
|
||||
public:
|
||||
Item_func_unhex(Item *a) :Item_str_func(a) {}
|
||||
Item_func_unhex(Item *a) :Item_str_func(a)
|
||||
{
|
||||
/* there can be bad hex strings */
|
||||
maybe_null= 1;
|
||||
}
|
||||
const char *func_name() const { return "unhex"; }
|
||||
String *val_str(String *);
|
||||
void fix_length_and_dec()
|
||||
|
|
|
@ -835,7 +835,8 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list, TABLE *table,
|
|||
List<Item> &fields, List_item *values,
|
||||
List<Item> &update_fields,
|
||||
List<Item> &update_values, enum_duplicates duplic,
|
||||
COND **where, bool select_insert);
|
||||
COND **where, bool select_insert,
|
||||
bool check_fields, bool abort_on_warning);
|
||||
bool mysql_insert(THD *thd,TABLE_LIST *table,List<Item> &fields,
|
||||
List<List_item> &values, List<Item> &update_fields,
|
||||
List<Item> &update_values, enum_duplicates flag,
|
||||
|
@ -1020,9 +1021,29 @@ SQL_SELECT *make_select(TABLE *head, table_map const_tables,
|
|||
table_map read_tables, COND *conds,
|
||||
bool allow_null_cond, int *error);
|
||||
extern Item **not_found_item;
|
||||
|
||||
/*
|
||||
This enumeration type is used only by the function find_item_in_list
|
||||
to return the info on how an item has been resolved against a list
|
||||
of possibly aliased items.
|
||||
The item can be resolved:
|
||||
- against an alias name of the list's element (RESOLVED_AGAINST_ALIAS)
|
||||
- against non-aliased field name of the list (RESOLVED_WITH_NO_ALIAS)
|
||||
- against an aliased field name of the list (RESOLVED_BEHIND_ALIAS)
|
||||
- ignoring the alias name in cases when SQL requires to ignore aliases
|
||||
(e.g. when the resolved field reference contains a table name or
|
||||
when the resolved item is an expression) (RESOLVED_IGNORING_ALIAS)
|
||||
*/
|
||||
enum enum_resolution_type {
|
||||
NOT_RESOLVED=0,
|
||||
RESOLVED_IGNORING_ALIAS,
|
||||
RESOLVED_BEHIND_ALIAS,
|
||||
RESOLVED_WITH_NO_ALIAS,
|
||||
RESOLVED_AGAINST_ALIAS
|
||||
};
|
||||
Item ** find_item_in_list(Item *item, List<Item> &items, uint *counter,
|
||||
find_item_error_report_type report_error,
|
||||
bool *unaliased);
|
||||
enum_resolution_type *resolution);
|
||||
bool get_key_map_from_key_list(key_map *map, TABLE *table,
|
||||
List<String> *index_list);
|
||||
bool insert_fields(THD *thd, Name_resolution_context *context,
|
||||
|
@ -1078,7 +1099,8 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table,
|
|||
st_table_list *TABLE_LIST::*link,
|
||||
const char *db_name,
|
||||
const char *table_name);
|
||||
TABLE_LIST *unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list);
|
||||
TABLE_LIST *unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list,
|
||||
bool check_alias);
|
||||
TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name);
|
||||
bool close_temporary_table(THD *thd, const char *db, const char *table_name);
|
||||
void close_temporary(TABLE *table, bool delete_table);
|
||||
|
|
|
@ -1681,6 +1681,12 @@ void end_thread(THD *thd, bool put_in_cache)
|
|||
thd->real_id=pthread_self();
|
||||
thd->thread_stack= (char*) &thd; // For store_globals
|
||||
(void) thd->store_globals();
|
||||
/*
|
||||
THD::mysys_var::abort is associated with physical thread rather
|
||||
than with THD object. So we need to reset this flag before using
|
||||
this thread for handling of new THD object/connection.
|
||||
*/
|
||||
thd->mysys_var->abort= 0;
|
||||
thd->thr_create_time= time(NULL);
|
||||
threads.append(thd);
|
||||
pthread_mutex_unlock(&LOCK_thread_count);
|
||||
|
|
|
@ -7504,7 +7504,7 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
|
|||
if ((join->tables != 1) || /* The query must reference one table. */
|
||||
((!join->group_list) && /* Neither GROUP BY nor a DISTINCT query. */
|
||||
(!join->select_distinct)) ||
|
||||
(thd->lex->select_lex.olap == ROLLUP_TYPE)) /* Check (B3) for ROLLUP */
|
||||
(join->select_lex->olap == ROLLUP_TYPE)) /* Check (B3) for ROLLUP */
|
||||
DBUG_RETURN(NULL);
|
||||
if (table->s->keys == 0) /* There are no indexes to use. */
|
||||
DBUG_RETURN(NULL);
|
||||
|
|
|
@ -1087,6 +1087,7 @@ sp_head::execute(THD *thd)
|
|||
ctx->enter_handler(hip);
|
||||
thd->clear_error();
|
||||
thd->killed= THD::NOT_KILLED;
|
||||
thd->mysys_var->abort= 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5882,6 +5882,8 @@ int fill_schema_user_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||
char *curr_host= thd->security_ctx->priv_host_name();
|
||||
DBUG_ENTER("fill_schema_user_privileges");
|
||||
|
||||
if (!initialized)
|
||||
DBUG_RETURN(0);
|
||||
pthread_mutex_lock(&acl_cache->lock);
|
||||
|
||||
for (counter=0 ; counter < acl_users.elements ; counter++)
|
||||
|
@ -5941,6 +5943,8 @@ int fill_schema_schema_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||
char *curr_host= thd->security_ctx->priv_host_name();
|
||||
DBUG_ENTER("fill_schema_schema_privileges");
|
||||
|
||||
if (!initialized)
|
||||
DBUG_RETURN(0);
|
||||
pthread_mutex_lock(&acl_cache->lock);
|
||||
|
||||
for (counter=0 ; counter < acl_dbs.elements ; counter++)
|
||||
|
|
140
sql/sql_base.cc
140
sql/sql_base.cc
|
@ -849,6 +849,7 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table,
|
|||
thd thread handle
|
||||
table table which should be checked
|
||||
table_list list of tables
|
||||
check_alias whether to check tables' aliases
|
||||
|
||||
NOTE: to exclude derived tables from check we use following mechanism:
|
||||
a) during derived table processing set THD::derived_tables_processing
|
||||
|
@ -876,10 +877,11 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table,
|
|||
0 if table is unique
|
||||
*/
|
||||
|
||||
TABLE_LIST* unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list)
|
||||
TABLE_LIST* unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list,
|
||||
bool check_alias)
|
||||
{
|
||||
TABLE_LIST *res;
|
||||
const char *d_name, *t_name;
|
||||
const char *d_name, *t_name, *t_alias;
|
||||
DBUG_ENTER("unique_table");
|
||||
DBUG_PRINT("enter", ("table alias: %s", table->alias));
|
||||
|
||||
|
@ -907,6 +909,7 @@ TABLE_LIST* unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list)
|
|||
}
|
||||
d_name= table->db;
|
||||
t_name= table->table_name;
|
||||
t_alias= table->alias;
|
||||
|
||||
DBUG_PRINT("info", ("real table: %s.%s", d_name, t_name));
|
||||
for (;;)
|
||||
|
@ -914,6 +917,9 @@ TABLE_LIST* unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list)
|
|||
if (((! (res= find_table_in_global_list(table_list, d_name, t_name))) &&
|
||||
(! (res= mysql_lock_have_duplicate(thd, table, table_list)))) ||
|
||||
((!res->table || res->table != table->table) &&
|
||||
(!check_alias || !(lower_case_table_names ?
|
||||
my_strcasecmp(files_charset_info, t_alias, res->alias) :
|
||||
strcmp(t_alias, res->alias))) &&
|
||||
res->select_lex && !res->select_lex->exclude_from_table_unique_test &&
|
||||
!res->prelocking_placeholder))
|
||||
break;
|
||||
|
@ -3654,10 +3660,13 @@ find_field_in_tables(THD *thd, Item_ident *item,
|
|||
return not_found_item, report other errors,
|
||||
return 0
|
||||
IGNORE_ERRORS Do not report errors, return 0 if error
|
||||
unaliased Set to true if item is field which was found
|
||||
by original field name and not by its alias
|
||||
in item list. Set to false otherwise.
|
||||
|
||||
resolution Set to the resolution type if the item is found
|
||||
(it says whether the item is resolved
|
||||
against an alias name,
|
||||
or as a field name without alias,
|
||||
or as a field hidden by alias,
|
||||
or ignoring alias)
|
||||
|
||||
RETURN VALUES
|
||||
0 Item is not found or item is not unique,
|
||||
error message is reported
|
||||
|
@ -3673,7 +3682,8 @@ Item **not_found_item= (Item**) 0x1;
|
|||
|
||||
Item **
|
||||
find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
||||
find_item_error_report_type report_error, bool *unaliased)
|
||||
find_item_error_report_type report_error,
|
||||
enum_resolution_type *resolution)
|
||||
{
|
||||
List_iterator<Item> li(items);
|
||||
Item **found=0, **found_unaliased= 0, *item;
|
||||
|
@ -3687,10 +3697,9 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
|||
*/
|
||||
bool is_ref_by_name= 0;
|
||||
uint unaliased_counter;
|
||||
|
||||
LINT_INIT(unaliased_counter); // Dependent on found_unaliased
|
||||
|
||||
*unaliased= FALSE;
|
||||
*resolution= NOT_RESOLVED;
|
||||
|
||||
is_ref_by_name= (find->type() == Item::FIELD_ITEM ||
|
||||
find->type() == Item::REF_ITEM);
|
||||
|
@ -3757,63 +3766,77 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
|||
}
|
||||
found_unaliased= li.ref();
|
||||
unaliased_counter= i;
|
||||
*resolution= RESOLVED_IGNORING_ALIAS;
|
||||
if (db_name)
|
||||
break; // Perfect match
|
||||
}
|
||||
}
|
||||
else if (!my_strcasecmp(system_charset_info, item_field->name,
|
||||
field_name))
|
||||
else
|
||||
{
|
||||
/*
|
||||
If table name was not given we should scan through aliases
|
||||
(or non-aliased fields) first. We are also checking unaliased
|
||||
name of the field in then next else-if, to be able to find
|
||||
instantly field (hidden by alias) if no suitable alias (or
|
||||
non-aliased field) was found.
|
||||
*/
|
||||
if (found)
|
||||
int fname_cmp= my_strcasecmp(system_charset_info,
|
||||
item_field->field_name,
|
||||
field_name);
|
||||
if (!my_strcasecmp(system_charset_info,
|
||||
item_field->name,field_name))
|
||||
{
|
||||
if ((*found)->eq(item, 0))
|
||||
continue; // Same field twice
|
||||
if (report_error != IGNORE_ERRORS)
|
||||
my_error(ER_NON_UNIQ_ERROR, MYF(0),
|
||||
find->full_name(), current_thd->where);
|
||||
return (Item**) 0;
|
||||
/*
|
||||
If table name was not given we should scan through aliases
|
||||
and non-aliased fields first. We are also checking unaliased
|
||||
name of the field in then next else-if, to be able to find
|
||||
instantly field (hidden by alias) if no suitable alias or
|
||||
non-aliased field was found.
|
||||
*/
|
||||
if (found)
|
||||
{
|
||||
if ((*found)->eq(item, 0))
|
||||
continue; // Same field twice
|
||||
if (report_error != IGNORE_ERRORS)
|
||||
my_error(ER_NON_UNIQ_ERROR, MYF(0),
|
||||
find->full_name(), current_thd->where);
|
||||
return (Item**) 0;
|
||||
}
|
||||
found= li.ref();
|
||||
*counter= i;
|
||||
*resolution= fname_cmp ? RESOLVED_AGAINST_ALIAS:
|
||||
RESOLVED_WITH_NO_ALIAS;
|
||||
}
|
||||
found= li.ref();
|
||||
*counter= i;
|
||||
}
|
||||
else if (!my_strcasecmp(system_charset_info, item_field->field_name,
|
||||
field_name))
|
||||
{
|
||||
/*
|
||||
We will use un-aliased field or react on such ambiguities only if
|
||||
we won't be able to find aliased field.
|
||||
Again if we have ambiguity with field outside of select list
|
||||
we should prefer fields from select list.
|
||||
*/
|
||||
if (found_unaliased)
|
||||
{
|
||||
if ((*found_unaliased)->eq(item, 0))
|
||||
continue; // Same field twice
|
||||
found_unaliased_non_uniq= 1;
|
||||
}
|
||||
else
|
||||
else if (!fname_cmp)
|
||||
{
|
||||
/*
|
||||
We will use non-aliased field or react on such ambiguities only if
|
||||
we won't be able to find aliased field.
|
||||
Again if we have ambiguity with field outside of select list
|
||||
we should prefer fields from select list.
|
||||
*/
|
||||
if (found_unaliased)
|
||||
{
|
||||
if ((*found_unaliased)->eq(item, 0))
|
||||
continue; // Same field twice
|
||||
found_unaliased_non_uniq= 1;
|
||||
}
|
||||
found_unaliased= li.ref();
|
||||
unaliased_counter= i;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!table_name && (find->eq(item,0) ||
|
||||
is_ref_by_name && find->name && item->name &&
|
||||
!my_strcasecmp(system_charset_info,
|
||||
item->name,find->name)))
|
||||
{
|
||||
found= li.ref();
|
||||
*counter= i;
|
||||
break;
|
||||
}
|
||||
else if (!table_name)
|
||||
{
|
||||
if (is_ref_by_name && find->name && item->name &&
|
||||
!my_strcasecmp(system_charset_info,item->name,find->name))
|
||||
{
|
||||
found= li.ref();
|
||||
*counter= i;
|
||||
*resolution= RESOLVED_AGAINST_ALIAS;
|
||||
break;
|
||||
}
|
||||
else if (find->eq(item,0))
|
||||
{
|
||||
found= li.ref();
|
||||
*counter= i;
|
||||
*resolution= RESOLVED_IGNORING_ALIAS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
|
@ -3828,7 +3851,7 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
|||
{
|
||||
found= found_unaliased;
|
||||
*counter= unaliased_counter;
|
||||
*unaliased= TRUE;
|
||||
*resolution= RESOLVED_BEHIND_ALIAS;
|
||||
}
|
||||
}
|
||||
if (found)
|
||||
|
@ -4606,12 +4629,15 @@ bool setup_fields(THD *thd, Item **ref_pointer_array,
|
|||
bool save_set_query_id= thd->set_query_id;
|
||||
nesting_map save_allow_sum_func= thd->lex->allow_sum_func;
|
||||
List_iterator<Item> it(fields);
|
||||
bool save_is_item_list_lookup;
|
||||
DBUG_ENTER("setup_fields");
|
||||
|
||||
thd->set_query_id=set_query_id;
|
||||
if (allow_sum_func)
|
||||
thd->lex->allow_sum_func|= 1 << thd->lex->current_select->nest_level;
|
||||
thd->where= THD::DEFAULT_WHERE;
|
||||
save_is_item_list_lookup= thd->lex->current_select->is_item_list_lookup;
|
||||
thd->lex->current_select->is_item_list_lookup= 0;
|
||||
|
||||
/*
|
||||
To prevent fail on forward lookup we fill it with zerows,
|
||||
|
@ -4634,6 +4660,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array,
|
|||
if (!item->fixed && item->fix_fields(thd, it.ref()) ||
|
||||
(item= *(it.ref()))->check_cols(1))
|
||||
{
|
||||
thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
|
||||
thd->lex->allow_sum_func= save_allow_sum_func;
|
||||
thd->set_query_id= save_set_query_id;
|
||||
DBUG_RETURN(TRUE); /* purecov: inspected */
|
||||
|
@ -4646,6 +4673,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array,
|
|||
thd->used_tables|= item->used_tables();
|
||||
thd->lex->current_select->cur_pos_in_select_list++;
|
||||
}
|
||||
thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
|
||||
thd->lex->current_select->cur_pos_in_select_list= UNDEF_POS;
|
||||
|
||||
thd->lex->allow_sum_func= save_allow_sum_func;
|
||||
|
@ -5142,6 +5170,8 @@ int setup_conds(THD *thd, TABLE_LIST *tables, TABLE_LIST *leaves,
|
|||
*/
|
||||
bool it_is_update= (select_lex == &thd->lex->select_lex) &&
|
||||
thd->lex->which_check_option_applicable();
|
||||
bool save_is_item_list_lookup= select_lex->is_item_list_lookup;
|
||||
select_lex->is_item_list_lookup= 0;
|
||||
DBUG_ENTER("setup_conds");
|
||||
|
||||
if (select_lex->conds_processed_with_permanent_arena ||
|
||||
|
@ -5216,9 +5246,11 @@ int setup_conds(THD *thd, TABLE_LIST *tables, TABLE_LIST *leaves,
|
|||
select_lex->where= *conds;
|
||||
select_lex->conds_processed_with_permanent_arena= 1;
|
||||
}
|
||||
thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
|
||||
DBUG_RETURN(test(thd->net.report_error));
|
||||
|
||||
err_no_arena:
|
||||
select_lex->is_item_list_lookup= save_is_item_list_lookup;
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
|
|
|
@ -356,13 +356,25 @@ public:
|
|||
inline uint32 get_open_count() { return open_count; }
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
The COPY_INFO structure is used by INSERT/REPLACE code.
|
||||
The schema of the row counting by the INSERT/INSERT ... ON DUPLICATE KEY
|
||||
UPDATE code:
|
||||
If a row is inserted then the copied variable is incremented.
|
||||
If a row is updated by the INSERT ... ON DUPLICATE KEY UPDATE and the
|
||||
new data differs from the old one then the copied and the updated
|
||||
variables are incremented.
|
||||
The touched variable is incremented if a row was touched by the update part
|
||||
of the INSERT ... ON DUPLICATE KEY UPDATE no matter whether the row
|
||||
was actually changed or not.
|
||||
*/
|
||||
typedef struct st_copy_info {
|
||||
ha_rows records;
|
||||
ha_rows deleted;
|
||||
ha_rows updated;
|
||||
ha_rows copied;
|
||||
ha_rows records; /* Number of processed records */
|
||||
ha_rows deleted; /* Number of deleted records */
|
||||
ha_rows updated; /* Number of updated records */
|
||||
ha_rows copied; /* Number of copied records */
|
||||
ha_rows error_count;
|
||||
ha_rows touched; /* Number of touched records */
|
||||
enum enum_duplicates handle_duplicates;
|
||||
int escape_char, last_errno;
|
||||
bool ignore;
|
||||
|
|
|
@ -371,7 +371,7 @@ bool mysql_prepare_delete(THD *thd, TABLE_LIST *table_list, Item **conds)
|
|||
}
|
||||
{
|
||||
TABLE_LIST *duplicate;
|
||||
if ((duplicate= unique_table(thd, table_list, table_list->next_global)))
|
||||
if ((duplicate= unique_table(thd, table_list, table_list->next_global, 0)))
|
||||
{
|
||||
update_non_unique_table_error(table_list, "DELETE", duplicate);
|
||||
DBUG_RETURN(TRUE);
|
||||
|
@ -468,7 +468,7 @@ bool mysql_multi_delete_prepare(THD *thd)
|
|||
{
|
||||
TABLE_LIST *duplicate;
|
||||
if ((duplicate= unique_table(thd, target_tbl->correspondent_table,
|
||||
lex->query_tables)))
|
||||
lex->query_tables, 0)))
|
||||
{
|
||||
update_non_unique_table_error(target_tbl->correspondent_table,
|
||||
"DELETE", duplicate);
|
||||
|
|
|
@ -473,10 +473,15 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||
thd->proc_info="init";
|
||||
thd->used_tables=0;
|
||||
values= its++;
|
||||
value_count= values->elements;
|
||||
|
||||
if (mysql_prepare_insert(thd, table_list, table, fields, values,
|
||||
update_fields, update_values, duplic, &unused_conds,
|
||||
FALSE))
|
||||
FALSE,
|
||||
(fields.elements || !value_count),
|
||||
!ignore && (thd->variables.sql_mode &
|
||||
(MODE_STRICT_TRANS_TABLES |
|
||||
MODE_STRICT_ALL_TABLES))))
|
||||
goto abort;
|
||||
|
||||
/* mysql_prepare_insert set table_list->table if it was not set */
|
||||
|
@ -502,7 +507,6 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||
table_list->next_local= 0;
|
||||
context->resolve_in_table_list_only(table_list);
|
||||
|
||||
value_count= values->elements;
|
||||
while ((values= its++))
|
||||
{
|
||||
counter++;
|
||||
|
@ -522,7 +526,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||
/*
|
||||
Fill in the given fields and dump it to the table file
|
||||
*/
|
||||
info.records= info.deleted= info.copied= info.updated= 0;
|
||||
info.records= info.deleted= info.copied= info.updated= info.touched= 0;
|
||||
info.ignore= ignore;
|
||||
info.handle_duplicates=duplic;
|
||||
info.update_fields= &update_fields;
|
||||
|
@ -581,17 +585,9 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||
table->file->start_bulk_insert(values_list.elements);
|
||||
|
||||
thd->no_trans_update= 0;
|
||||
thd->abort_on_warning= (!ignore &&
|
||||
(thd->variables.sql_mode &
|
||||
(MODE_STRICT_TRANS_TABLES |
|
||||
MODE_STRICT_ALL_TABLES)));
|
||||
|
||||
if ((fields.elements || !value_count) &&
|
||||
check_that_all_fields_are_given_values(thd, table, table_list))
|
||||
{
|
||||
/* thd->net.report_error is now set, which will abort the next loop */
|
||||
error= 1;
|
||||
}
|
||||
thd->abort_on_warning= (!ignore && (thd->variables.sql_mode &
|
||||
(MODE_STRICT_TRANS_TABLES |
|
||||
MODE_STRICT_ALL_TABLES)));
|
||||
|
||||
mark_fields_used_by_triggers_for_insert_stmt(thd, table, duplic);
|
||||
|
||||
|
@ -767,8 +763,8 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||
(!table->triggers || !table->triggers->has_delete_triggers()))
|
||||
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
|
||||
|
||||
/* Reset value of LAST_INSERT_ID if no rows where inserted */
|
||||
if (!info.copied && thd->insert_id_used)
|
||||
/* Reset value of LAST_INSERT_ID if no rows were inserted or touched */
|
||||
if (!info.copied && !info.touched && thd->insert_id_used)
|
||||
{
|
||||
thd->insert_id(0);
|
||||
id=0;
|
||||
|
@ -963,6 +959,10 @@ static bool mysql_prepare_insert_check_table(THD *thd, TABLE_LIST *table_list,
|
|||
be taken from table_list->table)
|
||||
where Where clause (for insert ... select)
|
||||
select_insert TRUE if INSERT ... SELECT statement
|
||||
check_fields TRUE if need to check that all INSERT fields are
|
||||
given values.
|
||||
abort_on_warning whether to report if some INSERT field is not
|
||||
assigned as an error (TRUE) or as a warning (FALSE).
|
||||
|
||||
TODO (in far future)
|
||||
In cases of:
|
||||
|
@ -983,7 +983,8 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
|
|||
TABLE *table, List<Item> &fields, List_item *values,
|
||||
List<Item> &update_fields, List<Item> &update_values,
|
||||
enum_duplicates duplic,
|
||||
COND **where, bool select_insert)
|
||||
COND **where, bool select_insert,
|
||||
bool check_fields, bool abort_on_warning)
|
||||
{
|
||||
SELECT_LEX *select_lex= &thd->lex->select_lex;
|
||||
Name_resolution_context *context= &select_lex->context;
|
||||
|
@ -1046,10 +1047,22 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
|
|||
table_list->next_local= 0;
|
||||
context->resolve_in_table_list_only(table_list);
|
||||
|
||||
if (!(res= check_insert_fields(thd, context->table_list, fields, *values,
|
||||
!insert_into_view, &map) ||
|
||||
setup_fields(thd, 0, *values, 0, 0, 0))
|
||||
&& duplic == DUP_UPDATE)
|
||||
res= check_insert_fields(thd, context->table_list, fields, *values,
|
||||
!insert_into_view, &map) ||
|
||||
setup_fields(thd, 0, *values, 0, 0, 0);
|
||||
|
||||
if (!res && check_fields)
|
||||
{
|
||||
bool saved_abort_on_warning= thd->abort_on_warning;
|
||||
thd->abort_on_warning= abort_on_warning;
|
||||
res= check_that_all_fields_are_given_values(thd,
|
||||
table ? table :
|
||||
context->table_list->table,
|
||||
context->table_list);
|
||||
thd->abort_on_warning= saved_abort_on_warning;
|
||||
}
|
||||
|
||||
if (!res && duplic == DUP_UPDATE)
|
||||
{
|
||||
select_lex->no_wrap_view_item= TRUE;
|
||||
res= check_update_fields(thd, context->table_list, update_fields, &map);
|
||||
|
@ -1073,7 +1086,7 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
|
|||
{
|
||||
Item *fake_conds= 0;
|
||||
TABLE_LIST *duplicate;
|
||||
if ((duplicate= unique_table(thd, table_list, table_list->next_global)))
|
||||
if ((duplicate= unique_table(thd, table_list, table_list->next_global, 1)))
|
||||
{
|
||||
update_non_unique_table_error(table_list, "INSERT", duplicate);
|
||||
DBUG_RETURN(TRUE);
|
||||
|
@ -1221,21 +1234,23 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
|
|||
}
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (table->next_number_field)
|
||||
table->file->adjust_next_insert_id_after_explicit_value(
|
||||
table->next_number_field->val_int());
|
||||
|
||||
info->touched++;
|
||||
if ((table->file->table_flags() & HA_PARTIAL_COLUMN_READ) ||
|
||||
compare_record(table, thd->query_id))
|
||||
{
|
||||
info->updated++;
|
||||
|
||||
if (table->next_number_field)
|
||||
table->file->adjust_next_insert_id_after_explicit_value(
|
||||
table->next_number_field->val_int());
|
||||
|
||||
trg_error= (table->triggers &&
|
||||
table->triggers->process_triggers(thd, TRG_EVENT_UPDATE,
|
||||
TRG_ACTION_AFTER,
|
||||
TRUE));
|
||||
info->copied++;
|
||||
}
|
||||
|
||||
trg_error= (table->triggers &&
|
||||
table->triggers->process_triggers(thd, TRG_EVENT_UPDATE,
|
||||
TRG_ACTION_AFTER,
|
||||
TRUE));
|
||||
goto ok_or_after_trg_err;
|
||||
}
|
||||
else /* DUP_REPLACE */
|
||||
|
@ -2324,7 +2339,7 @@ bool mysql_insert_select_prepare(THD *thd)
|
|||
lex->query_tables->table, lex->field_list, 0,
|
||||
lex->update_list, lex->value_list,
|
||||
lex->duplicates,
|
||||
&select_lex->where, TRUE))
|
||||
&select_lex->where, TRUE, FALSE, FALSE))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
/*
|
||||
|
@ -2386,7 +2401,18 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
|
|||
!insert_into_view, &map) ||
|
||||
setup_fields(thd, 0, values, 0, 0, 0);
|
||||
|
||||
if (info.handle_duplicates == DUP_UPDATE)
|
||||
if (!res && fields->elements)
|
||||
{
|
||||
bool saved_abort_on_warning= thd->abort_on_warning;
|
||||
thd->abort_on_warning= !info.ignore && (thd->variables.sql_mode &
|
||||
(MODE_STRICT_TRANS_TABLES |
|
||||
MODE_STRICT_ALL_TABLES));
|
||||
res= check_that_all_fields_are_given_values(thd, table_list->table,
|
||||
table_list);
|
||||
thd->abort_on_warning= saved_abort_on_warning;
|
||||
}
|
||||
|
||||
if (info.handle_duplicates == DUP_UPDATE && !res)
|
||||
{
|
||||
Name_resolution_context *context= &lex->select_lex.context;
|
||||
Name_resolution_context_state ctx_state;
|
||||
|
@ -2453,7 +2479,7 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
|
|||
query
|
||||
*/
|
||||
if (!(lex->current_select->options & OPTION_BUFFER_RESULT) &&
|
||||
unique_table(thd, table_list, table_list->next_global))
|
||||
unique_table(thd, table_list, table_list->next_global, 0))
|
||||
{
|
||||
/* Using same table for INSERT and SELECT */
|
||||
lex->current_select->options|= OPTION_BUFFER_RESULT;
|
||||
|
@ -2497,9 +2523,7 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
|
|||
(thd->variables.sql_mode &
|
||||
(MODE_STRICT_TRANS_TABLES |
|
||||
MODE_STRICT_ALL_TABLES)));
|
||||
res= ((fields->elements &&
|
||||
check_that_all_fields_are_given_values(thd, table, table_list)) ||
|
||||
table_list->prepare_where(thd, 0, TRUE) ||
|
||||
res= (table_list->prepare_where(thd, 0, TRUE) ||
|
||||
table_list->prepare_check_option(thd));
|
||||
|
||||
if (!res)
|
||||
|
|
|
@ -1206,6 +1206,7 @@ void st_select_lex::init_select()
|
|||
is_correlated= 0;
|
||||
cur_pos_in_select_list= UNDEF_POS;
|
||||
non_agg_fields.empty();
|
||||
cond_value= having_value= Item::COND_UNDEF;
|
||||
inner_refs_list.empty();
|
||||
}
|
||||
|
||||
|
|
|
@ -488,6 +488,8 @@ public:
|
|||
Item *where, *having; /* WHERE & HAVING clauses */
|
||||
Item *prep_where; /* saved WHERE clause for prepared statement processing */
|
||||
Item *prep_having;/* saved HAVING clause for prepared statement processing */
|
||||
/* Saved values of the WHERE and HAVING clauses*/
|
||||
Item::cond_result cond_value, having_value;
|
||||
/* point on lex in which it was created, used in view subquery detection */
|
||||
st_lex *parent_lex;
|
||||
enum olap_type olap;
|
||||
|
|
|
@ -176,7 +176,7 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
table is marked to be 'used for insert' in which case we should never
|
||||
mark this table as as 'const table' (ie, one that has only one row).
|
||||
*/
|
||||
if (unique_table(thd, table_list, table_list->next_global))
|
||||
if (unique_table(thd, table_list, table_list->next_global, 0))
|
||||
{
|
||||
my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->table_name);
|
||||
DBUG_RETURN(TRUE);
|
||||
|
|
|
@ -1604,7 +1604,10 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||
DBUG_ENTER("dispatch_command");
|
||||
|
||||
if (thd->killed == THD::KILL_QUERY || thd->killed == THD::KILL_BAD_DATA)
|
||||
{
|
||||
thd->killed= THD::NOT_KILLED;
|
||||
thd->mysys_var->abort= 0;
|
||||
}
|
||||
|
||||
thd->command=command;
|
||||
/*
|
||||
|
@ -3023,7 +3026,7 @@ mysql_execute_command(THD *thd)
|
|||
if (!(create_info.options & HA_LEX_CREATE_TMP_TABLE))
|
||||
{
|
||||
TABLE_LIST *duplicate;
|
||||
if ((duplicate= unique_table(thd, create_table, select_tables)))
|
||||
if ((duplicate= unique_table(thd, create_table, select_tables, 0)))
|
||||
{
|
||||
update_non_unique_table_error(create_table, "CREATE", duplicate);
|
||||
res= 1;
|
||||
|
@ -3039,7 +3042,7 @@ mysql_execute_command(THD *thd)
|
|||
tab= tab->next_local)
|
||||
{
|
||||
TABLE_LIST *duplicate;
|
||||
if ((duplicate= unique_table(thd, tab, select_tables)))
|
||||
if ((duplicate= unique_table(thd, tab, select_tables, 0)))
|
||||
{
|
||||
update_non_unique_table_error(tab, "CREATE", duplicate);
|
||||
res= 1;
|
||||
|
@ -5402,7 +5405,7 @@ check_table_access(THD *thd, ulong want_access,TABLE_LIST *tables,
|
|||
{
|
||||
uint found=0;
|
||||
ulong found_access=0;
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
TABLE_LIST *org_tables= tables;
|
||||
#endif
|
||||
TABLE_LIST *first_not_own_table= thd->lex->first_not_own_table();
|
||||
|
|
|
@ -1070,7 +1070,7 @@ static bool mysql_test_insert(Prepared_statement *stmt,
|
|||
|
||||
if (mysql_prepare_insert(thd, table_list, table_list->table,
|
||||
fields, values, update_fields, update_values,
|
||||
duplic, &unused_conds, FALSE))
|
||||
duplic, &unused_conds, FALSE, FALSE, FALSE))
|
||||
goto error;
|
||||
|
||||
value_count= values->elements;
|
||||
|
|
|
@ -396,6 +396,7 @@ JOIN::prepare(Item ***rref_pointer_array,
|
|||
join_list= &select_lex->top_join_list;
|
||||
union_part= (unit_arg->first_select()->next_select() != 0);
|
||||
|
||||
thd->lex->current_select->is_item_list_lookup= 1;
|
||||
/*
|
||||
If we have already executed SELECT, then it have not sense to prevent
|
||||
its table from update (see unique_table())
|
||||
|
@ -455,6 +456,17 @@ JOIN::prepare(Item ***rref_pointer_array,
|
|||
|
||||
select_lex->fix_prepare_information(thd, &conds, &having);
|
||||
|
||||
if (order)
|
||||
{
|
||||
ORDER *ord;
|
||||
for (ord= order; ord; ord= ord->next)
|
||||
{
|
||||
Item *item= *ord->item;
|
||||
if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM)
|
||||
item->split_sum_func(thd, ref_pointer_array, all_fields);
|
||||
}
|
||||
}
|
||||
|
||||
if (having && having->with_sum_func)
|
||||
having->split_sum_func2(thd, ref_pointer_array, all_fields,
|
||||
&having, TRUE);
|
||||
|
@ -748,7 +760,6 @@ JOIN::optimize()
|
|||
}
|
||||
|
||||
{
|
||||
Item::cond_result having_value;
|
||||
having= optimize_cond(this, having, join_list, &having_value);
|
||||
if (thd->net.report_error)
|
||||
{
|
||||
|
@ -756,6 +767,10 @@ JOIN::optimize()
|
|||
DBUG_PRINT("error",("Error from optimize_cond"));
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
if (select_lex->where)
|
||||
select_lex->cond_value= cond_value;
|
||||
if (select_lex->having)
|
||||
select_lex->having_value= having_value;
|
||||
|
||||
if (cond_value == Item::COND_FALSE || having_value == Item::COND_FALSE ||
|
||||
(!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS)))
|
||||
|
@ -896,6 +911,7 @@ JOIN::optimize()
|
|||
conds->update_used_tables();
|
||||
DBUG_EXECUTE("where", print_where(conds, "after substitute_best_equal"););
|
||||
}
|
||||
|
||||
/*
|
||||
Permorm the the optimization on fields evaluation mentioned above
|
||||
for all on expressions.
|
||||
|
@ -7605,6 +7621,10 @@ static COND* substitute_for_best_equal_field(COND *cond,
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (cond->type() == Item::COND_ITEM &&
|
||||
!((Item_cond*)cond)->argument_list()->elements)
|
||||
cond= new Item_int((int32)cond->val_bool());
|
||||
|
||||
}
|
||||
else if (cond->type() == Item::FUNC_ITEM &&
|
||||
((Item_cond*) cond)->functype() == Item_func::MULT_EQUAL_FUNC)
|
||||
|
@ -13158,7 +13178,7 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
|||
Item **select_item; /* The corresponding item from the SELECT clause. */
|
||||
Field *from_field; /* The corresponding field from the FROM clause. */
|
||||
uint counter;
|
||||
bool unaliased;
|
||||
enum_resolution_type resolution;
|
||||
|
||||
/*
|
||||
Local SP variables may be int but are expressions, not positions.
|
||||
|
@ -13181,7 +13201,7 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
|||
}
|
||||
/* Lookup the current GROUP/ORDER field in the SELECT clause. */
|
||||
select_item= find_item_in_list(order_item, fields, &counter,
|
||||
REPORT_EXCEPT_NOT_FOUND, &unaliased);
|
||||
REPORT_EXCEPT_NOT_FOUND, &resolution);
|
||||
if (!select_item)
|
||||
return TRUE; /* The item is not unique, or some other error occured. */
|
||||
|
||||
|
@ -13195,7 +13215,7 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
|||
original field name, we should additionaly check if we have conflict
|
||||
for this name (in case if we would perform lookup in all tables).
|
||||
*/
|
||||
if (unaliased && !order_item->fixed &&
|
||||
if (resolution == RESOLVED_BEHIND_ALIAS && !order_item->fixed &&
|
||||
order_item->fix_fields(thd, order->item))
|
||||
return TRUE;
|
||||
|
||||
|
@ -13265,16 +13285,11 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
|||
We check order_item->fixed because Item_func_group_concat can put
|
||||
arguments for which fix_fields already was called.
|
||||
*/
|
||||
thd->lex->current_select->is_item_list_lookup= 1;
|
||||
if (!order_item->fixed &&
|
||||
(order_item->fix_fields(thd, order->item) ||
|
||||
(order_item= *order->item)->check_cols(1) ||
|
||||
thd->is_fatal_error))
|
||||
{
|
||||
thd->lex->current_select->is_item_list_lookup= 0;
|
||||
return TRUE; /* Wrong field. */
|
||||
}
|
||||
thd->lex->current_select->is_item_list_lookup= 0;
|
||||
|
||||
uint el= all_fields.elements;
|
||||
all_fields.push_front(order_item); /* Add new field to field list. */
|
||||
|
@ -13429,7 +13444,7 @@ setup_new_fields(THD *thd, List<Item> &fields,
|
|||
|
||||
thd->set_query_id=1; // Not really needed, but...
|
||||
uint counter;
|
||||
bool not_used;
|
||||
enum_resolution_type not_used;
|
||||
for (; new_field ; new_field= new_field->next)
|
||||
{
|
||||
if ((item= find_item_in_list(*new_field->item, fields, &counter,
|
||||
|
@ -15328,10 +15343,13 @@ void st_select_lex::print(THD *thd, String *str)
|
|||
Item *cur_where= where;
|
||||
if (join)
|
||||
cur_where= join->conds;
|
||||
if (cur_where)
|
||||
if (cur_where || cond_value != Item::COND_UNDEF)
|
||||
{
|
||||
str->append(STRING_WITH_LEN(" where "));
|
||||
cur_where->print(str);
|
||||
if (cur_where)
|
||||
cur_where->print(str);
|
||||
else
|
||||
str->append(cond_value != Item::COND_FALSE ? "1" : "0");
|
||||
}
|
||||
|
||||
// group by & olap
|
||||
|
@ -15357,10 +15375,13 @@ void st_select_lex::print(THD *thd, String *str)
|
|||
if (join)
|
||||
cur_having= join->having;
|
||||
|
||||
if (cur_having)
|
||||
if (cur_having || having_value != Item::COND_UNDEF)
|
||||
{
|
||||
str->append(STRING_WITH_LEN(" having "));
|
||||
cur_having->print(str);
|
||||
if (cur_having)
|
||||
cur_having->print(str);
|
||||
else
|
||||
str->append(having_value != Item::COND_FALSE ? "1" : "0");
|
||||
}
|
||||
|
||||
if (order_list.elements)
|
||||
|
|
|
@ -292,7 +292,7 @@ public:
|
|||
|
||||
bool need_tmp, hidden_group_fields;
|
||||
DYNAMIC_ARRAY keyuse;
|
||||
Item::cond_result cond_value;
|
||||
Item::cond_result cond_value, having_value;
|
||||
List<Item> all_fields; // to store all fields that used in query
|
||||
//Above list changed to use temporary table
|
||||
List<Item> tmp_all_fields1, tmp_all_fields2, tmp_all_fields3;
|
||||
|
|
|
@ -992,7 +992,7 @@ store_create_info(THD *thd, TABLE_LIST *table_list, String *packet)
|
|||
if (key_part->field &&
|
||||
(key_part->length !=
|
||||
table->field[key_part->fieldnr-1]->key_length() &&
|
||||
!(key_info->flags & HA_FULLTEXT)))
|
||||
!(key_info->flags & (HA_FULLTEXT | HA_SPATIAL))))
|
||||
{
|
||||
buff[0] = '(';
|
||||
char* end=int10_to_str((long) key_part->length /
|
||||
|
|
|
@ -1344,6 +1344,7 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||
}
|
||||
else if (!f_is_geom(sql_field->pack_flag) &&
|
||||
(column->length > length ||
|
||||
!Field::type_can_have_key_part (sql_field->sql_type) ||
|
||||
((f_is_packed(sql_field->pack_flag) ||
|
||||
((file->table_flags() & HA_NO_PREFIX_CHAR_KEYS) &&
|
||||
(key_info->flags & HA_NOSAME))) &&
|
||||
|
|
|
@ -621,6 +621,12 @@ bool st_select_lex_unit::cleanup()
|
|||
join->tables= 0;
|
||||
}
|
||||
error|= fake_select_lex->cleanup();
|
||||
if (fake_select_lex->order_list.elements)
|
||||
{
|
||||
ORDER *ord;
|
||||
for (ord= (ORDER*)fake_select_lex->order_list.first; ord; ord= ord->next)
|
||||
(*ord->item)->cleanup();
|
||||
}
|
||||
}
|
||||
|
||||
DBUG_RETURN(error);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue