diff options
author | serg@serg.mysql.com <> | 2001-12-21 13:38:06 +0000 |
---|---|---|
committer | serg@serg.mysql.com <> | 2001-12-21 13:38:06 +0000 |
commit | ed74119ee241d12df66e194388990cff12a88a29 (patch) | |
tree | 63735ff406ff689f8b26f451a48d7b2080f7ab7f | |
parent | 778058123b797486993eeea09a185b1cef4a75ba (diff) | |
parent | b83bf332d0fb7b41ad14d346ea3269f868983b6f (diff) | |
download | mariadb-git-ed74119ee241d12df66e194388990cff12a88a29.tar.gz |
Merge
-rw-r--r-- | .bzrignore | 5 | ||||
-rw-r--r-- | Docs/manual.texi | 37 | ||||
-rw-r--r-- | client/mysqldump.c | 100 | ||||
-rw-r--r-- | scripts/Makefile.am | 3 | ||||
-rw-r--r-- | scripts/mysql_fix_extensions.sh | 16 | ||||
-rw-r--r-- | sql/ha_berkeley.h | 2 | ||||
-rw-r--r-- | sql/ha_heap.h | 2 | ||||
-rw-r--r-- | sql/ha_innobase.h | 2 | ||||
-rw-r--r-- | sql/ha_isam.h | 2 | ||||
-rw-r--r-- | sql/ha_isammrg.h | 2 | ||||
-rw-r--r-- | sql/ha_myisam.h | 5 | ||||
-rw-r--r-- | sql/ha_myisammrg.h | 2 | ||||
-rw-r--r-- | sql/handler.h | 3 | ||||
-rw-r--r-- | sql/sql_handler.cc | 21 | ||||
-rw-r--r-- | sql/sql_table.cc | 2 |
15 files changed, 131 insertions, 73 deletions
diff --git a/.bzrignore b/.bzrignore index 299d079ef93..b3c77022ecc 100644 --- a/.bzrignore +++ b/.bzrignore @@ -287,6 +287,7 @@ libmysqld/sql_command libmysqld/sql_crypt.cc libmysqld/sql_db.cc libmysqld/sql_delete.cc +libmysqld/sql_do.cc libmysqld/sql_handler.cc libmysqld/sql_insert.cc libmysqld/sql_lex.cc @@ -367,6 +368,7 @@ scripts/mysql_config scripts/mysql_convert_table_format scripts/mysql_explain_log scripts/mysql_find_rows +scripts/mysql_fix_extensions scripts/mysql_fix_privilege_tables scripts/mysql_install_db scripts/mysql_setpermission @@ -398,6 +400,7 @@ sql-bench/test-connect sql-bench/test-create sql-bench/test-insert sql-bench/test-select +sql-bench/test-transactions sql-bench/test-wisconsin sql/.gdbinit sql/gen_lex_hash @@ -445,5 +448,3 @@ vio/test-ssl vio/test-sslclient vio/test-sslserver vio/viotest-ssl -sql-bench/test-transactions -libmysqld/sql_do.cc diff --git a/Docs/manual.texi b/Docs/manual.texi index 80eed993837..d623e2988af 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -8050,6 +8050,10 @@ version 4.0; @itemize @bullet @item +To use @code{MATCH ... AGAINST (... IN BOOLEAN MODE)} with your tables, +you need to rebuild them with @code{ALTER TABLE table_name TYPE=MyISAM}, +@strong{even} if they are of @code{MyISAM} type. +@item @code{LOCATE()} and @code{INSTR()} are case sensitive if neither argument is a binary string. @item @@ -22090,8 +22094,12 @@ is @code{localhost}. Lock all tables before starting the dump. The tables are locked with @code{READ LOCAL} to allow concurrent inserts in the case of @code{MyISAM} tables. +@item -K, --no-disable-keys. +@code{/*!40000 ALTER TABLE tb_name DISABLE KEYS */;} and +@code{/*!40000 ALTER TABLE tb_name ENABLE KEYS */;} +will not be put in the output. @item -n, --no-create-db -'CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name;' will not be put in the +@code{CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name;} will not be put in the output. The above line will be added otherwise, if --databases or --all-databases option was given. @item -t, --no-create-info @@ -22140,6 +22148,10 @@ Verbose mode. Print out more information on what the program does. Print version information and exit. @item -w, --where='where-condition' Dump only selected records. Note that quotes are mandatory: +@item -X, --xml +Dumps a database as well formed XML +@item -x, --first-slave +Locks all tables across all databases. @example "--where=user='jimf'" "-wuserid>1" "-wuserid<1" @@ -34567,15 +34579,6 @@ options, MySQL simply renames the files that correspond to the table @xref{RENAME TABLE,, @code{RENAME TABLE}}. @item -Since @strong{MySQL 4.0} the above feature can be activated explicitly. -@code{ALTER TABLE ... DISABLE KEYS} makes MySQL to stop updating -non-unique indexes for @code{MyISAM} table. -@code{ALTER TABLE ... ENABLE KEYS} then should be used to recreate missing -indexes. As MySQL does it with special algorithm which is much -faster then inserting keys one by one, disabling keys could give a -considerable speedup on bulk inserts. - -@item @code{create_definition} clauses use the same syntax for @code{ADD} and @code{CHANGE} as for @code{CREATE TABLE}. Note that this syntax includes the column name, not just the column type. @@ -34675,6 +34678,15 @@ indexes are created in a separate batch (like in @code{REPAIR}). This should make @code{ALTER TABLE} much faster when you have many indexes. @item +Since @strong{MySQL 4.0} the above feature can be activated explicitly. +@code{ALTER TABLE ... DISABLE KEYS} makes MySQL to stop updating +non-unique indexes for @code{MyISAM} table. +@code{ALTER TABLE ... ENABLE KEYS} then should be used to recreate missing +indexes. As MySQL does it with special algorithm which is much +faster then inserting keys one by one, disabling keys could give a +considerable speedup on bulk inserts. + +@item @findex mysql_info() With the C API function @code{mysql_info()}, you can find out how many records were copied, and (when @code{IGNORE} is used) how many records were @@ -47828,6 +47840,11 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item +@code{mysqldump} now puts @code{ALTER TABLE table_name DISABLE KEYS} and +@code{ALTER TABLE table_name DISABLE KEYS} in the sql dump. +@item +Added @code{mysql_fix_extensions} script +@item Fixed stack overrun problem @code{LOAD DATA FROM MASTER} on OSF1. @item Fixed shutdown problem on HPUX. diff --git a/client/mysqldump.c b/client/mysqldump.c index 229a4e79748..083f7a02d6f 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -72,8 +72,8 @@ static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick=0, extended_insert = 0, lock_tables=0,ignore_errors=0,flush_logs=0,replace=0, ignore=0,opt_drop=0,opt_keywords=0,opt_lock=0,opt_compress=0, opt_delayed=0,create_options=0,opt_quoted=0,opt_databases=0, - opt_alldbs=0,opt_create_db=0,opt_first_slave=0, - opt_autocommit=0, opt_master_data, opt_xml=0; + opt_alldbs=0,opt_create_db=0,opt_first_slave=0, + opt_autocommit=0,opt_master_data,opt_disable_keys=0,opt_xml=0; static MYSQL mysql_connection,*sock=0; static char insert_pat[12 * 1024],*opt_password=0,*current_user=0, *current_host=0,*path=0,*fields_terminated=0, @@ -90,55 +90,56 @@ FILE *md_result_file; static struct option long_options[] = { {"all-databases", no_argument, 0, 'A'}, - {"all", no_argument, 0, 'a'}, - {"add-drop-table", no_argument, 0, OPT_DROP}, - {"add-locks", no_argument, 0, OPT_LOCKS}, - {"allow-keywords", no_argument, 0, OPT_KEYWORDS}, + {"all", no_argument, 0, 'a'}, + {"add-drop-table", no_argument, 0, OPT_DROP}, + {"add-locks", no_argument, 0, OPT_LOCKS}, + {"allow-keywords", no_argument, 0, OPT_KEYWORDS}, {"character-sets-dir",required_argument,0, OPT_CHARSETS_DIR}, - {"complete-insert", no_argument, 0, 'c'}, - {"compress", no_argument, 0, 'C'}, + {"complete-insert", no_argument, 0, 'c'}, + {"compress", no_argument, 0, 'C'}, {"databases", no_argument, 0, 'B'}, - {"debug", optional_argument, 0, '#'}, + {"debug", optional_argument, 0, '#'}, {"default-character-set", required_argument, 0, OPT_DEFAULT_CHARSET}, - {"delayed-insert", no_argument, 0, OPT_DELAYED}, - {"extended-insert", no_argument, 0, 'e'}, + {"delayed-insert", no_argument, 0, OPT_DELAYED}, + {"extended-insert", no_argument, 0, 'e'}, {"fields-terminated-by", required_argument, 0, (int) OPT_FTB}, {"fields-enclosed-by", required_argument, 0, (int) OPT_ENC}, {"fields-optionally-enclosed-by", required_argument, 0, (int) OPT_O_ENC}, {"fields-escaped-by", required_argument, 0, (int) OPT_ESC}, {"first-slave", no_argument, 0, 'x'}, {"flush-logs", no_argument, 0, 'F'}, - {"force", no_argument, 0, 'f'}, - {"help", no_argument, 0, '?'}, - {"host", required_argument, 0, 'h'}, + {"force", no_argument, 0, 'f'}, + {"help", no_argument, 0, '?'}, + {"host", required_argument, 0, 'h'}, {"lines-terminated-by", required_argument, 0, (int) OPT_LTB}, - {"lock-tables", no_argument, 0, 'l'}, - {"master-data", no_argument, 0, OPT_MASTER_DATA}, + {"lock-tables", no_argument, 0, 'l'}, + {"master-data", no_argument, 0, OPT_MASTER_DATA}, {"no-autocommit", no_argument, 0, OPT_AUTOCOMMIT}, {"no-create-db", no_argument, 0, 'n'}, - {"no-create-info", no_argument, 0, 't'}, - {"no-data", no_argument, 0, 'd'}, - {"opt", no_argument, 0, OPT_OPTIMIZE}, - {"password", optional_argument, 0, 'p'}, + {"no-create-info", no_argument, 0, 't'}, + {"no-data", no_argument, 0, 'd'}, + {"no-disable-keys", no_argument, 0, 'K'}, + {"opt", no_argument, 0, OPT_OPTIMIZE}, + {"password", optional_argument, 0, 'p'}, #ifdef __WIN__ - {"pipe", no_argument, 0, 'W'}, + {"pipe", no_argument, 0, 'W'}, #endif - {"port", required_argument, 0, 'P'}, - {"quick", no_argument, 0, 'q'}, + {"port", required_argument, 0, 'P'}, + {"quick", no_argument, 0, 'q'}, {"quote-names", no_argument, 0, 'Q'}, {"result-file", required_argument, 0, 'r'}, {"set-variable", required_argument, 0, 'O'}, - {"socket", required_argument, 0, 'S'}, + {"socket", required_argument, 0, 'S'}, #include "sslopt-longopts.h" - {"tab", required_argument, 0, 'T'}, + {"tab", required_argument, 0, 'T'}, {"tables", no_argument, 0, OPT_TABLES}, #ifndef DONT_ALLOW_USER_CHANGE - {"user", required_argument, 0, 'u'}, + {"user", required_argument, 0, 'u'}, #endif - {"verbose", no_argument, 0, 'v'}, - {"version", no_argument, 0, 'V'}, - {"where", required_argument, 0, 'w'}, - {"xml", no_argument, 0, 'X'}, + {"verbose", no_argument, 0, 'v'}, + {"version", no_argument, 0, 'V'}, + {"where", required_argument, 0, 'w'}, + {"xml", no_argument, 0, 'X'}, {0, 0, 0, 0} }; @@ -214,6 +215,9 @@ static void usage(void) puts("\ -l, --lock-tables Lock all tables for read.\n\ --no-autocommit Wrap tables with autocommit/commit statements.\n\ + -K, --no-disable-keys '/*!40000 ALTER TABLE tb_name DISABLE KEYS */;\n\ + and '/*!40000 ALTER TABLE tb_name ENABLE KEYS */;\n\ + will not be put in the output.\n\ -n, --no-create-db 'CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name;'\n\ will not be put in the output. The above line will\n\ be added otherwise, if --databases or\n\ @@ -227,7 +231,7 @@ puts("\ -p, --password[=...] Password to use when connecting to server.\n\ If password is not given it's solicited on the tty.\n"); #ifdef __WIN__ - puts("-W, --pipe Use named pipes to connect to server"); + puts("-W, --pipe Use named pipes to connect to server"); #endif printf("\ -P, --port=... Port number to use for connection.\n\ @@ -305,7 +309,7 @@ static int get_options(int *argc,char ***argv) load_defaults("my",load_default_groups,argc,argv); set_all_changeable_vars(md_changeable_vars); while ((c=getopt_long(*argc,*argv, - "#::p::h:u:O:P:r:S:T:EBaAcCdefFlnqtvVw:?IxX", + "#::p::h:u:O:P:r:S:T:EBaAcCdefFKlnqtvVw:?IxX", long_options, &option_index)) != EOF) { switch(c) { @@ -341,6 +345,9 @@ static int get_options(int *argc,char ***argv) my_free(current_host,MYF(MY_ALLOW_ZERO_PTR)); current_host=my_strdup(optarg,MYF(MY_WME)); break; + case 'K': + opt_disable_keys=1; + break; case 'n': opt_create_db = 1; break; @@ -408,7 +415,7 @@ static int get_options(int *argc,char ***argv) case 'w': where=optarg; break; - case 'X': opt_xml = 1; break; + case 'X': opt_xml = 1; opt_disable_keys=1; break; case 'x': opt_first_slave=1; break; @@ -618,9 +625,9 @@ static uint getTableStructure(char *table, char* db) MYSQL_ROW row; my_bool init=0; uint numFields; - char *strpos, *table_name; + char *strpos, *table_name; const char *delayed; - char name_buff[NAME_LEN+3],table_buff[NAME_LEN+3]; + char name_buff[NAME_LEN+3],table_buff[NAME_LEN+3]; FILE *sql_file = md_result_file; DBUG_ENTER("getTableStructure"); @@ -643,7 +650,7 @@ static uint getTableStructure(char *table, char* db) if (mysql_query(sock, buff)) { fprintf(stderr, "%s: Can't get CREATE TABLE for table '%s' (%s)\n", - my_progname, table, mysql_error(sock)); + my_progname, table, mysql_error(sock)); safe_exit(EX_MYSQLERR); DBUG_RETURN(0); } @@ -653,7 +660,7 @@ static uint getTableStructure(char *table, char* db) char filename[FN_REFLEN], tmp_path[FN_REFLEN]; convert_dirname(tmp_path,path,NullS); sql_file= my_fopen(fn_format(filename, table, tmp_path, ".sql", 4), - O_WRONLY, MYF(MY_WME)); + O_WRONLY, MYF(MY_WME)); if (!sql_file) /* If file couldn't be opened */ { safe_exit(EX_MYSQLERR); @@ -677,7 +684,7 @@ static uint getTableStructure(char *table, char* db) if (mysql_query(sock,insert_pat) || !(tableRes=mysql_store_result(sock))) { fprintf(stderr, "%s: Can't get info about table: '%s'\nerror: %s\n", - my_progname, table, mysql_error(sock)); + my_progname, table, mysql_error(sock)); safe_exit(EX_MYSQLERR); DBUG_RETURN(0); } @@ -883,6 +890,8 @@ static uint getTableStructure(char *table, char* db) fputs(";\n", sql_file); } } + if (!opt_disable_keys) + fprintf(sql_file,"\n/*!40000 ALTER TABLE %s DISABLE KEYS */;\n",table_name); if (cFlag) { strpos=strmov(strpos,") VALUES "); @@ -982,7 +991,7 @@ static void dumpTable(uint numFields, char *table) end= add_load_option(end, lines_terminated, " LINES TERMINATED BY"); *end= '\0'; - sprintf(buff," FROM %s",table); + sprintf(buff," FROM %s",quote_name(table,table_buff)); end= strmov(end,buff); if (where) end= strxmov(end, " WHERE ",where,NullS); @@ -1113,7 +1122,7 @@ static void dumpTable(uint numFields, char *table) if (row[i]) { if (!IS_NUM_FIELD(field)) - { + { if (opt_xml) print_quoted_xml(md_result_file, field->name, row[i], lengths[i]); @@ -1173,7 +1182,7 @@ static void dumpTable(uint numFields, char *table) //XML - close table tag and supress regular output if (opt_xml) - fprintf(md_result_file, "\t</%s>\n", table); + fprintf(md_result_file, "\t</%s>\n", table); else if (extended_insert && row_break) fputs(";\n", md_result_file); /* If not empty table */ fflush(md_result_file); @@ -1189,6 +1198,9 @@ static void dumpTable(uint numFields, char *table) safe_exit(EX_CONSCHECK); return; } + if (!opt_disable_keys) + fprintf(md_result_file,"\n/*!40000 ALTER TABLE %s ENABLE KEYS */;\n", + quote_name(table,table_buff)); if (opt_lock) fputs("UNLOCK TABLES;\n", md_result_file); if (opt_autocommit) @@ -1270,7 +1282,7 @@ static int dump_databases(char **db_names) { int result=0; for ( ; *db_names ; db_names++) - { + { //XML edit - add database element if (opt_xml) fprintf(md_result_file, "<%s>\n", *db_names); @@ -1466,8 +1478,8 @@ int main(int argc, char **argv) { my_printf_error(0, "Error: Couldn't execute 'SHOW MASTER STATUS': %s", MYF(0), mysql_error(sock)); - } - else + } + else { row = mysql_fetch_row(master); if(row[0] && row[1]) { diff --git a/scripts/Makefile.am b/scripts/Makefile.am index c83a7e2315f..7ac554cda1d 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -20,6 +20,7 @@ bin_SCRIPTS = @server_scripts@ \ msql2mysql \ mysql_config \ mysql_fix_privilege_tables \ + mysql_fix_extensions \ mysql_setpermission \ mysql_zap \ mysqlaccess \ @@ -35,6 +36,7 @@ EXTRA_SCRIPTS = make_binary_distribution.sh \ msql2mysql.sh \ mysql_config.sh \ mysql_fix_privilege_tables.sh \ + mysql_fix_extensions.sh \ mysql_install_db.sh \ mysql_setpermission.sh \ mysql_zap.sh \ @@ -61,6 +63,7 @@ CLEANFILES = @server_scripts@ \ msql2mysql \ mysql_config \ mysql_fix_privilege_tables \ + mysql_fix_extensions \ mysql_setpermission \ mysql_zap \ mysqlaccess \ diff --git a/scripts/mysql_fix_extensions.sh b/scripts/mysql_fix_extensions.sh new file mode 100644 index 00000000000..92aefda3f77 --- /dev/null +++ b/scripts/mysql_fix_extensions.sh @@ -0,0 +1,16 @@ +#!@PERL@ +# This is a utility for MySQL. It is not needed by any standard part +# of MySQL. + +# Usage: mysql_fix_extentions datadir +# does not work with RAID, with InnoDB or BDB tables +# makes .frm lowercase and .MYI/MYD/ISM/ISD uppercase +# useful when datafiles are copied from windows + +die "Usage: $0 datadir\n" unless -d $ARGV[0]; + +for $a (<$ARGV[0]/*/*.*>) { $_=$a; + s/\.frm$/.frm/i; + s/\.(is[md]|my[id])$/\U$&/; + rename ($a, $_) || warn "Cannot rename $a => $_ : $!"; +} diff --git a/sql/ha_berkeley.h b/sql/ha_berkeley.h index ab1ead5a3e9..65116f908ac 100644 --- a/sql/ha_berkeley.h +++ b/sql/ha_berkeley.h @@ -90,7 +90,7 @@ class ha_berkeley: public handler HA_REC_NOT_IN_SEQ | HA_KEYPOS_TO_RNDPOS | HA_READ_ORDER | HA_LASTKEY_ORDER | HA_LONGLONG_KEYS | HA_NULL_KEY | HA_HAVE_KEY_READ_ONLY | - HA_BLOB_KEY | HA_NOT_EXACT_COUNT | HA_NO_FULLTEXT_KEY | + HA_BLOB_KEY | HA_NOT_EXACT_COUNT | HA_PRIMARY_KEY_IN_READ_INDEX | HA_DROP_BEFORE_CREATE | HA_AUTO_PART_KEY), changed_rows(0),last_dup_key((uint) -1),version(0),using_ignore(0) diff --git a/sql/ha_heap.h b/sql/ha_heap.h index 93deedb65d2..9b041411012 100644 --- a/sql/ha_heap.h +++ b/sql/ha_heap.h @@ -35,7 +35,7 @@ class ha_heap: public handler ulong option_flag() const { return (HA_READ_RND_SAME | HA_NO_INDEX | HA_ONLY_WHOLE_INDEX | HA_WRONG_ASCII_ORDER | HA_KEYPOS_TO_RNDPOS | HA_NO_BLOBS | - HA_REC_NOT_IN_SEQ | HA_NO_FULLTEXT_KEY); } + HA_REC_NOT_IN_SEQ); } uint max_record_length() const { return HA_MAX_REC_LENGTH; } uint max_keys() const { return MAX_KEY; } uint max_key_parts() const { return MAX_REF_PARTS; } diff --git a/sql/ha_innobase.h b/sql/ha_innobase.h index 83e43b1d662..b6419a5e74e 100644 --- a/sql/ha_innobase.h +++ b/sql/ha_innobase.h @@ -79,7 +79,7 @@ class ha_innobase: public handler HA_KEYPOS_TO_RNDPOS | HA_LASTKEY_ORDER | HA_HAVE_KEY_READ_ONLY | HA_READ_NOT_EXACT_KEY | HA_LONGLONG_KEYS | HA_NULL_KEY | - HA_NOT_EXACT_COUNT | HA_NO_FULLTEXT_KEY | + HA_NOT_EXACT_COUNT | HA_NO_WRITE_DELAYED | HA_PRIMARY_KEY_IN_READ_INDEX | HA_DROP_BEFORE_CREATE | diff --git a/sql/ha_isam.h b/sql/ha_isam.h index d839a6b1141..33ca99b5063 100644 --- a/sql/ha_isam.h +++ b/sql/ha_isam.h @@ -34,7 +34,7 @@ class ha_isam: public handler HA_KEYPOS_TO_RNDPOS | HA_READ_ORDER | HA_LASTKEY_ORDER | HA_HAVE_KEY_READ_ONLY | HA_READ_NOT_EXACT_KEY | HA_LONGLONG_KEYS | HA_KEY_READ_WRONG_STR | HA_DUPP_POS | - HA_NOT_DELETE_WITH_CACHE | HA_NO_FULLTEXT_KEY) + HA_NOT_DELETE_WITH_CACHE) {} ~ha_isam() {} const char *table_type() const { return "ISAM"; } diff --git a/sql/ha_isammrg.h b/sql/ha_isammrg.h index 5e0eaa1b2aa..888ecf0ca37 100644 --- a/sql/ha_isammrg.h +++ b/sql/ha_isammrg.h @@ -33,7 +33,7 @@ class ha_isammrg: public handler const char *table_type() const { return "MRG_ISAM"; } const char **bas_ext() const; ulong option_flag() const { return HA_READ_RND_SAME | HA_KEYPOS_TO_RNDPOS - | HA_REC_NOT_IN_SEQ | HA_NO_FULLTEXT_KEY;} + | HA_REC_NOT_IN_SEQ;} uint max_record_length() const { return HA_MAX_REC_LENGTH; } uint max_keys() const { return 0; } uint max_key_parts() const { return 0; } diff --git a/sql/ha_myisam.h b/sql/ha_myisam.h index eba2bde7d59..7b5c959ccfa 100644 --- a/sql/ha_myisam.h +++ b/sql/ha_myisam.h @@ -45,9 +45,10 @@ class ha_myisam: public handler public: ha_myisam(TABLE *table): handler(table), file(0), int_option_flag(HA_READ_NEXT | HA_READ_PREV | HA_READ_RND_SAME | - HA_KEYPOS_TO_RNDPOS | HA_READ_ORDER | HA_LASTKEY_ORDER | + HA_KEYPOS_TO_RNDPOS | HA_READ_ORDER | HA_LASTKEY_ORDER | HA_HAVE_KEY_READ_ONLY | HA_READ_NOT_EXACT_KEY | - HA_LONGLONG_KEYS | HA_NULL_KEY | + HA_LONGLONG_KEYS | HA_NULL_KEY | + HA_CAN_FULLTEXT | HA_CAN_SQL_HANDLER | HA_DUPP_POS | HA_BLOB_KEY | HA_AUTO_PART_KEY), enable_activate_all_index(1) {} diff --git a/sql/ha_myisammrg.h b/sql/ha_myisammrg.h index 7d696162de0..e18c520c803 100644 --- a/sql/ha_myisammrg.h +++ b/sql/ha_myisammrg.h @@ -35,7 +35,7 @@ class ha_myisammrg: public handler ulong option_flag() const { return (HA_REC_NOT_IN_SEQ | HA_READ_NEXT | HA_READ_PREV | HA_READ_RND_SAME | - HA_HAVE_KEY_READ_ONLY | HA_NO_FULLTEXT_KEY | + HA_HAVE_KEY_READ_ONLY | HA_KEYPOS_TO_RNDPOS | HA_READ_ORDER | HA_LASTKEY_ORDER | HA_READ_NOT_EXACT_KEY | HA_LONGLONG_KEYS | HA_NULL_KEY | HA_BLOB_KEY); } diff --git a/sql/handler.h b/sql/handler.h index 98358c3b3e4..1e2c0074475 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -76,7 +76,8 @@ #define HA_NOT_DELETE_WITH_CACHE (HA_NOT_READ_AFTER_KEY*2) #define HA_NO_TEMP_TABLES (HA_NOT_DELETE_WITH_CACHE*2) #define HA_NO_PREFIX_CHAR_KEYS (HA_NO_TEMP_TABLES*2) -#define HA_NO_FULLTEXT_KEY (HA_NO_PREFIX_CHAR_KEYS*2) +#define HA_CAN_FULLTEXT (HA_NO_PREFIX_CHAR_KEYS*2) +#define HA_CAN_SQL_HANDLER (HA_CAN_FULLTEXT*2) /* Parameters for open() (in register form->filestat) */ /* HA_GET_INFO does an implicit HA_ABORT_IF_LOCKED */ diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index 6b3295a819c..5d913d2b828 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -43,7 +43,7 @@ thd->open_tables=thd->handler_tables; \ thd->handler_tables=tmp; } -static TABLE **find_table_ptr_by_name(THD *thd, const char *db, +static TABLE **find_table_ptr_by_name(THD *thd, const char *db, const char *table_name); int mysql_ha_open(THD *thd, TABLE_LIST *tables) @@ -54,6 +54,13 @@ int mysql_ha_open(THD *thd, TABLE_LIST *tables) if (err) return -1; + // there can be only one table in *tables + if (!(tables->table->file->option_flag() & HA_CAN_SQL_HANDLER)) + { + my_printf_error(ER_ILLEGAL_HA,ER(ER_ILLEGAL_HA),MYF(0), tables->name); + return -1; + } + send_ok(&thd->net); return 0; } @@ -73,7 +80,7 @@ int mysql_ha_close(THD *thd, TABLE_LIST *tables) return 0; } -static enum enum_ha_read_modes rkey_to_rnext[]= +static enum enum_ha_read_modes rkey_to_rnext[]= { RNEXT, RNEXT, RPREV, RNEXT, RPREV, RNEXT, RPREV }; int mysql_ha_read(THD *thd, TABLE_LIST *tables, @@ -166,7 +173,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, if (!(key= (byte*) sql_calloc(ALIGN_SIZE(key_len)))) { send_error(&thd->net,ER_OUTOFMEMORY); - goto err; + goto err; } key_copy(key, table, keyno, key_len); err=table->file->index_read(table->record[0], @@ -176,7 +183,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, } default: send_error(&thd->net,ER_ILLEGAL_HA); - goto err; + goto err; } if (err) @@ -191,7 +198,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, goto ok; } if (cond) - { + { err=err; if(!cond->val_int()) continue; @@ -234,7 +241,7 @@ err: **************************************************************************/ /* Note: this function differs from find_locked_table() because we're looking - here for alias, not real table name + here for alias, not real table name */ static TABLE **find_table_ptr_by_name(THD *thd, const char *db, const char *table_name) @@ -244,7 +251,7 @@ static TABLE **find_table_ptr_by_name(THD *thd, const char *db, if (!db || ! *db) db= thd->db ? thd->db : ""; - dblen=strlen(db)+1; + dblen=strlen(db)+1; ptr=&(thd->handler_tables); for (TABLE *table=*ptr; table ; table=*ptr) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index d4324a4e5ac..d3c11ab8716 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -430,7 +430,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, if (key->type == Key::FULLTEXT) { - if (file->option_flag() & HA_NO_FULLTEXT_KEY) + if (!(file->option_flag() & HA_CAN_FULLTEXT)) { my_error(ER_TABLE_CANT_HANDLE_FULLTEXT, MYF(0)); DBUG_RETURN(-1); |