diff options
author | unknown <sasha@mysql.sashanet.com> | 2001-04-10 10:21:27 -0600 |
---|---|---|
committer | unknown <sasha@mysql.sashanet.com> | 2001-04-10 10:21:27 -0600 |
commit | 6b464d84ce58f07e1a3e4b98a1d8f5eb9146f00c (patch) | |
tree | 9b857bd28cfab559278829ef76e2f68438367bea | |
parent | 9b55716a5b9f8d6badea40b553944d8b352fe283 (diff) | |
parent | 494a3a0fc74ef5ea5547e54603808b11221ec4c1 (diff) | |
download | mariadb-git-6b464d84ce58f07e1a3e4b98a1d8f5eb9146f00c.tar.gz |
Merge work:/home/bk/mysql
into mysql.sashanet.com:/home/sasha/src/bk/mysql
-rw-r--r-- | .bzrignore | 121 | ||||
-rw-r--r-- | BitKeeper/etc/logging_ok | 1 | ||||
-rw-r--r-- | Docs/manual.texi | 29 | ||||
-rw-r--r-- | mysql-test/r/null_key.result | 28 | ||||
-rw-r--r-- | mysql-test/t/null_key.test | 46 | ||||
-rw-r--r-- | mysys/Makefile.am | 12 | ||||
-rw-r--r-- | sql/field.cc | 2 | ||||
-rw-r--r-- | sql/opt_range.cc | 32 | ||||
-rw-r--r-- | sql/opt_range.h | 1 |
9 files changed, 197 insertions, 75 deletions
diff --git a/.bzrignore b/.bzrignore index 3e27fd96c29..16606fdbf1a 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1,5 +1,9 @@ *.a +*.bb +*.bbg *.core +*.da +*.gcov *.la *.lo *.o @@ -10,13 +14,18 @@ .gdb_history .libs .o -db-*.*.* +.out +.snprj/* BitKeeper/etc/config BitKeeper/etc/csets BitKeeper/etc/csets-in BitKeeper/etc/csets-out BitKeeper/etc/gone +BitKeeper/etc/level BitKeeper/etc/pushed +BitKeeper/tmp/* +BitKeeper/tmp/bkr3sAHD +BitKeeper/tmp/gone COPYING COPYING.LIB Docs/INSTALL-BINARY @@ -39,6 +48,7 @@ Docs/manual.vr Docs/manual_a4.ps Docs/manual_letter.ps Docs/manual_toc.html +Docs/my_sys.doc Docs/mysql.info INSTALL-SOURCE MIRRORS @@ -48,6 +58,39 @@ Makefile.in' PENDING/* TAGS aclocal.m4 +bdb/README +bdb/build_unix/* +bdb/build_vxworks/db.h +bdb/build_win32/db.h +bdb/dist/configure +bdb/dist/tags +bdb/dist/template/rec_btree +bdb/dist/template/rec_crdel +bdb/dist/template/rec_db +bdb/dist/template/rec_hash +bdb/dist/template/rec_log +bdb/dist/template/rec_qam +bdb/dist/template/rec_txn +bdb/examples_java +bdb/hash/hash_auto.c +bdb/include/btree_auto.h +bdb/include/crdel_auto.h +bdb/include/db_auto.h +bdb/include/db_server.h +bdb/include/hash_auto.h +bdb/include/log_auto.h +bdb/include/qam_auto.h +bdb/include/txn_auto.h +bdb/java/src/com/sleepycat/db/DbConstants.java +bdb/log/log_auto.c +bdb/qam/qam_auto.c +bdb/rpc_client/db_server_clnt.c +bdb/rpc_client/gen_client.c +bdb/rpc_server/db_server_svc.c +bdb/rpc_server/db_server_xdr.c +bdb/rpc_server/gen_db_server.c +bdb/test/include.tcl +bdb/txn/txn_auto.c client/insert_test client/mysql client/mysqladmin @@ -65,12 +108,15 @@ config.log config.status configure core +db-*.*.* dbug/user.t extra/comp_err extra/my_print_defaults extra/perror extra/replace +extra/resolve_stack_dump extra/resolveip +gmon.out heap/hp_test1 heap/hp_test2 include/my_config.h @@ -88,6 +134,7 @@ libmysql/my_static.h libmysql/mysys_priv.h libmysql_r/*.c libmysql_r/acconfig.h +libmysql_r/conf_to_src libmysql_r/my_static.h libmysql_r/mysys_priv.h libtool @@ -106,10 +153,16 @@ myisam/mi_test_all myisam/myisamchk myisam/myisamlog myisam/myisampack +mysql-test/gmon.out +mysql-test/install_test_db +mysql-test/mysql-test-run mysql-test/r/*.reject mysql-test/share/mysql mysql-test/var/* +mysqld.S +mysqld.sym mysys/test_charset +mysys/test_dir mysys/test_thr_alarm mysys/test_thr_lock mysys/testhash @@ -134,10 +187,12 @@ scripts/mysqld_multi scripts/mysqldumpslow scripts/mysqlhotcopy scripts/safe_mysqld +sql-bench/Results-linux/ATIS-mysql_bdb-Linux_2.2.14_my_SMP_i686 sql-bench/bench-init.pl sql-bench/compare-results sql-bench/copy-db sql-bench/crash-me +sql-bench/output/* sql-bench/run-all-tests sql-bench/server-cfg sql-bench/test-ATIS @@ -148,11 +203,16 @@ sql-bench/test-create sql-bench/test-insert sql-bench/test-select sql-bench/test-wisconsin +sql/.gdbinit sql/gen_lex_hash +sql/gmon.out sql/lex_hash.h sql/mini_client_errors.c sql/mysqlbinlog sql/mysqld +sql/share/*.sys +sql/share/charsets/gmon.out +sql/share/gmon.out sql/share/norwegian-ny/errmsg.sys sql/share/norwegian/errmsg.sys sql/sql_yacc.cc @@ -175,63 +235,4 @@ support-files/mysql-log-rotate support-files/mysql.server support-files/mysql.spec tags -libmysql_r/conf_to_src -mysql-test/install_test_db -mysql-test/mysql-test-run -BitKeeper/tmp/gone -mysqld.S -mysqld.sym -.snprj/* -sql-bench/output/* -sql-bench/Results-linux/ATIS-mysql_bdb-Linux_2.2.14_my_SMP_i686 -Docs/my_sys.doc tmp/* -extra/resolve_stack_dump -sql/share/*.sys -BitKeeper/tmp/bkr3sAHD -BitKeeper/tmp/* -bdb/examples_java -bdb/README -bdb/build_vxworks/db.h -bdb/build_win32/db.h -bdb/dist/configure -bdb/dist/tags -bdb/build_unix/* -sql/.gdbinit -BitKeeper/etc/level -*.gcov -*.bb -*.bbg -*.da -.out -bdb/dist/template/rec_btree -bdb/dist/template/rec_crdel -bdb/dist/template/rec_db -bdb/dist/template/rec_hash -bdb/dist/template/rec_log -bdb/dist/template/rec_qam -bdb/dist/template/rec_txn -bdb/hash/hash_auto.c -bdb/include/btree_auto.h -bdb/include/crdel_auto.h -bdb/include/db_auto.h -bdb/include/db_server.h -bdb/include/hash_auto.h -bdb/include/log_auto.h -bdb/include/qam_auto.h -bdb/include/txn_auto.h -bdb/java/src/com/sleepycat/db/DbConstants.java -bdb/log/log_auto.c -bdb/qam/qam_auto.c -bdb/rpc_client/db_server_clnt.c -bdb/rpc_client/gen_client.c -bdb/rpc_server/db_server_svc.c -bdb/rpc_server/db_server_xdr.c -bdb/rpc_server/gen_db_server.c -bdb/test/include.tcl -bdb/txn/txn_auto.c -gmon.out -mysql-test/gmon.out -sql/gmon.out -sql/share/charsets/gmon.out -sql/share/gmon.out diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 9f94b7a6bfd..f36ccee94e0 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -1 +1,2 @@ sasha@mysql.sashanet.com +monty@donna.mysql.fi diff --git a/Docs/manual.texi b/Docs/manual.texi index 64163d455f7..de382a755bd 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -27391,8 +27391,22 @@ master-slave relationship with @code{log-slave-updates} enabled. Note, however, that many queries will not work right in this kind of setup unless your client code is written to take care of the potential problems that can happen from updates that occur in different sequence -on different servers. Note that the log format has changed in Version 3.23.26 -so that pre-3.23.26 slaves will not be able to read it. +on different servers. + +This means that you can do a setup like the following: + +@example +A -> B -> C -> A +@end example + +This setup will only works if you only do non conflicting updates +between the tables. In other words, if you insert data in A and C, you +should never insert a row in A that may have a conflicting key with a +row insert in C. You should also not update the sam rows on two servers +if the order in which the updates are applied matters. + +Note that the log format has changed in Version 3.23.26 so that +pre-3.23.26 slaves will not be able to read it. @item If the query on the slave gets an error, the slave thread will terminate, and a message will appear in the @code{.err} file. You should @@ -28847,9 +28861,11 @@ explicitely lock the table with @code{LOCK TABLES} or execute a command that will modify every row in the table, like @code{ALTER TABLE}. In @strong{MySQL} Version 3.23.7 and above, you can insert rows into -@code{MyISAM} tables at the same time other threads are reading from -the table. Note that currently this only works if there are no holes after -deleted rows in the table at the time the insert is made. +@code{MyISAM} tables at the same time other threads are reading from the +table. Note that currently this only works if there are no holes after +deleted rows in the table at the time the insert is made. When all holes +has been filled with new data, concurrent inserts will automaticly be +enabled again. Table locking enables many threads to read from a table at the same time, but if a thread wants to write to a table, it must first get @@ -42743,6 +42759,9 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.37 @itemize @bullet @item +@code{UPDATE} and @code{DELETE} with @code{WHERE unique_key_part IS NULL} +didn't update/delete all rows. +@item Disabled @code{INSERT DELAYED} for tables that supports transactions. @item Fixed bug when using date functions on @code{TEXT}/@code{BLOB} column diff --git a/mysql-test/r/null_key.result b/mysql-test/r/null_key.result index 98c43b20b01..ead1dc29326 100644 --- a/mysql-test/r/null_key.result +++ b/mysql-test/r/null_key.result @@ -92,3 +92,31 @@ NULL 9 0 NULL 9 0 a b c 6 6 0 +table type possible_keys key key_len ref rows Extra +t1 ref idx1 idx1 5 const 1 where used +table type possible_keys key key_len ref rows Extra +t1 const idx1 idx1 5 const 1 +id +101 +102 +105 +106 +109 +110 +id +101 +102 +105 +106 +109 +110 +id uniq_id +3 1 +4 2 +7 3 +8 4 +id uniq_id +3 1 +4 2 +7 3 +8 4 diff --git a/mysql-test/t/null_key.test b/mysql-test/t/null_key.test index 759f4a432da..e5d8fc59e4f 100644 --- a/mysql-test/t/null_key.test +++ b/mysql-test/t/null_key.test @@ -45,3 +45,49 @@ select * from t1 where (a is null or a = 7) and b=7 and c=0; select * from t1 where a is null and b=9 or a is null and b=7 limit 3; select * from t1 where b like "6%"; drop table t1; + + +# +# The following failed for Matt Loschert +# + +DROP TABLE IF EXISTS t1,t2; +CREATE TABLE t1 ( + id int(10) unsigned NOT NULL auto_increment, + uniq_id int(10) unsigned default NULL, + PRIMARY KEY (id), + UNIQUE KEY idx1 (uniq_id) +) TYPE=MyISAM; + +CREATE TABLE t2 ( + id int(10) unsigned NOT NULL auto_increment, + uniq_id int(10) unsigned default NULL, + PRIMARY KEY (id) +) TYPE=MyISAM; + +INSERT INTO t1 VALUES (1,NULL),(2,NULL),(3,1),(4,2),(5,NULL),(6,NULL),(7,3),(8,4),(9,NULL),(10,NULL); +INSERT INTO t2 VALUES (1,NULL),(2,NULL),(3,1),(4,2),(5,NULL),(6,NULL),(7,3),(8,4),(9,NULL),(10,NULL); + +# +# Check IS NULL optimization +# +explain select id from t1 where uniq_id is null; +explain select id from t1 where uniq_id =1; +# +# Check updates +# +UPDATE t1 SET id=id+100 where uniq_id is null; +UPDATE t2 SET id=id+100 where uniq_id is null; +select id from t1 where uniq_id is null; +select id from t2 where uniq_id is null; +# +# Delete all records from each table where the uniq_id field is null +# +DELETE FROM t1 WHERE uniq_id IS NULL; +DELETE FROM t2 WHERE uniq_id IS NULL; +# +# Select what is left -- notice the difference +# +SELECT * FROM t1 ORDER BY uniq_id, id; +SELECT * FROM t2 ORDER BY uniq_id, id; +DROP table t1,t2; diff --git a/mysys/Makefile.am b/mysys/Makefile.am index bc7720aef74..5a7293bc680 100644 --- a/mysys/Makefile.am +++ b/mysys/Makefile.am @@ -49,9 +49,9 @@ EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \ thr_mutex.c thr_rwlock.c libmysys_a_LIBADD = @THREAD_LOBJECTS@ # test_fn removed 980815 since it not upp to date test_dir -noinst_PROGRAMS = testhash test_charset @THREAD_LPROGRAMS@ +noinst_PROGRAMS = test_charset @THREAD_LPROGRAMS@ # test_dir_DEPENDENCIES= $(LIBRARIES) -testhash_DEPENDENCIES= $(LIBRARIES) +# testhash_DEPENDENCIES= $(LIBRARIES) test_charset_DEPENDENCIES= $(LIBRARIES) EXTRA_PROGRAMS = DEFS = -DDEFAULT_BASEDIR=\"$(prefix)\" \ @@ -81,17 +81,17 @@ FLAGS=$(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) @NOINST_LDFLAGS@ # test_thr_alarm: thr_alarm.c $(LIBRARIES) - $(CP) -f $(srcdir)/thr_alarm.c ./test_thr_alarm.c + $(CP) $(srcdir)/thr_alarm.c ./test_thr_alarm.c $(LINK) $(FLAGS) -DMAIN ./test_thr_alarm.c $(LDADD) $(LIBS) $(RM) -f ./test_thr_alarm.* test_thr_lock: thr_lock.c $(LIBRARIES) - $(CP) -f $(srcdir)/thr_lock.c test_thr_lock.c + $(CP) $(srcdir)/thr_lock.c test_thr_lock.c $(LINK) $(FLAGS) -DMAIN ./test_thr_lock.c $(LDADD) $(LIBS) $(RM) -f ./test_thr_lock.* test_vsnprintf: my_vsnprintf.c $(LIBRARIES) - $(CP) -f $(srcdir)/my_vsnprintf.c test_vsnprintf.c + $(CP) $(srcdir)/my_vsnprintf.c test_vsnprintf.c $(LINK) $(FLAGS) -DMAIN ./test_vsnprintf.c $(LDADD) $(LIBS) $(RM) -f test_vsnprintf.* @@ -102,7 +102,7 @@ test_charset: test_charset.c $(LIBRARIES) $(LINK) $(FLAGS) -DMAIN $(srcdir)/test_charset.c $(LDADD) $(LIBS) testhash: testhash.c $(LIBRARIES) - $(LINK) $(FLAGS) -DMAIN $(srcdir)/test_dir.c $(LDADD) $(LIBS) + $(LINK) $(FLAGS) -DMAIN $(srcdir)/testhash.c $(LDADD) $(LIBS) # Don't update the files from bitkeeper %::SCCS/s.% diff --git a/sql/field.cc b/sql/field.cc index f2310dd0229..f7dbd3c72f0 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -3891,7 +3891,7 @@ String *Field_blob::val_str(String *val_buffer __attribute__((unused)), char *blob; memcpy_fixed(&blob,ptr+packlength,sizeof(char*)); if (!blob) - val_ptr->length(0); + val_ptr->set("",0); // A bit safer than ->length(0) else val_ptr->set((const char*) blob,get_length(ptr)); return val_ptr; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 4c1a0db72b7..eedae87719d 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -321,7 +321,7 @@ static bool get_quick_keys(PARAM *param,QUICK_SELECT *quick,KEY_PART *key, static bool eq_tree(SEL_ARG* a,SEL_ARG *b); static SEL_ARG null_element(SEL_ARG::IMPOSSIBLE); - +static bool null_part_in_key(KEY_PART *key_part, const char *key, uint length); /*************************************************************************** ** Basic functions for SQL_SELECT and QUICK_SELECT @@ -2306,7 +2306,15 @@ get_quick_keys(PARAM *param,QUICK_SELECT *quick,KEY_PART *key, KEY *table_key=quick->head->key_info+quick->index; flag=EQ_RANGE; if (table_key->flags & HA_NOSAME && key->part == table_key->key_parts-1) - flag|= UNIQUE_RANGE; + { + if (!(table_key->flags & HA_NULL_PART_KEY) || + !null_part_in_key(key, + param->min_key, + (uint) (tmp_min_key - param->min_key))) + flag|= UNIQUE_RANGE; + else + flag|= NULL_RANGE; + } } } @@ -2339,7 +2347,7 @@ bool QUICK_SELECT::unique_key_range() if (ranges.elements == 1) { QUICK_RANGE *tmp; - if ((tmp=ranges.head())->flag & EQ_RANGE) + if (((tmp=ranges.head())->flag & (EQ_RANGE | NULL_RANGE)) == EQ_RANGE) { KEY *key=head->key_info+index; return ((key->flags & HA_NOSAME) && @@ -2349,6 +2357,24 @@ bool QUICK_SELECT::unique_key_range() return 0; } + +/* Returns true if any part of the key is NULL */ + +static bool null_part_in_key(KEY_PART *key_part, const char *key, uint length) +{ + for (const char *end=key+length ; + key < end; + key+= key_part++->part_length) + { + if (key_part->null_bit) + { + if (*key++) + return 1; + } + } + return 0; +} + /**************************************************************************** ** Create a QUICK RANGE based on a key ****************************************************************************/ diff --git a/sql/opt_range.h b/sql/opt_range.h index 2005773eca7..247dd260817 100644 --- a/sql/opt_range.h +++ b/sql/opt_range.h @@ -30,6 +30,7 @@ #define NEAR_MAX 8 #define UNIQUE_RANGE 16 #define EQ_RANGE 32 +#define NULL_RANGE 64 typedef struct st_key_part { uint16 key,part,part_length; |