mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge
This commit is contained in:
@ -1851,7 +1851,8 @@ AC_CHECK_FUNCS(alarm bcmp bfill bmove bzero chsize cuserid fchmod fcntl \
|
|||||||
# isinf() could be a function or a macro (HPUX)
|
# isinf() could be a function or a macro (HPUX)
|
||||||
AC_MSG_CHECKING(for isinf with <math.h>)
|
AC_MSG_CHECKING(for isinf with <math.h>)
|
||||||
AC_TRY_LINK([#include <math.h>], [float f = 0.0; isinf(f)],
|
AC_TRY_LINK([#include <math.h>], [float f = 0.0; isinf(f)],
|
||||||
AC_MSG_RESULT(yes) AC_DEFINE(HAVE_ISINF,,[isinf() macro or function]),
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_ISINF,,[isinf() macro or function]),
|
||||||
AC_MSG_RESULT(no))
|
AC_MSG_RESULT(no))
|
||||||
|
|
||||||
CFLAGS="$ORG_CFLAGS"
|
CFLAGS="$ORG_CFLAGS"
|
||||||
@ -2228,7 +2229,6 @@ if expr "$SYSTEM_TYPE" : ".*netware.*" > /dev/null; then
|
|||||||
# For NetWare, do not need readline
|
# For NetWare, do not need readline
|
||||||
echo "Skipping readline"
|
echo "Skipping readline"
|
||||||
else
|
else
|
||||||
mkdir include/readline
|
|
||||||
|
|
||||||
if [test "$with_libedit" = "yes"] || [test "$with_libedit" = "undefined"] && [test "$with_readline" = "undefined"]
|
if [test "$with_libedit" = "yes"] || [test "$with_libedit" = "undefined"] && [test "$with_readline" = "undefined"]
|
||||||
then
|
then
|
||||||
@ -2236,7 +2236,7 @@ then
|
|||||||
readline_basedir="libedit"
|
readline_basedir="libedit"
|
||||||
readline_dir="$readline_topdir/$readline_basedir"
|
readline_dir="$readline_topdir/$readline_basedir"
|
||||||
readline_link="\$(top_builddir)/cmd-line-utils/libedit/liblibedit.a"
|
readline_link="\$(top_builddir)/cmd-line-utils/libedit/liblibedit.a"
|
||||||
readline_h_ln_cmd="\$(LN) \$(top_builddir)/cmd-line-utils/libedit/readline/*.h readline/"
|
readline_h_ln_cmd="\$(LN) -s \$(top_builddir)/cmd-line-utils/libedit/readline readline"
|
||||||
compile_libedit=yes
|
compile_libedit=yes
|
||||||
AC_DEFINE_UNQUOTED(USE_LIBEDIT_INTERFACE)
|
AC_DEFINE_UNQUOTED(USE_LIBEDIT_INTERFACE)
|
||||||
elif test "$with_readline" = "yes"
|
elif test "$with_readline" = "yes"
|
||||||
@ -2245,7 +2245,7 @@ then
|
|||||||
readline_basedir="readline"
|
readline_basedir="readline"
|
||||||
readline_dir="$readline_topdir/$readline_basedir"
|
readline_dir="$readline_topdir/$readline_basedir"
|
||||||
readline_link="\$(top_builddir)/cmd-line-utils/readline/libreadline.a"
|
readline_link="\$(top_builddir)/cmd-line-utils/readline/libreadline.a"
|
||||||
readline_h_ln_cmd="\$(LN) \$(top_builddir)/cmd-line-utils/readline/*.h readline/"
|
readline_h_ln_cmd="\$(LN) -s \$(top_builddir)/cmd-line-utils/readline readline"
|
||||||
compile_readline=yes
|
compile_readline=yes
|
||||||
AC_DEFINE_UNQUOTED(USE_NEW_READLINE_INTERFACE)
|
AC_DEFINE_UNQUOTED(USE_NEW_READLINE_INTERFACE)
|
||||||
else
|
else
|
||||||
@ -2759,6 +2759,7 @@ EOF
|
|||||||
no) flag="-R" ;;
|
no) flag="-R" ;;
|
||||||
*) flag="-D" ;;
|
*) flag="-D" ;;
|
||||||
esac
|
esac
|
||||||
|
flag="$flag --VERSION=$VERSION --PACKAGE=$PACKAGE"
|
||||||
(cd ndb && ./configure $flag) \
|
(cd ndb && ./configure $flag) \
|
||||||
|| AC_MSG_ERROR([could not configure NDB Cluster])
|
|| AC_MSG_ERROR([could not configure NDB Cluster])
|
||||||
echo "END OF NDB CLUSTER CONFIGURATION"
|
echo "END OF NDB CLUSTER CONFIGURATION"
|
||||||
|
@ -16,12 +16,11 @@
|
|||||||
|
|
||||||
#called from the top level Makefile
|
#called from the top level Makefile
|
||||||
|
|
||||||
|
|
||||||
MYSQLDATAdir = $(localstatedir)
|
MYSQLDATAdir = $(localstatedir)
|
||||||
MYSQLSHAREdir = $(pkgdatadir)
|
MYSQLSHAREdir = $(pkgdatadir)
|
||||||
MYSQLBASEdir= $(prefix)
|
MYSQLBASEdir= $(prefix)
|
||||||
INCLUDES = @MT_INCLUDES@ \
|
INCLUDES = @MT_INCLUDES@ \
|
||||||
@bdb_includes@ @innodb_includes@ \
|
@bdb_includes@ @innodb_includes@ @ndbcluster_includes@ \
|
||||||
-I$(top_srcdir)/include -I$(top_srcdir)/regex \
|
-I$(top_srcdir)/include -I$(top_srcdir)/regex \
|
||||||
-I$(srcdir) $(openssl_includes)
|
-I$(srcdir) $(openssl_includes)
|
||||||
WRAPLIBS= @WRAPLIBS@
|
WRAPLIBS= @WRAPLIBS@
|
||||||
@ -42,6 +41,7 @@ LDADD = @isam_libs@ \
|
|||||||
mysqld_LDADD = @MYSQLD_EXTRA_LDFLAGS@ \
|
mysqld_LDADD = @MYSQLD_EXTRA_LDFLAGS@ \
|
||||||
@bdb_libs@ @innodb_libs@ @pstack_libs@ \
|
@bdb_libs@ @innodb_libs@ @pstack_libs@ \
|
||||||
@innodb_system_libs@ \
|
@innodb_system_libs@ \
|
||||||
|
@ndbcluster_libs@ @ndbcluster_system_libs@ \
|
||||||
$(LDADD) $(CXXLDFLAGS) $(WRAPLIBS) @LIBDL@ @openssl_libs@
|
$(LDADD) $(CXXLDFLAGS) $(WRAPLIBS) @LIBDL@ @openssl_libs@
|
||||||
noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
|
noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
|
||||||
item_strfunc.h item_timefunc.h item_uniq.h \
|
item_strfunc.h item_timefunc.h item_uniq.h \
|
||||||
@ -52,7 +52,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
|
|||||||
field.h handler.h \
|
field.h handler.h \
|
||||||
ha_isammrg.h ha_isam.h ha_myisammrg.h\
|
ha_isammrg.h ha_isam.h ha_myisammrg.h\
|
||||||
ha_heap.h ha_myisam.h ha_berkeley.h ha_innodb.h \
|
ha_heap.h ha_myisam.h ha_berkeley.h ha_innodb.h \
|
||||||
opt_range.h protocol.h \
|
ha_ndbcluster.h opt_range.h protocol.h \
|
||||||
sql_select.h structs.h table.h sql_udf.h hash_filo.h\
|
sql_select.h structs.h table.h sql_udf.h hash_filo.h\
|
||||||
lex.h lex_symbol.h sql_acl.h sql_crypt.h \
|
lex.h lex_symbol.h sql_acl.h sql_crypt.h \
|
||||||
log_event.h sql_repl.h slave.h \
|
log_event.h sql_repl.h slave.h \
|
||||||
@ -76,11 +76,11 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc \
|
|||||||
procedure.cc item_uniq.cc sql_test.cc \
|
procedure.cc item_uniq.cc sql_test.cc \
|
||||||
log.cc log_event.cc init.cc derror.cc sql_acl.cc \
|
log.cc log_event.cc init.cc derror.cc sql_acl.cc \
|
||||||
unireg.cc des_key_file.cc \
|
unireg.cc des_key_file.cc \
|
||||||
time.cc opt_range.cc opt_sum.cc \
|
discover.cc time.cc opt_range.cc opt_sum.cc \
|
||||||
records.cc filesort.cc handler.cc \
|
records.cc filesort.cc handler.cc \
|
||||||
ha_heap.cc ha_myisam.cc ha_myisammrg.cc \
|
ha_heap.cc ha_myisam.cc ha_myisammrg.cc \
|
||||||
ha_berkeley.cc ha_innodb.cc \
|
ha_berkeley.cc ha_innodb.cc \
|
||||||
ha_isam.cc ha_isammrg.cc \
|
ha_isam.cc ha_isammrg.cc ha_ndbcluster.cc \
|
||||||
sql_db.cc sql_table.cc sql_rename.cc sql_crypt.cc \
|
sql_db.cc sql_table.cc sql_rename.cc sql_crypt.cc \
|
||||||
sql_load.cc mf_iocache.cc field_conv.cc sql_show.cc \
|
sql_load.cc mf_iocache.cc field_conv.cc sql_show.cc \
|
||||||
sql_udf.cc sql_analyse.cc sql_analyse.h sql_cache.cc \
|
sql_udf.cc sql_analyse.cc sql_analyse.h sql_cache.cc \
|
||||||
|
157
sql/handler.cc
157
sql/handler.cc
@ -43,6 +43,9 @@
|
|||||||
#else
|
#else
|
||||||
#define innobase_query_caching_of_table_permitted(X,Y,Z) 1
|
#define innobase_query_caching_of_table_permitted(X,Y,Z) 1
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_NDBCLUSTER_DB
|
||||||
|
#include "ha_ndbcluster.h"
|
||||||
|
#endif
|
||||||
#include <myisampack.h>
|
#include <myisampack.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
@ -54,7 +57,7 @@ ulong ha_read_count, ha_write_count, ha_delete_count, ha_update_count,
|
|||||||
ha_read_key_count, ha_read_next_count, ha_read_prev_count,
|
ha_read_key_count, ha_read_next_count, ha_read_prev_count,
|
||||||
ha_read_first_count, ha_read_last_count,
|
ha_read_first_count, ha_read_last_count,
|
||||||
ha_commit_count, ha_rollback_count,
|
ha_commit_count, ha_rollback_count,
|
||||||
ha_read_rnd_count, ha_read_rnd_next_count;
|
ha_read_rnd_count, ha_read_rnd_next_count, ha_discover_count;
|
||||||
|
|
||||||
static SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES;
|
static SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES;
|
||||||
|
|
||||||
@ -82,6 +85,10 @@ struct show_table_type_st sys_table_types[]=
|
|||||||
"Supports transactions and page-level locking", DB_TYPE_BERKELEY_DB},
|
"Supports transactions and page-level locking", DB_TYPE_BERKELEY_DB},
|
||||||
{"BERKELEYDB",&have_berkeley_db,
|
{"BERKELEYDB",&have_berkeley_db,
|
||||||
"Alias for BDB", DB_TYPE_BERKELEY_DB},
|
"Alias for BDB", DB_TYPE_BERKELEY_DB},
|
||||||
|
{"NDBCLUSTER", &have_ndbcluster,
|
||||||
|
"Clustered, fault tolerant memory based tables", DB_TYPE_NDBCLUSTER},
|
||||||
|
{"NDB", &have_ndbcluster,
|
||||||
|
"Alias for NDBCLUSTER", DB_TYPE_NDBCLUSTER},
|
||||||
{"EXAMPLE",&have_example_db,
|
{"EXAMPLE",&have_example_db,
|
||||||
"Example storage engine", DB_TYPE_EXAMPLE_DB},
|
"Example storage engine", DB_TYPE_EXAMPLE_DB},
|
||||||
{"ARCHIVE",&have_archive_db,
|
{"ARCHIVE",&have_archive_db,
|
||||||
@ -101,15 +108,16 @@ TYPELIB tx_isolation_typelib= {array_elements(tx_isolation_names)-1,"",
|
|||||||
|
|
||||||
enum db_type ha_resolve_by_name(const char *name, uint namelen)
|
enum db_type ha_resolve_by_name(const char *name, uint namelen)
|
||||||
{
|
{
|
||||||
if (!my_strcasecmp(&my_charset_latin1, name, "DEFAULT")) {
|
THD *thd=current_thd;
|
||||||
return(enum db_type) current_thd->variables.table_type;
|
if (thd && !my_strcasecmp(&my_charset_latin1, name, "DEFAULT")) {
|
||||||
|
return (enum db_type) thd->variables.table_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
show_table_type_st *types;
|
show_table_type_st *types;
|
||||||
for (types= sys_table_types; types->type; types++)
|
for (types= sys_table_types; types->type; types++)
|
||||||
{
|
{
|
||||||
if (!my_strcasecmp(&my_charset_latin1, name, types->type))
|
if (!my_strcasecmp(&my_charset_latin1, name, types->type))
|
||||||
return(enum db_type)types->db_type;
|
return (enum db_type) types->db_type;
|
||||||
}
|
}
|
||||||
return DB_TYPE_UNKNOWN;
|
return DB_TYPE_UNKNOWN;
|
||||||
}
|
}
|
||||||
@ -189,6 +197,10 @@ handler *get_new_handler(TABLE *table, enum db_type db_type)
|
|||||||
#ifdef HAVE_ARCHIVE_DB
|
#ifdef HAVE_ARCHIVE_DB
|
||||||
case DB_TYPE_ARCHIVE_DB:
|
case DB_TYPE_ARCHIVE_DB:
|
||||||
return new ha_archive(table);
|
return new ha_archive(table);
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NDBCLUSTER_DB
|
||||||
|
case DB_TYPE_NDBCLUSTER:
|
||||||
|
return new ha_ndbcluster(table);
|
||||||
#endif
|
#endif
|
||||||
case DB_TYPE_HEAP:
|
case DB_TYPE_HEAP:
|
||||||
return new ha_heap(table);
|
return new ha_heap(table);
|
||||||
@ -233,6 +245,18 @@ int ha_init()
|
|||||||
else
|
else
|
||||||
opt_using_transactions=1;
|
opt_using_transactions=1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NDBCLUSTER_DB
|
||||||
|
if (have_ndbcluster == SHOW_OPTION_YES)
|
||||||
|
{
|
||||||
|
if (ndbcluster_init())
|
||||||
|
{
|
||||||
|
have_ndbcluster= SHOW_OPTION_DISABLED;
|
||||||
|
error= 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
opt_using_transactions=1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@ -260,6 +284,10 @@ int ha_panic(enum ha_panic_function flag)
|
|||||||
#ifdef HAVE_INNOBASE_DB
|
#ifdef HAVE_INNOBASE_DB
|
||||||
if (have_innodb == SHOW_OPTION_YES)
|
if (have_innodb == SHOW_OPTION_YES)
|
||||||
error|=innobase_end();
|
error|=innobase_end();
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NDBCLUSTER_DB
|
||||||
|
if (have_ndbcluster == SHOW_OPTION_YES)
|
||||||
|
error|=ndbcluster_end();
|
||||||
#endif
|
#endif
|
||||||
return error;
|
return error;
|
||||||
} /* ha_panic */
|
} /* ha_panic */
|
||||||
@ -270,6 +298,10 @@ void ha_drop_database(char* path)
|
|||||||
if (have_innodb == SHOW_OPTION_YES)
|
if (have_innodb == SHOW_OPTION_YES)
|
||||||
innobase_drop_database(path);
|
innobase_drop_database(path);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_NDBCLUSTER_DB
|
||||||
|
if (have_ndbcluster == SHOW_OPTION_YES)
|
||||||
|
ndbcluster_drop_database(path);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ha_close_connection(THD* thd)
|
void ha_close_connection(THD* thd)
|
||||||
@ -278,6 +310,10 @@ void ha_close_connection(THD* thd)
|
|||||||
if (have_innodb == SHOW_OPTION_YES)
|
if (have_innodb == SHOW_OPTION_YES)
|
||||||
innobase_close_connection(thd);
|
innobase_close_connection(thd);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_NDBCLUSTER_DB
|
||||||
|
if (have_ndbcluster == SHOW_OPTION_YES)
|
||||||
|
ndbcluster_close_connection(thd);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -437,6 +473,19 @@ int ha_commit_trans(THD *thd, THD_TRANS* trans)
|
|||||||
WRITE_CACHE, (my_off_t) 0, 0, 1);
|
WRITE_CACHE, (my_off_t) 0, 0, 1);
|
||||||
thd->transaction.trans_log.end_of_file= max_binlog_cache_size;
|
thd->transaction.trans_log.end_of_file= max_binlog_cache_size;
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_NDBCLUSTER_DB
|
||||||
|
if (trans->ndb_tid)
|
||||||
|
{
|
||||||
|
if ((error=ndbcluster_commit(thd,trans->ndb_tid)))
|
||||||
|
{
|
||||||
|
my_error(ER_ERROR_DURING_COMMIT, MYF(0), error);
|
||||||
|
error=1;
|
||||||
|
}
|
||||||
|
if (trans == &thd->transaction.all)
|
||||||
|
operation_done= transaction_commited= 1;
|
||||||
|
trans->ndb_tid=0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#ifdef HAVE_BERKELEY_DB
|
#ifdef HAVE_BERKELEY_DB
|
||||||
if (trans->bdb_tid)
|
if (trans->bdb_tid)
|
||||||
{
|
{
|
||||||
@ -490,6 +539,18 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
|
|||||||
if (opt_using_transactions)
|
if (opt_using_transactions)
|
||||||
{
|
{
|
||||||
bool operation_done=0;
|
bool operation_done=0;
|
||||||
|
#ifdef HAVE_NDBCLUSTER_DB
|
||||||
|
if (trans->ndb_tid)
|
||||||
|
{
|
||||||
|
if ((error=ndbcluster_rollback(thd, trans->ndb_tid)))
|
||||||
|
{
|
||||||
|
my_error(ER_ERROR_DURING_ROLLBACK, MYF(0), error);
|
||||||
|
error=1;
|
||||||
|
}
|
||||||
|
trans->ndb_tid = 0;
|
||||||
|
operation_done=1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#ifdef HAVE_BERKELEY_DB
|
#ifdef HAVE_BERKELEY_DB
|
||||||
if (trans->bdb_tid)
|
if (trans->bdb_tid)
|
||||||
{
|
{
|
||||||
@ -1133,7 +1194,7 @@ int handler::index_next_same(byte *buf, const byte *key, uint keylen)
|
|||||||
int error;
|
int error;
|
||||||
if (!(error=index_next(buf)))
|
if (!(error=index_next(buf)))
|
||||||
{
|
{
|
||||||
if (key_cmp(table, key, active_index, keylen))
|
if (key_cmp_if_same(table, key, active_index, keylen))
|
||||||
{
|
{
|
||||||
table->status=STATUS_NOT_FOUND;
|
table->status=STATUS_NOT_FOUND;
|
||||||
error=HA_ERR_END_OF_FILE;
|
error=HA_ERR_END_OF_FILE;
|
||||||
@ -1169,8 +1230,10 @@ bool handler::caching_allowed(THD* thd, char* table_key,
|
|||||||
** Some general functions that isn't in the handler class
|
** Some general functions that isn't in the handler class
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* Initiates table-file and calls apropriate database-creator */
|
/*
|
||||||
/* Returns 1 if something got wrong */
|
Initiates table-file and calls apropriate database-creator
|
||||||
|
Returns 1 if something got wrong
|
||||||
|
*/
|
||||||
|
|
||||||
int ha_create_table(const char *name, HA_CREATE_INFO *create_info,
|
int ha_create_table(const char *name, HA_CREATE_INFO *create_info,
|
||||||
bool update_create_info)
|
bool update_create_info)
|
||||||
@ -1186,7 +1249,7 @@ int ha_create_table(const char *name, HA_CREATE_INFO *create_info,
|
|||||||
{
|
{
|
||||||
update_create_info_from_table(create_info, &table);
|
update_create_info_from_table(create_info, &table);
|
||||||
if (table.file->table_flags() & HA_DROP_BEFORE_CREATE)
|
if (table.file->table_flags() & HA_DROP_BEFORE_CREATE)
|
||||||
table.file->delete_table(name); // Needed for BDB tables
|
table.file->delete_table(name);
|
||||||
}
|
}
|
||||||
if (lower_case_table_names == 2 &&
|
if (lower_case_table_names == 2 &&
|
||||||
!(table.file->table_flags() & HA_FILE_BASED))
|
!(table.file->table_flags() & HA_FILE_BASED))
|
||||||
@ -1307,6 +1370,26 @@ int ha_change_key_cache(KEY_CACHE *old_key_cache,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Try to discover one table from handler(s)
|
||||||
|
*/
|
||||||
|
|
||||||
|
int ha_discover(const char* dbname, const char* name,
|
||||||
|
const void** frmblob, uint* frmlen)
|
||||||
|
{
|
||||||
|
int error= 1; // Table does not exist in any handler
|
||||||
|
DBUG_ENTER("ha_discover");
|
||||||
|
DBUG_PRINT("enter", ("db: %s, name: %s", dbname, name));
|
||||||
|
#ifdef HAVE_NDBCLUSTER_DB
|
||||||
|
if (have_ndbcluster == SHOW_OPTION_YES)
|
||||||
|
error= ndbcluster_discover(dbname, name, frmblob, frmlen);
|
||||||
|
#endif
|
||||||
|
if (!error)
|
||||||
|
statistic_increment(ha_discover_count,&LOCK_status);
|
||||||
|
DBUG_RETURN(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Read first row between two ranges.
|
Read first row between two ranges.
|
||||||
Store ranges for future calls to read_range_next
|
Store ranges for future calls to read_range_next
|
||||||
@ -1315,6 +1398,7 @@ int ha_change_key_cache(KEY_CACHE *old_key_cache,
|
|||||||
read_range_first()
|
read_range_first()
|
||||||
start_key Start key. Is 0 if no min range
|
start_key Start key. Is 0 if no min range
|
||||||
end_key End key. Is 0 if no max range
|
end_key End key. Is 0 if no max range
|
||||||
|
eq_range_arg Set to 1 if start_key == end_key
|
||||||
sorted Set to 1 if result should be sorted per key
|
sorted Set to 1 if result should be sorted per key
|
||||||
|
|
||||||
NOTES
|
NOTES
|
||||||
@ -1328,11 +1412,12 @@ int ha_change_key_cache(KEY_CACHE *old_key_cache,
|
|||||||
|
|
||||||
int handler::read_range_first(const key_range *start_key,
|
int handler::read_range_first(const key_range *start_key,
|
||||||
const key_range *end_key,
|
const key_range *end_key,
|
||||||
bool sorted)
|
bool eq_range_arg, bool sorted)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
DBUG_ENTER("handler::read_range_first");
|
DBUG_ENTER("handler::read_range_first");
|
||||||
|
|
||||||
|
eq_range= eq_range_arg;
|
||||||
end_range= 0;
|
end_range= 0;
|
||||||
if (end_key)
|
if (end_key)
|
||||||
{
|
{
|
||||||
@ -1343,7 +1428,6 @@ int handler::read_range_first(const key_range *start_key,
|
|||||||
}
|
}
|
||||||
range_key_part= table->key_info[active_index].key_part;
|
range_key_part= table->key_info[active_index].key_part;
|
||||||
|
|
||||||
|
|
||||||
if (!start_key) // Read first record
|
if (!start_key) // Read first record
|
||||||
result= index_first(table->record[0]);
|
result= index_first(table->record[0]);
|
||||||
else
|
else
|
||||||
@ -1365,7 +1449,6 @@ int handler::read_range_first(const key_range *start_key,
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
read_range_next()
|
read_range_next()
|
||||||
eq_range Set to 1 if start_key == end_key
|
|
||||||
|
|
||||||
NOTES
|
NOTES
|
||||||
Record is read into table->record[0]
|
Record is read into table->record[0]
|
||||||
@ -1376,16 +1459,18 @@ int handler::read_range_first(const key_range *start_key,
|
|||||||
# Error code
|
# Error code
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int handler::read_range_next(bool eq_range)
|
int handler::read_range_next()
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
DBUG_ENTER("handler::read_range_next");
|
DBUG_ENTER("handler::read_range_next");
|
||||||
|
|
||||||
if (eq_range)
|
if (eq_range)
|
||||||
result= index_next_same(table->record[0],
|
{
|
||||||
|
/* We trust that index_next_same always gives a row in range */
|
||||||
|
DBUG_RETURN(index_next_same(table->record[0],
|
||||||
end_range->key,
|
end_range->key,
|
||||||
end_range->length);
|
end_range->length));
|
||||||
else
|
}
|
||||||
result= index_next(table->record[0]);
|
result= index_next(table->record[0]);
|
||||||
if (result)
|
if (result)
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
@ -1394,16 +1479,18 @@ int handler::read_range_next(bool eq_range)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compare if found key is over max-value
|
Compare if found key (in row) is over max-value
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
compare_key
|
compare_key
|
||||||
range key to compare to row
|
range range to compare to row. May be 0 for no range
|
||||||
|
|
||||||
NOTES
|
NOTES
|
||||||
For this to work, the row must be stored in table->record[0]
|
See key.cc::key_cmp() for details
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
The return value is SIGN(key_in_row - range_key):
|
||||||
|
|
||||||
0 Key is equal to range or 'range' == 0 (no range)
|
0 Key is equal to range or 'range' == 0 (no range)
|
||||||
-1 Key is less than range
|
-1 Key is less than range
|
||||||
1 Key is larger than range
|
1 Key is larger than range
|
||||||
@ -1411,35 +1498,11 @@ int handler::read_range_next(bool eq_range)
|
|||||||
|
|
||||||
int handler::compare_key(key_range *range)
|
int handler::compare_key(key_range *range)
|
||||||
{
|
{
|
||||||
KEY_PART_INFO *key_part= range_key_part;
|
int cmp;
|
||||||
uint store_length;
|
|
||||||
|
|
||||||
if (!range)
|
if (!range)
|
||||||
return 0; // No max range
|
return 0; // No max range
|
||||||
|
cmp= key_cmp(range_key_part, range->key, range->length);
|
||||||
for (const char *key=range->key, *end=key+range->length;
|
if (!cmp)
|
||||||
key < end;
|
cmp= key_compare_result_on_equal;
|
||||||
key+= store_length, key_part++)
|
return cmp;
|
||||||
{
|
|
||||||
int cmp;
|
|
||||||
store_length= key_part->store_length;
|
|
||||||
if (key_part->null_bit)
|
|
||||||
{
|
|
||||||
if (*key)
|
|
||||||
{
|
|
||||||
if (!key_part->field->is_null())
|
|
||||||
return 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (key_part->field->is_null())
|
|
||||||
return 0;
|
|
||||||
key++; // Skip null byte
|
|
||||||
store_length--;
|
|
||||||
}
|
|
||||||
if ((cmp=key_part->field->key_cmp((byte*) key, key_part->length)) < 0)
|
|
||||||
return -1;
|
|
||||||
if (cmp > 0)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return key_compare_result_on_equal;
|
|
||||||
}
|
}
|
||||||
|
@ -754,11 +754,12 @@ void mysql_print_status(THD *thd);
|
|||||||
int find_ref_key(TABLE *form,Field *field, uint *offset);
|
int find_ref_key(TABLE *form,Field *field, uint *offset);
|
||||||
void key_copy(byte *key,TABLE *form,uint index,uint key_length);
|
void key_copy(byte *key,TABLE *form,uint index,uint key_length);
|
||||||
void key_restore(TABLE *form,byte *key,uint index,uint key_length);
|
void key_restore(TABLE *form,byte *key,uint index,uint key_length);
|
||||||
int key_cmp(TABLE *form,const byte *key,uint index,uint key_length);
|
bool key_cmp_if_same(TABLE *form,const byte *key,uint index,uint key_length);
|
||||||
void key_unpack(String *to,TABLE *form,uint index);
|
void key_unpack(String *to,TABLE *form,uint index);
|
||||||
bool check_if_key_used(TABLE *table, uint idx, List<Item> &fields);
|
bool check_if_key_used(TABLE *table, uint idx, List<Item> &fields);
|
||||||
bool init_errmessage(void);
|
int key_cmp(KEY_PART_INFO *key_part, const byte *key, uint key_length);
|
||||||
|
|
||||||
|
bool init_errmessage(void);
|
||||||
void sql_perror(const char *message);
|
void sql_perror(const char *message);
|
||||||
void sql_print_error(const char *format,...)
|
void sql_print_error(const char *format,...)
|
||||||
__attribute__ ((format (printf, 1, 2)));
|
__attribute__ ((format (printf, 1, 2)));
|
||||||
@ -837,7 +838,7 @@ extern ulong server_id, concurrency;
|
|||||||
extern ulong ha_read_count, ha_write_count, ha_delete_count, ha_update_count;
|
extern ulong ha_read_count, ha_write_count, ha_delete_count, ha_update_count;
|
||||||
extern ulong ha_read_key_count, ha_read_next_count, ha_read_prev_count;
|
extern ulong ha_read_key_count, ha_read_next_count, ha_read_prev_count;
|
||||||
extern ulong ha_read_first_count, ha_read_last_count;
|
extern ulong ha_read_first_count, ha_read_last_count;
|
||||||
extern ulong ha_read_rnd_count, ha_read_rnd_next_count;
|
extern ulong ha_read_rnd_count, ha_read_rnd_next_count, ha_discover_count;
|
||||||
extern ulong ha_commit_count, ha_rollback_count,table_cache_size;
|
extern ulong ha_commit_count, ha_rollback_count,table_cache_size;
|
||||||
extern ulong max_connections,max_connect_errors, connect_timeout;
|
extern ulong max_connections,max_connect_errors, connect_timeout;
|
||||||
extern ulong slave_net_timeout;
|
extern ulong slave_net_timeout;
|
||||||
@ -891,6 +892,7 @@ extern SHOW_VAR init_vars[],status_vars[], internal_vars[];
|
|||||||
extern SHOW_COMP_OPTION have_isam;
|
extern SHOW_COMP_OPTION have_isam;
|
||||||
extern SHOW_COMP_OPTION have_innodb;
|
extern SHOW_COMP_OPTION have_innodb;
|
||||||
extern SHOW_COMP_OPTION have_berkeley_db;
|
extern SHOW_COMP_OPTION have_berkeley_db;
|
||||||
|
extern SHOW_COMP_OPTION have_ndbcluster;
|
||||||
extern struct system_variables global_system_variables;
|
extern struct system_variables global_system_variables;
|
||||||
extern struct system_variables max_system_variables;
|
extern struct system_variables max_system_variables;
|
||||||
extern struct rand_struct sql_rand;
|
extern struct rand_struct sql_rand;
|
||||||
@ -961,6 +963,10 @@ int format_number(uint inputflag,uint max_length,my_string pos,uint length,
|
|||||||
my_string *errpos);
|
my_string *errpos);
|
||||||
int openfrm(const char *name,const char *alias,uint filestat,uint prgflag,
|
int openfrm(const char *name,const char *alias,uint filestat,uint prgflag,
|
||||||
uint ha_open_flags, TABLE *outparam);
|
uint ha_open_flags, TABLE *outparam);
|
||||||
|
int readfrm(const char *name, const void** data, uint* length);
|
||||||
|
int writefrm(const char* name, const void* data, uint len);
|
||||||
|
int create_table_from_handler(const char *db, const char *name,
|
||||||
|
bool create_if_found);
|
||||||
int closefrm(TABLE *table);
|
int closefrm(TABLE *table);
|
||||||
db_type get_table_type(const char *name);
|
db_type get_table_type(const char *name);
|
||||||
int read_string(File file, gptr *to, uint length);
|
int read_string(File file, gptr *to, uint length);
|
||||||
@ -1038,8 +1044,7 @@ void reset_host_errors(struct in_addr *in);
|
|||||||
bool hostname_cache_init();
|
bool hostname_cache_init();
|
||||||
void hostname_cache_free();
|
void hostname_cache_free();
|
||||||
void hostname_cache_refresh(void);
|
void hostname_cache_refresh(void);
|
||||||
bool get_interval_info(const char *str,uint length,uint count,
|
|
||||||
long *values);
|
|
||||||
/* sql_cache.cc */
|
/* sql_cache.cc */
|
||||||
extern bool sql_cache_init();
|
extern bool sql_cache_init();
|
||||||
extern void sql_cache_free();
|
extern void sql_cache_free();
|
||||||
|
Reference in New Issue
Block a user