automerge
This commit is contained in:
commit
2db0641a60
@ -32,7 +32,6 @@ static my_bool verbose, print_all_codes;
|
|||||||
|
|
||||||
#include "../include/my_base.h"
|
#include "../include/my_base.h"
|
||||||
#include "../mysys/my_handler_errors.h"
|
#include "../mysys/my_handler_errors.h"
|
||||||
#include "../include/my_handler.h"
|
|
||||||
|
|
||||||
#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE
|
#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE
|
||||||
static my_bool ndb_code;
|
static my_bool ndb_code;
|
||||||
@ -185,6 +184,36 @@ static const char *get_ha_error_msg(int code)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Register handler error messages for usage with my_error()
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
This is safe to call multiple times as my_error_register()
|
||||||
|
will ignore calls to register already registered error numbers.
|
||||||
|
*/
|
||||||
|
void my_handler_error_register(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
If you got compilation error here about compile_time_assert array, check
|
||||||
|
that every HA_ERR_xxx constant has a corresponding error message in
|
||||||
|
handler_error_messages[] list (check mysys/ma_handler_errors.h and
|
||||||
|
include/my_base.h).
|
||||||
|
*/
|
||||||
|
compile_time_assert(HA_ERR_FIRST + array_elements(handler_error_messages) ==
|
||||||
|
HA_ERR_LAST + 1);
|
||||||
|
my_error_register(handler_error_messages, HA_ERR_FIRST,
|
||||||
|
HA_ERR_FIRST+ array_elements(handler_error_messages)-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void my_handler_error_unregister(void)
|
||||||
|
{
|
||||||
|
my_error_unregister(HA_ERR_FIRST,
|
||||||
|
HA_ERR_FIRST+ array_elements(handler_error_messages)-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__WIN__)
|
#if defined(__WIN__)
|
||||||
static my_bool print_win_error_msg(DWORD error, my_bool verbose)
|
static my_bool print_win_error_msg(DWORD error, my_bool verbose)
|
||||||
{
|
{
|
||||||
|
@ -37,7 +37,7 @@ noinst_HEADERS = config-win.h config-netware.h my_bit.h \
|
|||||||
my_nosys.h my_alarm.h queues.h rijndael.h sha1.h \
|
my_nosys.h my_alarm.h queues.h rijndael.h sha1.h \
|
||||||
my_aes.h my_tree.h my_trie.h hash.h thr_alarm.h \
|
my_aes.h my_tree.h my_trie.h hash.h thr_alarm.h \
|
||||||
thr_lock.h t_ctype.h violite.h my_md5.h base64.h \
|
thr_lock.h t_ctype.h violite.h my_md5.h base64.h \
|
||||||
my_handler.h my_time.h my_vle.h my_user.h \
|
my_compare.h my_time.h my_vle.h my_user.h \
|
||||||
my_libwrap.h my_stacktrace.h
|
my_libwrap.h my_stacktrace.h
|
||||||
|
|
||||||
EXTRA_DIST = mysql.h.pp mysql/plugin.h.pp
|
EXTRA_DIST = mysql.h.pp mysql/plugin.h.pp
|
||||||
|
@ -30,7 +30,7 @@ extern "C" {
|
|||||||
#include <thr_lock.h>
|
#include <thr_lock.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "my_handler.h"
|
#include "my_compare.h"
|
||||||
#include "my_tree.h"
|
#include "my_tree.h"
|
||||||
|
|
||||||
/* defines used by heap-funktions */
|
/* defines used by heap-funktions */
|
||||||
|
89
include/my_compare.h
Normal file
89
include/my_compare.h
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
|
||||||
|
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 */
|
||||||
|
|
||||||
|
#ifndef _my_compare_h
|
||||||
|
#define _my_compare_h
|
||||||
|
|
||||||
|
#include "my_base.h"
|
||||||
|
#include "m_ctype.h"
|
||||||
|
#include "myisampack.h"
|
||||||
|
|
||||||
|
typedef struct st_HA_KEYSEG /* Key-portion */
|
||||||
|
{
|
||||||
|
CHARSET_INFO *charset;
|
||||||
|
uint32 start; /* Start of key in record */
|
||||||
|
uint32 null_pos; /* position to NULL indicator */
|
||||||
|
uint16 bit_pos; /* Position to bit part */
|
||||||
|
uint16 flag;
|
||||||
|
uint16 length; /* Keylength */
|
||||||
|
uint8 type; /* Type of key (for sort) */
|
||||||
|
uint8 language;
|
||||||
|
uint8 null_bit; /* bitmask to test for NULL */
|
||||||
|
uint8 bit_start,bit_end; /* if bit field */
|
||||||
|
uint8 bit_length; /* Length of bit part */
|
||||||
|
} HA_KEYSEG;
|
||||||
|
|
||||||
|
#define get_key_length(length,key) \
|
||||||
|
{ if ((uchar) *(key) != 255) \
|
||||||
|
length= (uint) (uchar) *((key)++); \
|
||||||
|
else \
|
||||||
|
{ length=mi_uint2korr((key)+1); (key)+=3; } \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define get_key_length_rdonly(length,key) \
|
||||||
|
{ if ((uchar) *(key) != 255) \
|
||||||
|
length= ((uint) (uchar) *((key))); \
|
||||||
|
else \
|
||||||
|
{ length=mi_uint2korr((key)+1); } \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define get_key_pack_length(length,length_pack,key) \
|
||||||
|
{ if ((uchar) *(key) != 255) \
|
||||||
|
{ length= (uint) (uchar) *((key)++); length_pack=1; }\
|
||||||
|
else \
|
||||||
|
{ length=mi_uint2korr((key)+1); (key)+=3; length_pack=3; } \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define store_key_length_inc(key,length) \
|
||||||
|
{ if ((length) < 255) \
|
||||||
|
{ *(key)++=(length); } \
|
||||||
|
else \
|
||||||
|
{ *(key)=255; mi_int2store((key)+1,(length)); (key)+=3; } \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define get_rec_bits(bit_ptr, bit_ofs, bit_len) \
|
||||||
|
(((((uint16) (bit_ptr)[1] << 8) | (uint16) (bit_ptr)[0]) >> (bit_ofs)) & \
|
||||||
|
((1 << (bit_len)) - 1))
|
||||||
|
|
||||||
|
#define set_rec_bits(bits, bit_ptr, bit_ofs, bit_len) \
|
||||||
|
{ \
|
||||||
|
(bit_ptr)[0]= ((bit_ptr)[0] & ~(((1 << (bit_len)) - 1) << (bit_ofs))) | \
|
||||||
|
((bits) << (bit_ofs)); \
|
||||||
|
if ((bit_ofs) + (bit_len) > 8) \
|
||||||
|
(bit_ptr)[1]= ((bit_ptr)[1] & ~((1 << ((bit_len) - 8 + (bit_ofs))) - 1)) | \
|
||||||
|
((bits) >> (8 - (bit_ofs))); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define clr_rec_bits(bit_ptr, bit_ofs, bit_len) \
|
||||||
|
set_rec_bits(0, bit_ptr, bit_ofs, bit_len)
|
||||||
|
|
||||||
|
extern int ha_compare_text(CHARSET_INFO *, uchar *, uint, uchar *, uint ,
|
||||||
|
my_bool, my_bool);
|
||||||
|
extern int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a,
|
||||||
|
register uchar *b, uint key_length, uint nextflag,
|
||||||
|
uint *diff_pos);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _my_compare_h */
|
@ -359,7 +359,7 @@ C_MODE_END
|
|||||||
#define ulonglong2double(A) my_ulonglong2double(A)
|
#define ulonglong2double(A) my_ulonglong2double(A)
|
||||||
#define my_off_t2double(A) my_ulonglong2double(A)
|
#define my_off_t2double(A) my_ulonglong2double(A)
|
||||||
C_MODE_START
|
C_MODE_START
|
||||||
double my_ulonglong2double(unsigned long long A);
|
inline double my_ulonglong2double(unsigned long long A) { return (double) A; }
|
||||||
C_MODE_END
|
C_MODE_END
|
||||||
#endif /* _AIX */
|
#endif /* _AIX */
|
||||||
|
|
||||||
|
@ -1,128 +0,0 @@
|
|||||||
/* Copyright (C) 2002-2006 MySQL AB
|
|
||||||
|
|
||||||
This program 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; 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
|
|
||||||
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 */
|
|
||||||
|
|
||||||
#ifndef _my_handler_h
|
|
||||||
#define _my_handler_h
|
|
||||||
|
|
||||||
#include "myisampack.h"
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
There is a hard limit for the maximum number of keys as there are only
|
|
||||||
8 bits in the index file header for the number of keys in a table.
|
|
||||||
This means that 0..255 keys can exist for a table. The idea of
|
|
||||||
HA_MAX_POSSIBLE_KEY is to ensure that one can use myisamchk & tools on
|
|
||||||
a MyISAM table for which one has more keys than MyISAM is normally
|
|
||||||
compiled for. If you don't have this, you will get a core dump when
|
|
||||||
running myisamchk compiled for 128 keys on a table with 255 keys.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HA_MAX_POSSIBLE_KEY 255 /* For myisamchk */
|
|
||||||
/*
|
|
||||||
The following defines can be increased if necessary.
|
|
||||||
But beware the dependency of MI_MAX_POSSIBLE_KEY_BUFF and HA_MAX_KEY_LENGTH.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HA_MAX_KEY_LENGTH 1000 /* Max length in bytes */
|
|
||||||
#define HA_MAX_KEY_SEG 16 /* Max segments for key */
|
|
||||||
|
|
||||||
#define HA_MAX_POSSIBLE_KEY_BUFF (HA_MAX_KEY_LENGTH + 24+ 6+6)
|
|
||||||
#define HA_MAX_KEY_BUFF (HA_MAX_KEY_LENGTH+HA_MAX_KEY_SEG*6+8+8)
|
|
||||||
|
|
||||||
typedef struct st_HA_KEYSEG /* Key-portion */
|
|
||||||
{
|
|
||||||
CHARSET_INFO *charset;
|
|
||||||
uint32 start; /* Start of key in record */
|
|
||||||
uint32 null_pos; /* position to NULL indicator */
|
|
||||||
uint16 bit_pos; /* Position to bit part */
|
|
||||||
uint16 flag;
|
|
||||||
uint16 length; /* Keylength */
|
|
||||||
uint8 type; /* Type of key (for sort) */
|
|
||||||
uint8 language;
|
|
||||||
uint8 null_bit; /* bitmask to test for NULL */
|
|
||||||
uint8 bit_start,bit_end; /* if bit field */
|
|
||||||
uint8 bit_length; /* Length of bit part */
|
|
||||||
} HA_KEYSEG;
|
|
||||||
|
|
||||||
#define get_key_length(length,key) \
|
|
||||||
{ if (*(uchar*) (key) != 255) \
|
|
||||||
length= (uint) *(uchar*) ((key)++); \
|
|
||||||
else \
|
|
||||||
{ length= mi_uint2korr((key)+1); (key)+=3; } \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define get_key_length_rdonly(length,key) \
|
|
||||||
{ if (*(uchar*) (key) != 255) \
|
|
||||||
length= ((uint) *(uchar*) ((key))); \
|
|
||||||
else \
|
|
||||||
{ length= mi_uint2korr((key)+1); } \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define get_key_pack_length(length,length_pack,key) \
|
|
||||||
{ if (*(uchar*) (key) != 255) \
|
|
||||||
{ length= (uint) *(uchar*) ((key)++); length_pack= 1; }\
|
|
||||||
else \
|
|
||||||
{ length=mi_uint2korr((key)+1); (key)+= 3; length_pack= 3; } \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define store_key_length_inc(key,length) \
|
|
||||||
{ if ((length) < 255) \
|
|
||||||
{ *(key)++= (length); } \
|
|
||||||
else \
|
|
||||||
{ *(key)=255; mi_int2store((key)+1,(length)); (key)+=3; } \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define size_to_store_key_length(length) ((length) < 255 ? 1 : 3)
|
|
||||||
|
|
||||||
#define get_rec_bits(bit_ptr, bit_ofs, bit_len) \
|
|
||||||
(((((uint16) (bit_ptr)[1] << 8) | (uint16) (bit_ptr)[0]) >> (bit_ofs)) & \
|
|
||||||
((1 << (bit_len)) - 1))
|
|
||||||
|
|
||||||
#define set_rec_bits(bits, bit_ptr, bit_ofs, bit_len) \
|
|
||||||
{ \
|
|
||||||
(bit_ptr)[0]= ((bit_ptr)[0] & ~(((1 << (bit_len)) - 1) << (bit_ofs))) | \
|
|
||||||
((bits) << (bit_ofs)); \
|
|
||||||
if ((bit_ofs) + (bit_len) > 8) \
|
|
||||||
(bit_ptr)[1]= ((bit_ptr)[1] & ~((1 << ((bit_len) - 8 + (bit_ofs))) - 1)) | \
|
|
||||||
((bits) >> (8 - (bit_ofs))); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define clr_rec_bits(bit_ptr, bit_ofs, bit_len) \
|
|
||||||
set_rec_bits(0, bit_ptr, bit_ofs, bit_len)
|
|
||||||
|
|
||||||
extern int ha_compare_text(CHARSET_INFO *, uchar *, uint, uchar *, uint ,
|
|
||||||
my_bool, my_bool);
|
|
||||||
extern int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a,
|
|
||||||
register uchar *b, uint key_length, uint nextflag,
|
|
||||||
uint *diff_pos);
|
|
||||||
|
|
||||||
extern HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, uchar *a);
|
|
||||||
extern void my_handler_error_register(void);
|
|
||||||
extern void my_handler_error_unregister(void);
|
|
||||||
/*
|
|
||||||
Inside an in-memory data record, memory pointers to pieces of the
|
|
||||||
record (like BLOBs) are stored in their native byte order and in
|
|
||||||
this amount of bytes.
|
|
||||||
*/
|
|
||||||
#define portable_sizeof_char_ptr 8
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _my_handler_h */
|
|
@ -30,8 +30,30 @@ extern "C" {
|
|||||||
#ifndef _keycache_h
|
#ifndef _keycache_h
|
||||||
#include "keycache.h"
|
#include "keycache.h"
|
||||||
#endif
|
#endif
|
||||||
#include "my_handler.h"
|
|
||||||
#include <mysql/plugin.h>
|
#include <mysql/plugin.h>
|
||||||
|
#include "my_compare.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
There is a hard limit for the maximum number of keys as there are only
|
||||||
|
8 bits in the index file header for the number of keys in a table.
|
||||||
|
This means that 0..255 keys can exist for a table. The idea of
|
||||||
|
HA_MAX_POSSIBLE_KEY is to ensure that one can use myisamchk & tools on
|
||||||
|
a MyISAM table for which one has more keys than MyISAM is normally
|
||||||
|
compiled for. If you don't have this, you will get a core dump when
|
||||||
|
running myisamchk compiled for 128 keys on a table with 255 keys.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HA_MAX_POSSIBLE_KEY 255 /* For myisamchk */
|
||||||
|
/*
|
||||||
|
The following defines can be increased if necessary.
|
||||||
|
But beware the dependency of MI_MAX_POSSIBLE_KEY_BUFF and HA_MAX_KEY_LENGTH.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HA_MAX_KEY_LENGTH 1000 /* Max length in bytes */
|
||||||
|
#define HA_MAX_KEY_SEG 16 /* Max segments for key */
|
||||||
|
|
||||||
|
#define HA_MAX_POSSIBLE_KEY_BUFF (HA_MAX_KEY_LENGTH + 24+ 6+6)
|
||||||
|
#define HA_MAX_KEY_BUFF (HA_MAX_KEY_LENGTH+HA_MAX_KEY_SEG*6+8+8)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Limit max keys according to HA_MAX_POSSIBLE_KEY
|
Limit max keys according to HA_MAX_POSSIBLE_KEY
|
||||||
|
@ -82,7 +82,7 @@ SET(CLIENT_SOURCES ../mysys/array.c ../strings/bchange.c ../strings/bmove.c
|
|||||||
../mysys/mf_wcomp.c ../mysys/mulalloc.c ../mysys/my_access.c ../mysys/my_alloc.c
|
../mysys/mf_wcomp.c ../mysys/mulalloc.c ../mysys/my_access.c ../mysys/my_alloc.c
|
||||||
../mysys/my_chsize.c ../mysys/my_compress.c ../mysys/my_create.c
|
../mysys/my_chsize.c ../mysys/my_compress.c ../mysys/my_create.c
|
||||||
../mysys/my_delete.c ../mysys/my_div.c ../mysys/my_error.c ../mysys/my_file.c
|
../mysys/my_delete.c ../mysys/my_div.c ../mysys/my_error.c ../mysys/my_file.c
|
||||||
../mysys/my_fopen.c ../mysys/my_fstream.c ../mysys/my_gethostbyname.c
|
../mysys/my_fopen.c ../mysys/my_fstream.c
|
||||||
../mysys/my_getopt.c ../mysys/my_getwd.c ../mysys/my_init.c ../mysys/my_lib.c
|
../mysys/my_getopt.c ../mysys/my_getwd.c ../mysys/my_init.c ../mysys/my_lib.c
|
||||||
../mysys/my_malloc.c ../mysys/my_messnc.c ../mysys/my_net.c ../mysys/my_once.c
|
../mysys/my_malloc.c ../mysys/my_messnc.c ../mysys/my_net.c ../mysys/my_once.c
|
||||||
../mysys/my_open.c ../mysys/my_pread.c ../mysys/my_pthread.c ../mysys/my_read.c
|
../mysys/my_open.c ../mysys/my_pread.c ../mysys/my_pthread.c ../mysys/my_read.c
|
||||||
|
@ -66,7 +66,7 @@ mysysobjects1 = my_init.lo my_static.lo my_malloc.lo my_realloc.lo \
|
|||||||
charset.lo charset-def.lo hash.lo mf_iocache.lo \
|
charset.lo charset-def.lo hash.lo mf_iocache.lo \
|
||||||
mf_iocache2.lo my_seek.lo my_sleep.lo \
|
mf_iocache2.lo my_seek.lo my_sleep.lo \
|
||||||
my_pread.lo mf_cache.lo md5.lo sha1.lo \
|
my_pread.lo mf_cache.lo md5.lo sha1.lo \
|
||||||
my_getopt.lo my_gethostbyname.lo my_port.lo \
|
my_getopt.lo \
|
||||||
my_rename.lo my_chsize.lo my_sync.lo my_getsystime.lo
|
my_rename.lo my_chsize.lo my_sync.lo my_getsystime.lo
|
||||||
sqlobjects = net.lo
|
sqlobjects = net.lo
|
||||||
sql_cmn_objects = pack.lo client.lo my_time.lo
|
sql_cmn_objects = pack.lo client.lo my_time.lo
|
||||||
|
@ -33,8 +33,8 @@ SET(MYSYS_SOURCES array.c charset-def.c charset.c checksum.c default.c default_
|
|||||||
mf_tempfile.c mf_unixpath.c mf_wcomp.c mf_wfile.c mulalloc.c my_access.c
|
mf_tempfile.c mf_unixpath.c mf_wcomp.c mf_wfile.c mulalloc.c my_access.c
|
||||||
my_aes.c my_alarm.c my_alloc.c my_append.c my_bit.c my_bitmap.c my_chsize.c
|
my_aes.c my_alarm.c my_alloc.c my_append.c my_bit.c my_bitmap.c my_chsize.c
|
||||||
my_clock.c my_compress.c my_conio.c my_copy.c my_crc32.c my_create.c my_delete.c
|
my_clock.c my_compress.c my_conio.c my_copy.c my_crc32.c my_create.c my_delete.c
|
||||||
my_div.c my_error.c my_file.c my_fopen.c my_fstream.c my_gethostbyname.c
|
my_div.c my_error.c my_file.c my_fopen.c my_fstream.c
|
||||||
my_gethwaddr.c my_getopt.c my_getsystime.c my_getwd.c my_handler.c my_init.c
|
my_gethwaddr.c my_getopt.c my_getsystime.c my_getwd.c my_compare.c my_init.c
|
||||||
my_lib.c my_lock.c my_lockmem.c my_malloc.c my_messnc.c
|
my_lib.c my_lock.c my_lockmem.c my_malloc.c my_messnc.c
|
||||||
my_mkdir.c my_mmap.c my_net.c my_once.c my_open.c my_pread.c my_pthread.c
|
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_quick.c my_read.c my_realloc.c my_redel.c my_rename.c my_seek.c my_sleep.c
|
||||||
|
@ -46,10 +46,10 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \
|
|||||||
my_sync.c my_getopt.c my_mkdir.c \
|
my_sync.c my_getopt.c my_mkdir.c \
|
||||||
default_modify.c default.c \
|
default_modify.c default.c \
|
||||||
my_compress.c checksum.c \
|
my_compress.c checksum.c \
|
||||||
my_net.c my_port.c my_sleep.c \
|
my_net.c my_sleep.c \
|
||||||
charset.c charset-def.c my_bitmap.c my_bit.c md5.c \
|
charset.c charset-def.c my_bitmap.c my_bit.c md5.c \
|
||||||
my_gethostbyname.c rijndael.c my_aes.c sha1.c \
|
rijndael.c my_aes.c sha1.c \
|
||||||
my_handler.c my_netware.c my_largepage.c \
|
my_compare.c my_netware.c my_largepage.c \
|
||||||
my_memmem.c stacktrace.c \
|
my_memmem.c stacktrace.c \
|
||||||
my_windac.c my_access.c base64.c my_libwrap.c
|
my_windac.c my_access.c base64.c my_libwrap.c
|
||||||
|
|
||||||
|
@ -1,27 +1,19 @@
|
|||||||
/* Copyright (C) 2002-2006 MySQL AB
|
/* Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or modify
|
||||||
modify it under the terms of the GNU Library General Public
|
it under the terms of the GNU General Public License as published by
|
||||||
License as published by the Free Software Foundation; version 2
|
the Free Software Foundation; version 2 of the License.
|
||||||
of the License.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
Library General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU General Public License
|
||||||
License along with this library; if not, write to the Free
|
along with this program; if not, write to the Free Software
|
||||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
MA 02111-1307, USA */
|
|
||||||
|
|
||||||
#include <my_global.h>
|
#include "my_compare.h"
|
||||||
#include <m_ctype.h>
|
|
||||||
#include <my_base.h>
|
|
||||||
#include <my_handler.h>
|
|
||||||
#include <my_sys.h>
|
|
||||||
|
|
||||||
#include "my_handler_errors.h"
|
|
||||||
|
|
||||||
int ha_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length,
|
int ha_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length,
|
||||||
uchar *b, uint b_length, my_bool part_key,
|
uchar *b, uint b_length, my_bool part_key,
|
||||||
@ -269,6 +261,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a,
|
|||||||
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
|
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
|
||||||
a+=a_length;
|
a+=a_length;
|
||||||
b+=b_length;
|
b+=b_length;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case HA_KEYTYPE_INT8:
|
case HA_KEYTYPE_INT8:
|
||||||
@ -474,125 +467,3 @@ end:
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} /* ha_key_cmp */
|
} /* ha_key_cmp */
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Find the first NULL value in index-suffix values tuple
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
ha_find_null()
|
|
||||||
keyseg Array of keyparts for key suffix
|
|
||||||
a Key suffix value tuple
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
Find the first NULL value in index-suffix values tuple.
|
|
||||||
|
|
||||||
TODO
|
|
||||||
Consider optimizing this function or its use so we don't search for
|
|
||||||
NULL values in completely NOT NULL index suffixes.
|
|
||||||
|
|
||||||
RETURN
|
|
||||||
First key part that has NULL as value in values tuple, or the last key
|
|
||||||
part (with keyseg->type==HA_TYPE_END) if values tuple doesn't contain
|
|
||||||
NULLs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, uchar *a)
|
|
||||||
{
|
|
||||||
for (; (enum ha_base_keytype) keyseg->type != HA_KEYTYPE_END; keyseg++)
|
|
||||||
{
|
|
||||||
uchar *end;
|
|
||||||
if (keyseg->null_bit)
|
|
||||||
{
|
|
||||||
if (!*a++)
|
|
||||||
return keyseg;
|
|
||||||
}
|
|
||||||
end= a+ keyseg->length;
|
|
||||||
|
|
||||||
switch ((enum ha_base_keytype) keyseg->type) {
|
|
||||||
case HA_KEYTYPE_TEXT:
|
|
||||||
case HA_KEYTYPE_BINARY:
|
|
||||||
case HA_KEYTYPE_BIT:
|
|
||||||
if (keyseg->flag & HA_SPACE_PACK)
|
|
||||||
{
|
|
||||||
int a_length;
|
|
||||||
get_key_length(a_length, a);
|
|
||||||
a += a_length;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
a= end;
|
|
||||||
break;
|
|
||||||
case HA_KEYTYPE_VARTEXT1:
|
|
||||||
case HA_KEYTYPE_VARTEXT2:
|
|
||||||
case HA_KEYTYPE_VARBINARY1:
|
|
||||||
case HA_KEYTYPE_VARBINARY2:
|
|
||||||
{
|
|
||||||
int a_length;
|
|
||||||
get_key_length(a_length, a);
|
|
||||||
a+= a_length;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case HA_KEYTYPE_NUM:
|
|
||||||
if (keyseg->flag & HA_SPACE_PACK)
|
|
||||||
{
|
|
||||||
int alength= *a++;
|
|
||||||
end= a+alength;
|
|
||||||
}
|
|
||||||
a= end;
|
|
||||||
break;
|
|
||||||
case HA_KEYTYPE_INT8:
|
|
||||||
case HA_KEYTYPE_SHORT_INT:
|
|
||||||
case HA_KEYTYPE_USHORT_INT:
|
|
||||||
case HA_KEYTYPE_LONG_INT:
|
|
||||||
case HA_KEYTYPE_ULONG_INT:
|
|
||||||
case HA_KEYTYPE_INT24:
|
|
||||||
case HA_KEYTYPE_UINT24:
|
|
||||||
#ifdef HAVE_LONG_LONG
|
|
||||||
case HA_KEYTYPE_LONGLONG:
|
|
||||||
case HA_KEYTYPE_ULONGLONG:
|
|
||||||
#endif
|
|
||||||
case HA_KEYTYPE_FLOAT:
|
|
||||||
case HA_KEYTYPE_DOUBLE:
|
|
||||||
a= end;
|
|
||||||
break;
|
|
||||||
case HA_KEYTYPE_END: /* purecov: inspected */
|
|
||||||
/* keep compiler happy */
|
|
||||||
DBUG_ASSERT(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return keyseg;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Register handler error messages for usage with my_error()
|
|
||||||
|
|
||||||
NOTES
|
|
||||||
This is safe to call multiple times as my_error_register()
|
|
||||||
will ignore calls to register already registered error numbers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void my_handler_error_register(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
If you got compilation error here about compile_time_assert array, check
|
|
||||||
that every HA_ERR_xxx constant has a corresponding error message in
|
|
||||||
handler_error_messages[] list (check mysys/ma_handler_errors.h and
|
|
||||||
include/my_base.h).
|
|
||||||
*/
|
|
||||||
compile_time_assert(HA_ERR_FIRST + array_elements(handler_error_messages) ==
|
|
||||||
HA_ERR_LAST + 1);
|
|
||||||
my_error_register(handler_error_messages, HA_ERR_FIRST,
|
|
||||||
HA_ERR_FIRST+ array_elements(handler_error_messages)-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void my_handler_error_unregister(void)
|
|
||||||
{
|
|
||||||
my_error_unregister(HA_ERR_FIRST,
|
|
||||||
HA_ERR_FIRST+ array_elements(handler_error_messages)-1);
|
|
||||||
}
|
|
@ -1,113 +0,0 @@
|
|||||||
/* Copyright (C) 2002, 2004 MySQL AB
|
|
||||||
|
|
||||||
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; version 2
|
|
||||||
of the License.
|
|
||||||
|
|
||||||
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 */
|
|
||||||
|
|
||||||
/* Thread safe version of gethostbyname_r() */
|
|
||||||
|
|
||||||
#include "mysys_priv.h"
|
|
||||||
#if !defined(__WIN__)
|
|
||||||
#include <netdb.h>
|
|
||||||
#endif
|
|
||||||
#include <my_net.h>
|
|
||||||
|
|
||||||
/* This file is not needed if my_gethostbyname_r is a macro */
|
|
||||||
#if !defined(my_gethostbyname_r)
|
|
||||||
|
|
||||||
/*
|
|
||||||
Emulate SOLARIS style calls, not because it's better, but just to make the
|
|
||||||
usage of getbostbyname_r simpler.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(HAVE_GETHOSTBYNAME_R)
|
|
||||||
|
|
||||||
#if defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE)
|
|
||||||
|
|
||||||
struct hostent *my_gethostbyname_r(const char *name,
|
|
||||||
struct hostent *result, char *buffer,
|
|
||||||
int buflen, int *h_errnop)
|
|
||||||
{
|
|
||||||
struct hostent *hp;
|
|
||||||
DBUG_ASSERT((size_t) buflen >= sizeof(*result));
|
|
||||||
if (gethostbyname_r(name,result, buffer, (size_t) buflen, &hp, h_errnop))
|
|
||||||
return 0;
|
|
||||||
return hp;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(HAVE_GETHOSTBYNAME_R_RETURN_INT)
|
|
||||||
|
|
||||||
struct hostent *my_gethostbyname_r(const char *name,
|
|
||||||
struct hostent *result, char *buffer,
|
|
||||||
int buflen, int *h_errnop)
|
|
||||||
{
|
|
||||||
if (gethostbyname_r(name,result,(struct hostent_data *) buffer) == -1)
|
|
||||||
{
|
|
||||||
*h_errnop= errno;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* gethostbyname_r with similar interface as gethostbyname() */
|
|
||||||
|
|
||||||
struct hostent *my_gethostbyname_r(const char *name,
|
|
||||||
struct hostent *result, char *buffer,
|
|
||||||
int buflen, int *h_errnop)
|
|
||||||
{
|
|
||||||
struct hostent *hp;
|
|
||||||
DBUG_ASSERT(buflen >= sizeof(struct hostent_data));
|
|
||||||
hp= gethostbyname_r(name,result,(struct hostent_data *) buffer);
|
|
||||||
*h_errnop= errno;
|
|
||||||
return hp;
|
|
||||||
}
|
|
||||||
#endif /* GLIBC2_STYLE_GETHOSTBYNAME_R */
|
|
||||||
|
|
||||||
#else /* !HAVE_GETHOSTBYNAME_R */
|
|
||||||
|
|
||||||
#ifdef THREAD
|
|
||||||
extern pthread_mutex_t LOCK_gethostbyname_r;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
No gethostbyname_r() function exists.
|
|
||||||
In this case we have to keep a mutex over the call to ensure that no
|
|
||||||
other thread is going to reuse the internal memory.
|
|
||||||
|
|
||||||
The user is responsible to call my_gethostbyname_r_free() when he
|
|
||||||
is finished with the structure.
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct hostent *my_gethostbyname_r(const char *name,
|
|
||||||
struct hostent *res __attribute__((unused)),
|
|
||||||
char *buffer __attribute__((unused)),
|
|
||||||
int buflen __attribute__((unused)),
|
|
||||||
int *h_errnop)
|
|
||||||
{
|
|
||||||
struct hostent *hp;
|
|
||||||
pthread_mutex_lock(&LOCK_gethostbyname_r);
|
|
||||||
hp= gethostbyname(name);
|
|
||||||
*h_errnop= h_errno;
|
|
||||||
return hp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void my_gethostbyname_r_free()
|
|
||||||
{
|
|
||||||
pthread_mutex_unlock(&LOCK_gethostbyname_r);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* !HAVE_GETHOSTBYNAME_R */
|
|
||||||
#endif /* !my_gethostbyname_r */
|
|
@ -31,6 +31,8 @@
|
|||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#endif
|
#endif
|
||||||
#endif /* !defined(__WIN__) */
|
#endif /* !defined(__WIN__) */
|
||||||
|
#include "my_net.h"
|
||||||
|
|
||||||
|
|
||||||
void my_inet_ntoa(struct in_addr in, char *buf)
|
void my_inet_ntoa(struct in_addr in, char *buf)
|
||||||
{
|
{
|
||||||
@ -40,3 +42,90 @@ void my_inet_ntoa(struct in_addr in, char *buf)
|
|||||||
strmov(buf,ptr);
|
strmov(buf,ptr);
|
||||||
pthread_mutex_unlock(&THR_LOCK_net);
|
pthread_mutex_unlock(&THR_LOCK_net);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This code is not needed if my_gethostbyname_r is a macro */
|
||||||
|
#if !defined(my_gethostbyname_r)
|
||||||
|
|
||||||
|
/*
|
||||||
|
Emulate SOLARIS style calls, not because it's better, but just to make the
|
||||||
|
usage of getbostbyname_r simpler.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(HAVE_GETHOSTBYNAME_R)
|
||||||
|
|
||||||
|
#if defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE)
|
||||||
|
|
||||||
|
struct hostent *my_gethostbyname_r(const char *name,
|
||||||
|
struct hostent *result, char *buffer,
|
||||||
|
int buflen, int *h_errnop)
|
||||||
|
{
|
||||||
|
struct hostent *hp;
|
||||||
|
DBUG_ASSERT((size_t) buflen >= sizeof(*result));
|
||||||
|
if (gethostbyname_r(name,result, buffer, (size_t) buflen, &hp, h_errnop))
|
||||||
|
return 0;
|
||||||
|
return hp;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(HAVE_GETHOSTBYNAME_R_RETURN_INT)
|
||||||
|
|
||||||
|
struct hostent *my_gethostbyname_r(const char *name,
|
||||||
|
struct hostent *result, char *buffer,
|
||||||
|
int buflen, int *h_errnop)
|
||||||
|
{
|
||||||
|
if (gethostbyname_r(name,result,(struct hostent_data *) buffer) == -1)
|
||||||
|
{
|
||||||
|
*h_errnop= errno;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* gethostbyname_r with similar interface as gethostbyname() */
|
||||||
|
|
||||||
|
struct hostent *my_gethostbyname_r(const char *name,
|
||||||
|
struct hostent *result, char *buffer,
|
||||||
|
int buflen, int *h_errnop)
|
||||||
|
{
|
||||||
|
struct hostent *hp;
|
||||||
|
DBUG_ASSERT(buflen >= sizeof(struct hostent_data));
|
||||||
|
hp= gethostbyname_r(name,result,(struct hostent_data *) buffer);
|
||||||
|
*h_errnop= errno;
|
||||||
|
return hp;
|
||||||
|
}
|
||||||
|
#endif /* GLIBC2_STYLE_GETHOSTBYNAME_R */
|
||||||
|
|
||||||
|
#else /* !HAVE_GETHOSTBYNAME_R */
|
||||||
|
|
||||||
|
#ifdef THREAD
|
||||||
|
extern pthread_mutex_t LOCK_gethostbyname_r;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
No gethostbyname_r() function exists.
|
||||||
|
In this case we have to keep a mutex over the call to ensure that no
|
||||||
|
other thread is going to reuse the internal memory.
|
||||||
|
|
||||||
|
The user is responsible to call my_gethostbyname_r_free() when he
|
||||||
|
is finished with the structure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct hostent *my_gethostbyname_r(const char *name,
|
||||||
|
struct hostent *result, char *buffer,
|
||||||
|
int buflen, int *h_errnop)
|
||||||
|
{
|
||||||
|
struct hostent *hp;
|
||||||
|
pthread_mutex_lock(&LOCK_gethostbyname_r);
|
||||||
|
hp= gethostbyname(name);
|
||||||
|
*h_errnop= h_errno;
|
||||||
|
return hp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void my_gethostbyname_r_free()
|
||||||
|
{
|
||||||
|
pthread_mutex_unlock(&LOCK_gethostbyname_r);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !HAVE_GETHOSTBYNAME_R */
|
||||||
|
#endif /* !my_gethostbyname_r */
|
||||||
|
@ -1,40 +0,0 @@
|
|||||||
/* Copyright (C) 2002 MySQL AB
|
|
||||||
|
|
||||||
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; version 2
|
|
||||||
of the License.
|
|
||||||
|
|
||||||
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 */
|
|
||||||
|
|
||||||
/*
|
|
||||||
Small functions to make code portable
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "mysys_priv.h"
|
|
||||||
|
|
||||||
#ifdef _AIX
|
|
||||||
|
|
||||||
/*
|
|
||||||
On AIX, at least with gcc 3.1, the expression
|
|
||||||
'(double) (ulonglong) var' doesn't always work for big unsigned
|
|
||||||
integers like '18446744073709551615'. The end result is that the
|
|
||||||
high bit is simply dropped. (probably bug in gcc optimizations)
|
|
||||||
Handling the conversion in a sub function seems to work.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
double my_ulonglong2double(unsigned long long nr)
|
|
||||||
{
|
|
||||||
return (double) nr;
|
|
||||||
}
|
|
||||||
#endif /* _AIX */
|
|
@ -13,6 +13,8 @@
|
|||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
||||||
|
|
||||||
|
#include "my_compare.h" /* for clr_rec_bits */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Because of the function new_field() all field classes that have static
|
Because of the function new_field() all field classes that have static
|
||||||
variables must declare the size_of() member function.
|
variables must declare the size_of() member function.
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
#pragma interface /* gcc class implementation */
|
#pragma interface /* gcc class implementation */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <my_handler.h>
|
|
||||||
#include <ft_global.h>
|
#include <ft_global.h>
|
||||||
#include <keycache.h>
|
#include <keycache.h>
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
/* Written by Sergei A. Golubchik, who has a shared copyright to this code */
|
/* Written by Sergei A. Golubchik, who has a shared copyright to this code */
|
||||||
|
|
||||||
#include "ftdefs.h"
|
#include "ftdefs.h"
|
||||||
#include "my_handler.h"
|
#include "my_compare.h"
|
||||||
|
|
||||||
typedef struct st_ft_stopwords
|
typedef struct st_ft_stopwords
|
||||||
{
|
{
|
||||||
|
@ -85,6 +85,7 @@ static SORT_KEY_BLOCKS *alloc_key_blocks(MI_CHECK *param, uint blocks,
|
|||||||
uint buffer_length);
|
uint buffer_length);
|
||||||
static ha_checksum mi_byte_checksum(const uchar *buf, uint length);
|
static ha_checksum mi_byte_checksum(const uchar *buf, uint length);
|
||||||
static void set_data_file_type(SORT_INFO *sort_info, MYISAM_SHARE *share);
|
static void set_data_file_type(SORT_INFO *sort_info, MYISAM_SHARE *share);
|
||||||
|
static HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, uchar *a);
|
||||||
|
|
||||||
void myisamchk_init(MI_CHECK *param)
|
void myisamchk_init(MI_CHECK *param)
|
||||||
{
|
{
|
||||||
@ -4739,3 +4740,89 @@ set_data_file_type(SORT_INFO *sort_info, MYISAM_SHARE *share)
|
|||||||
share->delete_record=tmp.delete_record;
|
share->delete_record=tmp.delete_record;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Find the first NULL value in index-suffix values tuple
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
ha_find_null()
|
||||||
|
keyseg Array of keyparts for key suffix
|
||||||
|
a Key suffix value tuple
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Find the first NULL value in index-suffix values tuple.
|
||||||
|
TODO Consider optimizing this fuction or its use so we don't search for
|
||||||
|
NULL values in completely NOT NULL index suffixes.
|
||||||
|
|
||||||
|
RETURN
|
||||||
|
First key part that has NULL as value in values tuple, or the last key part
|
||||||
|
(with keyseg->type==HA_TYPE_END) if values tuple doesn't contain NULLs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, uchar *a)
|
||||||
|
{
|
||||||
|
for (; (enum ha_base_keytype) keyseg->type != HA_KEYTYPE_END; keyseg++)
|
||||||
|
{
|
||||||
|
uchar *end;
|
||||||
|
if (keyseg->null_bit)
|
||||||
|
{
|
||||||
|
if (!*a++)
|
||||||
|
return keyseg;
|
||||||
|
}
|
||||||
|
end= a+ keyseg->length;
|
||||||
|
|
||||||
|
switch ((enum ha_base_keytype) keyseg->type) {
|
||||||
|
case HA_KEYTYPE_TEXT:
|
||||||
|
case HA_KEYTYPE_BINARY:
|
||||||
|
case HA_KEYTYPE_BIT:
|
||||||
|
if (keyseg->flag & HA_SPACE_PACK)
|
||||||
|
{
|
||||||
|
int a_length;
|
||||||
|
get_key_length(a_length, a);
|
||||||
|
a += a_length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
a= end;
|
||||||
|
break;
|
||||||
|
case HA_KEYTYPE_VARTEXT1:
|
||||||
|
case HA_KEYTYPE_VARTEXT2:
|
||||||
|
case HA_KEYTYPE_VARBINARY1:
|
||||||
|
case HA_KEYTYPE_VARBINARY2:
|
||||||
|
{
|
||||||
|
int a_length;
|
||||||
|
get_key_length(a_length, a);
|
||||||
|
a+= a_length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case HA_KEYTYPE_NUM:
|
||||||
|
if (keyseg->flag & HA_SPACE_PACK)
|
||||||
|
{
|
||||||
|
int alength= *a++;
|
||||||
|
end= a+alength;
|
||||||
|
}
|
||||||
|
a= end;
|
||||||
|
break;
|
||||||
|
case HA_KEYTYPE_INT8:
|
||||||
|
case HA_KEYTYPE_SHORT_INT:
|
||||||
|
case HA_KEYTYPE_USHORT_INT:
|
||||||
|
case HA_KEYTYPE_LONG_INT:
|
||||||
|
case HA_KEYTYPE_ULONG_INT:
|
||||||
|
case HA_KEYTYPE_INT24:
|
||||||
|
case HA_KEYTYPE_UINT24:
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
case HA_KEYTYPE_LONGLONG:
|
||||||
|
case HA_KEYTYPE_ULONGLONG:
|
||||||
|
#endif
|
||||||
|
case HA_KEYTYPE_FLOAT:
|
||||||
|
case HA_KEYTYPE_DOUBLE:
|
||||||
|
a= end;
|
||||||
|
break;
|
||||||
|
case HA_KEYTYPE_END: /* purecov: inspected */
|
||||||
|
/* keep compiler happy */
|
||||||
|
DBUG_ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return keyseg;
|
||||||
|
}
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
/* Testing of the basic functions of a MyISAM table */
|
/* Testing of the basic functions of a MyISAM table */
|
||||||
|
|
||||||
#include "myisam.h"
|
#include "myisam.h"
|
||||||
|
#include "myisamdef.h"
|
||||||
#include <my_getopt.h>
|
#include <my_getopt.h>
|
||||||
#include <m_string.h>
|
#include <m_string.h>
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include "fulltext.h"
|
#include "fulltext.h"
|
||||||
#include "rt_index.h"
|
#include "rt_index.h"
|
||||||
|
#include "my_compare.h"
|
||||||
|
|
||||||
#define MAX_POINTER_LENGTH 8
|
#define MAX_POINTER_LENGTH 8
|
||||||
|
|
||||||
|
@ -424,6 +424,8 @@ typedef struct st_mi_sort_param
|
|||||||
|
|
||||||
#define get_pack_length(length) ((length) >= 255 ? 3 : 1)
|
#define get_pack_length(length) ((length) >= 255 ? 3 : 1)
|
||||||
|
|
||||||
|
#define portable_sizeof_char_ptr 8
|
||||||
|
|
||||||
#define MI_MIN_BLOCK_LENGTH 20 /* Because of delete-link */
|
#define MI_MIN_BLOCK_LENGTH 20 /* Because of delete-link */
|
||||||
#define MI_EXTEND_BLOCK_LENGTH 20 /* Don't use to small record-blocks */
|
#define MI_EXTEND_BLOCK_LENGTH 20 /* Don't use to small record-blocks */
|
||||||
#define MI_SPLIT_LENGTH ((MI_EXTEND_BLOCK_LENGTH+4)*2)
|
#define MI_SPLIT_LENGTH ((MI_EXTEND_BLOCK_LENGTH+4)*2)
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
/* Written by Alex Barkov, who has a shared copyright to this code */
|
/* Written by Alex Barkov, who has a shared copyright to this code */
|
||||||
|
|
||||||
#include "myisam.h"
|
#include "myisam.h"
|
||||||
|
#include "myisamdef.h"
|
||||||
|
|
||||||
#ifdef HAVE_SPATIAL
|
#ifdef HAVE_SPATIAL
|
||||||
#include "sp_defs.h"
|
#include "sp_defs.h"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user