From 25fde2d0921267c56dbe5349d49fd06ad9ccb002 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Thu, 13 Jan 2005 18:23:34 -0800 Subject: [PATCH 001/204] In TRADITIONAL mode, don't allow a NOT NULL field with no default be set to DEFAULT (with no argument) or to the field's type's default by not being listed in the list of fields being inserted. (Bug #5986) --- mysql-test/r/strict.result | 37 +++++++++++++++++++++++++++++++++++++ mysql-test/t/strict.test | 34 ++++++++++++++++++++++++++++++++++ sql/item.cc | 22 ++++++++++++++++++++++ sql/item.h | 10 +--------- sql/sql_insert.cc | 3 ++- 5 files changed, 96 insertions(+), 10 deletions(-) diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result index fb228d37da3..45f7caa0b11 100644 --- a/mysql-test/r/strict.result +++ b/mysql-test/r/strict.result @@ -921,3 +921,40 @@ col1 col2 3 99 DROP TABLE t1; +SET @@sql_mode = 'traditional'; +CREATE TABLE t1 (i int not null); +INSERT INTO t1 VALUES (); +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 VALUES (DEFAULT); +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 VALUES (DEFAULT(i)); +ERROR HY000: Field 'i' doesn't have a default value +ALTER TABLE t1 ADD j int; +INSERT INTO t1 SET j = 1; +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 SET j = 1, i = DEFAULT; +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 SET j = 1, i = DEFAULT(i); +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 VALUES (DEFAULT,1); +ERROR HY000: Field 'i' doesn't have a default value +DROP TABLE t1; +SET @@sql_mode = ''; +CREATE TABLE t1 (i int not null); +INSERT INTO t1 VALUES (); +INSERT INTO t1 VALUES (DEFAULT); +Warnings: +Warning 1364 Field 'i' doesn't have a default value +INSERT INTO t1 VALUES (DEFAULT(i)); +ERROR HY000: Field 'i' doesn't have a default value +ALTER TABLE t1 ADD j int; +INSERT INTO t1 SET j = 1; +INSERT INTO t1 SET j = 1, i = DEFAULT; +Warnings: +Warning 1364 Field 'i' doesn't have a default value +INSERT INTO t1 SET j = 1, i = DEFAULT(i); +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 VALUES (DEFAULT,1); +Warnings: +Warning 1364 Field 'i' doesn't have a default value +DROP TABLE t1; diff --git a/mysql-test/t/strict.test b/mysql-test/t/strict.test index a0cfc0c60f4..ba8fafe3fdd 100644 --- a/mysql-test/t/strict.test +++ b/mysql-test/t/strict.test @@ -638,3 +638,37 @@ INSERT IGNORE INTO t1 (col1) values (3); INSERT IGNORE INTO t1 () values (); SELECT * FROM t1; DROP TABLE t1; + +# Test fields with no default value that are NOT NULL (Bug #5986) +SET @@sql_mode = 'traditional'; +CREATE TABLE t1 (i int not null); +--error 1364 +INSERT INTO t1 VALUES (); +--error 1364 +INSERT INTO t1 VALUES (DEFAULT); +--error 1364 +INSERT INTO t1 VALUES (DEFAULT(i)); +ALTER TABLE t1 ADD j int; +--error 1364 +INSERT INTO t1 SET j = 1; +--error 1364 +INSERT INTO t1 SET j = 1, i = DEFAULT; +--error 1364 +INSERT INTO t1 SET j = 1, i = DEFAULT(i); +--error 1364 +INSERT INTO t1 VALUES (DEFAULT,1); +DROP TABLE t1; +SET @@sql_mode = ''; +CREATE TABLE t1 (i int not null); +INSERT INTO t1 VALUES (); +INSERT INTO t1 VALUES (DEFAULT); +# DEFAULT(i) is an error even with the default sql_mode +--error 1364 +INSERT INTO t1 VALUES (DEFAULT(i)); +ALTER TABLE t1 ADD j int; +INSERT INTO t1 SET j = 1; +INSERT INTO t1 SET j = 1, i = DEFAULT; +--error 1364 +INSERT INTO t1 SET j = 1, i = DEFAULT(i); +INSERT INTO t1 VALUES (DEFAULT,1); +DROP TABLE t1; diff --git a/sql/item.cc b/sql/item.cc index c84496f8eb7..a82037c3762 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -3204,6 +3204,7 @@ bool Item_default_value::fix_fields(THD *thd, return FALSE; } + void Item_default_value::print(String *str) { if (!arg) @@ -3216,6 +3217,27 @@ void Item_default_value::print(String *str) str->append(')'); } + +int Item_default_value::save_in_field(Field *field_arg, bool no_conversions) +{ + if (!arg) + { + if (field_arg->flags & NO_DEFAULT_VALUE_FLAG) + { + push_warning_printf(field_arg->table->in_use, + MYSQL_ERROR::WARN_LEVEL_WARN, + ER_NO_DEFAULT_FOR_FIELD, + ER(ER_NO_DEFAULT_FOR_FIELD), + field_arg->field_name); + return 1; + } + field_arg->set_default(); + return 0; + } + return Item_field::save_in_field(field_arg, no_conversions); +} + + bool Item_insert_value::eq(const Item *item, bool binary_cmp) const { return item->type() == INSERT_VALUE_ITEM && diff --git a/sql/item.h b/sql/item.h index 2503f137355..b4386edeabc 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1316,15 +1316,7 @@ public: bool eq(const Item *item, bool binary_cmp) const; bool fix_fields(THD *, struct st_table_list *, Item **); void print(String *str); - int save_in_field(Field *field_arg, bool no_conversions) - { - if (!arg) - { - field_arg->set_default(); - return 0; - } - return Item_field::save_in_field(field_arg, no_conversions); - } + int save_in_field(Field *field_arg, bool no_conversions); table_map used_tables() const { return (table_map)0L; } bool walk(Item_processor processor, byte *args) diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index ceb31f76953..d93010d9915 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -311,7 +311,8 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, (MODE_STRICT_TRANS_TABLES | MODE_STRICT_ALL_TABLES))); - if (fields.elements && check_that_all_fields_are_given_values(thd, table)) + if ((fields.elements || !value_count) && + check_that_all_fields_are_given_values(thd, table)) { /* thd->net.report_error is now set, which will abort the next loop */ error= 1; From 01ddc370f0eda1f605ca8be426f86acef9722ff1 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Fri, 14 Jan 2005 17:09:35 -0800 Subject: [PATCH 002/204] Enable warnings for 'no default' fields being set to default when they are not specified in an insert. Most of these changes are actually to clean up the test suite to either specify defaults to avoid warnings, or add the warnings to the results. Related to bug #5986. --- mysql-test/r/create.result | 4 ++++ mysql-test/r/ctype_latin1_de.result | 4 ++-- mysql-test/r/ctype_many.result | 16 ++++++++-------- mysql-test/r/gis-rtree.result | 1 - mysql-test/r/grant.result | 4 ++++ mysql-test/r/grant2.result | 4 ++++ mysql-test/r/help.result | 16 ++++++++++++++++ mysql-test/r/limit.result | 2 +- mysql-test/r/null.result | 2 +- mysql-test/r/order_by.result | 2 +- mysql-test/r/rpl000001.result | 4 ++++ mysql-test/r/sp.result | 6 +++--- mysql-test/r/strict.result | 8 ++++++++ mysql-test/r/type_blob.result | 2 +- mysql-test/r/type_ranges.result | 8 ++++---- mysql-test/r/warnings.result | 2 ++ mysql-test/t/ctype_latin1_de.test | 2 +- mysql-test/t/ctype_many.test | 6 +++--- mysql-test/t/gis-rtree.test | 1 - mysql-test/t/index_merge_ror.test | 12 ++++++------ mysql-test/t/limit.test | 2 +- mysql-test/t/null.test | 2 +- mysql-test/t/order_by.test | 2 +- mysql-test/t/show_check.test | 8 ++++---- mysql-test/t/sp.test | 2 +- mysql-test/t/type_blob.test | 2 +- mysql-test/t/type_ranges.test | 8 ++++---- sql/sql_insert.cc | 13 +++++++------ 28 files changed, 93 insertions(+), 52 deletions(-) diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index f2e91c36f75..0082feeb67b 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -255,11 +255,15 @@ drop table t1; create table t1 (a int not null, b int, primary key (a)); insert into t1 values (1,1); create table if not exists t1 select 2; +Warnings: +Warning 1364 Field 'a' doesn't have a default value select * from t1; a b 1 1 0 2 create table if not exists t1 select 3 as 'a',4 as 'b'; +Warnings: +Warning 1364 Field 'a' doesn't have a default value create table if not exists t1 select 3 as 'a',3 as 'b'; ERROR 23000: Duplicate entry '3' for key 1 select * from t1; diff --git a/mysql-test/r/ctype_latin1_de.result b/mysql-test/r/ctype_latin1_de.result index f890250e0a3..055b36c0daf 100644 --- a/mysql-test/r/ctype_latin1_de.result +++ b/mysql-test/r/ctype_latin1_de.result @@ -220,12 +220,12 @@ select * from t1 where match a against ("te*" in boolean mode)+0; a test drop table t1; -create table t1 (word varchar(255) not null, word2 varchar(255) not null, index(word)); +create table t1 (word varchar(255) not null, word2 varchar(255) not null default '', index(word)); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `word` varchar(255) collate latin1_german2_ci NOT NULL, - `word2` varchar(255) collate latin1_german2_ci NOT NULL, + `word2` varchar(255) collate latin1_german2_ci NOT NULL default '', KEY `word` (`word`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci insert into t1 (word) values ('ss'),(0xDF),(0xE4),('ae'); diff --git a/mysql-test/r/ctype_many.result b/mysql-test/r/ctype_many.result index 5932bd75787..87b83acfe0f 100644 --- a/mysql-test/r/ctype_many.result +++ b/mysql-test/r/ctype_many.result @@ -2,27 +2,27 @@ DROP TABLE IF EXISTS t1; SET CHARACTER SET latin1; CREATE TABLE t1 ( comment CHAR(32) ASCII NOT NULL, -koi8_ru_f CHAR(32) CHARACTER SET koi8r NOT NULL +koi8_ru_f CHAR(32) CHARACTER SET koi8r NOT NULL default '' ) CHARSET=latin5; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `comment` char(32) character set latin1 NOT NULL, - `koi8_ru_f` char(32) character set koi8r NOT NULL + `koi8_ru_f` char(32) character set koi8r NOT NULL default '' ) ENGINE=MyISAM DEFAULT CHARSET=latin5 ALTER TABLE t1 CHANGE comment comment CHAR(32) CHARACTER SET latin2 NOT NULL; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `comment` char(32) character set latin2 NOT NULL, - `koi8_ru_f` char(32) character set koi8r NOT NULL + `koi8_ru_f` char(32) character set koi8r NOT NULL default '' ) ENGINE=MyISAM DEFAULT CHARSET=latin5 ALTER TABLE t1 ADD latin5_f CHAR(32) NOT NULL; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `comment` char(32) character set latin2 NOT NULL, - `koi8_ru_f` char(32) character set koi8r NOT NULL, + `koi8_ru_f` char(32) character set koi8r NOT NULL default '', `latin5_f` char(32) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin5 ALTER TABLE t1 DEFAULT CHARSET=latin2; @@ -31,7 +31,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `comment` char(32) NOT NULL, - `koi8_ru_f` char(32) character set koi8r NOT NULL, + `koi8_ru_f` char(32) character set koi8r NOT NULL default '', `latin5_f` char(32) character set latin5 NOT NULL, `latin2_f` char(32) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin2 @@ -40,7 +40,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `comment` char(32) NOT NULL, - `koi8_ru_f` char(32) character set koi8r NOT NULL + `koi8_ru_f` char(32) character set koi8r NOT NULL default '' ) ENGINE=MyISAM DEFAULT CHARSET=latin2 INSERT INTO t1 (koi8_ru_f,comment) VALUES ('a','LAT SMALL A'); INSERT INTO t1 (koi8_ru_f,comment) VALUES ('b','LAT SMALL B'); @@ -219,7 +219,7 @@ z LAT CAPIT Z 2 э CYR CAPIT E 2 ю CYR CAPIT YU 2 я CYR CAPIT YA 2 -ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL; +ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL default ''; UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8); SET CHARACTER SET koi8r; SELECT * FROM t1; @@ -340,7 +340,7 @@ CYR CAPIT SOFT SIGN CYR CAPIT E CYR CAPIT YU CYR CAPIT YA -ALTER TABLE t1 ADD bin_f CHAR(32) BYTE NOT NULL; +ALTER TABLE t1 ADD bin_f CHAR(32) BYTE NOT NULL default ''; UPDATE t1 SET bin_f=koi8_ru_f; SELECT COUNT(DISTINCT bin_f),COUNT(DISTINCT koi8_ru_f),COUNT(DISTINCT utf8_f) FROM t1; COUNT(DISTINCT bin_f) COUNT(DISTINCT koi8_ru_f) COUNT(DISTINCT utf8_f) diff --git a/mysql-test/r/gis-rtree.result b/mysql-test/r/gis-rtree.result index efd3b0f8e15..0e558e47594 100644 --- a/mysql-test/r/gis-rtree.result +++ b/mysql-test/r/gis-rtree.result @@ -758,7 +758,6 @@ SPATIAL KEY(g) INSERT INTO t1 (g) VALUES (GeomFromText('LineString(1 2, 2 3)')),(GeomFromText('LineString(1 2, 2 4)')); drop table t1; CREATE TABLE t1 ( -geoobjid INT NOT NULL, line LINESTRING NOT NULL, kind ENUM('po', 'pp', 'rr', 'dr', 'rd', 'ts', 'cl') NOT NULL DEFAULT 'po', name VARCHAR(32), diff --git a/mysql-test/r/grant.result b/mysql-test/r/grant.result index e5f7f535ae2..2eaf30f802d 100644 --- a/mysql-test/r/grant.result +++ b/mysql-test/r/grant.result @@ -157,6 +157,10 @@ select 1; 1 1 insert into mysql.user (host, user) values ('localhost', 'test11'); +Warnings: +Warning 1364 Field 'ssl_cipher' doesn't have a default value +Warning 1364 Field 'x509_issuer' doesn't have a default value +Warning 1364 Field 'x509_subject' doesn't have a default value insert into mysql.db (host, db, user, select_priv) values ('localhost', 'a%', 'test11', 'Y'), ('localhost', 'ab%', 'test11', 'Y'); alter table mysql.db order by db asc; diff --git a/mysql-test/r/grant2.result b/mysql-test/r/grant2.result index 0779e2adfa2..dedf5935743 100644 --- a/mysql-test/r/grant2.result +++ b/mysql-test/r/grant2.result @@ -225,6 +225,10 @@ host user password % mysqltest_2 *BD447CBA355AF58578D3AE33BA2E2CD388BA08D1 localhost mysqltest_3 insert into mysql.user set host='%', user='mysqltest_B'; +Warnings: +Warning 1364 Field 'ssl_cipher' doesn't have a default value +Warning 1364 Field 'x509_issuer' doesn't have a default value +Warning 1364 Field 'x509_subject' doesn't have a default value create user mysqltest_A@'%'; ERROR 42000: Access denied for user 'mysqltest_3'@'localhost' to database 'mysql' rename user mysqltest_B@'%' to mysqltest_C@'%'; diff --git a/mysql-test/r/help.result b/mysql-test/r/help.result index edf7d0e91cb..85ca832828d 100644 --- a/mysql-test/r/help.result +++ b/mysql-test/r/help.result @@ -1,32 +1,48 @@ insert into mysql.help_category(help_category_id,name)values(1,'impossible_category_1'); +Warnings: +Warning 1364 Field 'url' doesn't have a default value select @category1_id:= 1; @category1_id:= 1 1 insert into mysql.help_category(help_category_id,name)values(2,'impossible_category_2'); +Warnings: +Warning 1364 Field 'url' doesn't have a default value select @category2_id:= 2; @category2_id:= 2 2 insert into mysql.help_category(help_category_id,name,parent_category_id)values(3,'impossible_category_3',@category2_id); +Warnings: +Warning 1364 Field 'url' doesn't have a default value select @category3_id:= 3; @category3_id:= 3 3 insert into mysql.help_topic(help_topic_id,name,help_category_id,description,example)values(1,'impossible_function_1',@category1_id,'description of \n impossible_function1\n','example of \n impossible_function1'); +Warnings: +Warning 1364 Field 'url' doesn't have a default value select @topic1_id:= 1; @topic1_id:= 1 1 insert into mysql.help_topic(help_topic_id,name,help_category_id,description,example)values(2,'impossible_function_2',@category1_id,'description of \n impossible_function2\n','example of \n impossible_function2'); +Warnings: +Warning 1364 Field 'url' doesn't have a default value select @topic2_id:= 2; @topic2_id:= 2 2 insert into mysql.help_topic(help_topic_id,name,help_category_id,description,example)values(3,'impossible_function_3',@category2_id,'description of \n impossible_function3\n','example of \n impossible_function3'); +Warnings: +Warning 1364 Field 'url' doesn't have a default value select @topic3_id:= 3; @topic3_id:= 3 3 insert into mysql.help_topic(help_topic_id,name,help_category_id,description,example)values(4,'impossible_function_4',@category2_id,'description of \n impossible_function4\n','example of \n impossible_function4'); +Warnings: +Warning 1364 Field 'url' doesn't have a default value select @topic4_id:= 4; @topic4_id:= 4 4 insert into mysql.help_topic(help_topic_id,name,help_category_id,description,example)values(5,'impossible_function_7',@category3_id,'description of \n impossible_function5\n','example of \n impossible_function7'); +Warnings: +Warning 1364 Field 'url' doesn't have a default value select @topic5_id:= 5; @topic5_id:= 5 5 diff --git a/mysql-test/r/limit.result b/mysql-test/r/limit.result index c82105e6a49..8d20a191f1c 100644 --- a/mysql-test/r/limit.result +++ b/mysql-test/r/limit.result @@ -1,5 +1,5 @@ drop table if exists t1; -create table t1 (a int primary key, b int not null); +create table t1 (a int not null default 0 primary key, b int not null default 0); insert into t1 () values (); insert into t1 values (1,1),(2,1),(3,1); update t1 set a=4 where b=1 limit 1; diff --git a/mysql-test/r/null.result b/mysql-test/r/null.result index 9f05703e69e..806e2b6f254 100644 --- a/mysql-test/r/null.result +++ b/mysql-test/r/null.result @@ -88,7 +88,7 @@ b ifnull(t2.b,"this is null") NULL this is null NULL this is null drop table t1; -CREATE TABLE t1 (a varchar(16) NOT NULL, b smallint(6) NOT NULL, c datetime NOT NULL, d smallint(6) NOT NULL); +CREATE TABLE t1 (a varchar(16) NOT NULL default '', b smallint(6) NOT NULL default '', c datetime NOT NULL default '0000-00-00 00:00:00', d smallint(6) NOT NULL default 0); INSERT INTO t1 SET a = "", d= "2003-01-14 03:54:55"; Warnings: Warning 1265 Data truncated for column 'd' at row 1 diff --git a/mysql-test/r/order_by.result b/mysql-test/r/order_by.result index 6744ffa889f..0a5efed7a25 100644 --- a/mysql-test/r/order_by.result +++ b/mysql-test/r/order_by.result @@ -257,7 +257,7 @@ favo_tijdschrift varchar(50) NOT NULL default '', favo_tv varchar(50) NOT NULL default '', favo_eten varchar(50) NOT NULL default '', favo_muziek varchar(30) NOT NULL default '', -info text NOT NULL, +info text NOT NULL default '', ipnr varchar(30) NOT NULL default '', PRIMARY KEY (member_id) ) ENGINE=MyISAM PACK_KEYS=1; diff --git a/mysql-test/r/rpl000001.result b/mysql-test/r/rpl000001.result index eef986d8f8c..434e10160a4 100644 --- a/mysql-test/r/rpl000001.result +++ b/mysql-test/r/rpl000001.result @@ -76,6 +76,10 @@ create table t1 (n int); insert into t1 values(3456); insert into mysql.user (Host, User, Password) VALUES ("10.10.10.%", "blafasel2", password("blafasel2")); +Warnings: +Warning 1364 Field 'ssl_cipher' doesn't have a default value +Warning 1364 Field 'x509_issuer' doesn't have a default value +Warning 1364 Field 'x509_subject' doesn't have a default value select select_priv,user from mysql.user where user = _binary'blafasel2'; select_priv user N blafasel2 diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 1fd519bc729..a887152705b 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -1,7 +1,7 @@ use test; drop table if exists t1; create table t1 ( -id char(16) not null, +id char(16) not null default '', data int not null ); drop table if exists t2; @@ -1725,7 +1725,7 @@ tinyint 1 -128 127 0 0 YES YES NO YES YES NO NULL,0 A very small integer tinyint unsigned 1 0 255 0 0 YES YES YES YES YES NO NULL,0 A very small integer Table Create Table t1 CREATE TABLE `t1` ( - `id` char(16) NOT NULL, + `id` char(16) NOT NULL default '', `data` int(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 Database Create Database @@ -1778,7 +1778,7 @@ tinyint 1 -128 127 0 0 YES YES NO YES YES NO NULL,0 A very small integer tinyint unsigned 1 0 255 0 0 YES YES YES YES YES NO NULL,0 A very small integer Table Create Table t1 CREATE TABLE `t1` ( - `id` char(16) NOT NULL, + `id` char(16) NOT NULL default '', `data` int(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 Database Create Database diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result index 45f7caa0b11..3c007f80d78 100644 --- a/mysql-test/r/strict.result +++ b/mysql-test/r/strict.result @@ -912,7 +912,11 @@ Warnings: Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'col1' at row 1 Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'col2' at row 1 INSERT IGNORE INTO t1 (col1) values (3); +Warnings: +Warning 1364 Field 'col2' doesn't have a default value INSERT IGNORE INTO t1 () values (); +Warnings: +Warning 1364 Field 'col2' doesn't have a default value SELECT * FROM t1; col1 col2 1 hello @@ -942,6 +946,8 @@ DROP TABLE t1; SET @@sql_mode = ''; CREATE TABLE t1 (i int not null); INSERT INTO t1 VALUES (); +Warnings: +Warning 1364 Field 'i' doesn't have a default value INSERT INTO t1 VALUES (DEFAULT); Warnings: Warning 1364 Field 'i' doesn't have a default value @@ -949,6 +955,8 @@ INSERT INTO t1 VALUES (DEFAULT(i)); ERROR HY000: Field 'i' doesn't have a default value ALTER TABLE t1 ADD j int; INSERT INTO t1 SET j = 1; +Warnings: +Warning 1364 Field 'i' doesn't have a default value INSERT INTO t1 SET j = 1, i = DEFAULT; Warnings: Warning 1364 Field 'i' doesn't have a default value diff --git a/mysql-test/r/type_blob.result b/mysql-test/r/type_blob.result index 7b9a94ba998..a42dfd53a0a 100644 --- a/mysql-test/r/type_blob.result +++ b/mysql-test/r/type_blob.result @@ -502,7 +502,7 @@ select foobar, boggle from t1 where foobar = 'fish' and boggle = 10; foobar boggle fish 10 drop table t1; -create table t1 (id integer auto_increment unique,imagem LONGBLOB not null); +create table t1 (id integer auto_increment unique,imagem LONGBLOB not null default ''); insert into t1 (id) values (1); select charset(load_file('../../std_data/words.dat')), diff --git a/mysql-test/r/type_ranges.result b/mysql-test/r/type_ranges.result index 1a66f0d91d2..6433c76571d 100644 --- a/mysql-test/r/type_ranges.result +++ b/mysql-test/r/type_ranges.result @@ -21,10 +21,10 @@ time_field time, date_time datetime, blob_col blob, tinyblob_col tinyblob, -mediumblob_col mediumblob not null, -longblob_col longblob not null, -options enum('one','two','tree') not null, -flags set('one','two','tree') not null, +mediumblob_col mediumblob not null default '', +longblob_col longblob not null default '', +options enum('one','two','tree') not null , +flags set('one','two','tree') not null default '', PRIMARY KEY (auto), KEY (utiny), KEY (tiny), diff --git a/mysql-test/r/warnings.result b/mysql-test/r/warnings.result index a2e99be62ad..fba5ee02773 100644 --- a/mysql-test/r/warnings.result +++ b/mysql-test/r/warnings.result @@ -90,10 +90,12 @@ Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'a' a Warning 1265 Data truncated for column 'b' at row 4 insert into t2(b) values('mysqlab'); Warnings: +Warning 1364 Field 'a' doesn't have a default value Warning 1265 Data truncated for column 'b' at row 1 set sql_warnings=1; insert into t2(b) values('mysqlab'); Warnings: +Warning 1364 Field 'a' doesn't have a default value Warning 1265 Data truncated for column 'b' at row 1 set sql_warnings=0; drop table t1, t2; diff --git a/mysql-test/t/ctype_latin1_de.test b/mysql-test/t/ctype_latin1_de.test index 1c9576c1c56..d091b38c5e8 100644 --- a/mysql-test/t/ctype_latin1_de.test +++ b/mysql-test/t/ctype_latin1_de.test @@ -66,7 +66,7 @@ drop table t1; # # The below checks both binary and character comparisons. # -create table t1 (word varchar(255) not null, word2 varchar(255) not null, index(word)); +create table t1 (word varchar(255) not null, word2 varchar(255) not null default '', index(word)); show create table t1; insert into t1 (word) values ('ss'),(0xDF),(0xE4),('ae'); update t1 set word2=word; diff --git a/mysql-test/t/ctype_many.test b/mysql-test/t/ctype_many.test index 26057e7c997..454e2c63cbb 100644 --- a/mysql-test/t/ctype_many.test +++ b/mysql-test/t/ctype_many.test @@ -8,7 +8,7 @@ SET CHARACTER SET latin1; CREATE TABLE t1 ( comment CHAR(32) ASCII NOT NULL, - koi8_ru_f CHAR(32) CHARACTER SET koi8r NOT NULL + koi8_ru_f CHAR(32) CHARACTER SET koi8r NOT NULL default '' ) CHARSET=latin5; SHOW CREATE TABLE t1; @@ -142,13 +142,13 @@ INSERT INTO t1 (koi8_ru_f,comment) VALUES (_koi8r' SET CHARACTER SET utf8; SELECT koi8_ru_f,MIN(comment),COUNT(*) FROM t1 GROUP BY 1; -ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL; +ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL default ''; UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8); SET CHARACTER SET koi8r; SELECT * FROM t1; -ALTER TABLE t1 ADD bin_f CHAR(32) BYTE NOT NULL; +ALTER TABLE t1 ADD bin_f CHAR(32) BYTE NOT NULL default ''; UPDATE t1 SET bin_f=koi8_ru_f; SELECT COUNT(DISTINCT bin_f),COUNT(DISTINCT koi8_ru_f),COUNT(DISTINCT utf8_f) FROM t1; diff --git a/mysql-test/t/gis-rtree.test b/mysql-test/t/gis-rtree.test index 716dd38a119..da59c6ae5e4 100644 --- a/mysql-test/t/gis-rtree.test +++ b/mysql-test/t/gis-rtree.test @@ -120,7 +120,6 @@ INSERT INTO t1 (g) VALUES (GeomFromText('LineString(1 2, 2 3)')),(GeomFromText(' drop table t1; CREATE TABLE t1 ( - geoobjid INT NOT NULL, line LINESTRING NOT NULL, kind ENUM('po', 'pp', 'rr', 'dr', 'rd', 'ts', 'cl') NOT NULL DEFAULT 'po', name VARCHAR(32), diff --git a/mysql-test/t/index_merge_ror.test b/mysql-test/t/index_merge_ror.test index 223bd241d96..5375f9d1a31 100644 --- a/mysql-test/t/index_merge_ror.test +++ b/mysql-test/t/index_merge_ror.test @@ -8,13 +8,13 @@ drop table if exists t0,t1,t2; create table t1 ( /* Field names reflect value(rowid) distribution, st=STairs, swt= SaWTooth */ - st_a int not null, - swt1a int not null, - swt2a int not null, + st_a int not null default 0, + swt1a int not null default 0, + swt2a int not null default 0, - st_b int not null, - swt1b int not null, - swt2b int not null, + st_b int not null default 0, + swt1b int not null default 0, + swt2b int not null default 0, /* fields/keys for row retrieval tests */ key1 int, diff --git a/mysql-test/t/limit.test b/mysql-test/t/limit.test index 61c57c9b468..05c5c5298aa 100644 --- a/mysql-test/t/limit.test +++ b/mysql-test/t/limit.test @@ -6,7 +6,7 @@ drop table if exists t1; --enable_warnings -create table t1 (a int primary key, b int not null); +create table t1 (a int not null default 0 primary key, b int not null default 0); insert into t1 () values (); -- Testing default values insert into t1 values (1,1),(2,1),(3,1); update t1 set a=4 where b=1 limit 1; diff --git a/mysql-test/t/null.test b/mysql-test/t/null.test index 4bc6a4f051a..934b165f604 100644 --- a/mysql-test/t/null.test +++ b/mysql-test/t/null.test @@ -59,7 +59,7 @@ drop table t1; # # Test inserting and updating with NULL # -CREATE TABLE t1 (a varchar(16) NOT NULL, b smallint(6) NOT NULL, c datetime NOT NULL, d smallint(6) NOT NULL); +CREATE TABLE t1 (a varchar(16) NOT NULL default '', b smallint(6) NOT NULL default '', c datetime NOT NULL default '0000-00-00 00:00:00', d smallint(6) NOT NULL default 0); INSERT INTO t1 SET a = "", d= "2003-01-14 03:54:55"; UPDATE t1 SET d=1/NULL; UPDATE t1 SET d=NULL; diff --git a/mysql-test/t/order_by.test b/mysql-test/t/order_by.test index dd36cd95969..deb77baeb0e 100644 --- a/mysql-test/t/order_by.test +++ b/mysql-test/t/order_by.test @@ -206,7 +206,7 @@ CREATE TABLE t1 ( favo_tv varchar(50) NOT NULL default '', favo_eten varchar(50) NOT NULL default '', favo_muziek varchar(30) NOT NULL default '', - info text NOT NULL, + info text NOT NULL default '', ipnr varchar(30) NOT NULL default '', PRIMARY KEY (member_id) ) ENGINE=MyISAM PACK_KEYS=1; diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index 6aafbed6b97..dc512030a60 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -102,7 +102,7 @@ drop table t1; # Do a create table that tries to cover all types and options # create table t1 ( -type_bool bool not null, +type_bool bool not null default false, type_tiny tinyint not null auto_increment primary key, type_short smallint(3), type_mediumint mediumint, @@ -113,9 +113,9 @@ empty_char char(0), type_char char(2), type_varchar varchar(10), type_timestamp timestamp not null, -type_date date not null, -type_time time not null, -type_datetime datetime not null, +type_date date not null default '0000-00-00', +type_time time not null default '00:00:00', +type_datetime datetime not null default '0000-00-00 00:00:00', type_year year, type_enum enum ('red', 'green', 'blue'), type_set enum ('red', 'green', 'blue'), diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 4f556e34d51..c4dc1b36247 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -11,7 +11,7 @@ use test; drop table if exists t1; --enable_warnings create table t1 ( - id char(16) not null, + id char(16) not null default '', data int not null ); --disable_warnings diff --git a/mysql-test/t/type_blob.test b/mysql-test/t/type_blob.test index 20a501bb5ed..a45bc3c4c47 100644 --- a/mysql-test/t/type_blob.test +++ b/mysql-test/t/type_blob.test @@ -301,7 +301,7 @@ drop table t1; # Bug when blob is updated # -create table t1 (id integer auto_increment unique,imagem LONGBLOB not null); +create table t1 (id integer auto_increment unique,imagem LONGBLOB not null default ''); insert into t1 (id) values (1); select charset(load_file('../../std_data/words.dat')), diff --git a/mysql-test/t/type_ranges.test b/mysql-test/t/type_ranges.test index 5f035921064..1f80c9cf458 100644 --- a/mysql-test/t/type_ranges.test +++ b/mysql-test/t/type_ranges.test @@ -28,10 +28,10 @@ CREATE TABLE t1 ( date_time datetime, blob_col blob, tinyblob_col tinyblob, - mediumblob_col mediumblob not null, - longblob_col longblob not null, - options enum('one','two','tree') not null, - flags set('one','two','tree') not null, + mediumblob_col mediumblob not null default '', + longblob_col longblob not null default '', + options enum('one','two','tree') not null , + flags set('one','two','tree') not null default '', PRIMARY KEY (auto), KEY (utiny), KEY (tiny), diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index d93010d9915..1032783d991 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -881,19 +881,20 @@ err: int check_that_all_fields_are_given_values(THD *thd, TABLE *entry) { - if (!thd->abort_on_warning) // No check if not strict mode - return 0; - + int err= 0; for (Field **field=entry->field ; *field ; field++) { if ((*field)->query_id != thd->query_id && ((*field)->flags & NO_DEFAULT_VALUE_FLAG)) { - my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), (*field)->field_name); - return 1; + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_NO_DEFAULT_FOR_FIELD, + ER(ER_NO_DEFAULT_FOR_FIELD), + (*field)->field_name); + err= 1; } } - return 0; + return thd->abort_on_warning ? err : 0; } /***************************************************************************** From 3c5602faec281a4c32b5f4010856eb174559d04b Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Wed, 9 Feb 2005 18:17:40 -0800 Subject: [PATCH 003/204] Re-enable alter_table test for embedded server by moving grant-related test to grant.test and using replace_column to neuter the Privileges column in SHOW FULL COLUMNS. --- mysql-test/mysql-test-run.sh | 1 - mysql-test/r/alter_table.result | 14 +- mysql-test/r/alter_table.result.es | 483 ----------------------------- mysql-test/r/grant.result | 8 + mysql-test/t/alter_table.test | 20 +- mysql-test/t/grant.test | 20 ++ 6 files changed, 32 insertions(+), 514 deletions(-) delete mode 100644 mysql-test/r/alter_table.result.es diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index af432f37868..0bc68c3b6bb 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -1506,7 +1506,6 @@ run_testcase () # script soon anyway so it is not worth it spending the time if [ "x$USE_EMBEDDED_SERVER" = "x1" -a -z "$DO_TEST" ] ; then for t in \ - "alter_table" \ "bdb-deadlock" \ "connect" \ "ctype_latin1_de" \ diff --git a/mysql-test/r/alter_table.result b/mysql-test/r/alter_table.result index 7d2b3f01ae6..222477cece9 100644 --- a/mysql-test/r/alter_table.result +++ b/mysql-test/r/alter_table.result @@ -52,9 +52,9 @@ KEY NAME (NAME)); ALTER TABLE t1 CHANGE NAME NAME CHAR(80) not null; SHOW FULL COLUMNS FROM t1; Field Type Collation Null Key Default Extra Privileges Comment -GROUP_ID int(10) unsigned NULL PRI 0 select,insert,update,references -LANG_ID smallint(5) unsigned NULL PRI 0 select,insert,update,references -NAME char(80) latin1_swedish_ci MUL select,insert,update,references +GROUP_ID int(10) unsigned NULL PRI 0 # +LANG_ID smallint(5) unsigned NULL PRI 0 # +NAME char(80) latin1_swedish_ci MUL # DROP TABLE t1; create table t1 (n int); insert into t1 values(9),(3),(12),(10); @@ -117,14 +117,6 @@ name mysqltest drop table t1; drop database mysqltest; -create database mysqltest; -create table mysqltest.t1 (a int,b int,c int); -grant all on mysqltest.t1 to mysqltest_1@localhost; -alter table t1 rename t2; -ERROR 42000: INSERT,CREATE command denied to user 'mysqltest_1'@'localhost' for table 't2' -revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; -delete from mysql.user where user=_binary'mysqltest_1'; -drop database mysqltest; create table t1 (n1 int not null, n2 int, n3 int, n4 float, unique(n1), key (n1, n2, n3, n4), diff --git a/mysql-test/r/alter_table.result.es b/mysql-test/r/alter_table.result.es deleted file mode 100644 index 4f93b40a573..00000000000 --- a/mysql-test/r/alter_table.result.es +++ /dev/null @@ -1,483 +0,0 @@ -drop table if exists t1,t2; -drop database if exists mysqltest; -create table t1 ( -col1 int not null auto_increment primary key, -col2 varchar(30) not null, -col3 varchar (20) not null, -col4 varchar(4) not null, -col5 enum('PENDING', 'ACTIVE', 'DISABLED') not null, -col6 int not null, to_be_deleted int); -insert into t1 values (2,4,3,5,"PENDING",1,7); -alter table t1 -add column col4_5 varchar(20) not null after col4, -add column col7 varchar(30) not null after col5, -add column col8 datetime not null, drop column to_be_deleted, -change column col2 fourth varchar(30) not null after col3, -modify column col6 int not null first; -select * from t1; -col6 col1 col3 fourth col4 col4_5 col5 col7 col8 -1 2 3 4 5 PENDING 0000-00-00 00:00:00 -drop table t1; -create table t1 (bandID MEDIUMINT UNSIGNED NOT NULL PRIMARY KEY, payoutID SMALLINT UNSIGNED NOT NULL); -insert into t1 (bandID,payoutID) VALUES (1,6),(2,6),(3,4),(4,9),(5,10),(6,1),(7,12),(8,12); -alter table t1 add column new_col int, order by payoutid,bandid; -select * from t1; -bandID payoutID new_col -6 1 NULL -3 4 NULL -1 6 NULL -2 6 NULL -4 9 NULL -5 10 NULL -7 12 NULL -8 12 NULL -alter table t1 order by bandid,payoutid; -select * from t1; -bandID payoutID new_col -1 6 NULL -2 6 NULL -3 4 NULL -4 9 NULL -5 10 NULL -6 1 NULL -7 12 NULL -8 12 NULL -drop table t1; -CREATE TABLE t1 ( -GROUP_ID int(10) unsigned DEFAULT '0' NOT NULL, -LANG_ID smallint(5) unsigned DEFAULT '0' NOT NULL, -NAME varchar(80) DEFAULT '' NOT NULL, -PRIMARY KEY (GROUP_ID,LANG_ID), -KEY NAME (NAME)); -ALTER TABLE t1 CHANGE NAME NAME CHAR(80) not null; -SHOW FULL COLUMNS FROM t1; -Field Type Collation Null Key Default Extra Privileges Comment -GROUP_ID int(10) unsigned NULL PRI 0 -LANG_ID smallint(5) unsigned NULL PRI 0 -NAME char(80) latin1_swedish_ci MUL -DROP TABLE t1; -create table t1 (n int); -insert into t1 values(9),(3),(12),(10); -alter table t1 order by n; -select * from t1; -n -3 -9 -10 -12 -drop table t1; -CREATE TABLE t1 ( -id int(11) unsigned NOT NULL default '0', -category_id tinyint(4) unsigned NOT NULL default '0', -type_id tinyint(4) unsigned NOT NULL default '0', -body text NOT NULL, -user_id int(11) unsigned NOT NULL default '0', -status enum('new','old') NOT NULL default 'new', -PRIMARY KEY (id) -) ENGINE=MyISAM; -ALTER TABLE t1 ORDER BY t1.id, t1.status, t1.type_id, t1.user_id, t1.body; -DROP TABLE t1; -CREATE TABLE t1 (AnamneseId int(10) unsigned NOT NULL auto_increment,B BLOB,PRIMARY KEY (AnamneseId)) engine=myisam; -insert into t1 values (null,"hello"); -LOCK TABLES t1 WRITE; -ALTER TABLE t1 ADD Column new_col int not null; -UNLOCK TABLES; -OPTIMIZE TABLE t1; -Table Op Msg_type Msg_text -test.t1 optimize status OK -DROP TABLE t1; -create table t1 (i int unsigned not null auto_increment primary key); -insert into t1 values (null),(null),(null),(null); -alter table t1 drop i,add i int unsigned not null auto_increment, drop primary key, add primary key (i); -select * from t1; -i -1 -2 -3 -4 -drop table t1; -create table t1 (name char(15)); -insert into t1 (name) values ("current"); -create database mysqltest; -create table mysqltest.t1 (name char(15)); -insert into mysqltest.t1 (name) values ("mysqltest"); -select * from t1; -name -current -select * from mysqltest.t1; -name -mysqltest -alter table t1 rename mysqltest.t1; -ERROR 42S01: Table 't1' already exists -select * from t1; -name -current -select * from mysqltest.t1; -name -mysqltest -drop table t1; -drop database mysqltest; -create database mysqltest; -create table mysqltest.t1 (a int,b int,c int); -grant all on mysqltest.t1 to mysqltest_1@localhost; -alter table t1 rename t2; -revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; -delete from mysql.user where user=_binary'mysqltest_1'; -drop database mysqltest; -create table t1 (n1 int not null, n2 int, n3 int, n4 float, -unique(n1), -key (n1, n2, n3, n4), -key (n2, n3, n4, n1), -key (n3, n4, n1, n2), -key (n4, n1, n2, n3) ); -alter table t1 disable keys; -show keys from t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 n1 1 n1 A 0 NULL NULL BTREE -t1 1 n1_2 1 n1 A NULL NULL NULL BTREE disabled -t1 1 n1_2 2 n2 A NULL NULL NULL YES BTREE disabled -t1 1 n1_2 3 n3 A NULL NULL NULL YES BTREE disabled -t1 1 n1_2 4 n4 A NULL NULL NULL YES BTREE disabled -t1 1 n2 1 n2 A NULL NULL NULL YES BTREE disabled -t1 1 n2 2 n3 A NULL NULL NULL YES BTREE disabled -t1 1 n2 3 n4 A NULL NULL NULL YES BTREE disabled -t1 1 n2 4 n1 A NULL NULL NULL BTREE disabled -t1 1 n3 1 n3 A NULL NULL NULL YES BTREE disabled -t1 1 n3 2 n4 A NULL NULL NULL YES BTREE disabled -t1 1 n3 3 n1 A NULL NULL NULL BTREE disabled -t1 1 n3 4 n2 A NULL NULL NULL YES BTREE disabled -t1 1 n4 1 n4 A NULL NULL NULL YES BTREE disabled -t1 1 n4 2 n1 A NULL NULL NULL BTREE disabled -t1 1 n4 3 n2 A NULL NULL NULL YES BTREE disabled -t1 1 n4 4 n3 A NULL NULL NULL YES BTREE disabled -insert into t1 values(10,RAND()*1000,RAND()*1000,RAND()); -insert into t1 values(9,RAND()*1000,RAND()*1000,RAND()); -insert into t1 values(8,RAND()*1000,RAND()*1000,RAND()); -insert into t1 values(7,RAND()*1000,RAND()*1000,RAND()); -insert into t1 values(6,RAND()*1000,RAND()*1000,RAND()); -insert into t1 values(5,RAND()*1000,RAND()*1000,RAND()); -insert into t1 values(4,RAND()*1000,RAND()*1000,RAND()); -insert into t1 values(3,RAND()*1000,RAND()*1000,RAND()); -insert into t1 values(2,RAND()*1000,RAND()*1000,RAND()); -insert into t1 values(1,RAND()*1000,RAND()*1000,RAND()); -alter table t1 enable keys; -show keys from t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 n1 1 n1 A 10 NULL NULL BTREE -t1 1 n1_2 1 n1 A 10 NULL NULL BTREE -t1 1 n1_2 2 n2 A 10 NULL NULL YES BTREE -t1 1 n1_2 3 n3 A 10 NULL NULL YES BTREE -t1 1 n1_2 4 n4 A 10 NULL NULL YES BTREE -t1 1 n2 1 n2 A 10 NULL NULL YES BTREE -t1 1 n2 2 n3 A 10 NULL NULL YES BTREE -t1 1 n2 3 n4 A 10 NULL NULL YES BTREE -t1 1 n2 4 n1 A 10 NULL NULL BTREE -t1 1 n3 1 n3 A 10 NULL NULL YES BTREE -t1 1 n3 2 n4 A 10 NULL NULL YES BTREE -t1 1 n3 3 n1 A 10 NULL NULL BTREE -t1 1 n3 4 n2 A 10 NULL NULL YES BTREE -t1 1 n4 1 n4 A 10 NULL NULL YES BTREE -t1 1 n4 2 n1 A 10 NULL NULL BTREE -t1 1 n4 3 n2 A 10 NULL NULL YES BTREE -t1 1 n4 4 n3 A 10 NULL NULL YES BTREE -drop table t1; -create table t1 (i int unsigned not null auto_increment primary key); -alter table t1 rename t2; -alter table t2 rename t1, add c char(10) comment "no comment"; -show columns from t1; -Field Type Null Key Default Extra -i int(10) unsigned PRI NULL auto_increment -c char(10) YES NULL -drop table t1; -create table t1 (a int, b int); -insert into t1 values(1,100), (2,100), (3, 100); -insert into t1 values(1,99), (2,99), (3, 99); -insert into t1 values(1,98), (2,98), (3, 98); -insert into t1 values(1,97), (2,97), (3, 97); -insert into t1 values(1,96), (2,96), (3, 96); -insert into t1 values(1,95), (2,95), (3, 95); -insert into t1 values(1,94), (2,94), (3, 94); -insert into t1 values(1,93), (2,93), (3, 93); -insert into t1 values(1,92), (2,92), (3, 92); -insert into t1 values(1,91), (2,91), (3, 91); -insert into t1 values(1,90), (2,90), (3, 90); -insert into t1 values(1,89), (2,89), (3, 89); -insert into t1 values(1,88), (2,88), (3, 88); -insert into t1 values(1,87), (2,87), (3, 87); -insert into t1 values(1,86), (2,86), (3, 86); -insert into t1 values(1,85), (2,85), (3, 85); -insert into t1 values(1,84), (2,84), (3, 84); -insert into t1 values(1,83), (2,83), (3, 83); -insert into t1 values(1,82), (2,82), (3, 82); -insert into t1 values(1,81), (2,81), (3, 81); -insert into t1 values(1,80), (2,80), (3, 80); -insert into t1 values(1,79), (2,79), (3, 79); -insert into t1 values(1,78), (2,78), (3, 78); -insert into t1 values(1,77), (2,77), (3, 77); -insert into t1 values(1,76), (2,76), (3, 76); -insert into t1 values(1,75), (2,75), (3, 75); -insert into t1 values(1,74), (2,74), (3, 74); -insert into t1 values(1,73), (2,73), (3, 73); -insert into t1 values(1,72), (2,72), (3, 72); -insert into t1 values(1,71), (2,71), (3, 71); -insert into t1 values(1,70), (2,70), (3, 70); -insert into t1 values(1,69), (2,69), (3, 69); -insert into t1 values(1,68), (2,68), (3, 68); -insert into t1 values(1,67), (2,67), (3, 67); -insert into t1 values(1,66), (2,66), (3, 66); -insert into t1 values(1,65), (2,65), (3, 65); -insert into t1 values(1,64), (2,64), (3, 64); -insert into t1 values(1,63), (2,63), (3, 63); -insert into t1 values(1,62), (2,62), (3, 62); -insert into t1 values(1,61), (2,61), (3, 61); -insert into t1 values(1,60), (2,60), (3, 60); -insert into t1 values(1,59), (2,59), (3, 59); -insert into t1 values(1,58), (2,58), (3, 58); -insert into t1 values(1,57), (2,57), (3, 57); -insert into t1 values(1,56), (2,56), (3, 56); -insert into t1 values(1,55), (2,55), (3, 55); -insert into t1 values(1,54), (2,54), (3, 54); -insert into t1 values(1,53), (2,53), (3, 53); -insert into t1 values(1,52), (2,52), (3, 52); -insert into t1 values(1,51), (2,51), (3, 51); -insert into t1 values(1,50), (2,50), (3, 50); -insert into t1 values(1,49), (2,49), (3, 49); -insert into t1 values(1,48), (2,48), (3, 48); -insert into t1 values(1,47), (2,47), (3, 47); -insert into t1 values(1,46), (2,46), (3, 46); -insert into t1 values(1,45), (2,45), (3, 45); -insert into t1 values(1,44), (2,44), (3, 44); -insert into t1 values(1,43), (2,43), (3, 43); -insert into t1 values(1,42), (2,42), (3, 42); -insert into t1 values(1,41), (2,41), (3, 41); -insert into t1 values(1,40), (2,40), (3, 40); -insert into t1 values(1,39), (2,39), (3, 39); -insert into t1 values(1,38), (2,38), (3, 38); -insert into t1 values(1,37), (2,37), (3, 37); -insert into t1 values(1,36), (2,36), (3, 36); -insert into t1 values(1,35), (2,35), (3, 35); -insert into t1 values(1,34), (2,34), (3, 34); -insert into t1 values(1,33), (2,33), (3, 33); -insert into t1 values(1,32), (2,32), (3, 32); -insert into t1 values(1,31), (2,31), (3, 31); -insert into t1 values(1,30), (2,30), (3, 30); -insert into t1 values(1,29), (2,29), (3, 29); -insert into t1 values(1,28), (2,28), (3, 28); -insert into t1 values(1,27), (2,27), (3, 27); -insert into t1 values(1,26), (2,26), (3, 26); -insert into t1 values(1,25), (2,25), (3, 25); -insert into t1 values(1,24), (2,24), (3, 24); -insert into t1 values(1,23), (2,23), (3, 23); -insert into t1 values(1,22), (2,22), (3, 22); -insert into t1 values(1,21), (2,21), (3, 21); -insert into t1 values(1,20), (2,20), (3, 20); -insert into t1 values(1,19), (2,19), (3, 19); -insert into t1 values(1,18), (2,18), (3, 18); -insert into t1 values(1,17), (2,17), (3, 17); -insert into t1 values(1,16), (2,16), (3, 16); -insert into t1 values(1,15), (2,15), (3, 15); -insert into t1 values(1,14), (2,14), (3, 14); -insert into t1 values(1,13), (2,13), (3, 13); -insert into t1 values(1,12), (2,12), (3, 12); -insert into t1 values(1,11), (2,11), (3, 11); -insert into t1 values(1,10), (2,10), (3, 10); -insert into t1 values(1,9), (2,9), (3, 9); -insert into t1 values(1,8), (2,8), (3, 8); -insert into t1 values(1,7), (2,7), (3, 7); -insert into t1 values(1,6), (2,6), (3, 6); -insert into t1 values(1,5), (2,5), (3, 5); -insert into t1 values(1,4), (2,4), (3, 4); -insert into t1 values(1,3), (2,3), (3, 3); -insert into t1 values(1,2), (2,2), (3, 2); -insert into t1 values(1,1), (2,1), (3, 1); -alter table t1 add unique (a,b), add key (b); -show keys from t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 a 1 a A NULL NULL NULL YES BTREE -t1 0 a 2 b A NULL NULL NULL YES BTREE -t1 1 b 1 b A 100 NULL NULL YES BTREE -analyze table t1; -Table Op Msg_type Msg_text -test.t1 analyze status OK -show keys from t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 a 1 a A 3 NULL NULL YES BTREE -t1 0 a 2 b A 300 NULL NULL YES BTREE -t1 1 b 1 b A 100 NULL NULL YES BTREE -drop table t1; -CREATE TABLE t1 (i int(10), index(i) ); -ALTER TABLE t1 DISABLE KEYS; -INSERT DELAYED INTO t1 VALUES(1),(2),(3); -ALTER TABLE t1 ENABLE KEYS; -drop table t1; -set names koi8r; -create table t1 (a char(10) character set koi8r); -insert into t1 values (''); -select a,hex(a) from t1; -a hex(a) - D4C5D3D4 -alter table t1 change a a char(10) character set cp1251; -select a,hex(a) from t1; -a hex(a) - F2E5F1F2 -alter table t1 change a a binary(10); -select a,hex(a) from t1; -a hex(a) - F2E5F1F2 -alter table t1 change a a char(10) character set cp1251; -select a,hex(a) from t1; -a hex(a) - F2E5F1F2 -alter table t1 change a a char(10) character set koi8r; -select a,hex(a) from t1; -a hex(a) - D4C5D3D4 -alter table t1 change a a varchar(10) character set cp1251; -select a,hex(a) from t1; -a hex(a) - F2E5F1F2 -alter table t1 change a a char(10) character set koi8r; -select a,hex(a) from t1; -a hex(a) - D4C5D3D4 -alter table t1 change a a text character set cp1251; -select a,hex(a) from t1; -a hex(a) - F2E5F1F2 -alter table t1 change a a char(10) character set koi8r; -select a,hex(a) from t1; -a hex(a) - D4C5D3D4 -show create table t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `a` char(10) character set koi8r default NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 -alter table t1 DEFAULT CHARACTER SET latin1; -show create table t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `a` char(10) character set koi8r default NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 -alter table t1 CONVERT TO CHARACTER SET latin1; -show create table t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `a` char(10) default NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 -alter table t1 DEFAULT CHARACTER SET cp1251; -show create table t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `a` char(10) character set latin1 default NULL -) ENGINE=MyISAM DEFAULT CHARSET=cp1251 -drop table t1; -create table t1 (myblob longblob,mytext longtext) -default charset latin1 collate latin1_general_cs; -show create table t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `myblob` longblob, - `mytext` longtext collate latin1_general_cs -) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs -alter table t1 character set latin2; -show create table t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `myblob` longblob, - `mytext` longtext character set latin1 collate latin1_general_cs -) ENGINE=MyISAM DEFAULT CHARSET=latin2 -drop table t1; -CREATE TABLE t1 ( -Host varchar(16) binary NOT NULL default '', -User varchar(16) binary NOT NULL default '', -PRIMARY KEY (Host,User) -) ENGINE=MyISAM; -ALTER TABLE t1 DISABLE KEYS; -LOCK TABLES t1 WRITE; -INSERT INTO t1 VALUES ('localhost','root'),('localhost',''),('games','monty'); -SHOW INDEX FROM t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 PRIMARY 1 Host A NULL NULL NULL BTREE -t1 0 PRIMARY 2 User A 3 NULL NULL BTREE -ALTER TABLE t1 ENABLE KEYS; -UNLOCK TABLES; -CHECK TABLES t1; -Table Op Msg_type Msg_text -test.t1 check status OK -DROP TABLE t1; -CREATE TABLE t1 ( -Host varchar(16) binary NOT NULL default '', -User varchar(16) binary NOT NULL default '', -PRIMARY KEY (Host,User), -KEY (Host) -) ENGINE=MyISAM; -ALTER TABLE t1 DISABLE KEYS; -SHOW INDEX FROM t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 PRIMARY 1 Host A NULL NULL NULL BTREE -t1 0 PRIMARY 2 User A 0 NULL NULL BTREE -t1 1 Host 1 Host A NULL NULL NULL BTREE disabled -LOCK TABLES t1 WRITE; -INSERT INTO t1 VALUES ('localhost','root'),('localhost',''); -SHOW INDEX FROM t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 PRIMARY 1 Host A NULL NULL NULL BTREE -t1 0 PRIMARY 2 User A 2 NULL NULL BTREE -t1 1 Host 1 Host A NULL NULL NULL BTREE disabled -ALTER TABLE t1 ENABLE KEYS; -SHOW INDEX FROM t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 PRIMARY 1 Host A NULL NULL NULL BTREE -t1 0 PRIMARY 2 User A 2 NULL NULL BTREE -t1 1 Host 1 Host A 1 NULL NULL BTREE -UNLOCK TABLES; -CHECK TABLES t1; -Table Op Msg_type Msg_text -test.t1 check status OK -LOCK TABLES t1 WRITE; -ALTER TABLE t1 RENAME t2; -UNLOCK TABLES; -select * from t2; -Host User -localhost -localhost root -DROP TABLE t2; -CREATE TABLE t1 ( -Host varchar(16) binary NOT NULL default '', -User varchar(16) binary NOT NULL default '', -PRIMARY KEY (Host,User), -KEY (Host) -) ENGINE=MyISAM; -LOCK TABLES t1 WRITE; -ALTER TABLE t1 DISABLE KEYS; -SHOW INDEX FROM t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 PRIMARY 1 Host A NULL NULL NULL BTREE -t1 0 PRIMARY 2 User A 0 NULL NULL BTREE -t1 1 Host 1 Host A NULL NULL NULL BTREE disabled -DROP TABLE t1; -CREATE TABLE t1 (a int PRIMARY KEY, b INT UNIQUE); -ALTER TABLE t1 DROP PRIMARY KEY; -SHOW CREATE TABLE t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `a` int(11) NOT NULL default '0', - `b` int(11) default NULL, - UNIQUE KEY `b` (`b`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 -ALTER TABLE t1 DROP PRIMARY KEY; -ERROR 42000: Can't DROP 'PRIMARY'; check that column/key exists -DROP TABLE t1; -create table t1 (a int, b int, key(a)); -insert into t1 values (1,1), (2,2); -alter table t1 drop key no_such_key; -ERROR 42000: Can't DROP 'no_such_key'; check that column/key exists -alter table t1 drop key a; -drop table t1; -create table t1 (a int); -alter table t1 rename to `t1\\`; -ERROR 42000: Incorrect table name 't1\\' -rename table t1 to `t1\\`; -ERROR 42000: Incorrect table name 't1\\' -drop table t1; diff --git a/mysql-test/r/grant.result b/mysql-test/r/grant.result index 22b34ebef62..bb37480aaf8 100644 --- a/mysql-test/r/grant.result +++ b/mysql-test/r/grant.result @@ -427,3 +427,11 @@ delete from mysql.columns_priv where user="mysqltest_3"; flush privileges; drop database mysqltest_1; drop database mysqltest_2; +create database mysqltest; +create table mysqltest.t1 (a int,b int,c int); +grant all on mysqltest.t1 to mysqltest_1@localhost; +alter table t1 rename t2; +ERROR 42000: INSERT,CREATE command denied to user 'mysqltest_1'@'localhost' for table 't2' +revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; +delete from mysql.user where user=_binary'mysqltest_1'; +drop database mysqltest; diff --git a/mysql-test/t/alter_table.test b/mysql-test/t/alter_table.test index c2277dc1755..92651442041 100644 --- a/mysql-test/t/alter_table.test +++ b/mysql-test/t/alter_table.test @@ -41,6 +41,7 @@ PRIMARY KEY (GROUP_ID,LANG_ID), KEY NAME (NAME)); #show table status like "t1"; ALTER TABLE t1 CHANGE NAME NAME CHAR(80) not null; +--replace_column 8 # SHOW FULL COLUMNS FROM t1; DROP TABLE t1; @@ -107,25 +108,6 @@ select * from mysqltest.t1; drop table t1; drop database mysqltest; -# -# Rights for renaming test (Bug #3270) -# -connect (root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK); -connection root; ---disable_warnings -create database mysqltest; ---enable_warnings -create table mysqltest.t1 (a int,b int,c int); -grant all on mysqltest.t1 to mysqltest_1@localhost; -connect (user1,localhost,mysqltest_1,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK); -connection user1; --- error 1142 -alter table t1 rename t2; -connection root; -revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; -delete from mysql.user where user=_binary'mysqltest_1'; -drop database mysqltest; - # # ALTER TABLE ... ENABLE/DISABLE KEYS diff --git a/mysql-test/t/grant.test b/mysql-test/t/grant.test index ca9ca9a5f97..2ca930d4fd2 100644 --- a/mysql-test/t/grant.test +++ b/mysql-test/t/grant.test @@ -369,3 +369,23 @@ delete from mysql.columns_priv where user="mysqltest_3"; flush privileges; drop database mysqltest_1; drop database mysqltest_2; + +# +# Rights for renaming test (Bug #3270) +# +connect (root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK); +connection root; +--disable_warnings +create database mysqltest; +--enable_warnings +create table mysqltest.t1 (a int,b int,c int); +grant all on mysqltest.t1 to mysqltest_1@localhost; +connect (user1,localhost,mysqltest_1,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK); +connection user1; +-- error 1142 +alter table t1 rename t2; +connection root; +revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; +delete from mysql.user where user=_binary'mysqltest_1'; +drop database mysqltest; + From eecb813c6bfd9ee5b5fdd1ffee9ae096e729479d Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Thu, 10 Feb 2005 18:08:30 -0800 Subject: [PATCH 004/204] Re-enable ctype_latin1_de test for embedded server (already passes, so it appears to have been accidently disabled) and enable ctype_ucs after moving a subtest that requires binlog to its own test file. --- mysql-test/mysql-test-run.sh | 2 -- mysql-test/r/ctype_ucs.result | 15 --------------- mysql-test/r/ctype_ucs_binlog.result | 15 +++++++++++++++ mysql-test/t/ctype_ucs.test | 17 ----------------- mysql-test/t/ctype_ucs_binlog.test | 19 +++++++++++++++++++ 5 files changed, 34 insertions(+), 34 deletions(-) create mode 100644 mysql-test/r/ctype_ucs_binlog.result create mode 100644 mysql-test/t/ctype_ucs_binlog.test diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 0bc68c3b6bb..f31d1af48aa 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -1508,8 +1508,6 @@ run_testcase () for t in \ "bdb-deadlock" \ "connect" \ - "ctype_latin1_de" \ - "ctype_ucs" \ "flush_block_commit" \ "grant2" \ "grant_cache" \ diff --git a/mysql-test/r/ctype_ucs.result b/mysql-test/r/ctype_ucs.result index 3f50d9dfa1b..115e35817d6 100644 --- a/mysql-test/r/ctype_ucs.result +++ b/mysql-test/r/ctype_ucs.result @@ -510,21 +510,6 @@ prepare stmt1 from @str2; execute stmt1 using @ivar; ? 1234 -SET TIMESTAMP=10000; -create table t2 (c char(30)) charset=ucs2; -set @v=convert('abc' using ucs2); -reset master; -insert into t2 values (@v); -show binlog events from 79; -Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.000001 79 User var 1 79 @`v`=_ucs2 0x006100620063 COLLATE ucs2_general_ci -master-bin.000001 119 Query 1 119 use `test`; insert into t2 values (@v) -/*!40019 SET @@session.max_insert_delayed_threads=0*/; -SET @`v`:=_ucs2 0x006100620063 COLLATE `ucs2_general_ci`; -use test; -SET TIMESTAMP=10000; -insert into t2 values (@v); -drop table t2; set names latin1; create table t1 (a enum('x','y','z') character set ucs2); show create table t1; diff --git a/mysql-test/r/ctype_ucs_binlog.result b/mysql-test/r/ctype_ucs_binlog.result new file mode 100644 index 00000000000..29718fa32a1 --- /dev/null +++ b/mysql-test/r/ctype_ucs_binlog.result @@ -0,0 +1,15 @@ +SET TIMESTAMP=10000; +create table t2 (c char(30)) charset=ucs2; +set @v=convert('abc' using ucs2); +reset master; +insert into t2 values (@v); +show binlog events from 79; +Log_name Pos Event_type Server_id Orig_log_pos Info +master-bin.000001 79 User var 1 79 @`v`=_ucs2 0x006100620063 COLLATE ucs2_general_ci +master-bin.000001 119 Query 1 119 use `test`; insert into t2 values (@v) +/*!40019 SET @@session.max_insert_delayed_threads=0*/; +SET @`v`:=_ucs2 0x006100620063 COLLATE `ucs2_general_ci`; +use test; +SET TIMESTAMP=10000; +insert into t2 values (@v); +drop table t2; diff --git a/mysql-test/t/ctype_ucs.test b/mysql-test/t/ctype_ucs.test index 1a0ba82d6ff..52c46a77c8c 100644 --- a/mysql-test/t/ctype_ucs.test +++ b/mysql-test/t/ctype_ucs.test @@ -328,23 +328,6 @@ set @str2 = convert(@str1 using ucs2); prepare stmt1 from @str2; execute stmt1 using @ivar; -# -# Check correct binlogging of UCS2 user variables (BUG#3875) -# -SET TIMESTAMP=10000; -create table t2 (c char(30)) charset=ucs2; -set @v=convert('abc' using ucs2); -reset master; -insert into t2 values (@v); -show binlog events from 79; -# more important than SHOW BINLOG EVENTS, mysqlbinlog (where we -# absolutely need variables names to be quoted and strings to be -# escaped). ---replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR ---exec $MYSQL_BINLOG --short-form $MYSQL_TEST_DIR/var/log/master-bin.000001 -drop table t2; - - # # Check that ucs2 works with ENUM and SET type # diff --git a/mysql-test/t/ctype_ucs_binlog.test b/mysql-test/t/ctype_ucs_binlog.test new file mode 100644 index 00000000000..57b831a9dcb --- /dev/null +++ b/mysql-test/t/ctype_ucs_binlog.test @@ -0,0 +1,19 @@ +--source include/not_embedded.inc + +# +# Check correct binlogging of UCS2 user variables (BUG#3875) +# +SET TIMESTAMP=10000; +create table t2 (c char(30)) charset=ucs2; +set @v=convert('abc' using ucs2); +reset master; +insert into t2 values (@v); +show binlog events from 79; +# more important than SHOW BINLOG EVENTS, mysqlbinlog (where we +# absolutely need variables names to be quoted and strings to be +# escaped). +--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR +--exec $MYSQL_BINLOG --short-form $MYSQL_TEST_DIR/var/log/master-bin.000001 +drop table t2; + + From 624f855e948c374bda73f0594e4be9090dd90be0 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Wed, 23 Feb 2005 17:58:20 -0800 Subject: [PATCH 005/204] Make sure that warning message when GROUP_CONCAT() cuts values is also updated with the correct number of lines. (Bug #8681) --- mysql-test/r/join_outer.result | 19 +++++++++++++++++++ mysql-test/t/join_outer.test | 11 +++++++++++ sql/item_sum.cc | 23 +++++++++++++++-------- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/mysql-test/r/join_outer.result b/mysql-test/r/join_outer.result index c045aa0d00a..1d15b2ba070 100644 --- a/mysql-test/r/join_outer.result +++ b/mysql-test/r/join_outer.result @@ -816,3 +816,22 @@ id text_id text_data 1 0 0-SV 2 10 10-SV DROP TABLE invoice, text_table; +set group_concat_max_len=5; +create table t1 (a int, b varchar(20)); +create table t2 (a int, c varchar(20)); +insert into t1 values (1,"aaaaaaaaaa"),(2,"bbbbbbbbbb"); +insert into t2 values (1,"cccccccccc"),(2,"dddddddddd"); +select group_concat(t1.b,t2.c) from t1 left join t2 using(a) group by t1.a; +group_concat(t1.b,t2.c) +aaaaa +bbbbb +Warnings: +Warning 1260 2 line(s) were cut by GROUP_CONCAT() +select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by t1.a; +group_concat(t1.b,t2.c) +aaaaa +bbbbb +Warnings: +Warning 1260 2 line(s) were cut by GROUP_CONCAT() +drop table t1, t2; +set group_concat_max_len=default; diff --git a/mysql-test/t/join_outer.test b/mysql-test/t/join_outer.test index d177a68e685..62e76525d84 100644 --- a/mysql-test/t/join_outer.test +++ b/mysql-test/t/join_outer.test @@ -582,3 +582,14 @@ SELECT invoice.id, invoice.text_id, text_table.text_data WHERE (invoice.id LIKE '%' OR text_table.text_data LIKE '%'); DROP TABLE invoice, text_table; + +# Bug #8681: Bad warning message when group_concat() exceeds max length +set group_concat_max_len=5; +create table t1 (a int, b varchar(20)); +create table t2 (a int, c varchar(20)); +insert into t1 values (1,"aaaaaaaaaa"),(2,"bbbbbbbbbb"); +insert into t2 values (1,"cccccccccc"),(2,"dddddddddd"); +select group_concat(t1.b,t2.c) from t1 left join t2 using(a) group by t1.a; +select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by t1.a; +drop table t1, t2; +set group_concat_max_len=default; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 6bd2cc00b3e..7e9c5d09136 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -1787,16 +1787,26 @@ Item_func_group_concat::Item_func_group_concat(THD *thd, void Item_func_group_concat::cleanup() { + THD *thd= current_thd; + DBUG_ENTER("Item_func_group_concat::cleanup"); Item_sum::cleanup(); + /* Adjust warning message to include total number of cut values */ + if (warning) + { + char warn_buff[MYSQL_ERRMSG_SIZE]; + sprintf(warn_buff, ER(ER_CUT_VALUE_GROUP_CONCAT), count_cut_values); + warning->set_msg(thd, warn_buff); + warning= 0; + } + /* Free table and tree if they belong to this item (if item have not pointer to original item from which was made copy => it own its objects ) */ if (!original) { - THD *thd= current_thd; if (table) { free_tmp_table(thd, table); @@ -1809,13 +1819,6 @@ void Item_func_group_concat::cleanup() tree_mode= 0; delete_tree(tree); } - if (warning) - { - char warn_buff[MYSQL_ERRMSG_SIZE]; - sprintf(warn_buff, ER(ER_CUT_VALUE_GROUP_CONCAT), count_cut_values); - warning->set_msg(thd, warn_buff); - warning= 0; - } } DBUG_VOID_RETURN; } @@ -2076,6 +2079,10 @@ String* Item_func_group_concat::val_str(String* str) if (null_value) return 0; if (count_cut_values && !warning) + /* + ER_CUT_VALUE_GROUP_CONCAT needs an argument, but this gets set in + Item_func_group_concat::cleanup(). + */ warning= push_warning(item_thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_CUT_VALUE_GROUP_CONCAT, ER(ER_CUT_VALUE_GROUP_CONCAT)); From 5eb393973f59364915a4cc9a7387f560d7453c5b Mon Sep 17 00:00:00 2001 From: "acurtis@pcgem.rdg.cyberkinetica.com" <> Date: Mon, 7 Mar 2005 13:37:10 +0000 Subject: [PATCH 006/204] Bug#6776 Failure to delete rows from mysql.func table caused by missing charset conversion for index read by pk. --- sql/sql_udf.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sql/sql_udf.cc b/sql/sql_udf.cc index 0bb8ac8a28b..6566e327a9e 100644 --- a/sql/sql_udf.cc +++ b/sql/sql_udf.cc @@ -493,8 +493,11 @@ int mysql_drop_function(THD *thd,const LEX_STRING *udf_name) tables.real_name= tables.alias= (char*) "func"; if (!(table = open_ltable(thd,&tables,TL_WRITE))) goto err; - if (!table->file->index_read_idx(table->record[0],0,(byte*) udf_name->str, - (uint) udf_name->length, + table->field[0]->store(udf_name.str, udf_name.length, system_charset_info); + table->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS); + if (!table->file->index_read_idx(table->record[0], 0, + (byte*) table->field[0]->ptr, + table->key_info[0].key_length HA_READ_KEY_EXACT)) { int error; From edaf9d6177f254bd25e8e925519b9d6af5079fc6 Mon Sep 17 00:00:00 2001 From: "joreland@mysql.com" <> Date: Sun, 20 Mar 2005 20:07:12 +0100 Subject: [PATCH 007/204] ndb - Fix uninit variable (potential segv) in Dbacc::sendNextScanConf discovered by magnus addition in "globals_list" --- ndb/src/kernel/blocks/dbacc/DbaccMain.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp b/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp index a82c96beebd..f3d5b8a89ef 100644 --- a/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp +++ b/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp @@ -11242,10 +11242,10 @@ void Dbacc::execACC_CHECK_SCAN(Signal* signal) operationRecPtr.i = scanPtr.p->scanFirstQueuedOp; ptrCheckGuard(operationRecPtr, coprecsize, operationrec); takeOutReadyScanQueue(signal); + fragrecptr.i = operationRecPtr.p->fragptr; + ptrCheckGuard(fragrecptr, cfragmentsize, fragmentrec); if (operationRecPtr.p->elementIsDisappeared == ZTRUE) { jam(); - fragrecptr.i = operationRecPtr.p->fragptr; - ptrCheckGuard(fragrecptr, cfragmentsize, fragmentrec); if (fragrecptr.p->createLcp == ZTRUE) { if (remainingUndoPages() < ZMIN_UNDO_PAGES_AT_COMMIT) { jam(); @@ -11890,8 +11890,6 @@ void Dbacc::sendNextScanConf(Signal* signal) return; }//if - fragrecptr.i = operationRecPtr.p->fragptr; - ptrCheckGuard(fragrecptr, cfragmentsize, fragmentrec); if (fragrecptr.p->keyLength != 0) { jam(); signal->theData[0] = scanPtr.p->scanUserptr; From d4b20f4a86aee448ed547be52d91001ada422319 Mon Sep 17 00:00:00 2001 From: "dlenev@brandersnatch.localdomain" <> Date: Sun, 27 Mar 2005 16:15:21 +0400 Subject: [PATCH 008/204] Fix for bugs #5859 "DROP TABLE does not drop triggers" and #6559 "DROP DATABASE forgets to drop triggers". If we drop table we should also drop all triggers associated with it. To do this we have to check for existence of .TRG file when we are dropping table and delete it too. --- mysql-test/r/trigger.result | 16 ++++++++++++++++ mysql-test/t/trigger.test | 20 ++++++++++++++++++++ sql/handler.cc | 1 + sql/mysql_priv.h | 1 + sql/sql_table.cc | 12 ++++++++++++ sql/sql_trigger.cc | 3 ++- 6 files changed, 52 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/trigger.result b/mysql-test/r/trigger.result index 4a85097cfce..cf0e0e8f564 100644 --- a/mysql-test/r/trigger.result +++ b/mysql-test/r/trigger.result @@ -1,5 +1,6 @@ drop table if exists t1, t2; drop view if exists v1; +drop database if exists mysqltest; create table t1 (i int); create trigger trg before insert on t1 for each row set @a:=1; set @a:=0; @@ -190,3 +191,18 @@ select @del_before, @del_after; drop trigger t1.trg1; drop trigger t1.trg2; drop table t1; +create table t1 (a int); +create trigger trg1 before insert on t1 for each row set new.a= 10; +drop table t1; +create table t1 (a int); +insert into t1 values (); +select * from t1; +a +NULL +drop table t1; +create database mysqltest; +use mysqltest; +create table t1 (i int); +create trigger trg1 before insert on t1 for each row set @a:= 1; +drop database mysqltest; +use test; diff --git a/mysql-test/t/trigger.test b/mysql-test/t/trigger.test index bf75f09d553..53144cf3591 100644 --- a/mysql-test/t/trigger.test +++ b/mysql-test/t/trigger.test @@ -5,6 +5,7 @@ --disable_warnings drop table if exists t1, t2; drop view if exists v1; +drop database if exists mysqltest; --enable_warnings create table t1 (i int); @@ -229,3 +230,22 @@ select @del_before, @del_after; drop trigger t1.trg1; drop trigger t1.trg2; drop table t1; + +# Test for bug #5859 "DROP TABLE does not drop triggers". Trigger should not +# magically reappear when we recreate dropped table. +create table t1 (a int); +create trigger trg1 before insert on t1 for each row set new.a= 10; +drop table t1; +create table t1 (a int); +insert into t1 values (); +select * from t1; +drop table t1; + +# Test for bug #6559 "DROP DATABASE forgets to drop triggers". +create database mysqltest; +use mysqltest; +create table t1 (i int); +create trigger trg1 before insert on t1 for each row set @a:= 1; +# This should succeed +drop database mysqltest; +use test; diff --git a/sql/handler.cc b/sql/handler.cc index 4a01003f418..88b5fcef2c6 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -2366,6 +2366,7 @@ TYPELIB *ha_known_exts(void) known_extensions_id= mysys_usage_id; found_exts.push_back((char*) ".db"); + found_exts.push_back((char*) triggers_file_ext); for (types= sys_table_types; types->type; types++) { if (*types->value == SHOW_OPTION_YES) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 7e4c6675e45..2685da9780b 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -1044,6 +1044,7 @@ extern const char *first_keyword, *my_localhost, *delayed_user, *binary_keyword; extern const char **errmesg; /* Error messages */ extern const char *myisam_recover_options_str; extern const char *in_left_expr_name, *in_additional_cond; +extern const char * const triggers_file_ext; extern Eq_creator eq_creator; extern Ne_creator ne_creator; extern Gt_creator gt_creator; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index b125eeaf03a..14b57cf580f 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -257,7 +257,19 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, /* Delete the table definition file */ strmov(end,reg_ext); if (!(new_error=my_delete(path,MYF(MY_WME)))) + { some_tables_deleted=1; + /* + Destroy triggers for this table if there are any. + + We won't need this as soon as we will have new .FRM format, + in which we will store trigger definitions in the same .FRM + files as table descriptions. + */ + strmov(end, triggers_file_ext); + if (!access(path, F_OK)) + new_error= my_delete(path, MYF(MY_WME)); + } error|= new_error; } } diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 110841e8fd4..5b6f12eab52 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -4,7 +4,8 @@ #include "parse_file.h" static const LEX_STRING triggers_file_type= {(char *)"TRIGGERS", 8}; -static const char * const triggers_file_ext= ".TRG"; + +const char * const triggers_file_ext= ".TRG"; /* Table of .TRG file field descriptors. From 1659dacab1b2a0228c032e5a08d1b8ce2da69eac Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Mon, 28 Mar 2005 15:13:31 +0300 Subject: [PATCH 009/204] fixed mechanism of detection selection from table wich we update (BUG##9398, BUG#8703) fixed wrong join view detection in multi-delete which lead to server crash --- mysql-test/r/lowercase_view.result | 105 ++++++++++++++++++++-- mysql-test/r/view.result | 136 +++++++++++++++++++++++++++- mysql-test/t/lowercase_view.test | 107 ++++++++++++++++++++-- mysql-test/t/view.test | 138 ++++++++++++++++++++++++++++- sql/sql_base.cc | 64 ++++++------- sql/sql_class.cc | 3 +- sql/sql_class.h | 2 + sql/sql_delete.cc | 39 ++++---- sql/sql_derived.cc | 9 +- sql/sql_lex.cc | 73 +-------------- sql/sql_lex.h | 5 +- sql/sql_parse.cc | 10 --- sql/sql_prepare.cc | 3 + sql/sql_select.cc | 9 +- sql/sql_update.cc | 23 ++--- 15 files changed, 561 insertions(+), 165 deletions(-) diff --git a/mysql-test/r/lowercase_view.result b/mysql-test/r/lowercase_view.result index 0644b32015c..37252c6dde7 100644 --- a/mysql-test/r/lowercase_view.result +++ b/mysql-test/r/lowercase_view.result @@ -11,16 +11,109 @@ vie CREATE ALGORITHM=UNDEFINED VIEW `mysqltest`.`vie` AS select `mysqltest`.`tab drop database MySQLTest; use test; create table t1Aa (col1 int); -create table t2Aa (col1 int); -create view v1Aa as select * from t1Aa; -create view v2Aa as select * from v1Aa; -update v2aA set col1 = (select max(col1) from v1aA); +create table t2aA (col1 int); +create view v1Aa as select * from t1aA; +create view v2aA as select * from v1aA; +create view v3Aa as select v2Aa.col1 from v2aA,t2Aa where v2Aa.col1 = t2aA.col1; +update v2aA set col1 = (select max(col1) from v1Aa); ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause -delete from v2aA where col1 = (select max(col1) from v1aA); +update v2Aa set col1 = (select max(col1) from t1Aa); ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +update v2aA set col1 = (select max(col1) from v2Aa); +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +update v2aA,t2Aa set v2Aa.col1 = (select max(col1) from v1aA) where v2aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +update t1aA,t2Aa set t1Aa.col1 = (select max(col1) from v1Aa) where t1aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't1aa' for update in FROM clause +update v1aA,t2Aa set v1Aa.col1 = (select max(col1) from v1aA) where v1Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v1aa' for update in FROM clause +update t2Aa,v2Aa set v2aA.col1 = (select max(col1) from v1aA) where v2Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't2aa' for update in FROM clause +update t2Aa,t1Aa set t1aA.col1 = (select max(col1) from v1Aa) where t1Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't2aa' for update in FROM clause +update t2Aa,v1aA set v1Aa.col1 = (select max(col1) from v1aA) where v1Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't2aa' for update in FROM clause +update v2aA,t2Aa set v2Aa.col1 = (select max(col1) from t1aA) where v2aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +update t1Aa,t2Aa set t1aA.col1 = (select max(col1) from t1Aa) where t1aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't1aa' for update in FROM clause +update v1aA,t2Aa set v1Aa.col1 = (select max(col1) from t1Aa) where v1aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v1aa' for update in FROM clause +update t2Aa,v2Aa set v2aA.col1 = (select max(col1) from t1aA) where v2Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't2aa' for update in FROM clause +update t2Aa,t1Aa set t1aA.col1 = (select max(col1) from t1Aa) where t1aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't2aa' for update in FROM clause +update t2Aa,v1Aa set v1aA.col1 = (select max(col1) from t1Aa) where v1Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't2aa' for update in FROM clause +update v2aA,t2Aa set v2Aa.col1 = (select max(col1) from v2aA) where v2Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +update t1aA,t2Aa set t1Aa.col1 = (select max(col1) from v2aA) where t1aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't1aa' for update in FROM clause +update v1aA,t2Aa set v1Aa.col1 = (select max(col1) from v2Aa) where v1aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v1aa' for update in FROM clause +update t2Aa,v2aA set v2Aa.col1 = (select max(col1) from v2aA) where v2Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't2aa' for update in FROM clause +update t2Aa,t1Aa set t1aA.col1 = (select max(col1) from v2aA) where t1Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't2aa' for update in FROM clause +update t2Aa,v1Aa set v1aA.col1 = (select max(col1) from v2Aa) where v1Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't2aa' for update in FROM clause +update v3aA set v3Aa.col1 = (select max(col1) from v1aA); +ERROR HY000: You can't specify target table 'v3aa' for update in FROM clause +update v3aA set v3Aa.col1 = (select max(col1) from t1aA); +ERROR HY000: You can't specify target table 'v3aa' for update in FROM clause +update v3aA set v3Aa.col1 = (select max(col1) from v2aA); +ERROR HY000: You can't specify target table 'v3aa' for update in FROM clause +update v3aA set v3Aa.col1 = (select max(col1) from v3aA); +ERROR HY000: You can't specify target table 'v3aa' for update in FROM clause +delete from v2Aa where col1 = (select max(col1) from v1Aa); +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +delete from v2aA where col1 = (select max(col1) from t1Aa); +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +delete from v2Aa where col1 = (select max(col1) from v2aA); +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +delete v2Aa from v2aA,t2Aa where (select max(col1) from v1aA) > 0 and v2Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +delete t1aA from t1Aa,t2Aa where (select max(col1) from v1Aa) > 0 and t1aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't1aa' for update in FROM clause +delete v1aA from v1Aa,t2Aa where (select max(col1) from v1aA) > 0 and v1Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v1aa' for update in FROM clause +delete v2aA from v2Aa,t2Aa where (select max(col1) from t1Aa) > 0 and v2aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +delete t1aA from t1Aa,t2Aa where (select max(col1) from t1aA) > 0 and t1Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't1aa' for update in FROM clause +delete v1aA from v1Aa,t2Aa where (select max(col1) from t1aA) > 0 and v1aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v1aa' for update in FROM clause +delete v2Aa from v2aA,t2Aa where (select max(col1) from v2Aa) > 0 and v2aA.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +delete t1Aa from t1aA,t2Aa where (select max(col1) from v2Aa) > 0 and t1Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 't1aa' for update in FROM clause +delete v1Aa from v1aA,t2Aa where (select max(col1) from v2aA) > 0 and v1Aa.col1 = t2aA.col1; +ERROR HY000: You can't specify target table 'v1aa' for update in FROM clause +insert into v2Aa values ((select max(col1) from v1aA)); +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +insert into t1aA values ((select max(col1) from v1Aa)); +ERROR HY000: You can't specify target table 't1aa' for update in FROM clause insert into v2aA values ((select max(col1) from v1aA)); ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause -drop view v2Aa,v1Aa; +insert into v2Aa values ((select max(col1) from t1Aa)); +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +insert into t1aA values ((select max(col1) from t1Aa)); +ERROR HY000: You can't specify target table 't1aa' for update in FROM clause +insert into v2aA values ((select max(col1) from t1aA)); +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +insert into v2Aa values ((select max(col1) from v2aA)); +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +insert into t1Aa values ((select max(col1) from v2Aa)); +ERROR HY000: You can't specify target table 't1aa' for update in FROM clause +insert into v2aA values ((select max(col1) from v2Aa)); +ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause +insert into v3Aa (col1) values ((select max(col1) from v1Aa)); +ERROR HY000: You can't specify target table 'v3aa' for update in FROM clause +insert into v3aA (col1) values ((select max(col1) from t1aA)); +ERROR HY000: You can't specify target table 'v3aa' for update in FROM clause +insert into v3Aa (col1) values ((select max(col1) from v2aA)); +ERROR HY000: You can't specify target table 'v3aa' for update in FROM clause +drop view v3aA,v2Aa,v1aA; drop table t1Aa,t2Aa; create table t1Aa (col1 int); create view v1Aa as select col1 from t1Aa as AaA; diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index ae1bb42cc29..eff839a6bc7 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -1176,13 +1176,121 @@ create table t1 (col1 int); create table t2 (col1 int); create view v1 as select * from t1; create view v2 as select * from v1; +create view v3 as select v2.col1 from v2,t2 where v2.col1 = t2.col1; update v2 set col1 = (select max(col1) from v1); ERROR HY000: You can't specify target table 'v2' for update in FROM clause +update v2 set col1 = (select max(col1) from t1); +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +update v2 set col1 = (select max(col1) from v2); +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +update v2,t2 set v2.col1 = (select max(col1) from v1) where v2.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +update t1,t2 set t1.col1 = (select max(col1) from v1) where t1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't1' for update in FROM clause +update v1,t2 set v1.col1 = (select max(col1) from v1) where v1.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v1' for update in FROM clause +update t2,v2 set v2.col1 = (select max(col1) from v1) where v2.col1 = t2.col1; +ERROR HY000: You can't specify target table 't2' for update in FROM clause +update t2,t1 set t1.col1 = (select max(col1) from v1) where t1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't2' for update in FROM clause +update t2,v1 set v1.col1 = (select max(col1) from v1) where v1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't2' for update in FROM clause +update v2,t2 set v2.col1 = (select max(col1) from t1) where v2.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +update t1,t2 set t1.col1 = (select max(col1) from t1) where t1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't1' for update in FROM clause +update v1,t2 set v1.col1 = (select max(col1) from t1) where v1.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v1' for update in FROM clause +update t2,v2 set v2.col1 = (select max(col1) from t1) where v2.col1 = t2.col1; +ERROR HY000: You can't specify target table 't2' for update in FROM clause +update t2,t1 set t1.col1 = (select max(col1) from t1) where t1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't2' for update in FROM clause +update t2,v1 set v1.col1 = (select max(col1) from t1) where v1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't2' for update in FROM clause +update v2,t2 set v2.col1 = (select max(col1) from v2) where v2.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +update t1,t2 set t1.col1 = (select max(col1) from v2) where t1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't1' for update in FROM clause +update v1,t2 set v1.col1 = (select max(col1) from v2) where v1.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v1' for update in FROM clause +update t2,v2 set v2.col1 = (select max(col1) from v2) where v2.col1 = t2.col1; +ERROR HY000: You can't specify target table 't2' for update in FROM clause +update t2,t1 set t1.col1 = (select max(col1) from v2) where t1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't2' for update in FROM clause +update t2,v1 set v1.col1 = (select max(col1) from v2) where v1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't2' for update in FROM clause +update v3 set v3.col1 = (select max(col1) from v1); +ERROR HY000: You can't specify target table 'v3' for update in FROM clause +update v3 set v3.col1 = (select max(col1) from t1); +ERROR HY000: You can't specify target table 'v3' for update in FROM clause +update v3 set v3.col1 = (select max(col1) from v2); +ERROR HY000: You can't specify target table 'v3' for update in FROM clause +update v3 set v3.col1 = (select max(col1) from v3); +ERROR HY000: You can't specify target table 'v3' for update in FROM clause delete from v2 where col1 = (select max(col1) from v1); ERROR HY000: You can't specify target table 'v2' for update in FROM clause +delete from v2 where col1 = (select max(col1) from t1); +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +delete from v2 where col1 = (select max(col1) from v2); +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +delete v2 from v2,t2 where (select max(col1) from v1) > 0 and v2.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +delete t1 from t1,t2 where (select max(col1) from v1) > 0 and t1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't1' for update in FROM clause +delete v1 from v1,t2 where (select max(col1) from v1) > 0 and v1.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v1' for update in FROM clause +delete v2 from v2,t2 where (select max(col1) from t1) > 0 and v2.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +delete t1 from t1,t2 where (select max(col1) from t1) > 0 and t1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't1' for update in FROM clause +delete v1 from v1,t2 where (select max(col1) from t1) > 0 and v1.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v1' for update in FROM clause +delete v2 from v2,t2 where (select max(col1) from v2) > 0 and v2.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +delete t1 from t1,t2 where (select max(col1) from v2) > 0 and t1.col1 = t2.col1; +ERROR HY000: You can't specify target table 't1' for update in FROM clause +delete v1 from v1,t2 where (select max(col1) from v2) > 0 and v1.col1 = t2.col1; +ERROR HY000: You can't specify target table 'v1' for update in FROM clause insert into v2 values ((select max(col1) from v1)); ERROR HY000: You can't specify target table 'v2' for update in FROM clause -drop view v2,v1; +insert into t1 values ((select max(col1) from v1)); +ERROR HY000: You can't specify target table 't1' for update in FROM clause +insert into v2 values ((select max(col1) from v1)); +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +insert into v2 values ((select max(col1) from t1)); +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +insert into t1 values ((select max(col1) from t1)); +ERROR HY000: You can't specify target table 't1' for update in FROM clause +insert into v2 values ((select max(col1) from t1)); +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +insert into v2 values ((select max(col1) from v2)); +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +insert into t1 values ((select max(col1) from v2)); +ERROR HY000: You can't specify target table 't1' for update in FROM clause +insert into v2 values ((select max(col1) from v2)); +ERROR HY000: You can't specify target table 'v2' for update in FROM clause +insert into v3 (col1) values ((select max(col1) from v1)); +ERROR HY000: You can't specify target table 'v3' for update in FROM clause +insert into v3 (col1) values ((select max(col1) from t1)); +ERROR HY000: You can't specify target table 'v3' for update in FROM clause +insert into v3 (col1) values ((select max(col1) from v2)); +ERROR HY000: You can't specify target table 'v3' for update in FROM clause +insert into v3 (col1) values ((select CONVERT_TZ('20050101000000','UTC','MET') from v2)); +ERROR HY000: You can't specify target table 'v3' for update in FROM clause +insert into v3 (col1) values ((select CONVERT_TZ('20050101000000','UTC','MET') from t2)); +insert into mysql.time_zone values ('', (select CONVERT_TZ('20050101000000','UTC','MET') from t2)); +ERROR 23000: Column 'Use_leap_seconds' cannot be null +create algorithm=temptable view v4 as select * from t1; +insert into t1 values (1),(2),(3); +insert into t1 (col1) values ((select max(col1) from v4)); +select * from t1; +col1 +NULL +1 +2 +3 +3 +drop view v4,v3,v2,v1; drop table t1,t2; create table t1 (s1 int); create view v1 as select * from t1; @@ -1687,6 +1795,8 @@ delete from v3; ERROR HY000: Can not delete from join view 'test.v3' delete v3,t1 from v3,t1; ERROR HY000: Can not delete from join view 'test.v3' +delete t1,v3 from t1,v3; +ERROR HY000: Can not delete from join view 'test.v3' delete from t1; prepare stmt1 from "insert into v3(a) values (?);"; set @a= 100; @@ -1778,3 +1888,27 @@ select s2 from v1 vq1 where 2 = (select count(*) aa from v1 vq2 having vq1.s2 = s2 drop view v1; drop table t1; +CREATE TABLE t1 (a1 int); +CREATE TABLE t2 (a2 int); +INSERT INTO t1 VALUES (1), (2), (3), (4); +INSERT INTO t2 VALUES (1), (2), (3); +CREATE VIEW v1(a,b) AS SELECT a1,a2 FROM t1 JOIN t2 ON a1=a2 WHERE a1>1; +SELECT * FROM v1; +a b +2 2 +3 3 +CREATE TABLE t3 SELECT * FROM v1; +SELECT * FROM t3; +a b +2 2 +3 3 +DROP VIEW v1; +DROP TABLE t1,t2,t3; +create table t1 (a int); +create table t2 like t1; +create table t3 like t1; +create view v1 as select t1.a x, t2.a y from t1 join t2 where t1.a=t2.a; +insert into t3 select x from v1; +insert into t2 select x from v1; +drop view v1; +drop table t1,t2,t3; diff --git a/mysql-test/t/lowercase_view.test b/mysql-test/t/lowercase_view.test index 4b688cfb922..b39223f71d5 100644 --- a/mysql-test/t/lowercase_view.test +++ b/mysql-test/t/lowercase_view.test @@ -19,18 +19,109 @@ use test; # test of updating and fetching from the same table check # create table t1Aa (col1 int); -create table t2Aa (col1 int); -create view v1Aa as select * from t1Aa; -create view v2Aa as select * from v1Aa; +create table t2aA (col1 int); +create view v1Aa as select * from t1aA; +create view v2aA as select * from v1aA; +create view v3Aa as select v2Aa.col1 from v2aA,t2Aa where v2Aa.col1 = t2aA.col1; -- error 1093 -update v2aA set col1 = (select max(col1) from v1aA); -#update v2aA,t2aA set v2aA.col1 = (select max(col1) from v1aA) where v2aA.col1 = t2aA.col1; +update v2aA set col1 = (select max(col1) from v1Aa); -- error 1093 -delete from v2aA where col1 = (select max(col1) from v1aA); -#delete v2aA from v2aA,t2aA where (select max(col1) from v1aA) > 0 and v2aA.col1 = t2aA.col1; +update v2Aa set col1 = (select max(col1) from t1Aa); +-- error 1093 +update v2aA set col1 = (select max(col1) from v2Aa); +-- error 1093 +update v2aA,t2Aa set v2Aa.col1 = (select max(col1) from v1aA) where v2aA.col1 = t2aA.col1; +-- error 1093 +update t1aA,t2Aa set t1Aa.col1 = (select max(col1) from v1Aa) where t1aA.col1 = t2aA.col1; +-- error 1093 +update v1aA,t2Aa set v1Aa.col1 = (select max(col1) from v1aA) where v1Aa.col1 = t2aA.col1; +-- error 1093 +update t2Aa,v2Aa set v2aA.col1 = (select max(col1) from v1aA) where v2Aa.col1 = t2aA.col1; +-- error 1093 +update t2Aa,t1Aa set t1aA.col1 = (select max(col1) from v1Aa) where t1Aa.col1 = t2aA.col1; +-- error 1093 +update t2Aa,v1aA set v1Aa.col1 = (select max(col1) from v1aA) where v1Aa.col1 = t2aA.col1; +-- error 1093 +update v2aA,t2Aa set v2Aa.col1 = (select max(col1) from t1aA) where v2aA.col1 = t2aA.col1; +-- error 1093 +update t1Aa,t2Aa set t1aA.col1 = (select max(col1) from t1Aa) where t1aA.col1 = t2aA.col1; +-- error 1093 +update v1aA,t2Aa set v1Aa.col1 = (select max(col1) from t1Aa) where v1aA.col1 = t2aA.col1; +-- error 1093 +update t2Aa,v2Aa set v2aA.col1 = (select max(col1) from t1aA) where v2Aa.col1 = t2aA.col1; +-- error 1093 +update t2Aa,t1Aa set t1aA.col1 = (select max(col1) from t1Aa) where t1aA.col1 = t2aA.col1; +-- error 1093 +update t2Aa,v1Aa set v1aA.col1 = (select max(col1) from t1Aa) where v1Aa.col1 = t2aA.col1; +-- error 1093 +update v2aA,t2Aa set v2Aa.col1 = (select max(col1) from v2aA) where v2Aa.col1 = t2aA.col1; +-- error 1093 +update t1aA,t2Aa set t1Aa.col1 = (select max(col1) from v2aA) where t1aA.col1 = t2aA.col1; +-- error 1093 +update v1aA,t2Aa set v1Aa.col1 = (select max(col1) from v2Aa) where v1aA.col1 = t2aA.col1; +-- error 1093 +update t2Aa,v2aA set v2Aa.col1 = (select max(col1) from v2aA) where v2Aa.col1 = t2aA.col1; +-- error 1093 +update t2Aa,t1Aa set t1aA.col1 = (select max(col1) from v2aA) where t1Aa.col1 = t2aA.col1; +-- error 1093 +update t2Aa,v1Aa set v1aA.col1 = (select max(col1) from v2Aa) where v1Aa.col1 = t2aA.col1; +-- error 1093 +update v3aA set v3Aa.col1 = (select max(col1) from v1aA); +-- error 1093 +update v3aA set v3Aa.col1 = (select max(col1) from t1aA); +-- error 1093 +update v3aA set v3Aa.col1 = (select max(col1) from v2aA); +-- error 1093 +update v3aA set v3Aa.col1 = (select max(col1) from v3aA); +-- error 1093 +delete from v2Aa where col1 = (select max(col1) from v1Aa); +-- error 1093 +delete from v2aA where col1 = (select max(col1) from t1Aa); +-- error 1093 +delete from v2Aa where col1 = (select max(col1) from v2aA); +-- error 1093 +delete v2Aa from v2aA,t2Aa where (select max(col1) from v1aA) > 0 and v2Aa.col1 = t2aA.col1; +-- error 1093 +delete t1aA from t1Aa,t2Aa where (select max(col1) from v1Aa) > 0 and t1aA.col1 = t2aA.col1; +-- error 1093 +delete v1aA from v1Aa,t2Aa where (select max(col1) from v1aA) > 0 and v1Aa.col1 = t2aA.col1; +-- error 1093 +delete v2aA from v2Aa,t2Aa where (select max(col1) from t1Aa) > 0 and v2aA.col1 = t2aA.col1; +-- error 1093 +delete t1aA from t1Aa,t2Aa where (select max(col1) from t1aA) > 0 and t1Aa.col1 = t2aA.col1; +-- error 1093 +delete v1aA from v1Aa,t2Aa where (select max(col1) from t1aA) > 0 and v1aA.col1 = t2aA.col1; +-- error 1093 +delete v2Aa from v2aA,t2Aa where (select max(col1) from v2Aa) > 0 and v2aA.col1 = t2aA.col1; +-- error 1093 +delete t1Aa from t1aA,t2Aa where (select max(col1) from v2Aa) > 0 and t1Aa.col1 = t2aA.col1; +-- error 1093 +delete v1Aa from v1aA,t2Aa where (select max(col1) from v2aA) > 0 and v1Aa.col1 = t2aA.col1; +-- error 1093 +insert into v2Aa values ((select max(col1) from v1aA)); +-- error 1093 +insert into t1aA values ((select max(col1) from v1Aa)); -- error 1093 insert into v2aA values ((select max(col1) from v1aA)); -drop view v2Aa,v1Aa; +-- error 1093 +insert into v2Aa values ((select max(col1) from t1Aa)); +-- error 1093 +insert into t1aA values ((select max(col1) from t1Aa)); +-- error 1093 +insert into v2aA values ((select max(col1) from t1aA)); +-- error 1093 +insert into v2Aa values ((select max(col1) from v2aA)); +-- error 1093 +insert into t1Aa values ((select max(col1) from v2Aa)); +-- error 1093 +insert into v2aA values ((select max(col1) from v2Aa)); +-- error 1093 +insert into v3Aa (col1) values ((select max(col1) from v1Aa)); +-- error 1093 +insert into v3aA (col1) values ((select max(col1) from t1aA)); +-- error 1093 +insert into v3Aa (col1) values ((select max(col1) from v2aA)); +drop view v3aA,v2Aa,v1aA; drop table t1Aa,t2Aa; # diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 7a05ebb0204..3c1da3f0bd0 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -1198,15 +1198,118 @@ create table t1 (col1 int); create table t2 (col1 int); create view v1 as select * from t1; create view v2 as select * from v1; +create view v3 as select v2.col1 from v2,t2 where v2.col1 = t2.col1; -- error 1093 update v2 set col1 = (select max(col1) from v1); -#update v2,t2 set v2.col1 = (select max(col1) from v1) where v2.col1 = t2.col1; +-- error 1093 +update v2 set col1 = (select max(col1) from t1); +-- error 1093 +update v2 set col1 = (select max(col1) from v2); +-- error 1093 +update v2,t2 set v2.col1 = (select max(col1) from v1) where v2.col1 = t2.col1; +-- error 1093 +update t1,t2 set t1.col1 = (select max(col1) from v1) where t1.col1 = t2.col1; +-- error 1093 +update v1,t2 set v1.col1 = (select max(col1) from v1) where v1.col1 = t2.col1; +-- error 1093 +update t2,v2 set v2.col1 = (select max(col1) from v1) where v2.col1 = t2.col1; +-- error 1093 +update t2,t1 set t1.col1 = (select max(col1) from v1) where t1.col1 = t2.col1; +-- error 1093 +update t2,v1 set v1.col1 = (select max(col1) from v1) where v1.col1 = t2.col1; +-- error 1093 +update v2,t2 set v2.col1 = (select max(col1) from t1) where v2.col1 = t2.col1; +-- error 1093 +update t1,t2 set t1.col1 = (select max(col1) from t1) where t1.col1 = t2.col1; +-- error 1093 +update v1,t2 set v1.col1 = (select max(col1) from t1) where v1.col1 = t2.col1; +-- error 1093 +update t2,v2 set v2.col1 = (select max(col1) from t1) where v2.col1 = t2.col1; +-- error 1093 +update t2,t1 set t1.col1 = (select max(col1) from t1) where t1.col1 = t2.col1; +-- error 1093 +update t2,v1 set v1.col1 = (select max(col1) from t1) where v1.col1 = t2.col1; +-- error 1093 +update v2,t2 set v2.col1 = (select max(col1) from v2) where v2.col1 = t2.col1; +-- error 1093 +update t1,t2 set t1.col1 = (select max(col1) from v2) where t1.col1 = t2.col1; +-- error 1093 +update v1,t2 set v1.col1 = (select max(col1) from v2) where v1.col1 = t2.col1; +-- error 1093 +update t2,v2 set v2.col1 = (select max(col1) from v2) where v2.col1 = t2.col1; +-- error 1093 +update t2,t1 set t1.col1 = (select max(col1) from v2) where t1.col1 = t2.col1; +-- error 1093 +update t2,v1 set v1.col1 = (select max(col1) from v2) where v1.col1 = t2.col1; +-- error 1093 +update v3 set v3.col1 = (select max(col1) from v1); +-- error 1093 +update v3 set v3.col1 = (select max(col1) from t1); +-- error 1093 +update v3 set v3.col1 = (select max(col1) from v2); +-- error 1093 +update v3 set v3.col1 = (select max(col1) from v3); -- error 1093 delete from v2 where col1 = (select max(col1) from v1); -#delete v2 from v2,t2 where (select max(col1) from v1) > 0 and v2.col1 = t2.col1; +-- error 1093 +delete from v2 where col1 = (select max(col1) from t1); +-- error 1093 +delete from v2 where col1 = (select max(col1) from v2); +-- error 1093 +delete v2 from v2,t2 where (select max(col1) from v1) > 0 and v2.col1 = t2.col1; +-- error 1093 +delete t1 from t1,t2 where (select max(col1) from v1) > 0 and t1.col1 = t2.col1; +-- error 1093 +delete v1 from v1,t2 where (select max(col1) from v1) > 0 and v1.col1 = t2.col1; +-- error 1093 +delete v2 from v2,t2 where (select max(col1) from t1) > 0 and v2.col1 = t2.col1; +-- error 1093 +delete t1 from t1,t2 where (select max(col1) from t1) > 0 and t1.col1 = t2.col1; +-- error 1093 +delete v1 from v1,t2 where (select max(col1) from t1) > 0 and v1.col1 = t2.col1; +-- error 1093 +delete v2 from v2,t2 where (select max(col1) from v2) > 0 and v2.col1 = t2.col1; +-- error 1093 +delete t1 from t1,t2 where (select max(col1) from v2) > 0 and t1.col1 = t2.col1; +-- error 1093 +delete v1 from v1,t2 where (select max(col1) from v2) > 0 and v1.col1 = t2.col1; -- error 1093 insert into v2 values ((select max(col1) from v1)); -drop view v2,v1; +-- error 1093 +insert into t1 values ((select max(col1) from v1)); +-- error 1093 +insert into v2 values ((select max(col1) from v1)); +-- error 1093 +insert into v2 values ((select max(col1) from t1)); +-- error 1093 +insert into t1 values ((select max(col1) from t1)); +-- error 1093 +insert into v2 values ((select max(col1) from t1)); +-- error 1093 +insert into v2 values ((select max(col1) from v2)); +-- error 1093 +insert into t1 values ((select max(col1) from v2)); +-- error 1093 +insert into v2 values ((select max(col1) from v2)); +-- error 1093 +insert into v3 (col1) values ((select max(col1) from v1)); +-- error 1093 +insert into v3 (col1) values ((select max(col1) from t1)); +-- error 1093 +insert into v3 (col1) values ((select max(col1) from v2)); +#check with TZ tables in list +-- error 1093 +insert into v3 (col1) values ((select CONVERT_TZ('20050101000000','UTC','MET') from v2)); +insert into v3 (col1) values ((select CONVERT_TZ('20050101000000','UTC','MET') from t2)); +-- error 1048 +insert into mysql.time_zone values ('', (select CONVERT_TZ('20050101000000','UTC','MET') from t2)); +# temporary table algorithm view should be equal to subquery in the from clause +create algorithm=temptable view v4 as select * from t1; +insert into t1 values (1),(2),(3); +insert into t1 (col1) values ((select max(col1) from v4)); +select * from t1; + +drop view v4,v3,v2,v1; drop table t1,t2; # @@ -1637,6 +1740,8 @@ select * from t2; delete from v3; -- error 1395 delete v3,t1 from v3,t1; +-- error 1395 +delete t1,v3 from t1,v3; # delete from t1 just to reduce result set size delete from t1; # prepare statement with insert join view @@ -1716,3 +1821,30 @@ select s2 from v1 vq1 where 2 = (select count(*) aa from v1 vq2 having vq1.s2 = drop view v1; drop table t1; +# +# Test case for bug #9398 CREATE TABLE with SELECT from a multi-table view +# +CREATE TABLE t1 (a1 int); +CREATE TABLE t2 (a2 int); +INSERT INTO t1 VALUES (1), (2), (3), (4); +INSERT INTO t2 VALUES (1), (2), (3); +CREATE VIEW v1(a,b) AS SELECT a1,a2 FROM t1 JOIN t2 ON a1=a2 WHERE a1>1; + +SELECT * FROM v1; +CREATE TABLE t3 SELECT * FROM v1; +SELECT * FROM t3; + +DROP VIEW v1; +DROP TABLE t1,t2,t3; + +# +# Test for BUG#8703 "insert into table select from view crashes" +# +create table t1 (a int); +create table t2 like t1; +create table t3 like t1; +create view v1 as select t1.a x, t2.a y from t1 join t2 where t1.a=t2.a; +insert into t3 select x from v1; +insert into t2 select x from v1; +drop view v1; +drop table t1,t2,t3; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 4750fe1386f..28235ba48a3 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -680,33 +680,12 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table, const char *db_name, const char *table_name) { - if (lower_case_table_names) + for (; table; table= *(TABLE_LIST **) ((char*) table + offset)) { - for (; table; table= *(TABLE_LIST **) ((char*) table + offset)) - { - if ((table->table == 0 || table->table->s->tmp_table == NO_TMP_TABLE) && - ((!strcmp(table->db, db_name) && - !strcmp(table->table_name, table_name)) || - (table->view && - !my_strcasecmp(table_alias_charset, - table->db, db_name) && - !my_strcasecmp(table_alias_charset, - table->table->alias, table_name)))) - break; - } - } - else - { - for (; table; table= *(TABLE_LIST **) ((char*) table + offset)) - { - if ((table->table == 0 || table->table->s->tmp_table == NO_TMP_TABLE) && - ((!strcmp(table->db, db_name) && - !strcmp(table->table_name, table_name)) || - (table->view && - !strcmp(table->table->s->db, db_name) && - !strcmp(table->table->alias, table_name)))) - break; - } + if ((table->table == 0 || table->table->s->tmp_table == NO_TMP_TABLE) && + strcmp(table->db, db_name) == 0 && + strcmp(table->table_name, table_name) == 0) + break; } return table; } @@ -717,8 +696,25 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table, SYNOPSIS unique_table() - table table which should be chaked - table_list list of tables + table table which should be chaked + table_list list of tables + + NOTE: to exclude derived tables from check we use following mechanism: + a) during derived table processing set THD::derived_tables_processing + b) JOIN::prepare set SELECT::exclude_from_table_unique_test if + THD::derived_tables_processing set. (we can't use JOIN::execute + because for PS we perform only JOIN::prepare, but we can't set this + flag in JOIN::prepare if we are not sure that we are in derived table + processing loop, because multi-update call fix_fields() for some its + items (which mean JOIN::prepare for subqueries) before unique_table + call to detect which tables should be locked for write). + c) unique_table skip all tables which belong to SELECT with + SELECT::exclude_from_table_unique_test set. + Also SELECT::exclude_from_table_unique_test used to exclude from check + tables of main SELECT of multi-delete and multi-update + + TODO: when we will have table/view change detection we can do this check + only once for PS/SP RETURN found duplicate @@ -758,11 +754,17 @@ TABLE_LIST* unique_table(TABLE_LIST *table, TABLE_LIST *table_list) for(;;) { if (!(res= find_table_in_global_list(table_list, d_name, t_name)) || - !res->table || res->table != table->table) + (!res->table || res->table != table->table) && + (res->select_lex && !res->select_lex->exclude_from_table_unique_test)) break; - /* if we found entry of this table try again. */ + /* + If we found entry of this table or or table of SELECT which already + processed in derived table or top select of multi-update/multi-delete + (exclude_from_table_unique_test). + */ table_list= res->next_global; - DBUG_PRINT("info", ("found same copy of table")); + DBUG_PRINT("info", + ("found same copy of table or table which we should skip")); } DBUG_RETURN(res); } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index cf7240e4dba..95d436069e2 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -161,7 +161,8 @@ THD::THD() :user_time(0), global_read_lock(0), is_fatal_error(0), rand_used(0), time_zone_used(0), last_insert_id_used(0), insert_id_used(0), clear_next_insert_id(0), - in_lock_tables(0), bootstrap(0), spcont(NULL) + in_lock_tables(0), bootstrap(0), derived_tables_processing(FALSE), + spcont(NULL) { current_arena= this; #ifndef DBUG_OFF diff --git a/sql/sql_class.h b/sql/sql_class.h index 6d6ac810fbf..39d5c37462b 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1207,6 +1207,8 @@ public: bool no_trans_update, abort_on_warning; bool got_warning; /* Set on call to push_warning() */ bool no_warnings_for_error; /* no warnings on call to my_error() */ + /* set during loop of derived table processing */ + bool derived_tables_processing; longlong row_count_func; /* For the ROW_COUNT() function */ sp_rcontext *spcont; // SP runtime context sp_cache *sp_proc_cache; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 642564f5d7a..eb3775f66ea 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -356,12 +356,28 @@ bool mysql_multi_delete_prepare(THD *thd) &lex->select_lex.leaf_tables, FALSE, FALSE)) DBUG_RETURN(TRUE); + + /* + Multi-delete can't be constructed over-union => we always have + single SELECT on top and have to check underlying SELECTs of it + */ + lex->select_lex.exclude_from_table_unique_test= TRUE; /* Fix tables-to-be-deleted-from list to point at opened tables */ for (target_tbl= (TABLE_LIST*) aux_tables; target_tbl; target_tbl= target_tbl->next_local) { - target_tbl->table= target_tbl->correspondent_table->table; + if (!(target_tbl->table= target_tbl->correspondent_table->table)) + { + DBUG_ASSERT(target_tbl->correspondent_table->view && + target_tbl->correspondent_table->ancestor && + target_tbl->correspondent_table->ancestor->next_local); + my_error(ER_VIEW_DELETE_MERGE_VIEW, MYF(0), + target_tbl->correspondent_table->view_db.str, + target_tbl->correspondent_table->view_name.str); + DBUG_RETURN(TRUE); + } + if (!target_tbl->correspondent_table->updatable || check_key_in_view(thd, target_tbl->correspondent_table)) { @@ -370,23 +386,14 @@ bool mysql_multi_delete_prepare(THD *thd) DBUG_RETURN(TRUE); } /* - Check are deleted table used somewhere inside subqueries. - - Multi-delete can't be constructed over-union => we always have - single SELECT on top and have to check underlying SELECTs of it + Check that table from which we delete is not used somewhere + inside subqueries/view. */ - for (SELECT_LEX_UNIT *un= lex->select_lex.first_inner_unit(); - un; - un= un->next_unit()) + if (unique_table(target_tbl->correspondent_table, lex->query_tables)) { - if (un->first_select()->linkage != DERIVED_TABLE_TYPE && - un->check_updateable(target_tbl->correspondent_table->db, - target_tbl->correspondent_table->table_name)) - { - my_error(ER_UPDATE_TABLE_USED, MYF(0), - target_tbl->correspondent_table->table_name); - DBUG_RETURN(TRUE); - } + my_error(ER_UPDATE_TABLE_USED, MYF(0), + target_tbl->correspondent_table->table_name); + DBUG_RETURN(TRUE); } } DBUG_RETURN(FALSE); diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index eb7b3e8a319..4fcde212716 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -43,8 +43,10 @@ int mysql_handle_derived(LEX *lex, int (*processor)(THD*, LEX*, TABLE_LIST*)) { + int res= 0; if (lex->derived_tables) { + lex->thd->derived_tables_processing= TRUE; for (SELECT_LEX *sl= lex->all_selects_list; sl; sl= sl->next_select_in_list()) @@ -53,9 +55,8 @@ mysql_handle_derived(LEX *lex, int (*processor)(THD*, LEX*, TABLE_LIST*)) cursor; cursor= cursor->next_local) { - int res; if ((res= (*processor)(lex->thd, lex, cursor))) - return res; + goto out; } if (lex->describe) { @@ -68,7 +69,9 @@ mysql_handle_derived(LEX *lex, int (*processor)(THD*, LEX*, TABLE_LIST*)) } } } - return 0; +out: + lex->thd->derived_tables_processing= FALSE; + return res; } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 91c4dc40c01..61f710a2fe5 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1112,7 +1112,7 @@ void st_select_lex::init_query() first_execution= 1; first_cond_optimization= 1; parsing_place= NO_MATTER; - no_wrap_view_item= 0; + exclude_from_table_unique_test= no_wrap_view_item= FALSE; link_next= 0; } @@ -1493,77 +1493,6 @@ bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num) } -/* - Find db.table which will be updated in this unit - - SYNOPSIS - st_select_lex_unit::check_updateable() - db - data base name - table - real table name - - RETURN - 1 - found - 0 - OK (table did not found) -*/ - -bool st_select_lex_unit::check_updateable(char *db, char *table) -{ - for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select()) - if (sl->check_updateable(db, table)) - return 1; - return 0; -} - - -/* - Find db.table which will be updated in this select and - underlying ones (except derived tables) - - SYNOPSIS - st_select_lex::check_updateable() - db - data base name - table - real table name - - RETURN - 1 - found - 0 - OK (table did not found) -*/ - -bool st_select_lex::check_updateable(char *db, char *table) -{ - if (find_table_in_local_list(get_table_list(), db, table)) - return 1; - - return check_updateable_in_subqueries(db, table); -} - -/* - Find db.table which will be updated in underlying subqueries - - SYNOPSIS - st_select_lex::check_updateable_in_subqueries() - db - data base name - table - real table name - - RETURN - 1 - found - 0 - OK (table did not found) -*/ - -bool st_select_lex::check_updateable_in_subqueries(char *db, char *table) -{ - for (SELECT_LEX_UNIT *un= first_inner_unit(); - un; - un= un->next_unit()) - { - if (un->first_select()->linkage != DERIVED_TABLE_TYPE && - un->check_updateable(db, table)) - return 1; - } - return 0; -} - - void st_select_lex_unit::print(String *str) { for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select()) diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 00e30bd320b..92d77520f7f 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -442,7 +442,6 @@ public: inline void unclean() { cleaned= 0; } void reinit_exec_mechanism(); - bool check_updateable(char *db, char *table); void print(String *str); ulong init_prepare_fake_select_lex(THD *thd); @@ -525,6 +524,8 @@ public: bool first_cond_optimization; /* do not wrap view fields with Item_ref */ bool no_wrap_view_item; + /* exclude this select from check of unique_table() */ + bool exclude_from_table_unique_test; /* SELECT for SELECT command st_select_lex. Used to privent scaning @@ -615,8 +616,6 @@ public: init_select(); } bool setup_ref_array(THD *thd, uint order_group_num); - bool check_updateable(char *db, char *table); - bool check_updateable_in_subqueries(char *db, char *table); void print(THD *thd, String *str); static void print_order(String *str, ORDER *order); void print_limit(THD *thd, String *str); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index d765561f61e..467de9587ec 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3234,16 +3234,6 @@ unsent_create_error: if ((res= open_and_lock_tables(thd, all_tables))) break; - if (!first_table->table) - { - DBUG_ASSERT(first_table->view && - first_table->ancestor && first_table->ancestor->next_local); - my_error(ER_VIEW_DELETE_MERGE_VIEW, MYF(0), - first_table->view_db.str, first_table->view_name.str); - res= FALSE; - break; - } - if ((res= mysql_multi_delete_prepare(thd))) goto error; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 7e2c37f130e..e4c50f7c1ef 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1871,6 +1871,9 @@ void reset_stmt_for_execute(THD *thd, LEX *lex) /* remove option which was put by mysql_explain_union() */ sl->options&= ~SELECT_DESCRIBE; + /* see unique_table() */ + sl->exclude_from_table_unique_test= FALSE; + /* Copy WHERE clause pointers to avoid damaging they by optimisation */ diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 461a0f8b9d6..e63cc1ab3df 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -316,6 +316,13 @@ JOIN::prepare(Item ***rref_pointer_array, join_list= &select_lex->top_join_list; union_part= (unit_arg->first_select()->next_select() != 0); + /* + If we have already executed SELECT, then it have not sense to prevent + its table from update (see unique_table()) + */ + if (thd->derived_tables_processing) + select_lex->exclude_from_table_unique_test= TRUE; + /* Check that all tables, fields, conds and order are ok */ if ((!(select_options & OPTION_SETUP_TABLES_DONE) && @@ -1157,7 +1164,7 @@ JOIN::exec() { int tmp_error; DBUG_ENTER("JOIN::exec"); - + error= 0; if (procedure) { diff --git a/sql/sql_update.cc b/sql/sql_update.cc index bb0ac31bdc7..8b8dd32b22d 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -691,16 +691,6 @@ bool mysql_multi_update_prepare(THD *thd) DBUG_RETURN(TRUE); } - /* - Multi-update can't be constructed over-union => we always have - single SELECT on top and have to check underlying SELECTs of it - */ - if (lex->select_lex.check_updateable_in_subqueries(tl->db, - tl->table_name)) - { - my_error(ER_UPDATE_TABLE_USED, MYF(0), tl->table_name); - DBUG_RETURN(TRUE); - } DBUG_PRINT("info",("setting table `%s` for update", tl->alias)); tl->lock_type= lex->multi_lock_option; tl->updating= 1; @@ -781,6 +771,11 @@ bool mysql_multi_update_prepare(THD *thd) DBUG_RETURN(TRUE); } + /* + Check that we are not using table that we are updating, but we should + skip all tables of UPDATE SELECT itself + */ + lex->select_lex.exclude_from_table_unique_test= TRUE; /* We only need SELECT privilege for columns in the values list */ for (tl= leaves; tl; tl= tl->next_leaf) { @@ -794,11 +789,19 @@ bool mysql_multi_update_prepare(THD *thd) } DBUG_PRINT("info", ("table: %s want_privilege: %u", tl->alias, (uint) table->grant.want_privilege)); + if (tl->lock_type != TL_READ && + tl->lock_type != TL_READ_NO_INSERT && + unique_table(tl, table_list)) + { + my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->table_name); + DBUG_RETURN(TRUE); + } } if (thd->fill_derived_tables() && mysql_handle_derived(lex, &mysql_derived_filling)) DBUG_RETURN(TRUE); + DBUG_RETURN (FALSE); } From aae37f5ea55ddae987fe4f34a74f5019b503f4f5 Mon Sep 17 00:00:00 2001 From: "dlenev@brandersnatch.localdomain" <> Date: Mon, 28 Mar 2005 16:20:55 +0400 Subject: [PATCH 010/204] Fix for bug #8068 "TIMEDIFF with first negative argument gives wrong result" (and similar bug in ADDTIME/SUBTIME). Both Item_func_add_time/Item_func_timediff::val_str() now use calc_time_diff() function which was backported from 5.0 (and which was was fixed to properly handle microseconds part of its second argument). Also now we correctly set sign of result in case when first argument is negative and second is positive. --- mysql-test/r/func_sapdb.result | 3 + mysql-test/t/func_sapdb.test | 1 + sql/item_timefunc.cc | 171 ++++++++++++++++++++------------- 3 files changed, 107 insertions(+), 68 deletions(-) diff --git a/mysql-test/r/func_sapdb.result b/mysql-test/r/func_sapdb.result index c74d6fc5a4e..68c3baa7bde 100644 --- a/mysql-test/r/func_sapdb.result +++ b/mysql-test/r/func_sapdb.result @@ -185,6 +185,7 @@ insert into test values ('2001-01-01 01:01:01', '-01:01:01', '-23:59:59', "1997-12-31 23:59:59.000001"), ('1997-12-31 23:59:59.000001', '-23:59:59', '-01:01:01', '2001-01-01 01:01:01'), ('2001-01-01 01:01:01', '01:01:01', '-1 01:01:01', null), +('2001-01-01 01:01:01', '-01:01:01', '1 01:01:01', '2001-01-01 01:01:01'), ('2001-01-01 01:01:01', null, '-1 01:01:01', null), (null, null, null, null), ('2001-01-01 01:01:01', '01:01:01', '1 01:01:01', '2001-01-01 01:01:01'); @@ -194,6 +195,7 @@ ttt qqq 2001-01-01 00:00:00 -25:01:00 1997-12-31 00:00:00 -25:01:00 2001-01-01 02:02:02 -24:00:00 +2001-01-01 00:00:00 24:00:00 NULL NULL NULL NULL 2001-01-01 02:02:02 26:02:02 @@ -203,6 +205,7 @@ ttt qqq 26305:01:02 22:58:58 -26305:01:02 -22:58:58 NULL 26:02:02 +00:00:00 -26:02:02 NULL NULL NULL NULL 00:00:00 -24:00:00 diff --git a/mysql-test/t/func_sapdb.test b/mysql-test/t/func_sapdb.test index de433485fca..da3affaa36d 100644 --- a/mysql-test/t/func_sapdb.test +++ b/mysql-test/t/func_sapdb.test @@ -100,6 +100,7 @@ insert into test values ('2001-01-01 01:01:01', '-01:01:01', '-23:59:59', "1997-12-31 23:59:59.000001"), ('1997-12-31 23:59:59.000001', '-23:59:59', '-01:01:01', '2001-01-01 01:01:01'), ('2001-01-01 01:01:01', '01:01:01', '-1 01:01:01', null), +('2001-01-01 01:01:01', '-01:01:01', '1 01:01:01', '2001-01-01 01:01:01'), ('2001-01-01 01:01:01', null, '-1 01:01:01', null), (null, null, null, null), ('2001-01-01 01:01:01', '01:01:01', '1 01:01:01', '2001-01-01 01:01:01'); diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 2c500f16bf3..6715930bc61 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -761,6 +761,81 @@ static bool get_interval_info(const char *str,uint length,CHARSET_INFO *cs, } +/* + Calculate difference between two datetime values as seconds + microseconds. + + SYNOPSIS + calc_time_diff() + l_time1 - TIME/DATE/DATETIME value + l_time2 - TIME/DATE/DATETIME value + l_sign - 1 absolute values are substracted, + -1 absolute values are added. + seconds_out - Out parameter where difference between + l_time1 and l_time2 in seconds is stored. + microseconds_out- Out parameter where microsecond part of difference + between l_time1 and l_time2 is stored. + + NOTE + This function calculates difference between l_time1 and l_time2 absolute + values. So one should set l_sign and correct result if he want to take + signs into account (i.e. for TIME values). + + RETURN VALUES + Returns sign of difference. + 1 means negative result + 0 means positive result + +*/ + +static bool calc_time_diff(TIME *l_time1, TIME *l_time2, int l_sign, + longlong *seconds_out, long *microseconds_out) +{ + long days; + bool neg; + longlong microseconds; + + /* + We suppose that if first argument is MYSQL_TIMESTAMP_TIME + the second argument should be TIMESTAMP_TIME also. + We should check it before calc_time_diff call. + */ + if (l_time1->time_type == MYSQL_TIMESTAMP_TIME) // Time value + days= l_time1->day - l_sign*l_time2->day; + else + { + days= calc_daynr((uint) l_time1->year, + (uint) l_time1->month, + (uint) l_time1->day); + if (l_time2->time_type == MYSQL_TIMESTAMP_TIME) + days-= l_sign*l_time2->day; + else + days-= l_sign*calc_daynr((uint) l_time2->year, + (uint) l_time2->month, + (uint) l_time2->day); + } + + microseconds= ((longlong)days*LL(86400) + + (longlong)(l_time1->hour*3600L + + l_time1->minute*60L + + l_time1->second) - + l_sign*(longlong)(l_time2->hour*3600L + + l_time2->minute*60L + + l_time2->second)) * LL(1000000) + + (longlong)l_time1->second_part - + l_sign*(longlong)l_time2->second_part; + + neg= 0; + if (microseconds < 0) + { + microseconds= -microseconds; + neg= 1; + } + *seconds_out= microseconds/1000000L; + *microseconds_out= (long) (microseconds%1000000L); + return neg; +} + + longlong Item_func_period_add::val_int() { DBUG_ASSERT(fixed == 1); @@ -2332,11 +2407,11 @@ String *Item_func_add_time::val_str(String *str) DBUG_ASSERT(fixed == 1); TIME l_time1, l_time2, l_time3; bool is_time= 0; - long microseconds, seconds, days= 0; + long days, microseconds; + longlong seconds; int l_sign= sign; null_value=0; - l_time3.neg= 0; if (is_date) // TIMESTAMP function { if (get_arg0_date(&l_time1,1) || @@ -2352,51 +2427,26 @@ String *Item_func_add_time::val_str(String *str) l_time2.time_type == MYSQL_TIMESTAMP_DATETIME) goto null_date; is_time= (l_time1.time_type == MYSQL_TIMESTAMP_TIME); - if (is_time && (l_time2.neg == l_time1.neg && l_time1.neg)) - l_time3.neg= 1; } if (l_time1.neg != l_time2.neg) l_sign= -l_sign; - microseconds= l_time1.second_part + l_sign*l_time2.second_part; - seconds= (l_time1.hour*3600L + l_time1.minute*60L + l_time1.second + - (l_time2.day*86400L + l_time2.hour*3600L + - l_time2.minute*60L + l_time2.second)*l_sign); - if (is_time) - seconds+= l_time1.day*86400L; - else - days+= calc_daynr((uint) l_time1.year,(uint) l_time1.month, - (uint) l_time1.day); - seconds= seconds + microseconds/1000000L; - microseconds= microseconds%1000000L; - days+= seconds/86400L; - seconds= seconds%86400L; + l_time3.neg= calc_time_diff(&l_time1, &l_time2, -l_sign, + &seconds, µseconds); - if (microseconds < 0) - { - microseconds+= 1000000L; - seconds--; - } - if (seconds < 0) - { - days+= seconds/86400L - 1; - seconds+= 86400L; - } - if (days < 0) - { - if (!is_time) - goto null_date; - if (microseconds) - { - microseconds= 1000000L - microseconds; - seconds++; - } - seconds= 86400L - seconds; - days= -(++days); - l_time3.neg= 1; - } + /* + If first argument was negative and diff between arguments + is non-zero we need to swap sign to get proper result. + */ + if (l_time1.neg && (seconds || microseconds)) + l_time3.neg= 1-l_time3.neg; // Swap sign of result - calc_time_from_sec(&l_time3, seconds, microseconds); + if (!is_time && l_time3.neg) + goto null_date; + + days= (long)(seconds/86400L); + + calc_time_from_sec(&l_time3, (long)(seconds%86400L), microseconds); if (!is_time) { get_date_from_daynr(days,&l_time3.year,&l_time3.month,&l_time3.day); @@ -2452,8 +2502,8 @@ void Item_func_add_time::print(String *str) String *Item_func_timediff::val_str(String *str) { DBUG_ASSERT(fixed == 1); - longlong microseconds; - long days; + longlong seconds; + long microseconds; int l_sign= 1; TIME l_time1 ,l_time2, l_time3; @@ -2466,33 +2516,18 @@ String *Item_func_timediff::val_str(String *str) if (l_time1.neg != l_time2.neg) l_sign= -l_sign; - if (l_time1.time_type == MYSQL_TIMESTAMP_TIME) // Time value - days= l_time1.day - l_sign*l_time2.day; - else // DateTime value - days= (calc_daynr((uint) l_time1.year, - (uint) l_time1.month, - (uint) l_time1.day) - - l_sign*calc_daynr((uint) l_time2.year, - (uint) l_time2.month, - (uint) l_time2.day)); + l_time3.neg= calc_time_diff(&l_time1, &l_time2, l_sign, + &seconds, µseconds); - microseconds= ((longlong)days*86400L + - l_time1.hour*3600L + l_time1.minute*60L + l_time1.second - - (longlong)l_sign*(l_time2.hour*3600L + l_time2.minute*60L + - l_time2.second))*1000000 + - l_time1.second_part - l_sign*l_time2.second_part; + /* + For MYSQL_TIMESTAMP_TIME only: + If first argument was negative and diff between arguments + is non-zero we need to swap sign to get proper result. + */ + if (l_time1.neg && (seconds || microseconds)) + l_time3.neg= 1-l_time3.neg; // Swap sign of result - l_time3.neg= 0; - if (microseconds < 0) - { - microseconds= -microseconds; - l_time3.neg= 1; - } - if ((l_time2.neg == l_time1.neg) && l_time1.neg && microseconds) - l_time3.neg= l_time3.neg ? 0 : 1; - - calc_time_from_sec(&l_time3, (long)(microseconds/1000000), - (long)(microseconds%1000000)); + calc_time_from_sec(&l_time3, (long) seconds, microseconds); if (!make_datetime(l_time1.second_part || l_time2.second_part ? TIME_MICROSECOND : TIME_ONLY, From 9c86b351945af4e3cde4e48a33394a268c16429a Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Mon, 28 Mar 2005 09:59:41 -0800 Subject: [PATCH 011/204] Fix reconnect when using prepared statements, and add --disable_reconnect and --enable_reconnect to mysqltest so that it can be tested properly. (Bug #8866) --- client/mysqltest.c | 9 +++++++++ mysql-test/r/kill.result | 8 ++++++++ mysql-test/t/kill.test | 13 ++++++++----- sql-common/client.c | 27 +++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/client/mysqltest.c b/client/mysqltest.c index 042f84dfb9e..1c102bc1073 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -280,6 +280,7 @@ Q_DISPLAY_VERTICAL_RESULTS, Q_DISPLAY_HORIZONTAL_RESULTS, Q_QUERY_VERTICAL, Q_QUERY_HORIZONTAL, Q_START_TIMER, Q_END_TIMER, Q_CHARACTER_SET, Q_DISABLE_PS_PROTOCOL, Q_ENABLE_PS_PROTOCOL, +Q_DISABLE_RECONNECT, Q_ENABLE_RECONNECT, Q_UNKNOWN, /* Unknown command. */ Q_COMMENT, /* Comments, ignored. */ @@ -365,6 +366,8 @@ const char *command_names[]= "character_set", "disable_ps_protocol", "enable_ps_protocol", + "disable_reconnect", + "enable_reconnect", 0 }; @@ -3624,6 +3627,12 @@ int main(int argc, char **argv) case Q_ENABLE_PS_PROTOCOL: ps_protocol_enabled= ps_protocol; break; + case Q_DISABLE_RECONNECT: + cur_con->mysql.reconnect= 0; + break; + case Q_ENABLE_RECONNECT: + cur_con->mysql.reconnect= 1; + break; default: processed = 0; break; } diff --git a/mysql-test/r/kill.result b/mysql-test/r/kill.result index 788fab8d31a..dcf17e4bf52 100644 --- a/mysql-test/r/kill.result +++ b/mysql-test/r/kill.result @@ -5,6 +5,14 @@ select ((@id := kill_id) - kill_id) from t1; ((@id := kill_id) - kill_id) 0 kill @id; +select 1; +ERROR HY000: MySQL server has gone away +select ((@id := kill_id) - kill_id) from t1; +((@id := kill_id) - kill_id) +0 +select @id != connection_id(); +@id != connection_id() +1 select 4; 4 4 diff --git a/mysql-test/t/kill.test b/mysql-test/t/kill.test index 65d4f27059f..4afb60a7bdd 100644 --- a/mysql-test/t/kill.test +++ b/mysql-test/t/kill.test @@ -23,12 +23,15 @@ connection con2; select ((@id := kill_id) - kill_id) from t1; kill @id; -# Wait for thread to do. ---sleep 5 -# verify that con1 is doning a reconnect connection con1; -ping -ping + +--disable_reconnect +# this statement should fail +--error 2006 +select 1; +--enable_reconnect +# this should work, and we should have a new connection_id() +select ((@id := kill_id) - kill_id) from t1; select @id != connection_id(); #make sure the server is still alive diff --git a/sql-common/client.c b/sql-common/client.c index 3de2483ef75..b1455f0976a 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -2189,6 +2189,29 @@ my_bool mysql_reconnect(MYSQL *mysql) DBUG_RETURN(1); } tmp_mysql.free_me= mysql->free_me; + + /* + For each stmt in mysql->stmts, move it to tmp_mysql if it is + in state MYSQL_STMT_INIT_DONE, otherwise close it. + */ + { + LIST *element= mysql->stmts; + for (; element; element= element->next) + { + MYSQL_STMT *stmt= (MYSQL_STMT *) element->data; + if (stmt->state != MYSQL_STMT_INIT_DONE) + { + stmt->mysql= 0; + } + else + { + tmp_mysql.stmts= list_add(tmp_mysql.stmts, &stmt->list); + } + /* No need to call list_delete for statement here */ + } + mysql->stmts= NULL; + } + /* Don't free options as these are now used in tmp_mysql */ bzero((char*) &mysql->options,sizeof(mysql->options)); mysql->free_me=0; @@ -2277,6 +2300,10 @@ static void mysql_close_free(MYSQL *mysql) SYNOPSYS mysql_detach_stmt_list() stmt_list pointer to mysql->stmts + + NOTE + There is similar code in mysql_reconnect(), so changes here + should also be reflected there. */ void mysql_detach_stmt_list(LIST **stmt_list __attribute__((unused))) From 6d6d04a0ba361d2e2fa4dc4fb0988bf6ab4a6241 Mon Sep 17 00:00:00 2001 From: "dlenev@mysql.com" <> Date: Mon, 28 Mar 2005 23:36:25 +0400 Subject: [PATCH 012/204] Fix for bug #8894 "TIMESTAMP values scrambled/misaligned when using --new". Fixed Field_timestamp::val_int() so now it works correctly in --new mode (or for TIMESTAMP(19) columns). Also removed unused Field_timestamp::fill_and_store() method. --- mysql-test/r/type_timestamp.result | 9 ++++++++ mysql-test/t/type_timestamp.test | 13 +++++++++++ sql/field.cc | 35 ++++-------------------------- sql/field.h | 1 - 4 files changed, 26 insertions(+), 32 deletions(-) diff --git a/mysql-test/r/type_timestamp.result b/mysql-test/r/type_timestamp.result index 6253fa96ba8..d22fe9a94ae 100644 --- a/mysql-test/r/type_timestamp.result +++ b/mysql-test/r/type_timestamp.result @@ -221,3 +221,12 @@ ts1 20040101000000 20040101010000 drop table t1; +create table t1 (ts timestamp); +set TIMESTAMP=1000000000; +insert into t1 values (); +set new=1; +select ts+0 from t1; +ts+0 +20010909044640 +set new=0; +drop table t1; diff --git a/mysql-test/t/type_timestamp.test b/mysql-test/t/type_timestamp.test index 464ee63c137..9d61e0eaef1 100644 --- a/mysql-test/t/type_timestamp.test +++ b/mysql-test/t/type_timestamp.test @@ -148,3 +148,16 @@ select * from t1; set new=0; select * from t1; drop table t1; + +# +# Test for bug #8894 "TIMESTAMP values scrambled/misaligned when using +# --new". TIMESTAMP columns should have correct values when they are used in +# integer context in --new mode. +# +create table t1 (ts timestamp); +set TIMESTAMP=1000000000; +insert into t1 values (); +set new=1; +select ts+0 from t1; +set new=0; +drop table t1; diff --git a/sql/field.cc b/sql/field.cc index 69ee6606be4..59a71a93d68 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -2505,34 +2505,6 @@ void Field_timestamp::store(const char *from,uint len) longstore(ptr,tmp); } -void Field_timestamp::fill_and_store(char *from,uint len) -{ - uint res_length; - if (len <= field_length) - res_length=field_length; - else if (len <= 12) - res_length=12; /* purecov: inspected */ - else if (len <= 14) - res_length=14; /* purecov: inspected */ - else - res_length=(len+1)/2*2; // must be even - if (res_length != len) - { - bmove_upp(from+res_length,from+len,len); - bfill(from,res_length-len,'0'); - len=res_length; - } - long tmp=(long) str_to_timestamp(from,len); -#ifdef WORDS_BIGENDIAN - if (table->db_low_byte_first) - { - int4store(ptr,tmp); - } - else -#endif - longstore(ptr,tmp); -} - void Field_timestamp::store(double nr) { @@ -2644,7 +2616,7 @@ double Field_timestamp::val_real(void) longlong Field_timestamp::val_int(void) { - uint len,pos; + uint len, pos, max_int_rep_len; int part_time; uint32 temp; time_t time_arg; @@ -2665,7 +2637,8 @@ longlong Field_timestamp::val_int(void) localtime_r(&time_arg,&tm_tmp); l_time=&tm_tmp; res=(longlong) 0; - for (pos=len=0; len+1 < (uint) field_length ; len+=2,pos++) + max_int_rep_len= min(field_length, 14); + for (pos= len= 0; len+1 < max_int_rep_len ; len+= 2,pos++) { bool year_flag=0; switch (dayord.pos[pos]) { @@ -2677,7 +2650,7 @@ longlong Field_timestamp::val_int(void) case 5: part_time=l_time->tm_sec; break; default: part_time=0; break; /* purecov: deadcode */ } - if (year_flag && (field_length == 8 || field_length == 14)) + if (year_flag && (max_int_rep_len == 8 || max_int_rep_len == 14)) { res=res*(longlong) 10000+(part_time+ ((part_time < YY_PART_YEAR) ? 2000 : 1900)); diff --git a/sql/field.h b/sql/field.h index 87a9732b41e..3e258f81dcc 100644 --- a/sql/field.h +++ b/sql/field.h @@ -591,7 +591,6 @@ public: longget(tmp,ptr); return tmp; } - void fill_and_store(char *from,uint len); bool get_date(TIME *ltime,bool fuzzydate); bool get_time(TIME *ltime); From 46eda5b99849a064519c3946fcfb7c7d4dd23f07 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Tue, 29 Mar 2005 15:50:16 -0800 Subject: [PATCH 013/204] Shift skipping of some tests with embedded server from within mysql-test-run to the tests themselves. --- mysql-test/mysql-test-run.sh | 6 ------ mysql-test/t/bdb-deadlock.test | 2 +- mysql-test/t/connect.test | 3 +++ mysql-test/t/flush_block_commit.test | 4 ++++ mysql-test/t/grant.test | 3 +++ mysql-test/t/grant2.test | 3 +++ mysql-test/t/grant_cache.test | 2 ++ 7 files changed, 16 insertions(+), 7 deletions(-) diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index f31d1af48aa..1d670fd1a16 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -1506,12 +1506,6 @@ run_testcase () # script soon anyway so it is not worth it spending the time if [ "x$USE_EMBEDDED_SERVER" = "x1" -a -z "$DO_TEST" ] ; then for t in \ - "bdb-deadlock" \ - "connect" \ - "flush_block_commit" \ - "grant2" \ - "grant_cache" \ - "grant" \ "init_connect" \ "init_file" \ "innodb" \ diff --git a/mysql-test/t/bdb-deadlock.test b/mysql-test/t/bdb-deadlock.test index d86403fcffc..5e6ca666cc2 100644 --- a/mysql-test/t/bdb-deadlock.test +++ b/mysql-test/t/bdb-deadlock.test @@ -5,7 +5,7 @@ # connection in a separate thread. # -#-- source include/not_embedded.inc +-- source include/not_embedded.inc -- source include/have_bdb.inc connect (con1,localhost,root,,); diff --git a/mysql-test/t/connect.test b/mysql-test/t/connect.test index 4598ca5ea15..034cd11d0c1 100644 --- a/mysql-test/t/connect.test +++ b/mysql-test/t/connect.test @@ -3,6 +3,9 @@ # Unfortunately the check is incomplete as we can't handle errors on connect # Also we can't connect without database +# This test makes no sense with the embedded server +--source include/not_embedded.inc + #connect (con1,localhost,root,,""); #show tables; connect (con1,localhost,root,,mysql); diff --git a/mysql-test/t/flush_block_commit.test b/mysql-test/t/flush_block_commit.test index 87715452089..49d68d05fb6 100644 --- a/mysql-test/t/flush_block_commit.test +++ b/mysql-test/t/flush_block_commit.test @@ -3,6 +3,10 @@ # We verify that we did not introduce a deadlock. # This is intended to mimick how mysqldump and innobackup work. +# This test doesn't work with the embedded server +-- source include/not_embedded.inc + +# And it requires InnoDB -- source include/have_innodb.inc connect (con1,localhost,root,,); diff --git a/mysql-test/t/grant.test b/mysql-test/t/grant.test index 2ca930d4fd2..1c8fbe0ff0d 100644 --- a/mysql-test/t/grant.test +++ b/mysql-test/t/grant.test @@ -1,5 +1,8 @@ # Test of GRANT commands +# Grant tests not performed with embedded server +-- source include/not_embedded.inc + # Cleanup --disable_warnings drop table if exists t1; diff --git a/mysql-test/t/grant2.test b/mysql-test/t/grant2.test index 7060d35e9a4..0918e618197 100644 --- a/mysql-test/t/grant2.test +++ b/mysql-test/t/grant2.test @@ -1,3 +1,6 @@ +# Grant tests not performed with embedded server +-- source include/not_embedded.inc + SET NAMES binary; # diff --git a/mysql-test/t/grant_cache.test b/mysql-test/t/grant_cache.test index e5bde977bb7..7d6f7262f0a 100644 --- a/mysql-test/t/grant_cache.test +++ b/mysql-test/t/grant_cache.test @@ -1,3 +1,5 @@ +# Grant tests not performed with embedded server +-- source include/not_embedded.inc -- source include/have_query_cache.inc # From bfa7520356747298a47029804df7899d61cfe4d4 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Tue, 29 Mar 2005 16:10:43 -0800 Subject: [PATCH 014/204] Clean up InnoDB testing with embedded server. --- mysql-test/mysql-test-run.sh | 3 - mysql-test/r/innodb-replace.result | 12 + mysql-test/r/innodb.result | 12 - mysql-test/r/innodb.result.es | 1653 ---------------------------- mysql-test/t/innodb-deadlock.test | 2 + mysql-test/t/innodb-lock.test | 2 + mysql-test/t/innodb-replace.test | 17 + mysql-test/t/innodb.test | 15 +- 8 files changed, 34 insertions(+), 1682 deletions(-) create mode 100644 mysql-test/r/innodb-replace.result delete mode 100644 mysql-test/r/innodb.result.es create mode 100644 mysql-test/t/innodb-replace.test diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 1d670fd1a16..12d1c8723d9 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -1508,9 +1508,6 @@ run_testcase () for t in \ "init_connect" \ "init_file" \ - "innodb" \ - "innodb-deadlock" \ - "innodb-lock" \ "mix_innodb_myisam_binlog" \ "mysqlbinlog2" \ "mysqlbinlog" \ diff --git a/mysql-test/r/innodb-replace.result b/mysql-test/r/innodb-replace.result new file mode 100644 index 00000000000..a27806640ad --- /dev/null +++ b/mysql-test/r/innodb-replace.result @@ -0,0 +1,12 @@ +create table t1 (c1 char(5) unique not null, c2 int, stamp timestamp) engine=innodb; +select * from t1; +c1 c2 stamp +replace delayed into t1 (c1, c2) values ( "text1","11"),( "text2","12"); +ERROR HY000: Table storage engine for 't1' doesn't have this option +select * from t1; +c1 c2 stamp +replace delayed into t1 (c1, c2) values ( "text1","12"),( "text2","13"),( "text3","14", "a" ),( "text4","15", "b" ); +ERROR HY000: Table storage engine for 't1' doesn't have this option +select * from t1; +c1 c2 stamp +drop table t1; diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index 009432ec3ab..53a788ca824 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -1401,18 +1401,6 @@ id label 3524 Societe Test 3525 Fournisseur Test drop table t1,t2; -create table t1 (c1 char(5) unique not null, c2 int, stamp timestamp) engine=innodb; -select * from t1; -c1 c2 stamp -replace delayed into t1 (c1, c2) values ( "text1","11"),( "text2","12"); -ERROR HY000: Table storage engine for 't1' doesn't have this option -select * from t1; -c1 c2 stamp -replace delayed into t1 (c1, c2) values ( "text1","12"),( "text2","13"),( "text3","14", "a" ),( "text4","15", "b" ); -ERROR HY000: Table storage engine for 't1' doesn't have this option -select * from t1; -c1 c2 stamp -drop table t1; create table t1 (a int, b varchar(200), c text not null) checksum=1 engine=myisam; create table t2 (a int, b varchar(200), c text not null) checksum=0 engine=innodb; create table t3 (a int, b varchar(200), c text not null) checksum=1 engine=innodb; diff --git a/mysql-test/r/innodb.result.es b/mysql-test/r/innodb.result.es deleted file mode 100644 index 602a034bc16..00000000000 --- a/mysql-test/r/innodb.result.es +++ /dev/null @@ -1,1653 +0,0 @@ -drop table if exists t1,t2,t3,t4; -drop database if exists mysqltest; -create table t1 (id int unsigned not null auto_increment, code tinyint unsigned not null, name char(20) not null, primary key (id), key (code), unique (name)) engine=innodb; -insert into t1 (code, name) values (1, 'Tim'), (1, 'Monty'), (2, 'David'), (2, 'Erik'), (3, 'Sasha'), (3, 'Jeremy'), (4, 'Matt'); -select id, code, name from t1 order by id; -id code name -1 1 Tim -2 1 Monty -3 2 David -4 2 Erik -5 3 Sasha -6 3 Jeremy -7 4 Matt -update ignore t1 set id = 8, name = 'Sinisa' where id < 3; -select id, code, name from t1 order by id; -id code name -2 1 Monty -3 2 David -4 2 Erik -5 3 Sasha -6 3 Jeremy -7 4 Matt -8 1 Sinisa -update ignore t1 set id = id + 10, name = 'Ralph' where id < 4; -select id, code, name from t1 order by id; -id code name -3 2 David -4 2 Erik -5 3 Sasha -6 3 Jeremy -7 4 Matt -8 1 Sinisa -12 1 Ralph -drop table t1; -CREATE TABLE t1 ( -id int(11) NOT NULL auto_increment, -parent_id int(11) DEFAULT '0' NOT NULL, -level tinyint(4) DEFAULT '0' NOT NULL, -PRIMARY KEY (id), -KEY parent_id (parent_id), -KEY level (level) -) engine=innodb; -INSERT INTO t1 VALUES (1,0,0),(3,1,1),(4,1,1),(8,2,2),(9,2,2),(17,3,2),(22,4,2),(24,4,2),(28,5,2),(29,5,2),(30,5,2),(31,6,2),(32,6,2),(33,6,2),(203,7,2),(202,7,2),(20,3,2),(157,0,0),(193,5,2),(40,7,2),(2,1,1),(15,2,2),(6,1,1),(34,6,2),(35,6,2),(16,3,2),(7,1,1),(36,7,2),(18,3,2),(26,5,2),(27,5,2),(183,4,2),(38,7,2),(25,5,2),(37,7,2),(21,4,2),(19,3,2),(5,1,1),(179,5,2); -update t1 set parent_id=parent_id+100; -select * from t1 where parent_id=102; -id parent_id level -8 102 2 -9 102 2 -15 102 2 -update t1 set id=id+1000; -update t1 set id=1024 where id=1009; -Got one of the listed errors -select * from t1; -id parent_id level -1001 100 0 -1002 101 1 -1003 101 1 -1004 101 1 -1005 101 1 -1006 101 1 -1007 101 1 -1008 102 2 -1009 102 2 -1015 102 2 -1016 103 2 -1017 103 2 -1018 103 2 -1019 103 2 -1020 103 2 -1021 104 2 -1022 104 2 -1024 104 2 -1025 105 2 -1026 105 2 -1027 105 2 -1028 105 2 -1029 105 2 -1030 105 2 -1031 106 2 -1032 106 2 -1033 106 2 -1034 106 2 -1035 106 2 -1036 107 2 -1037 107 2 -1038 107 2 -1040 107 2 -1157 100 0 -1179 105 2 -1183 104 2 -1193 105 2 -1202 107 2 -1203 107 2 -update ignore t1 set id=id+1; -select * from t1; -id parent_id level -1001 100 0 -1002 101 1 -1003 101 1 -1004 101 1 -1005 101 1 -1006 101 1 -1007 101 1 -1008 102 2 -1010 102 2 -1015 102 2 -1016 103 2 -1017 103 2 -1018 103 2 -1019 103 2 -1020 103 2 -1021 104 2 -1023 104 2 -1024 104 2 -1025 105 2 -1026 105 2 -1027 105 2 -1028 105 2 -1029 105 2 -1030 105 2 -1031 106 2 -1032 106 2 -1033 106 2 -1034 106 2 -1035 106 2 -1036 107 2 -1037 107 2 -1039 107 2 -1041 107 2 -1158 100 0 -1180 105 2 -1184 104 2 -1194 105 2 -1202 107 2 -1204 107 2 -update ignore t1 set id=1023 where id=1010; -select * from t1 where parent_id=102; -id parent_id level -1008 102 2 -1010 102 2 -1015 102 2 -explain select level from t1 where level=1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ref level level 1 const # Using where; Using index -explain select level,id from t1 where level=1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ref level level 1 const # Using where; Using index -explain select level,id,parent_id from t1 where level=1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ref level level 1 const # Using where -select level,id from t1 where level=1; -level id -1 1002 -1 1003 -1 1004 -1 1005 -1 1006 -1 1007 -select level,id,parent_id from t1 where level=1; -level id parent_id -1 1002 101 -1 1003 101 -1 1004 101 -1 1005 101 -1 1006 101 -1 1007 101 -optimize table t1; -Table Op Msg_type Msg_text -test.t1 optimize status OK -show keys from t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 PRIMARY 1 id A # NULL NULL BTREE -t1 1 parent_id 1 parent_id A # NULL NULL BTREE -t1 1 level 1 level A # NULL NULL BTREE -drop table t1; -CREATE TABLE t1 ( -gesuchnr int(11) DEFAULT '0' NOT NULL, -benutzer_id int(11) DEFAULT '0' NOT NULL, -PRIMARY KEY (gesuchnr,benutzer_id) -) engine=innodb; -replace into t1 (gesuchnr,benutzer_id) values (2,1); -replace into t1 (gesuchnr,benutzer_id) values (1,1); -replace into t1 (gesuchnr,benutzer_id) values (1,1); -select * from t1; -gesuchnr benutzer_id -1 1 -2 1 -drop table t1; -create table t1 (a int) engine=innodb; -insert into t1 values (1), (2); -optimize table t1; -Table Op Msg_type Msg_text -test.t1 optimize status OK -delete from t1 where a = 1; -select * from t1; -a -2 -check table t1; -Table Op Msg_type Msg_text -test.t1 check status OK -drop table t1; -create table t1 (a int,b varchar(20)) engine=innodb; -insert into t1 values (1,""), (2,"testing"); -delete from t1 where a = 1; -select * from t1; -a b -2 testing -create index skr on t1 (a); -insert into t1 values (3,""), (4,"testing"); -analyze table t1; -Table Op Msg_type Msg_text -test.t1 analyze status OK -show keys from t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 1 skr 1 a A # NULL NULL YES BTREE -drop table t1; -create table t1 (a int,b varchar(20),key(a)) engine=innodb; -insert into t1 values (1,""), (2,"testing"); -select * from t1 where a = 1; -a b -1 -drop table t1; -create table t1 (n int not null primary key) engine=innodb; -set autocommit=0; -insert into t1 values (4); -rollback; -select n, "after rollback" from t1; -n after rollback -insert into t1 values (4); -commit; -select n, "after commit" from t1; -n after commit -4 after commit -commit; -insert into t1 values (5); -insert into t1 values (4); -ERROR 23000: Duplicate entry '4' for key 1 -commit; -select n, "after commit" from t1; -n after commit -4 after commit -5 after commit -set autocommit=1; -insert into t1 values (6); -insert into t1 values (4); -ERROR 23000: Duplicate entry '4' for key 1 -select n from t1; -n -4 -5 -6 -rollback; -drop table t1; -create table t1 (n int not null primary key) engine=innodb; -start transaction; -insert into t1 values (4); -flush tables with read lock; -commit; -unlock tables; -commit; -select * from t1; -n -4 -drop table t1; -create table t1 ( id int NOT NULL PRIMARY KEY, nom varchar(64)) engine=innodb; -begin; -insert into t1 values(1,'hamdouni'); -select id as afterbegin_id,nom as afterbegin_nom from t1; -afterbegin_id afterbegin_nom -1 hamdouni -rollback; -select id as afterrollback_id,nom as afterrollback_nom from t1; -afterrollback_id afterrollback_nom -set autocommit=0; -insert into t1 values(2,'mysql'); -select id as afterautocommit0_id,nom as afterautocommit0_nom from t1; -afterautocommit0_id afterautocommit0_nom -2 mysql -rollback; -select id as afterrollback_id,nom as afterrollback_nom from t1; -afterrollback_id afterrollback_nom -set autocommit=1; -drop table t1; -CREATE TABLE t1 (id char(8) not null primary key, val int not null) engine=innodb; -insert into t1 values ('pippo', 12); -insert into t1 values ('pippo', 12); -ERROR 23000: Duplicate entry 'pippo' for key 1 -delete from t1; -delete from t1 where id = 'pippo'; -select * from t1; -id val -insert into t1 values ('pippo', 12); -set autocommit=0; -delete from t1; -rollback; -select * from t1; -id val -pippo 12 -delete from t1; -commit; -select * from t1; -id val -drop table t1; -create table t1 (a integer) engine=innodb; -start transaction; -rename table t1 to t2; -create table t1 (b integer) engine=innodb; -insert into t1 values (1); -rollback; -drop table t1; -rename table t2 to t1; -drop table t1; -set autocommit=1; -CREATE TABLE t1 (ID INTEGER NOT NULL PRIMARY KEY, NAME VARCHAR(64)) ENGINE=innodb; -INSERT INTO t1 VALUES (1, 'Jochen'); -select * from t1; -ID NAME -1 Jochen -drop table t1; -CREATE TABLE t1 ( _userid VARCHAR(60) NOT NULL PRIMARY KEY) ENGINE=innodb; -set autocommit=0; -INSERT INTO t1 SET _userid='marc@anyware.co.uk'; -COMMIT; -SELECT * FROM t1; -_userid -marc@anyware.co.uk -SELECT _userid FROM t1 WHERE _userid='marc@anyware.co.uk'; -_userid -marc@anyware.co.uk -drop table t1; -set autocommit=1; -CREATE TABLE t1 ( -user_id int(10) DEFAULT '0' NOT NULL, -name varchar(100), -phone varchar(100), -ref_email varchar(100) DEFAULT '' NOT NULL, -detail varchar(200), -PRIMARY KEY (user_id,ref_email) -)engine=innodb; -INSERT INTO t1 VALUES (10292,'sanjeev','29153373','sansh777@hotmail.com','xxx'),(10292,'shirish','2333604','shirish@yahoo.com','ddsds'),(10292,'sonali','323232','sonali@bolly.com','filmstar'); -select * from t1 where user_id=10292; -user_id name phone ref_email detail -10292 sanjeev 29153373 sansh777@hotmail.com xxx -10292 shirish 2333604 shirish@yahoo.com ddsds -10292 sonali 323232 sonali@bolly.com filmstar -INSERT INTO t1 VALUES (10291,'sanjeev','29153373','sansh777@hotmail.com','xxx'),(10293,'shirish','2333604','shirish@yahoo.com','ddsds'); -select * from t1 where user_id=10292; -user_id name phone ref_email detail -10292 sanjeev 29153373 sansh777@hotmail.com xxx -10292 shirish 2333604 shirish@yahoo.com ddsds -10292 sonali 323232 sonali@bolly.com filmstar -select * from t1 where user_id>=10292; -user_id name phone ref_email detail -10292 sanjeev 29153373 sansh777@hotmail.com xxx -10292 shirish 2333604 shirish@yahoo.com ddsds -10292 sonali 323232 sonali@bolly.com filmstar -10293 shirish 2333604 shirish@yahoo.com ddsds -select * from t1 where user_id>10292; -user_id name phone ref_email detail -10293 shirish 2333604 shirish@yahoo.com ddsds -select * from t1 where user_id<10292; -user_id name phone ref_email detail -10291 sanjeev 29153373 sansh777@hotmail.com xxx -drop table t1; -CREATE TABLE t1 (a int not null, b int not null,c int not null, -key(a),primary key(a,b), unique(c),key(a),unique(b)); -show index from t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 PRIMARY 1 a A # NULL NULL BTREE -t1 0 PRIMARY 2 b A # NULL NULL BTREE -t1 0 c 1 c A # NULL NULL BTREE -t1 0 b 1 b A # NULL NULL BTREE -t1 1 a 1 a A # NULL NULL BTREE -t1 1 a_2 1 a A # NULL NULL BTREE -drop table t1; -create table t1 (col1 int not null, col2 char(4) not null, primary key(col1)); -alter table t1 engine=innodb; -insert into t1 values ('1','1'),('5','2'),('2','3'),('3','4'),('4','4'); -select * from t1; -col1 col2 -1 1 -2 3 -3 4 -4 4 -5 2 -update t1 set col2='7' where col1='4'; -select * from t1; -col1 col2 -1 1 -2 3 -3 4 -4 7 -5 2 -alter table t1 add co3 int not null; -select * from t1; -col1 col2 co3 -1 1 0 -2 3 0 -3 4 0 -4 7 0 -5 2 0 -update t1 set col2='9' where col1='2'; -select * from t1; -col1 col2 co3 -1 1 0 -2 9 0 -3 4 0 -4 7 0 -5 2 0 -drop table t1; -create table t1 (a int not null , b int, primary key (a)) engine = innodb; -create table t2 (a int not null , b int, primary key (a)) engine = myisam; -insert into t1 VALUES (1,3) , (2,3), (3,3); -select * from t1; -a b -1 3 -2 3 -3 3 -insert into t2 select * from t1; -select * from t2; -a b -1 3 -2 3 -3 3 -delete from t1 where b = 3; -select * from t1; -a b -insert into t1 select * from t2; -select * from t1; -a b -1 3 -2 3 -3 3 -select * from t2; -a b -1 3 -2 3 -3 3 -drop table t1,t2; -CREATE TABLE t1 ( -id int(11) NOT NULL auto_increment, -ggid varchar(32) binary DEFAULT '' NOT NULL, -email varchar(64) DEFAULT '' NOT NULL, -passwd varchar(32) binary DEFAULT '' NOT NULL, -PRIMARY KEY (id), -UNIQUE ggid (ggid) -) ENGINE=innodb; -insert into t1 (ggid,passwd) values ('test1','xxx'); -insert into t1 (ggid,passwd) values ('test2','yyy'); -insert into t1 (ggid,passwd) values ('test2','this will fail'); -ERROR 23000: Duplicate entry 'test2' for key 2 -insert into t1 (ggid,id) values ('this will fail',1); -ERROR 23000: Duplicate entry '1' for key 1 -select * from t1 where ggid='test1'; -id ggid email passwd -1 test1 xxx -select * from t1 where passwd='xxx'; -id ggid email passwd -1 test1 xxx -select * from t1 where id=2; -id ggid email passwd -2 test2 yyy -replace into t1 (ggid,id) values ('this will work',1); -replace into t1 (ggid,passwd) values ('test2','this will work'); -update t1 set id=100,ggid='test2' where id=1; -ERROR 23000: Duplicate entry 'test2' for key 2 -select * from t1; -id ggid email passwd -1 this will work -3 test2 this will work -select * from t1 where id=1; -id ggid email passwd -1 this will work -select * from t1 where id=999; -id ggid email passwd -drop table t1; -CREATE TABLE t1 ( -user_name varchar(12), -password text, -subscribed char(1), -user_id int(11) DEFAULT '0' NOT NULL, -quota bigint(20), -weight double, -access_date date, -access_time time, -approved datetime, -dummy_primary_key int(11) NOT NULL auto_increment, -PRIMARY KEY (dummy_primary_key) -) ENGINE=innodb; -INSERT INTO t1 VALUES ('user_0','somepassword','N',0,0,0,'2000-09-07','23:06:59','2000-09-07 23:06:59',1); -INSERT INTO t1 VALUES ('user_1','somepassword','Y',1,1,1,'2000-09-07','23:06:59','2000-09-07 23:06:59',2); -INSERT INTO t1 VALUES ('user_2','somepassword','N',2,2,1.4142135623731,'2000-09-07','23:06:59','2000-09-07 23:06:59',3); -INSERT INTO t1 VALUES ('user_3','somepassword','Y',3,3,1.7320508075689,'2000-09-07','23:06:59','2000-09-07 23:06:59',4); -INSERT INTO t1 VALUES ('user_4','somepassword','N',4,4,2,'2000-09-07','23:06:59','2000-09-07 23:06:59',5); -select user_name, password , subscribed, user_id, quota, weight, access_date, access_time, approved, dummy_primary_key from t1 order by user_name; -user_name password subscribed user_id quota weight access_date access_time approved dummy_primary_key -user_0 somepassword N 0 0 0 2000-09-07 23:06:59 2000-09-07 23:06:59 1 -user_1 somepassword Y 1 1 1 2000-09-07 23:06:59 2000-09-07 23:06:59 2 -user_2 somepassword N 2 2 1.4142135623731 2000-09-07 23:06:59 2000-09-07 23:06:59 3 -user_3 somepassword Y 3 3 1.7320508075689 2000-09-07 23:06:59 2000-09-07 23:06:59 4 -user_4 somepassword N 4 4 2 2000-09-07 23:06:59 2000-09-07 23:06:59 5 -drop table t1; -CREATE TABLE t1 ( -id int(11) NOT NULL auto_increment, -parent_id int(11) DEFAULT '0' NOT NULL, -level tinyint(4) DEFAULT '0' NOT NULL, -KEY (id), -KEY parent_id (parent_id), -KEY level (level) -) engine=innodb; -INSERT INTO t1 VALUES (1,0,0),(3,1,1),(4,1,1),(8,2,2),(9,2,2),(17,3,2),(22,4,2),(24,4,2),(28,5,2),(29,5,2),(30,5,2),(31,6,2),(32,6,2),(33,6,2),(203,7,2),(202,7,2),(20,3,2),(157,0,0),(193,5,2),(40,7,2),(2,1,1),(15,2,2),(6,1,1),(34,6,2),(35,6,2),(16,3,2),(7,1,1),(36,7,2),(18,3,2),(26,5,2),(27,5,2),(183,4,2),(38,7,2),(25,5,2),(37,7,2),(21,4,2),(19,3,2),(5,1,1); -INSERT INTO t1 values (179,5,2); -update t1 set parent_id=parent_id+100; -select * from t1 where parent_id=102; -id parent_id level -8 102 2 -9 102 2 -15 102 2 -update t1 set id=id+1000; -update t1 set id=1024 where id=1009; -select * from t1; -id parent_id level -1001 100 0 -1003 101 1 -1004 101 1 -1008 102 2 -1024 102 2 -1017 103 2 -1022 104 2 -1024 104 2 -1028 105 2 -1029 105 2 -1030 105 2 -1031 106 2 -1032 106 2 -1033 106 2 -1203 107 2 -1202 107 2 -1020 103 2 -1157 100 0 -1193 105 2 -1040 107 2 -1002 101 1 -1015 102 2 -1006 101 1 -1034 106 2 -1035 106 2 -1016 103 2 -1007 101 1 -1036 107 2 -1018 103 2 -1026 105 2 -1027 105 2 -1183 104 2 -1038 107 2 -1025 105 2 -1037 107 2 -1021 104 2 -1019 103 2 -1005 101 1 -1179 105 2 -update ignore t1 set id=id+1; -select * from t1; -id parent_id level -1002 100 0 -1004 101 1 -1005 101 1 -1009 102 2 -1025 102 2 -1018 103 2 -1023 104 2 -1025 104 2 -1029 105 2 -1030 105 2 -1031 105 2 -1032 106 2 -1033 106 2 -1034 106 2 -1204 107 2 -1203 107 2 -1021 103 2 -1158 100 0 -1194 105 2 -1041 107 2 -1003 101 1 -1016 102 2 -1007 101 1 -1035 106 2 -1036 106 2 -1017 103 2 -1008 101 1 -1037 107 2 -1019 103 2 -1027 105 2 -1028 105 2 -1184 104 2 -1039 107 2 -1026 105 2 -1038 107 2 -1022 104 2 -1020 103 2 -1006 101 1 -1180 105 2 -update ignore t1 set id=1023 where id=1010; -select * from t1 where parent_id=102; -id parent_id level -1009 102 2 -1025 102 2 -1016 102 2 -explain select level from t1 where level=1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ref level level 1 const # Using where; Using index -select level,id from t1 where level=1; -level id -1 1004 -1 1005 -1 1003 -1 1007 -1 1008 -1 1006 -select level,id,parent_id from t1 where level=1; -level id parent_id -1 1004 101 -1 1005 101 -1 1003 101 -1 1007 101 -1 1008 101 -1 1006 101 -select level,id from t1 where level=1 order by id; -level id -1 1003 -1 1004 -1 1005 -1 1006 -1 1007 -1 1008 -delete from t1 where level=1; -select * from t1; -id parent_id level -1002 100 0 -1009 102 2 -1025 102 2 -1018 103 2 -1023 104 2 -1025 104 2 -1029 105 2 -1030 105 2 -1031 105 2 -1032 106 2 -1033 106 2 -1034 106 2 -1204 107 2 -1203 107 2 -1021 103 2 -1158 100 0 -1194 105 2 -1041 107 2 -1016 102 2 -1035 106 2 -1036 106 2 -1017 103 2 -1037 107 2 -1019 103 2 -1027 105 2 -1028 105 2 -1184 104 2 -1039 107 2 -1026 105 2 -1038 107 2 -1022 104 2 -1020 103 2 -1180 105 2 -drop table t1; -CREATE TABLE t1 ( -sca_code char(6) NOT NULL, -cat_code char(6) NOT NULL, -sca_desc varchar(50), -lan_code char(2) NOT NULL, -sca_pic varchar(100), -sca_sdesc varchar(50), -sca_sch_desc varchar(16), -PRIMARY KEY (sca_code, cat_code, lan_code), -INDEX sca_pic (sca_pic) -) engine = innodb ; -INSERT INTO t1 ( sca_code, cat_code, sca_desc, lan_code, sca_pic, sca_sdesc, sca_sch_desc) VALUES ( 'PD', 'J', 'PENDANT', 'EN', NULL, NULL, 'PENDANT'),( 'RI', 'J', 'RING', 'EN', NULL, NULL, 'RING'),( 'QQ', 'N', 'RING', 'EN', 'not null', NULL, 'RING'); -select count(*) from t1 where sca_code = 'PD'; -count(*) -1 -select count(*) from t1 where sca_code <= 'PD'; -count(*) -1 -select count(*) from t1 where sca_pic is null; -count(*) -2 -alter table t1 drop index sca_pic, add index sca_pic (cat_code, sca_pic); -select count(*) from t1 where sca_code='PD' and sca_pic is null; -count(*) -1 -select count(*) from t1 where cat_code='E'; -count(*) -0 -alter table t1 drop index sca_pic, add index (sca_pic, cat_code); -select count(*) from t1 where sca_code='PD' and sca_pic is null; -count(*) -1 -select count(*) from t1 where sca_pic >= 'n'; -count(*) -1 -select sca_pic from t1 where sca_pic is null; -sca_pic -NULL -NULL -update t1 set sca_pic="test" where sca_pic is null; -delete from t1 where sca_code='pd'; -drop table t1; -set @a:=now(); -CREATE TABLE t1 (a int not null, b timestamp not null, primary key (a)) engine=innodb; -insert into t1 (a) values(1),(2),(3); -select t1.a from t1 natural join t1 as t2 where t1.b >= @a order by t1.a; -a -1 -2 -3 -update t1 set a=5 where a=1; -select a from t1; -a -2 -3 -5 -drop table t1; -create table t1 (a varchar(100) not null, primary key(a), b int not null) engine=innodb; -insert into t1 values("hello",1),("world",2); -select * from t1 order by b desc; -a b -world 2 -hello 1 -optimize table t1; -Table Op Msg_type Msg_text -test.t1 optimize status OK -show keys from t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 PRIMARY 1 a A # NULL NULL BTREE -drop table t1; -create table t1 (i int, j int ) ENGINE=innodb; -insert into t1 values (1,2); -select * from t1 where i=1 and j=2; -i j -1 2 -create index ax1 on t1 (i,j); -select * from t1 where i=1 and j=2; -i j -1 2 -drop table t1; -CREATE TABLE t1 ( -a int3 unsigned NOT NULL, -b int1 unsigned NOT NULL, -UNIQUE (a, b) -) ENGINE = innodb; -INSERT INTO t1 VALUES (1, 1); -SELECT MIN(B),MAX(b) FROM t1 WHERE t1.a = 1; -MIN(B) MAX(b) -1 1 -drop table t1; -CREATE TABLE t1 (a int unsigned NOT NULL) engine=innodb; -INSERT INTO t1 VALUES (1); -SELECT * FROM t1; -a -1 -DROP TABLE t1; -create table t1 (a int primary key,b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int, a1 int, a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int, b1 int, b2 int, b3 int, b4 int, b5 int, b6 int) engine = innodb; -insert into t1 values (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -explain select * from t1 where a > 0 and a < 50; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL # Using where -drop table t1; -create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(30),primary key (id,id2),index index_id3 (id3)) engine=innodb; -insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL'); -LOCK TABLES t1 WRITE; -insert into t1 values (99,1,2,'D'),(1,1,2,'D'); -ERROR 23000: Duplicate entry '1-1' for key 1 -select id from t1; -id -0 -1 -2 -select id from t1; -id -0 -1 -2 -UNLOCK TABLES; -DROP TABLE t1; -create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(30),primary key (id,id2),index index_id3 (id3)) engine=innodb; -insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL'); -LOCK TABLES t1 WRITE; -begin; -insert into t1 values (99,1,2,'D'),(1,1,2,'D'); -ERROR 23000: Duplicate entry '1-1' for key 1 -select id from t1; -id -0 -1 -2 -insert ignore into t1 values (100,1,2,'D'),(1,1,99,'D'); -commit; -select id,id3 from t1; -id id3 -0 0 -1 1 -2 2 -100 2 -UNLOCK TABLES; -DROP TABLE t1; -create table t1 (a char(20), unique (a(5))) engine=innodb; -drop table t1; -create table t1 (a char(20), index (a(5))) engine=innodb; -show create table t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `a` char(20) default NULL, - KEY `a` (`a`(5)) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop table t1; -create temporary table t1 (a int not null auto_increment, primary key(a)) engine=innodb; -insert into t1 values (NULL),(NULL),(NULL); -delete from t1 where a=3; -insert into t1 values (NULL); -select * from t1; -a -1 -2 -4 -alter table t1 add b int; -select * from t1; -a b -1 NULL -2 NULL -4 NULL -drop table t1; -create table t1 -( -id int auto_increment primary key, -name varchar(32) not null, -value text not null, -uid int not null, -unique key(name,uid) -) engine=innodb; -insert into t1 values (1,'one','one value',101), -(2,'two','two value',102),(3,'three','three value',103); -set insert_id=5; -replace into t1 (value,name,uid) values ('other value','two',102); -delete from t1 where uid=102; -set insert_id=5; -replace into t1 (value,name,uid) values ('other value','two',102); -set insert_id=6; -replace into t1 (value,name,uid) values ('other value','two',102); -select * from t1; -id name value uid -1 one one value 101 -3 three three value 103 -6 two other value 102 -drop table t1; -create database mysqltest; -create table mysqltest.t1 (a int not null) engine= innodb; -insert into mysqltest.t1 values(1); -create table mysqltest.t2 (a int not null) engine= myisam; -insert into mysqltest.t2 values(1); -create table mysqltest.t3 (a int not null) engine= heap; -insert into mysqltest.t3 values(1); -commit; -drop database mysqltest; -show tables from mysqltest; -Got one of the listed errors -set autocommit=0; -create table t1 (a int not null) engine= innodb; -insert into t1 values(1),(2); -truncate table t1; -ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction -commit; -truncate table t1; -select * from t1; -a -insert into t1 values(1),(2); -delete from t1; -select * from t1; -a -commit; -drop table t1; -set autocommit=1; -create table t1 (a int not null) engine= innodb; -insert into t1 values(1),(2); -truncate table t1; -insert into t1 values(1),(2); -select * from t1; -a -1 -2 -truncate table t1; -insert into t1 values(1),(2); -delete from t1; -select * from t1; -a -drop table t1; -create table t1 (a int not null, b int not null, c int not null, primary key (a),key(b)) engine=innodb; -insert into t1 values (3,3,3),(1,1,1),(2,2,2),(4,4,4); -explain select * from t1 order by a; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index NULL PRIMARY 4 NULL # -explain select * from t1 order by b; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index NULL b 4 NULL # -explain select * from t1 order by c; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL NULL NULL NULL NULL # Using filesort -explain select a from t1 order by a; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index NULL PRIMARY 4 NULL # Using index -explain select b from t1 order by b; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index NULL b 4 NULL # Using index -explain select a,b from t1 order by b; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index NULL b 4 NULL # Using index -explain select a,b from t1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index NULL b 4 NULL # Using index -explain select a,b,c from t1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL NULL NULL NULL NULL # -drop table t1; -create table t1 (t int not null default 1, key (t)) engine=innodb; -desc t1; -Field Type Null Key Default Extra -t int(11) MUL 1 -drop table t1; -CREATE TABLE t1 ( -number bigint(20) NOT NULL default '0', -cname char(15) NOT NULL default '', -carrier_id smallint(6) NOT NULL default '0', -privacy tinyint(4) NOT NULL default '0', -last_mod_date timestamp(14) NOT NULL, -last_mod_id smallint(6) NOT NULL default '0', -last_app_date timestamp(14) NOT NULL, -last_app_id smallint(6) default '-1', -version smallint(6) NOT NULL default '0', -assigned_scps int(11) default '0', -status tinyint(4) default '0' -) ENGINE=InnoDB; -INSERT INTO t1 VALUES (4077711111,'SeanWheeler',90,2,20020111112846,500,00000000000000,-1,2,3,1); -INSERT INTO t1 VALUES (9197722223,'berry',90,3,20020111112809,500,20020102114532,501,4,10,0); -INSERT INTO t1 VALUES (650,'San Francisco',0,0,20011227111336,342,00000000000000,-1,1,24,1); -INSERT INTO t1 VALUES (302467,'Sue\'s Subshop',90,3,20020109113241,500,20020102115111,501,7,24,0); -INSERT INTO t1 VALUES (6014911113,'SudzCarwash',520,1,20020102115234,500,20020102115259,501,33,32768,0); -INSERT INTO t1 VALUES (333,'tubs',99,2,20020109113440,501,20020109113440,500,3,10,0); -CREATE TABLE t2 ( -number bigint(20) NOT NULL default '0', -cname char(15) NOT NULL default '', -carrier_id smallint(6) NOT NULL default '0', -privacy tinyint(4) NOT NULL default '0', -last_mod_date timestamp(14) NOT NULL, -last_mod_id smallint(6) NOT NULL default '0', -last_app_date timestamp(14) NOT NULL, -last_app_id smallint(6) default '-1', -version smallint(6) NOT NULL default '0', -assigned_scps int(11) default '0', -status tinyint(4) default '0' -) ENGINE=InnoDB; -INSERT INTO t2 VALUES (4077711111,'SeanWheeler',0,2,20020111112853,500,00000000000000,-1,2,3,1); -INSERT INTO t2 VALUES (9197722223,'berry',90,3,20020111112818,500,20020102114532,501,4,10,0); -INSERT INTO t2 VALUES (650,'San Francisco',90,0,20020109113158,342,00000000000000,-1,1,24,1); -INSERT INTO t2 VALUES (333,'tubs',99,2,20020109113453,501,20020109113453,500,3,10,0); -select * from t1; -number cname carrier_id privacy last_mod_date last_mod_id last_app_date last_app_id version assigned_scps status -4077711111 SeanWheeler 90 2 2002-01-11 11:28:46 500 0000-00-00 00:00:00 -1 2 3 1 -9197722223 berry 90 3 2002-01-11 11:28:09 500 2002-01-02 11:45:32 501 4 10 0 -650 San Francisco 0 0 2001-12-27 11:13:36 342 0000-00-00 00:00:00 -1 1 24 1 -302467 Sue's Subshop 90 3 2002-01-09 11:32:41 500 2002-01-02 11:51:11 501 7 24 0 -6014911113 SudzCarwash 520 1 2002-01-02 11:52:34 500 2002-01-02 11:52:59 501 33 32768 0 -333 tubs 99 2 2002-01-09 11:34:40 501 2002-01-09 11:34:40 500 3 10 0 -select * from t2; -number cname carrier_id privacy last_mod_date last_mod_id last_app_date last_app_id version assigned_scps status -4077711111 SeanWheeler 0 2 2002-01-11 11:28:53 500 0000-00-00 00:00:00 -1 2 3 1 -9197722223 berry 90 3 2002-01-11 11:28:18 500 2002-01-02 11:45:32 501 4 10 0 -650 San Francisco 90 0 2002-01-09 11:31:58 342 0000-00-00 00:00:00 -1 1 24 1 -333 tubs 99 2 2002-01-09 11:34:53 501 2002-01-09 11:34:53 500 3 10 0 -delete t1, t2 from t1 left join t2 on t1.number=t2.number where (t1.carrier_id=90 and t1.number=t2.number) or (t2.carrier_id=90 and t1.number=t2.number) or (t1.carrier_id=90 and t2.number is null); -select * from t1; -number cname carrier_id privacy last_mod_date last_mod_id last_app_date last_app_id version assigned_scps status -6014911113 SudzCarwash 520 1 2002-01-02 11:52:34 500 2002-01-02 11:52:59 501 33 32768 0 -333 tubs 99 2 2002-01-09 11:34:40 501 2002-01-09 11:34:40 500 3 10 0 -select * from t2; -number cname carrier_id privacy last_mod_date last_mod_id last_app_date last_app_id version assigned_scps status -333 tubs 99 2 2002-01-09 11:34:53 501 2002-01-09 11:34:53 500 3 10 0 -select * from t2; -number cname carrier_id privacy last_mod_date last_mod_id last_app_date last_app_id version assigned_scps status -333 tubs 99 2 2002-01-09 11:34:53 501 2002-01-09 11:34:53 500 3 10 0 -drop table t1,t2; -create table t1 (id int unsigned not null auto_increment, code tinyint unsigned not null, name char(20) not null, primary key (id), key (code), unique (name)) engine=innodb; -BEGIN; -SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; -SELECT @@tx_isolation,@@global.tx_isolation; -@@tx_isolation @@global.tx_isolation -SERIALIZABLE REPEATABLE-READ -insert into t1 (code, name) values (1, 'Tim'), (1, 'Monty'), (2, 'David'); -select id, code, name from t1 order by id; -id code name -1 1 Tim -2 1 Monty -3 2 David -COMMIT; -BEGIN; -SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; -insert into t1 (code, name) values (2, 'Erik'), (3, 'Sasha'); -select id, code, name from t1 order by id; -id code name -1 1 Tim -2 1 Monty -3 2 David -4 2 Erik -5 3 Sasha -COMMIT; -BEGIN; -SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -insert into t1 (code, name) values (3, 'Jeremy'), (4, 'Matt'); -select id, code, name from t1 order by id; -id code name -1 1 Tim -2 1 Monty -3 2 David -4 2 Erik -5 3 Sasha -6 3 Jeremy -7 4 Matt -COMMIT; -DROP TABLE t1; -create table t1 (n int(10), d int(10)) engine=innodb; -create table t2 (n int(10), d int(10)) engine=innodb; -insert into t1 values(1,1),(1,2); -insert into t2 values(1,10),(2,20); -UPDATE t1,t2 SET t1.d=t2.d,t2.d=30 WHERE t1.n=t2.n; -select * from t1; -n d -1 10 -1 10 -select * from t2; -n d -1 30 -2 20 -drop table t1,t2; -create table t1 (a int, b int) engine=innodb; -insert into t1 values(20,null); -select t2.b, ifnull(t2.b,"this is null") from t1 as t2 left join t1 as t3 on -t2.b=t3.a; -b ifnull(t2.b,"this is null") -NULL this is null -select t2.b, ifnull(t2.b,"this is null") from t1 as t2 left join t1 as t3 on -t2.b=t3.a order by 1; -b ifnull(t2.b,"this is null") -NULL this is null -insert into t1 values(10,null); -select t2.b, ifnull(t2.b,"this is null") from t1 as t2 left join t1 as t3 on -t2.b=t3.a order by 1; -b ifnull(t2.b,"this is null") -NULL this is null -NULL this is null -drop table t1; -create table t1 (a varchar(10) not null) engine=myisam; -create table t2 (b varchar(10) not null unique) engine=innodb; -select t1.a from t1,t2 where t1.a=t2.b; -a -drop table t1,t2; -create table t1 (a int not null, b int, primary key (a)) engine = innodb; -create table t2 (a int not null, b int, primary key (a)) engine = innodb; -insert into t1 values (10, 20); -insert into t2 values (10, 20); -update t1, t2 set t1.b = 150, t2.b = t1.b where t2.a = t1.a and t1.a = 10; -drop table t1,t2; -CREATE TABLE t1 (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; -CREATE TABLE t2 (id INT PRIMARY KEY, t1_id INT, INDEX par_ind (t1_id), FOREIGN KEY (t1_id) REFERENCES t1(id) ON DELETE CASCADE ) ENGINE=INNODB; -insert into t1 set id=1; -insert into t2 set id=1, t1_id=1; -delete t1,t2 from t1,t2 where t1.id=t2.t1_id; -select * from t1; -id -select * from t2; -id t1_id -drop table t2,t1; -CREATE TABLE t1(id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; -CREATE TABLE t2(id INT PRIMARY KEY, t1_id INT, INDEX par_ind (t1_id) ) ENGINE=INNODB; -INSERT INTO t1 VALUES(1); -INSERT INTO t2 VALUES(1, 1); -SELECT * from t1; -id -1 -UPDATE t1,t2 SET t1.id=t1.id+1, t2.t1_id=t1.id+1; -SELECT * from t1; -id -2 -UPDATE t1,t2 SET t1.id=t1.id+1 where t1.id!=t2.id; -SELECT * from t1; -id -3 -DROP TABLE t1,t2; -set autocommit=0; -CREATE TABLE t1 (id CHAR(15) NOT NULL, value CHAR(40) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB; -CREATE TABLE t2 (id CHAR(15) NOT NULL, value CHAR(40) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB; -CREATE TABLE t3 (id1 CHAR(15) NOT NULL, id2 CHAR(15) NOT NULL, PRIMARY KEY(id1, id2)) ENGINE=InnoDB; -INSERT INTO t3 VALUES("my-test-1", "my-test-2"); -COMMIT; -INSERT INTO t1 VALUES("this-key", "will disappear"); -INSERT INTO t2 VALUES("this-key", "will also disappear"); -DELETE FROM t3 WHERE id1="my-test-1"; -SELECT * FROM t1; -id value -this-key will disappear -SELECT * FROM t2; -id value -this-key will also disappear -SELECT * FROM t3; -id1 id2 -ROLLBACK; -SELECT * FROM t1; -id value -SELECT * FROM t2; -id value -SELECT * FROM t3; -id1 id2 -my-test-1 my-test-2 -SELECT * FROM t3 WHERE id1="my-test-1" LOCK IN SHARE MODE; -id1 id2 -my-test-1 my-test-2 -COMMIT; -set autocommit=1; -DROP TABLE t1,t2,t3; -CREATE TABLE t1 (a int not null primary key, b int not null, unique (b)) engine=innodb; -INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9); -UPDATE t1 set a=a+100 where b between 2 and 3 and a < 1000; -SELECT * from t1; -a b -1 1 -102 2 -103 3 -4 4 -5 5 -6 6 -7 7 -8 8 -9 9 -drop table t1; -CREATE TABLE t1 (a int not null primary key, b int not null, key (b)) engine=innodb; -CREATE TABLE t2 (a int not null primary key, b int not null, key (b)) engine=innodb; -INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10),(11,11),(12,12); -INSERT INTO t2 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9); -update t1,t2 set t1.a=t1.a+100; -select * from t1; -a b -101 1 -102 2 -103 3 -104 4 -105 5 -106 6 -107 7 -108 8 -109 9 -110 10 -111 11 -112 12 -update t1,t2 set t1.a=t1.a+100 where t1.a=101; -select * from t1; -a b -201 1 -102 2 -103 3 -104 4 -105 5 -106 6 -107 7 -108 8 -109 9 -110 10 -111 11 -112 12 -update t1,t2 set t1.b=t1.b+10 where t1.b=2; -select * from t1; -a b -201 1 -103 3 -104 4 -105 5 -106 6 -107 7 -108 8 -109 9 -110 10 -111 11 -102 12 -112 12 -update t1,t2 set t1.b=t1.b+2,t2.b=t1.b+10 where t1.b between 3 and 5 and t1.a=t2.a+100; -select * from t1; -a b -201 1 -103 5 -104 6 -106 6 -105 7 -107 7 -108 8 -109 9 -110 10 -111 11 -102 12 -112 12 -select * from t2; -a b -1 1 -2 2 -6 6 -7 7 -8 8 -9 9 -3 13 -4 14 -5 15 -drop table t1,t2; -CREATE TABLE t2 ( NEXT_T BIGINT NOT NULL PRIMARY KEY) ENGINE=MyISAM; -CREATE TABLE t1 ( B_ID INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB; -SET AUTOCOMMIT=0; -INSERT INTO t1 ( B_ID ) VALUES ( 1 ); -INSERT INTO t2 ( NEXT_T ) VALUES ( 1 ); -ROLLBACK; -Warnings: -Warning 1196 Some non-transactional changed tables couldn't be rolled back -SELECT * FROM t1; -B_ID -drop table t1,t2; -create table t1 ( pk int primary key, parent int not null, child int not null, index (parent) ) engine = innodb; -insert into t1 values (1,0,4), (2,1,3), (3,2,1), (4,1,2); -select distinct parent,child from t1 order by parent; -parent child -0 4 -1 2 -1 3 -2 1 -drop table t1; -create table t1 (a int not null auto_increment primary key, b int, c int, key(c)) engine=innodb; -create table t2 (a int not null auto_increment primary key, b int); -insert into t1 (b) values (null),(null),(null),(null),(null),(null),(null); -insert into t2 (a) select b from t1; -insert into t1 (b) select b from t2; -insert into t2 (a) select b from t1; -insert into t1 (a) select b from t2; -insert into t2 (a) select b from t1; -insert into t1 (a) select b from t2; -insert into t2 (a) select b from t1; -insert into t1 (a) select b from t2; -insert into t2 (a) select b from t1; -insert into t1 (a) select b from t2; -insert into t2 (a) select b from t1; -insert into t1 (a) select b from t2; -insert into t2 (a) select b from t1; -insert into t1 (a) select b from t2; -insert into t2 (a) select b from t1; -insert into t1 (a) select b from t2; -insert into t2 (a) select b from t1; -insert into t1 (a) select b from t2; -select count(*) from t1; -count(*) -29267 -explain select * from t1 where c between 1 and 10000; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range c c 5 NULL # Using where -update t1 set c=a; -explain select * from t1 where c between 1 and 10000; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL c NULL NULL NULL # Using where -drop table t1,t2; -create table t1 (id int primary key auto_increment, fk int, index index_fk (fk)) engine=innodb; -insert into t1 (id) values (null),(null),(null),(null),(null); -update t1 set fk=69 where fk is null order by id limit 1; -SELECT * from t1; -id fk -2 NULL -3 NULL -4 NULL -5 NULL -1 69 -drop table t1; -create table t1 (a int not null, b int not null, key (a)); -insert into t1 values (1,1),(1,2),(1,3),(3,1),(3,2),(3,3),(3,1),(3,2),(3,3),(2,1),(2,2),(2,3); -SET @tmp=0; -update t1 set b=(@tmp:=@tmp+1) order by a; -update t1 set b=99 where a=1 order by b asc limit 1; -update t1 set b=100 where a=1 order by b desc limit 2; -update t1 set a=a+10+b where a=1 order by b; -select * from t1 order by a,b; -a b -2 4 -2 5 -2 6 -3 7 -3 8 -3 9 -3 10 -3 11 -3 12 -13 2 -111 100 -111 100 -drop table t1; -create table t1 ( c char(8) not null ) engine=innodb; -insert into t1 values ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'); -insert into t1 values ('A'),('B'),('C'),('D'),('E'),('F'); -alter table t1 add b char(8) not null; -alter table t1 add a char(8) not null; -alter table t1 add primary key (a,b,c); -update t1 set a=c, b=c; -create table t2 (c char(8) not null, b char(8) not null, a char(8) not null, primary key(a,b,c)) engine=innodb; -insert into t2 select * from t1; -delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b; -drop table t1,t2; -SET AUTOCOMMIT=1; -create table t1 (a integer auto_increment primary key) engine=innodb; -insert into t1 (a) values (NULL),(NULL); -truncate table t1; -insert into t1 (a) values (NULL),(NULL); -SELECT * from t1; -a -3 -4 -drop table t1; -CREATE TABLE t1 (`id 1` INT NOT NULL, PRIMARY KEY (`id 1`)) ENGINE=INNODB; -CREATE TABLE t2 (id INT PRIMARY KEY, t1_id INT, INDEX par_ind (t1_id), FOREIGN KEY (`t1_id`) REFERENCES `t1`(`id 1`) ON DELETE CASCADE ) ENGINE=INNODB; -drop table t2,t1; -create table `t1` (`id` int( 11 ) not null ,primary key ( `id` )) engine = innodb; -insert into `t1`values ( 1 ) ; -create table `t2` (`id` int( 11 ) not null default '0',unique key `id` ( `id` ) ,constraint `t1_id_fk` foreign key ( `id` ) references `t1` (`id` )) engine = innodb; -insert into `t2`values ( 1 ) ; -create table `t3` (`id` int( 11 ) not null default '0',key `id` ( `id` ) ,constraint `t2_id_fk` foreign key ( `id` ) references `t2` (`id` )) engine = innodb; -insert into `t3`values ( 1 ) ; -delete t3,t2,t1 from t1,t2,t3 where t1.id =1 and t2.id = t1.id and t3.id = t2.id; -ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails -update t1,t2,t3 set t3.id=5, t2.id=6, t1.id=7 where t1.id =1 and t2.id = t1.id and t3.id = t2.id; -ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails -update t3 set t3.id=7 where t1.id =1 and t2.id = t1.id and t3.id = t2.id; -ERROR 42S02: Unknown table 't1' in where clause -drop table t3,t2,t1; -create table t1( -id int primary key, -pid int, -index(pid), -foreign key(pid) references t1(id) on delete cascade) engine=innodb; -insert into t1 values(0,0),(1,0),(2,1),(3,2),(4,3),(5,4),(6,5),(7,6), -(8,7),(9,8),(10,9),(11,10),(12,11),(13,12),(14,13),(15,14); -delete from t1 where id=0; -ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails -delete from t1 where id=15; -delete from t1 where id=0; -drop table t1; -CREATE TABLE t1 (col1 int(1))ENGINE=InnoDB; -CREATE TABLE t2 (col1 int(1),stamp TIMESTAMP,INDEX stamp_idx -(stamp))ENGINE=InnoDB; -insert into t1 values (1),(2),(3); -insert into t2 values (1, 20020204130000),(2, 20020204130000),(4,20020204310000 ),(5,20020204230000); -Warnings: -Warning 1265 Data truncated for column 'stamp' at row 3 -SELECT col1 FROM t1 UNION SELECT col1 FROM t2 WHERE stamp < -'20020204120000' GROUP BY col1; -col1 -1 -2 -3 -4 -drop table t1,t2; -CREATE TABLE t1 ( -`id` int(10) unsigned NOT NULL auto_increment, -`id_object` int(10) unsigned default '0', -`id_version` int(10) unsigned NOT NULL default '1', -label varchar(100) NOT NULL default '', -`description` text, -PRIMARY KEY (`id`), -KEY `id_object` (`id_object`), -KEY `id_version` (`id_version`) -) ENGINE=InnoDB; -INSERT INTO t1 VALUES("6", "3382", "9", "Test", NULL), ("7", "102", "5", "Le Pekin (Test)", NULL),("584", "1794", "4", "Test de resto", NULL),("837", "1822", "6", "Test 3", NULL),("1119", "3524", "1", "Societe Test", NULL),("1122", "3525", "1", "Fournisseur Test", NULL); -CREATE TABLE t2 ( -`id` int(10) unsigned NOT NULL auto_increment, -`id_version` int(10) unsigned NOT NULL default '1', -PRIMARY KEY (`id`), -KEY `id_version` (`id_version`) -) ENGINE=InnoDB; -INSERT INTO t2 VALUES("3524", "1"),("3525", "1"),("1794", "4"),("102", "5"),("1822", "6"),("3382", "9"); -SELECT t2.id, t1.label FROM t2 INNER JOIN -(SELECT t1.id_object as id_object FROM t1 WHERE t1.label LIKE '%test%') AS lbl -ON (t2.id = lbl.id_object) INNER JOIN t1 ON (t2.id = t1.id_object); -id label -3382 Test -102 Le Pekin (Test) -1794 Test de resto -1822 Test 3 -3524 Societe Test -3525 Fournisseur Test -drop table t1,t2; -create table t1 (c1 char(5) unique not null, c2 int, stamp timestamp) engine=innodb; -select * from t1; -c1 c2 stamp -replace delayed into t1 (c1, c2) values ( "text1","11"),( "text2","12"); -select * from t1; -c1 c2 stamp -text1 11 2004-12-01 13:23:14 -text2 12 2004-12-01 13:23:14 -replace delayed into t1 (c1, c2) values ( "text1","12"),( "text2","13"),( "text3","14", "a" ),( "text4","15", "b" ); -ERROR 21S01: Column count doesn't match value count at row 3 -select * from t1; -c1 c2 stamp -text1 11 2004-12-01 13:23:14 -text2 12 2004-12-01 13:23:14 -drop table t1; -create table t1 (a int, b varchar(200), c text not null) checksum=1 engine=myisam; -create table t2 (a int, b varchar(200), c text not null) checksum=0 engine=innodb; -create table t3 (a int, b varchar(200), c text not null) checksum=1 engine=innodb; -insert t1 values (1, "aaa", "bbb"), (NULL, "", "ccccc"), (0, NULL, ""); -insert t2 select * from t1; -insert t3 select * from t1; -checksum table t1, t2, t3, t4 quick; -Table Checksum -test.t1 968604391 -test.t2 NULL -test.t3 NULL -test.t4 NULL -checksum table t1, t2, t3, t4; -Table Checksum -test.t1 968604391 -test.t2 968604391 -test.t3 968604391 -test.t4 NULL -checksum table t1, t2, t3, t4 extended; -Table Checksum -test.t1 968604391 -test.t2 968604391 -test.t3 968604391 -test.t4 NULL -drop table t1,t2,t3; -create table t1 (id int, name char(10) not null, name2 char(10) not null) engine=innodb; -insert into t1 values(1,'first','fff'),(2,'second','sss'),(3,'third','ttt'); -select name2 from t1 union all select name from t1 union all select id from t1; -name2 -fff -sss -ttt -first -second -third -1 -2 -3 -drop table t1; -create table t1 (a int) engine=innodb; -create table t2 like t1; -drop table t1,t2; -create table t1 (id int(11) not null, id2 int(11) not null, unique (id,id2)) engine=innodb; -create table t2 (id int(11) not null, constraint t1_id_fk foreign key ( id ) references t1 (id)) engine = innodb; -show create table t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `id` int(11) NOT NULL default '0', - `id2` int(11) NOT NULL default '0', - UNIQUE KEY `id` (`id`,`id2`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL default '0', - KEY `t1_id_fk` (`id`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -create index id on t2 (id); -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL default '0', - KEY `id` (`id`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -create index id2 on t2 (id); -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL default '0', - KEY `id` (`id`), - KEY `id2` (`id`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop index id2 on t2; -drop index id on t2; -Got one of the listed errors -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL default '0', - KEY `id` (`id`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop table t2; -create table t2 (id int(11) not null, id2 int(11) not null, constraint t1_id_fk foreign key (id,id2) references t1 (id,id2)) engine = innodb; -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL default '0', - `id2` int(11) NOT NULL default '0', - KEY `t1_id_fk` (`id`,`id2`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id`, `id2`) REFERENCES `t1` (`id`, `id2`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -create unique index id on t2 (id,id2); -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL default '0', - `id2` int(11) NOT NULL default '0', - UNIQUE KEY `id` (`id`,`id2`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id`, `id2`) REFERENCES `t1` (`id`, `id2`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop table t2; -create table t2 (id int(11) not null, id2 int(11) not null, unique (id,id2),constraint t1_id_fk foreign key (id2,id) references t1 (id,id2)) engine = innodb; -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL default '0', - `id2` int(11) NOT NULL default '0', - UNIQUE KEY `id` (`id`,`id2`), - KEY `t1_id_fk` (`id2`,`id`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id2`, `id`) REFERENCES `t1` (`id`, `id2`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop table t2; -create table t2 (id int(11) not null, id2 int(11) not null, unique (id,id2), constraint t1_id_fk foreign key (id) references t1 (id)) engine = innodb; -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL default '0', - `id2` int(11) NOT NULL default '0', - UNIQUE KEY `id` (`id`,`id2`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop table t2; -create table t2 (id int(11) not null, id2 int(11) not null, unique (id,id2),constraint t1_id_fk foreign key (id2,id) references t1 (id,id2)) engine = innodb; -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL default '0', - `id2` int(11) NOT NULL default '0', - UNIQUE KEY `id` (`id`,`id2`), - KEY `t1_id_fk` (`id2`,`id`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id2`, `id`) REFERENCES `t1` (`id`, `id2`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop table t2; -create table t2 (id int(11) not null auto_increment, id2 int(11) not null, constraint t1_id_fk foreign key (id) references t1 (id), primary key (id), index (id,id2)) engine = innodb; -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL auto_increment, - `id2` int(11) NOT NULL default '0', - PRIMARY KEY (`id`), - KEY `id` (`id`,`id2`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop table t2; -create table t2 (id int(11) not null auto_increment, id2 int(11) not null, constraint t1_id_fk foreign key (id) references t1 (id)) engine= innodb; -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL auto_increment, - `id2` int(11) NOT NULL default '0', - KEY `t1_id_fk` (`id`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -alter table t2 add index id_test (id), add index id_test2 (id,id2); -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `id` int(11) NOT NULL auto_increment, - `id2` int(11) NOT NULL default '0', - KEY `id_test` (`id`), - KEY `id_test2` (`id`,`id2`), - CONSTRAINT `t1_id_fk` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop table t2; -create table t2 (id int(11) not null, id2 int(11) not null, constraint t1_id_fk foreign key (id2,id) references t1 (id)) engine = innodb; -ERROR HY000: Can't create table '/home/hf/work/mysql-4.1.clean/mysql-test/var/master-data/test/t2.frm' (errno: 150) -create table t2 (a int auto_increment primary key, b int, index(b), foreign key (b) references t1(id), unique(b)) engine=innodb; -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `a` int(11) NOT NULL auto_increment, - `b` int(11) default NULL, - PRIMARY KEY (`a`), - UNIQUE KEY `b_2` (`b`), - KEY `b` (`b`), - CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`b`) REFERENCES `t1` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop table t2; -create table t2 (a int auto_increment primary key, b int, foreign key (b) references t1(id), foreign key (b) references t1(id), unique(b)) engine=innodb; -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `a` int(11) NOT NULL auto_increment, - `b` int(11) default NULL, - PRIMARY KEY (`a`), - UNIQUE KEY `b` (`b`), - CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`b`) REFERENCES `t1` (`id`), - CONSTRAINT `t2_ibfk_2` FOREIGN KEY (`b`) REFERENCES `t1` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop table t2, t1; -show status like "binlog_cache_use"; -Variable_name Value -Binlog_cache_use 24 -show status like "binlog_cache_disk_use"; -Variable_name Value -Binlog_cache_disk_use 0 -create table t1 (a int) engine=innodb; -show status like "binlog_cache_use"; -Variable_name Value -Binlog_cache_use 25 -show status like "binlog_cache_disk_use"; -Variable_name Value -Binlog_cache_disk_use 1 -begin; -delete from t1; -commit; -show status like "binlog_cache_use"; -Variable_name Value -Binlog_cache_use 26 -show status like "binlog_cache_disk_use"; -Variable_name Value -Binlog_cache_disk_use 1 -drop table t1; -create table t1 (c char(10), index (c,c)) engine=innodb; -ERROR 42S21: Duplicate column name 'c' -create table t1 (c1 char(10), c2 char(10), index (c1,c2,c1)) engine=innodb; -ERROR 42S21: Duplicate column name 'c1' -create table t1 (c1 char(10), c2 char(10), index (c1,c1,c2)) engine=innodb; -ERROR 42S21: Duplicate column name 'c1' -create table t1 (c1 char(10), c2 char(10), index (c2,c1,c1)) engine=innodb; -ERROR 42S21: Duplicate column name 'c1' -create table t1 (c1 char(10), c2 char(10)) engine=innodb; -alter table t1 add key (c1,c1); -ERROR 42S21: Duplicate column name 'c1' -alter table t1 add key (c2,c1,c1); -ERROR 42S21: Duplicate column name 'c1' -alter table t1 add key (c1,c2,c1); -ERROR 42S21: Duplicate column name 'c1' -alter table t1 add key (c1,c1,c2); -ERROR 42S21: Duplicate column name 'c1' -drop table t1; diff --git a/mysql-test/t/innodb-deadlock.test b/mysql-test/t/innodb-deadlock.test index 8a36982b0c1..7a7f657f35d 100644 --- a/mysql-test/t/innodb-deadlock.test +++ b/mysql-test/t/innodb-deadlock.test @@ -1,4 +1,6 @@ -- source include/have_innodb.inc +# Can't test this with embedded server +-- source include/not_embedded.inc connect (con1,localhost,root,,); connect (con2,localhost,root,,); diff --git a/mysql-test/t/innodb-lock.test b/mysql-test/t/innodb-lock.test index a3b6f8993f2..887a664e262 100644 --- a/mysql-test/t/innodb-lock.test +++ b/mysql-test/t/innodb-lock.test @@ -1,4 +1,6 @@ -- source include/have_innodb.inc +# Can't test this with embedded server +-- source include/not_embedded.inc # # Check and select innodb lock type diff --git a/mysql-test/t/innodb-replace.test b/mysql-test/t/innodb-replace.test new file mode 100644 index 00000000000..e7e96da1443 --- /dev/null +++ b/mysql-test/t/innodb-replace.test @@ -0,0 +1,17 @@ +-- source include/have_innodb.inc +# embedded server ignores 'delayed', so skip this +-- source include/not_embedded.inc + +# +# Bug #1078 +# +create table t1 (c1 char(5) unique not null, c2 int, stamp timestamp) engine=innodb; +select * from t1; +--error 1031 +replace delayed into t1 (c1, c2) values ( "text1","11"),( "text2","12"); +select * from t1; +--error 1031 +replace delayed into t1 (c1, c2) values ( "text1","12"),( "text2","13"),( "text3","14", "a" ),( "text4","15", "b" ); +select * from t1; +drop table t1; + diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test index cf7be4f882c..770221f5238 100644 --- a/mysql-test/t/innodb.test +++ b/mysql-test/t/innodb.test @@ -1021,19 +1021,6 @@ SELECT t2.id, t1.label FROM t2 INNER JOIN ON (t2.id = lbl.id_object) INNER JOIN t1 ON (t2.id = t1.id_object); drop table t1,t2; -# -# Bug #1078 -# -create table t1 (c1 char(5) unique not null, c2 int, stamp timestamp) engine=innodb; -select * from t1; ---error 1031 -replace delayed into t1 (c1, c2) values ( "text1","11"),( "text2","12"); -select * from t1; ---error 1031 -replace delayed into t1 (c1, c2) values ( "text1","12"),( "text2","13"),( "text3","14", "a" ),( "text4","15", "b" ); -select * from t1; -drop table t1; - create table t1 (a int, b varchar(200), c text not null) checksum=1 engine=myisam; create table t2 (a int, b varchar(200), c text not null) checksum=0 engine=innodb; create table t3 (a int, b varchar(200), c text not null) checksum=1 engine=innodb; @@ -1110,7 +1097,7 @@ show create table t2; drop table t2; # Test error handling ---replace_result \\ / +--replace_result \\ / $MYSQL_TEST_DIR . /var/master-data/ / --error 1005 create table t2 (id int(11) not null, id2 int(11) not null, constraint t1_id_fk foreign key (id2,id) references t1 (id)) engine = innodb; From 690183d1a0b088ec49d37948a38cee5304d1d3e5 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Tue, 29 Mar 2005 17:17:46 -0800 Subject: [PATCH 015/204] Eliminate most of the remaining hardcoded list of tests to skip by adding check for embedded server within tests and splitting some tests into multiple test files. --- mysql-test/mysql-test-run.sh | 17 +-- mysql-test/r/ps_1general.result | 82 -------------- mysql-test/r/ps_grant.result | 82 ++++++++++++++ mysql-test/r/rpl_variables.result | 8 ++ mysql-test/r/timezone2.result | 52 --------- mysql-test/r/timezone_grant.result | 52 +++++++++ mysql-test/r/user_var-binlog.result | 25 +++++ mysql-test/r/user_var.result | 25 ----- mysql-test/r/variables.result | 2 - mysql-test/t/mix_innodb_myisam_binlog.test | 3 + mysql-test/t/mysql_protocols.test | 2 + mysql-test/t/mysqlbinlog.test | 3 + mysql-test/t/mysqlbinlog2.test | 3 + mysql-test/t/mysqldump.test | 3 + mysql-test/t/packet.test | 2 + mysql-test/t/ps_1general.test | 115 +------------------- mysql-test/t/ps_grant.test | 120 +++++++++++++++++++++ mysql-test/t/rename.test | 4 + mysql-test/t/rpl_variables.test | 4 + mysql-test/t/show_check.test | 4 + mysql-test/t/system_mysql_db_fix.test | 3 + mysql-test/t/timezone2.test | 68 ------------ mysql-test/t/timezone_grant.test | 71 ++++++++++++ mysql-test/t/user_var-binlog.test | 19 ++++ mysql-test/t/user_var.test | 18 ---- mysql-test/t/variables.test | 2 - 26 files changed, 411 insertions(+), 378 deletions(-) create mode 100644 mysql-test/r/ps_grant.result create mode 100644 mysql-test/r/rpl_variables.result create mode 100644 mysql-test/r/timezone_grant.result create mode 100644 mysql-test/r/user_var-binlog.result create mode 100644 mysql-test/t/ps_grant.test create mode 100644 mysql-test/t/rpl_variables.test create mode 100644 mysql-test/t/timezone_grant.test create mode 100644 mysql-test/t/user_var-binlog.test diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 12d1c8723d9..b28bfd78d1b 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -1506,21 +1506,8 @@ run_testcase () # script soon anyway so it is not worth it spending the time if [ "x$USE_EMBEDDED_SERVER" = "x1" -a -z "$DO_TEST" ] ; then for t in \ - "init_connect" \ - "init_file" \ - "mix_innodb_myisam_binlog" \ - "mysqlbinlog2" \ - "mysqlbinlog" \ - "mysqldump" \ - "mysql_protocols" \ - "packet" \ - "ps_1general" \ - "rename" \ - "show_check" \ - "system_mysql_db_fix" \ - "timezone2" \ - "user_var" \ - "variables" + "init_connect" \ + "init_file" do if [ "$tname" = "$t" ] ; then skip_test $tname diff --git a/mysql-test/r/ps_1general.result b/mysql-test/r/ps_1general.result index 2356989eaf6..c17890d3e32 100644 --- a/mysql-test/r/ps_1general.result +++ b/mysql-test/r/ps_1general.result @@ -288,10 +288,6 @@ Variable_name Value sql_mode prepare stmt4 from ' show engine bdb logs '; execute stmt4; -prepare stmt4 from ' show full processlist '; -execute stmt4; -Id User Host db Command Time State Info -number root localhost test Query time NULL show full processlist prepare stmt4 from ' show grants for user '; prepare stmt4 from ' show create table t2 '; ERROR HY000: This command is not supported in the prepared statement protocol yet @@ -806,81 +802,3 @@ execute stmt1 ; prepare stmt1 from ' select * from t5 ' ; execute stmt1 ; drop table t5 ; -test_sequence ------- grant/revoke/drop affects a parallel session test ------ -show grants for second_user@localhost ; -ERROR 42000: There is no such grant defined for user 'second_user' on host 'localhost' -create database mysqltest; -use mysqltest; -use test; -grant usage on mysqltest.* to second_user@localhost -identified by 'looser' ; -grant select on mysqltest.t9 to second_user@localhost -identified by 'looser' ; -show grants for second_user@localhost ; -Grants for second_user@localhost -GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' -GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' -select current_user(); -current_user() -second_user@localhost -show grants for current_user(); -Grants for second_user@localhost -GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' -GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' -prepare s_t9 from 'select c1 as my_col - from t9 where c1= 1' ; -execute s_t9 ; -my_col -1 -select a as my_col from t1; -ERROR 42000: SELECT command denied to user 'second_user'@'localhost' for table 't1' -grant select on mysqltest.t1 to second_user@localhost -identified by 'looser' ; -show grants for second_user@localhost ; -Grants for second_user@localhost -GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' -GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' -GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost' -drop table mysqltest.t9 ; -show grants for second_user@localhost ; -Grants for second_user@localhost -GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' -GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' -GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost' -show grants for second_user@localhost ; -Grants for second_user@localhost -GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' -GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' -GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost' -prepare s_t1 from 'select a as my_col from t1' ; -execute s_t1 ; -my_col -1 -2 -3 -4 -execute s_t9 ; -ERROR 42S02: Table 'mysqltest.t9' doesn't exist -revoke all privileges on mysqltest.t1 from second_user@localhost -identified by 'looser' ; -show grants for second_user@localhost ; -Grants for second_user@localhost -GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' -GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' -show grants for second_user@localhost ; -Grants for second_user@localhost -GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' -GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' -execute s_t1 ; -ERROR 42000: SELECT command denied to user 'second_user'@'localhost' for table 't1' -revoke all privileges, grant option from second_user@localhost ; -show grants for second_user@localhost ; -Grants for second_user@localhost -GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' -drop user second_user@localhost ; -commit ; -show grants for second_user@localhost ; -ERROR 42000: There is no such grant defined for user 'second_user' on host 'localhost' -drop table t1,t9 ; -drop database mysqltest; diff --git a/mysql-test/r/ps_grant.result b/mysql-test/r/ps_grant.result new file mode 100644 index 00000000000..81de74f245c --- /dev/null +++ b/mysql-test/r/ps_grant.result @@ -0,0 +1,82 @@ +prepare stmt4 from ' show full processlist '; +execute stmt4; +Id User Host db Command Time State Info +number root localhost test Query time NULL show full processlist +test_sequence +------ grant/revoke/drop affects a parallel session test ------ +show grants for second_user@localhost ; +ERROR 42000: There is no such grant defined for user 'second_user' on host 'localhost' +create database mysqltest; +use mysqltest; +use test; +grant usage on mysqltest.* to second_user@localhost +identified by 'looser' ; +grant select on mysqltest.t9 to second_user@localhost +identified by 'looser' ; +show grants for second_user@localhost ; +Grants for second_user@localhost +GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' +GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' +select current_user(); +current_user() +second_user@localhost +show grants for current_user(); +Grants for second_user@localhost +GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' +GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' +prepare s_t9 from 'select c1 as my_col + from t9 where c1= 1' ; +execute s_t9 ; +my_col +1 +select a as my_col from t1; +ERROR 42000: SELECT command denied to user 'second_user'@'localhost' for table 't1' +grant select on mysqltest.t1 to second_user@localhost +identified by 'looser' ; +show grants for second_user@localhost ; +Grants for second_user@localhost +GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' +GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' +GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost' +drop table mysqltest.t9 ; +show grants for second_user@localhost ; +Grants for second_user@localhost +GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' +GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' +GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost' +show grants for second_user@localhost ; +Grants for second_user@localhost +GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' +GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' +GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost' +prepare s_t1 from 'select a as my_col from t1' ; +execute s_t1 ; +my_col +1 +2 +3 +4 +execute s_t9 ; +ERROR 42S02: Table 'mysqltest.t9' doesn't exist +revoke all privileges on mysqltest.t1 from second_user@localhost +identified by 'looser' ; +show grants for second_user@localhost ; +Grants for second_user@localhost +GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' +GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' +show grants for second_user@localhost ; +Grants for second_user@localhost +GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' +GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' +execute s_t1 ; +ERROR 42000: SELECT command denied to user 'second_user'@'localhost' for table 't1' +revoke all privileges, grant option from second_user@localhost ; +show grants for second_user@localhost ; +Grants for second_user@localhost +GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' +drop user second_user@localhost ; +commit ; +show grants for second_user@localhost ; +ERROR 42000: There is no such grant defined for user 'second_user' on host 'localhost' +drop table t1,t9 ; +drop database mysqltest; diff --git a/mysql-test/r/rpl_variables.result b/mysql-test/r/rpl_variables.result new file mode 100644 index 00000000000..227d8ecfad9 --- /dev/null +++ b/mysql-test/r/rpl_variables.result @@ -0,0 +1,8 @@ +stop slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +start slave; +set global slave_net_timeout=100; +set global sql_slave_skip_counter=100; diff --git a/mysql-test/r/timezone2.result b/mysql-test/r/timezone2.result index 206ff79e7ba..199b48ef1aa 100644 --- a/mysql-test/r/timezone2.result +++ b/mysql-test/r/timezone2.result @@ -251,58 +251,6 @@ select convert_tz(ts, @@time_zone, 'Japan') from t1; convert_tz(ts, @@time_zone, 'Japan') 2001-09-09 10:46:40 drop table t1; -delete from mysql.user where user like 'mysqltest\_%'; -delete from mysql.db where user like 'mysqltest\_%'; -delete from mysql.tables_priv where user like 'mysqltest\_%'; -delete from mysql.columns_priv where user like 'mysqltest\_%'; -flush privileges; -create table t1 (a int, b datetime); -create table t2 (c int, d datetime); -grant all privileges on test.* to mysqltest_1@localhost; -show grants for current_user(); -Grants for mysqltest_1@localhost -GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' -GRANT ALL PRIVILEGES ON `test`.* TO 'mysqltest_1'@'localhost' -set time_zone= '+00:00'; -set time_zone= 'Europe/Moscow'; -select convert_tz('2004-10-21 19:00:00', 'Europe/Moscow', 'UTC'); -convert_tz('2004-10-21 19:00:00', 'Europe/Moscow', 'UTC') -2004-10-21 15:00:00 -select convert_tz(b, 'Europe/Moscow', 'UTC') from t1; -convert_tz(b, 'Europe/Moscow', 'UTC') -update t1, t2 set t1.b = convert_tz('2004-10-21 19:00:00', 'Europe/Moscow', 'UTC') -where t1.a = t2.c and t2.d = (select max(d) from t2); -select * from mysql.time_zone_name; -ERROR 42000: Access denied for user 'mysqltest_1'@'localhost' to database 'mysql' -select Name, convert_tz('2004-10-21 19:00:00', Name, 'UTC') from mysql.time_zone_name; -ERROR 42000: Access denied for user 'mysqltest_1'@'localhost' to database 'mysql' -delete from mysql.db where user like 'mysqltest\_%'; -flush privileges; -grant all privileges on test.t1 to mysqltest_1@localhost; -grant all privileges on test.t2 to mysqltest_1@localhost; -show grants for current_user(); -Grants for mysqltest_1@localhost -GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' -GRANT ALL PRIVILEGES ON `test`.`t2` TO 'mysqltest_1'@'localhost' -GRANT ALL PRIVILEGES ON `test`.`t1` TO 'mysqltest_1'@'localhost' -set time_zone= '+00:00'; -set time_zone= 'Europe/Moscow'; -select convert_tz('2004-11-31 12:00:00', 'Europe/Moscow', 'UTC'); -convert_tz('2004-11-31 12:00:00', 'Europe/Moscow', 'UTC') -2004-12-01 09:00:00 -select convert_tz(b, 'Europe/Moscow', 'UTC') from t1; -convert_tz(b, 'Europe/Moscow', 'UTC') -update t1, t2 set t1.b = convert_tz('2004-11-30 12:00:00', 'Europe/Moscow', 'UTC') -where t1.a = t2.c and t2.d = (select max(d) from t2); -select * from mysql.time_zone_name; -ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'time_zone_name' -select Name, convert_tz('2004-11-30 12:00:00', Name, 'UTC') from mysql.time_zone_name; -ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'time_zone_name' -delete from mysql.user where user like 'mysqltest\_%'; -delete from mysql.db where user like 'mysqltest\_%'; -delete from mysql.tables_priv where user like 'mysqltest\_%'; -flush privileges; -drop table t1, t2; select convert_tz('2005-01-14 17:00:00', 'UTC', custTimeZone) from (select 'UTC' as custTimeZone) as tmp; convert_tz('2005-01-14 17:00:00', 'UTC', custTimeZone) 2005-01-14 17:00:00 diff --git a/mysql-test/r/timezone_grant.result b/mysql-test/r/timezone_grant.result new file mode 100644 index 00000000000..685f8007ac7 --- /dev/null +++ b/mysql-test/r/timezone_grant.result @@ -0,0 +1,52 @@ +delete from mysql.user where user like 'mysqltest\_%'; +delete from mysql.db where user like 'mysqltest\_%'; +delete from mysql.tables_priv where user like 'mysqltest\_%'; +delete from mysql.columns_priv where user like 'mysqltest\_%'; +flush privileges; +create table t1 (a int, b datetime); +create table t2 (c int, d datetime); +grant all privileges on test.* to mysqltest_1@localhost; +show grants for current_user(); +Grants for mysqltest_1@localhost +GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' +GRANT ALL PRIVILEGES ON `test`.* TO 'mysqltest_1'@'localhost' +set time_zone= '+00:00'; +set time_zone= 'Europe/Moscow'; +select convert_tz('2004-10-21 19:00:00', 'Europe/Moscow', 'UTC'); +convert_tz('2004-10-21 19:00:00', 'Europe/Moscow', 'UTC') +2004-10-21 15:00:00 +select convert_tz(b, 'Europe/Moscow', 'UTC') from t1; +convert_tz(b, 'Europe/Moscow', 'UTC') +update t1, t2 set t1.b = convert_tz('2004-10-21 19:00:00', 'Europe/Moscow', 'UTC') +where t1.a = t2.c and t2.d = (select max(d) from t2); +select * from mysql.time_zone_name; +ERROR 42000: Access denied for user 'mysqltest_1'@'localhost' to database 'mysql' +select Name, convert_tz('2004-10-21 19:00:00', Name, 'UTC') from mysql.time_zone_name; +ERROR 42000: Access denied for user 'mysqltest_1'@'localhost' to database 'mysql' +delete from mysql.db where user like 'mysqltest\_%'; +flush privileges; +grant all privileges on test.t1 to mysqltest_1@localhost; +grant all privileges on test.t2 to mysqltest_1@localhost; +show grants for current_user(); +Grants for mysqltest_1@localhost +GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' +GRANT ALL PRIVILEGES ON `test`.`t2` TO 'mysqltest_1'@'localhost' +GRANT ALL PRIVILEGES ON `test`.`t1` TO 'mysqltest_1'@'localhost' +set time_zone= '+00:00'; +set time_zone= 'Europe/Moscow'; +select convert_tz('2004-11-31 12:00:00', 'Europe/Moscow', 'UTC'); +convert_tz('2004-11-31 12:00:00', 'Europe/Moscow', 'UTC') +2004-12-01 09:00:00 +select convert_tz(b, 'Europe/Moscow', 'UTC') from t1; +convert_tz(b, 'Europe/Moscow', 'UTC') +update t1, t2 set t1.b = convert_tz('2004-11-30 12:00:00', 'Europe/Moscow', 'UTC') +where t1.a = t2.c and t2.d = (select max(d) from t2); +select * from mysql.time_zone_name; +ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'time_zone_name' +select Name, convert_tz('2004-11-30 12:00:00', Name, 'UTC') from mysql.time_zone_name; +ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'time_zone_name' +delete from mysql.user where user like 'mysqltest\_%'; +delete from mysql.db where user like 'mysqltest\_%'; +delete from mysql.tables_priv where user like 'mysqltest\_%'; +flush privileges; +drop table t1, t2; diff --git a/mysql-test/r/user_var-binlog.result b/mysql-test/r/user_var-binlog.result new file mode 100644 index 00000000000..06a2a846a0e --- /dev/null +++ b/mysql-test/r/user_var-binlog.result @@ -0,0 +1,25 @@ +create table t1 (a varchar(50)); +reset master; +SET TIMESTAMP=10000; +SET @`a b`='hello'; +INSERT INTO t1 VALUES(@`a b`); +set @var1= "';aaa"; +SET @var2=char(ascii('a')); +insert into t1 values (@var1),(@var2); +show binlog events from 79; +Log_name Pos Event_type Server_id Orig_log_pos Info +master-bin.000001 79 User var 1 79 @`a b`=_latin1 0x68656C6C6F COLLATE latin1_swedish_ci +master-bin.000001 120 Query 1 120 use `test`; INSERT INTO t1 VALUES(@`a b`) +master-bin.000001 184 User var 1 184 @`var1`=_latin1 0x273B616161 COLLATE latin1_swedish_ci +master-bin.000001 226 User var 1 226 @`var2`=_latin1 0x61 COLLATE latin1_swedish_ci +master-bin.000001 264 Query 1 264 use `test`; insert into t1 values (@var1),(@var2) +/*!40019 SET @@session.max_insert_delayed_threads=0*/; +SET @`a b`:=_latin1 0x68656C6C6F COLLATE `latin1_swedish_ci`; +use test; +SET TIMESTAMP=10000; +INSERT INTO t1 VALUES(@`a b`); +SET @`var1`:=_latin1 0x273B616161 COLLATE `latin1_swedish_ci`; +SET @`var2`:=_latin1 0x61 COLLATE `latin1_swedish_ci`; +SET TIMESTAMP=10000; +insert into t1 values (@var1),(@var2); +drop table t1; diff --git a/mysql-test/r/user_var.result b/mysql-test/r/user_var.result index 81846391795..18f7047f357 100644 --- a/mysql-test/r/user_var.result +++ b/mysql-test/r/user_var.result @@ -162,31 +162,6 @@ charset(@a) collation(@a) coercibility(@a) latin2 latin2_bin 0 select (@a:=_latin2'test' collate latin2_bin) = _latin2'TEST' collate latin2_general_ci; ERROR HY000: Illegal mix of collations (latin2_bin,EXPLICIT) and (latin2_general_ci,EXPLICIT) for operation '=' -create table t1 (a varchar(50)); -reset master; -SET TIMESTAMP=10000; -SET @`a b`='hello'; -INSERT INTO t1 VALUES(@`a b`); -set @var1= "';aaa"; -SET @var2=char(ascii('a')); -insert into t1 values (@var1),(@var2); -show binlog events from 79; -Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.000001 79 User var 1 79 @`a b`=_latin1 0x68656C6C6F COLLATE latin1_swedish_ci -master-bin.000001 120 Query 1 120 use `test`; INSERT INTO t1 VALUES(@`a b`) -master-bin.000001 184 User var 1 184 @`var1`=_latin1 0x273B616161 COLLATE latin1_swedish_ci -master-bin.000001 226 User var 1 226 @`var2`=_latin1 0x61 COLLATE latin1_swedish_ci -master-bin.000001 264 Query 1 264 use `test`; insert into t1 values (@var1),(@var2) -/*!40019 SET @@session.max_insert_delayed_threads=0*/; -SET @`a b`:=_latin1 0x68656C6C6F COLLATE `latin1_swedish_ci`; -use test; -SET TIMESTAMP=10000; -INSERT INTO t1 VALUES(@`a b`); -SET @`var1`:=_latin1 0x273B616161 COLLATE `latin1_swedish_ci`; -SET @`var2`:=_latin1 0x61 COLLATE `latin1_swedish_ci`; -SET TIMESTAMP=10000; -insert into t1 values (@var1),(@var2); -drop table t1; set @var= NULL ; select FIELD( @var,'1it','Hit') as my_column; my_column diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index 6b700f7f6a2..5e3bda75a80 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -324,7 +324,6 @@ set read_buffer_size=100; set read_rnd_buffer_size=100; set global rpl_recovery_rank=100; set global server_id=100; -set global slave_net_timeout=100; set global slow_launch_time=100; set sort_buffer_size=100; set sql_auto_is_null=1; @@ -349,7 +348,6 @@ select @@sql_max_join_size,@@max_join_size; set sql_quote_show_create=1; set sql_safe_updates=1; set sql_select_limit=1; -set global sql_slave_skip_counter=100; set sql_warnings=1; set global table_cache=100; set storage_engine=myisam; diff --git a/mysql-test/t/mix_innodb_myisam_binlog.test b/mysql-test/t/mix_innodb_myisam_binlog.test index 89a7f8f3036..544fa5559fa 100644 --- a/mysql-test/t/mix_innodb_myisam_binlog.test +++ b/mysql-test/t/mix_innodb_myisam_binlog.test @@ -5,6 +5,9 @@ # did some tests manually on a slave; tables are replicated fine and # Exec_Master_Log_Pos advances as expected. +# Embedded server doesn't support binlogging +-- source include/not_embedded.inc + -- source include/have_innodb.inc --disable_warnings diff --git a/mysql-test/t/mysql_protocols.test b/mysql-test/t/mysql_protocols.test index e5158586124..6e2d4f20429 100644 --- a/mysql-test/t/mysql_protocols.test +++ b/mysql-test/t/mysql_protocols.test @@ -1,3 +1,5 @@ +# Embedded server doesn't support external clients +--source include/not_embedded.inc # test for Bug #4998 "--protocol doesn't reject bad values" diff --git a/mysql-test/t/mysqlbinlog.test b/mysql-test/t/mysqlbinlog.test index ea66a44d44e..435fa8289da 100644 --- a/mysql-test/t/mysqlbinlog.test +++ b/mysql-test/t/mysqlbinlog.test @@ -1,5 +1,8 @@ # We are using .opt file since we need small binlog size +# Embedded server doesn't support binlogging +-- source include/not_embedded.inc + # we need this for getting fixed timestamps inside of this test set timestamp=1000000000; diff --git a/mysql-test/t/mysqlbinlog2.test b/mysql-test/t/mysqlbinlog2.test index c6cff7558d4..0eddc4ec2e4 100644 --- a/mysql-test/t/mysqlbinlog2.test +++ b/mysql-test/t/mysqlbinlog2.test @@ -1,6 +1,9 @@ # Test for the new options --start-datetime, stop-datetime, # and a few others. +# Embedded server doesn't support binlogging +-- source include/not_embedded.inc + --disable_warnings drop table if exists t1; --enable_warnings diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index 255ae50a8ca..e48434006af 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -1,3 +1,6 @@ +# Embedded server doesn't support external clients +--source include/not_embedded.inc + --disable_warnings DROP TABLE IF EXISTS t1, `"t"1`; --enable_warnings diff --git a/mysql-test/t/packet.test b/mysql-test/t/packet.test index cbeaa04ca52..c7f10d75d74 100644 --- a/mysql-test/t/packet.test +++ b/mysql-test/t/packet.test @@ -1,3 +1,5 @@ +# Embedded server doesn't support external clients +--source include/not_embedded.inc # # Check protocol handling diff --git a/mysql-test/t/ps_1general.test b/mysql-test/t/ps_1general.test index 5450512b959..2d55d9d18b1 100644 --- a/mysql-test/t/ps_1general.test +++ b/mysql-test/t/ps_1general.test @@ -316,9 +316,6 @@ prepare stmt4 from ' show engine bdb logs '; --disable_result_log execute stmt4; --enable_result_log -prepare stmt4 from ' show full processlist '; ---replace_column 1 number 6 time 3 localhost -execute stmt4; prepare stmt4 from ' show grants for user '; --error 1295 prepare stmt4 from ' show create table t2 '; @@ -599,6 +596,7 @@ drop table t2; prepare stmt1 from ' rename table t5 to t6, t7 to t8 ' ; create table t5 (a int) ; # rename must fail, t7 does not exist +--replace_result \\ / $MYSQL_TEST_DIR . /var/master-data/ / --error 1017 execute stmt1 ; create table t7 (a int) ; @@ -841,117 +839,6 @@ execute stmt1 ; drop table t5 ; - -################ GRANT/REVOKE/DROP affecting a parallel session ################ ---disable_query_log -select '------ grant/revoke/drop affects a parallel session test ------' - as test_sequence ; ---enable_query_log - -#---------------------------------------------------------------------# -# Here we test that: -# 1. A new GRANT will be visible within another sessions. # -# # -# Let's assume there is a parallel session with an already prepared # -# statement for a table. # -# A DROP TABLE will affect the EXECUTE properties. # -# A REVOKE will affect the EXECUTE properties. # -#---------------------------------------------------------------------# - -# Who am I ? -# this is different across different systems: -# select current_user(), user() ; - -#### create a new user account #### -## There should be no grants for that non existing user ---error 1141 -show grants for second_user@localhost ; -## create a new user account by using GRANT statements on t9 -create database mysqltest; -# create the tables (t1 and t9) used in many tests -use mysqltest; ---disable_query_log ---source include/ps_create.inc ---source include/ps_renew.inc ---enable_query_log -eval use $DB; -grant usage on mysqltest.* to second_user@localhost -identified by 'looser' ; -grant select on mysqltest.t9 to second_user@localhost -identified by 'looser' ; -show grants for second_user@localhost ; - - -#### establish a second session to the new user account -connect (con3,localhost,second_user,looser,mysqltest); -## switch to the second session -connection con3; -# Who am I ? -select current_user(); -## check the access rights -show grants for current_user(); -prepare s_t9 from 'select c1 as my_col - from t9 where c1= 1' ; -execute s_t9 ; -# check that we cannot do a SELECT on the table t1; ---error 1142 -select a as my_col from t1; - - -#### give access rights to t1 and drop table t9 -## switch back to the first session -connection default; -grant select on mysqltest.t1 to second_user@localhost -identified by 'looser' ; -show grants for second_user@localhost ; -drop table mysqltest.t9 ; -show grants for second_user@localhost ; - - -#### check the access as new user -## switch to the second session -connection con3; -######## Question 1: The table t1 should be now accessible. ######## -show grants for second_user@localhost ; -prepare s_t1 from 'select a as my_col from t1' ; -execute s_t1 ; -######## Question 2: The table t9 does not exist. ######## ---error 1146 -execute s_t9 ; - - -#### revoke the access rights to t1 -## switch back to the first session -connection default; -revoke all privileges on mysqltest.t1 from second_user@localhost -identified by 'looser' ; -show grants for second_user@localhost ; - -#### check the access as new user -## switch to the second session -connection con3; -show grants for second_user@localhost ; -######## Question 2: The table t1 should be now not accessible. ######## ---error 1142 -execute s_t1 ; - -## cleanup -## switch back to the first session -connection default; -## disconnect the second session -disconnect con3 ; -## remove all rights of second_user@localhost -revoke all privileges, grant option from second_user@localhost ; -show grants for second_user@localhost ; -drop user second_user@localhost ; -commit ; ---error 1141 -show grants for second_user@localhost ; - -drop table t1,t9 ; -drop database mysqltest; - - ##### RULES OF THUMB TO PRESERVE THE SYSTEMATICS OF THE PS TEST CASES ##### # # 0. You don't have the time to diff --git a/mysql-test/t/ps_grant.test b/mysql-test/t/ps_grant.test new file mode 100644 index 00000000000..283c06c9a8c --- /dev/null +++ b/mysql-test/t/ps_grant.test @@ -0,0 +1,120 @@ +# Can't test grants with embedded server +-- source include/not_embedded.inc + +# Tested here simply so it is not tested with embedded server +prepare stmt4 from ' show full processlist '; +--replace_column 1 number 6 time 3 localhost +execute stmt4; + +let $type= 'MYISAM' ; + +################ GRANT/REVOKE/DROP affecting a parallel session ################ +--disable_query_log +select '------ grant/revoke/drop affects a parallel session test ------' + as test_sequence ; +--enable_query_log + +#---------------------------------------------------------------------# +# Here we test that: +# 1. A new GRANT will be visible within another sessions. # +# # +# Let's assume there is a parallel session with an already prepared # +# statement for a table. # +# A DROP TABLE will affect the EXECUTE properties. # +# A REVOKE will affect the EXECUTE properties. # +#---------------------------------------------------------------------# + +# Who am I ? +# this is different across different systems: +# select current_user(), user() ; + +#### create a new user account #### +## There should be no grants for that non existing user +--error 1141 +show grants for second_user@localhost ; +## create a new user account by using GRANT statements on t9 +create database mysqltest; +# create the tables (t1 and t9) used in many tests +use mysqltest; +--disable_query_log +--source include/ps_create.inc +--source include/ps_renew.inc +--enable_query_log +eval use $DB; +grant usage on mysqltest.* to second_user@localhost +identified by 'looser' ; +grant select on mysqltest.t9 to second_user@localhost +identified by 'looser' ; +show grants for second_user@localhost ; + + +#### establish a second session to the new user account +connect (con3,localhost,second_user,looser,mysqltest); +## switch to the second session +connection con3; +# Who am I ? +select current_user(); +## check the access rights +show grants for current_user(); +prepare s_t9 from 'select c1 as my_col + from t9 where c1= 1' ; +execute s_t9 ; +# check that we cannot do a SELECT on the table t1; +--error 1142 +select a as my_col from t1; + + +#### give access rights to t1 and drop table t9 +## switch back to the first session +connection default; +grant select on mysqltest.t1 to second_user@localhost +identified by 'looser' ; +show grants for second_user@localhost ; +drop table mysqltest.t9 ; +show grants for second_user@localhost ; + + +#### check the access as new user +## switch to the second session +connection con3; +######## Question 1: The table t1 should be now accessible. ######## +show grants for second_user@localhost ; +prepare s_t1 from 'select a as my_col from t1' ; +execute s_t1 ; +######## Question 2: The table t9 does not exist. ######## +--error 1146 +execute s_t9 ; + + +#### revoke the access rights to t1 +## switch back to the first session +connection default; +revoke all privileges on mysqltest.t1 from second_user@localhost +identified by 'looser' ; +show grants for second_user@localhost ; + +#### check the access as new user +## switch to the second session +connection con3; +show grants for second_user@localhost ; +######## Question 2: The table t1 should be now not accessible. ######## +--error 1142 +execute s_t1 ; + +## cleanup +## switch back to the first session +connection default; +## disconnect the second session +disconnect con3 ; +## remove all rights of second_user@localhost +revoke all privileges, grant option from second_user@localhost ; +show grants for second_user@localhost ; +drop user second_user@localhost ; +commit ; +--error 1141 +show grants for second_user@localhost ; + +drop table t1,t9 ; +drop database mysqltest; + + diff --git a/mysql-test/t/rename.test b/mysql-test/t/rename.test index 497ff721c99..6fa208f37ec 100644 --- a/mysql-test/t/rename.test +++ b/mysql-test/t/rename.test @@ -2,6 +2,10 @@ # Test of rename table # +# Test requires concurrent connections, which can't be tested on embedded +# server +-- source include/not_embedded.inc + --disable_warnings drop table if exists t0,t1,t2,t3,t4; # Clear up from other tests (to ensure that SHOW TABLES below is right) diff --git a/mysql-test/t/rpl_variables.test b/mysql-test/t/rpl_variables.test new file mode 100644 index 00000000000..b332c006118 --- /dev/null +++ b/mysql-test/t/rpl_variables.test @@ -0,0 +1,4 @@ +source include/master-slave.inc; + +set global slave_net_timeout=100; +set global sql_slave_skip_counter=100; diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index cd8d4dba6ab..0cf1476b24c 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -1,3 +1,7 @@ +# Requires use of multiple simultaneous connections, not supported with +# embedded server testing +-- source include/not_embedded.inc + # # Test of some show commands # diff --git a/mysql-test/t/system_mysql_db_fix.test b/mysql-test/t/system_mysql_db_fix.test index 1539d210a3a..d0aae7b411c 100644 --- a/mysql-test/t/system_mysql_db_fix.test +++ b/mysql-test/t/system_mysql_db_fix.test @@ -1,3 +1,6 @@ +# Embedded server doesn't support external clients +--source include/not_embedded.inc + # # This is the test for mysql_fix_privilege_tables # diff --git a/mysql-test/t/timezone2.test b/mysql-test/t/timezone2.test index 32ed359a2db..f952c0f65b2 100644 --- a/mysql-test/t/timezone2.test +++ b/mysql-test/t/timezone2.test @@ -199,74 +199,6 @@ insert into t1 (ts) values (now()); select convert_tz(ts, @@time_zone, 'Japan') from t1; drop table t1; -# -# Test for bug #6116 "SET time_zone := ... requires access to mysql.time_zone -# tables". We should allow implicit access to time zone description tables -# even for unprivileged users. -# - -# Let us prepare playground -delete from mysql.user where user like 'mysqltest\_%'; -delete from mysql.db where user like 'mysqltest\_%'; -delete from mysql.tables_priv where user like 'mysqltest\_%'; -delete from mysql.columns_priv where user like 'mysqltest\_%'; -flush privileges; -create table t1 (a int, b datetime); -create table t2 (c int, d datetime); - -grant all privileges on test.* to mysqltest_1@localhost; -connect (tzuser, localhost, mysqltest_1,,); -connection tzuser; -show grants for current_user(); -set time_zone= '+00:00'; -set time_zone= 'Europe/Moscow'; -select convert_tz('2004-10-21 19:00:00', 'Europe/Moscow', 'UTC'); -select convert_tz(b, 'Europe/Moscow', 'UTC') from t1; -# Let us also check whenever multi-update works ok -update t1, t2 set t1.b = convert_tz('2004-10-21 19:00:00', 'Europe/Moscow', 'UTC') - where t1.a = t2.c and t2.d = (select max(d) from t2); -# But still these two statements should not work: ---error 1044 -select * from mysql.time_zone_name; ---error 1044 -select Name, convert_tz('2004-10-21 19:00:00', Name, 'UTC') from mysql.time_zone_name; - -# -# Test for bug #6765 "Implicit access to time zone description tables -# requires privileges for them if some table or column level grants -# present" -# -connection default; -# Let use some table-level grants instead of db-level -# to make life more interesting -delete from mysql.db where user like 'mysqltest\_%'; -flush privileges; -grant all privileges on test.t1 to mysqltest_1@localhost; -grant all privileges on test.t2 to mysqltest_1@localhost; -# The test itself is almost the same as previous one -connect (tzuser2, localhost, mysqltest_1,,); -connection tzuser2; -show grants for current_user(); -set time_zone= '+00:00'; -set time_zone= 'Europe/Moscow'; -select convert_tz('2004-11-31 12:00:00', 'Europe/Moscow', 'UTC'); -select convert_tz(b, 'Europe/Moscow', 'UTC') from t1; -update t1, t2 set t1.b = convert_tz('2004-11-30 12:00:00', 'Europe/Moscow', 'UTC') - where t1.a = t2.c and t2.d = (select max(d) from t2); -# Again these two statements should not work (but with different errors): ---error 1142 -select * from mysql.time_zone_name; ---error 1142 -select Name, convert_tz('2004-11-30 12:00:00', Name, 'UTC') from mysql.time_zone_name; - -# Clean-up -connection default; -delete from mysql.user where user like 'mysqltest\_%'; -delete from mysql.db where user like 'mysqltest\_%'; -delete from mysql.tables_priv where user like 'mysqltest\_%'; -flush privileges; -drop table t1, t2; - # # Test for bug #7705 "CONVERT_TZ() crashes with subquery/WHERE on index # column". Queries in which one of time zone arguments of CONVERT_TZ() is diff --git a/mysql-test/t/timezone_grant.test b/mysql-test/t/timezone_grant.test new file mode 100644 index 00000000000..501315668f5 --- /dev/null +++ b/mysql-test/t/timezone_grant.test @@ -0,0 +1,71 @@ +# Embedded server testing does not support grants +-- source include/not_embedded.inc + +# +# Test for bug #6116 "SET time_zone := ... requires access to mysql.time_zone +# tables". We should allow implicit access to time zone description tables +# even for unprivileged users. +# + +# Let us prepare playground +delete from mysql.user where user like 'mysqltest\_%'; +delete from mysql.db where user like 'mysqltest\_%'; +delete from mysql.tables_priv where user like 'mysqltest\_%'; +delete from mysql.columns_priv where user like 'mysqltest\_%'; +flush privileges; +create table t1 (a int, b datetime); +create table t2 (c int, d datetime); + +grant all privileges on test.* to mysqltest_1@localhost; +connect (tzuser, localhost, mysqltest_1,,); +connection tzuser; +show grants for current_user(); +set time_zone= '+00:00'; +set time_zone= 'Europe/Moscow'; +select convert_tz('2004-10-21 19:00:00', 'Europe/Moscow', 'UTC'); +select convert_tz(b, 'Europe/Moscow', 'UTC') from t1; +# Let us also check whenever multi-update works ok +update t1, t2 set t1.b = convert_tz('2004-10-21 19:00:00', 'Europe/Moscow', 'UTC') + where t1.a = t2.c and t2.d = (select max(d) from t2); +# But still these two statements should not work: +--error 1044 +select * from mysql.time_zone_name; +--error 1044 +select Name, convert_tz('2004-10-21 19:00:00', Name, 'UTC') from mysql.time_zone_name; + +# +# Test for bug #6765 "Implicit access to time zone description tables +# requires privileges for them if some table or column level grants +# present" +# +connection default; +# Let use some table-level grants instead of db-level +# to make life more interesting +delete from mysql.db where user like 'mysqltest\_%'; +flush privileges; +grant all privileges on test.t1 to mysqltest_1@localhost; +grant all privileges on test.t2 to mysqltest_1@localhost; +# The test itself is almost the same as previous one +connect (tzuser2, localhost, mysqltest_1,,); +connection tzuser2; +show grants for current_user(); +set time_zone= '+00:00'; +set time_zone= 'Europe/Moscow'; +select convert_tz('2004-11-31 12:00:00', 'Europe/Moscow', 'UTC'); +select convert_tz(b, 'Europe/Moscow', 'UTC') from t1; +update t1, t2 set t1.b = convert_tz('2004-11-30 12:00:00', 'Europe/Moscow', 'UTC') + where t1.a = t2.c and t2.d = (select max(d) from t2); +# Again these two statements should not work (but with different errors): +--error 1142 +select * from mysql.time_zone_name; +--error 1142 +select Name, convert_tz('2004-11-30 12:00:00', Name, 'UTC') from mysql.time_zone_name; + +# Clean-up +connection default; +delete from mysql.user where user like 'mysqltest\_%'; +delete from mysql.db where user like 'mysqltest\_%'; +delete from mysql.tables_priv where user like 'mysqltest\_%'; +flush privileges; +drop table t1, t2; + diff --git a/mysql-test/t/user_var-binlog.test b/mysql-test/t/user_var-binlog.test new file mode 100644 index 00000000000..8b11ea735ad --- /dev/null +++ b/mysql-test/t/user_var-binlog.test @@ -0,0 +1,19 @@ +# Embedded server does not support binlogging +--source include/not_embedded.inc + +# Check that user variables are binlogged correctly (BUG#3875) +create table t1 (a varchar(50)); +reset master; +SET TIMESTAMP=10000; +SET @`a b`='hello'; +INSERT INTO t1 VALUES(@`a b`); +set @var1= "';aaa"; +SET @var2=char(ascii('a')); +insert into t1 values (@var1),(@var2); +show binlog events from 79; +# more important than SHOW BINLOG EVENTS, mysqlbinlog (where we +# absolutely need variables names to be quoted and strings to be +# escaped). +--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR +--exec $MYSQL_BINLOG --short-form $MYSQL_TEST_DIR/var/log/master-bin.000001 +drop table t1; diff --git a/mysql-test/t/user_var.test b/mysql-test/t/user_var.test index 81788ce8d73..e21ab8f9b6e 100644 --- a/mysql-test/t/user_var.test +++ b/mysql-test/t/user_var.test @@ -100,24 +100,6 @@ select charset(@a),collation(@a),coercibility(@a); --error 1267 select (@a:=_latin2'test' collate latin2_bin) = _latin2'TEST' collate latin2_general_ci; -# Check that user variables are binlogged correctly (BUG#3875) -create table t1 (a varchar(50)); -reset master; -SET TIMESTAMP=10000; -SET @`a b`='hello'; -INSERT INTO t1 VALUES(@`a b`); -set @var1= "';aaa"; -SET @var2=char(ascii('a')); -insert into t1 values (@var1),(@var2); -show binlog events from 79; -# more important than SHOW BINLOG EVENTS, mysqlbinlog (where we -# absolutely need variables names to be quoted and strings to be -# escaped). ---replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR ---exec $MYSQL_BINLOG --short-form $MYSQL_TEST_DIR/var/log/master-bin.000001 -drop table t1; - - # # Bug #6321 strange error: # string function FIELD(, ...) diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test index 3a76ae5136e..2ecef5c9221 100644 --- a/mysql-test/t/variables.test +++ b/mysql-test/t/variables.test @@ -218,7 +218,6 @@ set read_buffer_size=100; set read_rnd_buffer_size=100; set global rpl_recovery_rank=100; set global server_id=100; -set global slave_net_timeout=100; set global slow_launch_time=100; set sort_buffer_size=100; set sql_auto_is_null=1; @@ -237,7 +236,6 @@ select @@sql_max_join_size,@@max_join_size; set sql_quote_show_create=1; set sql_safe_updates=1; set sql_select_limit=1; -set global sql_slave_skip_counter=100; set sql_warnings=1; set global table_cache=100; set storage_engine=myisam; From aa4f3522300c692bb404bb445220ea7e7bd8c1e4 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Wed, 30 Mar 2005 17:32:44 -0800 Subject: [PATCH 016/204] Remove result.es files and support for them, which requires splitting up a couple of tests and adjusting the output of others. Exposes two bugs (9472 and 9508). --- mysql-test/mysql-test-run.sh | 18 +- mysql-test/r/drop_temp_table.result.es | 12 - mysql-test/r/insert_select-binlog.result | 25 + mysql-test/r/insert_select.result | 25 - mysql-test/r/insert_select.result.es | 647 ------ mysql-test/r/myisam-blob.result.es | 59 - mysql-test/r/packet.result.es | 26 - mysql-test/r/query_cache.result.es | 925 --------- mysql-test/r/select.result | 24 +- mysql-test/r/select.result.es | 2389 ---------------------- mysql-test/r/type_blob.result | 20 +- mysql-test/r/type_blob.result.es | 692 ------- mysql-test/r/type_float.result | 28 +- mysql-test/r/type_float.result.es | 205 -- mysql-test/r/type_ranges.result | 160 +- mysql-test/r/type_ranges.result.es | 320 --- mysql-test/t/drop_temp_table.test | 3 + mysql-test/t/insert_select-binlog.test | 34 + mysql-test/t/insert_select.test | 31 - mysql-test/t/ps_1general.test | 3 +- mysql-test/t/select.test | 4 + mysql-test/t/type_blob.test | 30 +- mysql-test/t/type_float.test | 4 + mysql-test/t/type_ranges.test | 9 + sql/sql_select.cc | 2 +- 25 files changed, 220 insertions(+), 5475 deletions(-) delete mode 100644 mysql-test/r/drop_temp_table.result.es create mode 100644 mysql-test/r/insert_select-binlog.result delete mode 100644 mysql-test/r/insert_select.result.es delete mode 100644 mysql-test/r/myisam-blob.result.es delete mode 100644 mysql-test/r/packet.result.es delete mode 100644 mysql-test/r/query_cache.result.es delete mode 100644 mysql-test/r/select.result.es delete mode 100644 mysql-test/r/type_blob.result.es delete mode 100644 mysql-test/r/type_float.result.es delete mode 100644 mysql-test/r/type_ranges.result.es create mode 100644 mysql-test/t/insert_select-binlog.test diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index b28bfd78d1b..a70ff3d59c7 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -240,7 +240,6 @@ STOP_WAIT_TIMEOUT=10 MYSQL_TEST_SSL_OPTS="" USE_TIMER="" USE_EMBEDDED_SERVER="" -RESULT_EXT="" TEST_MODE="" NDB_MGM_EXTRA_OPTS= @@ -253,7 +252,6 @@ while test $# -gt 0; do USE_EMBEDDED_SERVER=1 USE_MANAGER=0 NO_SLAVE=1 USE_RUNNING_SERVER="" - RESULT_EXT=".es" TEST_MODE="$TEST_MODE embedded" ;; --purify) USE_PURIFY=1 @@ -735,13 +733,6 @@ show_failed_diff () result_file=r/$1.result eval_file=r/$1.eval - # If we have an special externsion for result files we use it if we are recording - # or a result file with that extension exists. - if [ -n "$RESULT_EXT" -a \( x$RECORD = x1 -o -f "$result_file$RESULT_EXT" \) ] - then - result_file="$result_file$RESULT_EXT" - fi - if [ -f $eval_file ] then result_file=$eval_file @@ -1462,9 +1453,6 @@ run_testcase () result_file="r/$tname.result" echo $tname > $CURRENT_TEST SKIP_SLAVE=`$EXPR \( $tname : rpl \) = 0` - if [ -n "$RESULT_EXT" -a \( x$RECORD = x1 -o -f "$result_file$RESULT_EXT" \) ] ; then - result_file="$result_file$RESULT_EXT" - fi if [ "$USE_MANAGER" = 1 ] ; then many_slaves=`$EXPR \( \( $tname : rpl_failsafe \) != 0 \) \| \( \( $tname : rpl_chain_temp_table \) != 0 \)` fi @@ -1531,10 +1519,8 @@ run_testcase () --result-file=*) result_file=`$ECHO "$EXTRA_MASTER_OPT" | $SED -e "s;--result-file=;;"` result_file="r/$result_file.result" - if [ -n "$RESULT_EXT" -a \( x$RECORD = x1 -o -f "$result_file$RESULT_EXT" \) ] ; then - result_file="$result_file$RESULT_EXT" - fi - # Note that this must be set to space, not "" for test-reset to work + # Note that this must be set to space, not "" for test-reset to +# work EXTRA_MASTER_OPT=" " ;; esac diff --git a/mysql-test/r/drop_temp_table.result.es b/mysql-test/r/drop_temp_table.result.es deleted file mode 100644 index 4497022520e..00000000000 --- a/mysql-test/r/drop_temp_table.result.es +++ /dev/null @@ -1,12 +0,0 @@ -reset master; -create database `drop-temp+table-test`; -use `drop-temp+table-test`; -create temporary table `table:name` (a int); -select get_lock("a",10); -get_lock("a",10) -1 -select get_lock("a",10); -get_lock("a",10) -1 -show binlog events; -drop database `drop-temp+table-test`; diff --git a/mysql-test/r/insert_select-binlog.result b/mysql-test/r/insert_select-binlog.result new file mode 100644 index 00000000000..bca28059787 --- /dev/null +++ b/mysql-test/r/insert_select-binlog.result @@ -0,0 +1,25 @@ +create table t1(a int, unique(a)); +insert into t1 values(2); +create table t2(a int); +insert into t2 values(1),(2); +reset master; +insert into t1 select * from t2; +ERROR 23000: Duplicate entry '2' for key 1 +show binlog events; +Log_name Pos Event_type Server_id Orig_log_pos Info +master-bin.000001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3 +master-bin.000001 79 Query 1 79 use `test`; insert into t1 select * from t2 +select * from t1; +a +1 +2 +drop table t1, t2; +create table t1(a int); +insert into t1 values(1),(1); +reset master; +create table t2(unique(a)) select a from t1; +ERROR 23000: Duplicate entry '1' for key 1 +show binlog events; +Log_name Pos Event_type Server_id Orig_log_pos Info +master-bin.000001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3 +drop table t1; diff --git a/mysql-test/r/insert_select.result b/mysql-test/r/insert_select.result index f5ad0c87881..f843c6d0d18 100644 --- a/mysql-test/r/insert_select.result +++ b/mysql-test/r/insert_select.result @@ -65,31 +65,6 @@ INSERT INTO t1 (numeropost,icone,contenu,pseudo,date,signature,ip) SELECT 1718,icone,contenu,pseudo,date,signature,ip FROM t2 WHERE numeropost=9 ORDER BY numreponse ASC; DROP TABLE t1,t2; -create table t1(a int, unique(a)); -insert into t1 values(2); -create table t2(a int); -insert into t2 values(1),(2); -reset master; -insert into t1 select * from t2; -ERROR 23000: Duplicate entry '2' for key 1 -show binlog events; -Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.000001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3 -master-bin.000001 79 Query 1 79 use `test`; insert into t1 select * from t2 -select * from t1; -a -1 -2 -drop table t1, t2; -create table t1(a int); -insert into t1 values(1),(1); -reset master; -create table t2(unique(a)) select a from t1; -ERROR 23000: Duplicate entry '1' for key 1 -show binlog events; -Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.000001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3 -drop table t1; create table t1 (a int not null); create table t2 (a int not null); insert into t1 values (1); diff --git a/mysql-test/r/insert_select.result.es b/mysql-test/r/insert_select.result.es deleted file mode 100644 index 9cac6d31b8f..00000000000 --- a/mysql-test/r/insert_select.result.es +++ /dev/null @@ -1,647 +0,0 @@ -drop table if exists t1,t2; -create table t1 (bandID MEDIUMINT UNSIGNED NOT NULL PRIMARY KEY, payoutID SMALLINT UNSIGNED NOT NULL); -insert into t1 (bandID,payoutID) VALUES (1,6),(2,6),(3,4),(4,9),(5,10),(6,1),(7,12),(8,12); -create table t2 (payoutID SMALLINT UNSIGNED NOT NULL PRIMARY KEY); -insert into t2 (payoutID) SELECT DISTINCT payoutID FROM t1; -insert into t2 (payoutID) SELECT payoutID+10 FROM t1; -ERROR 23000: Duplicate entry '16' for key 1 -insert ignore into t2 (payoutID) SELECT payoutID+10 FROM t1; -select * from t2; -payoutID -1 -4 -6 -9 -10 -11 -12 -14 -16 -19 -20 -22 -drop table t1,t2; -CREATE TABLE `t1` ( -`numeropost` bigint(20) unsigned NOT NULL default '0', -`icone` tinyint(4) unsigned NOT NULL default '0', -`numreponse` bigint(20) unsigned NOT NULL auto_increment, -`contenu` text NOT NULL, -`pseudo` varchar(50) NOT NULL default '', -`date` datetime NOT NULL default '0000-00-00 00:00:00', -`ip` bigint(11) NOT NULL default '0', -`signature` tinyint(1) unsigned NOT NULL default '0', -PRIMARY KEY (`numeropost`,`numreponse`) -,KEY `ip` (`ip`), -KEY `date` (`date`), -KEY `pseudo` (`pseudo`), -KEY `numreponse` (`numreponse`) -) ENGINE=MyISAM; -CREATE TABLE `t2` ( -`numeropost` bigint(20) unsigned NOT NULL default '0', -`icone` tinyint(4) unsigned NOT NULL default '0', -`numreponse` bigint(20) unsigned NOT NULL auto_increment, -`contenu` text NOT NULL, -`pseudo` varchar(50) NOT NULL default '', -`date` datetime NOT NULL default '0000-00-00 00:00:00', -`ip` bigint(11) NOT NULL default '0', -`signature` tinyint(1) unsigned NOT NULL default '0', -PRIMARY KEY (`numeropost`,`numreponse`), -KEY `ip` (`ip`), -KEY `date` (`date`), -KEY `pseudo` (`pseudo`), -KEY `numreponse` (`numreponse`) -) ENGINE=MyISAM; -INSERT INTO t2 -(numeropost,icone,numreponse,contenu,pseudo,date,ip,signature) VALUES -(9,1,56,'test','joce','2001-07-25 13:50:53' -,3649052399,0); -INSERT INTO t1 (numeropost,icone,contenu,pseudo,date,signature,ip) -SELECT 1618,icone,contenu,pseudo,date,signature,ip FROM t2 -WHERE numeropost=9 ORDER BY numreponse ASC; -show variables like '%bulk%'; -Variable_name Value -bulk_insert_buffer_size 8388608 -INSERT INTO t1 (numeropost,icone,contenu,pseudo,date,signature,ip) -SELECT 1718,icone,contenu,pseudo,date,signature,ip FROM t2 -WHERE numeropost=9 ORDER BY numreponse ASC; -DROP TABLE t1,t2; -create table t1(a int, unique(a)); -insert into t1 values(2); -create table t2(a int); -insert into t2 values(1),(2); -reset master; -insert into t1 select * from t2; -ERROR 23000: Duplicate entry '2' for key 1 -show binlog events; -select * from t1; -a -1 -2 -drop table t1, t2; -create table t1(a int); -insert into t1 values(1),(1); -reset master; -create table t2(unique(a)) select a from t1; -ERROR 23000: Duplicate entry '1' for key 1 -show binlog events; -drop table t1; -create table t1 (a int not null); -create table t2 (a int not null); -insert into t1 values (1); -insert into t1 values (a+2); -insert into t1 values (a+3); -insert into t1 values (4),(a+5); -insert into t1 select * from t1; -select * from t1; -a -1 -2 -3 -4 -5 -1 -2 -3 -4 -5 -insert into t1 select * from t1 as t2; -select * from t1; -a -1 -2 -3 -4 -5 -1 -2 -3 -4 -5 -1 -2 -3 -4 -5 -1 -2 -3 -4 -5 -insert into t2 select * from t1 as t2; -select * from t1; -a -1 -2 -3 -4 -5 -1 -2 -3 -4 -5 -1 -2 -3 -4 -5 -1 -2 -3 -4 -5 -insert into t1 select t2.a from t1,t2; -select * from t1; -a -1 -2 -3 -4 -5 -1 -2 -3 -4 -5 -1 -2 -3 -4 -5 -1 -2 -3 -4 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -insert into t1 select * from t1,t1; -ERROR 42000: Not unique table/alias: 't1' -drop table t1,t2; -create table t1 (a int not null primary key, b char(10)); -create table t2 (a int not null, b char(10)); -insert into t1 values (1,"t1:1"),(3,"t1:3"); -insert into t2 values (2,"t2:2"), (3,"t2:3"); -insert into t1 select * from t2; -ERROR 23000: Duplicate entry '3' for key 1 -select * from t1; -a b -1 t1:1 -3 t1:3 -2 t2:2 -replace into t1 select * from t2; -select * from t1; -a b -1 t1:1 -3 t2:3 -2 t2:2 -drop table t1,t2; -CREATE TABLE t1 ( USID INTEGER UNSIGNED, ServerID TINYINT UNSIGNED, State ENUM ('unknown', 'Access-Granted', 'Session-Active', 'Session-Closed' ) NOT NULL DEFAULT 'unknown', SessionID CHAR(32), User CHAR(32) NOT NULL DEFAULT '', NASAddr INTEGER UNSIGNED, NASPort INTEGER UNSIGNED, NASPortType INTEGER UNSIGNED, ConnectSpeed INTEGER UNSIGNED, CarrierType CHAR(32), CallingStationID CHAR(32), CalledStationID CHAR(32), AssignedAddr INTEGER UNSIGNED, SessionTime INTEGER UNSIGNED, PacketsIn INTEGER UNSIGNED, OctetsIn INTEGER UNSIGNED, PacketsOut INTEGER UNSIGNED, OctetsOut INTEGER UNSIGNED, TerminateCause INTEGER UNSIGNED, UnauthTime TINYINT UNSIGNED, AccessRequestTime DATETIME, AcctStartTime DATETIME, AcctLastTime DATETIME, LastModification TIMESTAMP NOT NULL); -CREATE TABLE t2 ( USID INTEGER UNSIGNED AUTO_INCREMENT, ServerID TINYINT UNSIGNED, State ENUM ('unknown', 'Access-Granted', 'Session-Active', 'Session-Closed' ) NOT NULL DEFAULT 'unknown', SessionID CHAR(32), User TEXT NOT NULL, NASAddr INTEGER UNSIGNED, NASPort INTEGER UNSIGNED, NASPortType INTEGER UNSIGNED, ConnectSpeed INTEGER UNSIGNED, CarrierType CHAR(32), CallingStationID CHAR(32), CalledStationID CHAR(32), AssignedAddr INTEGER UNSIGNED, SessionTime INTEGER UNSIGNED, PacketsIn INTEGER UNSIGNED, OctetsIn INTEGER UNSIGNED, PacketsOut INTEGER UNSIGNED, OctetsOut INTEGER UNSIGNED, TerminateCause INTEGER UNSIGNED, UnauthTime TINYINT UNSIGNED, AccessRequestTime DATETIME, AcctStartTime DATETIME, AcctLastTime DATETIME, LastModification TIMESTAMP NOT NULL, INDEX(USID,ServerID,NASAddr,SessionID), INDEX(AssignedAddr)); -INSERT INTO t1 VALUES (39,42,'Access-Granted','46','491721000045',2130706433,17690,NULL,NULL,'Localnet','491721000045','49172200000',754974766,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2003-07-18 00:11:21',NULL,NULL,20030718001121); -INSERT INTO t2 SELECT USID, ServerID, State, SessionID, User, NASAddr, NASPort, NASPortType, ConnectSpeed, CarrierType, CallingStationID, CalledStationID, AssignedAddr, SessionTime, PacketsIn, OctetsIn, PacketsOut, OctetsOut, TerminateCause, UnauthTime, AccessRequestTime, AcctStartTime, AcctLastTime, LastModification from t1 LIMIT 1; -drop table t1,t2; -CREATE TABLE t1( -Month date NOT NULL, -Type tinyint(3) unsigned NOT NULL auto_increment, -Field int(10) unsigned NOT NULL, -Count int(10) unsigned NOT NULL, -UNIQUE KEY Month (Month,Type,Field) -); -insert into t1 Values -(20030901, 1, 1, 100), -(20030901, 1, 2, 100), -(20030901, 2, 1, 100), -(20030901, 2, 2, 100), -(20030901, 3, 1, 100); -select * from t1; -Month Type Field Count -2003-09-01 1 1 100 -2003-09-01 1 2 100 -2003-09-01 2 1 100 -2003-09-01 2 2 100 -2003-09-01 3 1 100 -Select null, Field, Count From t1 Where Month=20030901 and Type=2; -NULL Field Count -NULL 1 100 -NULL 2 100 -create table t2(No int not null, Field int not null, Count int not null); -insert into t2 Select null, Field, Count From t1 Where Month=20030901 and Type=2; -Warnings: -Warning 1263 Data truncated; NULL supplied to NOT NULL column 'No' at row 1 -Warning 1263 Data truncated; NULL supplied to NOT NULL column 'No' at row 2 -select * from t2; -No Field Count -0 1 100 -0 2 100 -drop table t1, t2; -CREATE TABLE t1 ( -ID int(11) NOT NULL auto_increment, -NO int(11) NOT NULL default '0', -SEQ int(11) NOT NULL default '0', -PRIMARY KEY (ID), -KEY t1$NO (SEQ,NO) -) ENGINE=MyISAM; -INSERT INTO t1 (SEQ, NO) SELECT "1" AS SEQ, IF(MAX(NO) IS NULL, 0, MAX(NO)) + 1 AS NO FROM t1 WHERE (SEQ = 1); -select SQL_BUFFER_RESULT * from t1 WHERE (SEQ = 1); -ID NO SEQ -1 1 1 -drop table t1; diff --git a/mysql-test/r/myisam-blob.result.es b/mysql-test/r/myisam-blob.result.es deleted file mode 100644 index 4031b9cfd1c..00000000000 --- a/mysql-test/r/myisam-blob.result.es +++ /dev/null @@ -1,59 +0,0 @@ -drop table if exists t1; -CREATE TABLE t1 (data LONGBLOB) ENGINE=myisam; -INSERT INTO t1 (data) VALUES (NULL); -UPDATE t1 set data=repeat('a',18*1024*1024); -Warnings: -Warning 1301 Result of repeat() was larger than max_allowed_packet (24) - truncated -select length(data) from t1; -length(data) -NULL -delete from t1 where left(data,1)='a'; -check table t1; -Table Op Msg_type Msg_text -test.t1 check status OK -truncate table t1; -INSERT INTO t1 (data) VALUES (repeat('a',1*1024*1024)); -Warnings: -Warning 1301 Result of repeat() was larger than max_allowed_packet (24) - truncated -INSERT INTO t1 (data) VALUES (repeat('b',16*1024*1024-1024)); -Warnings: -Warning 1301 Result of repeat() was larger than max_allowed_packet (24) - truncated -delete from t1 where left(data,1)='b'; -check table t1; -Table Op Msg_type Msg_text -test.t1 check status OK -UPDATE t1 set data=repeat('c',17*1024*1024); -Warnings: -Warning 1301 Result of repeat() was larger than max_allowed_packet (24) - truncated -Warning 1301 Result of repeat() was larger than max_allowed_packet (24) - truncated -check table t1; -Table Op Msg_type Msg_text -test.t1 check status OK -delete from t1 where left(data,1)='c'; -check table t1; -Table Op Msg_type Msg_text -test.t1 check status OK -INSERT INTO t1 set data=repeat('a',18*1024*1024); -Warnings: -Warning 1301 Result of repeat() was larger than max_allowed_packet (24) - truncated -select length(data) from t1; -length(data) -NULL -NULL -NULL -alter table t1 modify data blob; -select length(data) from t1; -length(data) -NULL -NULL -NULL -drop table t1; -CREATE TABLE t1 (data BLOB) ENGINE=myisam; -INSERT INTO t1 (data) VALUES (NULL); -UPDATE t1 set data=repeat('a',18*1024*1024); -Warnings: -Warning 1301 Result of repeat() was larger than max_allowed_packet (24) - truncated -select length(data) from t1; -length(data) -NULL -drop table t1; diff --git a/mysql-test/r/packet.result.es b/mysql-test/r/packet.result.es deleted file mode 100644 index 0ff587b3957..00000000000 --- a/mysql-test/r/packet.result.es +++ /dev/null @@ -1,26 +0,0 @@ -set global max_allowed_packet=100; -set max_allowed_packet=100; -set global net_buffer_length=100; -set net_buffer_length=100; -SELECT length("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") as len; -len -1024 -select repeat('a',2000); -repeat('a',2000) -NULL -Warnings: -Warning 1301 Result of repeat() was larger than max_allowed_packet (1024) - truncated -select @@net_buffer_length, @@max_allowed_packet; -@@net_buffer_length @@max_allowed_packet -1024 1024 -SELECT length("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") as len; -set global max_allowed_packet=default; -set max_allowed_packet=default; -set global net_buffer_length=default; -set net_buffer_length=default; -SELECT length("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") as len; -len -100 -select length(repeat('a',2000)); -length(repeat('a',2000)) -2000 diff --git a/mysql-test/r/query_cache.result.es b/mysql-test/r/query_cache.result.es deleted file mode 100644 index 7e75a3cee4c..00000000000 --- a/mysql-test/r/query_cache.result.es +++ /dev/null @@ -1,925 +0,0 @@ -set GLOBAL query_cache_size=1355776; -flush query cache; -flush query cache; -reset query cache; -flush status; -drop table if exists t1,t2,t3,t4,t11,t21; -drop database if exists mysqltest; -create table t1 (a int not null); -insert into t1 values (1),(2),(3); -select * from t1; -a -1 -2 -3 -select * from t1; -a -1 -2 -3 -select sql_no_cache * from t1; -a -1 -2 -3 -select length(now()) from t1; -length(now()) -19 -19 -19 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -show status like "Qcache_inserts"; -Variable_name Value -Qcache_inserts 1 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 1 -drop table t1; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -create table t1 (a int not null); -insert into t1 values (1),(2),(3); -create table t2 (a int not null); -insert into t2 values (4),(5),(6); -create table t3 (a int not null) engine=MERGE UNION=(t1,t2) INSERT_METHOD=FIRST; -select * from t3; -a -1 -2 -3 -4 -5 -6 -select * from t3; -a -1 -2 -3 -4 -5 -6 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 2 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -insert into t2 values (7); -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -select * from t1; -a -1 -2 -3 -select * from t1; -a -1 -2 -3 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 3 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -insert into t3 values (8); -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -select * from t3; -a -1 -2 -3 -8 -4 -5 -6 -7 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -update t2 set a=9 where a=7; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -select * from t1; -a -1 -2 -3 -8 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -update t3 set a=10 where a=1; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -select * from t3; -a -10 -2 -3 -8 -4 -5 -6 -9 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -delete from t2 where a=9; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -select * from t1; -a -10 -2 -3 -8 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -delete from t3 where a=10; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -drop table t1, t2, t3; -create table t1 (a int not null); -insert into t1 values (1),(2),(3); -create table t2 (a int not null); -insert into t2 values (1),(2),(3); -select * from t1; -a -1 -2 -3 -select * from t2; -a -1 -2 -3 -insert into t1 values (4); -show status like "Qcache_free_blocks"; -Variable_name Value -Qcache_free_blocks 2 -flush query cache; -show status like "Qcache_free_blocks"; -Variable_name Value -Qcache_free_blocks 1 -drop table t1, t2; -create table t1 (a text not null); -create table t11 (a text not null); -create table t2 (a text not null); -create table t21 (a text not null); -create table t3 (a text not null); -insert into t1 values("1111111111111111111111111111111111111111111111111111"); -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t11 select * from t1; -insert into t21 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t3 select * from t1; -insert into t3 select * from t2; -insert into t3 select * from t1; -select * from t11; -select * from t21; -show status like "Qcache_total_blocks"; -Variable_name Value -Qcache_total_blocks 7 -show status like "Qcache_free_blocks"; -Variable_name Value -Qcache_free_blocks 1 -insert into t11 values(""); -select * from t3; -show status like "Qcache_total_blocks"; -Variable_name Value -Qcache_total_blocks 8 -show status like "Qcache_free_blocks"; -Variable_name Value -Qcache_free_blocks 2 -flush query cache; -show status like "Qcache_total_blocks"; -Variable_name Value -Qcache_total_blocks 7 -show status like "Qcache_free_blocks"; -Variable_name Value -Qcache_free_blocks 1 -drop table t1, t2, t3, t11, t21; -set query_cache_type=demand; -create table t1 (a int not null); -insert into t1 values (1),(2),(3); -select * from t1; -a -1 -2 -3 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -select sql_cache * from t1 union select * from t1; -a -1 -2 -3 -set query_cache_type=2; -select sql_cache * from t1 union select * from t1; -a -1 -2 -3 -select * from t1 union select sql_cache * from t1; -a -1 -2 -3 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 4 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -set query_cache_type=on; -reset query cache; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -select sql_no_cache * from t1; -a -1 -2 -3 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -drop table t1; -create table t1 (a text not null); -select CONNECTION_ID() from t1; -CONNECTION_ID() -select FOUND_ROWS(); -FOUND_ROWS() -0 -select NOW() from t1; -NOW() -select CURDATE() from t1; -CURDATE() -select CURTIME() from t1; -CURTIME() -select DATABASE() from t1; -DATABASE() -select ENCRYPT("test") from t1; -ENCRYPT("test") -select LAST_INSERT_ID() from t1; -LAST_INSERT_ID() -select RAND() from t1; -RAND() -select UNIX_TIMESTAMP() from t1; -UNIX_TIMESTAMP() -select USER() from t1; -USER() -select benchmark(1,1) from t1; -benchmark(1,1) -explain extended select benchmark(1,1) from t1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 system NULL NULL NULL NULL 0 const row not found -Warnings: -Note 1003 select sql_no_cache benchmark(1,1) AS `benchmark(1,1)` from test.t1 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -create table t2 (a text not null); -insert into t1 values("1111111111111111111111111111111111111111111111111111"); -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 4 -show status like "Qcache_lowmem_prunes"; -Variable_name Value -Qcache_lowmem_prunes 0 -select a as a1, a as a2 from t1; -select a as a2, a as a3 from t1; -select a as a3, a as a4 from t1; -select a as a1, a as a2 from t1; -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 4 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -show status like "Qcache_lowmem_prunes"; -Variable_name Value -Qcache_lowmem_prunes 2 -reset query cache; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -insert into t2 select * from t1; -insert into t1 select * from t2; -select * from t1; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -drop table t1,t2; -create database mysqltest; -create table mysqltest.t1 (i int not null auto_increment, a int, primary key (i)); -insert into mysqltest.t1 (a) values (1); -select * from mysqltest.t1 where i is null; -i a -1 1 -create table t1(a int); -select * from t1; -a -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -select * from mysqltest.t1; -i a -1 1 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 3 -drop database mysqltest; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -drop table t1; -create table t1 (a char(1) not null collate koi8r_general_ci); -insert into t1 values(_koi8r""); -set CHARACTER SET koi8r; -select * from t1; -a - -set CHARACTER SET cp1251_koi8; -select * from t1; -a - -set CHARACTER SET DEFAULT; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 4 -drop table t1; -create database if not exists mysqltest; -create table mysqltest.t1 (i int not null); -create table t1 (i int not null); -insert into mysqltest.t1 (i) values (1); -insert into t1 (i) values (2); -select * from t1; -i -2 -use mysqltest; -select * from t1; -i -1 -select * from t1; -i -1 -use test; -select * from t1; -i -2 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 6 -drop database mysqltest; -drop table t1; -create table t1 (i int not null); -insert into t1 (i) values (1),(2),(3),(4); -select SQL_CALC_FOUND_ROWS * from t1 limit 2; -i -1 -2 -select FOUND_ROWS(); -FOUND_ROWS() -4 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 6 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -select * from t1 where i=1; -i -1 -select FOUND_ROWS(); -FOUND_ROWS() -1 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 6 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -select SQL_CALC_FOUND_ROWS * from t1 limit 2; -i -1 -2 -select FOUND_ROWS(); -FOUND_ROWS() -4 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 7 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -select * from t1 where i=1; -i -1 -select FOUND_ROWS(); -FOUND_ROWS() -1 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 8 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -drop table t1; -flush query cache; -reset query cache; -create table t1 (a int not null); -insert into t1 values (1),(2),(3); -select * from t1; -a -1 -2 -3 -select * from t1; -a -1 -2 -3 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -insert delayed into t1 values (4); -select a from t1; -a -1 -2 -3 -4 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -drop table t1; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -show global variables like "query_cache_min_res_unit"; -Variable_name Value -query_cache_min_res_unit 4096 -set GLOBAL query_cache_min_res_unit=1001; -show global variables like "query_cache_min_res_unit"; -Variable_name Value -query_cache_min_res_unit 1008 -create table t1 (a int not null); -insert into t1 values (1),(2),(3); -create table t2 (a int not null); -insert into t2 values (1),(2),(3); -select * from t1; -a -1 -2 -3 -select * from t1; -a -1 -2 -3 -select * from t2; -a -1 -2 -3 -select * from t2; -a -1 -2 -3 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 11 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -drop table t1; -select a from t2; -a -1 -2 -3 -select a from t2; -a -1 -2 -3 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 12 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -drop table t2; -set GLOBAL query_cache_min_res_unit=default; -show global variables like "query_cache_min_res_unit"; -Variable_name Value -query_cache_min_res_unit 4096 -create table t1 (a int not null); -insert into t1 values (1); -select "aaa" from t1; -aaa -aaa -select "AAA" from t1; -AAA -AAA -drop table t1; -create table t1 (a int); -set GLOBAL query_cache_size=1000; -show global variables like "query_cache_size"; -Variable_name Value -query_cache_size 0 -select * from t1; -a -set GLOBAL query_cache_size=1024; -Warnings: -Warning 1282 Query cache failed to set size 1024; new query cache size is 0 -show global variables like "query_cache_size"; -Variable_name Value -query_cache_size 0 -select * from t1; -a -set GLOBAL query_cache_size=10240; -Warnings: -Warning 1282 Query cache failed to set size 10240; new query cache size is 0 -show global variables like "query_cache_size"; -Variable_name Value -query_cache_size 0 -select * from t1; -a -set GLOBAL query_cache_size=20480; -Warnings: -Warning 1282 Query cache failed to set size 20480; new query cache size is 0 -show global variables like "query_cache_size"; -Variable_name Value -query_cache_size 0 -select * from t1; -a -set GLOBAL query_cache_size=40960; -Warnings: -Warning 1282 Query cache failed to set size 40960; new query cache size is 0 -show global variables like "query_cache_size"; -Variable_name Value -query_cache_size 0 -select * from t1; -a -set GLOBAL query_cache_size=51200; -show global variables like "query_cache_size"; -Variable_name Value -query_cache_size 51200 -select * from t1; -a -set GLOBAL query_cache_size=61440; -show global variables like "query_cache_size"; -Variable_name Value -query_cache_size 61440 -select * from t1; -a -set GLOBAL query_cache_size=81920; -show global variables like "query_cache_size"; -Variable_name Value -query_cache_size 81920 -select * from t1; -a -set GLOBAL query_cache_size=102400; -show global variables like "query_cache_size"; -Variable_name Value -query_cache_size 102400 -select * from t1; -a -drop table t1; -set GLOBAL query_cache_size=1048576; -create table t1 (i int not null); -create table t2 (i int not null); -select * from t1; -i -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -create temporary table t3 (i int not null); -select * from t2; -i -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -select * from t3; -i -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -update t1 set i=(select distinct 1 from (select * from t2) a); -drop table t1, t2, t3; -use mysql; -select * from db; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -use test; -select * from mysql.db; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -create table t1(id int auto_increment primary key); -insert into t1 values (NULL), (NULL), (NULL); -select * from t1 where id=2; -id -2 -alter table t1 rename to t2; -select * from t1 where id=2; -ERROR 42S02: Table 'test.t1' doesn't exist -drop table t2; -select * from t1 where id=2; -ERROR 42S02: Table 'test.t1' doesn't exist -create table t1 (word char(20) not null); -select * from t1; -word -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -load data infile 'TEST_DIR/std_data/words.dat' into table t1; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -select count(*) from t1; -count(*) -70 -drop table t1; -create table t1 (a int); -insert into t1 values (1),(2),(3); -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -select * from t1 into outfile "query_cache.out.file"; -select * from t1 into outfile "query_cache.out.file"; -ERROR HY000: File 'query_cache.out.file' already exists -select * from t1 limit 1 into dumpfile "query_cache.dump.file"; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -drop table t1; -create table t1 (a int); -insert into t1 values (1),(2); -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -select * from t1; -a -1 -2 -SET OPTION SQL_SELECT_LIMIT=1; -select * from t1; -a -1 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -SET OPTION SQL_SELECT_LIMIT=DEFAULT; -drop table t1; -flush query cache; -reset query cache; -flush status; -set GLOBAL query_cache_size=1048576; -create table t1 (a int not null); -insert into t1 values (1),(2),(3); -create table t2 (a text not null); -create table t3 (a text not null); -insert into t3 values("1111111111111111111111111111111111111111111111111111"); -insert into t2 select * from t3; -insert into t3 select * from t2; -insert into t2 select * from t3; -insert into t3 select * from t2; -insert into t2 select * from t3; -insert into t3 select * from t2; -insert into t2 select * from t3; -insert into t3 select * from t2; -insert into t2 select * from t3; -insert into t3 select * from t2; -drop table t2; -create table t2 (a int not null); -insert into t2 values (1),(2),(3); -create table t4 (a int not null); -insert into t4 values (1),(2),(3); -select * from t4; -select * from t2; -select * from t1 as tt, t1 as ttt where tt.a=1 and ttt.a=2; -select * from t2; -select * from t4; -select * from t1 as tt, t1 as ttt where tt.a=1 and ttt.a=2; -select * from t2; -select * from t4; -select * from t1 as tt, t1 as ttt where tt.a=1 and ttt.a=2; -delete from t2 where a=1; -flush query cache; -select * from t3; -delete from t4 where a=1; -flush query cache; -drop table t1,t2,t3,t4; -set query_cache_wlock_invalidate=1; -create table t1 (a int not null); -create table t2 (a int not null); -select * from t1; -a -select * from t2; -a -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -lock table t1 write, t2 read; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -unlock table; -drop table t1,t2; -set query_cache_wlock_invalidate=default; -CREATE TABLE t1 (id INT PRIMARY KEY); -insert into t1 values (1),(2),(3); -select * from t1; -id -1 -2 -3 -create temporary table t1 (a int not null auto_increment -primary key); -select * from t1; -a -drop table t1; -drop table t1; -SET NAMES koi8r; -CREATE TABLE t1 (a char(1) character set koi8r); -INSERT INTO t1 VALUES (_koi8r''),(_koi8r''); -SELECT a,'',''='' FROM t1; -a ''='' - 1 - 1 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 6 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -set collation_connection=koi8r_bin; -SELECT a,'',''='' FROM t1; -a ''='' - 0 - 0 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 6 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 2 -set character_set_client=cp1251; -SELECT a,'',''='' FROM t1; -a ''='' - 0 - 0 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 6 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 3 -set character_set_results=cp1251; -SELECT a,'',''='' FROM t1; -a ''='' - 0 - 0 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 6 -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 4 -DROP TABLE t1; -CREATE TABLE t1 (a int(1)); -CREATE DATABASE mysqltest; -USE mysqltest; -DROP DATABASE mysqltest; -SELECT * FROM test.t1; -a -USE test; -DROP TABLE t1; -set character_set_results=null; -select @@character_set_results; -@@character_set_results -NULL -set character_set_results=default; -set GLOBAL query_cache_size=1355776; -create table t1 (id int auto_increment primary key, c char(25)); -insert into t1 set c = repeat('x',24); -insert into t1 set c = concat(repeat('x',24),'x'); -insert into t1 set c = concat(repeat('x',24),'w'); -insert into t1 set c = concat(repeat('x',24),'y'); -set max_sort_length=200; -select c from t1 order by c, id; -c -xxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxw -xxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxy -reset query cache; -set max_sort_length=20; -select c from t1 order by c, id; -c -xxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxw -xxxxxxxxxxxxxxxxxxxxxxxxy -set max_sort_length=200; -select c from t1 order by c, id; -c -xxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxw -xxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxy -set max_sort_length=default; -select '1' || '3' from t1; -'1' || '3' -1 -1 -1 -1 -set SQL_MODE=oracle; -select '1' || '3' from t1; -'1' || '3' -13 -13 -13 -13 -set SQL_MODE=default; -drop table t1; -create table t1 (a varchar(20), b int); -insert into t1 values ('12345678901234567890', 1); -set group_concat_max_len=10; -select group_concat(a) FROM t1 group by b; -group_concat(a) -1234567890 -Warnings: -Warning 1260 1 line(s) were cut by GROUP_CONCAT() -set group_concat_max_len=1024; -select group_concat(a) FROM t1 group by b; -group_concat(a) -12345678901234567890 -set group_concat_max_len=default; -drop table t1; -SET GLOBAL query_cache_size=0; diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result index a05b379ed88..c9528aa497f 100644 --- a/mysql-test/r/select.result +++ b/mysql-test/r/select.result @@ -2033,20 +2033,20 @@ show tables from test like "t?"; Tables_in_test (t?) show full columns from t2; Field Type Collation Null Key Default Extra Privileges Comment -auto int(11) NULL PRI NULL auto_increment select,insert,update,references -fld1 int(6) unsigned zerofill NULL UNI 000000 select,insert,update,references -companynr tinyint(2) unsigned zerofill NULL 00 select,insert,update,references -fld3 char(30) latin1_swedish_ci MUL select,insert,update,references -fld4 char(35) latin1_swedish_ci select,insert,update,references -fld5 char(35) latin1_swedish_ci select,insert,update,references -fld6 char(4) latin1_swedish_ci select,insert,update,references +auto int(11) NULL PRI NULL auto_increment # +fld1 int(6) unsigned zerofill NULL UNI 000000 # +companynr tinyint(2) unsigned zerofill NULL 00 # +fld3 char(30) latin1_swedish_ci MUL # +fld4 char(35) latin1_swedish_ci # +fld5 char(35) latin1_swedish_ci # +fld6 char(4) latin1_swedish_ci # show full columns from t2 from test like 'f%'; Field Type Collation Null Key Default Extra Privileges Comment -fld1 int(6) unsigned zerofill NULL UNI 000000 select,insert,update,references -fld3 char(30) latin1_swedish_ci MUL select,insert,update,references -fld4 char(35) latin1_swedish_ci select,insert,update,references -fld5 char(35) latin1_swedish_ci select,insert,update,references -fld6 char(4) latin1_swedish_ci select,insert,update,references +fld1 int(6) unsigned zerofill NULL UNI 000000 # +fld3 char(30) latin1_swedish_ci MUL # +fld4 char(35) latin1_swedish_ci # +fld5 char(35) latin1_swedish_ci # +fld6 char(4) latin1_swedish_ci # show full columns from t2 from test like 's%'; Field Type Collation Null Key Default Extra Privileges Comment show keys from t2; diff --git a/mysql-test/r/select.result.es b/mysql-test/r/select.result.es deleted file mode 100644 index da761ebb822..00000000000 --- a/mysql-test/r/select.result.es +++ /dev/null @@ -1,2389 +0,0 @@ -drop table if exists t1,t2,t3,t4; -drop table if exists t1_1,t1_2,t9_1,t9_2; -CREATE TABLE t1 ( -Period smallint(4) unsigned zerofill DEFAULT '0000' NOT NULL, -Varor_period smallint(4) unsigned DEFAULT '0' NOT NULL -); -INSERT INTO t1 VALUES (9410,9412); -select period from t1; -period -9410 -select * from t1; -Period Varor_period -9410 9412 -select t1.* from t1; -Period Varor_period -9410 9412 -CREATE TABLE t2 ( -auto int not null auto_increment, -fld1 int(6) unsigned zerofill DEFAULT '000000' NOT NULL, -companynr tinyint(2) unsigned zerofill DEFAULT '00' NOT NULL, -fld3 char(30) DEFAULT '' NOT NULL, -fld4 char(35) DEFAULT '' NOT NULL, -fld5 char(35) DEFAULT '' NOT NULL, -fld6 char(4) DEFAULT '' NOT NULL, -UNIQUE fld1 (fld1), -KEY fld3 (fld3), -PRIMARY KEY (auto) -); -select t2.fld3 from t2 where companynr = 58 and fld3 like "%imaginable%"; -fld3 -imaginable -select fld3 from t2 where fld3 like "%cultivation" ; -fld3 -cultivation -select t2.fld3,companynr from t2 where companynr = 57+1 order by fld3; -fld3 companynr -concoct 58 -druggists 58 -engrossing 58 -Eurydice 58 -exclaimers 58 -ferociousness 58 -hopelessness 58 -Huey 58 -imaginable 58 -judges 58 -merging 58 -ostrich 58 -peering 58 -Phelps 58 -presumes 58 -Ruth 58 -sentences 58 -Shylock 58 -straggled 58 -synergy 58 -thanking 58 -tying 58 -unlocks 58 -select fld3,companynr from t2 where companynr = 58 order by fld3; -fld3 companynr -concoct 58 -druggists 58 -engrossing 58 -Eurydice 58 -exclaimers 58 -ferociousness 58 -hopelessness 58 -Huey 58 -imaginable 58 -judges 58 -merging 58 -ostrich 58 -peering 58 -Phelps 58 -presumes 58 -Ruth 58 -sentences 58 -Shylock 58 -straggled 58 -synergy 58 -thanking 58 -tying 58 -unlocks 58 -select fld3 from t2 order by fld3 desc limit 10; -fld3 -youthfulness -yelped -Wotan -workers -Witt -witchcraft -Winsett -Willy -willed -wildcats -select fld3 from t2 order by fld3 desc limit 5; -fld3 -youthfulness -yelped -Wotan -workers -Witt -select fld3 from t2 order by fld3 desc limit 5,5; -fld3 -witchcraft -Winsett -Willy -willed -wildcats -select t2.fld3 from t2 where fld3 = 'honeysuckle'; -fld3 -honeysuckle -select t2.fld3 from t2 where fld3 LIKE 'honeysuckl_'; -fld3 -honeysuckle -select t2.fld3 from t2 where fld3 LIKE 'hon_ysuckl_'; -fld3 -honeysuckle -select t2.fld3 from t2 where fld3 LIKE 'honeysuckle%'; -fld3 -honeysuckle -select t2.fld3 from t2 where fld3 LIKE 'h%le'; -fld3 -honeysuckle -select t2.fld3 from t2 where fld3 LIKE 'honeysuckle_'; -fld3 -select t2.fld3 from t2 where fld3 LIKE 'don_t_find_me_please%'; -fld3 -explain select t2.fld3 from t2 where fld3 = 'honeysuckle'; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ref fld3 fld3 30 const 1 Using where; Using index -explain select fld3 from t2 ignore index (fld3) where fld3 = 'honeysuckle'; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using where -explain select fld3 from t2 use index (fld1) where fld3 = 'honeysuckle'; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using where -explain select fld3 from t2 use index (fld3) where fld3 = 'honeysuckle'; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ref fld3 fld3 30 const 1 Using where; Using index -explain select fld3 from t2 use index (fld1,fld3) where fld3 = 'honeysuckle'; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ref fld3 fld3 30 const 1 Using where; Using index -explain select fld3 from t2 ignore index (fld3,not_used); -ERROR 42000: Key column 'not_used' doesn't exist in table -explain select fld3 from t2 use index (not_used); -ERROR 42000: Key column 'not_used' doesn't exist in table -select t2.fld3 from t2 where fld3 >= 'honeysuckle' and fld3 <= 'honoring' order by fld3; -fld3 -honeysuckle -honoring -explain select t2.fld3 from t2 where fld3 >= 'honeysuckle' and fld3 <= 'honoring' order by fld3; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 range fld3 fld3 30 NULL 2 Using where; Using index -select fld1,fld3 from t2 where fld3="Colombo" or fld3 = "nondecreasing" order by fld3; -fld1 fld3 -148504 Colombo -068305 Colombo -000000 nondecreasing -select fld1,fld3 from t2 where companynr = 37 and fld3 = 'appendixes'; -fld1 fld3 -232605 appendixes -1232605 appendixes -1232606 appendixes -1232607 appendixes -1232608 appendixes -1232609 appendixes -select fld1 from t2 where fld1=250501 or fld1="250502"; -fld1 -250501 -250502 -explain select fld1 from t2 where fld1=250501 or fld1="250502"; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 range fld1 fld1 4 NULL 2 Using where; Using index -select fld1 from t2 where fld1=250501 or fld1=250502 or fld1 >= 250505 and fld1 <= 250601 or fld1 between 250501 and 250502; -fld1 -250501 -250502 -250505 -250601 -explain select fld1 from t2 where fld1=250501 or fld1=250502 or fld1 >= 250505 and fld1 <= 250601 or fld1 between 250501 and 250502; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 range fld1 fld1 4 NULL 4 Using where; Using index -select fld1,fld3 from t2 where companynr = 37 and fld3 like 'f%'; -fld1 fld3 -218401 faithful -018007 fanatic -228311 fated -018017 featherweight -218022 feed -088303 feminine -058004 Fenton -038017 fetched -018054 fetters -208101 fiftieth -238007 filial -013606 fingerings -218008 finishers -038205 firearm -188505 fitting -202301 Fitzpatrick -238008 fixedly -012001 flanking -018103 flint -018104 flopping -188007 flurried -013602 foldout -226205 foothill -232102 forgivably -228306 forthcoming -186002 freakish -208113 freest -231315 freezes -036002 funereal -226209 furnishings -198006 furthermore -select fld3 from t2 where fld3 like "L%" and fld3 = "ok"; -fld3 -select fld3 from t2 where (fld3 like "C%" and fld3 = "Chantilly"); -fld3 -Chantilly -select fld1,fld3 from t2 where fld1 like "25050%"; -fld1 fld3 -250501 poisoning -250502 Iraqis -250503 heaving -250504 population -250505 bomb -select fld1,fld3 from t2 where fld1 like "25050_"; -fld1 fld3 -250501 poisoning -250502 Iraqis -250503 heaving -250504 population -250505 bomb -select distinct companynr from t2; -companynr -00 -37 -36 -50 -58 -29 -40 -53 -65 -41 -34 -68 -select distinct companynr from t2 order by companynr; -companynr -00 -29 -34 -36 -37 -40 -41 -50 -53 -58 -65 -68 -select distinct companynr from t2 order by companynr desc; -companynr -68 -65 -58 -53 -50 -41 -40 -37 -36 -34 -29 -00 -select distinct t2.fld3,period from t2,t1 where companynr=37 and fld3 like "O%"; -fld3 period -obliterates 9410 -offload 9410 -opaquely 9410 -organizer 9410 -overestimating 9410 -overlay 9410 -select distinct fld3 from t2 where companynr = 34 order by fld3; -fld3 -absentee -accessed -ahead -alphabetic -Asiaticizations -attitude -aye -bankruptcies -belays -Blythe -bomb -boulevard -bulldozes -cannot -caressing -charcoal -checksumming -chess -clubroom -colorful -cosy -creator -crying -Darius -diffusing -duality -Eiffel -Epiphany -Ernestine -explorers -exterminated -famine -forked -Gershwins -heaving -Hodges -Iraqis -Italianization -Lagos -landslide -libretto -Majorca -mastering -narrowed -occurred -offerers -Palestine -Peruvianizes -pharmaceutic -poisoning -population -Pygmalion -rats -realest -recording -regimented -retransmitting -reviver -rouses -scars -sicker -sleepwalk -stopped -sugars -translatable -uncles -unexpected -uprisings -versatility -vest -select distinct fld3 from t2 limit 10; -fld3 -abates -abiding -Abraham -abrogating -absentee -abut -accessed -accruing -accumulating -accuracies -select distinct fld3 from t2 having fld3 like "A%" limit 10; -fld3 -abates -abiding -Abraham -abrogating -absentee -abut -accessed -accruing -accumulating -accuracies -select distinct substring(fld3,1,3) from t2 where fld3 like "A%"; -substring(fld3,1,3) -aba -abi -Abr -abs -abu -acc -acq -acu -Ade -adj -Adl -adm -Ado -ads -adv -aer -aff -afi -afl -afo -agi -ahe -aim -air -Ald -alg -ali -all -alp -alr -ama -ame -amm -ana -and -ane -Ang -ani -Ann -Ant -api -app -aqu -Ara -arc -Arm -arr -Art -Asi -ask -asp -ass -ast -att -aud -Aug -aut -ave -avo -awe -aye -Azt -select distinct substring(fld3,1,3) as a from t2 having a like "A%" order by a limit 10; -a -aba -abi -Abr -abs -abu -acc -acq -acu -Ade -adj -select distinct substring(fld3,1,3) from t2 where fld3 like "A%" limit 10; -substring(fld3,1,3) -aba -abi -Abr -abs -abu -acc -acq -acu -Ade -adj -select distinct substring(fld3,1,3) as a from t2 having a like "A%" limit 10; -a -aba -abi -Abr -abs -abu -acc -acq -acu -Ade -adj -create table t3 ( -period int not null, -name char(32) not null, -companynr int not null, -price double(11,0), -price2 double(11,0), -key (period), -key (name) -); -create temporary table tmp engine = myisam select * from t3; -insert into t3 select * from tmp; -insert into tmp select * from t3; -insert into t3 select * from tmp; -insert into tmp select * from t3; -insert into t3 select * from tmp; -insert into tmp select * from t3; -insert into t3 select * from tmp; -insert into tmp select * from t3; -insert into t3 select * from tmp; -insert into tmp select * from t3; -insert into t3 select * from tmp; -insert into tmp select * from t3; -insert into t3 select * from tmp; -insert into tmp select * from t3; -insert into t3 select * from tmp; -insert into tmp select * from t3; -insert into t3 select * from tmp; -alter table t3 add t2nr int not null auto_increment primary key first; -drop table tmp; -SET SQL_BIG_TABLES=1; -select distinct concat(fld3," ",fld3) as namn from t2,t3 where t2.fld1=t3.t2nr order by namn limit 10; -namn -Abraham Abraham -abrogating abrogating -admonishing admonishing -Adolph Adolph -afield afield -aging aging -ammonium ammonium -analyzable analyzable -animals animals -animized animized -SET SQL_BIG_TABLES=0; -select distinct concat(fld3," ",fld3) from t2,t3 where t2.fld1=t3.t2nr order by fld3 limit 10; -concat(fld3," ",fld3) -Abraham Abraham -abrogating abrogating -admonishing admonishing -Adolph Adolph -afield afield -aging aging -ammonium ammonium -analyzable analyzable -animals animals -animized animized -select distinct fld5 from t2 limit 10; -fld5 -neat -Steinberg -jarring -tinily -balled -persist -attainments -fanatic -measures -rightfulness -select distinct fld3,count(*) from t2 group by companynr,fld3 limit 10; -fld3 count(*) -affixed 1 -and 1 -annoyers 1 -Anthony 1 -assayed 1 -assurers 1 -attendants 1 -bedlam 1 -bedpost 1 -boasted 1 -SET SQL_BIG_TABLES=1; -select distinct fld3,count(*) from t2 group by companynr,fld3 limit 10; -fld3 count(*) -affixed 1 -and 1 -annoyers 1 -Anthony 1 -assayed 1 -assurers 1 -attendants 1 -bedlam 1 -bedpost 1 -boasted 1 -SET SQL_BIG_TABLES=0; -select distinct fld3,repeat("a",length(fld3)),count(*) from t2 group by companynr,fld3 limit 100,10; -fld3 repeat("a",length(fld3)) count(*) -circus aaaaaa 1 -cited aaaaa 1 -Colombo aaaaaaa 1 -congresswoman aaaaaaaaaaaaa 1 -contrition aaaaaaaaaa 1 -corny aaaaa 1 -cultivation aaaaaaaaaaa 1 -definiteness aaaaaaaaaaaa 1 -demultiplex aaaaaaaaaaa 1 -disappointing aaaaaaaaaaaaa 1 -select distinct companynr,rtrim(space(512+companynr)) from t3 order by 1,2; -companynr rtrim(space(512+companynr)) -37 -78 -101 -154 -311 -447 -512 -select distinct fld3 from t2,t3 where t2.companynr = 34 and t2.fld1=t3.t2nr order by fld3; -fld3 -explain select t3.t2nr,fld3 from t2,t3 where t2.companynr = 34 and t2.fld1=t3.t2nr order by t3.t2nr,fld3; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ALL fld1 NULL NULL NULL 1199 Using where; Using temporary; Using filesort -1 SIMPLE t3 eq_ref PRIMARY PRIMARY 4 test.t2.fld1 1 Using where; Using index -explain select * from t3 as t1,t3 where t1.period=t3.period order by t3.period; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL period NULL NULL NULL 41810 Using temporary; Using filesort -1 SIMPLE t3 ref period period 4 test.t1.period 4181 -explain select * from t3 as t1,t3 where t1.period=t3.period order by t3.period limit 10; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t3 index period period 4 NULL 41810 -1 SIMPLE t1 ref period period 4 test.t3.period 4181 -explain select * from t3 as t1,t3 where t1.period=t3.period order by t1.period limit 10; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index period period 4 NULL 41810 -1 SIMPLE t3 ref period period 4 test.t1.period 4181 -select period from t1; -period -9410 -select period from t1 where period=1900; -period -select fld3,period from t1,t2 where fld1 = 011401 order by period; -fld3 period -breaking 9410 -select fld3,period from t2,t3 where t2.fld1 = 011401 and t2.fld1=t3.t2nr and t3.period=1001; -fld3 period -breaking 1001 -explain select fld3,period from t2,t3 where t2.fld1 = 011401 and t3.t2nr=t2.fld1 and 1001 = t3.period; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 const fld1 fld1 4 const 1 -1 SIMPLE t3 const PRIMARY,period PRIMARY 4 const 1 -select fld3,period from t2,t1 where companynr*10 = 37*10; -fld3 period -breaking 9410 -Romans 9410 -intercepted 9410 -bewilderingly 9410 -astound 9410 -admonishing 9410 -sumac 9410 -flanking 9410 -combed 9410 -subjective 9410 -scatterbrain 9410 -Eulerian 9410 -Kane 9410 -overlay 9410 -perturb 9410 -goblins 9410 -annihilates 9410 -Wotan 9410 -snatching 9410 -concludes 9410 -laterally 9410 -yelped 9410 -grazing 9410 -Baird 9410 -celery 9410 -misunderstander 9410 -handgun 9410 -foldout 9410 -mystic 9410 -succumbed 9410 -Nabisco 9410 -fingerings 9410 -aging 9410 -afield 9410 -ammonium 9410 -boat 9410 -intelligibility 9410 -Augustine 9410 -teethe 9410 -dreaded 9410 -scholastics 9410 -audiology 9410 -wallet 9410 -parters 9410 -eschew 9410 -quitter 9410 -neat 9410 -Steinberg 9410 -jarring 9410 -tinily 9410 -balled 9410 -persist 9410 -attainments 9410 -fanatic 9410 -measures 9410 -rightfulness 9410 -capably 9410 -impulsive 9410 -starlet 9410 -terminators 9410 -untying 9410 -announces 9410 -featherweight 9410 -pessimist 9410 -daughter 9410 -decliner 9410 -lawgiver 9410 -stated 9410 -readable 9410 -attrition 9410 -cascade 9410 -motors 9410 -interrogate 9410 -pests 9410 -stairway 9410 -dopers 9410 -testicle 9410 -Parsifal 9410 -leavings 9410 -postulation 9410 -squeaking 9410 -contrasted 9410 -leftover 9410 -whiteners 9410 -erases 9410 -Punjab 9410 -Merritt 9410 -Quixotism 9410 -sweetish 9410 -dogging 9410 -scornfully 9410 -bellow 9410 -bills 9410 -cupboard 9410 -sureties 9410 -puddings 9410 -fetters 9410 -bivalves 9410 -incurring 9410 -Adolph 9410 -pithed 9410 -Miles 9410 -trimmings 9410 -tragedies 9410 -skulking 9410 -flint 9410 -flopping 9410 -relaxing 9410 -offload 9410 -suites 9410 -lists 9410 -animized 9410 -multilayer 9410 -standardizes 9410 -Judas 9410 -vacuuming 9410 -dentally 9410 -humanness 9410 -inch 9410 -Weissmuller 9410 -irresponsibly 9410 -luckily 9410 -culled 9410 -medical 9410 -bloodbath 9410 -subschema 9410 -animals 9410 -Micronesia 9410 -repetitions 9410 -Antares 9410 -ventilate 9410 -pityingly 9410 -interdependent 9410 -Graves 9410 -neonatal 9410 -chafe 9410 -honoring 9410 -realtor 9410 -elite 9410 -funereal 9410 -abrogating 9410 -sorters 9410 -Conley 9410 -lectured 9410 -Abraham 9410 -Hawaii 9410 -cage 9410 -hushes 9410 -Simla 9410 -reporters 9410 -Dutchman 9410 -descendants 9410 -groupings 9410 -dissociate 9410 -coexist 9410 -Beebe 9410 -Taoism 9410 -Connally 9410 -fetched 9410 -checkpoints 9410 -rusting 9410 -galling 9410 -obliterates 9410 -traitor 9410 -resumes 9410 -analyzable 9410 -terminator 9410 -gritty 9410 -firearm 9410 -minima 9410 -Selfridge 9410 -disable 9410 -witchcraft 9410 -betroth 9410 -Manhattanize 9410 -imprint 9410 -peeked 9410 -swelling 9410 -interrelationships 9410 -riser 9410 -Gandhian 9410 -peacock 9410 -bee 9410 -kanji 9410 -dental 9410 -scarf 9410 -chasm 9410 -insolence 9410 -syndicate 9410 -alike 9410 -imperial 9410 -convulsion 9410 -railway 9410 -validate 9410 -normalizes 9410 -comprehensive 9410 -chewing 9410 -denizen 9410 -schemer 9410 -chronicle 9410 -Kline 9410 -Anatole 9410 -partridges 9410 -brunch 9410 -recruited 9410 -dimensions 9410 -Chicana 9410 -announced 9410 -praised 9410 -employing 9410 -linear 9410 -quagmire 9410 -western 9410 -relishing 9410 -serving 9410 -scheduling 9410 -lore 9410 -eventful 9410 -arteriole 9410 -disentangle 9410 -cured 9410 -Fenton 9410 -avoidable 9410 -drains 9410 -detectably 9410 -husky 9410 -impelling 9410 -undoes 9410 -evened 9410 -squeezes 9410 -destroyer 9410 -rudeness 9410 -beaner 9410 -boorish 9410 -Everhart 9410 -encompass 9410 -mushrooms 9410 -Alison 9410 -externally 9410 -pellagra 9410 -cult 9410 -creek 9410 -Huffman 9410 -Majorca 9410 -governing 9410 -gadfly 9410 -reassigned 9410 -intentness 9410 -craziness 9410 -psychic 9410 -squabbled 9410 -burlesque 9410 -capped 9410 -extracted 9410 -DiMaggio 9410 -exclamation 9410 -subdirectory 9410 -Gothicism 9410 -feminine 9410 -metaphysically 9410 -sanding 9410 -Miltonism 9410 -freakish 9410 -index 9410 -straight 9410 -flurried 9410 -denotative 9410 -coming 9410 -commencements 9410 -gentleman 9410 -gifted 9410 -Shanghais 9410 -sportswriting 9410 -sloping 9410 -navies 9410 -leaflet 9410 -shooter 9410 -Joplin 9410 -babies 9410 -assails 9410 -admiring 9410 -swaying 9410 -Goldstine 9410 -fitting 9410 -Norwalk 9410 -analogy 9410 -deludes 9410 -cokes 9410 -Clayton 9410 -exhausts 9410 -causality 9410 -sating 9410 -icon 9410 -throttles 9410 -communicants 9410 -dehydrate 9410 -priceless 9410 -publicly 9410 -incidentals 9410 -commonplace 9410 -mumbles 9410 -furthermore 9410 -cautioned 9410 -parametrized 9410 -registration 9410 -sadly 9410 -positioning 9410 -babysitting 9410 -eternal 9410 -hoarder 9410 -congregates 9410 -rains 9410 -workers 9410 -sags 9410 -unplug 9410 -garage 9410 -boulder 9410 -specifics 9410 -Teresa 9410 -Winsett 9410 -convenient 9410 -buckboards 9410 -amenities 9410 -resplendent 9410 -sews 9410 -participated 9410 -Simon 9410 -certificates 9410 -Fitzpatrick 9410 -Evanston 9410 -misted 9410 -textures 9410 -save 9410 -count 9410 -rightful 9410 -chaperone 9410 -Lizzy 9410 -clenched 9410 -effortlessly 9410 -accessed 9410 -beaters 9410 -Hornblower 9410 -vests 9410 -indulgences 9410 -infallibly 9410 -unwilling 9410 -excrete 9410 -spools 9410 -crunches 9410 -overestimating 9410 -ineffective 9410 -humiliation 9410 -sophomore 9410 -star 9410 -rifles 9410 -dialysis 9410 -arriving 9410 -indulge 9410 -clockers 9410 -languages 9410 -Antarctica 9410 -percentage 9410 -ceiling 9410 -specification 9410 -regimented 9410 -ciphers 9410 -pictures 9410 -serpents 9410 -allot 9410 -realized 9410 -mayoral 9410 -opaquely 9410 -hostess 9410 -fiftieth 9410 -incorrectly 9410 -decomposition 9410 -stranglings 9410 -mixture 9410 -electroencephalography 9410 -similarities 9410 -charges 9410 -freest 9410 -Greenberg 9410 -tinting 9410 -expelled 9410 -warm 9410 -smoothed 9410 -deductions 9410 -Romano 9410 -bitterroot 9410 -corset 9410 -securing 9410 -environing 9410 -cute 9410 -Crays 9410 -heiress 9410 -inform 9410 -avenge 9410 -universals 9410 -Kinsey 9410 -ravines 9410 -bestseller 9410 -equilibrium 9410 -extents 9410 -relatively 9410 -pressure 9410 -critiques 9410 -befouled 9410 -rightfully 9410 -mechanizing 9410 -Latinizes 9410 -timesharing 9410 -Aden 9410 -embassies 9410 -males 9410 -shapelessly 9410 -mastering 9410 -Newtonian 9410 -finishers 9410 -abates 9410 -teem 9410 -kiting 9410 -stodgy 9410 -feed 9410 -guitars 9410 -airships 9410 -store 9410 -denounces 9410 -Pyle 9410 -Saxony 9410 -serializations 9410 -Peruvian 9410 -taxonomically 9410 -kingdom 9410 -stint 9410 -Sault 9410 -faithful 9410 -Ganymede 9410 -tidiness 9410 -gainful 9410 -contrary 9410 -Tipperary 9410 -tropics 9410 -theorizers 9410 -renew 9410 -already 9410 -terminal 9410 -Hegelian 9410 -hypothesizer 9410 -warningly 9410 -journalizing 9410 -nested 9410 -Lars 9410 -saplings 9410 -foothill 9410 -labeled 9410 -imperiously 9410 -reporters 9410 -furnishings 9410 -precipitable 9410 -discounts 9410 -excises 9410 -Stalin 9410 -despot 9410 -ripeness 9410 -Arabia 9410 -unruly 9410 -mournfulness 9410 -boom 9410 -slaughter 9410 -Sabine 9410 -handy 9410 -rural 9410 -organizer 9410 -shipyard 9410 -civics 9410 -inaccuracy 9410 -rules 9410 -juveniles 9410 -comprised 9410 -investigations 9410 -stabilizes 9410 -seminaries 9410 -Hunter 9410 -sporty 9410 -test 9410 -weasels 9410 -CERN 9410 -tempering 9410 -afore 9410 -Galatean 9410 -techniques 9410 -error 9410 -veranda 9410 -severely 9410 -Cassites 9410 -forthcoming 9410 -guides 9410 -vanish 9410 -lied 9410 -sawtooth 9410 -fated 9410 -gradually 9410 -widens 9410 -preclude 9410 -evenhandedly 9410 -percentage 9410 -disobedience 9410 -humility 9410 -gleaning 9410 -petted 9410 -bloater 9410 -minion 9410 -marginal 9410 -apiary 9410 -measures 9410 -precaution 9410 -repelled 9410 -primary 9410 -coverings 9410 -Artemia 9410 -navigate 9410 -spatial 9410 -Gurkha 9410 -meanwhile 9410 -Melinda 9410 -Butterfield 9410 -Aldrich 9410 -previewing 9410 -glut 9410 -unaffected 9410 -inmate 9410 -mineral 9410 -impending 9410 -meditation 9410 -ideas 9410 -miniaturizes 9410 -lewdly 9410 -title 9410 -youthfulness 9410 -creak 9410 -Chippewa 9410 -clamored 9410 -freezes 9410 -forgivably 9410 -reduce 9410 -McGovern 9410 -Nazis 9410 -epistle 9410 -socializes 9410 -conceptions 9410 -Kevin 9410 -uncovering 9410 -chews 9410 -appendixes 9410 -appendixes 9410 -appendixes 9410 -appendixes 9410 -appendixes 9410 -appendixes 9410 -raining 9410 -infest 9410 -compartment 9410 -minting 9410 -ducks 9410 -roped 9410 -waltz 9410 -Lillian 9410 -repressions 9410 -chillingly 9410 -noncritical 9410 -lithograph 9410 -spongers 9410 -parenthood 9410 -posed 9410 -instruments 9410 -filial 9410 -fixedly 9410 -relives 9410 -Pandora 9410 -watering 9410 -ungrateful 9410 -secures 9410 -poison 9410 -dusted 9410 -encompasses 9410 -presentation 9410 -Kantian 9410 -select fld3,period,price,price2 from t2,t3 where t2.fld1=t3.t2nr and period >= 1001 and period <= 1002 and t2.companynr = 37 order by fld3,period, price; -fld3 period price price2 -admonishing 1002 28357832 8723648 -analyzable 1002 28357832 8723648 -annihilates 1001 5987435 234724 -Antares 1002 28357832 8723648 -astound 1001 5987435 234724 -audiology 1001 5987435 234724 -Augustine 1002 28357832 8723648 -Baird 1002 28357832 8723648 -bewilderingly 1001 5987435 234724 -breaking 1001 5987435 234724 -Conley 1001 5987435 234724 -dentally 1002 28357832 8723648 -dissociate 1002 28357832 8723648 -elite 1001 5987435 234724 -eschew 1001 5987435 234724 -Eulerian 1001 5987435 234724 -flanking 1001 5987435 234724 -foldout 1002 28357832 8723648 -funereal 1002 28357832 8723648 -galling 1002 28357832 8723648 -Graves 1001 5987435 234724 -grazing 1001 5987435 234724 -groupings 1001 5987435 234724 -handgun 1001 5987435 234724 -humility 1002 28357832 8723648 -impulsive 1002 28357832 8723648 -inch 1001 5987435 234724 -intelligibility 1001 5987435 234724 -jarring 1001 5987435 234724 -lawgiver 1001 5987435 234724 -lectured 1002 28357832 8723648 -Merritt 1002 28357832 8723648 -neonatal 1001 5987435 234724 -offload 1002 28357832 8723648 -parters 1002 28357832 8723648 -pityingly 1002 28357832 8723648 -puddings 1002 28357832 8723648 -Punjab 1001 5987435 234724 -quitter 1002 28357832 8723648 -realtor 1001 5987435 234724 -relaxing 1001 5987435 234724 -repetitions 1001 5987435 234724 -resumes 1001 5987435 234724 -Romans 1002 28357832 8723648 -rusting 1001 5987435 234724 -scholastics 1001 5987435 234724 -skulking 1002 28357832 8723648 -stated 1002 28357832 8723648 -suites 1002 28357832 8723648 -sureties 1001 5987435 234724 -testicle 1002 28357832 8723648 -tinily 1002 28357832 8723648 -tragedies 1001 5987435 234724 -trimmings 1001 5987435 234724 -vacuuming 1001 5987435 234724 -ventilate 1001 5987435 234724 -wallet 1001 5987435 234724 -Weissmuller 1002 28357832 8723648 -Wotan 1002 28357832 8723648 -select t2.fld1,fld3,period,price,price2 from t2,t3 where t2.fld1>= 18201 and t2.fld1 <= 18811 and t2.fld1=t3.t2nr and period = 1001 and t2.companynr = 37; -fld1 fld3 period price price2 -018201 relaxing 1001 5987435 234724 -018601 vacuuming 1001 5987435 234724 -018801 inch 1001 5987435 234724 -018811 repetitions 1001 5987435 234724 -create table t4 ( -companynr tinyint(2) unsigned zerofill NOT NULL default '00', -companyname char(30) NOT NULL default '', -PRIMARY KEY (companynr), -UNIQUE KEY companyname(companyname) -) ENGINE=MyISAM MAX_ROWS=50 PACK_KEYS=1 COMMENT='companynames'; -select STRAIGHT_JOIN t2.companynr,companyname from t4,t2 where t2.companynr=t4.companynr group by t2.companynr; -companynr companyname -00 Unknown -29 company 1 -34 company 2 -36 company 3 -37 company 4 -40 company 5 -41 company 6 -50 company 11 -53 company 7 -58 company 8 -65 company 9 -68 company 10 -select SQL_SMALL_RESULT t2.companynr,companyname from t4,t2 where t2.companynr=t4.companynr group by t2.companynr; -companynr companyname -00 Unknown -29 company 1 -34 company 2 -36 company 3 -37 company 4 -40 company 5 -41 company 6 -50 company 11 -53 company 7 -58 company 8 -65 company 9 -68 company 10 -select * from t1,t1 t12; -Period Varor_period Period Varor_period -9410 9412 9410 9412 -select t2.fld1,t22.fld1 from t2,t2 t22 where t2.fld1 >= 250501 and t2.fld1 <= 250505 and t22.fld1 >= 250501 and t22.fld1 <= 250505; -fld1 fld1 -250501 250501 -250502 250501 -250503 250501 -250504 250501 -250505 250501 -250501 250502 -250502 250502 -250503 250502 -250504 250502 -250505 250502 -250501 250503 -250502 250503 -250503 250503 -250504 250503 -250505 250503 -250501 250504 -250502 250504 -250503 250504 -250504 250504 -250505 250504 -250501 250505 -250502 250505 -250503 250505 -250504 250505 -250505 250505 -insert into t2 (fld1, companynr) values (999999,99); -select t2.companynr,companyname from t2 left join t4 using (companynr) where t4.companynr is null; -companynr companyname -99 NULL -select count(*) from t2 left join t4 using (companynr) where t4.companynr is not null; -count(*) -1199 -explain select t2.companynr,companyname from t2 left join t4 using (companynr) where t4.companynr is null; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ALL NULL NULL NULL NULL 1200 -1 SIMPLE t4 eq_ref PRIMARY PRIMARY 1 test.t2.companynr 1 Using where; Not exists -explain select t2.companynr,companyname from t4 left join t2 using (companynr) where t2.companynr is null; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t4 ALL NULL NULL NULL NULL 12 -1 SIMPLE t2 ALL NULL NULL NULL NULL 1200 Using where; Not exists -delete from t2 where fld1=999999; -explain select t2.companynr,companyname from t4 left join t2 using (companynr) where t2.companynr > 0; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using where -1 SIMPLE t4 eq_ref PRIMARY PRIMARY 1 test.t2.companynr 1 -explain select t2.companynr,companyname from t4 left join t2 using (companynr) where t2.companynr > 0 or t2.companynr < 0; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using where -1 SIMPLE t4 eq_ref PRIMARY PRIMARY 1 test.t2.companynr 1 -explain select t2.companynr,companyname from t4 left join t2 using (companynr) where t2.companynr > 0 and t4.companynr > 0; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using where -1 SIMPLE t4 eq_ref PRIMARY PRIMARY 1 test.t2.companynr 1 Using where -explain select t2.companynr,companyname from t4 left join t2 using (companynr) where t2.companynr > 0 or t2.companynr is null; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t4 ALL NULL NULL NULL NULL 12 -1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using where -explain select t2.companynr,companyname from t4 left join t2 using (companynr) where t2.companynr > 0 or t2.companynr < 0 or t4.companynr > 0; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t4 ALL PRIMARY NULL NULL NULL 12 -1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using where -explain select t2.companynr,companyname from t4 left join t2 using (companynr) where ifnull(t2.companynr,1)>0; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t4 ALL NULL NULL NULL NULL 12 -1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using where -select distinct t2.companynr,t4.companynr from t2,t4 where t2.companynr=t4.companynr+1; -companynr companynr -37 36 -41 40 -explain select distinct t2.companynr,t4.companynr from t2,t4 where t2.companynr=t4.companynr+1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using temporary -1 SIMPLE t4 index NULL PRIMARY 1 NULL 12 Using where; Using index -select t2.fld1,t2.companynr,fld3,period from t3,t2 where t2.fld1 = 38208 and t2.fld1=t3.t2nr and period = 1008 or t2.fld1 = 38008 and t2.fld1 =t3.t2nr and period = 1008; -fld1 companynr fld3 period -038008 37 reporters 1008 -038208 37 Selfridge 1008 -select t2.fld1,t2.companynr,fld3,period from t3,t2 where (t2.fld1 = 38208 or t2.fld1 = 38008) and t2.fld1=t3.t2nr and period>=1008 and period<=1009; -fld1 companynr fld3 period -038008 37 reporters 1008 -038208 37 Selfridge 1008 -select t2.fld1,t2.companynr,fld3,period from t3,t2 where (t3.t2nr = 38208 or t3.t2nr = 38008) and t2.fld1=t3.t2nr and period>=1008 and period<=1009; -fld1 companynr fld3 period -038008 37 reporters 1008 -038208 37 Selfridge 1008 -select period from t1 where (((period > 0) or period < 10000 or (period = 1900)) and (period=1900 and period <= 1901) or (period=1903 and (period=1903)) and period>=1902) or ((period=1904 or period=1905) or (period=1906 or period>1907)) or (period=1908 and period = 1909); -period -9410 -select period from t1 where ((period > 0 and period < 1) or (((period > 0 and period < 100) and (period > 10)) or (period > 10)) or (period > 0 and (period > 5 or period > 6))); -period -9410 -select a.fld1 from t2 as a,t2 b where ((a.fld1 = 250501 and a.fld1=b.fld1) or a.fld1=250502 or a.fld1=250503 or (a.fld1=250505 and a.fld1<=b.fld1 and b.fld1>=a.fld1)) and a.fld1=b.fld1; -fld1 -250501 -250502 -250503 -250505 -select fld1 from t2 where fld1 in (250502,98005,98006,250503,250605,250606) and fld1 >=250502 and fld1 not in (250605,250606); -fld1 -250502 -250503 -select fld1 from t2 where fld1 between 250502 and 250504; -fld1 -250502 -250503 -250504 -select fld3 from t2 where (((fld3 like "_%L%" ) or (fld3 like "%ok%")) and ( fld3 like "L%" or fld3 like "G%")) and fld3 like "L%" ; -fld3 -label -labeled -labeled -landslide -laterally -leaflet -lewdly -Lillian -luckily -select count(*) from t1; -count(*) -1 -select companynr,count(*),sum(fld1) from t2 group by companynr; -companynr count(*) sum(fld1) -00 82 10355753 -29 95 14473298 -34 70 17788966 -36 215 22786296 -37 588 83602098 -40 37 6618386 -41 52 12816335 -50 11 1595438 -53 4 793210 -58 23 2254293 -65 10 2284055 -68 12 3097288 -select companynr,count(*) from t2 group by companynr order by companynr desc limit 5; -companynr count(*) -68 12 -65 10 -58 23 -53 4 -50 11 -select count(*),min(fld4),max(fld4),sum(fld1),avg(fld1),std(fld1),variance(fld1) from t2 where companynr = 34 and fld4<>""; -count(*) min(fld4) max(fld4) sum(fld1) avg(fld1) std(fld1) variance(fld1) -70 absentee vest 17788966 254128.0857 3272.5940 10709871.3069 -explain extended select count(*),min(fld4),max(fld4),sum(fld1),avg(fld1),std(fld1),variance(fld1) from t2 where companynr = 34 and fld4<>""; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using where -Warnings: -Note 1003 select count(0) AS `count(*)`,min(test.t2.fld4) AS `min(fld4)`,max(test.t2.fld4) AS `max(fld4)`,sum(test.t2.fld1) AS `sum(fld1)`,avg(test.t2.fld1) AS `avg(fld1)`,std(test.t2.fld1) AS `std(fld1)`,variance(test.t2.fld1) AS `variance(fld1)` from test.t2 where ((test.t2.companynr = 34) and (test.t2.fld4 <> _latin1'')) -select companynr,count(*),min(fld4),max(fld4),sum(fld1),avg(fld1),std(fld1),variance(fld1) from t2 group by companynr limit 3; -companynr count(*) min(fld4) max(fld4) sum(fld1) avg(fld1) std(fld1) variance(fld1) -00 82 Anthony windmills 10355753 126289.6707 115550.9757 13352027981.7087 -29 95 abut wetness 14473298 152350.5053 8368.5480 70032594.9026 -34 70 absentee vest 17788966 254128.0857 3272.5940 10709871.3069 -select companynr,t2nr,count(price),sum(price),min(price),max(price),avg(price) from t3 where companynr = 37 group by companynr,t2nr limit 10; -companynr t2nr count(price) sum(price) min(price) max(price) avg(price) -37 1 1 5987435 5987435 5987435 5987435.0000 -37 2 1 28357832 28357832 28357832 28357832.0000 -37 3 1 39654943 39654943 39654943 39654943.0000 -37 11 1 5987435 5987435 5987435 5987435.0000 -37 12 1 28357832 28357832 28357832 28357832.0000 -37 13 1 39654943 39654943 39654943 39654943.0000 -37 21 1 5987435 5987435 5987435 5987435.0000 -37 22 1 28357832 28357832 28357832 28357832.0000 -37 23 1 39654943 39654943 39654943 39654943.0000 -37 31 1 5987435 5987435 5987435 5987435.0000 -select /*! SQL_SMALL_RESULT */ companynr,t2nr,count(price),sum(price),min(price),max(price),avg(price) from t3 where companynr = 37 group by companynr,t2nr limit 10; -companynr t2nr count(price) sum(price) min(price) max(price) avg(price) -37 1 1 5987435 5987435 5987435 5987435.0000 -37 2 1 28357832 28357832 28357832 28357832.0000 -37 3 1 39654943 39654943 39654943 39654943.0000 -37 11 1 5987435 5987435 5987435 5987435.0000 -37 12 1 28357832 28357832 28357832 28357832.0000 -37 13 1 39654943 39654943 39654943 39654943.0000 -37 21 1 5987435 5987435 5987435 5987435.0000 -37 22 1 28357832 28357832 28357832 28357832.0000 -37 23 1 39654943 39654943 39654943 39654943.0000 -37 31 1 5987435 5987435 5987435 5987435.0000 -select companynr,count(price),sum(price),min(price),max(price),avg(price) from t3 group by companynr ; -companynr count(price) sum(price) min(price) max(price) avg(price) -37 12543 309394878010 5987435 39654943 24666736.6667 -78 8362 414611089292 726498 98439034 49582766.0000 -101 4181 3489454238 834598 834598 834598.0000 -154 4181 4112197254950 983543950 983543950 983543950.0000 -311 4181 979599938 234298 234298 234298.0000 -447 4181 9929180954 2374834 2374834 2374834.0000 -512 4181 3288532102 786542 786542 786542.0000 -select distinct mod(companynr,10) from t4 group by companynr; -mod(companynr,10) -0 -9 -4 -6 -7 -1 -3 -8 -5 -select distinct 1 from t4 group by companynr; -1 -1 -select count(distinct fld1) from t2; -count(distinct fld1) -1199 -select companynr,count(distinct fld1) from t2 group by companynr; -companynr count(distinct fld1) -00 82 -29 95 -34 70 -36 215 -37 588 -40 37 -41 52 -50 11 -53 4 -58 23 -65 10 -68 12 -select companynr,count(*) from t2 group by companynr; -companynr count(*) -00 82 -29 95 -34 70 -36 215 -37 588 -40 37 -41 52 -50 11 -53 4 -58 23 -65 10 -68 12 -select companynr,count(distinct concat(fld1,repeat(65,1000))) from t2 group by companynr; -companynr count(distinct concat(fld1,repeat(65,1000))) -00 82 -29 95 -34 70 -36 215 -37 588 -40 37 -41 52 -50 11 -53 4 -58 23 -65 10 -68 12 -select companynr,count(distinct concat(fld1,repeat(65,200))) from t2 group by companynr; -companynr count(distinct concat(fld1,repeat(65,200))) -00 82 -29 95 -34 70 -36 215 -37 588 -40 37 -41 52 -50 11 -53 4 -58 23 -65 10 -68 12 -select companynr,count(distinct floor(fld1/100)) from t2 group by companynr; -companynr count(distinct floor(fld1/100)) -00 47 -29 35 -34 14 -36 69 -37 108 -40 16 -41 11 -50 9 -53 1 -58 1 -65 1 -68 1 -select companynr,count(distinct concat(repeat(65,1000),floor(fld1/100))) from t2 group by companynr; -companynr count(distinct concat(repeat(65,1000),floor(fld1/100))) -00 47 -29 35 -34 14 -36 69 -37 108 -40 16 -41 11 -50 9 -53 1 -58 1 -65 1 -68 1 -select sum(fld1),fld3 from t2 where fld3="Romans" group by fld1 limit 10; -sum(fld1) fld3 -11402 Romans -select name,count(*) from t3 where name='cloakroom' group by name; -name count(*) -cloakroom 4181 -select name,count(*) from t3 where name='cloakroom' and price>10 group by name; -name count(*) -cloakroom 4181 -select count(*) from t3 where name='cloakroom' and price2=823742; -count(*) -4181 -select name,count(*) from t3 where name='cloakroom' and price2=823742 group by name; -name count(*) -cloakroom 4181 -select name,count(*) from t3 where name >= "extramarital" and price <= 39654943 group by name; -name count(*) -extramarital 4181 -gazer 4181 -gems 4181 -Iranizes 4181 -spates 4181 -tucked 4181 -violinist 4181 -select t2.fld3,count(*) from t2,t3 where t2.fld1=158402 and t3.name=t2.fld3 group by t3.name; -fld3 count(*) -spates 4181 -select companynr|0,companyname from t4 group by 1; -companynr|0 companyname -0 Unknown -29 company 1 -34 company 2 -36 company 3 -37 company 4 -40 company 5 -41 company 6 -50 company 11 -53 company 7 -58 company 8 -65 company 9 -68 company 10 -select t2.companynr,companyname,count(*) from t2,t4 where t2.companynr=t4.companynr group by t2.companynr order by companyname; -companynr companyname count(*) -29 company 1 95 -68 company 10 12 -50 company 11 11 -34 company 2 70 -36 company 3 215 -37 company 4 588 -40 company 5 37 -41 company 6 52 -53 company 7 4 -58 company 8 23 -65 company 9 10 -00 Unknown 82 -select t2.fld1,count(*) from t2,t3 where t2.fld1=158402 and t3.name=t2.fld3 group by t3.name; -fld1 count(*) -158402 4181 -select sum(Period)/count(*) from t1; -sum(Period)/count(*) -9410.00 -select companynr,count(price) as "count",sum(price) as "sum" ,abs(sum(price)/count(price)-avg(price)) as "diff",(0+count(price))*companynr as func from t3 group by companynr; -companynr count sum diff func -37 12543 309394878010 0.0000 464091 -78 8362 414611089292 0.0000 652236 -101 4181 3489454238 0.0000 422281 -154 4181 4112197254950 0.0000 643874 -311 4181 979599938 0.0000 1300291 -447 4181 9929180954 0.0000 1868907 -512 4181 3288532102 0.0000 2140672 -select companynr,sum(price)/count(price) as avg from t3 group by companynr having avg > 70000000 order by avg; -companynr avg -154 983543950.00 -select companynr,count(*) from t2 group by companynr order by 2 desc; -companynr count(*) -37 588 -36 215 -29 95 -00 82 -34 70 -41 52 -40 37 -58 23 -68 12 -50 11 -65 10 -53 4 -select companynr,count(*) from t2 where companynr > 40 group by companynr order by 2 desc; -companynr count(*) -41 52 -58 23 -68 12 -50 11 -65 10 -53 4 -select t2.fld4,t2.fld1,count(price),sum(price),min(price),max(price),avg(price) from t3,t2 where t3.companynr = 37 and t2.fld1 = t3.t2nr group by fld1,t2.fld4; -fld4 fld1 count(price) sum(price) min(price) max(price) avg(price) -teethe 000001 1 5987435 5987435 5987435 5987435.0000 -dreaded 011401 1 5987435 5987435 5987435 5987435.0000 -scholastics 011402 1 28357832 28357832 28357832 28357832.0000 -audiology 011403 1 39654943 39654943 39654943 39654943.0000 -wallet 011501 1 5987435 5987435 5987435 5987435.0000 -parters 011701 1 5987435 5987435 5987435 5987435.0000 -eschew 011702 1 28357832 28357832 28357832 28357832.0000 -quitter 011703 1 39654943 39654943 39654943 39654943.0000 -neat 012001 1 5987435 5987435 5987435 5987435.0000 -Steinberg 012003 1 39654943 39654943 39654943 39654943.0000 -balled 012301 1 5987435 5987435 5987435 5987435.0000 -persist 012302 1 28357832 28357832 28357832 28357832.0000 -attainments 012303 1 39654943 39654943 39654943 39654943.0000 -capably 012501 1 5987435 5987435 5987435 5987435.0000 -impulsive 012602 1 28357832 28357832 28357832 28357832.0000 -starlet 012603 1 39654943 39654943 39654943 39654943.0000 -featherweight 012701 1 5987435 5987435 5987435 5987435.0000 -pessimist 012702 1 28357832 28357832 28357832 28357832.0000 -daughter 012703 1 39654943 39654943 39654943 39654943.0000 -lawgiver 013601 1 5987435 5987435 5987435 5987435.0000 -stated 013602 1 28357832 28357832 28357832 28357832.0000 -readable 013603 1 39654943 39654943 39654943 39654943.0000 -testicle 013801 1 5987435 5987435 5987435 5987435.0000 -Parsifal 013802 1 28357832 28357832 28357832 28357832.0000 -leavings 013803 1 39654943 39654943 39654943 39654943.0000 -squeaking 013901 1 5987435 5987435 5987435 5987435.0000 -contrasted 016001 1 5987435 5987435 5987435 5987435.0000 -leftover 016201 1 5987435 5987435 5987435 5987435.0000 -whiteners 016202 1 28357832 28357832 28357832 28357832.0000 -erases 016301 1 5987435 5987435 5987435 5987435.0000 -Punjab 016302 1 28357832 28357832 28357832 28357832.0000 -Merritt 016303 1 39654943 39654943 39654943 39654943.0000 -sweetish 018001 1 5987435 5987435 5987435 5987435.0000 -dogging 018002 1 28357832 28357832 28357832 28357832.0000 -scornfully 018003 1 39654943 39654943 39654943 39654943.0000 -fetters 018012 1 28357832 28357832 28357832 28357832.0000 -bivalves 018013 1 39654943 39654943 39654943 39654943.0000 -skulking 018021 1 5987435 5987435 5987435 5987435.0000 -flint 018022 1 28357832 28357832 28357832 28357832.0000 -flopping 018023 1 39654943 39654943 39654943 39654943.0000 -Judas 018032 1 28357832 28357832 28357832 28357832.0000 -vacuuming 018033 1 39654943 39654943 39654943 39654943.0000 -medical 018041 1 5987435 5987435 5987435 5987435.0000 -bloodbath 018042 1 28357832 28357832 28357832 28357832.0000 -subschema 018043 1 39654943 39654943 39654943 39654943.0000 -interdependent 018051 1 5987435 5987435 5987435 5987435.0000 -Graves 018052 1 28357832 28357832 28357832 28357832.0000 -neonatal 018053 1 39654943 39654943 39654943 39654943.0000 -sorters 018061 1 5987435 5987435 5987435 5987435.0000 -epistle 018062 1 28357832 28357832 28357832 28357832.0000 -Conley 018101 1 5987435 5987435 5987435 5987435.0000 -lectured 018102 1 28357832 28357832 28357832 28357832.0000 -Abraham 018103 1 39654943 39654943 39654943 39654943.0000 -cage 018201 1 5987435 5987435 5987435 5987435.0000 -hushes 018202 1 28357832 28357832 28357832 28357832.0000 -Simla 018402 1 28357832 28357832 28357832 28357832.0000 -reporters 018403 1 39654943 39654943 39654943 39654943.0000 -coexist 018601 1 5987435 5987435 5987435 5987435.0000 -Beebe 018602 1 28357832 28357832 28357832 28357832.0000 -Taoism 018603 1 39654943 39654943 39654943 39654943.0000 -Connally 018801 1 5987435 5987435 5987435 5987435.0000 -fetched 018802 1 28357832 28357832 28357832 28357832.0000 -checkpoints 018803 1 39654943 39654943 39654943 39654943.0000 -gritty 018811 1 5987435 5987435 5987435 5987435.0000 -firearm 018812 1 28357832 28357832 28357832 28357832.0000 -minima 019101 1 5987435 5987435 5987435 5987435.0000 -Selfridge 019102 1 28357832 28357832 28357832 28357832.0000 -disable 019103 1 39654943 39654943 39654943 39654943.0000 -witchcraft 019201 1 5987435 5987435 5987435 5987435.0000 -betroth 030501 1 5987435 5987435 5987435 5987435.0000 -Manhattanize 030502 1 28357832 28357832 28357832 28357832.0000 -imprint 030503 1 39654943 39654943 39654943 39654943.0000 -swelling 031901 1 5987435 5987435 5987435 5987435.0000 -interrelationships 036001 1 5987435 5987435 5987435 5987435.0000 -riser 036002 1 28357832 28357832 28357832 28357832.0000 -bee 038001 1 5987435 5987435 5987435 5987435.0000 -kanji 038002 1 28357832 28357832 28357832 28357832.0000 -dental 038003 1 39654943 39654943 39654943 39654943.0000 -railway 038011 1 5987435 5987435 5987435 5987435.0000 -validate 038012 1 28357832 28357832 28357832 28357832.0000 -normalizes 038013 1 39654943 39654943 39654943 39654943.0000 -Kline 038101 1 5987435 5987435 5987435 5987435.0000 -Anatole 038102 1 28357832 28357832 28357832 28357832.0000 -partridges 038103 1 39654943 39654943 39654943 39654943.0000 -recruited 038201 1 5987435 5987435 5987435 5987435.0000 -dimensions 038202 1 28357832 28357832 28357832 28357832.0000 -Chicana 038203 1 39654943 39654943 39654943 39654943.0000 -select t3.companynr,fld3,sum(price) from t3,t2 where t2.fld1 = t3.t2nr and t3.companynr = 512 group by companynr,fld3; -companynr fld3 sum(price) -512 boat 786542 -512 capably 786542 -512 cupboard 786542 -512 decliner 786542 -512 descendants 786542 -512 dopers 786542 -512 erases 786542 -512 Micronesia 786542 -512 Miles 786542 -512 skies 786542 -select t2.companynr,count(*),min(fld3),max(fld3),sum(price),avg(price) from t2,t3 where t3.companynr >= 30 and t3.companynr <= 58 and t3.t2nr = t2.fld1 and 1+1=2 group by t2.companynr; -companynr count(*) min(fld3) max(fld3) sum(price) avg(price) -00 1 Omaha Omaha 5987435 5987435.0000 -36 1 dubbed dubbed 28357832 28357832.0000 -37 83 Abraham Wotan 1908978016 22999735.1325 -50 2 scribbled tapestry 68012775 34006387.5000 -select t3.companynr+0,t3.t2nr,fld3,sum(price) from t3,t2 where t2.fld1 = t3.t2nr and t3.companynr = 37 group by 1,t3.t2nr,fld3,fld3,fld3,fld3,fld3 order by fld1; -t3.companynr+0 t2nr fld3 sum(price) -37 1 Omaha 5987435 -37 11401 breaking 5987435 -37 11402 Romans 28357832 -37 11403 intercepted 39654943 -37 11501 bewilderingly 5987435 -37 11701 astound 5987435 -37 11702 admonishing 28357832 -37 11703 sumac 39654943 -37 12001 flanking 5987435 -37 12003 combed 39654943 -37 12301 Eulerian 5987435 -37 12302 dubbed 28357832 -37 12303 Kane 39654943 -37 12501 annihilates 5987435 -37 12602 Wotan 28357832 -37 12603 snatching 39654943 -37 12701 grazing 5987435 -37 12702 Baird 28357832 -37 12703 celery 39654943 -37 13601 handgun 5987435 -37 13602 foldout 28357832 -37 13603 mystic 39654943 -37 13801 intelligibility 5987435 -37 13802 Augustine 28357832 -37 13803 teethe 39654943 -37 13901 scholastics 5987435 -37 16001 audiology 5987435 -37 16201 wallet 5987435 -37 16202 parters 28357832 -37 16301 eschew 5987435 -37 16302 quitter 28357832 -37 16303 neat 39654943 -37 18001 jarring 5987435 -37 18002 tinily 28357832 -37 18003 balled 39654943 -37 18012 impulsive 28357832 -37 18013 starlet 39654943 -37 18021 lawgiver 5987435 -37 18022 stated 28357832 -37 18023 readable 39654943 -37 18032 testicle 28357832 -37 18033 Parsifal 39654943 -37 18041 Punjab 5987435 -37 18042 Merritt 28357832 -37 18043 Quixotism 39654943 -37 18051 sureties 5987435 -37 18052 puddings 28357832 -37 18053 tapestry 39654943 -37 18061 trimmings 5987435 -37 18062 humility 28357832 -37 18101 tragedies 5987435 -37 18102 skulking 28357832 -37 18103 flint 39654943 -37 18201 relaxing 5987435 -37 18202 offload 28357832 -37 18402 suites 28357832 -37 18403 lists 39654943 -37 18601 vacuuming 5987435 -37 18602 dentally 28357832 -37 18603 humanness 39654943 -37 18801 inch 5987435 -37 18802 Weissmuller 28357832 -37 18803 irresponsibly 39654943 -37 18811 repetitions 5987435 -37 18812 Antares 28357832 -37 19101 ventilate 5987435 -37 19102 pityingly 28357832 -37 19103 interdependent 39654943 -37 19201 Graves 5987435 -37 30501 neonatal 5987435 -37 30502 scribbled 28357832 -37 30503 chafe 39654943 -37 31901 realtor 5987435 -37 36001 elite 5987435 -37 36002 funereal 28357832 -37 38001 Conley 5987435 -37 38002 lectured 28357832 -37 38003 Abraham 39654943 -37 38011 groupings 5987435 -37 38012 dissociate 28357832 -37 38013 coexist 39654943 -37 38101 rusting 5987435 -37 38102 galling 28357832 -37 38103 obliterates 39654943 -37 38201 resumes 5987435 -37 38202 analyzable 28357832 -37 38203 terminator 39654943 -select sum(price) from t3,t2 where t2.fld1 = t3.t2nr and t3.companynr = 512 and t3.t2nr = 38008 and t2.fld1 = 38008 or t2.fld1= t3.t2nr and t3.t2nr = 38008 and t2.fld1 = 38008; -sum(price) -234298 -select t2.fld1,sum(price) from t3,t2 where t2.fld1 = t3.t2nr and t3.companynr = 512 and t3.t2nr = 38008 and t2.fld1 = 38008 or t2.fld1 = t3.t2nr and t3.t2nr = 38008 and t2.fld1 = 38008 or t3.t2nr = t2.fld1 and t2.fld1 = 38008 group by t2.fld1; -fld1 sum(price) -038008 234298 -explain select fld3 from t2 where 1>2 or 2>3; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE -explain select fld3 from t2 where fld1=fld1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 -select companynr,fld1 from t2 HAVING fld1=250501 or fld1=250502; -companynr fld1 -34 250501 -34 250502 -select companynr,fld1 from t2 WHERE fld1>=250501 HAVING fld1<=250502; -companynr fld1 -34 250501 -34 250502 -select companynr,count(*) as count,sum(fld1) as sum from t2 group by companynr having count > 40 and sum/count >= 120000; -companynr count sum -00 82 10355753 -29 95 14473298 -34 70 17788966 -37 588 83602098 -41 52 12816335 -select companynr from t2 group by companynr having count(*) > 40 and sum(fld1)/count(*) >= 120000 ; -companynr -00 -29 -34 -37 -41 -select t2.companynr,companyname,count(*) from t2,t4 where t2.companynr=t4.companynr group by companyname having t2.companynr >= 40; -companynr companyname count(*) -68 company 10 12 -50 company 11 11 -40 company 5 37 -41 company 6 52 -53 company 7 4 -58 company 8 23 -65 company 9 10 -select count(*) from t2; -count(*) -1199 -select count(*) from t2 where fld1 < 098024; -count(*) -387 -select min(fld1) from t2 where fld1>= 098024; -min(fld1) -98024 -select max(fld1) from t2 where fld1>= 098024; -max(fld1) -1232609 -select count(*) from t3 where price2=76234234; -count(*) -4181 -select count(*) from t3 where companynr=512 and price2=76234234; -count(*) -4181 -explain select min(fld1),max(fld1),count(*) from t2; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away -select min(fld1),max(fld1),count(*) from t2; -min(fld1) max(fld1) count(*) -0 1232609 1199 -select min(t2nr),max(t2nr) from t3 where t2nr=2115 and price2=823742; -min(t2nr) max(t2nr) -2115 2115 -select count(*),min(t2nr),max(t2nr) from t3 where name='spates' and companynr=78; -count(*) min(t2nr) max(t2nr) -4181 4 41804 -select t2nr,count(*) from t3 where name='gems' group by t2nr limit 20; -t2nr count(*) -9 1 -19 1 -29 1 -39 1 -49 1 -59 1 -69 1 -79 1 -89 1 -99 1 -109 1 -119 1 -129 1 -139 1 -149 1 -159 1 -169 1 -179 1 -189 1 -199 1 -select max(t2nr) from t3 where price=983543950; -max(t2nr) -41807 -select t1.period from t3 = t1 limit 1; -period -1001 -select t1.period from t1 as t1 limit 1; -period -9410 -select t1.period as "Nuvarande period" from t1 as t1 limit 1; -Nuvarande period -9410 -select period as ok_period from t1 limit 1; -ok_period -9410 -select period as ok_period from t1 group by ok_period limit 1; -ok_period -9410 -select 1+1 as summa from t1 group by summa limit 1; -summa -2 -select period as "Nuvarande period" from t1 group by "Nuvarande period" limit 1; -Nuvarande period -9410 -show tables; -Tables_in_test -t1 -t2 -t3 -t4 -show tables from test like "s%"; -Tables_in_test (s%) -show tables from test like "t?"; -Tables_in_test (t?) -show full columns from t2; -Field Type Collation Null Key Default Extra Privileges Comment -auto int(11) NULL PRI NULL auto_increment -fld1 int(6) unsigned zerofill NULL UNI 000000 -companynr tinyint(2) unsigned zerofill NULL 00 -fld3 char(30) latin1_swedish_ci MUL -fld4 char(35) latin1_swedish_ci -fld5 char(35) latin1_swedish_ci -fld6 char(4) latin1_swedish_ci -show full columns from t2 from test like 'f%'; -Field Type Collation Null Key Default Extra Privileges Comment -fld1 int(6) unsigned zerofill NULL UNI 000000 -fld3 char(30) latin1_swedish_ci MUL -fld4 char(35) latin1_swedish_ci -fld5 char(35) latin1_swedish_ci -fld6 char(4) latin1_swedish_ci -show full columns from t2 from test like 's%'; -Field Type Collation Null Key Default Extra Privileges Comment -show keys from t2; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t2 0 PRIMARY 1 auto A 1199 NULL NULL BTREE -t2 0 fld1 1 fld1 A 1199 NULL NULL BTREE -t2 1 fld3 1 fld3 A NULL NULL NULL BTREE -drop table t4, t3, t2, t1; -DO 1; -DO benchmark(100,1+1),1,1; -do default; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 -do foobar; -ERROR 42S22: Unknown column 'foobar' in 'field list' -CREATE TABLE t1 ( -id mediumint(8) unsigned NOT NULL auto_increment, -pseudo varchar(35) NOT NULL default '', -PRIMARY KEY (id), -UNIQUE KEY pseudo (pseudo) -); -INSERT INTO t1 (pseudo) VALUES ('test'); -INSERT INTO t1 (pseudo) VALUES ('test1'); -SELECT 1 as rnd1 from t1 where rand() > 2; -rnd1 -DROP TABLE t1; -CREATE TABLE t1 (gvid int(10) unsigned default NULL, hmid int(10) unsigned default NULL, volid int(10) unsigned default NULL, mmid int(10) unsigned default NULL, hdid int(10) unsigned default NULL, fsid int(10) unsigned default NULL, ctid int(10) unsigned default NULL, dtid int(10) unsigned default NULL, cost int(10) unsigned default NULL, performance int(10) unsigned default NULL, serialnumber bigint(20) unsigned default NULL, monitored tinyint(3) unsigned default '1', removed tinyint(3) unsigned default '0', target tinyint(3) unsigned default '0', dt_modified timestamp(14) NOT NULL, name varchar(255) binary default NULL, description varchar(255) default NULL, UNIQUE KEY hmid (hmid,volid)) ENGINE=MyISAM; -INSERT INTO t1 VALUES (200001,2,1,1,100,1,1,1,0,0,0,1,0,1,20020425060057,'\\\\ARKIVIO-TESTPDC\\E$',''),(200002,2,2,1,101,1,1,1,0,0,0,1,0,1,20020425060057,'\\\\ARKIVIO-TESTPDC\\C$',''),(200003,1,3,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,0,1,20020425060427,'c:',NULL); -CREATE TABLE t2 ( hmid int(10) unsigned default NULL, volid int(10) unsigned default NULL, sampletid smallint(5) unsigned default NULL, sampletime datetime default NULL, samplevalue bigint(20) unsigned default NULL, KEY idx1 (hmid,volid,sampletid,sampletime)) ENGINE=MyISAM; -INSERT INTO t2 VALUES (1,3,10,'2002-06-01 08:00:00',35),(1,3,1010,'2002-06-01 12:00:01',35); -SELECT a.gvid, (SUM(CASE b.sampletid WHEN 140 THEN b.samplevalue ELSE 0 END)) as the_success,(SUM(CASE b.sampletid WHEN 141 THEN b.samplevalue ELSE 0 END)) as the_fail,(SUM(CASE b.sampletid WHEN 142 THEN b.samplevalue ELSE 0 END)) as the_size,(SUM(CASE b.sampletid WHEN 143 THEN b.samplevalue ELSE 0 END)) as the_time FROM t1 a, t2 b WHERE a.hmid = b.hmid AND a.volid = b.volid AND b.sampletime >= 'wrong-date-value' AND b.sampletime < 'wrong-date-value' AND b.sampletid IN (140, 141, 142, 143) GROUP BY a.gvid; -gvid the_success the_fail the_size the_time -Warnings: -Warning 1292 Truncated incorrect datetime value: 'wrong-date-value' -Warning 1292 Truncated incorrect datetime value: 'wrong-date-value' -Warning 1292 Truncated incorrect datetime value: 'wrong-date-value' -Warning 1292 Truncated incorrect datetime value: 'wrong-date-value' -SELECT a.gvid, (SUM(CASE b.sampletid WHEN 140 THEN b.samplevalue ELSE 0 END)) as the_success,(SUM(CASE b.sampletid WHEN 141 THEN b.samplevalue ELSE 0 END)) as the_fail,(SUM(CASE b.sampletid WHEN 142 THEN b.samplevalue ELSE 0 END)) as the_size,(SUM(CASE b.sampletid WHEN 143 THEN b.samplevalue ELSE 0 END)) as the_time FROM t1 a, t2 b WHERE a.hmid = b.hmid AND a.volid = b.volid AND b.sampletime >= NULL AND b.sampletime < NULL AND b.sampletid IN (140, 141, 142, 143) GROUP BY a.gvid; -gvid the_success the_fail the_size the_time -DROP TABLE t1,t2; -create table t1 ( A_Id bigint(20) NOT NULL default '0', A_UpdateBy char(10) NOT NULL default '', A_UpdateDate bigint(20) NOT NULL default '0', A_UpdateSerial int(11) NOT NULL default '0', other_types bigint(20) NOT NULL default '0', wss_type bigint(20) NOT NULL default '0'); -INSERT INTO t1 VALUES (102935998719055004,'brade',1029359987,2,102935229116544068,102935229216544093); -select wss_type from t1 where wss_type ='102935229216544106'; -wss_type -select wss_type from t1 where wss_type ='102935229216544105'; -wss_type -select wss_type from t1 where wss_type ='102935229216544104'; -wss_type -select wss_type from t1 where wss_type ='102935229216544093'; -wss_type -102935229216544093 -select wss_type from t1 where wss_type =102935229216544093; -wss_type -102935229216544093 -drop table t1; -select 1+2,"aaaa",3.13*2.0 into @a,@b,@c; -select @a; -@a -3 -select @b; -@b -aaaa -select @c; -@c -6.26 -create table t1 (a int not null auto_increment primary key); -insert into t1 values (); -insert into t1 values (); -insert into t1 values (); -select * from (t1 as t2 left join t1 as t3 using (a)), t1; -a a a -1 1 1 -2 2 1 -3 3 1 -1 1 2 -2 2 2 -3 3 2 -1 1 3 -2 2 3 -3 3 3 -select * from t1, (t1 as t2 left join t1 as t3 using (a)); -a a a -1 1 1 -2 1 1 -3 1 1 -1 2 2 -2 2 2 -3 2 2 -1 3 3 -2 3 3 -3 3 3 -select * from (t1 as t2 left join t1 as t3 using (a)) straight_join t1; -a a a -1 1 1 -2 2 1 -3 3 1 -1 1 2 -2 2 2 -3 3 2 -1 1 3 -2 2 3 -3 3 3 -select * from t1 straight_join (t1 as t2 left join t1 as t3 using (a)); -a a a -1 1 1 -2 1 1 -3 1 1 -1 2 2 -2 2 2 -3 2 2 -1 3 3 -2 3 3 -3 3 3 -select * from (t1 as t2 left join t1 as t3 using (a)) inner join t1 on t1.a>1; -a a a -1 1 2 -1 1 3 -2 2 2 -2 2 3 -3 3 2 -3 3 3 -select * from t1 inner join (t1 as t2 left join t1 as t3 using (a)) on t1.a>1; -a a a -1 1 NULL -2 1 1 -3 1 1 -1 2 NULL -2 2 2 -3 2 2 -1 3 NULL -2 3 3 -3 3 3 -select * from (t1 as t2 left join t1 as t3 using (a)) inner join t1 using ( a ); -a a a -1 1 1 -2 2 2 -3 3 3 -select * from t1 inner join (t1 as t2 left join t1 as t3 using (a)) using ( a ); -a a a -1 1 1 -2 1 NULL -3 1 NULL -1 2 NULL -2 2 2 -3 2 NULL -1 3 NULL -2 3 NULL -3 3 3 -select * from (t1 as t2 left join t1 as t3 using (a)) left outer join t1 on t1.a>1; -a a a -1 1 2 -1 1 3 -2 2 2 -2 2 3 -3 3 2 -3 3 3 -select * from t1 left outer join (t1 as t2 left join t1 as t3 using (a)) on t1.a>1; -a a a -1 1 NULL -2 1 1 -3 1 1 -1 2 NULL -2 2 2 -3 2 2 -1 3 NULL -2 3 3 -3 3 3 -select * from (t1 as t2 left join t1 as t3 using (a)) left join t1 using ( a ); -a a a -1 1 1 -2 2 2 -3 3 3 -select * from t1 left join (t1 as t2 left join t1 as t3 using (a)) using ( a ); -a a a -1 1 1 -2 1 NULL -3 1 NULL -1 2 NULL -2 2 2 -3 2 NULL -1 3 NULL -2 3 NULL -3 3 3 -select * from (t1 as t2 left join t1 as t3 using (a)) natural left join t1; -a a a -1 1 1 -2 2 2 -3 3 3 -select * from t1 natural left join (t1 as t2 left join t1 as t3 using (a)); -a a a -1 1 1 -2 2 2 -3 3 3 -select * from (t1 as t2 left join t1 as t3 using (a)) right join t1 on t1.a>1; -a a a -1 NULL 1 -2 NULL 1 -3 NULL 1 -1 1 2 -2 2 2 -3 3 2 -1 1 3 -2 2 3 -3 3 3 -select * from t1 right join (t1 as t2 left join t1 as t3 using (a)) on t1.a>1; -a a a -2 1 1 -3 1 1 -2 2 2 -3 2 2 -2 3 3 -3 3 3 -select * from (t1 as t2 left join t1 as t3 using (a)) right outer join t1 using ( a ); -a a a -1 1 1 -2 NULL 1 -3 NULL 1 -1 NULL 2 -2 2 2 -3 NULL 2 -1 NULL 3 -2 NULL 3 -3 3 3 -select * from t1 right outer join (t1 as t2 left join t1 as t3 using (a)) using ( a ); -a a a -1 1 1 -2 2 2 -3 3 3 -select * from (t1 as t2 left join t1 as t3 using (a)) natural right join t1; -a a a -1 1 1 -2 NULL 1 -3 NULL 1 -1 NULL 2 -2 2 2 -3 NULL 2 -1 NULL 3 -2 NULL 3 -3 3 3 -select * from t1 natural right join (t1 as t2 left join t1 as t3 using (a)); -a a a -1 1 1 -2 2 2 -3 3 3 -select * from t1 natural join (t1 as t2 left join t1 as t3 using (a)); -a a -1 1 -2 2 -3 3 -select * from (t1 as t2 left join t1 as t3 using (a)) natural join t1; -a a a -1 1 1 -2 2 2 -3 3 3 -drop table t1; -CREATE TABLE t1 ( aa char(2), id int(11) NOT NULL auto_increment, t2_id int(11) NOT NULL default '0', PRIMARY KEY (id), KEY replace_id (t2_id)) ENGINE=MyISAM; -INSERT INTO t1 VALUES ("1",8264,2506),("2",8299,2517),("3",8301,2518),("4",8302,2519),("5",8303,2520),("6",8304,2521),("7",8305,2522); -CREATE TABLE t2 ( id int(11) NOT NULL auto_increment, PRIMARY KEY (id)) ENGINE=MyISAM; -INSERT INTO t2 VALUES (2517), (2518), (2519), (2520), (2521), (2522); -select * from t1, t2 WHERE t1.t2_id = t2.id and t1.t2_id > 0 order by t1.id LIMIT 0, 5; -aa id t2_id id -2 8299 2517 2517 -3 8301 2518 2518 -4 8302 2519 2519 -5 8303 2520 2520 -6 8304 2521 2521 -drop table t1,t2; -create table t1 (id1 int NOT NULL); -create table t2 (id2 int NOT NULL); -create table t3 (id3 int NOT NULL); -create table t4 (id4 int NOT NULL, id44 int NOT NULL, KEY (id4)); -insert into t1 values (1); -insert into t1 values (2); -insert into t2 values (1); -insert into t4 values (1,1); -explain select * from t1 left join t2 on id1 = id2 left join t3 on id1 = id3 -left join t4 on id3 = id4 where id2 = 1 or id4 = 1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t3 system NULL NULL NULL NULL 0 const row not found -1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL NULL NULL NULL NULL 1 -1 SIMPLE t4 ALL id4 NULL NULL NULL 1 Using where -select * from t1 left join t2 on id1 = id2 left join t3 on id1 = id3 -left join t4 on id3 = id4 where id2 = 1 or id4 = 1; -id1 id2 id3 id4 id44 -1 1 NULL NULL NULL -drop table t1,t2,t3,t4; -create table t1(s varchar(10) not null); -create table t2(s varchar(10) not null primary key); -create table t3(s varchar(10) not null primary key); -insert into t1 values ('one\t'), ('two\t'); -insert into t2 values ('one\r'), ('two\t'); -insert into t3 values ('one '), ('two\t'); -select * from t1 where s = 'one'; -s -select * from t2 where s = 'one'; -s -select * from t3 where s = 'one'; -s -one -select * from t1,t2 where t1.s = t2.s; -s s -two two -select * from t2,t3 where t2.s = t3.s; -s s -two two -drop table t1, t2, t3; -create table t1 (a integer, b integer, index(a), index(b)); -create table t2 (c integer, d integer, index(c), index(d)); -insert into t1 values (1,2), (2,2), (3,2), (4,2); -insert into t2 values (1,3), (2,3), (3,4), (4,4); -explain select * from t1 left join t2 on a=c where d in (4); -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ref c,d d 5 const 2 Using where -1 SIMPLE t1 ALL a NULL NULL NULL 3 Using where -select * from t1 left join t2 on a=c where d in (4); -a b c d -3 2 3 4 -4 2 4 4 -explain select * from t1 left join t2 on a=c where d = 4; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 ref c,d d 5 const 2 Using where -1 SIMPLE t1 ALL a NULL NULL NULL 3 Using where -select * from t1 left join t2 on a=c where d = 4; -a b c d -3 2 3 4 -4 2 4 4 -drop table t1, t2; -CREATE TABLE t1 ( -i int(11) NOT NULL default '0', -c char(10) NOT NULL default '', -PRIMARY KEY (i), -UNIQUE KEY c (c) -) ENGINE=MyISAM; -INSERT INTO t1 VALUES (1,'a'); -INSERT INTO t1 VALUES (2,'b'); -INSERT INTO t1 VALUES (3,'c'); -EXPLAIN SELECT i FROM t1 WHERE i=1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 Using index -DROP TABLE t1; diff --git a/mysql-test/r/type_blob.result b/mysql-test/r/type_blob.result index 8a0c74b3ae5..a25f8759a19 100644 --- a/mysql-test/r/type_blob.result +++ b/mysql-test/r/type_blob.result @@ -70,17 +70,17 @@ update t1 set c="",b=null where c="1"; lock tables t1 READ; show full fields from t1; Field Type Collation Null Key Default Extra Privileges Comment -t text latin1_swedish_ci YES NULL select,insert,update,references -c varchar(10) latin1_swedish_ci YES NULL select,insert,update,references -b blob NULL YES NULL select,insert,update,references -d varbinary(10) NULL YES NULL select,insert,update,references +t text latin1_swedish_ci YES NULL # +c varchar(10) latin1_swedish_ci YES NULL # +b blob NULL YES NULL # +d varbinary(10) NULL YES NULL # lock tables t1 WRITE; show full fields from t1; Field Type Collation Null Key Default Extra Privileges Comment -t text latin1_swedish_ci YES NULL select,insert,update,references -c varchar(10) latin1_swedish_ci YES NULL select,insert,update,references -b blob NULL YES NULL select,insert,update,references -d varbinary(10) NULL YES NULL select,insert,update,references +t text latin1_swedish_ci YES NULL # +c varchar(10) latin1_swedish_ci YES NULL # +b blob NULL YES NULL # +d varbinary(10) NULL YES NULL # unlock tables; select t from t1 where t like "hello"; t @@ -513,10 +513,10 @@ select if(imagem is null, "ERROR", "OK"),length(imagem) from t1 where id = 1; if(imagem is null, "ERROR", "OK") length(imagem) OK 581 drop table t1; -create table t1 select load_file('../../std_data/words.dat'); +create table t1 select load_file('../../std_data/words.dat') l; show full fields from t1; Field Type Collation Null Key Default Extra Privileges Comment -load_file('../../std_data/words.dat') longblob NULL YES NULL select,insert,update,references +l longblob NULL YES NULL # drop table t1; create table t1 (id integer primary key auto_increment, txt text not null, unique index txt_index (txt (20))); insert into t1 (txt) values ('Chevy'), ('Chevy '); diff --git a/mysql-test/r/type_blob.result.es b/mysql-test/r/type_blob.result.es deleted file mode 100644 index a510eee8f38..00000000000 --- a/mysql-test/r/type_blob.result.es +++ /dev/null @@ -1,692 +0,0 @@ -drop table if exists t1,t2,t3,t4,t5,t6,t7; -CREATE TABLE t1 (a blob, b text, c blob(250), d text(70000), e text(70000000)); -show columns from t1; -Field Type Null Key Default Extra -a blob YES NULL -b text YES NULL -c blob YES NULL -d mediumtext YES NULL -e longtext YES NULL -CREATE TABLE t2 (a char(257), b varbinary(70000), c varchar(70000000)); -Warnings: -Warning 1246 Converting column 'a' from CHAR to TEXT -Warning 1246 Converting column 'b' from CHAR to BLOB -Warning 1246 Converting column 'c' from CHAR to TEXT -show columns from t2; -Field Type Null Key Default Extra -a text YES NULL -b mediumblob YES NULL -c longtext YES NULL -create table t3 (a long, b long byte); -show create TABLE t3; -Table Create Table -t3 CREATE TABLE `t3` ( - `a` mediumtext, - `b` mediumblob -) ENGINE=MyISAM DEFAULT CHARSET=latin1 -drop table t1,t2,t3 -#; -CREATE TABLE t1 (a char(257) default "hello"); -ERROR 42000: Column length too big for column 'a' (max = 255); use BLOB instead -CREATE TABLE t2 (a blob default "hello"); -ERROR 42000: BLOB/TEXT column 'a' can't have a default value -drop table if exists t1,t2; -create table t1 (nr int(5) not null auto_increment,b blob,str char(10), primary key (nr)); -insert into t1 values (null,"a","A"); -insert into t1 values (null,"bbb","BBB"); -insert into t1 values (null,"ccc","CCC"); -select last_insert_id(); -last_insert_id() -3 -select * from t1,t1 as t2; -nr b str nr b str -1 a A 1 a A -2 bbb BBB 1 a A -3 ccc CCC 1 a A -1 a A 2 bbb BBB -2 bbb BBB 2 bbb BBB -3 ccc CCC 2 bbb BBB -1 a A 3 ccc CCC -2 bbb BBB 3 ccc CCC -3 ccc CCC 3 ccc CCC -drop table t1; -create table t1 (a text); -insert into t1 values ('where'); -update t1 set a='Where'; -select * from t1; -a -Where -drop table t1; -create table t1 (t text,c char(10),b blob, d binary(10)); -insert into t1 values (NULL,NULL,NULL,NULL); -insert into t1 values ("","","",""); -insert into t1 values ("hello","hello","hello","hello"); -insert into t1 values ("HELLO","HELLO","HELLO","HELLO"); -insert into t1 values ("HELLO MY","HELLO MY","HELLO MY","HELLO MY"); -insert into t1 values ("a","a","a","a"); -insert into t1 values (1,1,1,1); -insert into t1 values (NULL,NULL,NULL,NULL); -update t1 set c="",b=null where c="1"; -lock tables t1 READ; -show full fields from t1; -Field Type Collation Null Key Default Extra Privileges Comment -t text latin1_swedish_ci YES NULL -c varchar(10) latin1_swedish_ci YES NULL -b blob NULL YES NULL -d varbinary(10) NULL YES NULL -lock tables t1 WRITE; -show full fields from t1; -Field Type Collation Null Key Default Extra Privileges Comment -t text latin1_swedish_ci YES NULL -c varchar(10) latin1_swedish_ci YES NULL -b blob NULL YES NULL -d varbinary(10) NULL YES NULL -unlock tables; -select t from t1 where t like "hello"; -t -hello -HELLO -select c from t1 where c like "hello"; -c -hello -HELLO -select b from t1 where b like "hello"; -b -hello -select d from t1 where d like "hello"; -d -hello -select c from t1 having c like "hello"; -c -hello -HELLO -select d from t1 having d like "hello"; -d -hello -select t from t1 where t like "%HELLO%"; -t -hello -HELLO -HELLO MY -select c from t1 where c like "%HELLO%"; -c -hello -HELLO -HELLO MY -select b from t1 where b like "%HELLO%"; -b -HELLO -HELLO MY -select d from t1 where d like "%HELLO%"; -d -HELLO -HELLO MY -select c from t1 having c like "%HELLO%"; -c -hello -HELLO -HELLO MY -select d from t1 having d like "%HELLO%"; -d -HELLO -HELLO MY -select d from t1 having d like "%HE%LLO%"; -d -HELLO -HELLO MY -select t from t1 order by t; -t -NULL -NULL - -1 -a -hello -HELLO -HELLO MY -select c from t1 order by c; -c -NULL -NULL - - -a -hello -HELLO -HELLO MY -select b from t1 order by b; -b -NULL -NULL -NULL - -HELLO -HELLO MY -a -hello -select d from t1 order by d; -d -NULL -NULL - -1 -HELLO -HELLO MY -a -hello -select distinct t from t1; -t -NULL - -hello -HELLO MY -a -1 -select distinct b from t1; -b -NULL - -hello -HELLO -HELLO MY -a -select distinct t from t1 order by t; -t -NULL - -1 -a -hello -HELLO MY -select distinct b from t1 order by b; -b -NULL - -HELLO -HELLO MY -a -hello -select t from t1 group by t; -t -NULL - -1 -a -hello -HELLO MY -select b from t1 group by b; -b -NULL - -HELLO -HELLO MY -a -hello -set option sql_big_tables=1; -select distinct t from t1; -t -NULL - -hello -HELLO MY -a -1 -select distinct b from t1; -b -NULL - -hello -HELLO -HELLO MY -a -select distinct t from t1 order by t; -t -NULL - -1 -a -hello -HELLO MY -select distinct b from t1 order by b; -b -NULL - -HELLO -HELLO MY -a -hello -select distinct c from t1; -c -NULL - -hello -HELLO MY -a -select distinct d from t1; -d -NULL - -hello -HELLO -HELLO MY -a -1 -select distinct c from t1 order by c; -c -NULL - -a -hello -HELLO MY -select distinct d from t1 order by d; -d -NULL - -1 -HELLO -HELLO MY -a -hello -select c from t1 group by c; -c -NULL - -a -hello -HELLO MY -select d from t1 group by d; -d -NULL - -1 -HELLO -HELLO MY -a -hello -set option sql_big_tables=0; -select distinct * from t1; -t c b d -NULL NULL NULL NULL - -hello hello hello hello -HELLO HELLO HELLO HELLO -HELLO MY HELLO MY HELLO MY HELLO MY -a a a a -1 NULL 1 -select t,count(*) from t1 group by t; -t count(*) -NULL 2 - 1 -1 1 -a 1 -hello 2 -HELLO MY 1 -select b,count(*) from t1 group by b; -b count(*) -NULL 3 - 1 -HELLO 1 -HELLO MY 1 -a 1 -hello 1 -select c,count(*) from t1 group by c; -c count(*) -NULL 2 - 2 -a 1 -hello 2 -HELLO MY 1 -select d,count(*) from t1 group by d; -d count(*) -NULL 2 - 1 -1 1 -HELLO 1 -HELLO MY 1 -a 1 -hello 1 -drop table t1; -create table t1 (a text, unique (a(2100))); -ERROR 42000: Specified key was too long; max key length is 1000 bytes -create table t1 (a text, key (a(2100))); -Warnings: -Warning 1071 Specified key was too long; max key length is 1000 bytes -show create table t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `a` text, - KEY `a` (`a`(1000)) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 -drop table t1; -CREATE TABLE t1 ( -t1_id bigint(21) NOT NULL auto_increment, -_field_72 varchar(128) DEFAULT '' NOT NULL, -_field_95 varchar(32), -_field_115 tinyint(4) DEFAULT '0' NOT NULL, -_field_122 tinyint(4) DEFAULT '0' NOT NULL, -_field_126 tinyint(4), -_field_134 tinyint(4), -PRIMARY KEY (t1_id), -UNIQUE _field_72 (_field_72), -KEY _field_115 (_field_115), -KEY _field_122 (_field_122) -); -INSERT INTO t1 VALUES (1,'admin','21232f297a57a5a743894a0e4a801fc3',0,1,NULL,NULL); -INSERT INTO t1 VALUES (2,'hroberts','7415275a8c95952901e42b13a6b78566',0,1,NULL,NULL); -INSERT INTO t1 VALUES (3,'guest','d41d8cd98f00b204e9800998ecf8427e',1,0,NULL,NULL); -CREATE TABLE t2 ( -seq_0_id bigint(21) DEFAULT '0' NOT NULL, -seq_1_id bigint(21) DEFAULT '0' NOT NULL, -PRIMARY KEY (seq_0_id,seq_1_id) -); -INSERT INTO t2 VALUES (1,1); -INSERT INTO t2 VALUES (2,1); -INSERT INTO t2 VALUES (2,2); -CREATE TABLE t3 ( -t3_id bigint(21) NOT NULL auto_increment, -_field_131 varchar(128), -_field_133 tinyint(4) DEFAULT '0' NOT NULL, -_field_135 datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, -_field_137 tinyint(4), -_field_139 datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, -_field_140 blob, -_field_142 tinyint(4) DEFAULT '0' NOT NULL, -_field_145 tinyint(4) DEFAULT '0' NOT NULL, -_field_148 tinyint(4) DEFAULT '0' NOT NULL, -PRIMARY KEY (t3_id), -KEY _field_133 (_field_133), -KEY _field_135 (_field_135), -KEY _field_139 (_field_139), -KEY _field_142 (_field_142), -KEY _field_145 (_field_145), -KEY _field_148 (_field_148) -); -INSERT INTO t3 VALUES (1,'test job 1',0,'0000-00-00 00:00:00',0,'1999-02-25 22:43:32','test\r\njob\r\n1',0,0,0); -INSERT INTO t3 VALUES (2,'test job 2',0,'0000-00-00 00:00:00',0,'1999-02-26 21:08:04','',0,0,0); -CREATE TABLE t4 ( -seq_0_id bigint(21) DEFAULT '0' NOT NULL, -seq_1_id bigint(21) DEFAULT '0' NOT NULL, -PRIMARY KEY (seq_0_id,seq_1_id) -); -INSERT INTO t4 VALUES (1,1); -INSERT INTO t4 VALUES (2,1); -CREATE TABLE t5 ( -t5_id bigint(21) NOT NULL auto_increment, -_field_149 tinyint(4), -_field_156 varchar(128) DEFAULT '' NOT NULL, -_field_157 varchar(128) DEFAULT '' NOT NULL, -_field_158 varchar(128) DEFAULT '' NOT NULL, -_field_159 varchar(128) DEFAULT '' NOT NULL, -_field_160 varchar(128) DEFAULT '' NOT NULL, -_field_161 varchar(128) DEFAULT '' NOT NULL, -PRIMARY KEY (t5_id), -KEY _field_156 (_field_156), -KEY _field_157 (_field_157), -KEY _field_158 (_field_158), -KEY _field_159 (_field_159), -KEY _field_160 (_field_160), -KEY _field_161 (_field_161) -); -INSERT INTO t5 VALUES (1,0,'tomato','','','','',''); -INSERT INTO t5 VALUES (2,0,'cilantro','','','','',''); -CREATE TABLE t6 ( -seq_0_id bigint(21) DEFAULT '0' NOT NULL, -seq_1_id bigint(21) DEFAULT '0' NOT NULL, -PRIMARY KEY (seq_0_id,seq_1_id) -); -INSERT INTO t6 VALUES (1,1); -INSERT INTO t6 VALUES (1,2); -INSERT INTO t6 VALUES (2,2); -CREATE TABLE t7 ( -t7_id bigint(21) NOT NULL auto_increment, -_field_143 tinyint(4), -_field_165 varchar(32), -_field_166 smallint(6) DEFAULT '0' NOT NULL, -PRIMARY KEY (t7_id), -KEY _field_166 (_field_166) -); -INSERT INTO t7 VALUES (1,0,'High',1); -INSERT INTO t7 VALUES (2,0,'Medium',2); -INSERT INTO t7 VALUES (3,0,'Low',3); -select replace(t3._field_140, "\r","^M"),t3_id,min(t3._field_131), min(t3._field_135), min(t3._field_139), min(t3._field_137), min(link_alias_142._field_165), min(link_alias_133._field_72), min(t3._field_145), min(link_alias_148._field_156), replace(min(t3._field_140), "\r","^M"),t3.t3_id from t3 left join t4 on t4.seq_0_id = t3.t3_id left join t7 link_alias_142 on t4.seq_1_id = link_alias_142.t7_id left join t6 on t6.seq_0_id = t3.t3_id left join t1 link_alias_133 on t6.seq_1_id = link_alias_133.t1_id left join t2 on t2.seq_0_id = t3.t3_id left join t5 link_alias_148 on t2.seq_1_id = link_alias_148.t5_id where t3.t3_id in (1) group by t3.t3_id order by link_alias_142._field_166, _field_139, link_alias_133._field_72, _field_135, link_alias_148._field_156; -replace(t3._field_140, "\r","^M") t3_id min(t3._field_131) min(t3._field_135) min(t3._field_139) min(t3._field_137) min(link_alias_142._field_165) min(link_alias_133._field_72) min(t3._field_145) min(link_alias_148._field_156) replace(min(t3._field_140), "\r","^M") t3_id -test^M -job^M -1 1 test job 1 0000-00-00 00:00:00 1999-02-25 22:43:32 0 High admin 0 tomato test^M -job^M -1 1 -drop table t1,t2,t3,t4,t5,t6,t7; -create table t1 (a blob); -insert into t1 values ("empty"),(""); -select a,reverse(a) from t1; -a reverse(a) -empty ytpme - -drop table t1; -create table t1 (a blob, key (a(10))); -insert into t1 values ("bye"),("hello"),("hello"),("hello word"); -select * from t1 where a like "hello%"; -a -hello -hello -hello word -drop table t1; -CREATE TABLE t1 ( -f1 int(11) DEFAULT '0' NOT NULL, -f2 varchar(16) DEFAULT '' NOT NULL, -f5 text, -KEY index_name (f1,f2,f5(16)) -); -INSERT INTO t1 VALUES (0,'traktor','1111111111111'); -INSERT INTO t1 VALUES (1,'traktor','1111111111111111111111111'); -select count(*) from t1 where f2='traktor'; -count(*) -2 -drop table t1; -create table t1 (foobar tinyblob not null, boggle smallint not null, key (foobar(32), boggle)); -insert into t1 values ('fish', 10),('bear', 20); -select foobar, boggle from t1 where foobar = 'fish'; -foobar boggle -fish 10 -select foobar, boggle from t1 where foobar = 'fish' and boggle = 10; -foobar boggle -fish 10 -drop table t1; -create table t1 (id integer auto_increment unique,imagem LONGBLOB not null); -insert into t1 (id) values (1); -select -charset(load_file('../../std_data/words.dat')), -collation(load_file('../../std_data/words.dat')), -coercibility(load_file('../../std_data/words.dat')); -charset(load_file('../../std_data/words.dat')) collation(load_file('../../std_data/words.dat')) coercibility(load_file('../../std_data/words.dat')) -NULL NULL 3 -explain extended select -charset(load_file('../../std_data/words.dat')), -collation(load_file('../../std_data/words.dat')), -coercibility(load_file('../../std_data/words.dat')); -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used -Warnings: -Note 1003 select sql_no_cache charset(load_file(_latin1'../../std_data/words.dat')) AS `charset(load_file('../../std_data/words.dat'))`,collation(load_file(_latin1'../../std_data/words.dat')) AS `collation(load_file('../../std_data/words.dat'))`,coercibility(load_file(_latin1'../../std_data/words.dat')) AS `coercibility(load_file('../../std_data/words.dat'))` -update t1 set imagem=load_file('../../std_data/words.dat') where id=1; -Warnings: -Warning 1263 Data truncated; NULL supplied to NOT NULL column 'imagem' at row 1 -select if(imagem is null, "ERROR", "OK"),length(imagem) from t1 where id = 1; -if(imagem is null, "ERROR", "OK") length(imagem) -OK 0 -drop table t1; -create table t1 select load_file('../../std_data/words.dat'); -show full fields from t1; -Field Type Collation Null Key Default Extra Privileges Comment -load_file('../../std_data/words.dat') longblob NULL YES NULL -drop table t1; -create table t1 (id integer primary key auto_increment, txt text not null, unique index txt_index (txt (20))); -insert into t1 (txt) values ('Chevy'), ('Chevy '); -select * from t1 where txt='Chevy'; -id txt -1 Chevy -2 Chevy -select * from t1 where txt='Chevy '; -id txt -1 Chevy -2 Chevy -select * from t1 where txt='Chevy ' or txt='Chevy'; -id txt -1 Chevy -2 Chevy -select * from t1 where txt='Chevy' or txt='Chevy '; -id txt -1 Chevy -2 Chevy -select * from t1 where id='1' or id='2'; -id txt -1 Chevy -2 Chevy -insert into t1 (txt) values('Ford'); -select * from t1 where txt='Chevy' or txt='Chevy ' or txt='Ford'; -id txt -1 Chevy -2 Chevy -3 Ford -select * from t1 where txt='Chevy' or txt='Chevy '; -id txt -1 Chevy -2 Chevy -select * from t1 where txt='Chevy' or txt='Chevy ' or txt=' Chevy'; -id txt -1 Chevy -2 Chevy -select * from t1 where txt in ('Chevy ','Chevy'); -id txt -1 Chevy -2 Chevy -select * from t1 where txt in ('Chevy'); -id txt -1 Chevy -2 Chevy -select * from t1 where txt between 'Chevy' and 'Chevy'; -id txt -1 Chevy -2 Chevy -select * from t1 where txt between 'Chevy' and 'Chevy' or txt='Chevy '; -id txt -1 Chevy -2 Chevy -select * from t1 where txt between 'Chevy' and 'Chevy '; -id txt -1 Chevy -2 Chevy -select * from t1 where txt < 'Chevy '; -id txt -select * from t1 where txt <= 'Chevy'; -id txt -1 Chevy -2 Chevy -select * from t1 where txt > 'Chevy'; -id txt -3 Ford -select * from t1 where txt >= 'Chevy'; -id txt -1 Chevy -2 Chevy -3 Ford -drop table t1; -create table t1 (id integer primary key auto_increment, txt text, unique index txt_index (txt (20))); -insert into t1 (txt) values ('Chevy'), ('Chevy '), (NULL); -select * from t1 where txt='Chevy' or txt is NULL; -id txt -3 NULL -1 Chevy -2 Chevy -explain select * from t1 where txt='Chevy' or txt is NULL; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range txt_index txt_index 23 NULL 2 Using where -select * from t1 where txt='Chevy '; -id txt -1 Chevy -2 Chevy -select * from t1 where txt='Chevy ' or txt='Chevy'; -id txt -1 Chevy -2 Chevy -select * from t1 where txt='Chevy' or txt='Chevy '; -id txt -1 Chevy -2 Chevy -select * from t1 where id='1' or id='2'; -id txt -1 Chevy -2 Chevy -insert into t1 (txt) values('Ford'); -select * from t1 where txt='Chevy' or txt='Chevy ' or txt='Ford'; -id txt -1 Chevy -2 Chevy -4 Ford -select * from t1 where txt='Chevy' or txt='Chevy '; -id txt -1 Chevy -2 Chevy -select * from t1 where txt='Chevy' or txt='Chevy ' or txt=' Chevy'; -id txt -1 Chevy -2 Chevy -select * from t1 where txt in ('Chevy ','Chevy'); -id txt -1 Chevy -2 Chevy -select * from t1 where txt in ('Chevy'); -id txt -1 Chevy -2 Chevy -select * from t1 where txt between 'Chevy' and 'Chevy'; -id txt -1 Chevy -2 Chevy -select * from t1 where txt between 'Chevy' and 'Chevy' or txt='Chevy '; -id txt -1 Chevy -2 Chevy -select * from t1 where txt between 'Chevy' and 'Chevy '; -id txt -1 Chevy -2 Chevy -select * from t1 where txt < 'Chevy '; -id txt -select * from t1 where txt < 'Chevy ' or txt is NULL; -id txt -3 NULL -select * from t1 where txt <= 'Chevy'; -id txt -1 Chevy -2 Chevy -select * from t1 where txt > 'Chevy'; -id txt -4 Ford -select * from t1 where txt >= 'Chevy'; -id txt -1 Chevy -2 Chevy -4 Ford -alter table t1 modify column txt blob; -explain select * from t1 where txt='Chevy' or txt is NULL; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ref_or_null txt_index txt_index 23 const 2 Using where -select * from t1 where txt='Chevy' or txt is NULL; -id txt -1 Chevy -3 NULL -explain select * from t1 where txt='Chevy' or txt is NULL order by txt; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ref_or_null txt_index txt_index 23 const 2 Using where; Using filesort -select * from t1 where txt='Chevy' or txt is NULL order by txt; -id txt -3 NULL -1 Chevy -drop table t1; -CREATE TABLE t1 ( i int(11) NOT NULL default '0', c text NOT NULL, d varchar(1) NOT NULL DEFAULT ' ', PRIMARY KEY (i), KEY (c(1),d)); -INSERT t1 (i, c) VALUES (1,''),(2,''),(3,'asdfh'),(4,''); -select max(i) from t1 where c = ''; -max(i) -4 -drop table t1; diff --git a/mysql-test/r/type_float.result b/mysql-test/r/type_float.result index 1f5a34917d7..a6ca904db5f 100644 --- a/mysql-test/r/type_float.result +++ b/mysql-test/r/type_float.result @@ -11,8 +11,8 @@ SELECT 1e1,1.e1,1.0e1,1e+1,1.e+1,1.0e+1,1e-1,1.e-1,1.0e-1; create table t1 (f1 float(24),f2 float(52)); show full columns from t1; Field Type Collation Null Key Default Extra Privileges Comment -f1 float NULL YES NULL select,insert,update,references -f2 double NULL YES NULL select,insert,update,references +f1 float NULL YES NULL # +f2 double NULL YES NULL # insert into t1 values(10,10),(1e+5,1e+5),(1234567890,1234567890),(1e+10,1e+10),(1e+15,1e+15),(1e+20,1e+20),(1e+50,1e+50),(1e+150,1e+150); Warnings: Warning 1264 Data truncated; out of range for column 'f1' at row 7 @@ -97,18 +97,18 @@ drop table t1; create table t1 (f float, f2 float(24), f3 float(6,2), d double, d2 float(53), d3 double(10,3), de decimal, de2 decimal(6), de3 decimal(5,2), n numeric, n2 numeric(8), n3 numeric(5,6)); show full columns from t1; Field Type Collation Null Key Default Extra Privileges Comment -f float NULL YES NULL select,insert,update,references -f2 float NULL YES NULL select,insert,update,references -f3 float(6,2) NULL YES NULL select,insert,update,references -d double NULL YES NULL select,insert,update,references -d2 double NULL YES NULL select,insert,update,references -d3 double(10,3) NULL YES NULL select,insert,update,references -de decimal(10,0) NULL YES NULL select,insert,update,references -de2 decimal(6,0) NULL YES NULL select,insert,update,references -de3 decimal(5,2) NULL YES NULL select,insert,update,references -n decimal(10,0) NULL YES NULL select,insert,update,references -n2 decimal(8,0) NULL YES NULL select,insert,update,references -n3 decimal(7,6) NULL YES NULL select,insert,update,references +f float NULL YES NULL # +f2 float NULL YES NULL # +f3 float(6,2) NULL YES NULL # +d double NULL YES NULL # +d2 double NULL YES NULL # +d3 double(10,3) NULL YES NULL # +de decimal(10,0) NULL YES NULL # +de2 decimal(6,0) NULL YES NULL # +de3 decimal(5,2) NULL YES NULL # +n decimal(10,0) NULL YES NULL # +n2 decimal(8,0) NULL YES NULL # +n3 decimal(7,6) NULL YES NULL # drop table t1; create table t1 (a decimal(7,3) not null, key (a)); insert into t1 values ("0"),("-0.00"),("-0.01"),("-0.002"),("1"); diff --git a/mysql-test/r/type_float.result.es b/mysql-test/r/type_float.result.es deleted file mode 100644 index 5fcf9213f83..00000000000 --- a/mysql-test/r/type_float.result.es +++ /dev/null @@ -1,205 +0,0 @@ -drop table if exists t1; -SELECT 10,10.0,10.,.1e+2,100.0e-1; -10 10.0 10. .1e+2 100.0e-1 -10 10.0 10 10 10 -SELECT 6e-05, -6e-05, --6e-05, -6e-05+1.000000; -6e-05 -6e-05 --6e-05 -6e-05+1.000000 -6e-05 -6e-05 6e-05 0.99994 -SELECT 1e1,1.e1,1.0e1,1e+1,1.e+1,1.0e+1,1e-1,1.e-1,1.0e-1; -1e1 1.e1 1.0e1 1e+1 1.e+1 1.0e+1 1e-1 1.e-1 1.0e-1 -10 10 10 10 10 10 0.1 0.1 0.1 -create table t1 (f1 float(24),f2 float(52)); -show full columns from t1; -Field Type Collation Null Key Default Extra Privileges Comment -f1 float NULL YES NULL -f2 double NULL YES NULL -insert into t1 values(10,10),(1e+5,1e+5),(1234567890,1234567890),(1e+10,1e+10),(1e+15,1e+15),(1e+20,1e+20),(1e+50,1e+50),(1e+150,1e+150); -Warnings: -Warning 1264 Data truncated; out of range for column 'f1' at row 7 -Warning 1264 Data truncated; out of range for column 'f1' at row 8 -insert into t1 values(-10,-10),(1e-5,1e-5),(1e-10,1e-10),(1e-15,1e-15),(1e-20,1e-20),(1e-50,1e-50),(1e-150,1e-150); -select * from t1; -f1 f2 -10 10 -100000 100000 -1.23457e+9 1234567890 -1e+10 10000000000 -1e+15 1e+15 -1e+20 1e+20 -3.40282e+38 1e+50 -3.40282e+38 1e+150 --10 -10 -1e-5 1e-5 -1e-10 1e-10 -1e-15 1e-15 -1e-20 1e-20 -0 1e-50 -0 1e-150 -drop table t1; -create table t1 (datum double); -insert into t1 values (0.5),(1.0),(1.5),(2.0),(2.5); -select * from t1; -datum -0.5 -1 -1.5 -2 -2.5 -select * from t1 where datum < 1.5; -datum -0.5 -1 -select * from t1 where datum > 1.5; -datum -2 -2.5 -select * from t1 where datum = 1.5; -datum -1.5 -drop table t1; -create table t1 (a decimal(7,3) not null, key (a)); -insert into t1 values ("0"),("-0.00"),("-0.01"),("-0.002"),("1"); -select a from t1 order by a; -a --0.010 --0.002 --0.000 -0.000 -1.000 -select min(a) from t1; -min(a) --0.010 -drop table t1; -create table t1 (c1 double, c2 varchar(20)); -insert t1 values (121,"16"); -select c1 + c1 * (c2 / 100) as col from t1; -col -140.36 -create table t2 select c1 + c1 * (c2 / 100) as col1, round(c1, 5) as col2, round(c1, 35) as col3, sqrt(c1*1e-15) col4 from t1; -select * from t2; -col1 col2 col3 col4 -140.36 121.00000 121 3.47850542618522e-07 -show create table t2; -Table Create Table -t2 CREATE TABLE `t2` ( - `col1` double default NULL, - `col2` double(22,5) default NULL, - `col3` double default NULL, - `col4` double default NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 -drop table t1,t2; -create table t1 (a float); -insert into t1 values (1); -select max(a),min(a),avg(a) from t1; -max(a) min(a) avg(a) -1 1 1 -drop table t1; -create table t1 (f float, f2 float(24), f3 float(6,2), d double, d2 float(53), d3 double(10,3), de decimal, de2 decimal(6), de3 decimal(5,2), n numeric, n2 numeric(8), n3 numeric(5,6)); -show full columns from t1; -Field Type Collation Null Key Default Extra Privileges Comment -f float NULL YES NULL -f2 float NULL YES NULL -f3 float(6,2) NULL YES NULL -d double NULL YES NULL -d2 double NULL YES NULL -d3 double(10,3) NULL YES NULL -de decimal(10,0) NULL YES NULL -de2 decimal(6,0) NULL YES NULL -de3 decimal(5,2) NULL YES NULL -n decimal(10,0) NULL YES NULL -n2 decimal(8,0) NULL YES NULL -n3 decimal(7,6) NULL YES NULL -drop table t1; -create table t1 (a decimal(7,3) not null, key (a)); -insert into t1 values ("0"),("-0.00"),("-0.01"),("-0.002"),("1"); -select a from t1 order by a; -a --0.010 --0.002 --0.000 -0.000 -1.000 -select min(a) from t1; -min(a) --0.010 -drop table t1; -create table t1 (a float(200,100), b double(200,100)); -insert t1 values (1.0, 2.0); -select * from t1; -a b -1.000000000000000000000000000000 2.000000000000000000000000000000 -show create table t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `a` float(200,30) default NULL, - `b` double(200,30) default NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 -drop table t1; -create table t1 (c20 char); -insert into t1 values (5000.0); -Warnings: -Warning 1265 Data truncated for column 'c20' at row 1 -drop table t1; -create table t1 (f float(54)); -ERROR 42000: Incorrect column specifier for column 'f' -drop table if exists t1; -create table t1 (d1 double, d2 double unsigned); -insert into t1 set d1 = -1.0; -update t1 set d2 = d1; -Warnings: -Warning 1264 Data truncated; out of range for column 'd2' at row 1 -select * from t1; -d1 d2 --1 0 -drop table t1; -create table t1 (f float(4,3)); -insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11"); -Warnings: -Warning 1264 Data truncated; out of range for column 'f' at row 1 -Warning 1264 Data truncated; out of range for column 'f' at row 2 -Warning 1264 Data truncated; out of range for column 'f' at row 3 -Warning 1264 Data truncated; out of range for column 'f' at row 4 -Warning 1264 Data truncated; out of range for column 'f' at row 5 -Warning 1264 Data truncated; out of range for column 'f' at row 6 -select * from t1; -f --9.999 --9.999 --9.999 -9.999 -9.999 -9.999 -drop table if exists t1; -create table t1 (f double(4,3)); -insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11"); -Warnings: -Warning 1264 Data truncated; out of range for column 'f' at row 1 -Warning 1264 Data truncated; out of range for column 'f' at row 2 -Warning 1264 Data truncated; out of range for column 'f' at row 3 -Warning 1264 Data truncated; out of range for column 'f' at row 4 -Warning 1264 Data truncated; out of range for column 'f' at row 5 -Warning 1264 Data truncated; out of range for column 'f' at row 6 -select * from t1; -f --9.999 --9.999 --9.999 -9.999 -9.999 -9.999 -drop table if exists t1; -create table t1 (c char(20)); -insert into t1 values (5e-28); -select * from t1; -c -5e-28 -drop table t1; -create table t1 (c char(6)); -insert into t1 values (2e5),(2e6),(2e-4),(2e-5); -select * from t1; -c -200000 -2e+06 -0.0002 -2e-05 -drop table t1; diff --git a/mysql-test/r/type_ranges.result b/mysql-test/r/type_ranges.result index 5a65c90c5c7..90207f39417 100644 --- a/mysql-test/r/type_ranges.result +++ b/mysql-test/r/type_ranges.result @@ -40,30 +40,30 @@ KEY (options,flags) ); show full fields from t1; Field Type Collation Null Key Default Extra Privileges Comment -auto int(5) unsigned NULL PRI NULL auto_increment select,insert,update,references -string varchar(10) latin1_swedish_ci YES hello select,insert,update,references -tiny tinyint(4) NULL MUL 0 select,insert,update,references -short smallint(6) NULL MUL 1 select,insert,update,references -medium mediumint(8) NULL MUL 0 select,insert,update,references -long_int int(11) NULL 0 select,insert,update,references -longlong bigint(13) NULL MUL 0 select,insert,update,references -real_float float(13,1) NULL MUL 0.0 select,insert,update,references -real_double double(16,4) NULL YES NULL select,insert,update,references -utiny tinyint(3) unsigned NULL MUL 0 select,insert,update,references -ushort smallint(5) unsigned zerofill NULL MUL 00000 select,insert,update,references -umedium mediumint(8) unsigned NULL MUL 0 select,insert,update,references -ulong int(11) unsigned NULL MUL 0 select,insert,update,references -ulonglong bigint(13) unsigned NULL MUL 0 select,insert,update,references -time_stamp timestamp NULL YES CURRENT_TIMESTAMP select,insert,update,references -date_field date NULL YES NULL select,insert,update,references -time_field time NULL YES NULL select,insert,update,references -date_time datetime NULL YES NULL select,insert,update,references -blob_col blob NULL YES NULL select,insert,update,references -tinyblob_col tinyblob NULL YES NULL select,insert,update,references -mediumblob_col mediumblob NULL select,insert,update,references -longblob_col longblob NULL select,insert,update,references -options enum('one','two','tree') latin1_swedish_ci MUL one select,insert,update,references -flags set('one','two','tree') latin1_swedish_ci select,insert,update,references +auto int(5) unsigned NULL PRI NULL auto_increment # +string varchar(10) latin1_swedish_ci YES hello # +tiny tinyint(4) NULL MUL 0 # +short smallint(6) NULL MUL 1 # +medium mediumint(8) NULL MUL 0 # +long_int int(11) NULL 0 # +longlong bigint(13) NULL MUL 0 # +real_float float(13,1) NULL MUL 0.0 # +real_double double(16,4) NULL YES NULL # +utiny tinyint(3) unsigned NULL MUL 0 # +ushort smallint(5) unsigned zerofill NULL MUL 00000 # +umedium mediumint(8) unsigned NULL MUL 0 # +ulong int(11) unsigned NULL MUL 0 # +ulonglong bigint(13) unsigned NULL MUL 0 # +time_stamp timestamp NULL YES CURRENT_TIMESTAMP # +date_field date NULL YES NULL # +time_field time NULL YES NULL # +date_time datetime NULL YES NULL # +blob_col blob NULL YES NULL # +tinyblob_col tinyblob NULL YES NULL # +mediumblob_col mediumblob NULL # +longblob_col longblob NULL # +options enum('one','two','tree') latin1_swedish_ci MUL one # +flags set('one','two','tree') latin1_swedish_ci # show keys from t1; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment t1 0 PRIMARY 1 auto A 0 NULL NULL BTREE @@ -208,56 +208,56 @@ Warning 1265 Data truncated for column 'options' at row 6 update t2 set string="changed" where auto=16; show full columns from t1; Field Type Collation Null Key Default Extra Privileges Comment -auto int(5) unsigned NULL MUL NULL auto_increment select,insert,update,references -string varchar(10) latin1_swedish_ci YES new defaul select,insert,update,references -tiny tinyint(4) NULL MUL 0 select,insert,update,references -short smallint(6) NULL MUL 0 select,insert,update,references -medium mediumint(8) NULL MUL 0 select,insert,update,references -long_int int(11) NULL 0 select,insert,update,references -longlong bigint(13) NULL MUL 0 select,insert,update,references -real_float float(13,1) NULL MUL 0.0 select,insert,update,references -real_double double(16,4) NULL YES NULL select,insert,update,references -utiny tinyint(3) unsigned NULL 0 select,insert,update,references -ushort smallint(5) unsigned zerofill NULL 00000 select,insert,update,references -umedium mediumint(8) unsigned NULL MUL 0 select,insert,update,references -ulong int(11) unsigned NULL MUL 0 select,insert,update,references -ulonglong bigint(13) unsigned NULL MUL 0 select,insert,update,references -time_stamp timestamp NULL YES CURRENT_TIMESTAMP select,insert,update,references -date_field varchar(10) latin1_swedish_ci YES NULL select,insert,update,references -time_field time NULL YES NULL select,insert,update,references -date_time datetime NULL YES NULL select,insert,update,references -new_blob_col varchar(20) latin1_swedish_ci YES NULL select,insert,update,references -tinyblob_col tinyblob NULL YES NULL select,insert,update,references -mediumblob_col mediumblob NULL select,insert,update,references -options enum('one','two','tree') latin1_swedish_ci MUL one select,insert,update,references -flags set('one','two','tree') latin1_swedish_ci select,insert,update,references -new_field varchar(10) latin1_swedish_ci new select,insert,update,references +auto int(5) unsigned NULL MUL NULL auto_increment # +string varchar(10) latin1_swedish_ci YES new defaul # +tiny tinyint(4) NULL MUL 0 # +short smallint(6) NULL MUL 0 # +medium mediumint(8) NULL MUL 0 # +long_int int(11) NULL 0 # +longlong bigint(13) NULL MUL 0 # +real_float float(13,1) NULL MUL 0.0 # +real_double double(16,4) NULL YES NULL # +utiny tinyint(3) unsigned NULL 0 # +ushort smallint(5) unsigned zerofill NULL 00000 # +umedium mediumint(8) unsigned NULL MUL 0 # +ulong int(11) unsigned NULL MUL 0 # +ulonglong bigint(13) unsigned NULL MUL 0 # +time_stamp timestamp NULL YES CURRENT_TIMESTAMP # +date_field varchar(10) latin1_swedish_ci YES NULL # +time_field time NULL YES NULL # +date_time datetime NULL YES NULL # +new_blob_col varchar(20) latin1_swedish_ci YES NULL # +tinyblob_col tinyblob NULL YES NULL # +mediumblob_col mediumblob NULL # +options enum('one','two','tree') latin1_swedish_ci MUL one # +flags set('one','two','tree') latin1_swedish_ci # +new_field varchar(10) latin1_swedish_ci new # show full columns from t2; Field Type Collation Null Key Default Extra Privileges Comment -auto int(5) unsigned NULL 0 select,insert,update,references -string varchar(10) latin1_swedish_ci YES new defaul select,insert,update,references -tiny tinyint(4) NULL 0 select,insert,update,references -short smallint(6) NULL 0 select,insert,update,references -medium mediumint(8) NULL 0 select,insert,update,references -long_int int(11) NULL 0 select,insert,update,references -longlong bigint(13) NULL 0 select,insert,update,references -real_float float(13,1) NULL 0.0 select,insert,update,references -real_double double(16,4) NULL YES NULL select,insert,update,references -utiny tinyint(3) unsigned NULL 0 select,insert,update,references -ushort smallint(5) unsigned zerofill NULL 00000 select,insert,update,references -umedium mediumint(8) unsigned NULL 0 select,insert,update,references -ulong int(11) unsigned NULL 0 select,insert,update,references -ulonglong bigint(13) unsigned NULL 0 select,insert,update,references -time_stamp timestamp NULL YES 0000-00-00 00:00:00 select,insert,update,references -date_field varchar(10) latin1_swedish_ci YES NULL select,insert,update,references -time_field time NULL YES NULL select,insert,update,references -date_time datetime NULL YES NULL select,insert,update,references -new_blob_col varchar(20) latin1_swedish_ci YES NULL select,insert,update,references -tinyblob_col tinyblob NULL YES NULL select,insert,update,references -mediumblob_col mediumblob NULL select,insert,update,references -options enum('one','two','tree') latin1_swedish_ci one select,insert,update,references -flags set('one','two','tree') latin1_swedish_ci select,insert,update,references -new_field varchar(10) latin1_swedish_ci new select,insert,update,references +auto int(5) unsigned NULL 0 # +string varchar(10) latin1_swedish_ci YES new defaul # +tiny tinyint(4) NULL 0 # +short smallint(6) NULL 0 # +medium mediumint(8) NULL 0 # +long_int int(11) NULL 0 # +longlong bigint(13) NULL 0 # +real_float float(13,1) NULL 0.0 # +real_double double(16,4) NULL YES NULL # +utiny tinyint(3) unsigned NULL 0 # +ushort smallint(5) unsigned zerofill NULL 00000 # +umedium mediumint(8) unsigned NULL 0 # +ulong int(11) unsigned NULL 0 # +ulonglong bigint(13) unsigned NULL 0 # +time_stamp timestamp NULL YES 0000-00-00 00:00:00 # +date_field varchar(10) latin1_swedish_ci YES NULL # +time_field time NULL YES NULL # +date_time datetime NULL YES NULL # +new_blob_col varchar(20) latin1_swedish_ci YES NULL # +tinyblob_col tinyblob NULL YES NULL # +mediumblob_col mediumblob NULL # +options enum('one','two','tree') latin1_swedish_ci one # +flags set('one','two','tree') latin1_swedish_ci # +new_field varchar(10) latin1_swedish_ci new # select t1.auto,t2.auto from t1,t2 where t1.auto=t2.auto and ((t1.string<>t2.string and (t1.string is not null or t2.string is not null)) or (t1.tiny<>t2.tiny and (t1.tiny is not null or t2.tiny is not null)) or (t1.short<>t2.short and (t1.short is not null or t2.short is not null)) or (t1.medium<>t2.medium and (t1.medium is not null or t2.medium is not null)) or (t1.long_int<>t2.long_int and (t1.long_int is not null or t2.long_int is not null)) or (t1.longlong<>t2.longlong and (t1.longlong is not null or t2.longlong is not null)) or (t1.real_float<>t2.real_float and (t1.real_float is not null or t2.real_float is not null)) or (t1.real_double<>t2.real_double and (t1.real_double is not null or t2.real_double is not null)) or (t1.utiny<>t2.utiny and (t1.utiny is not null or t2.utiny is not null)) or (t1.ushort<>t2.ushort and (t1.ushort is not null or t2.ushort is not null)) or (t1.umedium<>t2.umedium and (t1.umedium is not null or t2.umedium is not null)) or (t1.ulong<>t2.ulong and (t1.ulong is not null or t2.ulong is not null)) or (t1.ulonglong<>t2.ulonglong and (t1.ulonglong is not null or t2.ulonglong is not null)) or (t1.time_stamp<>t2.time_stamp and (t1.time_stamp is not null or t2.time_stamp is not null)) or (t1.date_field<>t2.date_field and (t1.date_field is not null or t2.date_field is not null)) or (t1.time_field<>t2.time_field and (t1.time_field is not null or t2.time_field is not null)) or (t1.date_time<>t2.date_time and (t1.date_time is not null or t2.date_time is not null)) or (t1.new_blob_col<>t2.new_blob_col and (t1.new_blob_col is not null or t2.new_blob_col is not null)) or (t1.tinyblob_col<>t2.tinyblob_col and (t1.tinyblob_col is not null or t2.tinyblob_col is not null)) or (t1.mediumblob_col<>t2.mediumblob_col and (t1.mediumblob_col is not null or t2.mediumblob_col is not null)) or (t1.options<>t2.options and (t1.options is not null or t2.options is not null)) or (t1.flags<>t2.flags and (t1.flags is not null or t2.flags is not null)) or (t1.new_field<>t2.new_field and (t1.new_field is not null or t2.new_field is not null))); auto auto 16 16 @@ -268,11 +268,11 @@ drop table t2; create table t2 (primary key (auto)) select auto+1 as auto,1 as t1, "a" as t2, repeat("a",256) as t3, binary repeat("b",256) as t4 from t1; show full columns from t2; Field Type Collation Null Key Default Extra Privileges Comment -auto bigint(17) unsigned NULL PRI 0 select,insert,update,references -t1 bigint(1) NULL 0 select,insert,update,references -t2 char(1) latin1_swedish_ci select,insert,update,references -t3 longtext latin1_swedish_ci select,insert,update,references -t4 longblob NULL select,insert,update,references +auto bigint(17) unsigned NULL PRI 0 # +t1 bigint(1) NULL 0 # +t2 char(1) latin1_swedish_ci # +t3 longtext latin1_swedish_ci # +t4 longblob NULL # select * from t2; auto t1 t2 t3 t4 11 1 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb @@ -291,9 +291,9 @@ ERROR 42S21: Duplicate column name 'c' create table t3 select t1.c AS c1, t2.c AS c2,1 as "const" from t1, t2; show full columns from t3; Field Type Collation Null Key Default Extra Privileges Comment -c1 int(11) NULL YES NULL select,insert,update,references -c2 int(11) NULL YES NULL select,insert,update,references -const bigint(1) NULL 0 select,insert,update,references +c1 int(11) NULL YES NULL # +c2 int(11) NULL YES NULL # +const bigint(1) NULL 0 # drop table t1,t2,t3; create table t1 ( myfield INT NOT NULL, UNIQUE INDEX (myfield), unique (myfield), index(myfield)); drop table t1; diff --git a/mysql-test/r/type_ranges.result.es b/mysql-test/r/type_ranges.result.es deleted file mode 100644 index 548b00750ea..00000000000 --- a/mysql-test/r/type_ranges.result.es +++ /dev/null @@ -1,320 +0,0 @@ -drop table if exists t1,t2,t3; -SET SQL_WARNINGS=1; -CREATE TABLE t1 ( -auto int(5) unsigned NOT NULL auto_increment, -string char(10) default "hello", -tiny tinyint(4) DEFAULT '0' NOT NULL , -short smallint(6) DEFAULT '1' NOT NULL , -medium mediumint(8) DEFAULT '0' NOT NULL, -long_int int(11) DEFAULT '0' NOT NULL, -longlong bigint(13) DEFAULT '0' NOT NULL, -real_float float(13,1) DEFAULT 0.0 NOT NULL, -real_double double(16,4), -utiny tinyint(3) unsigned DEFAULT '0' NOT NULL, -ushort smallint(5) unsigned zerofill DEFAULT '00000' NOT NULL, -umedium mediumint(8) unsigned DEFAULT '0' NOT NULL, -ulong int(11) unsigned DEFAULT '0' NOT NULL, -ulonglong bigint(13) unsigned DEFAULT '0' NOT NULL, -time_stamp timestamp, -date_field date, -time_field time, -date_time datetime, -blob_col blob, -tinyblob_col tinyblob, -mediumblob_col mediumblob not null, -longblob_col longblob not null, -options enum('one','two','tree') not null, -flags set('one','two','tree') not null, -PRIMARY KEY (auto), -KEY (utiny), -KEY (tiny), -KEY (short), -KEY any_name (medium), -KEY (longlong), -KEY (real_float), -KEY (ushort), -KEY (umedium), -KEY (ulong), -KEY (ulonglong,ulong), -KEY (options,flags) -); -show full fields from t1; -Field Type Collation Null Key Default Extra Privileges Comment -auto int(5) unsigned NULL PRI NULL auto_increment -string varchar(10) latin1_swedish_ci YES hello -tiny tinyint(4) NULL MUL 0 -short smallint(6) NULL MUL 1 -medium mediumint(8) NULL MUL 0 -long_int int(11) NULL 0 -longlong bigint(13) NULL MUL 0 -real_float float(13,1) NULL MUL 0.0 -real_double double(16,4) NULL YES NULL -utiny tinyint(3) unsigned NULL MUL 0 -ushort smallint(5) unsigned zerofill NULL MUL 00000 -umedium mediumint(8) unsigned NULL MUL 0 -ulong int(11) unsigned NULL MUL 0 -ulonglong bigint(13) unsigned NULL MUL 0 -time_stamp timestamp NULL YES CURRENT_TIMESTAMP -date_field date NULL YES NULL -time_field time NULL YES NULL -date_time datetime NULL YES NULL -blob_col blob NULL YES NULL -tinyblob_col tinyblob NULL YES NULL -mediumblob_col mediumblob NULL -longblob_col longblob NULL -options enum('one','two','tree') latin1_swedish_ci MUL one -flags set('one','two','tree') latin1_swedish_ci -show keys from t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment -t1 0 PRIMARY 1 auto A 0 NULL NULL BTREE -t1 1 utiny 1 utiny A NULL NULL NULL BTREE -t1 1 tiny 1 tiny A NULL NULL NULL BTREE -t1 1 short 1 short A NULL NULL NULL BTREE -t1 1 any_name 1 medium A NULL NULL NULL BTREE -t1 1 longlong 1 longlong A NULL NULL NULL BTREE -t1 1 real_float 1 real_float A NULL NULL NULL BTREE -t1 1 ushort 1 ushort A NULL NULL NULL BTREE -t1 1 umedium 1 umedium A NULL NULL NULL BTREE -t1 1 ulong 1 ulong A NULL NULL NULL BTREE -t1 1 ulonglong 1 ulonglong A NULL NULL NULL BTREE -t1 1 ulonglong 2 ulong A NULL NULL NULL BTREE -t1 1 options 1 options A NULL NULL NULL BTREE -t1 1 options 2 flags A NULL NULL NULL BTREE -CREATE UNIQUE INDEX test on t1 ( auto ) ; -CREATE INDEX test2 on t1 ( ulonglong,ulong) ; -CREATE INDEX test3 on t1 ( medium ) ; -DROP INDEX test ON t1; -insert into t1 values (10, 1,1,1,1,1,1,1,1,1,1,1,1,1,NULL,0,0,0,1,1,1,1,'one','one'); -insert into t1 values (NULL,2,2,2,2,2,2,2,2,2,2,2,2,2,NULL,NULL,NULL,NULL,NULL,NULL,2,2,'two','two,one'); -insert into t1 values (0,1/3,3,3,3,3,3,3,3,3,3,3,3,3,NULL,'19970303','10:10:10','19970303101010','','','','3',3,3); -insert into t1 values (0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,NULL,19970807,080706,19970403090807,-1,-1,-1,'-1',-1,-1); -Warnings: -Warning 1264 Data truncated; out of range for column 'utiny' at row 1 -Warning 1264 Data truncated; out of range for column 'ushort' at row 1 -Warning 1264 Data truncated; out of range for column 'umedium' at row 1 -Warning 1264 Data truncated; out of range for column 'ulong' at row 1 -Warning 1265 Data truncated for column 'options' at row 1 -Warning 1265 Data truncated for column 'flags' at row 1 -insert into t1 values (0,-4294967295,-4294967295,-4294967295,-4294967295,-4294967295,-4294967295,-4294967295,-4294967295,-4294967295,-4294967295,-4294967295,-4294967295,-4294967295,NULL,0,0,0,-4294967295,-4294967295,-4294967295,'-4294967295',0,"one,two,tree"); -Warnings: -Warning 1265 Data truncated for column 'string' at row 1 -Warning 1264 Data truncated; out of range for column 'tiny' at row 1 -Warning 1264 Data truncated; out of range for column 'short' at row 1 -Warning 1264 Data truncated; out of range for column 'medium' at row 1 -Warning 1264 Data truncated; out of range for column 'long_int' at row 1 -Warning 1264 Data truncated; out of range for column 'utiny' at row 1 -Warning 1264 Data truncated; out of range for column 'ushort' at row 1 -Warning 1264 Data truncated; out of range for column 'umedium' at row 1 -Warning 1264 Data truncated; out of range for column 'ulong' at row 1 -Warning 1265 Data truncated for column 'options' at row 1 -insert into t1 values (0,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,NULL,0,0,0,4294967295,4294967295,4294967295,'4294967295',0,0); -Warnings: -Warning 1264 Data truncated; out of range for column 'tiny' at row 1 -Warning 1264 Data truncated; out of range for column 'short' at row 1 -Warning 1264 Data truncated; out of range for column 'medium' at row 1 -Warning 1264 Data truncated; out of range for column 'long_int' at row 1 -Warning 1264 Data truncated; out of range for column 'utiny' at row 1 -Warning 1264 Data truncated; out of range for column 'ushort' at row 1 -Warning 1264 Data truncated; out of range for column 'umedium' at row 1 -Warning 1265 Data truncated for column 'options' at row 1 -insert into t1 (tiny) values (1); -select auto,string,tiny,short,medium,long_int,longlong,real_float,real_double,utiny,ushort,umedium,ulong,ulonglong,mod(floor(time_stamp/1000000),1000000)-mod(curdate(),1000000),date_field,time_field,date_time,blob_col,tinyblob_col,mediumblob_col,longblob_col from t1; -auto string tiny short medium long_int longlong real_float real_double utiny ushort umedium ulong ulonglong mod(floor(time_stamp/1000000),1000000)-mod(curdate(),1000000) date_field time_field date_time blob_col tinyblob_col mediumblob_col longblob_col -10 1 1 1 1 1 1 1.0 1.0000 1 00001 1 1 1 0 0000-00-00 00:00:00 0000-00-00 00:00:00 1 1 1 1 -11 2 2 2 2 2 2 2.0 2.0000 2 00002 2 2 2 0 NULL NULL NULL NULL NULL 2 2 -12 0.33 3 3 3 3 3 3.0 3.0000 3 00003 3 3 3 0 1997-03-03 10:10:10 1997-03-03 10:10:10 3 -13 -1 -1 -1 -1 -1 -1 -1.0 -1.0000 0 00000 0 0 18446744073709551615 0 1997-08-07 08:07:06 1997-04-03 09:08:07 -1 -1 -1 -1 -14 -429496729 -128 -32768 -8388608 -2147483648 -4294967295 -4294967296.0 -4294967295.0000 0 00000 0 0 18446744069414584321 0 0000-00-00 00:00:00 0000-00-00 00:00:00 -4294967295 -4294967295 -4294967295 -4294967295 -15 4294967295 127 32767 8388607 2147483647 4294967295 4294967296.0 4294967295.0000 255 65535 16777215 4294967295 4294967295 0 0000-00-00 00:00:00 0000-00-00 00:00:00 4294967295 4294967295 4294967295 4294967295 -16 hello 1 1 0 0 0 0.0 NULL 0 00000 0 0 0 0 NULL NULL NULL NULL NULL -ALTER TABLE t1 -add new_field char(10) default "new" not null, -change blob_col new_blob_col varchar(20), -change date_field date_field char(10), -alter column string set default "new default", -alter short drop default, -DROP INDEX utiny, -DROP INDEX ushort, -DROP PRIMARY KEY, -DROP FOREIGN KEY any_name, -ADD INDEX (auto); -LOCK TABLES t1 WRITE; -ALTER TABLE t1 -RENAME as t2, -DROP longblob_col; -UNLOCK TABLES; -ALTER TABLE t2 rename as t3; -LOCK TABLES t3 WRITE ; -ALTER TABLE t3 rename as t1; -UNLOCK TABLES; -select auto,new_field,new_blob_col,date_field from t1 ; -auto new_field new_blob_col date_field -10 new 1 0000-00-00 -11 new NULL NULL -12 new 1997-03-03 -13 new -1 1997-08-07 -14 new -4294967295 0000-00-00 -15 new 4294967295 0000-00-00 -16 new NULL NULL -CREATE TABLE t2 ( -auto int(5) unsigned NOT NULL auto_increment, -string char(20), -mediumblob_col mediumblob not null, -new_field char(2), -PRIMARY KEY (auto) -); -INSERT INTO t2 (string,mediumblob_col,new_field) SELECT string,mediumblob_col,new_field from t1 where auto > 10; -Warnings: -Warning 1265 Data truncated for column 'new_field' at row 2 -Warning 1265 Data truncated for column 'new_field' at row 3 -Warning 1265 Data truncated for column 'new_field' at row 4 -Warning 1265 Data truncated for column 'new_field' at row 5 -Warning 1265 Data truncated for column 'new_field' at row 6 -Warning 1265 Data truncated for column 'new_field' at row 7 -select * from t2; -auto string mediumblob_col new_field -1 2 2 ne -2 0.33 ne -3 -1 -1 ne -4 -429496729 -4294967295 ne -5 4294967295 4294967295 ne -6 hello ne -select distinct flags from t1; -flags - -one,two,tree -one -one,two -select flags from t1 where find_in_set("two",flags)>0; -flags -one,two,tree -one,two,tree -one,two -one,two -select flags from t1 where find_in_set("unknown",flags)>0; -flags -select options,flags from t1 where options="ONE" and flags="ONE"; -options flags -one one -select options,flags from t1 where options="one" and flags="one"; -options flags -one one -drop table t2; -create table t2 select * from t1; -Warnings: -Warning 1265 Data truncated for column 'options' at row 4 -Warning 1265 Data truncated for column 'options' at row 5 -Warning 1265 Data truncated for column 'options' at row 6 -update t2 set string="changed" where auto=16; -show full columns from t1; -Field Type Collation Null Key Default Extra Privileges Comment -auto int(5) unsigned NULL MUL NULL auto_increment -string varchar(10) latin1_swedish_ci YES new defaul -tiny tinyint(4) NULL MUL 0 -short smallint(6) NULL MUL 0 -medium mediumint(8) NULL MUL 0 -long_int int(11) NULL 0 -longlong bigint(13) NULL MUL 0 -real_float float(13,1) NULL MUL 0.0 -real_double double(16,4) NULL YES NULL -utiny tinyint(3) unsigned NULL 0 -ushort smallint(5) unsigned zerofill NULL 00000 -umedium mediumint(8) unsigned NULL MUL 0 -ulong int(11) unsigned NULL MUL 0 -ulonglong bigint(13) unsigned NULL MUL 0 -time_stamp timestamp NULL YES CURRENT_TIMESTAMP -date_field varchar(10) latin1_swedish_ci YES NULL -time_field time NULL YES NULL -date_time datetime NULL YES NULL -new_blob_col varchar(20) latin1_swedish_ci YES NULL -tinyblob_col tinyblob NULL YES NULL -mediumblob_col mediumblob NULL -options enum('one','two','tree') latin1_swedish_ci MUL one -flags set('one','two','tree') latin1_swedish_ci -new_field varchar(10) latin1_swedish_ci new -show full columns from t2; -Field Type Collation Null Key Default Extra Privileges Comment -auto int(5) unsigned NULL 0 -string varchar(10) latin1_swedish_ci YES new defaul -tiny tinyint(4) NULL 0 -short smallint(6) NULL 0 -medium mediumint(8) NULL 0 -long_int int(11) NULL 0 -longlong bigint(13) NULL 0 -real_float float(13,1) NULL 0.0 -real_double double(16,4) NULL YES NULL -utiny tinyint(3) unsigned NULL 0 -ushort smallint(5) unsigned zerofill NULL 00000 -umedium mediumint(8) unsigned NULL 0 -ulong int(11) unsigned NULL 0 -ulonglong bigint(13) unsigned NULL 0 -time_stamp timestamp NULL YES 0000-00-00 00:00:00 -date_field varchar(10) latin1_swedish_ci YES NULL -time_field time NULL YES NULL -date_time datetime NULL YES NULL -new_blob_col varchar(20) latin1_swedish_ci YES NULL -tinyblob_col tinyblob NULL YES NULL -mediumblob_col mediumblob NULL -options enum('one','two','tree') latin1_swedish_ci one -flags set('one','two','tree') latin1_swedish_ci -new_field varchar(10) latin1_swedish_ci new -select t1.auto,t2.auto from t1,t2 where t1.auto=t2.auto and ((t1.string<>t2.string and (t1.string is not null or t2.string is not null)) or (t1.tiny<>t2.tiny and (t1.tiny is not null or t2.tiny is not null)) or (t1.short<>t2.short and (t1.short is not null or t2.short is not null)) or (t1.medium<>t2.medium and (t1.medium is not null or t2.medium is not null)) or (t1.long_int<>t2.long_int and (t1.long_int is not null or t2.long_int is not null)) or (t1.longlong<>t2.longlong and (t1.longlong is not null or t2.longlong is not null)) or (t1.real_float<>t2.real_float and (t1.real_float is not null or t2.real_float is not null)) or (t1.real_double<>t2.real_double and (t1.real_double is not null or t2.real_double is not null)) or (t1.utiny<>t2.utiny and (t1.utiny is not null or t2.utiny is not null)) or (t1.ushort<>t2.ushort and (t1.ushort is not null or t2.ushort is not null)) or (t1.umedium<>t2.umedium and (t1.umedium is not null or t2.umedium is not null)) or (t1.ulong<>t2.ulong and (t1.ulong is not null or t2.ulong is not null)) or (t1.ulonglong<>t2.ulonglong and (t1.ulonglong is not null or t2.ulonglong is not null)) or (t1.time_stamp<>t2.time_stamp and (t1.time_stamp is not null or t2.time_stamp is not null)) or (t1.date_field<>t2.date_field and (t1.date_field is not null or t2.date_field is not null)) or (t1.time_field<>t2.time_field and (t1.time_field is not null or t2.time_field is not null)) or (t1.date_time<>t2.date_time and (t1.date_time is not null or t2.date_time is not null)) or (t1.new_blob_col<>t2.new_blob_col and (t1.new_blob_col is not null or t2.new_blob_col is not null)) or (t1.tinyblob_col<>t2.tinyblob_col and (t1.tinyblob_col is not null or t2.tinyblob_col is not null)) or (t1.mediumblob_col<>t2.mediumblob_col and (t1.mediumblob_col is not null or t2.mediumblob_col is not null)) or (t1.options<>t2.options and (t1.options is not null or t2.options is not null)) or (t1.flags<>t2.flags and (t1.flags is not null or t2.flags is not null)) or (t1.new_field<>t2.new_field and (t1.new_field is not null or t2.new_field is not null))); -auto auto -16 16 -select t1.auto,t2.auto from t1,t2 where t1.auto=t2.auto and not (t1.string<=>t2.string and t1.tiny<=>t2.tiny and t1.short<=>t2.short and t1.medium<=>t2.medium and t1.long_int<=>t2.long_int and t1.longlong<=>t2.longlong and t1.real_float<=>t2.real_float and t1.real_double<=>t2.real_double and t1.utiny<=>t2.utiny and t1.ushort<=>t2.ushort and t1.umedium<=>t2.umedium and t1.ulong<=>t2.ulong and t1.ulonglong<=>t2.ulonglong and t1.time_stamp<=>t2.time_stamp and t1.date_field<=>t2.date_field and t1.time_field<=>t2.time_field and t1.date_time<=>t2.date_time and t1.new_blob_col<=>t2.new_blob_col and t1.tinyblob_col<=>t2.tinyblob_col and t1.mediumblob_col<=>t2.mediumblob_col and t1.options<=>t2.options and t1.flags<=>t2.flags and t1.new_field<=>t2.new_field); -auto auto -16 16 -drop table t2; -create table t2 (primary key (auto)) select auto+1 as auto,1 as t1, "a" as t2, repeat("a",256) as t3, binary repeat("b",256) as t4 from t1; -show full columns from t2; -Field Type Collation Null Key Default Extra Privileges Comment -auto bigint(17) unsigned NULL PRI 0 -t1 bigint(1) NULL 0 -t2 char(1) latin1_swedish_ci -t3 longtext latin1_swedish_ci -t4 longblob NULL -select * from t2; -auto t1 t2 t3 t4 -11 1 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -12 1 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -13 1 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -14 1 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -15 1 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -16 1 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -17 1 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -drop table t1,t2; -create table t1 (c int); -insert into t1 values(1),(2); -create table t2 select * from t1; -create table t3 select * from t1, t2; -ERROR 42S21: Duplicate column name 'c' -create table t3 select t1.c AS c1, t2.c AS c2,1 as "const" from t1, t2; -show full columns from t3; -Field Type Collation Null Key Default Extra Privileges Comment -c1 int(11) NULL YES NULL -c2 int(11) NULL YES NULL -const bigint(1) NULL 0 -drop table t1,t2,t3; -create table t1 ( myfield INT NOT NULL, UNIQUE INDEX (myfield), unique (myfield), index(myfield)); -drop table t1; -create table t1 ( id integer unsigned not null primary key ); -create table t2 ( id integer unsigned not null primary key ); -insert into t1 values (1), (2); -insert into t2 values (1); -select t1.id as id_A, t2.id as id_B from t1 left join t2 using ( id ); -id_A id_B -1 1 -2 NULL -create table t3 (id_A integer unsigned not null, id_B integer unsigned null ); -insert into t3 select t1.id as id_A, t2.id as id_B from t1 left join t2 using ( id ); -select * from t3; -id_A id_B -1 1 -2 NULL -drop table t3; -create table t3 select t1.id as id_A, t2.id as id_B from t1 left join t2 using ( id ); -select * from t3; -id_A id_B -1 1 -2 NULL -drop table t1,t2,t3; diff --git a/mysql-test/t/drop_temp_table.test b/mysql-test/t/drop_temp_table.test index dcd95721179..dbe7959acb2 100644 --- a/mysql-test/t/drop_temp_table.test +++ b/mysql-test/t/drop_temp_table.test @@ -1,3 +1,6 @@ +# Embedded server doesn't support binlog +-- source include/not_embedded.inc + connect (con1,localhost,root,,); connect (con2,localhost,root,,); connection con1; diff --git a/mysql-test/t/insert_select-binlog.test b/mysql-test/t/insert_select-binlog.test new file mode 100644 index 00000000000..9bb1ec274ef --- /dev/null +++ b/mysql-test/t/insert_select-binlog.test @@ -0,0 +1,34 @@ +# Embedded server doesn't support binlog +-- source include/not_embedded.inc + +# Check if a partly-completed INSERT SELECT in a MyISAM table goes into the +# binlog + +create table t1(a int, unique(a)); +insert into t1 values(2); +create table t2(a int); +insert into t2 values(1),(2); +reset master; +--error 1062 +insert into t1 select * from t2; +# The above should produce an error, but still be in the binlog; +# verify the binlog : +let $VERSION=`select version()`; +--replace_result $VERSION VERSION +show binlog events; +select * from t1; +drop table t1, t2; + +# Verify that a partly-completed CREATE TABLE .. SELECT does not +# get into the binlog (Bug #6682) +create table t1(a int); +insert into t1 values(1),(1); +reset master; +--error 1062 +create table t2(unique(a)) select a from t1; +# The above should produce an error, *and* not appear in the binlog +let $VERSION=`select version()`; +--replace_result $VERSION VERSION +show binlog events; +drop table t1; + diff --git a/mysql-test/t/insert_select.test b/mysql-test/t/insert_select.test index 39b8bfcaaaa..ecc83e3883b 100644 --- a/mysql-test/t/insert_select.test +++ b/mysql-test/t/insert_select.test @@ -71,37 +71,6 @@ WHERE numeropost=9 ORDER BY numreponse ASC; DROP TABLE t1,t2; -# Check if a partly-completed INSERT SELECT in a MyISAM table goes -# into the binlog - -create table t1(a int, unique(a)); -insert into t1 values(2); -create table t2(a int); -insert into t2 values(1),(2); -reset master; ---error 1062 -insert into t1 select * from t2; -# The above should produce an error, but still be in the binlog; -# verify the binlog : -let $VERSION=`select version()`; ---replace_result $VERSION VERSION -show binlog events; -select * from t1; -drop table t1, t2; - -# Verify that a partly-completed CREATE TABLE .. SELECT does not -# get into the binlog (Bug #6682) -create table t1(a int); -insert into t1 values(1),(1); -reset master; ---error 1062 -create table t2(unique(a)) select a from t1; -# The above should produce an error, *and* not appear in the binlog -let $VERSION=`select version()`; ---replace_result $VERSION VERSION -show binlog events; -drop table t1; - # # Test of insert ... select from same table # diff --git a/mysql-test/t/ps_1general.test b/mysql-test/t/ps_1general.test index 2d55d9d18b1..c487c095144 100644 --- a/mysql-test/t/ps_1general.test +++ b/mysql-test/t/ps_1general.test @@ -595,7 +595,8 @@ drop table t2; # cases derived from client_test.c: test_rename() prepare stmt1 from ' rename table t5 to t6, t7 to t8 ' ; create table t5 (a int) ; -# rename must fail, t7 does not exist +# rename must fail, t7 does not exist +# Clean up the filename here because embedded server reports whole path --replace_result \\ / $MYSQL_TEST_DIR . /var/master-data/ / --error 1017 execute stmt1 ; diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test index 9bbd26a9c1c..87d7e8f5785 100644 --- a/mysql-test/t/select.test +++ b/mysql-test/t/select.test @@ -1742,8 +1742,12 @@ select period as "Nuvarande period" from t1 group by "Nuvarande period" limit 1; show tables; show tables from test like "s%"; show tables from test like "t?"; +# We mask out the Privileges column because it differs with embedded server +--replace_column 8 # show full columns from t2; +--replace_column 8 # show full columns from t2 from test like 'f%'; +--replace_column 8 # show full columns from t2 from test like 's%'; show keys from t2; diff --git a/mysql-test/t/type_blob.test b/mysql-test/t/type_blob.test index f70193ddbe0..b081c27cb30 100644 --- a/mysql-test/t/type_blob.test +++ b/mysql-test/t/type_blob.test @@ -77,8 +77,11 @@ insert into t1 values (NULL,NULL,NULL,NULL); update t1 set c="",b=null where c="1"; lock tables t1 READ; +# We mask out the Privileges column because it differs for embedded server +--replace_column 8 # show full fields from t1; lock tables t1 WRITE; +--replace_column 8 # show full fields from t1; unlock tables; @@ -299,18 +302,25 @@ drop table t1; create table t1 (id integer auto_increment unique,imagem LONGBLOB not null); insert into t1 (id) values (1); -select - charset(load_file('../../std_data/words.dat')), - collation(load_file('../../std_data/words.dat')), - coercibility(load_file('../../std_data/words.dat')); -explain extended select - charset(load_file('../../std_data/words.dat')), - collation(load_file('../../std_data/words.dat')), - coercibility(load_file('../../std_data/words.dat')); -update t1 set imagem=load_file('../../std_data/words.dat') where id=1; +# We have to clean up the path in the results for safe comparison +--replace_result $MYSQL_TEST_DIR ../.. +eval select + charset(load_file('$MYSQL_TEST_DIR/std_data/words.dat')), + collation(load_file('$MYSQL_TEST_DIR/std_data/words.dat')), + coercibility(load_file('$MYSQL_TEST_DIR/std_data/words.dat')); +--replace_result $MYSQL_TEST_DIR ../.. +eval explain extended select + charset(load_file('$MYSQL_TEST_DIR/std_data/words.dat')), + collation(load_file('$MYSQL_TEST_DIR/std_data/words.dat')), + coercibility(load_file('$MYSQL_TEST_DIR/std_data/words.dat')); +--replace_result $MYSQL_TEST_DIR ../.. +eval update t1 set imagem=load_file('$MYSQL_TEST_DIR/std_data/words.dat') where id=1; select if(imagem is null, "ERROR", "OK"),length(imagem) from t1 where id = 1; drop table t1; -create table t1 select load_file('../../std_data/words.dat'); +--replace_result $MYSQL_TEST_DIR ../.. +eval create table t1 select load_file('$MYSQL_TEST_DIR/std_data/words.dat') l; +# We mask out the Privileges column because it differs for embedded server +--replace_column 8 # show full fields from t1; drop table t1; diff --git a/mysql-test/t/type_float.test b/mysql-test/t/type_float.test index 5b106d242de..e6e5cd743e4 100644 --- a/mysql-test/t/type_float.test +++ b/mysql-test/t/type_float.test @@ -13,6 +13,8 @@ SELECT 6e-05, -6e-05, --6e-05, -6e-05+1.000000; SELECT 1e1,1.e1,1.0e1,1e+1,1.e+1,1.0e+1,1e-1,1.e-1,1.0e-1; create table t1 (f1 float(24),f2 float(52)); +# We mask out Privileges column because it differs for embedded server +--replace_column 8 # show full columns from t1; insert into t1 values(10,10),(1e+5,1e+5),(1234567890,1234567890),(1e+10,1e+10),(1e+15,1e+15),(1e+20,1e+20),(1e+50,1e+50),(1e+150,1e+150); insert into t1 values(-10,-10),(1e-5,1e-5),(1e-10,1e-10),(1e-15,1e-15),(1e-20,1e-20),(1e-50,1e-50),(1e-150,1e-150); @@ -63,6 +65,8 @@ drop table t1; # create table t1 (f float, f2 float(24), f3 float(6,2), d double, d2 float(53), d3 double(10,3), de decimal, de2 decimal(6), de3 decimal(5,2), n numeric, n2 numeric(8), n3 numeric(5,6)); +# We mask out Privileges column because it differs for embedded server +--replace_column 8 # show full columns from t1; drop table t1; diff --git a/mysql-test/t/type_ranges.test b/mysql-test/t/type_ranges.test index 572dc0af313..fb089cfd3df 100644 --- a/mysql-test/t/type_ranges.test +++ b/mysql-test/t/type_ranges.test @@ -46,6 +46,8 @@ CREATE TABLE t1 ( KEY (options,flags) ); +# We mask out the Privileges column because it differs with embedded server +--replace_column 8 # show full fields from t1; show keys from t1; @@ -120,7 +122,10 @@ drop table t2; create table t2 select * from t1; update t2 set string="changed" where auto=16; +# We mask out the Privileges column because it differs with embedded server +--replace_column 8 # show full columns from t1; +--replace_column 8 # show full columns from t2; select t1.auto,t2.auto from t1,t2 where t1.auto=t2.auto and ((t1.string<>t2.string and (t1.string is not null or t2.string is not null)) or (t1.tiny<>t2.tiny and (t1.tiny is not null or t2.tiny is not null)) or (t1.short<>t2.short and (t1.short is not null or t2.short is not null)) or (t1.medium<>t2.medium and (t1.medium is not null or t2.medium is not null)) or (t1.long_int<>t2.long_int and (t1.long_int is not null or t2.long_int is not null)) or (t1.longlong<>t2.longlong and (t1.longlong is not null or t2.longlong is not null)) or (t1.real_float<>t2.real_float and (t1.real_float is not null or t2.real_float is not null)) or (t1.real_double<>t2.real_double and (t1.real_double is not null or t2.real_double is not null)) or (t1.utiny<>t2.utiny and (t1.utiny is not null or t2.utiny is not null)) or (t1.ushort<>t2.ushort and (t1.ushort is not null or t2.ushort is not null)) or (t1.umedium<>t2.umedium and (t1.umedium is not null or t2.umedium is not null)) or (t1.ulong<>t2.ulong and (t1.ulong is not null or t2.ulong is not null)) or (t1.ulonglong<>t2.ulonglong and (t1.ulonglong is not null or t2.ulonglong is not null)) or (t1.time_stamp<>t2.time_stamp and (t1.time_stamp is not null or t2.time_stamp is not null)) or (t1.date_field<>t2.date_field and (t1.date_field is not null or t2.date_field is not null)) or (t1.time_field<>t2.time_field and (t1.time_field is not null or t2.time_field is not null)) or (t1.date_time<>t2.date_time and (t1.date_time is not null or t2.date_time is not null)) or (t1.new_blob_col<>t2.new_blob_col and (t1.new_blob_col is not null or t2.new_blob_col is not null)) or (t1.tinyblob_col<>t2.tinyblob_col and (t1.tinyblob_col is not null or t2.tinyblob_col is not null)) or (t1.mediumblob_col<>t2.mediumblob_col and (t1.mediumblob_col is not null or t2.mediumblob_col is not null)) or (t1.options<>t2.options and (t1.options is not null or t2.options is not null)) or (t1.flags<>t2.flags and (t1.flags is not null or t2.flags is not null)) or (t1.new_field<>t2.new_field and (t1.new_field is not null or t2.new_field is not null))); select t1.auto,t2.auto from t1,t2 where t1.auto=t2.auto and not (t1.string<=>t2.string and t1.tiny<=>t2.tiny and t1.short<=>t2.short and t1.medium<=>t2.medium and t1.long_int<=>t2.long_int and t1.longlong<=>t2.longlong and t1.real_float<=>t2.real_float and t1.real_double<=>t2.real_double and t1.utiny<=>t2.utiny and t1.ushort<=>t2.ushort and t1.umedium<=>t2.umedium and t1.ulong<=>t2.ulong and t1.ulonglong<=>t2.ulonglong and t1.time_stamp<=>t2.time_stamp and t1.date_field<=>t2.date_field and t1.time_field<=>t2.time_field and t1.date_time<=>t2.date_time and t1.new_blob_col<=>t2.new_blob_col and t1.tinyblob_col<=>t2.tinyblob_col and t1.mediumblob_col<=>t2.mediumblob_col and t1.options<=>t2.options and t1.flags<=>t2.flags and t1.new_field<=>t2.new_field); @@ -128,6 +133,8 @@ select t1.auto,t2.auto from t1,t2 where t1.auto=t2.auto and not (t1.string<=>t2. drop table t2; create table t2 (primary key (auto)) select auto+1 as auto,1 as t1, "a" as t2, repeat("a",256) as t3, binary repeat("b",256) as t4 from t1; +# We mask out the Privileges column because it differs with embedded server +--replace_column 8 # show full columns from t2; select * from t2; drop table t1,t2; @@ -138,6 +145,8 @@ create table t2 select * from t1; --error 1060 create table t3 select * from t1, t2; # Should give an error create table t3 select t1.c AS c1, t2.c AS c2,1 as "const" from t1, t2; +# We mask out the Privileges column because it differs with embedded server +--replace_column 8 # show full columns from t3; drop table t1,t2,t3; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a4dea2ba5f4..662e019a525 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4482,7 +4482,7 @@ remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value) (thd->options & OPTION_AUTO_IS_NULL) && thd->insert_id()) { -#ifndef EMBEDDED_LIBRARY +#ifdef HAVE_QUERY_CACHE query_cache_abort(&thd->net); #endif COND *new_cond; From 1f38b5bdd1fd36e650f24be0ddcc2f8315853fb5 Mon Sep 17 00:00:00 2001 From: "gluh@eagle.intranet.mysql.r18.ru" <> Date: Thu, 31 Mar 2005 13:44:42 +0500 Subject: [PATCH 017/204] Fix for bug #9344 INFORMATION_SCHEMA, wrong content, numeric columns The columns CHARACTER_MAXIMUM_LENGTH and CHARACTER_OCTET_LENGTH of INFORMATION_SCHEMA.COLUMNS must be NULL for numeric columns --- BitKeeper/etc/logging_ok | 1 + mysql-test/r/information_schema.result | 42 ++++++++++++++++++++------ mysql-test/t/information_schema.test | 18 +++++++++++ sql/sql_show.cc | 30 +++++++++++++----- 4 files changed, 73 insertions(+), 18 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 22808697471..a59fc1338da 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -56,6 +56,7 @@ georg@beethoven.local georg@beethoven.site georg@lmy002.wdf.sap.corp gerberb@ou800.zenez.com +gluh@eagle.intranet.mysql.r18.ru gluh@gluh.(none) gluh@gluh.mysql.r18.ru gordon@zero.local.lan diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result index 03c2cd8817c..55a299e335f 100644 --- a/mysql-test/r/information_schema.result +++ b/mysql-test/r/information_schema.result @@ -133,7 +133,7 @@ c varchar(64) utf8_general_ci NO select,insert,update,references select * from information_schema.COLUMNS where table_name="t1" and column_name= "a"; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT -NULL testtets t1 a 1 NULL YES int 11 11 11 0 NULL NULL int(11) select,insert,update,references +NULL testtets t1 a 1 NULL YES int NULL NULL 11 0 NULL NULL int(11) select,insert,update,references show columns from testtets.t1 where field like "%a%"; Field Type Null Key Default Extra a int(11) YES NULL @@ -476,15 +476,15 @@ select COLUMN_NAME,COLUMN_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE from information_schema.columns where table_name= 't1'; COLUMN_NAME COLUMN_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE -a decimal(5,3) 7 7 5 3 -b decimal(5,1) 7 7 5 1 -c float(5,2) 5 5 5 2 -d decimal(6,4) 8 8 6 4 -e float 12 12 12 NULL -f decimal(6,3) 8 8 6 3 -g int(11) 11 11 11 0 -h double(10,3) 10 10 10 3 -i double 22 22 22 NULL +a decimal(5,3) NULL NULL 5 3 +b decimal(5,1) NULL NULL 5 1 +c float(5,2) NULL NULL 5 2 +d decimal(6,4) NULL NULL 6 4 +e float NULL NULL 12 NULL +f decimal(6,3) NULL NULL 6 3 +g int(11) NULL NULL 11 0 +h double(10,3) NULL NULL 10 3 +i double NULL NULL 22 NULL drop table t1; create table t115 as select table_name, column_name, column_type from information_schema.columns where table_name = 'proc'; @@ -678,3 +678,25 @@ WHERE A.TABLE_SCHEMA = B.TABLE_SCHEMA AND A.TABLE_NAME = B.TABLE_NAME); COUNT(*) 0 +create table t1 +( x_bigint BIGINT, +x_integer INTEGER, +x_smallint SMALLINT, +x_decimal DECIMAL(5,3), +x_numeric NUMERIC(5,3), +x_real REAL, +x_float FLOAT, +x_double_precision DOUBLE PRECISION ); +SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH +FROM INFORMATION_SCHEMA.COLUMNS +WHERE TABLE_NAME= 't1'; +COLUMN_NAME CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH +x_bigint NULL NULL +x_integer NULL NULL +x_smallint NULL NULL +x_decimal NULL NULL +x_numeric NULL NULL +x_real NULL NULL +x_float NULL NULL +x_double_precision NULL NULL +drop table t1; diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test index f4d47fa68aa..1a9849869d9 100644 --- a/mysql-test/t/information_schema.test +++ b/mysql-test/t/information_schema.test @@ -432,3 +432,21 @@ WHERE NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS B WHERE A.TABLE_SCHEMA = B.TABLE_SCHEMA AND A.TABLE_NAME = B.TABLE_NAME); + +# +# Bug #9344 INFORMATION_SCHEMA, wrong content, numeric columns +# + +create table t1 +( x_bigint BIGINT, + x_integer INTEGER, + x_smallint SMALLINT, + x_decimal DECIMAL(5,3), + x_numeric NUMERIC(5,3), + x_real REAL, + x_float FLOAT, + x_double_precision DOUBLE PRECISION ); +SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH +FROM INFORMATION_SCHEMA.COLUMNS +WHERE TABLE_NAME= 't1'; +drop table t1; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index bd0b8926c6a..55c669df49d 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2333,12 +2333,26 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables, "NO" : "YES"); table->field[6]->store((const char*) pos, strlen((const char*) pos), cs); - if (field->has_charset()) - table->field[8]->store((longlong) field->representation_length()/ - field->charset()->mbmaxlen); - else - table->field[8]->store((longlong) field->representation_length()); - table->field[9]->store((longlong) field->representation_length()); + + switch (field->type()) { + case FIELD_TYPE_TINY_BLOB: + case FIELD_TYPE_MEDIUM_BLOB: + case FIELD_TYPE_LONG_BLOB: + case FIELD_TYPE_BLOB: + case FIELD_TYPE_VAR_STRING: + case FIELD_TYPE_STRING: + if (field->has_charset()) + table->field[8]->store((longlong) field->representation_length()/ + field->charset()->mbmaxlen); + else + table->field[8]->store((longlong) field->representation_length()); + table->field[8]->set_notnull(); + table->field[9]->store((longlong) field->representation_length()); + table->field[9]->set_notnull(); + break; + default: + break; + } { uint dec =field->decimals(); @@ -3514,8 +3528,8 @@ ST_FIELD_INFO columns_fields_info[]= {"COLUMN_DEFAULT", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, "Default"}, {"IS_NULLABLE", 3, MYSQL_TYPE_STRING, 0, 0, "Null"}, {"DATA_TYPE", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, 0}, - {"CHARACTER_MAXIMUM_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 0, 0}, - {"CHARACTER_OCTET_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 0, 0}, + {"CHARACTER_MAXIMUM_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 1, 0}, + {"CHARACTER_OCTET_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 1, 0}, {"NUMERIC_PRECISION", 21 , MYSQL_TYPE_LONG, 0, 1, 0}, {"NUMERIC_SCALE", 21 , MYSQL_TYPE_LONG, 0, 1, 0}, {"CHARACTER_SET_NAME", 64, MYSQL_TYPE_STRING, 0, 1, 0}, From fb643aba56ec3bf1876a21fdb1a07166e56544d7 Mon Sep 17 00:00:00 2001 From: "joerg@mysql.com" <> Date: Thu, 31 Mar 2005 21:41:07 +0200 Subject: [PATCH 018/204] Fixes for bugs reported by Stefano Di Paola (stefano.dipaola@wisec.it) Originally contained in 2005/03/03 19:51:29+01:00 serg@serg.mylan; contained in MySQL 4.1.10a; re-committed for archival purposes. --- include/my_global.h | 3 ++ isam/create.c | 5 +- merge/mrg_create.c | 2 +- myisam/mi_create.c | 14 ++--- myisammrg/myrg_create.c | 2 +- mysys/mf_tempfile.c | 8 +-- sql/ha_myisam.cc | 18 ++++--- sql/mysql_priv.h | 2 +- sql/mysqld.cc | 10 +++- sql/share/english/errmsg.txt | 2 +- sql/sql_udf.cc | 99 ++++++++++++++++++++++++------------ sql/table.cc | 6 ++- 12 files changed, 112 insertions(+), 59 deletions(-) diff --git a/include/my_global.h b/include/my_global.h index 7ca3d5e1e58..23cf0d54824 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -523,6 +523,9 @@ typedef SOCKET_SIZE_TYPE size_socket; #ifndef O_SHORT_LIVED #define O_SHORT_LIVED 0 #endif +#ifndef O_NOFOLLOW +#define O_NOFOLLOW 0 +#endif /* #define USE_RECORD_LOCK */ diff --git a/isam/create.c b/isam/create.c index 4c23f3edd11..204d3157d00 100644 --- a/isam/create.c +++ b/isam/create.c @@ -58,13 +58,14 @@ int nisam_create(const char *name,uint keys,N_KEYDEF *keyinfo, base_pos=512; /* Enough for N_STATE_INFO */ bzero((byte*) &share,sizeof(share)); if ((file = my_create(fn_format(buff,name,"",N_NAME_IEXT,4),0, - O_RDWR | O_TRUNC,MYF(MY_WME))) < 0) + O_RDWR | O_EXCL | O_NOFOLLOW,MYF(MY_WME))) < 0) goto err; errpos=1; VOID(fn_format(buff,name,"",N_NAME_DEXT,2+4)); if (!(flags & HA_DONT_TOUCH_DATA)) { - if ((dfile = my_create(buff,0,O_RDWR | O_TRUNC,MYF(MY_WME))) < 0) + if ((dfile = my_create(buff,0,O_RDWR | O_EXCL | O_NOFOLLOW, + MYF(MY_WME))) < 0) goto err; errpos=2; } diff --git a/merge/mrg_create.c b/merge/mrg_create.c index d55a1421647..3508b7967f4 100644 --- a/merge/mrg_create.c +++ b/merge/mrg_create.c @@ -33,7 +33,7 @@ int mrg_create(const char *name, const char**table_names) errpos=0; if ((file = my_create(fn_format(buff,name,"",MRG_NAME_EXT,4),0, - O_RDWR | O_TRUNC,MYF(MY_WME))) < 0) + O_RDWR | O_EXCL | O_NOFOLLOW,MYF(MY_WME))) < 0) goto err; errpos=1; if (table_names) diff --git a/myisam/mi_create.c b/myisam/mi_create.c index f99a2c655d2..2cadc86f452 100644 --- a/myisam/mi_create.c +++ b/myisam/mi_create.c @@ -39,7 +39,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, { register uint i,j; File dfile,file; - int errpos,save_errno; + int errpos,save_errno, create_mode= O_RDWR | O_TRUNC; myf create_flag; uint fields,length,max_key_length,packed,pointer,real_length_diff, key_length,info_length,key_segs,options,min_key_length_skip, @@ -176,7 +176,10 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, min_pack_length+=varchar_length+2*varchar_count; } if (flags & HA_CREATE_TMP_TABLE) + { options|= HA_OPTION_TMP_TABLE; + create_mode|= O_EXCL | O_NOFOLLOW; + } if (flags & HA_CREATE_CHECKSUM || (options & HA_OPTION_CHECKSUM)) { options|= HA_OPTION_CHECKSUM; @@ -533,9 +536,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, create_flag=MY_DELETE_OLD; } - if ((file= my_create_with_symlink(linkname_ptr, - filename, - 0, O_RDWR | O_TRUNC, + if ((file= my_create_with_symlink(linkname_ptr, filename, 0, create_mode, MYF(MY_WME | create_flag))) < 0) goto err; errpos=1; @@ -546,7 +547,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, if (share.base.raid_type) { (void) fn_format(filename,name,"",MI_NAME_DEXT,2+4); - if ((dfile=my_raid_create(filename,0,O_RDWR | O_TRUNC, + if ((dfile=my_raid_create(filename, 0, create_mode share.base.raid_type, share.base.raid_chunks, share.base.raid_chunksize, @@ -570,8 +571,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, create_flag=MY_DELETE_OLD; } if ((dfile= - my_create_with_symlink(linkname_ptr, filename, - 0,O_RDWR | O_TRUNC, + my_create_with_symlink(linkname_ptr, filename, 0, create_mode, MYF(MY_WME | create_flag))) < 0) goto err; } diff --git a/myisammrg/myrg_create.c b/myisammrg/myrg_create.c index 5fc3c60ff32..7ddb7ecb3b9 100644 --- a/myisammrg/myrg_create.c +++ b/myisammrg/myrg_create.c @@ -34,7 +34,7 @@ int myrg_create(const char *name, const char **table_names, errpos=0; if ((file = my_create(fn_format(buff,name,"",MYRG_NAME_EXT,4),0, - O_RDWR | O_TRUNC,MYF(MY_WME))) < 0) + O_RDWR | O_EXCL | O_NOFOLLOW,MYF(MY_WME))) < 0) goto err; errpos=1; if (table_names) diff --git a/mysys/mf_tempfile.c b/mysys/mf_tempfile.c index af9ff0d6711..a15bda4da6d 100644 --- a/mysys/mf_tempfile.c +++ b/mysys/mf_tempfile.c @@ -70,7 +70,7 @@ File create_temp_file(char *to, const char *dir, const char *prefix, { strmake(to,res,FN_REFLEN-1); (*free)(res); - file=my_create(to,0, mode, MyFlags); + file=my_create(to,0, mode | O_EXCL | O_NOFOLLOW, MyFlags); } environ=old_env; } @@ -81,7 +81,7 @@ File create_temp_file(char *to, const char *dir, const char *prefix, { strmake(to,res,FN_REFLEN-1); (*free)(res); - file=my_create(to, 0, mode, MyFlags); + file=my_create(to, 0, mode | O_EXCL | O_NOFOLLOW, MyFlags); } #elif defined(HAVE_MKSTEMP) && !defined(__NETWARE__) { @@ -143,7 +143,7 @@ File create_temp_file(char *to, const char *dir, const char *prefix, strmake(to,res,FN_REFLEN-1); (*free)(res); file=my_create(to,0, - (int) (O_RDWR | O_BINARY | O_TRUNC | + (int) (O_RDWR | O_BINARY | O_TRUNC | O_EXCL | O_NOFOLLOW | O_TEMPORARY | O_SHORT_LIVED), MYF(MY_WME)); @@ -186,7 +186,7 @@ File create_temp_file(char *to, const char *dir, const char *prefix, } (void) strmov(end_pos,TMP_EXT); file=my_create(to,0, - (int) (O_RDWR | O_BINARY | O_TRUNC | + (int) (O_RDWR | O_BINARY | O_TRUNC | O_EXCL | O_NOFOLLOW | O_TEMPORARY | O_SHORT_LIVED), MYF(MY_WME)); } diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index a7beae664b9..58fd67ddfa3 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -1334,7 +1334,7 @@ int ha_myisam::create(const char *name, register TABLE *table_arg, HA_CREATE_INFO *info) { int error; - uint i,j,recpos,minpos,fieldpos,temp_length,length; + uint i,j,recpos,minpos,fieldpos,temp_length,length, create_flags; bool found_real_auto_increment=0; enum ha_base_keytype type; char buff[FN_REFLEN]; @@ -1510,17 +1510,21 @@ int ha_myisam::create(const char *name, register TABLE *table_arg, create_info.data_file_name= info->data_file_name; create_info.index_file_name=info->index_file_name; + if (info->options & HA_LEX_CREATE_TMP_TABLE) + create_flags|= HA_CREATE_TMP_TABLE; + if (options & HA_OPTION_PACK_RECORD) + create_flags|= HA_PACK_RECORD; + if (options & HA_OPTION_CHECKSUM) + create_flags|= HA_CREATE_CHECKSUM; + if (options & HA_OPTION_DELAY_KEY_WRITE) + create_flags|= HA_CREATE_DELAY_KEY_WRITE; + /* TODO: Check that the following fn_format is really needed */ error=mi_create(fn_format(buff,name,"","",2+4), table_arg->keys,keydef, (uint) (recinfo_pos-recinfo), recinfo, 0, (MI_UNIQUEDEF*) 0, - &create_info, - (((options & HA_OPTION_PACK_RECORD) ? HA_PACK_RECORD : 0) | - ((options & HA_OPTION_CHECKSUM) ? HA_CREATE_CHECKSUM : 0) | - ((options & HA_OPTION_DELAY_KEY_WRITE) ? - HA_CREATE_DELAY_KEY_WRITE : 0))); - + &create_info, create_flags); my_free((gptr) recinfo,MYF(0)); DBUG_RETURN(error); diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 6218bc49f53..36eca63ab0e 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -911,7 +911,7 @@ extern my_bool opt_sql_bin_update, opt_safe_user_create, opt_no_mix_types; extern my_bool opt_safe_show_db, opt_local_infile; extern my_bool opt_slave_compressed_protocol, use_temp_pool; extern my_bool opt_readonly, lower_case_file_system; -extern my_bool opt_enable_named_pipe, opt_sync_frm; +extern my_bool opt_enable_named_pipe, opt_sync_frm, opt_allow_suspicious_udfs; extern my_bool opt_secure_auth; extern uint opt_crash_binlog_innodb; extern char *shared_memory_base_name, *mysqld_unix_port; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 53dca59bc92..6eaaed2800b 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -289,6 +289,7 @@ my_bool opt_console= 0, opt_bdb, opt_innodb, opt_isam, opt_ndbcluster; const char *opt_ndbcluster_connectstring= 0; my_bool opt_ndb_shm, opt_ndb_optimized_node_selection; #endif +my_bool opt_allow_suspicious_udfs; my_bool opt_readonly, use_temp_pool, relay_log_purge; my_bool opt_sync_bdb_logs, opt_sync_frm; my_bool opt_secure_auth= 0; @@ -4101,7 +4102,7 @@ enum options_mysqld OPT_BDB_MAX_LOCK, OPT_ERROR_LOG_FILE, OPT_DEFAULT_WEEK_FORMAT, - OPT_RANGE_ALLOC_BLOCK_SIZE, + OPT_RANGE_ALLOC_BLOCK_SIZE, OPT_ALLOW_SUSPICIOUS_UDFS, OPT_QUERY_ALLOC_BLOCK_SIZE, OPT_QUERY_PREALLOC_SIZE, OPT_TRANS_ALLOC_BLOCK_SIZE, OPT_TRANS_PREALLOC_SIZE, OPT_SYNC_FRM, OPT_SYNC_BINLOG, @@ -4141,6 +4142,13 @@ struct my_option my_long_options[] = #endif /* HAVE_REPLICATION */ {"ansi", 'a', "Use ANSI SQL syntax instead of MySQL syntax.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"allow-suspicious-udfs", OPT_ALLOW_SUSPICIOUS_UDFS, + "Allows to use UDF's consisting of only one symbol xxx() " + "without corresponing xxx_init() or xxx_deinit(). That also means " + "that one can load any function from any library, for example exit() " + "from libc.so", + (gptr*) &opt_allow_suspicious_udfs, (gptr*) &opt_allow_suspicious_udfs, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"basedir", 'b', "Path to installation directory. All paths are usually resolved relative to this.", (gptr*) &mysql_home_ptr, (gptr*) &mysql_home_ptr, 0, GET_STR, REQUIRED_ARG, diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt index 8ede3f61a0b..104a055417c 100644 --- a/sql/share/english/errmsg.txt +++ b/sql/share/english/errmsg.txt @@ -143,7 +143,7 @@ character-set=latin1 "No paths allowed for shared library", "Function '%-.64s' already exists", "Can't open shared library '%-.64s' (errno: %d %-.64s)", -"Can't find function '%-.64s' in library'", +"Can't find function '%-.64s' in library", "Function '%-.64s' is not defined", "Host '%-.64s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'", "Host '%-.64s' is not allowed to connect to this MySQL server", diff --git a/sql/sql_udf.cc b/sql/sql_udf.cc index 0bb8ac8a28b..ae89c1eaa35 100644 --- a/sql/sql_udf.cc +++ b/sql/sql_udf.cc @@ -74,32 +74,49 @@ static HASH udf_hash; static rw_lock_t THR_LOCK_udf; -static udf_func *add_udf(LEX_STRING *name, Item_result ret, char *dl, - Item_udftype typ); +static udf_func *add_udf(char *name, Item_result ret, + char *dl, Item_udftype typ); static void del_udf(udf_func *udf); static void *find_udf_dl(const char *dl); - -static void init_syms(udf_func *tmp) +static char *init_syms(udf_func *tmp, char *nm) { - char nm[MAX_FIELD_NAME+16],*end; + char *end; + + if (!((tmp->func= dlsym(tmp->dlhandle, tmp->name)))) + return tmp->name; - tmp->func = dlsym(tmp->dlhandle, tmp->name.str); end=strmov(nm,tmp->name.str); - (void) strmov(end,"_init"); - tmp->func_init = dlsym(tmp->dlhandle, nm); - (void) strmov(end,"_deinit"); - tmp->func_deinit = dlsym(tmp->dlhandle, nm); + if (tmp->type == UDFTYPE_AGGREGATE) { - (void)strmov( end, "_clear" ); - tmp->func_clear = dlsym( tmp->dlhandle, nm ); - (void)strmov( end, "_add" ); - tmp->func_add = dlsym( tmp->dlhandle, nm ); - /* Give error if _clear and _add doesn't exists */ - if (!tmp->func_clear || ! tmp->func_add) - tmp->func= 0; + (void)strmov(end, "_reset"); + if (!((tmp->func_reset= dlsym(tmp->dlhandle, nm)))) + return nm; + (void)strmov(end, "_add"); + if (!((tmp->func_add= dlsym(tmp->dlhandle, nm)))) + return nm; } + + (void) strmov(end,"_deinit"); + tmp->func_deinit= dlsym(tmp->dlhandle, nm); + + (void) strmov(end,"_init"); + tmp->func_init= dlsym(tmp->dlhandle, nm); + + /* + to prefent loading "udf" from, e.g. libc.so + let's ensure that at least one auxiliary symbol is defined + */ + if (!tmp->func_init && !tmp->func_deinit && tmp->type != UDFTYPE_AGGREGATE) + { + if (opt_allow_suspicious_udfs) + sql_print_error(ER(ER_CANT_FIND_DL_ENTRY), nm); + else + return nm; + } + + return 0; } extern "C" byte* get_hash_key(const byte *buff,uint *length, @@ -111,7 +128,7 @@ extern "C" byte* get_hash_key(const byte *buff,uint *length, } /* -** Read all predeclared functions from func@mysql and accept all that +** Read all predeclared functions from mysql.func and accept all that ** can be used. */ @@ -153,7 +170,7 @@ void udf_init() if (simple_open_n_lock_tables(new_thd, &tables)) { DBUG_PRINT("error",("Can't open udf table")); - sql_print_error("Can't open the mysql/func table. Please run the mysql_install_db script to create it."); + sql_print_error("Can't open the mysql.func table. Please run the mysql_install_db script to create it."); goto end; } @@ -171,10 +188,22 @@ void udf_init() if (table->fields >= 4) // New func table udftype=(Item_udftype) table->field[3]->val_int(); + /* + Ensure that the .dll doesn't have a path + This is done to ensure that only approved dll from the system + directories are used (to make this even remotely secure). + */ + if (strchr(dl_name, '/') || strlen(name) > NAME_LEN) + { + sql_print_error("Invalid row in mysql.func table for function '%.64s'", + name); + continue; + } + if (!(tmp = add_udf(&name,(Item_result) table->field[1]->val_int(), dl_name, udftype))) { - sql_print_error("Can't alloc memory for udf function: name"); + sql_print_error("Can't alloc memory for udf function: '%.64s'", name); continue; } @@ -191,13 +220,15 @@ void udf_init() new_dl=1; } tmp->dlhandle = dl; - init_syms(tmp); - if (!tmp->func) { - sql_print_error(ER(ER_CANT_FIND_DL_ENTRY), name); - del_udf(tmp); - if (new_dl) - dlclose(dl); + char buf[MAX_FIELD_NAME+16], *missing; + if ((missing= init_syms(tmp, buf))) + { + sql_print_error(ER(ER_CANT_FIND_DL_ENTRY), missing); + del_udf(tmp); + if (new_dl) + dlclose(dl); + } } } if (error > 0) @@ -406,13 +437,15 @@ int mysql_create_function(THD *thd,udf_func *udf) new_dl=1; } udf->dlhandle=dl; - init_syms(udf); - - if (udf->func == NULL) { - net_printf(thd, ER_CANT_FIND_DL_ENTRY, udf->name); - goto err; + char buf[MAX_FIELD_NAME+16], *missing; + if ((missing= init_syms(udf, buf))) + { + net_printf(thd, ER_CANT_FIND_DL_ENTRY, missing); + goto err; + } } + udf->name.str=strdup_root(&mem,udf->name.str); udf->dl=strdup_root(&mem,udf->dl); if (!(u_d=add_udf(&udf->name,udf->returns,udf->dl,udf->type))) @@ -427,7 +460,7 @@ int mysql_create_function(THD *thd,udf_func *udf) u_d->func_clear=udf->func_clear; u_d->func_add=udf->func_add; - /* create entry in mysql/func table */ + /* create entry in mysql.func table */ bzero((char*) &tables,sizeof(tables)); tables.db= (char*) "mysql"; @@ -447,7 +480,7 @@ int mysql_create_function(THD *thd,udf_func *udf) close_thread_tables(thd); if (error) { - net_printf(thd, ER_ERROR_ON_WRITE, "func@mysql",error); + net_printf(thd, ER_ERROR_ON_WRITE, "mysql.func",error); del_udf(u_d); goto err; } diff --git a/sql/table.cc b/sql/table.cc index 064d7f1afc1..cdcd5148787 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1229,6 +1229,10 @@ File create_frm(register my_string name, uint reclength, uchar *fileinfo, uint key_length; ulong length; char fill[IO_SIZE]; + int create_flags= O_RDWR | O_TRUNC; + + if (create_info->options & HA_LEX_CREATE_TMP_TABLE) + create_flags|= O_EXCL | O_NOFOLLOW; #if SIZEOF_OFF_T > 4 /* Fix this when we have new .frm files; Current limit is 4G rows (QQ) */ @@ -1243,7 +1247,7 @@ File create_frm(register my_string name, uint reclength, uchar *fileinfo, */ set_if_smaller(create_info->raid_chunks, 255); - if ((file=my_create(name,CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0) + if ((file= my_create(name, CREATE_MODE, create_flags, MYF(MY_WME))) >= 0) { bzero((char*) fileinfo,64); fileinfo[0]=(uchar) 254; fileinfo[1]= 1; fileinfo[2]= FRM_VER+3; // Header From e286515667d3cd3028092ef5c1277dff75d2ee21 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Thu, 31 Mar 2005 11:43:39 -0800 Subject: [PATCH 019/204] Fix segmentation fault in mysqlcheck when the last table checked with --auto-repair mode returned an error (such as being a merge table). (Bug #9492) --- client/mysqlcheck.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index 8764611adf4..b5a80782948 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -537,6 +537,7 @@ static void print_result() my_bool found_error=0; res = mysql_use_result(sock); + prev[0] = '\0'; for (i = 0; (row = mysql_fetch_row(res)); i++) { @@ -565,7 +566,7 @@ static void print_result() putchar('\n'); } if (found_error && opt_auto_repair && what_to_do != DO_REPAIR && - (!opt_fast || strcmp(row[3],"OK"))) + !opt_fast) insert_dynamic(&tables4repair, prev); mysql_free_result(res); } From 62c83214d91b0698a6da7123a9166cff27381ede Mon Sep 17 00:00:00 2001 From: "joerg@mysql.com" <> Date: Thu, 31 Mar 2005 21:44:48 +0200 Subject: [PATCH 020/204] uninit variable fixed Originally contained in 2005/03/03 21:13:33+01:00 serg@serg.mylan; contained in MySQL 4.1.10a; re-committed for archival purposes. --- sql/ha_myisam.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 58fd67ddfa3..7ddb7ca25ed 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -1334,7 +1334,7 @@ int ha_myisam::create(const char *name, register TABLE *table_arg, HA_CREATE_INFO *info) { int error; - uint i,j,recpos,minpos,fieldpos,temp_length,length, create_flags; + uint i,j,recpos,minpos,fieldpos,temp_length,length, create_flags= 0; bool found_real_auto_increment=0; enum ha_base_keytype type; char buff[FN_REFLEN]; From 9db41fb08ee38bd3412a8ce2776d074b5b7c40e5 Mon Sep 17 00:00:00 2001 From: "joerg@mysql.com" <> Date: Thu, 31 Mar 2005 21:47:18 +0200 Subject: [PATCH 021/204] typos fixed Originally contained in 2005/03/03 23:10:23+01:00 serg@serg.mylan; contained in MySQL 4.1.10a; re-committed for archival purposes. --- sql/mysqld.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 6eaaed2800b..988482d00d2 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4143,8 +4143,8 @@ struct my_option my_long_options[] = {"ansi", 'a', "Use ANSI SQL syntax instead of MySQL syntax.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"allow-suspicious-udfs", OPT_ALLOW_SUSPICIOUS_UDFS, - "Allows to use UDF's consisting of only one symbol xxx() " - "without corresponing xxx_init() or xxx_deinit(). That also means " + "Allows use of UDFs consisting of only one symbol xxx() " + "without corresponding xxx_init() or xxx_deinit(). That also means " "that one can load any function from any library, for example exit() " "from libc.so", (gptr*) &opt_allow_suspicious_udfs, (gptr*) &opt_allow_suspicious_udfs, From ccd6fe786a5fc8875ffde66200921c2bc30865ee Mon Sep 17 00:00:00 2001 From: "joerg@mysql.com" <> Date: Thu, 31 Mar 2005 21:57:46 +0200 Subject: [PATCH 022/204] after merge fixes Originally contained in 2005/03/03 23:57:48+01:00 serg@serg.mylan; contained in MySQL 4.1.10a; re-committed for archival purposes. --- sql/sql_udf.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sql/sql_udf.cc b/sql/sql_udf.cc index ae89c1eaa35..d20fca86323 100644 --- a/sql/sql_udf.cc +++ b/sql/sql_udf.cc @@ -83,8 +83,8 @@ static char *init_syms(udf_func *tmp, char *nm) { char *end; - if (!((tmp->func= dlsym(tmp->dlhandle, tmp->name)))) - return tmp->name; + if (!((tmp->func= dlsym(tmp->dlhandle, tmp->name.str)))) + return tmp->name.str; end=strmov(nm,tmp->name.str); @@ -193,17 +193,17 @@ void udf_init() This is done to ensure that only approved dll from the system directories are used (to make this even remotely secure). */ - if (strchr(dl_name, '/') || strlen(name) > NAME_LEN) + if (strchr(dl_name, '/') || name.length > NAME_LEN) { sql_print_error("Invalid row in mysql.func table for function '%.64s'", - name); + name.str); continue; } if (!(tmp = add_udf(&name,(Item_result) table->field[1]->val_int(), dl_name, udftype))) { - sql_print_error("Can't alloc memory for udf function: '%.64s'", name); + sql_print_error("Can't alloc memory for udf function: '%.64s'", name.str); continue; } @@ -270,7 +270,7 @@ void udf_free() { initialized= 0; rwlock_destroy(&THR_LOCK_udf); - } + } DBUG_VOID_RETURN; } From e2a3d0da36b7f5d110ac2cbf3a6cd994c5c8f6a5 Mon Sep 17 00:00:00 2001 From: "joerg@mysql.com" <> Date: Thu, 31 Mar 2005 22:02:05 +0200 Subject: [PATCH 023/204] Fix for a build bug. Added a missing comma. Originally contained in 2005/03/04 09:30:22+01:00 ingo@mysql.com; contained in MySQL 4.1.10a; re-committed for archival purposes. --- myisam/mi_create.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/myisam/mi_create.c b/myisam/mi_create.c index 2cadc86f452..a513f840965 100644 --- a/myisam/mi_create.c +++ b/myisam/mi_create.c @@ -547,7 +547,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, if (share.base.raid_type) { (void) fn_format(filename,name,"",MI_NAME_DEXT,2+4); - if ((dfile=my_raid_create(filename, 0, create_mode + if ((dfile=my_raid_create(filename, 0, create_mode, share.base.raid_type, share.base.raid_chunks, share.base.raid_chunksize, From 201ee3eb78da55c72c627c6aa09a51899e31c4a7 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Fri, 1 Apr 2005 15:04:50 +0300 Subject: [PATCH 024/204] Invalid DEFAULT values for CREATE TABLE now generates errors. (Bug #5902) CAST() now produces warnings when casting a wrong INTEGER or CHAR values. This also applies to implicite string to number casts. (Bug #5912) ALTER TABLE now fails in STRICT mode if it generates warnings. Inserting a zero date in a DATE, DATETIME or TIMESTAMP column during TRADITIONAL mode now produces an error. (Bug #5933) --- mysql-test/r/bigint.result | 2 + mysql-test/r/cast.result | 68 ++++++++++++ mysql-test/r/create.result | 18 +++- mysql-test/r/func_if.result | 17 +-- mysql-test/r/func_misc.result | 2 + mysql-test/r/func_str.result | 10 +- mysql-test/r/ndb_index_unique.result | 8 +- mysql-test/r/ps_1general.result | 16 +-- mysql-test/r/row.result | 5 + mysql-test/r/rpl_session_var.result | 6 +- mysql-test/r/strict.result | 64 ++++++++++++ mysql-test/r/subselect.result | 12 ++- mysql-test/r/type_ranges.result | 6 +- mysql-test/t/cast.test | 13 +++ mysql-test/t/create.test | 19 +++- mysql-test/t/func_if.test | 5 +- mysql-test/t/func_str.test | 5 +- mysql-test/t/ndb_index_unique.test | 8 +- mysql-test/t/ps_1general.test | 4 +- mysql-test/t/rpl_session_var.test | 2 +- mysql-test/t/strict.test | 52 ++++++++++ mysql-test/t/subselect.test | 4 +- mysql-test/t/type_ranges.test | 2 +- sql/Makefile.am | 2 +- sql/field.cc | 150 ++++++++++++++++++--------- sql/field.h | 8 +- sql/field_conv.cc | 16 ++- sql/item.cc | 60 ++++++++++- sql/item.h | 17 +-- sql/item_row.cc | 4 +- sql/item_sum.cc | 3 +- sql/item_timefunc.cc | 36 ++++--- sql/my_decimal.cc | 2 +- sql/mysql_priv.h | 15 +-- sql/mysqld.cc | 4 +- sql/sql_class.h | 21 ---- sql/sql_error.h | 42 ++++++++ sql/sql_load.cc | 2 +- sql/sql_parse.cc | 7 +- sql/sql_table.cc | 62 ++++++----- sql/time.cc | 6 +- sql/unireg.cc | 22 +++- 42 files changed, 603 insertions(+), 224 deletions(-) create mode 100644 sql/sql_error.h diff --git a/mysql-test/r/bigint.result b/mysql-test/r/bigint.result index 50e99e3ecd7..e372c307ba7 100644 --- a/mysql-test/r/bigint.result +++ b/mysql-test/r/bigint.result @@ -87,6 +87,8 @@ drop table t1; SELECT '0x8000000000000001'+0; '0x8000000000000001'+0 0 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: '0x8000000000000001' create table t1 ( value64 bigint unsigned not null, value32 integer not null, diff --git a/mysql-test/r/cast.result b/mysql-test/r/cast.result index b015648534b..79d903737bf 100644 --- a/mysql-test/r/cast.result +++ b/mysql-test/r/cast.result @@ -7,6 +7,9 @@ CAST(CAST(1-2 AS UNSIGNED) AS SIGNED INTEGER) select CONVERT('-1',UNSIGNED); CONVERT('-1',UNSIGNED) 18446744073709551615 +select CAST('10 ' as unsigned integer); +CAST('10 ' as unsigned integer) +10 select cast(-5 as unsigned) | 1, cast(-5 as unsigned) & -1; cast(-5 as unsigned) | 1 cast(-5 as unsigned) & -1 18446744073709551611 18446744073709551611 @@ -42,6 +45,15 @@ cast("1:2:3" as TIME) select CONVERT("2004-01-22 21:45:33",DATE); CONVERT("2004-01-22 21:45:33",DATE) 2004-01-22 +select 10+'10'; +10+'10' +20 +select 10.0+'10'; +10.0+'10' +20 +select 10E+0+'10'; +10E+0+'10' +20 select CONVERT(DATE "2004-01-22 21:45:33" USING latin1); CONVERT(DATE "2004-01-22 21:45:33" USING latin1) 2004-01-22 21:45:33 @@ -51,12 +63,43 @@ CONVERT(DATE "2004-01-22 21:45:33",CHAR) select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4)); CONVERT(DATE "2004-01-22 21:45:33",CHAR(4)) 2004 +Warnings: +Warning 1292 Truncated incorrect CHAR(4) value: '2004-01-22 21:45:33' select CONVERT(DATE "2004-01-22 21:45:33",BINARY(4)); CONVERT(DATE "2004-01-22 21:45:33",BINARY(4)) 2004 +Warnings: +Warning 1292 Truncated incorrect CHAR(4) value: '2004-01-22 21:45:33' select CAST(DATE "2004-01-22 21:45:33" AS BINARY(4)); CAST(DATE "2004-01-22 21:45:33" AS BINARY(4)) 2004 +Warnings: +Warning 1292 Truncated incorrect CHAR(4) value: '2004-01-22 21:45:33' +select cast('-10a' as signed integer); +cast('-10a' as signed integer) +-10 +Warnings: +Warning 1292 Truncated incorrect INTEGER value: '-10a' +select cast('a10' as unsigned integer); +cast('a10' as unsigned integer) +0 +Warnings: +Warning 1292 Truncated incorrect INTEGER value: 'a10' +select 10+'a'; +10+'a' +10 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'a' +select 10.0+cast('a' as decimal); +10.0+cast('a' as decimal) +10.00 +Warnings: +Error 1366 Incorrect decimal value: '' for column '' at row -1 +select 10E+0+'a'; +10E+0+'a' +10 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'a' set names binary; select cast(_latin1'test' as char character set latin2); cast(_latin1'test' as char character set latin2) @@ -79,12 +122,23 @@ cast(_latin1'a ' AS char(2)) as c4, cast(_latin1'a' AS char(2)) as c5; c1 c2 c3 c4 c5 ab a ab a a +Warnings: +Warning 1292 Truncated incorrect CHAR(2) value: 'abc' +Warning 1292 Truncated incorrect CHAR(2) value: 'a ' +select cast(1000 as CHAR(3)); +cast(1000 as CHAR(3)) +100 +Warnings: +Warning 1292 Truncated incorrect CHAR(3) value: '1000' create table t1 select cast(_latin1'ab' AS char) as c1, cast(_latin1'a ' AS char) as c2, cast(_latin1'abc' AS char(2)) as c3, cast(_latin1'a ' AS char(2)) as c4, cast(_latin1'a' AS char(2)) as c5; +Warnings: +Warning 1292 Truncated incorrect CHAR(2) value: 'abc' +Warning 1292 Truncated incorrect CHAR(2) value: 'a ' select * from t1; c1 c2 c3 c4 c5 ab a ab a a @@ -106,12 +160,18 @@ cast(_koi8r' cast(_koi8r'' AS nchar(2)) as c5; c1 c2 c3 c4 c5 фг ф фг ф ф +Warnings: +Warning 1292 Truncated incorrect CHAR(4) value: 'фгх' +Warning 1292 Truncated incorrect CHAR(3) value: 'ф ' create table t1 select cast(_koi8r'' AS nchar) as c1, cast(_koi8r' ' AS nchar) as c2, cast(_koi8r'' AS nchar(2)) as c3, cast(_koi8r' ' AS nchar(2)) as c4, cast(_koi8r'' AS nchar(2)) as c5; +Warnings: +Warning 1292 Truncated incorrect CHAR(4) value: 'фгх' +Warning 1292 Truncated incorrect CHAR(3) value: 'ф ' select * from t1; c1 c2 c3 c4 c5 фг ф фг ф ф @@ -167,6 +227,10 @@ a CAST(a AS CHAR(3)) aac aac aab aab aaa aaa +Warnings: +Warning 1292 Truncated incorrect CHAR(2) value: 'aaa' +Warning 1292 Truncated incorrect CHAR(2) value: 'aab' +Warning 1292 Truncated incorrect CHAR(2) value: 'aac' SELECT a, CAST(a AS UNSIGNED) FROM t1 ORDER BY CAST(a AS CHAR) ; a CAST(a AS UNSIGNED) aaa 3 @@ -177,6 +241,10 @@ a CAST(a AS CHAR(2)) aaa aa aab aa aac aa +Warnings: +Warning 1292 Truncated incorrect CHAR(2) value: 'aaa' +Warning 1292 Truncated incorrect CHAR(2) value: 'aab' +Warning 1292 Truncated incorrect CHAR(2) value: 'aac' DROP TABLE t1; select date_add(cast('2004-12-30 12:00:00' as date), interval 0 hour); date_add(cast('2004-12-30 12:00:00' as date), interval 0 hour) diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index 1c378f88e5c..a323669ac97 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -44,12 +44,24 @@ create table `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ERROR 42000: Incorrect table name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' create table a (`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` int); ERROR 42000: Identifier name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' is too long -create table test (a datetime default now()); +create table t1 (a datetime default now()); ERROR 42000: Invalid default value for 'a' -create table test (a datetime on update now()); +create table t1 (a datetime on update now()); ERROR HY000: Invalid ON UPDATE clause for 'a' column -create table test (a int default 100 auto_increment); +create table t1 (a int default 100 auto_increment); ERROR 42000: Invalid default value for 'a' +create table t1 (a tinyint default 1000); +ERROR 42000: Invalid default value for 'a' +create table t1 (a varchar(5) default 'abcdef'); +ERROR 42000: Invalid default value for 'a' +create table t1 (a varchar(5) default 'abcde'); +insert into t1 values(); +select * from t1; +a +abcde +alter table t1 alter column a set default 'abcdef'; +ERROR 42000: Invalid default value for 'a' +drop table t1; create table 1ea10 (1a20 int,1e int); insert into 1ea10 values(1,1); select 1ea10.1a20,1e+ 1e+10 from 1ea10; diff --git a/mysql-test/r/func_if.result b/mysql-test/r/func_if.result index 0ee7412cbe9..4db31121756 100644 --- a/mysql-test/r/func_if.result +++ b/mysql-test/r/func_if.result @@ -44,21 +44,26 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 7 Using where; Using filesort Warnings: Note 1003 select if((`test`.`t1`.`u` = 1),`test`.`t1`.`st`,cast(`test`.`t1`.`st` as char charset binary)) AS `s` from `test`.`t1` where (`test`.`t1`.`st` like _latin1'%a%') order by if((`test`.`t1`.`u` = 1),`test`.`t1`.`st`,cast(`test`.`t1`.`st` as char charset binary)) -select nullif(u=0, 'test') from t1; -nullif(u=0, 'test') +select nullif(u, 1) from t1; +nullif(u, 1) NULL NULL NULL NULL NULL -1 -1 -explain extended select nullif(u=0, 'test') from t1; +0 +0 +explain extended select nullif(u, 1) from t1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 7 Warnings: -Note 1003 select nullif((`test`.`t1`.`u` = 0),_latin1'test') AS `nullif(u=0, 'test')` from `test`.`t1` +Note 1003 select nullif(`test`.`t1`.`u`,1) AS `nullif(u, 1)` from `test`.`t1` drop table t1; +select nullif(1,'test'); +nullif(1,'test') +1 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'test' select NULLIF(NULL,NULL), NULLIF(NULL,1), NULLIF(NULL,1.0), NULLIF(NULL,"test"); NULLIF(NULL,NULL) NULLIF(NULL,1) NULLIF(NULL,1.0) NULLIF(NULL,"test") NULL NULL NULL NULL diff --git a/mysql-test/r/func_misc.result b/mysql-test/r/func_misc.result index 2d464c891bf..1d9b813e68a 100644 --- a/mysql-test/r/func_misc.result +++ b/mysql-test/r/func_misc.result @@ -25,6 +25,8 @@ length(uuid()) charset(uuid()) length(unhex(replace(uuid(),_utf8'-',_utf8''))) select length(format('nan', 2)) > 0; length(format('nan', 2)) > 0 1 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'nan' select concat("$",format(2500,2)); concat("$",format(2500,2)) $2,500.00 diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result index 1c2cfeca01e..bbb5a94606e 100644 --- a/mysql-test/r/func_str.result +++ b/mysql-test/r/func_str.result @@ -1,4 +1,4 @@ -drop table if exists t1; +drop table if exists t1,t2; set names latin1; select 'hello',"'hello'",'""hello""','''h''e''l''l''o''',"hel""lo",'hel\'lo'; hello 'hello' ""hello"" 'h'e'l'l'o' hel"lo hel'lo @@ -236,6 +236,8 @@ Warning 1301 Result of repeat() was larger than max_allowed_packet (1048576) - t select position("0" in "baaa" in (1)),position("0" in "1" in (1,2,3)),position("sql" in ("mysql")); position("0" in "baaa" in (1)) position("0" in "1" in (1,2,3)) position("sql" in ("mysql")) 1 0 3 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'baaa' select position(("1" in (1,2,3)) in "01"); position(("1" in (1,2,3)) in "01") 2 @@ -393,9 +395,9 @@ select FIELD(_latin2'b','A','B'); ERROR HY000: Illegal mix of collations (latin2_general_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE) for operation 'field' select FIELD('b',_latin2'A','B'); ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE), (latin2_general_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE) for operation 'field' -select FIELD('b',_latin2'A','B',1); -FIELD('b',_latin2'A','B',1) -1 +select FIELD('1',_latin2'3','2',1); +FIELD('1',_latin2'3','2',1) +3 select POSITION(_latin1'B' IN _latin1'abcd'); POSITION(_latin1'B' IN _latin1'abcd') 2 diff --git a/mysql-test/r/ndb_index_unique.result b/mysql-test/r/ndb_index_unique.result index 517d09ddf29..1401ae26ddb 100644 --- a/mysql-test/r/ndb_index_unique.result +++ b/mysql-test/r/ndb_index_unique.result @@ -248,8 +248,8 @@ INSERT INTO t3 VALUES (1,'V1',NULL); CREATE TABLE t4 ( uid bigint(20) unsigned NOT NULL default '0', gid bigint(20) unsigned NOT NULL, -rid bigint(20) unsigned NOT NULL default '-1', -cid bigint(20) unsigned NOT NULL default '-1', +rid bigint(20) unsigned NOT NULL, +cid bigint(20) unsigned NOT NULL, UNIQUE KEY m (uid,gid,rid,cid) ) engine=ndbcluster; INSERT INTO t4 VALUES (1,1,2,4); @@ -275,8 +275,8 @@ CREATE TABLE t7 ( mid bigint(20) unsigned NOT NULL PRIMARY KEY, uid bigint(20) unsigned NOT NULL default '0', gid bigint(20) unsigned NOT NULL, -rid bigint(20) unsigned NOT NULL default '-1', -cid bigint(20) unsigned NOT NULL default '-1', +rid bigint(20) unsigned NOT NULL, +cid bigint(20) unsigned NOT NULL, UNIQUE KEY m (uid,gid,rid,cid) ) engine=ndbcluster; INSERT INTO t7 VALUES(1, 1, 1, 1, 1); diff --git a/mysql-test/r/ps_1general.result b/mysql-test/r/ps_1general.result index 06acb72f49b..34f693ea33a 100644 --- a/mysql-test/r/ps_1general.result +++ b/mysql-test/r/ps_1general.result @@ -464,17 +464,17 @@ select 'a' || 'b' ; ab prepare stmt4 from ' SET sql_mode="" '; execute stmt4; -select 'a' || 'b' ; -'a' || 'b' -0 -prepare stmt5 from ' select ''a'' || ''b'' ' ; +select '2' || '3' ; +'2' || '3' +1 +prepare stmt5 from ' select ''2'' || ''3'' ' ; execute stmt5; -'a' || 'b' -0 +'2' || '3' +1 SET sql_mode=ansi; execute stmt5; -'a' || 'b' -0 +'2' || '3' +1 SET sql_mode=""; prepare stmt1 from ' flush local privileges ' ; ERROR HY000: This command is not supported in the prepared statement protocol yet diff --git a/mysql-test/r/row.result b/mysql-test/r/row.result index 40a31563604..691687762cb 100644 --- a/mysql-test/r/row.result +++ b/mysql-test/r/row.result @@ -16,12 +16,17 @@ row('a',1.5,3) IN (row(1,2,3), row('a',1.5,3), row('a','a','a')) 1 Warnings: Error 1366 Incorrect decimal value: '' for column '' at row -1 +Warning 1292 Truncated incorrect INTEGER value: 'a' select row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3)); row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3)) 1 select row('a',0,3) IN (row(3,2,3), row('a','a','3'), row(1,3,3)); +Warnings: +Warning 1292 Truncated incorrect INTEGER value: 'a' row('a',0,3) IN (row(3,2,3), row('a','a','3'), row(1,3,3)) 1 +Warnings: +Warning 1292 Truncated incorrect INTEGER value: 'a' select row('a',1.5,3) IN (row(3,NULL,3), row('a',1.5,3), row(1,3,3)); row('a',1.5,3) IN (row(3,NULL,3), row('a',1.5,3), row(1,3,3)) 1 diff --git a/mysql-test/r/rpl_session_var.result b/mysql-test/r/rpl_session_var.result index f1f79ffa597..b5b4b815ade 100644 --- a/mysql-test/r/rpl_session_var.result +++ b/mysql-test/r/rpl_session_var.result @@ -11,14 +11,14 @@ create table t1(a varchar(100),b int); set @@session.sql_mode=pipes_as_concat; insert into t1 values('My'||'SQL', 1); set @@session.sql_mode=default; -insert into t1 values('My'||'SQL', 2); +insert into t1 values('1'||'2', 2); select * from t1 where b<3 order by a; a b -0 2 +1 2 MySQL 1 select * from t1 where b<3 order by a; a b -0 2 +1 2 MySQL 1 set @@session.sql_mode=ignore_space; insert into t1 values(password ('MySQL'), 3); diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result index 47dbb87b990..1f8ada55061 100644 --- a/mysql-test/r/strict.result +++ b/mysql-test/r/strict.result @@ -1089,4 +1089,68 @@ Error 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_t Error 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_time Error 1411 Incorrect datetime value: '2004.12.12 10:22:61' for function str_to_time drop table t1; +create table t1 (col1 char(3), col2 integer); +insert into t1 (col1) values (cast(1000 as char(3))); +ERROR 22007: Truncated incorrect CHAR(3) value: '1000' +insert into t1 (col1) values (cast(1000E+0 as char(3))); +ERROR 22007: Truncated incorrect CHAR(3) value: '1000' +insert into t1 (col1) values (cast(1000.0 as char(3))); +ERROR 22007: Truncated incorrect CHAR(3) value: '1000.0' +insert into t1 (col2) values (cast('abc' as signed integer)); +ERROR 22007: Truncated incorrect INTEGER value: 'abc' +insert into t1 (col2) values (10E+0 + 'a'); +ERROR 22007: Truncated incorrect DOUBLE value: 'a' +insert into t1 (col2) values (cast('10a' as unsigned integer)); +ERROR 22007: Truncated incorrect INTEGER value: '10a' +insert into t1 (col2) values (cast('10' as unsigned integer)); +insert into t1 (col2) values (cast('10' as signed integer)); +insert into t1 (col2) values (10E+0 + '0 '); +select * from t1; +col1 col2 +NULL 10 +NULL 10 +NULL 10 +drop table t1; +create table t1 (col1 date, col2 datetime, col3 timestamp); +insert into t1 values (0,0,0); +ERROR 22007: Incorrect date value: '0' for column 'col1' at row 1 +insert into t1 values (0.0,0.0,0.0); +ERROR 22007: Incorrect date value: '0' for column 'col1' at row 1 +set sql_mode='no_zero_date'; +insert into t1 values (0,0,0); +Warnings: +Warning 1264 Out of range value adjusted for column 'col1' at row 1 +Warning 1264 Out of range value adjusted for column 'col2' at row 1 +Warning 1265 Data truncated for column 'col3' at row 1 +insert into t1 values (0.0,0.0,0.0); +Warnings: +Warning 1264 Out of range value adjusted for column 'col1' at row 1 +Warning 1264 Out of range value adjusted for column 'col2' at row 1 +Warning 1265 Data truncated for column 'col3' at row 1 +drop table t1; +set sql_mode='traditional'; +create table t1 (col1 date); +insert ignore into t1 values ('0000-00-00'); +Warnings: +Warning 1265 Data truncated for column 'col1' at row 1 +insert into t1 select * from t1; +ERROR 22007: Incorrect date value: '0000-00-00' for column 'col1' at row 1 +insert ignore into t1 values ('0000-00-00'); +Warnings: +Warning 1265 Data truncated for column 'col1' at row 1 +insert into t1 select * from t1; +ERROR 22007: Incorrect date value: '0000-00-00' for column 'col1' at row 1 +alter table t1 modify col1 datetime; +ERROR 22007: Incorrect datetime value: '0000-00-00' for column 'col1' at row 1 +alter ignore table t1 modify col1 datetime; +Warnings: +Warning 1264 Out of range value adjusted for column 'col1' at row 1 +Warning 1264 Out of range value adjusted for column 'col1' at row 2 +insert into t1 select * from t1; +ERROR 22007: Incorrect datetime value: '0000-00-00 00:00:00' for column 'col1' at row 1 +select * from t1; +col1 +0000-00-00 00:00:00 +0000-00-00 00:00:00 +drop table t1; set sql_mode=@org_mode; diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 738c011012d..24d54c3ca33 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -117,15 +117,17 @@ SELECT (SELECT 1.5,2,'a') = ROW(1.5,2,'a'); SELECT (SELECT 1.5,2,'a') = ROW(1.5,2,'b'); (SELECT 1.5,2,'a') = ROW(1.5,2,'b') 0 -SELECT (SELECT 1.5,2,'a') = ROW('b',2,'b'); -(SELECT 1.5,2,'a') = ROW('b',2,'b') +SELECT (SELECT 1.5,2,'a') = ROW('1.5b',2,'b'); +(SELECT 1.5,2,'a') = ROW('1.5b',2,'b') 0 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: '1.5b' SELECT (SELECT 'b',2,'a') = ROW(1.5,2,'a'); (SELECT 'b',2,'a') = ROW(1.5,2,'a') 0 -SELECT (SELECT 1.5,2,'a') = ROW(1.5,'c','a'); -(SELECT 1.5,2,'a') = ROW(1.5,'c','a') -0 +SELECT (SELECT 1.5,2,'a') = ROW(1.5,'2','a'); +(SELECT 1.5,2,'a') = ROW(1.5,'2','a') +1 SELECT (SELECT 1.5,'c','a') = ROW(1.5,2,'a'); (SELECT 1.5,'c','a') = ROW(1.5,2,'a') 0 diff --git a/mysql-test/r/type_ranges.result b/mysql-test/r/type_ranges.result index e553d9d86f2..12efb38179f 100644 --- a/mysql-test/r/type_ranges.result +++ b/mysql-test/r/type_ranges.result @@ -133,7 +133,7 @@ ALTER TABLE t1 add new_field char(10) default "new" not null, change blob_col new_blob_col varchar(20), change date_field date_field char(10), -alter column string set default "new default", +alter column string set default "newdefault", alter short drop default, DROP INDEX utiny, DROP INDEX ushort, @@ -211,7 +211,7 @@ update t2 set string="changed" where auto=16; show full columns from t1; Field Type Collation Null Key Default Extra Privileges Comment auto int(5) unsigned NULL NO MUL NULL auto_increment select,insert,update,references -string char(10) latin1_swedish_ci YES new defaul select,insert,update,references +string char(10) latin1_swedish_ci YES newdefault select,insert,update,references tiny tinyint(4) NULL NO MUL 0 select,insert,update,references short smallint(6) NULL NO MUL 0 select,insert,update,references medium mediumint(8) NULL NO MUL 0 select,insert,update,references @@ -237,7 +237,7 @@ new_field char(10) latin1_swedish_ci NO new select,insert,update,references show full columns from t2; Field Type Collation Null Key Default Extra Privileges Comment auto int(5) unsigned NULL NO 0 select,insert,update,references -string char(10) latin1_swedish_ci YES new defaul select,insert,update,references +string char(10) latin1_swedish_ci YES newdefault select,insert,update,references tiny tinyint(4) NULL NO 0 select,insert,update,references short smallint(6) NULL NO 0 select,insert,update,references medium mediumint(8) NULL NO 0 select,insert,update,references diff --git a/mysql-test/t/cast.test b/mysql-test/t/cast.test index 94d9590dd5f..e7dd49394ee 100644 --- a/mysql-test/t/cast.test +++ b/mysql-test/t/cast.test @@ -5,6 +5,7 @@ select CAST(1-2 AS UNSIGNED); select CAST(CAST(1-2 AS UNSIGNED) AS SIGNED INTEGER); select CONVERT('-1',UNSIGNED); +select CAST('10 ' as unsigned integer); select cast(-5 as unsigned) | 1, cast(-5 as unsigned) & -1; select cast(-5 as unsigned) -1, cast(-5 as unsigned) + 1; select ~5, cast(~5 as signed); @@ -16,11 +17,22 @@ select cast("A" as binary) = "a", cast(BINARY "a" as CHAR) = "A"; select cast("2001-1-1" as DATE), cast("2001-1-1" as DATETIME); select cast("1:2:3" as TIME); select CONVERT("2004-01-22 21:45:33",DATE); +select 10+'10'; +select 10.0+'10'; +select 10E+0+'10'; + +# The following cast creates warnings + select CONVERT(DATE "2004-01-22 21:45:33" USING latin1); select CONVERT(DATE "2004-01-22 21:45:33",CHAR); select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4)); select CONVERT(DATE "2004-01-22 21:45:33",BINARY(4)); select CAST(DATE "2004-01-22 21:45:33" AS BINARY(4)); +select cast('-10a' as signed integer); +select cast('a10' as unsigned integer); +select 10+'a'; +select 10.0+cast('a' as decimal); +select 10E+0+'a'; # # Character set convertion @@ -41,6 +53,7 @@ select cast(_latin1'abc' AS char(2)) as c3, cast(_latin1'a ' AS char(2)) as c4, cast(_latin1'a' AS char(2)) as c5; +select cast(1000 as CHAR(3)); create table t1 select cast(_latin1'ab' AS char) as c1, diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test index 26b467a398d..1e2cf391221 100644 --- a/mysql-test/t/create.test +++ b/mysql-test/t/create.test @@ -49,14 +49,25 @@ create table `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa create table a (`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` int); # -# Some wrong defaults, so these creates should fail too +# Some wrong defaults, so these creates should fail too (Bug #5902) # --error 1067 -create table test (a datetime default now()); +create table t1 (a datetime default now()); --error 1294 -create table test (a datetime on update now()); +create table t1 (a datetime on update now()); --error 1067 -create table test (a int default 100 auto_increment); +create table t1 (a int default 100 auto_increment); +--error 1067 +create table t1 (a tinyint default 1000); +--error 1067 +create table t1 (a varchar(5) default 'abcdef'); + +create table t1 (a varchar(5) default 'abcde'); +insert into t1 values(); +select * from t1; +--error 1067 +alter table t1 alter column a set default 'abcdef'; +drop table t1; # # test of dummy table names diff --git a/mysql-test/t/func_if.test b/mysql-test/t/func_if.test index 693773b18c8..a2ea26390ca 100644 --- a/mysql-test/t/func_if.test +++ b/mysql-test/t/func_if.test @@ -25,9 +25,10 @@ explain extended select if(u=1,st,binary st) s from t1 where st like "%a%" order # # NULLIF test # -select nullif(u=0, 'test') from t1; -explain extended select nullif(u=0, 'test') from t1; +select nullif(u, 1) from t1; +explain extended select nullif(u, 1) from t1; drop table t1; +select nullif(1,'test'); # # Bug 2629 diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test index 8bf36431587..b3c875f7bf5 100644 --- a/mysql-test/t/func_str.test +++ b/mysql-test/t/func_str.test @@ -3,7 +3,7 @@ # Testing string functions --disable_warnings -drop table if exists t1; +drop table if exists t1,t2; --enable_warnings set names latin1; @@ -244,7 +244,7 @@ select FIELD('b','A' COLLATE latin1_bin,'B'); select FIELD(_latin2'b','A','B'); --error 1270 select FIELD('b',_latin2'A','B'); -select FIELD('b',_latin2'A','B',1); +select FIELD('1',_latin2'3','2',1); select POSITION(_latin1'B' IN _latin1'abcd'); select POSITION(_latin1'B' IN _latin1'abcd' COLLATE latin1_bin); @@ -523,4 +523,3 @@ SELECT t1.id, aes_decrypt(str, 'bar') FROM t1, t2 WHERE t1.id = t2.id ORDER BY t1.id; DROP TABLE t1, t2; - diff --git a/mysql-test/t/ndb_index_unique.test b/mysql-test/t/ndb_index_unique.test index 2fc7c496fea..6714f0233cf 100644 --- a/mysql-test/t/ndb_index_unique.test +++ b/mysql-test/t/ndb_index_unique.test @@ -182,8 +182,8 @@ INSERT INTO t3 VALUES (1,'V1',NULL); CREATE TABLE t4 ( uid bigint(20) unsigned NOT NULL default '0', gid bigint(20) unsigned NOT NULL, - rid bigint(20) unsigned NOT NULL default '-1', - cid bigint(20) unsigned NOT NULL default '-1', + rid bigint(20) unsigned NOT NULL, + cid bigint(20) unsigned NOT NULL, UNIQUE KEY m (uid,gid,rid,cid) ) engine=ndbcluster; INSERT INTO t4 VALUES (1,1,2,4); @@ -209,8 +209,8 @@ CREATE TABLE t7 ( mid bigint(20) unsigned NOT NULL PRIMARY KEY, uid bigint(20) unsigned NOT NULL default '0', gid bigint(20) unsigned NOT NULL, - rid bigint(20) unsigned NOT NULL default '-1', - cid bigint(20) unsigned NOT NULL default '-1', + rid bigint(20) unsigned NOT NULL, + cid bigint(20) unsigned NOT NULL, UNIQUE KEY m (uid,gid,rid,cid) ) engine=ndbcluster; INSERT INTO t7 VALUES(1, 1, 1, 1, 1); diff --git a/mysql-test/t/ps_1general.test b/mysql-test/t/ps_1general.test index 22a4a8bf2c9..4800cb831f7 100644 --- a/mysql-test/t/ps_1general.test +++ b/mysql-test/t/ps_1general.test @@ -500,10 +500,10 @@ select 'a' || 'b' ; prepare stmt4 from ' SET sql_mode="" '; execute stmt4; # check if the sql_mode is not ansi -select 'a' || 'b' ; +select '2' || '3' ; # Will a switch of the sqlmode affect the execution of already prepared # statements ? -prepare stmt5 from ' select ''a'' || ''b'' ' ; +prepare stmt5 from ' select ''2'' || ''3'' ' ; execute stmt5; SET sql_mode=ansi; execute stmt5; diff --git a/mysql-test/t/rpl_session_var.test b/mysql-test/t/rpl_session_var.test index 2379df721b7..a6f4b496a23 100644 --- a/mysql-test/t/rpl_session_var.test +++ b/mysql-test/t/rpl_session_var.test @@ -7,7 +7,7 @@ create table t1(a varchar(100),b int); set @@session.sql_mode=pipes_as_concat; insert into t1 values('My'||'SQL', 1); set @@session.sql_mode=default; -insert into t1 values('My'||'SQL', 2); +insert into t1 values('1'||'2', 2); select * from t1 where b<3 order by a; save_master_pos; connection slave; diff --git a/mysql-test/t/strict.test b/mysql-test/t/strict.test index 96ba9993c49..f98fc30ff48 100644 --- a/mysql-test/t/strict.test +++ b/mysql-test/t/strict.test @@ -977,6 +977,58 @@ select count(*) from t1 where STR_TO_DATE('2004.12.12 10:22:61','%Y.%m.%d %T') I drop table t1; +# +# Check insert with wrong CAST() (Bug #5912) +# + +create table t1 (col1 char(3), col2 integer); +--error 1292 +insert into t1 (col1) values (cast(1000 as char(3))); +--error 1292 +insert into t1 (col1) values (cast(1000E+0 as char(3))); +--error 1292 +insert into t1 (col1) values (cast(1000.0 as char(3))); +--error 1292 +insert into t1 (col2) values (cast('abc' as signed integer)); +--error 1292 +insert into t1 (col2) values (10E+0 + 'a'); +--error 1292 +insert into t1 (col2) values (cast('10a' as unsigned integer)); +insert into t1 (col2) values (cast('10' as unsigned integer)); +insert into t1 (col2) values (cast('10' as signed integer)); +insert into t1 (col2) values (10E+0 + '0 '); +select * from t1; +drop table t1; + +# +# Zero dates using numbers was not checked properly (Bug #5933) +# + +create table t1 (col1 date, col2 datetime, col3 timestamp); +--error 1292 +insert into t1 values (0,0,0); +--error 1292 +insert into t1 values (0.0,0.0,0.0); +set sql_mode='no_zero_date'; +insert into t1 values (0,0,0); +insert into t1 values (0.0,0.0,0.0); +drop table t1; +set sql_mode='traditional'; +create table t1 (col1 date); +insert ignore into t1 values ('0000-00-00'); +--error 1292 +insert into t1 select * from t1; +insert ignore into t1 values ('0000-00-00'); +--error 1292 +insert into t1 select * from t1; +--error 1292 +alter table t1 modify col1 datetime; +alter ignore table t1 modify col1 datetime; +--error 1292 +insert into t1 select * from t1; +select * from t1; +drop table t1; + # # Restore mode # diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index cfcb32f37c8..69b30d2235d 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -46,9 +46,9 @@ SELECT ROW(1,2,3) > (SELECT 1,2,1); SELECT ROW(1,2,3) = (SELECT 1,2,NULL); SELECT (SELECT 1.5,2,'a') = ROW(1.5,2,'a'); SELECT (SELECT 1.5,2,'a') = ROW(1.5,2,'b'); -SELECT (SELECT 1.5,2,'a') = ROW('b',2,'b'); +SELECT (SELECT 1.5,2,'a') = ROW('1.5b',2,'b'); SELECT (SELECT 'b',2,'a') = ROW(1.5,2,'a'); -SELECT (SELECT 1.5,2,'a') = ROW(1.5,'c','a'); +SELECT (SELECT 1.5,2,'a') = ROW(1.5,'2','a'); SELECT (SELECT 1.5,'c','a') = ROW(1.5,2,'a'); -- error 1241 diff --git a/mysql-test/t/type_ranges.test b/mysql-test/t/type_ranges.test index 5f035921064..3bd3502766b 100644 --- a/mysql-test/t/type_ranges.test +++ b/mysql-test/t/type_ranges.test @@ -69,7 +69,7 @@ ALTER TABLE t1 add new_field char(10) default "new" not null, change blob_col new_blob_col varchar(20), change date_field date_field char(10), -alter column string set default "new default", +alter column string set default "newdefault", alter short drop default, DROP INDEX utiny, DROP INDEX ushort, diff --git a/sql/Makefile.am b/sql/Makefile.am index e0ff324b33c..b506d2a767b 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -49,7 +49,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ mysql_priv.h item_geofunc.h sql_bitmap.h \ procedure.h sql_class.h sql_lex.h sql_list.h \ sql_manager.h sql_map.h sql_string.h unireg.h \ - field.h handler.h mysqld_suffix.h \ + sql_error.h field.h handler.h mysqld_suffix.h \ ha_myisammrg.h\ ha_heap.h ha_myisam.h ha_berkeley.h ha_innodb.h \ ha_ndbcluster.h opt_range.h protocol.h \ diff --git a/sql/field.cc b/sql/field.cc index 7850daac8c7..36a703a1b7a 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -3735,6 +3735,13 @@ int Field_timestamp::store(longlong nr) set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, nr, MYSQL_TIMESTAMP_DATETIME, 1); + if (!error && timestamp == 0 && + (table->in_use->variables.sql_mode & MODE_NO_ZERO_DATE)) + { + set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, + WARN_DATA_TRUNCATED, + nr, MYSQL_TIMESTAMP_DATETIME, 1); + } #ifdef WORDS_BIGENDIAN if (table->s->db_low_byte_first) @@ -4360,6 +4367,12 @@ int Field_date::store(double nr) } else tmp=(long) rint(nr); + + /* + We don't need to check for zero dates here as this date type is only + used in .frm tables from very old MySQL versions + */ + #ifdef WORDS_BIGENDIAN if (table->s->db_low_byte_first) { @@ -4388,6 +4401,7 @@ int Field_date::store(longlong nr) } else tmp=(long) nr; + #ifdef WORDS_BIGENDIAN if (table->s->db_low_byte_first) { @@ -4500,6 +4514,7 @@ void Field_date::sql_type(String &res) const res.set_ascii("date", 4); } + /**************************************************************************** ** The new date type ** This is identical to the old date type, but stored on 3 bytes instead of 4 @@ -4532,17 +4547,17 @@ int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs) return error; } + int Field_newdate::store(double nr) { if (nr < 0.0 || nr > 99991231235959.0) { - (void) Field_newdate::store((longlong) -1); + int3store(ptr,(int32) 0); set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, nr, MYSQL_TIMESTAMP_DATE); return 1; } - else - return Field_newdate::store((longlong) rint(nr)); + return Field_newdate::store((longlong) rint(nr)); } @@ -4562,6 +4577,8 @@ int Field_newdate::store(longlong nr) } else { + uint month, day; + tmp=(int32) nr; if (tmp) { @@ -4569,24 +4586,33 @@ int Field_newdate::store(longlong nr) tmp+= (uint32) 20000000L; else if (tmp < 999999L) tmp+= (uint32) 19000000L; + + month= (uint) ((tmp/100) % 100); + day= (uint) (tmp%100); + if (month > 12 || day > 31) + { + tmp=0L; // Don't allow date to change + set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_DATA_OUT_OF_RANGE, nr, + MYSQL_TIMESTAMP_DATE, 1); + error= 1; + } + else + tmp= day + month*32 + (tmp/10000)*16*32; } - uint month= (uint) ((tmp/100) % 100); - uint day= (uint) (tmp%100); - if (month > 12 || day > 31) + else if (table->in_use->variables.sql_mode & MODE_NO_ZERO_DATE) { - tmp=0L; // Don't allow date to change set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, - ER_WARN_DATA_OUT_OF_RANGE, nr, - MYSQL_TIMESTAMP_DATE, 1); + ER_WARN_DATA_OUT_OF_RANGE, + 0, MYSQL_TIMESTAMP_DATE); error= 1; } - else - tmp= day + month*32 + (tmp/10000)*16*32; } - int3store(ptr,(int32) tmp); + int3store(ptr, tmp); return error; } + int Field_newdate::store_time(TIME *ltime,timestamp_type type) { long tmp; @@ -4603,6 +4629,7 @@ int Field_newdate::store_time(TIME *ltime,timestamp_type type) return error; } + bool Field_newdate::send_binary(Protocol *protocol) { TIME tm; @@ -4610,11 +4637,13 @@ bool Field_newdate::send_binary(Protocol *protocol) return protocol->store_date(&tm); } + double Field_newdate::val_real(void) { return (double) Field_newdate::val_int(); } + longlong Field_newdate::val_int(void) { ulong j= uint3korr(ptr); @@ -4622,6 +4651,7 @@ longlong Field_newdate::val_int(void) return (longlong) j; } + String *Field_newdate::val_str(String *val_buffer, String *val_ptr __attribute__((unused))) { @@ -4649,6 +4679,7 @@ String *Field_newdate::val_str(String *val_buffer, return val_buffer; } + bool Field_newdate::get_date(TIME *ltime,uint fuzzydate) { uint32 tmp=(uint32) uint3korr(ptr); @@ -4661,11 +4692,13 @@ bool Field_newdate::get_date(TIME *ltime,uint fuzzydate) 1 : 0); } + bool Field_newdate::get_time(TIME *ltime) { return Field_newdate::get_date(ltime,0); } + int Field_newdate::cmp(const char *a_ptr, const char *b_ptr) { uint32 a,b; @@ -4674,6 +4707,7 @@ int Field_newdate::cmp(const char *a_ptr, const char *b_ptr) return (a < b) ? -1 : (a > b) ? 1 : 0; } + void Field_newdate::sort_string(char *to,uint length __attribute__((unused))) { to[0] = ptr[2]; @@ -4681,6 +4715,7 @@ void Field_newdate::sort_string(char *to,uint length __attribute__((unused))) to[2] = ptr[0]; } + void Field_newdate::sql_type(String &res) const { res.set_ascii("date", 4); @@ -4737,10 +4772,10 @@ int Field_datetime::store(double nr) set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, nr, MYSQL_TIMESTAMP_DATETIME); - nr=0.0; + nr= 0.0; error= 1; } - error |= Field_datetime::store((longlong) rint(nr)); + error|= Field_datetime::store((longlong) rint(nr)); return error; } @@ -4757,6 +4792,13 @@ int Field_datetime::store(longlong nr) set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, initial_nr, MYSQL_TIMESTAMP_DATETIME, 1); + else if (nr == 0 && table->in_use->variables.sql_mode & MODE_NO_ZERO_DATE) + { + set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_DATA_OUT_OF_RANGE, + initial_nr, MYSQL_TIMESTAMP_DATE); + error= 1; + } #ifdef WORDS_BIGENDIAN if (table->s->db_low_byte_first) @@ -7542,7 +7584,37 @@ create_field::create_field(Field *old_field,Field *orig_field) } -/* Warning handling */ +/* + maximum possible display length for blob + + SYNOPSIS + Field_blob::max_length() + + RETURN + length +*/ +uint32 Field_blob::max_length() +{ + switch (packlength) + { + case 1: + return 255; + case 2: + return 65535; + case 3: + return 16777215; + case 4: + return (uint32) 4294967295U; + default: + DBUG_ASSERT(0); // we should never go here + return 0; + } +} + + +/***************************************************************************** + Warning handling +*****************************************************************************/ /* Produce warning or note about data saved into field @@ -7558,18 +7630,20 @@ create_field::create_field(Field *old_field,Field *orig_field) if count_cuted_fields == FIELD_CHECK_IGNORE for current thread. RETURN VALUE - true - if count_cuted_fields == FIELD_CHECK_IGNORE - false - otherwise + 1 if count_cuted_fields == FIELD_CHECK_IGNORE + 0 otherwise */ + bool -Field::set_warning(uint level, uint code, int cuted_increment) +Field::set_warning(MYSQL_ERROR::enum_warning_level level, uint code, + int cuted_increment) { THD *thd= table->in_use; if (thd->count_cuted_fields) { thd->cuted_fields+= cuted_increment; - push_warning_printf(thd, (MYSQL_ERROR::enum_warning_level) level, - code, ER(code), field_name, thd->row_count); + push_warning_printf(thd, level, code, ER(code), field_name, + thd->row_count); return 0; } return 1; @@ -7593,8 +7667,9 @@ Field::set_warning(uint level, uint code, int cuted_increment) fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current thread. */ + void -Field::set_datetime_warning(const uint level, const uint code, +Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code, const char *str, uint str_length, timestamp_type ts_type, int cuted_increment) { @@ -7621,8 +7696,9 @@ Field::set_datetime_warning(const uint level, const uint code, fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current thread. */ + void -Field::set_datetime_warning(const uint level, const uint code, +Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code, longlong nr, timestamp_type ts_type, int cuted_increment) { @@ -7652,8 +7728,9 @@ Field::set_datetime_warning(const uint level, const uint code, fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current thread. */ + void -Field::set_datetime_warning(const uint level, const uint code, +Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code, double nr, timestamp_type ts_type) { if (table->in_use->really_abort_on_warning() || @@ -7666,30 +7743,3 @@ Field::set_datetime_warning(const uint level, const uint code, field_name); } } - -/* - maximum possible display length for blob - - SYNOPSIS - Field_blob::max_length() - - RETURN - length -*/ -uint32 Field_blob::max_length() -{ - switch (packlength) - { - case 1: - return 255; - case 2: - return 65535; - case 3: - return 16777215; - case 4: - return (uint32) 4294967295U; - default: - DBUG_ASSERT(0); // we should never go here - return 0; - } -} diff --git a/sql/field.h b/sql/field.h index 16fa4a58d0c..399992bee64 100644 --- a/sql/field.h +++ b/sql/field.h @@ -279,17 +279,17 @@ public: virtual CHARSET_INFO *sort_charset(void) const { return charset(); } virtual bool has_charset(void) const { return FALSE; } virtual void set_charset(CHARSET_INFO *charset) { } - bool set_warning(unsigned int level, unsigned int code, + bool set_warning(MYSQL_ERROR::enum_warning_level, unsigned int code, int cuted_increment); bool check_int(const char *str, int length, const char *int_end, CHARSET_INFO *cs); - void set_datetime_warning(const uint level, const uint code, + void set_datetime_warning(MYSQL_ERROR::enum_warning_level, uint code, const char *str, uint str_len, timestamp_type ts_type, int cuted_increment); - void set_datetime_warning(const uint level, const uint code, + void set_datetime_warning(MYSQL_ERROR::enum_warning_level, uint code, longlong nr, timestamp_type ts_type, int cuted_increment); - void set_datetime_warning(const uint level, const uint code, + void set_datetime_warning(MYSQL_ERROR::enum_warning_level, const uint code, double nr, timestamp_type ts_type); inline bool check_overflow(int op_result) { diff --git a/sql/field_conv.cc b/sql/field_conv.cc index 57161a7063e..bbdd6619bf3 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -508,8 +508,16 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*) // Check if identical fields if (from->result_type() == STRING_RESULT) { + /* + If we are copying date or datetime's we have to check the dates + if we don't allow 'all' dates. +p */ if (to->real_type() != from->real_type() || - !compatible_db_low_byte_first) + !compatible_db_low_byte_first || + ((to->table->in_use->variables.sql_mode & + (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE | MODE_INVALID_DATES)) && + to->type() == FIELD_TYPE_DATE || + to->type() == FIELD_TYPE_DATETIME)) { if (from->real_type() == FIELD_TYPE_ENUM || from->real_type() == FIELD_TYPE_SET) @@ -590,7 +598,11 @@ void field_conv(Field *to,Field *from) (to->field_length == from->field_length && (((Field_num*)to)->dec == ((Field_num*)from)->dec))) && from->charset() == to->charset() && - to->table->s->db_low_byte_first == from->table->s->db_low_byte_first) + to->table->s->db_low_byte_first == from->table->s->db_low_byte_first && + (!(to->table->in_use->variables.sql_mode & + (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE | MODE_INVALID_DATES)) || + to->type() != FIELD_TYPE_DATE && + to->type() != FIELD_TYPE_DATETIME)) { // Identical fields memcpy(to->ptr,from->ptr,to->pack_length()); return; diff --git a/sql/item.cc b/sql/item.cc index 457aa774352..2d8fb98c670 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -46,7 +46,7 @@ void Hybrid_type_traits::fix_length_and_dec(Item *item, Item *arg) const const Hybrid_type_traits *Hybrid_type_traits::instance() { - const static Hybrid_type_traits real_traits; + static const Hybrid_type_traits real_traits; return &real_traits; } @@ -70,7 +70,7 @@ Hybrid_type_traits::val_str(Hybrid_type *val, String *to, uint8 decimals) const const Hybrid_type_traits_decimal *Hybrid_type_traits_decimal::instance() { - const static Hybrid_type_traits_decimal decimal_traits; + static const Hybrid_type_traits_decimal decimal_traits; return &decimal_traits; } @@ -146,7 +146,7 @@ Hybrid_type_traits_decimal::val_str(Hybrid_type *val, String *to, const Hybrid_type_traits_integer *Hybrid_type_traits_integer::instance() { - const static Hybrid_type_traits_integer integer_traits; + static const Hybrid_type_traits_integer integer_traits; return &integer_traits; } @@ -1455,6 +1455,60 @@ void Item_string::print(String *str) } +inline bool check_if_only_end_space(CHARSET_INFO *cs, char *str, char *end) +{ + return str+ cs->cset->scan(cs, str, end, MY_SEQ_SPACES) == end; +} + + +double Item_string::val_real() +{ + DBUG_ASSERT(fixed == 1); + int error; + char *end, *org_end; + double tmp; + CHARSET_INFO *cs= str_value.charset(); + + org_end= (char*) str_value.ptr() + str_value.length(); + tmp= my_strntod(cs, (char*) str_value.ptr(), str_value.length(), &end, + &error); + if (error || (end != org_end && !check_if_only_end_space(cs, end, org_end))) + { + push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_TRUNCATED_WRONG_VALUE, + ER(ER_TRUNCATED_WRONG_VALUE), "DOUBLE", + str_value.ptr()); + } + return tmp; +} + + +longlong Item_string::val_int() +{ + DBUG_ASSERT(fixed == 1); + int err; + longlong tmp; + char *end= (char*) str_value.ptr()+ str_value.length(); + char *org_end= end; + CHARSET_INFO *cs= str_value.charset(); + + tmp= (*(cs->cset->my_strtoll10))(cs, str_value.ptr(), &end, &err); + /* + TODO: Give error if we wanted a signed integer and we got an unsigned + one + */ + if (err > 0 || + (end != org_end && !check_if_only_end_space(cs, end, org_end))) + { + push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_TRUNCATED_WRONG_VALUE, + ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER", + str_value.ptr()); + } + return tmp; +} + + my_decimal *Item_string::val_decimal(my_decimal *decimal_value) { /* following assert is redundant, because fixed=1 assigned in constructor */ diff --git a/sql/item.h b/sql/item.h index 55c9af356a8..83b10a0940a 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1097,21 +1097,8 @@ public: fixed= 1; } enum Type type() const { return STRING_ITEM; } - double val_real() - { - DBUG_ASSERT(fixed == 1); - int err_not_used; - char *end_not_used; - return my_strntod(str_value.charset(), (char*) str_value.ptr(), - str_value.length(), &end_not_used, &err_not_used); - } - longlong val_int() - { - DBUG_ASSERT(fixed == 1); - int err; - return my_strntoll(str_value.charset(), str_value.ptr(), - str_value.length(), 10, (char**) 0, &err); - } + double val_real(); + longlong val_int(); String *val_str(String*) { DBUG_ASSERT(fixed == 1); diff --git a/sql/item_row.cc b/sql/item_row.cc index 00d849e55de..0c8baa332ca 100644 --- a/sql/item_row.cc +++ b/sql/item_row.cc @@ -73,8 +73,8 @@ bool Item_row::fix_fields(THD *thd, TABLE_LIST *tabl, Item **ref) with_null|= item->null_inside(); else { - item->val_int(); - with_null|= item->null_value; + if (item->is_null()) + with_null|= 1; } } maybe_null|= item->maybe_null; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 3dbc3833f9e..66b64128dab 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -2966,8 +2966,7 @@ bool Item_func_group_concat::setup(THD *thd) DBUG_RETURN(TRUE); if (item->const_item()) { - (void) item->val_int(); - if (item->null_value) + if (item->is_null()) { always_null= 1; DBUG_RETURN(FALSE); diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index c603d41fa2e..1ea20e9d7cc 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -2181,39 +2181,47 @@ String *Item_char_typecast::val_str(String *str) res->set_charset(cast_cs); /* - Cut the tail if cast with length - and the result is longer than cast length, e.g. - CAST('string' AS CHAR(1)) + Cut the tail if cast with length + and the result is longer than cast length, e.g. + CAST('string' AS CHAR(1)) */ if (cast_length >= 0 && (res->length() > (length= (uint32) res->charpos(cast_length)))) { // Safe even if const arg + char char_type[40]; + my_snprintf(char_type, sizeof(char_type), "CHAR(%lu)", length); + if (!res->alloced_length()) { // Don't change const str str_value= *res; // Not malloced string res= &str_value; } + push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_TRUNCATED_WRONG_VALUE, + ER(ER_TRUNCATED_WRONG_VALUE), char_type, + res->c_ptr()); res->length((uint) length); } null_value= 0; return res; } + void Item_char_typecast::fix_length_and_dec() { uint32 char_length; - /* - We always force character set conversion if cast_cs - is a multi-byte character set. It garantees that the - result of CAST is a well-formed string. - For single-byte character sets we allow just to copy - from the argument. A single-byte character sets string - is always well-formed. + /* + We always force character set conversion if cast_cs is a + multi-byte character set. It garantees that the result of CAST is + a well-formed string. For single-byte character sets we allow + just to copy from the argument. A single-byte character sets + string is always well-formed. */ - charset_conversion= (cast_cs->mbmaxlen > 1) || - !my_charset_same(args[0]->collation.collation, cast_cs) && - args[0]->collation.collation != &my_charset_bin && - cast_cs != &my_charset_bin; + charset_conversion= ((cast_cs->mbmaxlen > 1) || + !my_charset_same(args[0]->collation.collation, + cast_cs) && + args[0]->collation.collation != &my_charset_bin && + cast_cs != &my_charset_bin); collation.set(cast_cs, DERIVATION_IMPLICIT); char_length= (cast_length >= 0) ? cast_length : args[0]->max_length/args[0]->collation.collation->mbmaxlen; diff --git a/sql/my_decimal.cc b/sql/my_decimal.cc index 19b6abd7243..b4bbef4a637 100644 --- a/sql/my_decimal.cc +++ b/sql/my_decimal.cc @@ -175,7 +175,7 @@ int str2my_decimal(uint mask, const char *from, uint length, err= string2decimal((char *)from, (decimal_t*) decimal_value, &end); if (end != from_end && !err) { - /* Give warining if there is something other than end space */ + /* Give warning if there is something other than end space */ for ( ; end < from_end; end++) { if (!my_isspace(&my_charset_latin1, *end)) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 7e4c6675e45..a594846933c 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -442,7 +442,6 @@ extern ulong server_id, concurrency; typedef my_bool (*qc_engine_callback)(THD *thd, char *table_key, uint key_length, ulonglong *engine_data); - #include "sql_string.h" #include "sql_list.h" #include "sql_map.h" @@ -450,6 +449,7 @@ typedef my_bool (*qc_engine_callback)(THD *thd, char *table_key, #include "handler.h" #include "parse_file.h" #include "table.h" +#include "sql_error.h" #include "field.h" /* Field definitions */ #include "protocol.h" #include "sql_udf.h" @@ -651,11 +651,6 @@ int prepare_create_field(create_field *sql_field, uint *blob_columns, int *timestamps, int *timestamps_with_niladic, uint table_flags); -int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, - List &fields, - List &keys, uint &db_options, - handler *file, KEY *&key_info_buffer, - uint &key_count, int select_field_count); bool mysql_create_table(THD *thd,const char *db, const char *table_name, HA_CREATE_INFO *create_info, List &fields, List &keys, @@ -830,14 +825,6 @@ void mysql_stmt_get_longdata(THD *thd, char *pos, ulong packet_length); void reset_stmt_for_execute(THD *thd, LEX *lex); void init_stmt_after_parse(THD*, LEX*); -/* sql_error.cc */ -MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level, uint code, - const char *msg); -void push_warning_printf(THD *thd, MYSQL_ERROR::enum_warning_level level, - uint code, const char *format, ...); -void mysql_reset_errors(THD *thd, bool force); -bool mysqld_show_warnings(THD *thd, ulong levels_to_show); - /* sql_handler.cc */ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen); bool mysql_ha_close(THD *thd, TABLE_LIST *tables); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 95de170b99d..e1303585114 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1036,8 +1036,8 @@ void clean_up(bool print_message) (void) my_delete(pidfile_name,MYF(0)); // This may not always exist #endif finish_client_errs(); - const char **errmsgs= my_error_unregister(ER_ERROR_FIRST, ER_ERROR_LAST); - x_free((gptr) errmsgs); /* Free messages */ + my_free((gptr) my_error_unregister(ER_ERROR_FIRST, ER_ERROR_LAST), + MYF(MY_WME | MY_FAE | MY_ALLOW_ZERO_PTR)); DBUG_PRINT("quit", ("Error messages freed")); /* Tell main we are ready */ (void) pthread_mutex_lock(&LOCK_thread_count); diff --git a/sql/sql_class.h b/sql/sql_class.h index 6d6ac810fbf..bd9154f7b01 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -482,27 +482,6 @@ public: }; -class MYSQL_ERROR: public Sql_alloc -{ -public: - enum enum_warning_level - { WARN_LEVEL_NOTE, WARN_LEVEL_WARN, WARN_LEVEL_ERROR, WARN_LEVEL_END}; - - uint code; - enum_warning_level level; - char *msg; - - MYSQL_ERROR(THD *thd, uint code_arg, enum_warning_level level_arg, - const char *msg_arg) - :code(code_arg), level(level_arg) - { - if (msg_arg) - set_msg(thd, msg_arg); - } - void set_msg(THD *thd, const char *msg_arg); -}; - - class delayed_insert; class select_result; diff --git a/sql/sql_error.h b/sql/sql_error.h new file mode 100644 index 00000000000..223b50be744 --- /dev/null +++ b/sql/sql_error.h @@ -0,0 +1,42 @@ +/* Copyright (C) 2000-2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + 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 */ + +class MYSQL_ERROR: public Sql_alloc +{ +public: + enum enum_warning_level + { WARN_LEVEL_NOTE, WARN_LEVEL_WARN, WARN_LEVEL_ERROR, WARN_LEVEL_END}; + + uint code; + enum_warning_level level; + char *msg; + + MYSQL_ERROR(THD *thd, uint code_arg, enum_warning_level level_arg, + const char *msg_arg) + :code(code_arg), level(level_arg) + { + if (msg_arg) + set_msg(thd, msg_arg); + } + void set_msg(THD *thd, const char *msg_arg); +}; + +MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level, + uint code, const char *msg); +void push_warning_printf(THD *thd, MYSQL_ERROR::enum_warning_level level, + uint code, const char *format, ...); +void mysql_reset_errors(THD *thd, bool force); +bool mysqld_show_warnings(THD *thd, ulong levels_to_show); diff --git a/sql/sql_load.cc b/sql/sql_load.cc index a0fed715405..c827bbace3e 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -671,7 +671,7 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, if (field->type() == FIELD_TYPE_TIMESTAMP) ((Field_timestamp*) field)->set_time(); else if (field != table->next_number_field) - field->set_warning((uint) MYSQL_ERROR::WARN_LEVEL_WARN, + field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_NULL_TO_NOTNULL, 1); } } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ccd3277d785..e051788ad39 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1910,10 +1910,11 @@ bool dispatch_command(enum enum_server_command command, THD *thd, #endif ulong uptime = (ulong) (thd->start_time - start_time); sprintf((char*) buff, - "Uptime: %ld Threads: %d Questions: %lu Slow queries: %ld Opens: %ld Flush tables: %ld Open tables: %u Queries per second avg: %.3f", + "Uptime: %ld Threads: %d Questions: %lu Slow queries: %lu Opens: %ld Flush tables: %ld Open tables: %u Queries per second avg: %.3f", uptime, - (int) thread_count,thd->query_id,thd->status_var.long_query_count, - thd->status_var.opened_tables,refresh_version, cached_tables(), + (int) thread_count, (ulong) thd->query_id, + (ulong) thd->status_var.long_query_count, + thd->status_var.opened_tables, refresh_version, cached_tables(), uptime ? (float)thd->query_id/(float)uptime : 0); #ifdef SAFEMALLOC if (sf_malloc_cur_memory) // Using SAFEMALLOC diff --git a/sql/sql_table.cc b/sql/sql_table.cc index b125eeaf03a..7f5c3a52017 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -620,11 +620,12 @@ int prepare_create_field(create_field *sql_field, -1 error */ -int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, - List &fields, - List &keys, bool tmp_table, uint &db_options, - handler *file, KEY *&key_info_buffer, - uint *key_count, int select_field_count) +static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, + List *fields, + List *keys, bool tmp_table, + uint *db_options, + handler *file, KEY **key_info_buffer, + uint *key_count, int select_field_count) { const char *key_name; create_field *sql_field,*dup_field; @@ -636,11 +637,11 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, int timestamps= 0, timestamps_with_niladic= 0; int field_no,dup_no; int select_field_pos,auto_increment=0; - List_iterator it(fields),it2(fields); + List_iterator it(*fields),it2(*fields); uint total_uneven_bit_length= 0; DBUG_ENTER("mysql_prepare_table"); - select_field_pos=fields.elements - select_field_count; + select_field_pos= fields->elements - select_field_count; null_fields=blob_columns=0; create_info->varchar= 0; @@ -845,11 +846,11 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, if ((sql_field->flags & BLOB_FLAG) || sql_field->sql_type == MYSQL_TYPE_VARCHAR && create_info->row_type != ROW_TYPE_FIXED) - db_options|= HA_OPTION_PACK_RECORD; + (*db_options)|= HA_OPTION_PACK_RECORD; it2.rewind(); } /* If fixed row records, we need one bit to check for deleted rows */ - if (!(db_options & HA_OPTION_PACK_RECORD)) + if (!((*db_options) & HA_OPTION_PACK_RECORD)) null_fields++; pos= (null_fields + total_uneven_bit_length + 7) / 8; @@ -897,7 +898,7 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, /* Create keys */ - List_iterator key_iterator(keys), key_iterator2(keys); + List_iterator key_iterator(*keys), key_iterator2(*keys); uint key_parts=0, fk_key_count=0; bool primary_key=0,unique_key=0; Key *key, *key2; @@ -984,9 +985,9 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, DBUG_RETURN(-1); } - key_info_buffer=key_info=(KEY*) sql_calloc(sizeof(KEY)* *key_count); + (*key_info_buffer) = key_info= (KEY*) sql_calloc(sizeof(KEY)* *key_count); key_part_info=(KEY_PART_INFO*) sql_calloc(sizeof(KEY_PART_INFO)*key_parts); - if (!key_info_buffer || ! key_part_info) + if (!*key_info_buffer || ! key_part_info) DBUG_RETURN(-1); // Out of memory key_iterator.rewind(); @@ -1260,7 +1261,7 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, } key_part_info->length=(uint16) length; /* Use packed keys for long strings on the first column */ - if (!(db_options & HA_OPTION_NO_PACK_KEYS) && + if (!((*db_options) & HA_OPTION_NO_PACK_KEYS) && (length >= KEY_DEFAULT_PACK_LENGTH && (sql_field->sql_type == MYSQL_TYPE_STRING || sql_field->sql_type == MYSQL_TYPE_VARCHAR || @@ -1291,8 +1292,8 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, } else if (!(key_name = key->name)) key_name=make_unique_key_name(sql_field->field_name, - key_info_buffer,key_info); - if (check_if_keyname_exists(key_name,key_info_buffer,key_info)) + *key_info_buffer, key_info); + if (check_if_keyname_exists(key_name, *key_info_buffer, key_info)) { my_error(ER_DUP_KEYNAME, MYF(0), key_name); DBUG_RETURN(-1); @@ -1327,7 +1328,7 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, DBUG_RETURN(-1); } /* Sort keys in optimized order */ - qsort((gptr) key_info_buffer, *key_count, sizeof(KEY), + qsort((gptr) *key_info_buffer, *key_count, sizeof(KEY), (qsort_cmp) sort_keys); DBUG_RETURN(0); @@ -1393,7 +1394,7 @@ bool mysql_create_table(THD *thd,const char *db, const char *table_name, ha_get_storage_engine(new_db_type), table_name); } - db_options=create_info->table_options; + db_options= create_info->table_options; if (create_info->row_type == ROW_TYPE_DYNAMIC) db_options|=HA_OPTION_PACK_RECORD; alias= table_case_name(create_info, table_name); @@ -1432,9 +1433,9 @@ bool mysql_create_table(THD *thd,const char *db, const char *table_name, create_info->default_table_charset= db_info.default_table_charset; } - if (mysql_prepare_table(thd, create_info, fields, - keys, internal_tmp_table, db_options, file, - key_info_buffer, &key_count, + if (mysql_prepare_table(thd, create_info, &fields, + &keys, internal_tmp_table, &db_options, file, + &key_info_buffer, &key_count, select_field_count)) DBUG_RETURN(TRUE); @@ -2706,9 +2707,9 @@ int mysql_create_indexes(THD *thd, TABLE_LIST *table_list, List &keys) create_info.db_type=DB_TYPE_DEFAULT; create_info.default_table_charset= thd->variables.collation_database; db_options= 0; - if (mysql_prepare_table(thd, &create_info, fields, - keys, /*tmp_table*/ 0, db_options, table->file, - key_info_buffer, key_count, + if (mysql_prepare_table(thd, &create_info, &fields, + &keys, /*tmp_table*/ 0, &db_options, table->file, + &key_info_buffer, key_count, /*select_field_count*/ 0)) DBUG_RETURN(-1); @@ -2839,9 +2840,9 @@ int mysql_drop_indexes(THD *thd, TABLE_LIST *table_list, { db_options= 0; if (table->file->drop_index(table, key_numbers, key_count)|| - mysql_prepare_table(thd, &create_info, fields, - keys, /*tmp_table*/ 0, db_options, table->file, - key_info_buffer, key_count, + mysql_prepare_table(thd, &create_info, &fields, + &keys, /*tmp_table*/ 0, &db_options, table->file, + &key_info_buffer, key_count, /*select_field_count*/ 0)|| (snprintf(path, sizeof(path), "%s/%s/%s%s", mysql_data_home, table_list->db, (lower_case_table_names == 2)? @@ -3666,6 +3667,13 @@ copy_data_between_tables(TABLE *from,TABLE *to, if (to->file->external_lock(thd, F_WRLCK)) DBUG_RETURN(-1); + + /* We can abort alter table for any table type */ + thd->no_trans_update= 0; + thd->abort_on_warning= !ignore && test(thd->variables.sql_mode & + (MODE_STRICT_TRANS_TABLES | + MODE_STRICT_ALL_TABLES)); + from->file->info(HA_STATUS_VARIABLE); to->file->start_bulk_insert(from->file->records); @@ -3745,6 +3753,7 @@ copy_data_between_tables(TABLE *from,TABLE *to, else to->next_number_field->reset(); } + for (Copy_field *copy_ptr=copy ; copy_ptr != copy_end ; copy_ptr++) { copy_ptr->do_copy(copy_ptr); @@ -3789,6 +3798,7 @@ copy_data_between_tables(TABLE *from,TABLE *to, err: thd->variables.sql_mode= save_sql_mode; + thd->abort_on_warning= 0; free_io_cache(from); *copied= found_count; *deleted=delete_count; diff --git a/sql/time.cc b/sql/time.cc index f1d21915c23..52a2ae13892 100644 --- a/sql/time.cc +++ b/sql/time.cc @@ -712,9 +712,9 @@ void make_truncated_value_warning(THD *thd, const char *str_val, else cs->cset->snprintf(cs, warn_buff, sizeof(warn_buff), ER(ER_TRUNCATED_WRONG_VALUE), - type_str, str.ptr()); - push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_TRUNCATED_WRONG_VALUE, warn_buff); + type_str, str.c_ptr()); + push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_TRUNCATED_WRONG_VALUE, warn_buff); } diff --git a/sql/unireg.cc b/sql/unireg.cc index 3e85767dc86..57e2c1029f1 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -40,7 +40,7 @@ static bool pack_header(uchar *forminfo,enum db_type table_type, static uint get_interval_id(uint *int_count,List &create_fields, create_field *last_field); static bool pack_fields(File file, List &create_fields); -static bool make_empty_rec(int file, enum db_type table_type, +static bool make_empty_rec(THD *thd, int file, enum db_type table_type, uint table_options, List &create_fields, uint reclength,uint null_fields); @@ -134,7 +134,7 @@ bool mysql_create_frm(THD *thd, my_string file_name, VOID(my_seek(file, (ulong) uint2korr(fileinfo+6)+ (ulong) key_buff_length, MY_SEEK_SET,MYF(0))); - if (make_empty_rec(file,create_info->db_type,create_info->table_options, + if (make_empty_rec(thd,file,create_info->db_type,create_info->table_options, create_fields,reclength,null_fields)) goto err; @@ -640,7 +640,7 @@ static bool pack_fields(File file,List &create_fields) /* save an empty record on start of formfile */ -static bool make_empty_rec(File file,enum db_type table_type, +static bool make_empty_rec(THD *thd, File file,enum db_type table_type, uint table_options, List &create_fields, uint reclength, uint null_fields) @@ -652,6 +652,7 @@ static bool make_empty_rec(File file,enum db_type table_type, TABLE table; create_field *field; handler *handler; + enum_check_fields old_count_cuted_fields= thd->count_cuted_fields; DBUG_ENTER("make_empty_rec"); /* We need a table to generate columns for default values */ @@ -666,7 +667,7 @@ static bool make_empty_rec(File file,enum db_type table_type, DBUG_RETURN(1); } - table.in_use= current_thd; + table.in_use= thd; table.s->db_low_byte_first= handler->low_byte_first(); table.s->blob_ptr_size= portable_sizeof_char_ptr; @@ -681,6 +682,7 @@ static bool make_empty_rec(File file,enum db_type table_type, null_pos=buff; List_iterator it(create_fields); + thd->count_cuted_fields= CHECK_FIELD_WARN; // To find wrong default values while ((field=it++)) { Field *regfield=make_field((char*) buff+field->offset,field->length, @@ -709,7 +711,14 @@ static bool make_empty_rec(File file,enum db_type table_type, if (field->def && (regfield->real_type() != FIELD_TYPE_YEAR || field->def->val_int() != 0)) - (void) field->def->save_in_field(regfield, 1); + { + if (field->def->save_in_field(regfield, 1)) + { + my_error(ER_INVALID_DEFAULT, MYF(0), regfield->field_name); + error= 1; + goto err; + } + } else if (regfield->real_type() == FIELD_TYPE_ENUM && (field->flags & NOT_NULL_FLAG)) { @@ -728,7 +737,10 @@ static bool make_empty_rec(File file,enum db_type table_type, /* Fill not used startpos */ bfill((byte*) buff+null_length,firstpos-null_length,255); error=(int) my_write(file,(byte*) buff,(uint) reclength,MYF_RW); + +err: my_free((gptr) buff,MYF(MY_FAE)); delete handler; + thd->count_cuted_fields= old_count_cuted_fields; DBUG_RETURN(error); } /* make_empty_rec */ From cf7c0e43cba237fea18271ebf1ec4d3300ee54ca Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Fri, 1 Apr 2005 17:59:46 +0200 Subject: [PATCH 025/204] Fix for bug#9435: TIMESTAMP columns don't update --- mysql-test/r/ndb_types.result | 44 +++++++++++++++++++++++++++++++---- mysql-test/t/ndb_types.test | 42 +++++++++++++++++++++++++++++---- sql/ha_ndbcluster.cc | 4 ++++ 3 files changed, 81 insertions(+), 9 deletions(-) diff --git a/mysql-test/r/ndb_types.result b/mysql-test/r/ndb_types.result index 9a45b77149b..5afa9c57e38 100644 --- a/mysql-test/r/ndb_types.result +++ b/mysql-test/r/ndb_types.result @@ -2,6 +2,9 @@ DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( auto int(5) unsigned NOT NULL auto_increment, string char(10) default "hello", +vstring varchar(10) default "hello", +bin binary(7), +vbin varbinary(7), tiny tinyint(4) DEFAULT '0' NOT NULL , short smallint(6) DEFAULT '1' NOT NULL , medium mediumint(8) DEFAULT '0' NOT NULL, @@ -14,12 +17,13 @@ ushort smallint(5) unsigned zerofill DEFAULT '00000' NOT NULL, umedium mediumint(8) unsigned DEFAULT '0' NOT NULL, ulong int(11) unsigned DEFAULT '0' NOT NULL, ulonglong bigint(13) unsigned DEFAULT '0' NOT NULL, -time_stamp timestamp, -date_field date, -time_field time, -date_time datetime, options enum('one','two','tree') not null, flags set('one','two','tree') not null, +date_field date, +year_field year, +time_field time, +date_time datetime, +time_stamp timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY KEY (auto), KEY (utiny), KEY (tiny), @@ -33,4 +37,36 @@ KEY (ulong), KEY (ulonglong,ulong), KEY (options,flags) ); +set @now = now(); +insert into t1 +(string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, +real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, +options,flags,date_field,year_field,time_field,date_time) +values +("aaaa","aaaa",0xAAAA,0xAAAA,-1,-1,-1,-1,-1,1.1,1.1,1,1,1,1,1, +'one','one', '1901-01-01','1901','01:01:01','1901-01-01 01:01:01'); +select auto,string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, +real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, +options,flags,date_field,year_field,time_field,date_time +from t1; +auto string vstring bin vbin tiny short medium long_int longlong real_float real_double utiny ushort umedium ulong ulonglong options flags date_field year_field time_field date_time +1 aaaa aaaa -1 -1 -1 -1 -1 1.1 1.1000 1 00001 1 1 1 one one 1901-01-01 1901 01:01:01 1901-01-01 01:01:01 +select time_stamp>@now from t1; +time_stamp>@now +1 +set @now = now(); +update t1 set string="bbbb",vstring="bbbb",bin=0xBBBB,vbin=0xBBBB, +tiny=-2,short=-2,medium=-2,long_int=-2,longlong=-2,real_float=2.2, +real_double=2.2,utiny=2,ushort=2,umedium=2,ulong=2,ulonglong=2, +options='one',flags='one', date_field='1902-02-02',year_field='1902', +time_field='02:02:02',date_time='1902-02-02 02:02:02' where auto=1; +select auto,string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, +real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, +options,flags,date_field,year_field,time_field,date_time +from t1; +auto string vstring bin vbin tiny short medium long_int longlong real_float real_double utiny ushort umedium ulong ulonglong options flags date_field year_field time_field date_time +1 bbbb bbbb -2 -2 -2 -2 -2 2.2 2.2000 2 00002 2 2 2 one one 1902-02-02 1902 02:02:02 1902-02-02 02:02:02 +select time_stamp>@now from t1; +time_stamp>@now +1 drop table t1; diff --git a/mysql-test/t/ndb_types.test b/mysql-test/t/ndb_types.test index d9f50c8b3fc..d66718ca4e4 100644 --- a/mysql-test/t/ndb_types.test +++ b/mysql-test/t/ndb_types.test @@ -7,10 +7,12 @@ DROP TABLE IF EXISTS t1; # # Test creation of different column types in NDB # - CREATE TABLE t1 ( auto int(5) unsigned NOT NULL auto_increment, string char(10) default "hello", + vstring varchar(10) default "hello", + bin binary(7), + vbin varbinary(7), tiny tinyint(4) DEFAULT '0' NOT NULL , short smallint(6) DEFAULT '1' NOT NULL , medium mediumint(8) DEFAULT '0' NOT NULL, @@ -23,12 +25,13 @@ CREATE TABLE t1 ( umedium mediumint(8) unsigned DEFAULT '0' NOT NULL, ulong int(11) unsigned DEFAULT '0' NOT NULL, ulonglong bigint(13) unsigned DEFAULT '0' NOT NULL, - time_stamp timestamp, - date_field date, - time_field time, - date_time datetime, options enum('one','two','tree') not null, flags set('one','two','tree') not null, + date_field date, + year_field year, + time_field time, + date_time datetime, + time_stamp timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY KEY (auto), KEY (utiny), KEY (tiny), @@ -43,5 +46,34 @@ CREATE TABLE t1 ( KEY (options,flags) ); +set @now = now(); +sleep 1; +insert into t1 +(string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, + real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, + options,flags,date_field,year_field,time_field,date_time) +values +("aaaa","aaaa",0xAAAA,0xAAAA,-1,-1,-1,-1,-1,1.1,1.1,1,1,1,1,1, + 'one','one', '1901-01-01','1901','01:01:01','1901-01-01 01:01:01'); + +select auto,string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, + real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, + options,flags,date_field,year_field,time_field,date_time +from t1; +select time_stamp>@now from t1; + +set @now = now(); +sleep 1; +update t1 set string="bbbb",vstring="bbbb",bin=0xBBBB,vbin=0xBBBB, +tiny=-2,short=-2,medium=-2,long_int=-2,longlong=-2,real_float=2.2, +real_double=2.2,utiny=2,ushort=2,umedium=2,ulong=2,ulonglong=2, +options='one',flags='one', date_field='1902-02-02',year_field='1902', +time_field='02:02:02',date_time='1902-02-02 02:02:02' where auto=1; + +select auto,string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, + real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, + options,flags,date_field,year_field,time_field,date_time +from t1; +select time_stamp>@now from t1; drop table t1; diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 92d5e6119aa..7025ac2cd1a 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -1953,7 +1953,11 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data) statistic_increment(ha_update_count,&LOCK_status); if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE) + { table->timestamp_field->set_time(); + // Set query_id so that field is really updated + table->timestamp_field->query_id= thd->query_id; + } /* Check for update of primary key for special handling */ if ((table->primary_key != MAX_KEY) && From 7f52a616f453219f7abfc3e13bbde748863068d7 Mon Sep 17 00:00:00 2001 From: "joerg@mysql.com" <> Date: Fri, 1 Apr 2005 18:38:19 +0200 Subject: [PATCH 026/204] Last minor things to finish MySQL 4.1.10a: - some wordings, - RPM packaging improvements. --- configure.in | 2 +- scripts/mysql_create_system_tables.sh | 4 +--- sql/mysqld.cc | 4 ++-- sql/sql_udf.cc | 12 ++++++------ support-files/mysql.spec.sh | 10 ++++++++-- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/configure.in b/configure.in index 665029accb3..314283f6012 100644 --- a/configure.in +++ b/configure.in @@ -5,7 +5,7 @@ AC_INIT(sql/mysqld.cc) AC_CANONICAL_SYSTEM # The Docs Makefile.am parses this line! # remember to also change ndb version below and update version.c in ndb -AM_INIT_AUTOMAKE(mysql, 4.1.10) +AM_INIT_AUTOMAKE(mysql, 4.1.10a) AM_CONFIG_HEADER(config.h) PROTOCOL_VERSION=10 diff --git a/scripts/mysql_create_system_tables.sh b/scripts/mysql_create_system_tables.sh index f524b322388..83fdc0639ce 100644 --- a/scripts/mysql_create_system_tables.sh +++ b/scripts/mysql_create_system_tables.sh @@ -163,9 +163,7 @@ then INSERT INTO user (host,user) values ('localhost','');" else i_u="$i_u - INSERT INTO user VALUES ('%','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0); - INSERT INTO user VALUES ('localhost','','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0); - INSERT INTO user VALUES ('%','','','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','','','','',0,0,0);" + INSERT INTO user VALUES ('localhost','','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);" fi fi fi diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 988482d00d2..1164506a0a7 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -284,12 +284,12 @@ my_bool opt_local_infile, opt_external_locking, opt_slave_compressed_protocol; my_bool opt_safe_user_create = 0, opt_no_mix_types = 0; my_bool opt_show_slave_auth_info, opt_sql_bin_update = 0; my_bool opt_log_slave_updates= 0; +my_bool opt_allow_suspicious_udfs; my_bool opt_console= 0, opt_bdb, opt_innodb, opt_isam, opt_ndbcluster; #ifdef HAVE_NDBCLUSTER_DB const char *opt_ndbcluster_connectstring= 0; my_bool opt_ndb_shm, opt_ndb_optimized_node_selection; #endif -my_bool opt_allow_suspicious_udfs; my_bool opt_readonly, use_temp_pool, relay_log_purge; my_bool opt_sync_bdb_logs, opt_sync_frm; my_bool opt_secure_auth= 0; @@ -4143,7 +4143,7 @@ struct my_option my_long_options[] = {"ansi", 'a', "Use ANSI SQL syntax instead of MySQL syntax.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"allow-suspicious-udfs", OPT_ALLOW_SUSPICIOUS_UDFS, - "Allows use of UDFs consisting of only one symbol xxx() " + "Allows to use UDFs consisting of only one symbol xxx() " "without corresponding xxx_init() or xxx_deinit(). That also means " "that one can load any function from any library, for example exit() " "from libc.so", diff --git a/sql/sql_udf.cc b/sql/sql_udf.cc index d20fca86323..05df069d69a 100644 --- a/sql/sql_udf.cc +++ b/sql/sql_udf.cc @@ -74,7 +74,7 @@ static HASH udf_hash; static rw_lock_t THR_LOCK_udf; -static udf_func *add_udf(char *name, Item_result ret, +static udf_func *add_udf(LEX_STRING *name, Item_result ret, char *dl, Item_udftype typ); static void del_udf(udf_func *udf); static void *find_udf_dl(const char *dl); @@ -90,8 +90,8 @@ static char *init_syms(udf_func *tmp, char *nm) if (tmp->type == UDFTYPE_AGGREGATE) { - (void)strmov(end, "_reset"); - if (!((tmp->func_reset= dlsym(tmp->dlhandle, nm)))) + (void)strmov(end, "_clear"); + if (!((tmp->func_clear= dlsym(tmp->dlhandle, nm)))) return nm; (void)strmov(end, "_add"); if (!((tmp->func_add= dlsym(tmp->dlhandle, nm)))) @@ -200,8 +200,9 @@ void udf_init() continue; } - if (!(tmp = add_udf(&name,(Item_result) table->field[1]->val_int(), - dl_name, udftype))) + + if (!(tmp= add_udf(&name,(Item_result) table->field[1]->val_int(), + dl_name, udftype))) { sql_print_error("Can't alloc memory for udf function: '%.64s'", name.str); continue; @@ -445,7 +446,6 @@ int mysql_create_function(THD *thd,udf_func *udf) goto err; } } - udf->name.str=strdup_root(&mem,udf->name.str); udf->dl=strdup_root(&mem,udf->dl); if (!(u_d=add_udf(&udf->name,udf->returns,udf->dl,udf->type))) diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh index b06ba462b26..07c8e6a46fb 100644 --- a/support-files/mysql.spec.sh +++ b/support-files/mysql.spec.sh @@ -276,7 +276,6 @@ sh -c "PATH=\"${MYSQL_BUILD_PATH:-$PATH}\" \ --includedir=%{_includedir} \ --mandir=%{_mandir} \ --enable-thread-safe-client \ - --with-comment=\"Official MySQL RPM\" \ --with-readline ; # Add this for more debugging support # --with-debug @@ -333,6 +332,7 @@ BuildMySQL "--enable-shared \ --with-csv-storage-engine \ --with-example-storage-engine \ --with-embedded-server \ + --with-comment=\"MySQL Community Edition - Max (GPL)\" \ --with-server-suffix='-Max'" # Save everything for debug @@ -379,6 +379,7 @@ BuildMySQL "--disable-shared \ --with-client-ldflags='-all-static' \ $USE_OTHER_LIBC_DIR \ %endif + --with-comment=\"MySQL Community Edition - Standard (GPL)\" \ --with-server-suffix='%{server_suffix}' \ --without-embedded-server \ --without-berkeley-db \ @@ -694,7 +695,12 @@ fi # itself - note that they must be ordered by date (important when # merging BK trees) %changelog -* Monday Feb 7 2005 Tomas Ulin +* Mon Feb 14 2005 Lenz Grimmer + +* Fixed the compilation comments and moved them into the separate build sections + for Max and Standard + +* Mon Feb 7 2005 Tomas Ulin - enabled the "Ndbcluster" storage engine for the max binary - added extra make install in ndb subdir after Max build to get ndb binaries From 1ebcd90364323e61fa20195e6a4da72471218c1a Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Fri, 1 Apr 2005 09:13:20 -0800 Subject: [PATCH 027/204] Fix the new ps_grant test to clean itself up properly. --- mysql-test/r/ps_grant.result | 1 - mysql-test/t/ps_grant.test | 1 - 2 files changed, 2 deletions(-) diff --git a/mysql-test/r/ps_grant.result b/mysql-test/r/ps_grant.result index 81de74f245c..4c60bb03165 100644 --- a/mysql-test/r/ps_grant.result +++ b/mysql-test/r/ps_grant.result @@ -78,5 +78,4 @@ drop user second_user@localhost ; commit ; show grants for second_user@localhost ; ERROR 42000: There is no such grant defined for user 'second_user' on host 'localhost' -drop table t1,t9 ; drop database mysqltest; diff --git a/mysql-test/t/ps_grant.test b/mysql-test/t/ps_grant.test index 283c06c9a8c..06613072824 100644 --- a/mysql-test/t/ps_grant.test +++ b/mysql-test/t/ps_grant.test @@ -114,7 +114,6 @@ commit ; --error 1141 show grants for second_user@localhost ; -drop table t1,t9 ; drop database mysqltest; From 9f7ad11e34fc57f494fc690462d49f4501f918d2 Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Fri, 1 Apr 2005 22:14:30 +0200 Subject: [PATCH 028/204] Added more types --- mysql-test/r/ndb_types.result | 29 ++++++++++++++++------------- mysql-test/t/ndb_types.test | 21 ++++++++++++--------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/mysql-test/r/ndb_types.result b/mysql-test/r/ndb_types.result index 5afa9c57e38..37ce7732f65 100644 --- a/mysql-test/r/ndb_types.result +++ b/mysql-test/r/ndb_types.result @@ -12,11 +12,13 @@ long_int int(11) DEFAULT '0' NOT NULL, longlong bigint(13) DEFAULT '0' NOT NULL, real_float float(13,1) DEFAULT 0.0 NOT NULL, real_double double(16,4), +real_decimal decimal(16,4), utiny tinyint(3) unsigned DEFAULT '0' NOT NULL, ushort smallint(5) unsigned zerofill DEFAULT '00000' NOT NULL, umedium mediumint(8) unsigned DEFAULT '0' NOT NULL, ulong int(11) unsigned DEFAULT '0' NOT NULL, ulonglong bigint(13) unsigned DEFAULT '0' NOT NULL, +bits bit(3), options enum('one','two','tree') not null, flags set('one','two','tree') not null, date_field date, @@ -40,32 +42,33 @@ KEY (options,flags) set @now = now(); insert into t1 (string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, -real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, -options,flags,date_field,year_field,time_field,date_time) +real_float,real_double, real_decimal,utiny, ushort, umedium,ulong,ulonglong, +bits,options,flags,date_field,year_field,time_field,date_time) values -("aaaa","aaaa",0xAAAA,0xAAAA,-1,-1,-1,-1,-1,1.1,1.1,1,1,1,1,1, -'one','one', '1901-01-01','1901','01:01:01','1901-01-01 01:01:01'); +("aaaa","aaaa",0xAAAA,0xAAAA,-1,-1,-1,-1,-1,1.1,1.1,1.1,1,1,1,1,1, +b'001','one','one', '1901-01-01','1901','01:01:01','1901-01-01 01:01:01'); select auto,string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, -real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, -options,flags,date_field,year_field,time_field,date_time +real_float,real_double,real_decimal,utiny,ushort,umedium,ulong,ulonglong, +bits,options,flags,date_field,year_field,time_field,date_time from t1; -auto string vstring bin vbin tiny short medium long_int longlong real_float real_double utiny ushort umedium ulong ulonglong options flags date_field year_field time_field date_time -1 aaaa aaaa -1 -1 -1 -1 -1 1.1 1.1000 1 00001 1 1 1 one one 1901-01-01 1901 01:01:01 1901-01-01 01:01:01 +auto string vstring bin vbin tiny short medium long_int longlong real_float real_double real_decimal utiny ushort umedium ulong ulonglong bits options flags date_field year_field time_field date_time +1 aaaa aaaa -1 -1 -1 -1 -1 1.1 1.1000 1.1000 1 00001 1 1 1  one one 1901-01-01 1901 01:01:01 1901-01-01 01:01:01 select time_stamp>@now from t1; time_stamp>@now 1 set @now = now(); update t1 set string="bbbb",vstring="bbbb",bin=0xBBBB,vbin=0xBBBB, tiny=-2,short=-2,medium=-2,long_int=-2,longlong=-2,real_float=2.2, -real_double=2.2,utiny=2,ushort=2,umedium=2,ulong=2,ulonglong=2, +real_double=2.2,real_decimal=2.2,utiny=2,ushort=2,umedium=2,ulong=2, +ulonglong=2, bits=b'010', options='one',flags='one', date_field='1902-02-02',year_field='1902', time_field='02:02:02',date_time='1902-02-02 02:02:02' where auto=1; select auto,string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, -real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, -options,flags,date_field,year_field,time_field,date_time +real_float,real_double,real_decimal,utiny,ushort,umedium,ulong,ulonglong, +bits,options,flags,date_field,year_field,time_field,date_time from t1; -auto string vstring bin vbin tiny short medium long_int longlong real_float real_double utiny ushort umedium ulong ulonglong options flags date_field year_field time_field date_time -1 bbbb bbbb -2 -2 -2 -2 -2 2.2 2.2000 2 00002 2 2 2 one one 1902-02-02 1902 02:02:02 1902-02-02 02:02:02 +auto string vstring bin vbin tiny short medium long_int longlong real_float real_double real_decimal utiny ushort umedium ulong ulonglong bits options flags date_field year_field time_field date_time +1 bbbb bbbb -2 -2 -2 -2 -2 2.2 2.2000 2.2000 2 00002 2 2 2  one one 1902-02-02 1902 02:02:02 1902-02-02 02:02:02 select time_stamp>@now from t1; time_stamp>@now 1 diff --git a/mysql-test/t/ndb_types.test b/mysql-test/t/ndb_types.test index d66718ca4e4..823ca942d57 100644 --- a/mysql-test/t/ndb_types.test +++ b/mysql-test/t/ndb_types.test @@ -20,11 +20,13 @@ CREATE TABLE t1 ( longlong bigint(13) DEFAULT '0' NOT NULL, real_float float(13,1) DEFAULT 0.0 NOT NULL, real_double double(16,4), + real_decimal decimal(16,4), utiny tinyint(3) unsigned DEFAULT '0' NOT NULL, ushort smallint(5) unsigned zerofill DEFAULT '00000' NOT NULL, umedium mediumint(8) unsigned DEFAULT '0' NOT NULL, ulong int(11) unsigned DEFAULT '0' NOT NULL, ulonglong bigint(13) unsigned DEFAULT '0' NOT NULL, + bits bit(3), options enum('one','two','tree') not null, flags set('one','two','tree') not null, date_field date, @@ -50,15 +52,15 @@ set @now = now(); sleep 1; insert into t1 (string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, - real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, - options,flags,date_field,year_field,time_field,date_time) + real_float,real_double, real_decimal,utiny, ushort, umedium,ulong,ulonglong, + bits,options,flags,date_field,year_field,time_field,date_time) values -("aaaa","aaaa",0xAAAA,0xAAAA,-1,-1,-1,-1,-1,1.1,1.1,1,1,1,1,1, - 'one','one', '1901-01-01','1901','01:01:01','1901-01-01 01:01:01'); +("aaaa","aaaa",0xAAAA,0xAAAA,-1,-1,-1,-1,-1,1.1,1.1,1.1,1,1,1,1,1, + b'001','one','one', '1901-01-01','1901','01:01:01','1901-01-01 01:01:01'); select auto,string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, - real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, - options,flags,date_field,year_field,time_field,date_time + real_float,real_double,real_decimal,utiny,ushort,umedium,ulong,ulonglong, + bits,options,flags,date_field,year_field,time_field,date_time from t1; select time_stamp>@now from t1; @@ -66,13 +68,14 @@ set @now = now(); sleep 1; update t1 set string="bbbb",vstring="bbbb",bin=0xBBBB,vbin=0xBBBB, tiny=-2,short=-2,medium=-2,long_int=-2,longlong=-2,real_float=2.2, -real_double=2.2,utiny=2,ushort=2,umedium=2,ulong=2,ulonglong=2, +real_double=2.2,real_decimal=2.2,utiny=2,ushort=2,umedium=2,ulong=2, +ulonglong=2, bits=b'010', options='one',flags='one', date_field='1902-02-02',year_field='1902', time_field='02:02:02',date_time='1902-02-02 02:02:02' where auto=1; select auto,string,vstring,bin,vbin,tiny,short,medium,long_int,longlong, - real_float,real_double, utiny, ushort, umedium,ulong,ulonglong, - options,flags,date_field,year_field,time_field,date_time + real_float,real_double,real_decimal,utiny,ushort,umedium,ulong,ulonglong, + bits,options,flags,date_field,year_field,time_field,date_time from t1; select time_stamp>@now from t1; From 9e16f121455042848dd5234b46bd9ef076798dfd Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Fri, 1 Apr 2005 16:09:20 -0800 Subject: [PATCH 029/204] Fix handling of max_allowed_packet and net_buffer_length in embedded server when a size suffix (K, M, G) is added. (Bug #9472) --- sql/mysqld.cc | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index d75efbd0b00..0590333a20f 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -5916,16 +5916,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), sf_malloc_mem_limit = atoi(argument); #endif break; -#ifdef EMBEDDED_LIBRARY - case OPT_MAX_ALLOWED_PACKET: - max_allowed_packet= atoi(argument); - global_system_variables.max_allowed_packet= max_allowed_packet; - break; - case OPT_NET_BUFFER_LENGTH: - net_buffer_length= atoi(argument); - global_system_variables.net_buffer_length= net_buffer_length; - break; -#endif #include case 'V': print_version(); @@ -6477,6 +6467,9 @@ static void get_options(int argc,char **argv) #ifndef EMBEDDED_LIBRARY if (mysqld_chroot) set_root(mysqld_chroot); +#else + max_allowed_packet= global_system_variables.max_allowed_packet; + net_buffer_length= global_system_variables.net_buffer_length; #endif fix_paths(); From 2292480e795a02973b828a37f826c6e4e0192b69 Mon Sep 17 00:00:00 2001 From: "kent@mysql.com" <> Date: Sat, 2 Apr 2005 03:35:28 +0200 Subject: [PATCH 030/204] mysqld.dsp: Corrected wrong exe naming from bad merge --- VC++Files/sql/mysqld.dsp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VC++Files/sql/mysqld.dsp b/VC++Files/sql/mysqld.dsp index 5ca468f7fc9..723c0d63b36 100644 --- a/VC++Files/sql/mysqld.dsp +++ b/VC++Files/sql/mysqld.dsp @@ -58,7 +58,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=xilink6.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../client_release/mysqld-opt.exe" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../client_release/mysqld.exe" # SUBTRACT LINK32 /debug !ELSEIF "$(CFG)" == "mysqld - Win32 Debug" @@ -84,7 +84,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=xilink6.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_debug\dbug.lib ..\lib_debug\vio.lib ..\lib_debug\mysys.lib ..\lib_debug\strings.lib ..\lib_debug\regex.lib ..\lib_debug\heap.lib ..\lib_debug\bdb.lib ..\lib_debug\innodb.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../client_debug/mysqld.exe" /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_debug\dbug.lib ..\lib_debug\vio.lib ..\lib_debug\mysys.lib ..\lib_debug\strings.lib ..\lib_debug\regex.lib ..\lib_debug\heap.lib ..\lib_debug\bdb.lib ..\lib_debug\innodb.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../client_debug/mysqld-debug.exe" /pdbtype:sept !ELSEIF "$(CFG)" == "mysqld - Win32 nt" From 623a5d5a57f8f8ee2674245e0abafaef698577fb Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Fri, 1 Apr 2005 19:00:14 -0800 Subject: [PATCH 031/204] Clean up merge of fix for Bug #9468. --- mysql-test/t/lowercase_table_grant.test | 3 +++ mysql-test/t/skip_name_resolve.test | 3 +++ sql/sql_parse.cc | 3 +++ 3 files changed, 9 insertions(+) diff --git a/mysql-test/t/lowercase_table_grant.test b/mysql-test/t/lowercase_table_grant.test index 5ac35c81c21..3d6adb477a3 100644 --- a/mysql-test/t/lowercase_table_grant.test +++ b/mysql-test/t/lowercase_table_grant.test @@ -1,3 +1,6 @@ +# Don't test with embedded server +-- source include/not_embedded.inc + # Test of grants when lower_case_table_names is on use mysql; diff --git a/mysql-test/t/skip_name_resolve.test b/mysql-test/t/skip_name_resolve.test index 68dcf329427..b669579acbf 100644 --- a/mysql-test/t/skip_name_resolve.test +++ b/mysql-test/t/skip_name_resolve.test @@ -1,3 +1,6 @@ +# Can't be tested with embedded server +-- source include/not_embedded.inc + # Bug #8471: IP address with mask fail when skip-name-resolve is on GRANT ALL ON test.* TO mysqltest_1@'127.0.0.1/255.255.255.255'; SHOW GRANTS FOR mysqltest_1@'127.0.0.1/255.255.255.255'; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 86544f72316..49110e02113 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1546,6 +1546,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd, } else thd->query_rest.copy(packet, length, thd->query_rest.charset()); + + thd->server_status&= ~ (SERVER_QUERY_NO_INDEX_USED | + SERVER_QUERY_NO_GOOD_INDEX_USED); break; #endif /*EMBEDDED_LIBRARY*/ } From 3061a749e68b16e9aaeb788b25dafe40e5370492 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Sat, 2 Apr 2005 18:05:00 +0300 Subject: [PATCH 032/204] fix of required privileges for altering view VIEW (DELETE->DROP) (BUG#9260) --- mysql-test/r/view.result | 8 ++++++-- mysql-test/t/view.test | 12 +++++++++++- sql/sql_view.cc | 6 +++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index c5fe4bf8565..4d32f2a22af 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -237,13 +237,17 @@ grant select on mysqltest.t1 to mysqltest_1@localhost; grant create view,select on test.* to mysqltest_1@localhost; create view v1 as select * from mysqltest.t1; alter view v1 as select * from mysqltest.t1; -ERROR 42000: DELETE command denied to user 'mysqltest_1'@'localhost' for table 'v1' +ERROR 42000: DROP command denied to user 'mysqltest_1'@'localhost' for table 'v1' create or replace view v1 as select * from mysqltest.t1; -ERROR 42000: DELETE command denied to user 'mysqltest_1'@'localhost' for table 'v1' +ERROR 42000: DROP command denied to user 'mysqltest_1'@'localhost' for table 'v1' create view mysqltest.v2 as select * from mysqltest.t1; ERROR 42000: CREATE VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v2' create view v2 as select * from mysqltest.t2; ERROR 42000: ANY command denied to user 'mysqltest_1'@'localhost' for table 't2' +grant create view,drop,select on test.* to mysqltest_1@localhost; +use test; +alter view v1 as select * from mysqltest.t1; +create or replace view v1 as select * from mysqltest.t1; revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; revoke all privileges on test.* from mysqltest_1@localhost; drop database mysqltest; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 7a05ebb0204..69634b2098b 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -181,7 +181,7 @@ connect (user1,localhost,mysqltest_1,,test); connection user1; create view v1 as select * from mysqltest.t1; -# try to modify view without DELETE privilege on it +# try to modify view without DROP privilege on it -- error 1142 alter view v1 as select * from mysqltest.t1; -- error 1142 @@ -193,6 +193,16 @@ create view mysqltest.v2 as select * from mysqltest.t1; -- error 1142 create view v2 as select * from mysqltest.t2; +connection root; +grant create view,drop,select on test.* to mysqltest_1@localhost; + +connection user1; +# following 'use' command is workaround of bug #9582 and should be removed +# when that bug will be fixed +use test; +alter view v1 as select * from mysqltest.t1; +create or replace view v1 as select * from mysqltest.t1; + connection root; revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; revoke all privileges on test.* from mysqltest_1@localhost; diff --git a/sql/sql_view.cc b/sql/sql_view.cc index e4f30f72443..f902a31c85d 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -89,7 +89,7 @@ bool mysql_create_view(THD *thd, /* Privilege check for view creation: - user have CREATE VIEW privilege on view table - - user have DELETE privilege in case of ALTER VIEW or CREATE OR REPLACE + - user have DROP privilege in case of ALTER VIEW or CREATE OR REPLACE VIEW - have some (SELECT/UPDATE/INSERT/DELETE) privileges on columns of underlying tables used on top of SELECT list (because it can be @@ -104,9 +104,9 @@ bool mysql_create_view(THD *thd, 0, 0) || grant_option && check_grant(thd, CREATE_VIEW_ACL, view, 0, 1, 0)) || (mode != VIEW_CREATE_NEW && - (check_access(thd, DELETE_ACL, view->db, &view->grant.privilege, + (check_access(thd, DROP_ACL, view->db, &view->grant.privilege, 0, 0) || - grant_option && check_grant(thd, DELETE_ACL, view, 0, 1, 0)))) + grant_option && check_grant(thd, DROP_ACL, view, 0, 1, 0)))) DBUG_RETURN(TRUE); for (sl= select_lex; sl; sl= sl->next_select()) { From 4e916e251ba36a0e7ca4a0292def07fcf2285f2d Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Sat, 2 Apr 2005 18:45:44 +0300 Subject: [PATCH 033/204] postreview patch --- sql/sql_view.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sql/sql_view.cc b/sql/sql_view.cc index f902a31c85d..deba6a686a2 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -88,14 +88,14 @@ bool mysql_create_view(THD *thd, #ifndef NO_EMBEDDED_ACCESS_CHECKS /* Privilege check for view creation: - - user have CREATE VIEW privilege on view table - - user have DROP privilege in case of ALTER VIEW or CREATE OR REPLACE + - user has CREATE VIEW privilege on view table + - user has DROP privilege in case of ALTER VIEW or CREATE OR REPLACE VIEW - - have some (SELECT/UPDATE/INSERT/DELETE) privileges on columns of + - user has some (SELECT/UPDATE/INSERT/DELETE) privileges on columns of underlying tables used on top of SELECT list (because it can be (theoretically) updated, so it is enough to have UPDATE privilege on them, for example) - - have SELECT privilege on columns used in expressions of VIEW select + - user has SELECT privilege on columns used in expressions of VIEW select - for columns of underly tables used on top of SELECT list also will be checked that we have not more privileges on correspondent column of view table (i.e. user will not get some privileges by view creation) From 3098b93ef8e4f5154f5b701c59a1daa265b2c633 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Sat, 2 Apr 2005 20:13:19 +0200 Subject: [PATCH 034/204] bug#3891 - DROP TABLE many-unexistent-tables, was printing an error with %s instead of table names sql/sql_table.cc: print an error with a function that respects width modifiers (%.64s) --- mysql-test/r/drop.result | 14 ++++++++++++++ mysql-test/t/drop.test | 23 +++++++++++++++++++++++ sql/share/english/errmsg.txt | 2 +- sql/share/russian/errmsg.txt | 2 +- sql/share/ukrainian/errmsg.txt | 2 +- sql/sql_table.cc | 3 ++- 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/drop.result b/mysql-test/r/drop.result index 5c732aebbcc..b2753e0ff84 100644 --- a/mysql-test/r/drop.result +++ b/mysql-test/r/drop.result @@ -22,6 +22,20 @@ n 4 drop database if exists mysqltest; create database mysqltest; +use mysqltest; +drop table table1, table2, table3, table4, table5, table6, +table7, table8, table9, table10, table11, table12, table13, +table14, table15, table16, table17, table18, table19, table20, +table21, table22, table23, table24, table25, table26, table27, +table28; +Unknown table 'table1,table2,table3,table4,table5,table6,table7,table8,table9,table10,table11,table12,table13,table14,table15,table16,table17,table18,table19,table20,table21,table22,table23,table' +drop table table1, table2, table3, table4, table5, table6, +table7, table8, table9, table10, table11, table12, table13, +table14, table15, table16, table17, table18, table19, table20, +table21, table22, table23, table24, table25, table26, table27, +table28, table29, table30; +Unknown table 'table1,table2,table3,table4,table5,table6,table7,table8,table9,table10,table11,table12,table13,table14,table15,table16,table17,table18,table19,table20,table21,table22,table23,table' +use test; drop database mysqltest; flush tables with read lock; create database mysqltest; diff --git a/mysql-test/t/drop.test b/mysql-test/t/drop.test index 2f3fa99bac0..51807fe403d 100644 --- a/mysql-test/t/drop.test +++ b/mysql-test/t/drop.test @@ -22,6 +22,28 @@ insert into mysqltest.mysqltest values (4); select * from mysqltest.mysqltest; drop database if exists mysqltest; create database mysqltest; + +# +# drop many tables - bug#3891 +# we'll do it in mysqltest db, to be able to use longer table names +# (tableN instead on tN) +# +use mysqltest; +--error 1051 +drop table table1, table2, table3, table4, table5, table6, +table7, table8, table9, table10, table11, table12, table13, +table14, table15, table16, table17, table18, table19, table20, +table21, table22, table23, table24, table25, table26, table27, +table28; + +--error 1051 +drop table table1, table2, table3, table4, table5, table6, +table7, table8, table9, table10, table11, table12, table13, +table14, table15, table16, table17, table18, table19, table20, +table21, table22, table23, table24, table25, table26, table27, +table28, table29, table30; + +use test; drop database mysqltest; # test drop/create database and FLUSH TABLES WITH READ LOCK @@ -39,3 +61,4 @@ drop database mysqltest; show databases; --error 1008 drop database mysqltest; + diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt index cfd878195ac..7c9d789c86e 100644 --- a/sql/share/english/errmsg.txt +++ b/sql/share/english/errmsg.txt @@ -65,7 +65,7 @@ "Column '%-.64s' cannot be null", "Unknown database '%-.64s'", "Table '%-.64s' already exists", -"Unknown table '%-.64s'", +"Unknown table '%-.180s'", "Column: '%-.64s' in %-.64s is ambiguous", "Server shutdown in progress", "Unknown column '%-.64s' in '%-.64s'", diff --git a/sql/share/russian/errmsg.txt b/sql/share/russian/errmsg.txt index 172ee97c883..668b310a5dc 100644 --- a/sql/share/russian/errmsg.txt +++ b/sql/share/russian/errmsg.txt @@ -70,7 +70,7 @@ " '%-.64s' NULL", " '%-.64s'", " '%-.64s' ", -" '%-.64s'", +" '%-.175s'", " '%-.64s' %-.64s ", " ", " '%-.64s' '%-.64s'", diff --git a/sql/share/ukrainian/errmsg.txt b/sql/share/ukrainian/errmsg.txt index 188523ecf45..131cf07a8e2 100644 --- a/sql/share/ukrainian/errmsg.txt +++ b/sql/share/ukrainian/errmsg.txt @@ -71,7 +71,7 @@ " '%-.64s' ", "צ '%-.64s'", " '%-.64s' դ", -"צ '%-.64s'", +"צ '%-.180s'", " '%-.64s' %-.64s ", "դ ", "צ '%-.64s' '%-.64s'", diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 33bdd992efb..cef480fadde 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -237,7 +237,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, if (wrong_tables.length()) { if (!foreign_key_error) - my_error(ER_BAD_TABLE_ERROR,MYF(0),wrong_tables.c_ptr()); + my_printf_error(ER_BAD_TABLE_ERROR, ER(ER_BAD_TABLE_ERROR), MYF(0), + wrong_tables.c_ptr()); else my_error(ER_ROW_IS_REFERENCED,MYF(0)); error= 1; From 4a0e73c63ac539975f1581a6897186e0a0573ad3 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Sat, 2 Apr 2005 21:36:50 +0200 Subject: [PATCH 035/204] results updated --- mysql-test/r/drop.result | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/drop.result b/mysql-test/r/drop.result index 6d67160bc28..40dda86b729 100644 --- a/mysql-test/r/drop.result +++ b/mysql-test/r/drop.result @@ -30,13 +30,13 @@ table7, table8, table9, table10, table11, table12, table13, table14, table15, table16, table17, table18, table19, table20, table21, table22, table23, table24, table25, table26, table27, table28; -Unknown table 'table1,table2,table3,table4,table5,table6,table7,table8,table9,table10,table11,table12,table13,table14,table15,table16,table17,table18,table19,table20,table21,table22,table23,table' +ERROR 42S02: Unknown table 'table1,table2,table3,table4,table5,table6,table7,table8,table9,table10,table11,table12,table13,table14,table15,table16,table17,table18,table19,table20,table21,table22,table23,table' drop table table1, table2, table3, table4, table5, table6, table7, table8, table9, table10, table11, table12, table13, table14, table15, table16, table17, table18, table19, table20, table21, table22, table23, table24, table25, table26, table27, table28, table29, table30; -Unknown table 'table1,table2,table3,table4,table5,table6,table7,table8,table9,table10,table11,table12,table13,table14,table15,table16,table17,table18,table19,table20,table21,table22,table23,table' +ERROR 42S02: Unknown table 'table1,table2,table3,table4,table5,table6,table7,table8,table9,table10,table11,table12,table13,table14,table15,table16,table17,table18,table19,table20,table21,table22,table23,table' use test; drop database mysqltest; flush tables with read lock; From e2a83fca56a58705e9f6963b7fec093ed93429f6 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Sun, 3 Apr 2005 01:23:45 +0300 Subject: [PATCH 036/204] - stackoverflow check added for view of view processing - fixed bug in join view processing - postreview fixes (BUG#9398 & BUG#8703) --- sql/sql_base.cc | 45 ++++++++++++++++++++++++--------------------- sql/sql_view.cc | 8 ++++---- sql/table.cc | 33 ++++++++++++++++++++++++++++++++- sql/table.h | 3 ++- 4 files changed, 62 insertions(+), 27 deletions(-) diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 28235ba48a3..02978ba0c30 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -724,31 +724,34 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table, TABLE_LIST* unique_table(TABLE_LIST *table, TABLE_LIST *table_list) { TABLE_LIST *res; - const char *d_name= table->db, *t_name= table->table_name; - char d_name_buff[MAX_ALIAS_NAME], t_name_buff[MAX_ALIAS_NAME]; + const char *d_name, *t_name; DBUG_ENTER("unique_table"); DBUG_PRINT("enter", ("table alias: %s", table->alias)); - /* temporary table is always unique */ - if (table->table && table->table->s->tmp_table != NO_TMP_TABLE) - DBUG_RETURN(0); - if (table->view) + + /* + If this function called for query which update table (INSERT/UPDATE/...) + then we have in table->table pointer to TABLE object which we are + updating even if it is VIEW so we need TABLE_LIST of this TABLE object + to get right names (even if lower_case_table_names used). + + If this function called for CREATE command that we have not opened table + (table->table equal to 0) and right names is in current TABLE_LIST + object. + */ + if (table->table) { - /* it is view and table opened */ - if (lower_case_table_names) - { - strmov(t_name_buff, table->table->alias); - my_casedn_str(files_charset_info, t_name_buff); - t_name= t_name_buff; - strmov(d_name_buff, table->table->s->db); - my_casedn_str(files_charset_info, d_name_buff); - d_name= d_name_buff; - } - else - { - d_name= table->table->s->db; - t_name= table->table->alias; - } + /* temporary table is always unique */ + if (table->table && table->table->s->tmp_table != NO_TMP_TABLE) + DBUG_RETURN(0); + table= table->find_underlying_table(table->table); + /* + as far as we have table->table we have to find real TABLE_LIST of + it in underlying tables + */ + DBUG_ASSERT(table); } + d_name= table->db; + t_name= table->table_name; DBUG_PRINT("info", ("real table: %s.%s", d_name, t_name)); for(;;) diff --git a/sql/sql_view.cc b/sql/sql_view.cc index e4f30f72443..24fa1659f76 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -755,17 +755,17 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table) table->ancestor= view_tables; - /* next table should include SELECT_LEX under this table SELECT_LEX */ - table->ancestor->select_lex= table->select_lex; - /* Process upper level tables of view. As far as we do noy suport union here we can go through local tables of view most upper SELECT */ - for(tbl= (TABLE_LIST*)view_select->table_list.first; + for(tbl= view_tables; tbl; tbl= tbl->next_local) { + /* next table should include SELECT_LEX under this table SELECT_LEX */ + tbl->select_lex= table->select_lex; + /* move lock type (TODO: should we issue error in case of TMPTABLE algorithm and non-read locking)? diff --git a/sql/table.cc b/sql/table.cc index 9238d8aa68e..e1f15926c03 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1716,7 +1716,7 @@ void st_table_list::restore_want_privilege() check_opt_type - WHITH CHECK OPTION type (VIEW_CHECK_NONE, VIEW_CHECK_LOCAL, VIEW_CHECK_CASCADED) NOTES - ancestor is list of tables and views used by view + ancestor is list of tables and views used by view (underlying tables/views) DESCRIPTION It is: @@ -1750,6 +1750,9 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, bool res= FALSE; DBUG_ENTER("st_table_list::setup_ancestor"); + if (check_stack_overrun(thd, (char *)&res)) + return TRUE; + for (tbl= ancestor; tbl; tbl= tbl->next_local) { if (tbl->ancestor && @@ -1986,6 +1989,34 @@ ok: } +/* + Find underlying base tables (TABLE_LIST) which represent given + table_to_find (TABLE) + + SYNOPSIS + st_table_list::find_underlying_table() + table_to_find table to find + + RETURN + 0 table is not found + found table reference +*/ + +st_table_list *st_table_list::find_underlying_table(TABLE *table_to_find) +{ + /* is this real table and table which we are looking for? */ + if (table == table_to_find && ancestor == 0) + return this; + + for (TABLE_LIST *tbl= ancestor; tbl; tbl= tbl->next_local) + { + TABLE_LIST *result; + if ((result= tbl->find_underlying_table(table_to_find))) + return result; + } + return 0; +} + /* cleunup items belonged to view fields translation table diff --git a/sql/table.h b/sql/table.h index fd299759678..270ec313240 100644 --- a/sql/table.h +++ b/sql/table.h @@ -376,7 +376,7 @@ typedef struct st_table_list st_select_lex *select_lex; st_lex *view; /* link on VIEW lex for merging */ Field_translator *field_translation; /* array of VIEW fields */ - /* ancestor of this table (VIEW merge algorithm) */ + /* list of ancestor(s) of this table (underlying table(s)/view(s) */ st_table_list *ancestor; /* most upper view this table belongs to */ st_table_list *belong_to_view; @@ -448,6 +448,7 @@ typedef struct st_table_list void restore_want_privilege(); bool check_single_table(st_table_list **table, table_map map); bool set_insert_values(MEM_ROOT *mem_root); + st_table_list *find_underlying_table(TABLE *table); } TABLE_LIST; class Item; From c67971af3c72b766d1d8044b5ccb48c3cf021667 Mon Sep 17 00:00:00 2001 From: "dlenev@brandersnatch.localdomain" <> Date: Sun, 3 Apr 2005 11:31:50 +0400 Subject: [PATCH 037/204] Bug #3891 - "DROP TABLE many-unexistent-tables, was printing an error with %s instead of table names". Propagating changes from old language-specific errmsg.txt files to new global errmsg.txt. --- sql/share/errmsg.txt | 48 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index 71e4640e88b..9a92f1f4f76 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -1214,30 +1214,30 @@ ER_TABLE_EXISTS_ERROR 42S01 swe "Tabellen '%-.64s' finns redan" ukr " '%-.64s' դ" ER_BAD_TABLE_ERROR 42S02 - cze "Nezn-Bm tabulka '%-.64s'" - dan "Ukendt tabel '%-.64s'" - nla "Onbekende tabel '%-.64s'" - eng "Unknown table '%-.64s'" - jps "table '%-.64s' ͂܂.", - est "Tundmatu tabel '%-.64s'" - fre "Table '%-.64s' inconnue" - ger "Unbekannte Tabelle '%-.64s'" - greek " '%-.64s'" - hun "Ervenytelen tabla: '%-.64s'" - ita "Tabella '%-.64s' sconosciuta" - jpn "table '%-.64s' Ϥޤ." - kor "̺ '%-.64s' ˼ " - nor "Ukjent tabell '%-.64s'" - norwegian-ny "Ukjent tabell '%-.64s'" - pol "Nieznana tabela '%-.64s'" - por "Tabela '%-.64s' desconhecida" - rum "Tabela '%-.64s' este invalida" - rus " '%-.64s'" - serbian "Nepoznata tabela '%-.64s'" - slo "Neznma tabuka '%-.64s'" - spa "Tabla '%-.64s' desconocida" - swe "Oknd tabell '%-.64s'" - ukr "צ '%-.64s'" + cze "Nezn-Bm tabulka '%-.180s'" + dan "Ukendt tabel '%-.180s'" + nla "Onbekende tabel '%-.180s'" + eng "Unknown table '%-.180s'" + jps "table '%-.180s' ͂܂.", + est "Tundmatu tabel '%-.180s'" + fre "Table '%-.180s' inconnue" + ger "Unbekannte Tabelle '%-.180s'" + greek " '%-.180s'" + hun "Ervenytelen tabla: '%-.180s'" + ita "Tabella '%-.180s' sconosciuta" + jpn "table '%-.180s' Ϥޤ." + kor "̺ '%-.180s' ˼ " + nor "Ukjent tabell '%-.180s'" + norwegian-ny "Ukjent tabell '%-.180s'" + pol "Nieznana tabela '%-.180s'" + por "Tabela '%-.180s' desconhecida" + rum "Tabela '%-.180s' este invalida" + rus " '%-.180s'" + serbian "Nepoznata tabela '%-.180s'" + slo "Neznma tabuka '%-.180s'" + spa "Tabla '%-.180s' desconocida" + swe "Oknd tabell '%-.180s'" + ukr "צ '%-.180s'" ER_NON_UNIQ_ERROR 23000 cze "Sloupec '%-.64s' v %s nen-B zcela jasn" dan "Felt: '%-.64s' i tabel %s er ikke entydigt" From 52770e8682b19f2deccc8bb4ad79a84e5bf3631e Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Mon, 4 Apr 2005 00:50:05 +0200 Subject: [PATCH 038/204] XID SQL syntax minor cleanups XA tests --- include/m_ctype.h | 2 +- mysql-test/r/xa.result | 45 +++++++++++++ mysql-test/t/xa.test | 57 ++++++++++++++++ sql/field.cc | 4 +- sql/handler.cc | 9 +-- sql/handler.h | 23 +++++-- sql/item_sum.h | 2 +- sql/lock.cc | 17 +++-- sql/sql_class.cc | 10 +-- sql/sql_lex.h | 9 +-- sql/sql_parse.cc | 18 ++--- sql/sql_yacc.yy | 150 ++++++++++++++++++++++------------------- 12 files changed, 239 insertions(+), 107 deletions(-) create mode 100644 mysql-test/r/xa.result create mode 100644 mysql-test/t/xa.test diff --git a/include/m_ctype.h b/include/m_ctype.h index c41c7385b3d..f5a1503234c 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -186,7 +186,7 @@ typedef struct my_charset_handler_st int base, char **e, int *err); double (*strntod)(struct charset_info_st *, char *s, uint l, char **e, int *err); - longlong (*my_strtoll10)(struct charset_info_st *cs, + longlong (*strtoll10)(struct charset_info_st *cs, const char *nptr, char **endptr, int *error); ulong (*scan)(struct charset_info_st *, const char *b, const char *e, int sq); diff --git a/mysql-test/r/xa.result b/mysql-test/r/xa.result new file mode 100644 index 00000000000..1dde495d6ae --- /dev/null +++ b/mysql-test/r/xa.result @@ -0,0 +1,45 @@ +drop table if exists t1, t2; +create table t1 (a int) engine=innodb; +xa start 'test1'; +insert t1 values (10); +xa end 'test1'; +xa prepare 'test1'; +xa rollback 'test1'; +select * from t1; +a +xa start 'test2'; +xa start 'test-bad'; +ERROR XAE07: XAER_RMFAIL: The command cannot be executed in the ACTIVE state +insert t1 values (20); +xa prepare 'test2'; +ERROR XAE07: XAER_RMFAIL: The command cannot be executed in the ACTIVE state +xa end 'test2'; +xa prepare 'test2'; +xa commit 'test2'; +select * from t1; +a +20 +xa start 'testa','testb'; +insert t1 values (30); +xa end 'testa','testb'; +xa start 0x7465737462, 0x2030405060, 0xb; +insert t1 values (40); +xa end 'testb',' 0@P`',11; +xa prepare 'testb',0x2030405060,11; +xa recover; +formatID gtrid_length bqual_length data +11 5 5 testb 0@P` +xa prepare 'testa','testb'; +xa recover; +formatID gtrid_length bqual_length data +11 5 5 testb 0@P` +1 5 5 testatestb +xa commit 'testb',0x2030405060,11; +xa rollback 'testa','testb'; +xa start 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 +select * from t1; +a +20 +40 +drop table t1; diff --git a/mysql-test/t/xa.test b/mysql-test/t/xa.test new file mode 100644 index 00000000000..1f2fb5056ed --- /dev/null +++ b/mysql-test/t/xa.test @@ -0,0 +1,57 @@ +# +# WL#1756 +# +-- source include/have_innodb.inc +--disable_warnings +drop table if exists t1, t2; +--enable_warnings +create table t1 (a int) engine=innodb; +xa start 'test1'; +insert t1 values (10); +xa end 'test1'; +xa prepare 'test1'; +xa rollback 'test1'; +select * from t1; + +xa start 'test2'; +--error 1399 +xa start 'test-bad'; +insert t1 values (20); +--error 1399 +xa prepare 'test2'; +xa end 'test2'; +xa prepare 'test2'; +xa commit 'test2'; +select * from t1; + +xa start 'testa','testb'; +insert t1 values (30); +xa end 'testa','testb'; + +connect (con1,localhost,,,); +connection con1; + +xa start 0x7465737462, 0x2030405060, 0xb; +insert t1 values (40); +xa end 'testb',' 0@P`',11; +xa prepare 'testb',0x2030405060,11; + +xa recover; + +# uncomment the line below when binlog will be able to prepare +#disconnect con1; +connection default; + +xa prepare 'testa','testb'; + +xa recover; + +xa commit 'testb',0x2030405060,11; +xa rollback 'testa','testb'; + +--error 1064 +xa start 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'; + +select * from t1; +drop table t1; + diff --git a/sql/field.cc b/sql/field.cc index f3666f862af..bc5868fbea3 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -3230,13 +3230,13 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs) long store_tmp; int error; char *end; - + tmp_scan= cs->cset->scan(cs, from, from+len, MY_SEQ_SPACES); len-= tmp_scan; from+= tmp_scan; end= (char*) from+len; - tmp= cs->cset->my_strtoll10(cs, from, &end, &error); + tmp= cs->cset->strtoll10(cs, from, &end, &error); if (error != MY_ERRNO_EDOM) { diff --git a/sql/handler.cc b/sql/handler.cc index 143e56fdc7c..fd9ec7cf423 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -750,17 +750,15 @@ int ha_autocommit_or_rollback(THD *thd, int error) DBUG_RETURN(error); } -int ha_commit_or_rollback_by_xid(LEX_STRING *ident, bool commit) +int ha_commit_or_rollback_by_xid(XID *xid, bool commit) { - XID xid; handlerton **ht= handlertons, **end_ht=ht+total_ha; int res= 1; - xid.set(ident); for ( ; ht < end_ht ; ht++) if ((*ht)->recover) res= res && - (*(commit ? (*ht)->commit_by_xid : (*ht)->rollback_by_xid))(&xid); + (*(commit ? (*ht)->commit_by_xid : (*ht)->rollback_by_xid))(xid); return res; } @@ -2366,9 +2364,8 @@ TYPELIB *ha_known_exts(void) const char **ext, *old_ext; known_extensions_id= mysys_usage_id; - found_exts.push_back((char*) ".db"); for (types= sys_table_types; types->type; types++) - { + { if (*types->value == SHOW_OPTION_YES) { handler *file= get_new_handler(0,(enum db_type) types->db_type); diff --git a/sql/handler.h b/sql/handler.h index e5b63c7f25c..3751af29194 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -213,13 +213,22 @@ struct xid_t { long bqual_length; char data[XIDDATASIZE]; // not \0-terminated ! - bool eq(LEX_STRING *l) { return eq(l->length, 0, l->str); } + bool eq(struct xid_t *xid) + { return !memcmp(this, xid, sizeof(long)*3+gtrid_length+bqual_length); } bool eq(long g, long b, const char *d) { return g == gtrid_length && b == bqual_length && !memcmp(d, data, g+b); } - void set(LEX_STRING *l) { set(l->length, 0, l->str); } + void set(struct xid_t *xid) + { memcpy(this, xid, sizeof(long)*3+xid->gtrid_length+xid->bqual_length); } + void set(long f, const char *g, long gl, const char *b, long bl) + { + formatID= f; + memcpy(data, g, gtrid_length= gl); + memcpy(data+gl, b, bqual_length= bl); + } void set(ulonglong xid) { my_xid tmp; + formatID= 1; set(MYSQL_XID_PREFIX_LEN, 0, MYSQL_XID_PREFIX); memcpy(data+MYSQL_XID_PREFIX_LEN, &server_id, sizeof(server_id)); tmp= xid; @@ -228,7 +237,7 @@ struct xid_t { } void set(long g, long b, const char *d) { - formatID=1; + formatID= 1; gtrid_length= g; bqual_length= b; memcpy(data, d, g+b); @@ -244,7 +253,7 @@ struct xid_t { my_xid get_my_xid() { return gtrid_length == MYSQL_XID_GTRID_LEN && bqual_length == 0 && - *(ulong*)(data+MYSQL_XID_PREFIX_LEN) == server_id && + !memcmp(data+MYSQL_XID_PREFIX_LEN, &server_id, sizeof(server_id)) && !memcmp(data, MYSQL_XID_PREFIX, MYSQL_XID_PREFIX_LEN) ? quick_get_my_xid() : 0; } @@ -261,8 +270,8 @@ typedef struct xid_t XID; /* handlerton is a singleton structure - one instance per storage engine - - to provide access to storage engine functionality that works on - "global" level (unlike handler class that works on per-table basis) + to provide access to storage engine functionality that works on the + "global" level (unlike handler class that works on a per-table basis) usually handlerton instance is defined statically in ha_xxx.cc as @@ -826,7 +835,7 @@ int ha_release_temporary_latches(THD *thd); /* transactions: interface to handlerton functions */ int ha_start_consistent_snapshot(THD *thd); -int ha_commit_or_rollback_by_xid(LEX_STRING *ident, bool commit); +int ha_commit_or_rollback_by_xid(XID *xid, bool commit); int ha_commit_one_phase(THD *thd, bool all); int ha_rollback_trans(THD *thd, bool all); int ha_prepare(THD *thd); diff --git a/sql/item_sum.h b/sql/item_sum.h index d03ef94b9cd..8c8360b0726 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -734,7 +734,7 @@ public: return 0; /* Null value */ cs= res->charset(); end= (char*) res->ptr()+res->length(); - return cs->cset->my_strtoll10(cs, res->ptr(), &end, &err_not_used); + return cs->cset->strtoll10(cs, res->ptr(), &end, &err_not_used); } my_decimal *val_decimal(my_decimal *dec); enum Item_result result_type () const { return STRING_RESULT; } diff --git a/sql/lock.cc b/sql/lock.cc index 266e8dc4d4d..a8ccba32d4f 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -736,6 +736,13 @@ static void print_lock_error(int error, const char *table) protect_against_global_read_lock count of threads which have set protection against global read lock. + access to them is protected with a mutex LOCK_global_read_lock + + (XXX: one should never take LOCK_open if LOCK_global_read_lock is taken, + otherwise a deadlock may occur - see mysql_rm_table. Other mutexes could + be a problem too - grep the code for global_read_lock if you want to use + any other mutex here) + How blocking of threads by global read lock is achieved: that's advisory. Any piece of code which should be blocked by global read lock must be designed like this: @@ -773,7 +780,7 @@ static void print_lock_error(int error, const char *table) table instance of thd2 thd1: COMMIT; # blocked by thd3. thd1 blocks thd2 which blocks thd3 which blocks thd1: deadlock. - + Note that we need to support that one thread does FLUSH TABLES WITH READ LOCK; and then COMMIT; (that's what innobackup does, for some good reason). @@ -818,7 +825,7 @@ bool lock_global_read_lock(THD *thd) } thd->global_read_lock= GOT_GLOBAL_READ_LOCK; global_read_lock++; - thd->exit_cond(old_message); + thd->exit_cond(old_message); // this unlocks LOCK_global_read_lock } /* We DON'T set global_read_lock_blocks_commit now, it will be set after @@ -887,8 +894,8 @@ bool wait_if_global_read_lock(THD *thd, bool abort_on_refresh, The following is only true in case of a global read locks (which is rare) and if old_message is set */ - if (unlikely(need_exit_cond)) - thd->exit_cond(old_message); + if (unlikely(need_exit_cond)) + thd->exit_cond(old_message); // this unlocks LOCK_global_read_lock else pthread_mutex_unlock(&LOCK_global_read_lock); DBUG_RETURN(result); @@ -938,7 +945,7 @@ bool make_global_read_lock_block_commit(THD *thd) global_read_lock_blocks_commit--; // undo what we did else thd->global_read_lock= MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT; - thd->exit_cond(old_message); + thd->exit_cond(old_message); // this unlocks LOCK_global_read_lock DBUG_RETURN(error); } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index cf7240e4dba..04de761aece 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -342,7 +342,9 @@ void THD::change_user(void) void THD::cleanup(void) { DBUG_ENTER("THD::cleanup"); - ha_rollback(this); + /* TODO uncomment the line below when binlog will be able to prepare */ + // if (transaction.xa_state != XA_PREPARED) + ha_rollback(this); if (locked_tables) { lock=locked_tables; locked_tables=0; @@ -384,17 +386,17 @@ THD::~THD() add_to_status(&global_status_var, &status_var); /* Close connection */ -#ifndef EMBEDDED_LIBRARY +#ifndef EMBEDDED_LIBRARY if (net.vio) { vio_delete(net.vio); - net_end(&net); + net_end(&net); } #endif if (!cleanup_done) cleanup(); - ha_close_connection(this); + ha_close_connection(this); sp_cache_clear(&sp_proc_cache); sp_cache_clear(&sp_func_cache); diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 2391c0b7ef9..34ed1e83c86 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -696,6 +696,7 @@ typedef struct st_lex Item *default_value, *on_update_value; LEX_STRING comment, ident; LEX_USER *grant_user; + XID *xid; gptr yacc_yyss,yacc_yyvs; THD *thd; CHARSET_INFO *charset; @@ -738,7 +739,7 @@ typedef struct st_lex enum enum_tx_isolation tx_isolation; enum enum_ha_read_modes ha_read_mode; union { - enum ha_rkey_function ha_rkey_mode; + enum ha_rkey_function ha_rkey_mode; enum xa_option_words xa_opt; }; enum enum_var_type option_type; @@ -764,15 +765,15 @@ typedef struct st_lex ALTER_INFO alter_info; /* Prepared statements SQL syntax:*/ LEX_STRING prepared_stmt_name; /* Statement name (in all queries) */ - /* + /* Prepared statement query text or name of variable that holds the prepared statement (in PREPARE ... queries) */ - LEX_STRING prepared_stmt_code; + LEX_STRING prepared_stmt_code; /* If true, prepared_stmt_code is a name of variable that holds the query */ bool prepared_stmt_code_is_varref; /* Names of user variables holding parameters (in EXECUTE) */ - List prepared_stmt_params; + List prepared_stmt_params; /* Points to part of global table list which contains time zone tables implicitly used by the statement. diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 21282e9e620..a734af4b0e6 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4323,7 +4323,7 @@ unsent_create_error: case SQLCOM_XA_START: if (thd->transaction.xa_state == XA_IDLE && thd->lex->xa_opt == XA_RESUME) { - if (! thd->transaction.xid.eq(&thd->lex->ident)) + if (! thd->transaction.xid.eq(thd->lex->xid)) { my_error(ER_XAER_NOTA, MYF(0)); break; @@ -4332,7 +4332,7 @@ unsent_create_error: send_ok(thd); break; } - if (thd->lex->ident.length > MAXGTRIDSIZE || thd->lex->xa_opt != XA_NONE) + if (thd->lex->xa_opt != XA_NONE) { // JOIN is not supported yet. TODO my_error(ER_XAER_INVAL, MYF(0)); break; @@ -4350,7 +4350,7 @@ unsent_create_error: } DBUG_ASSERT(thd->transaction.xid.is_null()); thd->transaction.xa_state=XA_ACTIVE; - thd->transaction.xid.set(&thd->lex->ident); + thd->transaction.xid.set(thd->lex->xid); thd->options= ((thd->options & (ulong) ~(OPTION_STATUS_NO_TRANS_UPDATE)) | OPTION_BEGIN); thd->server_status|= SERVER_STATUS_IN_TRANS; @@ -4369,7 +4369,7 @@ unsent_create_error: xa_state_names[thd->transaction.xa_state]); break; } - if (!thd->transaction.xid.eq(&thd->lex->ident)) + if (!thd->transaction.xid.eq(thd->lex->xid)) { my_error(ER_XAER_NOTA, MYF(0)); break; @@ -4384,7 +4384,7 @@ unsent_create_error: xa_state_names[thd->transaction.xa_state]); break; } - if (!thd->transaction.xid.eq(&thd->lex->ident)) + if (!thd->transaction.xid.eq(thd->lex->xid)) { my_error(ER_XAER_NOTA, MYF(0)); break; @@ -4399,9 +4399,9 @@ unsent_create_error: send_ok(thd); break; case SQLCOM_XA_COMMIT: - if (!thd->transaction.xid.eq(&thd->lex->ident)) + if (!thd->transaction.xid.eq(thd->lex->xid)) { - if (!(res= !ha_commit_or_rollback_by_xid(&thd->lex->ident, 1))) + if (!(res= !ha_commit_or_rollback_by_xid(thd->lex->xid, 1))) my_error(ER_XAER_NOTA, MYF(0)); else send_ok(thd); @@ -4434,9 +4434,9 @@ unsent_create_error: thd->transaction.xa_state=XA_NOTR; break; case SQLCOM_XA_ROLLBACK: - if (!thd->transaction.xid.eq(&thd->lex->ident)) + if (!thd->transaction.xid.eq(thd->lex->xid)) { - if (!(res= !ha_commit_or_rollback_by_xid(&thd->lex->ident, 0))) + if (!(res= !ha_commit_or_rollback_by_xid(thd->lex->xid, 0))) my_error(ER_XAER_NOTA, MYF(0)); else send_ok(thd); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 4924f78dc0a..3c2577acf96 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -47,13 +47,13 @@ const LEX_STRING null_lex_str={0,0}; #define yyoverflow(A,B,C,D,E,F) {ulong val= *(F); if(my_yyoverflow((B), (D), &val)) { yyerror((char*) (A)); return 2; } else { *(F)= (YYSIZE_T)val; }} -#define WARN_DEPRECATED(A,B) \ +#define WARN_DEPRECATED(A,B) \ push_warning_printf(((THD *)yythd), MYSQL_ERROR::WARN_LEVEL_WARN, \ - ER_WARN_DEPRECATED_SYNTAX, \ + ER_WARN_DEPRECATED_SYNTAX, \ ER(ER_WARN_DEPRECATED_SYNTAX), (A), (B)); -#define TEST_ASSERT(A) \ - if (!(A)) \ +#define TEST_ASSERT(A) \ + if (!(A)) \ { \ yyerror(ER(ER_SYNTAX_ERROR)); \ YYABORT; \ @@ -243,7 +243,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %token DUPLICATE_SYM %token DYNAMIC_SYM %token EACH_SYM -%token EALLOCATE_SYM %token ELSEIF_SYM %token ELT_FUNC %token ENABLE_SYM @@ -702,7 +701,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); union_opt select_derived_init %type - ULONG_NUM raid_types merge_insert_types + ulong_num raid_types merge_insert_types %type ulonglong_num @@ -1039,16 +1038,16 @@ master_def: Lex->mi.password = $3.str; } | - MASTER_PORT_SYM EQ ULONG_NUM + MASTER_PORT_SYM EQ ulong_num { Lex->mi.port = $3; } | - MASTER_CONNECT_RETRY_SYM EQ ULONG_NUM + MASTER_CONNECT_RETRY_SYM EQ ulong_num { Lex->mi.connect_retry = $3; } - | MASTER_SSL_SYM EQ ULONG_NUM + | MASTER_SSL_SYM EQ ulong_num { Lex->mi.ssl= $3 ? LEX_MASTER_INFO::SSL_ENABLE : LEX_MASTER_INFO::SSL_DISABLE; @@ -1102,7 +1101,7 @@ master_file_def: { Lex->mi.relay_log_name = $3.str; } - | RELAY_LOG_POS_SYM EQ ULONG_NUM + | RELAY_LOG_POS_SYM EQ ulong_num { Lex->mi.relay_log_pos = $3; /* Adjust if < BIN_LOG_HEADER_SIZE (same comment as Lex->mi.pos) */ @@ -1792,7 +1791,7 @@ sp_hcond_list: ; sp_cond: - ULONG_NUM + ulong_num { /* mysql errno */ $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t)); $$->type= sp_cond_type_t::number; @@ -2578,18 +2577,18 @@ create_table_option: | TYPE_SYM opt_equal storage_engines { Lex->create_info.db_type= $3; WARN_DEPRECATED("TYPE=storage_engine","ENGINE=storage_engine"); Lex->create_info.used_fields|= HA_CREATE_USED_ENGINE; } | MAX_ROWS opt_equal ulonglong_num { Lex->create_info.max_rows= $3; Lex->create_info.used_fields|= HA_CREATE_USED_MAX_ROWS;} | MIN_ROWS opt_equal ulonglong_num { Lex->create_info.min_rows= $3; Lex->create_info.used_fields|= HA_CREATE_USED_MIN_ROWS;} - | AVG_ROW_LENGTH opt_equal ULONG_NUM { Lex->create_info.avg_row_length=$3; Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH;} + | AVG_ROW_LENGTH opt_equal ulong_num { Lex->create_info.avg_row_length=$3; Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH;} | PASSWORD opt_equal TEXT_STRING_sys { Lex->create_info.password=$3.str; Lex->create_info.used_fields|= HA_CREATE_USED_PASSWORD; } | COMMENT_SYM opt_equal TEXT_STRING_sys { Lex->create_info.comment=$3.str; Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; } | AUTO_INC opt_equal ulonglong_num { Lex->create_info.auto_increment_value=$3; Lex->create_info.used_fields|= HA_CREATE_USED_AUTO;} - | PACK_KEYS_SYM opt_equal ULONG_NUM { Lex->create_info.table_options|= $3 ? HA_OPTION_PACK_KEYS : HA_OPTION_NO_PACK_KEYS; Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS;} + | PACK_KEYS_SYM opt_equal ulong_num { Lex->create_info.table_options|= $3 ? HA_OPTION_PACK_KEYS : HA_OPTION_NO_PACK_KEYS; Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS;} | PACK_KEYS_SYM opt_equal DEFAULT { Lex->create_info.table_options&= ~(HA_OPTION_PACK_KEYS | HA_OPTION_NO_PACK_KEYS); Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS;} - | CHECKSUM_SYM opt_equal ULONG_NUM { Lex->create_info.table_options|= $3 ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; } - | DELAY_KEY_WRITE_SYM opt_equal ULONG_NUM { Lex->create_info.table_options|= $3 ? HA_OPTION_DELAY_KEY_WRITE : HA_OPTION_NO_DELAY_KEY_WRITE; Lex->create_info.used_fields|= HA_CREATE_USED_DELAY_KEY_WRITE; } + | CHECKSUM_SYM opt_equal ulong_num { Lex->create_info.table_options|= $3 ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; } + | DELAY_KEY_WRITE_SYM opt_equal ulong_num { Lex->create_info.table_options|= $3 ? HA_OPTION_DELAY_KEY_WRITE : HA_OPTION_NO_DELAY_KEY_WRITE; Lex->create_info.used_fields|= HA_CREATE_USED_DELAY_KEY_WRITE; } | ROW_FORMAT_SYM opt_equal row_types { Lex->create_info.row_type= $3; Lex->create_info.used_fields|= HA_CREATE_USED_ROW_FORMAT; } | RAID_TYPE opt_equal raid_types { Lex->create_info.raid_type= $3; Lex->create_info.used_fields|= HA_CREATE_USED_RAID;} - | RAID_CHUNKS opt_equal ULONG_NUM { Lex->create_info.raid_chunks= $3; Lex->create_info.used_fields|= HA_CREATE_USED_RAID;} - | RAID_CHUNKSIZE opt_equal ULONG_NUM { Lex->create_info.raid_chunksize= $3*RAID_BLOCK_SIZE; Lex->create_info.used_fields|= HA_CREATE_USED_RAID;} + | RAID_CHUNKS opt_equal ulong_num { Lex->create_info.raid_chunks= $3; Lex->create_info.used_fields|= HA_CREATE_USED_RAID;} + | RAID_CHUNKSIZE opt_equal ulong_num { Lex->create_info.raid_chunksize= $3*RAID_BLOCK_SIZE; Lex->create_info.used_fields|= HA_CREATE_USED_RAID;} | UNION_SYM opt_equal '(' table_list ')' { /* Move the union list to the merge_list */ @@ -2666,7 +2665,7 @@ row_types: raid_types: RAID_STRIPED_SYM { $$= RAID_TYPE_0; } | RAID_0_SYM { $$= RAID_TYPE_0; } - | ULONG_NUM { $$=$1;}; + | ulong_num { $$=$1;}; merge_insert_types: NO_SYM { $$= MERGE_INSERT_DISABLED; } @@ -4704,7 +4703,7 @@ simple_expr: { $$= new Item_func_yearweek($3,new Item_int((char*) "0",0,1)); } | YEARWEEK '(' expr ',' expr ')' { $$= new Item_func_yearweek($3, $5); } - | BENCHMARK_SYM '(' ULONG_NUM ',' expr ')' + | BENCHMARK_SYM '(' ulong_num ',' expr ')' { $$=new Item_func_benchmark($3,$5); Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); @@ -4989,7 +4988,7 @@ table_ref: join_table_list: derived_table_list { TEST_ASSERT($$=$1); } ; - + /* Warning - may return NULL in case of incomplete SELECT */ derived_table_list: table_ref { $$=$1; } @@ -5033,7 +5032,7 @@ join_table: $$=$6; } | table_ref RIGHT opt_outer JOIN_SYM table_ref ON expr - { + { LEX *lex= Lex; TEST_ASSERT($1 && $5); if (!($$= lex->current_select->convert_right_join())) @@ -5047,7 +5046,7 @@ join_table: sel->save_names_for_using_list($1, $5); } USING '(' using_list ')' - { + { LEX *lex= Lex; if (!($$= lex->current_select->convert_right_join())) YYABORT; @@ -5063,7 +5062,7 @@ join_table: } | table_ref NATURAL JOIN_SYM table_factor { TEST_ASSERT($1 && ($$=$4)); add_join_natural($1,$4); }; - + normal_join: JOIN_SYM {} @@ -5109,9 +5108,9 @@ table_factor: sel->master_unit()->fake_select_lex; } if ($2->init_nested_join(lex->thd)) - YYABORT; + YYABORT; $$= 0; - /* incomplete derived tables return NULL, we must be + /* incomplete derived tables return NULL, we must be nested in select_derived rule to be here. */ } | '(' get_select_lex select_derived union_opt ')' opt_table_alias @@ -5119,7 +5118,7 @@ table_factor: /* Use $2 instead of Lex->current_select as derived table will alter value of Lex->current_select. */ - if (!($3 || $6) && $2->embedding && + if (!($3 || $6) && $2->embedding && !$2->embedding->nested_join->join_list.elements) { /* we have a derived table ($3 == NULL) but no alias, @@ -5144,7 +5143,7 @@ table_factor: (List *)0))) YYABORT; - sel->add_joined_table($$); + sel->add_joined_table($$); } else if ($4 || $6) @@ -5171,7 +5170,7 @@ select_derived: LEX *lex= Lex; /* for normal joins, $3 != NULL and end_nested_join() != NULL, for derived tables, both must equal NULL */ - + if (!($$= $1->end_nested_join(lex->thd)) && $3) YYABORT; if (!$3 && $$) @@ -5215,7 +5214,7 @@ select_derived_init: SELECT_SYM { LEX *lex= Lex; - SELECT_LEX *sel= lex->current_select; + SELECT_LEX *sel= lex->current_select; TABLE_LIST *embedding; if (!sel->embedding || sel->end_nested_join(lex->thd)) { @@ -5488,21 +5487,21 @@ limit_clause: ; limit_options: - ULONG_NUM + ulong_num { SELECT_LEX *sel= Select; sel->select_limit= $1; sel->offset_limit= 0L; sel->explicit_limit= 1; } - | ULONG_NUM ',' ULONG_NUM + | ulong_num ',' ulong_num { SELECT_LEX *sel= Select; sel->select_limit= $3; sel->offset_limit= $1; sel->explicit_limit= 1; } - | ULONG_NUM OFFSET_SYM ULONG_NUM + | ulong_num OFFSET_SYM ulong_num { SELECT_LEX *sel= Select; sel->select_limit= $1; @@ -5525,11 +5524,12 @@ delete_limit_clause: sel->explicit_limit= 1; }; -ULONG_NUM: - NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } +ulong_num: + NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } + | HEX_NUM { int error; $$= (ulong) strtol($1.str, (char**) 0, 16); } | LONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } | ULONGLONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } - | DECIMAL_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } + | DECIMAL_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } | FLOAT_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } ; @@ -6139,7 +6139,7 @@ show_param: | NEW_SYM MASTER_SYM FOR_SYM SLAVE WITH MASTER_LOG_FILE_SYM EQ TEXT_STRING_sys AND_SYM MASTER_LOG_POS_SYM EQ ulonglong_num AND_SYM MASTER_SERVER_ID_SYM EQ - ULONG_NUM + ulong_num { Lex->sql_command = SQLCOM_SHOW_NEW_MASTER; Lex->mi.log_file_name = $8.str; @@ -6688,7 +6688,7 @@ fields_or_vars: | field_or_var { Lex->field_list.push_back($1); } ; - + field_or_var: simple_ident_nospvar {$$= $1;} | '@' ident_or_text @@ -6836,9 +6836,9 @@ NUM_literal: } } ; - + /********************************************************************** -** Createing different items. +** Creating different items. **********************************************************************/ insert_ident: @@ -6854,8 +6854,8 @@ table_wild: | ident '.' ident '.' '*' { $$ = new Item_field((YYTHD->client_capabilities & - CLIENT_NO_SCHEMA ? NullS : $1.str), - $3.str,"*"); + CLIENT_NO_SCHEMA ? NullS : $1.str), + $3.str,"*"); Lex->current_select->with_wild++; } ; @@ -6898,53 +6898,53 @@ simple_ident_nospvar: (Item*) new Item_ref(NullS,NullS,$1.str); } | simple_ident_q { $$= $1; } - ; + ; simple_ident_q: ident '.' ident { THD *thd= YYTHD; LEX *lex= thd->lex; - + /* FIXME This will work ok in simple_ident_nospvar case because we can't meet simple_ident_nospvar in trigger now. But it should be changed in future. */ if (lex->sphead && lex->sphead->m_type == TYPE_ENUM_TRIGGER && - (!my_strcasecmp(system_charset_info, $1.str, "NEW") || + (!my_strcasecmp(system_charset_info, $1.str, "NEW") || !my_strcasecmp(system_charset_info, $1.str, "OLD"))) { Item_trigger_field *trg_fld; bool new_row= ($1.str[0]=='N' || $1.str[0]=='n'); - + if (lex->trg_chistics.event == TRG_EVENT_INSERT && !new_row) { my_error(ER_TRG_NO_SUCH_ROW_IN_TRG, MYF(0), "OLD", "on INSERT"); YYABORT; } - + if (lex->trg_chistics.event == TRG_EVENT_DELETE && new_row) { my_error(ER_TRG_NO_SUCH_ROW_IN_TRG, MYF(0), "NEW", "on DELETE"); YYABORT; } - + if (!(trg_fld= new Item_trigger_field(new_row ? Item_trigger_field::NEW_ROW: Item_trigger_field::OLD_ROW, $3.str))) YYABORT; - + /* Let us add this item to list of all Item_trigger_field objects in trigger. */ lex->trg_table_fields.link_in_list((byte *)trg_fld, (byte**)&trg_fld->next_trg_field); - + $$= (Item *)trg_fld; } else @@ -7073,7 +7073,7 @@ ident: ; ident_or_text: - ident { $$=$1;} + ident { $$=$1;} | TEXT_STRING_sys { $$=$1;} | LEX_HOSTNAME { $$=$1;}; @@ -8124,25 +8124,25 @@ grant_option_list: grant_option: GRANT OPTION { Lex->grant |= GRANT_ACL;} - | MAX_QUERIES_PER_HOUR ULONG_NUM + | MAX_QUERIES_PER_HOUR ulong_num { LEX *lex=Lex; lex->mqh.questions=$2; lex->mqh.specified_limits|= USER_RESOURCES::QUERIES_PER_HOUR; } - | MAX_UPDATES_PER_HOUR ULONG_NUM + | MAX_UPDATES_PER_HOUR ulong_num { LEX *lex=Lex; lex->mqh.updates=$2; lex->mqh.specified_limits|= USER_RESOURCES::UPDATES_PER_HOUR; } - | MAX_CONNECTIONS_PER_HOUR ULONG_NUM + | MAX_CONNECTIONS_PER_HOUR ulong_num { LEX *lex=Lex; lex->mqh.conn_per_hour= $2; lex->mqh.specified_limits|= USER_RESOURCES::CONNECTIONS_PER_HOUR; } - | MAX_USER_CONNECTIONS_SYM ULONG_NUM + | MAX_USER_CONNECTIONS_SYM ulong_num { LEX *lex=Lex; lex->mqh.user_conn= $2; @@ -8413,38 +8413,52 @@ check_option: xa: XA_SYM begin_or_start xid opt_join_or_resume { - LEX *lex= Lex; - lex->sql_command = SQLCOM_XA_START; + Lex->sql_command = SQLCOM_XA_START; } | XA_SYM END xid opt_suspend_or_migrate { - LEX *lex= Lex; - lex->sql_command = SQLCOM_XA_END; + Lex->sql_command = SQLCOM_XA_END; } | XA_SYM PREPARE_SYM xid { - LEX *lex= Lex; - lex->sql_command = SQLCOM_XA_PREPARE; + Lex->sql_command = SQLCOM_XA_PREPARE; } | XA_SYM COMMIT_SYM xid opt_one_phase { - LEX *lex= Lex; - lex->sql_command = SQLCOM_XA_COMMIT; + Lex->sql_command = SQLCOM_XA_COMMIT; } | XA_SYM ROLLBACK_SYM xid { - LEX *lex= Lex; - lex->sql_command = SQLCOM_XA_ROLLBACK; + Lex->sql_command = SQLCOM_XA_ROLLBACK; } | XA_SYM RECOVER_SYM { - LEX *lex= Lex; - lex->sql_command = SQLCOM_XA_RECOVER; + Lex->sql_command = SQLCOM_XA_RECOVER; } ; -xid: ident_or_text { Lex->ident=$1; } - ; +xid: text_string + { + TEST_ASSERT($1->length() <= MAXGTRIDSIZE); + if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID)))) + YYABORT; + Lex->xid->set(1L, $1->ptr(), $1->length(), 0, 0); + } + | text_string ',' text_string + { + TEST_ASSERT($1->length() <= MAXGTRIDSIZE && $3->length() <= MAXBQUALSIZE); + if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID)))) + YYABORT; + Lex->xid->set(1L, $1->ptr(), $1->length(), $3->ptr(), $3->length()); + } + | text_string ',' text_string ',' ulong_num + { + TEST_ASSERT($1->length() <= MAXGTRIDSIZE && $3->length() <= MAXBQUALSIZE); + if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID)))) + YYABORT; + Lex->xid->set($5, $1->ptr(), $1->length(), $3->ptr(), $3->length()); + } + ; begin_or_start: BEGIN_SYM {} | START_SYM {} From 77303197385208926a96f7b42ebff7ea5cda1fbd Mon Sep 17 00:00:00 2001 From: "petr@mysql.com" <> Date: Mon, 4 Apr 2005 03:49:10 +0400 Subject: [PATCH 039/204] Enable IM in the binary distribution and fix Bug #9513 (mysql.server script from the binary distibution doesn't work out of the box) --- client/Makefile.am | 6 ++++-- mysql-test/mysql-test-run.sh | 12 ++++++------ scripts/make_binary_distribution.sh | 11 ++++++----- server-tools/instance-manager/Makefile.am | 2 +- support-files/mysql.spec.sh | 13 +++++++++---- tools/Makefile.am | 6 +++--- 6 files changed, 29 insertions(+), 21 deletions(-) diff --git a/client/Makefile.am b/client/Makefile.am index d3307f9da42..58dcebfd852 100644 --- a/client/Makefile.am +++ b/client/Makefile.am @@ -23,7 +23,8 @@ LIBS = @CLIENT_LIBS@ LDADD= @CLIENT_EXTRA_LDFLAGS@ \ $(top_builddir)/libmysql/libmysqlclient.la bin_PROGRAMS = mysql mysqladmin mysqlcheck mysqlshow \ - mysqldump mysqlimport mysqltest mysqlbinlog mysqlmanagerc mysqlmanager-pwgen + mysqldump mysqlimport mysqltest mysqlbinlog \ + mysqltestmanagerc mysqltestmanager-pwgen noinst_HEADERS = sql_string.h completion_hash.h my_readline.h \ client_priv.h mysql_SOURCES = mysql.cc readline.cc sql_string.cc completion_hash.cc @@ -33,7 +34,8 @@ mysqlbinlog_LDADD = $(LDADD) $(CXXLDFLAGS) mysqltest_SOURCES= mysqltest.c $(top_srcdir)/mysys/my_getsystime.c mysqltest_LDADD = $(top_builddir)/regex/libregex.a $(LDADD) mysqlbinlog_SOURCES = mysqlbinlog.cc $(top_srcdir)/mysys/mf_tempdir.c -mysqlmanagerc_SOURCES = mysqlmanagerc.c +mysqltestmanagerc_SOURCES = mysqlmanagerc.c +mysqltestmanager_pwgen_SOURCES = mysqlmanager-pwgen.c sql_src=log_event.h mysql_priv.h log_event.cc my_decimal.h my_decimal.cc strings_src=decimal.c diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index ac1755cab9c..68f6568b184 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -576,9 +576,9 @@ if [ x$SOURCE_DIST = x1 ] ; then CLIENT_BINDIR="$BASEDIR/client" MYSQLADMIN="$CLIENT_BINDIR/mysqladmin" WAIT_PID="$BASEDIR/extra/mysql_waitpid" - MYSQL_MANAGER_CLIENT="$CLIENT_BINDIR/mysqlmanagerc" - MYSQL_MANAGER="$BASEDIR/tools/mysqlmanager" - MYSQL_MANAGER_PWGEN="$CLIENT_BINDIR/mysqlmanager-pwgen" + MYSQL_MANAGER_CLIENT="$CLIENT_BINDIR/mysqltestmanagerc" + MYSQL_MANAGER="$BASEDIR/tools/mysqltestmanager" + MYSQL_MANAGER_PWGEN="$CLIENT_BINDIR/mysqltestmanager-pwgen" MYSQL="$CLIENT_BINDIR/mysql" LANGUAGE="$BASEDIR/sql/share/english/" CHARSETSDIR="$BASEDIR/sql/share/charsets" @@ -639,9 +639,9 @@ else MYSQL_BINLOG="$CLIENT_BINDIR/mysqlbinlog" MYSQLADMIN="$CLIENT_BINDIR/mysqladmin" WAIT_PID="$CLIENT_BINDIR/mysql_waitpid" - MYSQL_MANAGER="$CLIENT_BINDIR/mysqlmanager" - MYSQL_MANAGER_CLIENT="$CLIENT_BINDIR/mysqlmanagerc" - MYSQL_MANAGER_PWGEN="$CLIENT_BINDIR/mysqlmanager-pwgen" + MYSQL_MANAGER="$CLIENT_BINDIR/mysqltestmanager" + MYSQL_MANAGER_CLIENT="$CLIENT_BINDIR/mysqltestmanagerc" + MYSQL_MANAGER_PWGEN="$CLIENT_BINDIR/mysqltestmanager-pwgen" MYSQL="$CLIENT_BINDIR/mysql" INSTALL_DB="./install_test_db --bin" MYSQL_FIX_SYSTEM_TABLES="$CLIENT_BINDIR/mysql_fix_privilege_tables" diff --git a/scripts/make_binary_distribution.sh b/scripts/make_binary_distribution.sh index ddce55c063d..6ebe05fe116 100644 --- a/scripts/make_binary_distribution.sh +++ b/scripts/make_binary_distribution.sh @@ -103,6 +103,7 @@ BIN_FILES="extra/comp_err$BS extra/replace$BS extra/perror$BS \ myisam/myisamchk$BS myisam/myisampack$BS myisam/myisamlog$BS \ myisam/myisam_ftdump$BS \ sql/mysqld$BS sql/mysql_tzinfo_to_sql$BS \ + server-tools/instance-manager/mysqlmanager$BS \ client/mysql$BS client/mysqlshow$BS client/mysqladmin$BS \ client/mysqldump$BS client/mysqlimport$BS \ client/mysqltest$BS client/mysqlcheck$BS \ @@ -122,13 +123,13 @@ if [ $BASE_SYSTEM = "netware" ] ; then # For all other platforms: else BIN_FILES="$BIN_FILES \ - client/mysqlmanagerc \ - client/mysqlmanager-pwgen tools/mysqlmanager \ + client/mysqltestmanagerc \ + client/mysqltestmanager-pwgen tools/mysqltestmanager \ client/.libs/mysql client/.libs/mysqlshow client/.libs/mysqladmin \ client/.libs/mysqldump client/.libs/mysqlimport \ client/.libs/mysqltest client/.libs/mysqlcheck \ - client/.libs/mysqlbinlog client/.libs/mysqlmanagerc \ - client/.libs/mysqlmanager-pwgen tools/.libs/mysqlmanager \ + client/.libs/mysqlbinlog client/.libs/mysqltestmanagerc \ + client/.libs/mysqltestmanager-pwgen tools/.libs/mysqltestmanager \ tests/.libs/mysql_client_test \ libmysqld/examples/.libs/mysql_client_test_embedded \ libmysqld/examples/.libs/mysqltest_embedded \ @@ -231,7 +232,7 @@ if [ $BASE_SYSTEM != "netware" ] ; then chmod a+x $BASE/bin/* $CP scripts/* $BASE/bin $BASE/bin/replace \@localstatedir\@ ./data \@bindir\@ ./bin \@scriptdir\@ ./bin \@libexecdir\@ ./bin \@sbindir\@ ./bin \@prefix\@ . \@HOSTNAME\@ @HOSTNAME@ \@pkgdatadir\@ ./support-files < $SOURCE/scripts/mysql_install_db.sh > $BASE/scripts/mysql_install_db - $BASE/bin/replace \@prefix\@ /usr/local/mysql \@bindir\@ ./bin \@MYSQLD_USER\@ root \@localstatedir\@ /usr/local/mysql/data \@HOSTNAME\@ @HOSTNAME@ < $SOURCE/support-files/mysql.server.sh > $BASE/support-files/mysql.server + $BASE/bin/replace \@prefix\@ /usr/local/mysql \@bindir\@ ./bin \@sbindir\@ ./bin \@MYSQLD_USER\@ mysql \@localstatedir\@ /usr/local/mysql/data \@HOSTNAME\@ @HOSTNAME@ < $SOURCE/support-files/mysql.server.sh > $BASE/support-files/mysql.server $BASE/bin/replace /my/gnu/bin/hostname /bin/hostname -- $BASE/bin/mysqld_safe mv $BASE/support-files/binary-configure $BASE/configure chmod a+x $BASE/bin/* $BASE/scripts/* $BASE/support-files/mysql-* $BASE/support-files/mysql.server $BASE/configure diff --git a/server-tools/instance-manager/Makefile.am b/server-tools/instance-manager/Makefile.am index 7b1d0383f46..18f62a04bfb 100644 --- a/server-tools/instance-manager/Makefile.am +++ b/server-tools/instance-manager/Makefile.am @@ -28,7 +28,7 @@ noinst_LIBRARIES= liboptions.a libnet.a liboptions_a_CXXFLAGS= $(CXXFLAGS) \ -DDEFAULT_PID_FILE_NAME="$(localstatedir)/mysqlmanager.pid" \ -DDEFAULT_LOG_FILE_NAME="$(localstatedir)/mysqlmanager.log" \ - -DDEFAULT_SOCKET_FILE_NAME="$(localstatedir)/mysqlmanager.sock" \ + -DDEFAULT_SOCKET_FILE_NAME="/tmp/mysqlmanager.sock" \ -DDEFAULT_PASSWORD_FILE_NAME="$(sysconfdir)/mysqlmanager.passwd" \ -DDEFAULT_MYSQLD_PATH="$(libexecdir)/mysqld$(EXEEXT)" \ -DDEFAULT_MONITORING_INTERVAL="20" \ diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh index bad340e9de1..5c3f68d0328 100644 --- a/support-files/mysql.spec.sh +++ b/support-files/mysql.spec.sh @@ -675,9 +675,9 @@ fi %defattr(-, root, root, 0755) %attr(-, root, root) %{_datadir}/sql-bench %attr(-, root, root) %{_datadir}/mysql-test -%attr(755, root, root) %{_bindir}/mysqlmanager -%attr(755, root, root) %{_bindir}/mysqlmanager-pwgen -%attr(755, root, root) %{_bindir}/mysqlmanagerc +%attr(755, root, root) %{_bindir}/mysqltestmanager +%attr(755, root, root) %{_bindir}/mysqltestmanager-pwgen +%attr(755, root, root) %{_bindir}/mysqltestmanagerc %files Max %defattr(-, root, root, 0755) @@ -691,7 +691,12 @@ fi # The spec file changelog only includes changes made to the spec file # itself - note that they must be ordered by date (important when # merging BK trees) -%changelog +%changelog +* Mon Apr 4 2005 Petr Chardin + +- old mysqlmanager, mysqlmanagerc and mysqlmanager-pwger renamed into + mysqltestmanager, mysqltestmanager and mysqltestmanager-pwgen respectively + * Fri Mar 18 2005 Lenz Grimmer - Disabled RAID in the Max binaries once and for all (it has finally been diff --git a/tools/Makefile.am b/tools/Makefile.am index 8b8ada600f5..3b84aafeaa9 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -19,9 +19,9 @@ INCLUDES=-I$(top_srcdir)/include $(openssl_includes) \ -I$(top_builddir)/include LDADD= @CLIENT_EXTRA_LDFLAGS@ @openssl_libs@ \ $(top_builddir)/libmysql_r/libmysqlclient_r.la @ZLIB_LIBS@ -bin_PROGRAMS= mysqlmanager -mysqlmanager_SOURCES= mysqlmanager.c -mysqlmanager_DEPENDENCIES= $(LIBRARIES) $(pkglib_LTLIBRARIES) +bin_PROGRAMS= mysqltestmanager +mysqltestmanager_SOURCES= mysqlmanager.c +mysqltestmanager_DEPENDENCIES= $(LIBRARIES) $(pkglib_LTLIBRARIES) DEF= -DUNDEF_THREADS_HACK # Don't update the files from bitkeeper From 41c036a60bedfbbfa07152111f310e3a3befc7ae Mon Sep 17 00:00:00 2001 From: "msvensson@neptunus.(none)" <> Date: Mon, 4 Apr 2005 12:26:05 +0200 Subject: [PATCH 040/204] BUG#6762 ALTER TABLE gives weird results and error message - Better error message when table definition has changed --- mysql-test/r/ndb_alter_table.result | 2 +- mysql-test/r/ndb_multi.result | 1 + mysql-test/t/ndb_alter_table.test | 2 +- mysql-test/t/ndb_multi.test | 2 ++ sql/ha_ndbcluster.cc | 30 +++++++++++++++++++++++++++-- 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/ndb_alter_table.result b/mysql-test/r/ndb_alter_table.result index 88ac04db111..52ae0b58d56 100644 --- a/mysql-test/r/ndb_alter_table.result +++ b/mysql-test/r/ndb_alter_table.result @@ -179,7 +179,7 @@ a b c 2 two two alter table t1 drop index c; select * from t1 where b = 'two'; -ERROR 42S02: Table 'test.t1' doesn't exist +ERROR HY000: Table definition has changed, please retry transaction select * from t1 where b = 'two'; a b c 2 two two diff --git a/mysql-test/r/ndb_multi.result b/mysql-test/r/ndb_multi.result index 4a2389cd1ff..5696fda1c07 100644 --- a/mysql-test/r/ndb_multi.result +++ b/mysql-test/r/ndb_multi.result @@ -47,3 +47,4 @@ t2 t3 t4 drop table t1, t2, t3, t4; +drop table t1, t3, t4; diff --git a/mysql-test/t/ndb_alter_table.test b/mysql-test/t/ndb_alter_table.test index f39edc0ee65..3ff2e735cb5 100644 --- a/mysql-test/t/ndb_alter_table.test +++ b/mysql-test/t/ndb_alter_table.test @@ -143,7 +143,7 @@ select * from t1 where b = 'two'; connection server1; alter table t1 drop index c; connection server2; ---error 1146 +--error 1105 select * from t1 where b = 'two'; select * from t1 where b = 'two'; connection server1; diff --git a/mysql-test/t/ndb_multi.test b/mysql-test/t/ndb_multi.test index 9286721b677..27ddd6508e9 100644 --- a/mysql-test/t/ndb_multi.test +++ b/mysql-test/t/ndb_multi.test @@ -40,5 +40,7 @@ show status like 'handler_discover%'; show tables; drop table t1, t2, t3, t4; +connection server2; +drop table t1, t3, t4; diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 92d5e6119aa..53f432ccfd5 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -113,7 +113,6 @@ static const err_code_mapping err_map[]= { 4244, HA_ERR_TABLE_EXIST, 1 }, { 709, HA_ERR_NO_SUCH_TABLE, 1 }, - { 284, HA_ERR_NO_SUCH_TABLE, 1 }, { 266, HA_ERR_LOCK_WAIT_TIMEOUT, 1 }, { 274, HA_ERR_LOCK_WAIT_TIMEOUT, 1 }, @@ -363,7 +362,7 @@ void ha_ndbcluster::invalidateDictionaryCache() int ha_ndbcluster::ndb_err(NdbConnection *trans) { int res; - const NdbError err= trans->getNdbError(); + NdbError err= trans->getNdbError(); DBUG_ENTER("ndb_err"); ERR_PRINT(err); @@ -371,6 +370,33 @@ int ha_ndbcluster::ndb_err(NdbConnection *trans) case NdbError::SchemaError: { invalidateDictionaryCache(); + + if (err.code==284) + { + /* + Check if the table is _really_ gone or if the table has + been alterend and thus changed table id + */ + NDBDICT *dict= get_ndb()->getDictionary(); + DBUG_PRINT("info", ("Check if table %s is really gone", m_tabname)); + if (!(dict->getTable(m_tabname))) + { + err= dict->getNdbError(); + DBUG_PRINT("info", ("Table not found, error: %d", err.code)); + if (err.code != 709) + DBUG_RETURN(1); + } + else + { + DBUG_PRINT("info", ("Table exist but must have changed")); + /* In 5.0, this should be replaced with a mapping to a mysql error */ + my_printf_error(ER_UNKNOWN_ERROR, + "Table definition has changed, "\ + "please retry transaction", + MYF(0)); + DBUG_RETURN(1); + } + } break; } default: From ac2efb1300e5c092acf5c8fd3d277fa5c598a816 Mon Sep 17 00:00:00 2001 From: "ramil@mysql.com" <> Date: Mon, 4 Apr 2005 16:33:23 +0500 Subject: [PATCH 041/204] Fix for bit type: we have to handle bit fields as well. --- libmysql/libmysql.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index f09b09314d0..14517e4f770 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -4258,6 +4258,7 @@ static my_bool setup_one_fetch_function(MYSQL_BIND *param, MYSQL_FIELD *field) case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_BLOB: + case MYSQL_TYPE_BIT: DBUG_ASSERT(param->buffer_length != 0); param->fetch_result= fetch_result_bin; break; @@ -4334,6 +4335,7 @@ static my_bool setup_one_fetch_function(MYSQL_BIND *param, MYSQL_FIELD *field) case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_STRING: + case MYSQL_TYPE_BIT: param->skip_result= skip_result_string; break; default: From d9f8b501db8daf8adf15eb15791cc1595dd26af9 Mon Sep 17 00:00:00 2001 From: "bar@mysql.com" <> Date: Mon, 4 Apr 2005 17:55:12 +0500 Subject: [PATCH 042/204] ctype_uca.result: fixing test results accordingly. ctype-uca.c: It appeared that in traditional Spanish collation 'RR' is not equal to 'R', as Unicode and Mimer state. We'll go Oracle and IBM way instead: No special rules to 'RR'. --- mysql-test/r/ctype_uca.result | 4 ++-- strings/ctype-uca.c | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/ctype_uca.result b/mysql-test/r/ctype_uca.result index dd5a7ebf6a4..c6e803904a3 100644 --- a/mysql-test/r/ctype_uca.result +++ b/mysql-test/r/ctype_uca.result @@ -1759,8 +1759,8 @@ P,p Ƥ,ƥ Q,q ĸ -R,RR,Rr,r,rr,Ŕ,ŕ,Ŗ,ŗ,Ř,ř -rR +R,r,Ŕ,ŕ,Ŗ,ŗ,Ř,ř +RR,Rr,rR,rr Ʀ S,s,Ś,ś,Ŝ,ŝ,Ş,ş,Š,š,ſ SS,Ss,sS,ss,ß diff --git a/strings/ctype-uca.c b/strings/ctype-uca.c index 7678ee05120..53c4fabaf08 100644 --- a/strings/ctype-uca.c +++ b/strings/ctype-uca.c @@ -6651,8 +6651,7 @@ static const char slovak[]= static const char spanish2[]= /* Also good for Asturian and Galician */ "&C < ch <<< Ch <<< CH" "&L < ll <<< Ll <<< LL" - "&N < \\u00F1 <<< \\u00D1" - "&R << rr <<< Rr <<< RR"; + "&N < \\u00F1 <<< \\u00D1"; static const char roman[]= /* i.e. Classical Latin */ "& I << j <<< J " From 5ba3f707f773f1f6a5e2c9cb948c03e68d527668 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Mon, 4 Apr 2005 16:43:25 +0300 Subject: [PATCH 043/204] Don't use -lsupc++ with gcc 3.3 and below as this gives linking problems when linking staticly Fix that mysql.proc works with new VARCHAR fields Give warnings for wrong zero dates --- configure.in | 20 ++++++++++++++----- mysql-test/r/func_time.result | 14 ++++++++++++++ mysql-test/r/row.result | 8 +++----- mysql-test/r/strict.result | 20 +++++++++++++++++++ mysql-test/r/union.result | 17 +++++++++++++++++ mysql-test/t/row.test | 2 +- mysql-test/t/strict.test | 36 ++++++++++++++++++----------------- mysql-test/t/union.test | 12 ++++++++++++ sql/item.cc | 10 +++++++--- sql/sp.cc | 33 ++++++++++++++++---------------- sql/time.cc | 3 ++- tests/mysql_client_test.c | 7 ++++++- 12 files changed, 132 insertions(+), 50 deletions(-) diff --git a/configure.in b/configure.in index f2f59bbff19..c3c792e7339 100644 --- a/configure.in +++ b/configure.in @@ -351,11 +351,21 @@ then if echo $CXX | grep gcc > /dev/null 2>&1 then - if $CXX -v 2>&1 | grep 'version 3' > /dev/null 2>&1 - then - # Statically link the language support function's found in libsupc++.a - LIBS="$LIBS -lsupc++" - fi + GCC_VERSION=`gcc -v 2>&1 | grep version | sed -e 's/[[^0-9. ]]//g; s/^ *//g; s/ .*//g'` + echo "Using gcc version '$GCC_VERSION'" + case "$GCC_VERSION" in + 3.4.*|3.5.*) + # Statically link the language support function's found in libsupc++.a + LIBS="$LIBS -lsupc++" + echo "Using -libsupc++ for static linking with gcc" + ;; + *) + # Using -lsupc++ doesn't work in gcc 3.3 on SuSE 9.2 + # (causes link failures when linking things staticly) + CXXFLAGS="$CXXFLAGS -DUSE_MYSYS_NEW -DDEFINE_CXA_PURE_VIRTUAL" + echo "Using MYSYS_NEW for static linking with gcc" + ;; + esac fi fi diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result index b30fddb8de0..4293ef5bd85 100644 --- a/mysql-test/r/func_time.result +++ b/mysql-test/r/func_time.result @@ -304,6 +304,8 @@ NULL select date_sub("0000-00-00 00:00:00",INTERVAL 1 SECOND); date_sub("0000-00-00 00:00:00",INTERVAL 1 SECOND) NULL +Warnings: +Warning 1292 Truncated incorrect datetime value: '0000-00-00 00:00:00' select date_add('1998-01-30',Interval 1 month); date_add('1998-01-30',Interval 1 month) 1998-02-28 @@ -424,6 +426,9 @@ insert into t1 values ("0000-00-00", "0000-00-00", "0000-00-00", "0000-00-00"); select dayofyear("0000-00-00"),dayofyear(d),dayofyear(dt),dayofyear(t),dayofyear(c) from t1; dayofyear("0000-00-00") dayofyear(d) dayofyear(dt) dayofyear(t) dayofyear(c) NULL NULL NULL NULL NULL +Warnings: +Warning 1292 Truncated incorrect datetime value: '0000-00-00' +Warning 1292 Truncated incorrect datetime value: '0000-00-00' select dayofmonth("0000-00-00"),dayofmonth(d),dayofmonth(dt),dayofmonth(t),dayofmonth(c) from t1; dayofmonth("0000-00-00") dayofmonth(d) dayofmonth(dt) dayofmonth(t) dayofmonth(c) 0 0 0 0 0 @@ -436,15 +441,24 @@ quarter("0000-00-00") quarter(d) quarter(dt) quarter(t) quarter(c) select week("0000-00-00"),week(d),week(dt),week(t),week(c) from t1; week("0000-00-00") week(d) week(dt) week(t) week(c) NULL NULL NULL NULL NULL +Warnings: +Warning 1292 Truncated incorrect datetime value: '0000-00-00' +Warning 1292 Truncated incorrect datetime value: '0000-00-00' select year("0000-00-00"),year(d),year(dt),year(t),year(c) from t1; year("0000-00-00") year(d) year(dt) year(t) year(c) 0 0 0 0 0 select yearweek("0000-00-00"),yearweek(d),yearweek(dt),yearweek(t),yearweek(c) from t1; yearweek("0000-00-00") yearweek(d) yearweek(dt) yearweek(t) yearweek(c) NULL NULL NULL NULL NULL +Warnings: +Warning 1292 Truncated incorrect datetime value: '0000-00-00' +Warning 1292 Truncated incorrect datetime value: '0000-00-00' select to_days("0000-00-00"),to_days(d),to_days(dt),to_days(t),to_days(c) from t1; to_days("0000-00-00") to_days(d) to_days(dt) to_days(t) to_days(c) NULL NULL NULL NULL NULL +Warnings: +Warning 1292 Truncated incorrect datetime value: '0000-00-00' +Warning 1292 Truncated incorrect datetime value: '0000-00-00' select extract(MONTH FROM "0000-00-00"),extract(MONTH FROM d),extract(MONTH FROM dt),extract(MONTH FROM t),extract(MONTH FROM c) from t1; extract(MONTH FROM "0000-00-00") extract(MONTH FROM d) extract(MONTH FROM dt) extract(MONTH FROM t) extract(MONTH FROM c) 0 0 0 0 0 diff --git a/mysql-test/r/row.result b/mysql-test/r/row.result index 691687762cb..0c75e80cb77 100644 --- a/mysql-test/r/row.result +++ b/mysql-test/r/row.result @@ -17,16 +17,14 @@ row('a',1.5,3) IN (row(1,2,3), row('a',1.5,3), row('a','a','a')) Warnings: Error 1366 Incorrect decimal value: '' for column '' at row -1 Warning 1292 Truncated incorrect INTEGER value: 'a' -select row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3)); -row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3)) -1 select row('a',0,3) IN (row(3,2,3), row('a','a','3'), row(1,3,3)); -Warnings: -Warning 1292 Truncated incorrect INTEGER value: 'a' row('a',0,3) IN (row(3,2,3), row('a','a','3'), row(1,3,3)) 1 Warnings: Warning 1292 Truncated incorrect INTEGER value: 'a' +select row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3)); +row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3)) +1 select row('a',1.5,3) IN (row(3,NULL,3), row('a',1.5,3), row(1,3,3)); row('a',1.5,3) IN (row(3,NULL,3), row('a',1.5,3), row(1,3,3)) 1 diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result index 1f8ada55061..6f332b4e087 100644 --- a/mysql-test/r/strict.result +++ b/mysql-test/r/strict.result @@ -259,17 +259,23 @@ INSERT INTO t1 (col1) VALUES(CAST('2004-10-0' AS DATE)); ERROR 22007: Incorrect date value: '2004-10-00' for column 'col1' at row 1 INSERT INTO t1 (col1) VALUES(CAST('2004-0-10' AS DATE)); ERROR 22007: Incorrect date value: '2004-00-10' for column 'col1' at row 1 +INSERT INTO t1 (col1) VALUES(CAST('0000-00-00' AS DATE)); +ERROR 22007: Truncated incorrect datetime value: '0000-00-00' INSERT INTO t1 (col2) VALUES(CAST('0000-10-31 15:30' AS DATETIME)); INSERT INTO t1 (col2) VALUES(CAST('2004-10-0 15:30' AS DATETIME)); ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col2' at row 1 INSERT INTO t1 (col2) VALUES(CAST('2004-0-10 15:30' AS DATETIME)); ERROR 22007: Incorrect datetime value: '2004-00-10 15:30:00' for column 'col2' at row 1 +INSERT INTO t1 (col2) VALUES(CAST('0000-00-00' AS DATETIME)); +ERROR 22007: Truncated incorrect datetime value: '0000-00-00' INSERT INTO t1 (col3) VALUES(CAST('0000-10-31 15:30' AS DATETIME)); ERROR 22007: Incorrect datetime value: '0000-10-31 15:30:00' for column 'col3' at row 1 INSERT INTO t1 (col3) VALUES(CAST('2004-10-0 15:30' AS DATETIME)); ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col3' at row 1 INSERT INTO t1 (col3) VALUES(CAST('2004-0-10 15:30' AS DATETIME)); ERROR 22007: Incorrect datetime value: '2004-00-10 15:30:00' for column 'col3' at row 1 +INSERT INTO t1 (col3) VALUES(CAST('0000-00-00' AS DATETIME)); +ERROR 22007: Truncated incorrect datetime value: '0000-00-00' drop table t1; CREATE TABLE t1 (col1 date, col2 datetime, col3 timestamp); INSERT INTO t1 (col1) VALUES (CONVERT('2004-10-15',DATE)); @@ -280,17 +286,23 @@ INSERT INTO t1 (col1) VALUES(CONVERT('2004-10-0' , DATE)); ERROR 22007: Incorrect date value: '2004-10-00' for column 'col1' at row 1 INSERT INTO t1 (col1) VALUES(CONVERT('2004-0-10' , DATE)); ERROR 22007: Incorrect date value: '2004-00-10' for column 'col1' at row 1 +INSERT INTO t1 (col1) VALUES(CONVERT('0000-00-00',DATE)); +ERROR 22007: Truncated incorrect datetime value: '0000-00-00' INSERT INTO t1 (col2) VALUES(CONVERT('0000-10-31 15:30',DATETIME)); INSERT INTO t1 (col2) VALUES(CONVERT('2004-10-0 15:30',DATETIME)); ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col2' at row 1 INSERT INTO t1 (col2) VALUES(CONVERT('2004-0-10 15:30',DATETIME)); ERROR 22007: Incorrect datetime value: '2004-00-10 15:30:00' for column 'col2' at row 1 +INSERT INTO t1 (col2) VALUES(CONVERT('0000-00-00',DATETIME)); +ERROR 22007: Truncated incorrect datetime value: '0000-00-00' INSERT INTO t1 (col3) VALUES(CONVERT('0000-10-31 15:30',DATETIME)); ERROR 22007: Incorrect datetime value: '0000-10-31 15:30:00' for column 'col3' at row 1 INSERT INTO t1 (col3) VALUES(CONVERT('2004-10-0 15:30',DATETIME)); ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col3' at row 1 INSERT INTO t1 (col3) VALUES(CONVERT('2004-0-10 15:30',DATETIME)); ERROR 22007: Incorrect datetime value: '2004-00-10 15:30:00' for column 'col3' at row 1 +INSERT INTO t1 (col3) VALUES(CONVERT('0000-00-00',DATETIME)); +ERROR 22007: Truncated incorrect datetime value: '0000-00-00' drop table t1; CREATE TABLE t1(col1 TINYINT, col2 TINYINT UNSIGNED); INSERT INTO t1 VALUES(-128,0),(0,0),(127,255),('-128','0'),('0','0'),('127','255'),(-128.0,0.0),(0.0,0.0),(127.0,255.0); @@ -1116,6 +1128,10 @@ insert into t1 values (0,0,0); ERROR 22007: Incorrect date value: '0' for column 'col1' at row 1 insert into t1 values (0.0,0.0,0.0); ERROR 22007: Incorrect date value: '0' for column 'col1' at row 1 +insert into t1 (col1) values (convert('0000-00-00',date)); +ERROR 22007: Truncated incorrect datetime value: '0000-00-00' +insert into t1 (col1) values (cast('0000-00-00' as date)); +ERROR 22007: Truncated incorrect datetime value: '0000-00-00' set sql_mode='no_zero_date'; insert into t1 values (0,0,0); Warnings: @@ -1138,6 +1154,9 @@ ERROR 22007: Incorrect date value: '0000-00-00' for column 'col1' at row 1 insert ignore into t1 values ('0000-00-00'); Warnings: Warning 1265 Data truncated for column 'col1' at row 1 +insert ignore into t1 (col1) values (cast('0000-00-00' as date)); +Warnings: +Warning 1292 Truncated incorrect datetime value: '0000-00-00' insert into t1 select * from t1; ERROR 22007: Incorrect date value: '0000-00-00' for column 'col1' at row 1 alter table t1 modify col1 datetime; @@ -1152,5 +1171,6 @@ select * from t1; col1 0000-00-00 00:00:00 0000-00-00 00:00:00 +NULL drop table t1; set sql_mode=@org_mode; diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 8c8e12d8838..c5295048126 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -1235,3 +1235,20 @@ show columns from t2; Field Type Null Key Default Extra a varchar(3) YES NULL drop table t2, t1; +create table t1 (a varchar(5)); +create table t2 select * from t1 union select 'abcdefghijkl'; +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` varchar(12) default NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +select row_format from information_schema.TABLES where table_schema="test" and table_name="t2"; +row_format +Dynamic +alter table t2 ROW_FORMAT=fixed; +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` varchar(12) default NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED +drop table t1,t2; diff --git a/mysql-test/t/row.test b/mysql-test/t/row.test index 58b90c9a356..afcaaef6811 100644 --- a/mysql-test/t/row.test +++ b/mysql-test/t/row.test @@ -9,9 +9,9 @@ select row(1,2,3) IN (row(3,NULL,3), row(1,2,3), row(1,3,3)); select row(10,2,3) IN (row(3,NULL,3), row(1,2,3), row(1,3,3)); --disable_ps_warnings select row('a',1.5,3) IN (row(1,2,3), row('a',1.5,3), row('a','a','a')); +select row('a',0,3) IN (row(3,2,3), row('a','a','3'), row(1,3,3)); --enable_ps_warnings select row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3)); -select row('a',0,3) IN (row(3,2,3), row('a','a','3'), row(1,3,3)); select row('a',1.5,3) IN (row(3,NULL,3), row('a',1.5,3), row(1,3,3)); select row('b',1.5,3) IN (row(3,NULL,3), row('a',1.5,3), row(1,3,3)); select row('b',1.5,3) IN (row('b',NULL,3), row('a',1.5,3), row(1,3,3)); diff --git a/mysql-test/t/strict.test b/mysql-test/t/strict.test index f98fc30ff48..9d4befb9743 100644 --- a/mysql-test/t/strict.test +++ b/mysql-test/t/strict.test @@ -284,8 +284,8 @@ INSERT INTO t1 (col1) VALUES(CAST('2004-0-10' AS DATE)); # deactivated because of Bug#6145 # Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values -#--error 1292 -#INSERT INTO t1 (col1) VALUES(CAST('0000-00-00' AS DATE)); +--error 1292 +INSERT INTO t1 (col1) VALUES(CAST('0000-00-00' AS DATE)); ## Test INSERT with CAST AS DATETIME into DATETIME # All test cases expected to fail should return @@ -308,10 +308,9 @@ INSERT INTO t1 (col2) VALUES(CAST('2004-0-10 15:30' AS DATETIME)); #--error 1292 #INSERT INTO t1 (col2) VALUES(CAST('2004-13-15 15:30' AS DATETIME)); -# deactivated because of Bug#6145 # Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values -#--error 1292 -#INSERT INTO t1 (col2) VALUES(CAST('0000-00-00' AS DATETIME)); +--error 1292 +INSERT INTO t1 (col2) VALUES(CAST('0000-00-00' AS DATETIME)); ## Test INSERT with CAST AS DATETIME into TIMESTAMP # All test cases expected to fail should return @@ -338,10 +337,9 @@ INSERT INTO t1 (col3) VALUES(CAST('2004-0-10 15:30' AS DATETIME)); #--error 1292 #INSERT INTO t1 (col3) VALUES(CAST('2004-13-15 15:30' AS DATETIME)); -# deactivated because of Bug#6145 # Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values -#--error 1292 -#INSERT INTO t1 (col3) VALUES(CAST('0000-00-00' AS DATETIME)); +--error 1292 +INSERT INTO t1 (col3) VALUES(CAST('0000-00-00' AS DATETIME)); drop table t1; @@ -376,10 +374,9 @@ INSERT INTO t1 (col1) VALUES(CONVERT('2004-0-10' , DATE)); #--error 1292 #INSERT INTO t1 (col1) VALUES(CONVERT('2004-13-15',DATE)); -# deactivated because of Bug#6145 # Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values -#--error 1292 -#INSERT INTO t1 (col1) VALUES(CONVERT('0000-00-00',DATE)); +--error 1292 +INSERT INTO t1 (col1) VALUES(CONVERT('0000-00-00',DATE)); ## Test INSERT with CONVERT to DATETIME into DATETIME # All test cases expected to fail should return @@ -403,8 +400,8 @@ INSERT INTO t1 (col2) VALUES(CONVERT('2004-0-10 15:30',DATETIME)); #INSERT INTO t1 (col2) VALUES(CONVERT('2004-13-15 15:30',DATETIME)); # Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values -#--error 1292 -#INSERT INTO t1 (col2) VALUES(CONVERT('0000-00-00',DATETIME)); +--error 1292 +INSERT INTO t1 (col2) VALUES(CONVERT('0000-00-00',DATETIME)); ## Test INSERT with CONVERT to DATETIME into DATETIME # All test cases expected to fail should return @@ -430,10 +427,9 @@ INSERT INTO t1 (col3) VALUES(CONVERT('2004-0-10 15:30',DATETIME)); #--error 1292 #INSERT INTO t1 (col3) VALUES(CONVERT('2004-13-15 15:30',DATETIME)); -# deactivated because of Bug#6145 # Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values -#--error 1292 -#INSERT INTO t1 (col3) VALUES(CONVERT('0000-00-00',DATETIME)); +--error 1292 +INSERT INTO t1 (col3) VALUES(CONVERT('0000-00-00',DATETIME)); drop table t1; @@ -1001,7 +997,7 @@ select * from t1; drop table t1; # -# Zero dates using numbers was not checked properly (Bug #5933) +# Zero dates using numbers was not checked properly (Bug #5933 & #6145) # create table t1 (col1 date, col2 datetime, col3 timestamp); @@ -1009,6 +1005,11 @@ create table t1 (col1 date, col2 datetime, col3 timestamp); insert into t1 values (0,0,0); --error 1292 insert into t1 values (0.0,0.0,0.0); +--error 1292 +insert into t1 (col1) values (convert('0000-00-00',date)); +--error 1292 +insert into t1 (col1) values (cast('0000-00-00' as date)); + set sql_mode='no_zero_date'; insert into t1 values (0,0,0); insert into t1 values (0.0,0.0,0.0); @@ -1019,6 +1020,7 @@ insert ignore into t1 values ('0000-00-00'); --error 1292 insert into t1 select * from t1; insert ignore into t1 values ('0000-00-00'); +insert ignore into t1 (col1) values (cast('0000-00-00' as date)); --error 1292 insert into t1 select * from t1; --error 1292 diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index 95b5d4c6aaf..7d3f52bd7ae 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -760,3 +760,15 @@ create table t2 select a from t1 union select c from t1; create table t2 select a from t1 union select b from t1; show columns from t2; drop table t2, t1; + +# +# Test that union with VARCHAR produces dynamic row tables +# + +create table t1 (a varchar(5)); +create table t2 select * from t1 union select 'abcdefghijkl'; +show create table t2; +select row_format from information_schema.TABLES where table_schema="test" and table_name="t2"; +alter table t2 ROW_FORMAT=fixed; +show create table t2; +drop table t1,t2; diff --git a/sql/item.cc b/sql/item.cc index b96ba2cdd66..1572efb0f23 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1474,6 +1474,10 @@ double Item_string::val_real() &error); if (error || (end != org_end && !check_if_only_end_space(cs, end, org_end))) { + /* + We can use str_value.ptr() here as Item_string is gurantee to put an + end \0 here. + */ push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_TRUNCATED_WRONG_VALUE, ER(ER_TRUNCATED_WRONG_VALUE), "DOUBLE", @@ -4902,7 +4906,7 @@ bool Item_type_holder::join_types(THD *thd, Item *item) int intp2= max_length - min(decimals, NOT_FIXED_DEC - 1); /* can't be overflow because it work only for decimals (no strings) */ int dec_length= max(intp1, intp2) + decimals; - max_length= max(max_length, max(item_length, dec_length)); + max_length= max(max_length, (uint) max(item_length, dec_length)); /* we can't allow decimals to be NOT_FIXED_DEC, to prevent creation decimal with max precision (see Field_new_decimal constcuctor) @@ -4929,8 +4933,8 @@ bool Item_type_holder::join_types(THD *thd, Item *item) } maybe_null|= item->maybe_null; get_full_info(item); - DBUG_PRINT("info:", ("become type %d len %d, dec %d", - fld_type, max_length, decimals)); + DBUG_PRINT("info", ("become type: %d len: %u dec: %u", + (int) fld_type, max_length, (uint) decimals)); DBUG_RETURN(FALSE); } diff --git a/sql/sp.cc b/sql/sp.cc index 84169ab8172..23d389cd299 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -64,8 +64,7 @@ db_find_routine_aux(THD *thd, int type, sp_name *name, enum thr_lock_type ltype, TABLE **tablep, bool *opened) { TABLE *table; - byte key[64+64+1]; // db, name, type - uint keylen; + byte key[NAME_LEN*2+4+1]; // db, name, optional key length type DBUG_ENTER("db_find_routine_aux"); DBUG_PRINT("enter", ("type: %d name: %*s", type, name->m_name.length, name->m_name.str)); @@ -78,20 +77,6 @@ db_find_routine_aux(THD *thd, int type, sp_name *name, if (!mysql_proc_table_exists && ltype == TL_READ) DBUG_RETURN(SP_OPEN_TABLE_FAILED); - // Put the key used to read the row together - keylen= name->m_db.length; - if (keylen > 64) - keylen= 64; - memcpy(key, name->m_db.str, keylen); - memset(key+keylen, (int)' ', 64-keylen); // Pad with space - keylen= name->m_name.length; - if (keylen > 64) - keylen= 64; - memcpy(key+64, name->m_name.str, keylen); - memset(key+64+keylen, (int)' ', 64-keylen); // Pad with space - key[128]= type; - keylen= sizeof(key); - if (thd->lex->proc_table) table= thd->lex->proc_table->table; else @@ -120,8 +105,22 @@ db_find_routine_aux(THD *thd, int type, sp_name *name, } mysql_proc_table_exists= 1; + /* + Create key to find row. We have to use field->store() to be able to + handle VARCHAR and CHAR fields. + Assumption here is that the three first fields in the table are + 'db', 'name' and 'type' and the first key is the primary key over the + same fields. + */ + table->field[0]->store(name->m_db.str, name->m_db.length, &my_charset_bin); + table->field[1]->store(name->m_name.str, name->m_name.length, + &my_charset_bin); + table->field[2]->store((longlong) type); + key_copy(key, table->record[0], table->key_info, + table->key_info->key_length); + if (table->file->index_read_idx(table->record[0], 0, - key, keylen, + key, table->key_info->key_length, HA_READ_KEY_EXACT)) { *tablep= NULL; diff --git a/sql/time.cc b/sql/time.cc index 52a2ae13892..a3ec2283860 100644 --- a/sql/time.cc +++ b/sql/time.cc @@ -186,6 +186,7 @@ ulong convert_month_to_period(ulong month) NOTE See description of str_to_datetime() for more information. */ + timestamp_type str_to_datetime_with_warn(const char *str, uint length, TIME *l_time, uint flags) @@ -199,7 +200,7 @@ str_to_datetime_with_warn(const char *str, uint length, TIME *l_time, (MODE_INVALID_DATES | MODE_NO_ZERO_DATE))), &was_cut); - if (was_cut) + if (was_cut || ts_type <= MYSQL_TIMESTAMP_ERROR) make_truncated_value_warning(current_thd, str, length, ts_type, NullS); return ts_type; } diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 0f117b640c3..2dd5fda6f05 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -253,7 +253,12 @@ static void client_connect() mysql_autocommit(mysql, TRUE); if (!opt_silent) + { + fprintf(stdout, "\nConnected to MySQL server version: %s (%lu)\n", + mysql_get_server_info(mysql), + (ulong) mysql_get_server_version(mysql)); fprintf(stdout, "\n Creating a test database '%s' ...", current_db); + } strxmov(query, "CREATE DATABASE IF NOT EXISTS ", current_db, NullS); rc= mysql_query(mysql, query); @@ -12662,7 +12667,7 @@ static void test_view_sp_list_fields() int rc; MYSQL_RES *res; - myheader("test_view_insert_fields"); + myheader("test_view_sp_list_fields"); rc= mysql_query(mysql, "DROP FUNCTION IF EXISTS f1"); myquery(rc); From 2b8ff6949f5f9abe83aa308e2e942ac4c6ed6f4b Mon Sep 17 00:00:00 2001 From: "serg@sergbook.mylan" <> Date: Mon, 4 Apr 2005 17:58:21 +0200 Subject: [PATCH 044/204] delete isam/merge files --- config/ac-macros/ha_isam.m4 | 15 -- include/merge.h | 93 ------------ include/nisam.h | 212 -------------------------- mysql-test/include/have_isam.inc | 4 - mysql-test/r/have_isam.require | 2 - mysql-test/t/isam.test | 247 ------------------------------- 6 files changed, 573 deletions(-) delete mode 100644 config/ac-macros/ha_isam.m4 delete mode 100644 include/merge.h delete mode 100644 include/nisam.h delete mode 100644 mysql-test/include/have_isam.inc delete mode 100644 mysql-test/r/have_isam.require delete mode 100644 mysql-test/t/isam.test diff --git a/config/ac-macros/ha_isam.m4 b/config/ac-macros/ha_isam.m4 deleted file mode 100644 index 5e354dfa624..00000000000 --- a/config/ac-macros/ha_isam.m4 +++ /dev/null @@ -1,15 +0,0 @@ -AC_DEFUN([MYSQL_CHECK_ISAM], [ - AC_ARG_WITH([isam], [ - --with-isam Enable the ISAM table type], - [with_isam="$withval"], - [with_isam=no]) - - isam_libs= - if test X"$with_isam" = X"yes" - then - AC_DEFINE([HAVE_ISAM], [1], [Using old ISAM tables]) - isam_libs="\$(top_builddir)/isam/libnisam.a\ - \$(top_builddir)/merge/libmerge.a" - fi - AC_SUBST(isam_libs) -]) diff --git a/include/merge.h b/include/merge.h deleted file mode 100644 index 97cea5fabb1..00000000000 --- a/include/merge.h +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 2000 MySQL AB - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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 */ - -/* This file should be included when using merge_isam_funktions */ -/* Author: Michael Widenius */ - -#ifndef _merge_h -#define _merge_h -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _my_base_h -#include -#endif -#ifndef _nisam_h -#include -#endif - -#define MRG_NAME_EXT ".MRG" - - /* Param to/from mrg_info */ - -typedef struct st_mrg_info /* Struct from h_info */ -{ - ulonglong records; /* Records in database */ - ulonglong deleted; /* Deleted records in database */ - ulonglong recpos; /* Pos for last used record */ - ulonglong data_file_length; - uint reclength; /* Recordlength */ - int errkey; /* With key was dupplicated on err */ - uint options; /* HA_OPTION_... used */ -} MERGE_INFO; - -typedef struct st_mrg_table_info -{ - N_INFO *table; - ulonglong file_offset; -} MRG_TABLE; - -typedef struct st_merge -{ - MRG_TABLE *open_tables,*current_table,*end_table,*last_used_table; - ulonglong records; /* records in tables */ - ulonglong del; /* Removed records */ - ulonglong data_file_length; - uint tables,options,reclength; - my_bool cache_in_use; - LIST open_list; -} MRG_INFO; - -typedef ulong mrg_off_t; - - /* Prototypes for merge-functions */ - -extern int mrg_close(MRG_INFO *file); -extern int mrg_delete(MRG_INFO *file,const byte *buff); -extern MRG_INFO *mrg_open(const char *name,int mode,int wait_if_locked); -extern int mrg_panic(enum ha_panic_function function); -extern int mrg_rfirst(MRG_INFO *file,byte *buf,int inx); -extern int mrg_rkey(MRG_INFO *file,byte *buf,int inx,const byte *key, - uint key_len, enum ha_rkey_function search_flag); -extern int mrg_rrnd(MRG_INFO *file,byte *buf, mrg_off_t pos); -extern int mrg_rsame(MRG_INFO *file,byte *record,int inx); -extern int mrg_update(MRG_INFO *file,const byte *old,const byte *new_rec); -extern int mrg_info(MRG_INFO *file,MERGE_INFO *x,int flag); -extern int mrg_lock_database(MRG_INFO *file,int lock_type); -extern int mrg_create(const char *name,const char **table_names); -extern int mrg_extra(MRG_INFO *file,enum ha_extra_function function); -extern ha_rows mrg_records_in_range(MRG_INFO *info,int inx, - const byte *start_key,uint start_key_len, - enum ha_rkey_function start_search_flag, - const byte *end_key,uint end_key_len, - enum ha_rkey_function end_search_flag); - -extern mrg_off_t mrg_position(MRG_INFO *info); -#ifdef __cplusplus -} -#endif -#endif diff --git a/include/nisam.h b/include/nisam.h deleted file mode 100644 index e8f29991a4e..00000000000 --- a/include/nisam.h +++ /dev/null @@ -1,212 +0,0 @@ -/* Copyright (C) 2000 MySQL AB - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - 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 */ - -/* This file should be included when using nisam_funktions */ -/* Author: Michael Widenius */ - -#ifndef _nisam_h -#define _nisam_h -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _my_base_h -#include -#endif - /* defines used by nisam-funktions */ - -#define N_MAXKEY 16 /* Max allowed keys */ -#define N_MAXKEY_SEG 16 /* Max segments for key */ -#define N_MAX_KEY_LENGTH 256 /* May be increased up to 500 */ -#define N_MAX_KEY_BUFF (N_MAX_KEY_LENGTH+N_MAXKEY_SEG+sizeof(double)-1) -#define N_MAX_POSSIBLE_KEY_BUFF 500+9 - -#define N_NAME_IEXT ".ISM" -#define N_NAME_DEXT ".ISD" -#define NI_POS_ERROR (~ (ulong) 0) - - - /* Param to/from nisam_info */ - -typedef struct st_n_isaminfo /* Struct from h_info */ -{ - ulong records; /* Records in database */ - ulong deleted; /* Deleted records in database */ - ulong recpos; /* Pos for last used record */ - ulong newrecpos; /* Pos if we write new record */ - ulong dupp_key_pos; /* Position to record with dupp key */ - ulong data_file_length, /* Length of data file */ - max_data_file_length, - index_file_length, - max_index_file_length, - delete_length; - uint reclength; /* Recordlength */ - uint mean_reclength; /* Mean recordlength (if packed) */ - uint keys; /* How many keys used */ - uint options; /* HA_OPTION_... used */ - int errkey, /* With key was dupplicated on err */ - sortkey; /* clustered by this key */ - File filenr; /* (uniq) filenr for datafile */ - time_t create_time; /* When table was created */ - time_t isamchk_time; - time_t update_time; - ulong *rec_per_key; /* for sql optimizing */ -} N_ISAMINFO; - - - /* Info saved on file for each info-part */ - -#ifdef __WATCOMC__ -#pragma pack(2) -#define uint uint16 /* Same format as in MSDOS */ -#endif - -#ifdef __ZTC__ -#pragma ZTC align 2 -#define uint uint16 /* Same format as in MSDOS */ -#endif - -typedef struct st_n_save_keyseg /* Key-portion */ -{ - uint8 type; /* Typ av nyckel (f|r sort) */ - uint8 flag; /* HA_DIFF_LENGTH */ - uint16 start; /* Start of key in record */ - uint16 length; /* Keylength */ -} N_SAVE_KEYSEG; - -typedef struct st_n_save_keydef /* Key definition with create & info */ -{ - uint8 flag; /* NOSAME, PACK_USED */ - uint8 keysegs; /* Number of key-segment */ - uint16 block_length; /* Length of keyblock (auto) */ - uint16 keylength; /* Tot length of keyparts (auto) */ - uint16 minlength; /* min length of (packed) key (auto) */ - uint16 maxlength; /* max length of (packed) key (auto) */ -} N_SAVE_KEYDEF; - -typedef struct st_n_save_recinfo /* Info of record */ -{ - int16 type; /* en_fieldtype */ - uint16 length; /* length of field */ -} N_SAVE_RECINFO; - - -#ifdef __ZTC__ -#pragma ZTC align -#undef uint -#endif - -#ifdef __WATCOMC__ -#pragma pack() -#undef uint -#endif - - -struct st_isam_info; /* For referense */ - -#ifndef ISAM_LIBRARY -typedef struct st_isam_info N_INFO; -#endif - -typedef struct st_n_keyseg /* Key-portion */ -{ - N_SAVE_KEYSEG base; -} N_KEYSEG; - - -typedef struct st_n_keydef /* Key definition with open & info */ -{ - N_SAVE_KEYDEF base; - N_KEYSEG seg[N_MAXKEY_SEG+1]; - int (*bin_search)(struct st_isam_info *info,struct st_n_keydef *keyinfo, - uchar *page,uchar *key, - uint key_len,uint comp_flag,uchar * *ret_pos, - uchar *buff); - uint (*get_key)(struct st_n_keydef *keyinfo,uint nod_flag,uchar * *page, - uchar *key); -} N_KEYDEF; - - -typedef struct st_decode_tree /* Decode huff-table */ -{ - uint16 *table; - uint quick_table_bits; - byte *intervalls; -} DECODE_TREE; - - -struct st_bit_buff; - -typedef struct st_n_recinfo /* Info of record */ -{ - N_SAVE_RECINFO base; -#ifndef NOT_PACKED_DATABASES - void (*unpack)(struct st_n_recinfo *rec,struct st_bit_buff *buff, - uchar *start,uchar *end); - enum en_fieldtype base_type; - uint space_length_bits,pack_type; - DECODE_TREE *huff_tree; -#endif -} N_RECINFO; - - -extern my_string nisam_log_filename; /* Name of logfile */ -extern uint nisam_block_size; -extern my_bool nisam_flush; - - /* Prototypes for nisam-functions */ - -extern int nisam_close(struct st_isam_info *file); -extern int nisam_delete(struct st_isam_info *file,const byte *buff); -extern struct st_isam_info *nisam_open(const char *name,int mode, - uint wait_if_locked); -extern int nisam_panic(enum ha_panic_function function); -extern int nisam_rfirst(struct st_isam_info *file,byte *buf,int inx); -extern int nisam_rkey(struct st_isam_info *file,byte *buf,int inx, - const byte *key, - uint key_len, enum ha_rkey_function search_flag); -extern int nisam_rlast(struct st_isam_info *file,byte *buf,int inx); -extern int nisam_rnext(struct st_isam_info *file,byte *buf,int inx); -extern int nisam_rprev(struct st_isam_info *file,byte *buf,int inx); -extern int nisam_rrnd(struct st_isam_info *file,byte *buf,ulong pos); -extern int nisam_rsame(struct st_isam_info *file,byte *record,int inx); -extern int nisam_rsame_with_pos(struct st_isam_info *file,byte *record, - int inx,ulong pos); -extern int nisam_update(struct st_isam_info *file,const byte *old, - const byte *new_record); -extern int nisam_write(struct st_isam_info *file,const byte *buff); -extern int nisam_info(struct st_isam_info *file,N_ISAMINFO *x,int flag); -extern ulong nisam_position(struct st_isam_info *info); -extern int nisam_lock_database(struct st_isam_info *file,int lock_type); -extern int nisam_create(const char *name,uint keys,N_KEYDEF *keyinfo, - N_RECINFO *recinfo,ulong records, - ulong reloc,uint flags,uint options, - ulong data_file_length); -extern int nisam_extra(struct st_isam_info *file, - enum ha_extra_function function); -extern ulong nisam_records_in_range(struct st_isam_info *info,int inx, - const byte *start_key,uint start_key_len, - enum ha_rkey_function start_search_flag, - const byte *end_key,uint end_key_len, - enum ha_rkey_function end_search_flag); -extern int nisam_log(int activate_log); -extern int nisam_is_changed(struct st_isam_info *info); -extern uint _calc_blob_length(uint length , const byte *pos); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/mysql-test/include/have_isam.inc b/mysql-test/include/have_isam.inc deleted file mode 100644 index 830170c921f..00000000000 --- a/mysql-test/include/have_isam.inc +++ /dev/null @@ -1,4 +0,0 @@ --- require r/have_isam.require -disable_query_log; -show variables like "have_isam"; -enable_query_log; diff --git a/mysql-test/r/have_isam.require b/mysql-test/r/have_isam.require deleted file mode 100644 index 9b4142361ed..00000000000 --- a/mysql-test/r/have_isam.require +++ /dev/null @@ -1,2 +0,0 @@ -Variable_name Value -have_isam YES diff --git a/mysql-test/t/isam.test b/mysql-test/t/isam.test deleted file mode 100644 index f77d29fd20f..00000000000 --- a/mysql-test/t/isam.test +++ /dev/null @@ -1,247 +0,0 @@ --- source include/have_isam.inc - ---disable_warnings -drop table if exists t1,t2; ---enable_warnings - -# -# Test possible problem with rows that are about 65535 bytes long -# - -create table t1 (a tinyint not null auto_increment, b blob not null, primary key (a)) engine=isam; - -let $1=100; -disable_query_log; ---disable_warnings -while ($1) -{ - eval insert into t1 (b) values(repeat(char(65+$1),65540-$1)); - dec $1; -} -enable_query_log; ---enable_warnings -delete from t1 where (a & 1); -select sum(length(b)) from t1; -drop table t1; - -# -# Test of auto_increment; The test for BDB tables is in bdb.test -# - -create table t1 (a int not null auto_increment,b int, primary key (a)) engine=isam; -insert into t1 values (1,1),(NULL,2),(3,3),(NULL,4); -delete from t1 where a=4 or a=2; -insert into t1 values (NULL,4),(NULL,5),(6,6); -select * from t1; -delete from t1 where a=6; -#show table status like "t1"; -replace t1 values (3,1); -replace t1 values (3,3); -ALTER TABLE t1 add c int; -insert into t1 values (NULL,6,6); -select * from t1; -drop table t1; - -# -# Test of some CREATE TABLE's that should fail -# ---error 1121 -create table t1 (a int,b text, index(a)) engine=isam; ---error 1073 -create table t1 (a int,b text, index(b)) engine=isam; ---error 1075 -create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) engine=isam; ---error 1121 -create table t1 (ordid int(8), unique (ordid)) engine=isam; -drop table if exists t1; - -# -# Test of some show commands -# - -create table t1 (a int not null primary key, b int not null,c int not null, key(b,c)); -insert into t1 values (1,2,2),(2,2,3),(3,2,4),(4,2,4); -create table t2 engine=isam select * from t1; -optimize table t1; -check table t1,t2; -repair table t1,t2; -check table t2,t1; -lock tables t1 write; -check table t2,t1; -show columns from t1; -show full columns from t1; -show index from t1; -drop table t1,t2; - -# -# test of table with huge number of packed fields -# - -create table t1 (i1 int, i2 int, i3 int, i4 int, i5 int, i6 int, i7 int, i8 -int, i9 int, i10 int, i11 int, i12 int, i13 int, i14 int, i15 int, i16 int, i17 -int, i18 int, i19 int, i20 int, i21 int, i22 int, i23 int, i24 int, i25 int, -i26 int, i27 int, i28 int, i29 int, i30 int, i31 int, i32 int, i33 int, i34 -int, i35 int, i36 int, i37 int, i38 int, i39 int, i40 int, i41 int, i42 int, -i43 int, i44 int, i45 int, i46 int, i47 int, i48 int, i49 int, i50 int, i51 -int, i52 int, i53 int, i54 int, i55 int, i56 int, i57 int, i58 int, i59 int, -i60 int, i61 int, i62 int, i63 int, i64 int, i65 int, i66 int, i67 int, i68 -int, i69 int, i70 int, i71 int, i72 int, i73 int, i74 int, i75 int, i76 int, -i77 int, i78 int, i79 int, i80 int, i81 int, i82 int, i83 int, i84 int, i85 -int, i86 int, i87 int, i88 int, i89 int, i90 int, i91 int, i92 int, i93 int, -i94 int, i95 int, i96 int, i97 int, i98 int, i99 int, i100 int, i101 int, i102 -int, i103 int, i104 int, i105 int, i106 int, i107 int, i108 int, i109 int, i110 -int, i111 int, i112 int, i113 int, i114 int, i115 int, i116 int, i117 int, i118 -int, i119 int, i120 int, i121 int, i122 int, i123 int, i124 int, i125 int, i126 -int, i127 int, i128 int, i129 int, i130 int, i131 int, i132 int, i133 int, i134 -int, i135 int, i136 int, i137 int, i138 int, i139 int, i140 int, i141 int, i142 -int, i143 int, i144 int, i145 int, i146 int, i147 int, i148 int, i149 int, i150 -int, i151 int, i152 int, i153 int, i154 int, i155 int, i156 int, i157 int, i158 -int, i159 int, i160 int, i161 int, i162 int, i163 int, i164 int, i165 int, i166 -int, i167 int, i168 int, i169 int, i170 int, i171 int, i172 int, i173 int, i174 -int, i175 int, i176 int, i177 int, i178 int, i179 int, i180 int, i181 int, i182 -int, i183 int, i184 int, i185 int, i186 int, i187 int, i188 int, i189 int, i190 -int, i191 int, i192 int, i193 int, i194 int, i195 int, i196 int, i197 int, i198 -int, i199 int, i200 int, i201 int, i202 int, i203 int, i204 int, i205 int, i206 -int, i207 int, i208 int, i209 int, i210 int, i211 int, i212 int, i213 int, i214 -int, i215 int, i216 int, i217 int, i218 int, i219 int, i220 int, i221 int, i222 -int, i223 int, i224 int, i225 int, i226 int, i227 int, i228 int, i229 int, i230 -int, i231 int, i232 int, i233 int, i234 int, i235 int, i236 int, i237 int, i238 -int, i239 int, i240 int, i241 int, i242 int, i243 int, i244 int, i245 int, i246 -int, i247 int, i248 int, i249 int, i250 int, i251 int, i252 int, i253 int, i254 -int, i255 int, i256 int, i257 int, i258 int, i259 int, i260 int, i261 int, i262 -int, i263 int, i264 int, i265 int, i266 int, i267 int, i268 int, i269 int, i270 -int, i271 int, i272 int, i273 int, i274 int, i275 int, i276 int, i277 int, i278 -int, i279 int, i280 int, i281 int, i282 int, i283 int, i284 int, i285 int, i286 -int, i287 int, i288 int, i289 int, i290 int, i291 int, i292 int, i293 int, i294 -int, i295 int, i296 int, i297 int, i298 int, i299 int, i300 int, i301 int, i302 -int, i303 int, i304 int, i305 int, i306 int, i307 int, i308 int, i309 int, i310 -int, i311 int, i312 int, i313 int, i314 int, i315 int, i316 int, i317 int, i318 -int, i319 int, i320 int, i321 int, i322 int, i323 int, i324 int, i325 int, i326 -int, i327 int, i328 int, i329 int, i330 int, i331 int, i332 int, i333 int, i334 -int, i335 int, i336 int, i337 int, i338 int, i339 int, i340 int, i341 int, i342 -int, i343 int, i344 int, i345 int, i346 int, i347 int, i348 int, i349 int, i350 -int, i351 int, i352 int, i353 int, i354 int, i355 int, i356 int, i357 int, i358 -int, i359 int, i360 int, i361 int, i362 int, i363 int, i364 int, i365 int, i366 -int, i367 int, i368 int, i369 int, i370 int, i371 int, i372 int, i373 int, i374 -int, i375 int, i376 int, i377 int, i378 int, i379 int, i380 int, i381 int, i382 -int, i383 int, i384 int, i385 int, i386 int, i387 int, i388 int, i389 int, i390 -int, i391 int, i392 int, i393 int, i394 int, i395 int, i396 int, i397 int, i398 -int, i399 int, i400 int, i401 int, i402 int, i403 int, i404 int, i405 int, i406 -int, i407 int, i408 int, i409 int, i410 int, i411 int, i412 int, i413 int, i414 -int, i415 int, i416 int, i417 int, i418 int, i419 int, i420 int, i421 int, i422 -int, i423 int, i424 int, i425 int, i426 int, i427 int, i428 int, i429 int, i430 -int, i431 int, i432 int, i433 int, i434 int, i435 int, i436 int, i437 int, i438 -int, i439 int, i440 int, i441 int, i442 int, i443 int, i444 int, i445 int, i446 -int, i447 int, i448 int, i449 int, i450 int, i451 int, i452 int, i453 int, i454 -int, i455 int, i456 int, i457 int, i458 int, i459 int, i460 int, i461 int, i462 -int, i463 int, i464 int, i465 int, i466 int, i467 int, i468 int, i469 int, i470 -int, i471 int, i472 int, i473 int, i474 int, i475 int, i476 int, i477 int, i478 -int, i479 int, i480 int, i481 int, i482 int, i483 int, i484 int, i485 int, i486 -int, i487 int, i488 int, i489 int, i490 int, i491 int, i492 int, i493 int, i494 -int, i495 int, i496 int, i497 int, i498 int, i499 int, i500 int, i501 int, i502 -int, i503 int, i504 int, i505 int, i506 int, i507 int, i508 int, i509 int, i510 -int, i511 int, i512 int, i513 int, i514 int, i515 int, i516 int, i517 int, i518 -int, i519 int, i520 int, i521 int, i522 int, i523 int, i524 int, i525 int, i526 -int, i527 int, i528 int, i529 int, i530 int, i531 int, i532 int, i533 int, i534 -int, i535 int, i536 int, i537 int, i538 int, i539 int, i540 int, i541 int, i542 -int, i543 int, i544 int, i545 int, i546 int, i547 int, i548 int, i549 int, i550 -int, i551 int, i552 int, i553 int, i554 int, i555 int, i556 int, i557 int, i558 -int, i559 int, i560 int, i561 int, i562 int, i563 int, i564 int, i565 int, i566 -int, i567 int, i568 int, i569 int, i570 int, i571 int, i572 int, i573 int, i574 -int, i575 int, i576 int, i577 int, i578 int, i579 int, i580 int, i581 int, i582 -int, i583 int, i584 int, i585 int, i586 int, i587 int, i588 int, i589 int, i590 -int, i591 int, i592 int, i593 int, i594 int, i595 int, i596 int, i597 int, i598 -int, i599 int, i600 int, i601 int, i602 int, i603 int, i604 int, i605 int, i606 -int, i607 int, i608 int, i609 int, i610 int, i611 int, i612 int, i613 int, i614 -int, i615 int, i616 int, i617 int, i618 int, i619 int, i620 int, i621 int, i622 -int, i623 int, i624 int, i625 int, i626 int, i627 int, i628 int, i629 int, i630 -int, i631 int, i632 int, i633 int, i634 int, i635 int, i636 int, i637 int, i638 -int, i639 int, i640 int, i641 int, i642 int, i643 int, i644 int, i645 int, i646 -int, i647 int, i648 int, i649 int, i650 int, i651 int, i652 int, i653 int, i654 -int, i655 int, i656 int, i657 int, i658 int, i659 int, i660 int, i661 int, i662 -int, i663 int, i664 int, i665 int, i666 int, i667 int, i668 int, i669 int, i670 -int, i671 int, i672 int, i673 int, i674 int, i675 int, i676 int, i677 int, i678 -int, i679 int, i680 int, i681 int, i682 int, i683 int, i684 int, i685 int, i686 -int, i687 int, i688 int, i689 int, i690 int, i691 int, i692 int, i693 int, i694 -int, i695 int, i696 int, i697 int, i698 int, i699 int, i700 int, i701 int, i702 -int, i703 int, i704 int, i705 int, i706 int, i707 int, i708 int, i709 int, i710 -int, i711 int, i712 int, i713 int, i714 int, i715 int, i716 int, i717 int, i718 -int, i719 int, i720 int, i721 int, i722 int, i723 int, i724 int, i725 int, i726 -int, i727 int, i728 int, i729 int, i730 int, i731 int, i732 int, i733 int, i734 -int, i735 int, i736 int, i737 int, i738 int, i739 int, i740 int, i741 int, i742 -int, i743 int, i744 int, i745 int, i746 int, i747 int, i748 int, i749 int, i750 -int, i751 int, i752 int, i753 int, i754 int, i755 int, i756 int, i757 int, i758 -int, i759 int, i760 int, i761 int, i762 int, i763 int, i764 int, i765 int, i766 -int, i767 int, i768 int, i769 int, i770 int, i771 int, i772 int, i773 int, i774 -int, i775 int, i776 int, i777 int, i778 int, i779 int, i780 int, i781 int, i782 -int, i783 int, i784 int, i785 int, i786 int, i787 int, i788 int, i789 int, i790 -int, i791 int, i792 int, i793 int, i794 int, i795 int, i796 int, i797 int, i798 -int, i799 int, i800 int, i801 int, i802 int, i803 int, i804 int, i805 int, i806 -int, i807 int, i808 int, i809 int, i810 int, i811 int, i812 int, i813 int, i814 -int, i815 int, i816 int, i817 int, i818 int, i819 int, i820 int, i821 int, i822 -int, i823 int, i824 int, i825 int, i826 int, i827 int, i828 int, i829 int, i830 -int, i831 int, i832 int, i833 int, i834 int, i835 int, i836 int, i837 int, i838 -int, i839 int, i840 int, i841 int, i842 int, i843 int, i844 int, i845 int, i846 -int, i847 int, i848 int, i849 int, i850 int, i851 int, i852 int, i853 int, i854 -int, i855 int, i856 int, i857 int, i858 int, i859 int, i860 int, i861 int, i862 -int, i863 int, i864 int, i865 int, i866 int, i867 int, i868 int, i869 int, i870 -int, i871 int, i872 int, i873 int, i874 int, i875 int, i876 int, i877 int, i878 -int, i879 int, i880 int, i881 int, i882 int, i883 int, i884 int, i885 int, i886 -int, i887 int, i888 int, i889 int, i890 int, i891 int, i892 int, i893 int, i894 -int, i895 int, i896 int, i897 int, i898 int, i899 int, i900 int, i901 int, i902 -int, i903 int, i904 int, i905 int, i906 int, i907 int, i908 int, i909 int, i910 -int, i911 int, i912 int, i913 int, i914 int, i915 int, i916 int, i917 int, i918 -int, i919 int, i920 int, i921 int, i922 int, i923 int, i924 int, i925 int, i926 -int, i927 int, i928 int, i929 int, i930 int, i931 int, i932 int, i933 int, i934 -int, i935 int, i936 int, i937 int, i938 int, i939 int, i940 int, i941 int, i942 -int, i943 int, i944 int, i945 int, i946 int, i947 int, i948 int, i949 int, i950 -int, i951 int, i952 int, i953 int, i954 int, i955 int, i956 int, i957 int, i958 -int, i959 int, i960 int, i961 int, i962 int, i963 int, i964 int, i965 int, i966 -int, i967 int, i968 int, i969 int, i970 int, i971 int, i972 int, i973 int, i974 -int, i975 int, i976 int, i977 int, i978 int, i979 int, i980 int, i981 int, i982 -int, i983 int, i984 int, i985 int, i986 int, i987 int, i988 int, i989 int, i990 -int, i991 int, i992 int, i993 int, i994 int, i995 int, i996 int, i997 int, i998 -int, i999 int, i1000 int, b blob) row_format=dynamic; -insert into t1 values (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Sergei"); -update t1 set b=repeat('a',256); -update t1 set i1=0, i2=0, i3=0, i4=0, i5=0, i6=0, i7=0; -check table t1; -drop table t1; From 63aa88638a9c403e57c99b6cb5a1497008439b0e Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Mon, 4 Apr 2005 19:27:28 +0300 Subject: [PATCH 045/204] ha_innodb.cc: Fix bug #9526 in InnoDB: the internal type of an ENUM or SET is an unsigned integer type, not a character string --- sql/ha_innodb.cc | 52 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 0bdd620706d..f06ede1e984 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -1923,8 +1923,11 @@ inline ulint get_innobase_type_from_mysql_type( /*==============================*/ - /* out: DATA_BINARY, DATA_VARCHAR, ... */ - Field* field) /* in: MySQL field */ + /* out: DATA_BINARY, DATA_VARCHAR, ... */ + ulint* unsigned_flag, /* out: DATA_UNSIGNED if an 'unsigned type'; + at least ENUM and SET, and unsigned integer + types are 'unsigned types' */ + Field* field) /* in: MySQL field */ { /* The following asserts try to check that the MySQL type code fits in 8 bits: this is used in ibuf and also when DATA_NOT_NULL is ORed to @@ -1936,6 +1939,27 @@ get_innobase_type_from_mysql_type( DBUG_ASSERT((ulint)FIELD_TYPE_FLOAT < 256); DBUG_ASSERT((ulint)FIELD_TYPE_DECIMAL < 256); + if (field->flags & UNSIGNED_FLAG) { + + *unsigned_flag = DATA_UNSIGNED; + } else { + *unsigned_flag = 0; + } + + if (field->real_type() == FIELD_TYPE_ENUM + || field->real_type() == FIELD_TYPE_SET) { + + /* MySQL has field->type() a string type for these, but the + data is actually internally stored as an unsigned integer + code! */ + + *unsigned_flag = DATA_UNSIGNED; /* MySQL has its own unsigned + flag set to zero, even though + internally this is an unsigned + integer type */ + return(DATA_INT); + } + switch (field->type()) { /* NOTE that we only allow string types in DATA_MYSQL and DATA_VARMYSQL */ @@ -1968,8 +1992,6 @@ get_innobase_type_from_mysql_type( case FIELD_TYPE_DATETIME: case FIELD_TYPE_YEAR: case FIELD_TYPE_NEWDATE: - case FIELD_TYPE_ENUM: - case FIELD_TYPE_SET: case FIELD_TYPE_TIME: case FIELD_TYPE_TIMESTAMP: return(DATA_INT); @@ -2247,10 +2269,10 @@ build_template( get_field_offset(table, field); templ->mysql_col_len = (ulint) field->pack_length(); - templ->type = get_innobase_type_from_mysql_type(field); + templ->type = get_innobase_type_from_mysql_type( + &templ->is_unsigned, field); templ->charset = dtype_get_charset_coll_noninline( index->table->cols[i].type.prtype); - templ->is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); if (templ->type == DATA_BLOB) { prebuilt->templ_contains_blob = TRUE; @@ -2676,9 +2698,8 @@ calc_row_difference( o_len = field->pack_length(); n_len = field->pack_length(); - col_type = get_innobase_type_from_mysql_type(field); - is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); - + col_type = get_innobase_type_from_mysql_type(&is_unsigned, + field); switch (col_type) { case DATA_BLOB: @@ -3546,19 +3567,14 @@ create_table_def( for (i = 0; i < n_cols; i++) { field = form->field[i]; - col_type = get_innobase_type_from_mysql_type(field); + col_type = get_innobase_type_from_mysql_type(&unsigned_type, + field); if (field->null_ptr) { nulls_allowed = 0; } else { nulls_allowed = DATA_NOT_NULL; } - if (field->flags & UNSIGNED_FLAG) { - unsigned_type = DATA_UNSIGNED; - } else { - unsigned_type = 0; - } - if (field->binary()) { binary_type = DATA_BINARY_TYPE; } else { @@ -3612,6 +3628,7 @@ create_index( ulint ind_type; ulint col_type; ulint prefix_len; + ulint is_unsigned; ulint i; ulint j; @@ -3661,7 +3678,8 @@ create_index( ut_a(j < form->fields); - col_type = get_innobase_type_from_mysql_type(key_part->field); + col_type = get_innobase_type_from_mysql_type( + &is_unsigned, key_part->field); if (DATA_BLOB == col_type || key_part->length < field->pack_length()) { From 73a8d1bcad19d36e90c9f155f1b67daef19d38c9 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Mon, 4 Apr 2005 19:41:52 +0300 Subject: [PATCH 046/204] ha_innodb.cc: Correct the fix of Bug #9526 : InnoDB must use its own internal type info for old tables, so that old ENUMs and SETs still are (incorrectly) seen as char strings; we do not dare to allow InnoDB sometimes to see the type as an integer type for those old tables --- sql/ha_innodb.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index f06ede1e984..3e3a48f4ab9 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -2269,8 +2269,9 @@ build_template( get_field_offset(table, field); templ->mysql_col_len = (ulint) field->pack_length(); - templ->type = get_innobase_type_from_mysql_type( - &templ->is_unsigned, field); + templ->type = index->table->cols[i].type.mtype; + templ->is_unsigned = index->table->cols[i].type.prtype + & DATA_UNSIGNED; templ->charset = dtype_get_charset_coll_noninline( index->table->cols[i].type.prtype); @@ -2698,8 +2699,9 @@ calc_row_difference( o_len = field->pack_length(); n_len = field->pack_length(); - col_type = get_innobase_type_from_mysql_type(&is_unsigned, - field); + col_type = prebuilt->table->cols[i].type.mtype; + is_unsigned = prebuilt->table->cols[i].type.prtype & + DATA_UNSIGNED; switch (col_type) { case DATA_BLOB: @@ -2741,8 +2743,7 @@ calc_row_difference( (mysql_byte*)n_ptr, n_len, col_type, is_unsigned); ufield->exp = NULL; - ufield->field_no = - (prebuilt->table->cols + i)->clust_pos; + ufield->field_no = prebuilt->table->cols[i].clust_pos; n_changed++; } } From a226b4aff2c21be79812d5be89d45d052cef2492 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Mon, 4 Apr 2005 20:31:04 +0300 Subject: [PATCH 047/204] ha_innodb.cc, row0sel.c: Fix Bug #9526 in 5.0: MySQL ENUM and SET columns are internally actually unsigned integer types; we must take care that old tables still treat ENUM and SET (incorrectly) as a character string, while new created tables treat it correctly as an unsigned integer --- innobase/row/row0sel.c | 8 ++++-- sql/ha_innodb.cc | 62 ++++++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c index 10fc89bbb37..09a6f1eacff 100644 --- a/innobase/row/row0sel.c +++ b/innobase/row/row0sel.c @@ -2145,12 +2145,16 @@ row_sel_convert_mysql_key_to_innobase( } if (dtype_get_mysql_type(dfield_get_type(dfield)) - == DATA_MYSQL_TRUE_VARCHAR) { + == DATA_MYSQL_TRUE_VARCHAR + && dfield_get_type(dfield)->mtype != DATA_INT) { /* In a MySQL key value format, a true VARCHAR is always preceded by 2 bytes of a length field. dfield_get_type(dfield)->len returns the maximum 'payload' len in bytes. That does not include the - 2 bytes that tell the actual data length. */ + 2 bytes that tell the actual data length. + + We added the check != DATA_INT to make sure we do + not treat MySQL ENUM or SET as a true VARCHAR! */ data_len += 2; data_field_len += 2; diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index e29560f15a5..5365eee8f38 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -2271,13 +2271,43 @@ inline ulint get_innobase_type_from_mysql_type( /*==============================*/ - /* out: DATA_BINARY, DATA_VARCHAR, ... */ - Field* field) /* in: MySQL field */ + /* out: DATA_BINARY, DATA_VARCHAR, ... */ + ulint* unsigned_flag, /* out: DATA_UNSIGNED if an 'unsigned type'; + at least ENUM and SET, and unsigned integer + types are 'unsigned types' */ + Field* field) /* in: MySQL field */ { /* The following asserts try to check that the MySQL type code fits in 8 bits: this is used in ibuf and also when DATA_NOT_NULL is ORed to the type */ + DBUG_ASSERT((ulint)FIELD_TYPE_STRING < 256); + DBUG_ASSERT((ulint)FIELD_TYPE_VAR_STRING < 256); + DBUG_ASSERT((ulint)FIELD_TYPE_DOUBLE < 256); + DBUG_ASSERT((ulint)FIELD_TYPE_FLOAT < 256); + DBUG_ASSERT((ulint)FIELD_TYPE_DECIMAL < 256); + + if (field->flags & UNSIGNED_FLAG) { + + *unsigned_flag = DATA_UNSIGNED; + } else { + *unsigned_flag = 0; + } + + if (field->real_type() == FIELD_TYPE_ENUM + || field->real_type() == FIELD_TYPE_SET) { + + /* MySQL has field->type() a string type for these, but the + data is actually internally stored as an unsigned integer + code! */ + + *unsigned_flag = DATA_UNSIGNED; /* MySQL has its own unsigned + flag set to zero, even though + internally this is an unsigned + integer type */ + return(DATA_INT); + } + switch (field->type()) { /* NOTE that we only allow string types in DATA_MYSQL and DATA_VARMYSQL */ @@ -2313,8 +2343,6 @@ get_innobase_type_from_mysql_type( case FIELD_TYPE_DATETIME: case FIELD_TYPE_YEAR: case FIELD_TYPE_NEWDATE: - case FIELD_TYPE_ENUM: - case FIELD_TYPE_SET: case FIELD_TYPE_TIME: case FIELD_TYPE_TIMESTAMP: return(DATA_INT); @@ -2686,7 +2714,7 @@ build_template( get_field_offset(table, field); templ->mysql_col_len = (ulint) field->pack_length(); - templ->type = get_innobase_type_from_mysql_type(field); + templ->type = index->table->cols[i].type.mtype; templ->mysql_type = (ulint)field->type(); if (templ->mysql_type == DATA_MYSQL_TRUE_VARCHAR) { @@ -2698,8 +2726,8 @@ build_template( index->table->cols[i].type.prtype); templ->mbminlen = index->table->cols[i].type.mbminlen; templ->mbmaxlen = index->table->cols[i].type.mbmaxlen; - templ->is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); - + templ->is_unsigned = index->table->cols[i].type.prtype + & DATA_UNSIGNED; if (templ->type == DATA_BLOB) { prebuilt->templ_contains_blob = TRUE; } @@ -2962,7 +2990,6 @@ calc_row_difference( byte* buf; upd_field_t* ufield; ulint col_type; - ulint is_unsigned; ulint n_changed = 0; dfield_t dfield; uint i; @@ -2998,8 +3025,7 @@ calc_row_difference( field_mysql_type = field->type(); - col_type = get_innobase_type_from_mysql_type(field); - is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); + col_type = prebuilt->table->cols[i].type.mtype; switch (col_type) { @@ -3072,8 +3098,7 @@ calc_row_difference( } ufield->exp = NULL; - ufield->field_no = - (prebuilt->table->cols + i)->clust_pos; + ufield->field_no = prebuilt->table->cols[i].clust_pos; n_changed++; } } @@ -3932,19 +3957,14 @@ create_table_def( for (i = 0; i < n_cols; i++) { field = form->field[i]; - col_type = get_innobase_type_from_mysql_type(field); + col_type = get_innobase_type_from_mysql_type(&unsigned_type, + field); if (field->null_ptr) { nulls_allowed = 0; } else { nulls_allowed = DATA_NOT_NULL; } - if (field->flags & UNSIGNED_FLAG) { - unsigned_type = DATA_UNSIGNED; - } else { - unsigned_type = 0; - } - if (field->binary()) { binary_type = DATA_BINARY_TYPE; } else { @@ -4021,6 +4041,7 @@ create_index( ulint ind_type; ulint col_type; ulint prefix_len; + ulint is_unsigned; ulint i; ulint j; @@ -4070,7 +4091,8 @@ create_index( ut_a(j < form->s->fields); - col_type = get_innobase_type_from_mysql_type(key_part->field); + col_type = get_innobase_type_from_mysql_type( + &is_unsigned, key_part->field); if (DATA_BLOB == col_type || (key_part->length < field->pack_length() From 8e19abff0eeab7462141c25270c369e2331372ff Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Mon, 4 Apr 2005 21:38:05 +0200 Subject: [PATCH 048/204] Fix Bug #9517 Condition pushdown to storage engine does not work for update/delete --- mysql-test/r/ndb_condition_pushdown.result | 58 ++++++++++++++++++++- mysql-test/t/ndb_condition_pushdown.test | 59 ++++++++++++++++++++++ sql/records.cc | 7 +++ 3 files changed, 123 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/ndb_condition_pushdown.result b/mysql-test/r/ndb_condition_pushdown.result index f9f4104b4ea..7f769154212 100644 --- a/mysql-test/r/ndb_condition_pushdown.result +++ b/mysql-test/r/ndb_condition_pushdown.result @@ -1023,6 +1023,62 @@ auto 1 3 4 +update t1 +set medium = 17 +where +string = "aaaa" and +vstring = "aaaa" and +bin = 0xAAAA and +vbin = 0xAAAA and +tiny = -1 and +short = -1 and +medium = -1 and +long_int = -1 and +longlong = -1 and +real_float > 1.0 and real_float < 2.0 and +real_double > 1.0 and real_double < 2.0 and +real_decimal > 1.0 and real_decimal < 2.0 and +utiny = 1 and +ushort = 1 and +umedium = 1 and +ulong = 1 and +ulonglong = 1 and +/* bits = b'001' and */ +options = 'one' and +flags = 'one' and +date_field = '1901-01-01' and +year_field = '1901' and +time_field = '01:01:01' and +date_time = '1901-01-01 01:01:01'; +delete from t1 +where +string = "aaaa" and +vstring = "aaaa" and +bin = 0xAAAA and +vbin = 0xAAAA and +tiny = -1 and +short = -1 and +medium = 17 and +long_int = -1 and +longlong = -1 and +real_float > 1.0 and real_float < 2.0 and +real_double > 1.0 and real_double < 2.0 and +real_decimal > 1.0 and real_decimal < 2.0 and +utiny = 1 and +ushort = 1 and +umedium = 1 and +ulong = 1 and +ulonglong = 1 and +/* bits = b'001' and */ +options = 'one' and +flags = 'one' and +date_field = '1901-01-01' and +year_field = '1901' and +time_field = '01:01:01' and +date_time = '1901-01-01 01:01:01'; +select count(*) from t1; +count(*) +3 explain select * from t2 where attr3 is null or attr1 > 2 and pk1= 3 order by pk1; id select_type table type possible_keys key key_len ref rows Extra @@ -1078,7 +1134,7 @@ pk1 attr1 attr2 attr3 attr4 pk1 attr1 attr2 attr3 attr4 explain select auto from t1 where string = "aaaa" collate latin1_general_ci order by auto; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where; Using filesort +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where; Using filesort explain select * from t2 where (attr1 < 2) = (attr2 < 2) order by pk1; id select_type table type possible_keys key key_len ref rows Extra diff --git a/mysql-test/t/ndb_condition_pushdown.test b/mysql-test/t/ndb_condition_pushdown.test index 540e018ad04..0ada161b813 100644 --- a/mysql-test/t/ndb_condition_pushdown.test +++ b/mysql-test/t/ndb_condition_pushdown.test @@ -954,6 +954,65 @@ bin not like concat(0xBB, '%') and vbin not like concat(0xBB, '%') order by auto; +# Update test +update t1 +set medium = 17 +where +string = "aaaa" and +vstring = "aaaa" and +bin = 0xAAAA and +vbin = 0xAAAA and +tiny = -1 and +short = -1 and +medium = -1 and +long_int = -1 and +longlong = -1 and +real_float > 1.0 and real_float < 2.0 and +real_double > 1.0 and real_double < 2.0 and +real_decimal > 1.0 and real_decimal < 2.0 and +utiny = 1 and +ushort = 1 and +umedium = 1 and +ulong = 1 and +ulonglong = 1 and +/* bits = b'001' and */ +options = 'one' and +flags = 'one' and +date_field = '1901-01-01' and +year_field = '1901' and +time_field = '01:01:01' and +date_time = '1901-01-01 01:01:01'; + +# Delete test +delete from t1 +where +string = "aaaa" and +vstring = "aaaa" and +bin = 0xAAAA and +vbin = 0xAAAA and +tiny = -1 and +short = -1 and +medium = 17 and +long_int = -1 and +longlong = -1 and +real_float > 1.0 and real_float < 2.0 and +real_double > 1.0 and real_double < 2.0 and +real_decimal > 1.0 and real_decimal < 2.0 and +utiny = 1 and +ushort = 1 and +umedium = 1 and +ulong = 1 and +ulonglong = 1 and +/* bits = b'001' and */ +options = 'one' and +flags = 'one' and +date_field = '1901-01-01' and +year_field = '1901' and +time_field = '01:01:01' and +date_time = '1901-01-01 01:01:01'; + +select count(*) from t1; + # Various tests explain select * from t2 where attr3 is null or attr1 > 2 and pk1= 3 order by pk1; diff --git a/sql/records.cc b/sql/records.cc index 00da1ac1adc..28a8e9a9aa5 100644 --- a/sql/records.cc +++ b/sql/records.cc @@ -128,6 +128,13 @@ void init_read_record(READ_RECORD *info,THD *thd, TABLE *table, VOID(table->file->extra_opt(HA_EXTRA_CACHE, thd->variables.read_buff_size)); } + /* Condition pushdown to storage engine */ + if (thd->variables.engine_condition_pushdown && + select && select->cond && + select->cond->used_tables() & table->map && + !(select->quick || table->file->pushed_cond)) + table->file->cond_push(select->cond); + DBUG_VOID_RETURN; } /* init_read_record */ From c18307e8a2f77f4e036dcfb9a2efcf9f00e57479 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Mon, 4 Apr 2005 12:43:58 -0700 Subject: [PATCH 049/204] Cleanup tests and results after merge from 4.1 of embedded server testing cleanups. --- mysql-test/r/innodb.result | 4 +- mysql-test/r/insert_select-binlog.result | 10 +- mysql-test/r/mix_innodb_myisam_binlog.result | 20 +- mysql-test/r/ps_1general.result | 14 +- mysql-test/r/ps_grant.result | 18 +- mysql-test/r/view.result | 304 -------------- mysql-test/r/view_grant.result | 304 ++++++++++++++ mysql-test/t/client_xml.test | 3 + mysql-test/t/flush_read_lock_kill.test | 3 + mysql-test/t/grant3.test | 3 + mysql-test/t/information_schema.test | 2 + mysql-test/t/innodb.test | 8 +- mysql-test/t/multi_update.test | 3 + mysql-test/t/mysqlshow.test | 3 + mysql-test/t/ps_1general.test | 16 +- mysql-test/t/ps_grant.test | 13 + mysql-test/t/sp-security.test | 3 + mysql-test/t/user_limits.test | 3 + mysql-test/t/view.test | 401 ------------------- mysql-test/t/view_grant.test | 401 +++++++++++++++++++ 20 files changed, 782 insertions(+), 754 deletions(-) create mode 100644 mysql-test/r/view_grant.result create mode 100644 mysql-test/t/view_grant.test diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index 16f639962cd..3f9962144ff 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -1606,7 +1606,7 @@ t2 CREATE TABLE `t2` ( ) ENGINE=InnoDB DEFAULT CHARSET=latin1 drop table t2; create table t2 (id int(11) not null, id2 int(11) not null, constraint t1_id_fk foreign key (id2,id) references t1 (id)) engine = innodb; -ERROR HY000: Can't create table './test/t2.frm' (errno: 150) +ERROR HY000: Can't create table './test/t2' (errno: 150) create table t2 (a int auto_increment primary key, b int, index(b), foreign key (b) references t1(id), unique(b)) engine=innodb; show create table t2; Table Create Table @@ -2360,7 +2360,7 @@ length(v) 65530 drop table t1; create table t1 (v varchar(65530), key(v)); -ERROR HY000: Can't create table './test/t1.frm' (errno: 139) +ERROR HY000: Can't create table './test/t1' (errno: 139) create table t1 (v varchar(65536)); Warnings: Note 1246 Converting column 'v' from VARCHAR to TEXT diff --git a/mysql-test/r/insert_select-binlog.result b/mysql-test/r/insert_select-binlog.result index bca28059787..76f460b1de2 100644 --- a/mysql-test/r/insert_select-binlog.result +++ b/mysql-test/r/insert_select-binlog.result @@ -6,9 +6,9 @@ reset master; insert into t1 select * from t2; ERROR 23000: Duplicate entry '2' for key 1 show binlog events; -Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.000001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3 -master-bin.000001 79 Query 1 79 use `test`; insert into t1 select * from t2 +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4 +master-bin.000001 98 Query 1 192 use `test`; insert into t1 select * from t2 select * from t1; a 1 @@ -20,6 +20,6 @@ reset master; create table t2(unique(a)) select a from t1; ERROR 23000: Duplicate entry '1' for key 1 show binlog events; -Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.000001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3 +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4 drop table t1; diff --git a/mysql-test/r/mix_innodb_myisam_binlog.result b/mysql-test/r/mix_innodb_myisam_binlog.result index 7821c074202..e4528450b31 100644 --- a/mysql-test/r/mix_innodb_myisam_binlog.result +++ b/mysql-test/r/mix_innodb_myisam_binlog.result @@ -11,7 +11,7 @@ Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 98 Query 1 # use `test`; BEGIN master-bin.000001 166 Query 1 # use `test`; insert into t1 values(1) master-bin.000001 253 Query 1 # use `test`; insert into t2 select * from t1 -master-bin.000001 347 Xid 1 # COMMIT /* xid=7 */ +master-bin.000001 347 Xid 1 # COMMIT /* xid=8 */ delete from t1; delete from t2; reset master; @@ -47,7 +47,7 @@ master-bin.000001 253 Query 1 # use `test`; savepoint my_savepoint master-bin.000001 338 Query 1 # use `test`; insert into t1 values(4) master-bin.000001 425 Query 1 # use `test`; insert into t2 select * from t1 master-bin.000001 519 Query 1 # use `test`; rollback to savepoint my_savepoint -master-bin.000001 616 Xid 1 # COMMIT /* xid=24 */ +master-bin.000001 616 Xid 1 # COMMIT /* xid=25 */ delete from t1; delete from t2; reset master; @@ -74,7 +74,7 @@ master-bin.000001 338 Query 1 # use `test`; insert into t1 values(6) master-bin.000001 425 Query 1 # use `test`; insert into t2 select * from t1 master-bin.000001 519 Query 1 # use `test`; rollback to savepoint my_savepoint master-bin.000001 616 Query 1 # use `test`; insert into t1 values(7) -master-bin.000001 703 Xid 1 # COMMIT /* xid=36 */ +master-bin.000001 703 Xid 1 # COMMIT /* xid=37 */ delete from t1; delete from t2; reset master; @@ -101,7 +101,7 @@ insert into t2 select * from t1; show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 98 Query 1 # use `test`; insert into t1 values(9) -master-bin.000001 185 Xid 1 # COMMIT /* xid=59 */ +master-bin.000001 185 Xid 1 # COMMIT /* xid=60 */ master-bin.000001 212 Query 1 # use `test`; insert into t2 select * from t1 delete from t1; delete from t2; @@ -112,18 +112,18 @@ insert into t2 select * from t1; show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 98 Query 1 # use `test`; insert into t1 values(10) -master-bin.000001 186 Xid 1 # COMMIT /* xid=65 */ +master-bin.000001 186 Xid 1 # COMMIT /* xid=66 */ master-bin.000001 213 Query 1 # use `test`; insert into t2 select * from t1 insert into t1 values(11); commit; show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 98 Query 1 # use `test`; insert into t1 values(10) -master-bin.000001 186 Xid 1 # COMMIT /* xid=65 */ +master-bin.000001 186 Xid 1 # COMMIT /* xid=66 */ master-bin.000001 213 Query 1 # use `test`; insert into t2 select * from t1 master-bin.000001 307 Query 1 # use `test`; BEGIN master-bin.000001 375 Query 1 # use `test`; insert into t1 values(11) -master-bin.000001 463 Xid 1 # COMMIT /* xid=67 */ +master-bin.000001 463 Xid 1 # COMMIT /* xid=68 */ alter table t2 engine=INNODB; delete from t1; delete from t2; @@ -137,7 +137,7 @@ Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 98 Query 1 # use `test`; BEGIN master-bin.000001 166 Query 1 # use `test`; insert into t1 values(12) master-bin.000001 254 Query 1 # use `test`; insert into t2 select * from t1 -master-bin.000001 348 Xid 1 # COMMIT /* xid=77 */ +master-bin.000001 348 Xid 1 # COMMIT /* xid=78 */ delete from t1; delete from t2; reset master; @@ -161,7 +161,7 @@ show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 98 Query 1 # use `test`; BEGIN master-bin.000001 166 Query 1 # use `test`; insert into t1 values(14) -master-bin.000001 254 Xid 1 # COMMIT /* xid=93 */ +master-bin.000001 254 Xid 1 # COMMIT /* xid=94 */ delete from t1; delete from t2; reset master; @@ -182,7 +182,7 @@ Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 98 Query 1 # use `test`; BEGIN master-bin.000001 166 Query 1 # use `test`; insert into t1 values(16) master-bin.000001 254 Query 1 # use `test`; insert into t1 values(18) -master-bin.000001 342 Xid 1 # COMMIT /* xid=104 */ +master-bin.000001 342 Xid 1 # COMMIT /* xid=105 */ delete from t1; delete from t2; alter table t2 type=MyISAM; diff --git a/mysql-test/r/ps_1general.result b/mysql-test/r/ps_1general.result index 9a9da7cae09..0fe907ac8c1 100644 --- a/mysql-test/r/ps_1general.result +++ b/mysql-test/r/ps_1general.result @@ -410,18 +410,6 @@ create database mysqltest ; prepare stmt3 from ' drop database mysqltest '; ERROR HY000: This command is not supported in the prepared statement protocol yet drop database mysqltest ; -prepare stmt3 from ' grant all on test.t1 to drop_user@localhost -identified by ''looser'' '; -ERROR HY000: This command is not supported in the prepared statement protocol yet -grant all on test.t1 to drop_user@localhost -identified by 'looser' ; -prepare stmt3 from ' revoke all privileges on test.t1 from -drop_user@localhost '; -ERROR HY000: This command is not supported in the prepared statement protocol yet -revoke all privileges on test.t1 from drop_user@localhost ; -prepare stmt3 from ' drop user drop_user@localhost '; -ERROR HY000: This command is not supported in the prepared statement protocol yet -drop user drop_user@localhost; prepare stmt3 from ' describe t2 '; execute stmt3; Field Type Null Key Default Extra @@ -572,7 +560,7 @@ drop table t2; prepare stmt1 from ' rename table t5 to t6, t7 to t8 ' ; create table t5 (a int) ; execute stmt1 ; -ERROR HY000: Can't find file: './test/t7.frm' (errno: 2) +ERROR HY000: Can't find file: './test/t7' (errno: 2) create table t7 (a int) ; execute stmt1 ; execute stmt1 ; diff --git a/mysql-test/r/ps_grant.result b/mysql-test/r/ps_grant.result index 4c60bb03165..3a302ba3ba8 100644 --- a/mysql-test/r/ps_grant.result +++ b/mysql-test/r/ps_grant.result @@ -36,19 +36,19 @@ identified by 'looser' ; show grants for second_user@localhost ; Grants for second_user@localhost GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' -GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost' +GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' drop table mysqltest.t9 ; show grants for second_user@localhost ; Grants for second_user@localhost GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' -GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost' +GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' show grants for second_user@localhost ; Grants for second_user@localhost GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' -GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost' +GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost' prepare s_t1 from 'select a as my_col from t1' ; execute s_t1 ; my_col @@ -79,3 +79,15 @@ commit ; show grants for second_user@localhost ; ERROR 42000: There is no such grant defined for user 'second_user' on host 'localhost' drop database mysqltest; +prepare stmt3 from ' grant all on test.t1 to drop_user@localhost +identified by ''looser'' '; +ERROR HY000: This command is not supported in the prepared statement protocol yet +grant all on test.t1 to drop_user@localhost +identified by 'looser' ; +prepare stmt3 from ' revoke all privileges on test.t1 from +drop_user@localhost '; +ERROR HY000: This command is not supported in the prepared statement protocol yet +revoke all privileges on test.t1 from drop_user@localhost ; +prepare stmt3 from ' drop user drop_user@localhost '; +ERROR HY000: This command is not supported in the prepared statement protocol yet +drop user drop_user@localhost; diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 3162a3b5061..417617c0e3c 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -192,15 +192,6 @@ c d 1 3 2 5 3 10 -grant create view on test.* to test@localhost; -show grants for test@localhost; -Grants for test@localhost -GRANT USAGE ON *.* TO 'test'@'localhost' -GRANT CREATE VIEW ON `test`.* TO 'test'@'localhost' -revoke create view on test.* from test@localhost; -show grants for test@localhost; -Grants for test@localhost -GRANT USAGE ON *.* TO 'test'@'localhost' drop view v100; ERROR 42S02: Unknown table 'test.v100' drop view t1; @@ -230,143 +221,6 @@ a a 2 2 drop view v1, v2; drop table t1; -create database mysqltest; -create table mysqltest.t1 (a int, b int); -create table mysqltest.t2 (a int, b int); -grant select on mysqltest.t1 to mysqltest_1@localhost; -grant create view,select on test.* to mysqltest_1@localhost; -create view v1 as select * from mysqltest.t1; -alter view v1 as select * from mysqltest.t1; -ERROR 42000: DROP command denied to user 'mysqltest_1'@'localhost' for table 'v1' -create or replace view v1 as select * from mysqltest.t1; -ERROR 42000: DROP command denied to user 'mysqltest_1'@'localhost' for table 'v1' -create view mysqltest.v2 as select * from mysqltest.t1; -ERROR 42000: CREATE VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v2' -create view v2 as select * from mysqltest.t2; -ERROR 42000: ANY command denied to user 'mysqltest_1'@'localhost' for table 't2' -grant create view,drop,select on test.* to mysqltest_1@localhost; -use test; -alter view v1 as select * from mysqltest.t1; -create or replace view v1 as select * from mysqltest.t1; -revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; -revoke all privileges on test.* from mysqltest_1@localhost; -drop database mysqltest; -drop view test.v1; -create database mysqltest; -create table mysqltest.t1 (a int, b int); -create view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; -grant select (c) on mysqltest.v1 to mysqltest_1@localhost; -select c from mysqltest.v1; -c -select d from mysqltest.v1; -ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for column 'd' in table 'v1' -revoke all privileges on mysqltest.v1 from mysqltest_1@localhost; -delete from mysql.user where user='mysqltest_1'; -drop database mysqltest; -create database mysqltest; -create table mysqltest.t1 (a int, b int); -create algorithm=temptable view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; -grant select (c) on mysqltest.v1 to mysqltest_1@localhost; -select c from mysqltest.v1; -c -select d from mysqltest.v1; -ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for column 'd' in table 'v1' -revoke all privileges on mysqltest.v1 from mysqltest_1@localhost; -delete from mysql.user where user='mysqltest_1'; -drop database mysqltest; -create database mysqltest; -create table mysqltest.t1 (a int, b int); -create table mysqltest.t2 (a int, b int); -create view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; -create algorithm=temptable view mysqltest.v2 (c,d) as select a+1,b+1 from mysqltest.t1; -create view mysqltest.v3 (c,d) as select a+1,b+1 from mysqltest.t2; -create algorithm=temptable view mysqltest.v4 (c,d) as select a+1,b+1 from mysqltest.t2; -grant select on mysqltest.v1 to mysqltest_1@localhost; -grant select on mysqltest.v2 to mysqltest_1@localhost; -grant select on mysqltest.v3 to mysqltest_1@localhost; -grant select on mysqltest.v4 to mysqltest_1@localhost; -select c from mysqltest.v1; -c -select c from mysqltest.v2; -c -select c from mysqltest.v3; -c -select c from mysqltest.v4; -c -show columns from mysqltest.v1; -Field Type Null Key Default Extra -c bigint(20) YES NULL -d bigint(20) YES NULL -show columns from mysqltest.v2; -Field Type Null Key Default Extra -c bigint(20) YES NULL -d bigint(20) YES NULL -explain select c from mysqltest.v1; -ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table -show create view mysqltest.v1; -ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v1' -explain select c from mysqltest.v2; -ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table -show create view mysqltest.v2; -ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v2' -explain select c from mysqltest.v3; -ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table -show create view mysqltest.v3; -ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v3' -explain select c from mysqltest.v4; -ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table -show create view mysqltest.v4; -ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v4' -grant select on mysqltest.t1 to mysqltest_1@localhost; -explain select c from mysqltest.v1; -id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found -show create view mysqltest.v1; -ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v1' -explain select c from mysqltest.v2; -id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY system NULL NULL NULL NULL 0 const row not found -2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table -show create view mysqltest.v2; -ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v2' -explain select c from mysqltest.v3; -ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table -show create view mysqltest.v3; -ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v3' -explain select c from mysqltest.v4; -ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table -show create view mysqltest.v4; -ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v4' -grant show view on mysqltest.* to mysqltest_1@localhost; -explain select c from mysqltest.v1; -id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found -show create view mysqltest.v1; -View Create View -v1 CREATE ALGORITHM=UNDEFINED VIEW `mysqltest`.`v1` AS select (`mysqltest`.`t1`.`a` + 1) AS `c`,(`mysqltest`.`t1`.`b` + 1) AS `d` from `mysqltest`.`t1` -explain select c from mysqltest.v2; -id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY system NULL NULL NULL NULL 0 const row not found -2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table -show create view mysqltest.v2; -View Create View -v2 CREATE ALGORITHM=TEMPTABLE VIEW `mysqltest`.`v2` AS select (`mysqltest`.`t1`.`a` + 1) AS `c`,(`mysqltest`.`t1`.`b` + 1) AS `d` from `mysqltest`.`t1` -explain select c from mysqltest.v3; -id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t2 system NULL NULL NULL NULL 0 const row not found -show create view mysqltest.v3; -View Create View -v3 CREATE ALGORITHM=UNDEFINED VIEW `mysqltest`.`v3` AS select (`mysqltest`.`t2`.`a` + 1) AS `c`,(`mysqltest`.`t2`.`b` + 1) AS `d` from `mysqltest`.`t2` -explain select c from mysqltest.v4; -id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY system NULL NULL NULL NULL 0 const row not found -2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table -show create view mysqltest.v4; -View Create View -v4 CREATE ALGORITHM=TEMPTABLE VIEW `mysqltest`.`v4` AS select (`mysqltest`.`t2`.`a` + 1) AS `c`,(`mysqltest`.`t2`.`b` + 1) AS `d` from `mysqltest`.`t2` -revoke all privileges on mysqltest.* from mysqltest_1@localhost; -delete from mysql.user where user='mysqltest_1'; -drop database mysqltest; create table t1 (a int); insert into t1 values (1), (2), (3), (1), (2), (3); create view v1 as select distinct a from t1; @@ -513,61 +367,6 @@ a b 50 10 drop table t1,t2; drop view v1,v2; -create database mysqltest; -create table mysqltest.t1 (a int, b int, primary key(a)); -insert into mysqltest.t1 values (10,2), (20,3), (30,4), (40,5), (50,10); -create table mysqltest.t2 (x int); -insert into mysqltest.t2 values (3), (4), (5), (6); -create view mysqltest.v1 (a,c) as select a, b+1 from mysqltest.t1; -create view mysqltest.v2 (a,c) as select a, b from mysqltest.t1; -create view mysqltest.v3 (a,c) as select a, b+1 from mysqltest.t1; -grant update (a) on mysqltest.v2 to mysqltest_1@localhost; -grant update on mysqltest.v1 to mysqltest_1@localhost; -grant select on mysqltest.* to mysqltest_1@localhost; -use mysqltest; -update t2,v1 set v1.a=v1.a+v1.c where t2.x=v1.c; -select * from t1; -a b -13 2 -24 3 -35 4 -46 5 -50 10 -update v1 set a=a+c; -select * from t1; -a b -16 2 -28 3 -40 4 -52 5 -61 10 -update t2,v2 set v2.a=v2.a+v2.c where t2.x=v2.c; -select * from t1; -a b -16 2 -31 3 -44 4 -57 5 -61 10 -update v2 set a=a+c; -select * from t1; -a b -18 2 -34 3 -48 4 -62 5 -71 10 -update t2,v2 set v2.c=v2.a+v2.c where t2.x=v2.c; -ERROR 42000: UPDATE command denied to user 'mysqltest_1'@'localhost' for column 'c' in table 'v2' -update v2 set c=a+c; -ERROR 42000: UPDATE command denied to user 'mysqltest_1'@'localhost' for column 'c' in table 'v2' -update t2,v3 set v3.a=v3.a+v3.c where t2.x=v3.c; -ERROR 42000: UPDATE command denied to user 'mysqltest_1'@'localhost' for table 'v3' -update v3 set a=a+c; -ERROR 42000: UPDATE command denied to user 'mysqltest_1'@'localhost' for table 'v3' -use test; -REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; -drop database mysqltest; create table t1 (a int, b int, primary key(b)); insert into t1 values (1,20), (2,30), (3,40), (4,50), (5,100); create view v1 (c) as select b from t1 where a<3; @@ -637,34 +436,6 @@ a b 5 10 drop table t1,t2; drop view v1,v2; -create database mysqltest; -create table mysqltest.t1 (a int, b int, primary key(a)); -insert into mysqltest.t1 values (1,2), (2,3), (3,4), (4,5), (5,10); -create table mysqltest.t2 (x int); -insert into mysqltest.t2 values (3), (4), (5), (6); -create view mysqltest.v1 (a,c) as select a, b+1 from mysqltest.t1; -create view mysqltest.v2 (a,c) as select a, b+1 from mysqltest.t1; -grant delete on mysqltest.v1 to mysqltest_1@localhost; -grant select on mysqltest.* to mysqltest_1@localhost; -use mysqltest; -delete from v1 where c < 4; -select * from t1; -a b -2 3 -3 4 -4 5 -5 10 -delete v1 from t2,v1 where t2.x=v1.c; -select * from t1; -a b -5 10 -delete v2 from t2,v2 where t2.x=v2.c; -ERROR 42000: DELETE command denied to user 'mysqltest_1'@'localhost' for table 'v2' -delete from v2 where c < 4; -ERROR 42000: DELETE command denied to user 'mysqltest_1'@'localhost' for table 'v2' -use test; -REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; -drop database mysqltest; create table t1 (a int, b int, c int, primary key(a,b)); insert into t1 values (10,2,-1), (20,3,-2), (30,4,-3), (40,5,-4), (50,10,-5); create view v1 (x,y) as select a, b from t1; @@ -745,36 +516,6 @@ a b c 40 5 NULL drop table t1, t2; drop view v1,v2,v3,v4,v5; -create database mysqltest; -create table mysqltest.t1 (a int, b int, primary key(a)); -insert into mysqltest.t1 values (1,2), (2,3); -create table mysqltest.t2 (x int, y int); -insert into mysqltest.t2 values (3,4); -create view mysqltest.v1 (a,c) as select a, b from mysqltest.t1; -create view mysqltest.v2 (a,c) as select a, b from mysqltest.t1; -grant insert on mysqltest.v1 to mysqltest_1@localhost; -grant select on mysqltest.* to mysqltest_1@localhost; -use mysqltest; -insert into v1 values (5,6); -select * from t1; -a b -1 2 -2 3 -5 6 -insert into v1 select x,y from t2; -select * from t1; -a b -1 2 -2 3 -5 6 -3 4 -insert into v2 values (5,6); -ERROR 42000: INSERT command denied to user 'mysqltest_1'@'localhost' for table 'v2' -insert into v2 select x,y from t2; -ERROR 42000: INSERT command denied to user 'mysqltest_1'@'localhost' for table 'v2' -use test; -REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; -drop database mysqltest; create table t1 (a int, primary key(a)); insert into t1 values (1), (2), (3); create view v1 (x) as select a from t1 where a > 1; @@ -819,44 +560,6 @@ a b 2 2 drop view v1; drop table t1; -create database mysqltest; -create table mysqltest.t1 (a int, b int); -create table mysqltest.t2 (a int, b int); -grant update on mysqltest.t1 to mysqltest_1@localhost; -grant update(b) on mysqltest.t2 to mysqltest_1@localhost; -grant create view,update on test.* to mysqltest_1@localhost; -create view v1 as select * from mysqltest.t1; -create view v2 as select b from mysqltest.t2; -create view mysqltest.v1 as select * from mysqltest.t1; -ERROR 42000: CREATE VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v1' -create view v3 as select a from mysqltest.t2; -ERROR 42000: ANY command denied to user 'mysqltest_1'@'localhost' for column 'a' in table 't2' -create table mysqltest.v3 (b int); -grant create view on mysqltest.v3 to mysqltest_1@localhost; -drop table mysqltest.v3; -create view mysqltest.v3 as select b from mysqltest.t2; -grant create view, update on mysqltest.v3 to mysqltest_1@localhost; -drop view mysqltest.v3; -create view mysqltest.v3 as select b from mysqltest.t2; -grant create view, update, insert on mysqltest.v3 to mysqltest_1@localhost; -drop view mysqltest.v3; -create view mysqltest.v3 as select b from mysqltest.t2; -ERROR 42000: create view command denied to user 'mysqltest_1'@'localhost' for column 'b' in table 'v3' -create table mysqltest.v3 (b int); -grant select(b) on mysqltest.v3 to mysqltest_1@localhost; -drop table mysqltest.v3; -create view mysqltest.v3 as select b from mysqltest.t2; -ERROR 42000: CREATE VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v3' -create view v4 as select b+1 from mysqltest.t2; -ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for column 'b' in table 't2' -grant create view,update,select on test.* to mysqltest_1@localhost; -create view v4 as select b+1 from mysqltest.t2; -ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for column 'b' in table 't2' -grant update,select(b) on mysqltest.t2 to mysqltest_1@localhost; -create view v4 as select b+1 from mysqltest.t2; -REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; -drop database mysqltest; -drop view v1,v2,v4; set sql_mode='ansi'; create table t1 ("a*b" int); create view v1 as select "a*b" from t1; @@ -1629,13 +1332,6 @@ Field 3,'Field 4| |Field 6| | 'Field 7'| drop view v1; drop table t1; -create database mysqltest; -create table mysqltest.t1 (a int); -grant all privileges on mysqltest.* to mysqltest_1@localhost; -use mysqltest; -create view v1 as select * from t1; -revoke all privileges on mysqltest.* from mysqltest_1@localhost; -drop database mysqltest; create table t1 (s1 smallint); create view v1 as select * from t1 where 20 < (select (s1) from t1); insert into v1 values (30); diff --git a/mysql-test/r/view_grant.result b/mysql-test/r/view_grant.result new file mode 100644 index 00000000000..df8e2b04f47 --- /dev/null +++ b/mysql-test/r/view_grant.result @@ -0,0 +1,304 @@ +grant create view on test.* to test@localhost; +show grants for test@localhost; +Grants for test@localhost +GRANT USAGE ON *.* TO 'test'@'localhost' +GRANT CREATE VIEW ON `test`.* TO 'test'@'localhost' +revoke create view on test.* from test@localhost; +show grants for test@localhost; +Grants for test@localhost +GRANT USAGE ON *.* TO 'test'@'localhost' +create database mysqltest; +create table mysqltest.t1 (a int, b int); +create table mysqltest.t2 (a int, b int); +grant select on mysqltest.t1 to mysqltest_1@localhost; +grant create view,select on test.* to mysqltest_1@localhost; +create view v1 as select * from mysqltest.t1; +alter view v1 as select * from mysqltest.t1; +ERROR 42000: DROP command denied to user 'mysqltest_1'@'localhost' for table 'v1' +create or replace view v1 as select * from mysqltest.t1; +ERROR 42000: DROP command denied to user 'mysqltest_1'@'localhost' for table 'v1' +create view mysqltest.v2 as select * from mysqltest.t1; +ERROR 42000: CREATE VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v2' +create view v2 as select * from mysqltest.t2; +ERROR 42000: ANY command denied to user 'mysqltest_1'@'localhost' for table 't2' +grant create view,drop,select on test.* to mysqltest_1@localhost; +use test; +alter view v1 as select * from mysqltest.t1; +create or replace view v1 as select * from mysqltest.t1; +revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; +revoke all privileges on test.* from mysqltest_1@localhost; +drop database mysqltest; +drop view test.v1; +create database mysqltest; +create table mysqltest.t1 (a int, b int); +create view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; +grant select (c) on mysqltest.v1 to mysqltest_1@localhost; +select c from mysqltest.v1; +c +select d from mysqltest.v1; +ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for column 'd' in table 'v1' +revoke all privileges on mysqltest.v1 from mysqltest_1@localhost; +delete from mysql.user where user='mysqltest_1'; +drop database mysqltest; +create database mysqltest; +create table mysqltest.t1 (a int, b int); +create algorithm=temptable view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; +grant select (c) on mysqltest.v1 to mysqltest_1@localhost; +select c from mysqltest.v1; +c +select d from mysqltest.v1; +ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for column 'd' in table 'v1' +revoke all privileges on mysqltest.v1 from mysqltest_1@localhost; +delete from mysql.user where user='mysqltest_1'; +drop database mysqltest; +create database mysqltest; +create table mysqltest.t1 (a int, b int); +create table mysqltest.t2 (a int, b int); +create view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; +create algorithm=temptable view mysqltest.v2 (c,d) as select a+1,b+1 from mysqltest.t1; +create view mysqltest.v3 (c,d) as select a+1,b+1 from mysqltest.t2; +create algorithm=temptable view mysqltest.v4 (c,d) as select a+1,b+1 from mysqltest.t2; +grant select on mysqltest.v1 to mysqltest_1@localhost; +grant select on mysqltest.v2 to mysqltest_1@localhost; +grant select on mysqltest.v3 to mysqltest_1@localhost; +grant select on mysqltest.v4 to mysqltest_1@localhost; +select c from mysqltest.v1; +c +select c from mysqltest.v2; +c +select c from mysqltest.v3; +c +select c from mysqltest.v4; +c +show columns from mysqltest.v1; +Field Type Null Key Default Extra +c bigint(20) YES NULL +d bigint(20) YES NULL +show columns from mysqltest.v2; +Field Type Null Key Default Extra +c bigint(20) YES NULL +d bigint(20) YES NULL +explain select c from mysqltest.v1; +ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table +show create view mysqltest.v1; +ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v1' +explain select c from mysqltest.v2; +ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table +show create view mysqltest.v2; +ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v2' +explain select c from mysqltest.v3; +ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table +show create view mysqltest.v3; +ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v3' +explain select c from mysqltest.v4; +ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table +show create view mysqltest.v4; +ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v4' +grant select on mysqltest.t1 to mysqltest_1@localhost; +explain select c from mysqltest.v1; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found +show create view mysqltest.v1; +ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v1' +explain select c from mysqltest.v2; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY system NULL NULL NULL NULL 0 const row not found +2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table +show create view mysqltest.v2; +ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v2' +explain select c from mysqltest.v3; +ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table +show create view mysqltest.v3; +ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v3' +explain select c from mysqltest.v4; +ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table +show create view mysqltest.v4; +ERROR 42000: SHOW VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v4' +grant show view on mysqltest.* to mysqltest_1@localhost; +explain select c from mysqltest.v1; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found +show create view mysqltest.v1; +View Create View +v1 CREATE ALGORITHM=UNDEFINED VIEW `mysqltest`.`v1` AS select (`mysqltest`.`t1`.`a` + 1) AS `c`,(`mysqltest`.`t1`.`b` + 1) AS `d` from `mysqltest`.`t1` +explain select c from mysqltest.v2; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY system NULL NULL NULL NULL 0 const row not found +2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table +show create view mysqltest.v2; +View Create View +v2 CREATE ALGORITHM=TEMPTABLE VIEW `mysqltest`.`v2` AS select (`mysqltest`.`t1`.`a` + 1) AS `c`,(`mysqltest`.`t1`.`b` + 1) AS `d` from `mysqltest`.`t1` +explain select c from mysqltest.v3; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t2 system NULL NULL NULL NULL 0 const row not found +show create view mysqltest.v3; +View Create View +v3 CREATE ALGORITHM=UNDEFINED VIEW `mysqltest`.`v3` AS select (`mysqltest`.`t2`.`a` + 1) AS `c`,(`mysqltest`.`t2`.`b` + 1) AS `d` from `mysqltest`.`t2` +explain select c from mysqltest.v4; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY system NULL NULL NULL NULL 0 const row not found +2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table +show create view mysqltest.v4; +View Create View +v4 CREATE ALGORITHM=TEMPTABLE VIEW `mysqltest`.`v4` AS select (`mysqltest`.`t2`.`a` + 1) AS `c`,(`mysqltest`.`t2`.`b` + 1) AS `d` from `mysqltest`.`t2` +revoke all privileges on mysqltest.* from mysqltest_1@localhost; +delete from mysql.user where user='mysqltest_1'; +drop database mysqltest; +create database mysqltest; +create table mysqltest.t1 (a int, b int, primary key(a)); +insert into mysqltest.t1 values (10,2), (20,3), (30,4), (40,5), (50,10); +create table mysqltest.t2 (x int); +insert into mysqltest.t2 values (3), (4), (5), (6); +create view mysqltest.v1 (a,c) as select a, b+1 from mysqltest.t1; +create view mysqltest.v2 (a,c) as select a, b from mysqltest.t1; +create view mysqltest.v3 (a,c) as select a, b+1 from mysqltest.t1; +grant update (a) on mysqltest.v2 to mysqltest_1@localhost; +grant update on mysqltest.v1 to mysqltest_1@localhost; +grant select on mysqltest.* to mysqltest_1@localhost; +use mysqltest; +update t2,v1 set v1.a=v1.a+v1.c where t2.x=v1.c; +select * from t1; +a b +13 2 +24 3 +35 4 +46 5 +50 10 +update v1 set a=a+c; +select * from t1; +a b +16 2 +28 3 +40 4 +52 5 +61 10 +update t2,v2 set v2.a=v2.a+v2.c where t2.x=v2.c; +select * from t1; +a b +16 2 +31 3 +44 4 +57 5 +61 10 +update v2 set a=a+c; +select * from t1; +a b +18 2 +34 3 +48 4 +62 5 +71 10 +update t2,v2 set v2.c=v2.a+v2.c where t2.x=v2.c; +ERROR 42000: UPDATE command denied to user 'mysqltest_1'@'localhost' for column 'c' in table 'v2' +update v2 set c=a+c; +ERROR 42000: UPDATE command denied to user 'mysqltest_1'@'localhost' for column 'c' in table 'v2' +update t2,v3 set v3.a=v3.a+v3.c where t2.x=v3.c; +ERROR 42000: UPDATE command denied to user 'mysqltest_1'@'localhost' for table 'v3' +update v3 set a=a+c; +ERROR 42000: UPDATE command denied to user 'mysqltest_1'@'localhost' for table 'v3' +use test; +REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; +drop database mysqltest; +create database mysqltest; +create table mysqltest.t1 (a int, b int, primary key(a)); +insert into mysqltest.t1 values (1,2), (2,3), (3,4), (4,5), (5,10); +create table mysqltest.t2 (x int); +insert into mysqltest.t2 values (3), (4), (5), (6); +create view mysqltest.v1 (a,c) as select a, b+1 from mysqltest.t1; +create view mysqltest.v2 (a,c) as select a, b+1 from mysqltest.t1; +grant delete on mysqltest.v1 to mysqltest_1@localhost; +grant select on mysqltest.* to mysqltest_1@localhost; +use mysqltest; +delete from v1 where c < 4; +select * from t1; +a b +2 3 +3 4 +4 5 +5 10 +delete v1 from t2,v1 where t2.x=v1.c; +select * from t1; +a b +5 10 +delete v2 from t2,v2 where t2.x=v2.c; +ERROR 42000: DELETE command denied to user 'mysqltest_1'@'localhost' for table 'v2' +delete from v2 where c < 4; +ERROR 42000: DELETE command denied to user 'mysqltest_1'@'localhost' for table 'v2' +use test; +REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; +drop database mysqltest; +create database mysqltest; +create table mysqltest.t1 (a int, b int, primary key(a)); +insert into mysqltest.t1 values (1,2), (2,3); +create table mysqltest.t2 (x int, y int); +insert into mysqltest.t2 values (3,4); +create view mysqltest.v1 (a,c) as select a, b from mysqltest.t1; +create view mysqltest.v2 (a,c) as select a, b from mysqltest.t1; +grant insert on mysqltest.v1 to mysqltest_1@localhost; +grant select on mysqltest.* to mysqltest_1@localhost; +use mysqltest; +insert into v1 values (5,6); +select * from t1; +a b +1 2 +2 3 +5 6 +insert into v1 select x,y from t2; +select * from t1; +a b +1 2 +2 3 +5 6 +3 4 +insert into v2 values (5,6); +ERROR 42000: INSERT command denied to user 'mysqltest_1'@'localhost' for table 'v2' +insert into v2 select x,y from t2; +ERROR 42000: INSERT command denied to user 'mysqltest_1'@'localhost' for table 'v2' +use test; +REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; +drop database mysqltest; +create database mysqltest; +create table mysqltest.t1 (a int, b int); +create table mysqltest.t2 (a int, b int); +grant update on mysqltest.t1 to mysqltest_1@localhost; +grant update(b) on mysqltest.t2 to mysqltest_1@localhost; +grant create view,update on test.* to mysqltest_1@localhost; +create view v1 as select * from mysqltest.t1; +create view v2 as select b from mysqltest.t2; +create view mysqltest.v1 as select * from mysqltest.t1; +ERROR 42000: CREATE VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v1' +create view v3 as select a from mysqltest.t2; +ERROR 42000: ANY command denied to user 'mysqltest_1'@'localhost' for column 'a' in table 't2' +create table mysqltest.v3 (b int); +grant create view on mysqltest.v3 to mysqltest_1@localhost; +drop table mysqltest.v3; +create view mysqltest.v3 as select b from mysqltest.t2; +grant create view, update on mysqltest.v3 to mysqltest_1@localhost; +drop view mysqltest.v3; +create view mysqltest.v3 as select b from mysqltest.t2; +grant create view, update, insert on mysqltest.v3 to mysqltest_1@localhost; +drop view mysqltest.v3; +create view mysqltest.v3 as select b from mysqltest.t2; +ERROR 42000: create view command denied to user 'mysqltest_1'@'localhost' for column 'b' in table 'v3' +create table mysqltest.v3 (b int); +grant select(b) on mysqltest.v3 to mysqltest_1@localhost; +drop table mysqltest.v3; +create view mysqltest.v3 as select b from mysqltest.t2; +ERROR 42000: CREATE VIEW command denied to user 'mysqltest_1'@'localhost' for table 'v3' +create view v4 as select b+1 from mysqltest.t2; +ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for column 'b' in table 't2' +grant create view,update,select on test.* to mysqltest_1@localhost; +create view v4 as select b+1 from mysqltest.t2; +ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for column 'b' in table 't2' +grant update,select(b) on mysqltest.t2 to mysqltest_1@localhost; +create view v4 as select b+1 from mysqltest.t2; +REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; +drop database mysqltest; +drop view v1,v2,v4; +create database mysqltest; +create table mysqltest.t1 (a int); +grant all privileges on mysqltest.* to mysqltest_1@localhost; +use mysqltest; +create view v1 as select * from t1; +revoke all privileges on mysqltest.* from mysqltest_1@localhost; +drop database mysqltest; diff --git a/mysql-test/t/client_xml.test b/mysql-test/t/client_xml.test index dd7a812b54f..58e9178ef3a 100644 --- a/mysql-test/t/client_xml.test +++ b/mysql-test/t/client_xml.test @@ -1,3 +1,6 @@ +# Can't run with embedded server +-- source include/not_embedded.inc + # Test of the xml output of the 'mysql' and 'mysqldump' clients -- makes # sure that basic encoding issues are handled properly create table t1 ( diff --git a/mysql-test/t/flush_read_lock_kill.test b/mysql-test/t/flush_read_lock_kill.test index b711bc63e0e..02384357711 100644 --- a/mysql-test/t/flush_read_lock_kill.test +++ b/mysql-test/t/flush_read_lock_kill.test @@ -7,6 +7,9 @@ # -master.opt. But this test is designed to still pass then (though it # won't test anything interesting). +# This also won't work with the embedded server test +-- source include/not_embedded.inc + -- source include/have_debug.inc connect (con1,localhost,root,,); diff --git a/mysql-test/t/grant3.test b/mysql-test/t/grant3.test index 1488f910bc8..115586e807d 100644 --- a/mysql-test/t/grant3.test +++ b/mysql-test/t/grant3.test @@ -1,3 +1,6 @@ +# Can't run with embedded server +-- source include/not_embedded.inc + # Test of GRANT commands SET NAMES binary; diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test index 1a9849869d9..e515cd8c77a 100644 --- a/mysql-test/t/information_schema.test +++ b/mysql-test/t/information_schema.test @@ -1,3 +1,5 @@ +# This test uses grants, which can't get tested for embedded server +-- source include/not_embedded.inc # Test for information_schema.schemata & # show databases diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test index c3dc251ce3a..cca3e7ed3ad 100644 --- a/mysql-test/t/innodb.test +++ b/mysql-test/t/innodb.test @@ -1125,7 +1125,10 @@ show create table t2; drop table t2; # Test error handling ---replace_result \\ / $MYSQL_TEST_DIR . /var/master-data/ / + +# Clean up filename -- embedded server reports whole path without .frm, +# regular server reports relative path with .frm (argh!) +--replace_result \\ / $MYSQL_TEST_DIR . /var/master-data/ / t2.frm t2 --error 1005 create table t2 (id int(11) not null, id2 int(11) not null, constraint t1_id_fk foreign key (id2,id) references t1 (id)) engine = innodb; @@ -1280,6 +1283,9 @@ source include/varchar.inc; # Some errors/warnings on create # +# Clean up filename -- embedded server reports whole path without .frm, +# regular server reports relative path with .frm (argh!) +--replace_result \\ / $MYSQL_TEST_DIR . /var/master-data/ / t1.frm t1 --error 1005 create table t1 (v varchar(65530), key(v)); create table t1 (v varchar(65536)); diff --git a/mysql-test/t/multi_update.test b/mysql-test/t/multi_update.test index f3b6216e3cf..0ca42e86204 100644 --- a/mysql-test/t/multi_update.test +++ b/mysql-test/t/multi_update.test @@ -2,6 +2,9 @@ # Test of update statement that uses many tables. # +# Requires grants, so won't work with embedded server test +-- source include/not_embedded.inc + --disable_warnings drop table if exists t1,t2,t3; drop database if exists mysqltest; diff --git a/mysql-test/t/mysqlshow.test b/mysql-test/t/mysqlshow.test index 8da29b91819..33ae8aef9a0 100644 --- a/mysql-test/t/mysqlshow.test +++ b/mysql-test/t/mysqlshow.test @@ -1,3 +1,6 @@ +# Can't run test of external client with embedded server +-- source include/not_embedded.inc + # ## Bug #5036 mysqlshow is missing a column # diff --git a/mysql-test/t/ps_1general.test b/mysql-test/t/ps_1general.test index 38f03fe4cc2..1fa9d30eaba 100644 --- a/mysql-test/t/ps_1general.test +++ b/mysql-test/t/ps_1general.test @@ -436,20 +436,6 @@ create database mysqltest ; prepare stmt3 from ' drop database mysqltest '; drop database mysqltest ; -## grant/revoke + drop user ---error 1295 -prepare stmt3 from ' grant all on test.t1 to drop_user@localhost -identified by ''looser'' '; -grant all on test.t1 to drop_user@localhost -identified by 'looser' ; ---error 1295 -prepare stmt3 from ' revoke all privileges on test.t1 from -drop_user@localhost '; -revoke all privileges on test.t1 from drop_user@localhost ; ---error 1295 -prepare stmt3 from ' drop user drop_user@localhost '; -drop user drop_user@localhost; - #### table related commands ## describe prepare stmt3 from ' describe t2 '; @@ -606,7 +592,7 @@ prepare stmt1 from ' rename table t5 to t6, t7 to t8 ' ; create table t5 (a int) ; # rename must fail, t7 does not exist # Clean up the filename here because embedded server reports whole path ---replace_result \\ / $MYSQL_TEST_DIR . /var/master-data/ / +--replace_result \\ / $MYSQL_TEST_DIR . /var/master-data/ / t7.frm t7 --error 1017 execute stmt1 ; create table t7 (a int) ; diff --git a/mysql-test/t/ps_grant.test b/mysql-test/t/ps_grant.test index 06613072824..07bd70f6cff 100644 --- a/mysql-test/t/ps_grant.test +++ b/mysql-test/t/ps_grant.test @@ -116,4 +116,17 @@ show grants for second_user@localhost ; drop database mysqltest; +## grant/revoke + drop user +--error 1295 +prepare stmt3 from ' grant all on test.t1 to drop_user@localhost +identified by ''looser'' '; +grant all on test.t1 to drop_user@localhost +identified by 'looser' ; +--error 1295 +prepare stmt3 from ' revoke all privileges on test.t1 from +drop_user@localhost '; +revoke all privileges on test.t1 from drop_user@localhost ; +--error 1295 +prepare stmt3 from ' drop user drop_user@localhost '; +drop user drop_user@localhost; diff --git a/mysql-test/t/sp-security.test b/mysql-test/t/sp-security.test index aad5f4eaf9e..5a8dfc54920 100644 --- a/mysql-test/t/sp-security.test +++ b/mysql-test/t/sp-security.test @@ -2,6 +2,9 @@ # Testing SQL SECURITY of stored procedures # +# Can't test with embedded server that doesn't support grants +-- source include/not_embedded.inc + connect (con1root,localhost,root,,); connection con1root; diff --git a/mysql-test/t/user_limits.test b/mysql-test/t/user_limits.test index 729894a588a..af0f6545ac4 100644 --- a/mysql-test/t/user_limits.test +++ b/mysql-test/t/user_limits.test @@ -2,6 +2,9 @@ # Test behavior of various per-account limits (aka quotas) # +# Requires privileges to be enabled +-- source include/not_embedded.inc + # Prepare play-ground --disable_warnings drop table if exists t1; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 527dcda0f1b..8205680627d 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -122,12 +122,6 @@ alter view v1 (c,d) as select a,max(b) from t1 group by a; select * from v1; select * from v2; -# simple test of grants -grant create view on test.* to test@localhost; -show grants for test@localhost; -revoke create view on test.* from test@localhost; -show grants for test@localhost; - # try to drop nonexistent VIEW -- error 1051 drop view v100; @@ -162,182 +156,6 @@ drop view v1, v2; drop table t1; -# -# grant create view test -# -connect (root,localhost,root,,test); -connection root; ---disable_warnings -create database mysqltest; ---enable_warnings - -create table mysqltest.t1 (a int, b int); -create table mysqltest.t2 (a int, b int); - -grant select on mysqltest.t1 to mysqltest_1@localhost; -grant create view,select on test.* to mysqltest_1@localhost; - -connect (user1,localhost,mysqltest_1,,test); -connection user1; - -create view v1 as select * from mysqltest.t1; -# try to modify view without DROP privilege on it --- error 1142 -alter view v1 as select * from mysqltest.t1; --- error 1142 -create or replace view v1 as select * from mysqltest.t1; -# no CRETE VIEW privilege --- error 1142 -create view mysqltest.v2 as select * from mysqltest.t1; -# no SELECT privilege --- error 1142 -create view v2 as select * from mysqltest.t2; - -connection root; -grant create view,drop,select on test.* to mysqltest_1@localhost; - -connection user1; -# following 'use' command is workaround of bug #9582 and should be removed -# when that bug will be fixed -use test; -alter view v1 as select * from mysqltest.t1; -create or replace view v1 as select * from mysqltest.t1; - -connection root; -revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; -revoke all privileges on test.* from mysqltest_1@localhost; - -drop database mysqltest; -drop view test.v1; - -# -# grants per columns -# -# MERGE algorithm ---disable_warnings -create database mysqltest; ---enable_warnings - -create table mysqltest.t1 (a int, b int); -create view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; -grant select (c) on mysqltest.v1 to mysqltest_1@localhost; - -connection user1; -select c from mysqltest.v1; -# there are no privileges on column 'd' --- error 1143 -select d from mysqltest.v1; - -connection root; -revoke all privileges on mysqltest.v1 from mysqltest_1@localhost; -delete from mysql.user where user='mysqltest_1'; -drop database mysqltest; - -# TEMPORARY TABLE algorithm ---disable_warnings -create database mysqltest; ---enable_warnings - -create table mysqltest.t1 (a int, b int); -create algorithm=temptable view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; -grant select (c) on mysqltest.v1 to mysqltest_1@localhost; - -connection user1; -select c from mysqltest.v1; -# there are no privileges on column 'd' --- error 1143 -select d from mysqltest.v1; - -connection root; -revoke all privileges on mysqltest.v1 from mysqltest_1@localhost; -delete from mysql.user where user='mysqltest_1'; -drop database mysqltest; - -# -# EXPLAIN rights -# -connection root; ---disable_warnings -create database mysqltest; ---enable_warnings -#prepare views and tables -create table mysqltest.t1 (a int, b int); -create table mysqltest.t2 (a int, b int); -create view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; -create algorithm=temptable view mysqltest.v2 (c,d) as select a+1,b+1 from mysqltest.t1; -create view mysqltest.v3 (c,d) as select a+1,b+1 from mysqltest.t2; -create algorithm=temptable view mysqltest.v4 (c,d) as select a+1,b+1 from mysqltest.t2; -grant select on mysqltest.v1 to mysqltest_1@localhost; -grant select on mysqltest.v2 to mysqltest_1@localhost; -grant select on mysqltest.v3 to mysqltest_1@localhost; -grant select on mysqltest.v4 to mysqltest_1@localhost; - -connection user1; -# all selects works -select c from mysqltest.v1; -select c from mysqltest.v2; -select c from mysqltest.v3; -select c from mysqltest.v4; -# test of show coluns -show columns from mysqltest.v1; -show columns from mysqltest.v2; -# but explain/show do not --- error 1345 -explain select c from mysqltest.v1; --- error 1142 -show create view mysqltest.v1; --- error 1345 -explain select c from mysqltest.v2; --- error 1142 -show create view mysqltest.v2; --- error 1345 -explain select c from mysqltest.v3; --- error 1142 -show create view mysqltest.v3; --- error 1345 -explain select c from mysqltest.v4; --- error 1142 -show create view mysqltest.v4; - -# allow to see one of underlying table -connection root; -grant select on mysqltest.t1 to mysqltest_1@localhost; -connection user1; -# EXPLAIN of view on above table works -explain select c from mysqltest.v1; --- error 1142 -show create view mysqltest.v1; -explain select c from mysqltest.v2; --- error 1142 -show create view mysqltest.v2; -# but other EXPLAINs do not --- error 1345 -explain select c from mysqltest.v3; --- error 1142 -show create view mysqltest.v3; --- error 1345 -explain select c from mysqltest.v4; --- error 1142 -show create view mysqltest.v4; - -# allow to see any view in mysqltest database -connection root; -grant show view on mysqltest.* to mysqltest_1@localhost; -connection user1; -explain select c from mysqltest.v1; -show create view mysqltest.v1; -explain select c from mysqltest.v2; -show create view mysqltest.v2; -explain select c from mysqltest.v3; -show create view mysqltest.v3; -explain select c from mysqltest.v4; -show create view mysqltest.v4; - -connection root; -revoke all privileges on mysqltest.* from mysqltest_1@localhost; -delete from mysql.user where user='mysqltest_1'; -drop database mysqltest; - # # DISTINCT option for VIEW # @@ -443,54 +261,6 @@ select * from t1; drop table t1,t2; drop view v1,v2; -# -# UPDATE privileges on VIEW columns and whole VIEW -# -connection root; ---disable_warnings -create database mysqltest; ---enable_warnings - -create table mysqltest.t1 (a int, b int, primary key(a)); -insert into mysqltest.t1 values (10,2), (20,3), (30,4), (40,5), (50,10); -create table mysqltest.t2 (x int); -insert into mysqltest.t2 values (3), (4), (5), (6); -create view mysqltest.v1 (a,c) as select a, b+1 from mysqltest.t1; -create view mysqltest.v2 (a,c) as select a, b from mysqltest.t1; -create view mysqltest.v3 (a,c) as select a, b+1 from mysqltest.t1; - -grant update (a) on mysqltest.v2 to mysqltest_1@localhost; -grant update on mysqltest.v1 to mysqltest_1@localhost; -grant select on mysqltest.* to mysqltest_1@localhost; - -connection user1; -use mysqltest; -# update with rights on VIEW column -update t2,v1 set v1.a=v1.a+v1.c where t2.x=v1.c; -select * from t1; -update v1 set a=a+c; -select * from t1; -# update with rights on whole VIEW -update t2,v2 set v2.a=v2.a+v2.c where t2.x=v2.c; -select * from t1; -update v2 set a=a+c; -select * from t1; -# no rights on column --- error 1143 -update t2,v2 set v2.c=v2.a+v2.c where t2.x=v2.c; --- error 1143 -update v2 set c=a+c; -# no rights for view --- error 1142 -update t2,v3 set v3.a=v3.a+v3.c where t2.x=v3.c; --- error 1142 -update v3 set a=a+c; - -use test; -connection root; -REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; -drop database mysqltest; - # # MERGE VIEW with WHERE clause # @@ -545,42 +315,6 @@ select * from t1; drop table t1,t2; drop view v1,v2; -# -# DELETE privileges on VIEW -# -connection root; ---disable_warnings -create database mysqltest; ---enable_warnings - -create table mysqltest.t1 (a int, b int, primary key(a)); -insert into mysqltest.t1 values (1,2), (2,3), (3,4), (4,5), (5,10); -create table mysqltest.t2 (x int); -insert into mysqltest.t2 values (3), (4), (5), (6); -create view mysqltest.v1 (a,c) as select a, b+1 from mysqltest.t1; -create view mysqltest.v2 (a,c) as select a, b+1 from mysqltest.t1; - -grant delete on mysqltest.v1 to mysqltest_1@localhost; -grant select on mysqltest.* to mysqltest_1@localhost; - -connection user1; -use mysqltest; -# update with rights on VIEW column -delete from v1 where c < 4; -select * from t1; -delete v1 from t2,v1 where t2.x=v1.c; -select * from t1; -# no rights for view --- error 1142 -delete v2 from t2,v2 where t2.x=v2.c; --- error 1142 -delete from v2 where c < 4; - -use test; -connection root; -REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; -drop database mysqltest; - # # key presence check # @@ -657,42 +391,6 @@ select * from t1; drop table t1, t2; drop view v1,v2,v3,v4,v5; -# -# insert privileges on VIEW -# -connection root; ---disable_warnings -create database mysqltest; ---enable_warnings - -create table mysqltest.t1 (a int, b int, primary key(a)); -insert into mysqltest.t1 values (1,2), (2,3); -create table mysqltest.t2 (x int, y int); -insert into mysqltest.t2 values (3,4); -create view mysqltest.v1 (a,c) as select a, b from mysqltest.t1; -create view mysqltest.v2 (a,c) as select a, b from mysqltest.t1; - -grant insert on mysqltest.v1 to mysqltest_1@localhost; -grant select on mysqltest.* to mysqltest_1@localhost; - -connection user1; -use mysqltest; -# update with rights on VIEW column -insert into v1 values (5,6); -select * from t1; -insert into v1 select x,y from t2; -select * from t1; -# no rights for view --- error 1142 -insert into v2 values (5,6); --- error 1142 -insert into v2 select x,y from t2; - -use test; -connection root; -REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; -drop database mysqltest; - # # outer join based on VIEW with WHERE clause # @@ -739,87 +437,6 @@ select * from t1; drop view v1; drop table t1; -# -# test of CREATE VIEW privileges if we have limited privileges -# -connection root; ---disable_warnings -create database mysqltest; ---enable_warnings - -create table mysqltest.t1 (a int, b int); -create table mysqltest.t2 (a int, b int); - -grant update on mysqltest.t1 to mysqltest_1@localhost; -grant update(b) on mysqltest.t2 to mysqltest_1@localhost; -grant create view,update on test.* to mysqltest_1@localhost; - -connection user1; - -create view v1 as select * from mysqltest.t1; -create view v2 as select b from mysqltest.t2; -# There are not rights on mysqltest.v1 --- error 1142 -create view mysqltest.v1 as select * from mysqltest.t1; -# There are not any rights on mysqltest.t2.a --- error 1143 -create view v3 as select a from mysqltest.t2; - -# give CREATE VIEW privileges (without any privileges for result column) -connection root; -create table mysqltest.v3 (b int); -grant create view on mysqltest.v3 to mysqltest_1@localhost; -drop table mysqltest.v3; -connection user1; -create view mysqltest.v3 as select b from mysqltest.t2; - -# give UPDATE privileges -connection root; -grant create view, update on mysqltest.v3 to mysqltest_1@localhost; -drop view mysqltest.v3; -connection user1; -create view mysqltest.v3 as select b from mysqltest.t2; - -# give UPDATE and INSERT privilege (to get more privileges then underlying -# table) -connection root; -grant create view, update, insert on mysqltest.v3 to mysqltest_1@localhost; -drop view mysqltest.v3; -connection user1; --- error 1143 -create view mysqltest.v3 as select b from mysqltest.t2; - - -# If we would get more privileges on VIEW then we have on -# underlying tables => creation prohibited -connection root; -create table mysqltest.v3 (b int); -grant select(b) on mysqltest.v3 to mysqltest_1@localhost; -drop table mysqltest.v3; -connection user1; --- error 1142 -create view mysqltest.v3 as select b from mysqltest.t2; - -# Expression need select privileges --- error 1143 -create view v4 as select b+1 from mysqltest.t2; - -connection root; -grant create view,update,select on test.* to mysqltest_1@localhost; -connection user1; --- error 1143 -create view v4 as select b+1 from mysqltest.t2; - -connection root; -grant update,select(b) on mysqltest.t2 to mysqltest_1@localhost; -connection user1; -create view v4 as select b+1 from mysqltest.t2; - -connection root; -REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; -drop database mysqltest; -drop view v1,v2,v4; - # # VIEW fields quoting # @@ -1612,24 +1229,6 @@ select concat('|',a,'|'), concat('|',b,'|') from v1; drop view v1; drop table t1; -# -# user with global DB privileges -# -connection root; ---disable_warnings -create database mysqltest; ---enable_warnings -create table mysqltest.t1 (a int); -grant all privileges on mysqltest.* to mysqltest_1@localhost; - -connection user1; -use mysqltest; -create view v1 as select * from t1; - -connection root; -revoke all privileges on mysqltest.* from mysqltest_1@localhost; -drop database mysqltest; - # # Trys update table from which we select using views and subqueries # diff --git a/mysql-test/t/view_grant.test b/mysql-test/t/view_grant.test new file mode 100644 index 00000000000..2fe7a420e66 --- /dev/null +++ b/mysql-test/t/view_grant.test @@ -0,0 +1,401 @@ + +# simple test of grants +grant create view on test.* to test@localhost; +show grants for test@localhost; +revoke create view on test.* from test@localhost; +show grants for test@localhost; + +# grant create view test +# +connect (root,localhost,root,,test); +connection root; +--disable_warnings +create database mysqltest; +--enable_warnings + +create table mysqltest.t1 (a int, b int); +create table mysqltest.t2 (a int, b int); + +grant select on mysqltest.t1 to mysqltest_1@localhost; +grant create view,select on test.* to mysqltest_1@localhost; + +connect (user1,localhost,mysqltest_1,,test); +connection user1; + +create view v1 as select * from mysqltest.t1; +# try to modify view without DROP privilege on it +-- error 1142 +alter view v1 as select * from mysqltest.t1; +-- error 1142 +create or replace view v1 as select * from mysqltest.t1; +# no CRETE VIEW privilege +-- error 1142 +create view mysqltest.v2 as select * from mysqltest.t1; +# no SELECT privilege +-- error 1142 +create view v2 as select * from mysqltest.t2; + +connection root; +grant create view,drop,select on test.* to mysqltest_1@localhost; + +connection user1; +# following 'use' command is workaround of bug #9582 and should be removed +# when that bug will be fixed +use test; +alter view v1 as select * from mysqltest.t1; +create or replace view v1 as select * from mysqltest.t1; + +connection root; +revoke all privileges on mysqltest.t1 from mysqltest_1@localhost; +revoke all privileges on test.* from mysqltest_1@localhost; + +drop database mysqltest; +drop view test.v1; + +# +# grants per columns +# +# MERGE algorithm +--disable_warnings +create database mysqltest; +--enable_warnings + +create table mysqltest.t1 (a int, b int); +create view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; +grant select (c) on mysqltest.v1 to mysqltest_1@localhost; + +connection user1; +select c from mysqltest.v1; +# there are no privileges on column 'd' +-- error 1143 +select d from mysqltest.v1; + +connection root; +revoke all privileges on mysqltest.v1 from mysqltest_1@localhost; +delete from mysql.user where user='mysqltest_1'; +drop database mysqltest; + +# TEMPORARY TABLE algorithm +--disable_warnings +create database mysqltest; +--enable_warnings + +create table mysqltest.t1 (a int, b int); +create algorithm=temptable view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; +grant select (c) on mysqltest.v1 to mysqltest_1@localhost; + +connection user1; +select c from mysqltest.v1; +# there are no privileges on column 'd' +-- error 1143 +select d from mysqltest.v1; + +connection root; +revoke all privileges on mysqltest.v1 from mysqltest_1@localhost; +delete from mysql.user where user='mysqltest_1'; +drop database mysqltest; + +# +# EXPLAIN rights +# +connection root; +--disable_warnings +create database mysqltest; +--enable_warnings +#prepare views and tables +create table mysqltest.t1 (a int, b int); +create table mysqltest.t2 (a int, b int); +create view mysqltest.v1 (c,d) as select a+1,b+1 from mysqltest.t1; +create algorithm=temptable view mysqltest.v2 (c,d) as select a+1,b+1 from mysqltest.t1; +create view mysqltest.v3 (c,d) as select a+1,b+1 from mysqltest.t2; +create algorithm=temptable view mysqltest.v4 (c,d) as select a+1,b+1 from mysqltest.t2; +grant select on mysqltest.v1 to mysqltest_1@localhost; +grant select on mysqltest.v2 to mysqltest_1@localhost; +grant select on mysqltest.v3 to mysqltest_1@localhost; +grant select on mysqltest.v4 to mysqltest_1@localhost; + +connection user1; +# all selects works +select c from mysqltest.v1; +select c from mysqltest.v2; +select c from mysqltest.v3; +select c from mysqltest.v4; +# test of show coluns +show columns from mysqltest.v1; +show columns from mysqltest.v2; +# but explain/show do not +-- error 1345 +explain select c from mysqltest.v1; +-- error 1142 +show create view mysqltest.v1; +-- error 1345 +explain select c from mysqltest.v2; +-- error 1142 +show create view mysqltest.v2; +-- error 1345 +explain select c from mysqltest.v3; +-- error 1142 +show create view mysqltest.v3; +-- error 1345 +explain select c from mysqltest.v4; +-- error 1142 +show create view mysqltest.v4; + +# allow to see one of underlying table +connection root; +grant select on mysqltest.t1 to mysqltest_1@localhost; +connection user1; +# EXPLAIN of view on above table works +explain select c from mysqltest.v1; +-- error 1142 +show create view mysqltest.v1; +explain select c from mysqltest.v2; +-- error 1142 +show create view mysqltest.v2; +# but other EXPLAINs do not +-- error 1345 +explain select c from mysqltest.v3; +-- error 1142 +show create view mysqltest.v3; +-- error 1345 +explain select c from mysqltest.v4; +-- error 1142 +show create view mysqltest.v4; + +# allow to see any view in mysqltest database +connection root; +grant show view on mysqltest.* to mysqltest_1@localhost; +connection user1; +explain select c from mysqltest.v1; +show create view mysqltest.v1; +explain select c from mysqltest.v2; +show create view mysqltest.v2; +explain select c from mysqltest.v3; +show create view mysqltest.v3; +explain select c from mysqltest.v4; +show create view mysqltest.v4; + +connection root; +revoke all privileges on mysqltest.* from mysqltest_1@localhost; +delete from mysql.user where user='mysqltest_1'; +drop database mysqltest; + +# +# UPDATE privileges on VIEW columns and whole VIEW +# +connection root; +--disable_warnings +create database mysqltest; +--enable_warnings + +create table mysqltest.t1 (a int, b int, primary key(a)); +insert into mysqltest.t1 values (10,2), (20,3), (30,4), (40,5), (50,10); +create table mysqltest.t2 (x int); +insert into mysqltest.t2 values (3), (4), (5), (6); +create view mysqltest.v1 (a,c) as select a, b+1 from mysqltest.t1; +create view mysqltest.v2 (a,c) as select a, b from mysqltest.t1; +create view mysqltest.v3 (a,c) as select a, b+1 from mysqltest.t1; + +grant update (a) on mysqltest.v2 to mysqltest_1@localhost; +grant update on mysqltest.v1 to mysqltest_1@localhost; +grant select on mysqltest.* to mysqltest_1@localhost; + +connection user1; +use mysqltest; +# update with rights on VIEW column +update t2,v1 set v1.a=v1.a+v1.c where t2.x=v1.c; +select * from t1; +update v1 set a=a+c; +select * from t1; +# update with rights on whole VIEW +update t2,v2 set v2.a=v2.a+v2.c where t2.x=v2.c; +select * from t1; +update v2 set a=a+c; +select * from t1; +# no rights on column +-- error 1143 +update t2,v2 set v2.c=v2.a+v2.c where t2.x=v2.c; +-- error 1143 +update v2 set c=a+c; +# no rights for view +-- error 1142 +update t2,v3 set v3.a=v3.a+v3.c where t2.x=v3.c; +-- error 1142 +update v3 set a=a+c; + +use test; +connection root; +REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; +drop database mysqltest; + +# +# DELETE privileges on VIEW +# +connection root; +--disable_warnings +create database mysqltest; +--enable_warnings + +create table mysqltest.t1 (a int, b int, primary key(a)); +insert into mysqltest.t1 values (1,2), (2,3), (3,4), (4,5), (5,10); +create table mysqltest.t2 (x int); +insert into mysqltest.t2 values (3), (4), (5), (6); +create view mysqltest.v1 (a,c) as select a, b+1 from mysqltest.t1; +create view mysqltest.v2 (a,c) as select a, b+1 from mysqltest.t1; + +grant delete on mysqltest.v1 to mysqltest_1@localhost; +grant select on mysqltest.* to mysqltest_1@localhost; + +connection user1; +use mysqltest; +# update with rights on VIEW column +delete from v1 where c < 4; +select * from t1; +delete v1 from t2,v1 where t2.x=v1.c; +select * from t1; +# no rights for view +-- error 1142 +delete v2 from t2,v2 where t2.x=v2.c; +-- error 1142 +delete from v2 where c < 4; + +use test; +connection root; +REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; +drop database mysqltest; + +# +# insert privileges on VIEW +# +connection root; +--disable_warnings +create database mysqltest; +--enable_warnings + +create table mysqltest.t1 (a int, b int, primary key(a)); +insert into mysqltest.t1 values (1,2), (2,3); +create table mysqltest.t2 (x int, y int); +insert into mysqltest.t2 values (3,4); +create view mysqltest.v1 (a,c) as select a, b from mysqltest.t1; +create view mysqltest.v2 (a,c) as select a, b from mysqltest.t1; + +grant insert on mysqltest.v1 to mysqltest_1@localhost; +grant select on mysqltest.* to mysqltest_1@localhost; + +connection user1; +use mysqltest; +# update with rights on VIEW column +insert into v1 values (5,6); +select * from t1; +insert into v1 select x,y from t2; +select * from t1; +# no rights for view +-- error 1142 +insert into v2 values (5,6); +-- error 1142 +insert into v2 select x,y from t2; + +use test; +connection root; +REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; +drop database mysqltest; + +# +# test of CREATE VIEW privileges if we have limited privileges +# +connection root; +--disable_warnings +create database mysqltest; +--enable_warnings + +create table mysqltest.t1 (a int, b int); +create table mysqltest.t2 (a int, b int); + +grant update on mysqltest.t1 to mysqltest_1@localhost; +grant update(b) on mysqltest.t2 to mysqltest_1@localhost; +grant create view,update on test.* to mysqltest_1@localhost; + +connection user1; + +create view v1 as select * from mysqltest.t1; +create view v2 as select b from mysqltest.t2; +# There are not rights on mysqltest.v1 +-- error 1142 +create view mysqltest.v1 as select * from mysqltest.t1; +# There are not any rights on mysqltest.t2.a +-- error 1143 +create view v3 as select a from mysqltest.t2; + +# give CREATE VIEW privileges (without any privileges for result column) +connection root; +create table mysqltest.v3 (b int); +grant create view on mysqltest.v3 to mysqltest_1@localhost; +drop table mysqltest.v3; +connection user1; +create view mysqltest.v3 as select b from mysqltest.t2; + +# give UPDATE privileges +connection root; +grant create view, update on mysqltest.v3 to mysqltest_1@localhost; +drop view mysqltest.v3; +connection user1; +create view mysqltest.v3 as select b from mysqltest.t2; + +# give UPDATE and INSERT privilege (to get more privileges then underlying +# table) +connection root; +grant create view, update, insert on mysqltest.v3 to mysqltest_1@localhost; +drop view mysqltest.v3; +connection user1; +-- error 1143 +create view mysqltest.v3 as select b from mysqltest.t2; + + +# If we would get more privileges on VIEW then we have on +# underlying tables => creation prohibited +connection root; +create table mysqltest.v3 (b int); +grant select(b) on mysqltest.v3 to mysqltest_1@localhost; +drop table mysqltest.v3; +connection user1; +-- error 1142 +create view mysqltest.v3 as select b from mysqltest.t2; + +# Expression need select privileges +-- error 1143 +create view v4 as select b+1 from mysqltest.t2; + +connection root; +grant create view,update,select on test.* to mysqltest_1@localhost; +connection user1; +-- error 1143 +create view v4 as select b+1 from mysqltest.t2; + +connection root; +grant update,select(b) on mysqltest.t2 to mysqltest_1@localhost; +connection user1; +create view v4 as select b+1 from mysqltest.t2; + +connection root; +REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; +drop database mysqltest; +drop view v1,v2,v4; + +# +# user with global DB privileges +# +connection root; +--disable_warnings +create database mysqltest; +--enable_warnings +create table mysqltest.t1 (a int); +grant all privileges on mysqltest.* to mysqltest_1@localhost; + +connection user1; +use mysqltest; +create view v1 as select * from t1; + +connection root; +revoke all privileges on mysqltest.* from mysqltest_1@localhost; +drop database mysqltest; + From 1be0a0c82a05181cd7aac52ace6167ff9939e21a Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Tue, 5 Apr 2005 00:32:48 +0300 Subject: [PATCH 050/204] Now one gets an error if one tries to insert an invalid value via a stored procedure in STRICT mode. (Bug #5907) --- client/mysqldump.c | 115 +++++++++++++++++++------------------ mysql-test/r/strict.result | 12 ++++ mysql-test/t/strict.test | 15 +++++ sql/sql_base.cc | 4 +- sql/sql_error.cc | 35 ++++++----- 5 files changed, 110 insertions(+), 71 deletions(-) diff --git a/client/mysqldump.c b/client/mysqldump.c index 2017f923c2f..b07a36aa7ad 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -37,7 +37,7 @@ ** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov */ -#define DUMP_VERSION "10.9" +#define DUMP_VERSION "10.10" #include #include @@ -396,7 +396,7 @@ static int dump_all_databases(); static char *quote_name(const char *name, char *buff, my_bool force); static const char *check_if_ignore_table(const char *table_name); static char *primary_key_fields(const char *table_name); -static my_bool getViewStructure(char *table, char* db); +static my_bool get_view_structure(char *table, char* db); static my_bool dump_all_views_in_db(char *database); #include @@ -777,16 +777,16 @@ static int get_options(int *argc, char ***argv) /* -** DBerror -- prints mysql error message and exits the program. +** DB_error -- prints mysql error message and exits the program. */ -static void DBerror(MYSQL *mysql, const char *when) +static void DB_error(MYSQL *mysql, const char *when) { - DBUG_ENTER("DBerror"); + DBUG_ENTER("DB_error"); my_printf_error(0,"Got error: %d: %s %s", MYF(0), mysql_errno(mysql), mysql_error(mysql), when); safe_exit(EX_MYSQLERR); DBUG_VOID_RETURN; -} /* DBerror */ +} /* DB_error */ /* @@ -862,7 +862,7 @@ static int dbConnect(char *host, char *user,char *passwd) NULL,opt_mysql_port,opt_mysql_unix_port, 0))) { - DBerror(&mysql_connection, "when trying to connect"); + DB_error(&mysql_connection, "when trying to connect"); return 1; } /* @@ -1093,7 +1093,7 @@ static void print_xml_row(FILE *xml_file, const char *row_name, number of fields in table, 0 if error */ -static uint getTableStructure(char *table, char *db) +static uint get_table_structure(char *table, char *db) { MYSQL_RES *tableRes; MYSQL_ROW row; @@ -1104,7 +1104,7 @@ static uint getTableStructure(char *table, char *db) char name_buff[NAME_LEN+3],table_buff[NAME_LEN*2+3]; char table_buff2[NAME_LEN*2+3]; FILE *sql_file = md_result_file; - DBUG_ENTER("getTableStructure"); + DBUG_ENTER("get_table_structure"); delayed= opt_delayed ? " DELAYED " : ""; @@ -1457,7 +1457,7 @@ continue_xml: my_fclose(sql_file, MYF(MY_WME)); } DBUG_RETURN(numFields); -} /* getTableStructure */ +} /* get_table_structure */ static char *add_load_option(char *ptr,const char *object, @@ -1523,10 +1523,12 @@ static char *alloc_query_str(ulong size) return query; } + /* -** dumpTable saves database contents as a series of INSERT statements. +** dump_table saves database contents as a series of INSERT statements. */ -static void dumpTable(uint numFields, char *table) + +static void dump_table(uint numFields, char *table) { char query_buf[QUERY_LENGTH], *end, buff[256],table_buff[NAME_LEN+3]; char *result_table, table_buff2[NAME_LEN*2+3], *opt_quoted_table; @@ -1592,7 +1594,7 @@ static void dumpTable(uint numFields, char *table) } if (mysql_real_query(sock, query, (uint) (end - query))) { - DBerror(sock, "when executing 'SELECT INTO OUTFILE'"); + DB_error(sock, "when executing 'SELECT INTO OUTFILE'"); return; } } @@ -1639,13 +1641,13 @@ static void dumpTable(uint numFields, char *table) check_io(md_result_file); } if (mysql_query_with_error_report(sock, 0, query)) - DBerror(sock, "when retrieving data from server"); + DB_error(sock, "when retrieving data from server"); if (quick) res=mysql_use_result(sock); else res=mysql_store_result(sock); if (!res) - DBerror(sock, "when retrieving data from server"); + DB_error(sock, "when retrieving data from server"); if (verbose) fprintf(stderr, "-- Retrieving rows...\n"); if (mysql_num_fields(res) != numFields) @@ -1946,7 +1948,7 @@ err: my_free(query, MYF(MY_ALLOW_ZERO_PTR)); safe_exit(error); return; -} /* dumpTable */ +} /* dump_table */ static char *getTableName(int reset) @@ -2035,7 +2037,7 @@ static int init_dumping(char *database) if (mysql_select_db(sock, database)) { - DBerror(sock, "when selecting the database"); + DB_error(sock, "when selecting the database"); return 1; /* If --force */ } if (!path && !opt_xml) @@ -2123,14 +2125,14 @@ static int dump_all_tables_in_db(char *database) dynstr_append(&query, " READ /*!32311 LOCAL */,"); } if (numrows && mysql_real_query(sock, query.str, query.length-1)) - DBerror(sock, "when using LOCK TABLES"); + DB_error(sock, "when using LOCK TABLES"); /* We shall continue here, if --force was given */ dynstr_free(&query); } if (flush_logs) { if (mysql_refresh(sock, REFRESH_LOG)) - DBerror(sock, "when doing refresh"); + DB_error(sock, "when doing refresh"); /* We shall continue here, if --force was given */ } while ((table= getTableName(0))) @@ -2138,9 +2140,9 @@ static int dump_all_tables_in_db(char *database) char *end= strmov(afterdot, table); if (include_table(hash_key, end - hash_key)) { - numrows = getTableStructure(table, database); + numrows = get_table_structure(table, database); if (!dFlag && numrows > 0) - dumpTable(numrows,table); + dump_table(numrows,table); my_free(order_by, MYF(MY_ALLOW_ZERO_PTR)); order_by= 0; } @@ -2188,18 +2190,18 @@ static my_bool dump_all_views_in_db(char *database) dynstr_append(&query, " READ /*!32311 LOCAL */,"); } if (numrows && mysql_real_query(sock, query.str, query.length-1)) - DBerror(sock, "when using LOCK TABLES"); + DB_error(sock, "when using LOCK TABLES"); /* We shall continue here, if --force was given */ dynstr_free(&query); } if (flush_logs) { if (mysql_refresh(sock, REFRESH_LOG)) - DBerror(sock, "when doing refresh"); + DB_error(sock, "when doing refresh"); /* We shall continue here, if --force was given */ } while ((table= getTableName(0))) - getViewStructure(table, database); + get_view_structure(table, database); if (opt_xml) { fputs("\n", md_result_file); @@ -2226,7 +2228,7 @@ static int get_actual_table_name(const char *old_table_name, int buf_size) { int retval; - MYSQL_RES *tableRes; + MYSQL_RES *table_res; MYSQL_ROW row; char query[50 + 2*NAME_LEN]; char show_name_buff[FN_REFLEN]; @@ -2242,18 +2244,22 @@ static int get_actual_table_name(const char *old_table_name, safe_exit(EX_MYSQLERR); } - tableRes= mysql_store_result( sock ); retval = 1; - if (tableRes != NULL) + + if ((table_res= mysql_store_result(sock))) { - my_ulonglong numRows = mysql_num_rows(tableRes); - if (numRows > 0) - { - row= mysql_fetch_row( tableRes ); - strmake(new_table_name, row[0], buf_size-1); - retval = 0; - } - mysql_free_result(tableRes); + my_ulonglong num_rows= mysql_num_rows(table_res); + if (num_rows > 0) + { + /* + Return first row + TODO: Return all matching rows + */ + row= mysql_fetch_row(table_res); + strmake(new_table_name, row[0], buf_size-1); + retval= 0; + } + mysql_free_result(table_res); } return retval; } @@ -2278,37 +2284,36 @@ static int dump_selected_tables(char *db, char **table_names, int tables) dynstr_append(&query, " READ /*!32311 LOCAL */,"); } if (mysql_real_query(sock, query.str, query.length-1)) - DBerror(sock, "when doing LOCK TABLES"); + DB_error(sock, "when doing LOCK TABLES"); /* We shall countinue here, if --force was given */ dynstr_free(&query); } if (flush_logs) { if (mysql_refresh(sock, REFRESH_LOG)) - DBerror(sock, "when doing refresh"); + DB_error(sock, "when doing refresh"); /* We shall countinue here, if --force was given */ } if (opt_xml) print_xml_tag1(md_result_file, "", "database name=", db, "\n"); for (i=0 ; i < tables ; i++) { - char new_table_name[NAME_LEN]; + char new_table_name[NAME_LEN]; - /* the table name passed on commandline may be wrong case */ - if (!get_actual_table_name( table_names[i], new_table_name, sizeof(new_table_name) )) - { - - numrows = getTableStructure(new_table_name, db); - - dumpTable(numrows, new_table_name); - } + /* the table name passed on commandline may be wrong case */ + if (!get_actual_table_name( table_names[i], new_table_name, + sizeof(new_table_name))) + { + numrows= get_table_structure(new_table_name, db); + dump_table(numrows, new_table_name); + } my_free(order_by, MYF(MY_ALLOW_ZERO_PTR)); order_by= 0; } if (was_views) { for (i=0 ; i < tables ; i++) - getViewStructure(table_names[i], db); + get_view_structure(table_names[i], db); } if (opt_xml) { @@ -2613,7 +2618,7 @@ cleanup: Getting VIEW structure SYNOPSIS - getViewStructure() + get_view_structure() table view name db db name @@ -2622,9 +2627,9 @@ cleanup: 1 ERROR */ -static my_bool getViewStructure(char *table, char* db) +static my_bool get_view_structure(char *table, char* db) { - MYSQL_RES *tableRes; + MYSQL_RES *table_res; MYSQL_ROW row; MYSQL_FIELD *field; char *result_table, *opt_quoted_table; @@ -2632,7 +2637,7 @@ static my_bool getViewStructure(char *table, char* db) char table_buff2[NAME_LEN*2+3]; char buff[20+FN_REFLEN]; FILE *sql_file = md_result_file; - DBUG_ENTER("getViewStructure"); + DBUG_ENTER("get_view_structure"); if (tFlag) DBUG_RETURN(0); @@ -2667,8 +2672,8 @@ static my_bool getViewStructure(char *table, char* db) } write_header(sql_file, db); } - tableRes= mysql_store_result(sock); - field= mysql_fetch_field_direct(tableRes, 0); + table_res= mysql_store_result(sock); + field= mysql_fetch_field_direct(table_res, 0); if (strcmp(field->name, "View") != 0) { if (verbose) @@ -2688,10 +2693,10 @@ static my_bool getViewStructure(char *table, char* db) check_io(sql_file); } - row= mysql_fetch_row(tableRes); + row= mysql_fetch_row(table_res); fprintf(sql_file, "%s;\n", row[1]); check_io(sql_file); - mysql_free_result(tableRes); + mysql_free_result(table_res); if (sql_file != md_result_file) { diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result index 6f332b4e087..c4d860c5c77 100644 --- a/mysql-test/r/strict.result +++ b/mysql-test/r/strict.result @@ -1173,4 +1173,16 @@ col1 0000-00-00 00:00:00 NULL drop table t1; +create table t1 (col1 tinyint); +drop procedure if exists t1; +Warnings: +Note 1305 PROCEDURE t1 does not exist +create procedure t1 () begin declare exit handler for sqlexception +select'a'; insert into t1 values (200); end;| +call t1(); +ERROR 22003: Out of range value adjusted for column 'col1' at row 1 +select * from t1; +col1 +drop procedure t1; +drop table t1; set sql_mode=@org_mode; diff --git a/mysql-test/t/strict.test b/mysql-test/t/strict.test index 9d4befb9743..b5d234b7bea 100644 --- a/mysql-test/t/strict.test +++ b/mysql-test/t/strict.test @@ -1031,6 +1031,21 @@ insert into t1 select * from t1; select * from t1; drop table t1; +# +# Test of inserting an invalid value via a stored procedure (Bug #5907) +# +create table t1 (col1 tinyint); +drop procedure if exists t1; +delimiter |; +create procedure t1 () begin declare exit handler for sqlexception +select'a'; insert into t1 values (200); end;| +delimiter ;| +--error 1264 +call t1(); +select * from t1; +drop procedure t1; +drop table t1; + # # Restore mode # diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 02978ba0c30..736b372cc8f 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -692,11 +692,11 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table, /* - Test that table is unique + Test that table is unique (It's only exists once in the table list) SYNOPSIS unique_table() - table table which should be chaked + table table which should be checked table_list list of tables NOTE: to exclude derived tables from check we use following mechanism: diff --git a/sql/sql_error.cc b/sql/sql_error.cc index 281ac7169c0..c1e1afa9eeb 100644 --- a/sql/sql_error.cc +++ b/sql/sql_error.cc @@ -116,6 +116,27 @@ MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level, if (thd->query_id != thd->warn_id) mysql_reset_errors(thd, 0); thd->got_warning= 1; + + /* Abort if we are using strict mode and we are not using IGNORE */ + if ((int) level >= (int) MYSQL_ERROR::WARN_LEVEL_WARN && + thd->really_abort_on_warning()) + { + /* Avoid my_message() calling push_warning */ + bool no_warnings_for_error= thd->no_warnings_for_error; + sp_rcontext *spcont= thd->spcont; + + thd->no_warnings_for_error= 1; + thd->spcont= 0; + + thd->killed= THD::KILL_BAD_DATA; + my_message(code, msg, MYF(0)); + + thd->spcont= spcont; + thd->no_warnings_for_error= no_warnings_for_error; + /* Store error in error list (as my_message() didn't do it in this case */ + level= MYSQL_ERROR::WARN_LEVEL_ERROR; + } + if (thd->spcont && thd->spcont->find_handler(code, ((int) level >= @@ -126,20 +147,6 @@ MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level, DBUG_RETURN(NULL); } - /* Abort if we are using strict mode and we are not using IGNORE */ - if ((int) level >= (int) MYSQL_ERROR::WARN_LEVEL_WARN && - thd->really_abort_on_warning()) - { - /* Avoid my_message() calling push_warning */ - bool no_warnings_for_error= thd->no_warnings_for_error; - thd->no_warnings_for_error= 1; - thd->killed= THD::KILL_BAD_DATA; - my_message(code, msg, MYF(0)); - thd->no_warnings_for_error= no_warnings_for_error; - /* Store error in error list (as my_message() didn't do it in this case */ - level= MYSQL_ERROR::WARN_LEVEL_ERROR; - } - if (thd->warn_list.elements < thd->variables.max_error_count) { /* From 48de1ff27744c996d7f3b63e4b75eeaeb96c9f0c Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Tue, 5 Apr 2005 01:19:48 +0300 Subject: [PATCH 051/204] Don't generate message in send_kill_message() if wrong data. (Caused core dump for wrong data in ALTER TABLE on some system) --- sql/item_timefunc.cc | 2 +- sql/sql_class.h | 3 ++- sql/sql_error.cc | 2 +- sql/sql_table.cc | 8 +++++--- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 1ea20e9d7cc..85ba3bfd0e4 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -2199,7 +2199,7 @@ String *Item_char_typecast::val_str(String *str) push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_TRUNCATED_WRONG_VALUE, ER(ER_TRUNCATED_WRONG_VALUE), char_type, - res->c_ptr()); + res->c_ptr_safe()); res->length((uint) length); } null_value= 0; diff --git a/sql/sql_class.h b/sql/sql_class.h index e712af19a5c..517bf92abff 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1410,7 +1410,8 @@ public: inline void send_kill_message() const { int err= killed_errno(); - my_message(err, ER(err), MYF(0)); + if (err) + my_message(err, ER(err), MYF(0)); } /* return TRUE if we will abort query if we make a warning now */ inline bool really_abort_on_warning() diff --git a/sql/sql_error.cc b/sql/sql_error.cc index c1e1afa9eeb..04fd27abef5 100644 --- a/sql/sql_error.cc +++ b/sql/sql_error.cc @@ -133,7 +133,7 @@ MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level, thd->spcont= spcont; thd->no_warnings_for_error= no_warnings_for_error; - /* Store error in error list (as my_message() didn't do it in this case */ + /* Store error in error list (as my_message() didn't do it) */ level= MYSQL_ERROR::WARN_LEVEL_ERROR; } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 49ecd2591dd..4b40ff7638c 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3740,9 +3740,11 @@ copy_data_between_tables(TABLE *from,TABLE *to, goto err; }; - /* Handler must be told explicitly to retrieve all columns, because - this function does not set field->query_id in the columns to the - current query id */ + /* + Handler must be told explicitly to retrieve all columns, because + this function does not set field->query_id in the columns to the + current query id + */ from->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS); init_read_record(&info, thd, from, (SQL_SELECT *) 0, 1,1); if (ignore || From d0c9b36224d1a81b83e1141f8af8ce8f464c3b8e Mon Sep 17 00:00:00 2001 From: "sergefp@mysql.com" <> Date: Tue, 5 Apr 2005 02:42:23 +0400 Subject: [PATCH 052/204] Fix for BUG#8877: Implementation of "Early NULL-values filtering for ref access" (attempt2+post-review fixes) 1. update_ref_and_keys() accumulates info about null-rejecting predicates in in KEY_FIELD::null_rejecting, add_key_part saves these to KEYUSE. 2. create_ref_for_key copies them to TABLE_REF. 3. add_not_null_conds adds "x IS NOT NULL" to join_tab->select_cond of appropiate JOIN_TAB members. Includes code cleanups: * add_key_field() params: s/COND/Item_func/ (as only Item_funcs are passed to it) * add_key_fields() params: JOIN_TAB *stat removed (wasn't used) --- sql/sql_select.cc | 164 ++++++++++++++++++++++++++++++++++++++++++---- sql/sql_select.h | 10 +++ 2 files changed, 162 insertions(+), 12 deletions(-) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 57b09fa40b4..42c13b4c0f4 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1995,6 +1995,11 @@ typedef struct key_field_t { // Used when finding key fields uint level; uint optimize; bool eq_func; + /* + If true, the condition this struct represents will not be satisfied + when val IS NULL. + */ + bool null_rejecting; } KEY_FIELD; /* Values in optimize */ @@ -2011,6 +2016,12 @@ typedef struct key_field_t { // Used when finding key fields that are internally transformed to something like: SELECT * FROM t1 WHERE t1.key=outer_ref_field or t1.key IS NULL + + KEY_FIELD::null_rejecting is processed as follows: + result has null_rejecting=true if it is set for both ORed references. + for example: + (t2.key = t1.field OR t2.key = t1.field) -> null_rejecting=true + (t2.key = t1.field OR t2.key <=> t1.field) -> null_rejecting=false */ static KEY_FIELD * @@ -2044,6 +2055,8 @@ merge_key_fields(KEY_FIELD *start,KEY_FIELD *new_fields,KEY_FIELD *end, KEY_OPTIMIZE_EXISTS) | ((old->optimize | new_fields->optimize) & KEY_OPTIMIZE_REF_OR_NULL)); + old->null_rejecting= old->null_rejecting && + new_fields->null_rejecting; } } else if (old->eq_func && new_fields->eq_func && @@ -2055,6 +2068,8 @@ merge_key_fields(KEY_FIELD *start,KEY_FIELD *new_fields,KEY_FIELD *end, KEY_OPTIMIZE_EXISTS) | ((old->optimize | new_fields->optimize) & KEY_OPTIMIZE_REF_OR_NULL)); + old->null_rejecting= old->null_rejecting && + new_fields->null_rejecting; } else if (old->eq_func && new_fields->eq_func && (old->val->is_null() || new_fields->val->is_null())) @@ -2065,6 +2080,8 @@ merge_key_fields(KEY_FIELD *start,KEY_FIELD *new_fields,KEY_FIELD *end, /* Remember the NOT NULL value */ if (old->val->is_null()) old->val= new_fields->val; + /* The referred expression can be NULL: */ + old->null_rejecting= false; } else { @@ -2119,7 +2136,7 @@ merge_key_fields(KEY_FIELD *start,KEY_FIELD *new_fields,KEY_FIELD *end, */ static void -add_key_field(KEY_FIELD **key_fields,uint and_level, COND *cond, +add_key_field(KEY_FIELD **key_fields,uint and_level, Item_func *cond, Field *field,bool eq_func,Item **value, uint num_values, table_map usable_tables) { @@ -2221,12 +2238,29 @@ add_key_field(KEY_FIELD **key_fields,uint and_level, COND *cond, (*key_fields)->val= *value; (*key_fields)->level= and_level; (*key_fields)->optimize= exists_optimize; + /* + If the condition has form "tbl.keypart = othertbl.field" and + othertbl.field can be NULL, there will be no matches if othertbl.field + has NULL value. + */ + (*key_fields)->null_rejecting= (cond->functype() == Item_func::EQ_FUNC) && + ((*value)->type() == Item::FIELD_ITEM) && + ((Item_field*)*value)->field->maybe_null(); (*key_fields)++; } - +/* + SYNOPSIS + add_key_fields() + key_fields Add KEY_FIELD entries to this array (and move the + pointer) + and_level AND-level (a value that is different for every n-way + AND operation) + cond Condition to analyze + usable_tables Value to pass to add_key_field +*/ static void -add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, +add_key_fields(KEY_FIELD **key_fields,uint *and_level, COND *cond, table_map usable_tables) { if (cond->type() == Item_func::COND_ITEM) @@ -2238,20 +2272,20 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, { Item *item; while ((item=li++)) - add_key_fields(stat,key_fields,and_level,item,usable_tables); + add_key_fields(key_fields,and_level,item,usable_tables); for (; org_key_fields != *key_fields ; org_key_fields++) org_key_fields->level= *and_level; } else { (*and_level)++; - add_key_fields(stat,key_fields,and_level,li++,usable_tables); + add_key_fields(key_fields,and_level,li++,usable_tables); Item *item; while ((item=li++)) { KEY_FIELD *start_key_fields= *key_fields; (*and_level)++; - add_key_fields(stat,key_fields,and_level,item,usable_tables); + add_key_fields(key_fields,and_level,item,usable_tables); *key_fields=merge_key_fields(org_key_fields,start_key_fields, *key_fields,++(*and_level)); } @@ -2363,6 +2397,7 @@ add_key_part(DYNAMIC_ARRAY *keyuse_array,KEY_FIELD *key_field) keyuse.keypart_map= (key_part_map) 1 << part; keyuse.used_tables=key_field->val->used_tables(); keyuse.optimize= key_field->optimize & KEY_OPTIMIZE_REF_OR_NULL; + keyuse.null_rejecting= key_field->null_rejecting; VOID(insert_dynamic(keyuse_array,(gptr) &keyuse)); } } @@ -2456,8 +2491,22 @@ sort_keyuse(KEYUSE *a,KEYUSE *b) /* Update keyuse array with all possible keys we can use to fetch rows - join_tab is a array in tablenr_order - stat is a reference array in 'prefered' order. + + SYNOPSIS + update_ref_and_keys() + thd + keyuse OUT Put here ordered array of KEYUSE structures + join_tab Array in tablenr_order + tables Number of tables in join + cond WHERE condition (note that the function analyzes + join_tab[i]->on_expr too) + normal_tables tables not inner w.r.t some outer join (ones for which + we can make ref access based the WHERE clause) + select_lex current SELECT + + RETURN + 0 - OK + 1 - Out of memory. */ static bool @@ -2478,7 +2527,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, return TRUE; if (cond) { - add_key_fields(join_tab,&end,&and_level,cond,normal_tables); + add_key_fields(&end,&and_level,cond,normal_tables); for (; field != end ; field++) { add_key_part(keyuse,field); @@ -2492,7 +2541,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, { if (join_tab[i].on_expr) { - add_key_fields(join_tab,&end,&and_level,join_tab[i].on_expr, + add_key_fields(&end,&and_level,join_tab[i].on_expr, join_tab[i].table->map); } } @@ -3232,6 +3281,7 @@ static bool create_ref_for_key(JOIN *join, JOIN_TAB *j, KEYUSE *org_keyuse, } j->ref.key_buff2=j->ref.key_buff+ALIGN_SIZE(length); j->ref.key_err=1; + j->ref.null_rejecting= 0; keyuse=org_keyuse; store_key **ref_key= j->ref.key_copy; @@ -3256,6 +3306,8 @@ static bool create_ref_for_key(JOIN *join, JOIN_TAB *j, KEYUSE *org_keyuse, uint maybe_null= test(keyinfo->key_part[i].null_bit); j->ref.items[i]=keyuse->val; // Save for cond removal + if (keyuse->null_rejecting) + j->ref.null_rejecting |= 1 << i; keyuse_uses_no_tables= keyuse_uses_no_tables && !keyuse->used_tables; if (!keyuse->used_tables && !(join->select_options & SELECT_DESCRIBE)) @@ -3410,12 +3462,99 @@ make_simple_join(JOIN *join,TABLE *tmp_table) } +inline void add_cond_and_fix(Item **e1, Item *e2) +{ + if (*e1) + { + Item *res; + if ((res= new Item_cond_and(*e1, e2))) + { + *e1= res; + res->quick_fix_field(); + } + } + else + *e1= e2; +} + + +/* + Add to join_tab->select_cond[i] "table.field IS NOT NULL" conditions we've + inferred from ref/eq_ref access performed. + + SYNOPSIS + add_not_null_conds() + join Join to process + + NOTES + This function is a part of "Early NULL-values filtering for ref access" + optimization. + + Example of this optimization: + For query SELECT * FROM t1,t2 WHERE t2.key=t1.field + and plan " any-access(t1), ref(t2.key=t1.field) " + add "t1.field IS NOT NULL" to t1's table condition. + Description of the optimization: + + We look through equalities choosen to perform ref/eq_ref access, + pick equalities that have form "tbl.part_of_key = othertbl.field" + (where othertbl is a non-const table and othertbl.field may be NULL) + and add them to conditions on correspoding tables (othertbl in this + example). + + This optimization doesn't affect the choices that ref, range, or join + optimizer make. This was intentional because this was added after 4.1 + was GA. + + Implementation overview + 1. update_ref_and_keys() accumulates info about null-rejecting + predicates in in KEY_FIELD::null_rejecting + 1.1 add_key_part saves these to KEYUSE. + 2. create_ref_for_key copies them to TABLE_REF. + 3. add_not_null_conds adds "x IS NOT NULL" to join_tab->select_cond of + appropiate JOIN_TAB members. +*/ + +static void add_not_null_conds(JOIN *join) +{ + DBUG_ENTER("add_not_null_conds"); + for (uint i=join->const_tables ; i < join->tables ; i++) + { + JOIN_TAB *tab=join->join_tab+i; + if ((tab->type == JT_REF || tab->type == JT_REF_OR_NULL) && + !tab->table->maybe_null) + { + for (uint keypart= 0; keypart < tab->ref.key_parts; keypart++) + { + if (tab->ref.null_rejecting & (1 << keypart)) + { + Item *item= tab->ref.items[keypart]; + DBUG_ASSERT(item->type() == Item::FIELD_ITEM); + Item_field *not_null_item= (Item_field*)item; + JOIN_TAB *referred_tab= not_null_item->field->table->reginfo.join_tab; + Item_func_isnotnull *null_rej; + if (!(null_rej= new Item_func_isnotnull(not_null_item))) + DBUG_VOID_RETURN; + + null_rej->quick_fix_field(); + //psergey-todo: Flatten AND's + DBUG_EXECUTE("where",print_where(null_rej, + referred_tab->table->table_name);); + add_cond_and_fix(&referred_tab->select_cond, null_rej); + } + } + } + } + DBUG_VOID_RETURN; +} + static bool make_join_select(JOIN *join,SQL_SELECT *select,COND *cond) { DBUG_ENTER("make_join_select"); if (select) { + add_not_null_conds(join); table_map used_tables; if (join->tables > 1) cond->update_used_tables(); // Tablenr may have changed @@ -3472,13 +3611,14 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond) } if (tmp) { - DBUG_EXECUTE("where",print_where(tmp,tab->table->table_name);); SQL_SELECT *sel=tab->select=(SQL_SELECT*) join->thd->memdup((gptr) select, sizeof(SQL_SELECT)); if (!sel) DBUG_RETURN(1); // End of memory - tab->select_cond=sel->cond=tmp; + add_cond_and_fix(&tab->select_cond, tmp); + sel->cond= tab->select_cond; sel->head=tab->table; + DBUG_EXECUTE("where",print_where(tmp,tab->table->table_name);); if (tab->quick) { /* Use quick key read if it's a constant and it's not used diff --git a/sql/sql_select.h b/sql/sql_select.h index 4ea7e1b23e7..ab3b442ef74 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -31,6 +31,11 @@ typedef struct keyuse_t { uint key, keypart, optimize; key_part_map keypart_map; ha_rows ref_table_rows; + /* + If true, the comparison this value was created from will not be + satisfied if val has NULL 'value'. + */ + bool null_rejecting; } KEYUSE; class store_key; @@ -45,6 +50,11 @@ typedef struct st_table_ref byte *key_buff2; // key_buff+key_length store_key **key_copy; // Item **items; // val()'s for each keypart + /* + (null_rejecting & (1< Date: Tue, 5 Apr 2005 03:34:39 +0400 Subject: [PATCH 054/204] Removed extra comment --- sql/sql_select.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 42c13b4c0f4..248ed06b6b3 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3537,7 +3537,6 @@ static void add_not_null_conds(JOIN *join) DBUG_VOID_RETURN; null_rej->quick_fix_field(); - //psergey-todo: Flatten AND's DBUG_EXECUTE("where",print_where(null_rej, referred_tab->table->table_name);); add_cond_and_fix(&referred_tab->select_cond, null_rej); From c13464b813a267579d4cb493b19e9b02ad3bdda1 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Mon, 4 Apr 2005 17:08:12 -0700 Subject: [PATCH 055/204] Skip new test with embedded server --- mysql-test/t/view_grant.test | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mysql-test/t/view_grant.test b/mysql-test/t/view_grant.test index 2fe7a420e66..bb603b75daa 100644 --- a/mysql-test/t/view_grant.test +++ b/mysql-test/t/view_grant.test @@ -1,3 +1,5 @@ +# Can't test with embedded server +-- source include/not_embedded.inc # simple test of grants grant create view on test.* to test@localhost; From 9db39659242d089f948d934356f4428f84b65977 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Tue, 5 Apr 2005 11:35:03 +0300 Subject: [PATCH 056/204] dict0dict.c: Add a note that ENUM in new tables cannot reference ENUM in old tables, in FOREIGN KEY constraints --- innobase/dict/dict0dict.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index 2bceb432aa6..cb48c86c541 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -3285,6 +3285,9 @@ try_find_index: "Cannot find an index in the referenced table where the\n" "referenced columns appear as the first columns, or column types\n" "in the table and the referenced table do not match for constraint.\n" +"Note that the internal storage type of ENUM and SET changed in\n" +"tables created with >= InnoDB-4.1.12, and such columns in old tables\n" +"cannot be referenced by such columns in new tables.\n" "See http://dev.mysql.com/doc/mysql/en/InnoDB_foreign_key_constraints.html\n" "for correct foreign key definition.\n", start_of_latest_foreign); From f57c7d8b118aed323a74906b31fc6e013de96bb5 Mon Sep 17 00:00:00 2001 From: "ramil@mysql.com" <> Date: Tue, 5 Apr 2005 13:40:34 +0500 Subject: [PATCH 057/204] Fix for bug #9571: Primary key creation causes server crash. --- mysql-test/r/type_bit.result | 3 +++ mysql-test/t/type_bit.test | 8 ++++++++ sql/unireg.cc | 5 ++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/mysql-test/r/type_bit.result b/mysql-test/r/type_bit.result index c926ebb6878..04179a46285 100644 --- a/mysql-test/r/type_bit.result +++ b/mysql-test/r/type_bit.result @@ -377,3 +377,6 @@ hex(concat(a)) hex(concat(b)) 07 0FFE 01 01FF drop table t1; +create table t1(a int, b bit not null); +alter table t1 add primary key (a); +drop table t1; diff --git a/mysql-test/t/type_bit.test b/mysql-test/t/type_bit.test index f00fcfef7ab..5303a55fb25 100644 --- a/mysql-test/t/type_bit.test +++ b/mysql-test/t/type_bit.test @@ -112,3 +112,11 @@ insert into t1 values (7,(1<<12)-2), (0x01,0x01ff); select hex(a),hex(b) from t1; select hex(concat(a)),hex(concat(b)) from t1; drop table t1; + +# +# Bug #9571: problem with primary key creation +# + +create table t1(a int, b bit not null); +alter table t1 add primary key (a); +drop table t1; diff --git a/sql/unireg.cc b/sql/unireg.cc index 57e2c1029f1..929ca5c672e 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -679,15 +679,14 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type, null_count++; } bfill(buff,(null_length=(null_fields+7)/8),255); - null_pos=buff; + null_pos= buff + null_count / 8; List_iterator it(create_fields); thd->count_cuted_fields= CHECK_FIELD_WARN; // To find wrong default values while ((field=it++)) { Field *regfield=make_field((char*) buff+field->offset,field->length, - field->flags & NOT_NULL_FLAG ? 0: - null_pos+null_count/8, + null_pos, null_count & 7, field->pack_flag, field->sql_type, From fed0ba272ad8c5f5eb5d946de1650aa58a8f9ba1 Mon Sep 17 00:00:00 2001 From: "gluh@eagle.intranet.mysql.r18.ru" <> Date: Tue, 5 Apr 2005 14:31:46 +0500 Subject: [PATCH 058/204] Code optimization(discussed with Monty) --- BitKeeper/etc/logging_ok | 1 + sql/sql_show.cc | 20 ++++---------------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 8b880b7c9aa..9fecb756be0 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -59,6 +59,7 @@ gerberb@ou800.zenez.com gluh@eagle.intranet.mysql.r18.ru gluh@gluh.(none) gluh@gluh.mysql.r18.ru +gluh@mysql.com gordon@zero.local.lan greg@gcw.ath.cx greg@mysql.com diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 8280d865ec0..4b9c53b9b34 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2334,25 +2334,13 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables, "NO" : "YES"); table->field[6]->store((const char*) pos, strlen((const char*) pos), cs); - - switch (field->type()) { - case FIELD_TYPE_TINY_BLOB: - case FIELD_TYPE_MEDIUM_BLOB: - case FIELD_TYPE_LONG_BLOB: - case FIELD_TYPE_BLOB: - case FIELD_TYPE_VAR_STRING: - case FIELD_TYPE_STRING: - if (field->has_charset()) - table->field[8]->store((longlong) field->representation_length()/ - field->charset()->mbmaxlen); - else - table->field[8]->store((longlong) field->representation_length()); + if (field->has_charset()) + { + table->field[8]->store((longlong) field->representation_length()/ + field->charset()->mbmaxlen); table->field[8]->set_notnull(); table->field[9]->store((longlong) field->representation_length()); table->field[9]->set_notnull(); - break; - default: - break; } { From 6c8c2d22b9b58619514998ddde4165dc27b4f36d Mon Sep 17 00:00:00 2001 From: "gluh@eagle.intranet.mysql.r18.ru" <> Date: Tue, 5 Apr 2005 15:12:15 +0500 Subject: [PATCH 059/204] Fix for bug#7214: information_schema: unauthorized user can see metadata the fix for 'columns' table only Rights check for 'routines' table is already done (see WL2131 Access control for SHOW ... PROCEDURE|FUNCTION ...) rename 'testtets' database to 'mysqltest' to keep number of DBs which created by mysql-test as small as possible --- mysql-test/r/information_schema.result | 45 +++++++++++++++----------- mysql-test/t/information_schema.test | 29 ++++++++++------- sql/sql_show.cc | 45 ++++++++++++++------------ 3 files changed, 70 insertions(+), 49 deletions(-) diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result index 55a299e335f..0e75ebe9471 100644 --- a/mysql-test/r/information_schema.result +++ b/mysql-test/r/information_schema.result @@ -22,11 +22,11 @@ mysql test show databases where `database` = 't%'; Database -create database testtets; -create table testtets.t1(a int, b VARCHAR(30), KEY string_data (b)); +create database mysqltest; +create table mysqltest.t1(a int, b VARCHAR(30), KEY string_data (b)); create table test.t2(a int); create table t3(a int, KEY a_data (a)); -create table testtets.t4(a int); +create table mysqltest.t4(a int); create view v1 (c) as select table_name from information_schema.TABLES; select * from v1; c @@ -62,11 +62,11 @@ time_zone_name time_zone_transition time_zone_transition_type user +t1 +t4 t2 t3 v1 -t1 -t4 select c,table_name from v1 left join information_schema.TABLES v2 on (v1.c=v2.table_name) where v1.c like "t%"; @@ -80,10 +80,10 @@ time_zone_leap_second time_zone_leap_second time_zone_name time_zone_name time_zone_transition time_zone_transition time_zone_transition_type time_zone_transition_type -t2 t2 -t3 t3 t1 t1 t4 t4 +t2 t2 +t3 t3 select c, v2.table_name from v1 right join information_schema.TABLES v2 on (v1.c=v2.table_name) where v1.c like "t%"; @@ -97,18 +97,18 @@ time_zone_leap_second time_zone_leap_second time_zone_name time_zone_name time_zone_transition time_zone_transition time_zone_transition_type time_zone_transition_type -t2 t2 -t3 t3 t1 t1 t4 t4 +t2 t2 +t3 t3 select table_name from information_schema.TABLES -where table_schema = "testtets" and table_name like "t%"; +where table_schema = "mysqltest" and table_name like "t%"; table_name t1 t4 -select * from information_schema.STATISTICS where TABLE_SCHEMA = "testtets"; +select * from information_schema.STATISTICS where TABLE_SCHEMA = "mysqltest"; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME NON_UNIQUE INDEX_SCHEMA INDEX_NAME SEQ_IN_INDEX COLUMN_NAME COLLATION CARDINALITY SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT -NULL testtets t1 1 testtets string_data 1 b A NULL NULL NULL YES BTREE +NULL mysqltest t1 1 mysqltest string_data 1 b A NULL NULL NULL YES BTREE show keys from t3 where Key_name = "a_data"; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment t3 1 a_data 1 a A NULL NULL NULL YES BTREE @@ -133,13 +133,22 @@ c varchar(64) utf8_general_ci NO select,insert,update,references select * from information_schema.COLUMNS where table_name="t1" and column_name= "a"; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT -NULL testtets t1 a 1 NULL YES int NULL NULL 11 0 NULL NULL int(11) select,insert,update,references -show columns from testtets.t1 where field like "%a%"; +NULL mysqltest t1 a 1 NULL YES int NULL NULL 11 0 NULL NULL int(11) select,insert,update,references +show columns from mysqltest.t1 where field like "%a%"; Field Type Null Key Default Extra a int(11) YES NULL +grant select (a) on mysqltest.t1 to mysqltest_2@localhost; +select table_name, column_name, privileges from information_schema.columns +where table_schema = 'mysqltest' and table_name = 't1'; +table_name column_name privileges +t1 a select +show columns from mysqltest.t1; +Field Type Null Key Default Extra +a int(11) YES NULL +b varchar(30) YES MUL NULL drop view v1; -drop tables testtets.t4, testtets.t1, t2, t3; -drop database testtets; +drop tables mysqltest.t4, mysqltest.t1, t2, t3; +drop database mysqltest; select * from information_schema.CHARACTER_SETS where CHARACTER_SET_NAME like 'latin1%'; CHARACTER_SET_NAME DEFAULT_COLLATE_NAME DESCRIPTION MAXLEN @@ -352,8 +361,8 @@ GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME PRIVILEGE_TYPE IS_GRAN 'mysqltest_1'@'localhost' NULL test t1 a REFERENCES NO delete from mysql.user where user='mysqltest_1' or user='mysqltest_2'; delete from mysql.db where user='mysqltest_1' or user='mysqltest_2'; -delete from mysql.tables_priv where user='mysqltest_1'; -delete from mysql.columns_priv where user='mysqltest_1'; +delete from mysql.tables_priv where user='mysqltest_1' or user='mysqltest_2'; +delete from mysql.columns_priv where user='mysqltest_1' or user='mysqltest_2'; flush privileges; drop table t1; create table t1 (a int null, primary key(a)); diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test index e515cd8c77a..243c3ce6829 100644 --- a/mysql-test/t/information_schema.test +++ b/mysql-test/t/information_schema.test @@ -17,11 +17,11 @@ show databases where `database` = 't%'; # Test for information_schema.tables & # show tables -create database testtets; -create table testtets.t1(a int, b VARCHAR(30), KEY string_data (b)); +create database mysqltest; +create table mysqltest.t1(a int, b VARCHAR(30), KEY string_data (b)); create table test.t2(a int); create table t3(a int, KEY a_data (a)); -create table testtets.t4(a int); +create table mysqltest.t4(a int); create view v1 (c) as select table_name from information_schema.TABLES; select * from v1; select c,table_name from v1 @@ -33,9 +33,9 @@ right join information_schema.TABLES v2 on (v1.c=v2.table_name) where v1.c like "t%"; select table_name from information_schema.TABLES -where table_schema = "testtets" and table_name like "t%"; +where table_schema = "mysqltest" and table_name like "t%"; -select * from information_schema.STATISTICS where TABLE_SCHEMA = "testtets"; +select * from information_schema.STATISTICS where TABLE_SCHEMA = "mysqltest"; show keys from t3 where Key_name = "a_data"; show tables like 't%'; @@ -46,11 +46,19 @@ show full columns from mysql.db like "Insert%"; show full columns from v1; select * from information_schema.COLUMNS where table_name="t1" and column_name= "a"; -show columns from testtets.t1 where field like "%a%"; +show columns from mysqltest.t1 where field like "%a%"; + +grant select (a) on mysqltest.t1 to mysqltest_2@localhost; +connect (user3,localhost,mysqltest_2,,); +connection user3; +select table_name, column_name, privileges from information_schema.columns +where table_schema = 'mysqltest' and table_name = 't1'; +show columns from mysqltest.t1; +connection default; drop view v1; -drop tables testtets.t4, testtets.t1, t2, t3; -drop database testtets; +drop tables mysqltest.t4, mysqltest.t1, t2, t3; +drop database mysqltest; # Test for information_schema.CHARACTER_SETS & # SHOW CHARACTER SET @@ -107,7 +115,6 @@ mysql.proc b where a.ROUTINE_NAME = convert(b.name using utf8); select count(*) from information_schema.ROUTINES; connect (user1,localhost,mysqltest_1,,); -connect (user3,localhost,mysqltest_2,,); connection user1; select ROUTINE_NAME, ROUTINE_DEFINITION from information_schema.ROUTINES; --error 1305 @@ -166,8 +173,8 @@ select * from information_schema.TABLE_PRIVILEGES where grantee like '%mysqltest select * from information_schema.COLUMN_PRIVILEGES where grantee like '%mysqltest_1%'; delete from mysql.user where user='mysqltest_1' or user='mysqltest_2'; delete from mysql.db where user='mysqltest_1' or user='mysqltest_2'; -delete from mysql.tables_priv where user='mysqltest_1'; -delete from mysql.columns_priv where user='mysqltest_1'; +delete from mysql.tables_priv where user='mysqltest_1' or user='mysqltest_2'; +delete from mysql.columns_priv where user='mysqltest_1' or user='mysqltest_2'; flush privileges; drop table t1; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 4b9c53b9b34..d92613bd633 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2290,8 +2290,32 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables, char tmp[MAX_FIELD_WIDTH]; char tmp1[MAX_FIELD_WIDTH]; String type(tmp,sizeof(tmp), system_charset_info); + char *end= tmp; count++; restore_record(table, s->default_values); + +#ifndef NO_EMBEDDED_ACCESS_CHECKS + uint col_access; + check_access(thd,SELECT_ACL | EXTRA_ACL, base_name, + &tables->grant.privilege, 0, 0); + col_access= get_column_grant(thd, &tables->grant, tables->db, + tables->table_name, + field->field_name) & COL_ACLS; + if (lex->orig_sql_command != SQLCOM_SHOW_FIELDS && !col_access) + continue; + for (uint bitnr=0; col_access ; col_access>>=1,bitnr++) + { + if (col_access & 1) + { + *end++=','; + end=strmov(end,grant_types.type_names[bitnr]); + } + } +#else + end=strmov(end,""); +#endif + table->field[17]->store(tmp+1,end == tmp ? 0 : (uint) (end-tmp-1), cs); + table->field[1]->store(base_name, strlen(base_name), cs); table->field[2]->store(file_name, strlen(file_name), cs); table->field[3]->store(field->field_name, strlen(field->field_name), @@ -2398,31 +2422,12 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables, (field->flags & MULTIPLE_KEY_FLAG) ? "MUL":""); table->field[15]->store((const char*) pos, strlen((const char*) pos), cs); - char *end= tmp; + end= tmp; if (field->unireg_check == Field::NEXT_NUMBER) end=strmov(tmp,"auto_increment"); table->field[16]->store(tmp, (uint) (end-tmp), cs); end=tmp; -#ifndef NO_EMBEDDED_ACCESS_CHECKS - uint col_access; - check_access(thd,SELECT_ACL | EXTRA_ACL, base_name, - &tables->grant.privilege, 0, 0); - col_access= get_column_grant(thd, &tables->grant, tables->db, - tables->table_name, - field->field_name) & COL_ACLS; - for (uint bitnr=0; col_access ; col_access>>=1,bitnr++) - { - if (col_access & 1) - { - *end++=','; - end=strmov(end,grant_types.type_names[bitnr]); - } - } -#else - end=strmov(end,""); -#endif - table->field[17]->store(tmp+1,end == tmp ? 0 : (uint) (end-tmp-1), cs); table->field[18]->store(field->comment.str, field->comment.length, cs); if (schema_table_store_record(thd, table)) DBUG_RETURN(1); From 6ed11e3bb3fe3f720433965b4ebf02eddaf18258 Mon Sep 17 00:00:00 2001 From: "jani@ua141d10.elisa.omakaista.fi" <> Date: Tue, 5 Apr 2005 13:15:04 +0300 Subject: [PATCH 060/204] A fix for Netware. --- mysys/my_rename.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysys/my_rename.c b/mysys/my_rename.c index d4f99e83247..b5d813ad787 100644 --- a/mysys/my_rename.c +++ b/mysys/my_rename.c @@ -45,7 +45,7 @@ int my_rename(const char *from, const char *to, myf MyFlags) } #endif #if defined(HAVE_RENAME) -#ifdef __WIN__ +#if defined(__WIN__) || defined(__NETWARE__) /* On windows we can't rename over an existing file: Remove any conflicting files: From f22b8930c35e4bd080d42e4755d233c5bc6142a1 Mon Sep 17 00:00:00 2001 From: "msvensson@neptunus.(none)" <> Date: Tue, 5 Apr 2005 13:01:16 +0200 Subject: [PATCH 061/204] Fix swedish error message --- sql/share/swedish/errmsg.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt index 4dc42389d89..ca863df7939 100644 --- a/sql/share/swedish/errmsg.txt +++ b/sql/share/swedish/errmsg.txt @@ -67,7 +67,7 @@ character-set=latin1 "Kolumn '%-.64s' fr inte vara NULL", "Oknd databas: '%-.64s'", "Tabellen '%-.64s' finns redan", -"Oknd tabell '%-.64s'", +"Oknd tabell '%-.180s'", "Kolumn '%-.64s' i %s r inte unik", "Servern gr nu ned", "Oknd kolumn '%-.64s' i %s", From 6c8624f6d55484f5aea54b2474ab0c5fdcf8b55b Mon Sep 17 00:00:00 2001 From: "gluh@eagle.intranet.mysql.r18.ru" <> Date: Tue, 5 Apr 2005 16:09:56 +0500 Subject: [PATCH 062/204] Fix for bug#9383: INFORMATION_SCHEMA.COLUMNS, JOIN, Crash, prepared statement restore original 'lex->query_tables' table list after processing of information schema table remove unnecessary operations --- mysql-test/r/ps.result | 18 ++++++++++++++++++ mysql-test/t/ps.test | 21 +++++++++++++++++++++ sql/sql_lex.h | 5 +++-- sql/sql_show.cc | 5 ++--- 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index 5b638fd58ab..94972ea8721 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -524,3 +524,21 @@ execute stmt using @a, @b, @c; a b c a b c deallocate prepare stmt; drop table t1,t2; +SET @aux= "SELECT COUNT(*) + FROM INFORMATION_SCHEMA.COLUMNS A, + INFORMATION_SCHEMA.COLUMNS B + WHERE A.TABLE_SCHEMA = B.TABLE_SCHEMA + AND A.TABLE_NAME = B.TABLE_NAME + AND A.COLUMN_NAME = B.COLUMN_NAME AND + A.TABLE_NAME = 'user'"; +prepare my_stmt from @aux; +execute my_stmt; +COUNT(*) +37 +execute my_stmt; +COUNT(*) +37 +execute my_stmt; +COUNT(*) +37 +deallocate prepare my_stmt; diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index 1af84119b79..271d553e221 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -540,3 +540,24 @@ deallocate prepare stmt; drop table t1,t2; + +# +# Bug#9383: INFORMATION_SCHEMA.COLUMNS, JOIN, Crash, prepared statement +# + +eval SET @aux= "SELECT COUNT(*) + FROM INFORMATION_SCHEMA.COLUMNS A, + INFORMATION_SCHEMA.COLUMNS B + WHERE A.TABLE_SCHEMA = B.TABLE_SCHEMA + AND A.TABLE_NAME = B.TABLE_NAME + AND A.COLUMN_NAME = B.COLUMN_NAME AND + A.TABLE_NAME = 'user'"; + +let $exec_loop_count= 3; +eval prepare my_stmt from @aux; +while ($exec_loop_count) +{ + eval execute my_stmt; + dec $exec_loop_count; +} +deallocate prepare my_stmt; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 8aba3be7607..32a62173059 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -701,8 +701,9 @@ typedef struct st_lex TABLE_LIST *query_tables; /* global list of all tables in this query */ /* last element next_global of previous list (used only for list building - during parsing and VIEW processing. This pointer is not valid in - mysql_execute_command + during parsing and VIEW processing. This pointer could be invalid during + processing of information schema tables(see get_schema_tables_result + function) */ TABLE_LIST **query_tables_last; TABLE_LIST *proc_table; /* refer to mysql.proc if it was opened by VIEW */ diff --git a/sql/sql_show.cc b/sql/sql_show.cc index d92613bd633..d2cab6bf49f 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -3442,12 +3442,11 @@ bool get_schema_tables_result(JOIN *join) TABLE_LIST *table_list= tab->table->pos_in_table_list; if (table_list->schema_table && thd->fill_derived_tables()) { - TABLE_LIST *save_next_global= table_list->next_global; TABLE_LIST **query_tables_last= lex->query_tables_last; TABLE *old_derived_tables= thd->derived_tables; MYSQL_LOCK *sql_lock= thd->lock; lex->sql_command= SQLCOM_SHOW_FIELDS; - + DBUG_ASSERT(!*query_tables_last); if (&lex->unit != lex->current_select->master_unit()) // is subselect { table_list->table->file->extra(HA_EXTRA_RESET_STATE); @@ -3466,8 +3465,8 @@ bool get_schema_tables_result(JOIN *join) thd->lock= sql_lock; lex->sql_command= SQLCOM_SELECT; thd->derived_tables= old_derived_tables; - table_list->next_global= save_next_global; lex->query_tables_last= query_tables_last; + *query_tables_last= 0; } } thd->no_warnings_for_error= 0; From 114b421c8bd552bc92296073b27a21691c0ce6da Mon Sep 17 00:00:00 2001 From: "pekka@mysql.com" <> Date: Tue, 5 Apr 2005 13:14:03 +0200 Subject: [PATCH 063/204] ndb - csc#4847 release scan op early to save memory --- ndb/include/ndbapi/NdbConnection.hpp | 1 + ndb/include/ndbapi/NdbScanOperation.hpp | 2 +- ndb/src/ndbapi/NdbConnection.cpp | 31 +++++++++++++++++++++++++ ndb/src/ndbapi/NdbResultSet.cpp | 2 +- ndb/src/ndbapi/NdbScanOperation.cpp | 21 +++++++++++------ ndb/tools/desc.cpp | 2 +- 6 files changed, 49 insertions(+), 10 deletions(-) diff --git a/ndb/include/ndbapi/NdbConnection.hpp b/ndb/include/ndbapi/NdbConnection.hpp index 3a9f18665e9..2ab6f7d6f64 100644 --- a/ndb/include/ndbapi/NdbConnection.hpp +++ b/ndb/include/ndbapi/NdbConnection.hpp @@ -542,6 +542,7 @@ private: // Release all cursor operations in connection void releaseOps(NdbOperation*); void releaseScanOperations(NdbIndexScanOperation*); + void releaseExecutedScanOperation(NdbIndexScanOperation*); // Set the transaction identity of the transaction void setTransactionId(Uint64 aTransactionId); diff --git a/ndb/include/ndbapi/NdbScanOperation.hpp b/ndb/include/ndbapi/NdbScanOperation.hpp index f25f9405033..f6e68dd4abe 100644 --- a/ndb/include/ndbapi/NdbScanOperation.hpp +++ b/ndb/include/ndbapi/NdbScanOperation.hpp @@ -93,7 +93,7 @@ protected: int nextResult(bool fetchAllowed = true, bool forceSend = false); virtual void release(); - void closeScan(bool forceSend = false); + void closeScan(bool forceSend = false, bool releaseOp = false); int close_impl(class TransporterFacade*, bool forceSend = false); // Overloaded methods from NdbCursorOperation diff --git a/ndb/src/ndbapi/NdbConnection.cpp b/ndb/src/ndbapi/NdbConnection.cpp index 0a1c7303771..e1f70160fb7 100644 --- a/ndb/src/ndbapi/NdbConnection.cpp +++ b/ndb/src/ndbapi/NdbConnection.cpp @@ -963,6 +963,37 @@ NdbConnection::releaseScanOperations(NdbIndexScanOperation* cursorOp) } }//NdbConnection::releaseScanOperations() +/***************************************************************************** +void releaseExecutedScanOperation(); + +Remark: Release scan op when hupp'ed trans closed (save memory) +******************************************************************************/ +void +NdbConnection::releaseExecutedScanOperation(NdbIndexScanOperation* cursorOp) +{ + DBUG_ENTER("NdbConnection::releaseExecutedScanOperation"); + DBUG_PRINT("enter", ("this=0x%x op=0x%x", (UintPtr)this, (UintPtr)cursorOp)) + + // here is one reason to make op lists doubly linked + if (m_firstExecutedScanOp == cursorOp) { + m_firstExecutedScanOp = (NdbIndexScanOperation*)cursorOp->theNext; + cursorOp->release(); + theNdb->releaseScanOperation(cursorOp); + } else if (m_firstExecutedScanOp != NULL) { + NdbIndexScanOperation* tOp = m_firstExecutedScanOp; + while (tOp->theNext != NULL) { + if (tOp->theNext == cursorOp) { + tOp->theNext = cursorOp->theNext; + cursorOp->release(); + theNdb->releaseScanOperation(cursorOp); + break; + } + tOp = (NdbIndexScanOperation*)tOp->theNext; + } + } + DBUG_VOID_RETURN; +}//NdbConnection::releaseExecutedScanOperation() + /***************************************************************************** NdbOperation* getNdbOperation(const char* aTableName); diff --git a/ndb/src/ndbapi/NdbResultSet.cpp b/ndb/src/ndbapi/NdbResultSet.cpp index d9d71464026..87b304126ba 100644 --- a/ndb/src/ndbapi/NdbResultSet.cpp +++ b/ndb/src/ndbapi/NdbResultSet.cpp @@ -69,7 +69,7 @@ int NdbResultSet::nextResult(bool fetchAllowed, bool forceSend) void NdbResultSet::close(bool forceSend) { - m_operation->closeScan(forceSend); + m_operation->closeScan(forceSend, true); } NdbOperation* diff --git a/ndb/src/ndbapi/NdbScanOperation.cpp b/ndb/src/ndbapi/NdbScanOperation.cpp index 670a18f72a0..fc5a22cce17 100644 --- a/ndb/src/ndbapi/NdbScanOperation.cpp +++ b/ndb/src/ndbapi/NdbScanOperation.cpp @@ -674,7 +674,7 @@ NdbScanOperation::doSend(int ProcessorId) return 0; } -void NdbScanOperation::closeScan(bool forceSend) +void NdbScanOperation::closeScan(bool forceSend, bool releaseOp) { if(m_transConnection){ if(DEBUG_NEXT_RESULT) @@ -691,13 +691,20 @@ void NdbScanOperation::closeScan(bool forceSend) Guard guard(tp->theMutexPtr); close_impl(tp, forceSend); - } while(0); - - theNdbCon->theScanningOp = 0; - theNdb->closeTransaction(theNdbCon); - - theNdbCon = 0; + } + + NdbConnection* tCon = theNdbCon; + NdbConnection* tTransCon = m_transConnection; + theNdbCon = NULL; m_transConnection = NULL; + + if (releaseOp && tTransCon) { + NdbIndexScanOperation* tOp = (NdbIndexScanOperation*)this; + tTransCon->releaseExecutedScanOperation(tOp); + } + + tCon->theScanningOp = 0; + theNdb->closeTransaction(tCon); } void diff --git a/ndb/tools/desc.cpp b/ndb/tools/desc.cpp index 4287a771694..aac47c9042c 100644 --- a/ndb/tools/desc.cpp +++ b/ndb/tools/desc.cpp @@ -89,7 +89,7 @@ int main(int argc, char** argv){ unsigned j; for (j= 0; (int)j < pTab->getNoOfPrimaryKeys(); j++) { - const NdbDictionary::Column * col = pTab->getColumn(j); + const NdbDictionary::Column * col = pTab->getColumn(pTab->getPrimaryKey(j)); ndbout << col->getName(); if ((int)j < pTab->getNoOfPrimaryKeys()-1) ndbout << ", "; From 810b2c3d4059d0a03c1fcf48a9823db8a5dd5c6c Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Tue, 5 Apr 2005 13:17:49 +0200 Subject: [PATCH 064/204] remove the rest of isam/merge references fix a race condition in TC_LOG_BINLOG::unlog --- include/Makefile.am | 2 +- include/config-win.h | 1 - include/my_pthread.h | 17 ------------ include/my_sys.h | 11 ++++---- include/mysql_embed.h | 1 - mysql-test/r/replace.result | 4 +-- mysql-test/t/replace.test | 8 ++---- mysql-test/t/xa.test | 1 + mysys/my_sync.c | 22 +++++++++++---- sql/handler.cc | 4 --- sql/log.cc | 53 +++++++++++++++++++----------------- sql/mysql_priv.h | 9 +++---- sql/mysqld.cc | 54 ++++++++++--------------------------- sql/opt_range.cc | 3 +-- sql/set_var.cc | 12 +++------ sql/sql_base.cc | 1 - sql/sql_class.h | 9 ++++--- 17 files changed, 82 insertions(+), 130 deletions(-) diff --git a/include/Makefile.am b/include/Makefile.am index 08beb4b7236..5f426843950 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -24,7 +24,7 @@ pkginclude_HEADERS = my_dbug.h m_string.h my_sys.h my_list.h my_xml.h \ sslopt-vars.h sslopt-case.h sql_common.h keycache.h \ mysql_time.h $(BUILT_SOURCES) noinst_HEADERS = config-win.h config-os2.h config-netware.h \ - nisam.h heap.h merge.h my_bitmap.h\ + heap.h my_bitmap.h\ myisam.h myisampack.h myisammrg.h ft_global.h\ mysys_err.h my_base.h help_start.h help_end.h \ my_nosys.h my_alarm.h queues.h rijndael.h sha1.h \ diff --git a/include/config-win.h b/include/config-win.h index 4ef5c9323e7..df0530fbef3 100644 --- a/include/config-win.h +++ b/include/config-win.h @@ -351,7 +351,6 @@ inline double ulonglong2double(ulonglong value) #define DO_NOT_REMOVE_THREAD_WRAPPERS #define thread_safe_increment(V,L) InterlockedIncrement((long*) &(V)) #define thread_safe_decrement(V,L) InterlockedDecrement((long*) &(V)) -#define thread_safe_dec_and_test(V, L) thread_safe_decrement(V,L) /* The following is only used for statistics, so it should be good enough */ #ifdef __NT__ /* This should also work on Win98 but .. */ #define thread_safe_add(V,C,L) InterlockedExchangeAdd((long*) &(V),(C)) diff --git a/include/my_pthread.h b/include/my_pthread.h index b170753913b..670a4ccf63e 100644 --- a/include/my_pthread.h +++ b/include/my_pthread.h @@ -678,7 +678,6 @@ extern pthread_t shutdown_th, main_th, signal_th; #ifdef HAVE_ATOMIC_ADD #define thread_safe_increment(V,L) atomic_inc((atomic_t*) &V) #define thread_safe_decrement(V,L) atomic_dec((atomic_t*) &V) -#define thread_safe_dec_and_test(V, L) atomic_dec_and_test((atomic_t*) &V) #define thread_safe_add(V,C,L) atomic_add((C),(atomic_t*) &V) #define thread_safe_sub(V,C,L) atomic_sub((C),(atomic_t*) &V) #else @@ -689,22 +688,6 @@ extern pthread_t shutdown_th, main_th, signal_th; #define thread_safe_add(V,C,L) (pthread_mutex_lock((L)), (V)+=(C), pthread_mutex_unlock((L))) #define thread_safe_sub(V,C,L) \ (pthread_mutex_lock((L)), (V)-=(C), pthread_mutex_unlock((L))) -#ifdef __cplusplus -static inline bool thread_safe_dec_and_test(ulong &V, pthread_mutex_t *L) -{ - ulong res; - pthread_mutex_lock(L); - res=--V; - pthread_mutex_unlock(L); - return res==0; -} -#else -/* - what should we do ? define it as static ? - a regular function somewhere in mysys/ ? - for now it's only used in c++ code, so there's no need to bother -*/ -#endif #endif /* HAVE_ATOMIC_ADD */ #ifdef SAFE_STATISTICS #define statistic_increment(V,L) thread_safe_increment((V),(L)) diff --git a/include/my_sys.h b/include/my_sys.h index 523c0570de7..f63743a4c6c 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -54,11 +54,10 @@ extern int NEAR my_errno; /* Last error in mysys */ #define MY_FAE 8 /* Fatal if any error */ #define MY_WME 16 /* Write message on error */ #define MY_WAIT_IF_FULL 32 /* Wait and try again if disk full error */ -#define MY_RAID 64 /* Support for RAID (not the "Johnson&Johnson"-s one ;) */ -#define MY_FULL_IO 512 /* For my_read - loop intil I/O - is complete - */ -#define MY_DONT_CHECK_FILESIZE 128 /* Option to init_io_cache() */ +#define MY_IGNORE_BADFD 32 /* my_sync: ignore 'bad descriptor' errors */ +#define MY_RAID 64 /* Support for RAID */ +#define MY_FULL_IO 512 /* For my_read - loop intil I/O is complete */ +#define MY_DONT_CHECK_FILESIZE 128 /* Option to init_io_cache() */ #define MY_LINK_WARNING 32 /* my_redel() gives warning if links */ #define MY_COPYTIME 64 /* my_redel() copys time */ #define MY_DELETE_OLD 256 /* my_create_with_symlink() */ @@ -72,7 +71,7 @@ extern int NEAR my_errno; /* Last error in mysys */ #define MY_FREE_ON_ERROR 128 /* my_realloc() ; Free old ptr on error */ #define MY_HOLD_ON_ERROR 256 /* my_realloc() ; Return old ptr on error */ #define MY_THREADSAFE 128 /* pread/pwrite: Don't allow interrupts */ -#define MY_DONT_OVERWRITE_FILE 1024 /* my_copy; Don't overwrite file */ +#define MY_DONT_OVERWRITE_FILE 1024 /* my_copy: Don't overwrite file */ #define MY_CHECK_ERROR 1 /* Params to my_end; Check open-close */ #define MY_GIVE_INFO 2 /* Give time info about process*/ diff --git a/include/mysql_embed.h b/include/mysql_embed.h index 603af8e83b8..311d95eda73 100644 --- a/include/mysql_embed.h +++ b/include/mysql_embed.h @@ -24,7 +24,6 @@ #undef HAVE_PSTACK /* No stacktrace */ #undef HAVE_DLOPEN /* No udf functions */ #undef HAVE_OPENSSL -#undef HAVE_ISAM #undef HAVE_SMEM /* No shared memory */ #undef HAVE_NDBCLUSTER_DB /* No NDB cluster */ diff --git a/mysql-test/r/replace.result b/mysql-test/r/replace.result index 83cde76215a..a7d59fcfa62 100644 --- a/mysql-test/r/replace.result +++ b/mysql-test/r/replace.result @@ -3,12 +3,10 @@ CREATE TABLE t1 ( gesuchnr int(11) DEFAULT '0' NOT NULL, benutzer_id int(11) DEFAULT '0' NOT NULL, PRIMARY KEY (gesuchnr,benutzer_id) -) engine=ISAM; +); replace into t1 (gesuchnr,benutzer_id) values (2,1); replace into t1 (gesuchnr,benutzer_id) values (1,1); replace into t1 (gesuchnr,benutzer_id) values (1,1); -alter table t1 engine=myisam; -replace into t1 (gesuchnr,benutzer_id) values (1,1); alter table t1 engine=heap; replace into t1 (gesuchnr,benutzer_id) values (1,1); drop table t1; diff --git a/mysql-test/t/replace.test b/mysql-test/t/replace.test index 8429d80a4ef..2b3775f4f67 100644 --- a/mysql-test/t/replace.test +++ b/mysql-test/t/replace.test @@ -1,7 +1,5 @@ --- source include/have_isam.inc - # -# Test of REPLACE with ISAM and MyISAM and HEAP +# Test of REPLACE with MyISAM and HEAP # --disable_warnings @@ -12,13 +10,11 @@ CREATE TABLE t1 ( gesuchnr int(11) DEFAULT '0' NOT NULL, benutzer_id int(11) DEFAULT '0' NOT NULL, PRIMARY KEY (gesuchnr,benutzer_id) -) engine=ISAM; +); replace into t1 (gesuchnr,benutzer_id) values (2,1); replace into t1 (gesuchnr,benutzer_id) values (1,1); replace into t1 (gesuchnr,benutzer_id) values (1,1); -alter table t1 engine=myisam; -replace into t1 (gesuchnr,benutzer_id) values (1,1); alter table t1 engine=heap; replace into t1 (gesuchnr,benutzer_id) values (1,1); drop table t1; diff --git a/mysql-test/t/xa.test b/mysql-test/t/xa.test index 1f2fb5056ed..321e5008035 100644 --- a/mysql-test/t/xa.test +++ b/mysql-test/t/xa.test @@ -31,6 +31,7 @@ xa end 'testa','testb'; connect (con1,localhost,,,); connection con1; +# gtrid [ , bqual [ , formatID ] ] xa start 0x7465737462, 0x2030405060, 0xb; insert t1 values (40); xa end 'testb',' 0@P`',11; diff --git a/mysys/my_sync.c b/mysys/my_sync.c index bd372f03c87..bfaf09ce402 100644 --- a/mysys/my_sync.c +++ b/mysys/my_sync.c @@ -27,7 +27,14 @@ my_flags Flags (now only MY_WME is supported) NOTE - If file system supports its, only file data is synced, not inode date + If file system supports its, only file data is synced, not inode data. + + MY_IGNORE_BADFD is useful when fd is "volatile" - not protected by a + mutex. In this case by the time of fsync(), fd may be already closed by + another thread, or even reassigned to a different file. With this flag - + MY_IGNORE_BADFD - such a situation will not be considered an error. + (which is correct behaviour, if we know that the other thread synced the + file before closing) RETURN 0 ok @@ -55,10 +62,15 @@ int my_sync(File fd, myf my_flags) if (res) { - if (!(my_errno= errno)) - my_errno= -1; /* Unknown error */ - if (my_flags & MY_WME) + int er= errno; + if (!(my_errno= er)) + my_errno= -1; /* Unknown error */ + if (my_flags & MY_IGNORE_BADFD && + (er == EBADF || er == EINVAL || er == EROFS)) + res= 0; + else if (my_flags & MY_WME) my_error(EE_SYNC, MYF(ME_BELL+ME_WAITTANG), my_filename(fd), my_errno); } DBUG_RETURN(res); -} /* my_read */ +} /* my_sync */ + diff --git a/sql/handler.cc b/sql/handler.cc index fd9ec7cf423..3181e5754de 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -25,10 +25,6 @@ #include "ha_heap.h" #include "ha_myisam.h" #include "ha_myisammrg.h" -#ifdef HAVE_ISAM -#include "ha_isam.h" -#include "ha_isammrg.h" -#endif #ifdef HAVE_BERKELEY_DB #include "ha_berkeley.h" #endif diff --git a/sql/log.cc b/sql/log.cc index 9af70a4d527..1d6bb4cdf41 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -1531,18 +1531,20 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command, return 0; } - -inline bool sync_binlog(IO_CACHE *cache) +bool MYSQL_LOG::flush_and_sync() { - if (sync_binlog_period == ++sync_binlog_counter && sync_binlog_period) + int err=0, fd=log_file.file; + safe_mutex_assert_owner(&LOCK_log); + if (flush_io_cache(&log_file)) + return 1; + if (++sync_binlog_counter >= sync_binlog_period && sync_binlog_period) { sync_binlog_counter= 0; - return my_sync(cache->file, MYF(MY_WME)); + err=my_sync(fd, MYF(MY_WME)); } - return 0; + return err; } - /* Write an event to the binary log */ @@ -1675,8 +1677,8 @@ bool MYSQL_LOG::write(Log_event *event_info) } } - /* - Write the SQL command + /* + Write the SQL command */ if (event_info->write(file)) @@ -1684,8 +1686,10 @@ bool MYSQL_LOG::write(Log_event *event_info) if (file == &log_file) // we are writing to the real log (disk) { - if (flush_io_cache(file) || sync_binlog(file)) + if (flush_and_sync()) goto err; + signal_update(); + rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED); } error=0; @@ -1698,15 +1702,9 @@ err: my_error(ER_ERROR_ON_WRITE, MYF(0), name, errno); write_error=1; } - if (file == &log_file) - { - signal_update(); - rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED); - } } pthread_mutex_unlock(&LOCK_log); - DBUG_RETURN(error); } @@ -1813,7 +1811,7 @@ bool MYSQL_LOG::write(THD *thd, IO_CACHE *cache, Log_event *commit_event) if (commit_event->write(&log_file)) goto err; DBUG_skip_commit: - if (flush_io_cache(&log_file) || sync_binlog(&log_file)) + if (flush_and_sync()) goto err; DBUG_EXECUTE_IF("half_binlogged_transaction", abort();); if (cache->error) // Error on read @@ -1983,26 +1981,26 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length, SYNOPSIS wait_for_update() thd Thread variable - master_or_slave If 0, the caller is the Binlog_dump thread from master; + is_slave If 0, the caller is the Binlog_dump thread from master; if 1, the caller is the SQL thread from the slave. This influences only thd->proc_info. NOTES One must have a lock on LOCK_log before calling this function. - This lock will be freed before return! That's required by + This lock will be released before return! That's required by THD::enter_cond() (see NOTES in sql_class.h). */ -void MYSQL_LOG::wait_for_update(THD* thd, bool master_or_slave) +void MYSQL_LOG::wait_for_update(THD* thd, bool is_slave) { const char *old_msg; DBUG_ENTER("wait_for_update"); old_msg= thd->enter_cond(&update_cond, &LOCK_log, - master_or_slave ? + is_slave ? "Has read all relay log; waiting for the slave I/O " - "thread to update it" : + "thread to update it" : "Has sent all binlog to slave; waiting for binlog " - "to be updated"); + "to be updated"); pthread_cond_wait(&update_cond, &LOCK_log); thd->exit_cond(old_msg); DBUG_VOID_RETURN; @@ -2051,7 +2049,12 @@ void MYSQL_LOG::close(uint exiting) my_pwrite(log_file.file, &flags, 1, offset, MYF(0)); } - if (my_close(log_file.file,MYF(0)) < 0 && ! write_error) + if (my_sync(log_file.file,MYF(MY_WME)) && ! write_error) + { + write_error=1; + sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno); + } + if (my_close(log_file.file,MYF(MY_WME)) && ! write_error) { write_error=1; sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno); @@ -2945,8 +2948,10 @@ int TC_LOG_BINLOG::log(THD *thd, my_xid xid) void TC_LOG_BINLOG::unlog(ulong cookie, my_xid xid) { - if (thread_safe_dec_and_test(prepared_xids, &LOCK_prep_xids)) + pthread_mutex_lock(&LOCK_prep_xids); + if (--prepared_xids == 0) pthread_cond_signal(&COND_prep_xids); + pthread_mutex_unlock(&LOCK_prep_xids); rotate_and_purge(0); // as ::write() did not rotate } diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 7e4c6675e45..b92443f7e15 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -1126,10 +1126,6 @@ extern MY_BITMAP temp_pool; extern String my_empty_string; extern const String my_null_string; extern SHOW_VAR init_vars[],status_vars[], internal_vars[]; -extern SHOW_COMP_OPTION have_isam; -extern SHOW_COMP_OPTION have_innodb; -extern SHOW_COMP_OPTION have_berkeley_db; -extern SHOW_COMP_OPTION have_ndbcluster; extern struct system_variables global_system_variables; extern struct system_variables max_system_variables; extern struct system_status_var global_status_var; @@ -1150,12 +1146,13 @@ extern struct my_option my_long_options[]; extern SHOW_COMP_OPTION have_isam, have_innodb, have_berkeley_db; extern SHOW_COMP_OPTION have_example_db, have_archive_db, have_csv_db; extern SHOW_COMP_OPTION have_federated_db; +extern SHOW_COMP_OPTION have_blackhole_db; +extern SHOW_COMP_OPTION have_ndbcluster; extern SHOW_COMP_OPTION have_raid, have_openssl, have_symlink; -extern SHOW_COMP_OPTION have_query_cache, have_berkeley_db, have_innodb; +extern SHOW_COMP_OPTION have_query_cache; extern SHOW_COMP_OPTION have_geometry, have_rtree_keys; extern SHOW_COMP_OPTION have_crypt; extern SHOW_COMP_OPTION have_compress; -extern SHOW_COMP_OPTION have_blackhole_db; #ifndef __WIN__ extern pthread_t signal_thread; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 95de170b99d..ee95e00e0ee 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -30,9 +30,6 @@ #include "ha_innodb.h" #endif #include "ha_myisam.h" -#ifdef HAVE_ISAM -#include "ha_isam.h" -#endif #ifdef HAVE_NDBCLUSTER_DB #include "ha_ndbcluster.h" #endif @@ -47,11 +44,6 @@ #else #define OPT_BDB_DEFAULT 0 #endif -#ifdef HAVE_ISAM_DB -#define OPT_ISAM_DEFAULT 1 -#else -#define OPT_ISAM_DEFAULT 0 -#endif #ifdef HAVE_NDBCLUSTER_DB #define OPT_NDBCLUSTER_DEFAULT 0 #if defined(NOT_ENOUGH_TESTED) \ @@ -64,7 +56,6 @@ #define OPT_NDBCLUSTER_DEFAULT 0 #endif -#include #include #include #include @@ -4342,7 +4333,7 @@ Disable with --skip-bdb (will save memory).", "Don't try to recover Berkeley DB tables on start.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"bdb-no-sync", OPT_BDB_NOSYNC, - "Disable synchronously flushing logs. This option is deprecated, use --skip-sync-bdb-logs or sync-bdb-logs=0 instead", + "This option is deprecated, use --skip-sync-bdb-logs instead", // (gptr*) &opt_sync_bdb_logs, (gptr*) &opt_sync_bdb_logs, 0, GET_BOOL, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"bdb-shared-data", OPT_BDB_SHARED, @@ -4551,9 +4542,8 @@ Disable with --skip-innodb-doublewrite.", (gptr*) &innobase_use_doublewrite, (gptr*) &global_system_variables.innodb_support_xa, 0, GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, 0}, #endif /* End HAVE_INNOBASE_DB */ - {"isam", OPT_ISAM, "Enable ISAM (if this version of MySQL supports it). \ -Disable with --skip-isam.", - (gptr*) &opt_isam, (gptr*) &opt_isam, 0, GET_BOOL, NO_ARG, OPT_ISAM_DEFAULT, 0, 0, + {"isam", OPT_ISAM, "Obsolete. ISAM storage engine is no longer supported.", + (gptr*) &opt_isam, (gptr*) &opt_isam, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"language", 'L', "Client error messages in given language. May be given as a full path.", @@ -5469,36 +5459,35 @@ The minimum value for this variable is 4096.", 1, 0}, #ifdef HAVE_BERKELEY_DB {"sync-bdb-logs", OPT_BDB_SYNC, - "Synchronously flush logs. Enabled by default", + "Synchronously flush Berkeley DB logs. Enabled by default", (gptr*) &opt_sync_bdb_logs, (gptr*) &opt_sync_bdb_logs, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, #endif /* HAVE_BERKELEY_DB */ {"sync-binlog", OPT_SYNC_BINLOG, - "Sync the binlog to disk after every #th event. \ -#=0 (the default) does no sync. Syncing slows MySQL down", - (gptr*) &sync_binlog_period, - (gptr*) &sync_binlog_period, 0, GET_ULONG, REQUIRED_ARG, 0, 0, ~0L, 0, 1, - 0}, + "Synchronously flush binary log to disk after every #th event. " + "Use 0 (default) to disable synchronous flushing.", + (gptr*) &sync_binlog_period, (gptr*) &sync_binlog_period, 0, GET_ULONG, + REQUIRED_ARG, 1, 0, ~0L, 0, 1, 0}, + {"sync-frm", OPT_SYNC_FRM, "Sync .frm to disk on create. Enabled by default.", + (gptr*) &opt_sync_frm, (gptr*) &opt_sync_frm, 0, GET_BOOL, NO_ARG, 1, 0, + 0, 0, 0, 0}, #ifdef DOES_NOTHING_YET {"sync-replication", OPT_SYNC_REPLICATION, - "Enable synchronous replication", + "Enable synchronous replication.", (gptr*) &global_system_variables.sync_replication, (gptr*) &global_system_variables.sync_replication, 0, GET_ULONG, REQUIRED_ARG, 0, 0, 1, 0, 1, 0}, {"sync-replication-slave-id", OPT_SYNC_REPLICATION_SLAVE_ID, - "Synchronous replication is wished for this slave", + "Synchronous replication is wished for this slave.", (gptr*) &global_system_variables.sync_replication_slave_id, (gptr*) &global_system_variables.sync_replication_slave_id, 0, GET_ULONG, REQUIRED_ARG, 0, 0, ~0L, 0, 1, 0}, {"sync-replication-timeout", OPT_SYNC_REPLICATION_TIMEOUT, - "Synchronous replication timeout", + "Synchronous replication timeout.", (gptr*) &global_system_variables.sync_replication_timeout, (gptr*) &global_system_variables.sync_replication_timeout, 0, GET_ULONG, REQUIRED_ARG, 10, 0, ~0L, 0, 1, 0}, #endif - {"sync-frm", OPT_SYNC_FRM, "Sync .frm to disk on create. Enabled by default", - (gptr*) &opt_sync_frm, (gptr*) &opt_sync_frm, 0, GET_BOOL, NO_ARG, 1, 0, - 0, 0, 0, 0}, {"table_cache", OPT_TABLE_CACHE, "The number of open tables for all threads.", (gptr*) &table_cache_size, (gptr*) &table_cache_size, 0, GET_ULONG, REQUIRED_ARG, 64, 1, 512*1024L, @@ -5962,11 +5951,7 @@ static void mysql_init_variables(void) #else have_innodb=SHOW_OPTION_NO; #endif -#ifdef HAVE_ISAM - have_isam=SHOW_OPTION_YES; -#else have_isam=SHOW_OPTION_NO; -#endif #ifdef HAVE_EXAMPLE_DB have_example_db= SHOW_OPTION_YES; #else @@ -6375,9 +6360,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), opt_error_log= 0; // Force logs to stdout break; case (int) OPT_FLUSH: -#ifdef HAVE_ISAM - nisam_flush=1; -#endif myisam_flush=1; flush_time=0; // No auto flush break; @@ -6482,14 +6464,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), have_berkeley_db= SHOW_OPTION_YES; else have_berkeley_db= SHOW_OPTION_DISABLED; -#endif - break; - case OPT_ISAM: -#ifdef HAVE_ISAM - if (opt_isam) - have_isam= SHOW_OPTION_YES; - else - have_isam= SHOW_OPTION_DISABLED; #endif break; case OPT_NDBCLUSTER: diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 44e2f5ee9f2..9920d89519e 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -42,7 +42,6 @@ #include "mysql_priv.h" #include -#include #include "sql_select.h" #ifndef EXTRA_DEBUG @@ -51,7 +50,7 @@ #endif /* - Convert double value to #rows. Currently this does floor(), and we + Convert double value to #rows. Currently this does floor(), and we might consider using round() instead. */ #define double2rows(x) ((ha_rows)(x)) diff --git a/sql/set_var.cc b/sql/set_var.cc index 457df3f2947..3523e444216 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -954,9 +954,11 @@ struct show_var_st init_vars[]= { {"sql_warnings", (char*) &sys_sql_warnings, SHOW_BOOL}, #ifdef HAVE_REPLICATION {sys_sync_binlog_period.name,(char*) &sys_sync_binlog_period, SHOW_SYS}, +#ifdef DOES_NOTHING_YET {sys_sync_replication.name, (char*) &sys_sync_replication, SHOW_SYS}, {sys_sync_replication_slave_id.name, (char*) &sys_sync_replication_slave_id,SHOW_SYS}, {sys_sync_replication_timeout.name, (char*) &sys_sync_replication_timeout,SHOW_SYS}, +#endif #endif {sys_sync_frm.name, (char*) &sys_sync_frm, SHOW_SYS}, #ifdef HAVE_TZNAME @@ -2495,14 +2497,6 @@ bool sys_var_sync_binlog_period::update(THD *thd, set_var *var) { pthread_mutex_t *lock_log= mysql_bin_log.get_log_lock(); sync_binlog_period= (ulong) var->save_result.ulonglong_value; - /* - Must reset the counter otherwise it may already be beyond the new period - and so the new period will not be taken into account. Need mutex otherwise - might be cancelled by a simultanate ++ in MYSQL_LOG::write(). - */ - pthread_mutex_lock(lock_log); - sync_binlog_counter= 0; - pthread_mutex_unlock(lock_log); return 0; } #endif /* HAVE_REPLICATION */ @@ -2522,7 +2516,7 @@ bool sys_var_rand_seed2::update(THD *thd, set_var *var) bool sys_var_thd_time_zone::check(THD *thd, set_var *var) { - char buff[MAX_TIME_ZONE_NAME_LENGTH]; + char buff[MAX_TIME_ZONE_NAME_LENGTH]; String str(buff, sizeof(buff), &my_charset_latin1); String *res= var->value->val_str(&str); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 4750fe1386f..b0f2930758e 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -25,7 +25,6 @@ #include #include #include -#include #ifdef __WIN__ #include #endif diff --git a/sql/sql_class.h b/sql/sql_class.h index 6d6ac810fbf..123ecdfaa89 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -327,6 +327,7 @@ public: bool is_active(const char* log_file_name); int update_log_index(LOG_INFO* linfo, bool need_update_threads); void rotate_and_purge(uint flags); + bool flush_and_sync(); int purge_logs(const char *to_log, bool included, bool need_mutex, bool need_update_threads, ulonglong *decrease_log_space); @@ -1283,18 +1284,18 @@ public: pthread_mutex_unlock(&LOCK_delete); } void close_active_vio(); -#endif +#endif void awake(THD::killed_state state_to_set); /* For enter_cond() / exit_cond() to work the mutex must be got before - enter_cond() (in 4.1 an assertion will soon ensure this); this mutex is - then released by exit_cond(). Use must be: - lock mutex; enter_cond(); your code; exit_cond(). + enter_cond(); this mutex is then released by exit_cond(). + Usage must be: lock mutex; enter_cond(); your code; exit_cond(). */ inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex, const char* msg) { const char* old_msg = proc_info; + safe_mutex_assert_owner(mutex); mysys_var->current_mutex = mutex; mysys_var->current_cond = cond; proc_info = msg; From 8d6427659fb592211b144a0d73e7b8ea7120cf8e Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Tue, 5 Apr 2005 15:13:14 +0300 Subject: [PATCH 065/204] InnoDB: Disable an assertion that fails on old data due to Bug #9526 --- innobase/row/row0sel.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c index 09a6f1eacff..e3f31c116fa 100644 --- a/innobase/row/row0sel.c +++ b/innobase/row/row0sel.c @@ -2364,7 +2364,9 @@ row_sel_field_store_in_mysql_format( ut_a(templ->mbmaxlen > templ->mbminlen || templ->mysql_col_len == len); - ut_a(!templ->mbmaxlen + /* The following assertion would fail for old tables + containing UTF-8 ENUM columns due to Bug #9526. */ + ut_ad(!templ->mbmaxlen || !(templ->mysql_col_len % templ->mbmaxlen)); ut_a(len * templ->mbmaxlen >= templ->mysql_col_len); From 71811298b9387b4af58baf762b3e5651d93d93d4 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Tue, 5 Apr 2005 14:46:18 +0200 Subject: [PATCH 066/204] sql/item.cc after merge fix sql/mysqld.cc too early for sync-binlog=1 by default :) --- sql/item.cc | 2 +- sql/mysqld.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/item.cc b/sql/item.cc index 1572efb0f23..d3abc40eb29 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1496,7 +1496,7 @@ longlong Item_string::val_int() char *org_end= end; CHARSET_INFO *cs= str_value.charset(); - tmp= (*(cs->cset->my_strtoll10))(cs, str_value.ptr(), &end, &err); + tmp= (*(cs->cset->strtoll10))(cs, str_value.ptr(), &end, &err); /* TODO: Give error if we wanted a signed integer and we got an unsigned one diff --git a/sql/mysqld.cc b/sql/mysqld.cc index ba149e5cee6..ecf2094eb18 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -5467,7 +5467,7 @@ The minimum value for this variable is 4096.", "Synchronously flush binary log to disk after every #th event. " "Use 0 (default) to disable synchronous flushing.", (gptr*) &sync_binlog_period, (gptr*) &sync_binlog_period, 0, GET_ULONG, - REQUIRED_ARG, 1, 0, ~0L, 0, 1, 0}, + REQUIRED_ARG, 0, 0, ~0L, 0, 1, 0}, {"sync-frm", OPT_SYNC_FRM, "Sync .frm to disk on create. Enabled by default.", (gptr*) &opt_sync_frm, (gptr*) &opt_sync_frm, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, From 3c3defaa0a50ef6a21c803bd9145473890a92967 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Tue, 5 Apr 2005 15:16:15 +0200 Subject: [PATCH 067/204] add changeset key to the bk commit mail --- BitKeeper/triggers/post-commit | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BitKeeper/triggers/post-commit b/BitKeeper/triggers/post-commit index d2a4f9153b2..4c28b408658 100755 --- a/BitKeeper/triggers/post-commit +++ b/BitKeeper/triggers/post-commit @@ -27,6 +27,7 @@ then fi CHANGESET=`bk -R prs -r+ -h -d':P:::I:' ChangeSet` +CSETKEY=`bk -R prs -r+ -h -d':KEY:' ChangeSet` BUG=`bk -R prs -r+ -h -d':C:' ChangeSet | sed -ne 's/^.*[Bb][Uu][Gg] *# *\([0-9][0-9]*\).*$/\1/p'` if [ "$BUG" = "" ] @@ -51,6 +52,7 @@ List-ID: From: $FROM To: $TO Subject: bk commit - $VERSION tree ($CHANGESET)$BS +X-CSetKey: <$CSETKEY> $BH EOF bk changes -v -r+ @@ -67,6 +69,7 @@ List-ID: From: $FROM To: $INTERNALS Subject: bk commit into $VERSION tree ($CHANGESET)$BS +X-CSetKey: <$CSETKEY> $BH Below is the list of changes that have just been committed into a local $VERSION repository of $USER. When $USER does a push these changes will From 7f2a12bbbfe3b8b029cafcb000e066a5d7780aee Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Tue, 5 Apr 2005 15:36:52 +0200 Subject: [PATCH 068/204] fix broken mix_innodb_myisam_binlog.test --- mysql-test/t/mix_innodb_myisam_binlog.test | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mysql-test/t/mix_innodb_myisam_binlog.test b/mysql-test/t/mix_innodb_myisam_binlog.test index cf575ab1e52..0641acb552f 100644 --- a/mysql-test/t/mix_innodb_myisam_binlog.test +++ b/mysql-test/t/mix_innodb_myisam_binlog.test @@ -29,7 +29,7 @@ insert into t2 select * from t1; commit; --replace_column 5 # ---replace_result "xid=12" "xid=7" +--replace_result "xid=15" "xid=8" show binlog events from 98; delete from t1; @@ -58,7 +58,7 @@ rollback to savepoint my_savepoint; commit; --replace_column 5 # ---replace_result "xid=45" "xid=24" +--replace_result "xid=48" "xid=25" show binlog events from 98; delete from t1; @@ -76,7 +76,7 @@ commit; select a from t1 order by a; # check that savepoints work :) --replace_column 5 # ---replace_result "xid=67" "xid=36" +--replace_result "xid=70" "xid=37" show binlog events from 98; # and when ROLLBACK is not explicit? @@ -109,7 +109,7 @@ insert into t1 values(9); insert into t2 select * from t1; --replace_column 5 # ---replace_result "xid=116" "xid=59" +--replace_result "xid=119" "xid=60" show binlog events from 98; # Check that when the query updat1ng the MyISAM table is the first in the @@ -122,13 +122,13 @@ insert into t1 values(10); # first make t1 non-empty begin; insert into t2 select * from t1; --replace_column 5 # ---replace_result "xid=130" "xid=65" +--replace_result "xid=133" "xid=66" show binlog events from 98; insert into t1 values(11); commit; --replace_column 5 # ---replace_result "xid=130" "xid=65" "xid=133" "xid=67" +--replace_result "xid=133" "xid=66" "xid=136" "xid=68" show binlog events from 98; @@ -147,7 +147,7 @@ insert into t2 select * from t1; commit; --replace_column 5 # ---replace_result "xid=152" "xid=77" +--replace_result "xid=155" "xid=78" show binlog events from 98; delete from t1; @@ -175,7 +175,7 @@ rollback to savepoint my_savepoint; commit; --replace_column 5 # ---replace_result "xid=184" "xid=93" +--replace_result "xid=187" "xid=94" show binlog events from 98; delete from t1; @@ -193,7 +193,7 @@ commit; select a from t1 order by a; # check that savepoints work :) --replace_column 5 # ---replace_result "xid=205" "xid=104" +--replace_result "xid=208" "xid=105" show binlog events from 98; # Test for BUG#5714, where a MyISAM update in the transaction used to From b18ca48c47ed04a7414ebb0e48f3071838539db5 Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Tue, 5 Apr 2005 15:49:10 +0200 Subject: [PATCH 069/204] Additional fix for BUG#5907: Traditional mode: invalid value can be inserted via a stored procedure ... make the handler catch too. --- mysql-test/r/strict.result | 3 ++- mysql-test/t/strict.test | 1 - sql/sp_head.cc | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result index c4d860c5c77..99ea0d577da 100644 --- a/mysql-test/r/strict.result +++ b/mysql-test/r/strict.result @@ -1180,7 +1180,8 @@ Note 1305 PROCEDURE t1 does not exist create procedure t1 () begin declare exit handler for sqlexception select'a'; insert into t1 values (200); end;| call t1(); -ERROR 22003: Out of range value adjusted for column 'col1' at row 1 +a +a select * from t1; col1 drop procedure t1; diff --git a/mysql-test/t/strict.test b/mysql-test/t/strict.test index b5d234b7bea..6b7ce1a8f9e 100644 --- a/mysql-test/t/strict.test +++ b/mysql-test/t/strict.test @@ -1040,7 +1040,6 @@ delimiter |; create procedure t1 () begin declare exit handler for sqlexception select'a'; insert into t1 values (200); end;| delimiter ;| ---error 1264 call t1(); select * from t1; drop procedure t1; diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 89c4b2dbaac..63f67959f33 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -561,7 +561,10 @@ sp_head::execute(THD *thd) // Check if an exception has occurred and a handler has been found // Note: We havo to check even if ret==0, since warnings (and some // errors don't return a non-zero value. - if (!thd->killed && ctx) + // We also have to check even if thd->killed != 0, since some + // errors return with this even when a handler has been found + // (e.g. "bad data"). + if (ctx) { uint hf; @@ -579,6 +582,7 @@ sp_head::execute(THD *thd) ctx->clear_handler(); ctx->in_handler= TRUE; thd->clear_error(); + thd->killed= THD::NOT_KILLED; continue; } } From 70482c41274466bd352cc44d946f882c848d7cc3 Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Tue, 5 Apr 2005 15:56:43 +0200 Subject: [PATCH 070/204] Fix Bug #9517 Condition pushdown to storage engine does not work for update/delete, post review fix, removed quick constraint --- sql/records.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/records.cc b/sql/records.cc index 28a8e9a9aa5..cfb7cb3d065 100644 --- a/sql/records.cc +++ b/sql/records.cc @@ -132,7 +132,7 @@ void init_read_record(READ_RECORD *info,THD *thd, TABLE *table, if (thd->variables.engine_condition_pushdown && select && select->cond && select->cond->used_tables() & table->map && - !(select->quick || table->file->pushed_cond)) + !table->file->pushed_cond) table->file->cond_push(select->cond); DBUG_VOID_RETURN; From d6062ef9b530332489f3a4738f1fea468498894c Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Tue, 5 Apr 2005 16:39:40 +0200 Subject: [PATCH 071/204] removed a reference to non-existing file --- .bzrignore | 2 ++ configure.in | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.bzrignore b/.bzrignore index 02a97d7d1af..eae47b882d0 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1107,3 +1107,5 @@ vio/test-sslclient vio/test-sslserver vio/viotest-ssl VC++Files/client/mysql_amd64.dsp +client/mysqltestmanager-pwgen +client/mysqltestmanagerc diff --git a/configure.in b/configure.in index c3c792e7339..c7e93c9676a 100644 --- a/configure.in +++ b/configure.in @@ -41,7 +41,6 @@ sinclude(config/ac-macros/ha_blackhole.m4) sinclude(config/ac-macros/ha_example.m4) sinclude(config/ac-macros/ha_federated.m4) sinclude(config/ac-macros/ha_innodb.m4) -sinclude(config/ac-macros/ha_isam.m4) sinclude(config/ac-macros/ha_ndbcluster.m4) sinclude(config/ac-macros/ha_tina.m4) sinclude(config/ac-macros/large_file.m4) From a3e6b30a89a21821b5b55144fa0c5f95f5ae3a04 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Tue, 5 Apr 2005 17:56:40 +0300 Subject: [PATCH 072/204] handler.cc, ha_innodb.cc: Fix Bug #8650 : InnoDB does not rollback SQL statement at an error --- sql/ha_innodb.cc | 56 ++++++++++++++++++++++++++++++++++-------------- sql/handler.cc | 6 +++--- 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 5365eee8f38..cfc649a5963 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -748,17 +748,37 @@ ha_innobase::update_thd( } /************************************************************************* -Registers the InnoDB transaction in MySQL, to receive commit/rollback -events. This function must be called every time InnoDB starts a -transaction internally. */ -static +Registers that InnoDB takes part in an SQL statement, so that MySQL knows to +roll back the statement if the statement results in an error. This MUST be +called for every SQL statement that may be rolled back by MySQL. Calling this +several times to register the same statement is allowed, too. */ +inline void -register_trans( -/*===========*/ - THD* thd) /* in: thd to use the handle */ +innobase_register_stmt( +/*===================*/ + THD* thd) /* in: MySQL thd (connection) object */ { - /* Register the start of the statement */ + /* Register the statement */ trans_register_ha(thd, FALSE, &innobase_hton); +} + +/************************************************************************* +Registers an InnoDB transaction in MySQL, so that the MySQL XA code knows +to call the InnoDB prepare and commit, or rollback for the transaction. This +MUST be called for every transaction for which the user may call commit or +rollback. Calling this several times to register the same transaction is +allowed, too. +This function also registers the current SQL statement. */ +inline +void +innobase_register_trx_and_stmt( +/*===========================*/ + THD* thd) /* in: MySQL thd (connection) object */ +{ + /* NOTE that actually innobase_register_stmt() registers also + the transaction in the AUTOCOMMIT=1 mode. */ + + innobase_register_stmt(thd); if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { @@ -914,7 +934,7 @@ innobase_query_caching_of_table_permitted( if (trx->active_trans == 0) { - register_trans(thd); + innobase_register_trx_and_stmt(thd); trx->active_trans = 1; } @@ -1030,7 +1050,7 @@ ha_innobase::init_table_handle_for_HANDLER(void) if (prebuilt->trx->active_trans == 0) { - register_trans(current_thd); + innobase_register_trx_and_stmt(current_thd); prebuilt->trx->active_trans = 1; } @@ -1421,7 +1441,7 @@ innobase_start_trx_and_assign_read_view( if (trx->active_trans == 0) { - register_trans(current_thd); + innobase_register_trx_and_stmt(current_thd); trx->active_trans = 1; } @@ -5544,9 +5564,11 @@ ha_innobase::start_stmt( /* Set the MySQL flag to mark that there is an active transaction */ if (trx->active_trans == 0) { - register_trans(thd); + innobase_register_trx_and_stmt(thd); trx->active_trans = 1; - } + } else { + innobase_register_stmt(thd); + } return(0); } @@ -5616,9 +5638,11 @@ ha_innobase::external_lock( transaction */ if (trx->active_trans == 0) { - register_trans(thd); + innobase_register_trx_and_stmt(thd); trx->active_trans = 1; - } + } else if (trx->n_mysql_tables_in_use == 0) { + innobase_register_stmt(thd); + } trx->n_mysql_tables_in_use++; prebuilt->mysql_has_locked = TRUE; @@ -5780,7 +5804,7 @@ ha_innobase::transactional_table_lock( /* Set the MySQL flag to mark that there is an active transaction */ if (trx->active_trans == 0) { - register_trans(thd); + innobase_register_trx_and_stmt(thd); trx->active_trans = 1; } diff --git a/sql/handler.cc b/sql/handler.cc index 3eead37482b..7cd2fd303f0 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -520,14 +520,14 @@ void trans_register_ha(THD *thd, bool all, handlerton *ht_arg) else trans= &thd->transaction.stmt; -#ifndef DBUG_OFF handlerton **ht=trans->ht; while (*ht) { - DBUG_ASSERT(*ht != ht_arg); + if (*ht == ht_arg) + DBUG_VOID_RETURN; /* already registered, return */ ht++; } -#endif + trans->ht[trans->nht++]=ht_arg; trans->no_2pc|=(ht_arg->prepare==0); if (thd->transaction.xid.is_null()) From 42277bdd2fa842f281abdc9a6292d8be92d490d8 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Tue, 5 Apr 2005 18:42:34 +0200 Subject: [PATCH 073/204] Per Heikki's request make trans_register_ha tolerant to multiple registrations --- sql/handler.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index 3eead37482b..96fe3937198 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -505,10 +505,16 @@ void ha_close_connection(THD* thd) "beginning of transaction" and "beginning of statement"). Only storage engines registered for the transaction/statement will know when to commit/rollback it. + + NOTE + trans_register_ha is idempotent - storage engine may register many + times per transaction. + */ void trans_register_ha(THD *thd, bool all, handlerton *ht_arg) { THD_TRANS *trans; + handlerton **ht; DBUG_ENTER("trans_register_ha"); DBUG_PRINT("enter",("%s", all ? "all" : "stmt")); @@ -520,15 +526,12 @@ void trans_register_ha(THD *thd, bool all, handlerton *ht_arg) else trans= &thd->transaction.stmt; -#ifndef DBUG_OFF - handlerton **ht=trans->ht; - while (*ht) - { - DBUG_ASSERT(*ht != ht_arg); - ht++; - } -#endif + for (ht=trans->ht; *ht; ht++) + if (*ht == ht_arg) + DBUG_VOID_RETURN; + trans->ht[trans->nht++]=ht_arg; + DBUG_ASSERT(*ht == ht_arg); trans->no_2pc|=(ht_arg->prepare==0); if (thd->transaction.xid.is_null()) thd->transaction.xid.set(thd->query_id); From 127afff8c87cf8d6a56de799a6b7d5ad2a20d5bd Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Tue, 5 Apr 2005 13:01:42 -0700 Subject: [PATCH 074/204] Remove references to result.es files --- mysql-test/Makefile.am | 3 +-- scripts/make_binary_distribution.sh | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/mysql-test/Makefile.am b/mysql-test/Makefile.am index 294c135bcf3..1325b90631f 100644 --- a/mysql-test/Makefile.am +++ b/mysql-test/Makefile.am @@ -51,7 +51,7 @@ dist-hook: -$(INSTALL_DATA) $(srcdir)/t/*.disabled $(distdir)/t $(INSTALL_DATA) $(srcdir)/t/*.opt $(srcdir)/t/*.sh $(srcdir)/t/*.slave-mi $(distdir)/t $(INSTALL_DATA) $(srcdir)/include/*.inc $(distdir)/include - $(INSTALL_DATA) $(srcdir)/r/*.result $(srcdir)/r/*.result.es $(srcdir)/r/*.require $(distdir)/r + $(INSTALL_DATA) $(srcdir)/r/*.result $(srcdir)/r/*.require $(distdir)/r $(INSTALL_DATA) $(srcdir)/std_data/Moscow_leap $(distdir)/std_data $(INSTALL_DATA) $(srcdir)/std_data/*.dat $(srcdir)/std_data/*.000001 $(distdir)/std_data $(INSTALL_DATA) $(srcdir)/std_data/des_key_file $(distdir)/std_data @@ -71,7 +71,6 @@ install-data-local: $(INSTALL_DATA) $(srcdir)/t/*.sh $(DESTDIR)$(testdir)/t $(INSTALL_DATA) $(srcdir)/t/*.slave-mi $(DESTDIR)$(testdir)/t $(INSTALL_DATA) $(srcdir)/r/*.result $(DESTDIR)$(testdir)/r - $(INSTALL_DATA) $(srcdir)/r/*.result.es $(DESTDIR)$(testdir)/r $(INSTALL_DATA) $(srcdir)/r/*.require $(DESTDIR)$(testdir)/r $(INSTALL_DATA) $(srcdir)/include/*.inc $(DESTDIR)$(testdir)/include $(INSTALL_DATA) $(srcdir)/std_data/*.dat $(DESTDIR)$(testdir)/std_data diff --git a/scripts/make_binary_distribution.sh b/scripts/make_binary_distribution.sh index 6ebe05fe116..a1c380780b0 100644 --- a/scripts/make_binary_distribution.sh +++ b/scripts/make_binary_distribution.sh @@ -225,7 +225,7 @@ $CP mysql-test/std_data/*.dat mysql-test/std_data/*.frm \ $BASE/mysql-test/std_data $CP mysql-test/t/*.test mysql-test/t/*.disabled mysql-test/t/*.opt \ mysql-test/t/*.slave-mi mysql-test/t/*.sh $BASE/mysql-test/t -$CP mysql-test/r/*.result mysql-test/r/*.result.es mysql-test/r/*.require \ +$CP mysql-test/r/*.result mysql-test/r/*.require \ $BASE/mysql-test/r if [ $BASE_SYSTEM != "netware" ] ; then From 1dd12e9d04cfe57594c46b85b5a3e0a3cb564d3f Mon Sep 17 00:00:00 2001 From: "jani@ua141d10.elisa.omakaista.fi" <> Date: Tue, 5 Apr 2005 23:14:56 +0300 Subject: [PATCH 075/204] Some of the argument place holders were not quite correct compared to the argument type. Fixed also some float() casts to double() as query_id is now actually longlong type. Related to Bug#9646. --- sql/sql_parse.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 69126e35554..693229c5a24 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1912,12 +1912,13 @@ bool dispatch_command(enum enum_server_command command, THD *thd, #endif ulong uptime = (ulong) (thd->start_time - start_time); sprintf((char*) buff, - "Uptime: %ld Threads: %d Questions: %lu Slow queries: %lu Opens: %ld Flush tables: %ld Open tables: %u Queries per second avg: %.3f", + "Uptime: %lu Threads: %d Questions: %lu Slow queries: %lu Opens: %lu Flush tables: %lu Open tables: %u Queries per second avg: %.3f", uptime, (int) thread_count, (ulong) thd->query_id, (ulong) thd->status_var.long_query_count, thd->status_var.opened_tables, refresh_version, cached_tables(), - uptime ? (float)thd->query_id/(float)uptime : 0); + (uptime ? (ulonglong2double(thd->query_id) / (double) uptime) : + (double) 0)); #ifdef SAFEMALLOC if (sf_malloc_cur_memory) // Using SAFEMALLOC sprintf(strend(buff), " Memory in use: %ldK Max memory used: %ldK", From 2f398fc3aea34dca70fb4ec4220ff3c940f72fd8 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Tue, 5 Apr 2005 20:55:06 -0700 Subject: [PATCH 076/204] Update tests after merge of bug fix. --- mysql-test/r/null.result | 2 +- mysql-test/r/show_check.result | 16 +++---- mysql-test/r/strict.result | 82 +++++++++++++++++----------------- mysql-test/t/null.test | 2 +- mysql-test/t/show_check.test | 2 +- 5 files changed, 52 insertions(+), 52 deletions(-) diff --git a/mysql-test/r/null.result b/mysql-test/r/null.result index 806e2b6f254..c2b925072dd 100644 --- a/mysql-test/r/null.result +++ b/mysql-test/r/null.result @@ -88,7 +88,7 @@ b ifnull(t2.b,"this is null") NULL this is null NULL this is null drop table t1; -CREATE TABLE t1 (a varchar(16) NOT NULL default '', b smallint(6) NOT NULL default '', c datetime NOT NULL default '0000-00-00 00:00:00', d smallint(6) NOT NULL default 0); +CREATE TABLE t1 (a varchar(16) NOT NULL default '', b smallint(6) NOT NULL default 0, c datetime NOT NULL default '0000-00-00 00:00:00', d smallint(6) NOT NULL default 0); INSERT INTO t1 SET a = "", d= "2003-01-14 03:54:55"; Warnings: Warning 1265 Data truncated for column 'd' at row 1 diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 7c34481b519..add4e91c725 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -195,7 +195,7 @@ h float(3,2) NULL YES NULL select,insert,update,references i float(3,0) NULL YES NULL select,insert,update,references drop table t1; create table t1 ( -type_bool bool not null, +type_bool bool not null default 0, type_tiny tinyint not null auto_increment primary key, type_short smallint(3), type_mediumint mediumint, @@ -206,9 +206,9 @@ empty_char char(0), type_char char(2), type_varchar varchar(10), type_timestamp timestamp not null, -type_date date not null, -type_time time not null, -type_datetime datetime not null, +type_date date not null default '0000-00-00', +type_time time not null default '00:00:00', +type_datetime datetime not null default '0000-00-00 00:00:00', type_year year, type_enum enum ('red', 'green', 'blue'), type_set enum ('red', 'green', 'blue'), @@ -221,7 +221,7 @@ index(type_short) show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `type_bool` tinyint(1) NOT NULL, + `type_bool` tinyint(1) NOT NULL default '0', `type_tiny` tinyint(4) NOT NULL auto_increment, `type_short` smallint(3) default NULL, `type_mediumint` mediumint(9) default NULL, @@ -232,9 +232,9 @@ t1 CREATE TABLE `t1` ( `type_char` char(2) default NULL, `type_varchar` varchar(10) default NULL, `type_timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, - `type_date` date NOT NULL, - `type_time` time NOT NULL, - `type_datetime` datetime NOT NULL, + `type_date` date NOT NULL default '0000-00-00', + `type_time` time NOT NULL default '00:00:00', + `type_datetime` datetime NOT NULL default '0000-00-00 00:00:00', `type_year` year(4) default NULL, `type_enum` enum('red','green','blue') default NULL, `type_set` enum('red','green','blue') default NULL, diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result index 5e1768a207e..7d1b6b67fd2 100644 --- a/mysql-test/r/strict.result +++ b/mysql-test/r/strict.result @@ -1042,47 +1042,6 @@ col1 col2 3 99 DROP TABLE t1; -SET @@sql_mode = 'traditional'; -CREATE TABLE t1 (i int not null); -INSERT INTO t1 VALUES (); -ERROR HY000: Field 'i' doesn't have a default value -INSERT INTO t1 VALUES (DEFAULT); -ERROR HY000: Field 'i' doesn't have a default value -INSERT INTO t1 VALUES (DEFAULT(i)); -ERROR HY000: Field 'i' doesn't have a default value -ALTER TABLE t1 ADD j int; -INSERT INTO t1 SET j = 1; -ERROR HY000: Field 'i' doesn't have a default value -INSERT INTO t1 SET j = 1, i = DEFAULT; -ERROR HY000: Field 'i' doesn't have a default value -INSERT INTO t1 SET j = 1, i = DEFAULT(i); -ERROR HY000: Field 'i' doesn't have a default value -INSERT INTO t1 VALUES (DEFAULT,1); -ERROR HY000: Field 'i' doesn't have a default value -DROP TABLE t1; -SET @@sql_mode = ''; -CREATE TABLE t1 (i int not null); -INSERT INTO t1 VALUES (); -Warnings: -Warning 1364 Field 'i' doesn't have a default value -INSERT INTO t1 VALUES (DEFAULT); -Warnings: -Warning 1364 Field 'i' doesn't have a default value -INSERT INTO t1 VALUES (DEFAULT(i)); -ERROR HY000: Field 'i' doesn't have a default value -ALTER TABLE t1 ADD j int; -INSERT INTO t1 SET j = 1; -Warnings: -Warning 1364 Field 'i' doesn't have a default value -INSERT INTO t1 SET j = 1, i = DEFAULT; -Warnings: -Warning 1364 Field 'i' doesn't have a default value -INSERT INTO t1 SET j = 1, i = DEFAULT(i); -ERROR HY000: Field 'i' doesn't have a default value -INSERT INTO t1 VALUES (DEFAULT,1); -Warnings: -Warning 1364 Field 'i' doesn't have a default value -DROP TABLE t1; set sql_mode='traditional'; create table t1 (charcol char(255), varcharcol varchar(255), binarycol binary(255), varbinarycol varbinary(255), tinytextcol tinytext, @@ -1232,3 +1191,44 @@ col1 drop procedure t1; drop table t1; set sql_mode=@org_mode; +SET @@sql_mode = 'traditional'; +CREATE TABLE t1 (i int not null); +INSERT INTO t1 VALUES (); +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 VALUES (DEFAULT); +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 VALUES (DEFAULT(i)); +ERROR HY000: Field 'i' doesn't have a default value +ALTER TABLE t1 ADD j int; +INSERT INTO t1 SET j = 1; +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 SET j = 1, i = DEFAULT; +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 SET j = 1, i = DEFAULT(i); +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 VALUES (DEFAULT,1); +ERROR HY000: Field 'i' doesn't have a default value +DROP TABLE t1; +SET @@sql_mode = ''; +CREATE TABLE t1 (i int not null); +INSERT INTO t1 VALUES (); +Warnings: +Warning 1364 Field 'i' doesn't have a default value +INSERT INTO t1 VALUES (DEFAULT); +Warnings: +Warning 1364 Field 'i' doesn't have a default value +INSERT INTO t1 VALUES (DEFAULT(i)); +ERROR HY000: Field 'i' doesn't have a default value +ALTER TABLE t1 ADD j int; +INSERT INTO t1 SET j = 1; +Warnings: +Warning 1364 Field 'i' doesn't have a default value +INSERT INTO t1 SET j = 1, i = DEFAULT; +Warnings: +Warning 1364 Field 'i' doesn't have a default value +INSERT INTO t1 SET j = 1, i = DEFAULT(i); +ERROR HY000: Field 'i' doesn't have a default value +INSERT INTO t1 VALUES (DEFAULT,1); +Warnings: +Warning 1364 Field 'i' doesn't have a default value +DROP TABLE t1; diff --git a/mysql-test/t/null.test b/mysql-test/t/null.test index 934b165f604..4cd20979319 100644 --- a/mysql-test/t/null.test +++ b/mysql-test/t/null.test @@ -59,7 +59,7 @@ drop table t1; # # Test inserting and updating with NULL # -CREATE TABLE t1 (a varchar(16) NOT NULL default '', b smallint(6) NOT NULL default '', c datetime NOT NULL default '0000-00-00 00:00:00', d smallint(6) NOT NULL default 0); +CREATE TABLE t1 (a varchar(16) NOT NULL default '', b smallint(6) NOT NULL default 0, c datetime NOT NULL default '0000-00-00 00:00:00', d smallint(6) NOT NULL default 0); INSERT INTO t1 SET a = "", d= "2003-01-14 03:54:55"; UPDATE t1 SET d=1/NULL; UPDATE t1 SET d=NULL; diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index 0004591288f..558adab5313 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -106,7 +106,7 @@ drop table t1; # Do a create table that tries to cover all types and options # create table t1 ( -type_bool bool not null default false, +type_bool bool not null default 0, type_tiny tinyint not null auto_increment primary key, type_short smallint(3), type_mediumint mediumint, From 0134a2b286e8402932207e9f2c402c28448568bc Mon Sep 17 00:00:00 2001 From: "bar@mysql.com" <> Date: Wed, 6 Apr 2005 11:53:15 +0500 Subject: [PATCH 077/204] Adding a new parameter for well_formed_length to return error. We'll use it for better warnign reporting. --- include/m_ctype.h | 9 ++++++--- ndb/src/ndbapi/NdbIndexOperation.cpp | 4 +++- ndb/src/ndbapi/NdbOperationDefine.cpp | 4 +++- ndb/src/ndbapi/NdbOperationSearch.cpp | 4 +++- sql/field.cc | 15 ++++++++------- sql/sql_yacc.yy | 3 ++- strings/ctype-big5.c | 6 +++++- strings/ctype-mb.c | 9 ++++++--- strings/ctype-simple.c | 6 +++--- strings/ctype-sjis.c | 5 ++++- strings/ctype-ucs2.c | 6 +++--- strings/ctype-ujis.c | 13 +++++++++++-- 12 files changed, 57 insertions(+), 27 deletions(-) diff --git a/include/m_ctype.h b/include/m_ctype.h index 26e285b9683..aab39156de1 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -147,7 +147,8 @@ typedef struct my_charset_handler_st uint (*numchars)(struct charset_info_st *, const char *b, const char *e); uint (*charpos)(struct charset_info_st *, const char *b, const char *e, uint pos); uint (*well_formed_len)(struct charset_info_st *, - const char *b,const char *e, uint nchars); + const char *b,const char *e, + uint nchars, int *error); uint (*lengthsp)(struct charset_info_st *, const char *ptr, uint length); uint (*numcells)(struct charset_info_st *, const char *b, const char *e); @@ -341,7 +342,8 @@ int my_wildcmp_8bit(CHARSET_INFO *, uint my_numchars_8bit(CHARSET_INFO *, const char *b, const char *e); uint my_numcells_8bit(CHARSET_INFO *, const char *b, const char *e); uint my_charpos_8bit(CHARSET_INFO *, const char *b, const char *e, uint pos); -uint my_well_formed_len_8bit(CHARSET_INFO *, const char *b, const char *e, uint pos); +uint my_well_formed_len_8bit(CHARSET_INFO *, const char *b, const char *e, + uint pos, int *error); int my_mbcharlen_8bit(CHARSET_INFO *, uint c); @@ -359,7 +361,8 @@ int my_wildcmp_mb(CHARSET_INFO *, uint my_numchars_mb(CHARSET_INFO *, const char *b, const char *e); uint my_numcells_mb(CHARSET_INFO *, const char *b, const char *e); uint my_charpos_mb(CHARSET_INFO *, const char *b, const char *e, uint pos); -uint my_well_formed_len_mb(CHARSET_INFO *, const char *b, const char *e, uint pos); +uint my_well_formed_len_mb(CHARSET_INFO *, const char *b, const char *e, + uint pos, int *error); uint my_instr_mb(struct charset_info_st *, const char *b, uint b_length, const char *s, uint s_length, diff --git a/ndb/src/ndbapi/NdbIndexOperation.cpp b/ndb/src/ndbapi/NdbIndexOperation.cpp index 23af646c4c7..39da9c5f5d0 100644 --- a/ndb/src/ndbapi/NdbIndexOperation.cpp +++ b/ndb/src/ndbapi/NdbIndexOperation.cpp @@ -354,12 +354,14 @@ int NdbIndexOperation::equal_impl(const NdbColumnImpl* tAttrInfo, *************************************************************************/ if ((tOpType == WriteRequest)) { if (!tAttrInfo->m_indexOnly){ + int dummy_error; // invalid data can crash kernel if (cs != NULL && (*cs->cset->well_formed_len)(cs, aValueToWrite, aValueToWrite + sizeInBytes, - sizeInBytes) != sizeInBytes) + sizeInBytes, + &dummy_error) != sizeInBytes) goto equal_error4; Uint32 ahValue; Uint32 sz = totalSizeInWords; diff --git a/ndb/src/ndbapi/NdbOperationDefine.cpp b/ndb/src/ndbapi/NdbOperationDefine.cpp index c4aaffb3119..dfc54133e6c 100644 --- a/ndb/src/ndbapi/NdbOperationDefine.cpp +++ b/ndb/src/ndbapi/NdbOperationDefine.cpp @@ -526,6 +526,7 @@ NdbOperation::setValue( const NdbColumnImpl* tAttrInfo, const Uint32 sizeInBytes = tAttrInfo->m_attrSize * tAttrInfo->m_arraySize; CHARSET_INFO* cs = tAttrInfo->m_cs; + int dummy_error; // invalid data can crash kernel if (cs != NULL && // fast fix bug#7340 @@ -533,7 +534,8 @@ NdbOperation::setValue( const NdbColumnImpl* tAttrInfo, (*cs->cset->well_formed_len)(cs, aValue, aValue + sizeInBytes, - sizeInBytes) != sizeInBytes) { + sizeInBytes, + &dummy_error) != sizeInBytes) { setErrorCodeAbort(744); return -1; } diff --git a/ndb/src/ndbapi/NdbOperationSearch.cpp b/ndb/src/ndbapi/NdbOperationSearch.cpp index 28a70abcb9b..97b2393e5ed 100644 --- a/ndb/src/ndbapi/NdbOperationSearch.cpp +++ b/ndb/src/ndbapi/NdbOperationSearch.cpp @@ -226,12 +226,14 @@ NdbOperation::equal_impl(const NdbColumnImpl* tAttrInfo, if ((tOpType == InsertRequest) || (tOpType == WriteRequest)) { if (!tAttrInfo->m_indexOnly){ + int dummy_error; // invalid data can crash kernel if (cs != NULL && (*cs->cset->well_formed_len)(cs, aValueToWrite, aValueToWrite + sizeInBytes, - sizeInBytes) != sizeInBytes) + sizeInBytes, + &dummy_error) != sizeInBytes) goto equal_error4; Uint32 ahValue; const Uint32 sz = totalSizeInWords; diff --git a/sql/field.cc b/sql/field.cc index bf581e62f34..740c027350d 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -4939,9 +4939,10 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) as well as don't copy a malformed data. */ copy_length= field_charset->cset->well_formed_len(field_charset, - from,from+length, - field_length/ - field_charset->mbmaxlen); + from,from+length, + field_length/ + field_charset->mbmaxlen, + &error); memcpy(ptr,from,copy_length); if (copy_length < field_length) // Append spaces if shorter field_charset->cset->fill(field_charset,ptr+copy_length, @@ -4958,7 +4959,6 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) } if (error) set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1); - return error; } @@ -5577,9 +5577,10 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) the 'min()' call below. */ copy_length= field_charset->cset->well_formed_len(field_charset, - from,from + - min(length, copy_length), - copy_length); + from,from + + min(length, copy_length), + copy_length, + &error); if (copy_length < length) error= 1; Field_blob::store_length(copy_length); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 9f25e17b6fd..dcda19a7080 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -5032,9 +5032,10 @@ IDENT_sys: if (thd->charset_is_system_charset) { CHARSET_INFO *cs= system_charset_info; + int dummy_error; uint wlen= cs->cset->well_formed_len(cs, $1.str, $1.str+$1.length, - $1.length); + $1.length, &dummy_error); if (wlen < $1.length) { net_printf(YYTHD, ER_INVALID_CHARACTER_STRING, cs->csname, diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index e083d1371ec..07b30205f89 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -6278,10 +6278,13 @@ my_mb_wc_big5(CHARSET_INFO *cs __attribute__((unused)), */ static uint my_well_formed_len_big5(CHARSET_INFO *cs __attribute__((unused)), - const char *b, const char *e, uint pos) + const char *b, const char *e, + uint pos, int *error) { const char *b0= b; const char *emb= e - 1; /* Last possible end of an MB character */ + + *error= 0; while (pos && b < e) { if ((uchar) b[0] < 128) @@ -6297,6 +6300,7 @@ uint my_well_formed_len_big5(CHARSET_INFO *cs __attribute__((unused)), else { /* Wrong byte sequence */ + *error= 1; break; } } diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index 6cf48291c91..dbe3a24324e 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -264,18 +264,21 @@ uint my_charpos_mb(CHARSET_INFO *cs __attribute__((unused)), } -uint my_well_formed_len_mb(CHARSET_INFO *cs, - const char *b, const char *e, uint pos) +uint my_well_formed_len_mb(CHARSET_INFO *cs, const char *b, const char *e, + uint pos, int *error) { const char *b_start= b; - + *error= 0; while (pos) { my_wc_t wc; int mblen; if ((mblen= cs->cset->mb_wc(cs, &wc, (uchar*) b, (uchar*) e)) <= 0) + { + *error= 1; break; + } b+= mblen; pos--; } diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index 080e0b780b7..bd5131b7448 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -1093,11 +1093,11 @@ uint my_charpos_8bit(CHARSET_INFO *cs __attribute__((unused)), uint my_well_formed_len_8bit(CHARSET_INFO *cs __attribute__((unused)), - const char *start, - const char *end, - uint nchars) + const char *start, const char *end, + uint nchars, int *error) { uint nbytes= (uint) (end-start); + *error= 0; return min(nbytes, nchars); } diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index 20f0081888f..35182db3345 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -4571,9 +4571,11 @@ uint my_numcells_sjis(CHARSET_INFO *cs __attribute__((unused)), */ static uint my_well_formed_len_sjis(CHARSET_INFO *cs __attribute__((unused)), - const char *b, const char *e, uint pos) + const char *b, const char *e, + uint pos, int *error) { const char *b0= b; + *error= 0; while (pos && b < e) { if ((uchar) b[0] < 128) @@ -4594,6 +4596,7 @@ uint my_well_formed_len_sjis(CHARSET_INFO *cs __attribute__((unused)), else { /* Wrong byte sequence */ + *error= 1; break; } } diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index 9c67d1b7846..f5d0721fa9b 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -1267,11 +1267,11 @@ uint my_charpos_ucs2(CHARSET_INFO *cs __attribute__((unused)), static uint my_well_formed_len_ucs2(CHARSET_INFO *cs __attribute__((unused)), - const char *b, - const char *e, - uint nchars) + const char *b, const char *e, + uint nchars, int *error) { uint nbytes= (e-b) & ~ (uint)1; + *error= 0; nchars*= 2; return min(nbytes, nchars); } diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index fc1496df280..612dda2b3eb 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -8253,11 +8253,12 @@ my_jisx0212_uni_onechar(int code){ static uint my_well_formed_len_ujis(CHARSET_INFO *cs __attribute__((unused)), - const char *beg, const char *end, uint pos) + const char *beg, const char *end, + uint pos, int *error) { const uchar *b= (uchar *) beg; - for ( ; pos && b < (uchar*) end; pos--, b++) + for ( *error= 0 ; pos && b < (uchar*) end; pos--, b++) { char *chbeg; uint ch= *b; @@ -8267,12 +8268,16 @@ uint my_well_formed_len_ujis(CHARSET_INFO *cs __attribute__((unused)), chbeg= (char *) b++; if (b >= (uchar *) end) /* need more bytes */ + { + *error= 1; return chbeg - beg; /* unexpected EOL */ + } if (ch == 0x8E) /* [x8E][xA0-xDF] */ { if (*b >= 0xA0 && *b <= 0xDF) continue; + *error= 1; return chbeg - beg; /* invalid sequence */ } @@ -8280,12 +8285,16 @@ uint my_well_formed_len_ujis(CHARSET_INFO *cs __attribute__((unused)), { ch= *b++; if (b >= (uchar*) end) + { + *error= 1; return chbeg - beg; /* unexpected EOL */ + } } if (ch >= 0xA1 && ch <= 0xFE && *b >= 0xA1 && *b <= 0xFE) /* [xA1-xFE][xA1-xFE] */ continue; + *error= 1; return chbeg - beg; /* invalid sequence */ } return b - (uchar *) beg; From 0c2caeb4d82f49dd109a0495ead6242953e8b053 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Wed, 6 Apr 2005 10:27:40 +0300 Subject: [PATCH 078/204] row0sel.c, btr0pcur.c, btr0pcur.ic, btr0pcur.h: Add diagnostic code to track assertion failure in ut_a(cursor->old_stored == BTR_PCUR_OLD_STORED); the failure happened in OPTIMIZE TABLE, and in 4.0.24 in some other context --- innobase/btr/btr0pcur.c | 10 +++++++++- innobase/include/btr0pcur.h | 4 ++++ innobase/include/btr0pcur.ic | 10 ++++++++++ innobase/row/row0sel.c | 4 ++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/innobase/btr/btr0pcur.c b/innobase/btr/btr0pcur.c index cf8a612ef28..0dcf6c2f3fc 100644 --- a/innobase/btr/btr0pcur.c +++ b/innobase/btr/btr0pcur.c @@ -14,6 +14,7 @@ Created 2/23/1996 Heikki Tuuri #include "ut0byte.h" #include "rem0cmp.h" +#include "trx0trx.h" /****************************************************************** Allocates memory for a persistent cursor object and initializes the cursor. */ @@ -203,7 +204,14 @@ btr_pcur_restore_position( ut_a(cursor->pos_state == BTR_PCUR_WAS_POSITIONED || cursor->pos_state == BTR_PCUR_IS_POSITIONED); - ut_a(cursor->old_stored == BTR_PCUR_OLD_STORED); + if (cursor->old_stored != BTR_PCUR_OLD_STORED) { + ut_print_buf(stderr, (const byte*)cursor, sizeof(btr_pcur_t)); + if (cursor->trx_if_known) { + trx_print(stderr, cursor->trx_if_known); + } + + ut_a(0); + } if (cursor->rel_pos == BTR_PCUR_AFTER_LAST_IN_TREE || cursor->rel_pos == BTR_PCUR_BEFORE_FIRST_IN_TREE) { diff --git a/innobase/include/btr0pcur.h b/innobase/include/btr0pcur.h index 81f19af4d40..9339eb5d0ee 100644 --- a/innobase/include/btr0pcur.h +++ b/innobase/include/btr0pcur.h @@ -477,6 +477,10 @@ struct btr_pcur_struct{ BTR_PCUR_WAS_POSITIONED, BTR_PCUR_NOT_POSITIONED */ ulint search_mode; /* PAGE_CUR_G, ... */ + trx_t* trx_if_known; /* the transaction, if we know it; + otherwise this field is not defined; + can ONLY BE USED in error prints in + fatal assertion failures! */ /*-----------------------------*/ /* NOTE that the following fields may possess dynamically allocated memory which should be freed if not needed anymore! */ diff --git a/innobase/include/btr0pcur.ic b/innobase/include/btr0pcur.ic index b553a569bda..9a7d7867025 100644 --- a/innobase/include/btr0pcur.ic +++ b/innobase/include/btr0pcur.ic @@ -493,6 +493,8 @@ btr_pcur_open( btr_cur_search_to_nth_level(index, 0, tuple, mode, latch_mode, btr_cursor, 0, mtr); cursor->pos_state = BTR_PCUR_IS_POSITIONED; + + cursor->trx_if_known = NULL; } /****************************************************************** @@ -535,6 +537,8 @@ btr_pcur_open_with_no_init( cursor->pos_state = BTR_PCUR_IS_POSITIONED; cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; + + cursor->trx_if_known = NULL; } /********************************************************************* @@ -568,6 +572,8 @@ btr_pcur_open_at_index_side( pcur->pos_state = BTR_PCUR_IS_POSITIONED; pcur->old_stored = BTR_PCUR_OLD_NOT_STORED; + + pcur->trx_if_known = NULL; } /************************************************************************** @@ -592,6 +598,8 @@ btr_pcur_open_at_rnd_pos( btr_pcur_get_btr_cur(cursor), mtr); cursor->pos_state = BTR_PCUR_IS_POSITIONED; cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; + + cursor->trx_if_known = NULL; } /****************************************************************** @@ -617,4 +625,6 @@ btr_pcur_close( cursor->latch_mode = BTR_NO_LATCHES; cursor->pos_state = BTR_PCUR_NOT_POSITIONED; + + cursor->trx_if_known = NULL; } diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c index 07140e74e54..eb88ac31ba9 100644 --- a/innobase/row/row0sel.c +++ b/innobase/row/row0sel.c @@ -2507,6 +2507,8 @@ row_sel_get_clust_rec_for_mysql( clust_rec = btr_pcur_get_rec(prebuilt->clust_pcur); + prebuilt->clust_pcur->trx_if_known = trx; + /* Note: only if the search ends up on a non-infimum record is the low_match value the real match to the search tuple */ @@ -3222,6 +3224,8 @@ shortcut_fails_too_big_rec: btr_pcur_open_with_no_init(index, search_tuple, mode, BTR_SEARCH_LEAF, pcur, 0, &mtr); + + pcur->trx_if_known = trx; } else { if (mode == PAGE_CUR_G) { btr_pcur_open_at_index_side(TRUE, index, From 6f18d7d26f0a8348dd6599f2994dd20ddf19679c Mon Sep 17 00:00:00 2001 From: "gluh@eagle.intranet.mysql.r18.ru" <> Date: Wed, 6 Apr 2005 14:13:06 +0500 Subject: [PATCH 079/204] Fix for bug #9286: SESSION/GLOBAL should be disallowed for user variables --- BitKeeper/etc/logging_ok | 1 + mysql-test/r/user_var.result | 4 +++ mysql-test/t/user_var.test | 8 +++++ sql/sql_yacc.yy | 66 +++++++++++++++++++++--------------- 4 files changed, 52 insertions(+), 27 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 90e6c3c100d..9237eea21c4 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -51,6 +51,7 @@ georg@lmy002.wdf.sap.corp gerberb@ou800.zenez.com gluh@gluh.(none) gluh@gluh.mysql.r18.ru +gluh@mysql.com gordon@zero.local.lan greg@gcw.ath.cx greg@mysql.com diff --git a/mysql-test/r/user_var.result b/mysql-test/r/user_var.result index 9edeea404ec..e42849abdf1 100644 --- a/mysql-test/r/user_var.result +++ b/mysql-test/r/user_var.result @@ -175,3 +175,7 @@ set @v1=null, @v2=1, @v3=1.1, @v4=now(); select coercibility(@v1),coercibility(@v2),coercibility(@v3),coercibility(@v4); coercibility(@v1) coercibility(@v2) coercibility(@v3) coercibility(@v4) 2 2 2 2 +set session @honk=99; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@honk=99' at line 1 +set one_shot @honk=99; +ERROR HY000: The SET ONE_SHOT syntax is reserved for purposes internal to the MySQL server diff --git a/mysql-test/t/user_var.test b/mysql-test/t/user_var.test index b907f21056c..a288b7ef708 100644 --- a/mysql-test/t/user_var.test +++ b/mysql-test/t/user_var.test @@ -111,3 +111,11 @@ select FIELD( @var,'1it','Hit') as my_column; select @v, coercibility(@v); set @v1=null, @v2=1, @v3=1.1, @v4=now(); select coercibility(@v1),coercibility(@v2),coercibility(@v3),coercibility(@v4); + +# +# Bug #9286 SESSION/GLOBAL should be disallowed for user variables +# +--error 1064 +set session @honk=99; +--error 1105 +set one_shot @honk=99; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 9f25e17b6fd..4a23a393fa9 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -5360,17 +5360,26 @@ opt_option: | OPTION {}; option_value_list: - option_type option_value - | option_value_list ',' option_type option_value; + option_value_ext + | option_value_list ',' option_value_ext; -option_type: - /* empty */ {} +option_value_ext: + option_type_ext sys_option_value {} + | option_type option_value {} + ; + +option_type_ext: + option_type {} | GLOBAL_SYM { Lex->option_type= OPT_GLOBAL; } | LOCAL_SYM { Lex->option_type= OPT_SESSION; } | SESSION_SYM { Lex->option_type= OPT_SESSION; } - | ONE_SHOT_SYM { Lex->option_type= OPT_SESSION; Lex->one_shot_set= 1; } ; +option_type: + /* empty */ {} + | ONE_SHOT_SYM { Lex->option_type= OPT_SESSION; Lex->one_shot_set= 1; } + ; + opt_var_type: /* empty */ { $$=OPT_SESSION; } | GLOBAL_SYM { $$=OPT_GLOBAL; } @@ -5385,34 +5394,37 @@ opt_var_ident_type: | SESSION_SYM '.' { $$=OPT_SESSION; } ; +sys_option_value: + internal_variable_name equal set_expr_or_default + { + LEX *lex=Lex; + lex->var_list.push_back(new set_var(lex->option_type, $1.var, + &$1.base_name, $3)); + } + | TRANSACTION_SYM ISOLATION LEVEL_SYM isolation_types + { + LEX *lex=Lex; + LEX_STRING tmp; + tmp.str=0; + tmp.length=0; + lex->var_list.push_back(new set_var(lex->option_type, + find_sys_var("tx_isolation"), + &tmp, + new Item_int((int32) $4))); + } + ; + option_value: '@' ident_or_text equal expr { Lex->var_list.push_back(new set_var_user(new Item_func_set_user_var($2,$4))); } - | internal_variable_name equal set_expr_or_default - { - LEX *lex=Lex; - lex->var_list.push_back(new set_var(lex->option_type, $1.var, - &$1.base_name, $3)); - } | '@' '@' opt_var_ident_type internal_variable_name equal set_expr_or_default - { - LEX *lex=Lex; - lex->var_list.push_back(new set_var((enum_var_type) $3, $4.var, - &$4.base_name, $6)); - } - | TRANSACTION_SYM ISOLATION LEVEL_SYM isolation_types - { - LEX *lex=Lex; - LEX_STRING tmp; - tmp.str=0; - tmp.length=0; - lex->var_list.push_back(new set_var(lex->option_type, - find_sys_var("tx_isolation"), - &tmp, - new Item_int((int32) $4))); - } + { + LEX *lex=Lex; + lex->var_list.push_back(new set_var((enum_var_type) $3, $4.var, + &$4.base_name, $6)); + } | charset old_or_new_charset_name_or_default { THD *thd= YYTHD; From 1c46a020695b3720cf8ce2fd86b566447fdedccc Mon Sep 17 00:00:00 2001 From: "bar@mysql.com" <> Date: Wed, 6 Apr 2005 15:12:44 +0500 Subject: [PATCH 080/204] Minor clean-ups for the previous commit. --- sql/field.cc | 8 ++++---- strings/ctype-mb.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sql/field.cc b/sql/field.cc index 740c027350d..d73257a673f 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -4914,7 +4914,7 @@ void Field_datetime::sql_type(String &res) const int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) { - int error= 0; + int error= 0, well_formed_error; uint32 not_used; char buff[80]; String tmpstr(buff,sizeof(buff), &my_charset_bin); @@ -4942,7 +4942,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) from,from+length, field_length/ field_charset->mbmaxlen, - &error); + &well_formed_error); memcpy(ptr,from,copy_length); if (copy_length < field_length) // Append spaces if shorter field_charset->cset->fill(field_charset,ptr+copy_length, @@ -5545,7 +5545,7 @@ void Field_blob::put_length(char *pos, uint32 length) int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) { - int error= 0; + int error= 0, well_formed_error; if (!length) { bzero(ptr,Field_blob::pack_length()); @@ -5580,7 +5580,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) from,from + min(length, copy_length), copy_length, - &error); + &well_formed_error); if (copy_length < length) error= 1; Field_blob::store_length(copy_length); diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index dbe3a24324e..cbbd035c631 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -276,7 +276,7 @@ uint my_well_formed_len_mb(CHARSET_INFO *cs, const char *b, const char *e, if ((mblen= cs->cset->mb_wc(cs, &wc, (uchar*) b, (uchar*) e)) <= 0) { - *error= 1; + *error= b < e ? 1 : 0; break; } b+= mblen; From 57d89142878202551462bdae7259d77e629b37ba Mon Sep 17 00:00:00 2001 From: "kent@mysql.com" <> Date: Wed, 6 Apr 2005 12:20:55 +0200 Subject: [PATCH 081/204] Makefile.am: Include the Perl version of mysql-test-run rpl_rewrite_db.test, rpl_rewrite_db.result: Added missing database cleanup mysql-test-run.pl: Embedded result files no longer needed --- mysql-test/Makefile.am | 15 ++++++++++----- mysql-test/mysql-test-run.pl | 1 - mysql-test/r/rpl_rewrite_db.result | 1 + mysql-test/t/rpl_rewrite_db.test | 3 +++ 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/mysql-test/Makefile.am b/mysql-test/Makefile.am index b2e86d8c00e..57598f5f3e3 100644 --- a/mysql-test/Makefile.am +++ b/mysql-test/Makefile.am @@ -32,21 +32,21 @@ endif benchdir_root= $(prefix) testdir = $(benchdir_root)/mysql-test -EXTRA_SCRIPTS = mysql-test-run.sh install_test_db.sh +EXTRA_SCRIPTS = mysql-test-run.sh mysql-test-run.pl install_test_db.sh EXTRA_DIST = $(EXTRA_SCRIPTS) test_SCRIPTS = mysql-test-run install_test_db test_DATA = std_data/client-key.pem std_data/client-cert.pem std_data/cacert.pem CLEANFILES = $(test_SCRIPTS) $(test_DATA) -INCLUDES = -I$(srcdir)/../include -I../include -I.. -EXTRA_PROGRAMS = mysql_test_run_new +INCLUDES = -I$(srcdir)/../include -I../include -I.. +EXTRA_PROGRAMS = mysql_test_run_new noinst_HEADERS = my_manage.h mysql_test_run_new_SOURCES= mysql_test_run_new.c my_manage.c my_create_tables.c dist-hook: mkdir -p $(distdir)/t $(distdir)/r $(distdir)/include \ - $(distdir)/std_data + $(distdir)/std_data $(distdir)/lib $(INSTALL_DATA) $(srcdir)/t/*.test $(srcdir)/t/*.opt $(srcdir)/t/*.sh $(srcdir)/t/*.slave-mi $(distdir)/t $(INSTALL_DATA) $(srcdir)/include/*.inc $(distdir)/include $(INSTALL_DATA) $(srcdir)/r/*.result $(srcdir)/r/*.result.es $(srcdir)/r/*.require $(distdir)/r @@ -54,6 +54,8 @@ dist-hook: $(INSTALL_DATA) $(srcdir)/std_data/*.dat $(srcdir)/std_data/*.000001 $(distdir)/std_data $(INSTALL_DATA) $(srcdir)/std_data/des_key_file $(distdir)/std_data $(INSTALL_DATA) $(srcdir)/std_data/*.pem $(distdir)/std_data + $(INSTALL_DATA) $(srcdir)/lib/init_db.sql $(distdir)/lib + $(INSTALL_DATA) $(srcdir)/lib/*.pl $(distdir)/lib install-data-local: @@ -61,7 +63,8 @@ install-data-local: $(DESTDIR)$(testdir)/t \ $(DESTDIR)$(testdir)/r \ $(DESTDIR)$(testdir)/include \ - $(DESTDIR)$(testdir)/std_data + $(DESTDIR)$(testdir)/std_data \ + $(DESTDIR)$(testdir)/lib $(INSTALL_DATA) $(srcdir)/README $(DESTDIR)$(testdir) $(INSTALL_DATA) $(srcdir)/t/*.test $(DESTDIR)$(testdir)/t $(INSTALL_DATA) $(srcdir)/t/*.opt $(DESTDIR)$(testdir)/t @@ -75,6 +78,8 @@ install-data-local: $(INSTALL_DATA) $(srcdir)/std_data/des_key_file $(DESTDIR)$(testdir)/std_data $(INSTALL_DATA) $(srcdir)/std_data/Moscow_leap $(DESTDIR)$(testdir)/std_data $(INSTALL_DATA) $(srcdir)/std_data/*.pem $(DESTDIR)$(testdir)/std_data + $(INSTALL_DATA) $(srcdir)/lib/init_db.sql $(DESTDIR)$(testdir)/lib + $(INSTALL_DATA) $(srcdir)/lib/*.pl $(DESTDIR)$(testdir)/lib std_data/%.pem: @CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index ae5caa8044a..e4f14447e30 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -635,7 +635,6 @@ sub command_line_setup () { { mtr_error("Can't use --extern with --embedded-server"); } - $opt_result_ext= ".es"; } # FIXME don't understand what this is diff --git a/mysql-test/r/rpl_rewrite_db.result b/mysql-test/r/rpl_rewrite_db.result index a2c8706e3e1..da3ec0243fe 100644 --- a/mysql-test/r/rpl_rewrite_db.result +++ b/mysql-test/r/rpl_rewrite_db.result @@ -89,4 +89,5 @@ a b 2 row 2 3 row 3 0 +drop database rewrite; drop table t1; diff --git a/mysql-test/t/rpl_rewrite_db.test b/mysql-test/t/rpl_rewrite_db.test index b6118854037..b77d57294fa 100644 --- a/mysql-test/t/rpl_rewrite_db.test +++ b/mysql-test/t/rpl_rewrite_db.test @@ -73,5 +73,8 @@ connection slave; # The empty line last comes from the end line field in the file select * from rewrite.t1; +drop database rewrite; + connection master; drop table t1; + From 1e030d5d9349100d91019b056a91c51ba8745768 Mon Sep 17 00:00:00 2001 From: "msvensson@neptunus.(none)" <> Date: Wed, 6 Apr 2005 12:27:43 +0200 Subject: [PATCH 082/204] BUG#9626 Several serious errors reported by Valgrind in latest 5.0 bk tree - Fixing obvious ones --- sql/ha_ndbcluster.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index e3f6235c62c..0668c3db7a8 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -5803,6 +5803,7 @@ extern "C" pthread_handler_decl(ndb_util_thread_func, { thd->cleanup(); delete thd; + delete ndb; DBUG_RETURN(NULL); } @@ -5921,6 +5922,7 @@ extern "C" pthread_handler_decl(ndb_util_thread_func, thd->cleanup(); delete thd; + delete ndb; DBUG_PRINT("exit", ("ndb_util_thread")); my_thread_end(); pthread_exit(0); From 7cd0e4343758e7440e6f77329abaddd6fd52b398 Mon Sep 17 00:00:00 2001 From: "hf@deer.(none)" <> Date: Wed, 6 Apr 2005 15:49:55 +0500 Subject: [PATCH 083/204] Stupid error message for 'insert "aaa"' into decimal column fixed --- mysql-test/r/row.result | 2 +- sql/item.cc | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/mysql-test/r/row.result b/mysql-test/r/row.result index 40a31563604..9734efb0797 100644 --- a/mysql-test/r/row.result +++ b/mysql-test/r/row.result @@ -15,7 +15,7 @@ select row('a',1.5,3) IN (row(1,2,3), row('a',1.5,3), row('a','a','a')); row('a',1.5,3) IN (row(1,2,3), row('a',1.5,3), row('a','a','a')) 1 Warnings: -Error 1366 Incorrect decimal value: '' for column '' at row -1 +Warning 1292 Truncated incorrect DECIMAL value: 'a' select row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3)); row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3)) 1 diff --git a/sql/item.cc b/sql/item.cc index 48faa3509f4..b7d9f177c53 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -260,8 +260,15 @@ my_decimal *Item::val_decimal_from_string(my_decimal *decimal_value) return 0; // NULL or EOM end_ptr= (char*) res->ptr()+ res->length(); - str2my_decimal(E_DEC_FATAL_ERROR, res->ptr(), res->length(), res->charset(), - decimal_value); + if (str2my_decimal(E_DEC_FATAL_ERROR & ~E_DEC_BAD_NUM, + res->ptr(), res->length(), res->charset(), + decimal_value) & E_DEC_BAD_NUM) + { + push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_TRUNCATED_WRONG_VALUE, + ER(ER_TRUNCATED_WRONG_VALUE), "DECIMAL", + str_value.c_ptr()); + } return decimal_value; } @@ -1457,10 +1464,7 @@ void Item_string::print(String *str) my_decimal *Item_string::val_decimal(my_decimal *decimal_value) { - /* following assert is redundant, because fixed=1 assigned in constructor */ - DBUG_ASSERT(fixed == 1); - string2my_decimal(E_DEC_FATAL_ERROR, &str_value, decimal_value); - return (decimal_value); + return val_decimal_from_string(decimal_value); } From f32fe9c154adbd169407c0bf3c11647dc7f0f7b8 Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Wed, 6 Apr 2005 15:09:15 +0300 Subject: [PATCH 084/204] InnoDB: Avoid test suite failures caused by a locking conflict between two server instances at server shutdown/startup. This conflict on advisory locks appears to be the result of a bug in the operating system; these locks should be released when the files are closed, but somehow that does not always happen immediately in Linux. (Bug #9381) --- innobase/include/os0file.h | 2 ++ innobase/os/os0file.c | 27 +++++++++++++++++++++++---- innobase/srv/srv0start.c | 5 +++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/innobase/include/os0file.h b/innobase/include/os0file.h index d1439faf29f..ebc014df9fd 100644 --- a/innobase/include/os0file.h +++ b/innobase/include/os0file.h @@ -65,6 +65,8 @@ log. */ #define OS_FILE_OVERWRITE 53 #define OS_FILE_OPEN_RAW 54 #define OS_FILE_CREATE_PATH 55 +#define OS_FILE_OPEN_RETRY 56 /* for os_file_create() on + the first ibdata file */ #define OS_FILE_READ_ONLY 333 #define OS_FILE_READ_WRITE 444 diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c index 8d1ad895aa9..15f5bf40e51 100644 --- a/innobase/os/os0file.c +++ b/innobase/os/os0file.c @@ -402,8 +402,6 @@ os_file_lock( "InnoDB: using the same InnoDB data or log files.\n"); } - close(fd); - return(-1); } @@ -978,6 +976,7 @@ try_again: } else if (access_type == OS_FILE_READ_WRITE && os_file_lock(file, name)) { *success = FALSE; + close(file); file = -1; #endif } else { @@ -1090,6 +1089,7 @@ os_file_create_simple_no_error_handling( } else if (access_type == OS_FILE_READ_WRITE && os_file_lock(file, name)) { *success = FALSE; + close(file); file = -1; #endif } else { @@ -1141,7 +1141,8 @@ try_again: if (create_mode == OS_FILE_OPEN_RAW) { create_flag = OPEN_EXISTING; share_mode = FILE_SHARE_WRITE; - } else if (create_mode == OS_FILE_OPEN) { + } else if (create_mode == OS_FILE_OPEN + || create_mode == OS_FILE_OPEN_RETRY) { create_flag = OPEN_EXISTING; } else if (create_mode == OS_FILE_CREATE) { create_flag = CREATE_NEW; @@ -1232,7 +1233,8 @@ try_again: try_again: ut_a(name); - if (create_mode == OS_FILE_OPEN || create_mode == OS_FILE_OPEN_RAW) { + if (create_mode == OS_FILE_OPEN || create_mode == OS_FILE_OPEN_RAW + || create_mode == OS_FILE_OPEN_RETRY) { mode_str = "OPEN"; create_flag = O_RDWR; } else if (create_mode == OS_FILE_CREATE) { @@ -1305,6 +1307,23 @@ try_again: } else if (create_mode != OS_FILE_OPEN_RAW && os_file_lock(file, name)) { *success = FALSE; + if (create_mode == OS_FILE_OPEN_RETRY) { + int i; + ut_print_timestamp(stderr); + fputs(" InnoDB: Retrying to lock the first data file\n", + stderr); + for (i = 0; i < 100; i++) { + os_thread_sleep(1000000); + if (!os_file_lock(file, name)) { + *success = TRUE; + return(file); + } + } + ut_print_timestamp(stderr); + fputs(" InnoDB: Unable to open the first data file\n", + stderr); + } + close(file); file = -1; #endif } else { diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index 44cf645f170..62df7301cc9 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -789,6 +789,11 @@ open_or_create_data_files( files[i] = os_file_create( name, OS_FILE_OPEN_RAW, OS_FILE_NORMAL, OS_DATA_FILE, &ret); + } else if (i == 0) { + files[i] = os_file_create( + name, OS_FILE_OPEN_RETRY, + OS_FILE_NORMAL, + OS_DATA_FILE, &ret); } else { files[i] = os_file_create( name, OS_FILE_OPEN, OS_FILE_NORMAL, From 49e721677f9eec2ae8e869dacc8acb522f72ef05 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Wed, 6 Apr 2005 17:22:21 +0300 Subject: [PATCH 085/204] Fixed errors descovered by valgrind 2.4 Added suppression file for some valgrind warnings that are not real errors --- mysql-test/mysql-test-run.sh | 2 +- mysql-test/r/heap.result | 21 ++----- mysql-test/t/heap.test | 27 +++------ mysql-test/valgrind.supp | 94 +++++++++++++++++++++++++++++ mysys/default.c | 4 +- scripts/make_binary_distribution.sh | 1 + sql/ha_federated.cc | 6 +- sql/ha_heap.cc | 1 + sql/mysqld.cc | 3 +- sql/sql_parse.cc | 3 +- strings/decimal.c | 2 +- 11 files changed, 121 insertions(+), 43 deletions(-) create mode 100644 mysql-test/valgrind.supp diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index ac1755cab9c..d294ef50421 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -418,7 +418,7 @@ while test $# -gt 0; do fi # >=2.1.2 requires the --tool option, some versions write to stdout, some to stderr valgrind --help 2>&1 | grep "\-\-tool" > /dev/null && VALGRIND="$VALGRIND --tool=memcheck" - VALGRIND="$VALGRIND --alignment=8 --leak-check=yes --num-callers=16" + VALGRIND="$VALGRIND --alignment=8 --leak-check=yes --num-callers=16 --suppressions=$CWD/valgrind.supp" EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-safemalloc --skip-bdb" EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-safemalloc --skip-bdb" SLEEP_TIME_AFTER_RESTART=10 diff --git a/mysql-test/r/heap.result b/mysql-test/r/heap.result index db20b242962..631bd8c713c 100644 --- a/mysql-test/r/heap.result +++ b/mysql-test/r/heap.result @@ -667,14 +667,7 @@ drop table t1; set storage_engine=MyISAM; create table t1 (a bigint unsigned auto_increment primary key, b int, key (b, a)) engine=heap; -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); +insert t1 (b) values (1),(1),(1),(1),(1),(1),(1),(1); select * from t1; a b 1 1 @@ -688,14 +681,7 @@ a b drop table t1; create table t1 (a int not null, b int not null auto_increment, primary key(a, b), key(b)) engine=heap; -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); +insert t1 (a) values (1),(1),(1),(1),(1),(1),(1),(1); select * from t1; a b 1 1 @@ -707,3 +693,6 @@ a b 1 7 1 8 drop table t1; +create table t1 (a int not null, b int not null auto_increment, +primary key(a, b)) engine=heap; +ERROR 42000: Incorrect table definition; there can be only one auto column and it must be defined as a key diff --git a/mysql-test/t/heap.test b/mysql-test/t/heap.test index b69649585ff..c36474bda30 100644 --- a/mysql-test/t/heap.test +++ b/mysql-test/t/heap.test @@ -413,25 +413,16 @@ eval set storage_engine=$default; create table t1 (a bigint unsigned auto_increment primary key, b int, key (b, a)) engine=heap; -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); -insert t1 (b) values (1); -select * from t1; +insert t1 (b) values (1),(1),(1),(1),(1),(1),(1),(1); +select * from t1; drop table t1; + create table t1 (a int not null, b int not null auto_increment, primary key(a, b), key(b)) engine=heap; -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); -insert t1 (a) values (1); -select * from t1; +insert t1 (a) values (1),(1),(1),(1),(1),(1),(1),(1); +select * from t1; drop table t1; + +--error 1075 +create table t1 (a int not null, b int not null auto_increment, + primary key(a, b)) engine=heap; diff --git a/mysql-test/valgrind.supp b/mysql-test/valgrind.supp new file mode 100644 index 00000000000..d8a13ca9dfd --- /dev/null +++ b/mysql-test/valgrind.supp @@ -0,0 +1,94 @@ +# +# Suppress some common (not fatal) errors in system libraries found by valgrind +# + +# +# Pthread doesn't free all thread specific memory before program exists +# +{ + pthread allocate_tls memory loss + Memcheck:Leak + fun:calloc + fun:_dl_allocate_tls + fun:allocate_stack + fun:pthread_create@@GLIBC_2.1 +} + +{ + pthread allocate_dtv memory loss + Memcheck:Leak + fun:calloc + fun:allocate_dtv + fun:_dl_allocate_tls_storage + fun:__GI__dl_allocate_tls + fun:pthread_create +} + +{ + pthread memalign memory loss + Memcheck:Leak + fun:memalign + fun:_dl_allocate_tls_storage + fun:__GI__dl_allocate_tls + fun:pthread_create +} + +{ + pthread errno + Memcheck:Leak + fun:calloc + fun:_dlerror_run + fun:dlsym + fun:__errno_location +} + + +# +# Warnings in libz becasue it works with aligned memory(?) +# + +{ + libz tr_flush_block + Memcheck:Cond + fun:_tr_flush_block + fun:deflate_slow + fun:deflate + fun:do_flush + fun:gzclose +} + +{ + libz tr_flush_block2 + Memcheck:Cond + fun:_tr_flush_block + fun:deflate_slow + fun:deflate + fun:compress2 +} + +{ + libz longest_match + Memcheck:Cond + fun:longest_match + fun:deflate_slow + fun:deflate + fun:do_flush +} + +{ + libz longest_match2 + Memcheck:Cond + fun:longest_match + fun:deflate_slow + fun:deflate + fun:compress2 +} + +{ + libz deflate + Memcheck:Cond + obj:/usr/lib/libz.so.* + obj:/usr/lib/libz.so.* + fun:deflate + fun:compress2 +} diff --git a/mysys/default.c b/mysys/default.c index ddff4e26be5..6352cc18d56 100644 --- a/mysys/default.c +++ b/mysys/default.c @@ -477,13 +477,13 @@ static int search_default_file_with_ext(Process_option_func opt_handler, if ((stat_info.st_mode & S_IWOTH) && (stat_info.st_mode & S_IFMT) == S_IFREG) { - fprintf(stderr, "warning: World-writable config file %s is ignored\n", + fprintf(stderr, "Warning: World-writable config file '%s' is ignored\n", name); return 0; } } #endif - if (!(fp= my_fopen(fn_format(name, name, "", "", 4), O_RDONLY, MYF(0)))) + if (!(fp= my_fopen(name, O_RDONLY, MYF(0)))) return 0; /* Ignore wrong files */ while (fgets(buff, sizeof(buff) - 1, fp)) diff --git a/scripts/make_binary_distribution.sh b/scripts/make_binary_distribution.sh index ddce55c063d..22bf13d8bef 100644 --- a/scripts/make_binary_distribution.sh +++ b/scripts/make_binary_distribution.sh @@ -207,6 +207,7 @@ rm -f $MYSQL_SHARE/Makefile* $MYSQL_SHARE/*/*.OLD for i in mysql-test/mysql-test-run mysql-test/install_test_db \ mysql-test/mysql-test-run.pl mysql-test/README \ + mysql-test/valgrind.supp \ netware/mysql_test_run.nlm netware/install_test_db.ncf do if [ -f $i ] diff --git a/sql/ha_federated.cc b/sql/ha_federated.cc index 8000aae180d..33acc9cad0b 100644 --- a/sql/ha_federated.cc +++ b/sql/ha_federated.cc @@ -548,12 +548,12 @@ error: static int parse_url(FEDERATED_SHARE *share, TABLE *table, uint table_create_flag) { + uint error_num= (table_create_flag ? ER_CANT_CREATE_TABLE : + ER_CONNECT_TO_MASTER); DBUG_ENTER("ha_federated::parse_url"); share->port= 0; - uint error_num= (table_create_flag ? ER_CANT_CREATE_TABLE : - ER_CONNECT_TO_MASTER); - + share->socket= 0; share->scheme= my_strdup(table->s->comment, MYF(0)); if ((share->username= strstr(share->scheme, "://"))) diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index de51fad4365..0d700f6c9a5 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -548,6 +548,7 @@ int ha_heap::create(const char *name, TABLE *table_arg, hp_create_info.auto_increment= (create_info->auto_increment_value ? create_info->auto_increment_value - 1 : 0); hp_create_info.max_table_size=current_thd->variables.max_heap_table_size; + hp_create_info.with_auto_increment= found_real_auto_increment; max_rows = (ha_rows) (hp_create_info.max_table_size / mem_per_row); error= heap_create(fn_format(buff,name,"","",4+2), keys, keydef, share->reclength, diff --git a/sql/mysqld.cc b/sql/mysqld.cc index e1303585114..7611270fc42 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1519,6 +1519,7 @@ void end_thread(THD *thd, bool put_in_cache) thd=thread_cache.get(); thd->real_id=pthread_self(); (void) thd->store_globals(); + thd->thr_create_time= time(NULL); threads.append(thd); pthread_mutex_unlock(&LOCK_thread_count); DBUG_VOID_RETURN; @@ -5180,7 +5181,7 @@ log and this option does nothing anymore.", (gptr*) &dflt_key_cache_var.param_buff_size, (gptr*) 0, 0, (GET_ULL | GET_ASK_ADDR), - REQUIRED_ARG, KEY_CACHE_SIZE, MALLOC_OVERHEAD, UINT_MAX32, MALLOC_OVERHEAD, + REQUIRED_ARG, KEY_CACHE_SIZE, MALLOC_OVERHEAD, ~(ulong) 0, MALLOC_OVERHEAD, IO_SIZE, 0}, {"key_cache_age_threshold", OPT_KEY_CACHE_AGE_THRESHOLD, "This characterizes the number of hits a hot block has to be untouched until it is considered aged enough to be downgraded to a warm block. This specifies the percentage ratio of that number of hits to the total number of blocks in key cache", diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 1d7eba4ce43..9e7cf81de3c 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1103,7 +1103,8 @@ pthread_handler_decl(handle_one_connection,arg) thd->proc_info=0; thd->set_time(); thd->init_for_queries(); - while (!net->error && net->vio != 0 && !(thd->killed == THD::KILL_CONNECTION)) + while (!net->error && net->vio != 0 && + !(thd->killed == THD::KILL_CONNECTION)) { net->no_send_error= 0; if (do_command(thd)) diff --git a/strings/decimal.c b/strings/decimal.c index 56dba61d887..9af95511f6d 100644 --- a/strings/decimal.c +++ b/strings/decimal.c @@ -806,7 +806,7 @@ internal_str2dec(const char *from, decimal_t *to, char **end, my_bool fixed) if (s < end_of_string && *s=='.') { endp= s+1; - while (s < end_of_string && my_isdigit(&my_charset_latin1, *endp)) + while (endp < end_of_string && my_isdigit(&my_charset_latin1, *endp)) endp++; frac= endp - s - 1; } From a7c6348192b857e12d8219bed24e44fee15ae181 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Wed, 6 Apr 2005 19:43:35 +0300 Subject: [PATCH 086/204] Fixed errors found during review --- mysql-test/r/drop.result | 4 ++-- mysql-test/r/kill.result | 2 +- mysql-test/t/kill.test | 2 +- mysys/my_sync.c | 2 +- sql/records.cc | 2 +- sql/share/errmsg.txt | 48 ++++++++++++++++++++-------------------- sql/sql_class.cc | 5 +++-- sql/sql_show.cc | 2 +- 8 files changed, 34 insertions(+), 33 deletions(-) diff --git a/mysql-test/r/drop.result b/mysql-test/r/drop.result index b91cc89cfea..979e5d48871 100644 --- a/mysql-test/r/drop.result +++ b/mysql-test/r/drop.result @@ -30,13 +30,13 @@ table7, table8, table9, table10, table11, table12, table13, table14, table15, table16, table17, table18, table19, table20, table21, table22, table23, table24, table25, table26, table27, table28; -ERROR 42S02: Unknown table 'table1,table2,table3,table4,table5,table6,table7,table8,table9,table10,table11,table12,table13,table14,table15,table16,table17,table18,table19,table20,table21,table22,table23,table' +ERROR 42S02: Unknown table 'table1,table2,table3,table4,table5,table6,table7,table8,table9,table10,table11,table12,table13,table' drop table table1, table2, table3, table4, table5, table6, table7, table8, table9, table10, table11, table12, table13, table14, table15, table16, table17, table18, table19, table20, table21, table22, table23, table24, table25, table26, table27, table28, table29, table30; -ERROR 42S02: Unknown table 'table1,table2,table3,table4,table5,table6,table7,table8,table9,table10,table11,table12,table13,table14,table15,table16,table17,table18,table19,table20,table21,table22,table23,table' +ERROR 42S02: Unknown table 'table1,table2,table3,table4,table5,table6,table7,table8,table9,table10,table11,table12,table13,table' use test; drop database mysqltest; flush tables with read lock; diff --git a/mysql-test/r/kill.result b/mysql-test/r/kill.result index 049281ad5d4..754568093ff 100644 --- a/mysql-test/r/kill.result +++ b/mysql-test/r/kill.result @@ -6,7 +6,7 @@ select ((@id := kill_id) - kill_id) from t1; 0 kill @id; select 1; -ERROR HY000: MySQL server has gone away +Got one of the listed errors select ((@id := kill_id) - kill_id) from t1; ((@id := kill_id) - kill_id) 0 diff --git a/mysql-test/t/kill.test b/mysql-test/t/kill.test index 6744a212828..37e11e14df5 100644 --- a/mysql-test/t/kill.test +++ b/mysql-test/t/kill.test @@ -27,7 +27,7 @@ connection con1; --disable_reconnect # this statement should fail ---error 2006 +--error 2006,2013 select 1; --enable_reconnect # this should work, and we should have a new connection_id() diff --git a/mysys/my_sync.c b/mysys/my_sync.c index bfaf09ce402..c557324b52c 100644 --- a/mysys/my_sync.c +++ b/mysys/my_sync.c @@ -65,7 +65,7 @@ int my_sync(File fd, myf my_flags) int er= errno; if (!(my_errno= er)) my_errno= -1; /* Unknown error */ - if (my_flags & MY_IGNORE_BADFD && + if ((my_flags & MY_IGNORE_BADFD) && (er == EBADF || er == EINVAL || er == EROFS)) res= 0; else if (my_flags & MY_WME) diff --git a/sql/records.cc b/sql/records.cc index cfb7cb3d065..b71bcf70865 100644 --- a/sql/records.cc +++ b/sql/records.cc @@ -131,7 +131,7 @@ void init_read_record(READ_RECORD *info,THD *thd, TABLE *table, /* Condition pushdown to storage engine */ if (thd->variables.engine_condition_pushdown && select && select->cond && - select->cond->used_tables() & table->map && + (select->cond->used_tables() & table->map) && !table->file->pushed_cond) table->file->cond_push(select->cond); diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index 9a92f1f4f76..46c8fcc7863 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -1214,30 +1214,30 @@ ER_TABLE_EXISTS_ERROR 42S01 swe "Tabellen '%-.64s' finns redan" ukr " '%-.64s' դ" ER_BAD_TABLE_ERROR 42S02 - cze "Nezn-Bm tabulka '%-.180s'" - dan "Ukendt tabel '%-.180s'" - nla "Onbekende tabel '%-.180s'" - eng "Unknown table '%-.180s'" - jps "table '%-.180s' ͂܂.", - est "Tundmatu tabel '%-.180s'" - fre "Table '%-.180s' inconnue" - ger "Unbekannte Tabelle '%-.180s'" - greek " '%-.180s'" - hun "Ervenytelen tabla: '%-.180s'" - ita "Tabella '%-.180s' sconosciuta" - jpn "table '%-.180s' Ϥޤ." - kor "̺ '%-.180s' ˼ " - nor "Ukjent tabell '%-.180s'" - norwegian-ny "Ukjent tabell '%-.180s'" - pol "Nieznana tabela '%-.180s'" - por "Tabela '%-.180s' desconhecida" - rum "Tabela '%-.180s' este invalida" - rus " '%-.180s'" - serbian "Nepoznata tabela '%-.180s'" - slo "Neznma tabuka '%-.180s'" - spa "Tabla '%-.180s' desconocida" - swe "Oknd tabell '%-.180s'" - ukr "צ '%-.180s'" + cze "Nezn-Bm tabulka '%-.100s'" + dan "Ukendt tabel '%-.100s'" + nla "Onbekende tabel '%-.100s'" + eng "Unknown table '%-.100s'" + jps "table '%-.100s' ͂܂.", + est "Tundmatu tabel '%-.100s'" + fre "Table '%-.100s' inconnue" + ger "Unbekannte Tabelle '%-.100s'" + greek " '%-.100s'" + hun "Ervenytelen tabla: '%-.100s'" + ita "Tabella '%-.100s' sconosciuta" + jpn "table '%-.100s' Ϥޤ." + kor "̺ '%-.100s' ˼ " + nor "Ukjent tabell '%-.100s'" + norwegian-ny "Ukjent tabell '%-.100s'" + pol "Nieznana tabela '%-.100s'" + por "Tabela '%-.100s' desconhecida" + rum "Tabela '%-.100s' este invalida" + rus " '%-.100s'" + serbian "Nepoznata tabela '%-.100s'" + slo "Neznma tabuka '%-.100s'" + spa "Tabla '%-.100s' desconocida" + swe "Oknd tabell '%-.100s'" + ukr "צ '%-.100s'" ER_NON_UNIQ_ERROR 23000 cze "Sloupec '%-.64s' v %s nen-B zcela jasn" dan "Felt: '%-.64s' i tabel %s er ikke entydigt" diff --git a/sql/sql_class.cc b/sql/sql_class.cc index cdda013d23a..c68dc826147 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -343,8 +343,9 @@ void THD::change_user(void) void THD::cleanup(void) { DBUG_ENTER("THD::cleanup"); - /* TODO uncomment the line below when binlog will be able to prepare */ - // if (transaction.xa_state != XA_PREPARED) +#ifdef ENABLE_WHEN_BINLOG_WILL_BE_ABLE_TO_PREPARE + if (transaction.xa_state != XA_PREPARED) +#endif ha_rollback(this); if (locked_tables) { diff --git a/sql/sql_show.cc b/sql/sql_show.cc index d2cab6bf49f..8b906f133ba 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2312,7 +2312,7 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables, } } #else - end=strmov(end,""); + *end= 0; #endif table->field[17]->store(tmp+1,end == tmp ? 0 : (uint) (end-tmp-1), cs); From 70aecbb8a450fedc3390e71daf7bd432db376b04 Mon Sep 17 00:00:00 2001 From: "konstantin@mysql.com" <> Date: Wed, 6 Apr 2005 21:48:16 +0400 Subject: [PATCH 087/204] Refactor parts of do_select() (JOIN execution). --- sql/sql_select.cc | 93 +++++++++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 36 deletions(-) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 410b3090b5c..cbde0752cd1 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -111,6 +111,7 @@ static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item); static bool open_tmp_table(TABLE *table); static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param, ulong options); +static Next_select_func setup_end_select_func(JOIN *join); static int do_select(JOIN *join,List *fields,TABLE *tmp_table, Procedure *proc); static int sub_select_cache(JOIN *join,JOIN_TAB *join_tab,bool end_of_records); @@ -1638,6 +1639,8 @@ JOIN::exec() { thd->proc_info="Sending data"; DBUG_PRINT("info", ("%s", thd->proc_info)); + result->send_fields(*curr_fields_list, + Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF); error= do_select(curr_join, curr_fields_list, NULL, procedure); thd->limit_found_rows= curr_join->send_records; thd->examined_row_count= curr_join->examined_rows; @@ -1776,12 +1779,7 @@ Cursor::open(JOIN *join_arg) thd->server_status&= ~SERVER_STATUS_CURSOR_EXISTS; /* Prepare JOIN for reading rows. */ - - Next_select_func end_select= join->sort_and_group || join->procedure && - join->procedure->flags & PROC_GROUP ? - end_send_group : end_send; - - join->join_tab[join->tables-1].next_select= end_select; + join->join_tab[join->tables-1].next_select= setup_end_select_func(join); join->send_records= 0; join->fetch_limit= join->unit->offset_limit_cnt; @@ -1802,6 +1800,11 @@ Cursor::open(JOIN *join_arg) */ DBUG_ASSERT(join_tab->table->null_row == 0); + /* + There is always at least one record in the table, as otherwise we + wouldn't have opened the cursor. Therefore a failure is the only + reason read_first_record can return not 0. + */ DBUG_RETURN(join_tab->read_first_record(join_tab)); } @@ -8733,36 +8736,24 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param, } -/**************************************************************************** - Make a join of all tables and write it on socket or to table - Return: 0 if ok - 1 if error is sent - -1 if error should be sent -****************************************************************************/ +/* + SYNOPSIS + setup_end_select_func() + join join to setup the function for. -static int -do_select(JOIN *join,List *fields,TABLE *table,Procedure *procedure) + DESCRIPTION + Rows produced by a join sweep may end up in a temporary table or be sent + to a client. Setup the function of the nested loop join algorithm which + handles final fully constructed and matched records. + + RETURN + end_select function to use. This function can't fail. +*/ + +static Next_select_func setup_end_select_func(JOIN *join) { - int error= 0; - JOIN_TAB *join_tab; + TABLE *table= join->tmp_table; Next_select_func end_select; - DBUG_ENTER("do_select"); - - join->procedure=procedure; - /* - Tell the client how many fields there are in a row - */ - if (!table) - join->result->send_fields(*fields, - Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF); - else - { - VOID(table->file->extra(HA_EXTRA_WRITE_CACHE)); - empty_record(table); - } - join->tmp_table= table; /* Save for easy recursion */ - join->fields= fields; - /* Set up select_end */ if (table) { @@ -8772,8 +8763,6 @@ do_select(JOIN *join,List *fields,TABLE *table,Procedure *procedure) { DBUG_PRINT("info",("Using end_update")); end_select=end_update; - if (!table->file->inited) - table->file->ha_index_init(0); } else { @@ -8807,7 +8796,38 @@ do_select(JOIN *join,List *fields,TABLE *table,Procedure *procedure) else end_select= end_send; } - join->join_tab[join->tables-1].next_select=end_select; + return end_select; +} + + +/**************************************************************************** + Make a join of all tables and write it on socket or to table + Return: 0 if ok + 1 if error is sent + -1 if error should be sent +****************************************************************************/ + +static int +do_select(JOIN *join,List *fields,TABLE *table,Procedure *procedure) +{ + int error= 0; + JOIN_TAB *join_tab; + DBUG_ENTER("do_select"); + + join->procedure=procedure; + join->tmp_table= table; /* Save for easy recursion */ + join->fields= fields; + + if (table) + { + VOID(table->file->extra(HA_EXTRA_WRITE_CACHE)); + empty_record(table); + if (table->group && join->tmp_table_param.sum_func_count && + table->s->keys && !table->file->inited) + table->file->ha_index_init(0); + } + /* Set up select_end */ + join->join_tab[join->tables-1].next_select= setup_end_select_func(join); join_tab=join->join_tab+join->const_tables; join->send_records=0; @@ -8819,6 +8839,7 @@ do_select(JOIN *join,List *fields,TABLE *table,Procedure *procedure) */ if (!join->conds || join->conds->val_int()) { + Next_select_func end_select= join->join_tab[join->tables-1].next_select; if (!(error=(*end_select)(join,join_tab,0)) || error == -3) error=(*end_select)(join,join_tab,1); } From 5f8d71710b6e8a8a147e00feff86bff140ec7696 Mon Sep 17 00:00:00 2001 From: "konstantin@mysql.com" <> Date: Wed, 6 Apr 2005 22:09:43 +0400 Subject: [PATCH 088/204] Minor fix in cursors execution. --- sql/sql_select.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index cbde0752cd1..baf2ef09d2b 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1779,6 +1779,7 @@ Cursor::open(JOIN *join_arg) thd->server_status&= ~SERVER_STATUS_CURSOR_EXISTS; /* Prepare JOIN for reading rows. */ + join->tmp_table= 0; join->join_tab[join->tables-1].next_select= setup_end_select_func(join); join->send_records= 0; join->fetch_limit= join->unit->offset_limit_cnt; From 288eff45cba7e173d3f3a70a92ad13ef19ce6160 Mon Sep 17 00:00:00 2001 From: "jani@a193-229-222-105.elisa-laajakaista.fi" <> Date: Wed, 6 Apr 2005 21:55:34 +0300 Subject: [PATCH 089/204] Added missing file to Makefile.am --- mysql-test/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/Makefile.am b/mysql-test/Makefile.am index f3efa24b628..34b1dd1a1fe 100644 --- a/mysql-test/Makefile.am +++ b/mysql-test/Makefile.am @@ -59,6 +59,7 @@ dist-hook: $(INSTALL_DATA) $(srcdir)/std_data/*.frm $(distdir)/std_data $(INSTALL_DATA) $(srcdir)/lib/init_db.sql $(distdir)/lib $(INSTALL_DATA) $(srcdir)/lib/*.pl $(distdir)/lib + $(INSTALL_DATA) $(srcdir)/*.supp $(distdir)/ install-data-local: $(mkinstalldirs) \ From 5cd866610df606253827d5495343365af0cc9134 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Wed, 6 Apr 2005 23:12:10 +0200 Subject: [PATCH 090/204] after merge fix --- mysql-test/r/user_var.result | 3 +-- mysql-test/t/user_var.test | 3 +-- ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp | 3 ++- strings/ctype-cp932.c | 4 +++- strings/ctype-eucjpms.c | 11 +++++++---- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/mysql-test/r/user_var.result b/mysql-test/r/user_var.result index d36dca86e39..68eae111111 100644 --- a/mysql-test/r/user_var.result +++ b/mysql-test/r/user_var.result @@ -180,6 +180,5 @@ select coercibility(@v1),coercibility(@v2),coercibility(@v3),coercibility(@v4); coercibility(@v1) coercibility(@v2) coercibility(@v3) coercibility(@v4) 2 2 2 2 set session @honk=99; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@honk=99' at line 1 set one_shot @honk=99; -ERROR HY000: The SET ONE_SHOT syntax is reserved for purposes internal to the MySQL server +ERROR HY000: The 'SET ONE_SHOT' syntax is reserved for purposes internal to the MySQL server diff --git a/mysql-test/t/user_var.test b/mysql-test/t/user_var.test index 49941bc81f3..ef360f2231d 100644 --- a/mysql-test/t/user_var.test +++ b/mysql-test/t/user_var.test @@ -116,7 +116,6 @@ select coercibility(@v1),coercibility(@v2),coercibility(@v3),coercibility(@v4); # # Bug #9286 SESSION/GLOBAL should be disallowed for user variables # ---error 1064 set session @honk=99; ---error 1105 +--error 1382 set one_shot @honk=99; diff --git a/ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp b/ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp index c3f85cdebd5..3170d23499a 100644 --- a/ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp +++ b/ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp @@ -813,6 +813,7 @@ Dbtup::updateFixedSizeTHManyWordNotNULL(Uint32* inBuffer, ndbrequire(i < regTabPtr->noOfCharsets); // not const in MySQL CHARSET_INFO* cs = regTabPtr->charsetArray[i]; + int not_used; const char* ssrc = (const char*)&inBuffer[tInBufIndex + 1]; Uint32 lb, len; if (! NdbSqlUtil::get_var_length(typeId, ssrc, bytes, lb, len)) { @@ -822,7 +823,7 @@ Dbtup::updateFixedSizeTHManyWordNotNULL(Uint32* inBuffer, } // fast fix bug#7340 if (typeId != NDB_TYPE_TEXT && - (*cs->cset->well_formed_len)(cs, ssrc + lb, ssrc + lb + len, ZNIL) != len) { + (*cs->cset->well_formed_len)(cs, ssrc + lb, ssrc + lb + len, ZNIL, ¬_used) != len) { ljam(); terrorCode = ZINVALID_CHAR_FORMAT; return false; diff --git a/strings/ctype-cp932.c b/strings/ctype-cp932.c index c47f2c2d8ce..47bf1167c8c 100644 --- a/strings/ctype-cp932.c +++ b/strings/ctype-cp932.c @@ -5413,9 +5413,10 @@ uint my_numcells_cp932(CHARSET_INFO *cs __attribute__((unused)), */ static uint my_well_formed_len_cp932(CHARSET_INFO *cs __attribute__((unused)), - const char *b, const char *e, uint pos) + const char *b, const char *e, uint pos, int *error) { const char *b0= b; + *error= 0; while (pos && b < e) { /* @@ -5441,6 +5442,7 @@ uint my_well_formed_len_cp932(CHARSET_INFO *cs __attribute__((unused)), else { /* Wrong byte sequence */ + *error= 1; break; } } diff --git a/strings/ctype-eucjpms.c b/strings/ctype-eucjpms.c index 8c8d237cf48..346b5ecdf6b 100644 --- a/strings/ctype-eucjpms.c +++ b/strings/ctype-eucjpms.c @@ -8380,17 +8380,18 @@ my_jisx0212_uni_onechar(int code){ /* EUC-JP encoding subcomponents: - [x00-x7F] # ASCII/JIS-Roman (one-byte/character) - [x8E][xA0-xDF] # half-width katakana (two bytes/char) - [x8F][xA1-xFE][xA1-xFE] # JIS X 0212-1990 (three bytes/char) + [x00-x7F] # ASCII/JIS-Roman (one-byte/character) + [x8E][xA0-xDF] # half-width katakana (two bytes/char) + [x8F][xA1-xFE][xA1-xFE] # JIS X 0212-1990 (three bytes/char) [xA1-xFE][xA1-xFE] # JIS X 0208:1997 (two bytes/char) */ static uint my_well_formed_len_eucjpms(CHARSET_INFO *cs __attribute__((unused)), - const char *beg, const char *end, uint pos) + const char *beg, const char *end, uint pos, int *error) { const uchar *b= (uchar *) beg; + *error=0; for ( ; pos && b < (uchar*) end; pos--, b++) { @@ -8408,6 +8409,7 @@ uint my_well_formed_len_eucjpms(CHARSET_INFO *cs __attribute__((unused)), { if (*b >= 0xA0 && *b <= 0xDF) continue; + *error=1; return chbeg - beg; /* invalid sequence */ } @@ -8421,6 +8423,7 @@ uint my_well_formed_len_eucjpms(CHARSET_INFO *cs __attribute__((unused)), if (ch >= 0xA1 && ch <= 0xFE && *b >= 0xA1 && *b <= 0xFE) /* [xA1-xFE][xA1-xFE] */ continue; + *error=1; return chbeg - beg; /* invalid sequence */ } return b - (uchar *) beg; From d85bed11215aff82e4d63b9c9e6e7fca29562a86 Mon Sep 17 00:00:00 2001 From: "dlenev@brandersnatch.localdomain" <> Date: Thu, 7 Apr 2005 01:40:29 +0400 Subject: [PATCH 091/204] Fix for bug #9566 "explicit LOCK TABLE and store procedures result in illegal state". We should not assume that mysql.proc table does not exist if we are unable to open it under LOCK TABLES or in prelocked mode (and remember this fact by setting mysql_proc_table_exists to zero). --- mysql-test/r/sp.result | 10 ++++++++++ mysql-test/t/sp.test | 23 +++++++++++++++++++++++ sql/sp.cc | 13 +++++++++---- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index daad032b854..cb0ae310ceb 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -2779,4 +2779,14 @@ a 3.2000 drop procedure bug8937| delete from t1| +drop procedure if exists bug9566| +create procedure bug9566() +begin +select * from t1; +end| +lock table t1 read| +call bug9566()| +ERROR HY000: Table 'proc' was not locked with LOCK TABLES +unlock tables| +drop procedure bug9566| drop table t1,t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index a741a4af7d8..799e88a6615 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3397,6 +3397,29 @@ call bug8937()| drop procedure bug8937| delete from t1| +# +# BUG#9566: explicit LOCK TABLE and store procedures result in illegal state +# +# We should not think that mysql.proc table does not exist if we are unable +# to open it under LOCK TABLE or in prelocked mode. Probably this test +# should be removed when Monty will allow access to mysql.proc without +# locking it. +# +--disable_warnings +drop procedure if exists bug9566| +--enable_warnings +create procedure bug9566() +begin + select * from t1; +end| +lock table t1 read| +# This should fail because we forgot to lock mysql.proc table explicitly +--error 1100 +call bug9566()| +unlock tables| +# This should succeed +drop procedure bug9566| + # # BUG#NNNN: New bug synopsis diff --git a/sql/sp.cc b/sql/sp.cc index 23d389cd299..1956f32f2c6 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -70,9 +70,8 @@ db_find_routine_aux(THD *thd, int type, sp_name *name, type, name->m_name.length, name->m_name.str)); /* - Speed up things if mysql.proc doesn't exists - mysql_proc_table_exists is set when on creates a stored procedure - or on flush privileges + Speed up things if mysql.proc doesn't exists. mysql_proc_table_exists + is set when we create or read stored procedure or on flush privileges. */ if (!mysql_proc_table_exists && ltype == TL_READ) DBUG_RETURN(SP_OPEN_TABLE_FAILED); @@ -98,7 +97,13 @@ db_find_routine_aux(THD *thd, int type, sp_name *name, if (! (table= open_ltable(thd, &tables, ltype))) { *tablep= NULL; - mysql_proc_table_exists= 0; + /* + Under explicit LOCK TABLES or in prelocked mode we should not + say that mysql.proc table does not exist if we are unable to + open it since this condition may be transient. + */ + if (!(thd->locked_tables || thd->prelocked_mode)) + mysql_proc_table_exists= 0; DBUG_RETURN(SP_OPEN_TABLE_FAILED); } *opened= TRUE; From 8d05aa0f02bc0083261d1717bb875b5c11d24309 Mon Sep 17 00:00:00 2001 From: "dlenev@brandersnatch.localdomain" <> Date: Thu, 7 Apr 2005 11:57:47 +0400 Subject: [PATCH 092/204] Moved test for bug #9566 "explicit LOCK TABLE and store procedures result in illegal state" to sp-error.test. According to Per-Erik all SP related tests which should result in error should go into sp-error.test and not in sp.test, because we want to be able to run sp.test using normal client. --- mysql-test/r/sp-error.result | 10 ++++++++++ mysql-test/r/sp.result | 10 ---------- mysql-test/t/sp-error.test | 23 +++++++++++++++++++++++ mysql-test/t/sp.test | 23 ----------------------- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result index c979ee34df0..ff7d71b3384 100644 --- a/mysql-test/r/sp-error.result +++ b/mysql-test/r/sp-error.result @@ -503,4 +503,14 @@ ERROR 0A000: LOCK is not allowed in stored procedures create procedure bug6600() unlock table t1| ERROR 0A000: UNLOCK is not allowed in stored procedures +drop procedure if exists bug9566| +create procedure bug9566() +begin +select * from t1; +end| +lock table t1 read| +call bug9566()| +ERROR HY000: Table 'proc' was not locked with LOCK TABLES +unlock tables| +drop procedure bug9566| drop table t1| diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index cb0ae310ceb..daad032b854 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -2779,14 +2779,4 @@ a 3.2000 drop procedure bug8937| delete from t1| -drop procedure if exists bug9566| -create procedure bug9566() -begin -select * from t1; -end| -lock table t1 read| -call bug9566()| -ERROR HY000: Table 'proc' was not locked with LOCK TABLES -unlock tables| -drop procedure bug9566| drop table t1,t2; diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test index 621700b732a..51776453730 100644 --- a/mysql-test/t/sp-error.test +++ b/mysql-test/t/sp-error.test @@ -696,6 +696,29 @@ create procedure bug6600() create procedure bug6600() unlock table t1| +# +# BUG#9566: explicit LOCK TABLE and store procedures result in illegal state +# +# We should not think that mysql.proc table does not exist if we are unable +# to open it under LOCK TABLE or in prelocked mode. Probably this test +# should be removed when Monty will allow access to mysql.proc without +# locking it. +# +--disable_warnings +drop procedure if exists bug9566| +--enable_warnings +create procedure bug9566() +begin + select * from t1; +end| +lock table t1 read| +# This should fail because we forgot to lock mysql.proc table explicitly +--error 1100 +call bug9566()| +unlock tables| +# This should succeed +drop procedure bug9566| + # # BUG#NNNN: New bug synopsis diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 799e88a6615..a741a4af7d8 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3397,29 +3397,6 @@ call bug8937()| drop procedure bug8937| delete from t1| -# -# BUG#9566: explicit LOCK TABLE and store procedures result in illegal state -# -# We should not think that mysql.proc table does not exist if we are unable -# to open it under LOCK TABLE or in prelocked mode. Probably this test -# should be removed when Monty will allow access to mysql.proc without -# locking it. -# ---disable_warnings -drop procedure if exists bug9566| ---enable_warnings -create procedure bug9566() -begin - select * from t1; -end| -lock table t1 read| -# This should fail because we forgot to lock mysql.proc table explicitly ---error 1100 -call bug9566()| -unlock tables| -# This should succeed -drop procedure bug9566| - # # BUG#NNNN: New bug synopsis From b5328a7dbc62f7d87d406b7fa334a03dcea6b5ba Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Thu, 7 Apr 2005 12:16:41 +0300 Subject: [PATCH 093/204] InnoDB: Prevent ALTER TABLE ... ENGINE=... if there are foreign key constraints on the table. (Bug #5574) --- sql/ha_innodb.cc | 26 ++++++++++++++++++++++++++ sql/ha_innodb.h | 1 + sql/handler.h | 2 ++ sql/sql_table.cc | 4 ++++ 4 files changed, 33 insertions(+) diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 3e3a48f4ab9..322d5188a75 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -4789,6 +4789,32 @@ ha_innobase::get_foreign_key_create_info(void) return(str); } +/********************************************************************* +Checks if ALTER TABLE may change the storage engine of the table. +Changing storage engines is not allowed for tables for which there +are foreign key constraints (parent or child tables). */ + +bool +ha_innobase::can_switch_engines(void) +/*=================================*/ +{ + row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; + bool can_switch; + + DBUG_ENTER("ha_innobase::can_switch_engines"); + prebuilt->trx->op_info = + "determining if there are foreign key constraints"; + row_mysql_lock_data_dictionary(prebuilt->trx); + + can_switch = !UT_LIST_GET_FIRST(prebuilt->table->referenced_list) + && !UT_LIST_GET_FIRST(prebuilt->table->foreign_list); + + row_mysql_unlock_data_dictionary(prebuilt->trx); + prebuilt->trx->op_info = ""; + + DBUG_RETURN(can_switch); +} + /*********************************************************************** Checks if a table is referenced by a foreign key. The MySQL manual states that a REPLACE is either equivalent to an INSERT, or DELETE(s) + INSERT. Only a diff --git a/sql/ha_innodb.h b/sql/ha_innodb.h index f10785b695d..edf428669d8 100644 --- a/sql/ha_innodb.h +++ b/sql/ha_innodb.h @@ -161,6 +161,7 @@ class ha_innobase: public handler int check(THD* thd, HA_CHECK_OPT* check_opt); char* update_table_comment(const char* comment); char* get_foreign_key_create_info(); + bool can_switch_engines(); uint referenced_by_foreign_key(); void free_foreign_key_create_info(char* str); THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, diff --git a/sql/handler.h b/sql/handler.h index 50ce33b5067..4c31da6a492 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -450,6 +450,8 @@ public: virtual void append_create_info(String *packet) {} virtual char* get_foreign_key_create_info() { return(NULL);} /* gets foreign key create string from InnoDB */ + /* used in ALTER TABLE; 1 if changing storage engine is allowed */ + virtual bool can_switch_engines() { return 1; } /* used in REPLACE; is > 0 if table is referred by a FOREIGN KEY */ virtual uint referenced_by_foreign_key() { return 0;} virtual void init_table_handle_for_HANDLER() diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 5aba764e293..84f51a95691 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3109,6 +3109,10 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, /* Safety fix for innodb */ if (lower_case_table_names) my_casedn_str(files_charset_info, tmp_name); + if (new_db_type != old_db_type && !table->file->can_switch_engines()) { + my_error(ER_ROW_IS_REFERENCED, MYF(0)); + goto err; + } create_info->db_type=new_db_type; if (!create_info->comment) create_info->comment=table->comment; From 934f458140dc970ccc4cdb4ebb094f38c8b651c9 Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Thu, 7 Apr 2005 12:12:03 +0200 Subject: [PATCH 094/204] Added missing DBUG_RETURNs --- ndb/src/ndbapi/NdbDictionaryImpl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/ndb/src/ndbapi/NdbDictionaryImpl.cpp index e88f76ef513..fb2e0d673cd 100644 --- a/ndb/src/ndbapi/NdbDictionaryImpl.cpp +++ b/ndb/src/ndbapi/NdbDictionaryImpl.cpp @@ -1501,7 +1501,7 @@ NdbDictInterface::createOrAlterTable(Ndb & ndb, if (col->m_autoIncrement) { if (haveAutoIncrement) { m_error.code = 4335; - return -1; + DBUG_RETURN(-1); } haveAutoIncrement = true; autoIncrementValue = col->m_autoIncrementInitialValue; @@ -1622,7 +1622,7 @@ NdbDictInterface::createOrAlterTable(Ndb & ndb, ret= createTable(&tSignal, ptr); if (ret) - return ret; + DBUG_RETURN(ret); if (haveAutoIncrement) { if (!ndb.setAutoIncrementValue(impl.m_externalName.c_str(), From 18354f457005c98112e51d02fa18f16feff50724 Mon Sep 17 00:00:00 2001 From: "jani@ua141d10.elisa.omakaista.fi" <> Date: Thu, 7 Apr 2005 13:20:15 +0300 Subject: [PATCH 095/204] A small fix to Makefile.am --- mysql-test/Makefile.am | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mysql-test/Makefile.am b/mysql-test/Makefile.am index 34b1dd1a1fe..9963074daf5 100644 --- a/mysql-test/Makefile.am +++ b/mysql-test/Makefile.am @@ -32,7 +32,7 @@ endif benchdir_root= $(prefix) testdir = $(benchdir_root)/mysql-test -EXTRA_SCRIPTS = mysql-test-run.sh mysql-test-run.pl install_test_db.sh +EXTRA_SCRIPTS = mysql-test-run.sh mysql-test-run.pl install_test_db.sh valgrind.supp EXTRA_DIST = $(EXTRA_SCRIPTS) test_SCRIPTS = mysql-test-run install_test_db test_DATA = std_data/client-key.pem std_data/client-cert.pem std_data/cacert.pem @@ -59,7 +59,6 @@ dist-hook: $(INSTALL_DATA) $(srcdir)/std_data/*.frm $(distdir)/std_data $(INSTALL_DATA) $(srcdir)/lib/init_db.sql $(distdir)/lib $(INSTALL_DATA) $(srcdir)/lib/*.pl $(distdir)/lib - $(INSTALL_DATA) $(srcdir)/*.supp $(distdir)/ install-data-local: $(mkinstalldirs) \ From b950bc210c64440c9bc12c9d8d77c9cf4a0b5ac4 Mon Sep 17 00:00:00 2001 From: "bar@mysql.com" <> Date: Thu, 7 Apr 2005 16:14:45 +0500 Subject: [PATCH 096/204] ctype-eucjpms.c: After merge fix. --- strings/ctype-eucjpms.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/strings/ctype-eucjpms.c b/strings/ctype-eucjpms.c index 346b5ecdf6b..ab12446754a 100644 --- a/strings/ctype-eucjpms.c +++ b/strings/ctype-eucjpms.c @@ -8417,7 +8417,10 @@ uint my_well_formed_len_eucjpms(CHARSET_INFO *cs __attribute__((unused)), { ch= *b++; if (b >= (uchar*) end) + { + *error= 1; return chbeg - beg; /* unexpected EOL */ + } } if (ch >= 0xA1 && ch <= 0xFE && From 9911194a1373181aaf6bbd736d487f75ea7aca5a Mon Sep 17 00:00:00 2001 From: "magnus@msdesk.mysql.com" <> Date: Thu, 7 Apr 2005 14:39:30 +0200 Subject: [PATCH 097/204] Fix linking problem on bsd53 - See article http://archive.netbsd.se/?ml=freebsd-current&a=2004-07&m=257561 or http://www.geocrawler.com/archives/3/254/2003/3/450/10409564/ --- configure.in | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/configure.in b/configure.in index c7e93c9676a..01f669a0d1b 100644 --- a/configure.in +++ b/configure.in @@ -351,6 +351,15 @@ then if echo $CXX | grep gcc > /dev/null 2>&1 then GCC_VERSION=`gcc -v 2>&1 | grep version | sed -e 's/[[^0-9. ]]//g; s/^ *//g; s/ .*//g'` + case $SYSTEM_TYPE in + *freebsd*) + # The libsupc++ library on freebsd with gcc 3.4.2 is dependent on + # libstdc++, disable it since other solution works fine + GCC_VERSION="NOSUPCPP_$GCC_VERSION" + ;; + *) + ;; + esac echo "Using gcc version '$GCC_VERSION'" case "$GCC_VERSION" in 3.4.*|3.5.*) From b591d3434a16f079d012cb0cdb4853906e8f1470 Mon Sep 17 00:00:00 2001 From: "sergefp@mysql.com" <> Date: Thu, 7 Apr 2005 17:42:32 +0400 Subject: [PATCH 098/204] BUG#8877: Post-merge fixes. --- sql/sql_select.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 21e8316bb9e..09fb0b3c5ae 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2231,6 +2231,8 @@ make_join_statistics(JOIN *join, TABLE_LIST *tables, COND *conds, if (s->dependent & table->map) s->dependent |= table->reginfo.join_tab->dependent; } + if (s->dependent) + s->table->maybe_null= 1; } /* Catch illegal cross references for outer joins */ for (i= 0, s= stat ; i < table_count ; i++, s++) @@ -2623,6 +2625,7 @@ merge_key_fields(KEY_FIELD *start,KEY_FIELD *new_fields,KEY_FIELD *end, static void add_key_field(KEY_FIELD **key_fields,uint and_level, Item_func *cond, + Field *field, bool eq_func, Item **value, uint num_values, table_map usable_tables) { uint exists_optimize= 0; @@ -2758,7 +2761,7 @@ add_key_field(KEY_FIELD **key_fields,uint and_level, Item_func *cond, static void add_key_equal_fields(KEY_FIELD **key_fields, uint and_level, - COND *cond, Item_field *field_item, + Item_func *cond, Item_field *field_item, bool eq_func, Item **val, uint num_values, table_map usable_tables) { @@ -2899,7 +2902,7 @@ add_key_fields(KEY_FIELD **key_fields,uint *and_level, */ while ((item= it++)) { - add_key_field(key_fields, *and_level, cond, item->field, + add_key_field(key_fields, *and_level, cond_func, item->field, TRUE, &const_item, 1, usable_tables); } } @@ -2919,7 +2922,7 @@ add_key_fields(KEY_FIELD **key_fields,uint *and_level, { if (!field->eq(item->field)) { - add_key_field(key_fields, *and_level, cond, field, + add_key_field(key_fields, *and_level, cond_func, field, TRUE, (Item **) &item, 1, usable_tables); } } @@ -3139,7 +3142,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, { NESTED_JOIN *nested_join= embedding->nested_join; if (nested_join->join_list.head() == tab) - add_key_fields(join_tab, &end, &and_level, embedding->on_expr, + add_key_fields(&end, &and_level, embedding->on_expr, nested_join->used_tables); } } @@ -5174,7 +5177,7 @@ static void add_not_null_conds(JOIN *join) null_rej->quick_fix_field(); DBUG_EXECUTE("where",print_where(null_rej, - referred_tab->table->table_name);); + referred_tab->table->alias);); add_cond_and_fix(&referred_tab->select_cond, null_rej); } } @@ -5454,7 +5457,7 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond) tab->select_cond= sel->cond= NULL; sel->head=tab->table; - DBUG_EXECUTE("where",print_where(tmp,tab->table->table_name);); + DBUG_EXECUTE("where",print_where(tmp,tab->table->alias);); if (tab->quick) { /* Use quick key read if it's a constant and it's not used From 0cd5877b025f77bf8a33b9ac6dd8eaea9cc6edcb Mon Sep 17 00:00:00 2001 From: "sergefp@mysql.com" <> Date: Thu, 7 Apr 2005 17:44:48 +0400 Subject: [PATCH 099/204] Post-review fixes: local variable renamed --- sql/sql_select.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 248ed06b6b3..8a668b64edf 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3532,14 +3532,14 @@ static void add_not_null_conds(JOIN *join) DBUG_ASSERT(item->type() == Item::FIELD_ITEM); Item_field *not_null_item= (Item_field*)item; JOIN_TAB *referred_tab= not_null_item->field->table->reginfo.join_tab; - Item_func_isnotnull *null_rej; - if (!(null_rej= new Item_func_isnotnull(not_null_item))) + Item_func_isnotnull *notnull; + if (!(notnull= new Item_func_isnotnull(not_null_item))) DBUG_VOID_RETURN; - null_rej->quick_fix_field(); - DBUG_EXECUTE("where",print_where(null_rej, + notnull->quick_fix_field(); + DBUG_EXECUTE("where",print_where(notnull, referred_tab->table->table_name);); - add_cond_and_fix(&referred_tab->select_cond, null_rej); + add_cond_and_fix(&referred_tab->select_cond, notnull); } } } From 89b140340cf4768d2f693d0d6f264fce429a83c7 Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Thu, 7 Apr 2005 17:44:09 +0200 Subject: [PATCH 100/204] Fix for Bug #9675 Auto-increment not working with INSERT..SELECT and NDB storage --- mysql-test/r/ndb_basic.result | 30 +++++++++++++++++++++++++++++ mysql-test/t/ndb_basic.test | 25 ++++++++++++++++++++++++ ndb/src/ndbapi/Ndb.cpp | 36 +++++++++++++++++++++-------------- sql/ha_ndbcluster.cc | 7 ++++++- 4 files changed, 83 insertions(+), 15 deletions(-) diff --git a/mysql-test/r/ndb_basic.result b/mysql-test/r/ndb_basic.result index a6396080ef0..12f9c3742e5 100644 --- a/mysql-test/r/ndb_basic.result +++ b/mysql-test/r/ndb_basic.result @@ -607,3 +607,33 @@ primary key (a)) engine=ndb max_rows=1; drop table t1; +create table t1 +(counter int(64) NOT NULL auto_increment, +datavalue char(40) default 'XXXX', +primary key (counter) +) ENGINE=ndbcluster; +insert into t1 (datavalue) values ('newval'); +insert into t1 (datavalue) values ('newval'); +select * from t1 order by counter; +counter datavalue +1 newval +2 newval +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +select * from t1 order by counter; +counter datavalue +1 newval +2 newval +3 newval +4 newval +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +select * from t1 order by counter; +counter datavalue +1 newval +2 newval +3 newval +4 newval +35 newval +36 newval +37 newval +38 newval +drop table t1; diff --git a/mysql-test/t/ndb_basic.test b/mysql-test/t/ndb_basic.test index f460c573a9d..35e1ddc5ebf 100644 --- a/mysql-test/t/ndb_basic.test +++ b/mysql-test/t/ndb_basic.test @@ -577,3 +577,28 @@ create table t1 engine=ndb max_rows=1; drop table t1; + +# +# Test auto_increment +# + +connect (con1,localhost,,,test); +connect (con2,localhost,,,test); + +create table t1 + (counter int(64) NOT NULL auto_increment, + datavalue char(40) default 'XXXX', + primary key (counter) + ) ENGINE=ndbcluster; + +connection con1; +insert into t1 (datavalue) values ('newval'); +insert into t1 (datavalue) values ('newval'); +select * from t1 order by counter; +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +select * from t1 order by counter; +connection con2; +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +select * from t1 order by counter; + +drop table t1; diff --git a/ndb/src/ndbapi/Ndb.cpp b/ndb/src/ndbapi/Ndb.cpp index b5493622b70..6390a1b50b5 100644 --- a/ndb/src/ndbapi/Ndb.cpp +++ b/ndb/src/ndbapi/Ndb.cpp @@ -722,26 +722,28 @@ Remark: Returns a new TupleId to the application. Uint64 Ndb::getAutoIncrementValue(const char* aTableName, Uint32 cacheSize) { - DEBUG_TRACE("getAutoIncrementValue"); + DBUG_ENTER("getAutoIncrementValue"); const char * internalTableName = internalizeTableName(aTableName); Ndb_local_table_info *info= theDictionary->get_local_table_info(internalTableName, false); if (info == 0) - return ~0; + DBUG_RETURN(~0); const NdbTableImpl *table= info->m_table_impl; Uint64 tupleId = getTupleIdFromNdb(table->m_tableId, cacheSize); - return tupleId; + DBUG_PRINT("info", ("value %u", tupleId)); + DBUG_RETURN(tupleId); } Uint64 Ndb::getAutoIncrementValue(const NdbDictionary::Table * aTable, Uint32 cacheSize) { - DEBUG_TRACE("getAutoIncrementValue"); + DBUG_ENTER("getAutoIncrementValue"); if (aTable == 0) - return ~0; + DBUG_RETURN(~0); const NdbTableImpl* table = & NdbTableImpl::getImpl(*aTable); Uint64 tupleId = getTupleIdFromNdb(table->m_tableId, cacheSize); - return tupleId; + DBUG_PRINT("info", ("value %u", tupleId)); + DBUG_RETURN(tupleId); } Uint64 @@ -756,39 +758,45 @@ Ndb::getTupleIdFromNdb(const char* aTableName, Uint32 cacheSize) Uint64 Ndb::getTupleIdFromNdb(Uint32 aTableId, Uint32 cacheSize) { + DBUG_ENTER("getTupleIdFromNdb"); if ( theFirstTupleId[aTableId] != theLastTupleId[aTableId] ) { theFirstTupleId[aTableId]++; - return theFirstTupleId[aTableId]; + DBUG_PRINT("info", ("next cached value %u", theFirstTupleId[aTableId])); + DBUG_RETURN(theFirstTupleId[aTableId]); } else // theFirstTupleId == theLastTupleId { - return opTupleIdOnNdb(aTableId, cacheSize, 0); + DBUG_PRINT("info",("reading %u values from database", + (cacheSize == 0) ? 1 : cacheSize)); + DBUG_RETURN(opTupleIdOnNdb(aTableId, (cacheSize == 0) ? 1 : cacheSize, 0)); } } Uint64 Ndb::readAutoIncrementValue(const char* aTableName) { - DEBUG_TRACE("readtAutoIncrementValue"); + DBUG_ENTER("readtAutoIncrementValue"); const NdbTableImpl* table = theDictionary->getTable(aTableName); if (table == 0) { theError= theDictionary->getNdbError(); - return ~0; + DBUG_RETURN(~0); } Uint64 tupleId = readTupleIdFromNdb(table->m_tableId); - return tupleId; + DBUG_PRINT("info", ("value %u", tupleId)); + DBUG_RETURN(tupleId); } Uint64 Ndb::readAutoIncrementValue(const NdbDictionary::Table * aTable) { - DEBUG_TRACE("readtAutoIncrementValue"); + DBUG_ENTER("readtAutoIncrementValue"); if (aTable == 0) - return ~0; + DBUG_RETURN(~0); const NdbTableImpl* table = & NdbTableImpl::getImpl(*aTable); Uint64 tupleId = readTupleIdFromNdb(table->m_tableId); - return tupleId; + DBUG_PRINT("info", ("value %u", tupleId)); + DBUG_RETURN(tupleId); } Uint64 diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 7025ac2cd1a..31b16d58b62 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -2920,7 +2920,11 @@ void ha_ndbcluster::start_bulk_insert(ha_rows rows) DBUG_PRINT("enter", ("rows: %d", (int)rows)); m_rows_inserted= 0; - m_rows_to_insert= rows; + if (rows == 0) + /* We don't know how many will be inserted, guess */ + m_rows_to_insert= m_autoincrement_prefetch; + else + m_rows_to_insert= rows; /* Calculate how many rows that should be inserted @@ -3929,6 +3933,7 @@ longlong ha_ndbcluster::get_auto_increment() DBUG_ENTER("get_auto_increment"); DBUG_PRINT("enter", ("m_tabname: %s", m_tabname)); Ndb *ndb= get_ndb(); + int cache_size= (m_rows_to_insert - m_rows_inserted < m_autoincrement_prefetch) ? m_rows_to_insert - m_rows_inserted From 780202f130f97a358d4cbce3388e840664daf176 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Thu, 7 Apr 2005 19:24:14 +0300 Subject: [PATCH 101/204] Moved some old test and added a new test to only be run with mysql-test-run --big Fixed warnings by valgrind for sum_distinct.test Enable buffered-record-reads after filesort for InnoDB tables with short primary key Enabled sort-with-data for MyISAM temporary files --- .bzrignore | 1 + client/mysqltest.c | 11 ++- mysql-test/include/big_test.inc | 4 + mysql-test/mysql-test-run.sh | 4 +- mysql-test/r/heap.result | 60 +++++++-------- mysql-test/r/innodb-big.result | 34 +++++++++ mysql-test/r/sum_distinct-big.result | 108 +++++++++++++++++++++++++++ mysql-test/r/sum_distinct.result | 106 -------------------------- mysql-test/t/heap.test | 6 +- mysql-test/t/innodb-big.test | 46 ++++++++++++ mysql-test/t/sum_distinct-big.test | 67 +++++++++++++++++ mysql-test/t/sum_distinct.test | 59 --------------- sql/filesort.cc | 33 ++++---- sql/ha_innodb.h | 1 - sql/handler.h | 24 ++++-- sql/mysql_priv.h | 2 +- sql/records.cc | 6 +- sql/sql_select.cc | 2 + 18 files changed, 346 insertions(+), 228 deletions(-) create mode 100644 mysql-test/include/big_test.inc create mode 100644 mysql-test/r/innodb-big.result create mode 100644 mysql-test/r/sum_distinct-big.result create mode 100644 mysql-test/t/innodb-big.test create mode 100644 mysql-test/t/sum_distinct-big.test diff --git a/.bzrignore b/.bzrignore index eae47b882d0..cfe38741074 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1109,3 +1109,4 @@ vio/viotest-ssl VC++Files/client/mysql_amd64.dsp client/mysqltestmanager-pwgen client/mysqltestmanagerc +tools/mysqltestmanager diff --git a/client/mysqltest.c b/client/mysqltest.c index 3386118014a..2b7000f0d88 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -645,6 +645,7 @@ int dyn_string_cmp(DYNAMIC_STRING* ds, const char* fname) { DBUG_PRINT("info",("Size differs: result size: %u file size: %u", ds->length, stat_info.st_size)); + DBUG_PRINT("info",("result: '%s'", ds->str)); DBUG_RETURN(2); } if (!(tmp = (char*) my_malloc(stat_info.st_size + 1, MYF(MY_WME)))) @@ -3623,8 +3624,8 @@ static void init_var_hash(MYSQL *mysql) if (hash_init(&var_hash, charset_info, 1024, 0, 0, get_var_key, var_free, MYF(0))) die("Variable hash initialization failed"); - if (opt_big_test) - my_hash_insert(&var_hash, (byte*) var_init(0,"BIG_TEST", 0, "1",0)); + my_hash_insert(&var_hash, (byte*) var_init(0,"BIG_TEST", 0, + (opt_big_test) ? "1" : "0", 0)); v= var_init(0,"MAX_TABLES", 0, (sizeof(ulong) == 4) ? "31" : "62",0); my_hash_insert(&var_hash, (byte*) v); v= var_init(0,"SERVER_VERSION", 0, mysql_get_server_info(mysql), 0); @@ -3793,6 +3794,12 @@ int main(int argc, char **argv) if (q->query == q->query_buf) q->query += q->first_word_len + 1; display_result_vertically= (q->type==Q_QUERY_VERTICAL); + if (save_file[0]) + { + strmov(q->record_file,save_file); + q->require_file=require_file; + save_file[0]=0; + } error|= run_query(&cur_con->mysql, q, QUERY_REAP|QUERY_SEND); display_result_vertically= old_display_result_vertically; break; diff --git a/mysql-test/include/big_test.inc b/mysql-test/include/big_test.inc new file mode 100644 index 00000000000..6b149540c96 --- /dev/null +++ b/mysql-test/include/big_test.inc @@ -0,0 +1,4 @@ +--require r/big_test.require +disable_query_log; +eval select $BIG_TEST as using_big_test; +enable_query_log; diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 0ad8536f579..5fb4d99d4f4 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -1179,7 +1179,7 @@ start_master() --default-character-set=$CHARACTER_SET \ --tmpdir=$MYSQL_TMP_DIR \ --language=$LANGUAGE \ - --innodb_data_file_path=ibdata1:50M \ + --innodb_data_file_path=ibdata1:128M:autoextend \ --open-files-limit=1024 \ $MASTER_40_ARGS \ $SMALL_SERVER \ @@ -1200,7 +1200,7 @@ start_master() $USE_NDBCLUSTER \ --tmpdir=$MYSQL_TMP_DIR \ --language=$LANGUAGE \ - --innodb_data_file_path=ibdata1:50M \ + --innodb_data_file_path=ibdata1:128M:autoextend \ $MASTER_40_ARGS \ $SMALL_SERVER \ $EXTRA_MASTER_OPT $EXTRA_MASTER_MYSQLD_OPT \ diff --git a/mysql-test/r/heap.result b/mysql-test/r/heap.result index 631bd8c713c..702daf98214 100644 --- a/mysql-test/r/heap.result +++ b/mysql-test/r/heap.result @@ -436,30 +436,30 @@ f 10 g 10 h 10 i 10 -select sql_big_result v,count(t) from t1 group by v limit 10; -v count(t) +select sql_big_result trim(v),count(t) from t1 group by v limit 10; +trim(v) count(t) a 1 -a 10 -b 10 -c 10 -d 10 -e 10 -f 10 -g 10 +a 10 +b 10 +c 10 +d 10 +e 10 +f 10 +g 10 h 10 -i 10 -select sql_big_result v,count(c) from t1 group by v limit 10; -v count(c) +i 10 +select sql_big_result trim(v),count(c) from t1 group by v limit 10; +trim(v) count(c) a 1 -a 10 -b 10 -c 10 -d 10 -e 10 -f 10 -g 10 +a 10 +b 10 +c 10 +d 10 +e 10 +f 10 +g 10 h 10 -i 10 +i 10 select c,count(*) from t1 group by c limit 10; c count(*) a 1 @@ -520,18 +520,18 @@ f 10 g 10 h 10 i 10 -select sql_big_result t,count(t) from t1 group by t limit 10; -t count(t) +select sql_big_result trim(t),count(t) from t1 group by t limit 10; +trim(t) count(t) a 1 -a 10 -b 10 -c 10 -d 10 -e 10 -f 10 -g 10 +a 10 +b 10 +c 10 +d 10 +e 10 +f 10 +g 10 h 10 -i 10 +i 10 drop table t1; create table t1 (a char(10), unique (a)); insert into t1 values ('a'); diff --git a/mysql-test/r/innodb-big.result b/mysql-test/r/innodb-big.result new file mode 100644 index 00000000000..19204b7cc65 --- /dev/null +++ b/mysql-test/r/innodb-big.result @@ -0,0 +1,34 @@ +DROP TABLE IF EXISTS t1, t2, t3, t4; +CREATE TABLE t1 (id INTEGER) ENGINE=MYISAM; +CREATE TABLE t2 (id INTEGER primary key) ENGINE=INNODB; +CREATE TABLE t3 (a char(32) primary key,id INTEGER) ENGINE=INNODB; +CREATE TABLE t4 (a char(32) primary key,id INTEGER) ENGINE=MYISAM; +INSERT INTO t1 (id) VALUES (1); +INSERT INTO t1 SELECT id+1 FROM t1; +INSERT INTO t1 SELECT id+2 FROM t1; +INSERT INTO t1 SELECT id+4 FROM t1; +INSERT INTO t1 SELECT id+8 FROM t1; +INSERT INTO t1 SELECT id+16 FROM t1; +INSERT INTO t1 SELECT id+32 FROM t1; +INSERT INTO t1 SELECT id+64 FROM t1; +INSERT INTO t1 SELECT id+128 FROM t1; +INSERT INTO t1 SELECT id+256 FROM t1; +INSERT INTO t1 SELECT id+512 FROM t1; +INSERT INTO t1 SELECT id+1024 FROM t1; +INSERT INTO t1 SELECT id+2048 FROM t1; +INSERT INTO t1 SELECT id+4096 FROM t1; +INSERT INTO t1 SELECT id+8192 FROM t1; +INSERT INTO t1 SELECT id+16384 FROM t1; +INSERT INTO t1 SELECT id+32768 FROM t1; +INSERT INTO t1 SELECT id+65536 FROM t1; +INSERT INTO t1 SELECT id+131072 FROM t1; +INSERT INTO t1 SELECT id+262144 FROM t1; +INSERT INTO t1 SELECT id+524288 FROM t1; +INSERT INTO t1 SELECT id+1048576 FROM t1; +INSERT INTO t2 SELECT * FROM t1; +INSERT INTO t3 SELECT concat(id),id from t2 ORDER BY -id; +INSERT INTO t4 SELECT * from t3 ORDER BY concat(a); +select sum(id) from t3; +sum(id) +2199024304128 +drop table t1,t2,t3,t4; diff --git a/mysql-test/r/sum_distinct-big.result b/mysql-test/r/sum_distinct-big.result new file mode 100644 index 00000000000..06bfc6b1f78 --- /dev/null +++ b/mysql-test/r/sum_distinct-big.result @@ -0,0 +1,108 @@ +using_big_test +0 +CREATE TABLE t1 (id INTEGER); +CREATE TABLE t2 (id INTEGER); +INSERT INTO t1 (id) VALUES (1), (1), (1),(1); +INSERT INTO t1 (id) SELECT id FROM t1; +/* 8 */ +INSERT INTO t1 (id) SELECT id FROM t1; +/* 12 */ +INSERT INTO t1 (id) SELECT id FROM t1; +/* 16 */ +INSERT INTO t1 (id) SELECT id FROM t1; +/* 20 */ +INSERT INTO t1 (id) SELECT id FROM t1; +/* 24 */ +INSERT INTO t1 SELECT id+1 FROM t1; +INSERT INTO t1 SELECT id+2 FROM t1; +INSERT INTO t1 SELECT id+4 FROM t1; +INSERT INTO t1 SELECT id+8 FROM t1; +INSERT INTO t1 SELECT id+16 FROM t1; +INSERT INTO t1 SELECT id+32 FROM t1; +INSERT INTO t1 SELECT id+64 FROM t1; +INSERT INTO t1 SELECT id+128 FROM t1; +INSERT INTO t1 SELECT id+256 FROM t1; +INSERT INTO t1 SELECT id+512 FROM t1; +SELECT AVG(DISTINCT id) FROM t1 GROUP BY id % 13; +AVG(DISTINCT id) +513.5000 +508.0000 +509.0000 +510.0000 +511.0000 +512.0000 +513.0000 +514.0000 +515.0000 +516.0000 +517.0000 +511.5000 +512.5000 +SELECT SUM(DISTINCT id)/COUNT(DISTINCT id) FROM t1 GROUP BY id % 13; +SUM(DISTINCT id)/COUNT(DISTINCT id) +513.50000 +508.00000 +509.00000 +510.00000 +511.00000 +512.00000 +513.00000 +514.00000 +515.00000 +516.00000 +517.00000 +511.50000 +512.50000 +INSERT INTO t1 SELECT id+1024 FROM t1; +INSERT INTO t1 SELECT id+2048 FROM t1; +INSERT INTO t1 SELECT id+4096 FROM t1; +INSERT INTO t1 SELECT id+8192 FROM t1; +INSERT INTO t2 SELECT id FROM t1 ORDER BY id*rand(); +SELECT SUM(DISTINCT id) sm FROM t1; +sm +134225920 +SELECT SUM(DISTINCT id) sm FROM t2; +sm +134225920 +SELECT SUM(DISTINCT id) sm FROM t1 group by id % 13; +sm +10327590 +10328851 +10330112 +10331373 +10332634 +10317510 +10318770 +10320030 +10321290 +10322550 +10323810 +10325070 +10326330 +SET max_heap_table_size=16384; +SHOW variables LIKE 'max_heap_table_size'; +Variable_name Value +max_heap_table_size 16384 +SELECT SUM(DISTINCT id) sm FROM t1; +sm +134225920 +SELECT SUM(DISTINCT id) sm FROM t2; +sm +134225920 +SELECT SUM(DISTINCT id) sm FROM t1 GROUP BY id % 13; +sm +10327590 +10328851 +10330112 +10331373 +10332634 +10317510 +10318770 +10320030 +10321290 +10322550 +10323810 +10325070 +10326330 +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/r/sum_distinct.result b/mysql-test/r/sum_distinct.result index 0591943e800..c615817f52d 100644 --- a/mysql-test/r/sum_distinct.result +++ b/mysql-test/r/sum_distinct.result @@ -95,109 +95,3 @@ SELECT SUM(DISTINCT id % 11) FROM t1; SUM(DISTINCT id % 11) 55 DROP TABLE t1; -CREATE TABLE t1 (id INTEGER); -CREATE TABLE t2 (id INTEGER); -INSERT INTO t1 (id) VALUES (1), (1), (1),(1); -INSERT INTO t1 (id) SELECT id FROM t1; -/* 8 */ -INSERT INTO t1 (id) SELECT id FROM t1; -/* 12 */ -INSERT INTO t1 (id) SELECT id FROM t1; -/* 16 */ -INSERT INTO t1 (id) SELECT id FROM t1; -/* 20 */ -INSERT INTO t1 (id) SELECT id FROM t1; -/* 24 */ -INSERT INTO t1 SELECT id+1 FROM t1; -INSERT INTO t1 SELECT id+2 FROM t1; -INSERT INTO t1 SELECT id+4 FROM t1; -INSERT INTO t1 SELECT id+8 FROM t1; -INSERT INTO t1 SELECT id+16 FROM t1; -INSERT INTO t1 SELECT id+32 FROM t1; -INSERT INTO t1 SELECT id+64 FROM t1; -INSERT INTO t1 SELECT id+128 FROM t1; -INSERT INTO t1 SELECT id+256 FROM t1; -INSERT INTO t1 SELECT id+512 FROM t1; -SELECT AVG(DISTINCT id) FROM t1 GROUP BY id % 13; -AVG(DISTINCT id) -513.5000 -508.0000 -509.0000 -510.0000 -511.0000 -512.0000 -513.0000 -514.0000 -515.0000 -516.0000 -517.0000 -511.5000 -512.5000 -SELECT SUM(DISTINCT id)/COUNT(DISTINCT id) FROM t1 GROUP BY id % 13; -SUM(DISTINCT id)/COUNT(DISTINCT id) -513.50000 -508.00000 -509.00000 -510.00000 -511.00000 -512.00000 -513.00000 -514.00000 -515.00000 -516.00000 -517.00000 -511.50000 -512.50000 -INSERT INTO t1 SELECT id+1024 FROM t1; -INSERT INTO t1 SELECT id+2048 FROM t1; -INSERT INTO t1 SELECT id+4096 FROM t1; -INSERT INTO t1 SELECT id+8192 FROM t1; -INSERT INTO t2 SELECT id FROM t1 ORDER BY id*rand(); -SELECT SUM(DISTINCT id) sm FROM t1; -sm -134225920 -SELECT SUM(DISTINCT id) sm FROM t2; -sm -134225920 -SELECT SUM(DISTINCT id) sm FROM t1 group by id % 13; -sm -10327590 -10328851 -10330112 -10331373 -10332634 -10317510 -10318770 -10320030 -10321290 -10322550 -10323810 -10325070 -10326330 -SET max_heap_table_size=16384; -SHOW variables LIKE 'max_heap_table_size'; -Variable_name Value -max_heap_table_size 16384 -SELECT SUM(DISTINCT id) sm FROM t1; -sm -134225920 -SELECT SUM(DISTINCT id) sm FROM t2; -sm -134225920 -SELECT SUM(DISTINCT id) sm FROM t1 GROUP BY id % 13; -sm -10327590 -10328851 -10330112 -10331373 -10332634 -10317510 -10318770 -10320030 -10321290 -10322550 -10323810 -10325070 -10326330 -DROP TABLE t1; -DROP TABLE t2; diff --git a/mysql-test/t/heap.test b/mysql-test/t/heap.test index c36474bda30..ca4a8beb527 100644 --- a/mysql-test/t/heap.test +++ b/mysql-test/t/heap.test @@ -280,14 +280,14 @@ explain select * from t1 where v='a'; select v,count(*) from t1 group by v limit 10; select v,count(t) from t1 group by v limit 10; select v,count(c) from t1 group by v limit 10; -select sql_big_result v,count(t) from t1 group by v limit 10; -select sql_big_result v,count(c) from t1 group by v limit 10; +select sql_big_result trim(v),count(t) from t1 group by v limit 10; +select sql_big_result trim(v),count(c) from t1 group by v limit 10; select c,count(*) from t1 group by c limit 10; select c,count(t) from t1 group by c limit 10; select sql_big_result c,count(t) from t1 group by c limit 10; select t,count(*) from t1 group by t limit 10; select t,count(t) from t1 group by t limit 10; -select sql_big_result t,count(t) from t1 group by t limit 10; +select sql_big_result trim(t),count(t) from t1 group by t limit 10; drop table t1; # diff --git a/mysql-test/t/innodb-big.test b/mysql-test/t/innodb-big.test new file mode 100644 index 00000000000..ade69ffdb45 --- /dev/null +++ b/mysql-test/t/innodb-big.test @@ -0,0 +1,46 @@ +# +# Test some things that takes a long time + +-- source include/big_test.inc +-- source include/have_innodb.inc + +--disable_warnings +DROP TABLE IF EXISTS t1, t2, t3, t4; +--enable_warnings + +# +# Test test how filesort and buffered-record-reads works with innodb +# + +CREATE TABLE t1 (id INTEGER) ENGINE=MYISAM; +CREATE TABLE t2 (id INTEGER primary key) ENGINE=INNODB; +CREATE TABLE t3 (a char(32) primary key,id INTEGER) ENGINE=INNODB; +CREATE TABLE t4 (a char(32) primary key,id INTEGER) ENGINE=MYISAM; + +INSERT INTO t1 (id) VALUES (1); +INSERT INTO t1 SELECT id+1 FROM t1; +INSERT INTO t1 SELECT id+2 FROM t1; +INSERT INTO t1 SELECT id+4 FROM t1; +INSERT INTO t1 SELECT id+8 FROM t1; +INSERT INTO t1 SELECT id+16 FROM t1; +INSERT INTO t1 SELECT id+32 FROM t1; +INSERT INTO t1 SELECT id+64 FROM t1; +INSERT INTO t1 SELECT id+128 FROM t1; +INSERT INTO t1 SELECT id+256 FROM t1; +INSERT INTO t1 SELECT id+512 FROM t1; +INSERT INTO t1 SELECT id+1024 FROM t1; +INSERT INTO t1 SELECT id+2048 FROM t1; +INSERT INTO t1 SELECT id+4096 FROM t1; +INSERT INTO t1 SELECT id+8192 FROM t1; +INSERT INTO t1 SELECT id+16384 FROM t1; +INSERT INTO t1 SELECT id+32768 FROM t1; +INSERT INTO t1 SELECT id+65536 FROM t1; +INSERT INTO t1 SELECT id+131072 FROM t1; +INSERT INTO t1 SELECT id+262144 FROM t1; +INSERT INTO t1 SELECT id+524288 FROM t1; +INSERT INTO t1 SELECT id+1048576 FROM t1; +INSERT INTO t2 SELECT * FROM t1; +INSERT INTO t3 SELECT concat(id),id from t2 ORDER BY -id; +INSERT INTO t4 SELECT * from t3 ORDER BY concat(a); +select sum(id) from t3; +drop table t1,t2,t3,t4; diff --git a/mysql-test/t/sum_distinct-big.test b/mysql-test/t/sum_distinct-big.test new file mode 100644 index 00000000000..0859f4b3d89 --- /dev/null +++ b/mysql-test/t/sum_distinct-big.test @@ -0,0 +1,67 @@ +# +# Various tests for SUM(DISTINCT ...) +# + +--source include/big_test.inc +--disable_warnings +DROP TABLE IF EXISTS t1, t2; +--enable_warnings + +# +# Test the case when distinct values doesn't fit in memory and +# filesort is used (see uniques.cc:merge_walk) +# + +CREATE TABLE t1 (id INTEGER); +CREATE TABLE t2 (id INTEGER); + +INSERT INTO t1 (id) VALUES (1), (1), (1),(1); +INSERT INTO t1 (id) SELECT id FROM t1; /* 8 */ +INSERT INTO t1 (id) SELECT id FROM t1; /* 12 */ +INSERT INTO t1 (id) SELECT id FROM t1; /* 16 */ +INSERT INTO t1 (id) SELECT id FROM t1; /* 20 */ +INSERT INTO t1 (id) SELECT id FROM t1; /* 24 */ +INSERT INTO t1 SELECT id+1 FROM t1; +INSERT INTO t1 SELECT id+2 FROM t1; +INSERT INTO t1 SELECT id+4 FROM t1; +INSERT INTO t1 SELECT id+8 FROM t1; +INSERT INTO t1 SELECT id+16 FROM t1; +INSERT INTO t1 SELECT id+32 FROM t1; +INSERT INTO t1 SELECT id+64 FROM t1; +INSERT INTO t1 SELECT id+128 FROM t1; +INSERT INTO t1 SELECT id+256 FROM t1; +INSERT INTO t1 SELECT id+512 FROM t1; + +# Just test that AVG(DISTINCT) is there +SELECT AVG(DISTINCT id) FROM t1 GROUP BY id % 13; +SELECT SUM(DISTINCT id)/COUNT(DISTINCT id) FROM t1 GROUP BY id % 13; + +INSERT INTO t1 SELECT id+1024 FROM t1; +INSERT INTO t1 SELECT id+2048 FROM t1; +INSERT INTO t1 SELECT id+4096 FROM t1; +INSERT INTO t1 SELECT id+8192 FROM t1; +INSERT INTO t2 SELECT id FROM t1 ORDER BY id*rand(); + +# SELECT '++++++++++++++++++++++++++++++++++++++++++++++++++'; + +SELECT SUM(DISTINCT id) sm FROM t1; +SELECT SUM(DISTINCT id) sm FROM t2; +SELECT SUM(DISTINCT id) sm FROM t1 group by id % 13; + +# this limit for max_heap_table_size is set to force testing the case, when +# all distinct sum values can not fit in memory and must be stored in a +# temporary table + +SET max_heap_table_size=16384; + +# to check that max_heap_table_size was actually set (hard limit for minimum +# max_heap_table_size is set in mysqld.cc): + +SHOW variables LIKE 'max_heap_table_size'; + +SELECT SUM(DISTINCT id) sm FROM t1; +SELECT SUM(DISTINCT id) sm FROM t2; +SELECT SUM(DISTINCT id) sm FROM t1 GROUP BY id % 13; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/t/sum_distinct.test b/mysql-test/t/sum_distinct.test index 3b9f12354e8..c58155a8e25 100644 --- a/mysql-test/t/sum_distinct.test +++ b/mysql-test/t/sum_distinct.test @@ -93,62 +93,3 @@ SELECT SUM(DISTINCT id) FROM t1; SELECT SUM(DISTINCT id % 11) FROM t1; DROP TABLE t1; - -# -# Test the case when distinct values doesn't fit in memory and -# filesort is used (see uniques.cc:merge_walk) -# - -CREATE TABLE t1 (id INTEGER); -CREATE TABLE t2 (id INTEGER); - -INSERT INTO t1 (id) VALUES (1), (1), (1),(1); -INSERT INTO t1 (id) SELECT id FROM t1; /* 8 */ -INSERT INTO t1 (id) SELECT id FROM t1; /* 12 */ -INSERT INTO t1 (id) SELECT id FROM t1; /* 16 */ -INSERT INTO t1 (id) SELECT id FROM t1; /* 20 */ -INSERT INTO t1 (id) SELECT id FROM t1; /* 24 */ -INSERT INTO t1 SELECT id+1 FROM t1; -INSERT INTO t1 SELECT id+2 FROM t1; -INSERT INTO t1 SELECT id+4 FROM t1; -INSERT INTO t1 SELECT id+8 FROM t1; -INSERT INTO t1 SELECT id+16 FROM t1; -INSERT INTO t1 SELECT id+32 FROM t1; -INSERT INTO t1 SELECT id+64 FROM t1; -INSERT INTO t1 SELECT id+128 FROM t1; -INSERT INTO t1 SELECT id+256 FROM t1; -INSERT INTO t1 SELECT id+512 FROM t1; - -# Just test that AVG(DISTINCT) is there -SELECT AVG(DISTINCT id) FROM t1 GROUP BY id % 13; -SELECT SUM(DISTINCT id)/COUNT(DISTINCT id) FROM t1 GROUP BY id % 13; - -INSERT INTO t1 SELECT id+1024 FROM t1; -INSERT INTO t1 SELECT id+2048 FROM t1; -INSERT INTO t1 SELECT id+4096 FROM t1; -INSERT INTO t1 SELECT id+8192 FROM t1; -INSERT INTO t2 SELECT id FROM t1 ORDER BY id*rand(); - -# SELECT '++++++++++++++++++++++++++++++++++++++++++++++++++'; - -SELECT SUM(DISTINCT id) sm FROM t1; -SELECT SUM(DISTINCT id) sm FROM t2; -SELECT SUM(DISTINCT id) sm FROM t1 group by id % 13; - -# this limit for max_heap_table_size is set to force testing the case, when -# all distinct sum values can not fit in memory and must be stored in a -# temporary table - -SET max_heap_table_size=16384; - -# to check that max_heap_table_size was actually set (hard limit for minimum -# max_heap_table_size is set in mysqld.cc): - -SHOW variables LIKE 'max_heap_table_size'; - -SELECT SUM(DISTINCT id) sm FROM t1; -SELECT SUM(DISTINCT id) sm FROM t2; -SELECT SUM(DISTINCT id) sm FROM t1 GROUP BY id % 13; - -DROP TABLE t1; -DROP TABLE t2; diff --git a/sql/filesort.cc b/sql/filesort.cc index c50f1daa6ef..30ebd8d59e1 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -127,7 +127,8 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, param.ref_length= table->file->ref_length; param.addon_field= 0; param.addon_length= 0; - if (!(table->s->tmp_table || table->fulltext_searched)) + if (!(table->file->table_flags() & HA_FAST_KEY_READ) && + !table->fulltext_searched) { /* Get the descriptors of all fields whose values are appended @@ -1301,27 +1302,29 @@ get_addon_fields(THD *thd, Field **ptabfield, uint sortlength, uint *plength) uint length= 0; uint fields= 0; uint null_fields= 0; - - /* - If there is a reference to a field in the query add it - to the the set of appended fields. - Note for future refinement: - This this a too strong condition. - Actually we need only the fields referred in the - result set. And for some of them it makes sense to use - the values directly from sorted fields. + query_id_t query_id= thd->query_id; + /* + If there is a reference to a field in the query add it + to the the set of appended fields. + Note for future refinement: + This this a too strong condition. + Actually we need only the fields referred in the + result set. And for some of them it makes sense to use + the values directly from sorted fields. */ *plength= 0; + /* - The following statement is added to avoid sorting in alter_table. - The fact is the filter 'field->query_id != thd->query_id' - doesn't work for alter table + The following statement is added to avoid sorting in alter_table. + The fact is the filter 'field->query_id != thd->query_id' + doesn't work for alter table */ - if (thd->lex->sql_command != SQLCOM_SELECT) + if (thd->lex->sql_command != SQLCOM_SELECT && + thd->lex->sql_command != SQLCOM_INSERT_SELECT) return 0; for (pfield= ptabfield; (field= *pfield) ; pfield++) { - if (field->query_id != thd->query_id) + if (field->query_id != query_id) continue; if (field->flags & BLOB_FLAG) return 0; diff --git a/sql/ha_innodb.h b/sql/ha_innodb.h index 6ad385ae848..a5714769bc5 100644 --- a/sql/ha_innodb.h +++ b/sql/ha_innodb.h @@ -85,7 +85,6 @@ class ha_innobase: public handler ha_innobase(TABLE *table): handler(table), int_table_flags(HA_REC_NOT_IN_SEQ | HA_NULL_IN_KEY | - HA_FAST_KEY_READ | HA_CAN_INDEX_BLOBS | HA_CAN_SQL_HANDLER | HA_NOT_EXACT_COUNT | diff --git a/sql/handler.h b/sql/handler.h index 3751af29194..c9a7d17e6dc 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -47,14 +47,22 @@ #define HA_ADMIN_WRONG_CHECKSUM -8 /* Bits in table_flags() to show what database can do */ -#define HA_READ_RND_SAME (1 << 0) /* can switch index during the scan - with ::rnd_same() - not used yet. - see mi_rsame/heap_rsame/myrg_rsame */ + +/* + Can switch index during the scan with ::rnd_same() - not used yet. + see mi_rsame/heap_rsame/myrg_rsame +*/ +#define HA_READ_RND_SAME (1 << 0) #define HA_TABLE_SCAN_ON_INDEX (1 << 2) /* No separate data/index file */ #define HA_REC_NOT_IN_SEQ (1 << 3) /* ha_info don't return recnumber; It returns a position to ha_r_rnd */ #define HA_CAN_GEOMETRY (1 << 4) -#define HA_FAST_KEY_READ (1 << 5) /* no need for a record cache in filesort */ +/* + Reading keys in random order is as fast as reading keys in sort order + (Used in records.cc to decide if we should use a record cache and by + filesort to decide if we should sort key + data or key + pointer-to-row +*/ +#define HA_FAST_KEY_READ (1 << 5) #define HA_NULL_IN_KEY (1 << 7) /* One can have keys with NULL */ #define HA_DUPP_POS (1 << 8) /* ha_position() gives dup row */ #define HA_NO_BLOBS (1 << 9) /* Doesn't support blobs */ @@ -62,9 +70,11 @@ #define HA_AUTO_PART_KEY (1 << 11) /* auto-increment in multi-part key */ #define HA_REQUIRE_PRIMARY_KEY (1 << 12) /* .. and can't create a hidden one */ #define HA_NOT_EXACT_COUNT (1 << 13) -#define HA_CAN_INSERT_DELAYED (1 << 14) /* only handlers with table-level locks - need no special code to support - INSERT DELAYED */ +/* + INSERT_DELAYED only works with handlers that uses MySQL internal table + level locks +*/ +#define HA_CAN_INSERT_DELAYED (1 << 14) #define HA_PRIMARY_KEY_IN_READ_INDEX (1 << 15) #define HA_NOT_DELETE_WITH_CACHE (1 << 18) #define HA_NO_PREFIX_CHAR_KEYS (1 << 20) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 1b1da6772af..a854f8c45d3 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -116,7 +116,7 @@ extern CHARSET_INFO *national_charset_info, *table_alias_charset; The following parameters is to decide when to use an extra cache to optimise seeks when reading a big table in sorted order */ -#define MIN_FILE_LENGTH_TO_USE_ROW_CACHE (16L*1024*1024) +#define MIN_FILE_LENGTH_TO_USE_ROW_CACHE (10L*1024*1024) #define MIN_ROWS_TO_USE_TABLE_CACHE 100 #define MIN_ROWS_TO_USE_BULK_INSERT 100 diff --git a/sql/records.cc b/sql/records.cc index b71bcf70865..9b05dc3e291 100644 --- a/sql/records.cc +++ b/sql/records.cc @@ -89,7 +89,8 @@ void init_read_record(READ_RECORD *info,THD *thd, TABLE *table, (ulonglong) MIN_FILE_LENGTH_TO_USE_ROW_CACHE && info->io_cache->end_of_file/info->ref_length * table->s->reclength > (my_off_t) MIN_ROWS_TO_USE_TABLE_CACHE && - !table->s->blob_fields) + !table->s->blob_fields && + info->ref_length <= MAX_REFLENGTH) { if (! init_rr_cache(thd, info)) { @@ -348,7 +349,8 @@ static int init_rr_cache(THD *thd, READ_RECORD *info) MYF(0)))) DBUG_RETURN(1); #ifdef HAVE_purify - bzero(info->cache,rec_cache_size); // Avoid warnings in qsort + // Avoid warnings in qsort + bzero(info->cache,rec_cache_size+info->cache_records* info->struct_length+1); #endif DBUG_PRINT("info",("Allocated buffert for %d records",info->cache_records)); info->read_positions=info->cache+rec_cache_size; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index baf2ef09d2b..cbae2848094 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -8026,6 +8026,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, */ (*argp)->maybe_null=1; } + new_field->query_id= thd->query_id; } } } @@ -8072,6 +8073,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, group_null_items++; new_field->flags|= GROUP_FLAG; } + new_field->query_id= thd->query_id; *(reg_field++) =new_field; } if (!--hidden_field_count) From 43d926029f31206c01e0faea0ac3ccbd8d1f05c5 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Thu, 7 Apr 2005 09:51:56 -0700 Subject: [PATCH 102/204] Add cp932 and eucjpms character sets to Windows build. (Bug #9479) --- VC++Files/client/mysqlclient.dsp | 8 ++++++++ VC++Files/client/mysqlclient_ia64.dsp | 8 ++++++++ VC++Files/libmysql/libmysql.dsp | 8 ++++++++ VC++Files/libmysql/libmysql_ia64.dsp | 8 ++++++++ VC++Files/strings/strings.dsp | 8 ++++++++ VC++Files/strings/strings_ia64.dsp | 8 ++++++++ include/config-win.h | 2 ++ 7 files changed, 50 insertions(+) diff --git a/VC++Files/client/mysqlclient.dsp b/VC++Files/client/mysqlclient.dsp index 75008858e55..157c576b187 100644 --- a/VC++Files/client/mysqlclient.dsp +++ b/VC++Files/client/mysqlclient.dsp @@ -147,6 +147,10 @@ SOURCE="..\strings\ctype-bin.c" # End Source File # Begin Source File +SOURCE="..\strings\ctype-cp932.c" +# End Source File +# Begin Source File + SOURCE="..\strings\ctype-czech.c" # End Source File # Begin Source File @@ -155,6 +159,10 @@ SOURCE="..\strings\ctype-euc_kr.c" # End Source File # Begin Source File +SOURCE="..\strings\ctype-eucjpms.c" +# End Source File +# Begin Source File + SOURCE="..\strings\ctype-extra.c" # End Source File # Begin Source File diff --git a/VC++Files/client/mysqlclient_ia64.dsp b/VC++Files/client/mysqlclient_ia64.dsp index e91245c12b2..a69c5cf58af 100644 --- a/VC++Files/client/mysqlclient_ia64.dsp +++ b/VC++Files/client/mysqlclient_ia64.dsp @@ -147,6 +147,10 @@ SOURCE="..\strings\ctype-bin.c" # End Source File # Begin Source File +SOURCE="..\strings\ctype-cp932.c" +# End Source File +# Begin Source File + SOURCE="..\strings\ctype-czech.c" # End Source File # Begin Source File @@ -155,6 +159,10 @@ SOURCE="..\strings\ctype-euc_kr.c" # End Source File # Begin Source File +SOURCE="..\strings\ctype-eucjpms.c" +# End Source File +# Begin Source File + SOURCE="..\strings\ctype-extra.c" # End Source File # Begin Source File diff --git a/VC++Files/libmysql/libmysql.dsp b/VC++Files/libmysql/libmysql.dsp index ce81a3b7435..34c479c73b4 100644 --- a/VC++Files/libmysql/libmysql.dsp +++ b/VC++Files/libmysql/libmysql.dsp @@ -139,6 +139,10 @@ SOURCE="..\strings\ctype-bin.c" # End Source File # Begin Source File +SOURCE="..\strings\ctype-cp932.c" +# End Source File +# Begin Source File + SOURCE="..\strings\ctype-czech.c" # End Source File # Begin Source File @@ -147,6 +151,10 @@ SOURCE="..\strings\ctype-euc_kr.c" # End Source File # Begin Source File +SOURCE="..\strings\ctype-eucjpms.c" +# End Source File +# Begin Source File + SOURCE="..\strings\ctype-extra.c" # End Source File # Begin Source File diff --git a/VC++Files/libmysql/libmysql_ia64.dsp b/VC++Files/libmysql/libmysql_ia64.dsp index 4c4776dfc2f..fa851cb81c5 100644 --- a/VC++Files/libmysql/libmysql_ia64.dsp +++ b/VC++Files/libmysql/libmysql_ia64.dsp @@ -138,6 +138,10 @@ SOURCE="..\strings\ctype-bin.c" # End Source File # Begin Source File +SOURCE="..\strings\ctype-cp932.c" +# End Source File +# Begin Source File + SOURCE="..\strings\ctype-czech.c" # End Source File # Begin Source File @@ -146,6 +150,10 @@ SOURCE="..\strings\ctype-euc_kr.c" # End Source File # Begin Source File +SOURCE="..\strings\ctype-eucjpms.c" +# End Source File +# Begin Source File + SOURCE="..\strings\ctype-extra.c" # End Source File # Begin Source File diff --git a/VC++Files/strings/strings.dsp b/VC++Files/strings/strings.dsp index 340617344f2..320cdaf2132 100644 --- a/VC++Files/strings/strings.dsp +++ b/VC++Files/strings/strings.dsp @@ -113,10 +113,18 @@ SOURCE=".\ctype-bin.c" # End Source File # Begin Source File +SOURCE=".\ctype-cp932.c" +# End Source File +# Begin Source File + SOURCE=".\ctype-czech.c" # End Source File # Begin Source File +SOURCE=".\ctype-eucjpms.c" +# End Source File +# Begin Source File + SOURCE=".\ctype-euc_kr.c" # End Source File # Begin Source File diff --git a/VC++Files/strings/strings_ia64.dsp b/VC++Files/strings/strings_ia64.dsp index 6449b2b1355..a34a238dfdc 100644 --- a/VC++Files/strings/strings_ia64.dsp +++ b/VC++Files/strings/strings_ia64.dsp @@ -112,6 +112,10 @@ SOURCE=".\ctype-bin.c" # End Source File # Begin Source File +SOURCE=".\ctype-cp932.c" +# End Source File +# Begin Source File + SOURCE=".\ctype-czech.c" # End Source File # Begin Source File @@ -120,6 +124,10 @@ SOURCE=".\ctype-euc_kr.c" # End Source File # Begin Source File +SOURCE=".\ctype-eucjpms.c" +# End Source File +# Begin Source File + SOURCE=".\ctype-extra.c" # End Source File # Begin Source File diff --git a/include/config-win.h b/include/config-win.h index df0530fbef3..bc392ce73d8 100644 --- a/include/config-win.h +++ b/include/config-win.h @@ -378,6 +378,7 @@ inline double ulonglong2double(ulonglong value) /* #undef HAVE_CHARSET_armscii8 */ /* #undef HAVE_CHARSET_ascii */ #define HAVE_CHARSET_big5 1 +#define HAVE_CHARSET_cp932 #define HAVE_CHARSET_cp1250 1 /* #undef HAVE_CHARSET_cp1251 */ /* #undef HAVE_CHARSET_cp1256 */ @@ -386,6 +387,7 @@ inline double ulonglong2double(ulonglong value) /* #undef HAVE_CHARSET_cp852 */ /* #undef HAVE_CHARSET_cp866 */ /* #undef HAVE_CHARSET_dec8 */ +#define HAVE_CHARSET_eucjpms 1 #define HAVE_CHARSET_euckr 1 #define HAVE_CHARSET_gb2312 1 #define HAVE_CHARSET_gbk 1 From 8327593bfd9fd7ad7161f2a0422e6091169ad422 Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Thu, 7 Apr 2005 19:48:00 +0200 Subject: [PATCH 103/204] Merge --- mysql-test/r/ndb_basic.result | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/mysql-test/r/ndb_basic.result b/mysql-test/r/ndb_basic.result index e1aa045d16e..e10d7e5a095 100644 --- a/mysql-test/r/ndb_basic.result +++ b/mysql-test/r/ndb_basic.result @@ -607,3 +607,33 @@ primary key (a)) engine=ndb max_rows=1; drop table t1; +create table t1 +(counter int(64) NOT NULL auto_increment, +datavalue char(40) default 'XXXX', +primary key (counter) +) ENGINE=ndbcluster; +insert into t1 (datavalue) values ('newval'); +insert into t1 (datavalue) values ('newval'); +select * from t1 order by counter; +counter datavalue +1 newval +2 newval +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +select * from t1 order by counter; +counter datavalue +1 newval +2 newval +3 newval +4 newval +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +select * from t1 order by counter; +counter datavalue +1 newval +2 newval +3 newval +4 newval +35 newval +36 newval +37 newval +38 newval +drop table t1; From b716302860f5f6b97a2b2e2105c0b794caf8c487 Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Thu, 7 Apr 2005 20:08:01 +0200 Subject: [PATCH 104/204] Fix for Bug #9675 Auto-increment not working with INSERT..SELECT and NDB storage, post review fix --- sql/ha_ndbcluster.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 31b16d58b62..4e1439bc680 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -3933,7 +3933,10 @@ longlong ha_ndbcluster::get_auto_increment() DBUG_ENTER("get_auto_increment"); DBUG_PRINT("enter", ("m_tabname: %s", m_tabname)); Ndb *ndb= get_ndb(); - + + if (m_rows_inserted > m_rows_to_insert) + /* We guessed too low */ + m_rows_to_insert+= m_autoincrement_prefetch; int cache_size= (m_rows_to_insert - m_rows_inserted < m_autoincrement_prefetch) ? m_rows_to_insert - m_rows_inserted From 12b62521457490c28d79882dd674ac8c4d2daa68 Mon Sep 17 00:00:00 2001 From: "msvensson@neptunus.(none)" <> Date: Thu, 7 Apr 2005 20:17:37 +0200 Subject: [PATCH 105/204] BUG#6762 ALTER TABLE gives weird results and error message - Removed hardcoded error message from 4.1 --- include/my_base.h | 4 +++- mysql-test/t/ndb_alter_table.test | 2 +- sql/ha_ndbcluster.cc | 13 +++---------- sql/handler.cc | 4 ++++ sql/share/errmsg.txt | 3 +++ 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/include/my_base.h b/include/my_base.h index 1713a07f6ec..25fa683744e 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -312,7 +312,9 @@ enum ha_base_keytype { #define HA_ERR_TABLE_EXIST 156 /* The table existed in storage engine */ #define HA_ERR_NO_CONNECTION 157 /* Could not connect to storage engine */ #define HA_ERR_NULL_IN_SPATIAL 158 /* NULLs are not supported in spatial index */ -#define HA_ERR_LAST 158 /*Copy last error nr.*/ +#define HA_ERR_TABLE_DEF_CHANGED 159 /* The table changed in storage engine */ + +#define HA_ERR_LAST 159 /*Copy last error nr.*/ /* Add error numbers before HA_ERR_LAST and change it accordingly. */ #define HA_ERR_ERRORS (HA_ERR_LAST - HA_ERR_FIRST + 1) diff --git a/mysql-test/t/ndb_alter_table.test b/mysql-test/t/ndb_alter_table.test index 6f0e51b7a4d..18c7ff47b18 100644 --- a/mysql-test/t/ndb_alter_table.test +++ b/mysql-test/t/ndb_alter_table.test @@ -147,7 +147,7 @@ select * from t1 where b = 'two'; connection server1; alter table t1 drop index c; connection server2; ---error 1105 +--error 1412 select * from t1 where b = 'two'; select * from t1 where b = 'two'; connection server1; diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 5848fc002e4..a60f8133d47 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -192,6 +192,8 @@ static const err_code_mapping err_map[]= { 827, HA_ERR_RECORD_FILE_FULL, 1 }, { 832, HA_ERR_RECORD_FILE_FULL, 1 }, + { 284, HA_ERR_TABLE_DEF_CHANGED, 0 }, + { 0, 1, 0 }, { -1, -1, 1 } @@ -470,16 +472,7 @@ int ha_ndbcluster::ndb_err(NdbTransaction *trans) if (err.code != 709) DBUG_RETURN(1); } - else - { - DBUG_PRINT("info", ("Table exist but must have changed")); - /* In 5.0, this should be replaced with a mapping to a mysql error */ - my_printf_error(ER_UNKNOWN_ERROR, - "Table definition has changed, "\ - "please retry transaction", - MYF(0)); - DBUG_RETURN(1); - } + DBUG_PRINT("info", ("Table exists but must have changed")); } break; default: diff --git a/sql/handler.cc b/sql/handler.cc index 7cd2fd303f0..f20ee0c4d77 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -304,6 +304,7 @@ static int ha_init_errors(void) SETMSG(HA_ERR_NO_SUCH_TABLE, "No such table: '%.64s'"); SETMSG(HA_ERR_TABLE_EXIST, ER(ER_TABLE_EXISTS_ERROR)); SETMSG(HA_ERR_NO_CONNECTION, "Could not connect to storage engine"); + SETMSG(HA_ERR_TABLE_DEF_CHANGED, ER(ER_TABLE_DEF_CHANGED)); /* Register the error messages for use with my_error(). */ return my_error_register(errmsgs, HA_ERR_FIRST, HA_ERR_LAST); @@ -1646,6 +1647,9 @@ void handler::print_error(int error, myf errflag) case HA_ERR_NO_REFERENCED_ROW: textno=ER_NO_REFERENCED_ROW; break; + case HA_ERR_TABLE_DEF_CHANGED: + textno=ER_TABLE_DEF_CHANGED; + break; case HA_ERR_NO_SUCH_TABLE: { /* diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index 9a92f1f4f76..047c30f6cd0 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -5336,3 +5336,6 @@ ER_CANT_CREATE_USER_WITH_GRANT 42000 eng "You are not allowed to create a user with GRANT" ER_WRONG_VALUE_FOR_TYPE eng "Incorrect %-.32s value: '%-.128s' for function %-.32s" +ER_TABLE_DEF_CHANGED + eng "Table definition has changed, please retry transaction" + From d936a80ceaa813170c94c681cd97fb80b28b901c Mon Sep 17 00:00:00 2001 From: "lenz@mysql.com" <> Date: Thu, 7 Apr 2005 21:04:18 +0200 Subject: [PATCH 106/204] - bumped up the version number in configure.in from 5.0.4 to 5.0.5 to indicate that engineering has branched off from the 4.1 tree to build the 5.0.4 release --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 01f669a0d1b..e98d032abc6 100644 --- a/configure.in +++ b/configure.in @@ -6,7 +6,7 @@ AC_PREREQ(2.50)dnl Minimum Autoconf version required. AC_INIT(sql/mysqld.cc) AC_CANONICAL_SYSTEM # Don't forget to also update the NDB lines below. -AM_INIT_AUTOMAKE(mysql, 5.0.4-beta) +AM_INIT_AUTOMAKE(mysql, 5.0.5-beta) AM_CONFIG_HEADER(config.h) PROTOCOL_VERSION=10 From eae3f5ba1d866ef38e396f652cb5f0d50f9949ed Mon Sep 17 00:00:00 2001 From: "hf@deer.(none)" <> Date: Fri, 8 Apr 2005 09:23:10 +0500 Subject: [PATCH 107/204] Test result fixed --- mysql-test/r/cast.result | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/r/cast.result b/mysql-test/r/cast.result index 79d903737bf..feefd47c611 100644 --- a/mysql-test/r/cast.result +++ b/mysql-test/r/cast.result @@ -94,7 +94,7 @@ select 10.0+cast('a' as decimal); 10.0+cast('a' as decimal) 10.00 Warnings: -Error 1366 Incorrect decimal value: '' for column '' at row -1 +Warning 1292 Truncated incorrect DECIMAL value: 'a' select 10E+0+'a'; 10E+0+'a' 10 From c55a7b651f86ea9aef60768fe5cc81d78875f35d Mon Sep 17 00:00:00 2001 From: "reggie@mdk10.(none)" <> Date: Fri, 8 Apr 2005 00:16:02 -0500 Subject: [PATCH 108/204] Bug #9665 After registering MySQL service and starting with shared mem, cannot stop The shared memory connect event was not being set in kill_server. This caused the thread that is handling shared memory connections to never exit. --- sql/mysqld.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 0590333a20f..aa22f9bb2e4 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -835,6 +835,18 @@ static void __cdecl kill_server(int sig_ptr) else sql_print_error(ER(ER_GOT_SIGNAL),my_progname,sig); /* purecov: inspected */ +#if defined(HAVE_SMEM) && defined(__WIN__) + /* + Send event to smem_event_connect_request for aborting + */ + if (!SetEvent(smem_event_connect_request)) + { + DBUG_PRINT("error", + ("Got error: %ld from SetEvent of smem_event_connect_request", + GetLastError())); + } +#endif + #if defined(__NETWARE__) || (defined(USE_ONE_SIGNAL_HAND) && !defined(__WIN__) && !defined(OS2)) my_thread_init(); // If this is a new thread #endif From 813cc0eaf0ef9d89782ba35582cc859f85cd9bf7 Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Fri, 8 Apr 2005 11:38:40 +0200 Subject: [PATCH 109/204] Added more tests for auto_increment --- mysql-test/r/ndb_basic.result | 42 ++++++++++++++++++++++++++++++----- mysql-test/t/ndb_basic.test | 2 ++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/mysql-test/r/ndb_basic.result b/mysql-test/r/ndb_basic.result index 12f9c3742e5..3712fa2b5ca 100644 --- a/mysql-test/r/ndb_basic.result +++ b/mysql-test/r/ndb_basic.result @@ -619,12 +619,6 @@ counter datavalue 1 newval 2 newval insert into t1 (datavalue) select datavalue from t1 where counter < 100; -select * from t1 order by counter; -counter datavalue -1 newval -2 newval -3 newval -4 newval insert into t1 (datavalue) select datavalue from t1 where counter < 100; select * from t1 order by counter; counter datavalue @@ -632,8 +626,44 @@ counter datavalue 2 newval 3 newval 4 newval +5 newval +6 newval +7 newval +8 newval +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +select * from t1 order by counter; +counter datavalue +1 newval +2 newval +3 newval +4 newval +5 newval +6 newval +7 newval +8 newval 35 newval 36 newval 37 newval 38 newval +39 newval +40 newval +41 newval +42 newval +43 newval +44 newval +45 newval +46 newval +47 newval +48 newval +49 newval +50 newval +51 newval +52 newval +53 newval +54 newval +55 newval +56 newval +57 newval +58 newval drop table t1; diff --git a/mysql-test/t/ndb_basic.test b/mysql-test/t/ndb_basic.test index 35e1ddc5ebf..66300f61fc3 100644 --- a/mysql-test/t/ndb_basic.test +++ b/mysql-test/t/ndb_basic.test @@ -596,9 +596,11 @@ insert into t1 (datavalue) values ('newval'); insert into t1 (datavalue) values ('newval'); select * from t1 order by counter; insert into t1 (datavalue) select datavalue from t1 where counter < 100; +insert into t1 (datavalue) select datavalue from t1 where counter < 100; select * from t1 order by counter; connection con2; insert into t1 (datavalue) select datavalue from t1 where counter < 100; +insert into t1 (datavalue) select datavalue from t1 where counter < 100; select * from t1 order by counter; drop table t1; From 20a82a1a6a88a84cddeecb475c1432dbf589ea29 Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Fri, 8 Apr 2005 12:34:52 +0200 Subject: [PATCH 110/204] Fixed broken auto_increment --- mysql-test/r/ndb_alter_table.result | 2 +- sql/ha_ndbcluster.cc | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/ndb_alter_table.result b/mysql-test/r/ndb_alter_table.result index 54eaddfb0e9..6f4d84edef5 100644 --- a/mysql-test/r/ndb_alter_table.result +++ b/mysql-test/r/ndb_alter_table.result @@ -40,7 +40,7 @@ insert into t1 values (0,4,3,5,"PENDING",1,7),(NULL,4,3,5,"PENDING",1,7),(31,4,3,5,"PENDING",1,7), (7,4,3,5,"PENDING",1,7), (NULL,4,3,5,"PENDING",1,7), (100,4,3,5,"PENDING",1,7), (99,4,3,5,"PENDING",1,7), (8,4,3,5,"PENDING",1,7), (NULL,4,3,5,"PENDING",1,7); show table status; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment -t1 ndbcluster 10 Dynamic 9 96 # # 0 # 101 # # # latin1_swedish_ci NULL # +t1 ndbcluster 10 Dynamic 9 96 # # 0 # 102 # # # latin1_swedish_ci NULL # select * from t1 order by col1; col1 col2 col3 col4 col5 col6 to_be_deleted 0 4 3 5 PENDING 1 7 diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 495060eb994..1039eea99cd 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -1938,8 +1938,12 @@ int ha_ndbcluster::write_row(byte *record) if (has_auto_increment) { + THD *thd= table->in_use; + m_skip_auto_increment= FALSE; update_auto_increment(); + /* Ensure that handler is always called for auto_increment values */ + thd->next_insert_id= 0; m_skip_auto_increment= !auto_increment_column_changed; } From 6bd1bea723e77a98512c9d46e3170ed4477d790c Mon Sep 17 00:00:00 2001 From: "joerg@mysql.com" <> Date: Fri, 8 Apr 2005 13:56:48 +0200 Subject: [PATCH 111/204] Add missing parts for the "Cybozu" custom build, to avoid future manual patches. --- BUILD/compile-pentium-cybozu | 9 +++++++++ configure.in | 27 +++++++++++++++++---------- mysys/charset-def.c | 4 ++-- strings/ctype-utf8.c | 2 +- 4 files changed, 29 insertions(+), 13 deletions(-) create mode 100755 BUILD/compile-pentium-cybozu diff --git a/BUILD/compile-pentium-cybozu b/BUILD/compile-pentium-cybozu new file mode 100755 index 00000000000..841635985a1 --- /dev/null +++ b/BUILD/compile-pentium-cybozu @@ -0,0 +1,9 @@ +#! /bin/sh + +path=`dirname $0` +. "$path/SETUP.sh" + +extra_flags="$pentium_cflags $fast_cflags -g" +extra_configs="$pentium_configs --with-charset=utf8 --with-collation=utf8_general_cs" + +. "$path/FINISH.sh" diff --git a/configure.in b/configure.in index 03b0ed9be29..c4bd95b9a24 100644 --- a/configure.in +++ b/configure.in @@ -2770,16 +2770,23 @@ case $default_charset in ;; utf8) default_charset_default_collation="utf8_general_ci" - define(UTFC1, utf8_general_ci utf8_bin) - define(UTFC2, utf8_czech_ci utf8_danish_ci) - define(UTFC3, utf8_estonian_ci utf8_icelandic_ci) - define(UTFC4, utf8_latvian_ci utf8_lithuanian_ci) - define(UTFC5, utf8_persian_ci utf8_polish_ci utf8_romanian_ci) - define(UTFC6, utf8_slovak_ci utf8_slovenian_ci) - define(UTFC7, utf8_spanish2_ci utf8_spanish_ci) - define(UTFC8, utf8_swedish_ci utf8_turkish_ci) - define(UTFC9, utf8_unicode_ci) - UTFC="UTFC1 UTFC2 UTFC3 UTFC4 UTFC5 UTFC6 UTFC7 UTFC8 UTFC9" + if test "$default_collation" = "utf8_general_cs"; then + # For those who explicitly desire "utf8_general_cs", support it, + # and then also set the CPP switch enabling that code. + UTFC="utf8_general_cs" + AC_DEFINE([HAVE_UTF8_GENERAL_CS], [1], [certain Japanese customer]) + else + define(UTFC1, utf8_general_ci utf8_bin) + define(UTFC2, utf8_czech_ci utf8_danish_ci) + define(UTFC3, utf8_estonian_ci utf8_icelandic_ci) + define(UTFC4, utf8_latvian_ci utf8_lithuanian_ci) + define(UTFC5, utf8_persian_ci utf8_polish_ci utf8_romanian_ci) + define(UTFC6, utf8_slovak_ci utf8_slovenian_ci) + define(UTFC7, utf8_spanish2_ci utf8_spanish_ci) + define(UTFC8, utf8_swedish_ci utf8_turkish_ci) + define(UTFC9, utf8_unicode_ci) + UTFC="UTFC1 UTFC2 UTFC3 UTFC4 UTFC5 UTFC6 UTFC7 UTFC8 UTFC9" + fi default_charset_collations="$UTFC" ;; *) diff --git a/mysys/charset-def.c b/mysys/charset-def.c index c7fa0ffd8e0..d4f69a49a2c 100644 --- a/mysys/charset-def.c +++ b/mysys/charset-def.c @@ -62,7 +62,7 @@ extern CHARSET_INFO my_charset_utf8_slovak_uca_ci; extern CHARSET_INFO my_charset_utf8_spanish2_uca_ci; extern CHARSET_INFO my_charset_utf8_roman_uca_ci; extern CHARSET_INFO my_charset_utf8_persian_uca_ci; -#ifdef HAVE_CYBOZU_COLLATION +#ifdef HAVE_UTF8_GENERAL_CS extern CHARSET_INFO my_charset_utf8_general_cs; #endif #endif @@ -149,7 +149,7 @@ my_bool init_compiled_charsets(myf flags __attribute__((unused))) #ifdef HAVE_CHARSET_utf8 add_compiled_collation(&my_charset_utf8_general_ci); add_compiled_collation(&my_charset_utf8_bin); -#ifdef HAVE_CYBOZU_COLLATION +#ifdef HAVE_UTF8_GENERAL_CS add_compiled_collation(&my_charset_utf8_general_cs); #endif #ifdef HAVE_UCA_COLLATIONS diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 83725878a50..230b44796e8 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -2375,7 +2375,7 @@ CHARSET_INFO my_charset_utf8_bin= &my_collation_mb_bin_handler }; -#ifdef HAVE_CYBOZU_COLLATION +#ifdef HAVE_UTF8_GENERAL_CS /* * These functions bacically do the same as their original, except From 3add511de79f8d3f3856cdcb9770037705c3d88e Mon Sep 17 00:00:00 2001 From: "ingo@mysql.com" <> Date: Fri, 8 Apr 2005 14:13:02 +0200 Subject: [PATCH 112/204] Bug#9188 - Corruption Can't open file: 'table.MYI' (errno: 145) Since 4.1 keys are compared with trailing spaces. Thus, a "x " key can be inserted between a couple of "x" keys. The existing code did not take this into account. Though the comments in the code claimed it did. --- myisam/mi_search.c | 51 ++++++++++++++++++++++++++++++++------ myisam/mi_write.c | 26 +++++++++++++++++-- mysql-test/r/myisam.result | 8 ++++++ mysql-test/t/myisam.test | 10 ++++++++ 4 files changed, 85 insertions(+), 10 deletions(-) diff --git a/myisam/mi_search.c b/myisam/mi_search.c index bc8be9c2732..390e32b679d 100644 --- a/myisam/mi_search.c +++ b/myisam/mi_search.c @@ -210,9 +210,31 @@ int _mi_bin_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, } /* _mi_bin_search */ - /* Used instead of _mi_bin_search() when key is packed */ - /* Puts smaller or identical key in buff */ - /* Key is searched sequentially */ +/* + Locate a packed key in a key page. + + SYNOPSIS + _mi_seq_search() + info Open table information. + keyinfo Key definition information. + page Key page (beginning). + key Search key. + key_len Length to use from search key or USE_WHOLE_KEY + comp_flag Search flags like SEARCH_SAME etc. + ret_pos RETURN Position in key page behind this key. + buff RETURN Copy of previous or identical unpacked key. + last_key RETURN If key is last in page. + + DESCRIPTION + Used instead of _mi_bin_search() when key is packed. + Puts smaller or identical key in buff. + Key is searched sequentially. + + RETURN + > 0 Key in 'buff' is smaller than search key. + 0 Key in 'buff' is identical to search key. + < 0 Not found. +*/ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, uchar *key, uint key_len, uint comp_flag, uchar **ret_pos, @@ -718,7 +740,19 @@ uint _mi_get_static_key(register MI_KEYDEF *keyinfo, uint nod_flag, } /* _mi_get_static_key */ -/* Key with is packed against previous key or key with a NULL column */ +/* + get key witch is packed against previous key or key with a NULL column. + + SYNOPSIS + _mi_get_pack_key() + keyinfo key definition information. + nod_flag If nod: Length of node pointer, else zero. + page_pos RETURN position in key page behind this key. + key IN/OUT in: prev key, out: unpacked key. + + RETURN + key_length + length of data pointer +*/ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, register uchar **page_pos, register uchar *key) @@ -1339,12 +1373,12 @@ _mi_calc_var_key_length(MI_KEYDEF *keyinfo,uint nod_flag, Keys are compressed the following way: - If the max length of first key segment <= 127 characters the prefix is + If the max length of first key segment <= 127 bytes the prefix is 1 byte else it's 2 byte - prefix byte The high bit is set if this is a prefix for the prev key + prefix byte(s) The high bit is set if this is a prefix for the prev key length Packed length if the previous was a prefix byte - [length] Length character of data + [length] data bytes ('length' bytes) next-key-seg Next key segments If the first segment can have NULL: @@ -1537,7 +1571,8 @@ _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,uchar *next_key, s_temp->part_of_prev_key= new_ref_length; s_temp->prev_length= org_key_length - (new_ref_length-pack_marker); - s_temp->n_ref_length= s_temp->n_length= s_temp->prev_length; + s_temp->n_ref_length= s_temp->part_of_prev_key; + s_temp->n_length= s_temp->prev_length; n_length= get_pack_length(s_temp->prev_length); s_temp->prev_key+= (new_ref_length - pack_marker); length+= s_temp->prev_length + n_length; diff --git a/myisam/mi_write.c b/myisam/mi_write.c index 7d053ddfd22..cd9e73fba22 100644 --- a/myisam/mi_write.c +++ b/myisam/mi_write.c @@ -414,8 +414,30 @@ err: } /* w_search */ - /* Insert new key at right of key_pos */ - /* Returns 2 if key contains key to upper level */ +/* + Insert new key. + + SYNOPSIS + _mi_insert() + info Open table information. + keyinfo Key definition information. + key New key. + anc_buff Key page (beginning). + key_pos Position in key page where to insert. + key_buff Copy of previous key. + father_buff parent key page for balancing. + father_key_pos position in parent key page for balancing. + father_page position of parent key page in file. + insert_last If to append at end of page. + + DESCRIPTION + Insert new key at right of key_pos. + + RETURN + 2 if key contains key to upper level. + 0 OK. + < 0 Error. +*/ int _mi_insert(register MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *key, uchar *anc_buff, uchar *key_pos, uchar *key_buff, diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result index eaed7c620e3..5b69ce68a79 100644 --- a/mysql-test/r/myisam.result +++ b/mysql-test/r/myisam.result @@ -573,3 +573,11 @@ truncate table t1; ERROR HY000: MyISAM table 't1' is in use (most likely by a MERGE table). Try FLUSH TABLES. insert into t1 values (1); drop table t1,t2; +create table t1 (c1 int, c2 varchar(4) not null default '', +key(c2(3))) default charset=utf8; +insert into t1 values (1,'A'), (2, 'B'), (3, 'A'); +update t1 set c2='A B' where c1=2; +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +drop table t1; diff --git a/mysql-test/t/myisam.test b/mysql-test/t/myisam.test index 0babd1f9401..46a6499adad 100644 --- a/mysql-test/t/myisam.test +++ b/mysql-test/t/myisam.test @@ -550,3 +550,13 @@ truncate table t1; insert into t1 values (1); drop table t1,t2; +# +# bug9188 - Corruption Can't open file: 'table.MYI' (errno: 145) +# +create table t1 (c1 int, c2 varchar(4) not null default '', + key(c2(3))) default charset=utf8; +insert into t1 values (1,'A'), (2, 'B'), (3, 'A'); +update t1 set c2='A B' where c1=2; +check table t1; +drop table t1; + From 72d89cc253e2e25ed8eb1ae209d3d4ca5bad1248 Mon Sep 17 00:00:00 2001 From: "joreland@mysql.com" <> Date: Fri, 8 Apr 2005 14:15:37 +0200 Subject: [PATCH 113/204] bug#9749 - ndb test case for case 9749, ndb lock upgrade via NDBAPI --- ndb/test/ndbapi/testOperations.cpp | 93 ++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/ndb/test/ndbapi/testOperations.cpp b/ndb/test/ndbapi/testOperations.cpp index e254aff58dc..9f1d5ee1191 100644 --- a/ndb/test/ndbapi/testOperations.cpp +++ b/ndb/test/ndbapi/testOperations.cpp @@ -530,6 +530,74 @@ runOperations(NDBT_Context* ctx, NDBT_Step* step) return NDBT_OK; } +int +runLockUpgrade1(NDBT_Context* ctx, NDBT_Step* step){ + // Verify that data in index match + // table data + Ndb* pNdb = GETNDB(step); + HugoOperations hugoOps(*ctx->getTab()); + HugoTransactions hugoTrans(*ctx->getTab()); + + if(hugoTrans.loadTable(pNdb, 1) != 0){ + g_err << "Load table failed" << endl; + return NDBT_FAILED; + } + + int result= NDBT_OK; + do + { + CHECK(hugoOps.startTransaction(pNdb) == 0); + CHECK(hugoOps.pkReadRecord(pNdb, 0, 1, NdbOperation::LM_Read) == 0); + CHECK(hugoOps.execute_NoCommit(pNdb) == 0); + + ctx->setProperty("READ_DONE", 1); + ctx->broadcast(); + ndbout_c("wait 2"); + ctx->getPropertyWait("READ_DONE", 2); + ndbout_c("wait 2 - done"); + ctx->setProperty("READ_DONE", 3); + ctx->broadcast(); + ndbout_c("before update"); + CHECK(hugoOps.pkUpdateRecord(pNdb, 0, 1, 2) == 0); + ndbout_c("wait update"); + CHECK(hugoOps.execute_NoCommit(pNdb) == 0); + CHECK(hugoOps.closeTransaction(pNdb)); + } while(0); + + return result; +} + +int +runLockUpgrade2(NDBT_Context* ctx, NDBT_Step* step){ + // Verify that data in index match + // table data + Ndb* pNdb = GETNDB(step); + HugoOperations hugoOps(*ctx->getTab()); + HugoTransactions hugoTrans(*ctx->getTab()); + + + int result= NDBT_OK; + do + { + CHECK(hugoOps.startTransaction(pNdb) == 0); + ndbout_c("wait 1"); + ctx->getPropertyWait("READ_DONE", 1); + ndbout_c("wait 1 - done"); + CHECK(hugoOps.pkReadRecord(pNdb, 0, 1, NdbOperation::LM_Read) == 0); + CHECK(hugoOps.execute_NoCommit(pNdb) == 0); + ctx->setProperty("READ_DONE", 2); + ctx->broadcast(); + ndbout_c("wait 3"); + ctx->getPropertyWait("READ_DONE", 3); + ndbout_c("wait 3 - done"); + + NdbSleep_MilliSleep(200); + CHECK(hugoOps.execute_Commit(pNdb) == 0); + } while(0); + + return NDBT_FAILED; +} + int main(int argc, const char** argv){ ndb_init(); @@ -538,6 +606,31 @@ main(int argc, const char** argv){ generate(tmp, 5); NDBT_TestSuite ts("testOperations"); + + { + BaseString name("bug_9749"); + NDBT_TestCaseImpl1 *pt = new NDBT_TestCaseImpl1(&ts, + name.c_str(), ""); + + pt->addInitializer(new NDBT_Initializer(pt, + "runClearTable", + runClearTable)); + + pt->addStep(new NDBT_ParallelStep(pt, + "thread1", + runLockUpgrade1)); + + + pt->addStep(new NDBT_ParallelStep(pt, + "thread2", + runLockUpgrade2)); + + pt->addFinalizer(new NDBT_Finalizer(pt, + "runClearTable", + runClearTable)); + ts.addTest(pt); + } + for(size_t i = 0; i Date: Fri, 8 Apr 2005 16:05:16 +0200 Subject: [PATCH 114/204] Fixed BUG#7299: Stored procedures: exception handler catches not-found conditions --- mysql-test/r/sp-error.result | 13 +++++++++++++ mysql-test/t/sp-error.test | 22 ++++++++++++++++++++++ sql/sp_rcontext.cc | 4 ++-- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result index ff7d71b3384..42e45f67d33 100644 --- a/mysql-test/r/sp-error.result +++ b/mysql-test/r/sp-error.result @@ -513,4 +513,17 @@ call bug9566()| ERROR HY000: Table 'proc' was not locked with LOCK TABLES unlock tables| drop procedure bug9566| +drop procedure if exists bug7299| +create procedure bug7299() +begin +declare v int; +declare c cursor for select val from t1; +declare exit handler for sqlexception select 'Error!'; +open c; +fetch c into v; +end| +delete from t1| +call bug7299()| +ERROR 02000: No data to FETCH +drop procedure bug7299| drop table t1| diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test index 51776453730..90c776a8b88 100644 --- a/mysql-test/t/sp-error.test +++ b/mysql-test/t/sp-error.test @@ -720,6 +720,28 @@ unlock tables| drop procedure bug9566| +# +# BUG#7299: Stored procedures: exception handler catches not-found conditions +# +--disable_warnings +drop procedure if exists bug7299| +--enable_warnings +create procedure bug7299() +begin + declare v int; + declare c cursor for select val from t1; + declare exit handler for sqlexception select 'Error!'; + + open c; + fetch c into v; +end| + +delete from t1| +--error ER_SP_FETCH_NO_DATA +call bug7299()| +drop procedure bug7299| + + # # BUG#NNNN: New bug synopsis # diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc index 9b29c173856..e9271146cad 100644 --- a/sql/sp_rcontext.cc +++ b/sql/sp_rcontext.cc @@ -95,8 +95,8 @@ sp_rcontext::find_handler(uint sql_errno, found= i; break; case sp_cond_type_t::exception: - if ((sqlstate[0] != '0' || sqlstate[1] > '2' || - level == MYSQL_ERROR::WARN_LEVEL_ERROR) && + if ((sqlstate[0] != '0' || sqlstate[1] > '2') && + level == MYSQL_ERROR::WARN_LEVEL_ERROR && (found < 0 || m_handler[found].cond->type > sp_cond_type_t::state)) found= i; break; From 3f5b8b976c1145ee64fd5c1c4c2d5ae62d54b834 Mon Sep 17 00:00:00 2001 From: "reggie@mdk10.(none)" <> Date: Fri, 8 Apr 2005 09:17:19 -0500 Subject: [PATCH 115/204] Bug #9665 After registering MySQL service and starting with shared mem, cannot stop Removed the extra set of the shared memory connect event from kill_mysql since it is also being set in kill_server --- sql/mysqld.cc | 9 --------- 1 file changed, 9 deletions(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index aa22f9bb2e4..22a4e0dd4d0 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -773,15 +773,6 @@ void kill_mysql(void) CloseHandle(hEvent); */ } -#ifdef HAVE_SMEM - /* - Send event to smem_event_connect_request for aborting - */ - if (!SetEvent(smem_event_connect_request)) - { - DBUG_PRINT("error",("Got error: %ld from SetEvent of smem_event_connect_request",GetLastError())); - } -#endif #endif #elif defined(OS2) pthread_cond_signal( &eventShutdown); // post semaphore From 497f2684d8f61f4971ebcd28b1de5110dad51c7a Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Fri, 8 Apr 2005 16:49:14 +0200 Subject: [PATCH 116/204] Merge from fix of Bug #9675 Auto-increment not working with INSERT..SELECT and NDB storage --- mysql-test/r/ndb_alter_table.result | 2 +- mysql-test/r/ndb_basic.result | 60 +++++++++++++++++++++++++++++ mysql-test/t/ndb_basic.test | 27 +++++++++++++ sql/ha_ndbcluster.cc | 14 ++++++- 4 files changed, 101 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/ndb_alter_table.result b/mysql-test/r/ndb_alter_table.result index 9bc82e7a24a..d3a9289283e 100644 --- a/mysql-test/r/ndb_alter_table.result +++ b/mysql-test/r/ndb_alter_table.result @@ -40,7 +40,7 @@ insert into t1 values (0,4,3,5,"PENDING",1,7),(NULL,4,3,5,"PENDING",1,7),(31,4,3,5,"PENDING",1,7), (7,4,3,5,"PENDING",1,7), (NULL,4,3,5,"PENDING",1,7), (100,4,3,5,"PENDING",1,7), (99,4,3,5,"PENDING",1,7), (8,4,3,5,"PENDING",1,7), (NULL,4,3,5,"PENDING",1,7); show table status; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment -t1 ndbcluster 10 Dynamic 9 96 # # 0 # 101 # # # latin1_swedish_ci NULL # +t1 ndbcluster 10 Dynamic 9 96 # # 0 # 102 # # # latin1_swedish_ci NULL # select * from t1 order by col1; col1 col2 col3 col4 col5 col6 to_be_deleted 0 4 3 5 PENDING 1 7 diff --git a/mysql-test/r/ndb_basic.result b/mysql-test/r/ndb_basic.result index e1aa045d16e..6383a636cad 100644 --- a/mysql-test/r/ndb_basic.result +++ b/mysql-test/r/ndb_basic.result @@ -607,3 +607,63 @@ primary key (a)) engine=ndb max_rows=1; drop table t1; +create table t1 +(counter int(64) NOT NULL auto_increment, +datavalue char(40) default 'XXXX', +primary key (counter) +) ENGINE=ndbcluster; +insert into t1 (datavalue) values ('newval'); +insert into t1 (datavalue) values ('newval'); +select * from t1 order by counter; +counter datavalue +1 newval +2 newval +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +select * from t1 order by counter; +counter datavalue +1 newval +2 newval +3 newval +4 newval +5 newval +6 newval +7 newval +8 newval +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +select * from t1 order by counter; +counter datavalue +1 newval +2 newval +3 newval +4 newval +5 newval +6 newval +7 newval +8 newval +35 newval +36 newval +37 newval +38 newval +39 newval +40 newval +41 newval +42 newval +43 newval +44 newval +45 newval +46 newval +47 newval +48 newval +49 newval +50 newval +51 newval +52 newval +53 newval +54 newval +55 newval +56 newval +57 newval +58 newval +drop table t1; diff --git a/mysql-test/t/ndb_basic.test b/mysql-test/t/ndb_basic.test index a6064f30556..5dfc2d5ec58 100644 --- a/mysql-test/t/ndb_basic.test +++ b/mysql-test/t/ndb_basic.test @@ -577,3 +577,30 @@ create table t1 engine=ndb max_rows=1; drop table t1; + +# +# Test auto_increment +# + +connect (con1,localhost,,,test); +connect (con2,localhost,,,test); + +create table t1 + (counter int(64) NOT NULL auto_increment, + datavalue char(40) default 'XXXX', + primary key (counter) + ) ENGINE=ndbcluster; + +connection con1; +insert into t1 (datavalue) values ('newval'); +insert into t1 (datavalue) values ('newval'); +select * from t1 order by counter; +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +select * from t1 order by counter; +connection con2; +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +insert into t1 (datavalue) select datavalue from t1 where counter < 100; +select * from t1 order by counter; + +drop table t1; diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 0668c3db7a8..6d843605e2f 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -1919,8 +1919,12 @@ int ha_ndbcluster::write_row(byte *record) if (has_auto_increment) { + THD *thd= table->in_use; + m_skip_auto_increment= FALSE; update_auto_increment(); + /* Ensure that handler is always called for auto_increment values */ + thd->next_insert_id= 0; m_skip_auto_increment= !auto_increment_column_changed; } @@ -2970,7 +2974,11 @@ void ha_ndbcluster::start_bulk_insert(ha_rows rows) DBUG_PRINT("enter", ("rows: %d", (int)rows)); m_rows_inserted= 0; - m_rows_to_insert= rows; + if (rows == 0) + /* We don't know how many will be inserted, guess */ + m_rows_to_insert= m_autoincrement_prefetch; + else + m_rows_to_insert= rows; /* Calculate how many rows that should be inserted @@ -4080,6 +4088,10 @@ ulonglong ha_ndbcluster::get_auto_increment() DBUG_ENTER("get_auto_increment"); DBUG_PRINT("enter", ("m_tabname: %s", m_tabname)); Ndb *ndb= get_ndb(); + + if (m_rows_inserted > m_rows_to_insert) + /* We guessed too low */ + m_rows_to_insert+= m_autoincrement_prefetch; cache_size= (m_rows_to_insert - m_rows_inserted < m_autoincrement_prefetch) ? m_rows_to_insert - m_rows_inserted From ce2e40ac1972dc883cb7480880613d45b11c669d Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Fri, 8 Apr 2005 17:31:37 +0200 Subject: [PATCH 117/204] Fixed BUG#6900: Stored procedure inner handler ignored and BUG#9074: STORED PROC: The scope of every handler declared is not properly applied --- mysql-test/r/sp.result | 65 +++++++++++++++++++++++++++++++++ mysql-test/t/sp.test | 83 ++++++++++++++++++++++++++++++++++++++++++ sql/sp_rcontext.cc | 8 ++-- 3 files changed, 152 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index daad032b854..36a4331c9be 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -2779,4 +2779,69 @@ a 3.2000 drop procedure bug8937| delete from t1| +drop procedure if exists bug6900| +drop procedure if exists bug9074| +drop procedure if exists bug6900_9074| +drop table if exists t3| +create table t3 (w char unique, x char)| +insert into t3 values ('a', 'b')| +create procedure bug6900() +begin +declare exit handler for sqlexception select '1'; +begin +declare exit handler for sqlexception select '2'; +insert into t3 values ('x', 'y', 'z'); +end; +end| +create procedure bug9074() +begin +declare x1, x2, x3, x4, x5, x6 int default 0; +begin +declare continue handler for sqlstate '23000' set x5 = 1; +insert into t3 values ('a', 'b'); +set x6 = 1; +end; +begin1_label: +begin +declare continue handler for sqlstate '23000' set x1 = 1; +insert into t3 values ('a', 'b'); +set x2 = 1; +begin2_label: +begin +declare exit handler for sqlstate '23000' set x3 = 1; +set x4= 1; +insert into t3 values ('a','b'); +set x4= 0; +end begin2_label; +end begin1_label; +select x1, x2, x3, x4, x5, x6; +end| +create procedure bug6900_9074(z int) +begin +declare exit handler for sqlstate '23000' select '23000'; +begin +declare exit handler for sqlexception select 'sqlexception'; +if z = 1 then +insert into t3 values ('a', 'b'); +else +insert into t3 values ('x', 'y', 'z'); +end if; +end; +end| +call bug6900()| +2 +2 +call bug9074()| +x1 x2 x3 x4 x5 x6 +1 1 1 1 1 1 +call bug6900_9074(0)| +sqlexception +sqlexception +call bug6900_9074(1)| +23000 +23000 +drop procedure bug6900| +drop procedure bug9074| +drop procedure bug6900_9074| +drop table t3| drop table t1,t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index a741a4af7d8..69c7544ee7c 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3398,6 +3398,89 @@ drop procedure bug8937| delete from t1| +# +# BUG#6900: Stored procedure inner handler ignored +# BUG#9074: STORED PROC: The scope of every handler declared is not +# properly applied +# +--disable_warnings +drop procedure if exists bug6900| +drop procedure if exists bug9074| +drop procedure if exists bug6900_9074| +drop table if exists t3| +--enable_warnings + +create table t3 (w char unique, x char)| +insert into t3 values ('a', 'b')| + +create procedure bug6900() +begin + declare exit handler for sqlexception select '1'; + + begin + declare exit handler for sqlexception select '2'; + + insert into t3 values ('x', 'y', 'z'); + end; +end| + +create procedure bug9074() +begin + declare x1, x2, x3, x4, x5, x6 int default 0; + + begin + declare continue handler for sqlstate '23000' set x5 = 1; + + insert into t3 values ('a', 'b'); + set x6 = 1; + end; + + begin1_label: + begin + declare continue handler for sqlstate '23000' set x1 = 1; + + insert into t3 values ('a', 'b'); + set x2 = 1; + + begin2_label: + begin + declare exit handler for sqlstate '23000' set x3 = 1; + + set x4= 1; + insert into t3 values ('a','b'); + set x4= 0; + end begin2_label; + end begin1_label; + + select x1, x2, x3, x4, x5, x6; +end| + +create procedure bug6900_9074(z int) +begin + declare exit handler for sqlstate '23000' select '23000'; + + begin + declare exit handler for sqlexception select 'sqlexception'; + + if z = 1 then + insert into t3 values ('a', 'b'); + else + insert into t3 values ('x', 'y', 'z'); + end if; + end; +end| + +call bug6900()| +call bug9074()| +call bug6900_9074(0)| +call bug6900_9074(1)| + +drop procedure bug6900| +drop procedure bug9074| +drop procedure bug6900_9074| +drop table t3| + + # # BUG#NNNN: New bug synopsis # diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc index e9271146cad..d98cdfdd226 100644 --- a/sql/sp_rcontext.cc +++ b/sql/sp_rcontext.cc @@ -80,24 +80,24 @@ sp_rcontext::find_handler(uint sql_errno, break; case sp_cond_type_t::state: if (strcmp(sqlstate, cond->sqlstate) == 0 && - (found < 0 || m_handler[found].cond->type > sp_cond_type_t::number)) + (found < 0 || m_handler[found].cond->type > sp_cond_type_t::state)) found= i; break; case sp_cond_type_t::warning: if ((sqlstate[0] == '0' && sqlstate[1] == '1' || level == MYSQL_ERROR::WARN_LEVEL_WARN) && - (found < 0 || m_handler[found].cond->type > sp_cond_type_t::state)) + found < 0) found= i; break; case sp_cond_type_t::notfound: if (sqlstate[0] == '0' && sqlstate[1] == '2' && - (found < 0 || m_handler[found].cond->type > sp_cond_type_t::state)) + found < 0) found= i; break; case sp_cond_type_t::exception: if ((sqlstate[0] != '0' || sqlstate[1] > '2') && level == MYSQL_ERROR::WARN_LEVEL_ERROR && - (found < 0 || m_handler[found].cond->type > sp_cond_type_t::state)) + found < 0) found= i; break; } From 2038ced40cb61e4e457f5b5f6cb6ff1fd526399b Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Fri, 8 Apr 2005 19:58:04 +0200 Subject: [PATCH 118/204] Fixed BUG#9073: Able to declare two handlers for same condition in same scope --- mysql-test/r/sp-error.result | 41 +++++++++++++++++++++++++++++ mysql-test/t/sp-error.test | 50 ++++++++++++++++++++++++++++++++++++ sql/share/errmsg.txt | 3 ++- sql/sp_pcontext.cc | 37 ++++++++++++++++++++++++++ sql/sp_pcontext.h | 10 ++++++++ sql/sql_yacc.yy | 36 +++++++++++++++++++++----- 6 files changed, 170 insertions(+), 7 deletions(-) diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result index 42e45f67d33..b9d33bbe606 100644 --- a/mysql-test/r/sp-error.result +++ b/mysql-test/r/sp-error.result @@ -526,4 +526,45 @@ delete from t1| call bug7299()| ERROR 02000: No data to FETCH drop procedure bug7299| +create procedure bug9073() +begin +declare continue handler for sqlexception select 1; +declare continue handler for sqlexception select 2; +end| +ERROR 42000: Duplicate handler declared in the same block +create procedure bug9073() +begin +declare condname1 condition for 1234; +declare continue handler for condname1 select 1; +declare exit handler for condname1 select 2; +end| +ERROR 42000: Duplicate handler declared in the same block +create procedure bug9073() +begin +declare condname1 condition for sqlstate '42000'; +declare condname2 condition for sqlstate '42000'; +declare exit handler for condname1 select 1; +declare continue handler for condname2 select 2; +end| +ERROR 42000: Duplicate handler declared in the same block +create procedure bug9073() +begin +declare condname1 condition for sqlstate '42000'; +declare exit handler for condname1 select 1; +declare exit handler for sqlstate '42000' select 2; +end| +ERROR 42000: Duplicate handler declared in the same block +drop procedure if exists bug9073| +create procedure bug9073() +begin +declare condname1 condition for sqlstate '42000'; +declare continue handler for condname1 select 1; +begin +declare exit handler for sqlstate '42000' select 2; +begin +declare continue handler for sqlstate '42000' select 3; +end; +end; +end| +drop procedure bug9073| drop table t1| diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test index 90c776a8b88..a02d2ff6733 100644 --- a/mysql-test/t/sp-error.test +++ b/mysql-test/t/sp-error.test @@ -742,6 +742,56 @@ call bug7299()| drop procedure bug7299| +# +# BUG#9073: Able to declare two handlers for same condition in same scope +# +--error ER_SP_DUP_HANDLER +create procedure bug9073() +begin + declare continue handler for sqlexception select 1; + declare continue handler for sqlexception select 2; +end| +--error ER_SP_DUP_HANDLER +create procedure bug9073() +begin + declare condname1 condition for 1234; + declare continue handler for condname1 select 1; + declare exit handler for condname1 select 2; +end| +--error ER_SP_DUP_HANDLER +create procedure bug9073() +begin + declare condname1 condition for sqlstate '42000'; + declare condname2 condition for sqlstate '42000'; + declare exit handler for condname1 select 1; + declare continue handler for condname2 select 2; +end| +--error ER_SP_DUP_HANDLER +create procedure bug9073() +begin + declare condname1 condition for sqlstate '42000'; + declare exit handler for condname1 select 1; + declare exit handler for sqlstate '42000' select 2; +end| + +# This should still work. +--disable_warnings +drop procedure if exists bug9073| +--enable_warnings +create procedure bug9073() +begin + declare condname1 condition for sqlstate '42000'; + declare continue handler for condname1 select 1; + begin + declare exit handler for sqlstate '42000' select 2; + begin + declare continue handler for sqlstate '42000' select 3; + end; + end; +end| +drop procedure bug9073| + + # # BUG#NNNN: New bug synopsis # diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index 2ef2555753d..95fb1736741 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -5338,4 +5338,5 @@ ER_WRONG_VALUE_FOR_TYPE eng "Incorrect %-.32s value: '%-.128s' for function %-.32s" ER_TABLE_DEF_CHANGED eng "Table definition has changed, please retry transaction" - +ER_SP_DUP_HANDLER 42000 + eng "Duplicate handler declared in the same block" diff --git a/sql/sp_pcontext.cc b/sql/sp_pcontext.cc index 15d3f87ff29..26f576233f3 100644 --- a/sql/sp_pcontext.cc +++ b/sql/sp_pcontext.cc @@ -57,6 +57,7 @@ sp_pcontext::sp_pcontext(sp_pcontext *prev) VOID(my_init_dynamic_array(&m_pvar, sizeof(sp_pvar_t *), 16, 8)); VOID(my_init_dynamic_array(&m_cond, sizeof(sp_cond_type_t *), 16, 8)); VOID(my_init_dynamic_array(&m_cursor, sizeof(LEX_STRING), 16, 8)); + VOID(my_init_dynamic_array(&m_handler, sizeof(sp_cond_type_t *), 16, 8)); m_label.empty(); m_children.empty(); if (!prev) @@ -82,6 +83,7 @@ sp_pcontext::destroy() delete_dynamic(&m_pvar); delete_dynamic(&m_cond); delete_dynamic(&m_cursor); + delete_dynamic(&m_handler); } sp_pcontext * @@ -258,6 +260,41 @@ sp_pcontext::find_cond(LEX_STRING *name, my_bool scoped) return NULL; } +/* + * This only searches the current context, for error checking of + * duplicates. + * Returns TRUE if found. + */ +bool +sp_pcontext::find_handler(sp_cond_type_t *cond) +{ + uint i= m_handler.elements; + + while (i--) + { + sp_cond_type_t *p; + + get_dynamic(&m_handler, (gptr)&p, i); + if (cond->type == p->type) + { + switch (p->type) + { + case sp_cond_type_t::number: + if (cond->mysqlerr == p->mysqlerr) + return TRUE; + break; + case sp_cond_type_t::state: + if (strcmp(cond->sqlstate, p->sqlstate) == 0) + return TRUE; + break; + default: + return TRUE; + } + } + } + return FALSE; +} + void sp_pcontext::push_cursor(LEX_STRING *name) { diff --git a/sql/sp_pcontext.h b/sql/sp_pcontext.h index 42d8140b78c..dbce191975a 100644 --- a/sql/sp_pcontext.h +++ b/sql/sp_pcontext.h @@ -241,6 +241,15 @@ class sp_pcontext : public Sql_alloc m_handlers+= 1; } + inline void + push_handler(sp_cond_type_t *cond) + { + insert_dynamic(&m_handler, (gptr)&cond); + } + + bool + find_handler(sp_cond_type *cond); + inline uint max_handlers() { @@ -293,6 +302,7 @@ private: DYNAMIC_ARRAY m_pvar; // Parameters/variables DYNAMIC_ARRAY m_cond; // Conditions DYNAMIC_ARRAY m_cursor; // Cursors + DYNAMIC_ARRAY m_handler; // Handlers, for checking of duplicates List m_label; // The label list diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 9266ab69790..9ff7f4449b2 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1774,19 +1774,43 @@ sp_hcond_list: { LEX *lex= Lex; sp_head *sp= lex->sphead; - sp_instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction(); + sp_pcontext *ctx= lex->spcont; - i->add_condition($1); - $$= 1; + if (ctx->find_handler($1)) + { + my_message(ER_SP_DUP_HANDLER, ER(ER_SP_DUP_HANDLER), MYF(0)); + YYABORT; + } + else + { + sp_instr_hpush_jump *i= + (sp_instr_hpush_jump *)sp->last_instruction(); + + i->add_condition($1); + ctx->push_handler($1); + $$= 1; + } } | sp_hcond_list ',' sp_hcond { LEX *lex= Lex; sp_head *sp= lex->sphead; - sp_instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction(); + sp_pcontext *ctx= lex->spcont; - i->add_condition($3); - $$= $1 + 1; + if (ctx->find_handler($3)) + { + my_message(ER_SP_DUP_HANDLER, ER(ER_SP_DUP_HANDLER), MYF(0)); + YYABORT; + } + else + { + sp_instr_hpush_jump *i= + (sp_instr_hpush_jump *)sp->last_instruction(); + + i->add_condition($3); + ctx->push_handler($3); + $$= $1 + 1; + } } ; From 0998ec4264c802b9ff8b0237bb7790923523e5d6 Mon Sep 17 00:00:00 2001 From: "acurtis@xiphis.org" <> Date: Sat, 9 Apr 2005 00:21:51 +0100 Subject: [PATCH 119/204] Fix typos in Bug#6776 --- sql/sql_udf.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/sql_udf.cc b/sql/sql_udf.cc index 19df1a85565..661bf6e8197 100644 --- a/sql/sql_udf.cc +++ b/sql/sql_udf.cc @@ -526,11 +526,11 @@ int mysql_drop_function(THD *thd,const LEX_STRING *udf_name) tables.real_name= tables.alias= (char*) "func"; if (!(table = open_ltable(thd,&tables,TL_WRITE))) goto err; - table->field[0]->store(udf_name.str, udf_name.length, system_charset_info); + table->field[0]->store(udf_name->str, udf_name->length, system_charset_info); table->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS); if (!table->file->index_read_idx(table->record[0], 0, (byte*) table->field[0]->ptr, - table->key_info[0].key_length + table->key_info[0].key_length, HA_READ_KEY_EXACT)) { int error; From 9b4f106045894d2dabdb858e6cbdb7d5596ab958 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Sat, 9 Apr 2005 03:05:47 +0200 Subject: [PATCH 120/204] Fix warning and error when compiling on Windows. --- sql/field.cc | 2 +- sql/item_sum.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/field.cc b/sql/field.cc index 3afc8a2eb12..e5134593d32 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -5573,7 +5573,7 @@ int Field_datetime::store(longlong nr) { set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, - initial_nr, MYSQL_TIMESTAMP_DATE); + initial_nr, MYSQL_TIMESTAMP_DATE, 1); error= 1; } diff --git a/sql/item_sum.cc b/sql/item_sum.cc index e4eac51eff7..64f23c3fc08 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -2670,7 +2670,7 @@ int dump_leaf_key(byte* key, element_count count __attribute__((unused)), { TABLE *table= item->table; char *record= (char*) table->record[0] + table->s->null_bytes; - String tmp(table->record[1], table->s->reclength, default_charset_info), tmp2; + String tmp((char *)table->record[1], table->s->reclength, default_charset_info), tmp2; String *result= &item->result; Item **arg= item->args, **arg_end= item->args + item->arg_count_field; From b47f7902d35b02939adee9852c1607d228390fff Mon Sep 17 00:00:00 2001 From: "jani@a193-229-222-105.elisa-laajakaista.fi" <> Date: Sat, 9 Apr 2005 18:37:32 +0300 Subject: [PATCH 121/204] New versions of mail_to_db.pl and pmail.pl. Added email threading capabilities to both programs. --- tests/mail_to_db.pl | 54 ++++++-- tests/pmail.pl | 309 +++++++++++++++++++++++++++++++------------- 2 files changed, 258 insertions(+), 105 deletions(-) diff --git a/tests/mail_to_db.pl b/tests/mail_to_db.pl index dc40fb3ede6..5ceda392313 100755 --- a/tests/mail_to_db.pl +++ b/tests/mail_to_db.pl @@ -17,7 +17,7 @@ use DBI; use Getopt::Long; $| = 1; -$VER = "2.6"; +$VER = "3.0"; $opt_help = 0; $opt_version = 0; @@ -26,7 +26,6 @@ $opt_host = undef(); $opt_port = undef(); $opt_socket = undef(); $opt_db = "mail"; -$opt_table = "mails"; $opt_user = undef(); $opt_password = undef(); $opt_max_mail_size = 65536; @@ -97,7 +96,7 @@ sub main print "the my.cnf file. This command is available from the latest MySQL\n"; print "distribution.\n"; } - GetOptions("help","version","host=s","port=i","socket=s","db=s","table=s", + GetOptions("help","version","host=s","port=i","socket=s","db=s", "user=s","password=s","max_mail_size=i","create","test", "no_path","debug","stop_on_error","stdin") || die "Wrong option! See $progname --help\n"; @@ -123,7 +122,6 @@ sub main || die "Couldn't connect: $DBI::errstr\n"; die "You must specify the database; use --db=" if (!defined($opt_db)); - die "You must specify the table; use --table=" if (!defined($opt_table)); create_table($dbh) if ($opt_create); @@ -218,9 +216,9 @@ sub main print "Total number of mails:\t\t\t\t"; print $mail_inserted + $ignored; print " (OK: "; - print sprintf("%.1f", (($mail_inserted / ($mail_inserted+$ignored)) * 100)); + print sprintf("%.1f", ($mail_inserted + $ignored) ? (($mail_inserted / ($mail_inserted+$ignored)) * 100) : 0.0); print "% Ignored: "; - print sprintf("%.1f", (($ignored / ($mail_inserted + $ignored)) * 100)); + print sprintf("%.1f", ($mail_inserted + $ignored) ? (($ignored / ($mail_inserted + $ignored)) * 100) : 0); print "%)\n"; print "################################ End Report ##################################\n"; exit(0); @@ -232,13 +230,15 @@ sub main sub create_table { - my ($dbh) = @_; + my ($dbh)= @_; my ($sth, $query); - $query = <)\s*/$1/; + $values{$type} = $1; + } + elsif (/^In-Reply-To:\s*(.*)/i) + { + $type = "in_reply_to"; + s/^\s*(<.*>)\s*/$1/; + $values{$type} = $1; + } elsif (/^Date: (.*)/i) { date_parser($1, \%values, $file_name); $type = "rubbish"; } - elsif (/^[\w\W-]+:\s/) + # Catch those fields that we don't or can't handle (yet) + elsif (/^[\w\W-]+:/) { - $type = "rubbish"; + $type = "rubbish"; } elsif ($_ eq "") { @@ -319,6 +334,10 @@ sub process_mail_file else { s/^\s*/ /; + if ($type eq 'message_id' || $type eq 'in_reply_to') + { + s/^\s*(<.*>)\s*/$1/; + } $values{$type} .= $_; } } @@ -421,8 +440,10 @@ sub update_table goto restart; # Some mails may have duplicated messages } - $q = "INSERT INTO $opt_table ("; + $q = "INSERT INTO my_mail ("; $q.= "mail_id,"; + $q.= "message_id,"; + $q.= "in_reply_to,"; $q.= "date,"; $q.= "time_zone,"; $q.= "mail_from,"; @@ -435,6 +456,12 @@ sub update_table $q.= "hash"; $q.= ") VALUES ("; $q.= "NULL,"; + $q.= (defined($values->{'message_id'}) ? + $dbh->quote($values->{'message_id'}) : "NULL"); + $q.= ","; + $q.= (defined($values->{'in_reply_to'}) ? + $dbh->quote($values->{'in_reply_to'}) : "NULL"); + $q.= ","; $q.= "'" . $values->{'date'} . "',"; $q.= (defined($values->{'time_zone'}) ? $dbh->quote($values->{'time_zone'}) : "NULL"); @@ -575,7 +602,6 @@ Options: --port=# TCP/IP port to be used with connection. --socket=... MySQL UNIX socket to be used with connection. --db=... Database to be used. ---table=... Table name for mails. --user=... Username for connecting. --password=... Password for the user. --stdin Read mails from stdin. diff --git a/tests/pmail.pl b/tests/pmail.pl index c7f8d4ee368..02d5d60ac0f 100755 --- a/tests/pmail.pl +++ b/tests/pmail.pl @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/perl -w # # Prints mails to standard output # @@ -9,21 +9,25 @@ use DBI; use Getopt::Long; -$VER="1.5"; +$VER="2.0"; @fldnms= ("mail_from","mail_to","cc","date","time_zone","file","sbj","txt"); -$fields=8; -@mail= (@from,@to,@cc,@date,@time_zone,@file,@sbj,@txt); +my $fields= 0; +my $base_q= ""; +my $mail_count= 0; $opt_user= $opt_password= ""; $opt_socket= "/tmp/mysql.sock"; $opt_port= 3306; $opt_db="mail"; -$opt_table="mails"; +$opt_table="my_mail"; $opt_help=$opt_count=0; +$opt_thread= 0; +$opt_host= ""; +$opt_message_id= 0; GetOptions("help","count","port=i","db=s","table=s","host=s","password=s", - "user=s","socket=s") || usage(); + "user=s","socket=s", "thread","message_id") || usage(); if ($opt_host eq '') { @@ -39,81 +43,194 @@ if ($opt_help || !$ARGV[0]) #### Connect and parsing the query to MySQL #### -$dbh= DBI->connect("DBI:mysql:$opt_db:$opt_host:port=$opt_port:mysql_socket=$opt_mysql_socket", $opt_user,$opt_password, { PrintError => 0}) +$dbh= DBI->connect("DBI:mysql:$opt_db:$opt_host:port=$opt_port:mysql_socket=$opt_socket", $opt_user,$opt_password, { PrintError => 0}) || die $DBI::errstr; -if ($opt_count) +main(); + +#### +#### main +#### + +sub main { - count_mails(); + my ($row, $val, $q, $mail, $sth); + + if ($opt_count) + { + count_mails(); + } + + $base_q= "SELECT "; + foreach $val (@fldnms) + { + if (!$fields) + { + $base_q.= "$val"; + } + else + { + $base_q.= ",$val"; + } + $fields++; + } + $base_q.= ",message_id" if ($opt_thread || $opt_message_id); + $base_q.= " FROM $opt_table"; + $q= " WHERE $ARGV[0]"; + + $sth= $dbh->prepare($base_q . $q); + if (!$sth->execute) + { + print "$DBI::errstr\n"; + $sth->finish; + die; + } + for (; ($row= $sth->fetchrow_arrayref); $mail_count++) + { + for ($i= 0; $i < $fields; $i++) + { + if ($opt_message_id) + { + $mail[$fields][$mail_count]= $row->[$fields]; + $mail[$fields][$mail_count].= "\nNumber of Replies: " . get_nr_replies($row->[$fields]); + } + $mail[$i][$mail_count]= $row->[$i]; + } + if ($opt_thread) + { + get_mail_by_message_id($row->[$fields], $mail); + } + } + print_mails($mail); } -$fields=0; -$query = "select "; -foreach $val (@fldnms) +#### +#### Function, which fetches mail by searching in-reply-to with +#### a given message_id. Saves the value (mail) in mail variable. +#### Returns the message id of the mail found and searches again +#### and saves, until no more mails are found with that message_id. +#### + +sub get_mail_by_message_id { - if (!$fields) + my ($message_id, $mail)= @_; + my ($q, $query, $i, $row, $sth); + + $q= " WHERE in_reply_to = \"$message_id\""; + $query= $base_q . $q; + $sth= $dbh->prepare($query); + if (!$sth->execute) { - $query.= "$val"; + print "QUERY: $query\n$DBI::errstr\n"; + $sth->finish; + die; + } + while (($row= $sth->fetchrow_arrayref)) + { + $mail_count++; + for ($i= 0; $i < $fields; $i++) + { + if ($opt_message_id) + { + $mail[$fields][$mail_count]= $row->[$fields]; + $mail[$fields][$mail_count].= "\nNumber of Replies: " . get_nr_replies($row->[$fields]); + } + $mail[$i][$mail_count]= $row->[$i]; + } + $new_message_id= $row->[$fields]; + if (defined($new_message_id) && length($new_message_id)) + { + get_mail_by_message_id($new_message_id, $mail); + } + } + return; +} + +#### +#### Get number of replies for a given message_id +#### + +sub get_nr_replies +{ + my ($message_id)= @_; + my ($sth, $sth2, $q, $row, $row2, $nr_replies); + + $nr_replies= 0; + $q= "SELECT COUNT(*) FROM my_mail WHERE in_reply_to=\"$message_id\""; + $sth= $dbh->prepare($q); + if (!$sth->execute) + { + print "QUERY: $q\n$DBI::errstr\n"; + $sth->finish; + die; + } + while (($row= $sth->fetchrow_arrayref)) + { + if (($nr_replies= $row->[0])) + { + $q= "SELECT message_id FROM my_mail WHERE in_reply_to=\"$message_id\""; + $sth2= $dbh->prepare($q); + if (!$sth2->execute) + { + print "QUERY: $q\n$DBI::errstr\n"; + $sth->finish; + die; + } + while (($row2= $sth2->fetchrow_arrayref)) + { + # There may be several replies to the same mail. Also the + # replies to the 'parent' mail may contain several replies + # and so on. Thus we need to calculate it recursively. + $nr_replies+= get_nr_replies($row2->[0]); + } + } + return $nr_replies; + } +} + +#### +#### Print mails +#### + +sub print_mails +{ + my ($mail)= @_; + my ($i); + + for ($i=0; $mail[0][$i]; $i++) + { + print "#" x 33; + print " " . ($i+1) . ". Mail "; + print "#" x 33; + print "\n"; + if ($opt_message_id) + { + print "Msg ID: $mail[$fields][$i]\n"; + } + print "From: $mail[0][$i]\n"; + print "To: $mail[1][$i]\n"; + print "Cc:" . (defined($mail[2][$i]) ? $mail[2][$i] : "") . "\n"; + print "Date: $mail[3][$i]\n"; + print "Timezone: $mail[4][$i]\n"; + print "File: $mail[5][$i]\n"; + print "Subject: $mail[6][$i]\n"; + print "Message:\n$mail[7][$i]\n"; + } + print "#" x 20; + print " Summary: "; + if ($i == 1) + { + print "$i Mail "; + print "matches the query "; } else { - $query.= ",$val"; + print "$i Mails "; + print "match the query "; } - $fields++; -} -$query.= " from $opt_table where $ARGV[0] order by date desc"; - -#### -#### Send query and save result -#### - -$sth= $dbh->prepare($query); -if (!$sth->execute) -{ - print "$DBI::errstr\n"; - $sth->finish; - die; -} -for ($i=0; ($row= $sth->fetchrow_arrayref); $i++) -{ - for ($j=0; $j < $fields; $j++) - { - $mail[$j][$i]= $row->[$j]; - } -} - -#### -#### Print to stderr -#### - -for ($i=0; $mail[0][$i]; $i++) -{ - print "#" x 33; - print " " . ($i+1) . ". Mail "; - print "#" x 33; - print "\nFrom: $mail[0][$i]\n"; - print "To: $mail[1][$i]\n"; - print "Cc: $mail[2][$i]\n"; - print "Date: $mail[3][$i]\n"; - print "Timezone: $mail[4][$i]\n"; - print "File: $mail[5][$i]\n"; - print "Subject: $mail[6][$i]\n"; - print "Message:\n$mail[7][$i]\n"; -} -print "#" x 20; -print " Summary: "; -if ($i == 1) -{ - print "$i Mail "; - print "matches the query "; -} -else -{ - print "$i Mails "; - print "match the query "; -} -print "#" x 20; -print "\n"; + print "#" x 20; + print "\n"; +} #### #### Count mails that matches the query, but don't show them @@ -121,6 +238,8 @@ print "\n"; sub count_mails { + my ($sth); + $sth= $dbh->prepare("select count(*) from $opt_table where $ARGV[0]"); if (!$sth->execute) { @@ -154,15 +273,21 @@ sub usage Usage: pmail [options] "SQL where clause" Options: - --help show this help - --count Shows how many mails matches the query, but not the mails. - --db= database to use (Default: $opt_db) - --table= table to use (Default: $opt_table) - --host= Hostname which to connect (Default: $opt_host) - --socket= Unix socket to be used for connection (Default: $opt_socket) - --password= Password to use for mysql - --user= User to be used for mysql connection, if not current user - --port= mysql port to be used (Default: $opt_port) + --help show this help + --count Shows how many mails matches the query, but not the mails. + --db= database to use (Default: $opt_db) + --host= Hostname which to connect (Default: $opt_host) + --socket= Unix socket to be used for connection (Default: $opt_socket) + --password= Password to use for mysql + --user= User to be used for mysql connection, if not current user + --port= mysql port to be used (Default: $opt_port) + --thread Will search for possible replies to emails found by the search + criteria. Replies, if found, will be displayed right after the + original mail. + --message_id Display message_id on top of each mail. Useful when searching + email threads with --thread. On the second line is the number + of replies to the same thread, starting counting from that + mail (excluding possible parent mails). "SQL where clause" is the end of the select clause, where the condition is expressed. The result will be the mail(s) that matches the condition and @@ -176,18 +301,20 @@ sub usage - Subject - Message text The field names that can be used in the where clause are: - Field Type - - mail_from varchar(120) - - date datetime - - sbj varchar(200) - - txt mediumtext - - cc text - - mail_to text - - time_zone varchar(6) - - reply varchar(120) - - file varchar(32) - - hash int(11) - An example of the pmail: + Field Type + - message_id varchar(255) # Use with --thread and --message_id + - in_reply_to varchar(255) # Internally used by --thread + - mail_from varchar(120) + - date datetime + - sbj varchar(200) + - txt mediumtext + - cc text + - mail_to text + - time_zone varchar(6) + - reply varchar(120) + - file varchar(32) + - hash int(11) + An example of pmail: pmail "txt like '%libmysql.dll%' and sbj like '%delphi%'" NOTE: the txt field is NOT case sensitive! EOF From dbae73bfa8000ee83e8dfece70e21ded4c505807 Mon Sep 17 00:00:00 2001 From: "pekka@mysql.com" <> Date: Sun, 10 Apr 2005 07:55:30 +0200 Subject: [PATCH 122/204] ndb - testOIBasic.cpp: 4.1->5.0 fix --- ndb/test/ndbapi/testOIBasic.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/ndb/test/ndbapi/testOIBasic.cpp b/ndb/test/ndbapi/testOIBasic.cpp index 96926a421fb..9df983ebe99 100644 --- a/ndb/test/ndbapi/testOIBasic.cpp +++ b/ndb/test/ndbapi/testOIBasic.cpp @@ -482,16 +482,17 @@ Chs::Chs(CHARSET_INFO* cs) : for (unsigned j = 0; j < size; j++) { bytes[j] = urandom(256); } + int not_used; // check wellformed const char* sbytes = (const char*)bytes; - if ((*cs->cset->well_formed_len)(cs, sbytes, sbytes + size, 1) != size) { + if ((*cs->cset->well_formed_len)(cs, sbytes, sbytes + size, 1, ¬_used) != size) { miss1++; continue; } // check no proper prefix wellformed ok = true; for (unsigned j = 1; j < size; j++) { - if ((*cs->cset->well_formed_len)(cs, sbytes, sbytes + j, 1) == j) { + if ((*cs->cset->well_formed_len)(cs, sbytes, sbytes + j, 1, ¬_used) == j) { ok = false; break; } @@ -676,7 +677,8 @@ Col::wellformed(const void* addr) const CHARSET_INFO* cs = m_chs->m_cs; const char* src = (const char*)addr; unsigned len = m_bytelength; - assert((*cs->cset->well_formed_len)(cs, src, src + len, 0xffff) == len); + int not_used; + assert((*cs->cset->well_formed_len)(cs, src, src + len, 0xffff, ¬_used) == len); } break; case Col::Varchar: @@ -685,8 +687,9 @@ Col::wellformed(const void* addr) const const unsigned char* src = (const unsigned char*)addr; const char* ssrc = (const char*)src; unsigned len = src[0]; + int not_used; assert(len <= m_bytelength); - assert((*cs->cset->well_formed_len)(cs, ssrc + 1, ssrc + 1 + len, 0xffff) == len); + assert((*cs->cset->well_formed_len)(cs, ssrc + 1, ssrc + 1 + len, 0xffff, ¬_used) == len); } break; case Col::Longvarchar: @@ -695,8 +698,9 @@ Col::wellformed(const void* addr) const const unsigned char* src = (const unsigned char*)addr; const char* ssrc = (const char*)src; unsigned len = src[0] + (src[1] << 8); + int not_used; assert(len <= m_bytelength); - assert((*cs->cset->well_formed_len)(cs, ssrc + 2, ssrc + 2 + len, 0xffff) == len); + assert((*cs->cset->well_formed_len)(cs, ssrc + 2, ssrc + 2 + len, 0xffff, ¬_used) == len); } break; default: From 16e186779f270bf9877938d20acdcebbee0d2e38 Mon Sep 17 00:00:00 2001 From: "bar@mysql.com" <> Date: Sun, 10 Apr 2005 12:40:33 +0500 Subject: [PATCH 123/204] ctype_collate.result, ctype_collate.test, union.result, union.test: fixing tests accordingly item.cc: Allow mixing non-binary collation and binary collation even if coercibility is the same. For easier 4.0 -> 4.1 migrating. --- mysql-test/r/ctype_collate.result | 13 +++++++++++++ mysql-test/r/union.result | 2 +- mysql-test/t/ctype_collate.test | 12 ++++++++++++ mysql-test/t/union.test | 2 +- sql/item.cc | 11 ++++++++++- 5 files changed, 37 insertions(+), 3 deletions(-) diff --git a/mysql-test/r/ctype_collate.result b/mysql-test/r/ctype_collate.result index bc77e9c2362..cdf890f2c6c 100644 --- a/mysql-test/r/ctype_collate.result +++ b/mysql-test/r/ctype_collate.result @@ -535,6 +535,19 @@ s2 CHAR(5) COLLATE latin1_swedish_ci); SELECT * FROM t1 WHERE s1 = s2; ERROR HY000: Illegal mix of collations (latin1_german1_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '=' DROP TABLE t1; +CREATE TABLE t1 +(s1 CHAR(5) COLLATE latin1_german1_ci, +s2 CHAR(5) COLLATE latin1_swedish_ci, +s3 CHAR(5) COLLATE latin1_bin); +INSERT INTO t1 VALUES ('a','A','A'); +SELECT * FROM t1 WHERE s1 = s2; +ERROR HY000: Illegal mix of collations (latin1_german1_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '=' +SELECT * FROM t1 WHERE s1 = s3; +s1 s2 s3 +SELECT * FROM t1 WHERE s2 = s3; +s1 s2 s3 +a A A +DROP TABLE t1; SET NAMES latin1; CREATE TABLE t1 (s1 char(10) COLLATE latin1_german1_ci, diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 96baf36d151..c140ecd26e1 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -1103,7 +1103,7 @@ count(*) drop table t1; create table t2 ( a char character set latin1 collate latin1_swedish_ci, -b char character set latin1 collate latin1_bin); +b char character set latin1 collate latin1_german1_ci); create table t1 as (select a from t2) union (select b from t2); diff --git a/mysql-test/t/ctype_collate.test b/mysql-test/t/ctype_collate.test index 3599beeacc4..b65067a36cf 100644 --- a/mysql-test/t/ctype_collate.test +++ b/mysql-test/t/ctype_collate.test @@ -158,6 +158,18 @@ SELECT * FROM t1 WHERE s1 = s2; DROP TABLE t1; +CREATE TABLE t1 +(s1 CHAR(5) COLLATE latin1_german1_ci, + s2 CHAR(5) COLLATE latin1_swedish_ci, + s3 CHAR(5) COLLATE latin1_bin); +INSERT INTO t1 VALUES ('a','A','A'); +--error 1267 +SELECT * FROM t1 WHERE s1 = s2; +SELECT * FROM t1 WHERE s1 = s3; +SELECT * FROM t1 WHERE s2 = s3; +DROP TABLE t1; + + # # Test that optimizer doesn't use indexes with wrong collation # diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index 94cbd71c00c..b0446e1ea4a 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -641,7 +641,7 @@ drop table t1; create table t2 ( a char character set latin1 collate latin1_swedish_ci, -b char character set latin1 collate latin1_bin); +b char character set latin1 collate latin1_german1_ci); --error 1271 create table t1 as (select a from t2) union diff --git a/sql/item.cc b/sql/item.cc index 3b87e5ee2cf..ffde92c4214 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -474,8 +474,17 @@ bool DTCollation::aggregate(DTCollation &dt, uint flags) set(0, DERIVATION_NONE); return 1; } + if (collation->state & MY_CS_BINSORT) + { + return 0; + } + else if (dt.collation->state & MY_CS_BINSORT) + { + set(dt); + return 0; + } CHARSET_INFO *bin= get_charset_by_csname(collation->csname, - MY_CS_BINSORT,MYF(0)); + MY_CS_BINSORT,MYF(0)); set(bin, DERIVATION_NONE); } } From 06e36472741258f89f58be90a94bf66ad45bb32c Mon Sep 17 00:00:00 2001 From: "dlenev@mysql.com" <> Date: Mon, 11 Apr 2005 00:30:23 +0400 Subject: [PATCH 124/204] Fix for bug #9796 "Query Cache caches queries with CURRENT_USER() function". We should not cache queries using CURRENT_USER() function as we do it for some other functions, e.g. USER() function. --- mysql-test/r/query_cache.result | 2 ++ mysql-test/t/query_cache.test | 1 + sql/item_create.cc | 1 + 3 files changed, 4 insertions(+) diff --git a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result index 85fe77b1f10..a472a1b75c0 100644 --- a/mysql-test/r/query_cache.result +++ b/mysql-test/r/query_cache.result @@ -299,6 +299,8 @@ select UNIX_TIMESTAMP() from t1; UNIX_TIMESTAMP() select USER() from t1; USER() +select CURRENT_USER() from t1; +CURRENT_USER() select benchmark(1,1) from t1; benchmark(1,1) show status like "Qcache_queries_in_cache"; diff --git a/mysql-test/t/query_cache.test b/mysql-test/t/query_cache.test index 61fbadde1e1..89a9707a237 100644 --- a/mysql-test/t/query_cache.test +++ b/mysql-test/t/query_cache.test @@ -182,6 +182,7 @@ select LAST_INSERT_ID() from t1; select RAND() from t1; select UNIX_TIMESTAMP() from t1; select USER() from t1; +select CURRENT_USER() from t1; select benchmark(1,1) from t1; show status like "Qcache_queries_in_cache"; # diff --git a/sql/item_create.cc b/sql/item_create.cc index 6809d6892b0..877e63047d6 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -297,6 +297,7 @@ Item *create_func_current_user() char buff[HOSTNAME_LENGTH+USERNAME_LENGTH+2]; uint length; + thd->safe_to_cache_query= 0; length= (uint) (strxmov(buff, thd->priv_user, "@", thd->priv_host, NullS) - buff); return new Item_string(NullS, thd->memdup(buff, length), length); From 831a6124833e4c2e5f52f166ce82ab43bd56624d Mon Sep 17 00:00:00 2001 From: "dlenev@brandersnatch.localdomain" <> Date: Mon, 11 Apr 2005 10:44:48 +0400 Subject: [PATCH 125/204] Merging fix for bug #9796 "Query Cache caches queries with CURRENT_USER() function" into 4.1 tree. --- sql/item_create.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/item_create.cc b/sql/item_create.cc index 4b313d49466..2b12a1310b9 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -306,7 +306,7 @@ Item *create_func_current_user() char buff[HOSTNAME_LENGTH+USERNAME_LENGTH+2]; uint length; - thd->safe_to_cache_query= 0; + thd->lex->safe_to_cache_query= 0; length= (uint) (strxmov(buff, thd->priv_user, "@", thd->priv_host, NullS) - buff); return new Item_string(NullS, thd->memdup(buff, length), length, From fc0e6aa274c876fac17705d37b6d802f0e7d02e0 Mon Sep 17 00:00:00 2001 From: "joerg@mysql.com" <> Date: Mon, 11 Apr 2005 11:24:30 +0200 Subject: [PATCH 126/204] Manual transfer of the change in "configure.in" (4.1) to "config/ac-macros/character_sets.m4". --- config/ac-macros/character_sets.m4 | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/config/ac-macros/character_sets.m4 b/config/ac-macros/character_sets.m4 index 6efd31fdb05..3ecc4bb5a03 100644 --- a/config/ac-macros/character_sets.m4 +++ b/config/ac-macros/character_sets.m4 @@ -359,16 +359,23 @@ case $default_charset in ;; utf8) default_charset_default_collation="utf8_general_ci" - define(UTFC1, utf8_general_ci utf8_bin) - define(UTFC2, utf8_czech_ci utf8_danish_ci) - define(UTFC3, utf8_estonian_ci utf8_icelandic_ci) - define(UTFC4, utf8_latvian_ci utf8_lithuanian_ci) - define(UTFC5, utf8_persian_ci utf8_polish_ci utf8_romanian_ci) - define(UTFC6, utf8_slovak_ci utf8_slovenian_ci) - define(UTFC7, utf8_spanish2_ci utf8_spanish_ci) - define(UTFC8, utf8_swedish_ci utf8_turkish_ci) - define(UTFC9, utf8_unicode_ci) - UTFC="UTFC1 UTFC2 UTFC3 UTFC4 UTFC5 UTFC6 UTFC7 UTFC8 UTFC9" + if test "$default_collation" = "utf8_general_cs"; then + # For those who explicitly desire "utf8_general_cs", support it, + # and then also set the CPP switch enabling that code. + UTFC="utf8_general_cs" + AC_DEFINE([HAVE_UTF8_GENERAL_CS], [1], [certain Japanese customer]) + else + define(UTFC1, utf8_general_ci utf8_bin) + define(UTFC2, utf8_czech_ci utf8_danish_ci) + define(UTFC3, utf8_estonian_ci utf8_icelandic_ci) + define(UTFC4, utf8_latvian_ci utf8_lithuanian_ci) + define(UTFC5, utf8_persian_ci utf8_polish_ci utf8_romanian_ci) + define(UTFC6, utf8_slovak_ci utf8_slovenian_ci) + define(UTFC7, utf8_spanish2_ci utf8_spanish_ci) + define(UTFC8, utf8_swedish_ci utf8_turkish_ci) + define(UTFC9, utf8_unicode_ci) + UTFC="UTFC1 UTFC2 UTFC3 UTFC4 UTFC5 UTFC6 UTFC7 UTFC8 UTFC9" + fi default_charset_collations="$UTFC" ;; *) From 698399dc984cb19c285f094b102dfa74844ef66e Mon Sep 17 00:00:00 2001 From: "georg@lmy002.wdf.sap.corp" <> Date: Mon, 11 Apr 2005 12:25:44 +0200 Subject: [PATCH 127/204] Fix for verification tests: truncation of post digits should not return an error --- libmysql/libmysql.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 14517e4f770..073b330ec34 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -3656,6 +3656,7 @@ static void fetch_long_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, } } +#define MY_TRUNC(val) (val < 0 ? - floor(-val) : floor(val)) /* Convert double/float column to supplied buffer of any type. @@ -3688,7 +3689,7 @@ static void fetch_float_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, *buffer= (uint8) value; else *buffer= (int8) value; - *param->error= value != (param->is_unsigned ? (double) ((uint8) *buffer) : + *param->error= MY_TRUNC(value) != (param->is_unsigned ? (double) ((uint8) *buffer) : (double) ((int8) *buffer)); break; case MYSQL_TYPE_SHORT: @@ -3702,7 +3703,7 @@ static void fetch_float_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, short data= (short) value; shortstore(buffer, data); } - *param->error= value != (param->is_unsigned ? (double) (*(ushort*) buffer): + *param->error= MY_TRUNC(value) != (param->is_unsigned ? (double) (*(ushort*) buffer): (double) (*(short*) buffer)); break; case MYSQL_TYPE_LONG: @@ -3716,7 +3717,7 @@ static void fetch_float_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, int32 data= (int32) value; longstore(buffer, data); } - *param->error= value != (param->is_unsigned ? (double) (*(uint32*) buffer): + *param->error= MY_TRUNC(value) != (param->is_unsigned ? (double) (*(uint32*) buffer): (double) (*(int32*) buffer)); break; case MYSQL_TYPE_LONGLONG: @@ -3730,7 +3731,7 @@ static void fetch_float_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, longlong data= (longlong) value; longlongstore(buffer, data); } - *param->error= value != (param->is_unsigned ? + *param->error= MY_TRUNC(value) != (param->is_unsigned ? ulonglong2double(*(ulonglong*) buffer) : (double) (*(longlong*) buffer)); break; From fd5b9f7ed7ef9b852752cc40f0b09a4883e787c4 Mon Sep 17 00:00:00 2001 From: "pekka@mysql.com" <> Date: Mon, 11 Apr 2005 12:43:58 +0200 Subject: [PATCH 128/204] ndb - csc#4847 - manual merge 4.1->5.0 --- ndb/include/ndbapi/NdbScanOperation.hpp | 2 +- ndb/src/ndbapi/NdbScanOperation.cpp | 28 ++++++++++++++++++------- ndb/src/ndbapi/NdbTransaction.cpp | 6 +++--- ndb/src/ndbapi/Ndblist.cpp | 11 ++++++++++ sql/ha_ndbcluster.cc | 4 ++-- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/ndb/include/ndbapi/NdbScanOperation.hpp b/ndb/include/ndbapi/NdbScanOperation.hpp index 5da717148b5..1c9649195d2 100644 --- a/ndb/include/ndbapi/NdbScanOperation.hpp +++ b/ndb/include/ndbapi/NdbScanOperation.hpp @@ -115,7 +115,7 @@ public: /** * Close scan */ - void close(bool forceSend = false); + void close(bool forceSend = false, bool releaseOp = false); /** * Update current tuple diff --git a/ndb/src/ndbapi/NdbScanOperation.cpp b/ndb/src/ndbapi/NdbScanOperation.cpp index 9cd78ec721b..5980f2588bc 100644 --- a/ndb/src/ndbapi/NdbScanOperation.cpp +++ b/ndb/src/ndbapi/NdbScanOperation.cpp @@ -633,8 +633,14 @@ NdbScanOperation::doSend(int ProcessorId) return 0; } -void NdbScanOperation::close(bool forceSend) +void NdbScanOperation::close(bool forceSend, bool releaseOp) { + DBUG_ENTER("NdbScanOperation::close"); + DBUG_PRINT("enter", ("this=%x tcon=%x con=%x force=%d release=%d", + (UintPtr)this, + (UintPtr)m_transConnection, (UintPtr)theNdbCon, + forceSend, releaseOp)); + if(m_transConnection){ if(DEBUG_NEXT_RESULT) ndbout_c("close() theError.code = %d " @@ -650,13 +656,21 @@ void NdbScanOperation::close(bool forceSend) Guard guard(tp->theMutexPtr); close_impl(tp, forceSend); - } while(0); - - theNdbCon->theScanningOp = 0; - theNdb->closeTransaction(theNdbCon); - - theNdbCon = 0; + } + + NdbConnection* tCon = theNdbCon; + NdbConnection* tTransCon = m_transConnection; + theNdbCon = NULL; m_transConnection = NULL; + + if (releaseOp && tTransCon) { + NdbIndexScanOperation* tOp = (NdbIndexScanOperation*)this; + tTransCon->releaseExecutedScanOperation(tOp); + } + + tCon->theScanningOp = 0; + theNdb->closeTransaction(tCon); + DBUG_VOID_RETURN; } void diff --git a/ndb/src/ndbapi/NdbTransaction.cpp b/ndb/src/ndbapi/NdbTransaction.cpp index c2ded3560fc..e32a7ddf70a 100644 --- a/ndb/src/ndbapi/NdbTransaction.cpp +++ b/ndb/src/ndbapi/NdbTransaction.cpp @@ -954,9 +954,9 @@ void releaseExecutedScanOperation(); Remark: Release scan op when hupp'ed trans closed (save memory) ******************************************************************************/ void -NdbConnection::releaseExecutedScanOperation(NdbIndexScanOperation* cursorOp) +NdbTransaction::releaseExecutedScanOperation(NdbIndexScanOperation* cursorOp) { - DBUG_ENTER("NdbConnection::releaseExecutedScanOperation"); + DBUG_ENTER("NdbTransaction::releaseExecutedScanOperation"); DBUG_PRINT("enter", ("this=0x%x op=0x%x", (UintPtr)this, (UintPtr)cursorOp)) // here is one reason to make op lists doubly linked @@ -977,7 +977,7 @@ NdbConnection::releaseExecutedScanOperation(NdbIndexScanOperation* cursorOp) } } DBUG_VOID_RETURN; -}//NdbConnection::releaseExecutedScanOperation() +}//NdbTransaction::releaseExecutedScanOperation() /***************************************************************************** NdbOperation* getNdbOperation(const char* aTableName); diff --git a/ndb/src/ndbapi/Ndblist.cpp b/ndb/src/ndbapi/Ndblist.cpp index df90f3378ab..6dfd76c160b 100644 --- a/ndb/src/ndbapi/Ndblist.cpp +++ b/ndb/src/ndbapi/Ndblist.cpp @@ -550,10 +550,21 @@ Remark: Add a NdbScanOperation object into the signal idlelist. void Ndb::releaseScanOperation(NdbIndexScanOperation* aScanOperation) { + DBUG_ENTER("Ndb::releaseScanOperation"); + DBUG_PRINT("enter", ("op=%x", (UintPtr)aScanOperation)); +#ifdef ndb_release_check_dup + { NdbIndexScanOperation* tOp = theScanOpIdleList; + while (tOp != NULL) { + assert(tOp != aScanOperation); + tOp = (NdbIndexScanOperation*)tOp->theNext; + } + } +#endif aScanOperation->next(theScanOpIdleList); aScanOperation->theNdbCon = NULL; aScanOperation->theMagicNumber = 0xFE11D2; theScanOpIdleList = aScanOperation; + DBUG_VOID_RETURN; } /*************************************************************************** diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 44fadd3e6cf..70e6e1d98f8 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -2685,7 +2685,7 @@ int ha_ndbcluster::close_scan() m_ops_pending= 0; } - cursor->close(m_force_send); + cursor->close(m_force_send, true); m_active_cursor= m_multi_cursor= NULL; DBUG_RETURN(0); } @@ -5694,7 +5694,7 @@ ha_ndbcluster::read_multi_range_next(KEY_MULTI_RANGE ** multi_range_found_p) close_scan: if (res == 1) { - m_multi_cursor->close(); + m_multi_cursor->close(false, true); m_active_cursor= m_multi_cursor= 0; DBUG_MULTI_RANGE(8); continue; From ace47c77bea9e973fa503e423adc6609a74e8f64 Mon Sep 17 00:00:00 2001 From: "petr@mysql.com" <> Date: Mon, 11 Apr 2005 17:08:34 +0400 Subject: [PATCH 129/204] Fix for Bug #9589 --- server-tools/instance-manager/options.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server-tools/instance-manager/options.cc b/server-tools/instance-manager/options.cc index 4b5ec27f302..4568d6b578d 100644 --- a/server-tools/instance-manager/options.cc +++ b/server-tools/instance-manager/options.cc @@ -130,7 +130,7 @@ static void version() } -static const char *default_groups[]= { "mysql", "manager", 0 }; +static const char *default_groups[]= { "manager", 0 }; static void usage() From 48b3332b8ac654df7acdb79e33faf84b5db64f72 Mon Sep 17 00:00:00 2001 From: "petr@mysql.com" <> Date: Mon, 11 Apr 2005 17:14:40 +0400 Subject: [PATCH 130/204] Fix for bug #9808 --- server-tools/instance-manager/commands.cc | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/server-tools/instance-manager/commands.cc b/server-tools/instance-manager/commands.cc index 426f0cc40b2..e1f811ef57d 100644 --- a/server-tools/instance-manager/commands.cc +++ b/server-tools/instance-manager/commands.cc @@ -294,13 +294,19 @@ int Show_instance_options::do_command(struct st_net *net, char *tmp_option, *option_value; get_dynamic(&(instance->options.options_array), (gptr) &tmp_option, i); option_value= strchr(tmp_option, '='); - /* split the option string into two parts */ - *option_value= 0; + /* split the option string into two parts if it has a value */ + position= 0; - store_to_string(&send_buff, tmp_option + 2, &position); - store_to_string(&send_buff, option_value + 1, &position); - /* join name and the value into the same option again */ - *option_value= '='; + if (option_value != NULL) + { + *option_value= 0; + store_to_string(&send_buff, tmp_option + 2, &position); + store_to_string(&send_buff, option_value + 1, &position); + /* join name and the value into the same option again */ + *option_value= '='; + } + else store_to_string(&send_buff, tmp_option + 2, &position); + if (send_buff.is_error() || my_net_write(net, send_buff.buffer, (uint) position)) goto err; From da1d303001d6c90e143bc7404ee8f44a3318a5ea Mon Sep 17 00:00:00 2001 From: "petr@mysql.com" <> Date: Mon, 11 Apr 2005 17:19:12 +0400 Subject: [PATCH 131/204] make server logs less frightening, when using IM --- server-tools/instance-manager/instance.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server-tools/instance-manager/instance.cc b/server-tools/instance-manager/instance.cc index 00fcf6c3a98..9fdcab7ce7c 100644 --- a/server-tools/instance-manager/instance.cc +++ b/server-tools/instance-manager/instance.cc @@ -191,8 +191,8 @@ bool Instance::is_running() MYSQL mysql; uint port= 0; const char *socket= NULL; - const char *password= "321rarepassword213"; - const char *username= "645rareusername945"; + const char *password= "check_connection"; + const char *username= "MySQL_Instance_Manager"; const char *access_denied_message= "Access denied for user"; bool return_val; From c7c928f168b531db6a2e2fe60e7824167b12da76 Mon Sep 17 00:00:00 2001 From: "gbichot@quadita2.mysql.com" <> Date: Mon, 11 Apr 2005 16:46:03 +0200 Subject: [PATCH 132/204] Fix for BUG#9149 "OPTIMIZE TABLE statement on InnoDB table is logged twice in the binary log" if we fall back to mysql_alter_table() (for InnoDB), don't do binlogging in mysql_alter_table(), as mysql_admin_table() is not supposed to do any binlogging (it is done by the caller). --- sql/sql_table.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 84f51a95691..f3f8511026b 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -2041,7 +2041,9 @@ send_result_message: close_thread_tables(thd); TABLE_LIST *save_next= table->next; table->next= 0; + tmp_disable_binlog(thd); // binlogging is done by caller if wanted result_code= mysql_recreate_table(thd, table, 0); + reenable_binlog(thd); close_thread_tables(thd); if (!result_code) // recreation went ok { From f356fb08d6ba3b4b0259fe34a20cf5c8afd26487 Mon Sep 17 00:00:00 2001 From: "gbichot@quadita2.mysql.com" <> Date: Mon, 11 Apr 2005 17:37:49 +0200 Subject: [PATCH 133/204] In configure.in, don't remove $AVAILABLE_LANGUAGES_ERRORS_RULES at end because config.status may later need this file (if it does not find it it won't incorporate dependencies of errmsg.sys in sql/share/Makefile) (thx Serg). In sql/share/Makefile.am using "all:" leads to double-"all:" in Makefile (thx Konstantin). --- configure.in | 1 - sql/share/Makefile.am | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/configure.in b/configure.in index c4bd95b9a24..3ca60a9faed 100644 --- a/configure.in +++ b/configure.in @@ -3238,7 +3238,6 @@ AC_CONFIG_FILES(Makefile extra/Makefile mysys/Makefile dnl AC_CONFIG_COMMANDS([default], , test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h) AC_OUTPUT -rm -f $AVAILABLE_LANGUAGES_ERRORS_RULES echo echo "MySQL has a Web site at http://www.mysql.com/ which carries details on the" echo "latest release, upcoming features, and other information to make your" diff --git a/sql/share/Makefile.am b/sql/share/Makefile.am index 662159a9c63..9f636e02535 100644 --- a/sql/share/Makefile.am +++ b/sql/share/Makefile.am @@ -9,7 +9,7 @@ dist-hook: $(INSTALL_DATA) $(srcdir)/charsets/README $(distdir)/charsets $(INSTALL_DATA) $(srcdir)/charsets/Index.xml $(distdir)/charsets -all: @AVAILABLE_LANGUAGES_ERRORS@ +all-local: @AVAILABLE_LANGUAGES_ERRORS@ # this is ugly, but portable @AVAILABLE_LANGUAGES_ERRORS_RULES@ From 0294339b9c20ef5559042caf9a78c913d62f40f6 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Mon, 11 Apr 2005 20:04:50 +0200 Subject: [PATCH 134/204] don't check record's checksum in REPAIR --- myisam/mi_check.c | 7 +++++-- myisam/mi_dynrec.c | 11 ++++------- myisam/myisamdef.h | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/myisam/mi_check.c b/myisam/mi_check.c index 0123278a23f..f710d3a8454 100644 --- a/myisam/mi_check.c +++ b/myisam/mi_check.c @@ -971,7 +971,8 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend) info->checksum=mi_checksum(info,record); if (param->testflag & (T_EXTEND | T_MEDIUM | T_VERBOSE)) { - if (_mi_rec_check(info,record, info->rec_buff,block_info.rec_len)) + if (_mi_rec_check(info,record, info->rec_buff,block_info.rec_len, + test(info->s->calc_checksum))) { mi_check_print_error(param,"Found wrong packed record at %s", llstr(start_recpos,llbuff)); @@ -3024,7 +3025,9 @@ static int sort_get_next_record(MI_SORT_PARAM *sort_param) if ((param->testflag & (T_EXTEND | T_REP)) || searching) { if (_mi_rec_check(info, sort_param->record, sort_param->rec_buff, - sort_param->find_length)) + sort_param->find_length, + (param->testflag & T_QUICK) && + test(info->s->calc_checksum))) { mi_check_print_info(param,"Found wrong packed record at %s", llstr(sort_param->start_recpos,llbuff)); diff --git a/myisam/mi_dynrec.c b/myisam/mi_dynrec.c index 0b8d3c97872..43783ca2d36 100644 --- a/myisam/mi_dynrec.c +++ b/myisam/mi_dynrec.c @@ -806,7 +806,7 @@ uint _mi_rec_pack(MI_INFO *info, register byte *to, register const byte *from) */ my_bool _mi_rec_check(MI_INFO *info,const char *record, byte *rec_buff, - ulong packed_length) + ulong packed_length, my_bool with_checksum) { uint length,new_length,flag,bit,i; char *pos,*end,*packpos,*to; @@ -901,13 +901,10 @@ my_bool _mi_rec_check(MI_INFO *info,const char *record, byte *rec_buff, if (packed_length != (uint) (to - rec_buff) + test(info->s->calc_checksum) || (bit != 1 && (flag & ~(bit - 1)))) goto err; - if (info->s->calc_checksum) + if (with_checksum && ((uchar) info->checksum != (uchar) *to)) { - if ((uchar) info->checksum != (uchar) *to) - { - DBUG_PRINT("error",("wrong checksum for row")); - goto err; - } + DBUG_PRINT("error",("wrong checksum for row")); + goto err; } DBUG_RETURN(0); diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h index 916932c9eb3..a41bcf5449b 100644 --- a/myisam/myisamdef.h +++ b/myisam/myisamdef.h @@ -582,7 +582,7 @@ extern byte *mi_alloc_rec_buff(MI_INFO *,ulong, byte**); extern ulong _mi_rec_unpack(MI_INFO *info,byte *to,byte *from, ulong reclength); extern my_bool _mi_rec_check(MI_INFO *info,const char *record, byte *packpos, - ulong reclength); + ulong packed_length, my_bool with_checkum); extern int _mi_write_part_record(MI_INFO *info,my_off_t filepos,ulong length, my_off_t next_filepos,byte **record, ulong *reclength,int *flag); From 98601055b6a73ceee7fe683ea2832d5abd4701c7 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Mon, 11 Apr 2005 22:36:07 +0200 Subject: [PATCH 135/204] backport kill.test fix from 5.0 --- mysql-test/r/kill.result | 2 +- mysql-test/t/kill.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/kill.result b/mysql-test/r/kill.result index dcf17e4bf52..ba9ba2833f6 100644 --- a/mysql-test/r/kill.result +++ b/mysql-test/r/kill.result @@ -6,7 +6,7 @@ select ((@id := kill_id) - kill_id) from t1; 0 kill @id; select 1; -ERROR HY000: MySQL server has gone away +Got one of the listed errors select ((@id := kill_id) - kill_id) from t1; ((@id := kill_id) - kill_id) 0 diff --git a/mysql-test/t/kill.test b/mysql-test/t/kill.test index 4afb60a7bdd..1fec41d8ee4 100644 --- a/mysql-test/t/kill.test +++ b/mysql-test/t/kill.test @@ -27,7 +27,7 @@ connection con1; --disable_reconnect # this statement should fail ---error 2006 +--error 2006,2013 select 1; --enable_reconnect # this should work, and we should have a new connection_id() From 1cbe701d78ac3d52d4cce96570bbdafe06b60a95 Mon Sep 17 00:00:00 2001 From: "georg@lmy002.wdf.sap.corp" <> Date: Tue, 12 Apr 2005 08:51:26 +0200 Subject: [PATCH 136/204] Fix for verification tests: loss of decimal places should not return an error --- libmysql/libmysql.c | 13 ++++++------- tests/mysql_client_test.c | 5 ++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 073b330ec34..dbdaadf86bf 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -3656,8 +3656,6 @@ static void fetch_long_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, } } -#define MY_TRUNC(val) (val < 0 ? - floor(-val) : floor(val)) - /* Convert double/float column to supplied buffer of any type. @@ -3674,6 +3672,7 @@ static void fetch_float_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, double value, int width) { char *buffer= (char *)param->buffer; + double val64 = (value < 0 ? -floor(-value) : floor(value)); switch (param->buffer_type) { case MYSQL_TYPE_NULL: /* do nothing */ @@ -3689,8 +3688,8 @@ static void fetch_float_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, *buffer= (uint8) value; else *buffer= (int8) value; - *param->error= MY_TRUNC(value) != (param->is_unsigned ? (double) ((uint8) *buffer) : - (double) ((int8) *buffer)); + *param->error= val64 != (param->is_unsigned ? (double)((uint8) *buffer) : + (double)((int8) *buffer)); break; case MYSQL_TYPE_SHORT: if (param->is_unsigned) @@ -3703,7 +3702,7 @@ static void fetch_float_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, short data= (short) value; shortstore(buffer, data); } - *param->error= MY_TRUNC(value) != (param->is_unsigned ? (double) (*(ushort*) buffer): + *param->error= val64 != (param->is_unsigned ? (double) (*(ushort*) buffer): (double) (*(short*) buffer)); break; case MYSQL_TYPE_LONG: @@ -3717,7 +3716,7 @@ static void fetch_float_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, int32 data= (int32) value; longstore(buffer, data); } - *param->error= MY_TRUNC(value) != (param->is_unsigned ? (double) (*(uint32*) buffer): + *param->error= val64 != (param->is_unsigned ? (double) (*(uint32*) buffer): (double) (*(int32*) buffer)); break; case MYSQL_TYPE_LONGLONG: @@ -3731,7 +3730,7 @@ static void fetch_float_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, longlong data= (longlong) value; longlongstore(buffer, data); } - *param->error= MY_TRUNC(value) != (param->is_unsigned ? + *param->error= val64 != (param->is_unsigned ? ulonglong2double(*(ulonglong*) buffer) : (double) (*(longlong*) buffer)); break; diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 2dd5fda6f05..9b7c8281043 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -3654,8 +3654,8 @@ static void test_bind_result_ext1() check_execute(stmt, rc); rc= mysql_stmt_fetch(stmt); - DIE_UNLESS(rc == MYSQL_DATA_TRUNCATED); - DIE_UNLESS(bind[4].error_value == 1); + printf("rc=%d\n", rc); + DIE_UNLESS(rc == 0); if (!opt_silent) { @@ -12462,7 +12462,6 @@ static void test_truncation() /* double -> longlong: fractional part is lost */ DIE_UNLESS(++bind < bind_array + bind_count); - DIE_UNLESS(*bind->error && * (longlong*) bind->buffer == 123); /* double -> ulonglong, negative fp number to unsigned integer */ DIE_UNLESS(++bind < bind_array + bind_count); From c4376b2bc60d375e73c73c22bbb76a648b1a0639 Mon Sep 17 00:00:00 2001 From: "ramil@mysql.com" <> Date: Tue, 12 Apr 2005 12:27:43 +0500 Subject: [PATCH 137/204] Bit type support for non-MyISAM tables. --- mysql-test/r/innodb.result | 2 - mysql-test/r/type_bit.result | 57 +++++ mysql-test/r/type_bit_innodb.result | 382 ++++++++++++++++++++++++++++ mysql-test/t/innodb.test | 5 - mysql-test/t/type_bit.test | 20 ++ mysql-test/t/type_bit_innodb.test | 123 +++++++++ sql/field.cc | 72 +++++- sql/field.h | 19 ++ sql/field_conv.cc | 3 +- sql/ha_innodb.cc | 2 + sql/sql_table.cc | 18 +- sql/table.cc | 2 +- 12 files changed, 682 insertions(+), 23 deletions(-) create mode 100644 mysql-test/r/type_bit_innodb.result create mode 100644 mysql-test/t/type_bit_innodb.test diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index 3f9962144ff..ccd8601ace0 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -2382,5 +2382,3 @@ drop table t1; set storage_engine=MyISAM; create table t1 (v varchar(16384)) engine=innodb; drop table t1; -create table t1 (a bit, key(a)) engine=innodb; -ERROR 42000: The storage engine for the table doesn't support BIT FIELD diff --git a/mysql-test/r/type_bit.result b/mysql-test/r/type_bit.result index 04179a46285..b0cd4150c9d 100644 --- a/mysql-test/r/type_bit.result +++ b/mysql-test/r/type_bit.result @@ -380,3 +380,60 @@ drop table t1; create table t1(a int, b bit not null); alter table t1 add primary key (a); drop table t1; +create table t1 (a bit(19), b bit(5)); +insert into t1 values (1000, 10), (3, 8), (200, 6), (2303, 2), (12345, 4), (1, 0); +select a+0, b+0 from t1; +a+0 b+0 +1000 10 +3 8 +200 6 +2303 2 +12345 4 +1 0 +alter table t1 engine=heap; +select a+0, b+0 from t1; +a+0 b+0 +1000 10 +3 8 +200 6 +2303 2 +12345 4 +1 0 +alter table t1 add key(a, b); +select a+0, b+0 from t1; +a+0 b+0 +1000 10 +3 8 +200 6 +2303 2 +12345 4 +1 0 +alter table t1 engine=myisam; +select a+0, b+0 from t1; +a+0 b+0 +1 0 +3 8 +200 6 +1000 10 +2303 2 +12345 4 +create table t2 engine=heap select * from t1; +select a+0, b+0 from t2; +a+0 b+0 +1 0 +3 8 +200 6 +1000 10 +2303 2 +12345 4 +drop table t1; +create table t1 select * from t2; +select a+0, b+0 from t1; +a+0 b+0 +1 0 +3 8 +200 6 +1000 10 +2303 2 +12345 4 +drop table t1, t2; diff --git a/mysql-test/r/type_bit_innodb.result b/mysql-test/r/type_bit_innodb.result new file mode 100644 index 00000000000..57068f6502a --- /dev/null +++ b/mysql-test/r/type_bit_innodb.result @@ -0,0 +1,382 @@ +select 0 + b'1'; +0 + b'1' +1 +select 0 + b'0'; +0 + b'0' +0 +select 0 + b'000001'; +0 + b'000001' +1 +select 0 + b'000011'; +0 + b'000011' +3 +select 0 + b'000101'; +0 + b'000101' +5 +select 0 + b'000000'; +0 + b'000000' +0 +select 0 + b'10000000'; +0 + b'10000000' +128 +select 0 + b'11111111'; +0 + b'11111111' +255 +select 0 + b'10000001'; +0 + b'10000001' +129 +select 0 + b'1000000000000000'; +0 + b'1000000000000000' +32768 +select 0 + b'1111111111111111'; +0 + b'1111111111111111' +65535 +select 0 + b'1000000000000001'; +0 + b'1000000000000001' +32769 +drop table if exists t1; +create table t1 (a bit(65)) engine=innodb; +ERROR 42000: Column length too big for column 'a' (max = 64); use BLOB or TEXT instead +create table t1 (a bit(0)) engine=innodb; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bit(1) default NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +drop table t1; +create table t1 (a bit(64)) engine=innodb; +insert into t1 values +(b'1111111111111111111111111111111111111111111111111111111111111111'), +(b'1000000000000000000000000000000000000000000000000000000000000000'), +(b'0000000000000000000000000000000000000000000000000000000000000001'), +(b'1010101010101010101010101010101010101010101010101010101010101010'), +(b'0101010101010101010101010101010101010101010101010101010101010101'); +select hex(a) from t1; +hex(a) +FFFFFFFFFFFFFFFF +8000000000000000 +1 +AAAAAAAAAAAAAAAA +5555555555555555 +drop table t1; +create table t1 (a bit) engine=innodb; +insert into t1 values (b'0'), (b'1'), (b'000'), (b'100'), (b'001'); +Warnings: +Warning 1264 Out of range value adjusted for column 'a' at row 4 +select hex(a) from t1; +hex(a) +0 +1 +0 +1 +1 +alter table t1 add unique (a); +ERROR 23000: Duplicate entry '' for key 1 +drop table t1; +create table t1 (a bit(2)) engine=innodb; +insert into t1 values (b'00'), (b'01'), (b'10'), (b'100'); +Warnings: +Warning 1264 Out of range value adjusted for column 'a' at row 4 +select a+0 from t1; +a+0 +0 +1 +2 +3 +alter table t1 add key (a); +explain select a+0 from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index NULL a 2 NULL 4 Using index +select a+0 from t1; +a+0 +0 +1 +2 +3 +drop table t1; +create table t1 (a bit(7), b bit(9), key(a, b)) engine=innodb; +insert into t1 values +(94, 46), (31, 438), (61, 152), (78, 123), (88, 411), (122, 118), (0, 177), +(75, 42), (108, 67), (79, 349), (59, 188), (68, 206), (49, 345), (118, 380), +(111, 368), (94, 468), (56, 379), (77, 133), (29, 399), (9, 363), (23, 36), +(116, 390), (119, 368), (87, 351), (123, 411), (24, 398), (34, 202), (28, 499), +(30, 83), (5, 178), (60, 343), (4, 245), (104, 280), (106, 446), (127, 403), +(44, 307), (68, 454), (57, 135); +explain select a+0 from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index NULL a 5 NULL 38 Using index +select a+0 from t1; +a+0 +0 +4 +5 +9 +23 +24 +28 +29 +30 +31 +34 +44 +49 +56 +57 +59 +60 +61 +68 +68 +75 +77 +78 +79 +87 +88 +94 +94 +104 +106 +108 +111 +116 +118 +119 +122 +123 +127 +explain select b+0 from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index NULL a 5 NULL 38 Using index +select b+0 from t1; +b+0 +177 +245 +178 +363 +36 +398 +499 +399 +83 +438 +202 +307 +345 +379 +135 +188 +343 +152 +206 +454 +42 +133 +123 +349 +351 +411 +46 +468 +280 +446 +67 +368 +390 +380 +368 +118 +411 +403 +explain select a+0, b+0 from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index NULL a 5 NULL 38 Using index +select a+0, b+0 from t1; +a+0 b+0 +0 177 +4 245 +5 178 +9 363 +23 36 +24 398 +28 499 +29 399 +30 83 +31 438 +34 202 +44 307 +49 345 +56 379 +57 135 +59 188 +60 343 +61 152 +68 206 +68 454 +75 42 +77 133 +78 123 +79 349 +87 351 +88 411 +94 46 +94 468 +104 280 +106 446 +108 67 +111 368 +116 390 +118 380 +119 368 +122 118 +123 411 +127 403 +explain select a+0, b+0 from t1 where a > 40 and b > 200 order by 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 2 NULL 19 Using where; Using index; Using filesort +select a+0, b+0 from t1 where a > 40 and b > 200 order by 1; +a+0 b+0 +44 307 +49 345 +56 379 +60 343 +68 206 +68 454 +79 349 +87 351 +88 411 +94 468 +104 280 +106 446 +111 368 +116 390 +118 380 +119 368 +123 411 +127 403 +explain select a+0, b+0 from t1 where a > 40 and a < 70 order by 2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 2 NULL 8 Using where; Using index; Using filesort +select a+0, b+0 from t1 where a > 40 and a < 70 order by 2; +a+0 b+0 +57 135 +61 152 +59 188 +68 206 +44 307 +60 343 +49 345 +56 379 +68 454 +set @@max_length_for_sort_data=0; +select a+0, b+0 from t1 where a > 40 and a < 70 order by 2; +a+0 b+0 +57 135 +61 152 +59 188 +68 206 +44 307 +60 343 +49 345 +56 379 +68 454 +select hex(min(a)) from t1; +hex(min(a)) +0 +select hex(min(b)) from t1; +hex(min(b)) +24 +select hex(min(a)), hex(max(a)), hex(min(b)), hex(max(b)) from t1; +hex(min(a)) hex(max(a)) hex(min(b)) hex(max(b)) +0 7F 24 1F3 +drop table t1; +create table t1 (a int not null, b bit, c bit(9), key(a, b, c)) engine=innodb; +insert into t1 values +(4, NULL, 1), (4, 0, 3), (2, 1, 4), (1, 1, 100), (4, 0, 23), (4, 0, 54), +(56, 0, 22), (4, 1, 100), (23, 0, 1), (4, 0, 34); +select a+0, b+0, c+0 from t1; +a+0 b+0 c+0 +1 1 100 +2 1 4 +4 NULL 1 +4 0 3 +4 0 23 +4 0 34 +4 0 54 +4 1 100 +23 0 1 +56 0 22 +select hex(min(b)) from t1 where a = 4; +hex(min(b)) +0 +select hex(min(c)) from t1 where a = 4 and b = 0; +hex(min(c)) +3 +select hex(max(b)) from t1; +hex(max(b)) +1 +select a+0, b+0, c+0 from t1 where a = 4 and b = 0 limit 2; +a+0 b+0 c+0 +4 0 3 +4 0 23 +select a+0, b+0, c+0 from t1 where a = 4 and b = 1; +a+0 b+0 c+0 +4 1 100 +select a+0, b+0, c+0 from t1 where a = 4 and b = 1 and c=100; +a+0 b+0 c+0 +4 1 100 +select a+0, b+0, c+0 from t1 order by b desc; +a+0 b+0 c+0 +2 1 4 +1 1 100 +4 1 100 +4 0 3 +4 0 23 +4 0 54 +56 0 22 +23 0 1 +4 0 34 +4 NULL 1 +select a+0, b+0, c+0 from t1 order by c; +a+0 b+0 c+0 +4 NULL 1 +23 0 1 +4 0 3 +2 1 4 +56 0 22 +4 0 23 +4 0 34 +4 0 54 +1 1 100 +4 1 100 +drop table t1; +create table t1(a bit(2), b bit(2)) engine=innodb; +insert into t1 (a) values (0x01), (0x03), (0x02); +update t1 set b= concat(a); +select a+0, b+0 from t1; +a+0 b+0 +1 1 +3 3 +2 2 +drop table t1; +create table t1 (a bit(7), key(a)) engine=innodb; +insert into t1 values (44), (57); +select a+0 from t1; +a+0 +44 +57 +drop table t1; +create table t1 (a bit(3), b bit(12)) engine=innodb; +insert into t1 values (7,(1<<12)-2), (0x01,0x01ff); +select hex(a),hex(b) from t1; +hex(a) hex(b) +7 FFE +1 1FF +select hex(concat(a)),hex(concat(b)) from t1; +hex(concat(a)) hex(concat(b)) +07 0FFE +01 01FF +drop table t1; +create table t1(a int, b bit not null) engine=innodb; +alter table t1 add primary key (a); +drop table t1; diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test index cca3e7ed3ad..bd07d2220d2 100644 --- a/mysql-test/t/innodb.test +++ b/mysql-test/t/innodb.test @@ -1300,8 +1300,3 @@ eval set storage_engine=$default; # InnoDB specific varchar tests create table t1 (v varchar(16384)) engine=innodb; drop table t1; - -# The following should be moved to type_bit.test when innodb will support it ---error 1178 -create table t1 (a bit, key(a)) engine=innodb; - diff --git a/mysql-test/t/type_bit.test b/mysql-test/t/type_bit.test index 5303a55fb25..1fbcf01d5a6 100644 --- a/mysql-test/t/type_bit.test +++ b/mysql-test/t/type_bit.test @@ -120,3 +120,23 @@ drop table t1; create table t1(a int, b bit not null); alter table t1 add primary key (a); drop table t1; + +# +# myisam <-> heap +# + +create table t1 (a bit(19), b bit(5)); +insert into t1 values (1000, 10), (3, 8), (200, 6), (2303, 2), (12345, 4), (1, 0); +select a+0, b+0 from t1; +alter table t1 engine=heap; +select a+0, b+0 from t1; +alter table t1 add key(a, b); +select a+0, b+0 from t1; +alter table t1 engine=myisam; +select a+0, b+0 from t1; +create table t2 engine=heap select * from t1; +select a+0, b+0 from t2; +drop table t1; +create table t1 select * from t2; +select a+0, b+0 from t1; +drop table t1, t2; diff --git a/mysql-test/t/type_bit_innodb.test b/mysql-test/t/type_bit_innodb.test new file mode 100644 index 00000000000..6410b98fcd0 --- /dev/null +++ b/mysql-test/t/type_bit_innodb.test @@ -0,0 +1,123 @@ +--source include/have_innodb.inc +# +# testing of the BIT column type +# + +select 0 + b'1'; +select 0 + b'0'; +select 0 + b'000001'; +select 0 + b'000011'; +select 0 + b'000101'; +select 0 + b'000000'; +select 0 + b'10000000'; +select 0 + b'11111111'; +select 0 + b'10000001'; +select 0 + b'1000000000000000'; +select 0 + b'1111111111111111'; +select 0 + b'1000000000000001'; + +--disable_warnings +drop table if exists t1; +--enable_warnings + +--error 1074 +create table t1 (a bit(65)) engine=innodb; + +create table t1 (a bit(0)) engine=innodb; +show create table t1; +drop table t1; + +create table t1 (a bit(64)) engine=innodb; +insert into t1 values +(b'1111111111111111111111111111111111111111111111111111111111111111'), +(b'1000000000000000000000000000000000000000000000000000000000000000'), +(b'0000000000000000000000000000000000000000000000000000000000000001'), +(b'1010101010101010101010101010101010101010101010101010101010101010'), +(b'0101010101010101010101010101010101010101010101010101010101010101'); +select hex(a) from t1; +drop table t1; + +create table t1 (a bit) engine=innodb; +insert into t1 values (b'0'), (b'1'), (b'000'), (b'100'), (b'001'); +select hex(a) from t1; +--error 1062 +alter table t1 add unique (a); +drop table t1; + +create table t1 (a bit(2)) engine=innodb; +insert into t1 values (b'00'), (b'01'), (b'10'), (b'100'); +select a+0 from t1; +alter table t1 add key (a); +explain select a+0 from t1; +select a+0 from t1; +drop table t1; + +create table t1 (a bit(7), b bit(9), key(a, b)) engine=innodb; +insert into t1 values +(94, 46), (31, 438), (61, 152), (78, 123), (88, 411), (122, 118), (0, 177), +(75, 42), (108, 67), (79, 349), (59, 188), (68, 206), (49, 345), (118, 380), +(111, 368), (94, 468), (56, 379), (77, 133), (29, 399), (9, 363), (23, 36), +(116, 390), (119, 368), (87, 351), (123, 411), (24, 398), (34, 202), (28, 499), +(30, 83), (5, 178), (60, 343), (4, 245), (104, 280), (106, 446), (127, 403), +(44, 307), (68, 454), (57, 135); +explain select a+0 from t1; +select a+0 from t1; +explain select b+0 from t1; +select b+0 from t1; +explain select a+0, b+0 from t1; +select a+0, b+0 from t1; +explain select a+0, b+0 from t1 where a > 40 and b > 200 order by 1; +select a+0, b+0 from t1 where a > 40 and b > 200 order by 1; +explain select a+0, b+0 from t1 where a > 40 and a < 70 order by 2; +select a+0, b+0 from t1 where a > 40 and a < 70 order by 2; +set @@max_length_for_sort_data=0; +select a+0, b+0 from t1 where a > 40 and a < 70 order by 2; +select hex(min(a)) from t1; +select hex(min(b)) from t1; +select hex(min(a)), hex(max(a)), hex(min(b)), hex(max(b)) from t1; +drop table t1; + +create table t1 (a int not null, b bit, c bit(9), key(a, b, c)) engine=innodb; +insert into t1 values +(4, NULL, 1), (4, 0, 3), (2, 1, 4), (1, 1, 100), (4, 0, 23), (4, 0, 54), +(56, 0, 22), (4, 1, 100), (23, 0, 1), (4, 0, 34); +select a+0, b+0, c+0 from t1; +select hex(min(b)) from t1 where a = 4; +select hex(min(c)) from t1 where a = 4 and b = 0; +select hex(max(b)) from t1; +select a+0, b+0, c+0 from t1 where a = 4 and b = 0 limit 2; +select a+0, b+0, c+0 from t1 where a = 4 and b = 1; +select a+0, b+0, c+0 from t1 where a = 4 and b = 1 and c=100; +select a+0, b+0, c+0 from t1 order by b desc; +select a+0, b+0, c+0 from t1 order by c; +drop table t1; + +create table t1(a bit(2), b bit(2)) engine=innodb; +insert into t1 (a) values (0x01), (0x03), (0x02); +update t1 set b= concat(a); +select a+0, b+0 from t1; +drop table t1; + +# Some magic numbers + +create table t1 (a bit(7), key(a)) engine=innodb; +insert into t1 values (44), (57); +select a+0 from t1; +drop table t1; + +# +# Test conversion to and from strings +# +create table t1 (a bit(3), b bit(12)) engine=innodb; +insert into t1 values (7,(1<<12)-2), (0x01,0x01ff); +select hex(a),hex(b) from t1; +select hex(concat(a)),hex(concat(b)) from t1; +drop table t1; + +# +# Bug #9571: problem with primary key creation +# + +create table t1(a int, b bit not null) engine=innodb; +alter table t1 add primary key (a); +drop table t1; diff --git a/sql/field.cc b/sql/field.cc index 3afc8a2eb12..05dbfc8271d 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -7945,6 +7945,58 @@ const char *Field_bit::unpack(char *to, const char *from) } +/* + Bit field support for non-MyISAM tables. +*/ + +Field_bit_as_char::Field_bit_as_char(char *ptr_arg, uint32 len_arg, + uchar *null_ptr_arg, uchar null_bit_arg, + uchar *bit_ptr_arg, uchar bit_ofs_arg, + enum utype unireg_check_arg, + const char *field_name_arg, + struct st_table *table_arg) + : Field_bit(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, bit_ptr_arg, + bit_ofs_arg, unireg_check_arg, field_name_arg, table_arg), + create_length(len_arg) +{ + bit_ptr= 0; + bit_ofs= 0; + bit_len= 0; + field_length= ((len_arg + 7) & ~7) / 8; +} + + +int Field_bit_as_char::store(const char *from, uint length, CHARSET_INFO *cs) +{ + int delta; + uchar bits= create_length & 7; + + for (; !*from && length; from++, length--); // skip left 0's + delta= field_length - length; + + if (delta < 0 || + (delta == 0 && bits && (uint) (uchar) *from >= (uint) (1 << bits))) + { + memset(ptr, 0xff, field_length); + *ptr&= ((1 << bits) - 1); /* set first byte */ + set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); + return 1; + } + bzero(ptr, delta); + memcpy(ptr + delta, from, length); + return 0; +} + + +void Field_bit_as_char::sql_type(String &res) const +{ + CHARSET_INFO *cs= res.charset(); + ulong length= cs->cset->snprintf(cs, (char*) res.ptr(), res.alloced_length(), + "bit(%d)", (int) create_length); + res.length((uint) length); +} + + /***************************************************************************** Handling of field and create_field *****************************************************************************/ @@ -7970,9 +8022,16 @@ void create_field::create_length_to_internal_length(void) key_length= pack_length; break; case MYSQL_TYPE_BIT: - pack_length= calc_pack_length(sql_type, length); - /* We need one extra byte to store the bits we save among the null bits */ - key_length= pack_length+ test(length & 7); + if (f_bit_as_char(pack_flag)) + { + key_length= pack_length= ((length + 7) & ~7) / 8; + } + else + { + pack_length= length / 8; + /* We need one extra byte to store the bits we save among the null bits */ + key_length= pack_length + test(length & 7); + } break; case MYSQL_TYPE_NEWDECIMAL: key_length= pack_length= my_decimal_get_binary_size(length, decimals); @@ -8086,7 +8145,7 @@ Field *make_field(char *ptr, uint32 field_length, uchar bit_offset; LINT_INIT(bit_ptr); LINT_INIT(bit_offset); - if (field_type == FIELD_TYPE_BIT) + if (field_type == FIELD_TYPE_BIT && !f_bit_as_char(pack_flag)) { bit_ptr= null_pos; bit_offset= null_bit; @@ -8236,7 +8295,10 @@ Field *make_field(char *ptr, uint32 field_length, case FIELD_TYPE_NULL: return new Field_null(ptr,field_length,unireg_check,field_name,table, field_charset); case FIELD_TYPE_BIT: - return new Field_bit(ptr, field_length, null_pos, null_bit, bit_ptr, + return f_bit_as_char(pack_flag) ? + new Field_bit_as_char(ptr, field_length, null_pos, null_bit, bit_ptr, + bit_offset, unireg_check, field_name, table) : + new Field_bit(ptr, field_length, null_pos, null_bit, bit_ptr, bit_offset, unireg_check, field_name, table); default: // Impossible (Wrong version) break; diff --git a/sql/field.h b/sql/field.h index 365f2c323b9..fd0937b2f4c 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1312,6 +1312,22 @@ public: }; +class Field_bit_as_char: public Field_bit { +protected: + uchar create_length; +public: + Field_bit_as_char(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, + uchar null_bit_arg, uchar *bit_ptr_arg, uchar bit_ofs_arg, + enum utype unireg_check_arg, const char *field_name_arg, + struct st_table *table_arg); + enum ha_base_keytype key_type() const { return HA_KEYTYPE_BINARY; } + int store(const char *to, uint length, CHARSET_INFO *charset); + int store(double nr) { return Field_bit::store(nr); } + int store(longlong nr) { return Field_bit::store(nr); } + void sql_type(String &str) const; +}; + + /* Create field class for CREATE TABLE */ @@ -1415,6 +1431,8 @@ int set_field_to_null_with_conversions(Field *field, bool no_conversions); #define FIELDFLAG_BLOB 1024 // mangled with decimals! #define FIELDFLAG_GEOM 2048 // mangled with decimals! +#define FIELDFLAG_TREAT_BIT_AS_CHAR 4096 /* use Field_bit_as_char */ + #define FIELDFLAG_LEFT_FULLSCREEN 8192 #define FIELDFLAG_RIGHT_FULLSCREEN 16384 #define FIELDFLAG_FORMAT_NUMBER 16384 // predit: ###,,## in output @@ -1445,3 +1463,4 @@ int set_field_to_null_with_conversions(Field *field, bool no_conversions); #define f_settype(x) (((int) x) << FIELDFLAG_PACK_SHIFT) #define f_maybe_null(x) (x & FIELDFLAG_MAYBE_NULL) #define f_no_default(x) (x & FIELDFLAG_NO_DEFAULT) +#define f_bit_as_char(x) ((x) & FIELDFLAG_TREAT_BIT_AS_CHAR) diff --git a/sql/field_conv.cc b/sql/field_conv.cc index bbdd6619bf3..ae784ae0293 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -511,7 +511,7 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*) /* If we are copying date or datetime's we have to check the dates if we don't allow 'all' dates. -p */ + */ if (to->real_type() != from->real_type() || !compatible_db_low_byte_first || ((to->table->in_use->variables.sql_mode & @@ -594,6 +594,7 @@ void field_conv(Field *to,Field *from) !(to->flags & UNSIGNED_FLAG && !(from->flags & UNSIGNED_FLAG)) && to->real_type() != FIELD_TYPE_ENUM && to->real_type() != FIELD_TYPE_SET && + to->real_type() != FIELD_TYPE_BIT && (to->real_type() != FIELD_TYPE_NEWDECIMAL || (to->field_length == from->field_length && (((Field_num*)to)->dec == ((Field_num*)from)->dec))) && diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index cfc649a5963..9de76abbb18 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -2233,6 +2233,7 @@ innobase_mysql_cmp( switch (mysql_tp) { + case MYSQL_TYPE_BIT: case MYSQL_TYPE_STRING: case MYSQL_TYPE_VAR_STRING: case FIELD_TYPE_TINY_BLOB: @@ -2342,6 +2343,7 @@ get_innobase_type_from_mysql_type( } else { return(DATA_VARMYSQL); } + case MYSQL_TYPE_BIT: case MYSQL_TYPE_STRING: if (field->binary()) { return(DATA_FIXBINARY); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 4b40ff7638c..686e38104ab 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -563,12 +563,7 @@ int prepare_create_field(create_field *sql_field, sql_field->pack_flag=f_settype((uint) sql_field->sql_type); break; case FIELD_TYPE_BIT: - if (!(table_flags & HA_CAN_BIT_FIELD)) - { - my_error(ER_CHECK_NOT_IMPLEMENTED, MYF(0), "BIT FIELD"); - DBUG_RETURN(1); - } - sql_field->pack_flag= FIELDFLAG_NUMBER; + sql_field->pack_flag|= FIELDFLAG_NUMBER; break; case FIELD_TYPE_NEWDECIMAL: sql_field->pack_flag=(FIELDFLAG_NUMBER | @@ -774,6 +769,14 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, set_if_smaller(sql_field->length, MAX_FIELD_WIDTH-1); } + if (sql_field->sql_type == FIELD_TYPE_BIT) + { + if (file->table_flags() & HA_CAN_BIT_FIELD) + total_uneven_bit_length+= sql_field->length & 7; + else + sql_field->pack_flag|= FIELDFLAG_TREAT_BIT_AS_CHAR; + } + sql_field->create_length_to_internal_length(); if (sql_field->length > MAX_FIELD_VARCHARLENGTH && !(sql_field->flags & BLOB_FLAG)) @@ -810,9 +813,6 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, if (!(sql_field->flags & NOT_NULL_FLAG)) null_fields++; - if (sql_field->sql_type == FIELD_TYPE_BIT) - total_uneven_bit_length+= sql_field->length & 7; - if (check_column_name(sql_field->field_name)) { my_error(ER_WRONG_COLUMN_NAME, MYF(0), sql_field->field_name); diff --git a/sql/table.cc b/sql/table.cc index e1f15926c03..8e0f52e1910 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -568,7 +568,7 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat, goto err; /* purecov: inspected */ } reg_field->comment=comment; - if (field_type == FIELD_TYPE_BIT) + if (field_type == FIELD_TYPE_BIT && !f_bit_as_char(pack_flag)) { if ((null_bit_pos+= field_length & 7) > 7) { From 7387030e6762dbf27380305286b5f848b1fe20f8 Mon Sep 17 00:00:00 2001 From: "msvensson@neptunus.(none)" <> Date: Tue, 12 Apr 2005 12:04:43 +0200 Subject: [PATCH 138/204] BUG#8924 'Explain' shows different strategy - If number of records in table is 4, the calculated cost for using "index" and "range" become so close so that any rounding errors becomes visible. - Added one more record to the tables for heap test and expoect "range" to be selected - Decrease number of records in t1 for range and expect "index" to be choosen. --- mysql-test/r/heap.result | 4 ++-- mysql-test/r/heap_btree.result | 4 ++-- mysql-test/r/heap_hash.result | 4 ++-- mysql-test/r/range.result | 6 +++--- mysql-test/t/heap.test | 2 +- mysql-test/t/heap_btree.test | 2 +- mysql-test/t/heap_hash.test | 2 +- mysql-test/t/range.test | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/mysql-test/r/heap.result b/mysql-test/r/heap.result index 631bd8c713c..37214e12d63 100644 --- a/mysql-test/r/heap.result +++ b/mysql-test/r/heap.result @@ -40,7 +40,7 @@ a b 4 4 drop table t1; create table t1 (a int not null) engine=heap; -insert into t1 values (869751),(736494),(226312),(802616); +insert into t1 values (869751),(736494),(226312),(802616),(728912); select * from t1 where a > 736494; a 869751 @@ -66,7 +66,7 @@ a alter table t1 engine=myisam; explain select * from t1 where a in (869751,736494,226312,802616); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index uniq_id uniq_id 4 NULL 4 Using where; Using index +1 SIMPLE t1 range uniq_id uniq_id 4 NULL 4 Using where; Using index drop table t1; create table t1 (x int not null, y int not null, key x (x), unique y (y)) engine=heap; diff --git a/mysql-test/r/heap_btree.result b/mysql-test/r/heap_btree.result index 8f9349ce316..374d2c63632 100644 --- a/mysql-test/r/heap_btree.result +++ b/mysql-test/r/heap_btree.result @@ -40,7 +40,7 @@ a b 4 4 drop table t1; create table t1 (a int not null) engine=heap; -insert into t1 values (869751),(736494),(226312),(802616); +insert into t1 values (869751),(736494),(226312),(802616),(728912); select * from t1 where a > 736494; a 869751 @@ -66,7 +66,7 @@ a alter table t1 engine=myisam; explain select * from t1 where a in (869751,736494,226312,802616); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index uniq_id uniq_id 4 NULL 4 Using where; Using index +1 SIMPLE t1 range uniq_id uniq_id 4 NULL 4 Using where; Using index drop table t1; create table t1 (x int not null, y int not null, key x using BTREE (x,y), unique y using BTREE (y)) engine=heap; diff --git a/mysql-test/r/heap_hash.result b/mysql-test/r/heap_hash.result index 1e6eb866fd6..9720fe4843a 100644 --- a/mysql-test/r/heap_hash.result +++ b/mysql-test/r/heap_hash.result @@ -40,7 +40,7 @@ a b 4 4 drop table t1; create table t1 (a int not null) engine=heap; -insert into t1 values (869751),(736494),(226312),(802616); +insert into t1 values (869751),(736494),(226312),(802616),(728912); select * from t1 where a > 736494; a 869751 @@ -66,7 +66,7 @@ a alter table t1 engine=myisam; explain select * from t1 where a in (869751,736494,226312,802616); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index uniq_id uniq_id 4 NULL 4 Using where; Using index +1 SIMPLE t1 range uniq_id uniq_id 4 NULL 4 Using where; Using index drop table t1; create table t1 (x int not null, y int not null, key x using HASH (x), unique y using HASH (y)) engine=heap; diff --git a/mysql-test/r/range.result b/mysql-test/r/range.result index 8a1d80e9f79..d98ed90e158 100644 --- a/mysql-test/r/range.result +++ b/mysql-test/r/range.result @@ -250,18 +250,18 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index x x 5 NULL 9 Using where; Using index drop table t1; CREATE TABLE t1 (key1 int(11) NOT NULL default '0', KEY i1 (key1)); -INSERT INTO t1 VALUES (0),(0),(1),(1); +INSERT INTO t1 VALUES (0),(1),(1); CREATE TABLE t2 (keya int(11) NOT NULL default '0', KEY j1 (keya)); INSERT INTO t2 VALUES (0),(0),(1),(1),(2),(2); explain select * from t1, t2 where (t1.key1 736494; alter table t1 add unique uniq_id(a); select * from t1 where a > 736494; diff --git a/mysql-test/t/heap_btree.test b/mysql-test/t/heap_btree.test index d156d059634..6fec2ac1703 100644 --- a/mysql-test/t/heap_btree.test +++ b/mysql-test/t/heap_btree.test @@ -34,7 +34,7 @@ select * from t1; drop table t1; create table t1 (a int not null) engine=heap; -insert into t1 values (869751),(736494),(226312),(802616); +insert into t1 values (869751),(736494),(226312),(802616),(728912); select * from t1 where a > 736494; alter table t1 add unique uniq_id using BTREE (a); select * from t1 where a > 736494; diff --git a/mysql-test/t/heap_hash.test b/mysql-test/t/heap_hash.test index 6d27f19dfad..46669dd2b8f 100644 --- a/mysql-test/t/heap_hash.test +++ b/mysql-test/t/heap_hash.test @@ -34,7 +34,7 @@ select * from t1; drop table t1; create table t1 (a int not null) engine=heap; -insert into t1 values (869751),(736494),(226312),(802616); +insert into t1 values (869751),(736494),(226312),(802616),(728912); select * from t1 where a > 736494; alter table t1 add unique uniq_id using HASH (a); select * from t1 where a > 736494; diff --git a/mysql-test/t/range.test b/mysql-test/t/range.test index 18cf614f338..16be850548c 100644 --- a/mysql-test/t/range.test +++ b/mysql-test/t/range.test @@ -198,7 +198,7 @@ drop table t1; # bug #1172: "Force index" option caused server crash # CREATE TABLE t1 (key1 int(11) NOT NULL default '0', KEY i1 (key1)); -INSERT INTO t1 VALUES (0),(0),(1),(1); +INSERT INTO t1 VALUES (0),(1),(1); CREATE TABLE t2 (keya int(11) NOT NULL default '0', KEY j1 (keya)); INSERT INTO t2 VALUES (0),(0),(1),(1),(2),(2); explain select * from t1, t2 where (t1.key1 Date: Tue, 12 Apr 2005 13:36:43 +0200 Subject: [PATCH 139/204] bug#9757 - ndb Impl. stupid mgm lock against shutting down 2 nodes simultaniously Add some more dump --- ndb/src/kernel/blocks/dbdih/DbdihMain.cpp | 45 +++++++++++++++++++++++ ndb/src/kernel/main.cpp | 2 + ndb/src/mgmsrv/MgmtSrvr.cpp | 13 +++++-- ndb/src/mgmsrv/MgmtSrvr.hpp | 2 +- 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp b/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp index 0bc8351a9db..efd1740651c 100644 --- a/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp +++ b/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp @@ -69,6 +69,9 @@ #include #include +#include +extern EventLogger g_eventLogger; + #define SYSFILE ((Sysfile *)&sysfileData[0]) #define RETURN_IF_NODE_NOT_ALIVE(node) \ @@ -13103,6 +13106,48 @@ Dbdih::execDUMP_STATE_ORD(Signal* signal) } } } + + if(dumpState->args[0] == 7019 && signal->getLength() == 2) + { + char buf2[8+1]; + NodeRecordPtr nodePtr; + nodePtr.i = signal->theData[1]; + ptrCheckGuard(nodePtr, MAX_NDB_NODES, nodeRecord); + infoEvent("NF Node %d tc: %d lqh: %d dih: %d dict: %d recNODE_FAILREP: %d", + nodePtr.i, + nodePtr.p->dbtcFailCompleted, + nodePtr.p->dblqhFailCompleted, + nodePtr.p->dbdihFailCompleted, + nodePtr.p->dbdictFailCompleted, + nodePtr.p->recNODE_FAILREP); + infoEvent(" m_NF_COMPLETE_REP: %s m_nodefailSteps: %s", + nodePtr.p->m_NF_COMPLETE_REP.getText(), + nodePtr.p->m_nodefailSteps.getText(buf2)); + } + + if(dumpState->args[0] == 7020 && signal->getLength() > 3) + { + Uint32 gsn= signal->theData[1]; + Uint32 block= signal->theData[2]; + Uint32 length= signal->length() - 3; + memmove(signal->theData, signal->theData+3, 4*length); + sendSignal(numberToRef(block, getOwnNodeId()), gsn, signal, length, JBB); + + warningEvent("-- SENDING CUSTOM SIGNAL --"); + char buf[100], buf2[100]; + buf2[0]= 0; + for(Uint32 i = 0; itheData[i]); + snprintf(buf2, 100, "%s", buf); + } + warningEvent("gsn: %d block: %s, length: %d theData: %s", + gsn, getBlockName(block, "UNKNOWN"), length, buf); + + g_eventLogger.warning("-- SENDING CUSTOM SIGNAL --"); + g_eventLogger.warning("gsn: %d block: %s, length: %d theData: %s", + gsn, getBlockName(block, "UNKNOWN"), length, buf); + } if(dumpState->args[0] == DumpStateOrd::DihDumpLCPState){ infoEvent("-- Node %d LCP STATE --", getOwnNodeId()); diff --git a/ndb/src/kernel/main.cpp b/ndb/src/kernel/main.cpp index e6e0a7ca877..1e5cd5270e4 100644 --- a/ndb/src/kernel/main.cpp +++ b/ndb/src/kernel/main.cpp @@ -58,7 +58,9 @@ int main(int argc, char** argv) // Print to stdout/console g_eventLogger.createConsoleHandler(); g_eventLogger.setCategory("NDB"); + g_eventLogger.enable(Logger::LL_ON, Logger::LL_CRITICAL); g_eventLogger.enable(Logger::LL_ON, Logger::LL_ERROR); + g_eventLogger.enable(Logger::LL_ON, Logger::LL_WARNING); globalEmulatorData.create(); diff --git a/ndb/src/mgmsrv/MgmtSrvr.cpp b/ndb/src/mgmsrv/MgmtSrvr.cpp index 3bc00b18f50..98cdcdca2f7 100644 --- a/ndb/src/mgmsrv/MgmtSrvr.cpp +++ b/ndb/src/mgmsrv/MgmtSrvr.cpp @@ -2061,7 +2061,7 @@ MgmtSrvr::handleStopReply(NodeId nodeId, Uint32 errCode) } void -MgmtSrvr::handleStatus(NodeId nodeId, bool alive) +MgmtSrvr::handleStatus(NodeId nodeId, bool alive, bool nfComplete) { DBUG_ENTER("MgmtSrvr::handleStatus"); Uint32 theData[25]; @@ -2070,9 +2070,15 @@ MgmtSrvr::handleStatus(NodeId nodeId, bool alive) m_started_nodes.push_back(nodeId); theData[0] = EventReport::Connected; } else { - handleStopReply(nodeId, 0); theData[0] = EventReport::Disconnected; + if(nfComplete) + { + theData[0] = EventReport::NodeFailCompleted; + handleStopReply(nodeId, 0); + return; + } } + eventReport(_ownNodeId, theData); DBUG_VOID_RETURN; } @@ -2097,8 +2103,7 @@ MgmtSrvr::nodeStatusNotification(void* mgmSrv, Uint32 nodeId, { DBUG_ENTER("MgmtSrvr::nodeStatusNotification"); DBUG_PRINT("enter",("nodeid= %d, alive= %d, nfComplete= %d", nodeId, alive, nfComplete)); - if(!(!alive && nfComplete)) - ((MgmtSrvr*)mgmSrv)->handleStatus(nodeId, alive); + ((MgmtSrvr*)mgmSrv)->handleStatus(nodeId, alive, nfComplete); DBUG_VOID_RETURN; } diff --git a/ndb/src/mgmsrv/MgmtSrvr.hpp b/ndb/src/mgmsrv/MgmtSrvr.hpp index 6378e763363..a05b29b7f31 100644 --- a/ndb/src/mgmsrv/MgmtSrvr.hpp +++ b/ndb/src/mgmsrv/MgmtSrvr.hpp @@ -573,7 +573,7 @@ private: // Returns: - //************************************************************************** - void handleStatus(NodeId nodeId, bool alive); + void handleStatus(NodeId nodeId, bool alive, bool nfComplete); //************************************************************************** // Description: Handle the death of a process // Parameters: From 2e1e670b57c3bde429270ca359374db074d75643 Mon Sep 17 00:00:00 2001 From: "joreland@mysql.com" <> Date: Tue, 12 Apr 2005 13:56:24 +0200 Subject: [PATCH 140/204] bug#9757 - ndb - post review use DBUG_RETURN --- ndb/src/mgmsrv/MgmtSrvr.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ndb/src/mgmsrv/MgmtSrvr.cpp b/ndb/src/mgmsrv/MgmtSrvr.cpp index 98cdcdca2f7..fb05e57e138 100644 --- a/ndb/src/mgmsrv/MgmtSrvr.cpp +++ b/ndb/src/mgmsrv/MgmtSrvr.cpp @@ -2073,9 +2073,8 @@ MgmtSrvr::handleStatus(NodeId nodeId, bool alive, bool nfComplete) theData[0] = EventReport::Disconnected; if(nfComplete) { - theData[0] = EventReport::NodeFailCompleted; handleStopReply(nodeId, 0); - return; + DBUG_VOID_RETURN; } } From e0e281ecb8710ee7325610bb00bc24c055137e14 Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Tue, 12 Apr 2005 14:52:54 +0200 Subject: [PATCH 141/204] Fixed BUG#6663: Stored Procedures code report non-selected DB when CREATE but not when ALTER --- sql/sql_parse.cc | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ac1b1148cf8..ee385f9792e 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4128,7 +4128,15 @@ unsent_create_error: sp= sp_find_function(thd, lex->spname); mysql_reset_errors(thd, 0); if (! sp) - result= SP_KEY_NOT_FOUND; + { + if (lex->spname->m_db.str) + result= SP_KEY_NOT_FOUND; + else + { + my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0)); + goto error; + } + } else { if (check_procedure_access(thd, ALTER_PROC_ACL, sp->m_db.str, @@ -4207,7 +4215,13 @@ unsent_create_error: } } #endif - result= SP_KEY_NOT_FOUND; + if (lex->spname->m_db.str) + result= SP_KEY_NOT_FOUND; + else + { + my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0)); + goto error; + } } res= result; switch (result) From d5646eb6c5c7155abc3978734db9d6040c28df72 Mon Sep 17 00:00:00 2001 From: "marko@hundin.mysql.fi" <> Date: Tue, 12 Apr 2005 16:12:34 +0300 Subject: [PATCH 142/204] InnoDB: Ignore character set mismatch in ALTER TABLE and RENAME TABLE if foreign_key_checks=0. (Bug #9802) --- innobase/dict/dict0dict.c | 19 ++++++++++++++++--- innobase/dict/dict0load.c | 15 +++++++-------- innobase/include/dict0dict.h | 3 ++- innobase/include/dict0load.h | 3 ++- innobase/row/row0mysql.c | 8 +++----- sql/ha_innodb.cc | 4 ++++ 6 files changed, 34 insertions(+), 18 deletions(-) diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index cb48c86c541..bbc47fe9c2b 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -2167,7 +2167,8 @@ ulint dict_foreign_add_to_cache( /*======================*/ /* out: DB_SUCCESS or error code */ - dict_foreign_t* foreign) /* in, own: foreign key constraint */ + dict_foreign_t* foreign, /* in, own: foreign key constraint */ + ibool check_types) /* in: TRUE=check type compatibility */ { dict_table_t* for_table; dict_table_t* ref_table; @@ -2203,10 +2204,16 @@ dict_foreign_add_to_cache( } if (for_in_cache->referenced_table == NULL && ref_table) { + dict_index_t* types_idx; + if (check_types) { + types_idx = for_in_cache->foreign_index; + } else { + types_idx = NULL; + } index = dict_foreign_find_index(ref_table, (const char**) for_in_cache->referenced_col_names, for_in_cache->n_fields, - for_in_cache->foreign_index); + types_idx); if (index == NULL) { dict_foreign_error_report(ef, for_in_cache, @@ -2230,10 +2237,16 @@ dict_foreign_add_to_cache( } if (for_in_cache->foreign_table == NULL && for_table) { + dict_index_t* types_idx; + if (check_types) { + types_idx = for_in_cache->referenced_index; + } else { + types_idx = NULL; + } index = dict_foreign_find_index(for_table, (const char**) for_in_cache->foreign_col_names, for_in_cache->n_fields, - for_in_cache->referenced_index); + types_idx); if (index == NULL) { dict_foreign_error_report(ef, for_in_cache, diff --git a/innobase/dict/dict0load.c b/innobase/dict/dict0load.c index e5aafcad2c2..0d58823a2ea 100644 --- a/innobase/dict/dict0load.c +++ b/innobase/dict/dict0load.c @@ -873,7 +873,7 @@ dict_load_table( dict_load_indexes(table, heap); - err = dict_load_foreigns(table->name); + err = dict_load_foreigns(table->name, TRUE); /* if (err != DB_SUCCESS) { @@ -1092,8 +1092,9 @@ ulint dict_load_foreign( /*==============*/ /* out: DB_SUCCESS or error code */ - const char* id) /* in: foreign constraint id as a + const char* id, /* in: foreign constraint id as a null-terminated string */ + ibool check_types)/* in: TRUE=check type compatibility */ { dict_foreign_t* foreign; dict_table_t* sys_foreign; @@ -1105,7 +1106,6 @@ dict_load_foreign( rec_t* rec; byte* field; ulint len; - ulint err; mtr_t mtr; #ifdef UNIV_SYNC_DEBUG @@ -1205,9 +1205,7 @@ dict_load_foreign( a new foreign key constraint but loading one from the data dictionary. */ - err = dict_foreign_add_to_cache(foreign); - - return(err); + return(dict_foreign_add_to_cache(foreign, check_types)); } /*************************************************************************** @@ -1221,7 +1219,8 @@ ulint dict_load_foreigns( /*===============*/ /* out: DB_SUCCESS or error code */ - const char* table_name) /* in: table name */ + const char* table_name, /* in: table name */ + ibool check_types) /* in: TRUE=check type compatibility */ { btr_pcur_t pcur; mem_heap_t* heap; @@ -1320,7 +1319,7 @@ loop: /* Load the foreign constraint definition to the dictionary cache */ - err = dict_load_foreign(id); + err = dict_load_foreign(id, check_types); if (err != DB_SUCCESS) { btr_pcur_close(&pcur); diff --git a/innobase/include/dict0dict.h b/innobase/include/dict0dict.h index ca632691450..745a776bda1 100644 --- a/innobase/include/dict0dict.h +++ b/innobase/include/dict0dict.h @@ -189,7 +189,8 @@ ulint dict_foreign_add_to_cache( /*======================*/ /* out: DB_SUCCESS or error code */ - dict_foreign_t* foreign); /* in, own: foreign key constraint */ + dict_foreign_t* foreign, /* in, own: foreign key constraint */ + ibool check_types); /* in: TRUE=check type compatibility */ /************************************************************************* Checks if a table is referenced by foreign keys. */ diff --git a/innobase/include/dict0load.h b/innobase/include/dict0load.h index 1f0a5407140..f13620bc6e8 100644 --- a/innobase/include/dict0load.h +++ b/innobase/include/dict0load.h @@ -81,7 +81,8 @@ ulint dict_load_foreigns( /*===============*/ /* out: DB_SUCCESS or error code */ - const char* table_name); /* in: table name */ + const char* table_name, /* in: table name */ + ibool check_types); /* in: TRUE=check type compatibility */ /************************************************************************ Prints to the standard output information on all tables found in the data dictionary system table. */ diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index e2b34e6e3f1..9410f2ce7cc 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -1796,7 +1796,7 @@ row_table_add_foreign_constraints( if (err == DB_SUCCESS) { /* Check that also referencing constraints are ok */ - err = dict_load_foreigns(name); + err = dict_load_foreigns(name, trx->check_foreigns); } if (err != DB_SUCCESS) { @@ -3204,6 +3204,8 @@ row_rename_table_for_mysql( goto funct_exit; } + err = dict_load_foreigns(new_name, trx->check_foreigns); + if (row_is_mysql_tmp_table_name(old_name)) { /* MySQL is doing an ALTER TABLE command and it @@ -3213,8 +3215,6 @@ row_rename_table_for_mysql( table. But we want to load also the foreign key constraint definitions for the original table name. */ - err = dict_load_foreigns(new_name); - if (err != DB_SUCCESS) { ut_print_timestamp(stderr); fputs(" InnoDB: Error: in ALTER TABLE ", @@ -3233,8 +3233,6 @@ row_rename_table_for_mysql( trx->error_state = DB_SUCCESS; } } else { - err = dict_load_foreigns(new_name); - if (err != DB_SUCCESS) { ut_print_timestamp(stderr); diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 322d5188a75..bd2a5139021 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -4183,6 +4183,10 @@ ha_innobase::rename_table( trx->mysql_thd = current_thd; trx->mysql_query_str = &((*current_thd).query); + if (current_thd->options & OPTION_NO_FOREIGN_KEY_CHECKS) { + trx->check_foreigns = FALSE; + } + name_len1 = strlen(from); name_len2 = strlen(to); From 9c21006f81dcef2c19a1a9484dd6095ea89381dc Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Tue, 12 Apr 2005 15:43:24 +0200 Subject: [PATCH 143/204] Fixed BUG#7185: Stored procedure crash if identifier is AVG --- mysql-test/r/sp.result | 6 ++++++ mysql-test/t/sp.test | 14 ++++++++++++++ sql/sql_yacc.yy | 4 ++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 36a4331c9be..3ea9b3676dd 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -2844,4 +2844,10 @@ drop procedure bug6900| drop procedure bug9074| drop procedure bug6900_9074| drop table t3| +drop procedure if exists avg| +create procedure avg () +begin +end| +call avg ()| +drop procedure avg| drop table t1,t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 69c7544ee7c..e31d360c52f 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3481,6 +3481,20 @@ drop procedure bug6900_9074| drop table t3| +# +# BUG#7185: Stored procedure crash if identifier is AVG +# +--disable_warnings +drop procedure if exists avg| +--enable_warnings +create procedure avg () +begin +end| + +call avg ()| +drop procedure avg| + + # # BUG#NNNN: New bug synopsis # diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 9ff7f4449b2..2516893ee24 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1328,12 +1328,12 @@ clear_privileges: ; sp_name: - IDENT_sys '.' IDENT_sys + ident '.' ident { $$= new sp_name($1, $3); $$->init_qname(YYTHD); } - | IDENT_sys + | ident { $$= sp_name_current_db_new(YYTHD, $1); } From eae4d9c0733f2980b066377dbeadf4c8bdfe6983 Mon Sep 17 00:00:00 2001 From: "ramil@mysql.com" <> Date: Tue, 12 Apr 2005 19:36:21 +0500 Subject: [PATCH 144/204] Bit type: code cleanup. --- sql/field.cc | 4 ++-- sql/sql_table.cc | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sql/field.cc b/sql/field.cc index 2fb1d0cbd6a..ea551f410b7 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -7879,7 +7879,7 @@ int Field_bit::key_cmp(const byte *str, uint length) str++; length--; } - return bcmp(ptr, str, length); + return memcmp(ptr, str, length); } @@ -7893,7 +7893,7 @@ int Field_bit::cmp_offset(uint row_offset) if ((flag= (int) (bits_a - bits_b))) return flag; } - return bcmp(ptr, ptr + row_offset, field_length); + return memcmp(ptr, ptr + row_offset, field_length); } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 56de2f94b1f..66c6f97e0de 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -563,7 +563,9 @@ int prepare_create_field(create_field *sql_field, sql_field->pack_flag=f_settype((uint) sql_field->sql_type); break; case FIELD_TYPE_BIT: - sql_field->pack_flag|= FIELDFLAG_NUMBER; + sql_field->pack_flag= f_bit_as_char(sql_field->pack_flag) ? + FIELDFLAG_NUMBER | FIELDFLAG_TREAT_BIT_AS_CHAR : + FIELDFLAG_NUMBER; break; case FIELD_TYPE_NEWDECIMAL: sql_field->pack_flag=(FIELDFLAG_NUMBER | From d4a0becc8a3154c90361104fa50e2835bbcc180c Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Tue, 12 Apr 2005 17:15:54 +0200 Subject: [PATCH 145/204] FLUSH TABLES WITH READ LOCK should block writes to binlog too --- mysql-test/r/flush_block_commit.result | 15 ++++++++++++ mysql-test/t/flush_block_commit.test | 21 ++++++++++++++++ sql/handler.cc | 33 +++++++++++++------------- sql/sql_parse.cc | 13 ++++++++-- sql/sql_yacc.yy | 3 +-- 5 files changed, 64 insertions(+), 21 deletions(-) diff --git a/mysql-test/r/flush_block_commit.result b/mysql-test/r/flush_block_commit.result index 2e9f1920937..39f4a3719ef 100644 --- a/mysql-test/r/flush_block_commit.result +++ b/mysql-test/r/flush_block_commit.result @@ -37,3 +37,18 @@ show create database test; Database Create Database test CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ drop table t1; +create table t1 (a int) engine=innodb; +reset master; +set autocommit=0; +insert t1 values (1); +flush tables with read lock; +show master status; +File Position Binlog_Do_DB Binlog_Ignore_DB +master-bin.000001 98 + commit; +show master status; +File Position Binlog_Do_DB Binlog_Ignore_DB +master-bin.000001 276 +unlock tables; +drop table t1; +set autocommit=1; diff --git a/mysql-test/t/flush_block_commit.test b/mysql-test/t/flush_block_commit.test index 49d68d05fb6..29ef7b8a0b9 100644 --- a/mysql-test/t/flush_block_commit.test +++ b/mysql-test/t/flush_block_commit.test @@ -76,3 +76,24 @@ select * from t1; show create database test; drop table t1; + +# FLUSH TABLES WITH READ LOCK should block writes to binlog too +connection con1; +create table t1 (a int) engine=innodb; +reset master; +set autocommit=0; +insert t1 values (1); +connection con2; +flush tables with read lock; +show master status; +connection con1; +send commit; +connection con2; +sleep 1; +show master status; +unlock tables; +connection con1; +reap; +drop table t1; +set autocommit=1; + diff --git a/sql/handler.cc b/sql/handler.cc index 785070176cb..22a4575fe6e 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -586,6 +586,11 @@ int ha_commit_trans(THD *thd, bool all) #ifdef USING_TRANSACTIONS if (trans->nht) { + if (is_real_trans && wait_if_global_read_lock(thd, 0, 0)) + { + ha_rollback_trans(thd, all); + DBUG_RETURN(1); + } DBUG_EXECUTE_IF("crash_commit_before", abort();); if (!trans->no_2pc && trans->nht > 1) { @@ -595,7 +600,7 @@ int ha_commit_trans(THD *thd, bool all) if ((err= (*(*ht)->prepare)(thd, all))) { my_error(ER_ERROR_DURING_COMMIT, MYF(0), err); - error=1; + error= 1; } statistic_increment(thd->status_var.ha_prepare_count,&LOCK_status); } @@ -604,20 +609,28 @@ int ha_commit_trans(THD *thd, bool all) (error= !(cookie= tc_log->log(thd, xid))))) { ha_rollback_trans(thd, all); - return 1; + error= 1; + goto end; } - DBUG_EXECUTE_IF("crash_commit_after_log", abort();); + DBUG_EXECUTE_IF("crash_commit_after_log", abort();); } error=ha_commit_one_phase(thd, all) ? cookie ? 2 : 1 : 0; DBUG_EXECUTE_IF("crash_commit_before_unlog", abort();); if (cookie) tc_log->unlog(cookie, xid); DBUG_EXECUTE_IF("crash_commit_after", abort();); +end: + if (is_real_trans) + start_waiting_global_read_lock(thd); } #endif /* USING_TRANSACTIONS */ DBUG_RETURN(error); } +/* + NOTE - this function does not care about global read lock. + A caller should. +*/ int ha_commit_one_phase(THD *thd, bool all) { int error=0; @@ -628,18 +641,6 @@ int ha_commit_one_phase(THD *thd, bool all) #ifdef USING_TRANSACTIONS if (trans->nht) { - bool need_start_waiters= 0; - if (is_real_trans) - { - if ((error= wait_if_global_read_lock(thd, 0, 0))) - { - my_error(ER_ERROR_DURING_COMMIT, MYF(0), error); - error= 1; - } - else - need_start_waiters= 1; - } - for (ht=trans->ht; *ht; ht++) { int err; @@ -664,8 +665,6 @@ int ha_commit_one_phase(THD *thd, bool all) thd->variables.tx_isolation=thd->session_tx_isolation; thd->transaction.cleanup(); } - if (need_start_waiters) - start_waiting_global_read_lock(thd); } #endif /* USING_TRANSACTIONS */ DBUG_RETURN(error); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ac1b1148cf8..b1f50f68e32 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4414,10 +4414,19 @@ unsent_create_error: else if (thd->transaction.xa_state == XA_PREPARED && thd->lex->xa_opt == XA_NONE) { - if (ha_commit_one_phase(thd, 1)) + if (wait_if_global_read_lock(thd, 0, 0)) + { + ha_rollback(thd); my_error(ER_XAER_RMERR, MYF(0)); + } else - send_ok(thd); + { + if (ha_commit_one_phase(thd, 1)) + my_error(ER_XAER_RMERR, MYF(0)); + else + send_ok(thd); + start_waiting_global_read_lock(thd); + } } else { diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 9266ab69790..dfd68da7109 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -7251,7 +7251,7 @@ keyword: | MULTILINESTRING {} | MULTIPOINT {} | MULTIPOLYGON {} - | MUTEX_SYM {} + | MUTEX_SYM {} | NAME_SYM {} | NAMES_SYM {} | NATIONAL_SYM {} @@ -7343,7 +7343,6 @@ keyword: | TIMESTAMP_ADD {} | TIMESTAMP_DIFF {} | TIME_SYM {} - | TYPE_SYM {} | TYPES_SYM {} | UDF_RETURNS_SYM {} | FUNCTION_SYM {} From f93ebc20ac1c6ca5eae374b6506bd967c048077b Mon Sep 17 00:00:00 2001 From: "ramil@mysql.com" <> Date: Tue, 12 Apr 2005 23:12:00 +0500 Subject: [PATCH 146/204] Bit type: code clean-up. --- sql/field.h | 1 + sql/sql_table.cc | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sql/field.h b/sql/field.h index fd0937b2f4c..6a1a7af194e 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1321,6 +1321,7 @@ public: enum utype unireg_check_arg, const char *field_name_arg, struct st_table *table_arg); enum ha_base_keytype key_type() const { return HA_KEYTYPE_BINARY; } + uint size_of() const { return sizeof(*this); } int store(const char *to, uint length, CHARSET_INFO *charset); int store(double nr) { return Field_bit::store(nr); } int store(longlong nr) { return Field_bit::store(nr); } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 66c6f97e0de..8753f62ab89 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -563,9 +563,9 @@ int prepare_create_field(create_field *sql_field, sql_field->pack_flag=f_settype((uint) sql_field->sql_type); break; case FIELD_TYPE_BIT: - sql_field->pack_flag= f_bit_as_char(sql_field->pack_flag) ? - FIELDFLAG_NUMBER | FIELDFLAG_TREAT_BIT_AS_CHAR : - FIELDFLAG_NUMBER; + /* + We have sql_field->pack_flag already set here, see mysql_prepare_table(). + */ break; case FIELD_TYPE_NEWDECIMAL: sql_field->pack_flag=(FIELDFLAG_NUMBER | @@ -773,6 +773,7 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, if (sql_field->sql_type == FIELD_TYPE_BIT) { + sql_field->pack_flag= FIELDFLAG_NUMBER; if (file->table_flags() & HA_CAN_BIT_FIELD) total_uneven_bit_length+= sql_field->length & 7; else From b3e54c9aee03d5761e2226678e10843480d6fab7 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Tue, 12 Apr 2005 23:08:19 +0200 Subject: [PATCH 147/204] mysql-test/r/flush_block_commit.result correct result after bugfix sql/sql_class.cc initialize net.query_cache_query --- mysql-test/r/flush_block_commit.result | 2 +- sql/sql_class.cc | 7 ++++--- sql/sql_yacc.yy | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/flush_block_commit.result b/mysql-test/r/flush_block_commit.result index 39f4a3719ef..2f6aca7e24a 100644 --- a/mysql-test/r/flush_block_commit.result +++ b/mysql-test/r/flush_block_commit.result @@ -48,7 +48,7 @@ master-bin.000001 98 commit; show master status; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 276 +master-bin.000001 98 unlock tables; drop table t1; set autocommit=1; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index c68dc826147..a6a1f4d60ef 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -202,10 +202,11 @@ THD::THD() #ifndef DBUG_OFF dbug_sentry=THD_SENTRY_MAGIC; #endif -#ifndef EMBEDDED_LIBRARY +#ifndef EMBEDDED_LIBRARY net.vio=0; #endif - net.last_error[0]=0; // If error on boot + net.last_error[0]=0; // If error on boot + net.query_cache_query=0; // If error on boot ull=0; system_thread= cleanup_done= abort_on_warning= no_warnings_for_error= 0; peer_port= 0; // For SHOW PROCESSLIST @@ -214,7 +215,7 @@ THD::THD() #endif #ifdef SIGNAL_WITH_VIO_CLOSE active_vio = 0; -#endif +#endif pthread_mutex_init(&LOCK_delete, MY_MUTEX_INIT_FAST); /* Variables with default values */ diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 2c493e27581..9a7e75b770c 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -7368,6 +7368,7 @@ keyword: | TIMESTAMP_DIFF {} | TIME_SYM {} | TYPES_SYM {} + | TYPE_SYM {} | UDF_RETURNS_SYM {} | FUNCTION_SYM {} | UNCOMMITTED_SYM {} From 3dcfc31e769a5127294c5d80d19b1bdb9a2d1a43 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Tue, 12 Apr 2005 18:04:32 -0700 Subject: [PATCH 148/204] Remove references to result.es files --- mysql-test/Makefile.am | 4 ++-- scripts/make_binary_distribution.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mysql-test/Makefile.am b/mysql-test/Makefile.am index 57598f5f3e3..75adc45d73a 100644 --- a/mysql-test/Makefile.am +++ b/mysql-test/Makefile.am @@ -49,7 +49,7 @@ dist-hook: $(distdir)/std_data $(distdir)/lib $(INSTALL_DATA) $(srcdir)/t/*.test $(srcdir)/t/*.opt $(srcdir)/t/*.sh $(srcdir)/t/*.slave-mi $(distdir)/t $(INSTALL_DATA) $(srcdir)/include/*.inc $(distdir)/include - $(INSTALL_DATA) $(srcdir)/r/*.result $(srcdir)/r/*.result.es $(srcdir)/r/*.require $(distdir)/r + $(INSTALL_DATA) $(srcdir)/r/*.result $(srcdir)/r/*.require $(distdir)/r $(INSTALL_DATA) $(srcdir)/std_data/Moscow_leap $(distdir)/std_data $(INSTALL_DATA) $(srcdir)/std_data/*.dat $(srcdir)/std_data/*.000001 $(distdir)/std_data $(INSTALL_DATA) $(srcdir)/std_data/des_key_file $(distdir)/std_data @@ -70,7 +70,7 @@ install-data-local: $(INSTALL_DATA) $(srcdir)/t/*.opt $(DESTDIR)$(testdir)/t $(INSTALL_DATA) $(srcdir)/t/*.sh $(DESTDIR)$(testdir)/t $(INSTALL_DATA) $(srcdir)/t/*.slave-mi $(DESTDIR)$(testdir)/t - $(INSTALL_DATA) $(srcdir)/r/*.result $(srcdir)/r/*.result.es $(DESTDIR)$(testdir)/r + $(INSTALL_DATA) $(srcdir)/r/*.result $(DESTDIR)$(testdir)/r $(INSTALL_DATA) $(srcdir)/r/*.require $(DESTDIR)$(testdir)/r $(INSTALL_DATA) $(srcdir)/include/*.inc $(DESTDIR)$(testdir)/include $(INSTALL_DATA) $(srcdir)/std_data/*.dat $(DESTDIR)$(testdir)/std_data diff --git a/scripts/make_binary_distribution.sh b/scripts/make_binary_distribution.sh index 01d635688d8..46d1b74d2bf 100644 --- a/scripts/make_binary_distribution.sh +++ b/scripts/make_binary_distribution.sh @@ -222,7 +222,7 @@ $CP mysql-test/include/*.inc $BASE/mysql-test/include $CP mysql-test/std_data/*.dat mysql-test/std_data/*.*001 $BASE/mysql-test/std_data $CP mysql-test/std_data/des_key_file $BASE/mysql-test/std_data $CP mysql-test/t/*test mysql-test/t/*.opt mysql-test/t/*.slave-mi mysql-test/t/*.sh $BASE/mysql-test/t -$CP mysql-test/r/*result mysql-test/r/*result.es mysql-test/r/*.require $BASE/mysql-test/r +$CP mysql-test/r/*result mysql-test/r/*.require $BASE/mysql-test/r if [ $BASE_SYSTEM != "netware" ] ; then chmod a+x $BASE/bin/* From 76a15f84355f38bdaa9b4162ce7f08317a99842a Mon Sep 17 00:00:00 2001 From: "jan@hundin.mysql.fi" <> Date: Wed, 13 Apr 2005 12:07:16 +0300 Subject: [PATCH 149/204] Fixed a bug where next-key locking doesn't allow the insert which does not produce phantom (bug #9354). --- innobase/row/row0sel.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c index 96abbda8e64..c657a03bd38 100644 --- a/innobase/row/row0sel.c +++ b/innobase/row/row0sel.c @@ -3686,6 +3686,20 @@ rec_loop: } } + /* If a constant search tuple is found directly from + the cluster index we lock only a record. + For example: WHERE a >= 100, where a is primary key */ + + if(index == clust_index && + match_mode == ROW_SEL_OPEN_CURSOR && + mode == PAGE_CUR_GE && + dtuple_get_n_fields_cmp(search_tuple) + == dict_index_get_n_unique(index) && + !cmp_dtuple_rec(search_tuple, rec, offsets)) { + + lock_type = LOCK_REC_NOT_GAP; + } + err = sel_set_rec_lock(rec, index, offsets, prebuilt->select_lock_type, lock_type, thr); From d1806d787080362db2982811b26cd648cd9256d8 Mon Sep 17 00:00:00 2001 From: "mleich@mysql.com" <> Date: Wed, 13 Apr 2005 11:47:28 +0200 Subject: [PATCH 150/204] Minor improvements + new option needed for WL#2520 Upgrade/Downgrade Test Plan --- mysql-test/mysql-test-run.pl | 37 ++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index e4f14447e30..5a188dc6927 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -262,6 +262,7 @@ our $opt_socket; our $opt_source_dist; our $opt_start_and_exit; +our $opt_start_dirty; our $opt_start_from; our $opt_strace_client; @@ -305,6 +306,7 @@ sub initial_setup (); sub command_line_setup (); sub executable_setup (); sub environment_setup (); +sub kill_running_server (); sub kill_and_cleanup (); sub ndbcluster_install (); sub ndbcluster_start (); @@ -353,14 +355,22 @@ sub main () { if ( ! $glob_use_running_server ) { - kill_and_cleanup(); - mysql_install_db(); + + if ( $opt_start_dirty ) + { + kill_running_server(); + } + else + { + kill_and_cleanup(); + mysql_install_db(); # mysql_loadstd(); FIXME copying from "std_data" .frm and # .MGR but there are none?! + } } - if ( $opt_start_and_exit ) + if ( $opt_start_and_exit or $opt_start_dirty ) { if ( ndbcluster_start() ) { @@ -531,6 +541,7 @@ sub command_line_setup () { 'script-debug' => \$opt_script_debug, 'sleep=i' => \$opt_sleep, 'socket=s' => \$opt_socket, + 'start-dirty' => \$opt_start_dirty, 'start-and-exit' => \$opt_start_and_exit, 'start-from=s' => \$opt_start_from, 'timer' => \$opt_timer, @@ -951,7 +962,7 @@ sub handle_int_signal () { # ############################################################################## -sub kill_and_cleanup () { +sub kill_running_server () { if ( $opt_fast or $glob_use_embedded_server ) { @@ -976,6 +987,11 @@ sub kill_and_cleanup () { ndbcluster_stop(); $master->[0]->{'ndbcluster'}= 1; } +} + +sub kill_and_cleanup () { + + kill_running_server (); mtr_report("Removing Stale Files"); @@ -1464,7 +1480,15 @@ sub run_testcase ($) { # ---------------------------------------------------------------------- { - unlink("r/$tname.reject"); + # remove the old reject file + if ( $opt_suite eq "main" ) + { + unlink("r/$tname.reject"); + } + else + { + unlink("suite/$opt_suite/r/$tname.reject"); + } unlink($path_timefile); my $res= run_mysqltest($tinfo, $tinfo->{'master_opt'}); @@ -2158,7 +2182,7 @@ Options to run test on running server extern Use running server for tests FIXME DANGEROUS ndbconnectstring=STR Use running cluster, and connect using STR - user=USER The databse user name + user=USER User for connect to server Options for debugging the product @@ -2185,6 +2209,7 @@ Misc options compress Use the compressed protocol between client and server timer Show test case execution time start-and-exit Only initiate and start the "mysqld" servers + start-dirty Only start the "mysqld" servers without initiation fast Don't try to cleanup from earlier runs reorder Reorder tests to get less server restarts help Get this help text From 11df4eec8546fc6d6230753f7b5f7b60f2c6d658 Mon Sep 17 00:00:00 2001 From: "lenz@mysql.com" <> Date: Wed, 13 Apr 2005 11:51:38 +0200 Subject: [PATCH 151/204] - manual.texi will be replaced with a manual written in DocBook/XML. This ChangeSet removes all references to the .texi file and the build targets that depend on manual.texi as the input file. - added COPYING as a regular file instead of creating it during the build. This ensures that it's part of the sources when pulling from BK (it used to be extracted from the manual) - Removed a lot of cruft and unused/obsolete stuff from the Docs directory (e.g. Flags, Images) - added a dummy mysql.info placeholder file (the info file is still used as the source to extract various text files during the build). It will be replaced with a "real" file during the Bootstrap process to create the official source distribution - the placeholder just satisfies build dependencies. --- COPYING | 352 + Docs/Flags/argentina.eps | 98 - Docs/Flags/argentina.gif | Bin 187 -> 0 bytes Docs/Flags/argentina.pdf | Bin 923 -> 0 bytes Docs/Flags/argentina.txt | 0 Docs/Flags/armenia.eps | 256 - Docs/Flags/armenia.gif | Bin 117 -> 0 bytes Docs/Flags/armenia.txt | 0 Docs/Flags/australia.eps | 98 - Docs/Flags/australia.gif | Bin 663 -> 0 bytes Docs/Flags/australia.pdf | Bin 1382 -> 0 bytes Docs/Flags/australia.txt | 0 Docs/Flags/austria.eps | 98 - Docs/Flags/austria.gif | Bin 132 -> 0 bytes Docs/Flags/austria.pdf | Bin 816 -> 0 bytes Docs/Flags/austria.txt | 0 Docs/Flags/belgium.eps | 98 - Docs/Flags/belgium.gif | Bin 116 -> 0 bytes Docs/Flags/belgium.pdf | Bin 790 -> 0 bytes Docs/Flags/belgium.txt | 0 Docs/Flags/brazil.eps | 87 - Docs/Flags/brazil.gif | Bin 662 -> 0 bytes Docs/Flags/brazil.txt | 0 Docs/Flags/bulgaria.eps | 98 - Docs/Flags/bulgaria.gif | Bin 141 -> 0 bytes Docs/Flags/bulgaria.pdf | Bin 821 -> 0 bytes Docs/Flags/bulgaria.txt | 0 Docs/Flags/canada.eps | 98 - Docs/Flags/canada.gif | Bin 411 -> 0 bytes Docs/Flags/canada.pdf | Bin 1103 -> 0 bytes Docs/Flags/canada.txt | 0 Docs/Flags/chile.eps | 98 - Docs/Flags/chile.gif | Bin 256 -> 0 bytes Docs/Flags/chile.pdf | Bin 978 -> 0 bytes Docs/Flags/chile.txt | 0 Docs/Flags/china.eps | 98 - Docs/Flags/china.gif | Bin 227 -> 0 bytes Docs/Flags/china.pdf | Bin 945 -> 0 bytes Docs/Flags/china.txt | 0 Docs/Flags/costa-rica.eps | 98 - Docs/Flags/costa-rica.gif | Bin 147 -> 0 bytes Docs/Flags/costa-rica.pdf | Bin 845 -> 0 bytes Docs/Flags/costa-rica.txt | 0 Docs/Flags/croatia.eps | 87 - Docs/Flags/croatia.gif | Bin 659 -> 0 bytes Docs/Flags/croatia.txt | 0 Docs/Flags/czech-republic.eps | 98 - Docs/Flags/czech-republic.gif | Bin 180 -> 0 bytes Docs/Flags/czech-republic.pdf | Bin 936 -> 0 bytes Docs/Flags/czech-republic.txt | 0 Docs/Flags/denmark.eps | 98 - Docs/Flags/denmark.gif | Bin 204 -> 0 bytes Docs/Flags/denmark.pdf | Bin 1011 -> 0 bytes Docs/Flags/denmark.txt | 0 Docs/Flags/estonia.eps | 98 - Docs/Flags/estonia.gif | Bin 126 -> 0 bytes Docs/Flags/estonia.pdf | Bin 820 -> 0 bytes Docs/Flags/estonia.txt | 0 Docs/Flags/finland.eps | 98 - Docs/Flags/finland.gif | Bin 131 -> 0 bytes Docs/Flags/finland.pdf | Bin 834 -> 0 bytes Docs/Flags/finland.txt | 0 Docs/Flags/france.eps | 98 - Docs/Flags/france.gif | Bin 146 -> 0 bytes Docs/Flags/france.pdf | Bin 796 -> 0 bytes Docs/Flags/france.txt | 0 Docs/Flags/germany.eps | 98 - Docs/Flags/germany.gif | Bin 126 -> 0 bytes Docs/Flags/germany.pdf | Bin 804 -> 0 bytes Docs/Flags/germany.txt | 0 Docs/Flags/great-britain.eps | 98 - Docs/Flags/great-britain.gif | Bin 511 -> 0 bytes Docs/Flags/great-britain.pdf | Bin 1348 -> 0 bytes Docs/Flags/great-britain.txt | 0 Docs/Flags/greece.eps | 98 - Docs/Flags/greece.gif | Bin 267 -> 0 bytes Docs/Flags/greece.pdf | Bin 1006 -> 0 bytes Docs/Flags/greece.txt | 0 Docs/Flags/hungary.eps | 98 - Docs/Flags/hungary.gif | Bin 141 -> 0 bytes Docs/Flags/hungary.pdf | Bin 822 -> 0 bytes Docs/Flags/hungary.txt | 0 Docs/Flags/iceland.eps | 98 - Docs/Flags/iceland.gif | Bin 159 -> 0 bytes Docs/Flags/iceland.pdf | Bin 867 -> 0 bytes Docs/Flags/iceland.txt | 0 Docs/Flags/indonesia.eps | 98 - Docs/Flags/indonesia.gif | Bin 113 -> 0 bytes Docs/Flags/indonesia.pdf | Bin 804 -> 0 bytes Docs/Flags/indonesia.txt | 0 Docs/Flags/ireland.eps | 98 - Docs/Flags/ireland.gif | Bin 146 -> 0 bytes Docs/Flags/ireland.pdf | Bin 794 -> 0 bytes Docs/Flags/ireland.txt | 0 Docs/Flags/israel.eps | 87 - Docs/Flags/israel.gif | Bin 368 -> 0 bytes Docs/Flags/israel.txt | 0 Docs/Flags/italy.eps | 98 - Docs/Flags/italy.gif | Bin 146 -> 0 bytes Docs/Flags/italy.pdf | Bin 794 -> 0 bytes Docs/Flags/italy.txt | 0 Docs/Flags/japan.eps | 98 - Docs/Flags/japan.gif | Bin 192 -> 0 bytes Docs/Flags/japan.pdf | Bin 971 -> 0 bytes Docs/Flags/japan.txt | 0 Docs/Flags/latvia.eps | 98 - Docs/Flags/latvia.gif | Bin 126 -> 0 bytes Docs/Flags/latvia.pdf | Bin 819 -> 0 bytes Docs/Flags/latvia.txt | 0 Docs/Flags/mexico.eps | 98 - Docs/Flags/mexico.gif | Bin 615 -> 0 bytes Docs/Flags/mexico.pdf | Bin 1072 -> 0 bytes Docs/Flags/mexico.txt | 0 Docs/Flags/netherlands.eps | 98 - Docs/Flags/netherlands.gif | Bin 141 -> 0 bytes Docs/Flags/netherlands.pdf | Bin 824 -> 0 bytes Docs/Flags/netherlands.txt | 0 Docs/Flags/new-zealand.eps | 98 - Docs/Flags/new-zealand.gif | Bin 661 -> 0 bytes Docs/Flags/new-zealand.pdf | Bin 1331 -> 0 bytes Docs/Flags/new-zealand.txt | 0 Docs/Flags/norway.eps | 98 - Docs/Flags/norway.gif | Bin 159 -> 0 bytes Docs/Flags/norway.pdf | Bin 864 -> 0 bytes Docs/Flags/norway.txt | 0 Docs/Flags/philippines.eps | 98 - Docs/Flags/philippines.gif | Bin 620 -> 0 bytes Docs/Flags/philippines.pdf | Bin 1197 -> 0 bytes Docs/Flags/philippines.txt | 0 Docs/Flags/poland.eps | 98 - Docs/Flags/poland.gif | Bin 113 -> 0 bytes Docs/Flags/poland.pdf | Bin 809 -> 0 bytes Docs/Flags/poland.txt | 0 Docs/Flags/portugal.eps | 98 - Docs/Flags/portugal.gif | Bin 628 -> 0 bytes Docs/Flags/portugal.pdf | Bin 1189 -> 0 bytes Docs/Flags/portugal.txt | 0 Docs/Flags/romania.eps | 98 - Docs/Flags/romania.gif | Bin 158 -> 0 bytes Docs/Flags/romania.pdf | Bin 798 -> 0 bytes Docs/Flags/romania.txt | 0 Docs/Flags/russia.eps | 98 - Docs/Flags/russia.gif | Bin 141 -> 0 bytes Docs/Flags/russia.pdf | Bin 829 -> 0 bytes Docs/Flags/russia.txt | 0 Docs/Flags/singapore.eps | 98 - Docs/Flags/singapore.gif | Bin 377 -> 0 bytes Docs/Flags/singapore.pdf | Bin 1056 -> 0 bytes Docs/Flags/singapore.txt | 0 Docs/Flags/slovenia.eps | 98 - Docs/Flags/slovenia.gif | Bin 609 -> 0 bytes Docs/Flags/slovenia.pdf | Bin 1133 -> 0 bytes Docs/Flags/slovenia.txt | 0 Docs/Flags/south-africa.eps | 98 - Docs/Flags/south-africa.gif | Bin 415 -> 0 bytes Docs/Flags/south-africa.pdf | Bin 1151 -> 0 bytes Docs/Flags/south-africa.txt | 0 Docs/Flags/south-korea.eps | 98 - Docs/Flags/south-korea.gif | Bin 669 -> 0 bytes Docs/Flags/south-korea.pdf | Bin 1444 -> 0 bytes Docs/Flags/south-korea.txt | 0 Docs/Flags/spain.eps | 98 - Docs/Flags/spain.gif | Bin 132 -> 0 bytes Docs/Flags/spain.pdf | Bin 809 -> 0 bytes Docs/Flags/spain.txt | 0 Docs/Flags/sweden.eps | 98 - Docs/Flags/sweden.gif | Bin 131 -> 0 bytes Docs/Flags/sweden.pdf | Bin 837 -> 0 bytes Docs/Flags/sweden.txt | 0 Docs/Flags/switzerland.eps | 98 - Docs/Flags/switzerland.gif | Bin 135 -> 0 bytes Docs/Flags/switzerland.pdf | Bin 844 -> 0 bytes Docs/Flags/switzerland.txt | 0 Docs/Flags/taiwan.eps | 98 - Docs/Flags/taiwan.gif | Bin 371 -> 0 bytes Docs/Flags/taiwan.pdf | Bin 1050 -> 0 bytes Docs/Flags/taiwan.txt | 0 Docs/Flags/turkey.eps | 98 - Docs/Flags/turkey.gif | Bin 344 -> 0 bytes Docs/Flags/turkey.pdf | Bin 987 -> 0 bytes Docs/Flags/turkey.txt | 0 Docs/Flags/ukraine.eps | 98 - Docs/Flags/ukraine.gif | Bin 113 -> 0 bytes Docs/Flags/ukraine.pdf | Bin 810 -> 0 bytes Docs/Flags/ukraine.txt | 0 Docs/Flags/usa.eps | 98 - Docs/Flags/usa.gif | Bin 717 -> 0 bytes Docs/Flags/usa.pdf | Bin 1444 -> 0 bytes Docs/Flags/usa.txt | 0 Docs/Flags/yugoslavia.eps | 98 - Docs/Flags/yugoslavia.gif | Bin 141 -> 0 bytes Docs/Flags/yugoslavia.pdf | Bin 829 -> 0 bytes Docs/Flags/yugoslavia.txt | 0 Docs/Images/Attic/html-fs.gif | Bin 3349 -> 0 bytes Docs/Images/Attic/mysql-01.gif | Bin 4097 -> 0 bytes Docs/Images/Attic/mysql-02.gif | Bin 4811 -> 0 bytes Docs/Images/Attic/mysql-03.gif | Bin 716 -> 0 bytes Docs/Images/Attic/mysql-04.gif | Bin 909 -> 0 bytes Docs/Images/Attic/mysql-05.gif | Bin 2192 -> 0 bytes Docs/Images/Attic/mysql-06.gif | Bin 3082 -> 0 bytes Docs/Images/Attic/mysql-07.gif | Bin 4209 -> 0 bytes Docs/Images/Attic/mysql-08.gif | Bin 1595 -> 0 bytes Docs/Images/Attic/mysql-09.gif | Bin 2627 -> 0 bytes Docs/Images/Attic/mysql-10.gif | Bin 2455 -> 0 bytes Docs/Images/Attic/mysql-11.gif | Bin 1436 -> 0 bytes Docs/Images/Attic/mysql-12.gif | Bin 2642 -> 0 bytes Docs/Images/Attic/mysql-13.gif | Bin 2914 -> 0 bytes Docs/Images/Attic/mysql-14.gif | Bin 2686 -> 0 bytes Docs/Images/Attic/mysql-15.gif | Bin 2310 -> 0 bytes Docs/Images/Attic/mysql-16.gif | Bin 19192 -> 0 bytes Docs/Images/Attic/mysql-17.gif | Bin 2059 -> 0 bytes Docs/Images/Attic/mysql-18.gif | Bin 918 -> 0 bytes Docs/Images/Attic/mysql-19.gif | Bin 2607 -> 0 bytes Docs/Images/Attic/mysql-compatible.jpg | Bin 2809 -> 0 bytes Docs/Images/Attic/mysql5.gif | Bin 2192 -> 0 bytes Docs/Images/Attic/mysql_anim-01.gif | Bin 15008 -> 0 bytes Docs/Images/Attic/mysql_anim-02.gif | Bin 21236 -> 0 bytes Docs/Images/Attic/mysql_anim-03.gif | Bin 16958 -> 0 bytes Docs/Images/Attic/mysql_anim-04.gif | Bin 12716 -> 0 bytes Docs/Images/Attic/mysql_anim-05.gif | Bin 22962 -> 0 bytes Docs/Images/Attic/mysql_anim-06.gif | Bin 42606 -> 0 bytes .../Attic/powered-by-MySQL-transparent.gif | Bin 4209 -> 0 bytes Docs/Images/Makefile.am | 35 - Docs/Images/empty.png | Bin 108 -> 0 bytes Docs/Images/flag-background.pnm | Bin 2170 -> 0 bytes Docs/Images/mysql-logo.gif | Bin 13197 -> 0 bytes Docs/Makefile.am | 184 +- Docs/Raw-Flags/afghanistan.gif | Bin 11155 -> 0 bytes Docs/Raw-Flags/albania.gif | Bin 8288 -> 0 bytes Docs/Raw-Flags/algeria.gif | Bin 5003 -> 0 bytes Docs/Raw-Flags/andorra.gif | Bin 21227 -> 0 bytes Docs/Raw-Flags/angola.gif | Bin 4836 -> 0 bytes Docs/Raw-Flags/antartica.gif | Bin 3185 -> 0 bytes Docs/Raw-Flags/antigua-and-barbuda.gif | Bin 5239 -> 0 bytes Docs/Raw-Flags/argentina.gif | Bin 5242 -> 0 bytes Docs/Raw-Flags/armenia.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/australia.gif | Bin 6493 -> 0 bytes Docs/Raw-Flags/austria.gif | Bin 1232 -> 0 bytes Docs/Raw-Flags/azerbaijan.gif | Bin 2931 -> 0 bytes Docs/Raw-Flags/bahamas.gif | Bin 2836 -> 0 bytes Docs/Raw-Flags/bahrein.gif | Bin 2380 -> 0 bytes Docs/Raw-Flags/bangladesh.gif | Bin 2505 -> 0 bytes Docs/Raw-Flags/barbados.gif | Bin 3178 -> 0 bytes Docs/Raw-Flags/belarus.gif | Bin 1232 -> 0 bytes Docs/Raw-Flags/belgium.gif | Bin 2525 -> 0 bytes Docs/Raw-Flags/belize.gif | Bin 28546 -> 0 bytes Docs/Raw-Flags/benin.gif | Bin 2107 -> 0 bytes Docs/Raw-Flags/bermuda.gif | Bin 4278 -> 0 bytes Docs/Raw-Flags/bhutan.gif | Bin 40300 -> 0 bytes Docs/Raw-Flags/bolivia.gif | Bin 11912 -> 0 bytes Docs/Raw-Flags/bosnia-and-herzegovina.gif | Bin 4143 -> 0 bytes Docs/Raw-Flags/botswana.gif | Bin 1451 -> 0 bytes Docs/Raw-Flags/brazil.gif | Bin 6650 -> 0 bytes Docs/Raw-Flags/brunei.gif | Bin 29444 -> 0 bytes Docs/Raw-Flags/bulgaria.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/burkina-faso.gif | Bin 2691 -> 0 bytes Docs/Raw-Flags/burma.gif | Bin 11558 -> 0 bytes Docs/Raw-Flags/burundi.gif | Bin 6742 -> 0 bytes Docs/Raw-Flags/cambodia.gif | Bin 12976 -> 0 bytes Docs/Raw-Flags/cameroon.gif | Bin 3531 -> 0 bytes Docs/Raw-Flags/canada.gif | Bin 3984 -> 0 bytes Docs/Raw-Flags/cape-verde.gif | Bin 3504 -> 0 bytes Docs/Raw-Flags/central-african-republic.gif | Bin 3769 -> 0 bytes Docs/Raw-Flags/chad.gif | Bin 2525 -> 0 bytes Docs/Raw-Flags/chile.gif | Bin 2890 -> 0 bytes Docs/Raw-Flags/china.gif | Bin 2054 -> 0 bytes Docs/Raw-Flags/colombia.gif | Bin 1531 -> 0 bytes Docs/Raw-Flags/comoros.gif | Bin 3049 -> 0 bytes Docs/Raw-Flags/congo.gif | Bin 3265 -> 0 bytes Docs/Raw-Flags/costa-rica.gif | Bin 1620 -> 0 bytes Docs/Raw-Flags/cote-d-ivoire.gif | Bin 2525 -> 0 bytes Docs/Raw-Flags/croatia.gif | Bin 13740 -> 0 bytes Docs/Raw-Flags/cuba.gif | Bin 3986 -> 0 bytes Docs/Raw-Flags/cyprus.gif | Bin 3929 -> 0 bytes Docs/Raw-Flags/czech-republic.gif | Bin 2726 -> 0 bytes Docs/Raw-Flags/denmark-original-incorrect.gif | Bin 1893 -> 0 bytes Docs/Raw-Flags/denmark.gif | Bin 13718 -> 0 bytes Docs/Raw-Flags/djibouti.gif | Bin 3462 -> 0 bytes Docs/Raw-Flags/dominica.gif | Bin 14390 -> 0 bytes Docs/Raw-Flags/dominican-republic.gif | Bin 8432 -> 0 bytes Docs/Raw-Flags/ecuador.gif | Bin 18692 -> 0 bytes Docs/Raw-Flags/egypt.gif | Bin 8423 -> 0 bytes Docs/Raw-Flags/el-salvador.gif | Bin 12073 -> 0 bytes Docs/Raw-Flags/equatorial-guinea.gif | Bin 8884 -> 0 bytes Docs/Raw-Flags/eritrea.gif | Bin 8154 -> 0 bytes Docs/Raw-Flags/estonia.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/ethiopia.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/fiji.gif | Bin 17779 -> 0 bytes Docs/Raw-Flags/finland.gif | Bin 1812 -> 0 bytes Docs/Raw-Flags/france.gif | Bin 2525 -> 0 bytes Docs/Raw-Flags/gabon.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/gambia.gif | Bin 1831 -> 0 bytes Docs/Raw-Flags/georgia.gif | Bin 1900 -> 0 bytes Docs/Raw-Flags/germany.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/ghana.gif | Bin 2394 -> 0 bytes Docs/Raw-Flags/great-britain.gif | Bin 8165 -> 0 bytes Docs/Raw-Flags/greece.gif | Bin 2173 -> 0 bytes Docs/Raw-Flags/greenland.gif | Bin 2612 -> 0 bytes Docs/Raw-Flags/grenada.gif | Bin 6780 -> 0 bytes Docs/Raw-Flags/guatemala.gif | Bin 19048 -> 0 bytes Docs/Raw-Flags/guinea-bissau.gif | Bin 3300 -> 0 bytes Docs/Raw-Flags/guinea.gif | Bin 2525 -> 0 bytes Docs/Raw-Flags/guyana.gif | Bin 5299 -> 0 bytes Docs/Raw-Flags/haiti.gif | Bin 24028 -> 0 bytes Docs/Raw-Flags/honduras.gif | Bin 2223 -> 0 bytes Docs/Raw-Flags/hungary.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/iceland.gif | Bin 2544 -> 0 bytes Docs/Raw-Flags/india.gif | Bin 4399 -> 0 bytes Docs/Raw-Flags/indonesia.gif | Bin 1205 -> 0 bytes Docs/Raw-Flags/iran.gif | Bin 7703 -> 0 bytes Docs/Raw-Flags/iraq.gif | Bin 4538 -> 0 bytes Docs/Raw-Flags/ireland.gif | Bin 2525 -> 0 bytes Docs/Raw-Flags/israel.gif | Bin 2808 -> 0 bytes Docs/Raw-Flags/italy.gif | Bin 2525 -> 0 bytes Docs/Raw-Flags/jamaica.gif | Bin 4749 -> 0 bytes Docs/Raw-Flags/japan.gif | Bin 2505 -> 0 bytes Docs/Raw-Flags/jordan.gif | Bin 3755 -> 0 bytes Docs/Raw-Flags/kazakhstan.gif | Bin 24988 -> 0 bytes Docs/Raw-Flags/kenya.gif | Bin 6806 -> 0 bytes Docs/Raw-Flags/kiribati.gif | Bin 9341 -> 0 bytes Docs/Raw-Flags/kuwait.gif | Bin 2926 -> 0 bytes Docs/Raw-Flags/kyrgyzstan.gif | Bin 7742 -> 0 bytes Docs/Raw-Flags/laos.gif | Bin 2402 -> 0 bytes Docs/Raw-Flags/latvia.gif | Bin 1142 -> 0 bytes Docs/Raw-Flags/lebanon.gif | Bin 2874 -> 0 bytes Docs/Raw-Flags/lesotho.gif | Bin 5568 -> 0 bytes Docs/Raw-Flags/liberia.gif | Bin 2889 -> 0 bytes Docs/Raw-Flags/libya.gif | Bin 787 -> 0 bytes Docs/Raw-Flags/liechtenstein.gif | Bin 9832 -> 0 bytes Docs/Raw-Flags/lithuania.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/luxembourg.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/macedonia.gif | Bin 6907 -> 0 bytes Docs/Raw-Flags/madagascar.gif | Bin 2061 -> 0 bytes Docs/Raw-Flags/malawi.gif | Bin 5622 -> 0 bytes Docs/Raw-Flags/malaysia.gif | Bin 4621 -> 0 bytes Docs/Raw-Flags/maldives.gif | Bin 2623 -> 0 bytes Docs/Raw-Flags/mali.gif | Bin 2525 -> 0 bytes Docs/Raw-Flags/malta.gif | Bin 7209 -> 0 bytes Docs/Raw-Flags/marshall.gif | Bin 6614 -> 0 bytes Docs/Raw-Flags/mauritania.gif | Bin 2511 -> 0 bytes Docs/Raw-Flags/mauritius.gif | Bin 1888 -> 0 bytes Docs/Raw-Flags/mexico.gif | Bin 16889 -> 0 bytes Docs/Raw-Flags/micronesia.gif | Bin 3092 -> 0 bytes Docs/Raw-Flags/moldova.gif | Bin 16586 -> 0 bytes Docs/Raw-Flags/monaco.gif | Bin 1205 -> 0 bytes Docs/Raw-Flags/mongolia.gif | Bin 5532 -> 0 bytes Docs/Raw-Flags/morocco.gif | Bin 4507 -> 0 bytes Docs/Raw-Flags/mozambique.gif | Bin 9086 -> 0 bytes Docs/Raw-Flags/namibia.gif | Bin 6725 -> 0 bytes Docs/Raw-Flags/nauru.gif | Bin 2209 -> 0 bytes Docs/Raw-Flags/nepal.gif | Bin 5658 -> 0 bytes Docs/Raw-Flags/netherlands.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/new-zealand.gif | Bin 7248 -> 0 bytes Docs/Raw-Flags/nicaragua.gif | Bin 8024 -> 0 bytes Docs/Raw-Flags/niger.gif | Bin 2381 -> 0 bytes Docs/Raw-Flags/nigeria.gif | Bin 1998 -> 0 bytes Docs/Raw-Flags/north-korea.gif | Bin 3044 -> 0 bytes Docs/Raw-Flags/norway.gif | Bin 2544 -> 0 bytes Docs/Raw-Flags/oman.gif | Bin 6957 -> 0 bytes Docs/Raw-Flags/pakistan.gif | Bin 3805 -> 0 bytes Docs/Raw-Flags/panama.gif | Bin 4459 -> 0 bytes Docs/Raw-Flags/papua-new-guinea.gif | Bin 5742 -> 0 bytes Docs/Raw-Flags/paraguay.gif | Bin 8733 -> 0 bytes Docs/Raw-Flags/peru.gif | Bin 14338 -> 0 bytes Docs/Raw-Flags/philippines.gif | Bin 7606 -> 0 bytes Docs/Raw-Flags/poland.gif | Bin 1205 -> 0 bytes Docs/Raw-Flags/portugal.gif | Bin 11287 -> 0 bytes Docs/Raw-Flags/qatar.gif | Bin 2380 -> 0 bytes Docs/Raw-Flags/romania.gif | Bin 2777 -> 0 bytes Docs/Raw-Flags/russia.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/rwanda.gif | Bin 3844 -> 0 bytes Docs/Raw-Flags/saint-kitts-and-nevis.gif | Bin 6152 -> 0 bytes Docs/Raw-Flags/saint-lucia.gif | Bin 4434 -> 0 bytes Docs/Raw-Flags/samoa.gif | Bin 2219 -> 0 bytes Docs/Raw-Flags/sao-tome-and-principe.gif | Bin 3978 -> 0 bytes Docs/Raw-Flags/saudi-arabia.gif | Bin 18855 -> 0 bytes Docs/Raw-Flags/senegal.gif | Bin 3532 -> 0 bytes Docs/Raw-Flags/seychelles.gif | Bin 3408 -> 0 bytes Docs/Raw-Flags/sierra-leone.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/singapore.gif | Bin 3207 -> 0 bytes Docs/Raw-Flags/slovakia.gif | Bin 4706 -> 0 bytes Docs/Raw-Flags/slovenia.gif | Bin 5351 -> 0 bytes Docs/Raw-Flags/solomon-islands.gif | Bin 4369 -> 0 bytes Docs/Raw-Flags/somalia.gif | Bin 2010 -> 0 bytes Docs/Raw-Flags/south-africa.gif | Bin 5116 -> 0 bytes Docs/Raw-Flags/south-korea.gif | Bin 6838 -> 0 bytes Docs/Raw-Flags/spain.gif | Bin 1252 -> 0 bytes Docs/Raw-Flags/sri-lanka.gif | Bin 14789 -> 0 bytes Docs/Raw-Flags/sudan.gif | Bin 3124 -> 0 bytes Docs/Raw-Flags/suriname.gif | Bin 2499 -> 0 bytes Docs/Raw-Flags/swaziland.gif | Bin 11362 -> 0 bytes Docs/Raw-Flags/sweden.gif | Bin 1812 -> 0 bytes Docs/Raw-Flags/sweden2.gif | Bin 1813 -> 0 bytes Docs/Raw-Flags/switzerland.gif | Bin 1632 -> 0 bytes Docs/Raw-Flags/syria.gif | Bin 2748 -> 0 bytes Docs/Raw-Flags/taiwan.gif | Bin 3866 -> 0 bytes Docs/Raw-Flags/tajikistan.gif | Bin 6245 -> 0 bytes Docs/Raw-Flags/tanzania.gif | Bin 4673 -> 0 bytes Docs/Raw-Flags/thailand.gif | Bin 1620 -> 0 bytes Docs/Raw-Flags/togo.gif | Bin 2815 -> 0 bytes Docs/Raw-Flags/tonga.gif | Bin 2066 -> 0 bytes Docs/Raw-Flags/trinidad-and-tobago.gif | Bin 2807 -> 0 bytes Docs/Raw-Flags/tunisia.gif | Bin 3881 -> 0 bytes Docs/Raw-Flags/turkey.gif | Bin 2557 -> 0 bytes Docs/Raw-Flags/turkmenistan.gif | Bin 26835 -> 0 bytes Docs/Raw-Flags/tuvalu.gif | Bin 7855 -> 0 bytes Docs/Raw-Flags/uganda.gif | Bin 5970 -> 0 bytes Docs/Raw-Flags/ukraine.gif | Bin 1205 -> 0 bytes Docs/Raw-Flags/united-arab-emirates.gif | Bin 2493 -> 0 bytes Docs/Raw-Flags/united-states-of-america.gif | Bin 6528 -> 0 bytes Docs/Raw-Flags/uruguay.gif | Bin 8709 -> 0 bytes Docs/Raw-Flags/usa.gif | Bin 6528 -> 0 bytes Docs/Raw-Flags/uzbekistan.gif | Bin 3968 -> 0 bytes Docs/Raw-Flags/vanuatu.gif | Bin 8928 -> 0 bytes Docs/Raw-Flags/venezuela.gif | Bin 10305 -> 0 bytes Docs/Raw-Flags/vietnam.gif | Bin 2010 -> 0 bytes Docs/Raw-Flags/vincent-and-grenadines.gif | Bin 4234 -> 0 bytes Docs/Raw-Flags/yemen.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/yugoslavia.gif | Bin 1553 -> 0 bytes Docs/Raw-Flags/zaire.gif | Bin 12709 -> 0 bytes Docs/Raw-Flags/zambia.gif | Bin 8598 -> 0 bytes Docs/Raw-Flags/zimbabwe.gif | Bin 10738 -> 0 bytes Docs/Support/generate-mirror-listing.pl | 27 - Docs/Support/texi2html | 2259 - Docs/Support/texinfo.tex | 5868 --- Docs/Support/update-reserved-words.pl | 98 - .../MySQL-for-dummies | 271 - Docs/Translations/myodbc-br.texi | 272 - Docs/manual-license-spanish.texi | 709 - Docs/manual.de.texi | 107 - Docs/manual.ja.texi | 38699 ---------------- Docs/manual.texi | 107 - Docs/manual_toc.html | 9 - Docs/mirrors.texi | 446 - Docs/mysql.info | 27 + Docs/mysqld_error.txt | 477 - Docs/reservedwords.texi | 14 - Docs/section.Infolinks.texi | 880 - Docs/section.Testimonials.texi | 31 - Docs/section.Users.texi | 414 - configure.in | 2 +- scripts/make_win_src_distribution.sh | 7 +- support-files/mysql.spec.sh | 12 +- 443 files changed, 392 insertions(+), 55842 deletions(-) create mode 100644 COPYING delete mode 100644 Docs/Flags/argentina.eps delete mode 100644 Docs/Flags/argentina.gif delete mode 100644 Docs/Flags/argentina.pdf delete mode 100644 Docs/Flags/argentina.txt delete mode 100644 Docs/Flags/armenia.eps delete mode 100755 Docs/Flags/armenia.gif delete mode 100644 Docs/Flags/armenia.txt delete mode 100644 Docs/Flags/australia.eps delete mode 100644 Docs/Flags/australia.gif delete mode 100644 Docs/Flags/australia.pdf delete mode 100644 Docs/Flags/australia.txt delete mode 100644 Docs/Flags/austria.eps delete mode 100644 Docs/Flags/austria.gif delete mode 100644 Docs/Flags/austria.pdf delete mode 100644 Docs/Flags/austria.txt delete mode 100644 Docs/Flags/belgium.eps delete mode 100644 Docs/Flags/belgium.gif delete mode 100644 Docs/Flags/belgium.pdf delete mode 100644 Docs/Flags/belgium.txt delete mode 100644 Docs/Flags/brazil.eps delete mode 100644 Docs/Flags/brazil.gif delete mode 100644 Docs/Flags/brazil.txt delete mode 100644 Docs/Flags/bulgaria.eps delete mode 100644 Docs/Flags/bulgaria.gif delete mode 100644 Docs/Flags/bulgaria.pdf delete mode 100644 Docs/Flags/bulgaria.txt delete mode 100644 Docs/Flags/canada.eps delete mode 100644 Docs/Flags/canada.gif delete mode 100644 Docs/Flags/canada.pdf delete mode 100644 Docs/Flags/canada.txt delete mode 100644 Docs/Flags/chile.eps delete mode 100644 Docs/Flags/chile.gif delete mode 100644 Docs/Flags/chile.pdf delete mode 100644 Docs/Flags/chile.txt delete mode 100644 Docs/Flags/china.eps delete mode 100644 Docs/Flags/china.gif delete mode 100644 Docs/Flags/china.pdf delete mode 100644 Docs/Flags/china.txt delete mode 100644 Docs/Flags/costa-rica.eps delete mode 100644 Docs/Flags/costa-rica.gif delete mode 100644 Docs/Flags/costa-rica.pdf delete mode 100644 Docs/Flags/costa-rica.txt delete mode 100644 Docs/Flags/croatia.eps delete mode 100644 Docs/Flags/croatia.gif delete mode 100644 Docs/Flags/croatia.txt delete mode 100644 Docs/Flags/czech-republic.eps delete mode 100644 Docs/Flags/czech-republic.gif delete mode 100644 Docs/Flags/czech-republic.pdf delete mode 100644 Docs/Flags/czech-republic.txt delete mode 100644 Docs/Flags/denmark.eps delete mode 100644 Docs/Flags/denmark.gif delete mode 100644 Docs/Flags/denmark.pdf delete mode 100644 Docs/Flags/denmark.txt delete mode 100644 Docs/Flags/estonia.eps delete mode 100644 Docs/Flags/estonia.gif delete mode 100644 Docs/Flags/estonia.pdf delete mode 100644 Docs/Flags/estonia.txt delete mode 100644 Docs/Flags/finland.eps delete mode 100644 Docs/Flags/finland.gif delete mode 100644 Docs/Flags/finland.pdf delete mode 100644 Docs/Flags/finland.txt delete mode 100644 Docs/Flags/france.eps delete mode 100644 Docs/Flags/france.gif delete mode 100644 Docs/Flags/france.pdf delete mode 100644 Docs/Flags/france.txt delete mode 100644 Docs/Flags/germany.eps delete mode 100644 Docs/Flags/germany.gif delete mode 100644 Docs/Flags/germany.pdf delete mode 100644 Docs/Flags/germany.txt delete mode 100644 Docs/Flags/great-britain.eps delete mode 100644 Docs/Flags/great-britain.gif delete mode 100644 Docs/Flags/great-britain.pdf delete mode 100644 Docs/Flags/great-britain.txt delete mode 100644 Docs/Flags/greece.eps delete mode 100644 Docs/Flags/greece.gif delete mode 100644 Docs/Flags/greece.pdf delete mode 100644 Docs/Flags/greece.txt delete mode 100644 Docs/Flags/hungary.eps delete mode 100644 Docs/Flags/hungary.gif delete mode 100644 Docs/Flags/hungary.pdf delete mode 100644 Docs/Flags/hungary.txt delete mode 100644 Docs/Flags/iceland.eps delete mode 100644 Docs/Flags/iceland.gif delete mode 100644 Docs/Flags/iceland.pdf delete mode 100644 Docs/Flags/iceland.txt delete mode 100644 Docs/Flags/indonesia.eps delete mode 100644 Docs/Flags/indonesia.gif delete mode 100644 Docs/Flags/indonesia.pdf delete mode 100644 Docs/Flags/indonesia.txt delete mode 100644 Docs/Flags/ireland.eps delete mode 100644 Docs/Flags/ireland.gif delete mode 100644 Docs/Flags/ireland.pdf delete mode 100644 Docs/Flags/ireland.txt delete mode 100644 Docs/Flags/israel.eps delete mode 100644 Docs/Flags/israel.gif delete mode 100644 Docs/Flags/israel.txt delete mode 100644 Docs/Flags/italy.eps delete mode 100644 Docs/Flags/italy.gif delete mode 100644 Docs/Flags/italy.pdf delete mode 100644 Docs/Flags/italy.txt delete mode 100644 Docs/Flags/japan.eps delete mode 100644 Docs/Flags/japan.gif delete mode 100644 Docs/Flags/japan.pdf delete mode 100644 Docs/Flags/japan.txt delete mode 100644 Docs/Flags/latvia.eps delete mode 100644 Docs/Flags/latvia.gif delete mode 100644 Docs/Flags/latvia.pdf delete mode 100644 Docs/Flags/latvia.txt delete mode 100644 Docs/Flags/mexico.eps delete mode 100644 Docs/Flags/mexico.gif delete mode 100644 Docs/Flags/mexico.pdf delete mode 100644 Docs/Flags/mexico.txt delete mode 100644 Docs/Flags/netherlands.eps delete mode 100644 Docs/Flags/netherlands.gif delete mode 100644 Docs/Flags/netherlands.pdf delete mode 100644 Docs/Flags/netherlands.txt delete mode 100644 Docs/Flags/new-zealand.eps delete mode 100644 Docs/Flags/new-zealand.gif delete mode 100644 Docs/Flags/new-zealand.pdf delete mode 100644 Docs/Flags/new-zealand.txt delete mode 100755 Docs/Flags/norway.eps delete mode 100755 Docs/Flags/norway.gif delete mode 100644 Docs/Flags/norway.pdf delete mode 100644 Docs/Flags/norway.txt delete mode 100644 Docs/Flags/philippines.eps delete mode 100644 Docs/Flags/philippines.gif delete mode 100644 Docs/Flags/philippines.pdf delete mode 100644 Docs/Flags/philippines.txt delete mode 100644 Docs/Flags/poland.eps delete mode 100644 Docs/Flags/poland.gif delete mode 100644 Docs/Flags/poland.pdf delete mode 100644 Docs/Flags/poland.txt delete mode 100644 Docs/Flags/portugal.eps delete mode 100644 Docs/Flags/portugal.gif delete mode 100644 Docs/Flags/portugal.pdf delete mode 100644 Docs/Flags/portugal.txt delete mode 100644 Docs/Flags/romania.eps delete mode 100644 Docs/Flags/romania.gif delete mode 100644 Docs/Flags/romania.pdf delete mode 100644 Docs/Flags/romania.txt delete mode 100644 Docs/Flags/russia.eps delete mode 100644 Docs/Flags/russia.gif delete mode 100644 Docs/Flags/russia.pdf delete mode 100644 Docs/Flags/russia.txt delete mode 100644 Docs/Flags/singapore.eps delete mode 100644 Docs/Flags/singapore.gif delete mode 100644 Docs/Flags/singapore.pdf delete mode 100644 Docs/Flags/singapore.txt delete mode 100755 Docs/Flags/slovenia.eps delete mode 100644 Docs/Flags/slovenia.gif delete mode 100644 Docs/Flags/slovenia.pdf delete mode 100755 Docs/Flags/slovenia.txt delete mode 100644 Docs/Flags/south-africa.eps delete mode 100644 Docs/Flags/south-africa.gif delete mode 100644 Docs/Flags/south-africa.pdf delete mode 100644 Docs/Flags/south-africa.txt delete mode 100644 Docs/Flags/south-korea.eps delete mode 100644 Docs/Flags/south-korea.gif delete mode 100644 Docs/Flags/south-korea.pdf delete mode 100644 Docs/Flags/south-korea.txt delete mode 100644 Docs/Flags/spain.eps delete mode 100644 Docs/Flags/spain.gif delete mode 100644 Docs/Flags/spain.pdf delete mode 100644 Docs/Flags/spain.txt delete mode 100644 Docs/Flags/sweden.eps delete mode 100644 Docs/Flags/sweden.gif delete mode 100644 Docs/Flags/sweden.pdf delete mode 100644 Docs/Flags/sweden.txt delete mode 100644 Docs/Flags/switzerland.eps delete mode 100644 Docs/Flags/switzerland.gif delete mode 100644 Docs/Flags/switzerland.pdf delete mode 100644 Docs/Flags/switzerland.txt delete mode 100644 Docs/Flags/taiwan.eps delete mode 100644 Docs/Flags/taiwan.gif delete mode 100644 Docs/Flags/taiwan.pdf delete mode 100644 Docs/Flags/taiwan.txt delete mode 100644 Docs/Flags/turkey.eps delete mode 100644 Docs/Flags/turkey.gif delete mode 100644 Docs/Flags/turkey.pdf delete mode 100644 Docs/Flags/turkey.txt delete mode 100644 Docs/Flags/ukraine.eps delete mode 100644 Docs/Flags/ukraine.gif delete mode 100644 Docs/Flags/ukraine.pdf delete mode 100644 Docs/Flags/ukraine.txt delete mode 100644 Docs/Flags/usa.eps delete mode 100644 Docs/Flags/usa.gif delete mode 100644 Docs/Flags/usa.pdf delete mode 100644 Docs/Flags/usa.txt delete mode 100644 Docs/Flags/yugoslavia.eps delete mode 100644 Docs/Flags/yugoslavia.gif delete mode 100644 Docs/Flags/yugoslavia.pdf delete mode 100644 Docs/Flags/yugoslavia.txt delete mode 100644 Docs/Images/Attic/html-fs.gif delete mode 100644 Docs/Images/Attic/mysql-01.gif delete mode 100644 Docs/Images/Attic/mysql-02.gif delete mode 100644 Docs/Images/Attic/mysql-03.gif delete mode 100644 Docs/Images/Attic/mysql-04.gif delete mode 100644 Docs/Images/Attic/mysql-05.gif delete mode 100644 Docs/Images/Attic/mysql-06.gif delete mode 100644 Docs/Images/Attic/mysql-07.gif delete mode 100644 Docs/Images/Attic/mysql-08.gif delete mode 100644 Docs/Images/Attic/mysql-09.gif delete mode 100644 Docs/Images/Attic/mysql-10.gif delete mode 100644 Docs/Images/Attic/mysql-11.gif delete mode 100644 Docs/Images/Attic/mysql-12.gif delete mode 100644 Docs/Images/Attic/mysql-13.gif delete mode 100644 Docs/Images/Attic/mysql-14.gif delete mode 100644 Docs/Images/Attic/mysql-15.gif delete mode 100644 Docs/Images/Attic/mysql-16.gif delete mode 100644 Docs/Images/Attic/mysql-17.gif delete mode 100644 Docs/Images/Attic/mysql-18.gif delete mode 100644 Docs/Images/Attic/mysql-19.gif delete mode 100644 Docs/Images/Attic/mysql-compatible.jpg delete mode 100644 Docs/Images/Attic/mysql5.gif delete mode 100644 Docs/Images/Attic/mysql_anim-01.gif delete mode 100644 Docs/Images/Attic/mysql_anim-02.gif delete mode 100644 Docs/Images/Attic/mysql_anim-03.gif delete mode 100644 Docs/Images/Attic/mysql_anim-04.gif delete mode 100644 Docs/Images/Attic/mysql_anim-05.gif delete mode 100644 Docs/Images/Attic/mysql_anim-06.gif delete mode 100644 Docs/Images/Attic/powered-by-MySQL-transparent.gif delete mode 100644 Docs/Images/Makefile.am delete mode 100644 Docs/Images/empty.png delete mode 100755 Docs/Images/flag-background.pnm delete mode 100644 Docs/Images/mysql-logo.gif delete mode 100644 Docs/Raw-Flags/afghanistan.gif delete mode 100644 Docs/Raw-Flags/albania.gif delete mode 100644 Docs/Raw-Flags/algeria.gif delete mode 100644 Docs/Raw-Flags/andorra.gif delete mode 100644 Docs/Raw-Flags/angola.gif delete mode 100644 Docs/Raw-Flags/antartica.gif delete mode 100644 Docs/Raw-Flags/antigua-and-barbuda.gif delete mode 100644 Docs/Raw-Flags/argentina.gif delete mode 100644 Docs/Raw-Flags/armenia.gif delete mode 100644 Docs/Raw-Flags/australia.gif delete mode 100644 Docs/Raw-Flags/austria.gif delete mode 100644 Docs/Raw-Flags/azerbaijan.gif delete mode 100644 Docs/Raw-Flags/bahamas.gif delete mode 100644 Docs/Raw-Flags/bahrein.gif delete mode 100644 Docs/Raw-Flags/bangladesh.gif delete mode 100644 Docs/Raw-Flags/barbados.gif delete mode 100644 Docs/Raw-Flags/belarus.gif delete mode 100644 Docs/Raw-Flags/belgium.gif delete mode 100644 Docs/Raw-Flags/belize.gif delete mode 100644 Docs/Raw-Flags/benin.gif delete mode 100644 Docs/Raw-Flags/bermuda.gif delete mode 100644 Docs/Raw-Flags/bhutan.gif delete mode 100644 Docs/Raw-Flags/bolivia.gif delete mode 100644 Docs/Raw-Flags/bosnia-and-herzegovina.gif delete mode 100644 Docs/Raw-Flags/botswana.gif delete mode 100644 Docs/Raw-Flags/brazil.gif delete mode 100644 Docs/Raw-Flags/brunei.gif delete mode 100644 Docs/Raw-Flags/bulgaria.gif delete mode 100644 Docs/Raw-Flags/burkina-faso.gif delete mode 100644 Docs/Raw-Flags/burma.gif delete mode 100644 Docs/Raw-Flags/burundi.gif delete mode 100644 Docs/Raw-Flags/cambodia.gif delete mode 100644 Docs/Raw-Flags/cameroon.gif delete mode 100644 Docs/Raw-Flags/canada.gif delete mode 100644 Docs/Raw-Flags/cape-verde.gif delete mode 100644 Docs/Raw-Flags/central-african-republic.gif delete mode 100644 Docs/Raw-Flags/chad.gif delete mode 100644 Docs/Raw-Flags/chile.gif delete mode 100644 Docs/Raw-Flags/china.gif delete mode 100644 Docs/Raw-Flags/colombia.gif delete mode 100644 Docs/Raw-Flags/comoros.gif delete mode 100644 Docs/Raw-Flags/congo.gif delete mode 100644 Docs/Raw-Flags/costa-rica.gif delete mode 100644 Docs/Raw-Flags/cote-d-ivoire.gif delete mode 100644 Docs/Raw-Flags/croatia.gif delete mode 100644 Docs/Raw-Flags/cuba.gif delete mode 100644 Docs/Raw-Flags/cyprus.gif delete mode 100644 Docs/Raw-Flags/czech-republic.gif delete mode 100644 Docs/Raw-Flags/denmark-original-incorrect.gif delete mode 100644 Docs/Raw-Flags/denmark.gif delete mode 100644 Docs/Raw-Flags/djibouti.gif delete mode 100644 Docs/Raw-Flags/dominica.gif delete mode 100644 Docs/Raw-Flags/dominican-republic.gif delete mode 100644 Docs/Raw-Flags/ecuador.gif delete mode 100644 Docs/Raw-Flags/egypt.gif delete mode 100644 Docs/Raw-Flags/el-salvador.gif delete mode 100644 Docs/Raw-Flags/equatorial-guinea.gif delete mode 100644 Docs/Raw-Flags/eritrea.gif delete mode 100644 Docs/Raw-Flags/estonia.gif delete mode 100644 Docs/Raw-Flags/ethiopia.gif delete mode 100644 Docs/Raw-Flags/fiji.gif delete mode 100644 Docs/Raw-Flags/finland.gif delete mode 100644 Docs/Raw-Flags/france.gif delete mode 100644 Docs/Raw-Flags/gabon.gif delete mode 100644 Docs/Raw-Flags/gambia.gif delete mode 100644 Docs/Raw-Flags/georgia.gif delete mode 100644 Docs/Raw-Flags/germany.gif delete mode 100644 Docs/Raw-Flags/ghana.gif delete mode 100644 Docs/Raw-Flags/great-britain.gif delete mode 100644 Docs/Raw-Flags/greece.gif delete mode 100644 Docs/Raw-Flags/greenland.gif delete mode 100644 Docs/Raw-Flags/grenada.gif delete mode 100644 Docs/Raw-Flags/guatemala.gif delete mode 100644 Docs/Raw-Flags/guinea-bissau.gif delete mode 100644 Docs/Raw-Flags/guinea.gif delete mode 100644 Docs/Raw-Flags/guyana.gif delete mode 100644 Docs/Raw-Flags/haiti.gif delete mode 100644 Docs/Raw-Flags/honduras.gif delete mode 100644 Docs/Raw-Flags/hungary.gif delete mode 100644 Docs/Raw-Flags/iceland.gif delete mode 100644 Docs/Raw-Flags/india.gif delete mode 100644 Docs/Raw-Flags/indonesia.gif delete mode 100644 Docs/Raw-Flags/iran.gif delete mode 100644 Docs/Raw-Flags/iraq.gif delete mode 100644 Docs/Raw-Flags/ireland.gif delete mode 100644 Docs/Raw-Flags/israel.gif delete mode 100644 Docs/Raw-Flags/italy.gif delete mode 100644 Docs/Raw-Flags/jamaica.gif delete mode 100644 Docs/Raw-Flags/japan.gif delete mode 100644 Docs/Raw-Flags/jordan.gif delete mode 100644 Docs/Raw-Flags/kazakhstan.gif delete mode 100644 Docs/Raw-Flags/kenya.gif delete mode 100644 Docs/Raw-Flags/kiribati.gif delete mode 100644 Docs/Raw-Flags/kuwait.gif delete mode 100644 Docs/Raw-Flags/kyrgyzstan.gif delete mode 100644 Docs/Raw-Flags/laos.gif delete mode 100644 Docs/Raw-Flags/latvia.gif delete mode 100644 Docs/Raw-Flags/lebanon.gif delete mode 100644 Docs/Raw-Flags/lesotho.gif delete mode 100644 Docs/Raw-Flags/liberia.gif delete mode 100644 Docs/Raw-Flags/libya.gif delete mode 100644 Docs/Raw-Flags/liechtenstein.gif delete mode 100644 Docs/Raw-Flags/lithuania.gif delete mode 100644 Docs/Raw-Flags/luxembourg.gif delete mode 100644 Docs/Raw-Flags/macedonia.gif delete mode 100644 Docs/Raw-Flags/madagascar.gif delete mode 100644 Docs/Raw-Flags/malawi.gif delete mode 100644 Docs/Raw-Flags/malaysia.gif delete mode 100644 Docs/Raw-Flags/maldives.gif delete mode 100644 Docs/Raw-Flags/mali.gif delete mode 100644 Docs/Raw-Flags/malta.gif delete mode 100644 Docs/Raw-Flags/marshall.gif delete mode 100644 Docs/Raw-Flags/mauritania.gif delete mode 100644 Docs/Raw-Flags/mauritius.gif delete mode 100644 Docs/Raw-Flags/mexico.gif delete mode 100644 Docs/Raw-Flags/micronesia.gif delete mode 100644 Docs/Raw-Flags/moldova.gif delete mode 100644 Docs/Raw-Flags/monaco.gif delete mode 100644 Docs/Raw-Flags/mongolia.gif delete mode 100644 Docs/Raw-Flags/morocco.gif delete mode 100644 Docs/Raw-Flags/mozambique.gif delete mode 100644 Docs/Raw-Flags/namibia.gif delete mode 100644 Docs/Raw-Flags/nauru.gif delete mode 100644 Docs/Raw-Flags/nepal.gif delete mode 100644 Docs/Raw-Flags/netherlands.gif delete mode 100644 Docs/Raw-Flags/new-zealand.gif delete mode 100644 Docs/Raw-Flags/nicaragua.gif delete mode 100644 Docs/Raw-Flags/niger.gif delete mode 100644 Docs/Raw-Flags/nigeria.gif delete mode 100644 Docs/Raw-Flags/north-korea.gif delete mode 100644 Docs/Raw-Flags/norway.gif delete mode 100644 Docs/Raw-Flags/oman.gif delete mode 100644 Docs/Raw-Flags/pakistan.gif delete mode 100644 Docs/Raw-Flags/panama.gif delete mode 100644 Docs/Raw-Flags/papua-new-guinea.gif delete mode 100644 Docs/Raw-Flags/paraguay.gif delete mode 100644 Docs/Raw-Flags/peru.gif delete mode 100644 Docs/Raw-Flags/philippines.gif delete mode 100644 Docs/Raw-Flags/poland.gif delete mode 100644 Docs/Raw-Flags/portugal.gif delete mode 100644 Docs/Raw-Flags/qatar.gif delete mode 100644 Docs/Raw-Flags/romania.gif delete mode 100644 Docs/Raw-Flags/russia.gif delete mode 100644 Docs/Raw-Flags/rwanda.gif delete mode 100644 Docs/Raw-Flags/saint-kitts-and-nevis.gif delete mode 100644 Docs/Raw-Flags/saint-lucia.gif delete mode 100644 Docs/Raw-Flags/samoa.gif delete mode 100644 Docs/Raw-Flags/sao-tome-and-principe.gif delete mode 100644 Docs/Raw-Flags/saudi-arabia.gif delete mode 100644 Docs/Raw-Flags/senegal.gif delete mode 100644 Docs/Raw-Flags/seychelles.gif delete mode 100644 Docs/Raw-Flags/sierra-leone.gif delete mode 100644 Docs/Raw-Flags/singapore.gif delete mode 100644 Docs/Raw-Flags/slovakia.gif delete mode 100644 Docs/Raw-Flags/slovenia.gif delete mode 100644 Docs/Raw-Flags/solomon-islands.gif delete mode 100644 Docs/Raw-Flags/somalia.gif delete mode 100644 Docs/Raw-Flags/south-africa.gif delete mode 100644 Docs/Raw-Flags/south-korea.gif delete mode 100644 Docs/Raw-Flags/spain.gif delete mode 100644 Docs/Raw-Flags/sri-lanka.gif delete mode 100644 Docs/Raw-Flags/sudan.gif delete mode 100644 Docs/Raw-Flags/suriname.gif delete mode 100644 Docs/Raw-Flags/swaziland.gif delete mode 100644 Docs/Raw-Flags/sweden.gif delete mode 100644 Docs/Raw-Flags/sweden2.gif delete mode 100644 Docs/Raw-Flags/switzerland.gif delete mode 100644 Docs/Raw-Flags/syria.gif delete mode 100644 Docs/Raw-Flags/taiwan.gif delete mode 100644 Docs/Raw-Flags/tajikistan.gif delete mode 100644 Docs/Raw-Flags/tanzania.gif delete mode 100644 Docs/Raw-Flags/thailand.gif delete mode 100644 Docs/Raw-Flags/togo.gif delete mode 100644 Docs/Raw-Flags/tonga.gif delete mode 100644 Docs/Raw-Flags/trinidad-and-tobago.gif delete mode 100644 Docs/Raw-Flags/tunisia.gif delete mode 100644 Docs/Raw-Flags/turkey.gif delete mode 100644 Docs/Raw-Flags/turkmenistan.gif delete mode 100644 Docs/Raw-Flags/tuvalu.gif delete mode 100644 Docs/Raw-Flags/uganda.gif delete mode 100644 Docs/Raw-Flags/ukraine.gif delete mode 100644 Docs/Raw-Flags/united-arab-emirates.gif delete mode 100644 Docs/Raw-Flags/united-states-of-america.gif delete mode 100644 Docs/Raw-Flags/uruguay.gif delete mode 100644 Docs/Raw-Flags/usa.gif delete mode 100644 Docs/Raw-Flags/uzbekistan.gif delete mode 100644 Docs/Raw-Flags/vanuatu.gif delete mode 100644 Docs/Raw-Flags/venezuela.gif delete mode 100644 Docs/Raw-Flags/vietnam.gif delete mode 100644 Docs/Raw-Flags/vincent-and-grenadines.gif delete mode 100644 Docs/Raw-Flags/yemen.gif delete mode 100644 Docs/Raw-Flags/yugoslavia.gif delete mode 100644 Docs/Raw-Flags/zaire.gif delete mode 100644 Docs/Raw-Flags/zambia.gif delete mode 100644 Docs/Raw-Flags/zimbabwe.gif delete mode 100755 Docs/Support/generate-mirror-listing.pl delete mode 100755 Docs/Support/texi2html delete mode 100644 Docs/Support/texinfo.tex delete mode 100755 Docs/Support/update-reserved-words.pl delete mode 100644 Docs/To-be-included-in-the-manual/MySQL-for-dummies delete mode 100644 Docs/Translations/myodbc-br.texi delete mode 100644 Docs/manual-license-spanish.texi delete mode 100644 Docs/manual.de.texi delete mode 100644 Docs/manual.ja.texi delete mode 100644 Docs/manual.texi delete mode 100644 Docs/manual_toc.html delete mode 100644 Docs/mirrors.texi create mode 100644 Docs/mysql.info delete mode 100644 Docs/mysqld_error.txt delete mode 100644 Docs/reservedwords.texi delete mode 100644 Docs/section.Infolinks.texi delete mode 100644 Docs/section.Testimonials.texi delete mode 100644 Docs/section.Users.texi diff --git a/COPYING b/COPYING new file mode 100644 index 00000000000..2cf699059db --- /dev/null +++ b/COPYING @@ -0,0 +1,352 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Preamble +======== + +The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. +Our General Public Licenses are designed to make sure that you have +the freedom to distribute copies of free software (and charge for this +service if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone +to deny you these rights or to ask you to surrender the rights. These +restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis +or for a fee, you must give the recipients all the rights that you +have. You must make sure that they, too, receive or can get the source +code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software patents. +We wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program +proprietary. To prevent this, we have made it clear that any patent +must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 0. This License applies to any program or other work which contains a + notice placed by the copyright holder saying it may be distributed + under the terms of this General Public License. The "Program", + below, refers to any such program or work, and a "work based on + the Program" means either the Program or any derivative work under + copyright law: that is to say, a work containing the Program or a + portion of it, either verbatim or with modifications and/or + translated into another language. (Hereinafter, translation is + included without limitation in the term "modification".) Each + licensee is addressed as "you". + + Activities other than copying, distribution and modification are + not covered by this License; they are outside its scope. The act + of running the Program is not restricted, and the output from the + Program is covered only if its contents constitute a work based on + the Program (independent of having been made by running the + Program). Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the + notices that refer to this License and to the absence of any + warranty; and give any other recipients of the Program a copy of + this License along with the Program. + + You may charge a fee for the physical act of transferring a copy, + and you may at your option offer warranty protection in exchange + for a fee. + + 2. You may modify your copy or copies of the Program or any portion + of it, thus forming a work based on the Program, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a. You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b. You must cause any work that you distribute or publish, that + in whole or in part contains or is derived from the Program + or any part thereof, to be licensed as a whole at no charge + to all third parties under the terms of this License. + + c. If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display + an announcement including an appropriate copyright notice and + a notice that there is no warranty (or else, saying that you + provide a warranty) and that users may redistribute the + program under these conditions, and telling the user how to + view a copy of this License. (Exception: if the Program + itself is interactive but does not normally print such an + announcement, your work based on the Program is not required + to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the + Program, and can be reasonably considered independent and separate + works in themselves, then this License, and its terms, do not + apply to those sections when you distribute them as separate + works. But when you distribute the same sections as part of a + whole which is a work based on the Program, the distribution of + the whole must be on the terms of this License, whose permissions + for other licensees extend to the entire whole, and thus to each + and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or + contest your rights to work written entirely by you; rather, the + intent is to exercise the right to control the distribution of + derivative or collective works based on the Program. + + In addition, mere aggregation of another work not based on the + Program with the Program (or with a work based on the Program) on + a volume of a storage or distribution medium does not bring the + other work under the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms + of Sections 1 and 2 above provided that you also do one of the + following: + + a. Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of + Sections 1 and 2 above on a medium customarily used for + software interchange; or, + + b. Accompany it with a written offer, valid for at least three + years, to give any third-party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a + medium customarily used for software interchange; or, + + c. Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with + such an offer, in accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete + source code means all the source code for all modules it contains, + plus any associated interface definition files, plus the scripts + used to control compilation and installation of the executable. + However, as a special exception, the source code distributed need + not include anything that is normally distributed (in either + source or binary form) with the major components (compiler, + kernel, and so on) of the operating system on which the executable + runs, unless that component itself accompanies the executable. + + If distribution of executable or object code is made by offering + access to copy from a designated place, then offering equivalent + access to copy the source code from the same place counts as + distribution of the source code, even though third parties are not + compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense or distribute the Program is + void, and will automatically terminate your rights under this + License. However, parties who have received copies, or rights, + from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify + or distribute the Program or its derivative works. These actions + are prohibited by law if you do not accept this License. + Therefore, by modifying or distributing the Program (or any work + based on the Program), you indicate your acceptance of this + License to do so, and all its terms and conditions for copying, + distributing or modifying the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program + subject to these terms and conditions. You may not impose any + further restrictions on the recipients' exercise of the rights + granted herein. You are not responsible for enforcing compliance + by third parties to this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent + issues), conditions are imposed on you (whether by court order, + agreement or otherwise) that contradict the conditions of this + License, they do not excuse you from the conditions of this + License. If you cannot distribute so as to satisfy simultaneously + your obligations under this License and any other pertinent + obligations, then as a consequence you may not distribute the + Program at all. For example, if a patent license would not permit + royalty-free redistribution of the Program by all those who + receive copies directly or indirectly through you, then the only + way you could satisfy both it and this License would be to refrain + entirely from distribution of the Program. + + If any portion of this section is held invalid or unenforceable + under any particular circumstance, the balance of the section is + intended to apply and the section as a whole is intended to apply + in other circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of + any such claims; this section has the sole purpose of protecting + the integrity of the free software distribution system, which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is + willing to distribute software through any other system and a + licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed + to be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, + the original copyright holder who places the Program under this + License may add an explicit geographical distribution limitation + excluding those countries, so that distribution is permitted only + in or among countries not thus excluded. In such case, this + License incorporates the limitation as if written in the body of + this License. + + 9. The Free Software Foundation may publish revised and/or new + versions of the General Public License from time to time. Such + new versions will be similar in spirit to the present version, but + may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the + Program specifies a version number of this License which applies + to it and "any later version", you have the option of following + the terms and conditions either of that version or of any later + version published by the Free Software Foundation. If the Program + does not specify a version number of this License, you may choose + any version ever published by the Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the + author to ask for permission. For software which is copyrighted + by the Free Software Foundation, write to the Free Software + Foundation; we sometimes make exceptions for this. Our decision + will be guided by the two goals of preserving the free status of + all derivatives of our free software and of promoting the sharing + and reuse of software generally. + + NO WARRANTY + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO + WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE + LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT + WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT + NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE + QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY + SERVICING, REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY + MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE + LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, + INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR + INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU + OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY + OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS +How to Apply These Terms to Your New Programs +============================================= + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively convey +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. + Copyright (C) YYYY NAME OF AUTHOR + + 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; either version 2 of the License, or + (at your option) any later version. + + 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. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w' and `show +c'; they could even be mouse-clicks or menu items--whatever suits your +program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + SIGNATURE OF TY COON, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, +you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Library General Public License instead of this License. + diff --git a/Docs/Flags/argentina.eps b/Docs/Flags/argentina.eps deleted file mode 100644 index c0a9dae067e..00000000000 --- a/Docs/Flags/argentina.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: argentina.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000001818181818181818181818181818181818181818181818 -181818181818180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b50000efefefefefefefefefefefefefefefefefefef -efefefefefefefefefefef00001818181818181818181818181818181818 -181818181818181818181818180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000efefefefefefefefefefefefef -efefefefefefefefefefefefefefefefef00001818181818181818181818 -181818181818181818181818181818181818180000b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000efefefefefefef -efefefefefefefefefefefefefefefefefefefefefefef00001818181818 -181818181818181818181818181818181818181818181818180000b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000ef -efefefefefefefefefefefefefefefefefefefefefefefefefefefefef00 -001818181818181818181818181818181818181818181818181818181818 -180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b50000efefefefefefefefefefefefefefefefefefefefefefefefef -efefefefef00001818181818181818181818181818181818181818181818 -181818181818180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b50000efefefefefefefefefefefefefefefefefefef -efefefefefefefefefefef00006161616161616161616161616161616161 -616161616161616161616161610000cacacacacacacacacacacacacacaca -cacacacacacacacacacacacacacaca0000f2f2f2f2f2f2f2f2f2f2f2f2f2 -f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f20000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f9f9f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f6f3f3f6f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7eccbccecf7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7fafdfdfaf7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f6f0f2f2f0f6f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7ec9b45459becf7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f9fdf2eefdf9f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f3f2ede9f2f3f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7cb45000045cbf7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f9fdebeafdf9f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f3f2e7e7f2f3f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7cb45000045cbf7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7fafdfdfa -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f6f1f2 -f2f1f6f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7ec -9b45459becf7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f9f9f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f6f3f3f6f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7eccbcbecf7f7f7f7f7f7f7f7f7f7f7f7f700006363636363 -636363636363636363636363636363636363636363636363630000cbcbcb -cbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcb0000f2 -f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f200 -001818181818181818181818181818181818181818181818181818181818 -180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b50000efefefefefefefefefefefefefefefefefefefefefefefefef -efefefefef00001818181818181818181818181818181818181818181818 -181818181818180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b50000efefefefefefefefefefefefefefefefefefef -efefefefefefefefefefef00001818181818181818181818181818181818 -181818181818181818181818180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000efefefefefefefefefefefefef -efefefefefefefefefefefefefefefefef00001818181818181818181818 -181818181818181818181818181818181818180000b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000efefefefefefef -efefefefefefefefefefefefefefefefefefefefefefef00001818181818 -181818181818181818181818181818181818181818181818180000b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000ef -efefefefefefefefefefefefefefefefefefefefefefefefefefefefef00 -001818181818181818181818181818181818181818181818181818181818 -180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b50000efefefefefefefefefefefefefefefefefefefefefefefefef -efefefefef00000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/argentina.gif b/Docs/Flags/argentina.gif deleted file mode 100644 index b1bba9778cc6ec887e90391b7deb4978d3ea713c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmV;s07U;sNk%v~VITk&0OJ4v0001E%kus5Mfvm0`tY0T=Kx{K@)))6^6dck_U!uc zoB8w0?&$#c_xJ1P0001rEC2ui03ZMs000DV5XecZz4hqLyZ@R5j^rkmsCTC9v9{<7 zlagWIc&_iZ)cn98FtHdUgvg&S8B7oa0>Y6ATv8hg0fHe|T$O+?R^TXf#a3!U0aZ+| pY4u|9h64ilynfH`<7G1-fPpFige8NACWeZFjE#jDl9Ln>06RKcSb_im diff --git a/Docs/Flags/argentina.pdf b/Docs/Flags/argentina.pdf deleted file mode 100644 index 4ccb26eec76c4650f7ba81476e2311a106d72865..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 923 zcmY!laB*o9z4dcmMgfy`S~#pZf31 z)mQti_3QBN>+k=4{vfj}c~hg~k<|aC$&Z&k6aQ-d=1^n7(?slR~(HIK$+Jm5Ql(DbO$kvOwVu3T+T= zY-qv-6*56YNl0Zus(wIXdaAx}YD#9JQ+|a)v;k1s)Y4SJ!o(<+OFt;T1QMBCIk(s0TVUr8F6s>NMQ_LKWOI@{3D~lZ!G7N)*iWObs=GmO!0XQIwj- zWuRcrWdH{XW~QdbrV42aFflU&3k9&OLLNfQ6d2qffFx#WVu>MUVu-2Nzz`TnXnKt; zk@S`nC1&QN76EgTf_`vjRjPuy0x)*+fuREmEMUOrrR6Jtd(rS@1D9Wv89uzl;(OSZNqdIwi7dsq{@b$e3NoSFCd z*|$py?V2(5E;sYGjO6p?`Uf`m?>TSpyr^btO8mLDrW*nr+tn5J@~~{Q?s+1$4$H}&kH125*yzOSLU&))LL@+A+i1q4(@Z~gxL z`__qj%L7(_{`~E{z0=f*cZ9fhBu1aT=I>t}vz3o+`^gipROR;0ns)cHlM@5O69xu0 zuwR)N7$RWk1_J{S0mWIs=nDe_1Sv2u01-qGND448FfuT>!?XiUU}a$V&%j{Fz@W^) zP|U!P%E0iJf#E7x0h~x?U^oZnyaRfXfkBgjVGr0GpvE5z4Al$_a~K%<82nD?fE0n^ zf`R={14C1DOKV$ut1zd#RIk03aj%rSj_{=EGbS~euyG0YP3RTmVl$c9t2VPqP1~r; zz2DfKQ`ks*bRnJ??ThH~P^>X)~bGI&B z^?q>s@;3Jd#+}>&TYel&0DvBmGa79QdlU<7%5iPu-bU%Oc0YJC z#bNI9A}^_ghb{~YYz<$&2ux5rUp&K!gR#h&!GXst$l<7o(n-cCo_0@ebcrmzu<4n= L%GhiT0S0RTr-9@V diff --git a/Docs/Flags/australia.pdf b/Docs/Flags/australia.pdf deleted file mode 100644 index f7a1d0fd53d8500c741aac7376411fcc66c9f754..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1382 zcmZWp3rtg27%r6#bJz?s3aCs^l)4#_`{+|;RB0)6fRZE>RQIw4>(QHOIbXxN;OxiadQROMlJZta|N=O*`@eCPlE|2u!q zcZ6D%dI6D60%6y{+aCi7#35b24rF9t`INJgT??fM(P3(xyyfS98V`uEc&9e*#S0y4N!#3(#gmMNuWZIT!>54#ZV-dh|z?CvNQlw z>LI4f$pTmr6p;YSg(UiCX_Zh8Ff~^eU@9#{s56dBnr6@v zAYmF6bniA>8VO_U<-bBbwyUqrZMKXI2WF|nil29dUp=$HZyPz!WT`G(*fBKwo^Mygd0UzDAJUGkCEkq4n4l+4HvBUj5;fw|*+FJCXOa=-DITr;4Vt z=e7t|Z@hasDKWl95DPo*g~Q=szpvGx2=;Xau5@&qI@R3~JEV9#*^%4%1ut2-Wb({c z+zWV{eS0#OrWvpOs(kO;busC@FFm`eXH1aS9c98NTdeK_mq&DbVcpCv;%)wye+wGy z^`3sdF?HYGT+2ky?CLk|XRoYG%^^u+dBs?qD>iLsC|Ga!aU$y;FK*APTTP|DA=Xw$?1zBk0~*Yxnf>C(K#n;~gpp7|M>`x!SK7YW7?G zW5Pu-{_?oc@%UTbC2uUsx-}L1910|mxNu6h$Y;W<6j!g>FU@&{R7ACnXMrLmq~h#(~l)%ed>0eBopf z$ptw->o_PXfy;8=-!P&9Mnt$EmS?rNU@71v>OdJp8LCiG;vp($?)%gzQ)yyNcDnMP z6!!)GTZ;31G+xWlmMSxPKc2~1wi4#7rCqGc%vjg6P?|0w=Aj}{d2WWP063HZ{K0@y zi9{rU6)=hsxD>UP8_@XxBM2n?5e&y=k7Br7_CGF;6R1i5<>GS5LtK_IS?v^q-b9G$ qtuIhehTbZgM&03>g&OaypdokKNTXe>iD4t>APA`x2!+|p)!=U-hWi)* diff --git a/Docs/Flags/australia.txt b/Docs/Flags/australia.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/austria.eps b/Docs/Flags/austria.eps deleted file mode 100644 index c6c35dc81e2..00000000000 --- a/Docs/Flags/austria.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: austria.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6 -d6d6d6d6d6d6d6d6d6d6d6d6d60000505050505050505050505050505050 -505050505050505050505050505050000050505050505050505050505050 -50505050505050505050505050505050500000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000d7d7d7d7d7 -d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d70000535353 -535353535353535353535353535353535353535353535353535353000054 -545454545454545454545454545454545454545454545454545454545400 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/austria.gif b/Docs/Flags/austria.gif deleted file mode 100644 index 26a9785662744c886e3ac56c8f31fa6e2d197514..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmZ?wbh9u|RA3NeIK%(~*MmcjF)&;U2>AZ}I|BnV1H%Odh7CF(8IT$V=0J{JcmDaF z@Lat&=;7Jr?-qP*U1BipL1)pa2m1U7VsypZhnu2WR=8z{%Ydg=V&$@U2e*I6D$@A~;bjaJzckT7rbCR09=ksRDg@wKE zH~OJa=GfAxXdC7_=k(QJ#R=LIxEX}J?1NJCQlK6KvOs|W3IY&qWMIw(6*57DQ%Ge& zs(wIXdaAx}YD#9JQ+|a)v;k1s)Y4SJ!o(<+OFt;T1Q==x20&Fssd*&|#-Jbt3a1w5 zmlh?b76Su2peR2%IJG2N9~d19`kuK!bvuF(*GAW(3562&;?` z>VXbTDNP0@1r2wtCR++#d+e_l4iQy;4~-YNffwkG++-)l%J3 zS$kHpEK-!aU;DaOi0&2|-}VY;!nOM69^2jEW`Nto5#D)fy0K&5-oASJ_lcFiFXjWB z*UN=2E<7LDw4XiK`|9WW8^(`y6P1F)435FX(DJ%M3>Ilv*OVxsam+#od}oG@^Cb`q68kijGLivi z0TB~wNie7E7XsMS08J4F;Cq>*0dZtXjGzRt33;|uI7AiN)E3hxQ#q@p4@T?@?5q+y z_nFXSUSWmX#>QhXHl-QVQ1ncWf{T*`J6qC{SJX)g@!&>$`+!T591^790CT#TDf58Z z#w3w#KY}?0R>2WW^c?5%!f{M=9pX}5&SZ(seqzAU%o74`VC`ru9WyKzyqeO$blVKt Spt4SzJ|wqED0G@RREd_FmW6_2J69lXk}$WVgTH{)%D3&Ch20 zKJ0t;RdyeP@NR}*f7z6Fd|37<#_!mUo1ZPZu7Cdfk165IQt54PQZ6xk{LQfAHN*2C z3;|~tmON!x@iE5Sh@*v0WTleUT?Qx(j zU*b=FQr_{Ndk2H$*7uBC8Pd*v(%$_+amR}G*y(}+Kyv}==8}!mR7E=Hf%E%^v_x65a#a==IeE%$!`!~jTbY*{ow_Q*v()B5@2Vq9m#RDK zifJo_oD{n6YNy|`VB0GLmQX`hKU42uP1RS+R!n3N`}$yE9|s?+NCU&d1B*JFS^wG? zY!oTD$j$p|N`c2TmB=Z|9{VB%jSj}Tx-omZF8I*G#KNU!m$D$x>(S=PJ$loaCgv>U zn;0fn{gm(hgsbLq$m;<{@H!9-4C(d6bG?I?5MdYAJW9hX+= Jif}Mk0{~9-1)=}| diff --git a/Docs/Flags/brazil.txt b/Docs/Flags/brazil.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/bulgaria.eps b/Docs/Flags/bulgaria.eps deleted file mode 100644 index 2eb04535d36..00000000000 --- a/Docs/Flags/bulgaria.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: bulgaria.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7 -a7a7a7a7a7a7a7a7a7a7a7a7a70000e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2 -e2e2e2e2e2e2e2e2e2e2e2e2e2e2e20000a7a7a7a7a7a7a7a7a7a7a7a7a7 -a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a700000000000000000000000000 -000000000000000000000000000000000000000000b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5000000000000000000 -000000000000000000000000000000000000000000000000008383838383 -8383838383838383838383838383838383838383838383838300003d3d3d -3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/bulgaria.gif b/Docs/Flags/bulgaria.gif deleted file mode 100644 index 4c7377e907cb98fcfeba37f533447d5eb50284ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmZ?wbh9u|RA3NeIK%)3TN#!=THb8SaEyWB`}gk*3>O#}Ht2w4Kx!D6qd0cm`M36j z=jy#d56>=tx8Q4Qis7^eokd*__7&)yUng{@V%_^cx!(^g;8)Q3RCg?eVWp1IY{#Ps rUTdS)-&omn;BD3Z2L|QZdb5u=Y_{@=+s*lQyOo}~^ScUnCI)K&SO`5F diff --git a/Docs/Flags/bulgaria.pdf b/Docs/Flags/bulgaria.pdf deleted file mode 100644 index 24cb072598df6c3a204cfa11d076e05c318d5812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmY!laBr;>J69vTK$iy0#Pn2s-_(@MM5p`;g=hnyw5g@3f`y4uESG*zehDz>6byi>ic<4R6pTUP z3KUK)&Mz%WPAvw8ctBBpa&T%%v_3FS6!blFfyOzr&8{mYj-xw$XauKn`z)tdtc zk1;adtFC@`;^fN>8;&tBe0loxI19_SFJDe@aD2LR=jHnKr=_KzOr7@q`}cRJPQ6^W z?#ruJZw?;(aOu+R?Ci5jN;l);KR8Yl$aumgqH-1qL`Fqvsa(5q@akG&;~CNr4=*V zB;^#!1r+4A#m~x+RF>rs_YvpdRz8q+s4!68M?QG_Y=3q>QGR|=KH;Y8hl5yI%MR`c ml9qmP{#Bq1*Sq`+RmopkKKz*R^2VRP^AsgLCU^)iSOWm}!JLQy diff --git a/Docs/Flags/canada.pdf b/Docs/Flags/canada.pdf deleted file mode 100644 index 4ba0fd45ec681e7d1752cfbfef39ef65ecf60991..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1103 zcmY!laBZhmg_8HATbhSy6{rh!opI2{qgjes}+4Wc2ZF&B8wI3Gz|Mud-wepIx~u%doBC(ZH|d!U?QJf zTQqz4x^MT6N7dKAf9IP0Z;$=C{SD4De}Ad}{fl#wosrS@Q}^>9J(x42{==WQZ{OdH z`1eNh`F!0YVarziniBrYEn`KR`{)1ve?PzZ*Vo4S_3zi&J?%Tc?5I@X*9*v~QJ9b} zbLQEzWm{7w?ppQg*VDSSN7v0ZUmg}}+wt)< zm$}8~+ZG;kpKAT^;M4MQS+%+QwO&~-_gZr>BI{q#*R59eb^lH5V$M%X6Bie~dEjjD z*|`UgZut4zzECgRztv%#gC0Z6%QN3n^HQMk4rGDS3MhquXcJ2lE~tTIWdSURsm>2DbP|wB&~*Utx%oLi6x0S`ROntAPz)WWrR=< zbZAOxGBBrTxch}FxM$=SmlP)#WfqhunCY1sY62~RIu~%Auy28^qQI@=`ATr%*;tG0_J`N x{ou^1R0VSdVC>`rLkARCz<|$7%U1yT797yUC5c5PV1HOxSa7MTy863u0RSrRvOoX; diff --git a/Docs/Flags/canada.txt b/Docs/Flags/canada.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/chile.eps b/Docs/Flags/chile.eps deleted file mode 100644 index 121bf0a51b3..00000000000 --- a/Docs/Flags/chile.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: chile.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000008080808080808080808f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7000000000000000000000000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000b5b5b5b5b5b5b5b5b5b5f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7000008080808232408080808f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000000000001c1c00000000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5b5b5b5bcbdb5b5b5b5f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7000008080808727208080808f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000000000006d6d000000 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5b5b5b5d2d2b5 -b5b5b5f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7000008080808c2 -c208080808f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000000000 -00c0c000000000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5 -b5b5b5e8e8b5b5b5b5f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -000866dfe5f6f6e5e06708f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f700000062dee4f6f6e4de6200f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000b5cff0f2f7f7f2f0cfb5f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000080841def7f7de410808f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7000000003bddf7f7dd3b0000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000b5b5c5f0f7f7f0c5b5b5f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000080808bcf7f7bc080808f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000000000baf7f7ba000000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5b5b5e7f7f7e7b5b5b5f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7000008081beb6969eb1c0808f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000000014ea6565ea1400 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5b5baf4d0d0f4 -bab5b5f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7000008083b2f08 -082e3b0808f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000000034 -28000028340000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5 -b5c3c0b5b5c0c3b5b5f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -0008080808080808080808f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7000000000000000000000000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000b5b5b5b5b5b5b5b5b5b5f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000c4c4c4c4c4c4c4c4c4c4c7c7c7c7c7c7c7c7c7c7c7c7c7 -c7c7c7c7c7c7c70000000000000000000000000303030303030303030303 -030303030303030303000002020202020202020202030303030303030303 -03030303030303030303030000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/chile.gif b/Docs/Flags/chile.gif deleted file mode 100644 index dcd21381a0ac0b7e59502afc8519f653eff3e382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmV+b0ssC-Nk%v~VITk&0E7Sl0001IV$U2Dx@l$5-revd9KGM(@H;faBOJVDV$TQw zwLv?@8x*>{y65Za^e-sD#sC2J_V;pa(!#*##{&cR_xCO+z~$uf!~g=|-tYhb3IG6z z00093000001pokuEC2ui03ZMs000GrARvxpX`ZE`u59JLa2$&)QnYd|)2k%mx?qK; znoNMg94%qEL?V|=K#>gc76cbzp{nYL4Oe63RRUBD$6(+Pbj!1|;_y&e4sZC2$Rg|a z02qRUgcOE{h>3|J5RHzHkdcy&jFXm^lmM8Ul9imF5T2l$qNA6krjw|tk*lnaD6z68 GApkpUb8j*L diff --git a/Docs/Flags/chile.pdf b/Docs/Flags/chile.pdf deleted file mode 100644 index 6a1bfb10c0ae83e11c1fe2139ef7716b9c309360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 978 zcmY!laBOYAu}D?Jr}!Y*As$=@+N(e*gac|Lt9W{q`KKKDpYIbLK9#r^4HH1vk$7@csPR z&;Dg=?C!;HPY~OGNdE3!+w7u9=_;}9xBuTT+&)wJg--CI2d3{{XUDCrI$vE=zdmm)XwA6)?B?a$_4{VNtWV``{?VisR^BNoZ!+o9rI0-1 zx%cAVTdb~6(rZp)TAj9i_PQh2TC{zF&hR`s!}%y?-8`k_#$if{4kG%7Rq=fW-7vec#lS%tWXB3WaC`ptPx_se*-xQ7o5!P<{z8 zUKI?0s)|zcN)(Jikq#72EzU13N=_{XCWnBc{N&)&l4yNkf>F@-%mo_f9Lohv1p3bT zc_lzi#R{Or69f{1Iss$~Brz%IgWRA1c0{p)zISFyu|hN#$caH*u?j#FN`aOdB55^* zYlZ4`PAo~x$xnwF0dXM0DkFq?phHtilYxmV~h-+PcobmVEBH6;i56azuyecdKiu~F`QFoxa!1kCz0W1 zFvGho4A;FFjxjKNKEd#)hT#-H!*N!I7#Ntr z2D1X$Iv^IvE(X>N1%i)iVjVV*r6d9}m`0`k< diff --git a/Docs/Flags/china.pdf b/Docs/Flags/china.pdf deleted file mode 100644 index 9706ee48a28a469e5763f04f3c67eed64694774c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmY!laB)fr!hlQ7%D&FVy=>Gqst0PjkRJ^%wdFM*vqm|paJvItGHoKWtuzYjjwCyYQ zH}xHuzJybIviyvte^<=;_hC)=>|Ofj|NnQBwv+h(^JSuT{iCjfoW_r(PA_IPpDiVS zYkoq1=Hs39dOuWlA8z7qx4+_Po^Bxf@Ac(v_V)r`UT~cE=e6VWo7LAo{8?W#=etKS>*jGa z#x%w-Wbv1TrskzULl(#a#Re!2K(w*385dN@1QAgol?AE#0g36U`o5_tnTbyM6$;S? zKxtD;Qw0kXqgXEep!^bGv?&+>RTZV?l_(g4;uI*HTAW{6l$=@&jO~D;{N&)&l4yNk zdQi~!%mo_f9LoiaV}0lRyb_?MVg*pz2m%Q~od7Zgl2#P-L2gh0JEB-Y-#asb#1g)HE&w1#>O~I8ZP%H8nO>NK=4`nHd8E3Ir7L5Mt&Q z7-FX8Ko_H_Gcm!`YhVZrBy@E~NP0_(5;JpBi-7q{K|eUNDpkQ;0T?^^z|a8&7BJxR d(()BRz6A$#aYTSTma!fNPYkS diff --git a/Docs/Flags/china.txt b/Docs/Flags/china.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/costa-rica.eps b/Docs/Flags/costa-rica.eps deleted file mode 100644 index b225246c0c7..00000000000 --- a/Docs/Flags/costa-rica.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: costa-rica.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000808080808080808080808080808080808080808080808 -080808080808080000000000000000000000000000000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500000808080808080808080808080808080808 -080808080808080808080808080000000000000000000000000000000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808080808080808 -080808080808080808080808080808080808080000000000000000000000 -0000000000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000a6a6a6a6a6 -a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a60000a3a3a3 -a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a30000e1 -e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e100 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7 -e7e7e7e7e7e7e7e7e7e7e7e7e70000a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7 -a7a7a7a7a7a7a7a7a7a7a7a7a7a7a70000a7a7a7a7a7a7a7a7a7a7a7a7a7 -a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a70000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000e7e7e7e7e7 -e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e70000a7a7a7 -a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a70000a7 -a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 -a9a9a9a9a9a9a9a9a9a9a9a9a90000a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7 -a7a7a7a7a7a7a7a7a7a7a7a7a7a7a70000e2e2e2e2e2e2e2e2e2e2e2e2e2 -e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e200000808080808080808080808 -080808080808080808080808080808080808080000000000000000000000 -0000000000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808 -080808080808080808080808080808080808080808080808080000000000 -0000000000000000000000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -000808080808080808080808080808080808080808080808080808080808 -080000000000000000000000000000000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/costa-rica.gif b/Docs/Flags/costa-rica.gif deleted file mode 100644 index becc817fdcc21ba7f221d02f8c7901ace2c84b1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmZ?wbh9u|RA3NeIK%(~91L5JF)%z|zI@r@hu^<{U%C7d1H%R#kPJu-19Jk$t~>v9 zPk6508}#t(@^=fC3Z!Jt%ka{2eZ8+hXZxF+`z8i&YTo}pFxSaJN2>pXO5utetLY8P zO-{~? zV{C$b^ZC{#gxVc2@&5bi(9g+-zrKo{vXfuaKDT&%sm8N&50W;_U8#ER>8q6jCqz%M zGMqT=c{DXI1?p=c3lvhI@Bz_A#%5elArnL(hEx`$>IWpIr|SErrer2MzCfI+HY08~|!npdJ=3<__caB6XWX;E@&F)$_qit>|#Q%j=tfpMjv z@0klU&N-F~82NPL~1`@hDBP6{gMTwa?sYSrFub>~CS(U0_t^kakd|>E+0t*=Md1?6y aAm4%my0|2@vy&*66VO#sbgv3L_!ai;%4)6~*^j!qpU$3rCogZCxZKCh0Cuw)Dl?wLWXQPH=IZn!EjBOY8OUa1Ms8J4B@~SzE_wO^=R=O4STM z#>l8?)1$g>=@A~D4_B{7m?mbKOxHQO=VoHkc@vWo)9AMc4_>medb9t)=Z6npZP{`o zDhlZMsZSAdgUEMvsef?cc6DCjTo-|d^+rgJhW2)Ws3HFZWOzuj-dNHh1 z7WQ$Ncp2#^=x1p2x*1Gf*B34t5)c-V5|tjgmO<_GnX@udX10=Pw$VZCXK$)Ch2Fh) zU*3){G|n(D!I?)iA|$j181vUy0nzxVF9g|vv9M}TqCSvG^;yS`SNFFYzx zq}YXBD~4%h$y diff --git a/Docs/Flags/croatia.txt b/Docs/Flags/croatia.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/czech-republic.eps b/Docs/Flags/czech-republic.eps deleted file mode 100644 index c179b95db17..00000000000 --- a/Docs/Flags/czech-republic.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: czech-republic.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000056e2f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7000050e1f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000caf1f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000081ba5f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f700000013a2f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5bae0f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7000008080856e2f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7000000000050e1f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5b5b5caf1f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000080808081b -a5f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000000000 -0013a2f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5 -b5b5b5bae0f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -0008080808080856e2f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7000000000000000050e1f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000b5b5b5b5b5b5caf1f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000080808080808081ba5f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f700000000000000000013a2f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000b5b5b5b5b5b5b5bae0f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7000008080808080808080856e2f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7000000000000000000000050e1f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5b5b5b5b5b5b5b5b5caf1f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000080808080808080808081b -a5f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000000000000000000000 -0013a2f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5b5b5b5b5b5b5 -b5b5b5bae0f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700000808080808 -0808080808080856e2f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000000000 -00000000000000000050e1f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5 -b5b5b5b5b5b5b5b5b5b5b5caf1f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00080808080808080808080808081ba5f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f700000000000000000000000000000013a2f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000b5b5b5b5b5b5b5b5b5b5b5b5b5bae0f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000080808080808080808080808081784c7c7c7c7c7c7c7c7 -c7c7c7c7c7c7c70000000000000000000000000000000000030303030303 -0303030303030303030000b5b5b5b5b5b5b5b5b5b5b5b5b5a73f03030303 -0303030303030303030303000008080808080808080808080845b5c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b57b -100000000000000000000000000000000000000808080808080808080817 -84c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -0000000000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b5b5b5a73f00000000000000000000000000000000000000000808080808 -0808080845b5c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -0000000000000000000000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b5b57b100000000000000000000000000000000000000000 -00080808080808081784c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5a73f00000000000000000000000000000000 -0000000000000008080808080845b5c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -0000000000000000000000b5b5b5b5b5b57b100000000000000000000000 -00000000000000000000000000080808081784c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -0000000000000000000000000000000000b5b5b5b5a73f00000000000000 -0000000000000000000000000000000000000008080845b5c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -0000000000000000000000000000000000000000000000b5b5b57b100000 -00000000000000000000000000000000000000000000000000081784c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -0000000000000000000000000000000000000000000000000000000000b5 -a73f00000000000000000000000000000000000000000000000000000000 -0045b5c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -00000000007b100000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/czech-republic.gif b/Docs/Flags/czech-republic.gif deleted file mode 100644 index eeaeb4b791b75578628f1959538fbdd6efe8e306..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmZ?wbh9u|RA3Nec+3C-j~;&9${?_G(F1XYwziueHU`V~ fbKfuhE$Dv!^}(dNQsvsFs*1K|iS8azK?Z98uPQ~= diff --git a/Docs/Flags/czech-republic.pdf b/Docs/Flags/czech-republic.pdf deleted file mode 100644 index 7fb2680269f9b2c9257e2980aa2914897b522624..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 936 zcmY!laB3 zIJSxIdsX%2SeK1CNEx}j&Tr6Uj-k&Bt=F6+KuH}U> zvfus6zsZq(wdJ1QSVwJ}kg$FZVD9vSS^RJ#WE21(;E82HQy~izEQ>)+!Y0tN` zmqz`qU--uD?qTVfx5CUmo+zJjx@b+Hhv=HeVGp$ZH+`5<^3h|;;XQ}v&X#Jq)wdNB{*rh&DDd=Yk5EAmS&avLIDIATd2v-#0ZSGtnu(LLu4!C~azKs$gMa6w9R_ zlwSgjEd>Lhs-o1q5(Q(RY!Fa5wK%`DC^@wl7|8)e`N_elCDHo8WT2q$nF}<|IhG3; zwffHac_lzi#R{M#5d;!~Iss$~B#9{KgWRA1c0{p)zISFyu|hN#$caH*u?j#FN`aOd zB55^*YlZ4`PAo~x$xnwF0dXM0DkFq?phHtilYvQ4!`&}b!963txTH9_D6^nM!A#H8 zP!nhg)Oi&}scBpW3g%n}aG+pjYHDn%kfs0=Gcy9Z1OycF5MpMQ7-FVoKo_8?Gcm^0 zYhVZrBy@F#NP0_(5;JpBi-6fmK|eUNDpkQ;0T?^^z|a8&7BJxR(()BRz6A$#aYTSTmX}mH+TR5 diff --git a/Docs/Flags/czech-republic.txt b/Docs/Flags/czech-republic.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/denmark.eps b/Docs/Flags/denmark.eps deleted file mode 100644 index c3ddf74f725..00000000000 --- a/Docs/Flags/denmark.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: denmark.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c7c7c7c7c7c7c7c7fffffffcc7c7c7c7c7c6c7c7c7c7c7 -c6c7c7c7c7c7c700000000000000000000fffffffc000000000000000000 -00000000000000000000000000000000000000fffffff500000000000000 -00000000000000000000000000c7c7c7c7c7c7c7c7fffffffcc7c7c7c7c7 -c7c7c7c7c7c7c7c7c7c7c7c7c700000000000000000000fffffffc000000 -00000000000000000000000000000000000000000000000000fffffff500 -00000000000000000000000000000000000000c7c6c7c6c6c6c7c7ffffff -fcc7c6c6c6c6c6c6c6c6c6c6c6c6c6c7c7c7c700000000000000000000ff -fffffc000000000000000000000000000000000000000000000000000000 -00fffffff50000000000000000000000000000000000000000c7c7c7c6c7 -c7c7c7fffffffcc6c7c7c6c6c6c6c6c6c6c6c6c6c7c6c7c7c70000000000 -0000000000fffffffc000000000000000000000000000000000000000000 -00000000000000fffffff500000000000000000000000000000000000000 -00c7c6c7c7c7c6c7c7fffffffcc6c7c7c7c7c7c7c7c7c7c7c7c7c7c6c7c7 -c700000000000000000000fffffffc000000000000000000000000000000 -00000000000000000000000000fffffff500000000000000000000000000 -00000000000000c7c7c6c7c7c7c7c7fffffffcc7c7c6c7c6c6c6c6c6c6c6 -c7c6c7c7c7c6c700000000000000000000fffffffc000000000000000000 -00000000000000000000000000000000000000fffffff500000000000000 -00000000000000000000000000c7c7c7c6c7c6c7c7fffffffcc6c7c7c7c6 -c6c6c6c6c7c7c6c7c7c6c7c6c700000000000000000000fffffffc000000 -00000000000000000000000000000000000000000000000000fffffff500 -00000000000000000000000000000000000000c7c7c7c7c7c7c6c7ffffff -fcc7c6c7c6c6c7c7c6c7c7c7c7c7c7c7c6c7c700000000000000000000ff -fffffc000000000000000000000000000000000000000000000000000000 -00fffffff50000000000000000000000000000000000000000fcfcfcfcfc -fcfcfcfffffffffcfcfcfcfcfcfbfcfcfcfcfbfcfcfcfcfcfc0000fcfcfc -fcfcfcfcfcfffffffffcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc0000f5 -f5f5f5f5f5f5f5fffffffff5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f500 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff0000c7c7c7c6c7c7c6c6ffffff -fcc6c6c6c7c7c6c6c7c7c7c7c6c6c6c7c7c7c700000000000000000000ff -fffffc000000000000000000000000000000000000000000000000000000 -00fffffff50000000000000000000000000000000000000000c7c7c6c6c7 -c6c7c7fffffffcc6c7c7c7c7c7c7c6c7c6c6c7c7c7c7c6c7c70000000000 -0000000000fffffffc000000000000000000000000000000000000000000 -00000000000000fffffff500000000000000000000000000000000000000 -00c7c6c6c7c7c6c7c7fffffffcc7c7c7c7c7c6c7c6c7c6c7c7c7c6c7c7c7 -c700000000000000000000fffffffc000000000000000000000000000000 -00000000000000000000000000fffffff500000000000000000000000000 -00000000000000c7c6c7c7c7c7c6c7fffffffcc7c6c6c6c7c7c7c7c7c7c7 -c7c7c6c7c7c7c700000000000000000000fffffffc000000000000000000 -00000000000000000000000000000000000000fffffff500000000000000 -00000000000000000000000000c7c7c7c6c7c7c7c7fffffffcc6c6c6c7c6 -c7c6c7c6c7c7c6c7c7c7c6c7c700000000000000000000fffffffc000000 -00000000000000000000000000000000000000000000000000fffffff500 -00000000000000000000000000000000000000c7c7c7c7c7c6c7c7ffffff -fcc7c7c7c6c7c7c7c7c6c7c6c6c7c6c7c7c6c700000000000000000000ff -fffffc000000000000000000000000000000000000000000000000000000 -00fffffff50000000000000000000000000000000000000000c7c7c7c7c6 -c6c6c6fffffffcc6c6c7c7c6c7c7c6c7c6c7c7c7c7c7c6c6c70000000000 -0000000000fffffffc000000000000000000000000000000000000000000 -00000000000000fffffff500000000000000000000000000000000000000 -00c7c7c6c7c7c7c7c7fffffffcc6c7c6c6c7c7c7c7c7c7c6c7c6c6c7c7c7 -c700000000000000000000fffffffc000000000000000000000000000000 -00000000000000000000000000fffffff500000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/denmark.gif b/Docs/Flags/denmark.gif deleted file mode 100644 index b2cda874fce0255d8c487bed5fe2ae3a5ba83640..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmZ?wbh9u|RA3NeIK%(~zyEwa&cJYtf#LuE|9}2`Wnj3#z_39FBm+{zz&w*<*PVa9 zCp0^CLwfdXJ~i1jA;Giu_JXkK%l3V!W(q#u7b}x39Ce>{wrA4s4;o5AUgb|DE9WlB zE%)J^w_n91{FMgR1A_6SyYCm6)%a~c@%qO%WAh2?VnmE=O&S8lom?91 z!%gbjlw|_Ch3q1An_`V8Gu4HK`Np+$M|Ik3$3z&^EuC*F?bZ?0)wsDwVEYapP6lfL D9lB5X diff --git a/Docs/Flags/denmark.pdf b/Docs/Flags/denmark.pdf deleted file mode 100644 index c405a7b0f11961a73546892c0e30d168852c73d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmY!laBHlB)Uw$6->dTSLUcYa*o4!fc{isU2-1GeS^?i3Q z{WZxAFL=k_$?jbwIqO`xepo_5@SVw;=4%TddL1j>`S5a&ws%Uugro$A&5nc%5A5w5 zzV~dub?$P|H*wLKGnv;N;ac6|b0^UH<1g|14P84Ed1vkxQ;#>C87Gy!!{f2@52=gQ z=~rCqb7s#9J^#bu*7Sw7`Qb4?MUN#sTXggGkN7hmHTNo9`CxXWaTpa6D6v4XyLW=gR_G#AK;L0qv4Kod%VmKq{yHH2%0>U2&lNzBPlhZzBJAi^pm zgnFPuQ%aM8saeC_FI2%jBfq$$IJqdZphUq;&(u&8XbIGL6-B9OTm}l}Tn2EUU}kD+ zY^so^024E_1O_b#DCEJ#%uRp}M-wwMHpdV%HNezsUTSTmTJNacuwq diff --git a/Docs/Flags/denmark.txt b/Docs/Flags/denmark.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/estonia.eps b/Docs/Flags/estonia.eps deleted file mode 100644 index a73cd8eecce..00000000000 --- a/Docs/Flags/estonia.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: estonia.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000808080808080808080808080808080808080808080808 -080808080808080000000000000000000000000000000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500000808080808080808080808080808080808 -080808080808080808080808080000000000000000000000000000000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808080808080808 -080808080808080808080808080808080808080000000000000000000000 -0000000000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808 -080808080808080808080808080808080808080808080808080000000000 -0000000000000000000000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -000808080808080808080808080808080808080808080808080808080808 -080000000000000000000000000000000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000808080808080808080808080808080808080808080808 -080808080808080000000000000000000000000000000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500000505050505050505050505050505050505 -050505050505050505050505050000000000000000000000000000000000 -00000000000000000000000000000000007a7a7a7a7a7a7a7a7a7a7a7a7a -7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a00000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000a4a4a4a4a4 -a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a40000a4a4a4 -a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a40000a4 -a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a400 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f700000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/estonia.gif b/Docs/Flags/estonia.gif deleted file mode 100644 index ac2c62b78e950fb713433c2943876de63ec8652b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmZ?wbh9u|RA3NeIK%(~91L5RELrmX`*&7`Dh38-28Ig^3>$PnG9Wb!%-$Tk?)=j| z;kkNm(8IIK-!1ssnqn~RL1z)y!+ixh=k-$VSFC$q^Zx&V1V0BIss0lxfrc4Y^DnH} ca&k`8`VfXP?X^Ywne{8Q<>Fg+vM^W!0Qa0RM*si- diff --git a/Docs/Flags/estonia.pdf b/Docs/Flags/estonia.pdf deleted file mode 100644 index 12056acb79dc894ec7f8edd9ce1cbfe7f541789c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 820 zcmY!laB;B47kX~RIFg!;I9t6sYHbEKq=ef&oMu85(jyg-j4( z6;fG{svnS;o~rMgnv$95lwY9`Z2*)uwKP?*Ffoed(htfn0fwA{0Z>&@YF>$gF(_Dp z!l}jirA5i9#lQd$D9TR`PA!Sn2S$m4zGp7bIOkX{U@+@D=jW9GH5Ds>q9+I>1a$() z6i9R_=!4v#0Cq&Ng1&cVO0hyT7s!c0T(Js36H0-W8X{>mglmQBbWSWu%*juO83A!1 z!YU(#dZ0s7N|S-fLBriIRKYzXzqq70xhS)sM8QnY)KC*>3DkKNMX70A1`6g}25_KY zW@>6|s*t7t6EigcdI|&-@(^OCK-ah^f~Aiwmd0LD%}FmynH1q}GSw0s4SZ@~dwT#{H+0``ZQfhm`&s;j>n7Xa!9{(Arb diff --git a/Docs/Flags/estonia.txt b/Docs/Flags/estonia.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/finland.eps b/Docs/Flags/finland.eps deleted file mode 100644 index 847a0fdd30d..00000000000 --- a/Docs/Flags/finland.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: finland.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000f7f7f7f7f7f7f7f71818181bf7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7b5b5b5b6f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7efefefeff7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f71818181bf7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7b5b5b5b6f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7efefefeff7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7181818 -1bf7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7b5 -b5b5b6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7efefefeff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f71818181bf7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7b5b5b5b6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7efefefeff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f71818181bf7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7b5b5b5b6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7efefefeff7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f71818181bf7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7b5b5b5b6f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7efefefeff7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f71818181bf7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7b5b5b5b6f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7efefefeff7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7181818 -1bf7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7b5 -b5b5b6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7efefefeff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700001b1b1b1b1b -1b1b1b181818181b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b0000b6b6b6 -b6b6b6b6b6b5b5b5b5b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b60000ef -efefefefefefefefefefefefefefefefefefefefefefefefefefefefef00 -001818181818181818181818181818181818181818181818181818181818 -180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b50000efefefefefefefefefefefefefefefefefefefefefefefefef -efefefefef00001818181818181818181818181818181818181818181818 -181818181818180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b50000efefefefefefefefefefefefefefefefefefef -efefefefefefefefefefef00001818181818181818181818181818181818 -181818181818181818181818180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000efefefefefefefefefefefefef -efefefefefefefefefefefefefefefefef0000f7f7f7f7f7f7f7f7181818 -1bf7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7b5 -b5b5b6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7efefefeff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f71818181bf7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7b5b5b5b6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7efefefeff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f71818181bf7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7b5b5b5b6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7efefefeff7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f71818181bf7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7b5b5b5b6f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7efefefeff7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f71818181bf7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7b5b5b5b6f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7efefefeff7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7181818 -1bf7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7b5 -b5b5b6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7efefefeff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f71818181bf7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7b5b5b5b6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7efefefeff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f71818181bf7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7b5b5b5b6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7efefefeff7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f700000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/finland.gif b/Docs/Flags/finland.gif deleted file mode 100644 index 08f367ce95c5d7e35c8a2648f05ff03827cd683c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmZ?wbh9u|RA3NeSjYeZ5?kL(Z+rj!`*$4>4v~?=Y6cpOrDx5aBwxxIrpK1N2=@0vd=qfyp~VW_6(?v<;AYS}=);zpmjd-F zkOc}JP@sTlBO_BTsE`RF3%z zCBSf0FaWA5O3f=#Fa`xOP&lvg(|pb7$geu@R`oWo1sS4%_z}U$Lh7KsOfB~PEmahQvEjXZyOA?Dp R!2U2ZwB%A%b@g}S0su1{4SN6p diff --git a/Docs/Flags/finland.txt b/Docs/Flags/finland.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/france.eps b/Docs/Flags/france.eps deleted file mode 100644 index 7d5b7fa0830..00000000000 --- a/Docs/Flags/france.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: france.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000808080808080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6 -c6c6c6c6c6c6c6000000000000000000000003f7f7f7f7f7f7f7f7f7f700 -0000000000000000000000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7 -f70000000000000000000000000808080808080808080bf7f7f7f7f7f7f7 -f7f7f7c6c6c6c6c6c6c6c6c6c6000000000000000000000003f7f7f7f7f7 -f7f7f7f7f7000000000000000000000000b5b5b5b5b5b5b5b5b5b6f7f7f7 -f7f7f7f7f7f7f70000000000000000000000000808080808080808080bf7 -f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6c60000000000000000000000 -03f7f7f7f7f7f7f7f7f7f7000000000000000000000000b5b5b5b5b5b5b5 -b5b5b6f7f7f7f7f7f7f7f7f7f70000000000000000000000000808080808 -080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6c60000000000 -00000000000003f7f7f7f7f7f7f7f7f7f7000000000000000000000000b5 -b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f70000000000000000000000 -000808080808080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6 -c6000000000000000000000003f7f7f7f7f7f7f7f7f7f700000000000000 -0000000000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f70000000000 -000000000000000808080808080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6 -c6c6c6c6c6c6c6000000000000000000000003f7f7f7f7f7f7f7f7f7f700 -0000000000000000000000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7 -f70000000000000000000000000808080808080808080bf7f7f7f7f7f7f7 -f7f7f7c6c6c6c6c6c6c6c6c6c6000000000000000000000003f7f7f7f7f7 -f7f7f7f7f7000000000000000000000000b5b5b5b5b5b5b5b5b5b6f7f7f7 -f7f7f7f7f7f7f70000000000000000000000000808080808080808080bf7 -f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6c60000000000000000000000 -03f7f7f7f7f7f7f7f7f7f7000000000000000000000000b5b5b5b5b5b5b5 -b5b5b6f7f7f7f7f7f7f7f7f7f70000000000000000000000000808080808 -080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6c60000000000 -00000000000003f7f7f7f7f7f7f7f7f7f7000000000000000000000000b5 -b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f70000000000000000000000 -000808080808080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6 -c6000000000000000000000003f7f7f7f7f7f7f7f7f7f700000000000000 -0000000000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f70000000000 -000000000000000808080808080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6 -c6c6c6c6c6c6c6000000000000000000000003f7f7f7f7f7f7f7f7f7f700 -0000000000000000000000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7 -f70000000000000000000000000808080808080808080bf7f7f7f7f7f7f7 -f7f7f7c6c6c6c6c6c6c6c6c6c6000000000000000000000003f7f7f7f7f7 -f7f7f7f7f7000000000000000000000000b5b5b5b5b5b5b5b5b5b6f7f7f7 -f7f7f7f7f7f7f70000000000000000000000000808080808080808080bf7 -f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6c60000000000000000000000 -03f7f7f7f7f7f7f7f7f7f7000000000000000000000000b5b5b5b5b5b5b5 -b5b5b6f7f7f7f7f7f7f7f7f7f70000000000000000000000000808080808 -080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6c60000000000 -00000000000003f7f7f7f7f7f7f7f7f7f7000000000000000000000000b5 -b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f70000000000000000000000 -000808080808080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6 -c6000000000000000000000003f7f7f7f7f7f7f7f7f7f700000000000000 -0000000000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f70000000000 -000000000000000808080808080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6 -c6c6c6c6c6c6c6000000000000000000000003f7f7f7f7f7f7f7f7f7f700 -0000000000000000000000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7 -f70000000000000000000000000808080808080808080bf7f7f7f7f7f7f7 -f7f7f7c6c6c6c6c6c6c6c6c6c6000000000000000000000003f7f7f7f7f7 -f7f7f7f7f7000000000000000000000000b5b5b5b5b5b5b5b5b5b6f7f7f7 -f7f7f7f7f7f7f70000000000000000000000000808080808080808080bf7 -f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6c60000000000000000000000 -03f7f7f7f7f7f7f7f7f7f7000000000000000000000000b5b5b5b5b5b5b5 -b5b5b6f7f7f7f7f7f7f7f7f7f70000000000000000000000000808080808 -080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6c60000000000 -00000000000003f7f7f7f7f7f7f7f7f7f7000000000000000000000000b5 -b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f70000000000000000000000 -000808080808080808080bf7f7f7f7f7f7f7f7f7f7c6c6c6c6c6c6c6c6c6 -c6000000000000000000000003f7f7f7f7f7f7f7f7f7f700000000000000 -0000000000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f70000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/france.gif b/Docs/Flags/france.gif deleted file mode 100644 index f44b729895ad592547f2d5ed983064a3a8593def..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmZ?wbh9u|RA3NeIK%(~+|1iJ7`7f`VEF$1I|BnV1H%Odh7CF(8IT$V=6H@>cmDaF zuw>q8(SLULq6JfXV=ZeEOed+eFKgNnx0d_BB%ABEXTQ?E_p*(7Q`Wu-e6OU7mVlR>4xvLm3GV&pk-m@k&nN+|ySp1x|>b zU}fM6Hxo+DOM!X<$O3sB3a1w5mlh?b76St|peR2%IJG2N9~krs z`kuK!bvuF(*GAW(3562&;?`>VXbTDNP1OyN0`8sDgV&esM{0 za#3bMiGrD)si7v&5~%Ykic-_K3>3_{4B$Y)%+%D_R3S|PCT3y*bO{J3dcY!mJ}ss=A;$@ld^(-aAsAig1G`PcJhIt0}3o)z~`mq bD}a0p4(Q^N#G(?gKTItQxl~nM{oS|#wRZW3 diff --git a/Docs/Flags/france.txt b/Docs/Flags/france.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/germany.eps b/Docs/Flags/germany.eps deleted file mode 100644 index e06e98b1883..00000000000 --- a/Docs/Flags/germany.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: germany.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000004040404040404040404040404040404040 -404040404040404040404040400000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000ececececec -ececececececececececececececececececececececececec00008e8e8e -8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e000000 -000000000000000000000000000000000000000000000000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff0000d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6 -d6d6d6000000000000000000000000000000000000000000000000000000 -00000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff0000d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6 -d6d6d6d6d6d6d6d6d6000000000000000000000000000000000000000000 -00000000000000000000000000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff0000d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6 -d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6000000000000000000000000000000 -00000000000000000000000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffff0000d6d6d6d6d6d6d6d6d6 -d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6000000000000000000 -00000000000000000000000000000000000000000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff0000d6d6d6 -d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6000000 -000000000000000000000000000000000000000000000000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff0000d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6 -d6d6d6000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/germany.gif b/Docs/Flags/germany.gif deleted file mode 100644 index aedbb037a32dbdcd800ba828529909d12bae6e40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmZ?wbh9u|RA3NeIK%(~Z~7SiUt>7Nz~BJlF*7h+U|`sw17d^JFfe;_?7H*M;FRa; zy%w*}>ivE}5P ZsP!QXW!h_t_A}{MXv@W0PhnxO1_106Ek^(V diff --git a/Docs/Flags/germany.pdf b/Docs/Flags/germany.pdf deleted file mode 100644 index 01df1c4cb3ab492dc2804f0653ab7ee3522c0bda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 804 zcmY!laBvV+;&8Hy*rKRTUO+`q+_|&lfE| zEiL_WqKl0}ufP8G%R#q#xuL2DX0=4Fw)LQvI&M zhc{$c&6n?f`gx5W5AWm&!k(f5*V0O);udhNdkiljk(1fjH!bAlbQKzzvxnUqoaj3AthUa$G&3SHe&&hZG$9Mkx z-!IZ6B!x;PG9VgVv~>Ul#35B!0-~d_RMK3`8elj=v{;hS#F8|`l1v0kCXhNxPsYRm zhNVfO3{r_565StgyYc_5Sk0`xVB^(wlGJ?pvd--hci_9zlHjwIs1?NKo+l?%u|Cj>NnL z`mW7%7Wb3}UzOyHob1{^D)tDiiCSN~nc}eg-Vu5$j@Ckf*Js|TN4rn1-yP{(3^|p( z(-st1Sjo5X@rH@&%QH{113yh0cPECP&g?llJm=O|Q%i^i0$ss@JoUSqzZ6I2g(BL_ zb5;B{K5Piwv$5+5c9m>AU-hy5*!0TM#IcPRx7a@t#vUpuvBcYND+AY7#@nuoM59?P z*9y*^aa&l5S}yqOk5f(i$J34g%j%z{uWs|~$aV9;do~S!%C9819rt#K4MM0|Zz_M& zZjevT{sz4pKB&LI^Xsvz?kJ-KzxpS)`uhC5LpX-z**9!_$86^DEB-qy%0Yg*Fy!;p zr<TS<6%jE+~&HQk6to3jaJ{B;tFGN|N*c5pd zv>Y^=-M^~cR248Wm9-~DACNvIF5HW?^afrU{Gwkld+|`|rTXmE7Gs><;QQ1?zqut} z+vx+coICgWsm5``mU(}|z2k)2Tuqy4g>69*$WOFg3P>89^ zP`LPfuDMayn_1+d6=)$D997X09G(W_YsCfUya8(3i^caRp`#%hqq9Q$RCws(~ zr3s^nq|wBKSf;U(gb`>GQ532US1eR`a}fo(*E$Q$umsII-yxNvK_wC;rYC{F0sWca ADF6Tf diff --git a/Docs/Flags/great-britain.txt b/Docs/Flags/great-britain.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/greece.eps b/Docs/Flags/greece.eps deleted file mode 100644 index f59baa86106..00000000000 --- a/Docs/Flags/greece.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: greece.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000001818181893f7ac18181818181818181818181818181818 -181818181818180000b5b5b5b5d9f7e1b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b50000efefefeff3f7f4efefefefefefefefefefefef -efefefefefefefefefefef00001818181893f7ac18181818181818181818 -181818181818181818181818180000b5b5b5b5d9f7e1b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000efefefeff3f7f4efefefefefef -efefefefefefefefefefefefefefefefef00001818181893f7ac18181818 -b1c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c50000b5b5b5b5d9f7e1b5b5 -b5b5e2e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e80000efefefeff3f7f4 -efefefeff4f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f500001818181893 -f7ac18181818def7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5b5b5 -b5d9f7e1b5b5b5b5f0f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000ef -efefeff3f7f4efefefeff6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -0093939393caf7d5939393937a7979797979797979797979797979797979 -790000d9d9d9d9e9f7edd9d9d9d9d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2 -d2d2d20000f3f3f3f3f5f7f6f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 -f3f3f3f3f30000f7f7f7f7f7f7f7f7f7f7f72e1818181818181818181818 -181818181818180000f7f7f7f7f7f7f7f7f7f7f7bcb5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b50000f7f7f7f7f7f7f7f7f7f7f7f0efefefefefefef -efefefefefefefefefefef0000acacacacd5f7deacacacac686161616161 -616161616161616161616161610000e1e1e1e1edf7f0e1e1e1e1cccacaca -cacacacacacacacacacacacacacaca0000f4f4f4f4f6f7f6f4f4f4f4f2f2 -f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f200001818181893f7ac18181818 -def7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000b5b5b5b5d9f7e1b5b5 -b5b5f0f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000efefefeff3f7f4 -efefefeff6f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700001818181893 -f7ac18181818c8dededededededededededededededededede0000b5b5b5 -b5d9f7e1b5b5b5b5e9f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f00000ef -efefeff3f7f4efefefeff5f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f600 -001818181893f7ac18181818181818181818181818181818181818181818 -180000b5b5b5b5d9f7e1b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b50000efefefeff3f7f4efefefefefefefefefefefefefefefefefef -efefefefef00001818181893f7ac18181818181818181818181818181818 -181818181818180000b5b5b5b5d9f7e1b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b50000efefefeff3f7f4efefefefefefefefefefefef -efefefefefefefefefefef0000dedededeecf7efdededededededededede -dedededededededededededede0000f0f0f0f0f4f7f5f0f0f0f0f0f0f0f0 -f0f0f0f0f0f0f0f0f0f0f0f0f0f0f00000f6f6f6f6f7f7f7f6f6f6f6f6f6 -f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f60000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700006161616161 -616161616161616161616161616161616161616161616161610000cacaca -cacacacacacacacacacacacacacacacacacacacacacacacacacaca0000f2 -f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f200 -001818181818181818181818181818181818181818181818181818181818 -180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b50000efefefefefefefefefefefefefefefefefefefefefefefefef -efefefefef00007979797979797979797979797979797979797979797979 -797979797979790000d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2 -d2d2d2d2d2d2d2d2d20000f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 -f3f3f3f3f3f3f3f3f3f3f30000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000c5c5c5c5c5c5c5c5c5c5c5 -c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c50000e8e8e8e8e8e8e8e8e8 -e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e80000f5f5f5f5f5f5f5 -f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f500001818181818 -181818181818181818181818181818181818181818181818180000b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000ef -efefefefefefefefefefefefefefefefefefefefefefefefefefefefef00 -001818181818181818181818181818181818181818181818181818181818 -180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b50000efefefefefefefefefefefefefefefefefefefefefefefefef -efefefefef00000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/greece.gif b/Docs/Flags/greece.gif deleted file mode 100644 index 264b295b3745a659e590b7a3efc3093ac90af330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmZ?wbh9u|RA3NeXkh?>H4nd3Uiy6W#n(4qz9*jgB(e4V)wkdD_I#Lp^Ye+9U*CWI ze(%G#j5D9AE`9#~{rkp8UrxRJ%D~XUz|h6Opuxa!0>)m(z;J zyVBx(;BD3ZSivuy7hbwFmOS{7u!6a_sm5>p`F6?_;qUK%2%@0dH?JGy_f$}Wj(L{uKoZ2ZQ`$F&ZpJyS#j#P z;MRu;-TD1|-$ka$=DaK8US|?|`n~myU&>BN&wWnrvOg*MKmGm8ODDG+xOg<-naVv@ z;pZWHgx+1XG&q^A`n~B;!>Q@V`n=~GsFfDyCYd~Zef#@i@0r!jC%$U05p)aMXT@zI zDPcFOw7Ym`l@?18YY`)Z+U+?Ssd*{TXaTZ7Q3;Ab5N&K}&IJ`RLBw)MWkITbKw^5T zzHe$uW};Jmg+jCeP}ZT&k+B{%%|Vw?}LF diff --git a/Docs/Flags/greece.txt b/Docs/Flags/greece.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/hungary.eps b/Docs/Flags/hungary.eps deleted file mode 100644 index 38d9cae079f..00000000000 --- a/Docs/Flags/hungary.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: hungary.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6 -d6d6d6d6d6d6d6d6d6d6d6d6d60000505050505050505050505050505050 -505050505050505050505050505050000050505050505050505050505050 -50505050505050505050505050505050500000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700005353535353 -535353535353535353535353535353535353535353535353530000cbcbcb -cbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcb000053 -535353535353535353535353535353535353535353535353535353535300 -000000000000000000000000000000000000000000000000000000000000 -000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/hungary.gif b/Docs/Flags/hungary.gif deleted file mode 100644 index eb14887b5bbf85c670bde797d4d4d7dc664b3cb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmZ?wbh9u|RA3NeIK%(~!KZ^6wlW-JV7L|#@csLD28Ig^3>$PnG9Wb!%uyV>?)=L= z;kkNm(8IIK-!1ss`ov(`gU%wZhx-b2&aVr)Q?c&-pWN>U7VsypZhnu2WR=8z{%Ydg=V&$@U2e*I6D$@A~;bjaJzcdhyKY~x@)x7d5D4(M)t zd#O{(Y}+5R1uo*R#l+aUziT~;SvQZXF{Uww;q5~wsnom_sP}*@P>_HE0z?}b8goH~ zOc0?JQdy9yACQ=ys_&bcl9}j~U!f3f0F*YhG*z%LF^c8V56UkAhMj@|P*qWCUWtM+ zC}4rYsm1xFMaikfz#tDO%1;hXEs53#Mv8*IXD-k<=U6UaK B0|Wp7 diff --git a/Docs/Flags/hungary.txt b/Docs/Flags/hungary.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/iceland.eps b/Docs/Flags/iceland.eps deleted file mode 100644 index 8a1bc21f4c8..00000000000 --- a/Docs/Flags/iceland.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: iceland.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000808080808080808efc6c6ec0808080808080808080808 -0808080808080800000000000000000000cf0000cb000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b5cf0000ceb5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500000808080808080808efc6c6ec0808080808 -0808080808080808080808080800000000000000000000cf0000cb000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b5cf0000ceb5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808080808efc6c6 -ec08080808080808080808080808080808080800000000000000000000cf -0000cb0000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b5cf0000ceb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808 -080808efc6c6ec0808080808080808080808080808080808080000000000 -0000000000cf0000cb0000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b5cf0000ceb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -000808080808080808efc6c6ec0808080808080808080808080808080808 -0800000000000000000000cf0000cb000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b5cf0000ceb5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000808080808080808efc6c6ec0808080808080808080808 -0808080808080800000000000000000000cf0000cb000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b5cf0000ceb5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500000808080808080808efc6c6ec0808080808 -0808080808080808080808080800000000000000000000cf0000cb000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b5cf0000ceb5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808080808efc6c6 -ec08080808080808080808080808080808080800000000000000000000cf -0000cb0000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b5cf0000ceb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000ececececec -ececece9c6c6e8ecececececececececececececececececec0000cbcbcb -cbcbcbcbcbad0000adcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcb0000ce -cececececececeae0000adcececececececececececececececececece00 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000efefefefefefefefe9c6c6e8efefefefef -efefefefefefefefefefefefef0000cfcfcfcfcfcfcfcfad0000adcfcfcf -cfcfcfcfcfcfcfcfcfcfcfcfcfcfcf0000cfcfcfcfcfcfcfcfae0000adcf -cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf00000808080808080808efc6c6 -ec08080808080808080808080808080808080800000000000000000000cf -0000cb0000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b5cf0000ceb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808 -080808efc6c6ec0808080808080808080808080808080808080000000000 -0000000000cf0000cb0000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b5cf0000ceb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -000808080808080808efc6c6ec0808080808080808080808080808080808 -0800000000000000000000cf0000cb000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b5cf0000ceb5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000808080808080808efc6c6ec0808080808080808080808 -0808080808080800000000000000000000cf0000cb000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b5cf0000ceb5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500000808080808080808efc6c6ec0808080808 -0808080808080808080808080800000000000000000000cf0000cb000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b5cf0000ceb5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808080808efc6c6 -ec08080808080808080808080808080808080800000000000000000000cf -0000cb0000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b5cf0000ceb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808 -080808efc6c6ec0808080808080808080808080808080808080000000000 -0000000000cf0000cb0000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b5cf0000ceb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -000808080808080808efc6c6ec0808080808080808080808080808080808 -0800000000000000000000cf0000cb000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b5cf0000ceb5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/iceland.gif b/Docs/Flags/iceland.gif deleted file mode 100644 index 4fe0c0b81240dbaafdfff36adf0e14ce3fe9ff7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmZ?wbh9u|RA3NeIK%(~FW0Vnv34y7!`3&a&mCi6cz^yp1H%R#kPJu-19J|?t~>v7 zPiXpTw!E?xl^6Tg+kCuL^5jhERqGBs-zT;DY>D{%@LAqwTBZG$)qxWG9<1M_z%l#$g9j-yg2Suq=kmzuzm58`Lwbt(z5LqTdZ$K{>YO%# Ku5MmV25SJzwL+}` diff --git a/Docs/Flags/iceland.pdf b/Docs/Flags/iceland.pdf deleted file mode 100644 index 3509de59ba8afb421f6afe8274d1b32a761d706e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 867 zcmY!laBPJ~8poMa@Ss>*jGa#x%w-TvZ5hPt8k#h6RuX3O`V&foLOB3ofXT2_k4i zDhpEe0}|6y^?g%QG83KhD-@y)fYPRxrV17&MzLJ_LHQ-XfL1U7swzs&D^V~8#R5<` zwK%`DC^@wl7(W3;`N_elCDHo87*x>r%mo_f9Loia6@BOYyb_?MVg*oa27!d2P5_w# ziCqPKkQ)@hjwn{p_s&cyR*2>TIWdSURsm>2DbP|wB&~*Utx%oLi6x0S`ROntAPz)W zWrR=n7XWO<8jk<~ diff --git a/Docs/Flags/iceland.txt b/Docs/Flags/iceland.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/indonesia.eps b/Docs/Flags/indonesia.eps deleted file mode 100644 index 9dcef0824df..00000000000 --- a/Docs/Flags/indonesia.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: indonesia.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4 -f4f4f4f4f4f4f4f4f40000f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4 -f4f4f4f4f4f4f4f4f4f4f40000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f700000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/indonesia.gif b/Docs/Flags/indonesia.gif deleted file mode 100644 index e05af4c8ff49e27c49f72afedd960495a64eac23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmZ?wbh9u|RA3NeSjYeZ-@kl01|+|K*8%ZB;tWh)E&VHJKjL3J=iG(v`DbI^@o~kU z=v7IZ7qY6#VfMxiY%Je;pa05}KFrU<)qZ6D`VJo{##3q^U-a-TxTLmq)}Ey9TW>eK N<~2H&;>yTi4FHYQFKPe) diff --git a/Docs/Flags/indonesia.pdf b/Docs/Flags/indonesia.pdf deleted file mode 100644 index 48bd801fa15709549f6d037bfa8cbd1a3e6f0425..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 804 zcmY!laBypTcx65`Xn7#h{*OXg*)47csJs;c)-(REkdX8oH(W*r}nev#?IhOM!X@$N~ib$lD;=(9)C(DrABPn~=(aRQ-U&^i+M{)RfFb zr~C?qXak_Msimocg^5utmwr%w2{5D-41lVNQu9g_j6uN&6izM9FD*(=Ed~Z~Kv8~j zaB4}kJ}?Rt^gVNd#yQ7w0fSZFIX|xisHs>16dgezA*d5Tra+=cK_BD>1+XKE74*F` zQ;HR$xj;?~;)+!OnotU~)DTIlAzUj|r*mRSVorWK%m|1B5mp%?)B_!wQko2mehqiO zPzCpl{Nj@0QUNTh zkOvntH8#f(Gcg7RCTSTmV<$`(Xe8 diff --git a/Docs/Flags/indonesia.txt b/Docs/Flags/indonesia.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/ireland.eps b/Docs/Flags/ireland.eps deleted file mode 100644 index 01251367922..00000000000 --- a/Docs/Flags/ireland.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: ireland.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000003f7f7f7f7f7f7f7f7f7f7ffffff -ffffffffffffff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6 -d6d6d6d6d6d6d6d6d6000000000000000000000003f7f7f7f7f7f7f7f7f7 -f700000000000000000000000000000000000000000003f7f7f7f7f7f7f7 -f7f7f7ffffffffffffffffffff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7 -f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000000000000000000003f7f7f7 -f7f7f7f7f7f7f700000000000000000000000000000000000000000003f7 -f7f7f7f7f7f7f7f7f7ffffffffffffffffffff0000b5b5b5b5b5b5b5b5b5 -b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000000000000000 -000003f7f7f7f7f7f7f7f7f7f70000000000000000000000000000000000 -0000000003f7f7f7f7f7f7f7f7f7f7ffffffffffffffffffff0000b5b5b5 -b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000 -000000000000000003f7f7f7f7f7f7f7f7f7f70000000000000000000000 -0000000000000000000003f7f7f7f7f7f7f7f7f7f7ffffffffffffffffff -ff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6 -d6d6d6000000000000000000000003f7f7f7f7f7f7f7f7f7f70000000000 -0000000000000000000000000000000003f7f7f7f7f7f7f7f7f7f7ffffff -ffffffffffffff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6 -d6d6d6d6d6d6d6d6d6000000000000000000000003f7f7f7f7f7f7f7f7f7 -f700000000000000000000000000000000000000000003f7f7f7f7f7f7f7 -f7f7f7ffffffffffffffffffff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7 -f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000000000000000000003f7f7f7 -f7f7f7f7f7f7f700000000000000000000000000000000000000000003f7 -f7f7f7f7f7f7f7f7f7ffffffffffffffffffff0000b5b5b5b5b5b5b5b5b5 -b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000000000000000 -000003f7f7f7f7f7f7f7f7f7f70000000000000000000000000000000000 -0000000003f7f7f7f7f7f7f7f7f7f7ffffffffffffffffffff0000b5b5b5 -b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000 -000000000000000003f7f7f7f7f7f7f7f7f7f70000000000000000000000 -0000000000000000000003f7f7f7f7f7f7f7f7f7f7ffffffffffffffffff -ff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6 -d6d6d6000000000000000000000003f7f7f7f7f7f7f7f7f7f70000000000 -0000000000000000000000000000000003f7f7f7f7f7f7f7f7f7f7ffffff -ffffffffffffff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6 -d6d6d6d6d6d6d6d6d6000000000000000000000003f7f7f7f7f7f7f7f7f7 -f700000000000000000000000000000000000000000003f7f7f7f7f7f7f7 -f7f7f7ffffffffffffffffffff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7 -f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000000000000000000003f7f7f7 -f7f7f7f7f7f7f700000000000000000000000000000000000000000003f7 -f7f7f7f7f7f7f7f7f7ffffffffffffffffffff0000b5b5b5b5b5b5b5b5b5 -b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000000000000000 -000003f7f7f7f7f7f7f7f7f7f70000000000000000000000000000000000 -0000000003f7f7f7f7f7f7f7f7f7f7ffffffffffffffffffff0000b5b5b5 -b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000 -000000000000000003f7f7f7f7f7f7f7f7f7f70000000000000000000000 -0000000000000000000003f7f7f7f7f7f7f7f7f7f7ffffffffffffffffff -ff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6 -d6d6d6000000000000000000000003f7f7f7f7f7f7f7f7f7f70000000000 -0000000000000000000000000000000003f7f7f7f7f7f7f7f7f7f7ffffff -ffffffffffffff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6 -d6d6d6d6d6d6d6d6d6000000000000000000000003f7f7f7f7f7f7f7f7f7 -f700000000000000000000000000000000000000000003f7f7f7f7f7f7f7 -f7f7f7ffffffffffffffffffff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7 -f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000000000000000000003f7f7f7 -f7f7f7f7f7f7f700000000000000000000000000000000000000000003f7 -f7f7f7f7f7f7f7f7f7ffffffffffffffffffff0000b5b5b5b5b5b5b5b5b5 -b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000000000000000 -000003f7f7f7f7f7f7f7f7f7f70000000000000000000000000000000000 -0000000003f7f7f7f7f7f7f7f7f7f7ffffffffffffffffffff0000b5b5b5 -b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6d6d6d6000000 -000000000000000003f7f7f7f7f7f7f7f7f7f70000000000000000000000 -0000000000000000000003f7f7f7f7f7f7f7f7f7f7ffffffffffffffffff -ff0000b5b5b5b5b5b5b5b5b5b6f7f7f7f7f7f7f7f7f7f7d6d6d6d6d6d6d6 -d6d6d6000000000000000000000003f7f7f7f7f7f7f7f7f7f70000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/ireland.gif b/Docs/Flags/ireland.gif deleted file mode 100644 index 631be2f33b9b633d27081c9f009560c583b3bb19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmZ?wbh9u|RA3NeIK%)3TN(aeV_@FK{QdiP1_ovZh6@Y~8+1T2AT{XE%$**HrH>@ex-fyWgGLRtbG@FlzoDFq~-;0 vRWa!_&ZVt}&fmP7_2q9_P6lfLee5{* diff --git a/Docs/Flags/ireland.pdf b/Docs/Flags/ireland.pdf deleted file mode 100644 index 5f84f52f0495fd1550041a1f926720d451f5c6a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 794 zcmY!laBxxlISyylLkDL!K790xp-?Z}ztv%#gC4_* zTc+ny^HQK*0J1>d26+}l8(NrhL4`~ZArewqkg6Y$n4YTdo0^iD=#*cf5N!aIHnlWW zurM)-<g1%=i z&^YH05ugWfFdCXBm{K=$P`GVDCmRSpa6D6v4XyLW=gR_G#AK;L0qv4 zKod%VmKq{yHH2%0>U2&lNzBPlhZzBJAi^pmgnFPuQ%aM8k*?wH7pmZ%kzZU=oLrPy zP@-U_XKJVkv;^wBilWpsE&~N~E(17FFf%nZHdRPdfQgxyTPlEM74qO>rbgx%VkSnw z00jXgbw(DLdJPPLfrPHk97%6UQDSCJY7sCYE9eJjR;4PKD*$6B9~e5Izybz*URu5a a$hY8tE-pzdDgpb$)ZCIwRn^tsjSB#kiu5M{ diff --git a/Docs/Flags/ireland.txt b/Docs/Flags/ireland.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/israel.eps b/Docs/Flags/israel.eps deleted file mode 100644 index 3d3059a907a..00000000000 --- a/Docs/Flags/israel.eps +++ /dev/null @@ -1,87 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: noname.ps -%%Pages: 1 -%%BoundingBox: 291 371 320 391 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 30 string def -/gpicstr 30 string def -/bpicstr 30 string def -%%EndProlog -%%Page: 1 1 -gsave -291.6 371.4 translate -28.8 19.2 scale -30 20 8 -[ 30 0 0 -20 0 20 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0 -f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4 -181818181818181818181818181818181818181818181818181818181818 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -efefefefefefefefefefefefefefefefefefefefefefefefefefefefefef -181818181818181818181818181818181818181818181818181818181818 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -efefefefefefefefefefefefefefefefefefefefefefefefefefefefefef -d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4 -edededededededededededededededededededededededededededededed -f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7a5bef7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7dfe6f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f4f5f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f2ede4807aebedf3f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f5f4f1d4d2f3f4f6f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f3f3f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7c65e5296915755daf7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7e9cac6dbd9c8c7eef7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f5f2f1f4f4f2f1f6f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7809af7f78a90f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7d4dcf7f7d7d9f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f3f4f7f7f3f3f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f77d94f7f7868bf7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7d3daf7f7d6d7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f3f3f7f7f3f3f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7c15e508a835755d6f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7e7cac6d7d5c8c7edf7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f5f1f1f3f3f1f1f6f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f0837ef6f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f5d5d3f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f3f3f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7afc7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7e2e9f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f4f5f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2 -e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7 -f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 -181818181818181818181818181818181818181818181818181818181818 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -efefefefefefefefefefefefefefefefefefefefefefefefefefefefefef -181818181818181818181818181818181818181818181818181818181818 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -efefefefefefefefefefefefefefefefefefefefefefefefefefefefefef -bcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbc -e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5 -f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/israel.gif b/Docs/Flags/israel.gif deleted file mode 100644 index f7cc613e27db201363e80f548c6dcbc849648d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmZ?wbh9u|RA3NeSjqqbuRnjk_V(Ms=UlJ+cY#OQC#XkiUhq~G ulTHJT;I6-+Yhz;GREuV3K2)-t8>_tgR92*JdiCr4&AVA&{+8urum%A5LO19D diff --git a/Docs/Flags/italy.pdf b/Docs/Flags/italy.pdf deleted file mode 100644 index 02c7d316a059dd38a66ea92841812aca1b2fe848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 794 zcmZXSPfQa*6vk_;MyDDjG>*sh(zqo8(xJQge%UL(l#=e*?jZ`%*-^pm)jAU!?EpgNH!QGVXN?jGVT zm)f7tuSUN`Uyr577E;!8ydYYaiWg7+*a_H+9f9DqJ@n*hTWQ%S7pCSuwU(wn6c$@b z%MS`Ia};HU%NvzkWIea~r;f#2^&ph<4IBlm|N35@GpNq4ze{Fl>$Gx{Z+wXqc-;ca$`wp8MX!ykan~|-;*`r@x z>{{+{w+3f=7kW9%vx>M&)I@Cr_GON34r|^nuY_un*dQ`=H$!kpP7xd=2}QoFk&UyZw-4Ni!oav@P$RA@848`8 z#|PC{Q0tl`cn)czz<`>kDNgVn&gESU(*JRurd+DaN}A~GM+O{G?h)_++m6QQn6Mal ZHK~C)Z56aZWt~>%kUT!*a9kPmqkmls^mPCL diff --git a/Docs/Flags/italy.txt b/Docs/Flags/italy.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/japan.eps b/Docs/Flags/japan.eps deleted file mode 100644 index c8ea7aa8afe..00000000000 --- a/Docs/Flags/japan.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: japan.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7eedfd7d7dfeef7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7ca7c57577ccaf7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7ca7c57577ccaf7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f3d6c6c6c6c6c6c6d6f3f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7e45000000000000050e4f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7e45000000000000050e4f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f3cec6c6c6c6c6c6c6c6cef3f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7e427000000000000000027e4 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7e4270000000000000000 -27e4f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7d6c6c6c6c6c6c6c6 -c6c6c6d6f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7500000000000 -000000000050f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f750000000 -0000000000000050f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7eec6c6 -c6c6c6c6c6c6c6c6c6c6eef7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7ca -000000000000000000000000caf7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7ca000000000000000000000000caf7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7dfc6c6c6c6c6c6c6c6c6c6c6c6dff7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f77c0000000000000000000000007cf7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f77c0000000000000000000000007cf7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7d7c6c6c6c6c6c6c6c6c6c6c6c6d7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f75700000000000000000000000057f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f75700000000000000000000000057f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7d7c6c6c6c6c6c6c6c6c6c6c6c6d7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f757000000000000000000000000 -57f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f75700000000000000000000 -000057f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7dfc6c6c6c6c6c6c6c6 -c6c6c6c6dff7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f77c000000000000 -0000000000007cf7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f77c00000000 -00000000000000007cf7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7eec6c6 -c6c6c6c6c6c6c6c6c6c6eef7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7c9 -000000000000000000000000caf7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7ca000000000000000000000000caf7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7d6c6c6c6c6c6c6c6c6c6c6d6f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7500000000000000000000050f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7500000000000000000000050f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f3cec6c6c6c6c6c6c6c6cef3f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7e427000000000000000027e4f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7e427000000000000000027e4f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f3d6c6c6c6c6c6c6d6f3f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7e45000000000000050e4f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7e45000000000000050 -e4f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7eedfd7d7df -eef7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7c97c56 -567cc9f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7ca -7c57577ccaf7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f700000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/japan.gif b/Docs/Flags/japan.gif deleted file mode 100644 index 7d6a9adbd78e2439576db4cf75bd5e3f789108bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmZ?wbh9u|RA3Nec+3C-pPxK=ckgw0S!tdAAFfep6 zFlaC^oM2$+0J3#JIzW0ESV{#>c&^@i^~KrU|7WrEJyDysqI^=j5znc{b@2fL6>%&o zcUe2;OlWw}STpB#K!k*%Y5UWlZ6 re#*^f5-exL=9ZaOSh-cJFmZ8maxobrV&TdBb@sM*?cQITe*AusXqt7q-`@It_7*j}rrwx;>i&JMzvs4o_KLSS zbn3{IO?T7-19EP1E@Rc-etvFreY$`83zO$JZe03aXqL)!Tkguz6*{|ZCw^?Ix&HFy zWMfI*cTdjG_<12<+Q}pN?-T7wM1o&FdDhV*AC_lNw3xnnxsyV;f;hwOHSPOS^HQK;4rGDi2^2dZ+Sts9 z3o2xSh{BM{f>iy0#Pn2s-_(@MM5p`;g=hnyw5g@3f`y4uESG*zehDx_6%2r?ic<4R z6pTT!4HQl-&Mz%WPAvwegMgy^AH1yHI9 z0trE#05S!ViWKxgZcqR_qF6!SJ2RzNA({*1#2~I%1)vF~KuZmgv>L*-LUlSPmL%rn zr^AeZI1pi#5kfuCp(&-wz*MT??iZ@yo{?W%Qk-0rSx};2re|uX3A6<2yo#dKG%f=L zb1nloP%tw!H8xd9Q-Fz?nF50r1Qhb%V&(=whogy^TAE{snV4bfH82DQ5}IBU6C}MQ zMTwa?sYSq?r=TC4S(U0_t^kakd|>E+0t*=Md1?6yAm4%my0|2Ko${_Il`}aGGS2Hj$Gca6WVA!Aok^!ke{-FgQX<*euba5^ZWk?7Hl{!E!FSBka#l3YW@XP c9k-c5#tpBJRXq*bYq-ICPt%O^eJl*t0LE)H>Hq)$ diff --git a/Docs/Flags/latvia.pdf b/Docs/Flags/latvia.pdf deleted file mode 100644 index 1d06690e9804cd509580c14914d4f70f2f8f802a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819 zcmY!laB4rvLw+Efv<*(Arh9<>alFXwNIo4d3%S zJg*%TT@$=WwndQsrtUDDVd2*`4tM$20&?3OH&046Qfuz{h<63V8AID096&G=9MTIgF+Q3 zoLZb;T9lkx3=HppqWt9G)RJg@V2mi}d*%X-bB^T#hO)kMeqISsQ?UXlc7i}cP$z&) zfy9=AKFAFUU`G@y=zC|T6e~n?ft(n`6{`R=p%iGTA(B=@xK^l6=fsl4ocwf{5fBF= ztTIBV2RbyRG#Qv0G~E3{72GrOi%W`=i!uvJ6wLHY4K;z5K%G}nl$yq6pkU5r00#v<*$n#02PhG%;gCOuYt%nCgsx(E!(5Qk0mPlUf8! z;R^b}nN_I@<_f^r$p?lGD6oJ5pO==e0P-z3po>cqi%P)$Ff%aWQdM>JcjE#8X`lfx diff --git a/Docs/Flags/latvia.txt b/Docs/Flags/latvia.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/mexico.eps b/Docs/Flags/mexico.eps deleted file mode 100644 index c6f4f0a79de..00000000000 --- a/Docs/Flags/mexico.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: mexico.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000005ffffffffffffffffffffc6c6c6 -c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5b7fffffffffffffffffffe00 -000000000000000000000000000000000000000005ffffffffffffffffff -fe00000000000000000000000000000000000000000005ffffffffffffff -ffffffc6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5b7ffffffffff -fffffffffe00000000000000000000000000000000000000000005ffffff -fffffffffffffe00000000000000000000000000000000000000000005ff -ffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5 -b7fffffffffffffffffffe00000000000000000000000000000000000000 -000005fffffffffffffffffffe0000000000000000000000000000000000 -0000000005ffffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000b5b5b5 -b5b5b5b5b5b5b7fffffffffffffffffffe00000000000000000000000000 -000000000000000005fffffffffffffffffffe0000000000000000000000 -0000000000000000000005ffffffffffffffffffffc6c6c6c6c6c6c6c6c6 -c60000b5b5b5b5b5b5b5b5b5b7fffffffffffffffffffe00000000000000 -000000000000000000000000000005fffffffffffffffffffe0000000000 -0000000000000000000000000000000005ffffffffffffffffffffc6c6c6 -c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5b7fffffffffffffffffffe00 -000000000000000000000000000000000000000005ffffffffffffffffff -fe00000000000000000000000000000000000000000005fffffffee0bbe1 -ffffffc6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5b7fffffffed2 -95d3fffffe00000000000000000000000000000000000000000005ffffff -fec876c7fffffe00000000000000000000000000000000000000000005ff -ffc4ae7f8683cdffffc6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5 -b7ffffd790453e3daefffe00000000000000000000000000000000000000 -000005ffffbc6114010295fffe0000000000000000000000000000000000 -0000000005fffcd699827c838df6ffc6c6c6c6c6c6c6c6c6c60000b5b5b5 -b5b5b5b5b5b5b7fffbdca23f383c47f3fe00000000000000000000000000 -000000000000000005ffface770600000cf0fe0000000000000000000000 -0000000000000000000005f3e89eaa827eb98de6f5c6c6c6c6c6c6c6c6c6 -c60000b5b5b5b5b5b5b5b5b5b7f6eab996493b9a53def800000000000000 -000000000000000000000000000005f1e28f8319038123d2f30000000000 -0000000000000000000000000000000005cfcf77bab38a93bdbdd5c6c6c6 -c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5b7dbcf97a18c5159a1cae200 -000000000000000000000000000000000000000005c3bc67796521298bab -cd00000000000000000000000000000000000000000005fa8cbd7c4c6076 -c079fdc6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5b7fbadcba194 -839bb6abfc00000000000000000000000000000000000000000005f978b8 -78542f63a668fb00000000000000000000000000000000000000000005ff -e2829a795dbd8ee1ffc6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5 -b7ffe5a9bf5657c8b9e7fe00000000000000000000000000000000000000 -000005ffd86ecd2d20c780d9fe0000000000000000000000000000000000 -0000000005ffffe68b989f86f5ffffc6c6c6c6c6c6c6c6c6c60000b5b5b5 -b5b5b5b5b5b5b7ffffe8b4aba8b5f4fffe00000000000000000000000000 -000000000000000005ffffdd7d8a8c78f0fffe0000000000000000000000 -0000000000000000000005fffffffffefeffffffffc6c6c6c6c6c6c6c6c6 -c60000b5b5b5b5b5b5b5b5b5b7fffffffffefefffffffe00000000000000 -000000000000000000000000000005fffffffffefefffffffe0000000000 -0000000000000000000000000000000005ffffffffffffffffffffc6c6c6 -c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5b7fffffffffffffffffffe00 -000000000000000000000000000000000000000005ffffffffffffffffff -fe00000000000000000000000000000000000000000005ffffffffffffff -ffffffc6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5b7ffffffffff -fffffffffe00000000000000000000000000000000000000000005ffffff -fffffffffffffe00000000000000000000000000000000000000000005ff -ffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5 -b7fffffffffffffffffffe00000000000000000000000000000000000000 -000005fffffffffffffffffffe0000000000000000000000000000000000 -0000000005ffffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000b5b5b5 -b5b5b5b5b5b5b7fffffffffffffffffffe00000000000000000000000000 -000000000000000005fffffffffffffffffffe0000000000000000000000 -0000000000000000000005ffffffffffffffffffffc6c6c6c6c6c6c6c6c6 -c60000b5b5b5b5b5b5b5b5b5b7fffffffffffffffffffe00000000000000 -000000000000000000000000000005fffffffffffffffffffe0000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/mexico.gif b/Docs/Flags/mexico.gif deleted file mode 100644 index 206d1236ef111950783d165ca17c9fb1508f106b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615 zcmZ?wbh9u|RA3NeIK}`14=$Z}`21$i+KPl`{Xf5dHLc7$a(&O_NX=e%o*ApV`gS(- z1}pD9wYqY3MrD|8vn^BG){4EScRYJ>_rGwXI%hOG>nds25T ztbFwJ#-WzZ3x=}U$v#s;x&jr;r>E~-*xlqQ3AFm_mk)pc{J#3=?6o`R zzW(_9`P;{J6B4_()XrQ~UbC>`{O!ZvK7aWC|Np$5{SPl6pSAyNy{pLl6+LIyO>MGg zTQ#kD_tdig|NiYgaXdC$Vdt#IW*eYa!WkG?!G2<7U`T)=83u+Y3=C{waV7?a2pGD- zzyL%*aTYN8!oUDQ3JeTD1Q7(10t^g5)7)X&fhGX0_|L##$iSe?z);MHV3Hj2LnSj1H&8!hCT+r6FMM8ptxXQKhwa_)ZEhA z*4`@B)!i*=+CO1}y~dQO)0%o__D!5PdD{FLGkfREoxgx#(c&fj^Oj9nxN`RDwd*!4 z+O%ZLvTd^_h%wrkuUR*BPtR<2eM?aRYtvoJS9bNW>KNK6I&+#_n7-nYq@IYGt-6F0 zkDTt2_4hX#i>t~=t8l3CYQNDq)~moQWaK6w@bO?HSM8r=S6?JB9B)=|5aW0ecINI{ zci{w$3xbMAja$U3e{NFXTw=nz!y+)J+$dGEj5BbZ6r1srjWgx5w;kD8B)@3B12-!Z GgEauJ<>`e0 diff --git a/Docs/Flags/mexico.pdf b/Docs/Flags/mexico.pdf deleted file mode 100644 index c983198d2b5d75c41485869b0f6af07e8d2f72ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1072 zcmY!laB*oFZi|+jMYxDb)g67YkwBrj`a8r+OY~;s-oim+0<@f7{ zZ}EDyJdXk|C4V&G#xsB@LRW} zxv{T@r)TERJ93ZIw{K0Hb%Rxrt*zPA{K(E2TT!N+OgkA?HJ^=2%}aqsERY3C44@Xp%85Vls2_ARj@EIisjM|$}a(?8U+KO zs-o1q5(Q&Wk^%~+7U!21C8rhx6I(!0esXYXNwhvNIV$LT<^qj#j^zR-F@5L!yb_?M zVg*pr3<3#3od7Zgl2jG+L2gh0JEB-Y-#asb#1g z)HE&w1#>O~I8ZP%H8nO>NK=4`nVXs`fMpf(;9?dAK#zg|l9-vL1%{ZZ8KzzXLrlG< zCP;cqiV`z(Qj37uTR}fKvno}=Tmcw6`M}Tt1r{*i^V0GaK)wYBba6>yQ3==|7N+K0 Ks;aL3Zd?HKGnK^v diff --git a/Docs/Flags/mexico.txt b/Docs/Flags/mexico.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/netherlands.eps b/Docs/Flags/netherlands.eps deleted file mode 100644 index 94795e98baa..00000000000 --- a/Docs/Flags/netherlands.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: netherlands.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6 -d6d6d6d6d6d6d6d6d6d6d6d6d60000505050505050505050505050505050 -505050505050505050505050505050000050505050505050505050505050 -50505050505050505050505050505050500000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700005959595959 -595959595959595959595959595959595959595959595959590000535353 -5353535353535353535353535353535353535353535353535353530000cb -cbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcb00 -000808080808080808080808080808080808080808080808080808080808 -080000000000000000000000000000000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000808080808080808080808080808080808080808080808 -080808080808080000000000000000000000000000000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500000808080808080808080808080808080808 -080808080808080808080808080000000000000000000000000000000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808080808080808 -080808080808080808080808080808080808080000000000000000000000 -0000000000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808 -080808080808080808080808080808080808080808080808080000000000 -0000000000000000000000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -000808080808080808080808080808080808080808080808080808080808 -080000000000000000000000000000000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/netherlands.gif b/Docs/Flags/netherlands.gif deleted file mode 100644 index 2f236b5894957d7237166838c828643012a34869..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmZ?wbh9u|RA3NeIK%(~k-?`q7`7f`V7L|#@csLD28Ig^3>$PnG9Wb!%uyV>?)=L= z;kkNm(8IIK-!1ss`ov(`gU%wZhx-b2&aVr)Q?c&-pWN>U7VsypZhnu2WR=8z{%Ydg=V&$@U2e*I6D$@A~;bjaJzcde6sdipY%KU+#?GHq`? zvdvq4)|1M2x?-;dADnxT^uhO<(DS0NAskP*o-i@|<8%s4%}arL5Xb@r3MeQ*w2`4H z7gWdu5ndsc1*!T0iRr2OzNsmhiB9Vo+7ATxroL^d$oLUSF^njxLS5cIj#$}*j z&Sd}x3TCFJ#-<8s3NSHK14{+4tU?|_%+wr1%)}HJpdf&x&e#xBuYn;jkkHiub-~3- ziV`z(Qj37eTtPoLvno}=Tmcw6`M}Tt1r{*i^V0GaK)wYBba6>yQ3==|W(JmAs;aL3 GZd?Gdpap&a diff --git a/Docs/Flags/netherlands.txt b/Docs/Flags/netherlands.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/new-zealand.eps b/Docs/Flags/new-zealand.eps deleted file mode 100644 index 9177154f8f7..00000000000 --- a/Docs/Flags/new-zealand.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: new-zealand.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000ce770d08080874c6770808080c77ce0808080808080808 -0808080808080800003e58050000004d005000000005583e000000000000 -000000000000000000000042b4b6b5b5b5aa00abb5b5b5b6b442b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b50000aed2b433080874c677080833b4d2ae0808 -0808080808080808080808080800008a3d5e2b00004d005000002b5e3d8a -0000000000000000000000000000000000bb3d81bfb5b5aa00abb5b5bf81 -3dbbb5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000967d3ce770d74c6770c77 -ced36709080808080808083e230808080808080000015f733e58054d0050 -05583e735f0100000000000000341c0000000000000000b5cb7d42b4b6aa -00abb6b4427dcbb5b5b5b5b5b5b5b5bfbcb5b5b5b5b5b50000080825aed2 -b49bc69db3d2ae25080808080808080a65a49a5a0808080808000000001e -893d5e7400765d3d8a1e000000000000000253444c4d00000000000000b5 -b5bdbb3d81b300b4813dbbbdb5b5b5b5b5b5b5b6bf7285c3b5b5b5b5b500 -00d3d3d3d3d6d5d3c6d3d5d6d3d3d3d30808080808081ccfc01308080808 -0800004d4d4d4d4f4d4200424d4f4d4d4d4d00000000000015484a0b0000 -00000000004f4f4f4f4f4d4200424d4f4f4f4f4fb5b5b5b5b5b5ba4e5fb8 -b5b5b5b5b50000d6d6d6d6d6d6d3c6d3d6d6d6d6d6d60808080808082c59 -6b1808080808080000505050505050420042505050505050000000000000 -25475a1000000000000000505050505050420042505050505050b5b5b5b5 -b5b5bfbdc2b9b5b5b5b5b50000080825aed2b49bc69db4d2ae2508080808 -08080908080808080832080808000000001e8a3d5e7400775e3d8a1e0000 -00000000010000000000002c0000000000b5b5bdbb3d81b300b4813dbbbd -b5b5b5b5b5b5b5b5b5b5b5b5b5c1b5b5b500000967d3ce770d74c6770c77 -ced36709080808086408080808183eb14528080000015f733e58054d0050 -05583e735f010000000058000000001138714021000000b5cb7d42b4b6aa -00abb6b4427dcbb5b5b5b5b5c6b5b5b5b5b9c49bc6beb50000aed2b43308 -0874c677080833b4d2ae08083188c8821e08080a7ec8a6190800008a3d5e -2b00004d005000002b5e3d8a00002b534b591700000252074912000000bb -3d81bfb5b5aa00abb5b5bf813dbbb5b5c09f58abbbb5b5b6a70776bab500 -00ce770d08080874c6770808080c77ce08080882cd5f0808080861798a08 -0800003e58050000004d005000000005583e0000004b2649000000005249 -660000000042b4b6b5b5b5aa00abb5b5b5b6b442b5b5b59a26b9b5b5b5b5 -c2a1b3b5b50000080808080808080808080808080808080808622d540808 -080810081008080000000000000000000000000000000000000000552548 -0000000008000800000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5c4 -bec2b5b5b5b5b7b5b7b5b500000808080808080808080808080808080808 -080808080808080808080808080000000000000000000000000000000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808080808080808 -080808080808080808080808080808080808080000000000000000000000 -0000000000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808 -080808080808080808080808080808080808080808080808080000000000 -0000000000000000000000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -00080808080808080808080808080808080808080808081c080808080808 -080000000000000000000000000000000000000000000000001400000000 -0000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5bab5b5 -b5b5b5b5b500000808080808080808080808080808080808080808080886 -200808080808080000000000000000000000000000000000000000000000 -005f190000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5adbcb5b5b5b5b5b500000808080808080808080808080808080808 -0808081196cdc94808080808080000000000000000000000000000000000 -00000000000a7728674100000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b8bc2978c5b5b5b5b5b500000808080808080808080808 -080808080808080808083dada00808080808080000000000000000000000 -0000000000000000000000003555670000000000000000b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5c17e9fb5b5b5b5b5b500000808080808 -08080808080808080808080808080808240a250908080808080000000000 -0000000000000000000000000000000000001d021e0100000000000000b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5bdb5bdb5b5b5b5b5b500 -000808080808080808080808080808080808080808080808080808080808 -080000000000000000000000000000000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/new-zealand.gif b/Docs/Flags/new-zealand.gif deleted file mode 100644 index 5d74f71ecc0f1c4c9ad4848e6f5acb775475d1f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 661 zcmZ?wbh9u|RA3NeIK}`1bwSIyn6?RX? z+#K7O8oZy2X=}XaP94?#YeVbK**P8Xiq}xww;+A~$@B^%orBi`0@~u&Zi#C=!OpHC zyO)P`o2$dI@_^NLCi@j6_eA*~zUJ@m;dnG9;+U%3-pfu-U1^(Vmu$Z5>wm&KLRWQP zdBm2>#kC9!5nyzKfdPov7#LW<=nDe_1Sv2u01-qGND448FfuT>gF=dd35-}782&Rb z7&0&@GcXi0Fr+dtyk%gx3RVCok{KAzfjRFO7;+dGG#ME7fXxAF{K3Fb&A>2+fuWDV z?}QFW5hyMg*nc%JG&Q%hwzapK_$x~FvZy-tO4<9HOqxDpQWFQOjd0(DUSS(nj+x7Q zo0K^Nx)l2zrCW*YIa^W5Jv$L0Xn5{{!Yw#~4d#jtv9_l8Yd-kDkztvt%b?~s#m zoO#X7E%Q3Wo#m~MKSAemiAgIZ4d7bc8)&> z!qBoI8w^mG8;Min9GGFin9OC!&xp%p5S@zK7(tv6aR}qL+`g;bbU$~=eP5pM{dvCk z-scV1C1^L|QUVF@nW$<;6aWKM=3ZpeCUh(5vawkp8X|gBYj?0D4N$Ga#F7c5nX-^u zwjc~klO`v^HHy0ZVmz1>hqmzbt!5{(57`G~m{Ll34+tD40z?cJEtLbAN+E{}G}0s^ zXuJWS`Xmj4rUMy)psxS|el@yyph8fskQPA`bO5r_(WJ$0W+@ur3g|{Ta-A;5>jU=` z4Yvp+mYe{%MziG;e9y{XnY?XLCk}shmR#^G#wEymX0xx}X?;(0Cc^bgNkwZbVGZEL z#n)`Pr|P+ZVvH-@uXlcs&A=C=yQoBN8Y9ioVl zYaOa{q17puQYB?v`0Ww#<&x9J3t`XL6z4yl>Zbae(|O*E_g*hYz^E>S?| zP7oQ@)8F7pCB?l_-*;8E*5yPvCD&l%`7G|$w)xkjQ z=Gj|ItKI%}g`Q!}m90k!K;q?SI|R@9OlDXL@y}NG6dSt?4gMlLtM!Lz;1-So6*2+3kh=gWEe%53pEdK zR!Nq*96omb+cd+m*f&PL>a1$II9D<@5zNi3eQ{OggAWc=?KTGAj~NX)&hF>$D+m3i zh}Uap4U@Mve^?XIGW7nc*qB_}cv zR8O%`HvofHH0ff244&#COfpn1Z6+CSV^d}W$r@28NPs3gVYv7Vp_gHkyIAPN070C3 z0rF80qC65S@NxiN5)43Jvs)NoLsrv{Zpd!X!R=98Fpg3@8!o?*~LH6fy;{ z0w0EBIJ}hb0M}zI8fO0|hQ%o0FZdUxBL3rx{ZBkhg+1ZR(k8ouq~U-AsKNd=36yZ~ kP!z0=P%Kz@mz4s-ZM}tNSQE{9?}6iR-h_uIrfQKt0ULPhc>n+a diff --git a/Docs/Flags/new-zealand.txt b/Docs/Flags/new-zealand.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/norway.eps b/Docs/Flags/norway.eps deleted file mode 100755 index af62cbef81f..00000000000 --- a/Docs/Flags/norway.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: norway.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6d00808d0c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c600000000000000000000cf0000cb000000000000000000 -00000000000000000000000000000000000000ecb5b5e900000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6d00808d0c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c600000000000000000000cf0000cb000000 -00000000000000000000000000000000000000000000000000ecb5b5e900 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6d00808 -d0c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c600000000000000000000cf -0000cb000000000000000000000000000000000000000000000000000000 -00ecb5b5e90000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6d00808d0c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -0000000000cf0000cb000000000000000000000000000000000000000000 -00000000000000ecb5b5e900000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6d00808d0c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c600000000000000000000cf0000cb000000000000000000000000000000 -00000000000000000000000000ecb5b5e900000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6d00808d0c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c600000000000000000000cf0000cb000000000000000000 -00000000000000000000000000000000000000ecb5b5e900000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6d00808d0c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c600000000000000000000cf0000cb000000 -00000000000000000000000000000000000000000000000000ecb5b5e900 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6d00808 -d0c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c600000000000000000000cf -0000cb000000000000000000000000000000000000000000000000000000 -00ecb5b5e90000000000000000000000000000000000000000d0d0d0d0d0 -d0d0d0b00808b0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000cbcbcb -cbcbcbcbcbad0000adcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcb0000e9 -e9e9e9e9e9e9e9e3b5b5e3e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e900 -000808080808080808080808080808080808080808080808080808080808 -080000000000000000000000000000000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000808080808080808080808080808080808080808080808 -080808080808080000000000000000000000000000000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b50000d0d0d0d0d0d0d0d0b00808b0d0d0d0d0d0 -d0d0d0d0d0d0d0d0d0d0d0d0d00000cfcfcfcfcfcfcfcfad0000adcfcfcf -cfcfcfcfcfcfcfcfcfcfcfcfcfcfcf0000ecececececececece3b5b5e3ec -ececececececececececececececececec0000c6c6c6c6c6c6c6c6d00808 -d0c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c600000000000000000000cf -0000cb000000000000000000000000000000000000000000000000000000 -00ecb5b5e90000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6d00808d0c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -0000000000cf0000cb000000000000000000000000000000000000000000 -00000000000000ecb5b5e900000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6d00808d0c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c600000000000000000000cf0000cb000000000000000000000000000000 -00000000000000000000000000ecb5b5e900000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6d00808d0c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c600000000000000000000cf0000cb000000000000000000 -00000000000000000000000000000000000000ecb5b5e900000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6d00808d0c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c600000000000000000000cf0000cb000000 -00000000000000000000000000000000000000000000000000ecb5b5e900 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6d00808 -d0c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c600000000000000000000cf -0000cb000000000000000000000000000000000000000000000000000000 -00ecb5b5e90000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6d00808d0c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -0000000000cf0000cb000000000000000000000000000000000000000000 -00000000000000ecb5b5e900000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6d00808d0c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c600000000000000000000cf0000cb000000000000000000000000000000 -00000000000000000000000000ecb5b5e900000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/norway.gif b/Docs/Flags/norway.gif deleted file mode 100755 index e88d1029f3e50299a35a7e81d2a25d7034537083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmZ?wbh9u|RA3NeIK%(~91L5JF)&;>{qn;3HyhSI1~M5KHt2w4Kx!D6b2xV0`R98= z)03n5m940_*tg!MXG*VHci{Oxsnuso#OH_4@;2jow_HM^|Jb3W4LMf*UEL*K zYonH4TwPWjD6sFrdZPf2+2Eu7lp8mS?XvClN=)X&M{@S8rtt6SOCAGkE)idQsrtUDDVd2*`4tM$20&?3OH&046Qfuz{h<63U??jX096&G=9MTIgQ5T^oLZb; zT9lkx42+zBqWt9G)RJg@VDu^Id*%X-bB^T#Mv1<2eqISsQ?UXlDuX~mP$z&)fkdr> zKFAFUU`G@y=zC|T6e~n?ft(n`6{`R=p%iGTA(B=@xK^l6=fsl4ocwf{5fBF=tTIBV z2RbyRG#Qw5G~E3{72GrOi%W`=i!uvJ6wLHY4K;z5K%G}nl$yq6pkU5r00#R diff --git a/Docs/Flags/norway.txt b/Docs/Flags/norway.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/philippines.eps b/Docs/Flags/philippines.eps deleted file mode 100644 index 9c3b242568a..00000000000 --- a/Docs/Flags/philippines.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: philippines.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000a91d080808080808080808080808080808080808080808 -080808080808080000a71600000000000000000000000000000000000000 -0000000000000000000000e2bbb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b50000f7e45a0808080808080808080808080808 -080808080808080808080808080000f6e354000000000000000000000000 -0000000000000000000000000000000000f3efcbb5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000f7fdf9a91d080808080808 -080808080808080808080808080808080808080000f6f8f5a71600000000 -0000000000000000000000000000000000000000000000eb3bbae2bbb5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000f9fdf9f7e4 -5a0808080808080808080808080808080808080808080808080000f5f8f5 -f7e3540000000000000000000000000000000000000000000000000000c8 -4fb2f7f2ccb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -00f7f8f7f7f7f7a91d080808080808080808080808080808080808080808 -080000f7f6f7f7f7f7a71600000000000000000000000000000000000000 -0000000000f7eaf7f7f7f7e2bbb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b50000f7f7f7f7f7f8f7e45a0808080808080808080808080808 -080808080808080000f7f7f7f7f6f5f7e354000000000000000000000000 -0000000000000000000000f7f7f7f7e8d8f7f2ccb5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b50000f7f7f8f7f9fbf7f8f7a91d080808080808 -080808080808080808080808080000f7f7f5f7f5f0f7f5f6a71600000000 -0000000000000000000000000000000000f7f7dcf7c785f7e1f2e2bbb5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000f7f7fcfafafdf8fcf9f7e4 -5a0808080808080808080808080808080808080000f7f6eef2f5f2f6eef3 -f7e3540000000000000000000000000000000000000000f7f26eaba44bd6 -66b9f7f2ccb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000f7f7f7feff -fffffaf7f7f7f7a91d080808080808080808080808080808080000f7f7f6 -f4fffffcf2f7f7f7f7a616000000000000000000000000000000000000f7 -f7ea2800000290f7f7f7f7dfbbb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -00f7fafafffffffffdfaf8f7fafbe45a0808080808080808080808080808 -080000f7f2f1fefffffff7f2f4f7f5f6e354000000000000000000000000 -0000000000f5a49c0100000048a4caf79d71f2ccb5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b50000f7fafafffffffffdfaf8f7fbfdf4d7c4c4c4c4c4c4c4c4 -c4c4c4c4c4c4c40000f7f2f1fefffffff7f2f4f7f5f9e255000000000000 -0000000000000000000000f4a49c0200000049a4caf68a43c75602020202 -02020202020202020202020000f7f7f7fefffffffaf7f7f7f7e8cbc6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000f7f7f6f4fffffcf2f7f7f7f7a61600 -0000000000000000000000000000000000f7f7ea2800000290f7f7f7f793 -16000000000000000000000000000000000000f7f7fcfafafdf8fcf9f7f3 -d7c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000f7f6eef2f5f2f6eef3 -f7e4550000000000000000000000000000000000000000f7f26eaba44bd6 -66b9f7e4560000000000000000000000000000000000000000f7f7f8f7f9 -fbf7f8f7e8cbc6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000f7f7f5 -f7f5f0f7f5f6a816000000000000000000000000000000000000000000f7 -f7dcf7c785f7e1f2a8160000000000000000000000000000000000000000 -00f7f7f7f7f7f8f7f3d7c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000f7f7f7f7f6f5f7e455000000000000000000000000000000000000 -0000000000f7f7f7f7e8d8f7e45600000000000000000000000000000000 -00000000000000f7f7f7f7f7f7e8cbc6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000f7f6f7f7f7f7a81600000000000000000000000000 -0000000000000000000000f7edf7f7f7f7a8160000000000000000000000 -00000000000000000000000000f8fcf9f7f3d7c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000f6f8f5f7e455000000000000000000 -0000000000000000000000000000000000d553adf7e45600000000000000 -00000000000000000000000000000000000000f8fdfae8cbc6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000f6f8f5a81600000000 -0000000000000000000000000000000000000000000000e642ada8160000 -00000000000000000000000000000000000000000000000000f7f4d7c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000f7e355 -0000000000000000000000000000000000000000000000000000000000f7 -d95600000000000000000000000000000000000000000000000000000000 -00e8cbc6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000a81600000000000000000000000000000000000000000000000000 -0000000000a8160000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/philippines.gif b/Docs/Flags/philippines.gif deleted file mode 100644 index 884f2a5e8d2b90d0dcd7e4969a879836bded68f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmX|;ZAepL6vzLr<_l#ii}j|o&}uU))OA})!bbD!s4cXzwHVuv3Go@6!DX2I7Y>6QYm zQlLJ>4oKv#NZhleIu`w%ZC``l&rJBqgpb2UBc*~kGf-CgMjb?jfXw#GEGHZ^%d|K+ z;bz36grj`k-y#{30$o0DAml$Y)pniIAXOd6xS~KJtyB$RS|m?pv49FQo$V76>3#)W z$X_AT5+$rtLOSX19pJErUfU@OI5AH$-~*yHT?ZVQ#{;OS`a+E$Foy|HnG@BV2&isF z^X;mGIzj<5fmGl;a2l8fMzw>#%PqBT^K(1!CS+ zfxmRw?zm#liC$4tTX(I#f#1F%v7zx+Ex&lJt-7hXj?YM2z-?O7(!z7eTn~5eL8G%b z#?s#TxV~S{EsN)}Q~O*s&eY8tw8(UY~#YRy~P%dNcX;ujh6(>>Pph9u6o zq~jYhy}6USeym=;%^bBOB!`uLXZicVct=c9tRelFS=W?RG16>_ebGDd^7wN;zToWJ z`)pg+iJIZS7Gkewejq7@srXER|U`c|L=Es{xaFHH&T16x!34)rO&&Uo>2eY z@wR4LMDAL>lm4eC>peS@dgEl;#Lq7>PEReq?iXqQIm~&!Q;%W)0cPw`jtX94(s+nole0<9?ld~t9 zmMp)+>m{D9Vf|5l`~RGamy@bK9GmDa(-c~)9QKOy)w@p@&fi#Cc<;i~X;W`}GRE{x`6EBQ) zUnws>(%56_qtD{k(fOs;@^b3t>V>Bl{ePo+)c@ORHrsuBHRFxGu6=vG^!E4t73mOTU(mw^+ektxg(^GQQHi`9i`Fy_B7h*TOQ@;K! zt=v>E+`rXfor4}jMDnwM)VvgEssge=DG`+ZK(wia1s7Dv1d&KXDhpEe0}|6y^?g%Q zG83KhD-@y)fYPRxrV17&MzLJ_LHQ-XB&%QmR8^FkSE67HO3y&y)Z+ZoqU6+KU`h`t z%1;hXEs53#<^=_P&s?B!&aqs;^sVolpH~9ZRIC8X7eOE)s1rb@K=O%#KFAFUU`G@y z=zC|T6e~n?ft(n`6{`R=p%iGTA(B=@xK^l6=fsl4ocwf{5fBF=tTIBV2RbyRG#Qu= zHQfC|72GrOi%W`=i!uvJ6wLHY4K;z5K%G}nl$yq6pkU5r00#^a}0P~I5RR910 diff --git a/Docs/Flags/philippines.txt b/Docs/Flags/philippines.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/poland.eps b/Docs/Flags/poland.eps deleted file mode 100644 index 06c580e1625..00000000000 --- a/Docs/Flags/poland.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: poland.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 -c7c7c7c7c7c7c70000030303030303030303030303030303030303030303 -030303030303030303000003030303030303030303030303030303030303 -03030303030303030303030000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/poland.gif b/Docs/Flags/poland.gif deleted file mode 100644 index 902b49f745d54058bddea89c91d9677d1d9b5cf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmZ?wbh9u|RA3NeSjYeZ#~2unGc$kx{#^&e1Bo**dA0Pfoc)-8@tkuPy62ybdB?{W zf1+0w{H?VPh>wW$!Px>G~4_Et<`RhA;q!>@BeSFcww&0T5)>(U!x^KPR O@S4}?Sc)qngEauisV!Fk diff --git a/Docs/Flags/poland.pdf b/Docs/Flags/poland.pdf deleted file mode 100644 index e2c696dda21fc59dffe9e207f564e2b55494c92f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 809 zcmY!laBr;>J69yM&^p{~SrVba|R@%G|L3`#p~z^8LAS$q}j6E8W@=;@w|eELDsR zTFzY)dS3K3gyRX<6D9@?MXPzKc_~mI0a>6>0Qnt68yOgIL4`~Z0TfbMkg6Y$n4YTd zo0^iD=#*cf5N!aIHnlWWurM)-<05ugWfZ`+wBm{K=$P`E%Dd>aTpa6D6 zv4XyLW=gR_G#AK;L0qv4Kod%VmKq{yHH2%0>U2&lNzBPlhZzBJAi^pmgnFPuQ%aM8 zX+Xo>FI2%jBfq$$IJqdZphUq;&(u&8XbIGL6-B9OTm}l}Tn2EUU}kD+Y^so^024E@ z1UeD~6!PF=rY1n!(8NrDy3oap4KVc@7-Fh3vOp3mDN4-DNi71VYX$w_%&Jrca|K}R n^d diff --git a/Docs/Flags/poland.txt b/Docs/Flags/poland.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/portugal.eps b/Docs/Flags/portugal.eps deleted file mode 100644 index 01a83ecd6d1..00000000000 --- a/Docs/Flags/portugal.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: portugal.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000002c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5b30000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000002c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5b30000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000002c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5 -b30000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000002c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5 -b5b5b5b5b5b5b30000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000000013462d2cac6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000b5b5b5b5b5b5b5b4bac35d31010000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000002ec0989ddde0e6cac6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000b5b5b5b5b5b5b9ded7d49795bc2c00000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000002ee3bd749ccfbdd0eacac6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b9e5bc5991610a80db2c -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000001c046dfc5bbbb -c4e2e3e2c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5b5b4debb9d3b -65653b9ab3bc010000000000000000000000000000000000000000000000 -002b29292b00000000000000000000000000000000000000000000000034 -9843b8e45f5fe4bbe6dec8c6c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5 -b5bad7bd08d85959d807bfaf2f0000000000000000000000000000000000 -00000000000000d8cdcdd800000000000000000000000000000000000000 -000000000060da9ecf63282863d4d9d4d5c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000b5b5b5b5c3e3d6685822225868796d610000000000000000000000 -00000000000000000000000000b4bebeb400000000000000000000000000 -000000000000000000000061d5c9e35f26265fe3d8efd1c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000b5b5b5b5c4dcdda3551f1f559b8fea5c0000000000 -00000000000000000000000000000000000000b1bdbdb100000000000000 -0000000000000000000000000000000000349801a3d75f5fd7bce0e3c7c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5b5bad7b414a25959a21596b5 -2e0000000000000000000000000000000000000000000000009acdcd9a00 -000000000000000000000000000000000000000000000001bc81c3f69292 -f6cfcbe6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5b5b4d9cc91ca -4a4aca8141bb010000000000000000000000000000000000000000000000 -000751510700000000000000000000000000000000000000000000000000 -2de2c9a4a6bbd9e2ebc9c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5 -b5b5b9e3ddad281fafccdf2b000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000002fc0989ddde0e6c9c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000b5b5b5b5b5b5baded7d49795bc2b00000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000013462d2cac6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b4bac35d31010000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000002c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5b30000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000002c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5b5b5b5 -b30000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000002c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5 -b5b5b5b5b5b5b30000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -0000000000000000000002c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000b5b5b5b5b5b5b5b5b5b30000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/portugal.gif b/Docs/Flags/portugal.gif deleted file mode 100644 index add53255d602dfbc5312b920d7a6761037660acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmX|;TS(IZ6omrjT}FbP;j2FX=pc=8m7t^JBL|~LpzzhEWT#Z zNS&69^taY;SUZ`}U~Q)_LS=GBKaRB#Yb{sOX;$*#JaI-w^B9^z)5m-@qZ*#J@X1Q7 ziAE_i5BM=hMp~OuflNw1b66%Qw=NIYS&+794oXBF1*0vqc^o4SDr z;%z=~up@@Qpavhf4B7A#ChUg)k_GSV$qHNqe-P|*Y>j{52Gl_*NrQoFrnO%nna(Bu z_ML*lq5}E7;^IKxvT|)jMSh8{wDM79weEh+<9n$Q~n diff --git a/Docs/Flags/portugal.pdf b/Docs/Flags/portugal.pdf deleted file mode 100644 index d1f66f846db29761230dad24c3958a3eb2257cfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1189 zcmY!laBM<9vi_&|?h})3kB1z2y`0UjDr0?Jghk8?fpGKH zx1{9G`r531F73C{s7`RR@`rc)fxXg!&$E*s&s}|!|NH09Yo<^7A-?;GgK&53Y_aUw zpK3hiN}cD=m!7xp!jWod^&!DnQy(g;m56_sZqHXBNv=Hupu;WuEq4#%bgU$6~q}L z_3!UZ%}ar%CLjxx0zv5xM4MU|a6yGk5Q#ISvLIDIATd2v-#0ZSGtnu(LLu4!C~azK zs$gMa6w9R_lwSf&stN``RYj?JB?`u%bPN<>$G6E0O%SARDy0G{x@YybcN diff --git a/Docs/Flags/portugal.txt b/Docs/Flags/portugal.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/romania.eps b/Docs/Flags/romania.eps deleted file mode 100644 index c20a7b6871b..00000000000 --- a/Docs/Flags/romania.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: romania.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000808080808080808080bffffffffffffffffffffc6c6c6 -c6c6c6c6c6c6c6000000000000000000000003fffffffffffffffffffc00 -0000000000000000000000b5b5b5b5b5b5b5b5b5b3000000000000000000 -000000000000000000000000000808080808080808080bffffffffffffff -ffffffc6c6c6c6c6c6c6c6c6c6000000000000000000000003ffffffffff -fffffffffc000000000000000000000000b5b5b5b5b5b5b5b5b5b3000000 -000000000000000000000000000000000000000808080808080808080bff -ffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000000000000000000000 -03fffffffffffffffffffc000000000000000000000000b5b5b5b5b5b5b5 -b5b5b3000000000000000000000000000000000000000000000808080808 -080808080bffffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000000000 -00000000000003fffffffffffffffffffc000000000000000000000000b5 -b5b5b5b5b5b5b5b5b3000000000000000000000000000000000000000000 -000808080808080808080bffffffffffffffffffffc6c6c6c6c6c6c6c6c6 -c6000000000000000000000003fffffffffffffffffffc00000000000000 -0000000000b5b5b5b5b5b5b5b5b5b3000000000000000000000000000000 -000000000000000808080808080808080bffffffffffffffffffffc6c6c6 -c6c6c6c6c6c6c6000000000000000000000003fffffffffffffffffffc00 -0000000000000000000000b5b5b5b5b5b5b5b5b5b3000000000000000000 -000000000000000000000000000808080808080808080bffffffffffffff -ffffffc6c6c6c6c6c6c6c6c6c6000000000000000000000003ffffffffff -fffffffffc000000000000000000000000b5b5b5b5b5b5b5b5b5b3000000 -000000000000000000000000000000000000000808080808080808080bff -ffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000000000000000000000 -03fffffffffffffffffffc000000000000000000000000b5b5b5b5b5b5b5 -b5b5b3000000000000000000000000000000000000000000000808080808 -080808080bffffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000000000 -00000000000003fffffffffffffffffffc000000000000000000000000b5 -b5b5b5b5b5b5b5b5b3000000000000000000000000000000000000000000 -000808080808080808080bffffffffffffffffffffc6c6c6c6c6c6c6c6c6 -c6000000000000000000000003fffffffffffffffffffc00000000000000 -0000000000b5b5b5b5b5b5b5b5b5b3000000000000000000000000000000 -000000000000000808080808080808080bffffffffffffffffffffc6c6c6 -c6c6c6c6c6c6c6000000000000000000000003fffffffffffffffffffc00 -0000000000000000000000b5b5b5b5b5b5b5b5b5b3000000000000000000 -000000000000000000000000000808080808080808080bffffffffffffff -ffffffc6c6c6c6c6c6c6c6c6c6000000000000000000000003ffffffffff -fffffffffc000000000000000000000000b5b5b5b5b5b5b5b5b5b3000000 -000000000000000000000000000000000000000808080808080808080bff -ffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000000000000000000000 -03fffffffffffffffffffc000000000000000000000000b5b5b5b5b5b5b5 -b5b5b3000000000000000000000000000000000000000000000808080808 -080808080bffffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000000000 -00000000000003fffffffffffffffffffc000000000000000000000000b5 -b5b5b5b5b5b5b5b5b3000000000000000000000000000000000000000000 -000808080808080808080bffffffffffffffffffffc6c6c6c6c6c6c6c6c6 -c6000000000000000000000003fffffffffffffffffffc00000000000000 -0000000000b5b5b5b5b5b5b5b5b5b3000000000000000000000000000000 -000000000000000808080808080808080bffffffffffffffffffffc6c6c6 -c6c6c6c6c6c6c6000000000000000000000003fffffffffffffffffffc00 -0000000000000000000000b5b5b5b5b5b5b5b5b5b3000000000000000000 -000000000000000000000000000808080808080808080bffffffffffffff -ffffffc6c6c6c6c6c6c6c6c6c6000000000000000000000003ffffffffff -fffffffffc000000000000000000000000b5b5b5b5b5b5b5b5b5b3000000 -000000000000000000000000000000000000000808080808080808080bff -ffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000000000000000000000 -03fffffffffffffffffffc000000000000000000000000b5b5b5b5b5b5b5 -b5b5b3000000000000000000000000000000000000000000000808080808 -080808080bffffffffffffffffffffc6c6c6c6c6c6c6c6c6c60000000000 -00000000000003fffffffffffffffffffc000000000000000000000000b5 -b5b5b5b5b5b5b5b5b3000000000000000000000000000000000000000000 -000808080808080808080bffffffffffffffffffffc6c6c6c6c6c6c6c6c6 -c6000000000000000000000003fffffffffffffffffffc00000000000000 -0000000000b5b5b5b5b5b5b5b5b5b3000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/romania.gif b/Docs/Flags/romania.gif deleted file mode 100644 index a6ffa4ad0c2cda1a85674cc5840dbabaae93b6cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmZ?wbh9u|RA3NeIK%(~+{~N*|6$-@*m{hC;s1Z2zy$_|4LTqhkQxT&Y>r)b{^g#q zblxe!eQ0-hNJi?-XLA!GCO++CdUYyp+3BSpEv}obd!;k)wEC=zIkHNu9zy$)gwnV@ z15TA)(c;m%nzA-9`QXo+&yGA<^0WQly6$6N-tNr_KG^*3qu+kEy8)GD9u-x|c>!kVWgnWl%puP_mXqUfvh!ghwl;Y_(MK`s=5aN~ zG{!I}S|1qr z3i_V8K;xWaxqtzx@0_1k0@PHj0E&npkPy@fAX6X_qo5CRg96wQ#R~e~nJL8z(Oe)W z264qI08J5zW@L$}*T4`MNa*U!k@S`nC1&QN76B8pf_`vjRjPuy0x)*+fuREmEMUOr drR6Jtddn4>s$-TBvh z!gKZBpoeFdzgzINRmE`HgU%wahx-b2&aYFtQ?c&-pWN>U7Vsu;<~I`Fn?{{w?^ZN1sY8#Y_{#O-E(yWL99-1%LFI}?L703YByH~;_u diff --git a/Docs/Flags/russia.pdf b/Docs/Flags/russia.pdf deleted file mode 100644 index 84c304cba327a25307dcc1ac41bdc3f62bbadbd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 829 zcmY!laBr;>J69vTJT#ek<;qQfsl%qw%&=((R?fzMpKqi*znCOj6fGQ~B-11*acO;KSMkm&EtVqIB1Q%tStrKSycDP}fh05ugW zfZ{0#Bm{K=$P`GtDd>aTpa6D6v4XyLW=gR_G#AK;L0qv4Kod%VmKq{yHH2%0>U2&l zNzBPlhZzBJAi^pmgnFPuQ%aM8=|aQZFI2%jBfq$$IJqdZphUq;&(u&8XbIGL6-B9O zTm}l}Tn2EUU}kD+Y^so^024Dc1UeD~6!H*aWX3JAPdvEo5v)2-Chll=V0nV27Tb{=D5`u^q1DPiH$ z;^LQ`oKJ9ZeY$t=K}*X?KE6{zLdRKI&#J1v*}L}`1H&mn!IS&~r-Vh$s;Hdc;J6+d zdQL;*I5YE$RjaNA1l&qY{Qmv>^^lO~OP5}W=JHSo=GT0ax z%)lg&4M7JO7=VbCfq{jAfti891%`wf7=Q>U$OuF_ApIb}FtE*YXejW|k?MEt4m#PP zGyj4{$PSiJH{ovQQ@ugDG9s=!e`f5;;J*4PYOBdNUN}y1v7|M zR=n~`Z>rY4$V-*lnWtN-n9WNH9tj;9HCbVdAtH1BsI0mk*+qUo6 zxofMF(!Tu%4jwwZZ|{-gCyp|lJahQi*$YbNFP^!4<;1n?M{eFabm#5?k4KN)92u+u D5+a8> diff --git a/Docs/Flags/singapore.pdf b/Docs/Flags/singapore.pdf deleted file mode 100644 index 1d2666f851c808e955a98ae4cde3b93f31606362..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1056 zcmY!laBvm?b+r$toBjX(|NWbD@2-E}{=7Y>%)o$C z)7mt3+sv7@|7y1_nkgoxl(Z`}aACat{K;3lED9c-nRV;_{WAHl^UA;OTG;sT82|kL z;s54~zxns~*Q0OD(vw(@*46zx_F5}!!o-P&=lA{l@%H}w?^m@-%l1v2^vS+9YUApp zcQV&KCqM0z`ThIwHwaAUauS?TqJ@9hJY9`OS-y7pt+bjIF(OC8&CJ{Qt-5vT6HIAK9kz^!j=BK2Ep# zdixZ!8y7dcfBw9D(;`!zH{s{f@7#~y{GspMthSSH-&nHm-+zD8%EY3NQW zXis2k>$ey0F5X$C#Ztst#K@4SwCh1?UJ5iKfh@& z#<)tAX|}IY*Xs|Tt&9(U{rYY1#Rs!Xw{Cp&RfK29t()(IHCp%Ieci@j+Z?#SO{%}l ze-#JARvy+(v!>rwVqF{?QD)6Q{p;87M_zngHRmeOQd{}?iVX9dZMs7J8z1dCR_-!q zS^YLnhAjuC?GR#E^YZie)s?I4EsvP-OyBzC>x26rzkmN;QgB&}Z>NLEU&H_eX z7#JW(fq?;tAc8XGfQW+TDGB8{PD}WQp3=HSM zoOcWiISdS%3=Dg~<^VPRU|^_bV3@6c-Ha#~K)#np;}i+FQ-Lx_f&2 z`n#GYOrFv`sf&Y8T4|2BmEF|->E^B4aFIp={4(se9!7g^L%OwwZ{TnVEA7s%mVz|KQ=3O$tIbhUV7n4iDcxVz|$2 zW6CZfq5kgYrpKEM^chv;GA=CdpRdDa#IvEm(O|w~q@I+C4u?YX(QXOjtUDQj6FU19 poV#Q^KP^5!Nh5d`%Ysd+CnxJA&uY-zta^5qrr^svnHmBN)&K$|(6|5q diff --git a/Docs/Flags/slovenia.pdf b/Docs/Flags/slovenia.pdf deleted file mode 100644 index b00ca0e6467dde8b74ac1526cbc60f154e552d5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1133 zcmY!laBni6)Sk&7SNwgqzi$o?|E>7{<-gS~_RP7^>o#qs=kjgg za&>2KM%iE9^5h5`>uiO6B5vOfC(3;MdtTq~md=dHj~{QyWk3CP<-L#5US&DgZ_C@S ze=#|AbL)~D^IQ1yq-A&QyH}gMNB8-~MQg0>Os#DG{QiIa|DQkq-(P*~Hvg5HT2yDD zxkg64mfwy4bvteQ&q~Vuw0g{6|G(At{--b9n;)(^!R&5-<(}!p?5j7{=Kaqv{W$-o zaCwgQ-PM6RbtxvkS?7mZl08 zCPuMb`a$_6z$B+&08~|!npdJ=3`&nc;nd>%(xT+lVqi)QD9TR`PA!Sn2c~5Oea~E= zan7+^!1Sr_oS#<$)KshhO4mUkA*d5Tra;oUfMBCIk(s0TVUr8F6sk2Kue%XfFx#a zYKb9cW`wENzz`TnXnM^Iko1-mC1&QN76Ho!1^wX6s#FDY1z_yt149QCSipeKOUqXP a`4$||#U+VFC18J88d`9vs=E5SaRC690JpXP diff --git a/Docs/Flags/slovenia.txt b/Docs/Flags/slovenia.txt deleted file mode 100755 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/south-africa.eps b/Docs/Flags/south-africa.eps deleted file mode 100644 index 6c080095104..00000000000 --- a/Docs/Flags/south-africa.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: south-africa.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000001eb6e7cac6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000b5b5b5bde6a7160000000000000000000000000000 -00000000000000000000000000001eb6a716000000000000000000000000 -00000000000000000000000000000000000167e8d7c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5d1e05400000000000000 -0000000000000000000000000000000000000000000167d9540000000000 -0000000000000000000000000000000000000000000000000022bce7cac6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000b5b5b5b5b5b5bee7a7 -160000000000000000000000000000000000000000000000000000000022 -bca716000000000000000000000000000000000000000000000700000000 -0000026eead7c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000b7b5b5 -b5b5b5b5b6d2e15400000000000000000000000000000000000000000000 -000000000000026edb540000000000000000000000000000000000000000 -00d9450000000000000026c1e7cac6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000f4c9b5b5b5b5b5b5b5bfe9a7160000000000000000000000000000 -000000000000000000000000000026c1a716000000000000000000000000 -0000000000000050e0a81a0000000000000374ecd7c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6000050e0e6bdb5b5b5b5b5b5b6d4e25400000000000000 -0000000000000000000000000000000000000000000374dd540000000000 -00000000000000000000000000000b87eb70040000000000002bc6e7d7d7 -d7d7d7d7d7d7d7d7d7d7d7d7d70000000b87f5d6b6b5b5b5b5b5b5c0eaa7 -53535353535353535353535353535300000000000000000000000000002b -c6a7545454545454545454545454545454000000000028bdcf3900000000 -00000576a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7000000000028bdf1c6b5b5 -b5b5b5b5b6d5e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2000000000000000000 -0000000000000576a7a7a7a7a7a7a7a7a7a7a7a7a7a7a700000000000000 -59e49b130000000000000000000000000000000000000000000000000000 -000059e5e2bbb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000e90e86301000000000000000000000000000000000000 -0000000000000000000e90f6d2b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5000000000000000000000000000000000000000000000000000000 -000000000000000000000000000e90e86301000000000000000000000000 -0000000000000000000000000000000e90f6d2b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5000000000000000000000000000000000000000000 -00000000000000000000000000000000000059e49b130000000000000000 -000000000000000000000000000000000000000059e5e2bbb5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5000000000000000000000000000000 -0000000000000000000000000000000000000000000028bdcf3900000000 -00000576a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7000000000028bdf1c6b5b5 -b5b5b5b5b6d5e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2000000000000000000 -0000000000000576a7a7a7a7a7a7a7a7a7a7a7a7a7a7a70000000b87eb70 -040000000000002bc6a95959595959595959595959595959590000000b87 -f5d6b6b5b5b5b5b5b5c0eaa7535353535353535353535353535353000000 -00000000000000000000002bc6e2cbcbcbcbcbcbcbcbcbcbcbcbcbcbcb00 -0050e0a81a0000000000000374dd5a080808080808080808080808080808 -08000050e0e6bdb5b5b5b5b5b5b6d4e25400000000000000000000000000 -0000000000000000000000000000000374ebccb5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b50000d9450000000000000026c1a91d08080808080808080808 -080808080808080000f4c9b5b5b5b5b5b5b5bfe9a7160000000000000000 -000000000000000000000000000000000000000026c1e2bbb5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5000007000000000000026edb5a080808080808 -080808080808080808080808080000b7b5b5b5b5b5b5b6d2e15400000000 -000000000000000000000000000000000000000000000000026ee9ccb5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5000000000000000022bcaa1d08 -080808080808080808080808080808080808080000b5b5b5b5b5b5bee7a8 -160000000000000000000000000000000000000000000000000000000022 -bce2bbb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000000000001 -67da5b080808080808080808080808080808080808080808080000b5b5b5 -b5b5d1e15500000000000000000000000000000000000000000000000000 -0000000167e7ccb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -000000001eb6aa1d08080808080808080808080808080808080808080808 -080000b5b5b5bde6a8160000000000000000000000000000000000000000 -00000000000000001eb6e2bbb5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/south-africa.gif b/Docs/Flags/south-africa.gif deleted file mode 100644 index 3ed8559eb2a76d0f816d03328cd35855f9145fa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmV;Q0bu?|Nk%v~VITk&0Hpu`0001ohXB3309jMZW6}V2)pn|=;vE*d4h{fC$pB~3 zXYAtL=-}BJy#QHR0N~&NCch>gy&m1->*VDC0kr`DwE)*sRFIGW==J~z0JWRq00g!G z#_Gn};pevIwx{B!aMl1?RLsTz0Cd!J=clJ`(r)VE+u8I03kv`fy8zGe09#eeE5Iuv zz9QS<={d##1-1nPwgUpT0?HN^>-7NFR8*+u00*}KP*4ED>A|U|;=Jd)C@25{wEzGB z0RR92EC2ui03ZMs000KWK!9*aEE_$x(9zP< zet?2(gc2bc+}+;a8A5fdc{&H+=-z5~ZZ6yD@ZkV=WCrK)@L^dB9V__w`k2`J2M~$D JgGGV>06RZwvy1=$ diff --git a/Docs/Flags/south-africa.pdf b/Docs/Flags/south-africa.pdf deleted file mode 100644 index 6b6286a779457f751861ec1be0bcf065be891418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1151 zcmY!laBK)%@PkIm zwIJ{J_t`h?{AQG!yJD+d&AxxG6aD-9mrh*za{k<(cWuK`_s-pUKdkqy%{KF|+nca& z%FX7@yzVnapVST10S)pyR%D* zBZ?LDy)#pa6{5L7P7LCTRREe$3bfP^Nvk1TD^#a*Vo737emcwuhyxK;86ngI9hy>_ z49r;??tY;P?iu;TCB?}_nFS>ZW_qTEnm|jS&Z{U&P2)09Fy}IW0|hfvQ)5$wGzFNL zg)uN_K|mo7A!Y$|IGUKbxjBZInF*#|14CdSq3Ja5S_CXD6!e2Lt5Oxr q6@amm4-6epU;zU@FD+jI7)&s_N?R#svTfPqpR% diff --git a/Docs/Flags/south-africa.txt b/Docs/Flags/south-africa.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/south-korea.eps b/Docs/Flags/south-korea.eps deleted file mode 100644 index 8147ce78acf..00000000000 --- a/Docs/Flags/south-korea.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: south-korea.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f0f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f6f7f7f7f7f7f70000f7f7f7f7f7f7f0f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f6f7f7f7f7f7f70000f7f7f7f7f7f7f0f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f6f7f7f7f7f7f70000f7f7f7f7f79f58d5f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7d05ac3f7f7f7f7f70000f7f7f7f7f79f58d5f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7d05ac3f7f7f7f7f70000f7f7f7f7f79f58 -d5f7f7f7f7f7f7f7f7f7f7f7f7f7f7d05ac3f7f7f7f7f70000f7f7f7f7db -43435df7f7f7f7f7f7f7f7f7f7f7f7f7f54d446ef1f7f7f7f70000f7f7f7 -f7db43435df7f7f7f7f7f7f7f7f7f7f7f7f7f54d446ef1f7f7f7f70000f7 -f7f7f7db43435df7f7f7f7f7f7f7f7f7f7f7f7f7f54d446ef1f7f7f7f700 -00f7f7f7f75a4344dff7f7f7f7f7f7f2f2f7f7f7f7f7f7c660447df7f7f7 -f70000f7f7f7f75a4344dff7f7f7f7f7f6dddcf6f7f7f7f7f7c660447df7 -f7f7f70000f7f7f7f75a4344dff7f7f7f7f7f6dddcf6f7f7f7f7f7c66044 -7df7f7f7f70000f7f7f7f7d659a7f7f7f7f7f6e0cbc6c6cbe0f6f7f7f7f7 -7261d4f7f7f7f70000f7f7f7f7d659a7f7f7f7f7f3851a00001780f2f7f7 -f7f77261d4f7f7f7f70000f7f7f7f7d659a7f7f7f7f7f3851a00001880f2 -f7f7f7f77261d4f7f7f7f70000f7f7f7f7f7f2f7f7f7f7f6d4c6c6c6c6c6 -c6d4f6f7f7f7eef0f7f7f7f7f70000f7f7f7f7f7f2f7f7f7f7f246000000 -00000044f2f7f7f7eef0f7f7f7f7f70000f7f7f7f7f7f2f7f7f7f7f24600 -000000000044f2f7f7f7eef0f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7dc -c6c6c6c6c6c6c6c6dff7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f77a000000000000000080f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f77d000000000000000080f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f3b9c6c6c6c6c173598ecbf7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f311000000000000000017f5f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f62000000000054f683517f5f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7d2abc6c6c6c6490808086cf1f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7d000000000000000000000d8f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7ed1a0000000078b5b5b556d8f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7cf5cc6c6c67c080808081ef0f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7ce00000000000000000000d3 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7ec6500000046b5b5b5b5 -a0d4f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f113507544080808 -080825f6f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f10b00000000 -000000000bf2f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f5b8714e -7cb5b5b5b5b5a7f2f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f76e -08080808080808086cf7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f76a000000000000000065f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7d1b5b5b5b5b5b5b5b5cef7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f2f7f7f7f7ea3408080808080830e8f7f7f7f4ecf7f7f7f7f70000f7f7f7 -f7f7f2f7f7f7f7ea2d00000000000029e7f7f7f7f4ecf7f7f7f7f70000f7 -f7f7f7f7f2f7f7f7f7f3c1b5b5b5b5b5b5c0f3f7f7f7f4ecf7f7f7f7f700 -00f7f7f7f7d85f9df7f7f7f7e9690f08080e65e7f7f7f7f7845bd7f7f7f7 -f70000f7f7f7f7d85f9df7f7f7f7e9640800000660e6f7f7f7f7845bd7f7 -f7f7f70000f7f7f7f7d85f9df7f7f7f7f3d0b7b5b5b7cff3f7f7f7f7845b -d7f7f7f7f70000f7f7f7f75f4650e1f7f7f7f7f7ecc3c2eaf7f7f7f7f7ca -78486cf7f7f7f70000f7f7f7f75f4650e1f7f7f7f7f7ebc1c0eaf7f7f7f7 -f7ca78486cf7f7f7f70000f7f7f7f75f4650e1f7f7f7f7f7f4e9e8f3f7f7 -f7f7f7ca78486cf7f7f7f70000f7f7f7f7dd534961f7f7f7f7f7f7f7f7f7 -f7f7f7f7f6504671ebf7f7f7f70000f7f7f7f7dd534961f7f7f7f7f7f7f7 -f7f7f7f7f7f7f6504671ebf7f7f7f70000f7f7f7f7dd534961f7f7f7f7f7 -f7f7f7f7f7f7f7f7f6504671ebf7f7f7f70000f7f7f7f7f79659d1f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7d359bff7f7f7f7f70000f7f7f7f7f79659d1f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7d359bff7f7f7f7f70000f7f7f7f7f79659 -d1f7f7f7f7f7f7f7f7f7f7f7f7f7f7d359bff7f7f7f7f70000f7f7f7f7f7 -f6eff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f5f7f7f7f7f7f70000f7f7f7 -f7f7f6eff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f5f7f7f7f7f7f70000f7 -f7f7f7f7f6eff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f5f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f700000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/south-korea.gif b/Docs/Flags/south-korea.gif deleted file mode 100644 index f9a74adc7320ecc5da829cfa5f50fb6ae0ef3f84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 669 zcmV;O0%H9~Nk%v~VITk&0LB0S0001|r>7GOxWNDgpP!$dot;?#Xzzf7Z>*S_CrHM^z`)d^70-4px=Oi@bK{N?(W=red+1*?Ck6a0JTs6aoE_{*4Eb4 z)YNQc&d|`%L;!rs%F4#Z#_H+8!J8uRn^;o;%m-{0Nc-P_yS*Vot8 z)z#C})6vn<_VV(407k>Z!wv?w_xAR`zrWysfLs7&)J8@C0M!5h000000000000000 zV*mio000000PX+)Yybc$006uI00961{{R5^004Uc0Gt2-jsQ-`EC2ui03ZMs000O6 zfB=GngoTEOg;R=)jE#+9OJk9Xf#4-jWSA93$Xx2PLTvDPq;MV@gT{J zMlpg!Inr~A7YrLBs8ZzNi4+D|noh}aVa!xTVlJdv*~r6{ud6VzL^~Cc+qVOT0s#O! Dhg>)& diff --git a/Docs/Flags/south-korea.pdf b/Docs/Flags/south-korea.pdf deleted file mode 100644 index 877d792caa81742c81756e4090583c24e93958a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1444 zcmZWp3rtg27%p{a?iOLz@MZ#SoE%n$!@Xp@3#6 zLS+E?buPgx%yyhFK(Xj^?rH3U9#L~GReONH3cXM-FQ-O*v*ySfRRppss9;JWGSXQL1VCq_1iR5JOQ1@9| z_iE-~V`F+)80X5=roErWnV#;xZ?#z(Tsqrtdo_RMm#I*cw72I-Mn*;ucZ|onB)3>I^{Nv=@H8R+P zY4vNktT6cn%!x+BM>no=PbI}?1_mq0%cT#}3rYjd`f4LCjQNi5_I+~e`^;6}VQEs; z_QbxgYhB&;gAAG}KKy*NMqmOQ9T@8Vgx)@G7Ca!dKP za@)Xcj0rKTirut#@y>MN?A2*3+awWpe*RE&cWuVL95m>ccluWwjYh6dNa6hHuC9se z*ZBbffIok4xbe{aOM}%ROV97Tb8@h+Z_V5OzgXMWLo;{#@YqflHSLnlW zZ=SI<(z&^Db+W|R*j2yE)4T0mdmaUzwpwr8zB^59uD)3K{K>_<2mGBEnwp!3CMHTP z`?D+!RaI4Ayqxpc;TcyeE#2qJIp_6zT9c2#V940q+tYKv!i6=6_^qD9fdK(ltM$kk zj_d4r=kU#&)z#Hnm1^Gy$0xW=$BMk)T)A>(Sz83>^bPG5^H8LJ(#ISt*Tm)UQbOJX ziWry(5&_S0IEOH5oLWLBR)4JO*j*+P11BVQLP!MLcI6OQf+~x^;*c6t;bcBcWtAt9 zOQ1|FOaqvbWROrHj-n{S$UqUgRU(+6$vjF;&<-V$>Lh|m#gGF)EXIJ!MWnIfL8>w` zD2axw8z@=GNrA2M${nDC19Xs}A@+$*L&H?SQdEL8h$`fvrh;XutTi}|g=LRIRE$bb zX8m2_6~Wi7SjTY2Cs3p&PmSE?{pk2)7@bYh46UYgISiEYC4!BpiIZMFMQ8yIg8}}} zf>Mb@B!OD!!~_DN3_5P1@ii8V#?7u}7%r9n7sKVE|K;Mi01fHixwu@gESI5FIz2%l uM}=6DZZ`pgk<*bRnhrZGGy}5DI0$-(Rsc3j75)Z!Ze~ diff --git a/Docs/Flags/south-korea.txt b/Docs/Flags/south-korea.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/spain.eps b/Docs/Flags/spain.eps deleted file mode 100644 index bd318f2160a..00000000000 --- a/Docs/Flags/spain.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: spain.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff0000fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc -fcfcfcfcfcfcfcfcfc000000000000000000000000000000000000000000 -00000000000000000000000000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000000000000000000000000000 -00000000000000000000000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000 -00000000000000000000000000000000000000000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000000000000000000000000000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000000000000000000000000000000000000000000000000000 -00000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000000000000000 -00000000000000000000000000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000000000000000000000000000 -00000000000000000000000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000 -00000000000000000000000000000000000000000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000000000000000000000000000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000000000000000000000000000000000000000000000000000 -00000000000000c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 -c7c7c7c7c7c7c70000030303030303030303030303030303030303030303 -030303030303030303000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/spain.gif b/Docs/Flags/spain.gif deleted file mode 100644 index f5ad336b00d0be02fa04accc248c05530a94ca13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmZ?wbh9u|RA3NeIK%(~|Nk%?V_-PW%<%s|kjKoxaDjnggAParq=tbxkYm@Kf4(O? zSMLpacy{@_1z%g27))Crv?k~Ez7MMeN^&@y-Qt0 geeNxh<~3!f-&Sn~a&(SOIIYC6i#c<*EGL6C04oDDKL7v# diff --git a/Docs/Flags/spain.pdf b/Docs/Flags/spain.pdf deleted file mode 100644 index 2606d779597c8b711478febe59b3edf5d2bb3945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 809 zcmY!laBr#oq%Lnzpb!SVdZBmn6GhejwfYR#+T-S~!@$C|OUbAIq>A%muc2mA9-BO&< zn7DoV9*gO#mpdthD~L0s$l27V=A}S=1Z06i0pxcOZDe4;1r;(u1W-t2L8^X0VtT5+ zZ)!?rqEmi_LbL%;+SJli!NSBSmPS|1n>3i_V8K;xWaxqxA-@0_1k0@PHj0E&|!kPy@fAX6Z5q@WLSg96wQ z#R~e~nJL8z(Oe)W264qI08Ja~Z&af|;qQv8h6u0!+-r z66i<}P{@OenVJA?LlZLr>OvPYHo(+tV2G*C$O1{Mq$n{nC$$Ket`+oyGpkY+%oTvK nlMf6XP+$QAJ})g_0pwe7Ko^%J7L|bgVQOi@rK;-c@5TiH?&$k6 diff --git a/Docs/Flags/spain.txt b/Docs/Flags/spain.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/sweden.eps b/Docs/Flags/sweden.eps deleted file mode 100644 index 18a7c8765ba..00000000000 --- a/Docs/Flags/sweden.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: sweden.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000808080808080808fffffffc0808080808080808080808 -0808080808080800000000000000000000fffffffc000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b500000002b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500000808080808080808fffffffc0808080808 -0808080808080808080808080800000000000000000000fffffffc000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b500000002b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808080808ffffff -fc08080808080808080808080808080808080800000000000000000000ff -fffffc0000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b500000002b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808 -080808fffffffc0808080808080808080808080808080808080000000000 -0000000000fffffffc0000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b500000002b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -000808080808080808fffffffc0808080808080808080808080808080808 -0800000000000000000000fffffffc000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b500000002b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000808080808080808fffffffc0808080808080808080808 -0808080808080800000000000000000000fffffffc000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b500000002b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500000808080808080808fffffffc0808080808 -0808080808080808080808080800000000000000000000fffffffc000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b500000002b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808080808ffffff -fc08080808080808080808080808080808080800000000000000000000ff -fffffc0000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b500000002b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000fcfcfcfcfc -fcfcfcfffffffffcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc0000fcfcfc -fcfcfcfcfcfffffffffcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc000002 -020202020202020000000002020202020202020202020202020202020200 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000000000000000000000000000000000000000000000000000 -00000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000000000000000 -00000000000000000000000000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000000000000000000000000000 -000000000000000000000000000000000000000808080808080808ffffff -fc08080808080808080808080808080808080800000000000000000000ff -fffffc0000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b500000002b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808 -080808fffffffc0808080808080808080808080808080808080000000000 -0000000000fffffffc0000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b500000002b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -000808080808080808fffffffc0808080808080808080808080808080808 -0800000000000000000000fffffffc000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b500000002b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000808080808080808fffffffc0808080808080808080808 -0808080808080800000000000000000000fffffffc000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b500000002b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500000808080808080808fffffffc0808080808 -0808080808080808080808080800000000000000000000fffffffc000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b500000002b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808080808ffffff -fc08080808080808080808080808080808080800000000000000000000ff -fffffc0000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b500000002b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808 -080808fffffffc0808080808080808080808080808080808080000000000 -0000000000fffffffc0000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b500000002b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -000808080808080808fffffffc0808080808080808080808080808080808 -0800000000000000000000fffffffc000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b500000002b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/sweden.gif b/Docs/Flags/sweden.gif deleted file mode 100644 index df7151b5aa86255a8617211b3ad0cb8af9668fc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmZ?wbh9u|RA3NeSjYeZfBrCWFl_z*pFs!21Bo**#kBOVoc-v18_$MY>FXvmznULA z=X>lz(`mONm##YM^p5-Jc^~UClc%Nv99+$F&VA_Mk?K0L?DNhVujP|8zMi_1TV*Hf h(0n@c@D{`E+3!mBKG>}9TUGCxXZX0!Uxb0d8UP!BI5q$P diff --git a/Docs/Flags/sweden.pdf b/Docs/Flags/sweden.pdf deleted file mode 100644 index 718d57600fd95be3c14f14fe8bc39bac2e4aa9c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 837 zcmY!laBq43YGf6eVWnq!t0wyn=pkW>u(CO>(g#Oo&f)jp`8?$O?3kL?m0F7weVx}o{ISd-uXinv=bK`&fB#p=d~WZY zUw`iY|M!pWUs~myeiFcaPqcJ_qszSIk3QUydMC`&-fws|DQSjchWfduuT~125Iw=l zFhki}J2fu_>S-Vg6i}ex0ntXrrd&`V6GRw>R2HP_2PCGa>iedqWF|W0S13dq0HsYW zO%*ImjAFU;gYrv&A*x^iR8^FkSE67H3T~iqYH@yPQF3ZAFd_nq@{@y8OQQ9GQKg{o znF}<|IhG3;{QA!Mc_lzi#R{Nk3jzs2od7Zg5{(M_AU7z09Z{^H@12=atPsrwa$*oy ztOC%4QlO=VNLmfyTA@0f6H5|v^3!2PKpcp$$_Swz=+KnXWMDGUaQ6#UaL>puE-6kf z$}A{RFw-+N)C5`rbzVhLY8sb;f;pD~94MHXni`ubq$$9}OpPoRz_JQ?2r+YW3^5aP zV1R-Ek~(8!OuYt%z(7J*XN07;q$n{nC$$Ke^cD1jGpkY+%oTvKlMf6XP+$QAJ})g_ b0pwe7Ko^%J7L|bgVP<5>rK;-c@5TiH0q+n9 diff --git a/Docs/Flags/switzerland.txt b/Docs/Flags/switzerland.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/taiwan.eps b/Docs/Flags/taiwan.eps deleted file mode 100644 index a57a8242464..00000000000 --- a/Docs/Flags/taiwan.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: taiwan.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000080808080808081108080808080808c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000900000000000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b7b5b5b5b5b5b5b500000000 -000000000000000000000000000808080808470e9e0f470808080808c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000041069a07410000000000 -0000000000000000000000000000000000b5b5b5b5b5c6b7deb7c6b5b5b5 -b5b500000000000000000000000000000000000808080d126289b28b6013 -0d080808c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000060a5d85b087 -5b0b050000000000000000000000000000000000000000b5b5b5b6b8ced8 -e4d9cdb8b6b5b5b500000000000000000000000000000000000808080aac -9df7f7f7a0aa0a080808c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -02a99af7f7f79ca7020000000000000000000000000000000000000000b5 -b5b5b6e2def7f7f7dfe2b6b5b5b500000000000000000000000000000000 -000808082759e8f7f7f7e85b25080808c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c600000000002053e8f7f7f7e8551e000000000000000000000000000000 -0000000000b5b5b5bdcbf3f7f7f7f3ccbdb5b5b500000000000000000000 -000000000000000808082858e8f7f7f7e85a26080808c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c600000000002052e8f7f7f7e8551f000000000000000000 -0000000000000000000000b5b5b5becbf3f7f7f7f3ccbdb5b5b500000000 -000000000000000000000000000808080aac9cf7f7f79faa09080808c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6000000000002a999f7f7f79ca701000000 -0000000000000000000000000000000000b5b5b5b5e2def7f7f7dfe2b5b5 -b5b500000000000000000000000000000000000808080e136487b2896113 -0d080808c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000060b5e83b085 -5c0c050000000000000000000000000000000000000000b5b5b5b7b8ced8 -e4d8ceb8b6b5b5b500000000000000000000000000000000000808080808 -480e9e0f480808080808c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000042069b074200000000000000000000000000000000000000000000b5 -b5b5b5b5c7b7deb7c7b5b5b5b5b500000000000000000000000000000000 -00080808080808081108080808080808c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000900000000000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b7b5b5b5b5b5b5b500000000000000000000 -00000000000000c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000002020202020202020202020202020200000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/taiwan.gif b/Docs/Flags/taiwan.gif deleted file mode 100644 index 379afea61ce49be0cc27dc76cd2a5ab0d3f8f18b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmZ?wbh9u|RA3NeSjqqbTuj@dLeB_u?}!XOJ!j@Ue)jEZ@_Rj;j=y;EdG4%x8VdW= z74{}XpY3kH$-%I-z4^wx+4lrFxAU@Y<7C__%(G*`ocqTZ7*;KRGS$_R(lV_ap$a#AL)0;BU4JiUbCGwoo z8kJQ+`P|A4C7ev`ZSCUuQVOh%iV`9d+w;|#Wd+n^FBQGCsv+1J@?4D^A|5&&OLjz`bM6|ox84%4Aubb(1Tw9 diff --git a/Docs/Flags/taiwan.pdf b/Docs/Flags/taiwan.pdf deleted file mode 100644 index 013b5c16d9ad5acc188fc9fc1bcdaead6ec9d3b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1050 zcmY!laBi4_w)OI-*Uaw-fl(oN6(!Z{VK=zs~+skYBJ8 zzl?R+lPj8>oO4sN{d8licl~(3`sJnT-=E+6_2Jd7{nJ(pcDJ%FU-NbO5og7C{pS|wLwH9q3>j>Wn$$7`O zbrkQc(qbuMEn;N2Zn#b>H7^Akg+LZ4+Ch;GqD@Q;xu8NOh!hc0S&*t9keHsT@0*&E zndp>Xp%85Vls2_ARj@EIisjM|$}a(?4+R6Ds-o1q5(Q&W;sFY$7U!21C8rhxlT|=b zesXYXNwhvN;VI~Q<^qj#j^zR-CVl7pyb_?MVg*nl3<3#3od7Zgk|-7QL2gh0JEB-Y z-#asb#1g)HE&w1#>O~I8ZP%H8nO>NK=4`nFD!X zS%o}=m<7;w5I_<$GY3WinwY5xrd|U>Ofgdfw1>TKdVnZ^kEl|Ni~m zsZ*!K#GWr*dat75T42!K;^HfAZVU{JVB3HMGnjpVfx(1eK}cX}K= J(G&A(cBh|2to7Y@p#@`|4Ha^X;ys?YGNI zn#QU8y>H&V3!k=^n!m4$-Lm6m+Q;K7nBAv^?A!He|G)Y;mzIO`@4wr6M>P9dOHF;a zwAi1@%VmZ4)7o3OPp9Ue|MPQmU483gyKAnKjC=oGt1Gw4nO?rx{rQ|}>(-SjU2ctk zGk5Oi)A#gl9oJG;HO+i|jagqy|K9J2Zxdcl&SQ>FczN@3S-gl`?f(zUU!3mz`|yxSlXE7;l=E zmYSCWjRPPH6mOu|0@23i7FiedqWF|W0S13dq0HsYWO%*Im zjAFU;gYrv&5v*VUR8^FkSE67HihZDPYH@yPQF3ZAFkJ)`}8t#6f3ho*C#U;hbMVSR9 z3TAqyhMGW2pw6o(N=@T3P%!5*fCB|HQ&VG8g){}2n3*}yWDrougNvCP0Rs Xa6lKABo>u`{b6nn%*(2-{%%|VqNZb_ diff --git a/Docs/Flags/turkey.txt b/Docs/Flags/turkey.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/ukraine.eps b/Docs/Flags/ukraine.eps deleted file mode 100644 index 1cf43b4b53c..00000000000 --- a/Docs/Flags/ukraine.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: ukraine.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000001818181818181818181818181818181818181818181818 -181818181818180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b50000efefefefefefefefefefefefefefefefefefef -efefefefefefefefefefef00001818181818181818181818181818181818 -181818181818181818181818180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000efefefefefefefefefefefefef -efefefefefefefefefefefefefefefefef00001818181818181818181818 -181818181818181818181818181818181818180000b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000efefefefefefef -efefefefefefefefefefefefefefefefefefefefefefef00001818181818 -181818181818181818181818181818181818181818181818180000b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000ef -efefefefefefefefefefefefefefefefefefefefefefefefefefefefef00 -001818181818181818181818181818181818181818181818181818181818 -180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b50000efefefefefefefefefefefefefefefefefefefefefefefefef -efefefefef00001818181818181818181818181818181818181818181818 -181818181818180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b50000efefefefefefefefefefefefefefefefefefef -efefefefefefefefefefef00001818181818181818181818181818181818 -181818181818181818181818180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000efefefefefefefefefefefefef -efefefefefefefefefefefefefefefefef00001818181818181818181818 -181818181818181818181818181818181818180000b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000efefefefefefef -efefefefefefefefefefefefefefefefefefefefefefef00001818181818 -181818181818181818181818181818181818181818181818180000b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50000ef -efefefefefefefefefefefefefefefefefefefefefefefefefefefefef00 -001818181818181818181818181818181818181818181818181818181818 -180000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b50000efefefefefefefefefefefefefefefefefefefefefefefefef -efefefefef0000fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc -fcfcfcfcfcfcfc0000fefefefefefefefefefefefefefefefefefefefefe -fefefefefefefefefe000003030303030303030303030303030303030303 -03030303030303030303030000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000000000000000000000000000 -00000000000000000000000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000 -00000000000000000000000000000000000000000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000000000000000000000000000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000000000000000000000000000000000000000000000000000 -00000000000000ffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000000000000000000000000000000000000 -00000000000000000000000000ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000000000000000000000000000 -00000000000000000000000000000000000000ffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000000000000 -00000000000000000000000000000000000000000000000000ffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000000000000000000000000000000000000000000000000000000000 -00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/ukraine.gif b/Docs/Flags/ukraine.gif deleted file mode 100644 index 77deda40904f9290f8b241f907658b4ef2a8f201..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmZ?wbh9u|RA3NeSjYeZ5?kN@`N#bKKZ6d42NGvs@@nZ{Ir}01;yLFobk9E<^Nx=# z{zR`z+PsieRSvT^ZeZj1*8BWdp7ddU9Dis O;We+(u@qNE25SI7O)i!I diff --git a/Docs/Flags/ukraine.pdf b/Docs/Flags/ukraine.pdf deleted file mode 100644 index 9731eb218ba33090de36732c18ed3b09a0a9bd97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 810 zcmY!laB3xi}Op1l2eO; z!5mPOpB$W860Hx62nBu5T%d8zv0T8w)pyR%D*1du6^NK()Txj_N! zh++kO@6429g=j926N9*76@Vs`0xdN}(rO6T3f1YHSdy5NpAItu;y{E|MhNvlho+P! z0~3LUyI-h+dq#e7NpW&fW(rS=4PoxJMh3p1rWt+0ho*0xE*Jz{)2b=CIAgq=~4++%KdNQi5PrqVtc(cQ+n2SfZ$ z-O0}v=ieC{eg+&=ObiS_#LB?%pMk-UfkBypp_qXom4V?c1H)CY0yvS(z;F)CdB?zz z!@!`)z_5pbff20n2LnSj1H&8!hCT+r6FMM8ptxXQ|JT6K)ZEhA*51m;qZ-HW6RxT# zAt$XGBWyEs*6cY={(+`;9AV+1&MGo?Ogx4O>(+1B*kl%M6m4J{?HVmFx{FOU=+NOK zN1J@3^mrxsob=eeG~)F_0;R6sxOuBdRnO9$+m|uP-9o_KGgy`L&D(eHn_?tYllb|V zRpZ6vB2>L~k1`28{?_2ZDeLRCMx#;1gHwawYtIaijf-3z)q|$Y_^9C1BE-v6AraW* zB*LT-yeh`>H1h;y$3-`8BrfipsO%?qL*PVkz%)6HI*oz_%&i@q8W9T?Ty$-^ygXnr zm)0dkjt&J@J(it`hq463j23mZYIQ8Xx%n{5+L+VZ)_OS_i#S{K>t{c0?GiU;@bi&P6H7u4MQ4?dX8qGP=eBElf_K2t{ilx8FU1Q zSYjM3Y3gcRt?nxdIC1O3X3NNGpSZ2B_4)0Z)ziQBRk8O0YpbvSyayq9<@a94zq>5T z)BFnM=cfy5g;TsYgsXf#{dJ7?qW50YorBa+%FGpOu-i+FXOm0ct!No)dTyK75;P&c zhDqAj{Y;yZYUeD1umF&@HOS#O?rduO7b58dg?#DKV@BcV>qovqqS!`RdJnNd*6TA7^&4lh8 zN9$*y!|m-2!3TY&H0D=L7>ei}Sv0I~57_y`)6z>tKHI&$87tdJ)dx7sLYlV>hfGVF zuW)2H-pe_er2nN(pH`OwC(57pHu^bY57C( zoi~baUEbRj*1pVsG^o=y*y2B`fz8g+jp}bEMmij0OY@2prcT!8r2bsrT%VNQowBgf zZeBRT$!sUTT2r^VO@4K1ptWb!3dX1ZaL$u}wG*_pRDKho4QTZ^>!*yb?#K-ET5!K& zcbnpst4D|(CfQph8^V%4wR}>fj{tKQ58bMRUgvJ?POcSqmnR?jCF^>2CF5iZKi~Fz zSmf+GgIJVyMa$W~FXUGFiLbMR3j&YLsF_ujuIa!(N~^rrGjep{_S-=}9(dpLK}pl- zqDl5ne3ej;o6TR~95-$k8Y{ffhV4jg$!AKuz5A zN*J;L;4li{|12n#NJJ7?0Nt2SNXVe;7E&*{VH9#Ynnu&%hlK`D70{4>t!vOMr(-zRJA?!w0|J3ktpa}m DUOf>R diff --git a/Docs/Flags/usa.txt b/Docs/Flags/usa.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Flags/yugoslavia.eps b/Docs/Flags/yugoslavia.eps deleted file mode 100644 index 221d510451d..00000000000 --- a/Docs/Flags/yugoslavia.eps +++ /dev/null @@ -1,98 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Creator: pnmtops -%%Title: yugoslavia.ps -%%Pages: 1 -%%BoundingBox: 290 385 321 407 -%%EndComments -/readstring { - currentfile exch readhexstring pop -} bind def -/rpicstr 32 string def -/gpicstr 32 string def -/bpicstr 32 string def -%%EndProlog -%%Page: 1 1 -gsave -290.64 385.44 translate -30.72 21.12 scale -32 22 8 -[ 32 0 0 -22 0 22 ] -{ rpicstr readstring } -{ gpicstr readstring } -{ bpicstr readstring } -true 3 -colorimage -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000808080808080808080808080808080808080808080808 -080808080808080000000000000000000000000000000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500000808080808080808080808080808080808 -080808080808080808080808080000000000000000000000000000000000 -0000000000000000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808080808080808 -080808080808080808080808080808080808080000000000000000000000 -0000000000000000000000000000000000000000000000b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500000808080808 -080808080808080808080808080808080808080808080808080000000000 -0000000000000000000000000000000000000000000000000000000000b5 -b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b500 -000808080808080808080808080808080808080808080808080808080808 -080000000000000000000000000000000000000000000000000000000000 -0000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b500000808080808080808080808080808080808080808080808 -080808080808080000000000000000000000000000000000000000000000 -0000000000000000000000b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5 -b5b5b5b5b5b5b5b5b5b5b500005555555555555555555555555555555555 -555555555555555555555555550000505050505050505050505050505050 -5050505050505050505050505050500000cacacacacacacacacacacacaca -cacacacacacacacacacacacacacacacaca0000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f700 -00f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000f7f7f7f7f7f7f7 -f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f70000d7d7d7d7d7 -d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d70000535353 -535353535353535353535353535353535353535353535353535353000054 -545454545454545454545454545454545454545454545454545454545400 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c60000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000c6c6c6c6c6c6c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000c6c6c6c6c6 -c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c60000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -00c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 -c60000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 -grestore -showpage -%%Trailer diff --git a/Docs/Flags/yugoslavia.gif b/Docs/Flags/yugoslavia.gif deleted file mode 100644 index e1dd52a0541f4c5a9b6859127b10c5702b4ca7db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmZ?wbh9u|RA3NeIK%(~*Mmbi7`7f`U$PnG9Wb!%uyV>?)>vT z;kkNm(8IIK-!1ssy2N1GgU%wZhx-b2&aVr)Q?c&-pWN>U7VsC7VG}XQLsKae}6&K%Qx3@ z*bQeM6}JEMp~bf%q;#pLLF2{g6CH0xde1q1HCSj ztN@CqAdnE$2_RD-@ur{;a)Scc5ycAn-kB-I3ej93CkAoFDgaF=1zKu|q}33v6{^!Y zu_Q4kKOJTS#DNH_j1cO94oxXd2Br%QcfU{t_l*4FlH%l|%z_dHGd)v7O`s)E=T#J? zrg0f4m~$Dxfr6Q-sj;a-ngUGB)DY-M5KzcNh?xOxLlZMG1$rJ$%-9H1uYn;Jbp}Xc zB}IvuIjKd!w635ZoLQBsV6Fg+oqS;EfC38`@Of$Z3LxKt1G=~*v8V*>4>Lm(E>%@m He>W}wTKWgc diff --git a/Docs/Flags/yugoslavia.txt b/Docs/Flags/yugoslavia.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Docs/Images/Attic/html-fs.gif b/Docs/Images/Attic/html-fs.gif deleted file mode 100644 index 73f9ab5bec6d5c1ec6c148313343042a37b69e3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3349 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 B)SdtU diff --git a/Docs/Images/Attic/mysql-01.gif b/Docs/Images/Attic/mysql-01.gif deleted file mode 100644 index 773453f8dd7a99ce553c17412326bbc626254ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4097 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 X6*_zE*l=xYm>QB?K0X|bfcXCf7+Sc@ diff --git a/Docs/Images/Attic/mysql-02.gif b/Docs/Images/Attic/mysql-02.gif deleted file mode 100644 index 12d984b55e0e4d7bd793e1320f7492edae882f95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4811 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 diff --git a/Docs/Images/Attic/mysql-03.gif b/Docs/Images/Attic/mysql-03.gif deleted file mode 100644 index abb16f2aa592021a54f84b63e246854522708757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 716 zcmV;-0yF(bNk%w1VORhk0JHx9|NsBq-rmN>#*~zlLPA0zAtAl3tM)Qp#wa zC|OEE>%MR-&vb3y@1U#!?z6GpPayQ!bUdRBC;%J|1{VM@&<%)1R{#*G?q<{QG#f)s zlrZko01zY)(XC=ZuPX|KXsb=A`xSabbAEIMG-ga_TL=jWY>Wv+0E2{uQUi4bcYXzd z0|kTx1cy6kI9mgHU5yA%ta5at1ATQ@O_;GRpqYUJgh!=`FI!y(iwRK2jscKS2fL#! zo6!<}wk@GAzcq+tQU;9!u5UyGtmCZ+2!5kIpL&yiFtl}n+oVY?TLx?ajR^z%H9FAb zz?%Tz2AVTaiNLiz_gXOg<07JrZu*=cIKYgR0Z0h{ntVhiun{Pjrw)v+HnL0*MaHT9@i%_os^cEO`SqE6Yj&R;En#!n$x&t7=P1QrGAyYal zUv!P;D<-}(5(WbO=SZz10ay_P$Qcrgv|WU*ywo?gqS+Z3=i)?`6Inu&F8Bf9x#y0a zS$SP@f+2K4*s@J!CK24z0A0ZYVWfQ%rH!S;c%yV(a4kSrduFLT6cE_lD@X)CZj4b= z5+_^n==jYfg&tYV!fz?1JX1iFe*v#1?xkgGi=<%r)pD`=3Kw4bkS`zx>T(N=Eq+eN z!HA$l?1anHfRKOFc`3jf*!iiVTmZhRKS3B5D;O5C#G29H3q=9)PFI`s3T;#c$lM( yIx65Iirr*rh%3ne diff --git a/Docs/Images/Attic/mysql-04.gif b/Docs/Images/Attic/mysql-04.gif deleted file mode 100644 index e207e1790f75fe447abd91582ebab6b4575c7174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 909 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íKr!=k9>?2DRS5%5y17|Ga&^rqq zV=03pdBOg#@J7)+vnnvuQHMk5;{z2=w2q!VyzZOmZr4<+Q`RHu0!2qo|8Zhyf7a(; zP%{epTg|XwMXm8@EY{|dkeRQM$Tj87)t$j0M@s}jzCI@nBvi#$Jsl4&Gr%TQvw^8Sa z)HfnY(&q4x!$A5FSm5fG+?;=hNeV^^Lt5%B5v5z}a(db$vyqx&9e%D!ylN|yuaWF_ zeBIzIi@dVCZ^wKXR45;icV?u>`KhGFy!>eC;-Z=*rGE9vKP3ee0Y^xEJA{u^u4vA) ztQA*K^D!31#qq%?NcnZhpNf5V?U~q-{dC#;pGAb8>M97A=TWIGelij^$0hblVSz)QmTBMsAD$b!9OhX?aJS!cuSw=6Li2QW3r%O1AQMptVxM_0oRNb zz6j_^NKvi75-^MQOG;)l4Sk;1M!#5<}6WMEA&p6Xrw%7!<#<Ff?OQ2j{# zK5<}PcQV?$6spJ`qe24znd;vb=+mN$e2km5TZbPs-Fn3;k6z5)sU2;4uxnMq{fnFS d509Rme|13vk}v=O diff --git a/Docs/Images/Attic/mysql-06.gif b/Docs/Images/Attic/mysql-06.gif deleted file mode 100644 index c660e1d1f4f464fedcd6877e3a1705166bcb4552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3082 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 V*O`E|KSs~p|Jb~xf(rlv{{`JJy08EM diff --git a/Docs/Images/Attic/mysql-07.gif b/Docs/Images/Attic/mysql-07.gif deleted file mode 100644 index be309d0de1cead248854a8455717d8b2056290cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4209 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 diff --git a/Docs/Images/Attic/mysql-08.gif b/Docs/Images/Attic/mysql-08.gif deleted file mode 100644 index 3d5b21356550d20e4bca9ab61a0a7f1f1027bec8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1595 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 diff --git a/Docs/Images/Attic/mysql-10.gif b/Docs/Images/Attic/mysql-10.gif deleted file mode 100644 index 8d0a8551e9ef877cfad151deab5dd906eaaa938a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2455 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 diff --git a/Docs/Images/Attic/mysql-12.gif b/Docs/Images/Attic/mysql-12.gif deleted file mode 100644 index b045aaf3549454b8cc5b158da1a01b241db65d71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 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

J6+X&7t@OFUmsWLSrk+6f+sfF!h;+GP0w zsL-quG}vCU60l^z-akjawina-ye}nytmXRwX#27**z|mPWLtXA;wbkqEzBt?BD^a; zan2zuZ%_DUzr?f*2lw1A?zH4V-1)JvH8+wszs@<9v*S}r?m*eg$5*#k8a|6!$!t4# zVr;)v>-f_Xzq);l$23|p7w18k$}T7rXHI2Wc{wCS-M1D@IOiwK6$a&BJu0y12t#&H zIw!fE_~j36UEz!>RFcC7bKaCW1`&WL^=E-TgxkSkT`N=A%#x(9W?Zp%jGHwH$O+urF;TU z)N(b;FM{6G3fFQ`@H4G0Uyy2%(hRQ5F3@7Haz_wGXQ!ulI_MNRbnWN0<^FS9=wCh{ zAJDSIUQSEF4~I@0S&zPX(Vi_yt=t0fI3`J5yc9TT8Sy6 zsP%j$fJqDWBnkEOc1^GSQBA$&N;pX{cnO}7)gavjtGwV1E`bBg%HBg~8-^=?oZJ`T z4wzM8zJsf6H#PZaS66!#jM&bIHq)XaLh^h{=@JnG8K8v`S()*3u-KZZA&mQ!-b<-# zuU7x~;q3v1gMBQpkS)vSqgu944C(T}U%s#;Z3#wq#|T}(p_Sp54@^VYNPW$;9az=M zB1DdsxV>zE_O`NJ?~RsicWOA@b8)A_Q@xekYwPG2LmmY^(&N=lZj#}}`E@^h^`3py zUE8(;+H*bfp=h78afh2+6r4(JZ*EbDNAhKA%Ytm0cx7r;a06?@tFfKVEv>IYrHM~U#vQfFt%cAj=dK4=)@Kxd!M+gfa)u?|kg$0C zm>1rmIqyK!A7>$vSIMDpI&Z!2w9S!#wEYChzqYRI|3Uygzw)-rIUM`dxH;ojKIMk! z{KjLAQF{X{5a0fwS%p2=1NFQ5c8c{O<+g9f>y|DGt<}0M^dmP)oOP~*J16t#H`L0b zHh=X7WRL{%W!srDI^6i6wiqz*ZeISk6*bn!&(lNqtEOuF;RE{<3xBujr-ybJoUd^M zj~wK^Dko$~)UPk)QWoJSg#2uOd>q~*Z$LsSlGzGzU~SGl*`guLCV76zc?mDs(u|9B zC~KJLn-M#GvC^MhVON+fO9a&DvTGt_n2|NcUB(VOuG clBzZQ{sJR`W>YBZbC0;c$V^BJ#^FHF-{WckVE_OC diff --git a/Docs/Images/Attic/mysql-15.gif b/Docs/Images/Attic/mysql-15.gif deleted file mode 100644 index d70ffec83ddcd1cff6c0791dc5c882b6c89b2a4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 zcmeH{`#;nB1IOQ+S)Va%=Cbm21j2k_u-S#YQIN61k_V%_WYM5n_o=BUFyl zMY(j$H=QVQX>PS|QKSnelZyI&k8{qy@csGw`r-BC^M}{t@qF#t?djyqJpdfRw{@_- zzP|kV`||P^#aD&m^N&wI6rVnQTKvz_?7J_sb06N!ufATGef9PAt5>h&-=`gyd;bpP?N>*3qZ&d$5T9c?S!zr4TOa2co0jEsyVaYo{MUP7)sIyyS4lEA9* zVLF_2bD$mE>_2E{XGeYHVOzJu)<@WwW`3J<8eU63Fl*vm7((wW7& zp1cVanH{-Q>UBZqXcD^pM)du7BaH^F{U2DE%%ykavc7~m#&Q1~YC(v7{6uTiGvE6i z=`SXJRSeX`VL{Qwhzphn!bU`VvogeG;yu!pMT^OP9pGayGBSfUNy7GUejhK{4R4Js`N=qTny$(La7fn*1Xi#!*6J%b$B)fb#Wch+lV75= z^ne;PO3O%k8q7)EpzYYBFUM=)fRFdx;o8(z1g;h=NQN&f4ceIlCn%1igIjoSctt+f zYX~aaRz^`Y9Uprrwdkmnyl7d3;=` z6Tjy)VACplWdv|DcBek%NPEdrZzxCXu;e`z35_f1hrggqa>03CtONn+Y?!I zc5?8*cm#^v6ZA+o%llx70gjbS|IjiL1fkY?#tHCt^p&F1ebrO_@gr#7pvy8^I7D&3 zlgm{mvZRIa)}-MPx;aak?W+XRWyrC~+kDSyte2EOJ)=Yq&GLzwbQUbyPi9KanQaJ? zn0=FH?oZ}3lAih8{deZAb@4a(Nn6X+>0I5!=@?6V%c^@Ce2J4*n)3WmCZ%3dBd#uV zWF8L|^$#ry0E==;t@Si{uo5xKVvS*+pmHK?99#i&q?Y}K;r z0{IL@w#qs>t&^{%AnVYS^t2|GsiGMrBiaMq$^u(ejGqUZOhdL+@+Ei=Wvok%o-`au zEr6-V#JFp;P3Aa=#OQ;F9Q+VQOd@!k<*XRHM_OQZMDx@|;v58I%)@&(suzND#m!()Y7u7$N zjXvgg`CDJDjtY(IznO;5RW^mwlwD}v5yAp%D-1;C%3uagpR3gWzA-`506x~owqK&B zvte^yc*}IvP&I+wKolgt^tNMMLO8?1pNc|n*?hEmZlPA1-{!?YO{Ya~-RJz~XIDs4 zGruW&>)1_`JF7SV(hrrWe>Z77%(p%QXt2WI0f{126@JX3NS`(!N!}X!jHBua6OD*` z%IXZf&}`2ReUnWo)};kel&S_Dk0Lc-6ZM1~5DX*Shi!?s>-9ZwfNsdg0e+lu8FXg z!Gm$4=aMrTSx|1+8ujkXf@fmpSUho+;@GXz+mZ<_g#8GygjEs~Pi)}>z1REu;J!D@ TPF;U_ofnKb{*?@afo*>Qg%VrF diff --git a/Docs/Images/Attic/mysql-16.gif b/Docs/Images/Attic/mysql-16.gif deleted file mode 100644 index 9b30833dc1dfb09d8bd7d7364cb7947074cdbf47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19192 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 diff --git a/Docs/Images/Attic/mysql-17.gif b/Docs/Images/Attic/mysql-17.gif deleted file mode 100644 index 5b228496b66857accfbe7ef20699d1330aa24c5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2059 zcmeH``BM{j0L8z%*(968xIlm)8CU^JIEss63syUuaF_s9uu&skYY8z{bb>`>yt+wX zCMwPZTQRgzf}@hss%y2HskYsqmUy)hj|Qr;j?^lmlcH7HaZL4}=uf^M-w*H2`^>yq zx{~~Y7S z1uT{jP5TJKt5R7M3K{?p01N;i0va1#3=<56!T_jHU{GKbfwLHJV8EpSi~RtShQXS2i|=<0!(oN|xF>W9U0T+dLQsRD7_7dZxNpS?dS zv&1#cZ{zD?lPVCE7H_&GQz3^HqLX&XHk!90=vhwEXOKLlG03W0F!L-|<6rxz78ntj zZNPuf`s@@I@N)m}6d4d~cqcF24TrFr8#?r+c-qU%{ogit4c~+xtEvT0$|B# zGZ{T6Bk0pel-`;Y4W#stt6>7GbYK1egLu(eVjisD9D9dXxq6$Q-!(hlFK%e|*w#D5 z5hh9aHcM(2=b0EQntro;;>PrA>yrz|Iku9;QN*rVB)a0y!TMj4vVuHuK0VCuFW^`x z9cS3>Z#8mPS4^l44x>ZSMtaG!%af9qB}o%Q$Wz%JET?UgYb zF!|-073L^ql{-rw>|U5AnqfOtYg+7-&TQXBh#s`#^zjM1Ye&z=RbpSCR6u{$7J$Csld$i2v*JC|L}K#oawpEuZwWc2bHH8n|j^Ju}Xcs zvFJL#a5_tu!DsgOY)o?Z!&RAb?CR`{&xLa(1CNLN!sN7BYYUTgyGdKj*mJVFY)N=J zzbh^Ql1kh}JDe>Kazgu5*2*Is&YlY!5;Ff4Di5=_4vog;vA^<*`oX1!!Ne{^Kar)k zL>0M45NU0FCL*N5HgvMp-6KMzvxDJut~6Nv!_R*_Ug{r+?@(6^?|{*8o;6Lvi*nEh ze}t_Ml>ta>!RP0ANU@%5$g-%>vo*Oz2XI|#rh4nkuCMpx1>R?eB_iPz_QAYWrF9>( z>*NmTNo6|JwTWc2gPfi+7vAkzAX{V2{yw+=X4)wm2FS%#~c~6Q18lg z7uFHnOz2S-Pvoo8c>AKPBgU;OMb_I(IWMHYN12Y6bqIPPSEv`n)@?^ikHfNB3Q5I4 z@qoZ3tnlEIRdnyj&Xn;|d_hhMEo#%+1kEJ!ZHhyAH8pkV7PQ(>jb@D-1-z&G)5~5s pzZv=si}!)u=U?nNJ}?FyV>FMj)+1uCG z+2rKr($dt)$;+Iaolj={CIEG#Vm005UfJc$$( ztay2zP*J61WsoQ+-rnKG#mBk1yUNPUwY9g2iHm@Mg2KYYudlI^l9bEK&G7K^zP`Yl zo1LJbp|`iWgM);hpP-qUnyjp@|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0A^r|cVPs_>cWHEJAV*0}Pyj3d0001503HAU2L3=mKtL=SkI1BQ$!t263Dtm5 zFj%kHtai)odcR=ps=+!S5{k5X&2GEj@VI>59<^MD1*5_5`~QG}f`f#GhJY+7czO*E z4-XKBgANXS5t5jhfr*QI5)us&pb`_M4HFHcs1Bf%d=jF352U7*nzw|Ud7cmw501VL zq7V}ivkwy#uo2A6vwX_P5W=|Cn~J-sy_FBCzK_HdkB$wG560fI<>k}X?tQw9pMA#@ z61|bL#NExy&kfNUQFuo%-X2qZNbzxiP(meJtX?r(sBl6gg6<4r+{h6THbx!)STsj+ zTpvdzOJ0(7E|W$;6)g0zP@&HSntUwil-VFA{>}y%G6)??Gy|#$MUx6$DYP4=mwq&C z*l>Zv)D0aPc(^Ka>jn*cDs1>rvw_fFpVCSYI_j)iwN3fNefn_^ps63Q=KZR7ET6nt z`E20Ohi#x zoKyK+c2^}Rfv4-@us8IP3Kn^vktrV-UMsp!1XRGCHa_&Y z&s5{zlh2&G71MOZK`)vOzTHrF!Oo9^SKeoDU_KKb?DpNZdLyCOm3A6;sofP{c&)|O zhgUp>_Sq-rb(U6B5VDs61`jIa(QtpOP}YHD9ZdD%1$(iU;0Ge*M$}O%62(-DqxtdP zP8LW;;{`YEG+6_)c>oAX(fx8#N)%)uPD?BWDddLPSW^L5R+Y681VUl-UM5n7c;7}y zWw2641yL8b7e?u-l7W#A&4O7oOIS{=bd=wspp=2+WCSaBal#n34|7E s=%I)vs_3GOHtHy%Fu)MQ2`Hps>7|%vs_CYjcIxS;pmHk13_$<@JIR~Ti~s-t diff --git a/Docs/Images/Attic/mysql-19.gif b/Docs/Images/Attic/mysql-19.gif deleted file mode 100644 index 38e6691d9c6c0ece27733fc58265a557feb3de30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2607 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 RI47`l2h6jc8xjxz06TPZgYy6Y diff --git a/Docs/Images/Attic/mysql-compatible.jpg b/Docs/Images/Attic/mysql-compatible.jpg deleted file mode 100644 index cce9cf84b91f71734364598b71d8c0f00f774ee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2809 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 diff --git a/Docs/Images/Attic/mysql5.gif b/Docs/Images/Attic/mysql5.gif deleted file mode 100644 index f78b8a17b93e6a6df747887498aace260bc16cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192 zcmWlYdsGu=8pc0jfH4G_V8qczWGD)QR1=_kh|)F;_kaS?Q`uN8Fo0sT3(eNc#%%)` zF5(DYMxZ*Ci;SYj?4lC&cs4X#93pB;1tV?Qh_+|Lx>khh(q-K-7{x(KKzh+c}Q&cs$e7(>AM>Wf;5F z%Gqo-mbEerOVb{b#YP~HyB(-Bdycf2!hq?IfH@G>Ffl-ljO9~$QzBER%^#` zn_6vGtGzgGRjEuU%3zpXr6N(3#V`s*tr%uN5E?~oLLb8z6g46UC)C0SL98&$KoAQ- zRtO>hFaTf#zytsZ00jUI00RIEfE5560ABC(+#K)mcm))aq>M(B!C)i^gH9*#5n8Rz z>lLPRZuhhRO_H=gFJwRvMvn8^?E)ENv$^$pK`)5)G%a9z3-1Xh#P>Ly9nWMUYG z)9Z~wR029h*$f7XB!z5T0H6S10H{}hS*_9 zi$F92F%ZBZpoIYm0}2K-3>XA(2yhYFIX&*hF)xNtYLvqeT8+9egi)hz6ed*&r$Ss9 zY{y^@gIy?OLm@i~aVX@1fEory7?=>iBEX6O8v^Vo@G>+d$nzB)(a6B%Pkue%*13}Ryo-*<%Y)~OA0udO*u?$C=SeD`uNau0S zxj3)Q>Y{{%jkJy7y&j%4F?N>sxTj4zNbqP&| zG}46Lz*07vWGE9&8Yv@T;^zb_FF(!eb$Z^*YjG_Q_VgdI4*)(OMySDWe*!=}SPCgJ zy4(6J(BkNioZamMweZ{8h^gX^+eZ-WLwQ%*xuM3eLviqYqm0pdDr(WbCz#DPoBGK9mcjq zR4f`>80@HOm4T?J*$$uk5n08B!^L-+!Z1g)@6S+yG-lK7`q#ILvs&b)>@(&cmj3(= zn(L5OZ&x?%89Kk3l9z$W)Z^iQI2Hetb+(id9kY`&kY?eUOZz2{6Y=l?4ZS?xCOOFOY=pJ1{DXJ~mZ&Z$+=hva)3U&tf1>m@)$(f374Y z@v5DJ5>Q-D%GQEzk>pBG$6?f_JV}Y3)&&QBECrL2sOnC%D8iB-D-ErtuXU`w+JZY3 zu_0TRZ3Kxg&A$(yX!}v5mM4k*-YZf5Bnnbgh-D#R<>Y$H^9Pw&n|Zb_N9c6A8qklQ{1ib4I6L6#p@LOIGz*aEGI8jg{lU{HyU=; zp+iw3ZB)Ct$XBtV;@WV+V19jB`VQ%}BdUXkf-}DUvGdTRNam9B;1Hh<3j0%ec^bZ07jVG3n-Ew0A@n zeS`h*xdt{!%a~jgxwE%}#nsOwJIlEKl7Q|fej(NJ zPyLl#MA7wxVQDO+s?GoJx1wA{5fqvpx$)8íKr!=k9>?2DRS5%5y17|Ga&^rqq zV=03pdBOg#@J7)+vnnvuQHMk5;{z2=w2q!VyzZOmZr4<+Q`RHu0!2qo|8Zhyf7a(; zP%{epTg|XwMXm8@EY{|dkeRQM$Tj87)t$j0M@s}jzCI@nBvi#$Jsl4&Gr%TQvw^8Sa z)HfnY(&q4x!$A5FSm5fG+?;=hNeV^^Lt5%B5v5z}a(db$vyqx&9e%D!ylN|yuaWF_ zeBIzIi@dVCZ^wKXR45;icV?u>`KhGFy!>eC;-Z=*rGE9vKP3ee0Y^xEJA{u^u4vA) ztQA*K^D!31#qq%?NcnZhpNf5V?U~q-{dC#;pGAb8>M97A=TWIGelij^$0hblVSz)QmTBMsAD$b!9OhX?aJS!cuSw=6Li2QW3r%O1AQMptVxM_0oRNb zz6j_^NKvi75-^MQOG;)l4Sk;1M!#5<}6WMEA&p6Xrw%7!<#<Ff?OQ2j{# zK5<}PcQV?$6spJ`qe24znd;vb=+mN$e2km5TZbPs-Fn3;k6z5)sU2;4uxnMq{fnFS d509Rme|13vk}v=O diff --git a/Docs/Images/Attic/mysql_anim-01.gif b/Docs/Images/Attic/mysql_anim-01.gif deleted file mode 100644 index f537d60da413ccc7e0d32b95a33636a2a67a57cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15008 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 diff --git a/Docs/Images/Attic/mysql_anim-02.gif b/Docs/Images/Attic/mysql_anim-02.gif deleted file mode 100644 index cfd3e1cfc3e3c76ac402e91b41b4fafbe565187a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21236 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 Rcup!fI53du?h^#s_J1htpWy%i diff --git a/Docs/Images/Attic/mysql_anim-03.gif b/Docs/Images/Attic/mysql_anim-03.gif deleted file mode 100644 index 6ac6b3ebcc10ad72e73c82cbc275cff50a3e269c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 U7vQ0OAV$Q_#>SGr+ZNFNe^<(0N&o-= diff --git a/Docs/Images/Attic/mysql_anim-05.gif b/Docs/Images/Attic/mysql_anim-05.gif deleted file mode 100644 index 46f288ef71d36c46cf9569bc8741e1f408f6d596..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22962 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 diff --git a/Docs/Images/Attic/mysql_anim-06.gif b/Docs/Images/Attic/mysql_anim-06.gif deleted file mode 100644 index 3dc283dbfb6d390a513815b0cb76592f92728a50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42606 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

v$GnPwu~osj<-{nf415kE>E!*kwRjw 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 diff --git a/Docs/Images/Attic/powered-by-MySQL-transparent.gif b/Docs/Images/Attic/powered-by-MySQL-transparent.gif deleted file mode 100644 index be309d0de1cead248854a8455717d8b2056290cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4209 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 diff --git a/Docs/Images/Makefile.am b/Docs/Images/Makefile.am deleted file mode 100644 index b57d701d8a0..00000000000 --- a/Docs/Images/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult 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; either -# version 2 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Library General Public License for more details. -# -# You should have received a copy of the GNU Library General Public -# License along with this library; if not, write to the Free -# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -# MA 02111-1307, USA - -## Process this file with automake to create Makefile.in - -# This is a dummy file to satisfy the hierarchy of Makefiles. -# When a release is built, the true Makefile will be copied -# together with the "real" files in this directory. - -EXTRA_DIST = - -# Nothing to create in this dummy directory. -all: - : - -# Nothing to cleanup in this dummy directory. -clean: - : - -# Don't update the files from bitkeeper -%::SCCS/s.% diff --git a/Docs/Images/empty.png b/Docs/Images/empty.png deleted file mode 100644 index 71ac39b37f01c01264c80c1278bba1786750dd7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QY`6?zK#qG8~eHcB(ehe%APKc zAr*6y|NQ@N&z#F3+z{T#pazIALEGb@w^Onr2pF^`6fyx;?UHx3vIVCg! E05}>Q%m4rY diff --git a/Docs/Images/flag-background.pnm b/Docs/Images/flag-background.pnm deleted file mode 100755 index 2bd7b6042981a72c0dcbb7ea33e3a49f8b6f51ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2170 zcmWGA<5E^|4svx2@ei_62+2rQaQE~LP%l;p@bgu0%giZBEm8keGvG2d kQZO>&GBP#gVi*OZAut*OqaiRF0;3@?8UmvsKw=0002&StF8}}l diff --git a/Docs/Images/mysql-logo.gif b/Docs/Images/mysql-logo.gif deleted file mode 100644 index f8110ddcb935d5579c8bf7dcf62a8a514079af60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13197 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 diff --git a/Docs/Makefile.am b/Docs/Makefile.am index 2f32dfca1b4..4d6aa30a30f 100644 --- a/Docs/Makefile.am +++ b/Docs/Makefile.am @@ -9,188 +9,17 @@ # If you know how to fix any of this more elegantly please mail # docs@mysql.com -TEXI2HTML_FLAGS = -iso -number -acc -DVIPS = dvips -MAKEINFO = @MAKEINFO@ -TEXINFO_TEX = Support/texinfo.tex +noinst_SCRIPTS = Support/generate-text-files.pl -noinst_SCRIPTS = Support/texi2html Support/generate-text-files.pl \ - Support/generate-mirror-listing.pl -info_TEXINFOS = manual.texi +EXTRA_DIST = $(noinst_SCRIPTS) mysql.info INSTALL-BINARY -targets = manual.txt mysql.info manual.html - -BUILT_SOURCES = $(targets) manual_toc.html include.texi -EXTRA_DIST = $(noinst_SCRIPTS) $(BUILT_SOURCES) mysqld_error.txt \ - INSTALL-BINARY reservedwords.texi - -SUBDIRS = Images - -all: $(targets) txt_files +all: txt_files txt_files: ../INSTALL-SOURCE ../COPYING ../EXCEPTIONS-CLIENT \ INSTALL-BINARY ../support-files/MacOSX/ReadMe.txt -CLEAN_FILES: $(BUILD_SOURCES) - touch $(BUILD_SOURCES) - -# The PostScript and PDF version are so big that they are not included in the -# standard distribution. It is available for download from the home page. -paper: manual_a4.ps manual_letter.ps $(PDFMANUAL) - -######################################################################### - -# The Makefile contains the previous version so we can not use that -include.texi: ../configure.in - echo "@c This file is autogenerated by the Makefile" > $@ - echo -n "@set mysqlversion " >> $@ - grep "AM_INIT_AUTOMAKE(mysql, " ../configure.in | \ - sed -e 's;AM_INIT_AUTOMAKE(mysql, ;;' -e 's;);;' >> $@ - echo -n "@set defaultport " >> $@ - grep "MYSQL_TCP_PORT_DEFAULT=" ../configure.in | \ - sed -e 's;MYSQL_TCP_PORT_DEFAULT=;;' >> $@ - - -# -# English Manual -# - -# GNU Info -mysql.info: manual.texi include.texi - cd $(srcdir) && $(MAKEINFO) --no-split -I $(srcdir) $< - -# Plain Text -manual.txt: manual.texi include.texi - cd $(srcdir) && \ - $(MAKEINFO) -I $(srcdir) --no-headers --no-split --output $@ $< - -# HTML, all in one file -manual.html: manual.texi include.texi $(srcdir)/Support/texi2html - cd $(srcdir) && @PERL@ $(srcdir)/Support/texi2html $(TEXI2HTML_FLAGS) $< -manual_toc.html: manual.html - -# PDF, Portable Document Format -manual.pdf: manual.texi - sed -e 's|@image{[^}]*} *||g' <$< >manual-tmp.texi - pdftex --interaction=nonstopmode manual-tmp.texi - texindex manual-tmp.?? - pdftex --interaction=nonstopmode manual-tmp.texi - texindex manual-tmp.?? - pdftex --interaction=nonstopmode manual-tmp.texi - mv manual-tmp.pdf $@ - rm -f manual-tmp.* - touch $@ - -# XML, DocBook 4.0 -mysql.xml: manual.texi include.texi - $(MAKEINFO) --force --no-ifinfo --docbook $< - mv $@ mysql-tmp.xml - Support/docbook-fixup.pl $@ - rm -f mysql-tmp.xml - -# Postscript, A4 Paper -manual_a4.ps: manual.texi include.texi - TEXINPUTS=$(srcdir):$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' \ - $(TEXI2DVI) --batch --texinfo --quiet '@afourpaper' $< - $(DVIPS) -t a4 manual.dvi -o $@ - touch $@ - -# Postscript, US Letter Paper -manual_letter.ps: manual.texi include.texi - TEXINPUTS=$(srcdir):$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' \ - $(TEXI2DVI) --batch $< - $(DVIPS) -t letter manual.dvi -o $@ - touch $@ - - -# -# German Manual -# - -# GNU Info -mysql.de.info: manual.de.texi include.texi - cd $(srcdir) && $(MAKEINFO) --no-split -I $(srcdir) $< - -# Plain Text -manual.de.txt: manual.de.texi include.texi - cd $(srcdir) && \ - $(MAKEINFO) -I $(srcdir) --no-headers --no-split --output $@ $< - -# HTML, all in one file -manual.de.html: manual.de.texi include.texi $(srcdir)/Support/texi2html - cd $(srcdir) && @PERL@ $(srcdir)/Support/texi2html $(TEXI2HTML_FLAGS) $< -manual_toc.de.html: manual.html - -# PDF, Portable Document Format -manual.de.pdf: manual.de.texi - sed -e 's|@image{[^}]*} *||g' <$< >manual-tmp.texi - pdftex --interaction=nonstopmode manual-tmp.texi - texindex manual-tmp.?? - pdftex --interaction=nonstopmode manual-tmp.texi - texindex manual-tmp.?? - pdftex --interaction=nonstopmode manual-tmp.texi - mv manual-tmp.pdf $@ - rm -f manual-tmp.* - touch $@ - -# XML, DocBook 4.0 -mysql.de.xml: manual.de.texi include.texi - $(MAKEINFO) --force --no-ifinfo --docbook $< - mv $@ mysql-tmp.xml - Support/docbook-fixup.pl $@ - rm -f mysql-tmp.xml - -# Postscript, A4 Paper -manual_a4.de.ps: manual.de.texi include.texi - TEXINPUTS=$(srcdir):$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' \ - $(TEXI2DVI) --batch --texinfo --quiet '@afourpaper' $< - $(DVIPS) -t a4 manual.de.dvi -o $@ - touch $@ - -# Postscript, US Letter Paper -manual_letter.de.ps: manual.de.texi include.texi - TEXINPUTS=$(srcdir):$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' \ - $(TEXI2DVI) --batch $< - $(DVIPS) -t letter manual.de.dvi -o $@ - touch $@ - - -# -# Miscellaneous -# - -# Target to produce NuSphere Manual -nusphere.pdf: manual.texi - sed -e 's/@example/@smallexample/g' \ - -e 's/@end example/@end smallexample/g' \ - -e 's/@c ifnusphere //g' \ - -e 's|@image{[^}]*} *||g' \ - <$< >manual-tmp.texi - pdftex --interaction=nonstopmode manual-tmp.texi - texindex manual-tmp.?? - pdftex --interaction=nonstopmode manual-tmp.texi - texindex manual-tmp.?? - pdftex --interaction=nonstopmode manual-tmp.texi - mv manual-tmp.pdf $@ - rm -f manual-tmp.* - touch $@ - -# Include images for the manual in the distribution -dist-hook: - BD=`cd $(top_srcdir); pwd`; \ - if test ! -d $(distdir)/Flags; then mkdir -p $(distdir)/Flags; fi; \ - $(INSTALL_DATA) $(srcdir)/Flags/*.gif $(srcdir)/Flags/*.eps \ - $(srcdir)/Flags/*.txt $(distdir)/Flags; - echo "PostScript and PDF versions suitable for printing" \ - > $(distdir)/manual.ps - echo "are available from http://www.mysql.com/Manual/" \ - >> $(distdir)/manual.ps - echo "or any mirror site" \ - >> $(distdir)/manual.ps +CLEAN_FILES: $(txt_files) + touch $(txt_files) GT = $(srcdir)/Support/generate-text-files.pl @@ -203,9 +32,6 @@ GT = $(srcdir)/Support/generate-text-files.pl INSTALL-BINARY: mysql.info $(GT) perl -w $(GT) mysql.info "Installing binary" "Installing source" > $@ -../COPYING: mysql.info $(GT) - perl -w $(GT) mysql.info "GPL license" "MySQL FLOSS License Exception" > $@ - ../EXCEPTIONS-CLIENT: mysql.info $(GT) perl -w $(GT) mysql.info "MySQL FLOSS License Exception" "Function Index" > $@ diff --git a/Docs/Raw-Flags/afghanistan.gif b/Docs/Raw-Flags/afghanistan.gif deleted file mode 100644 index 2cd2b54d8f5183d1667aacd01c1def6e27d568ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11155 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 diff --git a/Docs/Raw-Flags/albania.gif b/Docs/Raw-Flags/albania.gif deleted file mode 100644 index d5c8e0c4251a61628d41bb8bc59cd201991d25ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8288 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 diff --git a/Docs/Raw-Flags/algeria.gif b/Docs/Raw-Flags/algeria.gif deleted file mode 100644 index db8e4a4f52fb8f52e413ad9d81d7a183971bbb7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5003 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 OnH0b-Dp=)c{w92d%($I@oW9E7StJ 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 G_5TBrvQLKq diff --git a/Docs/Raw-Flags/antartica.gif b/Docs/Raw-Flags/antartica.gif deleted file mode 100644 index 3f7eac3f31ce7fd999bf01f273fdc87f6b7bb87c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3185 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 XMtPJ-nUqSoluX%_PWhBh7Xkn~>E!4M diff --git a/Docs/Raw-Flags/antigua-and-barbuda.gif b/Docs/Raw-Flags/antigua-and-barbuda.gif deleted file mode 100644 index 8cdc6e9f69cb8567a99ca96c14f3cfd99cd93589..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5239 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 diff --git a/Docs/Raw-Flags/argentina.gif b/Docs/Raw-Flags/argentina.gif deleted file mode 100644 index dce5943f382bcf88717e2043f52879dd4b534c48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5242 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 DM5cYT diff --git a/Docs/Raw-Flags/austria.gif b/Docs/Raw-Flags/austria.gif deleted file mode 100644 index c4f251ccae301d52e89b20cf0a9e8ade593b6485..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1232 zcmV;>1TXtXNk%v~VORo?0ipl^|NsB@_xJC$z219!#sB~S0000000000EC2ui09XQ$ z0RRL4NV?qqFv>}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ z$!t2G(5Q4uty-_xtai)odcWYXcuX#v&*-#z&2GEj@VIs;jK6uCK7Mva__cwzs&s zy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=%($mz{*4NnC+S}aS-rwNi;^XAy=I7|?>g(+7 z?(gvN^7Hid_V@Vt`uqI-{{H|23LHqVpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m&2 zqsNaRLy8oJq5$&6_xL>fFh*r_Y~2g9;r=w5ZXeNRujE z%CxD|r%fOt?uiw9b0}CEZxUk{Fh!ZPb%($`R$B-jSo=my2<;w#yYu?Pcv**vCLyI0wy0q!j zs8g$6&APSg*RW&Do=v;9?c2C>a}L0}x9{J;g9{%{ytwh>$dfBy&b+zv=g^}|pH98H z_3PNPYv0bjyZ7(l!;2qJzP$PK=+moT&%V9;_weJ(pHIKO{rmXy>)+46zyJUL00t=F zfCLt3;DHDxsNjMOHt67k5Jo8BgcMe2;e{AxsNsejcIe@UAciR7h$NP1;)y7xsN#w& zw&>!EFvck3j5OA07|%vs_CYjcIxS;poS{ysHB!^>Zz!v zs_Lq&w(9Duu*NFuthCl@>#exvs_U-2_Uh}ezy>Squ*4Q??6JrutL(D>%r@)nv(QE> z?X=WZYwfkzW~=SC+;;2jx8Q~=?zrTZYwo$|rmOC{?6&LfyYR*<@4WQZYwx}I=Bw|% z{PyebzW@g;@W2EYZ1BMdC#>+o3^(lX!w^R-@x&BYZ1KeyXRPtY9Cz&T#~_C+^2j8Y zZ1Tw{r>yeIEVu0P%P_|*^UO5YZ1c@H=dAP2JooJL&p-z)^w2~XZS>K93ZV4TOgHWH z(@;k(_0&{XZS~byXRY%C=m$mKo+i=G%_uO>XZTH=H z=dJhNeE045-+%`$_~3*WZusGdC$9M7j5qH1a4f!`s=XAF8l1X*KYgmxaY3>?!5Qz`|rR9FZ}St7jOLW$S1G- z^2|5y{PWO9Fa7k?S8x6G*k`Z(_S|>x{rBL9FaG%Cmv8?0=%=s#`s}yw{`>I9FaP}X u*Khy*_~){QCUx{Q5Y#ID${!f-9#fy#WA)LLvEw`FYXU zn5es3)YLIwT|J+dH=mr$i;d-lh4K9S#-Px#Qx0tFU)iAjYz^IR0LZik9{RLez-jL<&|>r1KG@)LzPizWb*OhsvX% z)qb_ys_22`m@YmY;bxo55j4gOMlh$uj5v?lNs+YuDMutzpyCtIm_#fNPaq~GKTAnX zBc*3#W@SGozsSkW%P%M_dRbgTDJ`RxSI{b}s%vWLb@dI6P0cNg);4B)M`su7?^mzi zyzTDk?duM4C0 zR$dC)^}hPjf#-I&`}15H$_8`64~3ul8mOE?2wHO=w6T1+#5u#}Mt@_)2-UL$nh$NF zeW-*tgnsUCsvNHkcum~r+FbRqA$Wv#W1zWuvL$l1Ki{>b<}(wqD*QaqQaja!QqeMT zW6-BxNL&Ghy;RSKw?(OD|4(Fwm=Sf+AP?kB`R{ zs<58gR3-El-(TfGO4OB@>6-LIXzHf%+IzQ$>MK+gt9&!noynipKDc?Et?1UXB>ot8 zH$5AoXY`k*FKj zb{4C>wzpt9geVcL3$)5b+_}u76f|BM?&I`WNYjc`(WJ?k92~M1H_;u*hEcFh&0#RZ@6p$QP}4E_e{a7n|KXyw{pSvXT1G|6x$Q#`Y*Gs;w6OCkmu5V@N_Jd9T=qHE2iu&o+EU|f(13GE*#L4SBU=6`2!}o8d3+~7 zPu=~dL-lC?h0tTSe)?c)m$kE4-AuvHXJdjK_rYBqeqM8!#ZZ5BqIIRu5VA~OS^la6 zcx6W%%}gYg?Y@bG<_cjM2LnsY>=#CK93LcF>K!=n$j@8g8|7!&AEd7|F}fCR0PA>{ z=BkE#PkSFx8Qp&yU(jDYgS-+OV)2u+D0r|TLR5azcvv<6#g!IXMDZ0`AkL~{uwbI; zv2$|f&0`p^K+Bcdp^Q-V^HEo9kggT?ge315MEKBoLs(|1=P{(Sm(alH|oRd}PMbVhk)ugwsVbxj7LZiKG?Mr<(czs2_ zb+f}(KYKD7WlOH7z5w=#hvIBY8~+#@ zeuK2fWzt{0cn@sAe)zgdz~pAJsDpk-j+;t&DP2g}NGTOS~MnZ;938 zPU|wyxgKO~Y)|LWYfN)MxMv98vud`NluhbHM~+nJS4!WC{*Issv}TPe?{y_K)unt? z;aii!dm!gHLGD$bm3E)%y%d*2EnYXH?fbd!_?-_b z0IWp+*c&7=8!FH2)$sn!vT%bOvYz?YZp?a57c$$vM$b{Q3P4XRu~#i>^sj`OV(0b@ z!ONEO(+(FR2E*RrcPQ=_jI33!>{X-o1!O;w)cop0jnC)9 zrqz!IN}CrdjG*?;JrlXRN*^J@pDZHhE{|u(5LpYDM z;=S7fXIR^N#dG#r*_rJH&(yY2s>cu7wQV7s(>B(^{!tUVy%?aw>{Up6VVx__Ia_mQ6dOaSooiIsw(y!_lgsH`Z{cizi&e<@ zI$hEpn0zHyu_b_YZH{x~>rBPAIJIkQ9;VowRLG^AF1duGkjwu001!$UjFPItQ9BSQ z4KhlTf!f7IX-iSMpm;rSya7Dk5D^a|#~U%?jk)nA(s(maf;l+B0-j)rNU$O&*f0`~ za1(5$33ed#Z(#IsIQj$v4JM;cGtg(b=yOsu1cY$_V=lrmjtGo183Sct+_)GIDaI3& zcp04N4NvqzB*MvwevHKH+(dtAVgLvm2*%!lV}lUbU@|t8fxXYgMo6)dAlw5mE((r| zM&J-+Tnqyj$HhIB;!q%b0vL~h YE}=k5C;}0S!9)t2ScV|(2Y@sG1LF21hyVZp diff --git a/Docs/Raw-Flags/bahamas.gif b/Docs/Raw-Flags/bahamas.gif deleted file mode 100644 index bdfcda7dcfc8a66e046c9b23ba0c0fb5e67ccd2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2836 zcmV+v3+wbpNk%v~VORo?0mJ|R|NsC0{{Zjr0M^z3#>N1~y(zV|DTIVtgoFTda{w_h zDKRksAt3+|5K;&LwFm&E2mq7_0E7SlS^xl2001EX02lxO00000000000000000000 z000000000000000EC2ui09XQ$0RRR6AO$&OX`X1Ru59bRa4gSsZQppV?|kq7z@TtQ zELkj)qH@V>I-k&}bV{vSWk-wX%I$i;;IMd1E<3Wvq1UeS$B$$kdcy;a*Sw$l$n~FoSi_HXpWwvq@|{tpmmt1tgWuEaH(~o zu(h_gxJ|NwtGT|vz`-uNfwaQM$jPt7jJ?Xw(9x01jKM=;AJk97BramnF9Xk>%JFaBYRy4~_tlGB++0sJ` zw{AYU^xWFr`ws6ux_kqN^Se*4;KSDl3j~a~aWcgM4LhFv3vxonlrulH9671x&yP7@ z22EO+Xo!+atEP1NBIebw6}7&YI<{>>vpv4P&09}ykF|RXkM&#k@Z*V!mkf@)IT+&mTqp zqxJPCAPN5+wcmjD73fs|fC$E?pi>7nSl)wFF(@H;6jBx8h0|rIm4zHS=b=^`hA7;K zV1a02ZzzIQ;)<}fXqJjFt|p^dFV^_kjcn1Vqh>s^mE(_%1u2)0L?ULSTtg7-py;??AoX;tZ$lvt9brC(QedDWMMaVe%$WD*wUnMI|kn3-%6<)&h5#);FMkilu^ zO?X09=bkF{X_=mYrX;9ke-_Hop_~z_=thikmgu7nMJk%3ls06kXp?3N(59zh>ghkA zp4RE8`ji?fs$;5Zs%NaW>1u1D#){6Yvz=;dK)B9U>#o}Lnwze`MkDNRzZMJ4vA+?k z>@mz1m+Z5qMcXX@tkkY$t+d%fx@~dJb_>h5&`m4uGUO^3?zyI&DB; zyxhTSFDm%bi|xL*_M0!jeF@B6y#yy`uz30=jL5?1A?)xU5VzOx#C}xVp2QgEq49hd zcZ|o!^KmTl8zko!^2u(boS(@om*Mh%E5}U6%>Th`^A|W5So6*@^_=s+K$9Z0f?e^Pn$1V5V zbk}Y7-FWA%_uhQ>?f2h+>rHls3k(pz;fN=$_~MK=?)c-7M=tr~lvi%~<(Ox#`R1H= z?)m4SV?Mb5hX{mj`st{ruKMb%x9+J|gYNH}CxO&_}Pk@+bx`{q@*qul@GEQ@_07+=nmz_~hU2eT&wYum1Y%w?Fy$ zEi&)^{Pfo^KKwGKZ~y-M_dh)TGLoPF21vjH#twk_GoS(&$UxB{Fo57|pads4!3Xk4 ze-zB12KQ${9tm)RAPiyoIv6AjitvOej2;Pt^uZLm@P+?dVF_VK!x~OchAfPr4R^>x z)ZuVRChVaQhiJJUE~$k?OrjFIXG9|fafwhQViTc+#3)*Ehf}Q56R*g{6lSqXRqUb| zLHI@gEp2g(Xl!5^wG_rQy0L(3{L&fUNJsm{@k?#2qaNFLM>5TEkAS>iAMvQeKpK*K zgG|#O56MX9B{EHUY@{TO_eeJ_a*~+5VI|2F$xM3EcAK2jB|k~Z1BMckg)F5iU3W@6 zjdGQ+)Lbj^)X7-d@^Z86(<^VuOULE1Pqpl&FcX)<%*073oNnb6i zSLSnl+7u!JqFas-Rm#42_+ zhi$B5A1fNhN_Mi8RZL_ri`mTL#j>33tY^Wp+0cr1v`zu7X-|vVnUr?5tZl7FR14eK z%2pt+t*vcu%MRM=cDKA`Ms9x#+~CT>x5O>3aTzh(#+B}M zv3pzVZkM~Q)$Vt}>sjxPm%Nk}?|IQ%So5xzy?a&fd*RDg_s*BTVwLZG@jF%f?w7wu z)$e}+j8p#(n7}R-@PQHhQ3EfS!4*~TgCT5C2Tz#7{FLy8G2BiIZLP3S`Vd8QSJfY>DA(g{3Z(Tx88XrduKiH|y( z(v^njq%oaogI=1`oxbO$K^^LLewx&!_U5QjooZ^Hn$@i?=Bi;G>s-E?*0nz6tZ|*| zP2QT{ha7U|I*O^k)HG_9i8b-H`3Cf z9(5i)o$6I@(bTb?^$}g2>s_bN*1;Zj1$~|DWzWyp(Vq79oSp4$=g!*U9(U-xo$hu2 z&D`;x_u1T??|m1|-T@zY%lw`2g(uA55ubRx9G>xwH_PH7A9<}jp7NDH%H%Phd7WII z^PMlr=0P9&i+rB+r5DKPQJ;ExoSyZq=f>(`AA4rJp7ynu#q4pPdr;h-_q`9q?tveC zH2j|U#kaulkzf4dGr#xCe}3+rFa6j@zxu7GKK4t0{q2Wd``*ud_rqU#@RPss<3E4m z&9DBzr@#GuXFvSw{{H#LUH-+bAS?7P50vL4xSb$AOfCyN02e^Pi zr+^Naa}5}QH3xwd*m4tifhlK!8W?gJ*nu6#fgo6MA2@;$CxRxJa3z?61&4wx*l#QN zg8AlxG8k_$ScC0GgE&}jH@Ji0rh`71Z9N!-)dqw_*la_1gvn-vN*HWO*o3{tgiu&( mPdJ6KCWTg*YE_tprG|xE*lAn%g_-7sVmJw5Sca1j0suRzqxu^F diff --git a/Docs/Raw-Flags/bahrein.gif b/Docs/Raw-Flags/bahrein.gif deleted file mode 100644 index 3fa9f84a812949b4b1f379e2870541e105cb1a41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2380 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 diff --git a/Docs/Raw-Flags/bangladesh.gif b/Docs/Raw-Flags/bangladesh.gif deleted file mode 100644 index d16696cfdb2ca4b489a4bf9b57a1f7e6b33e92bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2505 zcma*g`9IT-1Hke3Cg!Hph!v7P%nb3#)wi$cQ!K{Em7IMd_f^hN&6z9rF}E-=%$#A4 zAfDa0=w*-vs0hAA*9tA= z+r1G~Uyp@A!gk0ui(Kffix5qul)UJ7*C-e*^F>uzR!>#>4{io^(20Ti$QUt09TOWD|1KdhDLExIEj=R>o0XlDo0nfu_`ayP z1Xuc@tQ=oaSw*NO*3{P3H#B~1YHlI5wzYSVJG;6+_4M{p`UeJwhDWHQpU1w8PfXIL zzE01~&do2-7ni;*e_vT$W2`ebHn+BScK7xV4v&t1{5(1Rb@rPDuyMn5iG`ivoI-GG z3h{mSTR|yQu5L|HPn?Ld>nx?FxGzycCl;nxThgB@W5U8)_t)YEGZpOza`oy;hjY|? z8bd}4o!Hp9!npbHWT$Y5MryV*S;9FK34b+jfKtx*I9#oU2jwgd@t zaG}`5L>VQ|z-nd7e<1F-;G7lF{ryRg{9ihxSQ;;BrP^lvqyg$tvi)Gk#+Q#nT~T3} z9N(K!TDeJDNfvn_U`GHO2nB=Qy@JApK^P9vXf{A}z3j0w+?9e&G#AYTTu{>xT!z0T zv@{!B3uNVIz|#TmC_E&mv{AzxkDu!|nRI9TW28Ov<|F_wcph0{@DK+$|c&4;FGQ6o=(nH8YBG0fs7tZ1 zdVXo4Ibz#`ZcNP>#B26|?}GN+4#R*_aKjy%7GzN_95u55n&JU8$|6?x+W&Kb8-m zo&jT6)%csUU;VeXSTp`P@+~A68tjN6*`24r6xz4)nIMYCAJQ^u34|4c90IAS+zPh8 zt?YEBu?u0d@gY$lyxX7OtBNBTcf}Rj+H2+XPY)07*!djHnmjxkoP4|Od31c!tDQ8T z$ou<*lCbccy2Gq!?aHMkZmmKKDmt3hQD0dH>9tjSf;P6y%w>L=%APqlKiS?HtODwc`Bdc2o?x&*BYa{ z2N}X0ln*RLOSfnTMB4f7^!twvE8bPLJo-tuC_laA7US!iCiFbA?>5vmv1Ywk{O37c zGp-j&zHo=K+GxtHIif|pyF*r!NQEw{_Fs0exo#ONTkX;R#|J=+MJ*2a?NTWC6Blvd~uOcBs(9M zb&y6?mQJTaW#e~)|8QWUQ8Us62uj(AJ%E7#Z}?%F9Xr54yF zS5{*2Pg%)M828xvy>Uw+d4@AW6rN6Sa#-@OHT z79uAn`<7wV87*sXO(%`&?8H3qcFVMy2$Y`^Z={7vH6F{yom`Rmew}iUbF#x>;;EIq zn{{hYbs4?^{?s7LYyp)~=Z~oJZ5uGryw%!j+f&@OFJ~PFshQc`P7zDH+XI z{rXu&&r`Tr_T*5&OKJCk*`SFg^k$it+4=}?h53BvaOutA@*dqmvoF(p4bo;FeHJsO zG%$aoNctwl`P5`al>a05#O9!yl`++vzfN0LgEr?C4@-mPw-^24)=h`$MHn+L9`hq3P|2hAIkR%-T`TbJwba&M zHey<&<~iU4&_YQ=z7FLXI2xdJ;LZ_4*;Jp{K?A!G7khA;cICnfO&M8wqx$rS6Y(99Ul6~(x$rmOL3Suyk_cvs-CJGzFS zbMH(aIPo5ASu#1_0j($B|- z@!W}S9M@Fy`8G4J=~@ZFf^2P1nKq+j0^ z6Pt&e(EHglzgEG}VVbs?9mua5f}O(?*UONoSkhiKN+8^l{6~*;XKxG=DsD Q+Z0<8t>)nvd%{#~D_%zCuo0Kayk~wnUbG(c)A##LrhT4)d$8x3! zIeQ~VxixdW9Yv$G@8|O$e4jr*ACKn`Ph(Rfj26KGk_qksf!P1$GwA0B*jk6+=W59h zg>p?f*vce>oRDitzD^-d9v-&7wgw~vwInsU963ZG0#*qFHG%%$DE`mA8>d@(XOT z3X6)Ja-KXZuc*u|q0(Mr%bwTN*3~;yH8y2cH@st_A!ai2?1#j0mp#-`oFcv}3`-q^0s&QRsU7wHDfdi^Zf^J>krLO8m3QOhlQKWCSQ3t2c0-IZ}&7> zz3UuqGxeYANYpyM8{D$H;!h!|KWxWZd=oFwDY1k^hi**IIJBVk+P-fKw2_SY=gU}o z?*`B7W^}ehCvJUNh-0gC#?1UUndutUW_O(YE?|`Cflk3@fgMp|DfcG57k1DHmov-8In9VN(xw>F5=hs^$1{+U-gDP&y{O zvixt|L*irx3sxZYs2l2CVP^s!zBp=Q=C6{XiS@OsK(G|Elvga8=h=$f1EKPH zEcZZJrmKvcWX_F`qm}tS*Ur5_MQNX-W>b#O(SX}NFLkNUTjiswN6I#;JbUH)UNt`S z*sOkYs>K&cKWzP68vs>M)a*G;+KL$<6Sf+HG)N+iEYm?=c2m70NvXNY`%CZZuk+uk zt(Lek%II&8!L)7n{FKwHXc!qB;zFd;=6&jJANJ6aKQDt{SMKYWL|g$ey<_ z@d{NzUahpD_wFV!h+Z*gB;tdece`4j?$xb&8C0_FzN<`pNW%lU*A2n9l-hppJFBgr z_J>j?V%`s9&OZxr(0g$Z0@CFg?i({ad+XDvsX{u}Kb9e!VH5Ti78=>+ZYMdDPF%fV zQ`)h7hk1^06wcX$R5S_ZDlH11cGTMiz64||<$|RUsyF9!2$KMeZ)>>4oSbTnb4?Uc zo`hUb1R|FeOf>*F$8XN4RU0`x8S>bz*!DUEhljACUMh^EH8UB&0CKPBUxuwfscOr5 zO={x=SibR`<94&cH-MXeY^2R7@%o4iPx6#|d)0dp6&OT-S;NhtsEQi|3!tohzKh;F z)6Fpu|92G6;1y94bg8^YuPiZh40oKRI!|5^Jh50g+?3Vs-}yI>O#!K*Z(TTr?-GIv z#2?wgB-OphoGdHBmn85eN)2?B3xvSTODmxXI--g=fGjx2gWA2!^8^+1T>4U^@ zC@`w<3Ks!*hlQcQQdhy?_80H?xXGLU>{>Y~Z^Q%C| zX{d6_wTV7yscABo`5vD|Qn%Ow9$-s0;K>q0%esFF^@_Kv@G7~y<1Z33Ivt}XXkjNU zoT`<0YN(#)Vh;GE6$fZ%)!Ic*EK3i;IJkldG3JqYA$gNTspo2snxvoyk9YNz0)ya0 zbutJd!LcbRoc(InU8FHN38|crWP-zq7^E0quh|pA1id}qjqiu03GqS~7kC%*44m%- z3xW#4N>M3fxBE-k;GRmg86h~K6_*#nth}^D96pWQ%^9B%yI?{idy?x50D!@LDy27& ze^aO-6s)#XI_%U6972F~Tc+SOT*EZOR3v+$+R*9A5h$^<7OhheOLCPm^*W)_<6fk1L6Yib69pw&zI zH+^_bakfwd63vZ54JePP^Kt~rz!7JFY@<@@#)`Lrw4?#-s~Qc>Vwjt8pQ0E6RE#Rl zUR-99X0ZI<2c;HfcuQsE0nY|9!JGrIbIWRaHM)2eV*4^N-RNzp(KmTXySF1qbZK>O zkFV8TNs!UQ(sJiWU-9;1ApRfI`lupX?%j3H0e{J2+59z6HBuVhFF5qEA=&GZptfkf zuvx{eEtR@xNN1~kom1cj%w(-%`s1N^kQn%SYMqnx@0@DW{c1XS$w5f;22ZcjJ0m5y z^S6Bi3AVCQcVM#MoFp<2s?C=jMygL^7%jdrX4VKk=c(9p6>pQ9_7|MsN!odcYF`f9 zY0n|J_5_Q!7{ZjpG^!R{%%$7f__p9EGic>}gfXY)uKG~w0$Vws2X?v}fFlVG*3xv| z(~#KMF*EiP+WX&6jQ+Mlxe0SPzz)UqeKL}lyRALSFaGJKLBmpQMVCt@MZO8?~M>88u&;i`JJ8wA=n zZYyL&xlgJFq(;=OAbaQ^{o_I|w(fb32$zjuK--*F6<(M=CbZV#`@M|7Sz**s-@S`$ zM=j)U`^lFDTsikEGo{nv0qRencR%k{hT-oBUzjy2{5Mn!Y5}>N8aaW*AHZDZ=C7MQ zIa~QxH_fesDHRh9EgN}Vt+0|Vc@{jTsTz=cUk@4ZBlv?JEyN28 zJGVBUuQ|Sb>?JyMv}%Lh;Tt-mq)F)7QjY#y?3pL|u--qE1YhSjW`nP?V z^Q>l@|jabpGsRX6UXC{{js-|JhIP zijEVzoLY$@=@rUex&9x4lCcO^xr*A1b#beliA}GA*L%7>`T`{Rw7A2{+St>#7d8i( zaX+bj9UJjo@OcrJ$exII+oXkp)hmRfzJ;RixdFc`q~nj(fzE@Vx z$8IW{bCt_wbL4X354)mYTPnr}-2!ZutSoEjeELb>W%mA5JX>KgPO1gT22tWpUc@nO z0Qh4JZUP^gEb|tCqseGi{6z%V zMjyl}nD{p$@!$qhi3o8YCu50Z9V*!|Byn;t5r>B8O(z&q5{xkkrcA($3RpM*RxrSZ z9&bmCw@1X^?2mJdjB`fE-I|Vdqr?(0u^!AA&-@rKlNfIn$(KsH>p%*Ck%H*aA;jn~ zM07-dR1`ImWD*(6jEIknNI*v=)(Q3B{D1Zvv(n zbI^=93k7*mfDf#r21TXtXNk%v~VORo?0ipl^|NsB@_xIj=d)7HZ#sB~S0000000000EC2ui09XQ$ z0RRL47`oj4Fv>}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ z$!t2G(5Q4uty-_xtai)odcWYXcuX#v&*-#z&2GEj@VIs;jK6uCK7Mva__cwzs&s zy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=%($mz{*4NnC+S}aS-rwNi;^XAy=I7|?>g(+7 z?(gvN^7Hid_V@Vt`uqI-{{H|23LHqVpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m&2 zqsNaRLy8oJq5$&6_xL>fFh*r_Y~2g9;r=w5ZXeNRujE z%CxD|r%fOt?uiw9b0}CEZxUk{Fh!ZPb%($`R$B-jSo=my2<;wyxYu?Pcv**vCLyI0wy0q!j zs8g$6&APSg*RW&Do=v;9?c2C>b0)yMx9{J;g9{%{ytwh>$dfBy&b+zv=g^}|pH98H z_3PNPYv0bjyZ7(l!;2qJzP$PK=+moT&%V9;_weJ(pHIKO{rmXy>)+46zyJUL00t=F zfCLt3;DHDxsNjMOHt67k5Jo8BgcMe2;e{AxsNsejcIe@UAciR7h$NP1;)y7xsN#w& zw&>!EFvck3j5OA07|%vs_CYjcIxS;poS{ysHB!^>Zz!v zs_Lq&w(9Duu*NFuthCl@>#exvs_U-2_Uh}ezy>Squ*4Q??6JrutL(D>%r@)nv(QE> z?X=WZYwfkzW~=SC+;;2jx8Q~=?zrTZYwo$|rmOC{?6&LfyYR*<@4WQZYwx}I=Bw|% z{PyebzW@g;@W2EYZ1BMdC#>+o3^(lX!w^R-@x&BYZ1KeyXRPtY9Cz&T#~_C+^2j8Y zZ1Tw{r>yeIEVu0P%P_|*^UO5YZ1c@H=dAP2JooJL&p-z)^w2~XZS>K94xseXOgHWH z(@;k(_0&{XZS~byXRY%C=m$mKo+i=G%_uO>XZTH=H z=dJhNeE045-+%`$_~3*WZusGdC$9M7j5qH1a4f!`s=XAF8l1X*KYgmxaY3>?!5Qz`|rR9FZ}St7jOLW$S1G- z^2|5y{PWO9Fa7k?S8x6G*k`Z(_S|>x{rBL9FaG%Cmv8?0=%=s#`s}yw{`>I9FaP}X u*Khy*_~)}*y*TR~NBCeUj$~<`XsWJk>%Qx2P z$!tzMv8Z%Pty-_BqIS#edcWYFb4)Iq&lo6n&2GEjtgw7euiJ&_ynfH$sNsNtf`cx1 zhKGoWMSYBoj(dNEl9QBhikFy~iI1F}o=1_DqNAjRny09#TA!?~t_`83va__Rwzs%9 zue-dDv9!R!lDWjir@hF@XurbE&TPif(uT^_)=SLK+S@VH-rrx>;^S%D=I7nu>gz$| z?(YxT==1ae?DzON@cZ!c_5a)Q2^7e$;5dH(6ABy1ke$JY)etJ2D665xZxA!~l1Q=t zW2K8AqiG!JilfJqgF>pzMY5$QlPF`pSxHls%bSj1%G`;ircX^cgYwbIv*?tcNEHcP zy3D9kK}n-hV@h=l(Wh8fNZm@Os#hjgvx+srwJeygXpw{+%Ql4Bw_MW7)v&g0Tex_M z%-w6DuHCVD0|VhpSc2cbSp_TRQMj>#!-$_Qo{Yn>Wd)EU8>P&d#%0TyHS_G;`LpBD zqGgiiY`QV()F@X|Ze92_Y>%=h(vNZ>36ZiQfi3)xS#S)`E}1&L%EN~*+UlTQ{E zWk^#(W!_+tct5!x=zDuGQR%$L9oIOyOFW~=pZYNvdc1S zjq43xx;AdIQS7h~Lq#*%WJiN}n9 zyr{^Sko+;l&!BvX%0sbypUa!TtcS^j(pr`KJ9?S$BBlKr*WO`tud+H$bnHrKVleU{wV z(9NLT;oz-=+g$S9x8G{%U6J5j5S|3!RU)3a;-DB_isNxX&H>~9Pg1^x<(EsIq2`Nl zPM7DSfF8Q&<&gf7=|iBN0p>`u-n#1-z%Hchc+lRL>Z{}agYLWYK8f#x0Z)PLI}-o9 z@lOapyz*i&Zrzpj8Fsx zfWZpRB!V6EAe2DpKoO4cf+aNJ8a5b06<&dbDRd#3NGQMzE(nG-l;I0$$Uhqr2!}n? z;S5ojLm{q-hxYSfe}I@oBOZ~6L3E-Nmk(P5LVju}QN&bbBinFAIkXS`2PLY#Y^dz1@*+o&N1By*F^sonUjPWXRb^b*_`1fwboc;Hfov zCJCQ~)TapeNi~0N2B3))D6r63ONAZ_p^bFtLmArtONkQHX$G|tL?bCtdu+6l9la>h zGCG=%W-_EEZ6!)6+Dwb4w3sV3U<(y0QlXJ_CpG2SO;z*KWX2SLGZkn~ZMM@m^|YEl z)n8EcIaHVxH8w}hW>V?5RC_j6WlufHRY{iBLa{WOF8yjZ!z$Al(ln~=oT~e(s?M!? ztg9VyE5_jZ8??q#t>|N`Ipr!bx@O9*{lu&I^eRriGR&{W0c=49%RRz+)363Ztf>@> zQN~)&vC@Prz$Duo%8t~s(8H`VHLEYq&dRek1+DT#D@@YT%e1)?YdOgZRI>^dwK`QT z@mT9i*SZU~^zbdZfV&;s5>>ap@*0JL<~P zy4J$(w`5yS+A7tyOw}$|xyw55suH}=67Rjpn@{sn6}?tf?_1exI`^6qzRHsC!{{4O z`>qwgZPo8w`3pM#iW0!X5^%)`oKOSj6~TK|a9~M6$3H7;5gqE|Q2{w>G~TR@5r<~Xz4s!I}aEC&v4VT3;8T4KTpok%|*1@6sE6;hz_yket}Cc(F!B0C$BuBanYL{IH9JeseqOMBI_%^Yd%4jL@wAOrZTww( zO4+WSuX73PbqBNEwH@+Vw~f?pPxsr^4fl%24YYEz@7zpE_xAL?V}9$*-{u3jkpzA| zcZU<+=au(u=`B@zcNgE^CHRjGPBVmSPvJjeI8-!lWRAPc>Lui8{l3cxu4MK6@~hRrJi82 zFV^fGM*D}=-e|T%%gA@Crk`=M;}1#;?%vr-nSiBriG22gveW@_S_g ne`3L>81u2#yuUbaIM3?`^g9&&XGwo!)8`oVyH-8E5&!@@G4mF< diff --git a/Docs/Raw-Flags/belize.gif b/Docs/Raw-Flags/belize.gif deleted file mode 100644 index 9665a50b0ae8242fa99dae9e612ac250aeff2330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28546 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 diff --git a/Docs/Raw-Flags/benin.gif b/Docs/Raw-Flags/benin.gif deleted file mode 100644 index 3b29c8a121018cf53c0bdcb9f78b4737ccc91358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2107 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 E0E&E!-2eap diff --git a/Docs/Raw-Flags/bosnia-and-herzegovina.gif b/Docs/Raw-Flags/bosnia-and-herzegovina.gif deleted file mode 100644 index c01717206ef644bd3248a6fe0fafa271c1ed8e79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4143 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�h&ZesU_pr~R)Z8&AO%mI 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

aPTxv2&Vzx)0FnYB!!LZ8mVTq6Oo-fy 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 diff --git a/Docs/Raw-Flags/romania.gif b/Docs/Raw-Flags/romania.gif deleted file mode 100644 index 2214685caf05eb19d734ce977475311454f8f3c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2777 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 diff --git a/Docs/Raw-Flags/russia.gif b/Docs/Raw-Flags/russia.gif deleted file mode 100644 index 3f52bd7d490d0940198da29be950787553478356..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 zcmV+s2JZPsNk%v~VORo?0ipl^|NsB@_xHvC0DF7ZIRJzR0JQ)B00000EC2ui09XQ$ z0RRL47`oj4Fv>}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ z$!t2G(5Q4uty-_xtai)odcWYXcuX#v&*-#z&2GEj@VIs;jK6uCK7Mva__cwzs&s zy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=%($mz{*4NnC+S}aS-rwNi;^XAy=I7|?>g(+7 z?(gvN^7Hid_V@Vt`uqI-{{H|23LHqVpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m&2 zqsNaRLy8oJq5$&6_xL>fFh*r_Y~2g9;r=w5ZXeNRujE z%CxD|r%fOt?uiw9b0}CEZxUk{Fh!ZPb%($`R$B-jSo=my2<;w#yYu?Pcv**vCLyI0wy0q!j zs8g$6&APSg*RW&Do=v;9?c2C>b1uNUx9{J;g9{%{ytwh>$dfBy&b+zv=g^}|pH98H z_3PNPYv0bjyZ7(l!;2qJzP$PK=+moT&%V9;_weJ(pHIKO{rmXy>)+46zyJUL00t=F zfCLt3;DHDxsNjMOHt67k5Jo8BgcMe2;e{AxsNsejcIe@UAciR7h$NP1;)y7xsN#w& zw&>!EFvck3j5OA07|%vs_CYjcIxS;poS{ysHB!^>Zz!v zs_Lq&w(9Duu*NFuthCl@>#exvs_U-2_Uh}ezy>Squ*4Q??6JrutL(D>%r@)nv(QE> z?X=WZYwfkzW~=SC+;;2jx8Q~=?zrTZYwo$|rmOC{?6&LfyYR*<@4WQZYwx}I=Bw|% z{PyebzW@g;@W2EYZ1BMdC#>+o3^(lX!w^R-@x&BYZ1KeyXRPtY9Cz&T#~_C+^2j8Y zZ1Tw{r>yeIEVu0P%P_|*^UO5YZ1c@H=dAP2JooJL&p-z)^w2~XZS>K95}@?bOgHWH z(@;k(_0&{XZS~byXRY%C=0<`V++i=G%_uO>XZTH=H z=dJhNeE045-+%`$_~3*WZusGdC$9M7j5qH1a4f!`s=XAF8l1X*KYgmxaY3>?!5Qz`|rR9FZ}St7jOLW$S1G- z^2|5y{PWO9Fa7k?S8x6G*k`Z(_S|>x{rBL9FaG%Cmv8?0=%=s#`s}yw{`>I9FaP}X z*Khy*_~)p$JDv!V;SBgeXj*3RlR&7P|0-FpQxLXGp^u+VF-r%%Ki<$ip7`@P|MQ zq7a8j#3CB;h)7JL5|_xtCOYwnP>iA!r%1&rTJefl%%T?Fx5&jVdhv^345JvwNX9an z@r-CpqZ-%9#x}a~jc|;k9Op>KI@?Jdh?s$45v89NzQVb^PK2Rr#jck&UU)HD>4O>nuc|TXJlr*xQsv%h`A)Q zbSjO`aLvvyD9pl>xx6A2v$U+7!K!*${fJXsSKmOXXlmw%)VytNJM*fstNUF`Z(skN z_JKiG=evZ z#qqlAjlz}sE9=wXO{?6AVR zuL$p_8wW|`KQK`+^~$($a`b+t>4i?Ov$n>Pv$pqa7p<~yx}pnme4dOJ;4gVg`lxzJ znfefY!?S&C1DIYuqz8>#_sHr!maG%ulW1S_sMSt0+Ql77Hr-OjIg@d8ZwgEyCG+jV zEv#|Mt^5-<&KU*$9ts(S`yX`q$x!2@wEkvdwIG~BloT%aT=^K6_bXp2K(RvlRzPu0 z(hFWmeH}EQ^sj9#yRw!e(HZ4J6;fu!mrDWZl`{tq6pK7Ql-vx|A99PnSv?kHm{kMB z^RTso%;oe~1`I=+n#qdgwE8t}eM!T3fAqnI;Tclt>(=!H#Z9-wtW%r2jvP$m@Bes$ z-qNcRbD-s|iDLQNmv-a4R$C8iOj}KeVrsjxAvvRC3a6Oe31X&ZcNM@7^18L(xS-#0 zKPX~)@~4fsy=Ch$m%HbIos|BEGCTD5l`0p|ePrEZ#FWam zFkQGl?R6*7^Qa~GjaJl?NU31YWuwvfY==F64X#TyN#cov^FY8=FfD zHp)}vX*5@jW~4@>3Y0h&=6btN#3SAbj_%)THP%~AM;|?{mem2=G||OHkxw5!<8Ena zrkjmKRH;SnM`c9Ip{8Sq-<$nBk!-Z>k^1aAv5rQt6I6r^5>n<|sj+}V#yhw|4H}XR!UhLmi)18{W zoPD9x?jm)oZ;MU7V^@g!J1pC<_i#qZMdl3(`>sO+!I$l&F|D55Ie1tXMTor z-^QxZja~KJ5y`z>DLIg`fna_<5U_^(buVhSR8D1uX3-ioP(8O<+~C+OnyYgt-U#Np z_AI+SAM4B4k|_SX+-g1B4nh5TkOZf=X&=-X$uRp~>XLn4TVuJYO?s_dBeiJr?8DI_ zx8oJWlPf;AZ$s!~57-eCdwqZZygh)u%J9CR?6<>mXs7B`andG(_*RamtTxMTd$&HG z9sbz2Tb;l>R^q-R*H@SMZ?R}_*3@Md;yUd1vt)E)ujd$Te(Cv_fWo+Ram+@fJ_g9-DUD5hzs43BJS5ow9EH z@niV)6f!UZQtr~G=a}4%3=X+=!(-`FMXgHQx|2Csa_{MWx<--*3PPT;ISgm*R<0vY z#yt8wq%SKDhl|SsJrYno{*j?uI62|qNmgz9sok%tIYr?tL&9JX?WN=d{Oq;pkGR$9V%6XoKg0U5{@yCz>pMYD+6@N| zb^PF7nDBRfK^W=E0t)_q=dUp!KRxsNJ0r~1-%ZUW%E2w7Z0}!RlI^u;_RQDtT?3zd zjWraUXsBv3v^DmD7<}HL>U7=>4EmTE)mP~D>ev~qw?}}}+~A4Y_(#1f1i^UZ>|a|F zrX?Yol^(!8JFtYP;h+hnbOwjAzJ6}E*!k9J_vT}7BOWcUG(NffkL*WRl~mW>V1l7b z4axC~xXtRrrvuIt4~7%RWNZB@?!*iqOV?Cy*=?fN{8;^?uioi;#=QfpCuUD5zj|LB z6v2?iE!g{BI$PHJuzl*#29I9%6vBTtWAJJkiVY!Ny#bdpXteya`l}JoI#3urxq6i) z?0NNYljj^4OMoEf7_0-0o|`|$yZ=%T7d1?3uW!OU0u~M_xz8#o3*X8bqtB$HrJHuw z%G-Z``QH0!{<)i=dp_b@z3BIvn(=mua^u;eK9_~xw!d;!UVnSa-xaFTth#Eh6WdEu ze!W@SB>-XTcuCR5u+ipxY?->xFZHPHcFA3cF;IJk<7?#B9#y;!_nVEYy$mPV!5=+~ z2ccr6G@^f-NB2VFBtcOJI%3XR#8vyo-Bb@Fn#Z~vM?9Pl@7wo`G>;I;#^26(e!2sG zVdS~qNVpL`$e87>fF+YaHucK zO`VOj=|J9DK;8u<*~1c{s6=meqVGt8f`*|Y3Zw*!4|9yv5k}~;qpw7OuJ2-tA)usQMx3>k_-2BDI2Kxi)wv`AhX4l5OhnlaXs!t^>>+@wD4 zM+Z)biu(o1*w)DSV3AP;&G=r6qrh-9$20~T_r?*YhQgSzG0K)W+0L+|wNc`h=&p!# zI3YdbXX;f@<}NG?KxfHuvPMu?J_}0(10g?Nyd2pl4rJSnhFnD_h}O>^2y4N!1$bu!L1&TR4<-s=M0_W~n?nqhBr?^A_6XwsMWUEk zE?F(t+9Ws3FBjiJ^jOSIKZXg?*XTO68IGfi!gCaP_rh6t#N2%4A{Jw}Wk%b_2zqCbYxk0I!P zEYXd?j0``9To?UMF2exMU@S6}yBMlkOnrdK@nfo6F*UhNX+HDiB2!z6;iJZoMldfe zG4-9vx^;Oyqj@@Ac?Jske;edqke2$WUQzyoi zSL0UP;2wc;Iq_Wd!8|UV&)p~B;>CD?8c)k4-`YR_finY=!n5b{9xBjWmv~N6MIK!R zP^+Rx{zbkD6hCf}cUMthO5s0J#Q|Eyp-Y8f{>4vHiX)wKqq~ZqEfw235~ZwozdU*A xswJ^0tXVE=zN;jDsl*>vBA!yR$t+2XFI{Dp5>!i(R;7RVmF`N0sRDrE{{Ujou?PSF diff --git a/Docs/Raw-Flags/saint-kitts-and-nevis.gif b/Docs/Raw-Flags/saint-kitts-and-nevis.gif deleted file mode 100644 index 8036b6a1e5c69158332b3d68c790a52cb72bd7ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6152 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 diff --git a/Docs/Raw-Flags/samoa.gif b/Docs/Raw-Flags/samoa.gif deleted file mode 100644 index 08f135c84dc75b270d4f695c77973c0c2e06fb84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2219 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 diff --git a/Docs/Raw-Flags/sao-tome-and-principe.gif b/Docs/Raw-Flags/sao-tome-and-principe.gif deleted file mode 100644 index 046c6d9155b6c04d826ef0eb1d9364a2b4f276eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3978 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 diff --git a/Docs/Raw-Flags/saudi-arabia.gif b/Docs/Raw-Flags/saudi-arabia.gif deleted file mode 100644 index 02838b2aa3df44511873bba4a5d73c623962b474..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18855 zcmcGU)mzk$^Y-7{OD`P~OG>lAk^(N>uyi*_OCuoSE?pue4bt5qAn0f56p;=^K%@jk z1jXd}{{Dz(&gN*Yx#pgOdCje@t0gbzVhzp&Ed#*y_4SV*KMoEKR#sNV$H!m1c+t|* zQc_Zqo}PaH{(WCxUt3#SJv}`&H8n{|Np5a#6bc302Y?U&@C5)j0I&rBQvlEd05t$m z002n<5CQ;h0AK+C6aXNB|KB0{e+B-p7XW@uN)FT!WqUkX9X#cy_;kKLRIkOhZLK+c z<}~WR?e+)*@#5Eq-BGXZ4!l3>i#BT8{BkuI^ZLv0YXUJgEPs=MRtEy{i>*^aCo0?l%+uA!iySjUx_4f5Y9~gY`@;}nh@W|-c z_{8MY^vvw5x!3b=78aM5S60{7H#XnC+j_sfv-@H1gTWDfBycv1|a0@I_>2{aY%Y$`^ol-kt7taUWraeD>FnS6}fbct?P?WkmI*gU3IUopW@=kIrO^g-&E=32s=!7H!RlStMp3s zdK#CTtlM3!qcEsXeLS| z3O%&u!}80u1MgC?E5M+lWPOH%uu!5ov4k_wh$uN)QRx{^MH~biPe$RTPu1nsLJ)ge zRXzkkqN01P5C4p+LqH%@^c7fM^%∾SsUD4Y6veCDsY}MRe1BG7#{(3LKE+r*OGc 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

(Hh`O-pcocYsVm*w# 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 YlyxZ~OBSA!72K3{Wju>_6bLx`AAvtGi2wiq diff --git a/Docs/Raw-Flags/slovakia.gif b/Docs/Raw-Flags/slovakia.gif deleted file mode 100644 index f997d1ca8e6e7ab885fc6ab82fc1f5328854da3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4706 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 diff --git a/Docs/Raw-Flags/solomon-islands.gif b/Docs/Raw-Flags/solomon-islands.gif deleted file mode 100644 index 7fe42e8cd8e097131a847f9dd6d8ee09a82765ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 L9r(pX83F)12(exO diff --git a/Docs/Raw-Flags/somalia.gif b/Docs/Raw-Flags/somalia.gif deleted file mode 100644 index 50876564aa8defa5c21459d51818211091009851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2010 zcmV<02PODNNk%v~VORo?0mJ|R|NsB@_xI=L_tw_$&c^S(wdbv^-khA?jEvTMd)9Mn z&SP56QcA``ImR(5y&)LA7znip0JQ)B00000000000000000000000000000000000 z000000000000000EC2ui09XQ$0RRR6U?h%YX`X1Ru59bRa4gSsZQppV?|kq7z@TtQ zEE41ejE#0PICJXU$+M@=pFo2O9ZIyQ z(W6L{DqYI7sne%Wqe`7hwW`&tShH%~%C)Q4uVBN99ZR;X*|TWVs$I*rt=qS7(BTJrK)PV!a0udm<9B{w@&i@<) z2yhuRKLn#Uo8C8I^yk(2M2{v78z1V~s%zJ4J^Qupd9r8I{w?pe@Z7}T@fPkodAs1k zhdXCyJUa5}>6S-tj{O|;=+e8Js}BCU_;K37b3Y&MJNWSI!I6J&K7P0K@7LSk=KekW z{n{wtA9xA?=nVk_Mn{1Ef!sWhAb1Zj7~q4^6(}J#2vRuPf)`rjpoYRl*da9nf;gLn zBTAE@i2-n!A~YYeIGTtrI#Z&I0iakTGb_sI;*QG1h+_aW0*TCxL+WUxF+Jk=&L>lS4kKr7u!WN#&QoTq$OjWa`4@lwPKZOPFGg>837b#);;fw5%y+ zn|R6sXPk2ONlTr8-YKXnddA7;p{)D~XrPR`Lg=H0Mv6+JfG%pODULo0>87Ym>S?8* zih}8*nwAO*1fD(!fvTu1&}xDUzwvHFDvGSX`d6#4q2OBVd%Gh0 ziLcAP7p$|K5F0K3c*jz^iL%#5*Q~agK-+C}(}HV>wc`qxt+`P^a6r27#w%~D2b3%5 z0s_pd@4ozkC&0RqK5%Nk1Q(2Ik)Y0J@WKq^SRbeiaP!e6h{`n6q(Uu%13^zcbkSD3;I7tM*V{D=_<}9;zhlebz`$lROn}j8!|-+6 zBO~y1+%7~+cf}XueS^k(yZy1>GbkMRyblvTgWiYh+qdF7#N4>NHbd@1&XafBv*kXZ zocXdXa~_2MqR6TyNpiLj)dyB2OvP}y7#bl?*qOa z{1S5$FPzxNGf}qkXgBY~@Vy%^Jrsr?p7`}jFh2R?+)DxY;RFmG{u9|Vz5V%4cy4y+ z>|;Ut)ThUvMan}9VE-2V?F{$+RY>2=)(5~Qux(_iD&P`2r8Dy>kO{n78SoxhgafK9 zffOtP19#@Y3>pDlV4I)^f1ot5eQShC5LesohC(5L&};x}ArVSwwiC*b2$Q>^5g0Hz zjOlO)?`qruemDgD?M;6~1Og8;=ffoSK!92!pc7?~wYKSJiZ$rp-u{Qh8bA?jQtToN zsz|s0D~j<28*Ez#&$xmJhLDXkuwbh^qc04?u>@(%RlSlIuQlE=YAkDF1iY6n5#Eu8 z(ejuH9w0M#+3=4kP~o*UcLL0fi-nLJ!3&EuI~BlgTrtdK2@t7AOp<_)%X*|JNzg6u zy?~I#GUXqaxGY7^fRWb{RC7_1L%m|QCMz#b3F6Y=yE#l~xK?r7?xClvWKIoW4NM@YEh{bPe2%1Nb zCXUR=MssQin@P~7jMxcBH@+vFO&BMZb}7f`pwkKJG?5*Xm`C*xbb9vmj~|_A(AnVs zlM4EzkRfl_$ZJy53Ia_~0WvAc2O(4o3I&lYiMYuDJ#-5Z9Z)E{NJ@*6L7oXxB^F!C zteIvZq~I~C44vtp=%FE{>bheu{Zl?R#PmJfWMeUfb5k_rbTrEpBU72!8iBPSHJ8&BImyLqzg)wGP3gX9kxufU^1_nfz>FaM}upC%iG@i_P4+du5gD-+~OMdxX4Yea+k~8<~sMe(2cHir%T=HTKBqN*v+nX zx69q`diT5F4X=2|OWyLD_q^y$uX@+Z-uAlpz3`2%eCJEw`r7xt_|30=_sie@`uD#8 s4zPd+OyB|=_`nEGu!0xN;08PR!4QtHgeOel3S0QX7|yVU9TEZnJ5D$bG5`Po diff --git a/Docs/Raw-Flags/south-africa.gif b/Docs/Raw-Flags/south-africa.gif deleted file mode 100644 index 48164f221111857d913fde7f5aa77bf2b275dbd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5116 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 diff --git a/Docs/Raw-Flags/south-korea.gif b/Docs/Raw-Flags/south-korea.gif deleted file mode 100644 index 7e79e557a772dce740d413e7c7df5cee1b9a094c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6838 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

Q&P^?xk5Dv?fU>{5mA>#Oz z@=2&Z_{2I8GLq5WjmI;k?(af>xcNTe&|E~V(rGWGr@qjG9987>jOII$Ll=1qQ%y~P zY*f?=5BB5k1r2SdqMYaR=?Hk=C#pn9(%PUr%|ok8-QDhS--7O` zpi!97LeG=hxCi1ACQx#2oupU+)Io1;4#D;D;!Dgl=TVuVUd(a1QYkTEwqj}FkhrxG z`#$1ebe^DC0zb`{Txv(`UMHBU!~d{md^$E?RVJn`A?e(Lhdg*ZtUOB%pgB?#&C7qE zK6OXhwH8mo`vrGR>(ONUR#N7ujXE>Ip>gGgUcfvJT@I~I5q<7V1sT0Q%HGXPF6lk& zt8NLLT)DoB4(0LGjWY-!QGSj;Q6|l)oH_|u=v0$9X+kLb4JAbw7ZVK=soQDz49&5m zTnHcYf1>QC-yKyB7H+Dk_Yq_0@(8<|I~_A;=2#e-*xhDUeDKt;sSH2>|%9};^$LLz1)$r^?8-#B&&GDW9}1$(h=gzqB(C4r7m6H#|h+WtP&JR z6f4|unTIUJ$sydsmAN|~>6wyuk)x2|)O>2psptJK-}iqN2R+QX$oJX$Yrr6gi+epK zH3a5CMXP{_GUnZQrHUR!uOIYRClee|=@rUMdc+GxE7D5Ll?KL4G@ z_xyf*=)5-h((dMvV2&#}#Q6b&x?v*j)QM8F;nGs3W~{dfNgk$$Ad3%h0*+2@#hgtR zLa8iN?8|YF_?ho-*&~1?_UO=7(2%?RJdjurq=rW!Q{B{{G^KL+7 z^Z;SflTM6FB;fomMk2>%z)%6opzTPbdIoV+fLN)h(D^ARbi@)C2ahWn*+=s?a8c{c zk6Qx-Q$rfq*jso+DQIz7Xuv)qk#|Z|5HBL?`jWq3a{5N`@;***?;l_x)$aC6dKR)I z?N%o7Y?eIjexU~8PdwYbvIzyc@@S|+L7Z=zr*Q-VBa@l<+{~_>p{4kHBVwj0Yz0H~#0FJt}2Y=}$7$hGy5hPGO_`3qdq;=47nSIhe&0FNT<2^Cy6ul?= zc(=5KtP`3&&zWCZQ=2~ZycEA@q{ZbhS4AjZbd}PmN65MpIG1+NORbOadO_?W8iXQ%Dujrqjg8@lFDkPoR@d zp_w~#UDG3GMTlcrHB9DuOP;htW?Ru{d+k>{nL zok;35=e1uQM)%y1`o(||J9Lh!>{~tkqKCOerP>_Sp?%n-;W-%x`y@awUR~4()4#S* z)5Pb&ZuKD7E!_k09*5J%q@_G7T&kv#iyY- zFm><8Bg#sZV1sl;_CgVxL=#%RL+3{6hcY-Sx|%8n&*aC)e(ECz9%+MJ4n>l+kM)hT zntc1jTud`0>&Jt8kNM!M6s>v8{NFOjk3e>s+jDc|V6HjO-9VbUjq@mJw=i3W`psdl zzbk~P(oxETdf$lY*{Nw0CmyWeP@mI!V97sWvjKPXJ83yLJG=&D$xlLL#`2l+70>+} zq3J$oCBq4DMP1O_itXV_84{`6fK8BsIXP6^7X`%GfK}M2{Oo=o%KI%J_SR@1SGYzs4pPSbCcW1#5Z{0f*iLK8GHoa$l zq95KxH@r%)vL|@&77ZjTmYezv1i{Qv*&ZLYEsj{1E?)*zy~O5|WJx@syIA65+ammJ z+xQ%L6d0YDz6qYTg=kDbxD(4h>HZ-A0JSjQlgPVwzFTAl+Um$rqAO)BUP5A(V&W)5 z65$k*X5&94jAzAw;RO`+j#lFWO?Y6mOgfmdrHC@@zZjZO_ScfIe!&1-m9?kU;+f=4s95io^K zvGFm{g@Ei8R6{n<9OFqu*>k{xLPCNBR#3&S-p$irpP3P)<_cM)Z_7JncX-2?OFNC? zKP7-~x4GEuxGVnK_1+0u6~LGQ_DvYFOnYIh_Fj`l_^f_IIa>{JMV+TT$=G_O-bQ#p zxv==|J9x23YTBn(`_bNtdwBaYOIx5e!`)v=2k8~W)-vrc{YrW=2VL9Bf0nkv8AZ}< z9B(=c@eq!}91dEzL+VzsEZ$cBWVejgq9<`zhT2Bb+Cgz`SIjRa{melnY!X^m%mw0< zC8;8&s$#oWrDDDJd2Bazu2M>$lUZ*?9qZWS=!o&!vkv5p`BX7dx2MzQsN1)vJM5@8 zy{EV6sK2(SzvF0dvS)DRX!v{2@Vv@Yp^BapK)|qX%oa~*Q z-4C4ooL#~WT(HirNe8Z(&TfSVZWYe%4F~RR&K`XS9>dO_(+8f5&R%N=UOUd-CkNhF z&QE_IJO#PxgQ4kxdewD z24h`9k`6;MT|x^FLn~au8VGBX?Y)P7b54T%P?tdI-k&}bV{vSWk-qV%I$i;;IMd1E*G-Lq1UeS$B$$kdcy;a*Sw$l$n~FoSi_HXpWwvq@|{tpmmt1tgWuEaH(~o zu(h_gxJ|NwtGT|vz`-uNfwaQM$jPt7jJ?Xw(9x01jKM=;AJk97BramnF9Xk>%JFaBYRy4~_tlGB++0sJ` zw{AYU^xWFr`ws6ux_kqN^Se*4;KSDl3j~a~aWcgM4LhFv3vxonlrulH9671x&yP7@ z22EO+Xo!+atEP1NBIebw6}7&YI<{>>vpv4P&09}ykF|RXkM&#k@Z*V!mkf@)IT+&mTqp zqxJPCAPN5+wcmjD73fs|fC$E?pi>7nSl)wFF(@H;6jBx8h0|rIm4zHS=b=^`hA7;K zV1a02ZzzIQ;)<}fXqJjFt|p^dFV^_kjcn1Vqh>s^mE(_%1u2)0L?ULSTtg7-py;??AoX;tZ$lvt9brC(QedDWMMaVe%$WD*wUnMI|kn3-%6<)&h5#);FMkilu^ zO?X09=bkF{X_=mYrX;9ke-_Hop_~z_=thikmgu7nMJk%3ls06kXp?3N(59zh>ghkA zp4RE8`ji?fs$;5Zs%NaW>1u1D#){6Yvz=;dK)B9U>#o}Lnwze`MkDNRzZMJ4vA+?k z>@mz1m+Z5qMcXX@tkkY$t+d%fx@~dJb_>h5&`m4uGUO^3?zyI&DB; zyxhTSFDm%bi|xL*_M0!jeF@B6y#yy`uz30=jL5?1A?)xU5VzOx#C}xVp2QgEq49hd zcZ|o!^KmTl8zko!^2u(boS(@om*Mh%E5}U6%>Th`^A|W5So6*@^_=s+K$9Z0f?e^Pn$1V5V zbk}Y7-FWA%_uhQ>?f2h+>rHls4-gQ*;fN=$_~MK=?)c-7M=tr~lvi%~<(Ox#`R1H= z?)m4SV?Mb5hYEyl`st{ruKMb%x9+J|gYNH}CxO&_}Pk@+bx`{q@*qul@GEQ@_07+=nmz_~hU2eT&wYum1Y%w?Fy$ zEi&)^{Pfo^KKwGKZ~y-M_dh)TGLoPF21vjH#twk_GoS(&$UxB{Fo57|pads4!3Xk4 ze-zB12KQ${9tm)RAPiyoIv6AjitvOej2;Pt^uZLm@P+?dVF_VK!x~OchAfPr4R^>x z)ZuVRChVaQhiJJUE~$k?OrjFIXG9|fafwhQViTc+#3)*Ehf}Q56R*g{6lSqXRqUb| zLHI@gEp2g(Xl!5^wG_rQy0L(3{L&fUNJsm{@k?#2qaNFLM>5TEkAS>iAMvQeKpK*K zgG|#O56MX9B{EHUY@{TO_eeJ_a*~+5VI|2F$xM3EcAK2jB|k~Z1BMckg)F5iU3W@6 zjdGQ+)Lbj^)X7-d@^Z86(<^VuOULE1Pqpl&FcX)<%*073oNnb6i zSLSnl+7u!JqFas-Rm#42_+ zhi$B5A1fNhN_Mi8RZL_ri`mTL#j>33tY^Wp+0cr1v`zu7X-|vVnUr?5tZl7FR14eK z%2pt+t*vcu%MRM=cDKA`Ms9x#+~CT>x5O>3aTzh(#+B}M zv3pzVZkM~Q)$Vt}>sjxPm%Nk}?|IQ%So5xzy?a&fd*RDg_s*BTVwLZG@jF%f?w7wu z)$e}+j8p#(n7}R-@PQHhQ3EfS!4*~TgCT5C2Tz#7{FLy8G2BiIZLP3S`Vd8QMnzy%h~=tevG(U6Y+w4^6Z=}KGr z(wNS)rZ>&$PJ8;(pboXDM@{NayOaVJD7C6r&FWUW`qi+GwXA17Ymz3K*0|2Ku6NDr zUiQ4 z9`Q9Uo$6T6I;hteb*+2->zMxH)xl2ovO_wHT{pYh)!xLhul?<0H)7i1PIs^4(Cu~4 zJJw}5cfI>v>LkSb-v`h14)&e!h&TEJ1)uoF108{fcf90vjz7jv{_-@3U*s{*d6#?7 z@|_Po%Bi<`(VJf6zXSd0SI=?Tm7evmxA@>xAN$%voNTYRz3xk1HQMj~_Xn?9?txGI zfHTea#ZUgek2ZYeJ0IUYL;mxpFK?VRpZeHmx67oT{qCnbW!Lw<_;0Q;?vMZc;MQ39 z(a(NuL(Kf`kAJxhwto5BKiUF=|NZyx?0(gs{{V<=^P+$M0a$>=<}UwdfC`v&+d_Z~ z_<+3jEeQyL6qsw);(!&Hf$erI6R3e62y4fJfgd=6ttKoTNP;M+YPceTDcFLeHY+FS zf-<;urNV+Uc!Ql*Dlv$IJg8}#VuL*xg!L9FJ1B%kNNJ1$gh#l9k#;CW$b?YnXnmrD zQCNkGh9^⋙wY$RH%hpNG4h6gtiMjVOtecp8yt ziI->@m8glEs2G{(iJyoUohXW<$QGe!il?X*rKpOztLPM|=!&nX6RjwVv&a&$Xp6Ua z5w)m`yOEq#_>1irkGBYq^f-(2c#o@SkNS9u`Ph%2 z$d3TIiT^l|lPHh|`G^IXkcWtn3^|Ak`H*|)kP>-^5m}LMNRb%1h8MY!W2liH`Gp-B Ol2!sZeCa8^&WAt^S3lF-OWf`X6 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 Ke(rMsu>K#89${_-7MfECY;r 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

l~#ogGwtFgK8DtfSKVGmv^5rXgp#zT(edT~Q;Q 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 bifJzG8#(Ol1uN;d{`7WXnaU?P09OA4-X&@& diff --git a/Docs/Raw-Flags/burma.gif b/Docs/Raw-Flags/burma.gif deleted file mode 100644 index 44d63cc1e184b0e63c5839dc7a00064701da4cc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11558 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 diff --git a/Docs/Raw-Flags/canada.gif b/Docs/Raw-Flags/canada.gif deleted file mode 100644 index e4aafab3ec2e31232f04cb945c9c4801c8efdd1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3984 zcmb7-`9IT-}^YMIMusE-K#@z`_0X+o(fk5!%KluEO@$rqmzKzDm z{K`sxZZ1DHb(TPw_4S=~aT&L?9M>~_sj2f)R`Dei*$4bTIPyRDe=k5-;HL7x(>otm zUgfvmS+oB|@SXQzRT~i-f^KG@`4M!wxu;^EpMJqGJJ_<)rTSrUDDM-#Yp!Oe`6>O? zN&|lAbo%?vmI#}&oavp8s8<`+Ys45*Y+TU&sH9|aO6rmLbjrhw%oB-eIaC_mKPxZ4 zfN9AnDlRF-usG!v71?FgHMLRPhQ_AYs=BuJ4#(!M?w;$dkDv8DkM14hy)b&(KRohm zXzb0mS2cHa6qeK7IS{w6*gyVf*(V+%5o-_eRmstlsHblml_8{Y{#q1 zn?mJzBHYPf&(~^3JjV>D#=ywNyu-(;X3hnFh2sg$0aA~NpLXQA>NW1V5wOGOLt1pG zPg9h00x!0TdJa$z``QG_-CG=D%HR(gsWz-Cb-M2ISec|81-{1Me(OJS8OcNn}uQ@@Ckm|$)No;#z&K-Fk z_bM*I0jFprD^fb2@G%%Vk*Gjd@wl#%t?@EhqkKm$O$(s7*6>?+-m=L zn&IeTkuz3AZ;0Zy&s*h~xmxR@t94Y#VrHEg?M>F@UJq4AC$Dfze~1_*H^*nGsT+JV z!$R60j0IwVmz>sRKWGvWn;R4wKMhebB;L+<90~!HAcS4U!O-fwcJj)257HR>s zKHj*sbo%b+SjiLDoGWZP%H8@PnBPK=55=Y`+!8bIA@-|Tt;lxULv!7E!k0>ceekS{ z^}NJJi)RekjTiOq`>gJ6C7B}RWuN~W_R)Rxx6mEo0o${#wl_6z)P8y4cn>H0;!6KJ zkGG%3%&;#nEE1k|nrUEMl=y+KOuG2B1O;@A8o% zVZ2cD7}0~V)=P!*La&{4|2!E|Iw0PSR_u|Tz)pZTU;hT&rOa5!^rl9W6=>@CM8fqMgm8-iQ#k%<=1)#HsB9q?RMrT zQm=_~oL#a#SMt(Dwy2DUPRhRrEWd@CJP{ltZCP0k%xi|qK0A@&p@}t&M>6>5{WX@7 z>dZa)YXx;8aX6Zl+ozqm!?5F;C{I!41VnM!}O9Q@|I0Z$7xeZDf>$cY7@9V zD=$;bp(E#h<1@@fErrudhm|#rTC>@}aZHJsf+O6Sd={gc{p$%_`OJL3L!G^p6Kzoq zGdXZ08*-TLC!~JJ`y$&-HH#*@WEVKl>5ttKXOG2Uo(Edrva2V|xB*}1?8x7G6hTd% zeP{CCik~wg`UEgD3zIBWaWT6eb@f zgnTY(_+94Yqjz==04P^dk(nfmL*ds*)w4=m(*AWg8UFgBS(cc!Ys}Riltag6Cd|Rw z^g0S;uN?RYMtEa+W1r$%X)Lx9i}OBo9WKySM)W8z;w%Z$8wu}LlhDq?@Hr;7^k-C%5o3F88Zu}pspDQBFW^cEq}I2VjzMD zMt+1q3|OE~`>r24K#m24wZM>7F`&JadEhD)L7Y(C4YqoZ&Ygh4=03^(BF>1<^T4BSI2ky~7F(|bH0HI$gj9%I-6Bo-95oy*#JVqaX zbTe=fo`^<}*bRdc-9C?XY=`}JzH^7>h+Fg?-tyy9Rl+*Uu7M{3gFZ;D87A%Tl*^=V z_p{TNjr@)f50_41zwO_9^rUI9i?sNiCOK*CkvkFicN1DX1y8YRmstH-ABDK8`FKCx zoWc7zyXIPMOG{GfjEC6YbkkhI<&EpQPxMTn_%poO&HNoBcT+|v9){^Ml|Bb$@s?21SN8R(`hOk87A}1U1B?q!<2L^OV--!xi(2<)=r{!*)BjU+GpupfQwAF5{e zVM!)@_rRQgosHd$xnlugdQVx%wU9q+glH4>r#5PJ%6glm4YR4VhR|;1SyUdAV6v!1 zea`Eax_|%D?BRg${`(&5w!7`K1{*&ukZxPLF4+7=>s?PX(=Hl+1TuI4HgNkR|JS~^ zcyYnfc)Kz3>UC`i&EpQpOlAJ8ONnNLja&=}~zC`U- zz?GOTED0P$aw{SAbd%KB5vszmg9@=7^Q4~*F=NEod{*pRx7aacM21d8u~#1BD|;9=jIAZ6!fLQQsA!1PpdG8ifC(fafF0 zL!-$uTge`5@~*Zq;*xP_f67my&pO3p#x12!3Dv!fR1qQfwxk?UjI`cKU71T!0i}AI zr}3Fd{<5jLP-OiZR91-8)Qb3|ij>Am()%O?1ew&uj=Inv1@1|c?{Uj=dhiCBjL=Co zfTrvclWzkc@nPUY767#apd2vN8GurNm6MduIAMBN>Q28HF-!!ZP5J0Wfm$TZ7D0rF z6mc3Ls!b{B$F|AFtyAN^;lL8ihZ5lc6qc^P`S6@J01XEuoHN9SGe%>{Tw-ch2IA&v ziZ~OH@cz%qGH}auQvjgefCL9P&jJ62ItUK`6fb-ONc`7@!EC&5Lnj|WXc^E)kFrpA zRIr)Bidiig7!8Fq9s7rOIFy79}}_mkrY-r%5CWgO>(`ex2QraAX$;J9#Uf4Ref zdelgZsI=9b^vTGF&fsJVl>`_SPs@oIpk=JmD0(#IK$?vtHSO+$B2D^>D;UghDoHcF ztTq)jN4I}X8y}^YJ4bM7;06mt+JJQ3B;#6aPV)exb(PQ_j(I+b9|#BcI-hz9L-(}i z7Qf9^+srk;Nl(k>k$b364w(2gB_lU*S-@!lgHErGDh(C2Zx7O@?z# z3g%nsZH3^?WZD-w*&R78!APqdXjiMo8!hZ|3{ox!BWnp@vf^kRM7a!V@Hi`(`P;c5 z`+k8Oy`U`|oiJWd(#m{v2@m&SFx?9!EDN((g_47X59SM{*YZjgi>kv}Ecc?uaHifa zL4B}DbFJtwxsbss>eOR}yB9yPD5kTDhX;yPF~!H=B}XwOCouV?tZdcpY`R5>!5S63 zR&v27#~ogLwv8r2E@J2au9KzygC+6F#a9bad_BxPxYeidvUqA49*qnc)QlvXN1)l- zI_x-ndJvvntx-zWM@746rukSnp*d%>*jZ#m`kF?L3rD++Gdsb_Z)1C*%Oi1|V$1jh zd^rYIE+{8+I8)`f2g++KAC&4>j8Qm=9u@GI3SwbJ!63VnT;7Q0%6u<>>f_Rf=T=g< zgLHTYU46)f{RCY}K25K6TH{VmRZ3`7%#j~`(60*kUb##TT%uR?4_1EE zhrPn6Z=lnC^s8&(+--8@XL|J-x%&57<*(gpK(+?Vh!(n9^W{uAw4!>wt!93$T0*pX z1znrCr*GuFljqeO*k8xXsa07IP$Sem&Z)z+M~P3@75%8w=7lO7 z)LWL-oL;Y$V$`4Ato7`zm*mx9*PTrb8a!+2&#yy_*HtZkL9H07*3;Fx`x{RhH14}h a2s%Y*)M7Nc5QJ>4R9$^*hEZU^;Qs)cSy%r6 diff --git a/Docs/Raw-Flags/cape-verde.gif b/Docs/Raw-Flags/cape-verde.gif deleted file mode 100644 index dc2712c4e124893ab91190344ead1c97ec46305e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3504 zcmajh`6Cnl1IO|AHpeFRS?ZgSGWVUia+EB>oFC~zeI$Hb_5FN&=nx$e&Hzh}MmZ2ERz8`$J0Ms4;2i0)!91f^(kOl`)0E7b&0)RIF?f|#|U;%&$0J;Fk1Aqqq z=Kqh@Ua+?XhzM9IL3k~hC+xi7&KssV+=82SCGKS-#kae^hP|CE4|O<3>6>SU_59WF ziC25iscd|O|N24S%8q~#L5z%wj){$X6rYgzIOz!~IVCmiX?g}ZGmAo{W#`ay8PD>b zzsN5rEP7d7Qd(ACQCY>Tu6b2kSKsiu@y%OSQ*%peTYCq)v#Xoa)7!^=_r8B%aA?$B9pqQ`0k_XTQwNFDx!CfBm+?TU}fK{$pd4zqP&d^VhBbz{F(n<@BaV_yLV8 z?DE`}Sd^k26<@(v)2(jF+{o%X*Z1o-Of5>}!fg ztNid}2lJ zlXH4qyE?;8)x6sKx^8`r`^-Masj>dY(n!_yPrZ!|n=6wo2_3OsC(We4%;py4Dwv&= zGW4i@Xk;n$cfp#~R66cUb_pH7fJ1Rw~5;-G0mRkm}a5O!l8AoM HFm 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 jt8D}*y*TR~NBCeUj$~<`XsWJk>%Qx2P z$!tzMv8Z%Pty-_BqIS#edcWYFb4)Iq&lo6n&2GEjtgw7euiJ&_ynfH$sNsNtf`cx1 zhKGoWMSYBoj(dNEl9QBhikFy~iI1F}o=1_DqNAjRny09#TA!?~t_`83va__Rwzs%9 zue-dDv9!R!lDWjir@hF@XurbE&TPif(uT^_)=SLK+S@VH-rrx>;^S%D=I7nu>gz$| z?(YxT==1ae?DzON@cZ!c_5a)Q2^7e$;5dH(6ABy1ke$JY)etJ2D665xZxA!~l1Q=t zW2K8AqiG!JilfJqgF>pzMY5$QlPF`pSxHls%bSj1%G`;ircX^cgYwbIv*?tcNEHcP zy3D9kK}n-hV@h=l(Wh8fNZm@Os#hjgvx+srwJeygXpw{+%Ql4Bw_MW7)v&g0Tex_M z%-w6DuHCVD0|VhpSc2cbSp_TRQMj>#!-$_Qo{Yn>Wd)EU8>P&d#%0TyHS_G;`LpBD zqGgiiY`QV()F@X|Ze92_Y>%=h(vNZ>36ZiQfi3)xS#S)`E}1&L%EN~*+UlTQ{E zWk^#(W!_+tct5!x=zDuGQR%$L9oIOyOFW~=pZYNvdc1S zjq43xx;AdIQS7h~Lq#*%WJiN}n9 zyr{^Sko+;l&!BvX%0sbypUa!TtcS^j(pr`KJ9?S$BBlKr*WO`tud+H$bnHrKVleU{wV z(9NLT;oz-=+g$S9x8G{%U6J5j5S|3!RU)3a;-DB_isNxX&H>~9Pg1^x<(EsIq2`Nl zPM7DSfF8Q&<&gf7=|iBN0p>`u-n#1-z%Hchc+lRL>Z{}agYLWYK8f#x0Z)PLI}-o9 z@lOapyz*i&Zrzpj8Fsx zfWZpRB!V6EAe2DpKoO4cf+aNJ8a5b06<&dbDRd#3NGQMzE(nG-l;I0$$Uhqr2!}n? z;S5ojLm{q-hxYSfe}I@oBOZ~6L3E-Nmk(P5LVju}QN&bbBinFAIkXS`2PLY#Y^dz1@*+o&N1By*F^sonUjPWXRb^b*_`1fwboc;Hfov zCJCQ~)TapeNi~0N2B3))D6r63ONAZ_p^bFtLmArtONkQHX$G|tL?bCtdu+6l9la>h zGCG=%W-_EEZ6!)6+Dwb4w3sV3U<(y0QlXJ_CpG2SO;z*KWX2SLGZkn~ZMM@m^|YEl z)n8EcIaHVxH8w}hW>V?5RC_j6WlufHRY{iBLa{WOF8yjZ!z$Al(ln~=oT~e(s?M!? ztg9VyE5_jZ8??q#t>|N`Ipr!bx@O9*{lu&I^eRriGR&{W0c=49%RRz+)363Ztf>@> zQN~)&vC@Prz$Duo%8t~s(8H`VHLEYq&dRek1+DT#D@@YT%e1)?YdOgZRI>^dwK`QT z@mT9i*SZU~^zbdZfV&;s5>>ap@*0JL<~P zy4J$(w`5yS+A7tyOw}$|xyw55suH}=67Rjpn@{sn6}?tf?_1exI`^6qzRHsC!{{4O z`>qwgZPo8w`3pM#iW0!X5^%)`oKOSj6~TK|a9~M6$3H7;5gqE|Q2{w>G~TR@5r<~Xz4s!I}aEC&v4VT3;8T4KTpok%|*1@6sE6;hz_yket}Cc(F!B0C$BuBanYL{IH9JeseqOMBI_%^Yd%4jL@wAOrZTww( zO4+WSuX73PbqBNEwH@+Vw~f?pPxsr^4fl%24YYEz@7zpE_xAL?V}9$*-{u3jkpzA| zcZU<+=au(u=`B@zcNgE^CHRjGPBVmSPvJjeI8-!lWRAPc>Lui8{l3cxu4MK6@~hRrJi82 zFV^fGM*D}=-e|T%%gA@Crk`=M;}1#;?%vr-nSiBriG22gveW@_S_g ne`3L>81u2#yuUbaIM3?`^g9&&XGwo!)8`oVyH-8E5&!@@T16Nu diff --git a/Docs/Raw-Flags/chile.gif b/Docs/Raw-Flags/chile.gif deleted file mode 100644 index 30b16b6f3353330580ed7dae6193150a46ffe1e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2890 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 diff --git a/Docs/Raw-Flags/china.gif b/Docs/Raw-Flags/china.gif deleted file mode 100644 index 211ebf52d3c3172a4d8d6e0c484e62984340b23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2054 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 diff --git a/Docs/Raw-Flags/comoros.gif b/Docs/Raw-Flags/comoros.gif deleted file mode 100644 index 13f8da6111e22544b625e1b16ed1ba280d9193ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3049 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 SM@rI?n)IY7P3bxl0027+L(O3T diff --git a/Docs/Raw-Flags/cote-d-ivoire.gif b/Docs/Raw-Flags/cote-d-ivoire.gif deleted file mode 100644 index e7323be021fb8be736c84cdf83d06b8e61ffe40b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2525 zcmV<32_p7KNk%v~VORo?0ipl^|NsC0-Z}r)0QdLz0JQ)B0000000000EC2ui09XQ$ z0RRL4D7xJKFv>}*y*TR~!}wq*j$~<`XsWJk>%Qx2P z$!tzMv8Z%Pty-_BqIS#edcWYFb4)Iq&lo6n&2GEjtgw7euiJ&_ynfH$sNsNtf`cx1 zhKGoWMSYBoj(dNEl9QBhikFy~iI1F}o=1_DqNAjRny09#TA!?~t_`83va__Rwzs%9 zue-dDv9!R!lDWjir@hF@XurbE&TPif(uT^_)=SLK+S@VH-rrx>;^S%D=I7nu>gz$| z?(YxT==1ag?DzON@cZ!c_5a)Q2^7e$;5dH(6ABy1ke$JY)etJ2D665xZxA!~l1Q=t zW2K8AqiG!JilfJqgF>pzMY5$QlPF`pSxHls%bSj1%G`;ircX^cgYwbIv*?tcNEHcP zy3D9kK}n-hV@h=l(Wh8fNZm@Os#hjgvx+srwJeygXpw{+%Ql4Bw_MW7)v&g0Tex_M z%-w6DuHCVD0|VhpSc2cbSp_TRQMj>#!-$_Qo{Yn>Wd)EU8>P&d#%0TyHS_G;`LpBD zqGgiiY`QV()F@X|Ze92_Y>%=h(vNZ>36ZiQfi3)xS#S)`E}1&L%EN~*+UlTQ{E zWk^#(W!_+tct5!x=zDuGQR%$L9oIOyOFW~=pZYNvdc1S zjq43xx;AdIQS7h~Lq#*%WJiN}n9 zyr{^Sko+;l&!BvX%0sbypUa!TtcS^j(pr`KJ9?S$BBlKr*WO`tud+H$bnHrKVleU{wV z(9NLT;oz-=+g$S9x8G{%U6J5j5S|3!RU)3a;-DB_isNxX&H>~9Pg1^x<(EsIq2`Nl zPM7DSfF8Q&<&gf7=|iBN0p>`u-n#1-z%Hchc+lRL>Z{}agYLWYK8f#x0Z)PLI}-o9 z@lOapyz*i&Zrzpj8Fs# zfWZpRB!V6EAe2DpKoO4cf+aNJ8a5b06<&dbDRd#3NGQMzE(nG-l;I0$$Uhqr2!}n? z;S5ojLm{q-hxYSfe}I@oBOZ~6L3E-Nmk(P5LVju}QN&bbBinFAIkXS`2PLY#Y^dz1@*+o&N1By*F^sonUjPWXRb^b*_`1fwboc;Hfov zCJCQ~)TapeNi~0N2B3))D6r63ONAZ_p^bFtLmArtONkQHX$G|tL?bCtdu+6l9la>h zGCG=%W-_EEZ6!)6+Dwb4w3sV3U<(y0QlXJ_CpG2SO;z*KWX2SLGZkn~ZMM@m^|YEl z)n8EcIaHVxH8w}hW>V?5RC_j6WlufHRY{iBLa{WOF8yjZ!z$Al(ln~=oT~e(s?M!? ztg9VyE5_jZ8??q#t>|N`Ipr!bx@O9*{lu&I^eRriGR&{W0c=49%RRz+)363Ztf>@> zQN~)&vC@Prz$Duo%8t~s(8H`VHLEYq&dRek1+DT#D@@YT%e1)?YdOgZRI>^dwK`QT z@mT9i*SZU~^zbdZfV&;s5>>ap@*0JL<~P zy4J$(w`5yS+A7tyOw}$|xyw55suH}=67Rjpn@{sn6}?tf?_1exI`^6qzRHsC!{{4O z`>qwgZPo8w`3pM#iW0!X5^%)`oKOSj6~TK|a9~M6$3H7;5gqE|Q2{w>G~TR@5r<~Xz4s!I}aEC&v4VT3;8T4KTpok%|*1@6sE6;hz_yket}Cc(F!B0C$BuBanYL{IH9JeseqOMBI_%^Yd%4jL@wAOrZTww( zO4+WSuX73PbqBNEwH@+Vw~f?pPxsr^4fl%24YYEz@7zpE_xAL?V}9$*-{u3jkpzA| zcZU<+=au(u=`B@zcNgE^CHRjGPBVmSPvJjeI8-!lWRAPc>Lui8{l3cxu4MK6@~hRrJi82 zFV^fGM*D}=-e|T%%gA@Crk`=M;}1#;?%vr-nSiBriG22gveW@_S_g ne`3L>81u2#yuUbaIM3?`^g9&&XGwo!)8`oVyH-8E5&!@@O_v*| diff --git a/Docs/Raw-Flags/croatia.gif b/Docs/Raw-Flags/croatia.gif deleted file mode 100644 index 25c6920076127d7a61cc6539e7949227ff681134..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13740 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 fDmj&%hnJ}vG1ThIWXNUOg5qZ(=j0Y?7?LW{je diff --git a/Docs/Raw-Flags/cyprus.gif b/Docs/Raw-Flags/cyprus.gif deleted file mode 100644 index 7ee3602d91da1702312b6e140c25a56c6587877d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3929 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 N;xmlj@-X1|{{ch$GLrxR diff --git a/Docs/Raw-Flags/czech-republic.gif b/Docs/Raw-Flags/czech-republic.gif deleted file mode 100644 index e99651120bbfbe329daa8a24b5456f414777923e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2726 zcmV;X3R(3>Nk%v~VORo?0kZ%A|NsB@_xIL0Le9qT#sC1l00^7_F?)N~S^#4)DZL>8 zoCpB5000000000000000EC2ui09XQ$0RRO5FpWT~y*TU5yZ>M)j$~<`XsWJk>%MR- z&vdmcN3HLC@BhG{a7Zi~MYo0I$ZR^F(5Q4utp<{}oOR3XdcWYXc!a$z$LO?r&2GCp z<)rpauiNkV{41V3>;Hg(f`ejwSaXDlii?bmFosxuj+2y?mWz;Oh?kt5o}XZuWs;z! zrl+VqqH&w4uCK7M9;5GG;^*k%-?(fg*ndb2I_PFw*?f3lsrTL=h`5Q>k5x`aZ3MyRq z=in-V3?oWpsYnZ=#*ZNXop9uJF{H_pKSuKMh_a>2M=D9aoJn(A%#{;r z>fCwaCbN<}gYxvrjHS?{FNsnEinM7+rPPc%ojMUJH>Omx7PQJus@AXfxRS#Pwro1F zjX%IkagyqaA)e&00-rhoxJ~4)t2~?Av*2SB#CjHx%6*SNk4* z1UN_D#FGOtK2o^y=R25>L=L?=OzFX`YiEL8CH3v#Npz3tJiK`j<70k5&mKeio8{Zf zr||yf`uXPT`;3o2yndhe^;g~he?;*oAan#072tuxC8(5v4EpAvQVT{X+k{X-Xklv@ zLRI00pmk`Kh9GVxqE#Q3_}GbDk*K0#EOM3Ni+#l?mWwpvWusU#=D605XyNFiSwN!I z6Va4Ql+F@M>cuXlXNjDrBGDT73GyRWvQ2yT+-yFUR#EV(wKmOY35020#@dl z8ntPdns8<$r(ti_$Fj#lcb%CwrAs;~wl>uayp3e2sq(W>h$yw;ZM zua*VdE2zY7WvsBt0=jJfZN4@O%Co=?EA1}S>K5&_mSk(3wcJ+Xt#R9i%gDIQfom=% z=#q=gJ2bzS!aG?;8Mj*YCh?6x^M_2&bX&cn3F(#>3+= zEb$iHRmyEUNh)6dj2!%Hi{lH>N}dgGV434-Z1Pyx_&Y3K+2vk z?nT-@Fz-d`ZZ7aj`VKGgN(wJ6@=qGiE%Q$*|10!VI-e}{R7$@p_E}nAEB9Gyk16KI@8z(d_sLH~-g83n?598ny3T(RD4zsPs6w}CQ2hjSp%9JeG8>v6 zgi7@Pq8R-pMZ5FRjC%B=!rUluEDF++n)H++1x`m#%F>oNUf?AscQAB z8RhCtunN|)N>r>W@v2$Zx=^%Mgsg0hD?#0Q5VgwnuKlE|Jm8AgzUou22Rl!| zGJ~&#O)NVN%L~CO_Oaz;tSAr**~*GjvXF4BWjD)E%$9+&oDD5CJ&Og+iuSb8B<%t~ zi`v#IleDIFt!$5pS=P?>w&rAPY;numUK-Z6y$!A{0lQn_8aJe31@3W|%SyKvm$}gY zbthMq8{O)flB>_Pu69QWRqAf{yPH&McEL+tO#0Nj`Dhun8JdT@P#q_ zMGJ43!&lVshe5nV5099{Llp6eQH(pOhOmWn8qBG@r`i|K^yOw#|YH% zkAciT9}k(x^b_)tk&HegFPX{UQ}UCcOg$%0naa$Q@|Cd+JS%UR%ed3>m%+?BFOQkb zq!aU*(Tq7WubIt|Q}dhQOgJ~sna+BX^PTa$HaqW`&tlW_p8-uZKM$JFN)z<|p%Kk9 zLob@qGE?-UAw4ojPnyyhlk}xAtuRY(n$rN&^rt~BFHet})aVlRsZpIRQ?HuU&rQ+T_kI7o7+3m_P4>!B5#kI+#(Y9xzRl#bFZ7-2~zjF;jJHc&zs)wk@vmv-5q=H zo8QvW_rC!?(n1b=-TM;w!3mxke=q#N?Na!|8U9m)PyF59lK90bt`~=Ie8I66<;U-B zERT;I-fW)_o#@dP z`q7bIZKE%p>DgBL)1lsNr%#>g;g>F8G%_DDZ_J{C`}Y_#6KR@r_q}MeQE> zgU7w{Hy;nYeiom(J!v-+ALep7f5_&FE2I`q!ME^{F4t>S5pd%elO=!$h=7@8fD6cgaUgyVcx44Rfp@nG5@>-GmVLSb{QmWg%FDUlsuXJEqI6Pyhe` diff --git a/Docs/Raw-Flags/denmark-original-incorrect.gif b/Docs/Raw-Flags/denmark-original-incorrect.gif deleted file mode 100644 index e1be8f21764032ab458e85802500dbbd1cacf4c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1893 zcmV-r2b%atNk%v~VORo?0ipl^|NsB@_xJbb=f(g4000000000000000EC2ui09XQ$ z0RRL4IJ(^aFv>}*y*O(pg8yJBjwC5;XsWJk>%MR-&vb3yc&>J3@Be|5Zb&Q|kI1BQ z$!yMez^GK{tXi+wtai)oKA_TYkLoR(&*-#zeFTf&Au@YTuiNkVs~gUj=l_6#f`fz$ zdwg$xg^P@hj*mr$h+&G5mY0~BnhcVYQI(saqNAj0ot{6SrK_y1u0*G(W3RNewzn*? zvL?8_zQ4b^yCSN<#>dEx!owiN$Kf(4 z=j-tC@&oO=@ALTi+V!&c`u_lp@k8Y=puvN$26`%pu%W|E3MVmqNUtm|gw+`9Pf=hR&+!Ai< z>dkkT*WSM<`;N#9xG*}w#0)Fmh&ayT#}6AfgG~9Lh1(lzh2!lEm>opKhr+ z_3J95OUKTAkoE51*?bRA{>=FD=((Iv&t8vqzwP7Sd_P#e{VnV7>xV@@@&5n+OymdP zfKT-27=Z}#XCP(?HkgBe4o1k%f(%M%Aq)^+s9^*dZs;K=6nggIh!}K8;)W)kcwvev zO2}f14!#Iuf-=rXV2w5ch+~fX?a1SOKK>|QkV3XcWRd9|iDY?7E*V~vPId=nl-Ny4 zC3RL_`COJ-F2`k;$9)N=aAJ<>TbX9+hGv?!t;wcrZocVSoN}s0XPu?pi6>}!?zvf? zepUu(ppXqp=wgN*YFMI*0>)^gdp!ziU6M`;SEZJ!g=wZ`ZOSQFo_@MjsG?>?YN=G6 zimFqpuDVu;qq)jmtFjJ7YpqtniW;tz-O8(7y8b$yufozqY_TsLi)>2&$}W3Sv(AbH zZL}RtOD$u;UVCP?+N#NIw{3n4E}Y_yJ7>A(+KFzud9KSYpYFc*wdY`5+9+i=G%_uO=&4eQ-_ z=dJhNeE045-+%`$_~3*WZusGdC$9M7j5qH1a4f!`s=XAF8l1X*KYgmxaY3>?!5Qz`|rR9FZ}St7jOLW$S1G- z^2|5y{PWO9Fa7k?S8x6G*k`Z(_S|>x{rBL9FaG%Cmv8?0=%=s#`s}yw{`>I9FaP}X z*Khy*_~)p$JDv!V;SBgeXj*3RlR&7P|0-FpQxLXZX3g+3wle}aaGO0=PShADQ;3O!$Aj(my=aZ(q4JuQ~nN_mV7o~iq zdk87ZJG!!#wumJzo1n{GE}@scOad^2*@jyZvx>AlW+IcROhy{BnWGpcG#~WLX@-%R z*2H8rvw22ra&u(COR8&&ULn+o$g!#JmZ;ydD3$O_Pl2X@~O`Y z@Ux#4_$NRoAkcwwNSy}t2tpJ3$b~Xgk`8@nCBrHI(cw_EqFan8M$u5vjdm2HAFXIe zB|6fFmXx6l3q)nitbm{$#ER(-kEU3L|hU#(?WWjWSYmX(!fO=Vh5xzCLXe$2TXgKoy8Ycc9h%(@W6Zo{;zFzz1A fy95Joz{Kk>^6tyL_(E^J)GIIczRSHQNdN#lgAwTg diff --git a/Docs/Raw-Flags/denmark.gif b/Docs/Raw-Flags/denmark.gif deleted file mode 100644 index 336f9a2f39fa6ad965c95e2080739b67446f60f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13718 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 o*`D&bp7B|q<4K?R`JMNe<1(>J6s14SpWb4 diff --git a/Docs/Raw-Flags/dominica.gif b/Docs/Raw-Flags/dominica.gif deleted file mode 100644 index ae69b33be5815636612bd16c8b3730e7f117b8b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14390 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 diff --git a/Docs/Raw-Flags/dominican-republic.gif b/Docs/Raw-Flags/dominican-republic.gif deleted file mode 100644 index e2620c5b50fbaaeb049d8a5faf70c94894ec17f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8432 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�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 h-zj%YcK%x&o<5PP?p diff --git a/Docs/Raw-Flags/el-salvador.gif b/Docs/Raw-Flags/el-salvador.gif deleted file mode 100644 index 602af34927bbd3cb2cdd0ee906748fc57d52873b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12073 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 R-95i_YweZIdl3l0`+tpZGa~>1 diff --git a/Docs/Raw-Flags/equatorial-guinea.gif b/Docs/Raw-Flags/equatorial-guinea.gif deleted file mode 100644 index c35e9e613d0c3ea91ad412a59bc5c28310b3e008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8884 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 diff --git a/Docs/Raw-Flags/eritrea.gif b/Docs/Raw-Flags/eritrea.gif deleted file mode 100644 index 127a185547ac6c0028d227458954cf1ad0da166b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8154 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 A8UO$Q diff --git a/Docs/Raw-Flags/estonia.gif b/Docs/Raw-Flags/estonia.gif deleted file mode 100644 index 3462f84c4df461a6fc8825d8e4e38881ce3675d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 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 PJ{swym0o(-fB*nHZiTS= diff --git a/Docs/Raw-Flags/finland.gif b/Docs/Raw-Flags/finland.gif deleted file mode 100644 index b923a5b6850de34522a42057f083aabae8a18c1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1812 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 diff --git a/Docs/Raw-Flags/gabon.gif b/Docs/Raw-Flags/gabon.gif deleted file mode 100644 index ec10b2ee0b0df2250496096d9a8468bd723d1d72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 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 diff --git a/Docs/Raw-Flags/germany.gif b/Docs/Raw-Flags/germany.gif deleted file mode 100644 index 4045cd0fa297666a7e29851afd8af37266d208b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 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 D=u4-g|rAYir(G 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 LhnIS(LjV9fyp%MR- z&vb3yc&_h!?@y+naQH#}j>x2P$!t2G(5MtctXhlHtai)odcWZC>q-_H#ptwp&2GE7 zgzD)LE-H2^5X6$@bmcj%=IVw{{P$f%>hWTpfZ6Y?ipOj z&=|rH3L8qCc<3QSiWoCuviL`%$Bz~NIR=ObvZP5kB1xWH$+C&aku77&?DA6O%$qo8 z)Xd4V=Z~E}g9@zybg0pzD~cjr%G83=rcjqYjY?JM)T&r>Ud_ri=GLxYO@0kaR^!;R zXeFLa%eLU!ws7^mjY~J)+&u>h=-tb=uiw9b0}CEZxUk{Fh!ZPb%($`R$B-jSmVD{1 zo&hg2Yu?PcvuDngQ(D6OxwPris8gd3&C#YC(yC+2o=v-U8P*nEw}EZDx9{J;JL7(+ zn+@;a$dfByo@hA2;%kmGpH98{bms!0tC4QKyZ7&^vGdcOhCBH4=+i$GUynQ*^XlWv zpWob))+3R1bcVxiIHFbe*_k&-hbx=7{-7GHs~OA2!5j=7z{pW;f20Mc+G@g zREXh+Ag*SgXpwjr;)y6`rr|RjdSPOUFvjT4ipR9r#fviLsADHI{$e8+IPNIqkXH0~ z%a2;&cpw8DRGM|QODte#Vp2S1US==IX0*yS{Vl zuf)n0tUbdPtL$mV_S5VCve3rX>_E>(YprS1CY0>8+**{a2!%dzXt(6n7s-8ij9c!y zw~g4EB?Js0@4WQZYwx}I=Bw|%{PyebzW@g;@W2EYZ1BMdC#@r&yPYq-HuvQU& zHZjE&3wQBN8GE)d#~p+Au}mS0JaS7VZ+5a*DXX|LOD((n@<}njH1kR|i*z&1IeWWv zNj>}g^G89iH#E^j3v@KnN!PQqM@{qdv{_NlI5kF9TYdFJS)a2tMO}aMHP>N3Gqze~ zA9Hp?X{){VLT&%@Hr#Q$GPgl>+kH1dd7H8~-+fQ=H$Z_4KDa-Hn|nAuiTkm*T#d`| zcs`L!KKVSA$8kCT=9!bRxjdbF{y96LUokrArB`wKI;pF^dOEEW@jC3W3o&~+wcCFC zI0*Fa`|rR9FZ}St7jOLW#=m3$^2|5y{PW1?HQDskS8x6G*k`Z(_S{4E?M2n*ZteFS zg)cs|wdUSs2hKv^KW~9tNFvfKd$|Qg#G?krvN@;fCOxl0Ud$B z1eR%mjcA|)y97Z-NN|Exs^B3mh`}al&=4H#;F3OAh!Bd9PwvW%{!Zv95)#6MEYy(; z2LZzv3Mz%fS)mO9HA6wvaEB@CVIY18#1jc|4@4{?q;U8g9V$_QOw5iGpZLHij%SKg zq@WesgT*ZWW^juD>Y^7t2*w17af~A@qlC_gMiiclL;`GMqKhXqee3$?J$R#|ci;#LU&bcNJ{cRd}NUyFS*1(s&J5;bR#6t zwa8GCiIQ)yq$$6H%Ga#2keRFzycR~wTH5lKxXh(4cgf3MCajga3#Jc9Da>LH6OP7A zW)z62%w`e=na+$R5|}B?YO;Wu*32d+1gXt#-T<543?~qvDb8|Ulbq&E=Qcm7&UUUd zhwhAL2EZxLXwtKu&AcZ*lc~>r7PFuJ3?@JWdb@!V^mPV3=;;!w(9bcnp_h9oL?0*7 zi5{;1q89xdMl*W1jdJvD9{uRqLMqa)k+h^&J1I(^rqY!jt)(vg8BAk(vzgNLWj4L( z$#SaGkMXpp7yBttA12hH(xs?Ig$q)X%9f=vwHCgND!*PL0I6E_s#wjcR=3L4u6ng# zuMDeL$4b_+n)R$`O{-eh%GS2J^{sG?t6b+w*SgyEu6WI>UiZq^zWVjAfDNo*2TRz( z8uqY=O{`)U%h<*`_OXzStYjxk*~(h>vY5@RW;e^(&U*HP_qy24u6DP}-R^q#yWkD4c*jfL@|yR&=uNMB*UR4ay7#^Cjjw#?OW*q1 z_rCbeuYUK--~RgdzW@%ffCo(A0vq_i2u`qq7tG)WJNUs6Ht<&`OyLS!_`(>@u!c8$ zVcUB6!ypc^h(}D~5}WwMC{D48SIpuTyZFU0jQbBf)TmCis#neG2mk;(FJzpd diff --git a/Docs/Raw-Flags/greenland.gif b/Docs/Raw-Flags/greenland.gif deleted file mode 100644 index 3885b7c83528be30b21e6d6cd3e1a881dabd30f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2612 zcmb8o`9Bkk1HkcZ&JZH^>Tx_3HP?gkP(4yH#ENnYr3jhI6{=w|_qvdyX6~_>`=ZZbw=TG>)fBw8)A5$|E{Y&olAT*Ey0C2h7o&TAeV-F0l+uPYyjdOVX zTxRB6Lc&B?*o2SIgrnntx%t4~#@%Y#-LgvEg5vFf{{!T|_P-Z^kL#wGQTr$QV3XxBy=02zS8hq_33^2z#mJXE!F;+sGS;UZA8X3&_%Fr%9 z(&SogxK-&Wd$-{=lYPKNL_|g*-$uuvV&mcy5|fhA@7{m-_$ehd?Q?oYX4aRlm~3oL zZeD&tVG*vl1Wza>mX%jjR#n&3*42|58k?HQE#F!xZS5UY8lBPE)y?er-ut7ke_(KE zcw}^Jd}5L{HT`qu*X-QkcxQcluv<%x8FRSA{MlH+fNLIWa2R19urF~Gf;o_WW<#~)$t%vkXvx@w#4E+}d zlD9FQ5j@8tg`~X6p1>@qrMN0W5g5fUstnCCufpBK9hZkd{V`-juI4eo(=`@uxWcQ{ z+ma=AO;rCE$myV@|w zrJhFp^nBJKjVEv;{C?kbZ^(itWSE&1Ik>xJA(hPBgES+@rY>e-`7z`~j#V}xt1v$&B)T{w2M4PZ}* zSLa#v%PwhPTy$bf4Nk|a#~)ZnAeuKK6^JJnB_ME;z&}a=w2*0-Z>zbHLRkaACX-St zBNI+&zd;@?Yd(%h;QgrbVKkq1BOv3irnlwb8{ae!mJprSFwQ!4`_m1rWJ5_`0@Dx$ z)@?Z>nHAM$dXQ1pt8=m^fFiziOix%Gw(^u|*UTy(IC?!+B?O`fS2u4Zt$?te7o77) z&WQAI+RR$BjGJHlEXI#3_hepb5nFo|+5M)JbZN|5=JYdGWU^81^vvmrs!8+#qm~t7 zr%^g%&cMH<1h#f@xO2SCmI1@LrkAz*j0y_2bRpF0 z`D_`Ns#5OBByAg_WQrV9R_#o?cd#$zqr$y5ivHq4>=Z8N)UVvjp5Nigp^GZzfIYQq zLho-0T6Y?OQW(-HVHR|h3mU(@eg-bp%wJ~#CBPzDRT|zRX{qot>_eHk`i#!s$ zkYHgmP?wjqUlO<|UvD$ID-rxG;|&7?-4e9I%Srq>1M&RPz4uNIr{iU-OEc7yp(nEZ zzr6LCgd$>@)!8=^4k6C+SFl}()A$V8z5Ht#(H-w{Uu3IPxI;w+@8J6-Rdz~Lhsd?C z#91yLCEJo`D&{C5oK*RExsUn>EWJD=8ky($Qx&><>__@>T@_{g0^IUL@RhDj^7P9lr-d2{wFHuMK(KU-wuFvzR=G=N>r9_Zt_#>#jm<0i2 zLdi-vls55_cPMb76;$izgYtjpV;2oht>cZt{gWc>!cohu=Jva! z`T#+r%b*KY{J_Fs!<61vX+aHbAp8~S`1>a$cmr1~KkM%(_3t|R6>X3SuLge&gZ7UYH7g;DGbu|q5S`}f{> zU20y_z z-)2fSa894$a3zS4nep|`++}z`H;r8WHA?!In_y_qwNVZ2FG#P!Qx39Le%yem+K(d2 z7NJ3+09{Q{;LjDuEaA2p{^a}BvTs~sm};HOs;(hIf1izHMp+d|QE=7%Kwn zQ?3I=UDnQ)w~K*{$S)PX-0VrqI4)4A-KKUdGd{INdwOE`Tm;V)g!~w&B=fiSwHF8^ zY)W(2_NA8CLqO_}MW5hB8$zwLNeENV+PlP4vgxnC>u(5fqKqH=$ zXaqLInePga4x)kr=V#Ac@R6h6{sQ6~!xm9UQU|Vht<-*zPxlqcs$)VOoZ{+irNYj!tfvIS1RLI~{GLF&kztG55N|jy5r3 zjq|3k{oahDtwLDiq8)R8fOND?Om1BEgdL2G9&u`!jjO@TgNcKq9kN){S`6&>v;udR T3TxU(W&WNuoZMCd01W>H^DZ#G diff --git a/Docs/Raw-Flags/grenada.gif b/Docs/Raw-Flags/grenada.gif deleted file mode 100644 index f429051f7ebc50fe5af903d91eedbe9455b3ccfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6780 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 diff --git a/Docs/Raw-Flags/guinea.gif b/Docs/Raw-Flags/guinea.gif deleted file mode 100644 index ecc584d2e3b402fa773c9be3a92d626960c8add2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2525 zcmV<32_p7KNk%v~VORo?0ipl^|NsC0{{YrP0LB0S0JQ)B0000000000EC2ui09XQ$ z0RRL4IJ(^aFv>}*y*TR~MfhMSj$~<`XsWJk>%Qx2P z$!tzMv8Z%Pty-_BqIS#edcWYFb4)Iq&lo6n&2GEjtgw7euiJ&_ynfH$sNsNtf`cx1 zhKGoWMSYBoj(dNEl9QBhikFy~iI1F}o=1_DqNAjRny09#TA!?~t_`83va__Rwzs%9 zue-dDv9!R!lDWjir@hF@XurbE&TPif(uT^_)=SLK+S@VH-rrx>;^S%D=I7nu>gz$| z?(YxT==1ae?DzON@cZ!c_5a)Q2^7e$;5dH(6ABy1ke$JY)etJ2D665xZxA!~l1Q=t zW2K8AqiG!JilfJqgF>pzMY5$QlPF`pSxHls%bSj1%G`;ircX^cgYwbIv*?tcNEHcP zy3D9kK}n-hV@h=l(Wh8fNZm@Os#hjgvx+srwJeygXpw{+%Ql4Bw_MW7)v&g0Tex_M z%-w6DuHCVD0|VhpSc2cbSp_TRQMj>#!-$_Qo{Yn>Wd)EU8>P&d#%0TyHS_G;`LpBD zqGgiiY`QV()F@X|Ze92_Y>%=h(vNZ>36ZiQfi3)xS#S)`E}1&L%EN~*+UlTQ{E zWk^#(W!_+tct5!x=zDuGQR%$L9oIOyOFW~=pZYNvdc1S zjq43xx;AdIQS7h~Lq#*%WJiN}n9 zyr{^Sko+;l&!BvX%0sbypUa!TtcS^j(pr`KJ9?S$BBlKr*WO`tud+H$bnHrKVleU{wV z(9NLT;oz-=+g$S9x8G{%U6J5j5S|3!RU)3a;-DB_isNxX&H>~9Pg1^x<(EsIq2`Nl zPM7DSfF8Q&<&gf7=|iBN0p>`u-n#1-z%Hchc+lRL>Z{}agYLWYK8f#x0Z)PLI}-o9 z@lOapyz*i&Zrzpj8Fs# zfWZpRB!V6EAe2DpKoO4cf+aNJ8a5b06<&dbDRd#3NGQMzE(nG-l;I0$$Uhqr2!}n? z;S5ojLm{q-hxYSfe}I@oBOZ~6L3E-Nmk(P5LVju}QN&bbBinFAIkXS`2PLY#Y^dz1@*+o&N1By*F^sonUjPWXRb^b*_`1fwboc;Hfov zCJCQ~)TapeNi~0N2B3))D6r63ONAZ_p^bFtLmArtONkQHX$G|tL?bCtdu+6l9la>h zGCG=%W-_EEZ6!)6+Dwb4w3sV3U<(y0QlXJ_CpG2SO;z*KWX2SLGZkn~ZMM@m^|YEl z)n8EcIaHVxH8w}hW>V?5RC_j6WlufHRY{iBLa{WOF8yjZ!z$Al(ln~=oT~e(s?M!? ztg9VyE5_jZ8??q#t>|N`Ipr!bx@O9*{lu&I^eRriGR&{W0c=49%RRz+)363Ztf>@> zQN~)&vC@Prz$Duo%8t~s(8H`VHLEYq&dRek1+DT#D@@YT%e1)?YdOgZRI>^dwK`QT z@mT9i*SZU~^zbdZfV&;s5>>ap@*0JL<~P zy4J$(w`5yS+A7tyOw}$|xyw55suH}=67Rjpn@{sn6}?tf?_1exI`^6qzRHsC!{{4O z`>qwgZPo8w`3pM#iW0!X5^%)`oKOSj6~TK|a9~M6$3H7;5gqE|Q2{w>G~TR@5r<~Xz4s!I}aEC&v4VT3;8T4KTpok%|*1@6sE6;hz_yket}Cc(F!B0C$BuBanYL{IH9JeseqOMBI_%^Yd%4jL@wAOrZTww( zO4+WSuX73PbqBNEwH@+Vw~f?pPxsr^4fl%24YYEz@7zpE_xAL?V}9$*-{u3jkpzA| zcZU<+=au(u=`B@zcNgE^CHRjGPBVmSPvJjeI8-!lWRAPc>Lui8{l3cxu4MK6@~hRrJi82 zFV^fGM*D}=-e|T%%gA@Crk`=M;}1#;?%vr-nSiBriG22gveW@_S_g ne`3L>81u2#yuUbaIM3?`^g9&&XGwo!)8`oVyH-8E5&!@@K5Q67 diff --git a/Docs/Raw-Flags/guyana.gif b/Docs/Raw-Flags/guyana.gif deleted file mode 100644 index 55385b9a3f54584375e8cccd930837aab9ec9ae5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5299 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 diff --git a/Docs/Raw-Flags/hungary.gif b/Docs/Raw-Flags/hungary.gif deleted file mode 100644 index 48e1741d8eab7a470cada8e1100a0b54bb36c620..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 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 diff --git a/Docs/Raw-Flags/indonesia.gif b/Docs/Raw-Flags/indonesia.gif deleted file mode 100644 index bf6bec293c7f2b16c4afdcfa2945adf28f6484b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1205 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 K+zSf8>;DHR0&3_0 diff --git a/Docs/Raw-Flags/iraq.gif b/Docs/Raw-Flags/iraq.gif deleted file mode 100644 index 2437eec12f8ed302f79dd2292128ca6e978e9f8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4538 zcmai#`9IT-mkZ?Hx*t88Aamd!bGh1q6i zhx?dWNQG?fawJ#IY}x1g`3t_!pP!G%^T(&Pjg_&{T@O%(NCyB2g~ILa?YWh?aU^nR zZm4U#s|x^_L-kB1v%0Su*M&nf(a3saaCNX}si!T@)&yswnWd?UJ|X)|3P1w?FX#Se z{I3Ow3ky}#eDCE4R@U5KYzjTs|LC8I$eNXy6=6$ZDD0ekI;-SC&wbN^f$~ST)tubz&t@($(CIH5f97My2U0}d@6Iq+veHUSAMDT zAO(%F>#K%q@3f~VU8B7JN(%f`d8?OF&20#sVdq_Is2QV2uKyV8ZK$1SMv3kR+ffNq z?a4>Ay*SjmneL2J*YfQeiQjuM`oZIzM$%k=;gy%*>ooGhr*fAnuMf2P#bHtJ-u&xy z$`Y6QaB=(tysN z7m1uUZ!JKN8n@!nrqLSsL|yp>bWRYvtSIZOZEGo(Eu~cvV{iMk?6IeOP=#LQZcr6I zEhR9oj3~XBQd1*6UqR~9)UKr0NS&(-k*U(gG9}>WQrb=F{v;ML>Zg#{{~D%4xd+y+ z&i&|)T}mEL!TM8qYA`_bfb4);{Y2V+Z|Yj^zS>49u-*@lP7bz)p*YU}>+ScU;6f1o z(tsLs2gJDBda&IC1&CdM>ODPxmKS-sE&o$5@c@!BO*`Tk+JaKDwo?(SCrYh#D!X7V zaMYzU!rH_xpCh8qq_e$QTHVm1J_~GlK=m=0c^%69lb`^At*2~!#$VPlNHSls^A>fz zLNGvSaz_iR?9J>pKl|Ng-Wh3X(l8fug)6Ci^yEkAi_5;pJpLG@4>OujmIJmwKaiwG zjPmOc^(ps<$0Fj9kiNSjQ*ts}UjrsmR0gHXcZ{afkB&qNxmwQPhNn-i=A4HrPpqd#S1M#}%D`GQ$=it5;;^Q~K^+K;f1S!Ez5? zAb!-~^6|L91Q^y_q&z{7bKN|8*XHh)gxE#gADILyT=g3Y!;ozyxL}hzV9%>szM3G`;{+sU1Lpc zlJ)aICg=dm9yD^Mf92d-!IVkvWh1szNw)Ce4f&;V*iz5H?g-lJ5K39}L=J0t;9-eg z=ZtmZL#^kBRYW9>%|#Qx^ek==-1YyYS@_txBDNm6h+^oN#?(|(u{nq%?=Qw+073EY}Q0f`5 zKYHNzRk_;evG)Bh8Eq*BI7J-t^TyFNs*hWkq?2 zr~AjkSxxK^A}7!P{2B?huj3U|DBe=t)Af)$KdN6kr@6Qtu7DaCO39T?ZV@Bi%NMo$ zLic4{wGmBHwE-^{t7Xbhx7^v=c+>9EzH;0F?R^Md9((fa`vfPn!SOQ5%B)*= zL{8fk9{hv}0_2J(;}BNAF0dHqx9lIkU}$Ys&H+|d8Gv)eh}7y%ipySDvT(*n@S?2J zW~(pb-hDqYlWkK;W0lxr86GvJDr`Al{iI$2`R=Vo$h8Bc2qI_7XmP#o$e3=p?Y_WG z^zT-5UsUM4zLsieK-Kxj%ZW9vqpGOupef)G(N{Oa`{v}F;{hyKB&63qR z-_xq(G{$c=)5yr{7YWZ({;4s=n%U}*O)B2qUy*`Tk5U|{ueDM6FFu-fKll}c$#eJq zR{^@=6-4vXUItb__D&SJH!?*RnWOYe-WN|jUY>OpIKbWB*;+$f*j*cMv%i z(Y|b#IvuNK6q~c(CHUnWK#DO}FT(P^#_2;`_7h`Y|8O62XFzMlDtl~B>OAkpL06O_ zL%HZ{MGD)c7FVm&LCH!IX*&w@))U^FeEv26rp#CFhC|u&u}4k>EHKjspunYS8kM{LDKi_qM8Lug1C}j{^`4!6a%@0eo}zGSYZ!Ww(#Rm9)KWR5m@9| zTdtFKxV7?%k@KEp)c)l7b&-FfZ(Netc^Z(3S`3RnU<{6x6p>W%l8}n$iTu60?XuAA zrZ|tHSUuC(2}_VLz;@XN91Tb2xXY@$AJV%t?izfFs$?D*hCh<9Qx|U(_-x{p`{8of zY^IXfB(QQ^#DE14c&J>^VQ=kccfQ1gv>nVm5~YSwDpZR&i*ff344F4n&J=%cFBP+8 z;g^y1)Rr8nT6W$u+2BT(1I#B*S3MB8{3y~O$*Md#qvOT5k0Hn#%Be{P|6stm$=9YV z9F78Z!eJ-3KG8VE4!|Va<>0E;BoI{pPd`|f8#yxR0EcLkodP6NZC&J<9<7hiP`YT51 zx0P#m;scbrxn>~P&kxOWN4S5BlFK?O6M|dM7%RG30Icg zV8SyVkD*b9hFecuZ7$wy%&y;5J`B8?U&}r(cIR5oRh^q)jo+b*buKq6!Xhn$0KbHH z8)-vNbJkD&TP$JeUjgvC6WQwUvnRoS*;s^E*bEw9eAuY;<^<|j1V&vG{pxtM?7KI& zv##1kDIG~N86H;p(hV42_4?0^oI;l$HkgvMK{4>fZy4{D2}KIyCJvCBP{h~rn{u&mnbmCCqojH zhxwF!LBg`l<`gq3Q++$T*Cb+cU+mtT&jcxdG0buLr0QIw7T3n@Rc3*{TB>f>twe z#35iVA7ONm zT3K7+a$OE?SASvyLoB;h%r<-bpmbMEt8v$K+ox*nyl-`-j@x?0j!8S-TZoyOUeHORE)(*6!`r0ty5WgdhedNFWJPSb{X2aDYpY;S*#P>W)C_j=}5X zkaZ`pb@KE&MQ$CKUuPc=s6mLQ;l#5@q6U_zMJJx)5_S1RJq6MQ2+06WGDMP$u_RME z3Cbm1;*-o3$d}>7 z8JwDkq$XpjDRe5DOHJcbGZY$MLmIQ-jXB6h47M?s-iYHi=JOj16==l}S_z!?4oNG= z(kkh+_gq>HpGHui6CrdmoK8W~saQIVPG@lGO?-Nb0;3JW=zuf2kPH@edF<9z0%Len&)=^MOh7TGk9ZTdlP`pIot<~OY>H2;D$ zZ@`T=3RQTfZM#sZx#ZIEg)!%7@|cYrbP+qU~%V2>8{^td z8SPMB`z1lUxnjp6pblCAa>;)Z;ik;5TPFF;ydrYSXuG5pziQsj5 z2|Dj6c6md)d=Xv#F1U( zcqr=`f|VG^HM)Xo*da1Zx8l#uN>unPBwkUGipqvf_rz?iT!g1IP T4u{9-6L1C;KMX2@0LXs<`;Z!3 diff --git a/Docs/Raw-Flags/ireland.gif b/Docs/Raw-Flags/ireland.gif deleted file mode 100644 index a69001e19a98ba4d5f06b890910f69543eb72c2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2525 zcmV<32_p7KNk%v~VORo?0ipl^|NsC0)&TeS_c_Kn0JQ)B0000000000EC2ui09XQ$ z0RRL4NV?qqFv>}*y*TR~hxlM9j$~<`XsWJk>%Qx2P z$!tzMv8Z%Pty-_BqIS#edcWYFb4)Iq&lo6n&2GEjtgw7euiJ&_ynfH$sNsNtf`cx1 zhKGoWMSYBoj(dNEl9QBhikFy~iI1F}o=1_DqNAjRny09#TA!?~t_`83va__Rwzs%9 zue-dDv9!R!lDWjir@hF@XurbE&TPif(uT^_)=SLK+S@VH-rrx>;^S%D=I7nu>gz$| z?(YxT==1af?DzON@cZ!c_5a)Q2^7e$;5dH(6ABy1ke$JY)etJ2D665xZxA!~l1Q=t zW2K8AqiG!JilfJqgF>pzMY5$QlPF`pSxHls%bSj1%G`;ircX^cgYwbIv*?tcNEHcP zy3D9kK}n-hV@h=l(Wh8fNZm@Os#hjgvx+srwJeygXpw{+%Ql4Bw_MW7)v&g0Tex_M z%-w6DuHCVD0|VhpSc2cbSp_TRQMj>#!-$_Qo{Yn>Wd)EU8>P&d#%0TyHS_G;`LpBD zqGgiiY`QV()F@X|Ze92_Y>%=h(vNZ>36ZiQfi3)xS#S)`E}1&L%EN~*+UlTQ{E zWk^#(W!_+tct5!x=zDuGQR%$L9oIOyOFW~=pZYNvdc1S zjq43xx;AdIQS7h~Lq#*%WJiN}n9 zyr{^Sko+;l&!BvX%0sbypUa!TtcS^j(pr`KJ9?S$BBlKr*WO`tud+H$bnHrKVleU{wV z(9NLT;oz-=+g$S9x8G{%U6J5j5S|3!RU)3a;-DB_isNxX&H>~9Pg1^x<(EsIq2`Nl zPM7DSfF8Q&<&gf7=|iBN0p>`u-n#1-z%Hchc+lRL>Z{}agYLWYK8f#x0Z)PLI}-o9 z@lOapyz*i&Zrzpj8Fsv zfWZpRB!V6EAe2DpKoO4cf+aNJ8a5b06<&dbDRd#3NGQMzE(nG-l;I0$$Uhqr2!}n? z;S5ojLm{q-hxYSfe}I@oBOZ~6L3E-Nmk(P5LVju}QN&bbBinFAIkXS`2PLY#Y^dz1@*+o&N1By*F^sonUjPWXRb^b*_`1fwboc;Hfov zCJCQ~)TapeNi~0N2B3))D6r63ONAZ_p^bFtLmArtONkQHX$G|tL?bCtdu+6l9la>h zGCG=%W-_EEZ6!)6+Dwb4w3sV3U<(y0QlXJ_CpG2SO;z*KWX2SLGZkn~ZMM@m^|YEl z)n8EcIaHVxH8w}hW>V?5RC_j6WlufHRY{iBLa{WOF8yjZ!z$Al(ln~=oT~e(s?M!? ztg9VyE5_jZ8??q#t>|N`Ipr!bx@O9*{lu&I^eRriGR&{W0c=49%RRz+)363Ztf>@> zQN~)&vC@Prz$Duo%8t~s(8H`VHLEYq&dRek1+DT#D@@YT%e1)?YdOgZRI>^dwK`QT z@mT9i*SZU~^zbdZfV&;s5>>ap@*0JL<~P zy4J$(w`5yS+A7tyOw}$|xyw55suH}=67Rjpn@{sn6}?tf?_1exI`^6qzRHsC!{{4O z`>qwgZPo8w`3pM#iW0!X5^%)`oKOSj6~TK|a9~M6$3H7;5gqE|Q2{w>G~TR@5r<~Xz4s!I}aEC&v4VT3;8T4KTpok%|*1@6sE6;hz_yket}Cc(F!B0C$BuBanYL{IH9JeseqOMBI_%^Yd%4jL@wAOrZTww( zO4+WSuX73PbqBNEwH@+Vw~f?pPxsr^4fl%24YYEz@7zpE_xAL?V}9$*-{u3jkpzA| zcZU<+=au(u=`B@zcNgE^CHRjGPBVmSPvJjeI8-!lWRAPc>Lui8{l3cxu4MK6@~hRrJi82 zFV^fGM*D}=-e|T%%gA@Crk`=M;}1#;?%vr-nSiBriG22gveW@_S_g ne`3L>81u2#yuUbaIM3?`^g9&&XGwo!)8`oVyH-8E5&!@@;3^t; diff --git a/Docs/Raw-Flags/israel.gif b/Docs/Raw-Flags/israel.gif deleted file mode 100644 index e349db1552605d673b9226a632daa89b2cdc683b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2808 zcma);=UWnp1AuWA5gn*xl-l7a=M|M1W*I4N6SU53m|AAeuCmP3>ktt4N;AwY?ui>z zl+@gcW|`%}i6g^Y;DYd$q+mwN z_&@~8Rz$F9nJpnu6^j(J@~n>$@N*uc9p%*a7=%%{f_X)DXT17#QQ_Urik$9u$Om01 z=9Rg<$ta)2(ay>|b~>5}QnaYbAE27WYdUmQ6%6L#s1~Uf)rDV*>?=LSx~hx5mN~VA zD_YhRf2(vGEOh9uDH*AKGToJGSz9_*@3*!%)?HgR(S(;cc-)Fkn`{Y{)w>jUQ*7D69hb&&k+&8y7L?&)I@!f1haFS42HYr zPm&dU=biCflKNDrYNFdzn0jvhRJeA{{8R+8O?^62XUJ_j3N@EM9ertYemVxdPh%z) zBj-L7XLhn+=8cu^!c08QL}NDLhMoKDTYJ}n*~GiP3$yQ>$QpALmqhouB)8mxx%XZ* z3vCeaxM_NVc5b>3nAH!!%WWGVO)RK|dKN5#UtNvv-2T+y+QnkAy7{eI6`)ek|jTBeZDE^kVsbvC*{R!sjC zg&y@jWWx344JZH zOUSn?)~Y<xVn=Go|+xDz6v&UbwByjT{v6$xQ}XRg}7?uX$BI5q9V>= z4sau9YNe(AZtjCDYwEm7vTpS{*kxU{@X5qgA+G!sc&U_rq5Lm?N}iLP+`y~QolV1O6t)MNExbnpIUK} zjJ+VaT7bk0eSm;lg0NjZmw%$NIzU8((L!bh0n9)^jFiwJPQ6lkUZK)Nz-2NEC$;a! zgp8?DQ#k_=CXG**4jhJx5NY^GFk?c_NZOceWg~gbtD`*;YD(@o6Y6$HMWYZNq!bQ_ zl18dXX(+eJz-(f&W0ek>bDFcSW=2U5J0I{GhF(!VD_d)MOxzS<1U;n`{MPEK;{F%r zwq{Ue*KC)p?2HZ-TTE=uXsfzPY`u&L=8ct`OAeG`uJ-tBVk+*Tq}v5?q~;k=-skiK zi~Hk@#Rp~g$D1`**f%UATf7HL9eCM0E1qY(5-+i8P*`$X{d z5YU&~!7pGYQE1&Jbgxv}VVJ=~Ag&y7gUnhjNuU?NeBQ_DPo0;2;SIE6AO^#GHp*i9 z-On*IY%`SPWRG7)99e(=rQI&8Tz1s(?jzT4=7E1kLp~Z}zFZvWGcnA7DXAX@e}|Ip zf3Avl(=w32*{9sgOt*NUZ0oEK9LlvxR&Eu)WQ@Ru_n@!=Yh_#<5%AuD)#`GEPY+y7Krlb66R zrG|fKLJfNezP@ls-`k}l2Rcay>+uY=T%vELfTK!5d48>?hCcAxxBC6?J}Eo#kefer zj<*MWkdEbnU|uBPG_B3#aSQ$d^7aW4r!qSw`8BnNj9|0cgA}qEZpeqH^2FZIy*@++ zBkm{;0y=-{RKj(wh&`f_QrHd-0GWRlZc4d^>GoFB~%cv|!!WIQSNFCa{vwd48m# z>5k2;qoMpa35XP>m;QrPKgBu$q_sHy8VmdNa;h|=RKC_S?!*1S!=pLNdRK(uYvV;z zsxOW4N@>q-!hI(H2$8DFQ}nqRxUG~~x@D)=?4BABuTrwC&}~S*T)V9vo8nqhM2MW)@UQc^<5*s6nC7n=pcN|jqPpn5^VOFD z8u#A5V8moO0BiL%cC%mJnknGnAq|}USV6PAa3vJmFm;42Xww(|ij8TQQNwO^-4U)* z*bQ?R*js%8!nF(tbKVrY{V7?vo{wcN9u;K{)eARhG0Y#2ush#Jgqw8s9#PP;Grl9_ zvmlKtA=uq1d6A$4+qn9Uy*sBb+Uk#KT+hSqE#47r53?ILYuS5014KI^TXA`%MNO+r3fB;5Jm2f*>-DE!}&_V|5%cpwE2qT|8C z_}>J0C_G386$G;nlJg6KQ-Y4sgA|5?j-vuW(gbA`LDimc(vP4{A!yPG+QWoxnm-aw zJc}ag*b{aAh$ss2BAs|?m}np%qTwV%6bWNbGVvpsQAiealGQNDT0p|VgKbg4H`Grk I0RZ~{0&~!m?EnA( diff --git a/Docs/Raw-Flags/italy.gif b/Docs/Raw-Flags/italy.gif deleted file mode 100644 index 8b2a67c75abe436f20b05f26e8369bb44c9a15c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2525 zcmV<32_p7KNk%v~VORo?0ipl^|NsB@_xHvC06E4v0JQ)B0000000000EC2ui09XQ$ z0RRL4NV?qqFv>}*y*TR~NBCeUj$~<`XsWJk>%Qx2P z$!tzMv8Z%Pty-_BqIS#edcWYFb4)Iq&lo6n&2GEjtgw7euiJ&_ynfH$sNsNtf`cx1 zhKGoWMSYBoj(dNEl9QBhikFy~iI1F}o=1_DqNAjRny09#TA!?~t_`83va__Rwzs%9 zue-dDv9!R!lDWjir@hF@XurbE&TPif(uT^_)=SLK+S@VH-rrx>;^S%D=I7nu>gz$| z?(YxT==1ae?DzON@cZ!c_5a)Q2^7e$;5dH(6ABy1ke$JY)etJ2D665xZxA!~l1Q=t zW2K8AqiG!JilfJqgF>pzMY5$QlPF`pSxHls%bSj1%G`;ircX^cgYwbIv*?tcNEHcP zy3D9kK}n-hV@h=l(Wh8fNZm@Os#hjgvx+srwJeygXpw{+%Ql4Bw_MW7)v&g0Tex_M z%-w6DuHCVD0|VhpSc2cbSp_TRQMj>#!-$_Qo{Yn>Wd)EU8>P&d#%0TyHS_G;`LpBD zqGgiiY`QV()F@X|Ze92_Y>%=h(vNZ>36ZiQfi3)xS#S)`E}1&L%EN~*+UlTQ{E zWk^#(W!_+tct5!x=zDuGQR%$L9oIOyOFW~=pZYNvdc1S zjq43xx;AdIQS7h~Lq#*%WJiN}n9 zyr{^Sko+;l&!BvX%0sbypUa!TtcS^j(pr`KJ9?S$BBlKr*WO`tud+H$bnHrKVleU{wV z(9NLT;oz-=+g$S9x8G{%U6J5j5S|3!RU)3a;-DB_isNxX&H>~9Pg1^x<(EsIq2`Nl zPM7DSfF8Q&<&gf7=|iBN0p>`u-n#1-z%Hchc+lRL>Z{}agYLWYK8f#x0Z)PLI}-o9 z@lOapyz*i&Zrzpj8Fsx zfWZpRB!V6EAe2DpKoO4cf+aNJ8a5b06<&dbDRd#3NGQMzE(nG-l;I0$$Uhqr2!}n? z;S5ojLm{q-hxYSfe}I@oBOZ~6L3E-Nmk(P5LVju}QN&bbBinFAIkXS`2PLY#Y^dz1@*+o&N1By*F^sonUjPWXRb^b*_`1fwboc;Hfov zCJCQ~)TapeNi~0N2B3))D6r63ONAZ_p^bFtLmArtONkQHX$G|tL?bCtdu+6l9la>h zGCG=%W-_EEZ6!)6+Dwb4w3sV3U<(y0QlXJ_CpG2SO;z*KWX2SLGZkn~ZMM@m^|YEl z)n8EcIaHVxH8w}hW>V?5RC_j6WlufHRY{iBLa{WOF8yjZ!z$Al(ln~=oT~e(s?M!? ztg9VyE5_jZ8??q#t>|N`Ipr!bx@O9*{lu&I^eRriGR&{W0c=49%RRz+)363Ztf>@> zQN~)&vC@Prz$Duo%8t~s(8H`VHLEYq&dRek1+DT#D@@YT%e1)?YdOgZRI>^dwK`QT z@mT9i*SZU~^zbdZfV&;s5>>ap@*0JL<~P zy4J$(w`5yS+A7tyOw}$|xyw55suH}=67Rjpn@{sn6}?tf?_1exI`^6qzRHsC!{{4O z`>qwgZPo8w`3pM#iW0!X5^%)`oKOSj6~TK|a9~M6$3H7;5gqE|Q2{w>G~TR@5r<~Xz4s!I}aEC&v4VT3;8T4KTpok%|*1@6sE6;hz_yket}Cc(F!B0C$BuBanYL{IH9JeseqOMBI_%^Yd%4jL@wAOrZTww( zO4+WSuX73PbqBNEwH@+Vw~f?pPxsr^4fl%24YYEz@7zpE_xAL?V}9$*-{u3jkpzA| zcZU<+=au(u=`B@zcNgE^CHRjGPBVmSPvJjeI8-!lWRAPc>Lui8{l3cxu4MK6@~hRrJi82 zFV^fGM*D}=-e|T%%gA@Crk`=M;}1#;?%vr-nSiBriG22gveW@_S_g ne`3L>81u2#yuUbaIM3?`^g9&&XGwo!)8`oVyH-8E5&!@@xaS!< diff --git a/Docs/Raw-Flags/jamaica.gif b/Docs/Raw-Flags/jamaica.gif deleted file mode 100644 index 16e30216ba6a64cacb8feccde265da8a56557116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4749 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 TyWaQC_rCl6?|^Sf2mk;(enav+ diff --git a/Docs/Raw-Flags/jordan.gif b/Docs/Raw-Flags/jordan.gif deleted file mode 100644 index ca4d16c2d22cb48a3043b99ac26415a340970683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3755 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 VtGybmatf@(>Yc-Stm7F106Uu_cq;$^ diff --git a/Docs/Raw-Flags/kazakhstan.gif b/Docs/Raw-Flags/kazakhstan.gif deleted file mode 100644 index b687186342f0d14dd13b7b30f4a7b89f95ff3a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24988 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 p2V_=o`-Aew8~a0w40jHOl{w!YjHuqmAN6d^ diff --git a/Docs/Raw-Flags/kiribati.gif b/Docs/Raw-Flags/kiribati.gif deleted file mode 100644 index 0e4ba3832d326be23ccb26b479c7745bd300cc59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9341 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 R(K+eS*=J%h&hUV={sWLy4pjgE diff --git a/Docs/Raw-Flags/kyrgyzstan.gif b/Docs/Raw-Flags/kyrgyzstan.gif deleted file mode 100644 index 0a22c27173f2e925c8b785d3ca1c8f17f11ecb29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7742 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 diff --git a/Docs/Raw-Flags/laos.gif b/Docs/Raw-Flags/laos.gif deleted file mode 100644 index f9f43106038847e60b92da7d9679c87aaa857081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2402 zcmV-o37z&wNk%v~VORo?0mJ|R|NsB@_xI=L_tw_$&c^S?006zU=dG>YoSfdA05Ob= z)_Z%_b8F6HTFz2R#zHy9IRJz)DZL>Wy%-3!2mrMJ0000000000000000000000000 z000000000000000EC2ui09XQ$0RRR6U?GlVX`X1Ru59bRa4gSsZQppV?|kq7z@TtQ zEE41ejE#0PICJXU$+M@=pFo2O9ZIyQ z(W6L{DqYI7sne%Wqe`7hwW`&tShH%~%C)Q4uVBN99ZR;X*|TWVs$I*rt=qS7(BTJr4xw7TUm@{kM%=s^c&!9t# z9!C>oFt6t5zwd>cgW6PdRySDAyxO3~?&AYen-@t5f($n3;DZoGDB*+@R%qdc7-p#9h8%Y2;fElGDB_4DHYmXZ zC@!GliVHA+;sX+tDC3MY;`TrT3m9NP06g~SQ>Z`EIHUX%t)>#vGp%ImPiQt-f@z$V-007Vw- ztf>zm^pd)9l?K6vN1f4;cxbqn2l)II}m zw*`Z$P{?Nnh`*Q8S`HUu@*oOu8RR93>yPX2r<&7P-&85p~2YqLYlo#hWvtH4Y4*s z9EuBtJB->2eYh^|1+iq^BjU3-ctnzYP>JJeV$`50F4akKXsx5-u;h2en$=H>!y;f8 zNp?X0FvbdhV=USJ%s4DGrmr7WaYG6`N}NCQkKc0Wi79COI-fSlDixfB7J!-NCq=Y!z8A+jCsr}B~zKyVrDaw z1WkDTahgb~=DV;tC~cmLn|E@fH*FP1aGpt=<78Di&55O6rn67FWG9KZ_)c4WQJzS8 zW<5hCO?;MUpTP1bnwSXCK0Q&OSTbTk`IJP2(g=tP4HYmQY9u~Jv{F5!D2-@%(RgY9 z6iY7bD4$~Z(IY`rqO$Zbc79SPRW|s3=MUh zMQ!Yi^tsP|O148GEhtGZJ0rsu6tSG8k>wVexzN%mv+3NdX*=6hWrB9KG@`6BEel%@ zi8Yaot?h=UD$AKfgR&u zuREjcN^!f~?XD)l8(#4ylDy@e(QPAW-SmnGx>uC0d$TmLE?#WDgi6>I9fn^={i}%t z>o26%JG}M^IJT`lpS%v-sd8N~T?{r=ee-wU2%pNq?Srs|Uv;eTF>AxT^40K!1>#}N zs&}|5v9na=IZ~-OTP)6-i(fo0NhO$Mm{Kc^pLM9DF>1#U%hO}u1t`A)Ia_NQva;j^ z)FVf1OI>=`n9Ag2qbZ3=$(mA?s%*9!<%qXX5)zTPJh=$Gh(#=VQIpBc<~FLP3Wa2;LwOpw4xWy=tevG(U6Ykw4^6Z=}KGr z(wNS)rZ>&$PJ8;(pboXDM@{NdoBGs>){ClF&FWUW`qi+GwXA1N>ss6T*0|2Ku6NDr zUi5+StyvwztjgZhQON;10LA z$4%~XoBQ18PPe+(&F*%)``z%4x4h>~?|R$&-uTY9zW2@Ve*63101vpp2Tt&U8~or1 zPq@Mt&hUmi{NWIfxWp$;@rqmg;uz1k#y8IKj(hy$AP>37M^5sRoBZS`Pr1rh&hnPK U{N*r@xy)xy^P1Z{Bq0C*JFwaUF#rGn diff --git a/Docs/Raw-Flags/latvia.gif b/Docs/Raw-Flags/latvia.gif deleted file mode 100644 index a364abdabaa27bc7c9e5c3d60817fb4efb298a05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1142 zcmV-+1d01cNk%v~VORo?0ipl^|NsB@_xHUybEN}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ z$!t2G(5Q4uty-_xtai)odcWYXcuX#v&*-#z&2GEj@VIs;jK6uCK7Mva__cwzs&s zy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=%($mz{*4NnC+S}aS-rwNi;^XAy=I7|?>g(+7 z?(gvN^7Hid_V@Vt`uqI-{{H|23LHqVpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m&2 zqsNaRLy8oJq5$&6_xL>fFh*r_Y~2g9;r=w5ZXeNRujE z%CxD|r%fOt?uiw9b0}CEZxUk{Fh!ZPb%($`R$B-jSo=my2<;$2eYu?Pcv**vCLyI0wy0q!j zs8g$6&APSg*RW&Do=v;9?c2C>>)y?~x9{J;g9{%{ym(y!$dfBy&b+zv=g^}|pH98H z_3PNPYv0bjyZ7(l!;2qJzP$PK=$8jr&%V9;_weJ(pHIKO{rmXy>)+46zyJUL00t=F zfCLt3;DHDxsNjMOHt67k5Jo8BgcMe2;e{AxsNsejcIe@UAciR7h$NP1;)y7xsN#w& zw&>!EFvck3j5OA07|%vs_CYjcIxS;poS{ysHB!^>Zz!v zs_Lq&w(9Duu*NFuthCl@>#exvs_U-2_Uh}ezy>Squ*4Q??6JrutL(D>%r@)nv(QE> z?X=WZYwfkzW~=SC+;;2jx8Q~=?zrTZYwo$|rmOC{?6&LfyYR*<@4WQZYwx}I=Bw|% z{PyebzW@i^Zh8b4Z1BMdC#>+o3^(lX!w_d@+{6@DZ1KeyXRPtY9Cz&T#~_C+^2j8Y zZ1Tw{r>yeIEVu0P%P_|*^UO5YZ1c@H=dAP2JooJL&p-z)^w2~XZS>JdC$03-OgHWH z(@;k(_0&{XZS~byXRY*wdY`5+9+i=G%_uO>XZTH=H z=dJhNeE045-+%`$_~3*WZusGdC$9M7j5qH1a4f!`s=XAF8l1X*KYgmxaY3>?!5Qz`|rR9FZ}St7jOLW$S1G7 I6A1tSJLKKJ0{{R3 diff --git a/Docs/Raw-Flags/lebanon.gif b/Docs/Raw-Flags/lebanon.gif deleted file mode 100644 index 524b6c60b1ceab45a2dbe1a35c5584387ccc8f83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2874 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 OT~91YpZ5zG0suQ6MWJK> diff --git a/Docs/Raw-Flags/liberia.gif b/Docs/Raw-Flags/liberia.gif deleted file mode 100644 index f1b908e5fa01090f91c97e8bb916d4fb73a881c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2889 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 Rvd&6tt+w8Zt2hM!06V-2lkETi diff --git a/Docs/Raw-Flags/liechtenstein.gif b/Docs/Raw-Flags/liechtenstein.gif deleted file mode 100644 index fe24e828b0b45f15fb6728f44a2622c0a1358146..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9832 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 diff --git a/Docs/Raw-Flags/lithuania.gif b/Docs/Raw-Flags/lithuania.gif deleted file mode 100644 index 849d0a17d9ad9c4b743bf4d62ff46caa432a6915..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 zcmV+s2JZPsNk%v~VORo?0ipl^|NsC0{{Y4S0EFHEF@yjBwEzGB00000EC2ui09XQ$ z0RRL47`oj4Fv>}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ z$!t2G(5Q4uty-_xtai)odcWYXcuX#v&*-#z&2GEj@VIs;jK6uCK7Mva__cwzs&s zy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=%($mz{*4NnC+S}aS-rwNi;^XAy=I7|?>g(+7 z?(gvN^7Hid_V@Vt`uqI-{{H|23LHqVpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m&2 zqsNaRLy8oJq5$&6_xL>fFh*r_Y~2g9;r=w5ZXeNRujE z%CxD|r%fOt?uiw9b0}CEZxUk{Fh!ZPb%($`R$B-jSo=my2<;w#yYu?Pcv**vCLyI0wy0q!j zs8g$6&APSg*RW&Do=v;9?c2C>b1uNUx9{J;g9{%{ytwh>$dfBy&b+zv=g^}|pH98H z_3PNPYv0bjyZ7(l!;2qJzP$PK=+moT&%V9;_weJ(pHIKO{rmXy>)+46zyJUL00t=F zfCLt3;DHDxsNjMOHt67k5Jo8BgcMe2;e{AxsNsejcIe@UAciR7h$NP1;)y7xsN#w& zw&>!EFvck3j5OA07|%vs_CYjcIxS;poS{ysHB!^>Zz!v zs_Lq&w(9Duu*NFuthCl@>#exvs_U-2_Uh}ezy>Squ*4Q??6JrutL(D>%r@)nv(QE> z?X=WZYwfkzW~=SC+;;2jx8Q~=?zrTZYwo$|rmOC{?6&LfyYR*<@4WQZYwx}I=Bw|% z{PyebzW@g;@W2EYZ1BMdC#>+o3^(lX!w^R-@x&BYZ1KeyXRPtY9Cz&T#~_C+^2j8Y zZ1Tw{r>yeIEVu0P%P_|*^UO5YZ1c@H=dAP2JooJL&p-z)^w2~XZS>K95}@?bOgHWH z(@;k(_0&{XZS~byXRY%C=0<`V++i=G%_uO>XZTH=H z=dJhNeE045-+%`$_~3*WZusGdC$9M7j5qH1a4f!`s=XAF8l1X*KYgmxaY3>?!5Qz`|rR9FZ}St7jOLW$S1G- z^2|5y{PWO9Fa7k?S8x6G*k`Z(_S|>x{rBL9FaG%Cmv8?0=%=s#`s}yw{`>I9FaP}X z*Khy*_~)p$JDv!V;SBgeXj*3RlR&7P|0-FpQxLXGp^u+VF-r%%Ki<$ip7`@P|MQ zq7a8j#3CB;h)7JL5|_xtCOYwnP>iA!r%1&rTJefl%%T?Fx5&jVdhv^345JvwNX9an z@r-CpqZ-%9#x}a~jc|;k9Op>KI@?Jdh?s$45v89NzQVb^PK2Rr#jck&UU)7=P? diff --git a/Docs/Raw-Flags/luxembourg.gif b/Docs/Raw-Flags/luxembourg.gif deleted file mode 100644 index 9ec9d31a439e403f96f513550b0788729559e7e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 zcmV+s2JZPsNk%v~VORo?0ipl^|NsB@_xIj=d&U3&z32BBweJ7`00000EC2ui09XQ$ z0RRL4IJ(^aFv>}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ z$!t2G(5Q4uty-_xtai)odcWYXcuX#v&*-#z&2GEj@VIs;jK6uCK7Mva__cwzs&s zy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=%($mz{*4NnC+S}aS-rwNi;^XAy=I7|?>g(+7 z?(gvN^7Hid_V@Vt`uqI-{{H|23LHqVpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m&2 zqsNaRLy8oJq5$&6_xL>fFh*r_Y~2g9;r=w5ZXeNRujE z%CxD|r%fOt?uiw9b0}CEZxUk{Fh!ZPb%($`R$B-jSo=my2<;wyxYu?Pcv**vCLyI0wy0q!j zs8g$6&APSg*RW&Do=v;9?c2C>a}L0}x9{J;g9{%{ytwh>$dfBy&b+zv=g^}|pH98H z_3PNPYv0bjyZ7(l!;2qJzP$PK=+moT&%V9;_weJ(pHIKO{rmXy>)+46zyJUL00t=F zfCLt3;DHDxsNjMOHt67k5Jo8BgcMe2;e{AxsNsejcIe@UAciR7h$NP1;)y7xsN#w& zw&>!EFvck3j5OA07|%vs_CYjcIxS;poS{ysHB!^>Zz!v zs_Lq&w(9Duu*NFuthCl@>#exvs_U-2_Uh}ezy>Squ*4Q??6JrutL(D>%r@)nv(QE> z?X=WZYwfkzW~=SC+;;2jx8Q~=?zrTZYwo$|rmOC{?6&LfyYR*<@4WQZYwx}I=Bw|% z{PyebzW@g;@W2EYZ1BMdC#>+o3^(lX!w^R-@x&BYZ1KeyXRPtY9Cz&T#~_C+^2j8Y zZ1Tw{r>yeIEVu0P%P_|*^UO5YZ1c@H=dAP2JooJL&p-z)^w2~XZS>K95}@?bOgHWH z(@;k(_0&{XZS~byXRY%C=1+?w<+i=G%_uO>XZTH=H z=dJhNeE045-+%`$_~3*WZusGdC$9M7j5qH1a4f!`s=XAF8l1X*KYgmxaY3>?!5Qz`|rR9FZ}St7jOLW$S1G- z^2|5y{PWO9Fa7k?S8x6G*k`Z(_S|>x{rBL9FaG%Cmv8?0=%=s#`s}yw{`>I9FaP}X z*Khy*_~)p$JDv!V;SBgeXj*3RlR&7P|0-FpQxLXGp^u+VF-r%%Ki<$ip7`@P|MQ zq7a8j#3CB;h)7JL5|_xtCOYwnP>iA!r%1&rTJefl%%T?Fx5&jVdhv^345JvwNX9an z@r-CpqZ-%9#x}a~jc|;k9Op>KI@?Jdh?s$45v89NzQVb^PK2Rr#jck&UU) diff --git a/Docs/Raw-Flags/macedonia.gif b/Docs/Raw-Flags/macedonia.gif deleted file mode 100644 index 174506e0021db54fee08b35ed25548f019ded221..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6907 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 diff --git a/Docs/Raw-Flags/malawi.gif b/Docs/Raw-Flags/malawi.gif deleted file mode 100644 index 76ffcf0585da98c4f6169d41f5ba56d665487348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5622 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 diff --git a/Docs/Raw-Flags/malaysia.gif b/Docs/Raw-Flags/malaysia.gif deleted file mode 100644 index d29656ebefe8ab69fcecfc33088833b7a470b7c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4621 zcmZ|I`6CmI3DxB*!pXDX0~DO znKMPMw2G20l&GnFKhGcVef{|U<$db3qm^ZVHz*G{000R71K9bWZ{Tm#t`E!5<=EKS z3AI^k`=KtqApn5dWL-_LFUWGn;e2o34hjmo=HU@*Z;!JE;7m*k^wbCkpw(ai74ZKs z{ICD_0*DBBS~&P~28 zbB#YmzQpwK$kDEcRXWz%W5#bV$2aJhvn`9Sc3JV0p^E}+Vp8&*xCg0e=@}Zh?3~=Z zhqjpog+;|4`K4uq@=JK)lgg@!>YCcRDpErurmltDn%vY*rCn_6WH19ex_j7%S^Wcp zj=h`_&d}KS7b43>{6>tbU9K1g*~Fff!;h5>hOf7$P(C!5BYl3sl?>|K-NE_#m$>cq&uiVPoXef5 zq?rb9O86@-wc%yUss4Xuk+jBnO4xJKrBPbbVh8#ix7?+p`4uzz`?|vDy@$&^SRrv` zS33Dk|1G}09gg1mZa7cFrGiD@su;l^y|z4N-L^V;!zNSt45R&H8}WRD^*Dq2>1BfF z=q!jy`?5$6{X|P*c6@tHxF=o=V$nC>;ZhA+5?P(!KcI_Ua)Dip?e*uB4*EowE&2=Z ze6-5Bzjt@PYjGPcAF)vv5tD)&Iw5_#tJVZT}4xkPvr9&V?AAOmokMQi>*@e9OZptSchBnTFx`z|YL@WgSU zpCxrw$+8|`RTY`Px*{S#cA9jyllDh18wIPpcR99FY=E%5ZshBf^O{g3&_w^^YB4BH zqc_d%E1oUn=@AG_R(J~lCSOX@`;f&$ZUmQT9tI@l6*{qbKr3%!0O8cc)wM7c99EQpZEC{h`7gt z=0}ZwS~qx4k!$z06VfO=BMf0^~z z`?-TnV$}-iCWzH5i09r~vWNKAZ0i67#2*2-j|k+JgH)<_iyM6^zv~iucEPXoA2qw> zG0trU$Ag1G+G`<=8_(3ST8wfrd}t-GuI`S#OCn!&z|K>1Bl$E(MdZl}(w98$u&0q& zyC0n>V*wG7CSOi=JOzO+Y^WA(yw2Isfh^CT^`|8He|AM0>Pi~LTe?M2hAZZOFo)9NZ7jZ}UjoM=-zp@?01t4>_g+kIspmpQg_ z@KIEzlc=do$ddbkL^X#qrTOlME|lur#HXRn^RgSjt9qegYD((23RPT%x9_TSAb zVoLzT6B1p#lmoLO3x*CSTaOxsx8PMBa2hTH{V68jORFKGW>r_gKBb&oE?(PW5mvSEbBzh_kx)pJnLuk`|d%YIYOLs37YJ)`#Brs7gkmzmfv9&4-s+q@jAzT z5hrA~&r9EmK!KEyPohCkB4vpH(S#-@X$z2k;4^jhs~69eUsA7pypSuTj%G9jTzFJP z!3wML0HT__$2-;lL+VCh#qS@rNJ)}gs`HCV-)d<|E%zgGiPO6E@*qJc(&I8jYrmI& z&6doEr^_u%~ z`ZKU3D@IrSbH>ZQ3KO91nG=^4ZA*_CQXEWRA_0;v^S!@PTJbYu%2Nxf*-3$Ig_76P zx$~)GrA4Oq(H|QP8EKLkKdJLo16M=&2adVryMwNr)C)lQOn)t;vHw7otzsKdpNl%8 z&u9fDjr#RIExI)E!YEP?_R7I*haqU~O;&Hw@^*vYV|;6DzT4`utn}u1b2PWfh$jAT zR>nQnYWB^*4R&(?jnV~(JAzpqy-edBr&f3zHu{`?`TVlG{GT%$zU`yU)eA{%k%=Iu z<4<^y$0E|NQ)I7Q1ik@ZzSbvCBd2W=J)2Kf)hnM>HgG@$T9RG5ILKQWK^<@Yw9$KR z01PYMhj9*C;`duNlVJlk3tjZ}@*}6kf{Ecz0ohejS^vu(=}4 zeAB8`*`{mgf5lMfyfZ2)vUr4lWo@Ak1Vy%#Opal}no*M1-nYP<_lVB}KogM_->tUq zd@x!$$i2>^kS@qn9)~DZ;k*RjpOi2|qkdV-WXGG`oP2S~(3Qa|?4GUWqcu)lW3(Br znqba44|df|3x5-KgT&sYb$R0A_TK6qtR?L03Hso;=*b;Y#1%VBi|27^ zcNHfk6CdQ$6lHGSFKYux&UGk#KEtxO>@r5Qip>Ah6^v?0O{aK$%`MOf%(#;bgin(zzUozi)0Fs(_M%=#!J_^+6pPv1;5wdKF@GEf; zqIZtM9B!T5V11YiDKHbD58r(Kb#KkJUkI;KFHyr^{8)fx%*A{O3C2dPb>`R3-W0ta z^=x~*C(3$O&g5tHYQP(VBdCScZmj*gCtrexjhWcZyW|tIU$3*7<69e>5fseV_+e?D z%HinT)qo7jR-=9}AsTOFCz*W@qrBBrMGs2aD(u*Me)P56u{++UsDQY&e^$|BkCt^7 z|C$(F=!vnV#f!J3b}3s4&Und_fAW}d`y(&M9Ftc*cU(nbqaGZ15h~Ee?B4(3c)bDs#bPQoe^vQ`mA_|0HPzc%{`9nc+6o8sOlg~K^-Y)Bg}(U39+}Ly^Zt`i%!|ie z;7n`_gCq z9-tGTk=Prm4!@4O%lcpYs_lC%6ePT@eoy^=^lW0m>^_MDCkv+B|H|CfaZ8r*aq~i=ZOg%tt2%^T>D)xenn5}fW()JJ{6XbvtYk8A}(KDaya#hjklQ3 zE-o!E*v|WIZB$f~@dJv8^UJoRM!@|fini3Zl^O4TO0Ggat9y zJc|JS(Qo70*|8FRcJD5LXiknD^=xj;86UmtpD^VPb3e96TB)m6Vaj3**iGb3g~=9;OZ3cA4@{<#V!@XB;S@ z>VaN?4IYW%R-hfQS`U7o@Z!dqx#S&FW`&XV{wHFk@ZeDqxMwk`zN7;H z%otJqnh{c|NdU{4641ST;y^o5qEuIEgXkr8`w76Z1#HQ??{a_( zg9un$BM*!x(+$!Z0rDUf{ZynXr$Pk*_%B0FwnXW_E{ejZ#64VR;iY@g* ztE8lZ==M3vn^lr((rT3zngsxZl&6-)0J-0`GHX?C;ZT4K@JQw9gQ?Z#d4M)+kPNwc zYNJ{^0}6hd)M2IOuHfaJSCg<(^Or4iF(q+xv)0hF7U&@o<13RKqnzRlP0grFUy#mJ zQqEql%OxFp$dGwddZ;j5x;Uf0#96w`=1}>1{bL6FiIQv;30}P*RhvN))Q3wo*ub0C zNi7UmYm6*~1fx1jb!0SjE=V$MV9d_a9+FZox2zwcG`OHYT&gre(i_ca9FNhR{C)75 ze$#W`gEQf}FEg6v^>r2*2VSi=y0#s*FY$v{~vy|CMSnRCecjmePDs350QH+{cMqL?$ z#AGxsGMf1eGK|?~%WOw6X|YUt8I!?evKE=$d?p*l>O(P%P^_U?7N?BGWwOQ=SrdHL z6s&97w(A9|Yc{rPuB>Z;*|oITwaoA0!MfktcCVni-^X^Zm36N(yFV{>f8}>?zO>p4Y)21TtWA`!3RAMgBSb;y)c8`gh5{xTX<>k z-@QS9_)s8XDA;c(1Tz#y7z$?%MJx^7*c(E_ha(Zgcl?Hb zBq2CBKh6UTCyl_#U~#gRI5~S9Nn2JvVx+)tqzE&DCybP`MhHtI6$s{8IJXkPed@=p z!Eoyc+?W|U4CWw1tBOQYR;qipzCA7X64Z)^xN#vzPx zSz}{MW1Wn_Dfsv_V*G{Q_$+38&Xt~MB}Ewaf)gHfbIVQfCcbq diff --git a/Docs/Raw-Flags/maldives.gif b/Docs/Raw-Flags/maldives.gif deleted file mode 100644 index c0c53d9a868e1e3d6951f688773d85e866487f78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2623 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 diff --git a/Docs/Raw-Flags/mali.gif b/Docs/Raw-Flags/mali.gif deleted file mode 100644 index b2430b3de654a9682532cb8b258445c37083892f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2525 zcmV<32_p7KNk%v~VORo?0ipl^|NsC0{{Y4S07Aw90JQ)B0000000000EC2ui09XQ$ z0RRL4NV?qqFv>}*y*TR~NBCeUj$~<`XsWJk>%Qx2P z$!tzMv8Z%Pty-_BqIS#edcWYFb4)Iq&lo6n&2GEjtgw7euiJ&_ynfH$sNsNtf`cx1 zhKGoWMSYBoj(dNEl9QBhikFy~iI1F}o=1_DqNAjRny09#TA!?~t_`83va__Rwzs%9 zue-dDv9!R!lDWjir@hF@XurbE&TPif(uT^_)=SLK+S@VH-rrx>;^S%D=I7nu>gz$| z?(YxT==1ae?DzON@cZ!c_5a)Q2^7e$;5dH(6ABy1ke$JY)etJ2D665xZxA!~l1Q=t zW2K8AqiG!JilfJqgF>pzMY5$QlPF`pSxHls%bSj1%G`;ircX^cgYwbIv*?tcNEHcP zy3D9kK}n-hV@h=l(Wh8fNZm@Os#hjgvx+srwJeygXpw{+%Ql4Bw_MW7)v&g0Tex_M z%-w6DuHCVD0|VhpSc2cbSp_TRQMj>#!-$_Qo{Yn>Wd)EU8>P&d#%0TyHS_G;`LpBD zqGgiiY`QV()F@X|Ze92_Y>%=h(vNZ>36ZiQfi3)xS#S)`E}1&L%EN~*+UlTQ{E zWk^#(W!_+tct5!x=zDuGQR%$L9oIOyOFW~=pZYNvdc1S zjq43xx;AdIQS7h~Lq#*%WJiN}n9 zyr{^Sko+;l&!BvX%0sbypUa!TtcS^j(pr`KJ9?S$BBlKr*WO`tud+H$bnHrKVleU{wV z(9NLT;oz-=+g$S9x8G{%U6J5j5S|3!RU)3a;-DB_isNxX&H>~9Pg1^x<(EsIq2`Nl zPM7DSfF8Q&<&gf7=|iBN0p>`u-n#1-z%Hchc+lRL>Z{}agYLWYK8f#x0Z)PLI}-o9 z@lOapyz*i&Zrzpj8Fsx zfWZpRB!V6EAe2DpKoO4cf+aNJ8a5b06<&dbDRd#3NGQMzE(nG-l;I0$$Uhqr2!}n? z;S5ojLm{q-hxYSfe}I@oBOZ~6L3E-Nmk(P5LVju}QN&bbBinFAIkXS`2PLY#Y^dz1@*+o&N1By*F^sonUjPWXRb^b*_`1fwboc;Hfov zCJCQ~)TapeNi~0N2B3))D6r63ONAZ_p^bFtLmArtONkQHX$G|tL?bCtdu+6l9la>h zGCG=%W-_EEZ6!)6+Dwb4w3sV3U<(y0QlXJ_CpG2SO;z*KWX2SLGZkn~ZMM@m^|YEl z)n8EcIaHVxH8w}hW>V?5RC_j6WlufHRY{iBLa{WOF8yjZ!z$Al(ln~=oT~e(s?M!? ztg9VyE5_jZ8??q#t>|N`Ipr!bx@O9*{lu&I^eRriGR&{W0c=49%RRz+)363Ztf>@> zQN~)&vC@Prz$Duo%8t~s(8H`VHLEYq&dRek1+DT#D@@YT%e1)?YdOgZRI>^dwK`QT z@mT9i*SZU~^zbdZfV&;s5>>ap@*0JL<~P zy4J$(w`5yS+A7tyOw}$|xyw55suH}=67Rjpn@{sn6}?tf?_1exI`^6qzRHsC!{{4O z`>qwgZPo8w`3pM#iW0!X5^%)`oKOSj6~TK|a9~M6$3H7;5gqE|Q2{w>G~TR@5r<~Xz4s!I}aEC&v4VT3;8T4KTpok%|*1@6sE6;hz_yket}Cc(F!B0C$BuBanYL{IH9JeseqOMBI_%^Yd%4jL@wAOrZTww( zO4+WSuX73PbqBNEwH@+Vw~f?pPxsr^4fl%24YYEz@7zpE_xAL?V}9$*-{u3jkpzA| zcZU<+=au(u=`B@zcNgE^CHRjGPBVmSPvJjeI8-!lWRAPc>Lui8{l3cxu4MK6@~hRrJi82 zFV^fGM*D}=-e|T%%gA@Crk`=M;}1#;?%vr-nSiBriG22gveW@_S_g ne`3L>81u2#yuUbaIM3?`^g9&&XGwo!)8`oVyH-8E5&!@@4PF={ diff --git a/Docs/Raw-Flags/malta.gif b/Docs/Raw-Flags/malta.gif deleted file mode 100644 index 1db0ec66a8ba68864c59ad22760392b3097d576c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7209 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 diff --git a/Docs/Raw-Flags/mauritania.gif b/Docs/Raw-Flags/mauritania.gif deleted file mode 100644 index 3cc19a06f7b7360128356f9acd877e3f264ea48e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2511 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 F`+r1rWwQVP diff --git a/Docs/Raw-Flags/mexico.gif b/Docs/Raw-Flags/mexico.gif deleted file mode 100644 index 978968cc2e3c84b9e995b51fc20e6a98732ebc8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16889 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 W)89SW=e;lPJ>Q$O-&aLI0028f=OZEj diff --git a/Docs/Raw-Flags/micronesia.gif b/Docs/Raw-Flags/micronesia.gif deleted file mode 100644 index 08ac921fbae79ec3e1b4f3c0ecd96618983beea1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3092 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 diff --git a/Docs/Raw-Flags/monaco.gif b/Docs/Raw-Flags/monaco.gif deleted file mode 100644 index bf6bec293c7f2b16c4afdcfa2945adf28f6484b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1205 zcmV;m1WNlyNk%v~VORo?0ipl^|NsB@_xJC$y~Y3l000000000000000EC2ui09XQ$ z0RRL4IJ(^aFv>}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ z$!t2G(5Q4uty-_xtai)odcWYXcuX#v&*-#z&2GEj@VIs;jK6uCK7Mva__cwzs&s zy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=%($mz{*4NnC+S}aS-rwNi;^XAy=I7|?>g(+7 z?(gvN^7Hid_V@Vt`uqI-{{H|23LHqVpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m&2 zqsNaRLy8oJq5$&6_xL>fFh*r_Y~2g9;r=w5ZXeNRujE z%CxD|r%fOt?uiw9b0}CEZxUk{Fh!ZPb%($`R$B-jSo=my2<;$2eYu?Pcv**vCLyI0wy0q!j zs8g$6&APSg*RW&Do=v;9?c2C>>)y?~x9{J;g9{%{ytwh>$dfBy&b+zv=g^}|pH98H z_3PNPYv0bjyZ7(l!;2qJzP$PK=+moT&%V9;_weH{6F|Sd{rmXy>)+46zyJUL00t=F zfCLt3;DHDxsNjMOHt67k5Jo8BgcRNvz=arQsNsejcIe@UAciR7h$NP1;)y7xsN#w& zw&>!EFvck3j5OA07|%vs_CYjcIxS;poS{ysHB!^>Zz!v zs_Lq&w(9Duu*NFuthCl@>#exvs_U-2_Uh}ezy>Squ*4Q??6JrutL(D>%r@)nv(QE> z?X=WZYwfkzW~=SC+;;2jx8Q~=?zrTZYwo$|rmOC{?6&LfyYR*<@4WQZYwx}I=Bw|% z{PyebzW@g;@W2EYZ1BMdC#>+o3^(lX!w^R-@x&BYZ1KeyXRPtY9Cz&T#~_C+^2j8Y zZ1Tw{r>yeIEVu0P%P_|*^UO5YZ1c@H=dAP2JooJL&p-z)^w2~XZS>JdC$03-OgHWH z(@;k(_0&{XZS~byXRY*wdY`5+9+i=G%_uO>XZTH=H z=dJhNeE045-+%`$_~3*WZusGdC$9M7j5qH1a4f!`s=XAF8l1X*KYgmxaY3>?!5Qz`|rR9FZ}St7jOLW$S1G- z^2|5y{PWO9Fa7k?S8x6G*k`Z(_S|>x{rBL9FaG%Cmv8?0=%=s#`s}yw{`>I9FaP}X T*Khy*_~)Ww0g~MyIb3_d`_?1hvm0^&+q&H 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 e6;*E*Q@>SNuOC-m66FCdc>0suP!QqDU7 diff --git a/Docs/Raw-Flags/morocco.gif b/Docs/Raw-Flags/morocco.gif deleted file mode 100644 index 3dbd19fc45ae81c06e0d5f9ad06d7bf4939ac198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4507 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 TaT5!<$?e?K8LosF7|{PO9K<)` diff --git a/Docs/Raw-Flags/mozambique.gif b/Docs/Raw-Flags/mozambique.gif deleted file mode 100644 index 3bcafc6b40ce300154b7839f61c89bd279a78ab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9086 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 diff --git a/Docs/Raw-Flags/namibia.gif b/Docs/Raw-Flags/namibia.gif deleted file mode 100644 index 7d8ad5d8771d9d3bfc548bff721eeb0c6fab4a35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6725 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 diff --git a/Docs/Raw-Flags/nepal.gif b/Docs/Raw-Flags/nepal.gif deleted file mode 100644 index 8d536ee4d3b95fbf5c91ef68d50191a53b379d70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5658 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 diff --git a/Docs/Raw-Flags/netherlands.gif b/Docs/Raw-Flags/netherlands.gif deleted file mode 100644 index 8b170f1e0e8adf91a6fbd5345299ba8b662bb8d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 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 aUWfc}Dm4f7^t`3E!}rY-84Lh`*#85DM1iyb diff --git a/Docs/Raw-Flags/nicaragua.gif b/Docs/Raw-Flags/nicaragua.gif deleted file mode 100644 index 366ea5098f50a84bb01c306384102d772da88404..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8024 zcmWkyX;czw6Mor25h%;7w6Mh_sj$Vg6|meba!bt;bKklY-88iuDybP36{#5(nV3r$ zrFdd*xjHFQ%M{(GDm~PQ7a?K1XgmPl}2K2P??Ll1PPCz z6r$w>!ZDWk4VSY%U06gRm43 z#sy-fdx`{jvw?RC;0l9+QmowLtlW7Zh-+sTg!UE#cLAVt0i6fz;(%icfi6UIm0@;l z0#_Lq#B&c5dXu=ZVMO(IF`;*=@gO12%(oh0)PQ*o`r9IaC5K>~J=isvq7hy4N1 z^)}}PnakMjDxvuw*8kK_mO@vF>0v>1rPxl8LYD}FBtkTgjg|||!-A~D0+LDl~T z(p;r<=kW+(VFbCHpi-e#nm_P>Oiq%>tOP>yKk^5sQ2ZwwpwhbY1a>K0AlCrlpVpZK zaxIW(fJ6%fN)lIWE}KNh2|%21WXd4a8c1#06X>2opF8H0E3tIzKLfYDc{3G7>=;<}RTVBtawz0D$~Q!T)Cg zpbg+L#==!9s?R{1t_*ILUT?@EEOi&U-YI^1#(Z6DPxGA{P3MSCITmhrOP*b{@u>)Y zc30e*PYG)gx>c99UvXfM^*pP-*>R1UVPxrEQ`ULI_2SC?Ej8sYZZdAT7rDzSURDNF z$M&|!Dqr1ZHsn}()ZThs9sQzWe`~Ge?Z2#nmLiXTt9lv&idy&HEQ+K9vXB@5{ztNyA#N zdOfI}cw5IF*S0_Sck-Pg!+7zohjpI@nlIXhs2<+?GNQiWac!6U{bQ3*`GcuR zUBel};@yuP&U_htQ5n+lNd9w5KhSz@_v1&ue@=fHf7kK&vB3b4HaZU6ELxX_wl349 zW9>(E83bpWKJFa<=)P0tk!5|E7RN^WvWS^B{n^X%qWe$Vl$Q19kZVW#&rp;$1HAQ` z=z&~^;j)3VTfUDDoTDO1gZv$4F@xt_t;+{5c-p@oyvT4S4GDbxV}>pTM3xWb1s{7q zl+Vm04Htyx#SCALE-fD}jIVt^e1)YXjR=owVn&LRhRa8;rhb1va*cyrIV$3s#g1Oj zwyqd0=Gl*p-Wb@i@_mWGKlZ)2AhP0psqom?`VWu+Bk6}M`~#ww*s zgF6Y-Xky1Db;A|oRS&<9jo(%vZ9hmG&Eh`XX|}HXaJS8V{6n?c*><9)%Rg>H)*V?n zQQLEDeBxhSrtQbN!MwPS_eM)AKi>aPJO1&3UTHh|@T(?nQa(LgIr-?<_wmWc07cd- z;Pc}3_2?D94gn~d(qw6)w*nIAG!Z_3F^ict$HwNvrzT<+d2Q{{fOr|_(-wvf(I`!d82Q@3z1+y$1aDb;k4*`&6v?mK{onD(=RY5Fh(D^k_64FsemwjxQ9XOZ+ zLG5x{MMaykbuh~-BUL{?E_(543bo0mC=LYj3Gk=U1BX%OE6}X0xphX=oq)zy>;yKR zG&>W=cou3>m$l|UIlDvz?~)y4?$mn>xFazV7>AAt2D&sP6HNe%08_tJ;;mk^NWn(G-)Ivnjc5Z&tf_!nZlglih&ufJh_u-jX0U~$G!O`2IBSK} zq?r?CP6+}$Ds){<=s^e}{hPJ22K_^yMHQN%4HQNt_7@&(<3mwb)%8eC4sM4H#Izeg zXSwdeFKnh0C@hF=7w4$w0~nfBi?l3Ip!Tdw!{u3XHiXlRw@IA{Bd$%G{&P3lqsyq` zP`LPRTGk2$XK;2Ma*jF;pIcn8txV|4R=&=R)mcp z9L_^nT72?fs34+>`S8Wq&jApflVz+7ve5Gu?(n`hNLS*PAg}sM#n@6x;=lG=)$Yd2 zrh6pT*6^*A&z#f28p~}8ie;e}a3Io*_{)12)AMCPk1VrU1SDoIahb7 zs~ASu#rORAo>0$Gj#m(orl{?EF=UU%PPRoEM&!WqeZ0>kOYunU#Xb0QI(Dk zo!89UZJsQug?#TEgDqE63DXqFVg@8|`!t07MNL`gOS?hIEq`*PoAxh)X%gH_!_rxu z2PgWF8%05PQ-OTH><(g!pxiru&wbw_Cj}ur2S05wjbaI5#iNB3B(|cWN4{^?3$9m4e9ctVaqWsy7NVm=DYiAvjfk*29;$ry+Jwv@uy8!QpPZ(aZmILy{TCe410)9-B@q3*8rs zK8U36&$HxVfU%H@@=kh7KI5VNJnU|vcmY8t+29rstQNQbfMAZCH))MrI&T@Hyn2B( z!jhGCC$Wwm*zTcwQTpmHz{r?ue&*KJ)a$dlL`n*8R-bdK)q~a}gJ}PKwvZa?Jp}G> z%!m|XRc4y>tVUr{*P`>i}FL!kY;-b)aT$@Z=fL z9*h;$d{$udA1XZ34U9C$QFfjcV7ARN`7ngtJpPb{r2o|#E=fH9%FIqB9riGa2( zuJ$(nF87N?pWmQa5W5a)`bY#@g6+fogk_kSwa2m|b?^`--RQF#x&hvI^+$?kQOV|k z`B4qE6cv((=;TI!dj*e^Hq1XFh1W>#zf>b5Kq`S7pI(nqVim~Mm{l{H{sk(&^M(qV zkvDJO0#$(Xs?Q50W*h+g)Qb7pEa+51ivntec;3{@V3-J3;}S zub?h;P`j>1TLrl~+{g7ZvgyPpv!WB>OIj9Xt+9}IbS|M6SMHk9w}%>qvij$Ie}C(> zvX5}KZpRAG>qbFp=)5}0!qF|s5|J? zet8HwTU0#1Hz{k&*dBc9hk+lz>$Ytx+kP(b=#BYhM4G|>`co894?#dxPHhJjy8Z_z zOPklHUr88({kQcDK7`olIK1cFiLW;n|0lvvvGCuScvu`(|OsAzT z-(&|uCKJ;ZXP}}*uw}ZCIHF?`fcr#|*8t>K4jv@o$MhyDzVR&o{at)xmBM6#g*VE^ ze+9_Pb62gth}ukrp3O|77f_BfP)Q<0^isMD6BhlIOq&P!Ey9oKjD_EgS{Wh7^I~S% zV;_ldKh*eHx})l1s0Cxoo(^F=|PitSJXA3u?wc_Dj^V`G{##qKB(@jWqyVI5!i-Dqto zRz`{FVi>m&Lo1n4v#jI&?T>d9BOLh}m&WMp;yY)c76|O+&2m*1={7FpDxbYXG}fcc#B?bvy{!iFAJc zJoW1kFC{6bdGu^yDYmouY-v(RKWY_(kGFgZr-_hBLM#V{TvpHzubNZF2A#!0Xc;V+t~7jF=Qy#}Yu~Lu{z<9r`_+ znUJG1mj~!58v@)>@BL{fv{Ho4lNH{YIbT_3j1&PZ6}0h9TGfS;KvW(G8b zLO-fQX<>!R%d4OYRQ6ZD-fzc`EZ<*|otIdeqtXL36Xd$>e@=?1b&EGIB|{Ymrhx@_ z=TMuDUwu`KJj6uwL`2dRf46(XzdXHE7q@Rl54k_CDEAN&dZe)`_O&O zSLy zWCg^61KB5)qEqh9S(pAO{RZAP)W7-Cy#?omk(GtDm3YHuER&zzJR5kkAoFw(5(f$r zZ`qu=)xnnDUxEzLVRn|EuSDnG?8g2M%-L}nTTaDNG?hDFOID3zF65KhEbj)Nn$i0u zG|o1X0&dN``RH@>F6mW~#+QH(CDvB}Lv3V;!dayre8B*YSJp~*9%k%ADf zWFhY*k`oCCe}y3YOclcg+8haa-I$m$xhx`Sg7dGE3zMsECfnX3BJ6dfUlJXk)m?9>6 z6EK!Bqh71Ag&d54k1P|#wCOSV1_e5raix`*v0H&I6k#4SuY6mHoeR*H0hSh<`!0~2 zG8dZX{BYzA^xaaNi)eknj-p(0O|CF`D>8XYF)9#Y_#&7+$K;K|q(^To;9!af=<7_y zTZPG8X8oU)`ysJj&OxTBF$ElqP>tBR_?T z;0M?(VQf6ImrNT$P3mzU^tgJ~6Js(egn{fu;jgit6j3qORGdpZ?lK3HPsMm3@slEB z4qxusW;6-#c?xuq2$L_uG;5Wh!1yTAwBu9-sr-H zboeHniHqSEZdCeo1@=DoJMz!f=XndWnF0Gk!08?+L@Ce!ChiLJi6;+pnS-sBDsBid zI?$x$S1ajAd%jm;BO;uLSlQYn3fx+_1FAAYZWehyS-bDNwD~i`=u(gJkPdN3kMaqA zc8-tUN5K>lTN1DsYvO|!TUtsUV$N=9xu!nhVu7h&Nq#zjaM45lX0_JE3m1wIej;Qn za|fG=A}=66IEEZzHR_pdZ*E}(0CO3j(-g`}w=ih{l}5$H3m+BnF#-ZQMv7jMiYf1D z_xy#a{Dm80mVbL|3t=M4OH|{jLNj9I5-;2KdB!eV@V{=goAqGg$S4*c^V(pWWQM(; zrf9$PPfg-*1$w*J z3*Xcig_N#050xQXyTaQVFDqU~?l;l_d?Yx$>$j%kGjtgPQ>*xs^o!usm&bdPHlEN# zwKt~E>pCuf73HOz)2lw&{wkl35fd@%u&?;Je`rTiiyq~jcwJERI&b1tVejkr9xtxu zzP_SEvMpZk%H8TEw{-X(ExJZ#n^^uFigCZxR+tX>zx2b|7Qt4-(~SM=(7 zdtb?MZ+dZK(%v&<)ei*On+0vw^dwd|5s~B)6msSRZoC)wUWaoNHo63B$ED4;^BafS zdq3tjjsq?3Bks>)^mYO_M$~#YF)PIZYK_4aZRv~IIK#$wF-w?-FJHmS0d`FPY+v4>|OD( z*u<1fYeJy@OCIOzg8tK)o$b3lPrLD-zQC#>`zqYLLxcET!(mtZFo*iKY5R{W@p9|H z`0r8pqk&1v;M%K0XRse{Ud4$%>I@SDt`B=}ZX48^yu0^=X(m0;`HwJ34c#V1Zj(Yd zvV2&C?Ub-XJJC0=Uyn54O#jip`-nsB*1t08f9Hsb=h#93EK=0)?P?~J2y^?2G~?s_ znfGY^wx5q9Gju4MYoEDPH0j;v)#pCj8a}TvJpN2x^M$hbi~YGTYqz7L^xcd73gi3` z9*Um%+quagB#wfxPpp)OIbNelwVV172#iCu? z)IK{6mmw@fY!}z`rfZ7+J8SXOk?m7QL#B?MoJzVjWnPM!$3S?B+&ua2Yyx!0$?tTB zj$>;7Bj&N@C)YSE1&ej-BW}PW|C;t90e@CF%FotEhomv41=En--$L^6g%MxsLc^Lw-7y`Tu4+ zktpo)_BBv-*aAgb zg%6tqRETrdIqYI8^L0IZw`+kh!u9-Yrp|&KaNv0#;l;>q5$zOic~IBro|1)#Ms;XI z4&K;8FiNxv+vR;Wi8*RxwL?M01t8xv25CM7*2KK5itsq9LTzBjyNA+?83h*WTO&AGZmF5vlxjdr`YsVOC#ay2|}- zM<#UQ=C1M$!&E29I2z zrf>Q_+m}T{?tS5OE`3y#wz20HXN?_%3PMe6KLAeEGjBcl5z=G*ryX-TgL2@eR5TS2 z*}@vY!C$pxAWc^qQ}1s%LWE#vNj(m`E;+OQ!i`OO!jmd|ka@ikBsE}Z1L@Td&Z%B! zQ7&;)ofP-)(uO%~&$Xx)C*-FcfSIxU(PsjuxsC9Nys3XX$5ifXW~~MhLhJW4kh`AQ9b@cx)fpV zx-8b(=9|J3{$O~{H~(Pv2~W=4pwa868i43V6%lDfM{R%?^yBtAB^%@KepQ?!LfZ7J zVVy@`9@}@Q{f8nGUvlGbl&g;-jjLMSO*1xLGUUo}q;#jjEoxlrtykW?bnf(;tLWN& z9GICyY5b>AmCZQiB?VAU>mbo%a!G?6;k4UsM5}g%Fq#_)?mLJE%^U8K*&8nqRz}!*SQb@fq z7p{}k#=QFHXTm4llk7Bm%2v+(O|~}I(!R3Nxd)An6ljyS$0QD@o2H*Oi|6d!FuLHMn_a;h4unFXh0Hi);5^xcPlx+e zYhI7ZR;-wltw5RU)1s3j-F!#h1@kd=+ce!_7bxFjkgySB;!`}H11|!y-nDJmD zeF_?SvK@HGJ;SYiF1Ln9t}B}HjCS@Zd{Gj)L2}$H-Vo_?_m8~_q`x#{d3>lzN;5kJ|b( zP@U;tb7Ofzj8{rfSE;|OG9n>v|IeUqrGIU;I3Xb+Wna&*|Gy8068<{zbDs{mx2|FN zp~JZ;!GqR&@3lr8Vi)}k9(CS(|AqL_-;$L5A0qcYcsq0`QT}tkK6CHGf#rW4Z%;Y! zwREq1JmRmE-k%4im3tq35&v~!A|>S4@ZQHihyFVG`)3G11t?(FtTdBUCVWLey>TQf z!}1ps?Go_Bw3KyfRca_UDxhKEFe_{8uTVl(K;u&D!>7Gc56-z6@YFW)@R|L;4w^Rw zDA$!9&P_-Svlt0z+B|&t+=*XdL{wn2ll77FxvAmHRs=rt*cy4{V$rW~8<)TqpVA|j zB&iYPsKC~J!$gt?*RYjd;jNa|L0o&=K%lS zO8?$D|K2J8-WdPh0RPqq|JDHa_xJbr=lA#4_wUB{@3r^ut+nU10JQ)B0000000000 z000000000000000EC2ui09XQ$0RRR6pdgN9X`X1Ru59bRa4gSsZQppV?|kq7z@TtQ zEE41ejE#0PICJXU$+M@=pFo2O9ZIyQ z(W6L{DqYI7sne%Wqe`7hwW`&tShH%~%C)Q4uVBN99ZR;X*|TWVs$I*rt=qS7(BTJr4xw7TUm@{kM%(=7Y&!9t# z9!C>oFt6t5zwd>abV#}UQySDAyxO3~?&AYen-@t5f($n3;DZoGDB*+@R%qdc7-p#9h8%Y2;fElGDB_4DmT2OM zD5j|5iY&J1;)^iGDC3MY)@b96IOeG1jy(40NG7S|l1w(~q}bjk_A z0}C8r!31jtD(IlsQE&hQb0$#004@wrz@2h3Z~z5_R%$7ghBg3!os8Zv0Hh5}dg-X7 z8cDzcn-%~>0S-X000E`ODr=4eXqrH$LVOBA1F+8O>#r-;3PA!&B(Q6*z$U9~hZLYn zY!k*VK~NtEH~@wN53Kv}#rIMWu^1FvjPb|f zYAo>>9fNGLwIZ8Q^2sd!I>E+gP|R@4G><9)10$p100RKm?6aWyvH^htKNr0wya%6= zFug`MeI*6^x{&vf!{NXJ zZrAN20T3kZM#9M2?YE5$JWEFc4g765jdg0&18U<@K;g3I9wF3zK!CdLz#GWAAFl^* ze1Z&gu15k49Pd1V6Xfkj!ZSZ_J%1KJ00;yYT<`sU!~aqI_vG8hIUt{xul{@w)V@an z53Dc0dlE?hN5WpuuRnPeXdeg!71*Bu%ac7paBqMJ437a?#|H;6ErAf+&H@GDzzA9} zI};2<1uw`!>SPcQ8|>f(&liXUJWzxYM1b=8-~a@m@PZ!{-w9ucz!(y5hBOqQ4Oxi8 z9O`d}4eX&02g&b2&U3h{WF-A(2h3@5eU}_uCO=s|ys1$Qd?O_z2g!!H zsZxGvlLOmcxjwPQfo!ytAJ$kIv##Y5mQicNEPuH^q_JUX#MEEV)-beW>hET}oEXoX zslS&+vkNk#=KfMvhLvekf869)#lAVfaDKs?(?Y@)=1vIaE13Nn zTK?*(!+2d`Ui{=>x$qf0cN@1e9DJ0wU zrZ~;1P6@bEo%F;fKUGhtq~wy9z=QwptY8OA*uon2u!v2pVi(KU#ya+~ zkd3TlCrjDNTK2M--75w*%h}F)_OqZ3t!PI}+R~c#w5Uz3YFEqJ*1Gn!u#K&3XG`1K z+V-}%&8=>C%iG@i_P4+du5gD-+~OMdxX4Yea+k~8<~sMe(2cHir%T=HTKBsD*v+nX zx69q`diT5F4X=2|OWyLD_q^y$uX@+Z-uAlpz3`2%eCJEw`r7xt_|30=_sie@`uD#8 z4zPd+OyB|=_`nEGu!0xN;08PR!4QtHgeOel3S0QX7|yVUH_YJLP3S@!`p}3@w4xWy=tevG(U6YPw4^6Z=}KGr z(wNS)rZ>&$PJ8;(pboXDM@{NdoBGtKPPM96&FWUW`qi+GwXA1N>ss6T*0|2Ku6NDr zUi5+StyvwztjgZhQON;10LA z$4%~XoBQ18PPe+(&F*%)``z%4x4h>~?|R$&-uTY9zW2@Ve*63101vpp2Tt&U8~or1 zPq@Mt&hUmi{NWIfxWp$;@rqmg;uz1k#y8IKj(hy$AP>37M^5sRoBZS`4*>u>RDd0a diff --git a/Docs/Raw-Flags/nigeria.gif b/Docs/Raw-Flags/nigeria.gif deleted file mode 100644 index b80eeb0c4ab654b5d305de9b31e9fc33c112b425..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1998 zcmV;<2Qm0ZNk%v~VORo?0ipl^|NsB@_xCx*IRLc)000000000000000EC2ui09XQ$ z0RRL4IJ(^aFv>}*y*TR~MfhMSj$~<`XsWJk>%Q>G&2(+wc&_h!@BcbaY)C8`kH{nn z$ZR^F(5Q4uwFs5itai&~Rlne{cuX#DuHCeH&32jJ@VIZ0Z6 z?rrPw@{H~8_FeP&`h4~G{#g403M|v_pFtx76Dpii@SsB&3nNPW(eR$$C9sde@GEv#8?WYbbQ%Qo0pwa?nh#q}00wz+s) z)wO#puisI7`R@8l7*t@vvI;A@c6=(bWk-~CUf#?vGfmE*b9r_dy0n?e zqa~SMEe3UJNUUR5asAqm?AuXj*G7lCHxu2v^Y|X_19xe-HnN{Py(g7rDJEGp;Xi)+O=+>9^UNF0tT>UblKy!hxFk0uJ)8<8Ozi5rp}DtQ}|7dj~$loLuB z81i3C z*!dY5pwbBn8KKM>x)`FzDXJKw!8uwOq`OH<7^SsY`WL3JY3diJsd<_gsH2IB7pb0^ zIv1*$sVWz%l)2g#td7ab7OjZcdKRvN>1r0QeEAv{uyzRx7O`*{yA`tkYALG~vuQb7 z6|`hYOBJ*?cp~mFb)i&Q19|5YYYzJv7gr7%dRdQz^X< z)Al(1G}4_&tq;^$Sq&A{oM^o@*Q$9P57zF8JvP{3o1G5XU#Yz|+Tgf74%_C)JvZF2 z+07N+hv>aG--YMN@L3+u(W?iT5#%lcoIpJezK9|6*XfJiXl0TGB01u6o7A#-3LAeb@j7&<`?5|AJk||&9fzRXjw~L?vj_j{3R`eNdsI)kC@isWsQ)T0b^!|nHq3r_n=74@$tE}_AkFZNQv&7O!a2z)&UHQ@o$YfcOWG+<2Eem^^_=H7^XVRX z^7EeS;b%YhDNum+PoM)ZXaNzLP=DrAp$TMYLkar-PlwhMqV|y}Ml*=ejh2w19wmZA zCpt`xT2!7P&0$AR>durF(WDf8C`;Gr(k8AnrWc**Icr+Qo0b%$IvpoZv*=S;j&!JD zgy~ODqAbsRhqh$nsDu-T*|z1g zSinA3vXQ0iWcgTG#9mgjndR(e@z`0&epa-hCGBYGSX#`UR<)^R?P}rJTF|~$wy~w{ zY{^(#)ZSLNx#jI{!Pr~a{#LlbCGK#sSX|tj9#^@^W$tpR*j(T~SGv)q?sS=0UF2R@ zyV>RLc8S#r;W$$`f*k16ySHAJ3?|eyEU-aHrzxn0welgfz z`2JVG0VeQ(8CYQa9$3K%X7GX$*kAxZSi%ve@Pr9iVFX`T!x`rAhWXcF2!B|_Atv#N g@mFFDpIF5yX7P&Y*J2RASjI7?@r>Cgp9BB^I|Mc1R{#J2 diff --git a/Docs/Raw-Flags/north-korea.gif b/Docs/Raw-Flags/north-korea.gif deleted file mode 100644 index 83de40354233ecb423043c70584cc039dc77ec49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3044 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 ZL?MZ|KqoG7iC@LU6=3YqJ<@>l{{t~6O{@R_ diff --git a/Docs/Raw-Flags/norway.gif b/Docs/Raw-Flags/norway.gif deleted file mode 100644 index 936d41fb6c39078c244cf7c8a83ec4c924db4702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2544 zcmV#sC1lwdahC)(8N#0000000000 z00000000000000000000EC2ui09XQ$0RRO5kjP1^y*TU5yZ>N#1!QTSL2;~X>%MR- z9|dZYgQ)L(@BhG{a7Zi~kI1BQIl9?Yv#3;BbDna{tai)odcWYXc$~4KpwqN^RW;+t z@VIhn*>)t}LQXq^h*Fwzs&8ou99Lu{X21!o$SHs;s=dYQHwY#?R2v(sRhlp`Fgt z+S}aSLe%kT5~`unK$_EY1o@Eb_5pdo+%q69Qi z&Y;7G5SJiKC}UxXh7mJr+^AzBMHm+U-*6mBvSbI3A0y#2$+Bfhlqq4YbV;+OLzppX z%(Tg~r#zf7Lk7U;v#8N$KvN1OdbFw2T1h`HeM+@zuBa5JTHVUk6xM`VyNVr~=e;xB)^-Z-1d4zkj6q?bky8fBzLI41L2vXW)X}AXt%o3`RJNgWN$V;f1zP2$F>u zcGypV0=baw3Stp)+nkna;I_}x$plqHgoR@^csb?UGHj0>`IU(w3nTt*`>7`{r z8dRE?DypecoOZfqrK5;y>N=lF73!&Ak}3iN)E1*>M9Vgjrz(E zu)(I9)vClMDeOhb61uGaNX_#3>`>A6Ijx=5I(cojcy7zBr+)$}rJ&!AYAjgDmJ6e| z>QZ{{S?RW0BD?Z_NpHPb-it4l`tGakyKcqnuY~;$JY>NJ_lR)9H!jR@j1E7%V#E^9 z3vgWmSBxLU8h6NX#}|GKa)cs}ykN;D7l?Ao{;kaNeJ;NoU(7PEM{~{O-Hfw$I`4d4 z&pt;7bkNHUO>}WaAMIPxO5?_K)3QAcHEU8&ZCce0_S;>@9ogJ;gKhU^c;`L#-ktUBx7pzWD(T>Q7e43Vi2toPkb*b< z7uk}-MS10FU5+{bS(p9Y(s}}j_mX{8jo2a+edFxfZ4*OHG&)!t+w(F+4 zZKvnn74E+G1bpx|4Np8x#vk8O^2(dUJk$e3Fa7k?S8x6G*k`Z(_S|>x{rBKoKdk`a zmv8?0=%=s#`s}yw{`>I94?ZjO*Khy*_~)7P|0-FpQxL zXPCehs)~j<%%Ki<$ip70P+Uy%p%8~i#3CAzh&DXd5tqosCOYwn6-*+!ph(3kTJefl zgdh;dmBlXqdhv^3q@fhy6~;1}@r-En;1-3F#x}a~jc|Oz8skXEI@*zrV+`0G_sGXS zVlj^x^P?aKNk}0A5^aS{q#~VAfJQp?Jdh?s$45v89NzQVb^PK2Rr#jck&UU)< zo$!pOJm*QzdfM}z_{^t1_sP$G`tzRv4X8i|O3;ED^q>e$s6rRY(1tqnp%9IzL?=qo zidyvlq8QDnMmNgQj(YT?APuQVM@rI?n)IY7O{q#(%F>p)^rbM3sZ3`|)0*1!rZ~;1 zPIt=Fp8E8sKn+)v8+cs#wjcR=3L4u6p&W zU=6ES$4b_+n)R$`O{-eh%GS2J^{sG?Yf)iI*SgyEt_1)k5JidCzWVjAfDNo*2OHQ$ zcJPpGGpu44%UBB{R&I@rtYjxUz{lQ=vY5@RX7ylMzHRoipxta|0~gxTnwGJn4c%#1 z%UVCC)^x3nt!(i)$JyHUwq|_o>Tt{3-da(&yz{Mahr2}J@`kv`P3{hjn;hjj_qj3u zWbSjIOWo>@P`cHzu6DPZLF|f$yWkBk1HJnm@tRkFcX?j(Mxx&JZlt~L%?Nzs3z7NK z*F2o9t?2H{82j>G01LtO4M^1h6sFpGJ4 zWTq2@&zxi(cZtVruCSZYWac)+GIry#cObuL#1#fsU7%p)OP`u(4xH!fopz)1&9OECac*rF_ z@`jgO;U_nE$^*Xgez#oTFTZ!p={@sz*L>YKM|aN2y>oE)eA_?AcF?P(J#=Xoz1c@k zcG8W#bYVB$*H6!N)NMWWSyvs_S8sLJRlW67cU{z9?{wHPJ@!hMUD9WNblMfY_CvRw z&~FcP-2FWFJ=fjNcaL-4*}V5N_g&0??{eU=JoqXX9?FMra^jJ^_#rnQ$dB)Fv diff --git a/Docs/Raw-Flags/oman.gif b/Docs/Raw-Flags/oman.gif deleted file mode 100644 index df611c57ad2cc2f32423f54d78c672c26eed4c14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6957 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 diff --git a/Docs/Raw-Flags/pakistan.gif b/Docs/Raw-Flags/pakistan.gif deleted file mode 100644 index 455846aad7020c1a8b7d472c641b6758eed8d3c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3805 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 O#;RIGLuCQL;Qs(gmJ+Q1 diff --git a/Docs/Raw-Flags/panama.gif b/Docs/Raw-Flags/panama.gif deleted file mode 100644 index 47dd1b70c85dedef72f6db5420fb093ce5f18681..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4459 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%0Dh#2T~Yh$~HD|wd9k8-QNqZ*DIieLIU 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 bsm>jTD_L{?Rx|pJ=M>tpzGVl408;-4fqB+( diff --git a/Docs/Raw-Flags/paraguay.gif b/Docs/Raw-Flags/paraguay.gif deleted file mode 100644 index 8a9ba1b2688bcd4d8d56cfb6e6e0d3c2b3893895..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8733 zcmX9?c~lbG*S*Z6NU6yyEi7}$>Oq4+!wb<;(F#q?OpS6ZtSEBIAyh0YG&0N~Gcr+A zc~NR-gVc#d);;RKKrb7)^T*+PTO$68!Cp(0HD+9 zW@culrlvF+&D*zcdwYAky1JU1o9pW8Dl04Ha=A<t`y?kp5Gi$rohzgHxB8xtdAv6=yBCJ}o{#5y9nmx!)p zF=cdW9i1wtT31r7<<@4E)@E`uQso?g8zA>_m$|bl-B~ggQ_f;mGU>T=>RU5nGYMTs zLcb-UyNIAmB5ureBk3wq5(fK*%@a2at5VXl?*i6hq>3 zsoVgwIXSJZ&D`DTEEd(wjL79uNhBbY@R{z^Ir&5qp+qL6x|4*te5MbT?qg;~C&oy) zRF)Z?OOjRQ2Jn5D?sWGUI*U(ba;@D(RA!8swL8&_g%-;AEH0fIgO=CHa^(_{s03sdCWm+T?@Ti}1S0MI(H4Q=A2kk%)m4OaNJDsD8KB`#y-I^D@{xT<8FzdW?N#INI?{MCKlK>Ib9`~SYFiTXVD zrsMwYcmD}sxW%qjiuVmE1~&ekRd)tj#LHarT&wR6b!4sOzU{0o*F2HhUs$~3LB(iy z@$ORp#}6vUUnl}P@^;kRn|xKpAAkF}=Kj<>WfE@5&f2Q!f!515`@3qZKWkJsU9Rt} zd+>FO{Qlh&qY5-Riy2&@1$PGAX$D{TY*pk@siGXRJP?m|qF~aL%f* z_`~^?_eMTkpfp4h?6A7Ty}p3A;Bse3jR1t;s#vdq{IFYWS8W zFZSE0=DGm6VnixjaCqcKibcstzQ}fL+q;7E4XB|FgIdsv`Bhp#aMB{ zmBVAViVI7|O3Lnyjg=~zb*w|6qWAE)ylS{){NLJdW8=4#NSg^o;{xu)omPv|iMyS) z;}hko?KYDYJzm_&%D&*z$$PIO#wYKq&)9sd8oa{&SUpl$`tiZUz44DV+Gd-n+AqD_ zsk+(W(y52PzKu`)2T&`uO1N>DwjOO+rhSCpFrjTAI)jTuoQ=3&$*{AlE_a{DeP_}MXb|OfeatNYxGoy3!%tUz|tVbk(;tY>`dFp5* z09~7O6JNU7$7~o7d&^WM#8y+re~dI?S3YGKlNmjMnMWe-?6w59P`bgQFE4QBy#Td#Sy^S-0oohvp3}rU1>1 zT4J<;=3wQaNTG#77ZrjTAWhh1vy{X@W}|E z|5if?>69jNIs+R8$tb1Tj?OxMIV?2MxfBjo9S75{0a7fB-Kznn`=SY9|lfM8$DM>_C<_Isc z%&z*XZmucP!Y#Gr(?4)!m_I)CmaZA;t5$t5yo*7_pAchrDIxly3_*EexIF9kL1P1D zO|vNjp)|>-RGxuQy~u zfx4$B2OyA&Fv8l7*YMRRuGPQ=a3A7-7Gk^eb+W)k$2rg+lVsE?F$87K0FdoznFujJ zF;$8GZM4hy?HX*5<&%7Q#dG)yr;p5Y+dGDTY~aJJ1~nFpH+l;VvcDDt>{)NsZ``Ve zW^B1FjN1e7Dm6lhKR7?-mABPWQu0cgfYuV)s>|sMgQ}-A5<9=R6Jk7K$M72Y!en!; z65)VW3nTH>p(aZ7YUPMwMf4kM@ePax&CD=I0W&hM@OrXEeXhu)vNpp25JM9%V?OO! zCk(FdY`u=#tObjA^(`^51?Dx2k}VhsIy~HSOk5iMy1n@X1TDRrcjI0wJT?tjrM%;9 zd)c<4_42LVeRh~Y@{xq!9_2y3xN9wDx3m!LCxCq3xD)ivHvDZqPvqYCXkK>I5M(J8>m)fy zs&d*Uga`yJUr(T?7u`jU?yI+A^}=lR6wrd#V<&EQwpXm#k37M9EFP|u$sQ)8oqhw5 zJxt@ORs`kfQw-YS#qmVYY{Qv%VYf1WUUy&6vQyK?4kvx9`y7Lwb5}i@R*4(op!WexSa?w;J)cm z?7NIwgSNyQWPWXr3Ac#kOb+ImLY5O?IjiGEDT zhTD)F>UpPHsL`X5pE|35j-MOM`Cin{KC?Uzav`C{lq9wSl#TB7h^A}`9&OTiwdBn=y(oZDaNKIfsJCgC-C|#bUbOkmm!VCk!ify^YF_X?$|=E zd!4E3^*f&Mq8NXsD%Q1oA_LTmd#5*zz3 zz;~)JRb*@f1%ID-po3zUS+Rp+;l*TxLwb)Z`qKV9J2SdK4;#fX*Sa|~Shf}kY32Bb zs>osiR-wIkosGJ<47?N*9((I!tHro%{cjY)ASWKM!A*cmXX8uuU~jW|N%s#8+r$0} z4)t5$U_nW$%uo85mHy+dQ^mSV%Qu8<-+uh>rnBkx_cw5)R!%smdiSda`4;Z<`m!Rz410}FQLQ{t4H*Er{m~Hea{(|BA!#Op2}te1+Ge)_q{hhp8{&g z=(GVydWGwO7w|ov?A46$uC`q0snvI@T%NMwn>cXPagn3A`XKN(w5Do+IA~h|XlhGseZkIS)2q21zG+55fp?q+( z%H; znlD!4AE_}AHFs+hv|!e)#T;=V`^GON(mEf&cx} zY{A)sFQ7qJveVS)qc0*AY;>BMHZCsL%ho?(bN{0N!6PHRmB{vu_xUc80WC`a@KEEF z+iJ8zg>{Mq-823{BheNd*mIVRZ)v6E>Pqh#7X%qTZNJqn%hiGnJ7laUV&DGfEVhM= z!zL5382wKiR0t8pC)S*jqK<2k(HHKA0puPEs@$gLxB&HqsE<9QKc=G9fFtI!SkGB( zsW`&#J}k3!Att?LQ6 zL;A18hyco*HSUH95JwnDun8HY&2DT%aEZtRV&q+V?YN2-ugx>hs#P#fryA(3SHgM* z;Smy78X5k>2=w#AU%#rap3g~zgM~_1o(Ce*lkMpNuMI_SDT)Es*e-<&QvDD=N(d$@ zgUHAL@%;d41DB2D-9rYbkOzs%NO1or!m-jW(@Zmx4;!1|1Pd= zs)Ifny$9JW@UW0@A7#K6s%bbW8vY`ZVT{jG(P%D`Zw!>L5(#-d7kR^8F#`G;3H5CW zA`&`s^alZt`ZG_VQi^ru(K4s4PuF?wBtyMjZG1YLu83^>`)Q`qsFsr#Zy~b1U(+(# zxcdTJ;rBe5>MW2FF07C}CnK#cAP#VlF=|A#D1#?J93$68)AgNSpi5Blyq7eV0@m>* zo2Sk8BDSUf1>T=(%Peae9)MYB;jON@2DvaJHEli-z3|Wtt+C(n*O@~Kgg3dPd;;M| zLpYllo7&9w#)V&WWxhrRjlfniQX0p^WtVt z*(`iH5t7coY+f8wrNu!{f>`VPZ#={SZ86;!`STU>jWo}Bf+nEgQ`DGN0VZCFJ)@=l zcCF9Tz1o!?-fSA9LhEsn52B+_F~cSBd2%*fg>m}HS1{1?ynvST>?k8Qy0+nn0$GhG zY#i6S*nrDd;hVH5B?a4q2ETv7y9VJuUhFVss}`4b?_2p8sA137J1^|9V^exk8$ct# z)lcvf1ScV4!q{HI*N!gTd4#VR(eHqo-dy`b%lOFvaSUvu7~Qb4m#&8EJF$;S?!d2g zhaG9l#sgE8pX{XP4+rGZ#=EIE@n_j{?LcHT1)sn^lFHYYuaxz0TE6e=3se3VMn>{B zNe0N5ZV_>@N^B(sw6pt-#eu7nGtydMw8_r$Fa1|0nrbQ_=QACf1AAZTB(NK=X(dwJ zZDMEPFMQffLj4=@2_>qG_t0wEe1{R-(T z?TbF7|58nB4<5_GA z#reD@ASIUTicg7D;AqX;?+m?P9f%s=yzdIVO}H6*(~xM+!tF7c!0^?)Aq~Gay{a@4dba4ous2+Z@-Bwbj7Ew1p+_GF;$n= zRWdC_PQ<>mAN`PKkd>H;Tb30g*0Qpzvv({0U9&LUPF&Jo15Q0`^1YhvZ@dE%xAj^D zv|uL?6Y*2oxCJDWxJ_^J~Mc+3bDp-KpmQ4t~=X6b4TMckUTA5OXySN*y z61zEHDcZz=r5l6GKgV8`)&a8K)ms@=!3g4SIW`%jsQA3hn0yt8-$CI0Bt$5lj{QZ5 z2KR?lp&m}?MSCY}`mt^+dzrF~6Lqll#EpA8(uV!3F{Us|<$<*5D;=FM(TQY? zoQS80Wy!N_vY7GE~P)?)BU?H6*);FG;4j56VFoRS5b)_I3~N$fbvW9PIDb?2_6g6P9nht4xG0gHYNoHDXO@fhDfT)8S_c zSOe?erA8~g6v;}l+d;8X*$A6a^_QQ0GPy5ipfBk21~=6m@7w-Ok1{A;GWYfhXsZ%7 zaA3YgepIX(MBrAiZTYT3-~LZQo!RS;4Zo(#1PF{|zW1Gg^G4P?)}@mZ8sMp+Ne1!{ zKi7NdRy%aYE?;OOxcV@BrteZs(T+Ds=U|k1v*CE-GH-?JZ7s~2}wHM9{H zJzI=&QZNJ|Uq+wb4te+Xcg(DH$8~+; zUkvjFQ1|1jAMEC|Au_#Zy|sz+zrA__Cp5!$RLrv0O*G zy&?ewoI@D-CDM@@zSzBKcF2rFLq?8xZIcZ?L4+WAbUiD{pA2rSN1&Vem$t30`SQty z(olsze6#_P;gmZs#YxUc_;{Nh{#2&akevq~oJ*l}vP>dU zbY}UN3@N)@ot9;sbZ6B$a1tPr2V|6kLHG>;LZ2cOyGs`ljqu@Z@F(Z+s(G2CY|Qp7 zj^M!1{GhO&F@f>My2FXntc|za4_;XR%{wr8DJKEexq0ah{r%nHOHZ57%y*g|`^mER zf>gO|9N{Dk8TeaFC$&N<#(RWBlAhWfnw}Bqe`-AAh1(DGK*jFGS5o8~wz?<4Gc{2T z2$J9IY-T+K4QYNfa_~mM>diN)AJ`6#t%uFmOn#jW5ZiB`E)HJyNz=d6+3G!XsUD9* zWNx=BkR+$k3$Fy_?C8?p>3}J8tj(`Mr1Q^pGMd9fcr$`lhln4Cif`uO_sdo?bPJ!F zo@qVrgfP4zBqj;&7-a=;_HHvkteh8>b$~n?1o3AiIK1As&{@!m`*(Wqq9_IP)DT3(Zp0_?U!kn?@k{k8mxTNL$82Yh^{&#u{+fa5e?v_nV{6y7DQ3!ZVZ&n%JPGoZ6stT<|p zq_pW=qnL&zj-YZ;>NY|OY_X6LKmP!rG7`|f_@sGz4`!@cNX2_s95iZVvrEGiG>2>{ z5_%)=-N~_%>BXtMj`^FY4Q0uakkMixndFnAT-1{w~&@N$-mT_U-35bII zsN%q++vTf+fxxS89dJm3nPLktC&@|773rSOq(JW^rR{gE00T=9LG${YeTV0te_rlq zwT0XQ%SlI)7-=gi-39nQbw)yCD|!ua(bye!W_Q7`F72R;Oy|%5D+nAWM5z)OK=C4qP!_F~0 zZ@=^^8zm!~9GoF0vZpl`UUz&qwnK^It+--_E?uyElyHKR^!A2O80i}pvSr`W>NCS- zhR&s!KQFyHN|YD0ze?VHo7vmf9I*vjB?;KQh6u5GkEX~bL=l`s6O;GQNLE|$Jf2Ix z#h&V`)UwcHF7vRB3^ZlSs$PK&ob1Zjywt7@wBLL&bY@R&_KiuX>j{^0h5)wK8xkI= zeKGUL3uT>Ek68FU`{m-u+Mh#HfoQc=@Qs;B1GN(4PKKLm8R^qOio|fT&`>Ca8K|TV z|1_+7@oi7Tq6IAej!!&eTn)p$4ija-5Jb4<(!IoyEa$v zaR^-XS7T!E$(y?mhOBrJ-4*U%adTDNA=eO}?yJKmi?;ke#6IiObJHUH){eNt9z{OS zOM}Bp{eB~;-|YHG9M@Ol^I~$;@pjyAE(f)*ufZbXPHJ3Opyj^)j^K#$Yrn%n z9rwNLE{v#@#~ld^+4t(zaK!zD$NIdp`(6)NL{>kJJ9@Hc-<$E^$eK65k4ClZd;7UC zvTic&SgdB>yPw06|NZ`bOn~xL!z`n8^?LCBS zfA~_A--x~Csi&#&Ckrh7MqNTqbzl2)ve?mYYi&c)&iYLR zSjO}}j*qA)@|)y_#Jqa*C!(sw?<2n`=FMb$WUa<;Dn=9Y?)RTaCCXo$WEuNj?{rk7 zrT_GWkk|oJT~w>1|EJ4Eu|um)M|Xz!f4-`T)ojs4tIqm=xoH_Uy5sbzo+AIRr6F|@t>*D#7)KNbTMkw{@Di0`03Qsv4fWTzjuVhf4-)R9dX?M zqq`{ntNe7_M9BW1uQc&9b-Fn1+5Nu;EKh%bd^-M1(f;4#A*X-7(Z$cU?Emw*==AT& z)2DxF_UnFXPV0W_P6IpxV#0u~WWY8v;I0gWF9R9IK*ci9A_gXxfh}X;Y8m)WhTdxi zVS=Imi$TQO%`>r^ztYZNvz?){}^`5QDKVjWseDS(0@uW2YgF zEgB`HXp}7}gwpbB{{7GSynF6D=bd+#_wG6G-H*A2nXZnP3z!J{0RSu(>&K5DJ3BiY z8ym~Z%X4#c)6>&*I=!Z*=AXve*$d)UqOKSqiaXZ`34(C_q7X2B^z5r0IgJjhNsV6m*%|MEACDvNx)c zg6_}<=rO^p<+&eo(*!B#03p07+?(WWA7iOkpa>l(Ak@SJhpVGV>d?6+QkK15LAbXb z3Yw)3t5imjl!Fs3|S0islfZ%QEZKRlG1P!-TBw0cWV!YK+ zK*7JwU7;jbXt2Gyr8*+Z9tbxAYP<8F(%yG-bhMM5nA94pb$V!I8YD_WO)NI zu7IT;K(7I^!hvaeK~n)xlLe3nfVV3U9t_Y2fQ^kg5-DqW`Cr1C=H{r=)Bj}Cz(B#k zKo*rsn42r0(+N#Y;dFY;+#I2%#+yzLr&7I1BzrpDwW-OHO0}fZ|G|h#Rj1R{rKF&W zicl&QMW>@`Y7kT^VqgHlVgWyX06ROt@-i?t2TV@`bUH9F08ptwQxi~A1CU5SRu&Kw z13;m`^c-q=0~nwK1tdjM%|GbH5ENqw>V$%Sa79T0;RMT=0;BLOR{|*t&@diMWvYNT%DYNThchf+jI=}Do~Q3yo@LLC8>f&#$+;0*xk03ZbbsDC;X z+YSbJH<3q$VmghD36W zA-IOe1Q+~&9-KvrAvI-@YGSB!-dQ!_HFR$RDVQ|iT|oWkC1GGA>mTSp!fU2us2c6k3iKQDtx(;FK*)6;Xy%R3w4G0TX5-T*592Jrt{0H7>D0V$CTX1D3woB z5i*vfVu~a_6QvpSZmhLx^d8zcL)@aRdORO<){;EdRx^2D&3l4m(Ox@Ms_W}&J>LH4 zMFlnq#@?gxXr>C6uXK5$~Lb zXVcrRFu@#CtFGpyhMzr25%c1-!JSU2V4C~;r4+`6aDmy|6P zyln0KZS4iwIMcAWr2W$?hcov)rg{(GzpV3~JpXu+`sHnR-*EX~Vb% z)HYgMdMl2@pY(C+(nfjyQu?FY(ccs|z2g3gTqY;U_c~XmNI%-FqNy*|T~9L#3UtXk zKjBt$|MrAq?Sl#W<44un>_K&P*{)mlxU!6`+l_QqeQ`s}wc7f|ZYP)E!mjnL2CI&* zmdh<8Ulq1<2ZS0Ljfaj~xwK81x#hO&87Y6ELbR;DT%Nm{+0^-V?sZew%S5r}yQ{Tt zw|W$F8m_gjx49Md?feyO>1VxeXlXw3!0imSEx$eK$O1pFr?E)}><+6)ktnw8n%j?` z^05iFj@-9*Z@nPw4S!4*+n;S6%}5l#nIikh;LG?ycB4jxe7k$zEXXwjX##fzi02i$2(xUpA&>tS5{OM zn!E2s>HmuA&8pZwS_L^B|F%{vEYfp>6q!@8E|#i#I=0$59f`R162{vV%z@3?+ge!DwzQrKW{OyTUiZ{M_cV#65i%KshoIL3cHT&N2C zQ@h0ZXW-V#X#L&pclTc`{(M{8@;6}H;q%|$mCtsz{~Wy48?5_zp+7$4=<^ld?Z`#| zM!CSUdJQ^ZiuDo+OGpo7HXnzcGm_gqCD2H|BJ0us4+_Hy6JB$&%bjyZeH7_t;6TKL zEDr?USw^-p%gKwI4dN;MA}mGoT4gS1lOZzZVhXTsBDq1Em=raK8J_U5VM#+{6ekS_ z_~aT(7*?T9U!*HtT|Fl&s%+XD_Cd3L0q&2I0ff)dG#}W})pP7p$1qr8e}E=jkSxTe zix(`Lp=-GA32{UvtButepIx^_fr?F4u(PJ8+ma*ev2@KmDGS5484<^kRg~OMGljO9 zd($*&Sj8$%XKz|K=1-+y_>qPGpN~MV%SSo=$ClPt^927Y`Ih>bw*ki@*z&Z2O4tjE{#K9o@O^z`<+>;gI|UMAcb4rVvpWf;-#Oa zvA^6f>@qqHlC2V%zqls4gn>JEd=Rwjhk^`yVV444W{}_2@%qoyr2D1csz>{nO$NYS zDBy>Z>R9C!*z=NfLSMt~VCKH1-4y6ltolO4bsIh1R)+jqxh==O=sZ zgfQwf_2;KwNUF9ewAixaR@0gptZ!+zd?heyIvK#JJOV(&2D(K=!QX!)pvD$V-L2DSEg;8AH=DcsvH&okU`UxhA`{PxU2j>i|Zq>x(&x&XjCtI8H zo7jRyQ7b}=Sil@k9Jfe;fP=h)UMbKqhfF0y5HQQ~$~0;R+~Lgr~;TEE;*fd)jLF zW>tpD_j)9#zf+|f(X45YOwDX0gOqU~NZu}=C-y*)g(kqnX^EICCLkwFs3vjGh#c}g z-xor+_fK&2{DWeRMdoJ!#00DC&4+>kZyJv|NF`?K0$>0NaHFvV|AVXSjW|;&RVJPt z@C2cNJ#Zt@0zD^!X{Pun-$R;e$A1$k&Q>GocgO{%h{{Zz*uUi2x~MeFltweo!Nmc* zpeLE*ByNZ;$TLv@z=BRPh8jQs*q&5?LVdRYR5R8!q>TkBj9Z#{2_I&&dQIF!Wlx@x zhWom7tAJ=XdAUG|S0ts5Rg;InqIggi1z-bVh7f;q)5Y8g(9?f7qaNq2`d!Iu3b<{i zYH~O9sfAoEb_#ciE%-j$(Mu7R-3YcEO7e+f0F0)mv8nAQ`TGp9KZ!f1WS?uS<4^;% zu?`~DPAb9^g=25nSF($rjI}<#nB4I|#e~n&7A#l?Ktvc&h&UQ7$cW@HNB0O`st>uk zJuHYZt9jC-_{AUV;&t-Lj4hb5qG5D#eOfo-G8CKT`1hlvTN;>Gjfv;*Gy(DA61Y-m z1Z&cN*`uDnE@;C?E*%xMItcqIN4OUr`VGk0Oms+I=^obb7*PGqNLG7!jUYn7ezf&V zVDtF%`PcDtoXNY-lL+()-GvxZ<#IpWq(JS|jTzJ2l$rEp*~S!KYcSkQ+glS9X`j&%6{ ze0(Ik2#Pd2ktOvd<)O%I@}syz2Wi03p|fxTcV|*!|G%yuXGcCN#5o{=QAS+nLF|Kd zcrPOU8>gPZ5R8IH{?}<;A#gFr&g+9PUbGdU3j(4Tfks9IXg>N=svlhEE)NDRsliPR zLxL$c)#@S@b2;nhj^#LcN#f#8evdcEuz$@#USz$xxPsa+QNm0V2T@# zO$E^gt(;lA(CdHz_ih3R!KroR3nM1UBY}7dG-EeOwDPXf{hM-87F<|0TwUUs+<3E7 z9!(b`?wRx7VL&q}&>S-7`slF`GBg|Dio`~rUExTjr1~r*1NampR$YpKi&<1k;`L%l zA!$HQz?7XMPM%Mp*_2cbEM z*o^4z)C^(>hi%MDj^v0a3k|3`ZBtLN6?R${zB!UURSTzkCdjsOt}H;wp0In^j2t5L z8YNpy3h<_J%|&H5LAheWGG!|{A`x870BF^2_J^@FfN^mHnm#T7zqXK5_4L^023+^M z&EFIodtLrt-Kkj!*iT!&kG5P?-LynCjvzGfp5^2PW^%-ZL5YZ*jHCRRBWNR(NVLrl zvh@Tr3*sINaR zNw*e}8AW?xrTeygJ7KUCA`$kpROKf$#TNEijgRS>oqz!TP&g6+u1qe{lO8VOE|+Z= zGML8Y^ob~X191K6ApZ$|V+}aQqJhM*ASv>LhH+T~DR>K4y7(MCP>}x)_I@@qZ$GT` zNQAGagl_{4O9QwDf0kxbxN?|WRSe!xJ-&T3?--ZeFHgRkOwK$eGzTb{`SdST&fA`R z>s=iDZ%U5a0gKKT*w^75?0^imeDw`zv!r~(OG-}BPi_+qm(N%kEBaAVarCLE=P~aN zk*A8mRgQ<|qq)pnxzdrd%z;sU3gIUW0!ZwmiKyk>BU}Xf@j*lKO<@4F$4>gSrX^QOML3GP&a_2 zSugWiK#a+^rWmULDvDA<@O(>*2*5l0x~FvKW!hGBUaF%-mtOx_WT(VO7v))!2aj*2ysb>QYjKp}(w_rE(b#wjUvRha^&(42}1%}+-p8Xboe177V#WQS8c8XD6TwXBW8qNz;NJs(YSYNN zSRaWQ*oB|aKv8}eV?Y7`f$^l101xFIl?`Wp*Y`zF1tSlGDu*BV6}@1QwYhzvwD$1wgqXs4XWaNh5B@1 zFFv9H-w)dY#segToVhO>wHpzQjYWnda_%yZanK%x6u|dC2TqaUc=54WV}7{U#Z>py zpzfO&RQO4cxz=`{(UtiQ@w{|j-jd0-xy?3_85j^rGqjEf?U+nh=bT=EUfVrJM-yTV zfM}H|OPR?Do@0xts7RIDa%HHJixuLu`Cc?fLsI*fzOEFAI5bwr^}U`m+!G z^<1-Y;HWgxtnA4B*aCd{IkN3^!wTquZ#B2Z#-oAXaBvecjGUUK20H{^9HsN>`T{%5 z#^6{a@@`g6vZG6cnbJXJ9-80bVwt#Cv{67f8;hL6#iPYk8Iw83m=1%7HomwpHY!ue zv2w&EHZ`+v%iE<3Y@mC7_okMT%s$P=rMZYMsdj#o~`wA zxp*HZy=vb^9;PCFMAGFOU$}gJnQFmT@R^#b)T8gp%NL9ML}@!xq=~dX<#F`vcXM@V zLf)_~cq_&~aLS72If#kOV@D4*bv#pkI2Zf{87)lM;hNp)8k0Z*LV?hqCmQ!yG~Nv&?+Q@Qh6NfauyrEuhArq zBfcPG1N`Jna{rn3Twvr5ZF*jXpI0Jm)YgC86FW6XIGW?q$ zexWMxoYTky5@ygAm@#cy1eIzrF??tZ@=|S!_nC~7>zI<@&nFKL7 zr^leIsch+mbSllEf5Gx8whyklbo>VQ7~Tv-oRr<7pI+@czE_EAuGk^d43WHFv5h~( z1G>9%zsx^9O_&pw%Dl`v|52vW>_y}|hs>;i^7ZCcG2dsNImhP}tn=QSi51f0`ng-Q zK?c~c8&a*XQG>POjH@7Y#H-0msg9<6s;0MXr=HpHcQMNu{U3MCx7=htb+(F~?~WfO zzrW^g<{yV_AucKRr=~KBw!-*8ctDVce+A1IXZW&V`Kd`jR^az{sj8f}6ru9x7`}#7 zF5ypuf8`^yEKCnxt!LR8b%#1C&!W%G#$cdxhR-?G<}t{%1DiF`R@gIaV(+pmomiAP zkeU?6KXrLG^$UExbna90S9Gqi|1H0+#l8xGgr2lFl0zJ(cV{bEpe{ZO(JWWn?=sUg!eUsutI)#;vX8wqTL6A-sOKBgHiYh2=XdrS35e zz(Z~?$uEV5d+171_qC=r<+CrvknQbE7=#EhMMEAc^Rttw zM9L?T*4DwPKHoE%p*!EvLoQdExO0wA1df>-zChw>(;LL9eG0Fj75(Qf??xCPj@qr) z=3Ygwbtx`Lks#*~kYHPWFdDkuSSHsxbk76#f;i1s`gz|@e09RS>dI;l??+j6t{5oS zChgZ}7O~w&Nv>tVomPrkOWht#mGp0cg2&%aF(e`KXn{w^IGyT0UGFueKo zPZ0?59{`ut4FeJqKt#RZ^(?RU6h0ZF>P^JMb{BT7YY?>OtB0oP@1`<^uP^I4HNa|> z12xJ|M;t87RQ*tWhXqqzzY1(Xeb69rJs6I^dQ7y^;>#&;y27VdiA_Yu*Z`!6QJuJ) zHFNRxXJ?Anvm80Mx$R3Gfv=l=-_Ct;>%OrzUE?<2M5}Cvet3A)xOF9+=Rc2&C52=$ zVy3}sWyK3i13&`@Tp%pR$Lfy$#+tECm|*|&2RnD&A+uql56v$e%QB8;Y*pKz1b4Fc zFDyS@BOBxc(%?p?~UFf5q+)GiisOuV5xyC9HV zA^p!yzbEUe4|k=%pBIBvo6)5#jz@p}6i`Hl>v9?h*d(Un0bbmw!PHCT6UKG#xQ$LO z9N9r+%@$~UfRMOn0y$YF2rBX^4uZzAm)`njfvGC6*X7W9`3#jvsI0F%(HDXfSum)- zSH@WMx*>QtAKGBVMQ|KM_4z= z>_&LcgjdC+oA#E<)PtAu4Jw%X{=BF$p>%PW7G+4amqT0UmwWXwy-6w0!pP^J>PVCJ zAzb=wfXkY=p49_$vsZ9sW~#wnY0_g;kE9boylz+#7|v1eJDig7^Lhf0E*YOB)t)Ed z5cX6s(*5St%L1|^3F(J+R3(M!ofLb?u6^dBL~?81f*wsgdK!rZTtnG+)IlzaobUBs zSM5CprvMMr#CJ9EgQmwXq3YQ??`pG=3idurI>AKGdBb3bo$dt=PIuNYFP@E`yuhZ` zR$}iT_w}J^JB*1SinlhZ-~P^(TI&K%b6}RODsBL}Fc+ z_7r2G;u@%Kt;8QcQwPqoN!fBMdVBkKX!pv^9vPEJ5nQn?XX($&8>9qZEzoh0B2vTc zp?N^``lStg*f+0NPPbhxXyT7PCj2@TlL1JlrR}-FWY3)MyO7}Th)EM_lT^X5$790I zK%Oq-#N1vCz87;1NU;+DTvSN`J2X+H=akd@n(Ql4yj=>CdDH4-@oM$(M}pwFtlVkO zc30ChB^qV8eB9H`bk`L9^WvX zS-YU2DbK3Ih<;G=IW_@LiTmeLMdO6d+*0urTnR95Do+`xtNbj=a7p2+*)!AbR2S__ zdj^Wd2pIlUROXLPQT_WWV;qf5?J9o%(}~SQTHZc4vyuBNmP>nI}wJ=3RE+`Kgskx`4(mF zVI(6u&rDY4rAcRZB*flRt2TppR?G5_0OgCxyh-Ou{8(lgxo=nfbaudk?wbf`Sf|zR#giHBExF9x)cM|eFMIQ8nVJvkn4m7;B#spkw&3tB=#afm zzgVkz2>W`g#@K&5N!Z%J^L=@OxDUn_1Hn4UM(6TWOKS;R`PSQqOXbwaJJvg7Z(Yod zhP}jG<-JKvlIZ^Bs5jyT_m)$>^j>YQJ*SY@S3=pPXDj1;-PQ#QFZN?o>mr^wh{)F% zMeD#{&NQW$wXmKsRbE7Yxs!w;LwEb_LGg4Lzx-xb>nUpM;dmtK0| zs;z#%DMUs)#&xzE0wr%_7*=Dbd25JaeFO!E3v%<{6|GeE$8 zUL_-Q+7II`H8CddJLZ4+&${!I-_)-Xd0?e*r6izj_p&)-Ot&g92y$DfvTu@;7s9R^5P*`_dDvBh`3Vti><+8b0xF31=Tf`0{#Qn!L2$ zR;Y+hfZ8%AkZE{MY0ov)>zAf3`|UqidgrGajt1vPd5Jcpf3!c$PKDU9gUW7rR<6#C zCCQ%(BdXvfj5$3n{E^ToH)=KCrCrLey;Y;|r8m?LV84iF6Dh!hxfbyJrFe*3H3Fn( z4zT;g6?Llo7v$2n__8@ui&GYxB78Gj#^$S7ir7sz0PU%i`))TBb~nVw;nOLrM%k`ZrrXbI+PXvnPc2!&*NNn0_PkT-dK`pjv9LM6RXQQwWETHVPfn^>2m?4vI z93-Z(!Y|j5`b>8a9)DL)0sQ83Sk7jGv1NeJGZ}P>&8dgT+&U9cTt3R|V&Zfa74pnO zmt6xp4A*A3G|WpRScU~`7cH0w2VDCERinhdxz(a~cM0Le%)V$Ld2@y*KB{%0Ly(Tm ziHqWGQ8m?96muPsU$wcxHS5-~B-9tKi2OFfxZ6P@qhw=k{rEa0-tseyWVLUk-z$i2 zyW*nND1-kTS)U*?u&*C0$O=8L5_oLysls1Kh!Ws)lnRV`UY$a?6=K3iJ~kcVCuGPs zHg1c3Z)_sG5nf5_&cE!Ke`F+zmP*cVcLN`1Ca^yTxU3G+kKJk+SyQ$FDedCsMJs)F zR+N>(UDYa;4Z*Uy@4qGcli2~R#G|BsSh`_06v*I8>Pym6GyWGUp+)S383i)%5n+WD zB9bAeL0mX;u??!vY&Y?seNd>FKzTZ7s+J@~Iu*|_FhjBB=&G<@=~zcMRwFvV;=`Q# zC!Ek?e?31Z>q?iICvX3m@vlK1VmxgNN z;HtI*&iQy%#E@__#IlZ{qf&ub9acXW9tj}u6+pguLFyfPEb;+OCiYYvHXaLl$$(UP z4n}=Cw+VDSLKvOxe?~LX_;Hit3W{uGU{YV41=g)Fg>Wg=4gLNIaCeW)SPtdnH=0NF zFn*u5L=2gcA&$8O{_R8wTkys35!Z$;9Fbs2fSdr#1<1#oSE0-d)8q!|)gvi)(x~() zI2d2;PfT`+(ilt^_9ybXlXJCkSqgQ%F24bb*k-fM;ZF_yR+xIeSO_CY&nJQK`vZa1 zXnfZG0I+5ZkKmHF8akll;!|U_PGR?-REa>0IEIfIM#ow#8)*PXdJjt2xnoBCV>ldb z)AU8zj^6-lS(|a!LC%x^brWc~urqV6I4g3#In%_fj$W?#G`Vq1W46zR0!nh%Io>^T ziURa2pQ%IvGF~12;T-G*=Ed%l?grVQVwgXc| zH%8C-tx)_fAg}*WU31!mS6*|2Ef5ILC2|LE7sm69^vP1a!=??{s zrcAJpk10`?@Q9JOM=J55Ny)XE9+P<0bz>?aKtm`r=hQ$oi)5FC$P3(K-<7^ShkGEkj&X`OCrQ90Ad|QXzF8(|FSwR(uaeZo{o7gLP}H(0BMdnd`lpl zDN~WNJriGSOssoa9mY=DI_CqtQj>FV{35Bz4%mlwmTRcm4J9WMX}^eeytJ3R2kGoz z9BPS>_P*hBWsT@Hf)zSR$TsnoF-VRH62T9RZJU_doVOUDXH?$9F?7wMaL2NqnAQ=# z#tJDiR3v7hLY|;i1YjI8n2O~Pwt4NCJ--;}2#hJaI68P5sAl6k!fH;zpx}@ZJ7N^1 zo%;#ztkDr0mvvg-qiO=*5xoVe$rlAyJ?dncv8S&>=Em#kX3!^gF$$(9Dy%la0t+@U zCU|P1*<}leF9vw<0_$vazlDZDQK)*MGl^X|S^{06!-0f*5F zY%E^2p2qFI%K1Hq>xTT&)e4#H;8SCJ(Qj*xF}|LB-i$c=t;Eo>yG4UI4232o)F7d1 zV?4HaxzmpV-c~<2Y#UAwu!Cb(3<=g-jMSMeQR7+00|NpOIVXL4b25^zJ*w$-G0jO(-h004vcW|aD4Q%HL64=!I3Qbm-U!e7>{aPidTRIzeBk*0$c(j@Ce$3U#q zEbqOVwd^L?3=CV~3D=aF6O&j`AEvW|7T+#tqaT9nrU&^D_VYnbCF6>}9re0NPqqmN7V5-j3s%5_xSFV;Jp&`mqy$~SC#=KO6w0M(5_uwx z9hJa?0^t&tbmDv$FY|cXR;aI2{U+PFOW{t$7w26e8pXP>g=M6;%e_njadHk>U2Ihh z87&*i-^UjzC#l~4pwid2ovjrQBtD!Fy!lY%t$12BTgrb&oSvC-Ey#l12wxWu|L;8c zwjKqB`)5jON{D*+J0j5XI|_;c`g~#MH5VNGIMR*RA*XB$yFcoRKZB6++Z`JF6&$Il zJeI$!*IAbPoZJk3vt1tmGv$x61E3-x?8o?S2k7$lD~zv|_#A$%%@oSsR9GWwsvHAU*^HWUI3 zqRH3omyv@{@qm~RdF@|U3aH{iGNlc;w0|@^;>g3l1Yoz_D9ZV~LY}{Dl0t5GzSL0? zA%*uxm7irAMYIo@<=`beVL00lbD|$o2}8&OE}KHII>2?l4(!M_U~>e#ZdkQ|Ce73Y z>>Pl7?htg-%=VK|K4@5duc=1TBL+KHa>FHDA;D?`dREm<E(1;c_hhzUXgW1|GmmH~pL?xyeYSu;%1T5aRJzLO-QNcf^4uGo(w2RP|6 zZ3l%tP;E@yEUQoR$_WGDxP%9n0~gD8+8J-N=PC^o+1L&3HXqP4OLRiMoId5&hw&+0$3Vh)9RG4dS_Bus@@q&7jM~HI-_WVx z{;mD7COpmH<8_)QaC9d{P#O=qHz7oGl$l>Vbp$fH46%eJ-V1;zV#gAizzk){vo#RD z?srZ3iPBeeBL6WY!GsG;&WVNV?rQj&hBPg|@ND9a&V@r=$rU?iJ9$XCBf=oB7Jd%e z^)Jh_Z!KR}y_qNd(h#}_V8zU7@ zitnb2sfzgB%3+IzZ66d$(Ar}23yTV+r(rPKH5Ab5PBIyLx1ltPqx~*vk1pKjbleA(#6z0n zADQDJ7Z#GVnW?`-uavc|_BQ1E*^hj-NF z*8*`ruN*pVChNNn7Cbk0H;n!RK(($Ph%a^oB8LfC=m@(+>BO_V{E9e|i(Mk8n5(>& zWie$&9+&cGAy5kq;0u(T+hPx&UuyT8_M|rk?$=C_)XSujo_$lWCG*Q8P6QobURGP) z*9hG@P@Ju^e`Mbjbf`4f=-PGjOAz%6gL0M!U7D;R2l71?@zq`VRj8&<%gD>iOtTBs zNymk?GA`1klGB9rjxs%yGGzyj3$sLj$&Atl+izXs$Cw>ca4RX+oD^{K)Cd5K2l7-y zf1TQzt#@v}Rwf#D8sT@)}O9PwPdFVfd>Cve7qMk(JV%-1hQ{ z=QlBV$93{j+h-3|*8R$+hchn-W$G`@G|#tR-}!sy&(XL0!)7n+@s#_cA$$vm`Wx|~ zp9s&DzJmk-v3P@*x#pz>Qfy}SCT+qpIdJJz0DFS6k^&16o>S4y9etaom7Qvp!og9q z9DAboNIFY>V!`#UQaxeP`sC|G?1>2%9@CrD(HSy^6}@xjBKw~T^Z7i2|b0f6LSml00muDqA`rt zyhYXl1ZwRIV?w&2+tV;;x#zHy43yVDJ>QaM31f_VvgzKQCi3Nmem#qp0y zBkFsV8k%}fzb=b9j)z-oz6oj|%NIR%(C8BH1_HQa>t3QBV1A?)sR)(?y6}kqItCi1 z75JrVayg*u9}o7P=vs>A_HK;gS9{(ZI&e$bz52nXRU4r8`xu)Fg)*GCQ!k5^jOO`Z zW@|0qI}FQA5!}7NhRbY-+K^X)SH8(OT<=0!8K^(Il$^Px+>sF(998+ZI4ewvr-8p1 zxc}VO*4sdOYzzRzSU~Z98;~%dC}MFb?sYVrsX0j4-hC>_edg4Rsc?jPJsTiXZ~dUm zP5G6ERMJ(;6D^F#mN5J$DGK)P_s?L>v!yR<&o!ZIEjdv8_j(`n_waJE1aeawaIp?#0EdFwm_jdp49VTI~(udCZZ|aV6j!n{pEq&xXp{rmaB#^tdtQ z7f)L&pLp?~!_u9G!PB3&zm$CeIs=}+sq>#ZuvT}*0vBPlHvG>O9$gxC>MTe(wsu&b z=>_|)$^-xq#ePzAwet6z=GePo%f3gC=1(83WX3Ok=H+8%x^`qX5Bk~RcOBSLujEiC zGyPqw`$|#pD z%*gH~1{Q>&soYlQxp#w-o)9jL$AOXraDKrmE0S;2DEc3LfoPv_+QP$)C)Q0^h}|ZN z_lA0=Gm0r|_*@8)iW$`tZA#lj(iY3er~|hgy5A zz!x}nDGHD*oCbh#(Ij~g2k4}9P;S~g1Wgp(&)H3bx?n~WUL5jY9eJ2gdkd}P{CFy~ zzP^xypQaS8o@FZ)Qq-~Pa_DE2ff+$_N{6x4hB)b2d7ZFR={~2~N+T!?nxKZ#l9ep) z*y!GDCv$`r>byOLXB!zl`_Zmg?~U_hyn#3OX&M+=w43-N*_7Q%4J<&TByZUr$W37A zCvM|_1YUuFHwGAM@2zrzM;K5a@JuD;T!W!m!M)8tqe4Mp2?=F*E**muRlk)CHUTW4 z5~`@}tMvNuL~1QB8~|Nx&2U~F7V5^OXbdlowoc17PT@?IU?6tki(he~ti>g;(Jr3f zogF825=A^9p7~brkvUKa&UxbuO>lzbneFBIZq>E4E!Z_|O>W23wqY+1Y8X7#dxr>CyjhUm|~)vX4l#eOs|Ld^)3H*t$m=3-6cpy*yF1TzW>7){N!L6SD`W!zPzUdY(HG`7Tf3^d;G4|f5wS=jD;GL&fgh2_*CGb|y9;);ClqTnisb^<27_Mu%H-V0o!<7HA@odr5DUM;6Ebho^mFpsVEY!+ zedA2zcY4&{_J)J!8|Nm47%8d`$XrbUlD~d3a&jCV3ZDqPZ`k`1nR!sHxm0WB*86II zsH4{SKkS8k(aML05s7-2w;cO8X6xdp1(!|)i}Z-jb$X=N`!{`lIs0p_Yx=M`X`s;K zx9A*ANW1Nc{kAXP!NPc)c3{bgP&4Dc#YU;`9a>*Pg2TlW7pA{gcd?ef+_=De%k=2z z9-j&guP9}Fa*CwBS-NKUL~Qv*(U1Pm?$={v#NPk>{%!E5L`Xa_U$#vwkHEaH}3bPd^Y^r z_i<@Dx=Z{0@AF+xBK3C@S;tpE@lk=V&g?B}{rTX$dK6_I_a?jI&kd<7cUVR4$M?6F z`djpOel7+bKd6wn`^4sY@Jy9QM~%*z&u&lV=aUS-x4lsQqI3QC+Y4Gh3g4gE@!k48 z#&-5dP2%r|%5etY)ZVb__z-|nIRo4LmN{p9C=kCxA}J{7alMF9@<=hcb@K{9Cl z4UqBxtcqSnqvy|{A&c1%R|$3}^g}IjXQ1cH8=kekWKP%=yHOc52mP#o`LYZRv&@1C zNpN?fl@mO>$H{Xu6qaP$;4~IMoQ3V5h?8@w74YH>n5yGESMuMl;V|@ zN_Q_wt16W$&Y@0zmv-E|+R0v}X34I8zEu6V%tcw5kLp#s|4FMEd0Xqrw4adClD>aR Z!(F>=LE8_decRjKrE0C!9SZ>Z{{uWjoHPIc diff --git a/Docs/Raw-Flags/philippines.gif b/Docs/Raw-Flags/philippines.gif deleted file mode 100644 index 9c2a2667c3c6d47164c10aa7b884fe06a35f69de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7606 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 SEW>3}M8dGof(Q#B`Tqdu)JYrw diff --git a/Docs/Raw-Flags/poland.gif b/Docs/Raw-Flags/poland.gif deleted file mode 100644 index f6a26701ee9a4e651f505fd4af74b05d0379aa8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1205 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 F|38~r@J#>! diff --git a/Docs/Raw-Flags/sweden.gif b/Docs/Raw-Flags/sweden.gif deleted file mode 100644 index e26546b7649d01679f89c027c71d8a5d1ac33863..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1812 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 F{s)J`_r3rC diff --git a/Docs/Raw-Flags/switzerland.gif b/Docs/Raw-Flags/switzerland.gif deleted file mode 100644 index 4256c5a28d06292f498d140a2b98d8340448ee29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1632 zcmV-m2A}yyNk%v~VORo?0ipl^|NsB@_xIjwYt}hJ&Il030000000000EC2ui09XQ$ z0RRL4Si0Q)Fv>}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ z$!t2G(5Q4uty-_xtai)odcWYXcuX#v&*-#z&2GEj@VIs;jK6uCK7Mva__cwzs&s zy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=%($mz{*4NnC+S}aS-rwNi;^XAy=I7|?>g(+7 z?(gvN^7Hid_V@Vt`uqI-{{H|23LHqVpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m&2 zqsNaRLy8oJq5$&6_xL>fFh*r%xXP0tg*Sw5ZXeNRujE z%2eo2Y(bk!ol3PT(Wlp z)xFDCY2Iji`wA}l7h2%KhzmbEj99Q@XN(*3ecUXvWV@7^S-uQ6^RmsH)p}M2IyBkQ z$x53RiyE2g)pA=Kdkx#F?Af&k-!4WwH{RXDdi!n)Joxa*#e)ey?l(EG<;;;fe;z&V z^k2}c6TaRnyY`{nyMGrQewX+0<;{;zn_k!X@9lHF*B&3&{Oa{@-H)E%)_&&y{nhf{ zaRJgY;BW=ba-eSs%CcZ?4aV|dZ4tsUA#4@Ca^Y$jy0W2Z9k%jeXd$vPB4;J8a^htv zsJ1J zrFB($a%E>(cCzJKU3z)sSYdMVC3$6LawdCesyQZWZDO(}l5tuxCz*BH`KDKSR&pnt zeNOTxpMgp;Xl#W>a_Clx8oDQ2IYb za;j9RnmQ_`t>UoitF&U+;;gmi%HplM_UbE+)$ulxr^|QZy&}%|k&Zv!?%$Fp8+qmb_$`k4sF!aZFXf*9 z+Ii>@YEJr?qo2;9>8eleaqGUO4*Ra4&(1mPwgZTJ?g;MAd+D|Rj(Up(3}F26$S1G- z^2|5y{PWNcAb_;dS8x6G*e4&WtkQ0Oh_=#sUkLa|i9de#<_|)?QR%CXe*1u|-!c4s z$bS|6f7nkg{`J4l{~r1a+5hwqK(-7Jfc`t+9SW#G0w%D5bYLI^7x=&l#zBG>j9>*b z=mrdO@PZrs;2JzA!VZS8glHfk3P*Ut6_!DTE=*wyV<-j~((r{dyx|vYsKXlOu!mgW zArN=?!y#rth(-)z5tC>IBr@@cOMK!KoG8U6MzM-epduFkr+CFJHbIMC%wiYAs01*Q z@rz?T;}OiL#xka{jYME09M|~9IR-(Fc8p^k^9YnZ@{tF4{38$oDabzJt&mS3BqDd9 z$VKL$k&e6pBqLdaNm6nKmb_#PGO5WIaI%vv_#`M-Aj(mupp>RO0V-2jf>p9|1g?B# z2x2MA574rf9k?YfH=xU1W}uh8yZ|tRS%F~^a{|UZW(1O{%m*;DnGGmj_NGbAY7PLJ z*vzIjx5>?Jdh?s$45v89NzQVb^PK2Rr#jck&UU)e$s6rRY(1tqnp%9IzL?=ou(TZC1q8QDnMmNgQj(YT?APuQV eM@rI?n)IY7O{q#(%F>p)^rbM3sZ1@A0029|IcmcI diff --git a/Docs/Raw-Flags/syria.gif b/Docs/Raw-Flags/syria.gif deleted file mode 100644 index 2dd2c0b9e8b388c9541caf56a85a5ba501ecc456..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2748 zcmai$`#;kQ1IOof2nVH?oJd8kNuBB-I^{ghBiF4|5{2k!NU0ozI-4%8XLAd=7tLH^ z%q}(?MTXhtmV54(xlU#_`)>O_=lliF=jZq9_5SVs`do5xvbDM6EuSve4uOCmC=?2p zgiDigaYMYJ4qitG1VW?H2up;IOCJj-3)3dk;)deF*kL|wAJ-1oa~9D3hFL&!DCnjwog_jy6_d85{DP6hg=)6ePzyB7Pq?_D+ekrm$??X z5~{vdd*egDbrY(G>jK(R4!IF)M)B~0s@qKB$8l1`Tz8QhsrDN+hQIQSNvfM_K`5vh zxRY@+ZAse4{d&mtbBuH&w_^9Eh6QHcnXt*8Cj1ho)G^h-gVMM>fW2Dn$D$BchZO>u z#U51R`Z)Q?>LiOw;!U-_P&*85CV!vn%sTGRZf@c)^_C52IM679)e(Hy6q`mB@}}ET z55wrqyL|3IwLgbW1B9D%%o11&T?&Z!t5cko77&E|U^b0V)PYYURZOtcV1l|eclw2v zliAG6{a)~ySGvL2nb-PJ+?m89ugzwYj^)5-lg%*L*%V76cQ*A@huK`(*&+Dc-?od` zIn?=!pB25-z#X0ygghTyR$o^s4WUPT$-Shaz}puWvz;L zn@6k6%F>;<4)32jjZK#CzZSZT*#k|7mljqnnJbmP4y{6p#XLq%$%R$W3GMfYsyx7>r>VH3FY+esJwaJ? z3uFW4Bp(Bj8x|t?#^y-1YyJwF@G_;})8o`4GL=qx)6_jTos_f=DW{qu+*;y>4zsAqa{1|r)F)Y^?Wzy`q7oF68RO}21 z2TBz5lZ?$y_dU8AX_&sh)KRdf-tAU%AR`w01w6dGkgBe18&cFi?S-Xo6br-7b<}==*iK z3-fCB%sYD@W0_B-N%AE6y%yn$TzoXmeFL;ghL6E{b}JXtgR`9?%WtdS^R~CoH~)b5 z4YBc!_0+qW9jPrc{`0xFeOmr9ri^JG72|4OGPM0)!wcE_MhdUa{-OC) zo8ZfP+)4gow;u0VV73^#hn}2S7teK*11L6*1C;RifP9XXlJ`YL*~28nt6MGEdw>4y0(Bf4PO$r18a6J zb(|RLb<*3s1FCa6yv81(0sfqR5L`}QM@!yyt?igHyvqsIkX_-vVBx#l?agk;A@wX+ z#qBZ!H1K&0_r=o%yFG9yK7Y7p(VDu;ia_BDm)w`^#&_8?MyC&jRrv7D}kP z!CLX6iofDegqnLEt3Ko6Au^j#8_inv1H{9v8bn;8$6BBsFwzMnHsrF_g6)CPUKFvh z!ec$u7Z@916Nx0&`hz%Nd|HD& zEZ%bfn1X1MTa}@k33`%g6&U&R0ruu=d&!Izn%r&*{hs10nbqZxJ8anBQE`&FBbrT} zm!Mmj1(JC)SX1{6_Erv6vTzFB)N>EY&mWg8+H#uM(QJM(AX#$Ir1U02x8LhYxy~?3 zKbXtj#@I`jFQX}g6;MHyuXM$mLm48m1+{U~)c{TE2m`v)P#|4{!>D7!>>VOix*mb1 zPAox%lyT`s42L=?WdGAhDG#C9Jgp29eb$q0Cc&C#4{$^s_OkEk=;nD-*lxG4Y%7n` zylBJOWyi_*rJ6MEC78IsK(>vA(N=D7#6wh>0Eecn-Gc#RVcw87=0_3BU!WucYD$F?FyK5#TOKhaOgWEj&vgq1g14xL=2d0s{oX6VJ+fe zj%Ljp-M)mk03Ne2rXUY yK3n8|Z=_BPQa2BIkc`wHK^lmVM|2YmZ4-`pCz!+}nB^r{kP|FN5{^P3_WuLMk^}Vs diff --git a/Docs/Raw-Flags/taiwan.gif b/Docs/Raw-Flags/taiwan.gif deleted file mode 100644 index ab8f843d49ce00d8d9ff0deae5719a6c405059f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3866 zcma*g`#;l*#^&6E(L3;fynBo-yaA@l{=8btXY_bN#+me zcigjCc9gBwiMGXN+)zm8&_;W#UBicuyHDfZ_c|50X=escDK2A7y4`=NP5u zKQ1V|l1nNfm)6^uG&Y)u2ZF_G2W((2sQ!RhpB>wd=7diw8+UW=ao zf&RYNL$3!%-m-?r-!+X+P8Ci}e=OzA&Lz(*e0em_I4HJA|GKswx=I5JZ&5dP_qu)* z9u@%q)?SjfWLu$aU?4~omVKosMKo2~=q;`?8Lqy)y+%uW$2=++D*1dUcLR;- zB6>QWr8p3d77%2;bAafcxfew?j>^(p{G^&F=#&H=ngFDWX!(1vQkOwFcUcfgS?=k_ z*$T(!eTR(1uE#4tCkyVAS_$f8&5-Xy(?{Nom@0o}Tf50)Wb%_h*FHY|CEM+M{(FW^vp+Lw3}O3U6oCh$g6GiSk)UYqcs- z9eC8I)Kf*ZmC0&PiBubhOf~-uaWA4G{6}D*WBSS6s81=LgK9OGu03v_&k-N5^#`!I zBlI#=l))k$^#VpNgHa~AAaca=QZ+?u1PQr5a|x4?e+BUwlCEwJlsg+_FQnP`6{|n0 z^Qfs7U}HA%^%!ga6_!H%U{L`W;6TAo3f>1$URZQ6Xzzr8Dn3H&buzWd`l6A4hO1Ly zt(>Tgn+H7?cj^nHFwGBmpl-~?g9P){#RLRZxj>t$0kG;`O=GNa>PF82g{qdbc+d|o zOFT$~V)Ps|ly+@}4eo4PhVU^ytQTT>6u&xC*%6>0g;CPzJ08>4*r6alvI09yx7~7w zZJc@z)^-ciY}Pbu*J*()8WV2luUG-JOZ?l-b|wcq?iD<*96`UdI+a=jky!7zH{RY< zmyJ^0Acs!~F3J$_(yw37hvN zgCg1M-9&rm#!oCbp4}j#fknS*QLcz04*2-b^95)Zkedf%uhyex4bVt~uDm+t>u;ti z;wG!kLfVlZBO7Kbm$}d2iIAlCbzge9BY%;4>aEM|-G`AOh>daYcfW><@0RJ2o}600 zsW*4BYYR5#+<>ATT8Z}mIn$={Xb9sMZo2oiJl?cZ|7N%CuQi*0JIXH6ZvI*IPsq_+ zb}jo{{)#Ryz%&ew183a&W{vGExgmsryHoV4-m8ZQIV3=o1X`S4oDcM28}YQq(>jY0jCoZL;r~dn9V!{$Nf?xEaIek#L{NtX`YB9 z>Fp$}Mk5Nmo6%Y%)$@2R>)huv@{+EKB78Zg6tw!nJa9V2Je}&D;Ukf9@Y{VIp;@~} zj0!4j)kRh%2%LG{{F107jj1``n6BLKiA|O|g!Z$LvwS*x?64u)*AQ#7g;nxfeak*k z0HozJXL?5ijzAL3@=_a9gp=;GOp?W-Ap4)7y#(tQ8;OZWU2|btd)CWK_cP<@zM9)& z*&8>8A9o2;VXZYUZAC&g57dfpjTYK2fAodKO1w5H6B<%QAJRqX3xb%Eb;HQ z^6s@7h`qBzid@o3dVauvJNie`J@`Ay$>TM93muoUwv>=(KOa4Nak=ewCO+i%i)1VN z!AzLOtm(9u8tgJwBX7#PO4lR>Y*EF;E?)~DOeh8(WS$A`YR`cP89R zngui{wW(5C_b%Q0@HrQ0&ma6Q9hw(`e;Z`ZIpYZpdeh2V4QgxiuQ(7UDKN9qs^HUI zc{zHh(|sq`7D#Tn81vuU!P-krrpxeD)PQQYp979=lPTsHJqQ4;0B4{rc`=_c+f_)t;m&xg7 z%tu2WNesP-vFi<>Y3ypz%Q-ySE%Yj=LeRCPzGX!^%T^>t_;I#%Y*Rth{^6>>`GYes z;+^$ASIsfyoSw6~MV%&j*`z&nr9=Isso%L7-L6W31>0nnNgi=#PhDf}TiG+yyoY}c z%^all&H}i_CMC?KM|O^J9#q?T#KYQ^|Ip=*xcLJfQIW zPW|!VB1d~U`rSnS)*Uic{ExJ-#j|FYbxtPk3mn@^o^9Id z-msZvU)|ljv`rg7{@#g|?|BfWC+0D3yfq`i6l zlMnWyV|?>5MgA{&oxZbZxnvc!C!rq|@DJJQae~rUBy@e=tDgkx-q?<+o5vpxQ0vpd z!2i`IKy@U(oNnGcE29dlOR)X?95mr?Ody;d@pk<}Gm|b#AZTk=f$&;L0mCZuo6cUZ z2#I)XymhX>Yc}Dhr}dKQ!*I5GX0_;gli)L&im|1*-R=SCnEGfW^av1llwd4Slw{v7 zIa#SZt`99r(a^U{-egNgehWCsR-;}?p^PF&+I&Hulkbl_*sM5Xdr8_>is;-JtK6Hi z-Y6O3r$7u%#v~X#ZByX9cO(`O(;H1Ct`i77cqKq!P5)esOX`s($?~YAg)w!@c75f- zWOey8J{FDF*Nsn130B((_u37phasOi$~A6+Ocu{*<81}NdL4^UC7M_9L?~@Dkr*jS zb;-Dely@=(mlFe|o37+V5l5sRmCS|cQ6dOAX+nwS+trUg1Y{Hz86{hqMBE2&`=#wf zW=`))T>Y7-LP@3ggL8=SW~y0>H4;anj(qh8MMQ}IXpfQ&O+P)CrMM+=6OyGp>jYN= zi*XJA^k>_nCFka2uCs{>j+vTlSc>;8t z9V zpex0YI~7oR81{x0)Xng*XDU=yJm1$4>|F~9jE2g$WZvlj-5z*+&kE{Kyc6yU4o!tb zTR~-;@*W%q$3zPfQo(b&*-2KQL@T9K*9X*zB7JtzMWFZ``lzc_aR##33}4*&^Dx;8 zOzJ2u50u9nl2k=WK3*hk^f|@=v_=TRI$q+kL1L?wv>HO2_rPr(B{{_<=eZ@^+Jf!@ zaE~jw-jMv*i#%8h>bFvTwMR~yB13`F@#5kk*V1=trDLh3BekW|Q>CMOrEiu>=WEFe zu4TQor9$ko)v2MxOaTFMd z0_RYKc@&X-iYS6AhN4Pfs7G;BDH0XIp~~>6a{E*yf~J6?DPd?QaWqvDO`Sv2;L)`9 zY1)ViT~vi0rs5o~!hlqP;#3&(DlY6-pb>Oa6x|#{x4_XYNpx!t-IhnU+owAqDzBg_ zuVE^kaFs5kN(`scomc6xUwI2r<%O#9!BqL-sscz=L7b{!URB6`6&6u_A5|TOsgA%^ zN0F*=oa$I!b=-b69#NBks(Fa1NygO>Ni}Jlnhah|=6+2!qBa**n~$k2z||I!YDt`0 zGOxC5zm|ev&`=CIhEauM)Q}hq4x^mOW7O|6*oe9&R9!Qst`%3;PO9T@>YnoIy7%k2 z2RMR)h}S` zzvAi_N%hN|`c+>2+J5~8qG1cwu!Cv%fos?$HSBX5e)Ags?l%C^Y>*Kf;>H$?VZ%z; Y@J_by2e!yBwy1QYm{Ftj5fEVXe;DpSVE_OC diff --git a/Docs/Raw-Flags/tajikistan.gif b/Docs/Raw-Flags/tajikistan.gif deleted file mode 100644 index e41305e5ade8aa6f5cf900563c566df103b6e27f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6245 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 BSrq^P diff --git a/Docs/Raw-Flags/tanzania.gif b/Docs/Raw-Flags/tanzania.gif deleted file mode 100644 index b5e266a059a38fee5dd72809f16c29fd47aed5c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4673 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 diff --git a/Docs/Raw-Flags/thailand.gif b/Docs/Raw-Flags/thailand.gif deleted file mode 100644 index 68dde61999bc0519e24eb25c40bdaf32059695bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1620 zcmV-a2CMl;Nk%v~VORo?0ipl^|NsB@_xIj=d)7HZ#sC0&d)5d5wEzGBEC2ui09XQ$ z0RRL4NV?qqFv>}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ z$!t2G(5Q4uty-_xtai)odcWYXcuX#v&*-#z&2GEj@VIs;jK6uCK7Mva__cwzs&s zy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=%($mz{*4NnC+S}aS-rwNi;^XAy=I7|?>g(+7 z?(gvN^7Hid_V@Vt`uqI-{{H|23LHqVpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m&2 zqsNaR84egpvZTqAC{wCj$+D%(moQ_>oJq5$&6_xL>fFh*r_Y~2g9;sLGJw&eNRujE z%CxD|r%fOt?uiw9b0}CEZxUk{Fh!ZPb%($`R$B-jSo=my2<;$2eYu?Pcv**vCLyI0wy0q!j zs8g$6&APSg*RW&Do=v;9?c2C>>)y?~x9{J;g9{%{ytwh>$dfBy&b+zv=g^}|pH98H z_3PNPYv0bjyZ7(l!;2qJzP$PK=+moT&%V9;_weJ(pHIKO{rmXy>)+46zyJUL00t=F zfCLt3;DHDxsNjMOHt67k5Jo8BgcMe2;e{AxsNsejcIe@UAciR7h$NP1;)y7xsN#w& zw&>!EFvck3j5OA07|%vs_CYjcIxS;poS{ysHB!^>Zz!v zs_Lq&w(9Duu*NFuthCl@>#exvs_U-2_Uh}ezy>Squ*4Q??6JrutL(D>%r@)nv(QE> z?X=WZYwfkzW~=SC+;;2jx8Q~=?zrTZYwo$|rmOC{?6&LfyYR*<@4WQZYwx}I=Bw|% z{PyebzW@g;@W2EYZ1BMdC#>+o3^(lX!w^R-@x&BYZ1KeyXRPtY9Cz&T#~_C+^2j8Y zZ1Tw{r>yeIEVu0P%P_|*^UO5YZ1c@H=dAP2JooJL&p-z)^w2~XZS>JdC$03-OgHWH z(@;k(_0&{XZS~byXRY*wdY`5+9+i=G%_uO>XZTH=H z=dJhNeE045-+%`$_~3*WZusGdC$9M7j5qH1a4f!`s=XAF8l1X*KYgmxaY3>?!5Qz`|rR9FZ}St7jOLW$S1G- z^2|5y{PWO9Fa7k?S8x6G*k`Z(_S|>x{rBL9FaG%Cmv8?0=%=s#`s}yw{`>I9FaP}X z*Khy*_~)4P8)p$JDv!V;SBgeXj*3RlR&7P|0-FpQxLXGp^u+VF-r%%Ki<$ip7`@P|MQ zq7a8j#3CB;h)7JL5|_xtCOYwnP>iA!r%1&rTJefl%%T?mx5&jVdhv^345JvwNX9an z@r-CpqZ-%9#x}a~jc|;k9Op>KI@?Jdh?s$45v89NzQVb^PK2Rr#jck&UU)e$s6rRY(1tqnp%9IzL?=oi(TZC1q8QDnMmNgQj(YT?APuQV SM@rI?n)IY7P3bxl0028$3(bK5 diff --git a/Docs/Raw-Flags/togo.gif b/Docs/Raw-Flags/togo.gif deleted file mode 100644 index fec51e649c80e368388ea1077f6fcaecc3f6903d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2815 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 JJlGKd06UIcxJ>{6 diff --git a/Docs/Raw-Flags/tunisia.gif b/Docs/Raw-Flags/tunisia.gif deleted file mode 100644 index 4e9872ec8267717a088210b59299f342ac552a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3881 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 T^PmsC=tocb(wja-Apih7Z6NRd diff --git a/Docs/Raw-Flags/turkmenistan.gif b/Docs/Raw-Flags/turkmenistan.gif deleted file mode 100644 index 7b4af9ac1589a55908654f5dd91175272a2bacad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26835 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%0DZ?tVK4sOWuOkx}cm@b-QzzA)2I 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 T*Khy*_~)%MR- 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%0Dq+>_6 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 diff --git a/Docs/Raw-Flags/uruguay.gif b/Docs/Raw-Flags/uruguay.gif deleted file mode 100644 index b772fcf47df21266dd7b99b7be0d355a7d66714c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8709 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%0Dq+>_6 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 diff --git a/Docs/Raw-Flags/uzbekistan.gif b/Docs/Raw-Flags/uzbekistan.gif deleted file mode 100644 index 27cfff2b4bb9287add00b280d1afb4e6d3724ffb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3968 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 diff --git a/Docs/Raw-Flags/venezuela.gif b/Docs/Raw-Flags/venezuela.gif deleted file mode 100644 index 794f09cd856058615399d68eefefa9ac3cf1ed14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10305 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 diff --git a/Docs/Raw-Flags/vincent-and-grenadines.gif b/Docs/Raw-Flags/vincent-and-grenadines.gif deleted file mode 100644 index 8a8689fbc394014fb17a4c78ef174d46a16fb4a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4234 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 diff --git a/Docs/Raw-Flags/yemen.gif b/Docs/Raw-Flags/yemen.gif deleted file mode 100644 index f297f9fcef74ba5d49ffae0f81ee4c172be25003..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 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 E4=`+y1{6UBMVd&B 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 diff --git a/Docs/Raw-Flags/zimbabwe.gif b/Docs/Raw-Flags/zimbabwe.gif deleted file mode 100644 index 49d042fb265fedab683d7ec5baa3183eef2127f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10738 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 diff --git a/Docs/Support/generate-mirror-listing.pl b/Docs/Support/generate-mirror-listing.pl deleted file mode 100755 index 1c6e579b330..00000000000 --- a/Docs/Support/generate-mirror-listing.pl +++ /dev/null @@ -1,27 +0,0 @@ -#!/my/gnu/bin/perl -w -*- perl -*- - -# Generate a mirror listing - -line: while (<>) { last line if /START_OF_MIRROR_LISTING/;}; - -print "MySQL mirror listing\n"; - -line: while (<>) -{ - last line if /END_OF_MIRROR_LISTING/; - if (/^\@strong\{([A-Za-z ]+):\}$/) - { - print "\n*** $1\n"; - } - elsif (m|^\@image\{Img/[a-z-]+\} ([A-Za-z]+) \[(.*)\]|) - { - print "\n$1 [$2]\n"; - } - # A hacky URL regexp - # (m!^\@uref\{((http\|ftp)://[^,]*), (FTP\|WWW)\}!) - elsif (m!^\@uref\{((http|ftp)://[^,]*), (FTP|WWW)\}!) - { - $addr = $1; - print " $addr\n"; - } -} diff --git a/Docs/Support/texi2html b/Docs/Support/texi2html deleted file mode 100755 index f13c006c7dc..00000000000 --- a/Docs/Support/texi2html +++ /dev/null @@ -1,2259 +0,0 @@ -#!/usr/bin/perl -# Add path to perl on the previous line and make this executable -# if you want to use this as a normal script. -'di '; -'ig 00 '; -#+############################################################################## -# # -# File: texi2html # -# # -# Description: Program to transform most Texinfo documents to HTML # -# # -#-############################################################################## - -# @(#)texi2html 1.52 971230 Written (mainly) by Lionel Cons, Lionel.Cons@cern.ch -# Enhanced by David Axmark - -# The man page for this program is included at the end of this file and can be -# viewed using the command 'nroff -man texi2html'. -# Please read the copyright at the end of the man page. - -#+++############################################################################ -# # -# Constants # -# # -#---############################################################################ - -$DEBUG_TOC = 1; -$DEBUG_INDEX = 2; -$DEBUG_BIB = 4; -$DEBUG_GLOSS = 8; -$DEBUG_DEF = 16; -$DEBUG_HTML = 32; -$DEBUG_USER = 64; - -$BIBRE = '\[[\w\/]+\]'; # RE for a bibliography reference -$FILERE = '[\/\w.+-]+'; # RE for a file name -$VARRE = '[^\s\{\}]+'; # RE for a variable name -$NODERE = '[^@{}:\'`",]+'; # RE for a node name -$NODESRE = '[^@{}:\'`"]+'; # RE for a list of node names -$XREFRE = '[^@{}]+'; # RE for a xref (should use NODERE) - -$ERROR = "***"; # prefix for errors and warnings -$THISPROG = "texi2html 1.52 (with additions by MySQL AB)"; # program name and version -$TODAY = &pretty_date; # like "20 September 1993" -$SPLITTAG = "\n"; # tag to know where to split -$PROTECTTAG = "_ThisIsProtected_"; # tag to recognize protected sections -$html2_doctype = ''; - -# -# language dependent constants -# -#$LDC_SEE = 'see'; -#$LDC_SECTION = 'section'; -#$LDC_IN = 'in'; -#$LDC_TOC = 'Table of Contents'; -#$LDC_GOTO = 'Go to the'; -#$LDC_FOOT = 'Footnotes'; -# TODO: @def* shortcuts - -#$user_sub{"email"} = "fix_email"; - -# -# pre-defined indices -# -%predefined_index = ( - 'cp', 'c', - 'fn', 'f', - 'vr', 'v', - 'ky', 'k', - 'pg', 'p', - 'tp', 't', - ); - -# -# valid indices -# -%valid_index = ( - 'c', 1, - 'f', 1, - 'v', 1, - 'k', 1, - 'p', 1, - 't', 1, - ); - -# -# texinfo section names to level -# -%sec2level = ( - 'top', 0, - 'chapter', 1, - 'unnumbered', 1, - 'majorheading', 1, - 'chapheading', 1, - 'appendix', 1, - 'section', 2, - 'unnumberedsec', 2, - 'heading', 2, - 'appendixsec', 2, - 'appendixsection', 2, - 'subsection', 3, - 'unnumberedsubsec', 3, - 'subheading', 3, - 'appendixsubsec', 3, - 'subsubsection', 4, - 'unnumberedsubsubsec', 4, - 'subsubheading', 4, - 'appendixsubsubsec', 4, - ); - -# -# accent map, TeX command to ISO name -# -%accent_map = ( - '"', 'uml', - '\'', 'acute', - ',{', 'cedil', - '~', 'tilde', - '^', 'circ', - '`', 'grave', - 'ringaccent{', 'ring', - ); - -# -# texinfo "simple things" (@foo) to HTML ones -# -%simple_map = ( - # cf. makeinfo.c - "*", "
", # HTML+ - " ", " ", - "\n", "\n", - "|", "", - # spacing commands - ":", "", - "!", "!", - "?", "?", - ".", ".", - # @- means "allow word break", not — - "-", "", - ); - -# -# texinfo "things" (@foo{}) to HTML ones -# -%things_map = ( - 'TeX', 'TeX', - 'br', '

', # paragraph break - 'bullet', '*', - 'copyright', '(C)', - 'registeredsymbol', '(R)', - 'dots', '...', - 'equiv', '==', - 'error', 'error-->', - 'expansion', '==>', - 'minus', '-', - 'point', '-!-', - 'print', '-|', - 'result', '=>', - 'today', $TODAY, - ); - -# -# texinfo styles (@foo{bar}) to HTML ones -# -%style_map = ( - 'asis', '', - 'b', 'B', - 'cite', 'cite', - 'code', 'code', - 'command', 'code', - 'ctrl', '&do_ctrl', # special case - 'dfn', 'strong', # DFN tag is illegal in the standard - 'dmn', '', # useless - 'email', '&fix_email', # special - 'emph', 'em', - 'file', '"tt', # will put quotes, cf. &apply_style - 'i', 'i', - 'kbd', 'kbd', - 'key', 'kbd', - 'r', '', # unsupported - 'samp', '"samp', # will put quotes, cf. &apply_style - 'sc', '&do_sc', # special case - 'strong', 'strong', - 't', 'tt', - 'titlefont', '', # useless - 'image', '&fix_image', # Image - 'url', '&fix_url', # URL - 'uref', '&fix_uref', # URL Reference - 'var', 'var', - 'w', '', # unsupported - ); - -# -# texinfo format (@foo/@end foo) to HTML ones -# -%format_map = ( - 'display', 'PRE', - 'example', 'PRE', - 'format', 'PRE', - 'lisp', 'PRE', - 'quotation', 'BLOCKQUOTE', - 'smallexample', 'PRE', - 'smalllisp', 'PRE', - # lists - 'itemize', 'UL', - 'enumerate', 'OL', - # poorly supported - 'flushleft', 'PRE', - 'flushright', 'PRE', - ); - -# -# texinfo definition shortcuts to real ones -# -%def_map = ( - # basic commands - 'deffn', 0, - 'defvr', 0, - 'deftypefn', 0, - 'deftypevr', 0, - 'defcv', 0, - 'defop', 0, - 'deftp', 0, - # basic x commands - 'deffnx', 0, - 'defvrx', 0, - 'deftypefnx', 0, - 'deftypevrx', 0, - 'defcvx', 0, - 'defopx', 0, - 'deftpx', 0, - # shortcuts - 'defun', 'deffn Function', - 'defmac', 'deffn Macro', - 'defspec', 'deffn {Special Form}', - 'defvar', 'defvr Variable', - 'defopt', 'defvr {User Option}', - 'deftypefun', 'deftypefn Function', - 'deftypevar', 'deftypevr Variable', - 'defivar', 'defcv {Instance Variable}', - 'defmethod', 'defop Method', - # x shortcuts - 'defunx', 'deffnx Function', - 'defmacx', 'deffnx Macro', - 'defspecx', 'deffnx {Special Form}', - 'defvarx', 'defvrx Variable', - 'defoptx', 'defvrx {User Option}', - 'deftypefunx', 'deftypefnx Function', - 'deftypevarx', 'deftypevrx Variable', - 'defivarx', 'defcvx {Instance Variable}', - 'defmethodx', 'defopx Method', - ); - -# -# things to skip -# -%to_skip = ( - # comments - 'c', 1, - 'comment', 1, - # useless - 'contents', 1, - 'shortcontents', 1, - 'summarycontents', 1, - 'footnotestyle', 1, - 'end ifclear', 1, - 'end ifset', 1, - 'titlepage', 1, - 'end titlepage', 1, - # unsupported commands (formatting) - 'afourpaper', 1, - 'cropmarks', 1, - 'finalout', 1, - 'headings', 1, - 'need', 1, - 'page', 1, - 'setchapternewpage', 1, - 'everyheading', 1, - 'everyfooting', 1, - 'evenheading', 1, - 'evenfooting', 1, - 'oddheading', 1, - 'oddfooting', 1, - 'smallbook', 1, - 'vskip', 1, - 'filbreak', 1, - # unsupported formats - 'cartouche', 1, - 'end cartouche', 1, - 'group', 1, - 'end group', 1, - ); - -#+++############################################################################ -# # -# Argument parsing, initialisation # -# # -#---############################################################################ - -%value = (); # hold texinfo variables - -$use_bibliography = 1; -$use_acc = 0; -$debug = 0; -$doctype = ''; -$check = 0; -$expandinfo = 0; -$use_glossary = 0; -$invisible_mark = ''; -$use_iso = 0; -@include_dirs = (); -$show_menu = 0; -$number_sections = 0; -$split_node = 0; -$split_chapter = 0; -$monolithic = 0; -$verbose = 0; -$opt_use_numbers = 0; -$opt_empty_headers = 0; -$opt_special_links = ""; -$usage = <= 0 && $ARGV[0] =~ /^-/) -{ - $_ = shift(@ARGV); - if (/^-acc$/) { $use_acc = 1; next; } - if (/^-d(ebug)?(\d+)?$/) { $debug = $2 || shift(@ARGV); next; } - if (/^-doctype$/) { $doctype = shift(@ARGV); next; } - if (/^-c(heck)?$/) { $check = 1; next; } - if (/^-e(xpandinfo)?$/) { $expandinfo = 1; next; } - if (/^-g(lossary)?$/) { $use_glossary = 1; next; } - if (/^-i(nvisible)?$/) { $invisible_mark = shift(@ARGV); next; } - if (/^-iso$/) { $use_iso = 1; next; } - if (/^-I(.+)?$/) { push(@include_dirs, $2 || shift(@ARGV)); next; } - if (/^-D([a-zA-Z0-9]+)=?(.+)?$/) - { $value{$1} = $2 ? $2 : 1; next; } - if (/^-m(enu)?$/) { $show_menu = 1; next; } - if (/^-mono(lithic)?$/) { $monolithic = 1; next; } - if (/^-n(umber)?$/) { $number_sections = 1; next; } - if (/^-ref_num$/) { $opt_use_numbers = 1; next; } - if (/^-empty_headers$/) { $opt_empty_headers = 1; next; } - if (/^-special_links$/) { $opt_special_links = $2 || shift(@ARGV); next; } - if (/^-s(plit)?_?(n(ode)?|c(hapter)?)?$/) { - if ($2 =~ /^n/) { - $split_node = 1; - } else { - $split_chapter = 1; - } - next; - } - if (/^-v(erbose)?$/) { $verbose = 1; next; } - die $usage; -} -if ($check) { - die $usage unless @ARGV > 0; - ✓ - exit; -} - -die "Can't use -special_links with -ref_num.\n" - if $opt_special_links && $opt_use_numbers; -die "Must have -split_node with -special_links.\n" - if $opt_special_links && !$split_node; - -if (($split_node || $split_chapter) && $monolithic) { - warn "Can't use -monolithic with -split, -monolithic ignored.\n"; - $monolithic = 0; -} -if ($expandinfo) { - $to_skip{'ifinfo'}++; - $to_skip{'end ifinfo'}++; -} else { - $to_skip{'iftex'}++; - $to_skip{'end iftex'}++; -} -$invisible_mark = '' if $invisible_mark eq 'xbm'; -die $usage unless @ARGV == 1; -$docu = shift(@ARGV); -if ($docu =~ /.*\//) { - chop($docu_dir = $&); - $docu_name = $'; -} else { - $docu_dir = '.'; - $docu_name = $docu; -} -unshift(@include_dirs, $docu_dir); -$docu_name =~ s/\.te?x(i|info)?$//; # basename of the document - -$docu_doc = "$docu_name.html"; # document's contents -$link_doc = $docu_doc; -if ($monolithic) { - $docu_toc = $docu_foot = $docu_doc; -} else { - $docu_toc = "${docu_name}_toc.html"; # document's table of contents - $docu_foot = "${docu_name}_foot.html"; # document's footnotes -} - -# -# variables -# -$value{'html'} = 1; # predefine html (the output format) -$value{'texi2html'} = '1.52'; # predefine texi2html (the translator) -# _foo: internal to track @foo -foreach ('_author', '_title', '_subtitle', - '_settitle', '_setfilename') { - $value{$_} = ''; # prevent -w warnings -} -%node2sec = (); # node to section name -%node2href = (); # node to HREF -%bib2href = (); # bibliography reference to HREF -%gloss2href = (); # glossary term to HREF -@sections = (); # list of sections -%tag2pro = (); # protected sections - -# -# initial indexes -# -$bib_num = 0; -$foot_num = 0; -$gloss_num = 0; -$idx_num = 0; -$sec_num = 0; -$doc_num = 0; -$current_chapter_link = ""; -@maybe_wrong_links = (); -$html_num = 0; - -# -# can I use ISO8879 characters? (HTML+) -# -if ($use_iso) { - $things_map{'bullet'} = "•"; - $things_map{'copyright'} = "©"; - $things_map{'registeredsymbol'} = "®"; - $things_map{'dots'} = "…"; - $things_map{'equiv'} = "≡"; - $things_map{'expansion'} = "→"; - $things_map{'point'} = "∗"; - $things_map{'result'} = "⇒"; - $things_map{'ss'} = "ß"; - $things_map{'o'} = "ø"; - $things_map{'O'} = "Ø"; -} - -# -# read texi2html extensions (if any) -# -$extensions = 'texi2html.ext'; # extensions in working directory -if (-f $extensions) { - print "# reading extensions from $extensions\n" if $verbose; - require($extensions); -} -($progdir = $0) =~ s/[^\/]+$//; -if ($progdir && ($progdir ne './')) -{ - $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory - if (-f $extensions) { - print "# reading extensions from $extensions\n" if $verbose; - require($extensions); - } -} - - print "# reading from $docu\n" if $verbose; - -#+++############################################################################ -# # -# Pass 1: read source, handle command, variable, simple substitution # -# # -#---############################################################################ - -@lines = (); # whole document -@toc_lines = (); # table of contents -$toplevel = 0; # top level seen in hierarchy -$curlevel = 0; # current level in TOC -$node = ''; # current node name -$in_table = 0; # am I inside a table -$table_type = ''; # type of table ('', 'f', 'v') -@tables = (); # nested table support -$in_bibliography = 0; # am I inside a bibliography -$in_glossary = 0; # am I inside a glossary -$in_top = 0; # am I inside the top node -$in_pre = 0; # am I inside a preformatted section -$in_list = 0; # am I inside a list -$in_html = 0; # am I inside an HTML section -$first_line = 1; # is it the first line -$dont_html = 0; # don't protect HTML on this line -$split_num = 0; # split index -$deferred_ref = ''; # deferred reference for indexes -@html_stack = (); # HTML elements stack -$html_element = ''; # current HTML element -&html_reset; - -# build code for simple substitutions -# the maps used (%simple_map and %things_map) MUST be aware of this -# watch out for regexps, / and escaped characters! -$subst_code = ''; -foreach (keys(%simple_map)) { - $re = quotemeta $_; # protect regexp chars - $sub = quotemeta $simple_map{$_}; - $subst_code .= "s/\\\@$re/$sub/g;\n"; -} -foreach (keys(%things_map)) { - $re = quotemeta $_; # protect regexp chars - $sub = quotemeta $things_map{$_}; - $subst_code .= "s/\\\@$re\\{\\}/$sub/g;\n"; -} -if ($use_acc) { - # accentuated characters - foreach (keys(%accent_map)) { - my $brace = /{$/ ? '}' : ''; - if ($_ eq "`") { - $subst_code .= "s/$;3"; - } elsif ($_ eq "'") { - $subst_code .= "s/$;4"; - } else { - $subst_code .= "s/\\\@\\Q$_\\E"; - } - $subst_code .= "(\\w)$brace/&\${1}$accent_map{$_};/gi;\n"; - } -} -eval("sub simple_substitutions { $subst_code }"); - -&init_input; -READ_LINE: while ($_ = &next_line) -{ - # - # remove \input on the first lines only - # - if ($first_line) { - next if /^\\input/; - $first_line = 0; - } - # - # parse texinfo tags - # - $tag = ''; - $end_tag = ''; - if (/^\s*\@end\s+(\w+)\b/) { - $end_tag = $1; - } elsif (/^\s*\@(\w+)\b/) { - $tag = $1; - } - # - # handle @ifhtml / @end ifhtml - # - if ($in_html) { - if ($end_tag eq 'ifhtml') { - $in_html = 0; - } else { - $tag2pro{$in_html} .= $_; - } - next; - } elsif ($tag eq 'ifhtml') { - $in_html = $PROTECTTAG . ++$html_num; - push(@lines, $in_html); - next; - } - # - # try to skip the line - # - if ($end_tag) { - next if $to_skip{"end $end_tag"}; - } elsif ($tag) { - next if $to_skip{$tag}; - last if $tag eq 'bye'; - } - if ($in_top) { - # parsing the top node - if ($tag eq 'node' || $tag eq 'include' || $sec2level{$tag}) { - # no more in top - $in_top = 0; - } else { - # skip it - next; - } - } - # - # try to remove inlined comments - # syntax from tex-mode.el comment-start-skip - # - s/((^|[^\s*\@])(\@\@)*)\@c(omment)? .*/$1/; - # non-@ substitutions cf. texinfmt.el - # Since these changes break code examples in the source they were removed. David 990729 - #s/``/\"/g; - #s/''/\"/g; - s/([\w ])---([\w ])/$1--$2/g; - # - # analyze the tag - # - if ($tag) { - # skip lines - &skip_until($tag), next if $tag eq 'ignore'; - if ($expandinfo) { - &skip_until($tag), next if $tag eq 'iftex'; - } else { - &skip_until($tag), next if $tag eq 'ifinfo'; - } - &skip_until($tag), next if $tag eq 'tex'; - # handle special tables - if ($tag eq 'table') { - $table_type = ''; - } elsif ($tag eq 'ftable') { - $tag = 'table'; - $table_type = 'f'; - } elsif ($tag eq 'vtable') { - $tag = 'table'; - $table_type = 'v'; - } - # special cases - if ($tag eq 'top' || ($tag eq 'node' && /^\s*\@node\s+top\s*,/i)) { - $in_top = 1; - @lines = (); # ignore all lines before top (title page garbage) - next; - } elsif ($tag eq 'node') { - $in_top = 0; - warn "$ERROR Bad node line: $_" unless $_ =~ /^\s*\@node\s$NODESRE$/o; - $_ = &protect_html($_); # if node contains '&' for instance - s/^\s*\@node\s+//; - ($node) = split(/,/); - &normalise_node($node); - if ($split_node) { - ($doc_node_name[$doc_num + 1] = $node) =~ s|[ /]|_|g; - $doc_node_name_links[$doc_num + 1] = $current_chapter_link; - &next_doc; - push(@lines, $SPLITTAG) if $split_num++; - push(@sections, $node); - } - next; - } elsif ($tag eq 'include') { - if (/^\s*\@include\s+($FILERE)\s*$/o) { - $file = $1; - unless (-e $file) { - foreach $dir (@include_dirs) { - $file = "$dir/$1"; - last if -e $file; - } - } - if (-e $file) { - &open($file); - print "# including $file\n" if $verbose; - } else { - warn "$ERROR Can't find $file, skipping"; - } - } else { - warn "$ERROR Bad include line: $_"; - } - next; - } elsif ($tag eq 'ifclear') { - if (/^\s*\@ifclear\s+($VARRE)\s*$/o) { - next unless defined($value{$1}); - &skip_until($tag); - } else { - warn "$ERROR Bad ifclear line: $_"; - } - next; - } elsif ($tag eq 'ifset') { - if (/^\s*\@ifset\s+($VARRE)\s*$/o) { - next if defined($value{$1}); - &skip_until($tag); - } else { - warn "$ERROR Bad ifset line: $_"; - } - next; - } elsif ($tag eq 'menu') { - unless ($show_menu) { - &skip_until($tag); - next; - } - &html_push_if($tag); - push(@lines, &html_debug("\n", __LINE__)); - } elsif ($format_map{$tag}) { - $in_pre = 1 if $format_map{$tag} eq 'PRE'; - &html_push_if($format_map{$tag}); - push(@lines, &html_debug("\n", __LINE__)); - $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ; - push(@lines, &debug("<$format_map{$tag}>\n", __LINE__)); - next; - } elsif ($tag eq 'table') { - if (/^\s*\@[fv]?table\s+\@(\w+)\s*$/) { - $in_table = $1; - unshift(@tables, join($;, $table_type, $in_table)); - push(@lines, &debug("

\n", __LINE__)); - &html_push_if('DL'); - push(@lines, &html_debug("\n", __LINE__)); - } else { - warn "$ERROR Bad table line: $_"; - } - next; - } elsif ($tag eq 'multitable') { - if (/^\s*\@multitable\s*\@columnfractions\s+([\.\d\s]+)\s*$/ || - /^\s*\@multitable\s*({[^{}]+})+\s*$/) - { - $in_multitable = 1; - html_push('TABLE'); - my($col_list) = $1; - $multitable_cols = ($col_list =~ /\@columnfractions/ ? s/[\d.]+\s+//g : - s/{[^{}]+}//g); - print "# Multitable with $multitable_cols columns\n" - if $debug and $DEBUG_USER; - push(@lines, &debug("\n", __LINE__)); - } else { - warn "$ERROR Bad table line: $_"; - } - next; - } elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') { - if (/^\s*\@$tag\s+(\w)\w\s+(\w)\w\s*$/) { - eval("*${1}index = *${2}index"); - } else { - warn "$ERROR Bad syn*index line: $_"; - } - next; - } elsif ($tag eq 'sp') { - push(@lines, &debug("

\n", __LINE__)); - next; - } elsif ($tag eq 'setref') { - &protect_html; # if setref contains '&' for instance - if (/^\s*\@$tag\s*{($NODERE)}\s*$/) { - $setref = $1; - $setref =~ s/\s+/ /g; # normalize - $setref =~ s/ $//; - $node2sec{$setref} = $name; - $node2href{$setref} = "$link_doc#$docid"; - push(@maybe_wrong_links, $setref); - } else { - warn "$ERROR Bad setref line: $_"; - } - next; - } elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') { - if (/^\s*\@$tag\s+(\w\w)\s*$/) { - $valid_index{$1} = 1; - } else { - warn "$ERROR Bad defindex line: $_"; - } - next; - } elsif (defined($def_map{$tag})) { - if ($def_map{$tag}) { - s/^\s*\@$tag\s+//; - $tag = $def_map{$tag}; - $_ = "\@$tag $_"; - $tag =~ s/\s.*//; - } - } elsif (defined($user_sub{$tag})) { - s/^\s*\@$tag\s+//; - $sub = $user_sub{$tag}; - print "# user $tag = $sub, arg: $_" if $debug & $DEBUG_USER; - if (defined(&$sub)) { - chop($_); - &$sub($_); - } else { - warn "$ERROR Bad user sub for $tag: $sub\n"; - } - next; - } - if (defined($def_map{$tag})) { - s/^\s*\@$tag\s+//; - if ($tag =~ /x$/) { - # extra definition line - $tag = $`; - $is_extra = 1; - } else { - $is_extra = 0; - } - while (/\{([^\{\}]*)\}/) { - # this is a {} construct - ($before, $contents, $after) = ($`, $1, $'); - # protect spaces - $contents =~ s/\s+/$;9/g; - # restore $_ protecting {} - $_ = "$before$;7$contents$;8$after"; - } - @args = split(/\s+/, &protect_html($_)); - foreach (@args) { - s/$;9/ /g; # unprotect spaces - s/$;7/\{/g; # ... { - s/$;8/\}/g; # ... } - } - $type = shift(@args); - $type =~ s/^\{(.*)\}$/$1/; - print "# def ($tag): {$type} ", join(', ', @args), "\n" - if $debug & $DEBUG_DEF; - $type .= ':'; # it's nicer like this - $name = shift(@args); - $name =~ s/^\{(.*)\}$/$1/; - if ($is_extra) { - $_ = &debug("

", __LINE__); - } else { - $_ = &debug("
\n
", __LINE__); - } - if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') { - $_ .= "$type $name"; - $_ .= " @args" if @args; - } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr' - || $tag eq 'defcv' || $tag eq 'defop') { - $ftype = $name; - $name = shift(@args); - $name =~ s/^\{(.*)\}$/$1/; - $_ .= "$type $ftype $name"; - $_ .= " @args" if @args; - } else { - warn "$ERROR Unknown definition type: $tag\n"; - $_ .= "$type $name"; - $_ .= " @args" if @args; - } - $_ .= &debug("\n
", __LINE__); - $name = &unprotect_html($name); - if ($tag eq 'deffn' || $tag eq 'deftypefn') { - unshift(@input_spool, "\@findex $name\n"); - } elsif ($tag eq 'defop') { - unshift(@input_spool, "\@findex $name on $ftype\n"); - } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') { - unshift(@input_spool, "\@vindex $name\n"); - } else { - unshift(@input_spool, "\@tindex $name\n"); - } - $dont_html = 1; - } - } elsif ($end_tag) { - if ($format_map{$end_tag}) { - $in_pre = 0 if $format_map{$end_tag} eq 'PRE'; - $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ; - &html_pop_if('LI', 'P'); - &html_pop_if(); - push(@lines, &debug("\n", __LINE__)); - push(@lines, &html_debug("\n", __LINE__)); - } elsif ($end_tag eq 'table' || - $end_tag eq 'ftable' || - $end_tag eq 'vtable') { - shift(@tables); - if (@tables) { - ($table_type, $in_table) = split($;, $tables[0]); - } else { - $in_table = 0; - $table_type = ''; - } - push(@lines, "
\n"); - &html_pop_if('DD'); - &html_pop_if(); - } elsif ($end_tag eq 'multitable') { - print "# end of multitable with $multitable_cols columns\n" - if $debug and $DEBUG_USER; - $in_multitable = 0; - push(@lines, "\n"); - &html_pop_if('TR'); - push(@lines, "
\n"); -&html_pop_if('TABLE'); - } elsif (defined($def_map{$end_tag})) { - push(@lines, &debug("
\n", __LINE__)); - } elsif ($end_tag eq 'menu') { - &html_pop_if(); - push(@lines, $_); # must keep it for pass 2 - } - next; - } - # - # misc things - # - # protect texi and HTML things - &protect_texi; - $_ = &protect_html($_) unless $dont_html; - $dont_html = 0; - # substitution (unsupported things) - s/^\s*\@center\s+//g; - s/^\s*\@exdent\s+//g; - s/\@noindent\s+//g; - s/\@refill\s+//g; - # other substitutions - &simple_substitutions; - s/\@value{($VARRE)}/$value{$1}/eg; - s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4 - s/(^|\s+)\@tab\s*/ <\/TD> /g if ($in_multitable); - - # - # analyze the tag again - # - if ($tag) { - if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) { - if (/^\s*\@$tag\s+(.+)$/) { - $name = $1; - $name =~ s/\s+$//; - $level = $sec2level{$tag}; - $name = &update_sec_num($tag, $level) . " $name" - if $number_sections && $tag !~ /^unnumbered/ && $tag ne 'subsubheading'; - if ($tag =~ /heading$/) { - push(@lines, &html_debug("\n", __LINE__)); - if ($html_element ne 'body') { - # We are in a nice pickle here. We are trying to get a H? heading - # even though we are not in the body level. So, we convert - # it to a nice, bold, line by itself. - $_ = &debug("\n\n

$name

\n\n", __LINE__); - } else { - $_ = &debug("$name\n", __LINE__); - &html_push_if('body'); - } - print "# heading, section $name, level $level\n" - if $debug & $DEBUG_TOC; - } else { - if ($split_chapter) { - unless ($toplevel) { - # first time we see a "section" - unless ($level == 1) { - warn "$ERROR The first section found is not of level 1: $_"; - warn "$ERROR I'll split on sections of level $level...\n"; - } - $toplevel = $level; - }; - if ($level == $toplevel) { - print "# Splitting at section $name\n" - if $debug & $DEBUG_TOC; - ($doc_node_name[$doc_num + 1] = $node) =~ s|[ /]|_|g; - &next_doc; - push(@lines, $SPLITTAG) if $split_num++; - push(@sections, $name); - } - } elsif ($split_node && $opt_special_links) { - $toplevel = $level unless $toplevel; - if ($level == $toplevel) { - ($current_chapter_link = $node) =~ s|[ /]|_|g; - # Set this again to the right value. - $doc_node_name_links[$doc_num] = $current_chapter_link; - ($docu_doc, $link_doc) = &doc_name($doc_num); - } - } - $sec_num++; - # Was "SEC$sec_num" - ($docid = "$node") =~ s|[ /]|_|g; - ($tocid = "$node") =~ s|[ /]|_|g; -$docid = "SEC$sec_num" unless $docid; -$tocid = "SEC$sec_num" unless $tocid; - # check biblio and glossary - $in_bibliography = - ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i); - $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i); - # check node - if ($node) { - if ($node2sec{$node}) { - warn "$ERROR Duplicate node found: $node\n"; - } else { - $node2sec{$node} = $name; - $node2href{$node} = "$link_doc#$docid"; - push(@maybe_wrong_links, $node); - print "# node $node, section $name, level $level\n" - if $debug & $DEBUG_TOC; - } - $node = ''; - } else { - print "# no node, section $name, level $level\n" - if $debug & $DEBUG_TOC; - } - # update TOC - while ($level > $curlevel) { - $curlevel++; - push(@toc_lines, "
    \n"); - } - while ($level < $curlevel) { - $curlevel--; - push(@toc_lines, "
\n"); - } - $_ = "
  • " . &anchor($tocid, "$link_doc#$docid", $name, 1); - push(@toc_lines, &substitute_style($_)); - # update DOC - push(@lines, &html_debug("\n", __LINE__)); - &html_reset; - $_ = "".&anchor($docid, $opt_empty_headers ? "" : "$docu_toc#$tocid", - $name)."\n"; - $_ = &debug($_, __LINE__); - push(@lines, &html_debug("\n", __LINE__)); - } - # update DOC - foreach $line (split(/\n+/, $_)) { - push(@lines, "$line\n"); - } - next; - } else { - warn "$ERROR Bad section line: $_"; - } - } else { - # track variables - $value{$1} = $2, next if /^\s*\@set\s+($VARRE)\s+(.*)$/o; - delete $value{$1}, next if /^\s*\@clear\s+($VARRE)\s*$/o; - # store things - $value{'_setfilename'} = $1, next if /^\s*\@setfilename\s+(.*)$/; - $value{'_settitle'} = $1, next if /^\s*\@settitle\s+(.*)$/; - $value{'_author'} .= "$1\n", next if /^\s*\@author\s+(.*)$/; - $value{'_subtitle'} .= "$1\n", next if /^\s*\@subtitle\s+(.*)$/; - $value{'_title'} .= "$1\n", next if /^\s*\@title\s+(.*)$/; - # index - if (/^\s*\@(..?)index\s+/) { - unless ($valid_index{$1}) { - warn "$ERROR Undefined index command: $_"; - next; - } - $id = 'IDX' . ++$idx_num; - $index = $1 . 'index'; - $what = &substitute_style($'); - $what =~ s/\s+$//; - print "# found $index for '$what' id $id\n" - if $debug & $DEBUG_INDEX; - eval(<\n", __LINE__)); - push(@lines, &anchor($id, '', $invisible_mark, !$in_pre)); - &html_push('P'); - } elsif ($html_element eq 'DL' || - $html_element eq 'UL' || - $html_element eq 'OL' || - $html_element eq 'TR') { - $deferred_ref .= - &anchor($id, '', $invisible_mark, !$in_pre) . " "; - } - next; - } - # list item - if (/^\s*\@itemx?\s+/) - { - $what = $'; - $what =~ s/\s+$//; - - # add an index before the item if applicable - if ($table_type ne '' && !$in_multitable) { - print "# Adding table index (type $table_type) for $what\n" - if $debug & $DEBUG_INDEX; - # This is realy ugly. We should do a pass before this to - # add index entrys before instead. - if ($global_added_this_index) { - $global_added_this_index = 0; - } else { - unshift(@input_spool, "\@${table_type}index $what\n", $_); - $global_added_this_index = 1; - next READ_LINE; - } - } - - if ($in_bibliography && $use_bibliography) { - if ($what =~ /^$BIBRE$/o) { - $id = 'BIB' . ++$bib_num; - $bib2href{$what} = "$link_doc#$id"; - print "# found bibliography for '$what' id $id\n" - if $debug & $DEBUG_BIB; - $what = &anchor($id, '', $what); - } - } elsif ($in_glossary && $use_glossary) { - $id = 'GLOSS' . ++$gloss_num; - $entry = $what; - $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; - $gloss2href{$entry} = "$link_doc#$id"; - print "# found glossary for '$entry' id $id\n" - if $debug & $DEBUG_GLOSS; - $what = &anchor($id, '', $what); - } - if ($in_multitable) - { - # All this is a **HACK**. - # It does only work for a FEW SIMPLE CASES !!! - push(@lines, &debug("\n", __LINE__)) - unless $html_element eq 'TABLE'; - &html_pop_if('TR'); - $what =~ s/(^|\s+)\@tab\s*/ <\/TD> /g; - push(@lines, &debug("$what\n", __LINE__)); - &html_push('TR'); - if ($deferred_ref) - { - push(@lines, &debug("$deferred_ref\n", __LINE__)); - $deferred_ref = ''; - } - next; - } - else - { - &html_pop_if('P'); - if ($html_element eq 'DL' || $html_element eq 'DD') { - if ($things_map{$in_table} && !$what) { - # special case to allow @table @bullet for instance - push(@lines, &debug("
    $things_map{$in_table}\n", __LINE__)); - } else { - push(@lines, &debug("
    \@$in_table\{$what\}\n", __LINE__)); - } - push(@lines, "
    "); - &html_push('DD') unless $html_element eq 'DD'; - # Old index add was here - } else { - push(@lines, &debug("
  • $what\n", __LINE__)); - &html_push('LI') unless $html_element eq 'LI'; - } - push(@lines, &html_debug("\n", __LINE__)); - if ($deferred_ref) { - push(@lines, &debug("$deferred_ref\n", __LINE__)); - $deferred_ref = ''; - } - next; - } - } - } - } - # paragraph separator - if ($_ eq "\n") { - next if $#lines >= 0 && $lines[$#lines] eq "\n"; - if ($html_element eq 'P') { - push(@lines, "\n"); - $_ = &debug("

    \n", __LINE__); - &html_pop; - } - } elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE') { - push(@lines, "

    \n"); - &html_push('P'); - $_ = &debug($_, __LINE__); - } - # otherwise - push(@lines, $_); -} - -# finish TOC -$level = 0; -while ($level < $curlevel) -{ - $curlevel--; - push(@toc_lines, "\n"); -} - -print "# end of pass 1\n" if $verbose; - -#+++############################################################################ -# # -# Pass 2/3: handle style, menu, index, cross-reference # -# # -#---############################################################################ - -@lines2 = (); # whole document (2nd pass) -@lines3 = (); # whole document (3rd pass) -$in_menu = 0; # am I inside a menu - -while (@lines) -{ - $_ = shift(@lines); - # - # special case (protected sections) - # - if (/^$PROTECTTAG/o) { - push(@lines2, $_); - next; - } - # - # menu - # - $in_menu = 1, push(@lines2, &debug("

      \n", __LINE__)), next if /^\s*\@menu\b/; - $in_menu = 0, push(@lines2, &debug("
    \n", __LINE__)), next if /^\s*\@end\s+menu\b/; - if ($in_menu) { - if (/^\*\s+($NODERE)::/o) { - $descr = $'; - chop($descr); - &menu_entry($1, $1, $descr); - } elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/) { - $descr = $'; - chop($descr); - &menu_entry($1, $2, $descr); - } elsif (/^\*/) { - warn "$ERROR Bad menu line: $_"; - } else { # description continued? - push(@lines2, $_); - } - next; - } - # - # printindex - # - if (/^\s*\@printindex\s+(\w\w)\b/) { - local($index, *ary, @keys, $key, $letter, $last_letter, @refs); - if ($predefined_index{$1}) { - $index = $predefined_index{$1} . 'index'; - } else { - $index = $1 . 'index'; - } - eval("*ary = *$index"); - @keys = keys(%ary); - foreach $key (@keys) { - $_ = $key; - 1 while s/<(\w+)>\`(.*)\'<\/\1>/$2/; # remove HTML tags with quotes - 1 while s/<(\w+)>(.*)<\/\1>/$2/; # remove HTML tags - $_ = &unprotect_html($_); - &unprotect_texi; - tr/A-Z/a-z/; # lowercase - $key2alpha{$key} = $_; - print "# index $key sorted as $_\n" - if $key ne $_ && $debug & $DEBUG_INDEX; - } - $last_letter = undef; - foreach $key (sort byalpha @keys) { - $letter = substr($key2alpha{$key}, 0, 1); - $letter = substr($key2alpha{$key}, 0, 2) if $letter eq $;; - $letter = " " unless $letter =~ /[a-zA-Z]/; - if (!defined($last_letter) || $letter ne $last_letter) { - push(@lines2, "\n") if defined($last_letter); - push(@lines2, "

    " . &protect_html(uc($letter)) . "

    \n"); - push(@lines2, "\n"); - $last_letter = $letter; - } - @refs = (); - foreach (split(/$;/, $ary{$key})) { - push(@refs, &anchor('', $_, $key, 0)); - } - push(@lines2, "
  • " . join(", ", @refs) . "\n"); - } - push(@lines2, "
  • \n") if defined($last_letter); - next; - } - # - # simple style substitutions - # - $_ = &substitute_style($_); - # - # xref - # - while (/\@(x|px|info|)ref{($XREFRE)(}?)/o) { - # note: Texinfo may accept other characters - ($type, $nodes, $full) = ($1, $2, $3); - ($before, $after) = ($`, $'); - if (! $full && $after) { - warn "$ERROR Bad xref (no ending } on line): $_"; - $_ = "$before$;0${type}ref\{$nodes$after"; - next; # while xref - } - if ($type eq 'x') { - $type = 'See '; - } elsif ($type eq 'px') { - $type = 'see '; - } elsif ($type eq 'info') { - $type = 'See Info'; - } elsif ($type eq 'u') { - $type = 'See '; - } else { - $type = ''; - } - unless ($full) { - $next = shift(@lines); - $next = &substitute_style($next); - chop($nodes); # remove final newline - if ($next =~ /\}/) { # split on 2 lines - $nodes .= " $`"; - $after = $'; - } else { - $nodes .= " $next"; - $next = shift(@lines); - $next = &substitute_style($next); - chop($nodes); - if ($next =~ /\}/) { # split on 3 lines - $nodes .= " $`"; - $after = $'; - } else { - warn "$ERROR Bad xref (no ending }): $_"; - $_ = "$before$;0xref\{$nodes$after"; - unshift(@lines, $next); - next; # while xref - } - } - } - $nodes =~ s/\s+/ /g; # remove useless spaces - @args = split(/\s*,\s*/, $nodes); - $node = $args[0]; # the node is always the first arg - &normalise_node($node); - $sec = $node2sec{$node}; - if (@args == 5) { # reference to another manual - $sec = $args[2] || $node; - $man = $args[4] || $args[3]; - $_ = "${before}${type}section `$sec' in \@cite{$man}$after"; - } elsif ($type =~ /Info/) { # inforef - warn "$ERROR Wrong number of arguments: $_" unless @args == 3; - ($nn, $_, $in) = @args; - $_ = "${before}${type} file `$in', node `$nn'$after"; - } elsif ($sec) { - $href = $node2href{$node}; - $_ = "${before}${type}section " . &anchor('', $href, $sec) . $after; - } else { - warn "$ERROR Undefined node ($node): $_"; - $_ = "$before$;0xref{$nodes}$after"; - } - } - # - # try to guess bibliography references or glossary terms - # - # This checked for NAME="SEC\d". The current version is probably broken. - unless (/^
    /) { - $done .= $pre . &anchor('', $href, $what); - } else { - $done .= "$pre$what"; - } - $_ = $post; - } - $_ = $done . $_; - } - if ($use_glossary) { - $done = ''; - while (/\b\w+\b/) { - ($pre, $what, $post) = ($`, $&, $'); - $entry = $what; - $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; - $href = $gloss2href{$entry}; - if (defined($href) && $post !~ /^[^<]*<\/A>/) { - $done .= $pre . &anchor('', $href, $what); - } else { - $done .= "$pre$what"; - } - $_ = $post; - } - $_ = $done . $_; - } - } - # otherwise - push(@lines2, $_); -} -print "# end of pass 2\n" if $verbose; - -# -# split style substitutions -# -while (@lines2) -{ - $_ = shift(@lines2); - # - # special case (protected sections) - # - if (/^$PROTECTTAG/o) { - push(@lines3, $_); - next; - } - # - # split style substitutions - # - $old = ''; - while ($old ne $_) { - $old = $_; - if (/\@(\w+)\{/) { - ($before, $style, $after) = ($`, $1, $'); - if (defined($style_map{$style})) { - $_ = $after; - $text = ''; - $after = ''; - $failed = 1; - while (@lines2) { - if (/\}/) { - $text .= $`; - $after = $'; - $failed = 0; - last; - } else { - $text .= $_; - $_ = shift(@lines2); - } - } - if ($failed) { - die "* Bad syntax (\@$style) after: $before\n"; - } else { - $text = &apply_style($style, $text); - $_ = "$before$text$after"; - } - } - } - } - # otherwise - push(@lines3, $_); -} -print "# end of pass 3\n" if $verbose; - -#+++############################################################################ -# # -# Pass 4: foot notes, final cleanup # -# # -#---############################################################################ - -@foot_lines = (); # footnotes -@doc_lines = (); # final document -$end_of_para = 0; # true if last line is

    - -while (@lines3) -{ - $_ = shift(@lines3); - # - # special case (protected sections) - # - if (/^$PROTECTTAG/o) { - push(@doc_lines, $_); - $end_of_para = 0; - next; - } - # - # footnotes - # - while (/\@footnote([^\{\s]+)\{/) { - ($before, $d, $after) = ($`, $1, $'); - $_ = $after; - $text = ''; - $after = ''; - $failed = 1; - while (@lines3) { - if (/\}/) { - $text .= $`; - $after = $'; - $failed = 0; - last; - } else { - $text .= $_; - $_ = shift(@lines3); - } - } - if ($failed) { - die "* Bad syntax (\@footnote) after: $before\n"; - } else { - $foot_num++; - $docid = "DOCF$foot_num"; - $footid = "FOOT$foot_num"; - $foot = "($foot_num)"; - push(@foot_lines, "

    " . &anchor($footid, "$d#$docid", $foot) . "

    \n"); - $text = "

    $text" unless $text =~ /^\s*

    /; - push(@foot_lines, "$text\n"); - $_ = $before . &anchor($docid, "$docu_foot#$footid", $foot) . $after; - } - } - # - # remove unnecessary

    - # - if (/^\s*

    \s*$/) { - next if $end_of_para++; - } else { - $end_of_para = 0; - } - # otherwise - push(@doc_lines, $_); -} -print "# end of pass 4\n" if $verbose; - -#+++############################################################################ -# # -# Pass 5: print things # -# # -#---############################################################################ - - $header = ''; - $full_title = $value{'_title'} || $value{'_settitle'} || "Untitled Document"; - $title = $value{'_settitle'} || $full_title; - $_ = &substitute_style($full_title); - &unprotect_texi; - s/\n$//; # rmv last \n (if any) - $full_title = "

    " . join("

    \n

    ", split(/\n/, $_)) . "

    \n"; - -# -# print ToC -# -if (!$monolithic && @toc_lines) -{ - if (open(FILE, "> $docu_toc")) { - print "# creating $docu_toc...\n" if $verbose; - &print_toplevel_header("$title - Table of Contents"); - &print_ruler; - &print(*toc_lines, FILE); - &print_toplevel_footer; - close(FILE); - } else { - warn "$ERROR Can't write (toc) to $docu_toc: $!\n"; - } -} - -# -# print footnotes -# -if (!$monolithic && @foot_lines) -{ - if (open(FILE, "> $docu_foot")) { - print "# creating $docu_foot...\n" if $verbose; - &print_toplevel_header("$title - Footnotes"); - &print_ruler; - &print(*foot_lines, FILE); - &print_toplevel_footer; - close(FILE); - } else { - warn "$ERROR Can't write (foot) to $docu_foot: $!\n"; - } -} - -# -# print document -# - -if ($split_chapter || $split_node) -{ # split - $doc_num = 0; - $last_num = scalar(@sections); - $first_doc = &doc_name(1); - $last_doc = &doc_name($last_num); - while (@sections) { - $section = shift(@sections); - &next_doc; - # Remove added links part - if (open(FILE, ">$docu_doc")) { - print "# creating $docu_doc... ($section)\n" if $verbose; - &print_header("$title - $section") unless $opt_empty_headers; - $prev_doc = ($doc_num == 1 ? undef : &doc_name($doc_num - 1)); - $next_doc = ($doc_num == $last_num ? undef : &doc_name($doc_num + 1)); - $navigation = "Go to the "; - $navigation .= ($prev_doc ? &anchor('', $first_doc, "first") : "first"); - $navigation .= ", "; - $navigation .= ($prev_doc ? &anchor('', $prev_doc, "previous") : "previous"); - $navigation .= ", "; - $navigation .= ($next_doc ? &anchor('', $next_doc, "next") : "next"); - $navigation .= ", "; - $navigation .= ($next_doc ? &anchor('', $last_doc, "last") : "last"); - $navigation .= " section, " . &anchor('', $docu_toc, "table of contents") . ".\n"; - print FILE $navigation unless $opt_empty_headers; - &print_ruler unless $opt_empty_headers; - # find corresponding lines - @tmp_lines = (); - while (@doc_lines) { - $_ = shift(@doc_lines); - last if ($_ eq $SPLITTAG); - push(@tmp_lines, $_); - } - &print(*tmp_lines, FILE); - &print_ruler unless $opt_empty_headers; - print FILE $navigation unless $opt_empty_headers; - &print_footer unless $opt_empty_headers; - close(FILE); - } else { - warn "$ERROR Can't write (doc) to $docu_doc: $!\n"; - } - } -} -else -{ # not split - if (open(FILE, ">$docu_doc")) { - print "# creating $docu_doc...\n" if $verbose; - if ($monolithic || !@toc_lines) { - &print_toplevel_header($title); - } else { - &print_header($title); - print FILE $full_title; - } - if ($monolithic && @toc_lines) { - &print_ruler; - print FILE "

    Table of Contents

    \n"; - &print(*toc_lines, FILE); - } - &print_ruler; - &print(*doc_lines, FILE); - if ($monolithic && @foot_lines) { - &print_ruler; - print FILE "

    Footnotes

    \n"; - &print(*foot_lines, FILE); - } - if ($monolithic || !@toc_lines) { - &print_toplevel_footer; - } else { - &print_footer; - } - close(FILE); - } else { - warn "$ERROR Can't write (doc2) to $docu_doc: $!\n"; - } -} - -print "# that's all folks\n" if $verbose; - -#+++############################################################################ -# # -# Low level functions # -# # -#---############################################################################ - -sub update_sec_num -{ - local($name, $level) = @_; - - $level--; # here we start at 0 - if ($name =~ /^appendix/) { - # appendix style - if (defined(@appendix_sec_num)) { - &incr_sec_num($level, @appendix_sec_num); - } else { - @appendix_sec_num = ('A', 0, 0, 0); - } - return(join('.', @appendix_sec_num[0..$level])); - } else { - # normal style - if (defined(@normal_sec_num)) { - &incr_sec_num($level, @normal_sec_num); - } else { - @normal_sec_num = (1, 0, 0, 0); - } - return(join('.', @normal_sec_num[0..$level])); - } -} - -sub incr_sec_num -{ - local($level, $l); - $level = shift(@_); - $_[$level]++; - foreach $l ($level+1 .. 3) { - $_[$l] = 0; - } -} - -sub check -{ - local($_, %seen, %context, $before, $match, $after); - - while (<>) { - if (/\@(\*|\.|\:|\@|\{|\})/) { - $seen{$&}++; - $context{$&} .= "> $_" if $verbose; - $_ = "$`XX$'"; - redo; - } - if (/\@(\w+)/) { - ($before, $match, $after) = ($`, $&, $'); - if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address - $seen{'e-mail address'}++; - $context{'e-mail address'} .= "> $_" if $verbose; - } else { - $seen{$match}++; - $context{$match} .= "> $_" if $verbose; - } - $match =~ s/^\s*\@/X/; - $_ = "$before$match$after"; - redo; - } - } - - foreach (sort(keys(%seen))) { - if ($verbose) { - print "$_\n"; - print $context{$_}; - } else { - print "$_ ($seen{$_})\n"; - } - } -} - -sub open -{ - local($name) = @_; - - ++$fh_name; - if (open($fh_name, $name)) { - unshift(@fhs, $fh_name); - } else { - warn "$ERROR Can't read file $name: $!\n"; - } -} - -sub init_input -{ - @fhs = (); # hold the file handles to read - @input_spool = (); # spooled lines to read - $fh_name = 'FH000'; - &open($docu); -} - -sub next_line -{ - local($fh, $line); - - if (@input_spool) { - $line = shift(@input_spool); - return($line); - } - while (@fhs) { - $fh = $fhs[0]; - $line = <$fh>; - return($line) if $line; - close($fh); - shift(@fhs); - } - return(undef); -} - -# used in pass 1, use &next_line -sub skip_until -{ - local($tag) = @_; - local($_); - - while ($_ = &next_line) { - return if /^\s*\@end\s+$tag\s*$/; - } - die "* Failed to find '$tag' after: " . $lines[$#lines]; -} - -# -# HTML stacking to have a better HTML output -# - -sub html_reset -{ - @html_stack = ('html'); - $html_element = 'body'; -} - -sub html_push -{ - local($what) = @_; - push(@html_stack, $html_element); - $html_element = $what; -} - -sub html_push_if -{ - local($what) = @_; - push(@html_stack, $html_element) - if ($html_element && $html_element ne 'P'); - $html_element = $what; -} - -sub html_pop -{ - $html_element = pop(@html_stack); -} - -sub html_pop_if -{ - local($elt); - - if (@_) { - foreach $elt (@_) { - if ($elt eq $html_element) { - $html_element = pop(@html_stack) if @html_stack; - last; - } - } - } else { - $html_element = pop(@html_stack) if @html_stack; - } -} - -sub html_debug -{ - local($what, $line) = @_; - return("$what") - if $debug & $DEBUG_HTML; - return($what); -} - -# to debug the output... -sub debug -{ - local($what, $line) = @_; - return("$what") - if $debug & $DEBUG_HTML; - return($what); -} - -sub normalise_node -{ - $_[0] =~ s/\s+/ /g; - $_[0] =~ s/ $//; - $_[0] =~ s/^ //; -} - -sub menu_entry -{ - local($entry, $node, $descr) = @_; - local($href); - - &normalise_node($node); - $href = $node2href{$node}; - if ($href) { - $descr =~ s/^\s+//; - $descr = ": $descr" if $descr; - push(@lines2, "
  • " . &anchor('', $href, $entry) . "$descr\n"); - } else { - warn "$ERROR Undefined node ($node): $_"; - } -} - -sub do_ctrl { "^$_[0]" } - -sub do_sc { "\U$_[0]\E" } - -sub fix_image -{ - my($text) = @_; - my($arg1, $ext); - $text =~ /^([^,]*)/; - die "error in image: '$text'" unless defined($1); - $arg1 = $1; - $arg1 =~ s/@@/@/g; - foreach (@include_dirs) { - $ext = "jpg" if -f "$_/$arg1.jpg"; - $ext = "gif" if -f "$_/$arg1.gif"; - } - if (defined($ext)) - { - ""; - } - else - { - warn "Image $arg1 not found"; - ""; - } -} - -sub fix_url -{ - my($text) = @_; - $text =~ s/@@/@/g; - $text; -} - -sub fix_uref -{ - my($text) = @_; - my($arg1, $arg2); - $text =~ /^([^,]*),?([^,]*)?$/; - die "error in uref: '$text'" unless defined($1); - $arg1 = $1; - $arg2 = (defined($2) && $2) ? $2 : $arg1; - $arg1 =~ s/@@/@/g; - $arg2 =~ s/@@/@/g; - "$arg2"; -} - -sub fix_email -{ - my($text) = @_; - my($arg1, $arg2); - $text =~ /^([^,]*)(,[^,]*)?$/; - die "error in email: '$text'" unless defined($1); - $arg1 = $1; - $arg2 = defined($2) ? $2 : $arg1; - $arg1 =~ s/@@/@/g; - $arg2 =~ s/@@/@/g; - "$arg2"; -} - -sub apply_style -{ - local($texi_style, $text) = @_; - local($style); - - $style = $style_map{$texi_style}; - if (defined($style)) { # known style - if ($style =~ /^\"/) { # add quotes - $style = $'; - $text = "\`$text\'"; - } - if ($style =~ /^\&/) { # custom - $style = $'; - $text = &$style($text); - } elsif ($style) { # good style - $text = "<$style>$text"; - } else { # no style - } - } else { # unknown style - $text = undef; - } - return($text); -} - -# remove Texinfo styles -sub remove_style -{ - local($_) = @_; - s/\@\w+{([^\{\}]+)}/$1/g; - return($_); -} - -sub substitute_style -{ - local($_) = @_; - local($changed, $done, $style, $text); - - $changed = 1; - while ($changed) { - $changed = 0; - $done = ''; - while (/\@(\w+){([^\{\}]+)}/) { - $text = &apply_style($1, $2); - if ($text) { - $_ = "$`$text$'"; - $changed = 1; - } else { - $done .= "$`\@$1"; - $_ = "{$2}$'"; - } - } - $_ = $done . $_; - } - return($_); -} - -sub anchor -{ - local($name, $href, $text, $newline) = @_; - local($result); - - $result = "

    \n"; -} - -sub print_header -{ - local($_); - - # clean the title - $_ = &remove_style($_[0]); - &unprotect_texi; - # print the header - if ($doctype eq 'html2') { - print FILE $html2_doctype; - } elsif ($doctype) { - print FILE $doctype; - } - my($tags) = defined($value{"_body_tags"}) ? " " . $value{"_body_tags"} : ""; - my($et) = defined($value{"_extra_head"}) ? " " . $value{"_extra_head"} : ""; - $et = &unprotect_html($et); - print FILE < - - $header - $_ - $et - - -EOT -} - -sub print_toplevel_header -{ - local($_); - - &print_header unless $opt_empty_headers; # pass given arg... - print FILE $full_title; - if ($value{'_subtitle'}) { - $value{'_subtitle'} =~ s/\n+$//; - foreach (split(/\n/, $value{'_subtitle'})) { - $_ = &substitute_style($_); - &unprotect_texi; - print FILE "

    $_

    \n"; - } - } - if ($value{'_author'}) { - $value{'_author'} =~ s/\n+$//; - foreach (split(/\n/, $value{'_author'})) { - $_ = &substitute_style($_); - &unprotect_texi; - s/[\w.-]+\@[\w.-]+/$&<\/A>/g; - print FILE "
    $_
    \n"; - } - } - print FILE "

    \n"; -} - -sub print_footer -{ - print FILE < - -EOT -} - -sub print_toplevel_footer -{ - &print_footer unless $opt_empty_headers; -} - -sub protect_texi -{ - # protect @ { } ` ' - s/\@\@/$;0/go; - s/\@\{/$;1/go; - s/\@\}/$;2/go; - s/\@\`/$;3/go; - s/\@\'/$;4/go; -} - -sub protect_html -{ - local($what) = @_; - # protect & < > - # hack for the two entity-like variable reference in existing examples - $what =~ s/\&(length|ts);/\&\#38;$1;/g; - # this leaves alone entities, but encodes standalone ampersands - $what =~ s/\&(?!([a-z0-9]+|#\d+);)/\&\#38;/ig; - $what =~ s/\/\&\#62;/g; - # but recognize some HTML things - $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g; # - $what =~ s/\&\#60;A ([^\&]+)\&\#62;//g; # - $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;//g; # - return($what); -} - -sub unprotect_texi -{ - s/$;0/\@/go; - s/$;1/\{/go; - s/$;2/\}/go; - s/$;3/\`/go; - s/$;4/\'/go; -} - -sub unprotect_html -{ - local($what) = @_; - $what =~ s/\&\#38;/\&/g; - $what =~ s/\&\#60;/\/g; - return($what); -} - -sub byalpha -{ - $key2alpha{$a} cmp $key2alpha{$b}; -} - -############################################################################## - - # These next few lines are legal in both Perl and nroff. - - .00 ; # finish .ig - - 'di \" finish diversion--previous line must be blank -.nr nl 0-1 \" fake up transition to first page again -.nr % 0 \" start at page 1 -'; __END__ ############# From here on it's a standard manual page ############ -.TH TEXI2HTML 1 "09/10/96" -.AT 3 -.SH NAME -texi2html \- a Texinfo to HTML converter -.SH SYNOPSIS -.B texi2html [options] file -.PP -.B texi2html -check [-verbose] files -.SH DESCRIPTION -.I Texi2html -converts the given Texinfo file to a set of HTML files. It tries to handle -most of the Texinfo commands. It creates hypertext links for cross-references, -footnotes... -.PP -It also tries to add links from a reference to its corresponding entry in the -bibliography (if any). It may also handle a glossary (see the -.B \-glossary -option). -.PP -.I Texi2html -creates several files depending on the contents of the Texinfo file and on -the chosen options (see FILES). -.PP -The HTML files created by -.I texi2html -are closer to TeX than to Info, that's why -.I texi2html -converts @iftex sections and not @ifinfo ones by default. You can reverse -this with the \-expandinfo option. -.SH OPTIONS -.TP 12 -.B \-check -Check the given file and give the list of all things that may be Texinfo commands. -This may be used to check the output of -.I texi2html -to find the Texinfo commands that have been left in the HTML file. -.TP -.B \-expandinfo -Expand @ifinfo sections, not @iftex ones. -.TP -.B \-glossary -Use the section named 'Glossary' to build a list of terms and put links in the HTML -document from each term toward its definition. -.TP -.B \-invisible \fIname\fP -Use \fIname\fP to create invisible destination anchors for index links. This is a workaround -for a known bug of many WWW browsers, including xmosaic. -.TP -.B \-I \fIdir\fP -Look also in \fIdir\fP to find included files. -.TP -.B \-menu -Show the Texinfo menus; by default they are ignored. -.TP -.B \-monolithic -Output only one file, including the table of contents and footnotes. -.TP -.B \-number -Number the sections. -.TP -.B \-split_chapter -Split the output into several HTML files (one per main section: -chapter, appendix...). -.TP -.B \-split_node -Split the output into several HTML files (one per node). -.TP -.B \-usage -Print usage instructions, listing the current available command-line options. -.TP -.B \-verbose -Give a verbose output. Can be used with the -.B \-check -option. -.PP -.SH FILES -By default -.I texi2html -creates the following files (foo being the name of the Texinfo file): -.TP 16 -.B foo_toc.html -The table of contents. -.TP -.B foo.html -The document's contents. -.TP -.B foo_foot.html -The footnotes (if any). -.PP -When used with the -.B \-split -option, it creates several files (one per chapter or node), named -.B foo_n.html -(n being the indice of the chapter or node), instead of the single -.B foo.html -file. -.PP -When used with the -.B \-monolithic -option, it creates only one file: -.B foo.html -.SH VARIABLES -.I texi2html -predefines the following variables: \fBhtml\fP, \fBtexi2html\fP. -.SH ADDITIONAL COMMANDS -.I texi2html -implements the following non-Texinfo commands: -.TP 16 -.B @ifhtml -This indicates the start of an HTML section, this section will passed through -without any modofication. -.TP -.B @end ifhtml -This indcates the end of an HTML section. -.SH VERSION -This is \fItexi2html\fP version 1.52, 09/10/96. -.PP -The latest version of \fItexi2html\fP can be found in WWW, cf. URL -http://wwwcn.cern.ch/dci/texi2html/ -.SH AUTHOR -The main author is Lionel Cons, CERN CN/DCI/UWS, Lionel.Cons@cern.ch. -Many other people around the net contributed to this program. -.SH COPYRIGHT -This program is the intellectual property of the European -Laboratory for Particle Physics (known as CERN). No guarantee whatsoever is -provided by CERN. No liability whatsoever is accepted for any loss or damage -of any kind resulting from any defect or inaccuracy in this information or -code. -.PP -CERN, 1211 Geneva 23, Switzerland -.SH "SEE ALSO" -GNU Texinfo Documentation Format, -HyperText Markup Language (HTML), -World Wide Web (WWW). -.SH BUGS -This program does not understand all Texinfo commands (yet). -.PP -TeX specific commands (normally enclosed in @iftex) will be -passed unmodified. -.ex diff --git a/Docs/Support/texinfo.tex b/Docs/Support/texinfo.tex deleted file mode 100644 index 3299693244b..00000000000 --- a/Docs/Support/texinfo.tex +++ /dev/null @@ -1,5868 +0,0 @@ -% texinfo.tex -- TeX macros to handle Texinfo files. -% -% Load plain if necessary, i.e., if running under initex. -\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi -% -\def\texinfoversion{1999-05-25.6}% -% -% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 -% Free Software Foundation, Inc. -% -% This texinfo.tex file 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; either version 2, or (at -% your option) any later version. -% -% This texinfo.tex file 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 texinfo.tex file; see the file COPYING. If not, write -% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -% Boston, MA 02111-1307, USA. -% -% In other words, you are welcome to use, share and improve this program. -% You are forbidden to forbid anyone else to use, share and improve -% what you give them. Help stamp out software-hoarding! -% -% Please try the latest version of texinfo.tex before submitting bug -% reports; you can get the latest version from: -% ftp://ftp.gnu.org/pub/gnu/texinfo.tex -% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html) -% ftp://tug.org/tex/texinfo.tex -% ftp://ctan.org/macros/texinfo/texinfo.tex -% (and all CTAN mirrors, finger ctan@ctan.org for a list). -% /home/gd/gnu/doc/texinfo.tex on the GNU machines. -% The texinfo.tex in any given Texinfo distribution could well be out -% of date, so if that's what you're using, please check. -% There is a small home page for Texinfo at http://texinfo.org/. -% -% Send bug reports to bug-texinfo@gnu.org. Please include including a -% complete document in each bug report with which we can reproduce the -% problem. Patches are, of course, greatly appreciated. -% -% To process a Texinfo manual with TeX, it's most reliable to use the -% texi2dvi shell script that comes with the distribution. For a simple -% manual foo.texi, however, you can get away with this: -% tex foo.texi -% texindex foo.?? -% tex foo.texi -% tex foo.texi -% dvips foo.dvi -o # or whatever, to process the dvi file; this makes foo.ps. -% The extra runs of TeX get the cross-reference information correct. -% Sometimes one run after texindex suffices, and sometimes you need more -% than two; texi2dvi does it as many times as necessary. -% -% It is possible to adapt texinfo.tex for other languages. You can get -% the existing language-specific files from ftp://ftp.gnu.org/gnu/texinfo/. - -\message{Loading texinfo [version \texinfoversion]:} - -% If in a .fmt file, print the version number -% and turn on active characters that we couldn't do earlier because -% they might have appeared in the input file name. -\everyjob{\message{[Texinfo version \texinfoversion]}% - \catcode`+=\active \catcode`\_=\active} - -% Save some parts of plain tex whose names we will redefine. -\let\ptexb=\b -\let\ptexbullet=\bullet -\let\ptexc=\c -\let\ptexcomma=\, -\let\ptexdot=\. -\let\ptexdots=\dots -\let\ptexend=\end -\let\ptexequiv=\equiv -\let\ptexexclam=\! -\let\ptexi=\i -\let\ptexlbrace=\{ -\let\ptexrbrace=\} -\let\ptexstar=\* -\let\ptext=\t - -% We never want plain's outer \+ definition in Texinfo. -% For @tex, we can use \tabalign. -\let\+ = \relax - -% Get ready for pdf. -\newif\ifpdf -\ifx\pdfoutput\undefined\else - \input pdfcolor - \pdfoutput=1 - \pdftrue -\fi - -\message{Basics,} -\chardef\other=12 - -% If this character appears in an error message or help string, it -% starts a new line in the output. -\newlinechar = `^^J - -% Set up fixed words for English if not already set. -\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi -\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi -\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi -\ifx\putwordin\undefined \gdef\putwordin{in}\fi -\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi -\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi -\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi -\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi -\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi -\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi -\ifx\putwordof\undefined \gdef\putwordof{of}\fi -\ifx\putwordon\undefined \gdef\putwordon{on}\fi -\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi -\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi -\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi -\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi -\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi -\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi -\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi -% -\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi -\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi -\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi -\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi -\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi -\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi -\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi -\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi -\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi -\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi -\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi -\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi -% -\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi -\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi -\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi -\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi -\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi -\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi -\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi - -% Ignore a token. -% -\def\gobble#1{} - -\hyphenation{ap-pen-dix} -\hyphenation{mini-buf-fer mini-buf-fers} -\hyphenation{eshell} -\hyphenation{white-space} - -% Margin to add to right of even pages, to left of odd pages. -\newdimen \bindingoffset -\newdimen \normaloffset -\newdimen\pagewidth \newdimen\pageheight - -% Sometimes it is convenient to have everything in the transcript file -% and nothing on the terminal. We don't just call \tracingall here, -% since that produces some useless output on the terminal. -% -\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% -\ifx\eTeXversion\undefined -\def\loggingall{\tracingcommands2 \tracingstats2 - \tracingpages1 \tracingoutput1 \tracinglostchars1 - \tracingmacros2 \tracingparagraphs1 \tracingrestores1 - \showboxbreadth\maxdimen\showboxdepth\maxdimen -}% -\else -\def\loggingall{\tracingcommands3 \tracingstats2 - \tracingpages1 \tracingoutput1 \tracinglostchars1 - \tracingmacros2 \tracingparagraphs1 \tracingrestores1 - \tracingscantokens1 \tracingassigns1 \tracingifs1 - \tracinggroups1 \tracingnesting2 - \showboxbreadth\maxdimen\showboxdepth\maxdimen -}% -\fi - -% For @cropmarks command. -% Do @cropmarks to get crop marks. -% -\newif\ifcropmarks -\let\cropmarks = \cropmarkstrue -% -% Dimensions to add cropmarks at corners. -% Added by P. A. MacKay, 12 Nov. 1986 -% -\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines -\newdimen\cornerlong \cornerlong=1pc -\newdimen\cornerthick \cornerthick=.3pt -\newdimen\topandbottommargin \topandbottommargin=.75in - -% Main output routine. -\chardef\PAGE = 255 -\output = {\onepageout{\pagecontents\PAGE}} - -\newbox\headlinebox -\newbox\footlinebox - -% \onepageout takes a vbox as an argument. Note that \pagecontents -% does insertions, but you have to call it yourself. -\def\onepageout#1{% - \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi - % - \ifodd\pageno \advance\hoffset by \bindingoffset - \else \advance\hoffset by -\bindingoffset\fi - % - % Do this outside of the \shipout so @code etc. will be expanded in - % the headline as they should be, not taken literally (outputting ''code). - \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% - \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% - % - {% - % Have to do this stuff outside the \shipout because we want it to - % take effect in \write's, yet the group defined by the \vbox ends - % before the \shipout runs. - % - \escapechar = `\\ % use backslash in output files. - \indexdummies % don't expand commands in the output. - \normalturnoffactive % \ in index entries must not stay \, e.g., if - % the page break happens to be in the middle of an example. - \shipout\vbox{% - \ifcropmarks \vbox to \outervsize\bgroup - \hsize = \outerhsize - \vskip-\topandbottommargin - \vtop to0pt{% - \line{\ewtop\hfil\ewtop}% - \nointerlineskip - \line{% - \vbox{\moveleft\cornerthick\nstop}% - \hfill - \vbox{\moveright\cornerthick\nstop}% - }% - \vss}% - \vskip\topandbottommargin - \line\bgroup - \hfil % center the page within the outer (page) hsize. - \ifodd\pageno\hskip\bindingoffset\fi - \vbox\bgroup - \fi - % - \unvbox\headlinebox - \pagebody{#1}% - \ifdim\ht\footlinebox > 0pt - % Only leave this space if the footline is nonempty. - % (We lessened \vsize for it in \oddfootingxxx.) - % The \baselineskip=24pt in plain's \makefootline has no effect. - \vskip 2\baselineskip - \unvbox\footlinebox - \fi - % - \ifpdf\pdfmkdest{\the\pageno}\fi - % - \ifcropmarks - \egroup % end of \vbox\bgroup - \hfil\egroup % end of (centering) \line\bgroup - \vskip\topandbottommargin plus1fill minus1fill - \boxmaxdepth = \cornerthick - \vbox to0pt{\vss - \line{% - \vbox{\moveleft\cornerthick\nsbot}% - \hfill - \vbox{\moveright\cornerthick\nsbot}% - }% - \nointerlineskip - \line{\ewbot\hfil\ewbot}% - }% - \egroup % \vbox from first cropmarks clause - \fi - }% end of \shipout\vbox - }% end of group with \turnoffactive - \advancepageno - \ifnum\outputpenalty>-20000 \else\dosupereject\fi -} - -\newinsert\margin \dimen\margin=\maxdimen - -\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} -{\catcode`\@ =11 -\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi -% marginal hacks, juha@viisa.uucp (Juha Takala) -\ifvoid\margin\else % marginal info is present - \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi -\dimen@=\dp#1 \unvbox#1 -\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi -\ifr@ggedbottom \kern-\dimen@ \vfil \fi} -} - -% Here are the rules for the cropmarks. Note that they are -% offset so that the space between them is truly \outerhsize or \outervsize -% (P. A. MacKay, 12 November, 1986) -% -\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} -\def\nstop{\vbox - {\hrule height\cornerthick depth\cornerlong width\cornerthick}} -\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} -\def\nsbot{\vbox - {\hrule height\cornerlong depth\cornerthick width\cornerthick}} - -% Parse an argument, then pass it to #1. The argument is the rest of -% the input line (except we remove a trailing comment). #1 should be a -% macro which expects an ordinary undelimited TeX argument. -% -\def\parsearg#1{% - \let\next = #1% - \begingroup - \obeylines - \futurelet\temp\parseargx -} - -% If the next token is an obeyed space (from an @example environment or -% the like), remove it and recurse. Otherwise, we're done. -\def\parseargx{% - % \obeyedspace is defined far below, after the definition of \sepspaces. - \ifx\obeyedspace\temp - \expandafter\parseargdiscardspace - \else - \expandafter\parseargline - \fi -} - -% Remove a single space (as the delimiter token to the macro call). -{\obeyspaces % - \gdef\parseargdiscardspace {\futurelet\temp\parseargx}} - -{\obeylines % - \gdef\parseargline#1^^M{% - \endgroup % End of the group started in \parsearg. - % - % First remove any @c comment, then any @comment. - % Result of each macro is put in \toks0. - \argremovec #1\c\relax % - \expandafter\argremovecomment \the\toks0 \comment\relax % - % - % Call the caller's macro, saved as \next in \parsearg. - \expandafter\next\expandafter{\the\toks0}% - }% -} - -% Since all \c{,omment} does is throw away the argument, we can let TeX -% do that for us. The \relax here is matched by the \relax in the call -% in \parseargline; it could be more or less anything, its purpose is -% just to delimit the argument to the \c. -\def\argremovec#1\c#2\relax{\toks0 = {#1}} -\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} - -% \argremovec{,omment} might leave us with trailing spaces, though; e.g., -% @end itemize @c foo -% will have two active spaces as part of the argument with the -% `itemize'. Here we remove all active spaces from #1, and assign the -% result to \toks0. -% -% This loses if there are any *other* active characters besides spaces -% in the argument -- _ ^ +, for example -- since they get expanded. -% Fortunately, Texinfo does not define any such commands. (If it ever -% does, the catcode of the characters in questionwill have to be changed -% here.) But this means we cannot call \removeactivespaces as part of -% \argremovec{,omment}, since @c uses \parsearg, and thus the argument -% that \parsearg gets might well have any character at all in it. -% -\def\removeactivespaces#1{% - \begingroup - \ignoreactivespaces - \edef\temp{#1}% - \global\toks0 = \expandafter{\temp}% - \endgroup -} - -% Change the active space to expand to nothing. -% -\begingroup - \obeyspaces - \gdef\ignoreactivespaces{\obeyspaces\let =\empty} -\endgroup - - -\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} - -%% These are used to keep @begin/@end levels from running away -%% Call \inENV within environments (after a \begingroup) -\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} -\def\ENVcheck{% -\ifENV\errmessage{Still within an environment; press RETURN to continue} -\endgroup\fi} % This is not perfect, but it should reduce lossage - -% @begin foo is the same as @foo, for now. -\newhelp\EMsimple{Press RETURN to continue.} - -\outer\def\begin{\parsearg\beginxxx} - -\def\beginxxx #1{% -\expandafter\ifx\csname #1\endcsname\relax -{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else -\csname #1\endcsname\fi} - -% @end foo executes the definition of \Efoo. -% -\def\end{\parsearg\endxxx} -\def\endxxx #1{% - \removeactivespaces{#1}% - \edef\endthing{\the\toks0}% - % - \expandafter\ifx\csname E\endthing\endcsname\relax - \expandafter\ifx\csname \endthing\endcsname\relax - % There's no \foo, i.e., no ``environment'' foo. - \errhelp = \EMsimple - \errmessage{Undefined command `@end \endthing'}% - \else - \unmatchedenderror\endthing - \fi - \else - % Everything's ok; the right environment has been started. - \csname E\endthing\endcsname - \fi -} - -% There is an environment #1, but it hasn't been started. Give an error. -% -\def\unmatchedenderror#1{% - \errhelp = \EMsimple - \errmessage{This `@end #1' doesn't have a matching `@#1'}% -} - -% Define the control sequence \E#1 to give an unmatched @end error. -% -\def\defineunmatchedend#1{% - \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% -} - - -% Single-spacing is done by various environments (specifically, in -% \nonfillstart and \quotations). -\newskip\singlespaceskip \singlespaceskip = 12.5pt -\def\singlespace{% - % Why was this kern here? It messes up equalizing space above and below - % environments. --karl, 6may93 - %{\advance \baselineskip by -\singlespaceskip - %\kern \baselineskip}% - \setleading \singlespaceskip -} - -%% Simple single-character @ commands - -% @@ prints an @ -% Kludge this until the fonts are right (grr). -\def\@{{\tt\char64}} - -% This is turned off because it was never documented -% and you can use @w{...} around a quote to suppress ligatures. -%% Define @` and @' to be the same as ` and ' -%% but suppressing ligatures. -%\def\`{{`}} -%\def\'{{'}} - -% Used to generate quoted braces. -\def\mylbrace {{\tt\char123}} -\def\myrbrace {{\tt\char125}} -\let\{=\mylbrace -\let\}=\myrbrace -\begingroup - % Definitions to produce actual \{ & \} command in an index. - \catcode`\{ = 12 \catcode`\} = 12 - \catcode`\[ = 1 \catcode`\] = 2 - \catcode`\@ = 0 \catcode`\\ = 12 - @gdef@lbracecmd[\{]% - @gdef@rbracecmd[\}]% -@endgroup - -% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent -% Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H. -\let\, = \c -\let\dotaccent = \. -\def\ringaccent#1{{\accent23 #1}} -\let\tieaccent = \t -\let\ubaraccent = \b -\let\udotaccent = \d - -% Other special characters: @questiondown @exclamdown -% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss. -\def\questiondown{?`} -\def\exclamdown{!`} - -% Dotless i and dotless j, used for accents. -\def\imacro{i} -\def\jmacro{j} -\def\dotless#1{% - \def\temp{#1}% - \ifx\temp\imacro \ptexi - \else\ifx\temp\jmacro \j - \else \errmessage{@dotless can be used only with i or j}% - \fi\fi -} - -% Be sure we're in horizontal mode when doing a tie, since we make space -% equivalent to this in @example-like environments. Otherwise, a space -% at the beginning of a line will start with \penalty -- and -% since \penalty is valid in vertical mode, we'd end up putting the -% penalty on the vertical list instead of in the new paragraph. -{\catcode`@ = 11 - % Avoid using \@M directly, because that causes trouble - % if the definition is written into an index file. - \global\let\tiepenalty = \@M - \gdef\tie{\leavevmode\penalty\tiepenalty\ } -} - -% @: forces normal size whitespace following. -\def\:{\spacefactor=1000 } - -% @* forces a line break. -\def\*{\hfil\break\hbox{}\ignorespaces} - -% @. is an end-of-sentence period. -\def\.{.\spacefactor=3000 } - -% @! is an end-of-sentence bang. -\def\!{!\spacefactor=3000 } - -% @? is an end-of-sentence query. -\def\?{?\spacefactor=3000 } - -% @w prevents a word break. Without the \leavevmode, @w at the -% beginning of a paragraph, when TeX is still in vertical mode, would -% produce a whole line of output instead of starting the paragraph. -\def\w#1{\leavevmode\hbox{#1}} - -% @group ... @end group forces ... to be all on one page, by enclosing -% it in a TeX vbox. We use \vtop instead of \vbox to construct the box -% to keep its height that of a normal line. According to the rules for -% \topskip (p.114 of the TeXbook), the glue inserted is -% max (\topskip - \ht (first item), 0). If that height is large, -% therefore, no glue is inserted, and the space between the headline and -% the text is small, which looks bad. -% -\def\group{\begingroup - \ifnum\catcode13=\active \else - \errhelp = \groupinvalidhelp - \errmessage{@group invalid in context where filling is enabled}% - \fi - % - % The \vtop we start below produces a box with normal height and large - % depth; thus, TeX puts \baselineskip glue before it, and (when the - % next line of text is done) \lineskip glue after it. (See p.82 of - % the TeXbook.) Thus, space below is not quite equal to space - % above. But it's pretty close. - \def\Egroup{% - \egroup % End the \vtop. - \endgroup % End the \group. - }% - % - \vtop\bgroup - % We have to put a strut on the last line in case the @group is in - % the midst of an example, rather than completely enclosing it. - % Otherwise, the interline space between the last line of the group - % and the first line afterwards is too small. But we can't put the - % strut in \Egroup, since there it would be on a line by itself. - % Hence this just inserts a strut at the beginning of each line. - \everypar = {\strut}% - % - % Since we have a strut on every line, we don't need any of TeX's - % normal interline spacing. - \offinterlineskip - % - % OK, but now we have to do something about blank - % lines in the input in @example-like environments, which normally - % just turn into \lisppar, which will insert no space now that we've - % turned off the interline space. Simplest is to make them be an - % empty paragraph. - \ifx\par\lisppar - \edef\par{\leavevmode \par}% - % - % Reset ^^M's definition to new definition of \par. - \obeylines - \fi - % - % Do @comment since we are called inside an environment such as - % @example, where each end-of-line in the input causes an - % end-of-line in the output. We don't want the end-of-line after - % the `@group' to put extra space in the output. Since @group - % should appear on a line by itself (according to the Texinfo - % manual), we don't worry about eating any user text. - \comment -} -% -% TeX puts in an \escapechar (i.e., `@') at the beginning of the help -% message, so this ends up printing `@group can only ...'. -% -\newhelp\groupinvalidhelp{% -group can only be used in environments such as @example,^^J% -where each line of input produces a line of output.} - -% @need space-in-mils -% forces a page break if there is not space-in-mils remaining. - -\newdimen\mil \mil=0.001in - -\def\need{\parsearg\needx} - -% Old definition--didn't work. -%\def\needx #1{\par % -%% This method tries to make TeX break the page naturally -%% if the depth of the box does not fit. -%{\baselineskip=0pt% -%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak -%\prevdepth=-1000pt -%}} - -\def\needx#1{% - % Go into vertical mode, so we don't make a big box in the middle of a - % paragraph. - \par - % - % Don't add any leading before our big empty box, but allow a page - % break, since the best break might be right here. - \allowbreak - \nointerlineskip - \vtop to #1\mil{\vfil}% - % - % TeX does not even consider page breaks if a penalty added to the - % main vertical list is 10000 or more. But in order to see if the - % empty box we just added fits on the page, we must make it consider - % page breaks. On the other hand, we don't want to actually break the - % page after the empty box. So we use a penalty of 9999. - % - % There is an extremely small chance that TeX will actually break the - % page at this \penalty, if there are no other feasible breakpoints in - % sight. (If the user is using lots of big @group commands, which - % almost-but-not-quite fill up a page, TeX will have a hard time doing - % good page breaking, for example.) However, I could not construct an - % example where a page broke at this \penalty; if it happens in a real - % document, then we can reconsider our strategy. - \penalty9999 - % - % Back up by the size of the box, whether we did a page break or not. - \kern -#1\mil - % - % Do not allow a page break right after this kern. - \nobreak -} - -% @br forces paragraph break - -\let\br = \par - -% @dots{} output an ellipsis using the current font. -% We do .5em per period so that it has the same spacing in a typewriter -% font as three actual period characters. -% -\def\dots{% - \leavevmode - \hbox to 1.5em{% - \hskip 0pt plus 0.25fil minus 0.25fil - .\hss.\hss.% - \hskip 0pt plus 0.5fil minus 0.5fil - }% -} - -% @enddots{} is an end-of-sentence ellipsis. -% -\def\enddots{% - \leavevmode - \hbox to 2em{% - \hskip 0pt plus 0.25fil minus 0.25fil - .\hss.\hss.\hss.% - \hskip 0pt plus 0.5fil minus 0.5fil - }% - \spacefactor=3000 -} - - -% @page forces the start of a new page -% -\def\page{\par\vfill\supereject} - -% @exdent text.... -% outputs text on separate line in roman font, starting at standard page margin - -% This records the amount of indent in the innermost environment. -% That's how much \exdent should take out. -\newskip\exdentamount - -% This defn is used inside fill environments such as @defun. -\def\exdent{\parsearg\exdentyyy} -\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} - -% This defn is used inside nofill environments such as @example. -\def\nofillexdent{\parsearg\nofillexdentyyy} -\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount -\leftline{\hskip\leftskip{\rm#1}}}} - -% @inmargin{TEXT} puts TEXT in the margin next to the current paragraph. - -\def\inmargin#1{% -\strut\vadjust{\nobreak\kern-\strutdepth - \vtop to \strutdepth{\baselineskip\strutdepth\vss - \llap{\rightskip=\inmarginspacing \vbox{\noindent #1}}\null}}} -\newskip\inmarginspacing \inmarginspacing=1cm -\def\strutdepth{\dp\strutbox} - -%\hbox{{\rm#1}}\hfil\break}} - -% @include file insert text of that file as input. -% Allow normal characters that we make active in the argument (a file name). -\def\include{\begingroup - \catcode`\\=12 - \catcode`~=12 - \catcode`^=12 - \catcode`_=12 - \catcode`|=12 - \catcode`<=12 - \catcode`>=12 - \catcode`+=12 - \parsearg\includezzz} -% Restore active chars for included file. -\def\includezzz#1{\endgroup\begingroup - % Read the included file in a group so nested @include's work. - \def\thisfile{#1}% - \input\thisfile -\endgroup} - -\def\thisfile{} - -% @center line outputs that line, centered - -\def\center{\parsearg\centerzzz} -\def\centerzzz #1{{\advance\hsize by -\leftskip -\advance\hsize by -\rightskip -\centerline{#1}}} - -% @sp n outputs n lines of vertical space - -\def\sp{\parsearg\spxxx} -\def\spxxx #1{\vskip #1\baselineskip} - -% @comment ...line which is ignored... -% @c is the same as @comment -% @ignore ... @end ignore is another way to write a comment - -\def\comment{\begingroup \catcode`\^^M=\other% -\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% -\commentxxx} -{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} - -\let\c=\comment - -% @paragraphindent NCHARS -% We'll use ems for NCHARS, close enough. -% We cannot implement @paragraphindent asis, though. -% -\def\asisword{asis} % no translation, these are keywords -\def\noneword{none} -% -\def\paragraphindent{\parsearg\doparagraphindent} -\def\doparagraphindent#1{% - \def\temp{#1}% - \ifx\temp\asisword - \else - \ifx\temp\noneword - \defaultparindent = 0pt - \else - \defaultparindent = #1em - \fi - \fi - \parindent = \defaultparindent -} - -% @exampleindent NCHARS -% We'll use ems for NCHARS like @paragraphindent. -% It seems @exampleindent asis isn't necessary, but -% I preserve it to make it similar to @paragraphindent. -\def\exampleindent{\parsearg\doexampleindent} -\def\doexampleindent#1{% - \def\temp{#1}% - \ifx\temp\asisword - \else - \ifx\temp\noneword - \lispnarrowing = 0pt - \else - \lispnarrowing = #1em - \fi - \fi -} - -% @asis just yields its argument. Used with @table, for example. -% -\def\asis#1{#1} - -% @math means output in math mode. -% We don't use $'s directly in the definition of \math because control -% sequences like \math are expanded when the toc file is written. Then, -% we read the toc file back, the $'s will be normal characters (as they -% should be, according to the definition of Texinfo). So we must use a -% control sequence to switch into and out of math mode. -% -% This isn't quite enough for @math to work properly in indices, but it -% seems unlikely it will ever be needed there. -% -\let\implicitmath = $ -\def\math#1{\implicitmath #1\implicitmath} - -% @bullet and @minus need the same treatment as @math, just above. -\def\bullet{\implicitmath\ptexbullet\implicitmath} -\def\minus{\implicitmath-\implicitmath} - -% @refill is a no-op. -\let\refill=\relax - -% If working on a large document in chapters, it is convenient to -% be able to disable indexing, cross-referencing, and contents, for test runs. -% This is done with @novalidate (before @setfilename). -% -\newif\iflinks \linkstrue % by default we want the aux files. -\let\novalidate = \linksfalse - -% @setfilename is done at the beginning of every texinfo file. -% So open here the files we need to have open while reading the input. -% This makes it possible to make a .fmt file for texinfo. -\def\setfilename{% - \iflinks - \readauxfile - \fi % \openindices needs to do some work in any case. - \openindices - \fixbackslash % Turn off hack to swallow `\input texinfo'. - \global\let\setfilename=\comment % Ignore extra @setfilename cmds. - % - % If texinfo.cnf is present on the system, read it. - % Useful for site-wide @afourpaper, etc. - % Just to be on the safe side, close the input stream before the \input. - \openin 1 texinfo.cnf - \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi - \closein1 - \temp - % - \comment % Ignore the actual filename. -} - -% Called from \setfilename. -% -\def\openindices{% - \newindex{cp}% - \newcodeindex{fn}% - \newcodeindex{vr}% - \newcodeindex{tp}% - \newcodeindex{ky}% - \newcodeindex{pg}% -} - -% @bye. -\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} - - -\message{pdf,} -% adobe `portable' document format - -\newcount\tempnum -\newcount\lnkcount -\newtoks\filename -\newcount\filenamelength -\newcount\pgn - -\ifpdf -\def\pdfmkdest#1{\pdfdest name{#1@} xyz} -\def\pdfmkpgn#1{#1@} - -% Adding outlines to PDF; macros for calculating structure of outlines -% come from Petr Olsak -\def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% - \else \csname#1\endcsname \fi} -\def\advancenumber#1{\tempnum=\expnumber{#1}\relax - \advance\tempnum by1 - \expandafter\xdef\csname#1\endcsname{\the\tempnum}} -\def\pdfmakeoutlines{{% - \openin 1 \jobname.toc - \ifeof 1\else\bgroup - \closein 1 - \def\code##1{##1} - \def\file##1{##1} - \def\TeX##1{TeX} - \def\tt{} - \def\char{char} - \def\samp##1{##1} - \def\kbd##1{##1} - \def\key##1{##1} - \def\rawbackslashxx{\string\\} - \def\chapentry ##1##2##3{} - \def\unnumbchapentry ##1##2{} - \def\secentry ##1##2##3##4{\advancenumber{chap##2}} - \def\unnumbsecentry ##1##2{} - \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}} - \def\unnumbsubsecentry ##1##2{} - \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}} - \def\unnumbsubsubsecentry ##1##2{} - \input \jobname.toc - \def\chapentry ##1##2##3{% - \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}} - \def\unnumbchapentry ##1##2{% - \pdfoutline goto name{\pdfmkpgn{##2}}{##1}} - \def\secentry ##1##2##3##4{% - \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}} - \def\unnumbsecentry ##1##2{% - \pdfoutline goto name{\pdfmkpgn{##2}}{##1}} - \def\subsecentry ##1##2##3##4##5{% - \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}} - \def\unnumbsubsecentry ##1##2{% - \pdfoutline goto name{\pdfmkpgn{##2}}{##1}} - \def\subsubsecentry ##1##2##3##4##5##6{% - \pdfoutline goto name{\pdfmkpgn{##6}}{##1}} - \def\unnumbsubsubsecentry ##1##2{% - \pdfoutline goto name{\pdfmkpgn{##2}}{##1}} - \input \jobname.toc - \egroup\fi -}} -\pdfmakeoutlines - -\def\makelinks #1,{% - \def\params{#1}\def\E{END}% - \ifx\params\E - \let\nextmakelinks=\relax - \else - \let\nextmakelinks=\makelinks - \ifnum\lnkcount>0,\fi - \picknum{#1}% - \Blue\pdfannotlink attr{/Border [0 0 0]} - goto name{\pdfmkpgn{\the\pgn}}% - #1% - \advance\lnkcount by 1% - \Black\pdfendlink - \fi - \nextmakelinks -} - -\def\picknum#1{\expandafter\pn#1} -\def\pn#1{% - \def\p{#1}% - \ifx\p\lbrace - \let\nextpn=\ppn - \else - \let\nextpn=\ppnn - \def\first{#1} - \fi - \nextpn -} -\def\ppn#1{\pgn=#1\gobble} -\def\ppnn{\pgn=\first} -\def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,} - -\def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} -\def\skipspaces#1{\def\PP{#1}\def\D{|}% - \ifx\PP\D\let\nextsp\relax - \else\let\nextsp\skipspaces - \ifx\p\space\else\addtokens{\filename}{\PP}% - \advance\filenamelength by 1 - \fi - \fi - \nextsp} -\def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} - -\def\pdflink#1{% - \leavevmode\Red - \begingroup - \normalturnoffactive\def\@{@}% - \pdfannotlink - attr{/Border [0 0 0]}% - user{/Subtype /Link /A << /S /URI /URI (#1) >>}% - \endgroup -} - -\else -\let\pdflink = \gobble -\fi % end \ifpdf - -\message{fonts,} -% Font-change commands. - -% Texinfo sort of supports the sans serif font style, which plain TeX does not. -% So we set up a \sf analogous to plain's \rm, etc. -\newfam\sffam -\def\sf{\fam=\sffam \tensf} -\let\li = \sf % Sometimes we call it \li, not \sf. - -% We don't need math for this one. -\def\ttsl{\tenttsl} - -% Use Computer Modern fonts at \magstephalf (11pt). -\newcount\mainmagstep -\mainmagstep=\magstephalf - -% Set the font macro #1 to the font named #2, adding on the -% specified font prefix (normally `cm'). -% #3 is the font's design size, #4 is a scale factor -\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} - -% Use cm as the default font prefix. -% To specify the font prefix, you must define \fontprefix -% before you read in texinfo.tex. -\ifx\fontprefix\undefined -\def\fontprefix{cm} -\fi -% Support font families that don't use the same naming scheme as CM. -\def\rmshape{r} -\def\rmbshape{bx} %where the normal face is bold -\def\bfshape{b} -\def\bxshape{bx} -\def\ttshape{tt} -\def\ttbshape{tt} -\def\ttslshape{sltt} -\def\itshape{ti} -\def\itbshape{bxti} -\def\slshape{sl} -\def\slbshape{bxsl} -\def\sfshape{ss} -\def\sfbshape{ss} -\def\scshape{csc} -\def\scbshape{csc} - -\ifx\bigger\relax -\let\mainmagstep=\magstep1 -\setfont\textrm\rmshape{12}{1000} -\setfont\texttt\ttshape{12}{1000} -\else -\setfont\textrm\rmshape{10}{\mainmagstep} -\setfont\texttt\ttshape{10}{\mainmagstep} -\fi -% Instead of cmb10, you many want to use cmbx10. -% cmbx10 is a prettier font on its own, but cmb10 -% looks better when embedded in a line with cmr10. -\setfont\textbf\bfshape{10}{\mainmagstep} -\setfont\textit\itshape{10}{\mainmagstep} -\setfont\textsl\slshape{10}{\mainmagstep} -\setfont\textsf\sfshape{10}{\mainmagstep} -\setfont\textsc\scshape{10}{\mainmagstep} -\setfont\textttsl\ttslshape{10}{\mainmagstep} -\font\texti=cmmi10 scaled \mainmagstep -\font\textsy=cmsy10 scaled \mainmagstep - -% A few fonts for @defun, etc. -\setfont\defbf\bxshape{10}{\magstep1} %was 1314 -\setfont\deftt\ttshape{10}{\magstep1} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} - -% Fonts for indices and small examples (9pt). -% We actually use the slanted font rather than the italic, -% because texinfo normally uses the slanted fonts for that. -% Do not make many font distinctions in general in the index, since they -% aren't very useful. -\setfont\ninett\ttshape{9}{1000} -\setfont\ninettsl\ttslshape{10}{900} -\setfont\indrm\rmshape{9}{1000} -\setfont\indit\itshape{9}{1000} -\setfont\indsl\slshape{9}{1000} -\let\indtt=\ninett -\let\indttsl=\ninettsl -\let\indsf=\indrm -\let\indbf=\indrm -\setfont\indsc\scshape{10}{900} -\font\indi=cmmi9 -\font\indsy=cmsy9 - -% Fonts for title page: -\setfont\titlerm\rmbshape{12}{\magstep3} -\setfont\titleit\itbshape{10}{\magstep4} -\setfont\titlesl\slbshape{10}{\magstep4} -\setfont\titlett\ttbshape{12}{\magstep3} -\setfont\titlettsl\ttslshape{10}{\magstep4} -\setfont\titlesf\sfbshape{17}{\magstep1} -\let\titlebf=\titlerm -\setfont\titlesc\scbshape{10}{\magstep4} -\font\titlei=cmmi12 scaled \magstep3 -\font\titlesy=cmsy10 scaled \magstep4 -\def\authorrm{\secrm} - -% Chapter (and unnumbered) fonts (17.28pt). -\setfont\chaprm\rmbshape{12}{\magstep2} -\setfont\chapit\itbshape{10}{\magstep3} -\setfont\chapsl\slbshape{10}{\magstep3} -\setfont\chaptt\ttbshape{12}{\magstep2} -\setfont\chapttsl\ttslshape{10}{\magstep3} -\setfont\chapsf\sfbshape{17}{1000} -\let\chapbf=\chaprm -\setfont\chapsc\scbshape{10}{\magstep3} -\font\chapi=cmmi12 scaled \magstep2 -\font\chapsy=cmsy10 scaled \magstep3 - -% Section fonts (14.4pt). -\setfont\secrm\rmbshape{12}{\magstep1} -\setfont\secit\itbshape{10}{\magstep2} -\setfont\secsl\slbshape{10}{\magstep2} -\setfont\sectt\ttbshape{12}{\magstep1} -\setfont\secttsl\ttslshape{10}{\magstep2} -\setfont\secsf\sfbshape{12}{\magstep1} -\let\secbf\secrm -\setfont\secsc\scbshape{10}{\magstep2} -\font\seci=cmmi12 scaled \magstep1 -\font\secsy=cmsy10 scaled \magstep2 - -% \setfont\ssecrm\bxshape{10}{\magstep1} % This size an font looked bad. -% \setfont\ssecit\itshape{10}{\magstep1} % The letters were too crowded. -% \setfont\ssecsl\slshape{10}{\magstep1} -% \setfont\ssectt\ttshape{10}{\magstep1} -% \setfont\ssecsf\sfshape{10}{\magstep1} - -%\setfont\ssecrm\bfshape{10}{1315} % Note the use of cmb rather than cmbx. -%\setfont\ssecit\itshape{10}{1315} % Also, the size is a little larger than -%\setfont\ssecsl\slshape{10}{1315} % being scaled magstep1. -%\setfont\ssectt\ttshape{10}{1315} -%\setfont\ssecsf\sfshape{10}{1315} - -%\let\ssecbf=\ssecrm - -% Subsection fonts (13.15pt). -\setfont\ssecrm\rmbshape{12}{\magstephalf} -\setfont\ssecit\itbshape{10}{1315} -\setfont\ssecsl\slbshape{10}{1315} -\setfont\ssectt\ttbshape{12}{\magstephalf} -\setfont\ssecttsl\ttslshape{10}{1315} -\setfont\ssecsf\sfbshape{12}{\magstephalf} -\let\ssecbf\ssecrm -\setfont\ssecsc\scbshape{10}{\magstep1} -\font\sseci=cmmi12 scaled \magstephalf -\font\ssecsy=cmsy10 scaled 1315 -% The smallcaps and symbol fonts should actually be scaled \magstep1.5, -% but that is not a standard magnification. - -% In order for the font changes to affect most math symbols and letters, -% we have to define the \textfont of the standard families. Since -% texinfo doesn't allow for producing subscripts and superscripts, we -% don't bother to reset \scriptfont and \scriptscriptfont (which would -% also require loading a lot more fonts). -% -\def\resetmathfonts{% - \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy - \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf - \textfont\ttfam = \tentt \textfont\sffam = \tensf -} - - -% The font-changing commands redefine the meanings of \tenSTYLE, instead -% of just \STYLE. We do this so that font changes will continue to work -% in math mode, where it is the current \fam that is relevant in most -% cases, not the current font. Plain TeX does \def\bf{\fam=\bffam -% \tenbf}, for example. By redefining \tenbf, we obviate the need to -% redefine \bf itself. -\def\textfonts{% - \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl - \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc - \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl - \resetmathfonts} -\def\titlefonts{% - \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl - \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc - \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy - \let\tenttsl=\titlettsl - \resetmathfonts \setleading{25pt}} -\def\titlefont#1{{\titlefonts\rm #1}} -\def\chapfonts{% - \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl - \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc - \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl - \resetmathfonts \setleading{19pt}} -\def\secfonts{% - \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl - \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc - \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl - \resetmathfonts \setleading{16pt}} -\def\subsecfonts{% - \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl - \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc - \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl - \resetmathfonts \setleading{15pt}} -\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? -\def\indexfonts{% - \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl - \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc - \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl - \resetmathfonts \setleading{12pt}} - -% Set up the default fonts, so we can use them for creating boxes. -% -\textfonts - -% Define these so they can be easily changed for other fonts. -\def\angleleft{$\langle$} -\def\angleright{$\rangle$} - -% Count depth in font-changes, for error checks -\newcount\fontdepth \fontdepth=0 - -% Fonts for short table of contents. -\setfont\shortcontrm\rmshape{12}{1000} -\setfont\shortcontbf\bxshape{12}{1000} -\setfont\shortcontsl\slshape{12}{1000} - -%% Add scribe-like font environments, plus @l for inline lisp (usually sans -%% serif) and @ii for TeX italic - -% \smartitalic{ARG} outputs arg in italics, followed by an italic correction -% unless the following character is such as not to need one. -\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} -\def\smartslanted#1{{\sl #1}\futurelet\next\smartitalicx} -\def\smartitalic#1{{\it #1}\futurelet\next\smartitalicx} - -\let\i=\smartitalic -\let\var=\smartslanted -\let\dfn=\smartslanted -\let\emph=\smartitalic -\let\cite=\smartslanted - -\def\b#1{{\bf #1}} -\let\strong=\b - -% We can't just use \exhyphenpenalty, because that only has effect at -% the end of a paragraph. Restore normal hyphenation at the end of the -% group within which \nohyphenation is presumably called. -% -\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} -\def\restorehyphenation{\hyphenchar\font = `- } - -\def\t#1{% - {\tt \rawbackslash \frenchspacing #1}% - \null -} -\let\ttfont=\t -\def\samp#1{`\tclose{#1}'\null} -\setfont\smallrm\rmshape{8}{1000} -\font\smallsy=cmsy9 -\def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{% - \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% - \vbox{\hrule\kern-0.4pt - \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% - \kern-0.4pt\hrule}% - \kern-.06em\raise0.4pt\hbox{\angleright}}}} -% The old definition, with no lozenge: -%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} -\def\ctrl #1{{\tt \rawbackslash \hat}#1} - -% @file, @option are the same as @samp. -\let\file=\samp -\let\option=\samp - -% @code is a modification of @t, -% which makes spaces the same size as normal in the surrounding text. -\def\tclose#1{% - {% - % Change normal interword space to be same as for the current font. - \spaceskip = \fontdimen2\font - % - % Switch to typewriter. - \tt - % - % But `\ ' produces the large typewriter interword space. - \def\ {{\spaceskip = 0pt{} }}% - % - % Turn off hyphenation. - \nohyphenation - % - \rawbackslash - \frenchspacing - #1% - }% - \null -} - -% We *must* turn on hyphenation at `-' and `_' in \code. -% Otherwise, it is too hard to avoid overfull hboxes -% in the Emacs manual, the Library manual, etc. - -% Unfortunately, TeX uses one parameter (\hyphenchar) to control -% both hyphenation at - and hyphenation within words. -% We must therefore turn them both off (\tclose does that) -% and arrange explicitly to hyphenate at a dash. -% -- rms. -{ - \catcode`\-=\active - \catcode`\_=\active - % - \global\def\code{\begingroup - \catcode`\-=\active \let-\codedash - \catcode`\_=\active \let_\codeunder - \codex - } - % - % If we end up with any active - characters when handling the index, - % just treat them as a normal -. - \global\def\indexbreaks{\catcode`\-=\active \let-\realdash} -} - -\def\realdash{-} -\def\codedash{-\discretionary{}{}{}} -\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}} -\def\codex #1{\tclose{#1}\endgroup} - -%\let\exp=\tclose %Was temporary - -% @kbd is like @code, except that if the argument is just one @key command, -% then @kbd has no effect. - -% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), -% `example' (@kbd uses ttsl only inside of @example and friends), -% or `code' (@kbd uses normal tty font always). -\def\kbdinputstyle{\parsearg\kbdinputstylexxx} -\def\kbdinputstylexxx#1{% - \def\arg{#1}% - \ifx\arg\worddistinct - \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% - \else\ifx\arg\wordexample - \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% - \else\ifx\arg\wordcode - \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% - \fi\fi\fi -} -\def\worddistinct{distinct} -\def\wordexample{example} -\def\wordcode{code} - -% Default is kbdinputdistinct. (Too much of a hassle to call the macro, -% the catcodes are wrong for parsearg to work.) -\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl} - -\def\xkey{\key} -\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% -\ifx\one\xkey\ifx\threex\three \key{#2}% -\else{\tclose{\kbdfont\look}}\fi -\else{\tclose{\kbdfont\look}}\fi} - -% For @url, @env, @command quotes seem unnecessary, so use \code. -\let\url=\code -\let\env=\code -\let\command=\code - -% @uref (abbreviation for `urlref') takes an optional (comma-separated) -% second argument specifying the text to display and an optional third -% arg as text to display instead of (rather than in addition to) the url -% itself. First (mandatory) arg is the url. Perhaps eventually put in -% a hypertex \special here. -% -\def\uref#1{\douref #1,,,\finish} -\def\douref#1,#2,#3,#4\finish{% - \pdflink{#1}% - \setbox0 = \hbox{\ignorespaces #3}% - \ifdim\wd0 > 0pt - \unhbox0 % third arg given, show only that - \else - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0 > 0pt - \ifpdf - \unhbox0 % PDF: 2nd arg given, show only it - \else - \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url - \fi - \else - \code{#1}% only url given, so show it - \fi - \fi - % - \ifpdf - \Black\pdfendlink - \fi -} - -% rms does not like angle brackets --karl, 17may97. -% So now @email is just like @uref, unless we are pdf. -% -%\def\email#1{\angleleft{\tt #1}\angleright} -\ifpdf - \def\email#1{\doemail#1,,\finish} - \def\doemail#1,#2,#3\finish{% - \pdflink{mailto:#1}% - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi - \Black\pdfendlink - } -\else - \let\email=\uref -\fi - -% Check if we are currently using a typewriter font. Since all the -% Computer Modern typewriter fonts have zero interword stretch (and -% shrink), and it is reasonable to expect all typewriter fonts to have -% this property, we can check that font parameter. -% -\def\ifmonospace{\ifdim\fontdimen3\font=0pt } - -% Typeset a dimension, e.g., `in' or `pt'. The only reason for the -% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. -% -\def\dmn#1{\thinspace #1} - -\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} - -% @l was never documented to mean ``switch to the Lisp font'', -% and it is not used as such in any manual I can find. We need it for -% Polish suppressed-l. --karl, 22sep96. -%\def\l#1{{\li #1}\null} - -% Explicit font changes: @r, @sc, undocumented @ii. -\def\r#1{{\rm #1}} % roman font -\def\sc#1{{\smallcaps#1}} % smallcaps font -\def\ii#1{{\it #1}} % italic font - -% @acronym downcases the argument and prints in smallcaps. -\def\acronym#1{{\smallcaps \lowercase{#1}}} - -% @pounds{} is a sterling sign. -\def\pounds{{\it\$}} - - -\message{page headings,} - -\newskip\titlepagetopglue \titlepagetopglue = 1.5in -\newskip\titlepagebottomglue \titlepagebottomglue = 2pc - -% First the title page. Must do @settitle before @titlepage. -\newif\ifseenauthor -\newif\iffinishedtitlepage - -% Do an implicit @contents or @shortcontents after @end titlepage if the -% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. -% -\newif\ifsetcontentsaftertitlepage - \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue -\newif\ifsetshortcontentsaftertitlepage - \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue - -\def\shorttitlepage{\parsearg\shorttitlepagezzz} -\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% - \endgroup\page\hbox{}\page} - -\def\titlepage{\begingroup \parindent=0pt \textfonts - \let\subtitlerm=\tenrm - \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% - % - \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}% - % - % Leave some space at the very top of the page. - \vglue\titlepagetopglue - % - % Now you can print the title using @title. - \def\title{\parsearg\titlezzz}% - \def\titlezzz##1{\leftline{\titlefonts\rm ##1} - % print a rule at the page bottom also. - \finishedtitlepagefalse - \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% - % No rule at page bottom unless we print one at the top with @title. - \finishedtitlepagetrue - % - % Now you can put text using @subtitle. - \def\subtitle{\parsearg\subtitlezzz}% - \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% - % - % @author should come last, but may come many times. - \def\author{\parsearg\authorzzz}% - \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi - {\authorfont \leftline{##1}}}% - % - % Most title ``pages'' are actually two pages long, with space - % at the top of the second. We don't want the ragged left on the second. - \let\oldpage = \page - \def\page{% - \iffinishedtitlepage\else - \finishtitlepage - \fi - \oldpage - \let\page = \oldpage - \hbox{}}% -% \def\page{\oldpage \hbox{}} -} - -\def\Etitlepage{% - \iffinishedtitlepage\else - \finishtitlepage - \fi - % It is important to do the page break before ending the group, - % because the headline and footline are only empty inside the group. - % If we use the new definition of \page, we always get a blank page - % after the title page, which we certainly don't want. - \oldpage - \endgroup - % - % If they want short, they certainly want long too. - \ifsetshortcontentsaftertitlepage - \shortcontents - \contents - \global\let\shortcontents = \relax - \global\let\contents = \relax - \fi - % - \ifsetcontentsaftertitlepage - \contents - \global\let\contents = \relax - \global\let\shortcontents = \relax - \fi - % - \HEADINGSon -} - -\def\finishtitlepage{% - \vskip4pt \hrule height 2pt width \hsize - \vskip\titlepagebottomglue - \finishedtitlepagetrue -} - -%%% Set up page headings and footings. - -\let\thispage=\folio - -\newtoks\evenheadline % headline on even pages -\newtoks\oddheadline % headline on odd pages -\newtoks\evenfootline % footline on even pages -\newtoks\oddfootline % footline on odd pages - -% Now make Tex use those variables -\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline - \else \the\evenheadline \fi}} -\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline - \else \the\evenfootline \fi}\HEADINGShook} -\let\HEADINGShook=\relax - -% Commands to set those variables. -% For example, this is what @headings on does -% @evenheading @thistitle|@thispage|@thischapter -% @oddheading @thischapter|@thispage|@thistitle -% @evenfooting @thisfile|| -% @oddfooting ||@thisfile - -\def\evenheading{\parsearg\evenheadingxxx} -\def\oddheading{\parsearg\oddheadingxxx} -\def\everyheading{\parsearg\everyheadingxxx} - -\def\evenfooting{\parsearg\evenfootingxxx} -\def\oddfooting{\parsearg\oddfootingxxx} -\def\everyfooting{\parsearg\everyfootingxxx} - -{\catcode`\@=0 % - -\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} -\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% -\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} -\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% -\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}% - -\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} -\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% -\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} -\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% - \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% - % - % Leave some space for the footline. Hopefully ok to assume - % @evenfooting will not be used by itself. - \global\advance\pageheight by -\baselineskip - \global\advance\vsize by -\baselineskip -} - -\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}} -% -}% unbind the catcode of @. - -% @headings double turns headings on for double-sided printing. -% @headings single turns headings on for single-sided printing. -% @headings off turns them off. -% @headings on same as @headings double, retained for compatibility. -% @headings after turns on double-sided headings after this page. -% @headings doubleafter turns on double-sided headings after this page. -% @headings singleafter turns on single-sided headings after this page. -% By default, they are off at the start of a document, -% and turned `on' after @end titlepage. - -\def\headings #1 {\csname HEADINGS#1\endcsname} - -\def\HEADINGSoff{ -\global\evenheadline={\hfil} \global\evenfootline={\hfil} -\global\oddheadline={\hfil} \global\oddfootline={\hfil}} -\HEADINGSoff -% When we turn headings on, set the page number to 1. -% For double-sided printing, put current file name in lower left corner, -% chapter name on inside top of right hand pages, document -% title on inside top of left hand pages, and page numbers on outside top -% edge of all pages. -\def\HEADINGSdouble{ -\global\pageno=1 -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chapoddpage -} -\let\contentsalignmacro = \chappager - -% For single-sided printing, chapter title goes across top left of page, -% page number on top right. -\def\HEADINGSsingle{ -\global\pageno=1 -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chappager -} -\def\HEADINGSon{\HEADINGSdouble} - -\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} -\let\HEADINGSdoubleafter=\HEADINGSafter -\def\HEADINGSdoublex{% -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chapoddpage -} - -\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} -\def\HEADINGSsinglex{% -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\let\contentsalignmacro = \chappager -} - -% Subroutines used in generating headings -% Produces Day Month Year style of output. -\def\today{% - \number\day\space - \ifcase\month - \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr - \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug - \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec - \fi - \space\number\year} - -% @settitle line... specifies the title of the document, for headings. -% It generates no output of its own. -\def\thistitle{\putwordNoTitle} -\def\settitle{\parsearg\settitlezzz} -\def\settitlezzz #1{\gdef\thistitle{#1}} - - -\message{tables,} -% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). - -% default indentation of table text -\newdimen\tableindent \tableindent=.8in -% default indentation of @itemize and @enumerate text -\newdimen\itemindent \itemindent=.3in -% margin between end of table item and start of table text. -\newdimen\itemmargin \itemmargin=.1in - -% used internally for \itemindent minus \itemmargin -\newdimen\itemmax - -% Note @table, @vtable, and @vtable define @item, @itemx, etc., with -% these defs. -% They also define \itemindex -% to index the item name in whatever manner is desired (perhaps none). - -\newif\ifitemxneedsnegativevskip - -\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} - -\def\internalBitem{\smallbreak \parsearg\itemzzz} -\def\internalBitemx{\itemxpar \parsearg\itemzzz} - -\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} -\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} - -\def\internalBkitem{\smallbreak \parsearg\kitemzzz} -\def\internalBkitemx{\itemxpar \parsearg\kitemzzz} - -\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% - \itemzzz {#1}} - -\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% - \itemzzz {#1}} - -\def\itemzzz #1{\begingroup % - \advance\hsize by -\rightskip - \advance\hsize by -\tableindent - \setbox0=\hbox{\itemfont{#1}}% - \itemindex{#1}% - \nobreak % This prevents a break before @itemx. - % - % If the item text does not fit in the space we have, put it on a line - % by itself, and do not allow a page break either before or after that - % line. We do not start a paragraph here because then if the next - % command is, e.g., @kindex, the whatsit would get put into the - % horizontal list on a line by itself, resulting in extra blank space. - \ifdim \wd0>\itemmax - % - % Make this a paragraph so we get the \parskip glue and wrapping, - % but leave it ragged-right. - \begingroup - \advance\leftskip by-\tableindent - \advance\hsize by\tableindent - \advance\rightskip by0pt plus1fil - \leavevmode\unhbox0\par - \endgroup - % - % We're going to be starting a paragraph, but we don't want the - % \parskip glue -- logically it's part of the @item we just started. - \nobreak \vskip-\parskip - % - % Stop a page break at the \parskip glue coming up. Unfortunately - % we can't prevent a possible page break at the following - % \baselineskip glue. - \nobreak - \endgroup - \itemxneedsnegativevskipfalse - \else - % The item text fits into the space. Start a paragraph, so that the - % following text (if any) will end up on the same line. - \noindent - % Do this with kerns and \unhbox so that if there is a footnote in - % the item text, it can migrate to the main vertical list and - % eventually be printed. - \nobreak\kern-\tableindent - \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 - \unhbox0 - \nobreak\kern\dimen0 - \endgroup - \itemxneedsnegativevskiptrue - \fi -} - -\def\item{\errmessage{@item while not in a table}} -\def\itemx{\errmessage{@itemx while not in a table}} -\def\kitem{\errmessage{@kitem while not in a table}} -\def\kitemx{\errmessage{@kitemx while not in a table}} -\def\xitem{\errmessage{@xitem while not in a table}} -\def\xitemx{\errmessage{@xitemx while not in a table}} - -% Contains a kludge to get @end[description] to work. -\def\description{\tablez{\dontindex}{1}{}{}{}{}} - -% @table, @ftable, @vtable. -\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} -{\obeylines\obeyspaces% -\gdef\tablex #1^^M{% -\tabley\dontindex#1 \endtabley}} - -\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} -{\obeylines\obeyspaces% -\gdef\ftablex #1^^M{% -\tabley\fnitemindex#1 \endtabley -\def\Eftable{\endgraf\afterenvbreak\endgroup}% -\let\Etable=\relax}} - -\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} -{\obeylines\obeyspaces% -\gdef\vtablex #1^^M{% -\tabley\vritemindex#1 \endtabley -\def\Evtable{\endgraf\afterenvbreak\endgroup}% -\let\Etable=\relax}} - -\def\dontindex #1{} -\def\fnitemindex #1{\doind {fn}{\code{#1}}}% -\def\vritemindex #1{\doind {vr}{\code{#1}}}% - -{\obeyspaces % -\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% -\tablez{#1}{#2}{#3}{#4}{#5}{#6}}} - -\def\tablez #1#2#3#4#5#6{% -\aboveenvbreak % -\begingroup % -\def\Edescription{\Etable}% Necessary kludge. -\let\itemindex=#1% -\ifnum 0#3>0 \advance \leftskip by #3\mil \fi % -\ifnum 0#4>0 \tableindent=#4\mil \fi % -\ifnum 0#5>0 \advance \rightskip by #5\mil \fi % -\def\itemfont{#2}% -\itemmax=\tableindent % -\advance \itemmax by -\itemmargin % -\advance \leftskip by \tableindent % -\exdentamount=\tableindent -\parindent = 0pt -\parskip = \smallskipamount -\ifdim \parskip=0pt \parskip=2pt \fi% -\def\Etable{\endgraf\afterenvbreak\endgroup}% -\let\item = \internalBitem % -\let\itemx = \internalBitemx % -\let\kitem = \internalBkitem % -\let\kitemx = \internalBkitemx % -\let\xitem = \internalBxitem % -\let\xitemx = \internalBxitemx % -} - -% This is the counter used by @enumerate, which is really @itemize - -\newcount \itemno - -\def\itemize{\parsearg\itemizezzz} - -\def\itemizezzz #1{% - \begingroup % ended by the @end itemize - \itemizey {#1}{\Eitemize} -} - -\def\itemizey #1#2{% -\aboveenvbreak % -\itemmax=\itemindent % -\advance \itemmax by -\itemmargin % -\advance \leftskip by \itemindent % -\exdentamount=\itemindent -\parindent = 0pt % -\parskip = \smallskipamount % -\ifdim \parskip=0pt \parskip=2pt \fi% -\def#2{\endgraf\afterenvbreak\endgroup}% -\def\itemcontents{#1}% -\let\item=\itemizeitem} - -% Set sfcode to normal for the chars that usually have another value. -% These are `.?!:;,' -\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 - \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 } - -% \splitoff TOKENS\endmark defines \first to be the first token in -% TOKENS, and \rest to be the remainder. -% -\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% - -% Allow an optional argument of an uppercase letter, lowercase letter, -% or number, to specify the first label in the enumerated list. No -% argument is the same as `1'. -% -\def\enumerate{\parsearg\enumeratezzz} -\def\enumeratezzz #1{\enumeratey #1 \endenumeratey} -\def\enumeratey #1 #2\endenumeratey{% - \begingroup % ended by the @end enumerate - % - % If we were given no argument, pretend we were given `1'. - \def\thearg{#1}% - \ifx\thearg\empty \def\thearg{1}\fi - % - % Detect if the argument is a single token. If so, it might be a - % letter. Otherwise, the only valid thing it can be is a number. - % (We will always have one token, because of the test we just made. - % This is a good thing, since \splitoff doesn't work given nothing at - % all -- the first parameter is undelimited.) - \expandafter\splitoff\thearg\endmark - \ifx\rest\empty - % Only one token in the argument. It could still be anything. - % A ``lowercase letter'' is one whose \lccode is nonzero. - % An ``uppercase letter'' is one whose \lccode is both nonzero, and - % not equal to itself. - % Otherwise, we assume it's a number. - % - % We need the \relax at the end of the \ifnum lines to stop TeX from - % continuing to look for a . - % - \ifnum\lccode\expandafter`\thearg=0\relax - \numericenumerate % a number (we hope) - \else - % It's a letter. - \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax - \lowercaseenumerate % lowercase letter - \else - \uppercaseenumerate % uppercase letter - \fi - \fi - \else - % Multiple tokens in the argument. We hope it's a number. - \numericenumerate - \fi -} - -% An @enumerate whose labels are integers. The starting integer is -% given in \thearg. -% -\def\numericenumerate{% - \itemno = \thearg - \startenumeration{\the\itemno}% -} - -% The starting (lowercase) letter is in \thearg. -\def\lowercaseenumerate{% - \itemno = \expandafter`\thearg - \startenumeration{% - % Be sure we're not beyond the end of the alphabet. - \ifnum\itemno=0 - \errmessage{No more lowercase letters in @enumerate; get a bigger - alphabet}% - \fi - \char\lccode\itemno - }% -} - -% The starting (uppercase) letter is in \thearg. -\def\uppercaseenumerate{% - \itemno = \expandafter`\thearg - \startenumeration{% - % Be sure we're not beyond the end of the alphabet. - \ifnum\itemno=0 - \errmessage{No more uppercase letters in @enumerate; get a bigger - alphabet} - \fi - \char\uccode\itemno - }% -} - -% Call itemizey, adding a period to the first argument and supplying the -% common last two arguments. Also subtract one from the initial value in -% \itemno, since @item increments \itemno. -% -\def\startenumeration#1{% - \advance\itemno by -1 - \itemizey{#1.}\Eenumerate\flushcr -} - -% @alphaenumerate and @capsenumerate are abbreviations for giving an arg -% to @enumerate. -% -\def\alphaenumerate{\enumerate{a}} -\def\capsenumerate{\enumerate{A}} -\def\Ealphaenumerate{\Eenumerate} -\def\Ecapsenumerate{\Eenumerate} - -% Definition of @item while inside @itemize. - -\def\itemizeitem{% -\advance\itemno by 1 -{\let\par=\endgraf \smallbreak}% -\ifhmode \errmessage{In hmode at itemizeitem}\fi -{\parskip=0in \hskip 0pt -\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% -\vadjust{\penalty 1200}}% -\flushcr} - -% @multitable macros -% Amy Hendrickson, 8/18/94, 3/6/96 -% -% @multitable ... @end multitable will make as many columns as desired. -% Contents of each column will wrap at width given in preamble. Width -% can be specified either with sample text given in a template line, -% or in percent of \hsize, the current width of text on page. - -% Table can continue over pages but will only break between lines. - -% To make preamble: -% -% Either define widths of columns in terms of percent of \hsize: -% @multitable @columnfractions .25 .3 .45 -% @item ... -% -% Numbers following @columnfractions are the percent of the total -% current hsize to be used for each column. You may use as many -% columns as desired. - - -% Or use a template: -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item ... -% using the widest term desired in each column. -% -% For those who want to use more than one line's worth of words in -% the preamble, break the line within one argument and it -% will parse correctly, i.e., -% -% @multitable {Column 1 template} {Column 2 template} {Column 3 -% template} -% Not: -% @multitable {Column 1 template} {Column 2 template} -% {Column 3 template} - -% Each new table line starts with @item, each subsequent new column -% starts with @tab. Empty columns may be produced by supplying @tab's -% with nothing between them for as many times as empty columns are needed, -% ie, @tab@tab@tab will produce two empty columns. - -% @item, @tab, @multitable or @end multitable do not need to be on their -% own lines, but it will not hurt if they are. - -% Sample multitable: - -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item first col stuff @tab second col stuff @tab third col -% @item -% first col stuff -% @tab -% second col stuff -% @tab -% third col -% @item first col stuff @tab second col stuff -% @tab Many paragraphs of text may be used in any column. -% -% They will wrap at the width determined by the template. -% @item@tab@tab This will be in third column. -% @end multitable - -% Default dimensions may be reset by user. -% @multitableparskip is vertical space between paragraphs in table. -% @multitableparindent is paragraph indent in table. -% @multitablecolmargin is horizontal space to be left between columns. -% @multitablelinespace is space to leave between table items, baseline -% to baseline. -% 0pt means it depends on current normal line spacing. -% -\newskip\multitableparskip -\newskip\multitableparindent -\newdimen\multitablecolspace -\newskip\multitablelinespace -\multitableparskip=0pt -\multitableparindent=6pt -\multitablecolspace=12pt -\multitablelinespace=0pt - -% Macros used to set up halign preamble: -% -\let\endsetuptable\relax -\def\xendsetuptable{\endsetuptable} -\let\columnfractions\relax -\def\xcolumnfractions{\columnfractions} -\newif\ifsetpercent - -% #1 is the part of the @columnfraction before the decimal point, which -% is presumably either 0 or the empty string (but we don't check, we -% just throw it away). #2 is the decimal part, which we use as the -% percent of \hsize for this column. -\def\pickupwholefraction#1.#2 {% - \global\advance\colcount by 1 - \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}% - \setuptable -} - -\newcount\colcount -\def\setuptable#1{% - \def\firstarg{#1}% - \ifx\firstarg\xendsetuptable - \let\go = \relax - \else - \ifx\firstarg\xcolumnfractions - \global\setpercenttrue - \else - \ifsetpercent - \let\go\pickupwholefraction - \else - \global\advance\colcount by 1 - \setbox0=\hbox{#1\unskip }% Add a normal word space as a separator; - % typically that is always in the input, anyway. - \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% - \fi - \fi - \ifx\go\pickupwholefraction - % Put the argument back for the \pickupwholefraction call, so - % we'll always have a period there to be parsed. - \def\go{\pickupwholefraction#1}% - \else - \let\go = \setuptable - \fi% - \fi - \go -} - -% This used to have \hskip1sp. But then the space in a template line is -% not enough. That is bad. So let's go back to just & until we -% encounter the problem it was intended to solve again. -% --karl, nathan@acm.org, 20apr99. -\def\tab{&} - -% @multitable ... @end multitable definitions: -% -\def\multitable{\parsearg\dotable} -\def\dotable#1{\bgroup - \vskip\parskip - \let\item\crcr - \tolerance=9500 - \hbadness=9500 - \setmultitablespacing - \parskip=\multitableparskip - \parindent=\multitableparindent - \overfullrule=0pt - \global\colcount=0 - \def\Emultitable{\global\setpercentfalse\cr\egroup\egroup}% - % - % To parse everything between @multitable and @item: - \setuptable#1 \endsetuptable - % - % \everycr will reset column counter, \colcount, at the end of - % each line. Every column entry will cause \colcount to advance by one. - % The table preamble - % looks at the current \colcount to find the correct column width. - \everycr{\noalign{% - % - % \filbreak%% keeps underfull box messages off when table breaks over pages. - % Maybe so, but it also creates really weird page breaks when the table - % breaks over pages. Wouldn't \vfil be better? Wait until the problem - % manifests itself, so it can be fixed for real --karl. - \global\colcount=0\relax}}% - % - % This preamble sets up a generic column definition, which will - % be used as many times as user calls for columns. - % \vtop will set a single line and will also let text wrap and - % continue for many paragraphs if desired. - \halign\bgroup&\global\advance\colcount by 1\relax - \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname - % - % In order to keep entries from bumping into each other - % we will add a \leftskip of \multitablecolspace to all columns after - % the first one. - % - % If a template has been used, we will add \multitablecolspace - % to the width of each template entry. - % - % If the user has set preamble in terms of percent of \hsize we will - % use that dimension as the width of the column, and the \leftskip - % will keep entries from bumping into each other. Table will start at - % left margin and final column will justify at right margin. - % - % Make sure we don't inherit \rightskip from the outer environment. - \rightskip=0pt - \ifnum\colcount=1 - % The first column will be indented with the surrounding text. - \advance\hsize by\leftskip - \else - \ifsetpercent \else - % If user has not set preamble in terms of percent of \hsize - % we will advance \hsize by \multitablecolspace. - \advance\hsize by \multitablecolspace - \fi - % In either case we will make \leftskip=\multitablecolspace: - \leftskip=\multitablecolspace - \fi - % Ignoring space at the beginning and end avoids an occasional spurious - % blank line, when TeX decides to break the line at the space before the - % box from the multistrut, so the strut ends up on a line by itself. - % For example: - % @multitable @columnfractions .11 .89 - % @item @code{#} - % @tab Legal holiday which is valid in major parts of the whole country. - % Is automatically provided with highlighting sequences respectively marking - % characters. - \noindent\ignorespaces##\unskip\multistrut}\cr -} - -\def\setmultitablespacing{% test to see if user has set \multitablelinespace. -% If so, do nothing. If not, give it an appropriate dimension based on -% current baselineskip. -\ifdim\multitablelinespace=0pt -%% strut to put in table in case some entry doesn't have descenders, -%% to keep lines equally spaced -\let\multistrut = \strut -%% Test to see if parskip is larger than space between lines of -%% table. If not, do nothing. -%% If so, set to same dimension as multitablelinespace. -\else -\gdef\multistrut{\vrule height\multitablelinespace depth\dp0 -width0pt\relax} \fi -\ifdim\multitableparskip>\multitablelinespace -\global\multitableparskip=\multitablelinespace -\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller - %% than skip between lines in the table. -\fi% -\ifdim\multitableparskip=0pt -\global\multitableparskip=\multitablelinespace -\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller - %% than skip between lines in the table. -\fi} - - -\message{conditionals,} -% Prevent errors for section commands. -% Used in @ignore and in failing conditionals. -\def\ignoresections{% - \let\chapter=\relax - \let\unnumbered=\relax - \let\top=\relax - \let\unnumberedsec=\relax - \let\unnumberedsection=\relax - \let\unnumberedsubsec=\relax - \let\unnumberedsubsection=\relax - \let\unnumberedsubsubsec=\relax - \let\unnumberedsubsubsection=\relax - \let\section=\relax - \let\subsec=\relax - \let\subsubsec=\relax - \let\subsection=\relax - \let\subsubsection=\relax - \let\appendix=\relax - \let\appendixsec=\relax - \let\appendixsection=\relax - \let\appendixsubsec=\relax - \let\appendixsubsection=\relax - \let\appendixsubsubsec=\relax - \let\appendixsubsubsection=\relax - \let\contents=\relax - \let\smallbook=\relax - \let\titlepage=\relax -} - -% Used in nested conditionals, where we have to parse the Texinfo source -% and so want to turn off most commands, in case they are used -% incorrectly. -% -\def\ignoremorecommands{% - \let\defcodeindex = \relax - \let\defcv = \relax - \let\deffn = \relax - \let\deffnx = \relax - \let\defindex = \relax - \let\defivar = \relax - \let\defmac = \relax - \let\defmethod = \relax - \let\defop = \relax - \let\defopt = \relax - \let\defspec = \relax - \let\deftp = \relax - \let\deftypefn = \relax - \let\deftypefun = \relax - \let\deftypeivar = \relax - \let\deftypevar = \relax - \let\deftypevr = \relax - \let\defun = \relax - \let\defvar = \relax - \let\defvr = \relax - \let\ref = \relax - \let\xref = \relax - \let\printindex = \relax - \let\pxref = \relax - \let\settitle = \relax - \let\setchapternewpage = \relax - \let\setchapterstyle = \relax - \let\everyheading = \relax - \let\evenheading = \relax - \let\oddheading = \relax - \let\everyfooting = \relax - \let\evenfooting = \relax - \let\oddfooting = \relax - \let\headings = \relax - \let\include = \relax - \let\lowersections = \relax - \let\down = \relax - \let\raisesections = \relax - \let\up = \relax - \let\set = \relax - \let\clear = \relax - \let\item = \relax -} - -% Ignore @ignore ... @end ignore. -% -\def\ignore{\doignore{ignore}} - -% Ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu, and @direntry text. -% -\def\ifinfo{\doignore{ifinfo}} -\def\ifhtml{\doignore{ifhtml}} -\def\ifnottex{\doignore{ifnottex}} -\def\html{\doignore{html}} -\def\menu{\doignore{menu}} -\def\direntry{\doignore{direntry}} - -% @dircategory CATEGORY -- specify a category of the dir file -% which this file should belong to. Ignore this in TeX. -\let\dircategory = \comment - -% Ignore text until a line `@end #1'. -% -\def\doignore#1{\begingroup - % Don't complain about control sequences we have declared \outer. - \ignoresections - % - % Define a command to swallow text until we reach `@end #1'. - % This @ is a catcode 12 token (that is the normal catcode of @ in - % this texinfo.tex file). We change the catcode of @ below to match. - \long\def\doignoretext##1@end #1{\enddoignore}% - % - % Make sure that spaces turn into tokens that match what \doignoretext wants. - \catcode32 = 10 - % - % Ignore braces, too, so mismatched braces don't cause trouble. - \catcode`\{ = 9 - \catcode`\} = 9 - % - % We must not have @c interpreted as a control sequence. - \catcode`\@ = 12 - % - % Make the letter c a comment character so that the rest of the line - % will be ignored. This way, the document can have (for example) - % @c @end ifinfo - % and the @end ifinfo will be properly ignored. - % (We've just changed @ to catcode 12.) - \catcode`\c = 14 - % - % And now expand that command. - \doignoretext -} - -% What we do to finish off ignored text. -% -\def\enddoignore{\endgroup\ignorespaces}% - -\newif\ifwarnedobs\warnedobsfalse -\def\obstexwarn{% - \ifwarnedobs\relax\else - % We need to warn folks that they may have trouble with TeX 3.0. - % This uses \immediate\write16 rather than \message to get newlines. - \immediate\write16{} - \immediate\write16{WARNING: for users of Unix TeX 3.0!} - \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} - \immediate\write16{If you are running another version of TeX, relax.} - \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} - \immediate\write16{ Then upgrade your TeX installation if you can.} - \immediate\write16{ (See ftp://ftp.gnu.org/pub/gnu/TeX.README.)} - \immediate\write16{If you are stuck with version 3.0, run the} - \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} - \immediate\write16{ to use a workaround.} - \immediate\write16{} - \global\warnedobstrue - \fi -} - -% **In TeX 3.0, setting text in \nullfont hangs tex. For a -% workaround (which requires the file ``dummy.tfm'' to be installed), -% uncomment the following line: -\font\nullfont=dummy\let\obstexwarn=\relax - -% Ignore text, except that we keep track of conditional commands for -% purposes of nesting, up to an `@end #1' command. -% -\def\nestedignore#1{% - \obstexwarn - % We must actually expand the ignored text to look for the @end - % command, so that nested ignore constructs work. Thus, we put the - % text into a \vbox and then do nothing with the result. To minimize - % the change of memory overflow, we follow the approach outlined on - % page 401 of the TeXbook: make the current font be a dummy font. - % - \setbox0 = \vbox\bgroup - % Don't complain about control sequences we have declared \outer. - \ignoresections - % - % Define `@end #1' to end the box, which will in turn undefine the - % @end command again. - \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% - % - % We are going to be parsing Texinfo commands. Most cause no - % trouble when they are used incorrectly, but some commands do - % complicated argument parsing or otherwise get confused, so we - % undefine them. - % - % We can't do anything about stray @-signs, unfortunately; - % they'll produce `undefined control sequence' errors. - \ignoremorecommands - % - % Set the current font to be \nullfont, a TeX primitive, and define - % all the font commands to also use \nullfont. We don't use - % dummy.tfm, as suggested in the TeXbook, because not all sites - % might have that installed. Therefore, math mode will still - % produce output, but that should be an extremely small amount of - % stuff compared to the main input. - % - \nullfont - \let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont - \let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont - \let\tensf = \nullfont - % Similarly for index fonts (mostly for their use in - % smallexample) - \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont - \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont - \let\indsf = \nullfont - % - % Don't complain when characters are missing from the fonts. - \tracinglostchars = 0 - % - % Don't bother to do space factor calculations. - \frenchspacing - % - % Don't report underfull hboxes. - \hbadness = 10000 - % - % Do minimal line-breaking. - \pretolerance = 10000 - % - % Do not execute instructions in @tex - \def\tex{\doignore{tex}}% - % Do not execute macro definitions. - % `c' is a comment character, so the word `macro' will get cut off. - \def\macro{\doignore{ma}}% -} - -% @set VAR sets the variable VAR to an empty value. -% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. -% -% Since we want to separate VAR from REST-OF-LINE (which might be -% empty), we can't just use \parsearg; we have to insert a space of our -% own to delimit the rest of the line, and then take it out again if we -% didn't need it. Make sure the catcode of space is correct to avoid -% losing inside @example, for instance. -% -\def\set{\begingroup\catcode` =10 - \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR. - \parsearg\setxxx} -\def\setxxx#1{\setyyy#1 \endsetyyy} -\def\setyyy#1 #2\endsetyyy{% - \def\temp{#2}% - \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty - \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. - \fi - \endgroup -} -% Can't use \xdef to pre-expand #2 and save some time, since \temp or -% \next or other control sequences that we've defined might get us into -% an infinite loop. Consider `@set foo @cite{bar}'. -\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}} - -% @clear VAR clears (i.e., unsets) the variable VAR. -% -\def\clear{\parsearg\clearxxx} -\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} - -% @value{foo} gets the text saved in variable foo. -{ - \catcode`\_ = \active - % - % We might end up with active _ or - characters in the argument if - % we're called from @code, as @code{@value{foo-bar_}}. So \let any - % such active characters to their normal equivalents. - \gdef\value{\begingroup - \catcode`\-=12 \catcode`\_=12 - \indexbreaks \let_\normalunderscore - \valuexxx} -} -\def\valuexxx#1{\expandablevalue{#1}\endgroup} - -% We have this subroutine so that we can handle at least some @value's -% properly in indexes (we \let\value to this in \indexdummies). Ones -% whose names contain - or _ still won't work, but we can't do anything -% about that. The command has to be fully expandable, since the result -% winds up in the index file. This means that if the variable's value -% contains other Texinfo commands, it's almost certain it will fail -% (although perhaps we could fix that with sufficient work to do a -% one-level expansion on the result, instead of complete). -% -\def\expandablevalue#1{% - \expandafter\ifx\csname SET#1\endcsname\relax - {[No value for ``#1'']}% - \else - \csname SET#1\endcsname - \fi -} - -% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined -% with @set. -% -\def\ifset{\parsearg\ifsetxxx} -\def\ifsetxxx #1{% - \expandafter\ifx\csname SET#1\endcsname\relax - \expandafter\ifsetfail - \else - \expandafter\ifsetsucceed - \fi -} -\def\ifsetsucceed{\conditionalsucceed{ifset}} -\def\ifsetfail{\nestedignore{ifset}} -\defineunmatchedend{ifset} - -% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been -% defined with @set, or has been undefined with @clear. -% -\def\ifclear{\parsearg\ifclearxxx} -\def\ifclearxxx #1{% - \expandafter\ifx\csname SET#1\endcsname\relax - \expandafter\ifclearsucceed - \else - \expandafter\ifclearfail - \fi -} -\def\ifclearsucceed{\conditionalsucceed{ifclear}} -\def\ifclearfail{\nestedignore{ifclear}} -\defineunmatchedend{ifclear} - -% @iftex, @ifnothtml, @ifnotinfo always succeed; we read the text -% following, through the first @end iftex (etc.). Make `@end iftex' -% (etc.) valid only after an @iftex. -% -\def\iftex{\conditionalsucceed{iftex}} -\def\ifnothtml{\conditionalsucceed{ifnothtml}} -\def\ifnotinfo{\conditionalsucceed{ifnotinfo}} -\defineunmatchedend{iftex} -\defineunmatchedend{ifnothtml} -\defineunmatchedend{ifnotinfo} - -% We can't just want to start a group at @iftex (for example) and end it -% at @end iftex, since then @set commands inside the conditional have no -% effect (they'd get reverted at the end of the group). So we must -% define \Eiftex to redefine itself to be its previous value. (We can't -% just define it to fail again with an ``unmatched end'' error, since -% the @ifset might be nested.) -% -\def\conditionalsucceed#1{% - \edef\temp{% - % Remember the current value of \E#1. - \let\nece{prevE#1} = \nece{E#1}% - % - % At the `@end #1', redefine \E#1 to be its previous value. - \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}% - }% - \temp -} - -% We need to expand lots of \csname's, but we don't want to expand the -% control sequences after we've constructed them. -% -\def\nece#1{\expandafter\noexpand\csname#1\endcsname} - -% @defininfoenclose. -\let\definfoenclose=\comment - - -\message{indexing,} -% Index generation facilities - -% Define \newwrite to be identical to plain tex's \newwrite -% except not \outer, so it can be used within \newindex. -{\catcode`\@=11 -\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} - -% \newindex {foo} defines an index named foo. -% It automatically defines \fooindex such that -% \fooindex ...rest of line... puts an entry in the index foo. -% It also defines \fooindfile to be the number of the output channel for -% the file that accumulates this index. The file's extension is foo. -% The name of an index should be no more than 2 characters long -% for the sake of vms. -% -\def\newindex#1{% - \iflinks - \expandafter\newwrite \csname#1indfile\endcsname - \openout \csname#1indfile\endcsname \jobname.#1 % Open the file - \fi - \expandafter\xdef\csname#1index\endcsname{% % Define @#1index - \noexpand\doindex{#1}} -} - -% @defindex foo == \newindex{foo} - -\def\defindex{\parsearg\newindex} - -% Define @defcodeindex, like @defindex except put all entries in @code. - -\def\newcodeindex#1{% - \iflinks - \expandafter\newwrite \csname#1indfile\endcsname - \openout \csname#1indfile\endcsname \jobname.#1 - \fi - \expandafter\xdef\csname#1index\endcsname{% - \noexpand\docodeindex{#1}} -} - -\def\defcodeindex{\parsearg\newcodeindex} - -% @synindex foo bar makes index foo feed into index bar. -% Do this instead of @defindex foo if you don't want it as a separate index. -% The \closeout helps reduce unnecessary open files; the limit on the -% Acorn RISC OS is a mere 16 files. -\def\synindex#1 #2 {% - \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname - \expandafter\closeout\csname#1indfile\endcsname - \expandafter\let\csname#1indfile\endcsname=\synindexfoo - \expandafter\xdef\csname#1index\endcsname{% define \xxxindex - \noexpand\doindex{#2}}% -} - -% @syncodeindex foo bar similar, but put all entries made for index foo -% inside @code. -\def\syncodeindex#1 #2 {% - \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname - \expandafter\closeout\csname#1indfile\endcsname - \expandafter\let\csname#1indfile\endcsname=\synindexfoo - \expandafter\xdef\csname#1index\endcsname{% define \xxxindex - \noexpand\docodeindex{#2}}% -} - -% Define \doindex, the driver for all \fooindex macros. -% Argument #1 is generated by the calling \fooindex macro, -% and it is "foo", the name of the index. - -% \doindex just uses \parsearg; it calls \doind for the actual work. -% This is because \doind is more useful to call from other macros. - -% There is also \dosubind {index}{topic}{subtopic} -% which makes an entry in a two-level index such as the operation index. - -\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} -\def\singleindexer #1{\doind{\indexname}{#1}} - -% like the previous two, but they put @code around the argument. -\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} -\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} - -\def\indexdummies{% -\def\ { }% -% Take care of the plain tex accent commands. -\def\"{\realbackslash "}% -\def\`{\realbackslash `}% -\def\'{\realbackslash '}% -\def\^{\realbackslash ^}% -\def\~{\realbackslash ~}% -\def\={\realbackslash =}% -\def\b{\realbackslash b}% -\def\c{\realbackslash c}% -\def\d{\realbackslash d}% -\def\u{\realbackslash u}% -\def\v{\realbackslash v}% -\def\H{\realbackslash H}% -% Take care of the plain tex special European modified letters. -\def\oe{\realbackslash oe}% -\def\ae{\realbackslash ae}% -\def\aa{\realbackslash aa}% -\def\OE{\realbackslash OE}% -\def\AE{\realbackslash AE}% -\def\AA{\realbackslash AA}% -\def\o{\realbackslash o}% -\def\O{\realbackslash O}% -\def\l{\realbackslash l}% -\def\L{\realbackslash L}% -\def\ss{\realbackslash ss}% -% Take care of texinfo commands likely to appear in an index entry. -% (Must be a way to avoid doing expansion at all, and thus not have to -% laboriously list every single command here.) -\def\@{@}% will be @@ when we switch to @ as escape char. -% Need these in case \tex is in effect and \{ is a \delimiter again. -% But can't use \lbracecmd and \rbracecmd because texindex assumes -% braces and backslashes are used only as delimiters. -\let\{ = \mylbrace -\let\} = \myrbrace -\def\_{{\realbackslash _}}% -\def\w{\realbackslash w }% -\def\bf{\realbackslash bf }% -%\def\rm{\realbackslash rm }% -\def\sl{\realbackslash sl }% -\def\sf{\realbackslash sf}% -\def\tt{\realbackslash tt}% -\def\gtr{\realbackslash gtr}% -\def\less{\realbackslash less}% -\def\hat{\realbackslash hat}% -\def\TeX{\realbackslash TeX}% -\def\dots{\realbackslash dots }% -\def\result{\realbackslash result}% -\def\equiv{\realbackslash equiv}% -\def\expansion{\realbackslash expansion}% -\def\print{\realbackslash print}% -\def\error{\realbackslash error}% -\def\point{\realbackslash point}% -\def\copyright{\realbackslash copyright}% -\def\tclose##1{\realbackslash tclose {##1}}% -\def\code##1{\realbackslash code {##1}}% -\def\uref##1{\realbackslash uref {##1}}% -\def\url##1{\realbackslash url {##1}}% -\def\env##1{\realbackslash env {##1}}% -\def\command##1{\realbackslash command {##1}}% -\def\option##1{\realbackslash option {##1}}% -\def\dotless##1{\realbackslash dotless {##1}}% -\def\samp##1{\realbackslash samp {##1}}% -\def\,##1{\realbackslash ,{##1}}% -\def\t##1{\realbackslash t {##1}}% -\def\r##1{\realbackslash r {##1}}% -\def\i##1{\realbackslash i {##1}}% -\def\b##1{\realbackslash b {##1}}% -\def\sc##1{\realbackslash sc {##1}}% -\def\cite##1{\realbackslash cite {##1}}% -\def\key##1{\realbackslash key {##1}}% -\def\file##1{\realbackslash file {##1}}% -\def\var##1{\realbackslash var {##1}}% -\def\kbd##1{\realbackslash kbd {##1}}% -\def\dfn##1{\realbackslash dfn {##1}}% -\def\emph##1{\realbackslash emph {##1}}% -\def\acronym##1{\realbackslash acronym {##1}}% -% -% Handle some cases of @value -- where the variable name does not -% contain - or _, and the value does not contain any -% (non-fully-expandable) commands. -\let\value = \expandablevalue -% -\unsepspaces -% Turn off macro expansion -\turnoffmacros -} - -% If an index command is used in an @example environment, any spaces -% therein should become regular spaces in the raw index file, not the -% expansion of \tie (\\leavevmode \penalty \@M \ ). -{\obeyspaces - \gdef\unsepspaces{\obeyspaces\let =\space}} - -% \indexnofonts no-ops all font-change commands. -% This is used when outputting the strings to sort the index by. -\def\indexdummyfont#1{#1} -\def\indexdummytex{TeX} -\def\indexdummydots{...} - -\def\indexnofonts{% -% Just ignore accents. -\let\,=\indexdummyfont -\let\"=\indexdummyfont -\let\`=\indexdummyfont -\let\'=\indexdummyfont -\let\^=\indexdummyfont -\let\~=\indexdummyfont -\let\==\indexdummyfont -\let\b=\indexdummyfont -\let\c=\indexdummyfont -\let\d=\indexdummyfont -\let\u=\indexdummyfont -\let\v=\indexdummyfont -\let\H=\indexdummyfont -\let\dotless=\indexdummyfont -% Take care of the plain tex special European modified letters. -\def\oe{oe}% -\def\ae{ae}% -\def\aa{aa}% -\def\OE{OE}% -\def\AE{AE}% -\def\AA{AA}% -\def\o{o}% -\def\O{O}% -\def\l{l}% -\def\L{L}% -\def\ss{ss}% -\let\w=\indexdummyfont -\let\t=\indexdummyfont -\let\r=\indexdummyfont -\let\i=\indexdummyfont -\let\b=\indexdummyfont -\let\emph=\indexdummyfont -\let\strong=\indexdummyfont -\let\cite=\indexdummyfont -\let\sc=\indexdummyfont -%Don't no-op \tt, since it isn't a user-level command -% and is used in the definitions of the active chars like <, >, |... -%\let\tt=\indexdummyfont -\let\tclose=\indexdummyfont -\let\code=\indexdummyfont -\let\url=\indexdummyfont -\let\uref=\indexdummyfont -\let\env=\indexdummyfont -\let\command=\indexdummyfont -\let\option=\indexdummyfont -\let\file=\indexdummyfont -\let\samp=\indexdummyfont -\let\kbd=\indexdummyfont -\let\key=\indexdummyfont -\let\var=\indexdummyfont -\let\TeX=\indexdummytex -\let\dots=\indexdummydots -\def\@{@}% -} - -% To define \realbackslash, we must make \ not be an escape. -% We must first make another character (@) an escape -% so we do not become unable to do a definition. - -{\catcode`\@=0 \catcode`\\=\other - @gdef@realbackslash{\}} - -\let\indexbackslash=0 %overridden during \printindex. -\let\SETmarginindex=\relax % put index entries in margin (undocumented)? - -% For \ifx comparisons. -\def\emptymacro{\empty} - -% Most index entries go through here, but \dosubind is the general case. -% -\def\doind#1#2{\dosubind{#1}{#2}\empty} - -% Workhorse for all \fooindexes. -% #1 is name of index, #2 is stuff to put there, #3 is subentry -- -% \empty if called from \doind, as we usually are. The main exception -% is with defuns, which call us directly. -% -\def\dosubind#1#2#3{% - % Put the index entry in the margin if desired. - \ifx\SETmarginindex\relax\else - \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% - \fi - {% - \count255=\lastpenalty - {% - \indexdummies % Must do this here, since \bf, etc expand at this stage - \escapechar=`\\ - {% - \let\folio = 0% We will expand all macros now EXCEPT \folio. - \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now - % so it will be output as is; and it will print as backslash. - % - \def\thirdarg{#3}% - % - % If third arg is present, precede it with space in sort key. - \ifx\thirdarg\emptymacro - \let\subentry = \empty - \else - \def\subentry{ #3}% - \fi - % - % First process the index entry with all font commands turned - % off to get the string to sort by. - {\indexnofonts \xdef\indexsorttmp{#2\subentry}}% - % - % Now the real index entry with the fonts. - \toks0 = {#2}% - % - % If third (subentry) arg is present, add it to the index - % string. And include a space. - \ifx\thirdarg\emptymacro \else - \toks0 = \expandafter{\the\toks0 \space #3}% - \fi - % - % Set up the complete index entry, with both the sort key - % and the original text, including any font commands. We write - % three arguments to \entry to the .?? file, texindex reduces to - % two when writing the .??s sorted result. - \edef\temp{% - \write\csname#1indfile\endcsname{% - \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% - }% - % - % If a skip is the last thing on the list now, preserve it - % by backing up by \lastskip, doing the \write, then inserting - % the skip again. Otherwise, the whatsit generated by the - % \write will make \lastskip zero. The result is that sequences - % like this: - % @end defun - % @tindex whatever - % @defun ... - % will have extra space inserted, because the \medbreak in the - % start of the @defun won't see the skip inserted by the @end of - % the previous defun. - % - % But don't do any of this if we're not in vertical mode. We - % don't want to do a \vskip and prematurely end a paragraph. - % - % Avoid page breaks due to these extra skips, too. - % - \iflinks - \ifvmode - \skip0 = \lastskip - \ifdim\lastskip = 0pt \else \nobreak\vskip-\lastskip \fi - \fi - % - \temp % do the write - % - % - \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi - \fi - }% - }% - \penalty\count255 - }% -} - -% The index entry written in the file actually looks like -% \entry {sortstring}{page}{topic} -% or -% \entry {sortstring}{page}{topic}{subtopic} -% The texindex program reads in these files and writes files -% containing these kinds of lines: -% \initial {c} -% before the first topic whose initial is c -% \entry {topic}{pagelist} -% for a topic that is used without subtopics -% \primary {topic} -% for the beginning of a topic that is used with subtopics -% \secondary {subtopic}{pagelist} -% for each subtopic. - -% Define the user-accessible indexing commands -% @findex, @vindex, @kindex, @cindex. - -\def\findex {\fnindex} -\def\kindex {\kyindex} -\def\cindex {\cpindex} -\def\vindex {\vrindex} -\def\tindex {\tpindex} -\def\pindex {\pgindex} - -\def\cindexsub {\begingroup\obeylines\cindexsub} -{\obeylines % -\gdef\cindexsub "#1" #2^^M{\endgroup % -\dosubind{cp}{#2}{#1}}} - -% Define the macros used in formatting output of the sorted index material. - -% @printindex causes a particular index (the ??s file) to get printed. -% It does not print any chapter heading (usually an @unnumbered). -% -\def\printindex{\parsearg\doprintindex} -\def\doprintindex#1{\begingroup - \dobreak \chapheadingskip{10000}% - % - \indexfonts \rm - \tolerance = 9500 - \indexbreaks - % - % See if the index file exists and is nonempty. - % Change catcode of @ here so that if the index file contains - % \initial {@} - % as its first line, TeX doesn't complain about mismatched braces - % (because it thinks @} is a control sequence). - \catcode`\@ = 11 - \openin 1 \jobname.#1s - \ifeof 1 - % \enddoublecolumns gets confused if there is no text in the index, - % and it loses the chapter title and the aux file entries for the - % index. The easiest way to prevent this problem is to make sure - % there is some text. - \putwordIndexNonexistent - \else - % - % If the index file exists but is empty, then \openin leaves \ifeof - % false. We have to make TeX try to read something from the file, so - % it can discover if there is anything in it. - \read 1 to \temp - \ifeof 1 - \putwordIndexIsEmpty - \else - % Index files are almost Texinfo source, but we use \ as the escape - % character. It would be better to use @, but that's too big a change - % to make right now. - \def\indexbackslash{\rawbackslashxx}% - \catcode`\\ = 0 - \escapechar = `\\ - \begindoublecolumns - \input \jobname.#1s - \enddoublecolumns - \fi - \fi - \closein 1 -\endgroup} - -% These macros are used by the sorted index file itself. -% Change them to control the appearance of the index. - -\def\initial#1{{% - % Some minor font changes for the special characters. - \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt - % - % Remove any glue we may have, we'll be inserting our own. - \removelastskip - % - % We like breaks before the index initials, so insert a bonus. - \penalty -300 - % - % Typeset the initial. Making this add up to a whole number of - % baselineskips increases the chance of the dots lining up from column - % to column. It still won't often be perfect, because of the stretch - % we need before each entry, but it's better. - % - % No shrink because it confuses \balancecolumns. - \vskip 1.67\baselineskip plus .5\baselineskip - \leftline{\secbf #1}% - \vskip .33\baselineskip plus .1\baselineskip - % - % Do our best not to break after the initial. - \nobreak -}} - -% This typesets a paragraph consisting of #1, dot leaders, and then #2 -% flush to the right margin. It is used for index and table of contents -% entries. The paragraph is indented by \leftskip. -% -\def\entry#1#2{\begingroup - % - % Start a new paragraph if necessary, so our assignments below can't - % affect previous text. - \par - % - % Do not fill out the last line with white space. - \parfillskip = 0in - % - % No extra space above this paragraph. - \parskip = 0in - % - % Do not prefer a separate line ending with a hyphen to fewer lines. - \finalhyphendemerits = 0 - % - % \hangindent is only relevant when the entry text and page number - % don't both fit on one line. In that case, bob suggests starting the - % dots pretty far over on the line. Unfortunately, a large - % indentation looks wrong when the entry text itself is broken across - % lines. So we use a small indentation and put up with long leaders. - % - % \hangafter is reset to 1 (which is the value we want) at the start - % of each paragraph, so we need not do anything with that. - \hangindent = 2em - % - % When the entry text needs to be broken, just fill out the first line - % with blank space. - \rightskip = 0pt plus1fil - % - % A bit of stretch before each entry for the benefit of balancing columns. - \vskip 0pt plus1pt - % - % Start a ``paragraph'' for the index entry so the line breaking - % parameters we've set above will have an effect. - \noindent - % - % Insert the text of the index entry. TeX will do line-breaking on it. - #1% - % The following is kludged to not output a line of dots in the index if - % there are no page numbers. The next person who breaks this will be - % cursed by a Unix daemon. - \def\tempa{{\rm }}% - \def\tempb{#2}% - \edef\tempc{\tempa}% - \edef\tempd{\tempb}% - \ifx\tempc\tempd\ \else% - % - % If we must, put the page number on a line of its own, and fill out - % this line with blank space. (The \hfil is overwhelmed with the - % fill leaders glue in \indexdotfill if the page number does fit.) - \hfil\penalty50 - \null\nobreak\indexdotfill % Have leaders before the page number. - % - % The `\ ' here is removed by the implicit \unskip that TeX does as - % part of (the primitive) \par. Without it, a spurious underfull - % \hbox ensues. - \ #2% The page number ends the paragraph. - \fi% - \par -\endgroup} - -% Like \dotfill except takes at least 1 em. -\def\indexdotfill{\cleaders - \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} - -\def\primary #1{\line{#1\hfil}} - -\newskip\secondaryindent \secondaryindent=0.5cm - -\def\secondary #1#2{ -{\parfillskip=0in \parskip=0in -\hangindent =1in \hangafter=1 -\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par -}} - -% Define two-column mode, which we use to typeset indexes. -% Adapted from the TeXbook, page 416, which is to say, -% the manmac.tex format used to print the TeXbook itself. -\catcode`\@=11 - -\newbox\partialpage -\newdimen\doublecolumnhsize - -\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns - % Grab any single-column material above us. - \output = {% - % - % Here is a possibility not foreseen in manmac: if we accumulate a - % whole lot of material, we might end up calling this \output - % routine twice in a row (see the doublecol-lose test, which is - % essentially a couple of indexes with @setchapternewpage off). In - % that case we just ship out what is in \partialpage with the normal - % output routine. Generally, \partialpage will be empty when this - % runs and this will be a no-op. See the indexspread.tex test case. - \ifvoid\partialpage \else - \onepageout{\pagecontents\partialpage}% - \fi - % - \global\setbox\partialpage = \vbox{% - % Unvbox the main output page. - \unvbox\PAGE - \kern-\topskip \kern\baselineskip - }% - }% - \eject % run that output routine to set \partialpage - % - % Use the double-column output routine for subsequent pages. - \output = {\doublecolumnout}% - % - % Change the page size parameters. We could do this once outside this - % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 - % format, but then we repeat the same computation. Repeating a couple - % of assignments once per index is clearly meaningless for the - % execution time, so we may as well do it in one place. - % - % First we halve the line length, less a little for the gutter between - % the columns. We compute the gutter based on the line length, so it - % changes automatically with the paper format. The magic constant - % below is chosen so that the gutter has the same value (well, +-<1pt) - % as it did when we hard-coded it. - % - % We put the result in a separate register, \doublecolumhsize, so we - % can restore it in \pagesofar, after \hsize itself has (potentially) - % been clobbered. - % - \doublecolumnhsize = \hsize - \advance\doublecolumnhsize by -.04154\hsize - \divide\doublecolumnhsize by 2 - \hsize = \doublecolumnhsize - % - % Double the \vsize as well. (We don't need a separate register here, - % since nobody clobbers \vsize.) - \advance\vsize by -\ht\partialpage - \vsize = 2\vsize -} - -% The double-column output routine for all double-column pages except -% the last. -% -\def\doublecolumnout{% - \splittopskip=\topskip \splitmaxdepth=\maxdepth - % Get the available space for the double columns -- the normal - % (undoubled) page height minus any material left over from the - % previous page. - \dimen@ = \vsize - \divide\dimen@ by 2 - % - % box0 will be the left-hand column, box2 the right. - \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ - \onepageout\pagesofar - \unvbox255 - \penalty\outputpenalty -} -\def\pagesofar{% - % Re-output the contents of the output page -- any previous material, - % followed by the two boxes we just split, in box0 and box2. - \unvbox\partialpage - % - \hsize = \doublecolumnhsize - \wd0=\hsize \wd2=\hsize - \hbox to\pagewidth{\box0\hfil\box2}% -} -\def\enddoublecolumns{% - \output = {% - % Split the last of the double-column material. Leave it on the - % current page, no automatic page break. - \balancecolumns - % - % If we end up splitting too much material for the current page, - % though, there will be another page break right after this \output - % invocation ends. Having called \balancecolumns once, we do not - % want to call it again. Therefore, reset \output to its normal - % definition right away. (We hope \balancecolumns will never be - % called on to balance too much material, but if it is, this makes - % the output somewhat more palatable.) - \global\output = {\onepageout{\pagecontents\PAGE}}% - }% - \eject - \endgroup % started in \begindoublecolumns - % - % \pagegoal was set to the doubled \vsize above, since we restarted - % the current page. We're now back to normal single-column - % typesetting, so reset \pagegoal to the normal \vsize (after the - % \endgroup where \vsize got restored). - \pagegoal = \vsize -} -\def\balancecolumns{% - % Called at the end of the double column material. - \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. - \dimen@ = \ht0 - \advance\dimen@ by \topskip - \advance\dimen@ by-\baselineskip - \divide\dimen@ by 2 % target to split to - %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% - \splittopskip = \topskip - % Loop until we get a decent breakpoint. - {% - \vbadness = 10000 - \loop - \global\setbox3 = \copy0 - \global\setbox1 = \vsplit3 to \dimen@ - \ifdim\ht3>\dimen@ - \global\advance\dimen@ by 1pt - \repeat - }% - %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% - \setbox0=\vbox to\dimen@{\unvbox1}% - \setbox2=\vbox to\dimen@{\unvbox3}% - % - \pagesofar -} -\catcode`\@ = \other - - -\message{sectioning,} -% Chapters, sections, etc. - -\newcount\chapno -\newcount\secno \secno=0 -\newcount\subsecno \subsecno=0 -\newcount\subsubsecno \subsubsecno=0 - -% This counter is funny since it counts through charcodes of letters A, B, ... -% The \the is necessary, despite appearances, because \appendixletter is -% expanded while writing the .toc file. \char\appendixno is not -% expandable, thus it is written literally, thus all appendixes come out -% with the same letter (or @) in the toc without it. -\newcount\appendixno \appendixno = `\@ -\def\appendixletter{\char\the\appendixno} - -% Each @chapter defines this as the name of the chapter. -% page headings and footings can use it. @section does likewise. -\def\thischapter{} -\def\thissection{} - -\newcount\absseclevel % used to calculate proper heading level -\newcount\secbase\secbase=0 % @raise/lowersections modify this count - -% @raisesections: treat @section as chapter, @subsection as section, etc. -\def\raisesections{\global\advance\secbase by -1} -\let\up=\raisesections % original BFox name - -% @lowersections: treat @chapter as section, @section as subsection, etc. -\def\lowersections{\global\advance\secbase by 1} -\let\down=\lowersections % original BFox name - -% Choose a numbered-heading macro -% #1 is heading level if unmodified by @raisesections or @lowersections -% #2 is text for heading -\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \chapterzzz{#2} -\or - \seczzz{#2} -\or - \numberedsubseczzz{#2} -\or - \numberedsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \chapterzzz{#2} - \else - \numberedsubsubseczzz{#2} - \fi -\fi -} - -% like \numhead, but chooses appendix heading levels -\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \appendixzzz{#2} -\or - \appendixsectionzzz{#2} -\or - \appendixsubseczzz{#2} -\or - \appendixsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \appendixzzz{#2} - \else - \appendixsubsubseczzz{#2} - \fi -\fi -} - -% like \numhead, but chooses numberless heading levels -\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \unnumberedzzz{#2} -\or - \unnumberedseczzz{#2} -\or - \unnumberedsubseczzz{#2} -\or - \unnumberedsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \unnumberedzzz{#2} - \else - \unnumberedsubsubseczzz{#2} - \fi -\fi -} - -% @chapter, @appendix, @unnumbered. -\def\thischaptername{No Chapter Title} -\outer\def\chapter{\parsearg\chapteryyy} -\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz -\def\chapterzzz #1{% -\secno=0 \subsecno=0 \subsubsecno=0 -\global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}% -\chapmacro {#1}{\the\chapno}% -\gdef\thissection{#1}% -\gdef\thischaptername{#1}% -% We don't substitute the actual chapter name into \thischapter -% because we don't want its macros evaluated now. -\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}% - {\the\chapno}}}% -\temp -\donoderef -\global\let\section = \numberedsec -\global\let\subsection = \numberedsubsec -\global\let\subsubsection = \numberedsubsubsec -} - -\outer\def\appendix{\parsearg\appendixyyy} -\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz -\def\appendixzzz #1{% -\secno=0 \subsecno=0 \subsubsecno=0 -\global\advance \appendixno by 1 -\message{\putwordAppendix\space \appendixletter}% -\chapmacro {#1}{\putwordAppendix{} \appendixletter}% -\gdef\thissection{#1}% -\gdef\thischaptername{#1}% -\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}% - {\putwordAppendix{} \appendixletter}}}% -\temp -\appendixnoderef -\global\let\section = \appendixsec -\global\let\subsection = \appendixsubsec -\global\let\subsubsection = \appendixsubsubsec -} - -% @centerchap is like @unnumbered, but the heading is centered. -\outer\def\centerchap{\parsearg\centerchapyyy} -\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}} - -% @top is like @unnumbered. -\outer\def\top{\parsearg\unnumberedyyy} - -\outer\def\unnumbered{\parsearg\unnumberedyyy} -\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz -\def\unnumberedzzz #1{% -\secno=0 \subsecno=0 \subsubsecno=0 -% -% This used to be simply \message{#1}, but TeX fully expands the -% argument to \message. Therefore, if #1 contained @-commands, TeX -% expanded them. For example, in `@unnumbered The @cite{Book}', TeX -% expanded @cite (which turns out to cause errors because \cite is meant -% to be executed, not expanded). -% -% Anyway, we don't want the fully-expanded definition of @cite to appear -% as a result of the \message, we just want `@cite' itself. We use -% \the to achieve this: TeX expands \the only once, -% simply yielding the contents of . (We also do this for -% the toc entries.) -\toks0 = {#1}\message{(\the\toks0)}% -% -\unnumbchapmacro {#1}% -\gdef\thischapter{#1}\gdef\thissection{#1}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash unnumbchapentry{\the\toks0}}}% -\temp -\unnumbnoderef -\global\let\section = \unnumberedsec -\global\let\subsection = \unnumberedsubsec -\global\let\subsubsection = \unnumberedsubsubsec -} - -% Sections. -\outer\def\numberedsec{\parsearg\secyyy} -\def\secyyy #1{\numhead1{#1}} % normally calls seczzz -\def\seczzz #1{% -\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % -\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}% - {\the\chapno}{\the\secno}}}% -\temp -\donoderef -\nobreak -} - -\outer\def\appendixsection{\parsearg\appendixsecyyy} -\outer\def\appendixsec{\parsearg\appendixsecyyy} -\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz -\def\appendixsectionzzz #1{% -\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % -\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}% - {\appendixletter}{\the\secno}}}% -\temp -\appendixnoderef -\nobreak -} - -\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} -\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz -\def\unnumberedseczzz #1{% -\plainsecheading {#1}\gdef\thissection{#1}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsecentry{\the\toks0}}}% -\temp -\unnumbnoderef -\nobreak -} - -% Subsections. -\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} -\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz -\def\numberedsubseczzz #1{% -\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % -\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}% - {\the\chapno}{\the\secno}{\the\subsecno}}}% -\temp -\donoderef -\nobreak -} - -\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} -\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz -\def\appendixsubseczzz #1{% -\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % -\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}% - {\appendixletter}{\the\secno}{\the\subsecno}}}% -\temp -\appendixnoderef -\nobreak -} - -\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} -\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz -\def\unnumberedsubseczzz #1{% -\plainsubsecheading {#1}\gdef\thissection{#1}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsecentry% - {\the\toks0}}}% -\temp -\unnumbnoderef -\nobreak -} - -% Subsubsections. -\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} -\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz -\def\numberedsubsubseczzz #1{% -\gdef\thissection{#1}\global\advance \subsubsecno by 1 % -\subsubsecheading {#1} - {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}% - {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}% -\temp -\donoderef -\nobreak -} - -\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} -\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz -\def\appendixsubsubseczzz #1{% -\gdef\thissection{#1}\global\advance \subsubsecno by 1 % -\subsubsecheading {#1} - {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}% - {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}% -\temp -\appendixnoderef -\nobreak -} - -\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} -\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz -\def\unnumberedsubsubseczzz #1{% -\plainsubsubsecheading {#1}\gdef\thissection{#1}% -\toks0 = {#1}% -\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsubsecentry% - {\the\toks0}}}% -\temp -\unnumbnoderef -\nobreak -} - -% These are variants which are not "outer", so they can appear in @ifinfo. -% Actually, they should now be obsolete; ordinary section commands should work. -\def\infotop{\parsearg\unnumberedzzz} -\def\infounnumbered{\parsearg\unnumberedzzz} -\def\infounnumberedsec{\parsearg\unnumberedseczzz} -\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} -\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} - -\def\infoappendix{\parsearg\appendixzzz} -\def\infoappendixsec{\parsearg\appendixseczzz} -\def\infoappendixsubsec{\parsearg\appendixsubseczzz} -\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} - -\def\infochapter{\parsearg\chapterzzz} -\def\infosection{\parsearg\sectionzzz} -\def\infosubsection{\parsearg\subsectionzzz} -\def\infosubsubsection{\parsearg\subsubsectionzzz} - -% These macros control what the section commands do, according -% to what kind of chapter we are in (ordinary, appendix, or unnumbered). -% Define them by default for a numbered chapter. -\global\let\section = \numberedsec -\global\let\subsection = \numberedsubsec -\global\let\subsubsection = \numberedsubsubsec - -% Define @majorheading, @heading and @subheading - -% NOTE on use of \vbox for chapter headings, section headings, and such: -% 1) We use \vbox rather than the earlier \line to permit -% overlong headings to fold. -% 2) \hyphenpenalty is set to 10000 because hyphenation in a -% heading is obnoxious; this forbids it. -% 3) Likewise, headings look best if no \parindent is used, and -% if justification is not attempted. Hence \raggedright. - - -\def\majorheading{\parsearg\majorheadingzzz} -\def\majorheadingzzz #1{% -{\advance\chapheadingskip by 10pt \chapbreak }% -{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 200} - -\def\chapheading{\parsearg\chapheadingzzz} -\def\chapheadingzzz #1{\chapbreak % -{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 200} - -% @heading, @subheading, @subsubheading. -\def\heading{\parsearg\plainsecheading} -\def\subheading{\parsearg\plainsubsecheading} -\def\subsubheading{\parsearg\plainsubsubsecheading} - -% These macros generate a chapter, section, etc. heading only -% (including whitespace, linebreaking, etc. around it), -% given all the information in convenient, parsed form. - -%%% Args are the skip and penalty (usually negative) -\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} - -\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} - -%%% Define plain chapter starts, and page on/off switching for it -% Parameter controlling skip before chapter headings (if needed) - -\newskip\chapheadingskip - -\def\chapbreak{\dobreak \chapheadingskip {-4000}} -\def\chappager{\par\vfill\supereject} -\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} - -\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} - -\def\CHAPPAGoff{% -\global\let\contentsalignmacro = \chappager -\global\let\pchapsepmacro=\chapbreak -\global\let\pagealignmacro=\chappager} - -\def\CHAPPAGon{% -\global\let\contentsalignmacro = \chappager -\global\let\pchapsepmacro=\chappager -\global\let\pagealignmacro=\chappager -\global\def\HEADINGSon{\HEADINGSsingle}} - -\def\CHAPPAGodd{ -\global\let\contentsalignmacro = \chapoddpage -\global\let\pchapsepmacro=\chapoddpage -\global\let\pagealignmacro=\chapoddpage -\global\def\HEADINGSon{\HEADINGSdouble}} - -\CHAPPAGon - -\def\CHAPFplain{ -\global\let\chapmacro=\chfplain -\global\let\unnumbchapmacro=\unnchfplain -\global\let\centerchapmacro=\centerchfplain} - -% Plain chapter opening. -% #1 is the text, #2 the chapter number or empty if unnumbered. -\def\chfplain#1#2{% - \pchapsepmacro - {% - \chapfonts \rm - \def\chapnum{#2}% - \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}% - \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright - \hangindent = \wd0 \centerparametersmaybe - \unhbox0 #1\par}% - }% - \nobreak\bigskip % no page break after a chapter title - \nobreak -} - -% Plain opening for unnumbered. -\def\unnchfplain#1{\chfplain{#1}{}} - -% @centerchap -- centered and unnumbered. -\let\centerparametersmaybe = \relax -\def\centerchfplain#1{{% - \def\centerparametersmaybe{% - \advance\rightskip by 3\rightskip - \leftskip = \rightskip - \parfillskip = 0pt - }% - \chfplain{#1}{}% -}} - -\CHAPFplain % The default - -\def\unnchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\nobreak -} - -\def\chfopen #1#2{\chapoddpage {\chapfonts -\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% -\par\penalty 5000 % -} - -\def\centerchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt - \hfill {\rm #1}\hfill}}\bigskip \par\nobreak -} - -\def\CHAPFopen{ -\global\let\chapmacro=\chfopen -\global\let\unnumbchapmacro=\unnchfopen -\global\let\centerchapmacro=\centerchfopen} - - -% Section titles. -\newskip\secheadingskip -\def\secheadingbreak{\dobreak \secheadingskip {-1000}} -\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}} -\def\plainsecheading#1{\sectionheading{sec}{}{#1}} - -% Subsection titles. -\newskip \subsecheadingskip -\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} -\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}} -\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}} - -% Subsubsection titles. -\let\subsubsecheadingskip = \subsecheadingskip -\let\subsubsecheadingbreak = \subsecheadingbreak -\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}} -\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}} - - -% Print any size section title. -% -% #1 is the section type (sec/subsec/subsubsec), #2 is the section -% number (maybe empty), #3 the text. -\def\sectionheading#1#2#3{% - {% - \expandafter\advance\csname #1headingskip\endcsname by \parskip - \csname #1headingbreak\endcsname - }% - {% - % Switch to the right set of fonts. - \csname #1fonts\endcsname \rm - % - % Only insert the separating space if we have a section number. - \def\secnum{#2}% - \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}% - % - \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright - \hangindent = \wd0 % zero if no section number - \unhbox0 #3}% - }% - \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak -} - - -\message{toc,} -% Table of contents. -\newwrite\tocfile - -% Write an entry to the toc file, opening it if necessary. -% Called from @chapter, etc. We supply {\folio} at the end of the -% argument, which will end up as the last argument to the \...entry macro. -% -% We open the .toc file here instead of at @setfilename or any other -% given time so that @contents can be put in the document anywhere. -% -\newif\iftocfileopened -\def\writetocentry#1{% - \iftocfileopened\else - \immediate\openout\tocfile = \jobname.toc - \global\tocfileopenedtrue - \fi - \iflinks \write\tocfile{#1{\folio}}\fi -} - -\newskip\contentsrightmargin \contentsrightmargin=1in -\newcount\savepageno -\newcount\lastnegativepageno \lastnegativepageno = -1 - -% Finish up the main text and prepare to read what we've written -% to \tocfile. -% -\def\startcontents#1{% - % If @setchapternewpage on, and @headings double, the contents should - % start on an odd page, unlike chapters. Thus, we maintain - % \contentsalignmacro in parallel with \pagealignmacro. - % From: Torbjorn Granlund - \contentsalignmacro - \immediate\closeout\tocfile - % - % Don't need to put `Contents' or `Short Contents' in the headline. - % It is abundantly clear what they are. - \unnumbchapmacro{#1}\def\thischapter{}% - \savepageno = \pageno - \begingroup % Set up to handle contents files properly. - \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 - % We can't do this, because then an actual ^ in a section - % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. - %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi - \raggedbottom % Worry more about breakpoints than the bottom. - \advance\hsize by -\contentsrightmargin % Don't use the full line length. - % - % Roman numerals for page numbers. - \ifnum \pageno>0 \pageno = \lastnegativepageno \fi -} - - -% Normal (long) toc. -\def\contents{% - \startcontents{\putwordTOC}% - \openin 1 \jobname.toc - \ifeof 1 \else - \closein 1 - \input \jobname.toc - \fi - \vfill \eject - \contentsalignmacro % in case @setchapternewpage odd is in effect - \endgroup - \lastnegativepageno = \pageno - \pageno = \savepageno -} - -% And just the chapters. -\def\summarycontents{% - \startcontents{\putwordShortTOC}% - % - \let\chapentry = \shortchapentry - \let\unnumbchapentry = \shortunnumberedentry - % We want a true roman here for the page numbers. - \secfonts - \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl - \rm - \hyphenpenalty = 10000 - \advance\baselineskip by 1pt % Open it up a little. - \def\secentry ##1##2##3##4{} - \def\unnumbsecentry ##1##2{} - \def\subsecentry ##1##2##3##4##5{} - \def\unnumbsubsecentry ##1##2{} - \def\subsubsecentry ##1##2##3##4##5##6{} - \def\unnumbsubsubsecentry ##1##2{} - \openin 1 \jobname.toc - \ifeof 1 \else - \closein 1 - \input \jobname.toc - \fi - \vfill \eject - \contentsalignmacro % in case @setchapternewpage odd is in effect - \endgroup - \lastnegativepageno = \pageno - \pageno = \savepageno -} -\let\shortcontents = \summarycontents - -\ifpdf - \pdfcatalog{/PageMode /UseOutlines}% -\fi - -% These macros generate individual entries in the table of contents. -% The first argument is the chapter or section name. -% The last argument is the page number. -% The arguments in between are the chapter number, section number, ... - -% Chapter-level things, for both the long and short contents. -\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} - -% See comments in \dochapentry re vbox and related settings -\def\shortchapentry#1#2#3{% - \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}% -} - -% Typeset the label for a chapter or appendix for the short contents. -% The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter. -% We could simplify the code here by writing out an \appendixentry -% command in the toc file for appendices, instead of using \chapentry -% for both, but it doesn't seem worth it. -\setbox0 = \hbox{\shortcontrm \putwordAppendix } -\newdimen\shortappendixwidth \shortappendixwidth = \wd0 - -\def\shortchaplabel#1{% - % We typeset #1 in a box of constant width, regardless of the text of - % #1, so the chapter titles will come out aligned. - \setbox0 = \hbox{#1}% - \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi - % - % This space should be plenty, since a single number is .5em, and the - % widest letter (M) is 1em, at least in the Computer Modern fonts. - % (This space doesn't include the extra space that gets added after - % the label; that gets put in by \shortchapentry above.) - \advance\dimen0 by 1.1em - \hbox to \dimen0{#1\hfil}% -} - -\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} -\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}} - -% Sections. -\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} -\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} - -% Subsections. -\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} -\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}} - -% And subsubsections. -\def\subsubsecentry#1#2#3#4#5#6{% - \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} -\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}} - -% This parameter controls the indentation of the various levels. -\newdimen\tocindent \tocindent = 3pc - -% Now for the actual typesetting. In all these, #1 is the text and #2 is the -% page number. -% -% If the toc has to be broken over pages, we want it to be at chapters -% if at all possible; hence the \penalty. -\def\dochapentry#1#2{% - \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip - \begingroup - \chapentryfonts - \tocentry{#1}{\dopageno{#2}}% - \endgroup - \nobreak\vskip .25\baselineskip plus.1\baselineskip -} - -\def\dosecentry#1#2{\begingroup - \secentryfonts \leftskip=\tocindent - \tocentry{#1}{\dopageno{#2}}% -\endgroup} - -\def\dosubsecentry#1#2{\begingroup - \subsecentryfonts \leftskip=2\tocindent - \tocentry{#1}{\dopageno{#2}}% -\endgroup} - -\def\dosubsubsecentry#1#2{\begingroup - \subsubsecentryfonts \leftskip=3\tocindent - \tocentry{#1}{\dopageno{#2}}% -\endgroup} - -% Final typesetting of a toc entry; we use the same \entry macro as for -% the index entries, but we want to suppress hyphenation here. (We -% can't do that in the \entry macro, since index entries might consist -% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) -\def\tocentry#1#2{\begingroup - \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks - % Do not use \turnoffactive in these arguments. Since the toc is - % typeset in cmr, so characters such as _ would come out wrong; we - % have to do the usual translation tricks. - \entry{#1}{#2}% -\endgroup} - -% Space between chapter (or whatever) number and the title. -\def\labelspace{\hskip1em \relax} - -\def\dopageno#1{{\rm #1}} -\def\doshortpageno#1{{\rm #1}} - -\def\chapentryfonts{\secfonts \rm} -\def\secentryfonts{\textfonts} -\let\subsecentryfonts = \textfonts -\let\subsubsecentryfonts = \textfonts - - -\message{environments,} -% @foo ... @end foo. - -% Since these characters are used in examples, it should be an even number of -% \tt widths. Each \tt character is 1en, so two makes it 1em. -% Furthermore, these definitions must come after we define our fonts. -\newbox\dblarrowbox \newbox\longdblarrowbox -\newbox\pushcharbox \newbox\bullbox -\newbox\equivbox \newbox\errorbox - -%{\tentt -%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} -%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil} -%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil} -%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil} -% Adapted from the manmac format (p.420 of TeXbook) -%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex -% depth .1ex\hfil} -%} - -% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. -\def\point{$\star$} -\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} -\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} -\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} -\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} - -% Adapted from the TeXbook's \boxit. -{\tentt \global\dimen0 = 3em}% Width of the box. -\dimen2 = .55pt % Thickness of rules -% The text. (`r' is open on the right, `e' somewhat less so on the left.) -\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} - -\global\setbox\errorbox=\hbox to \dimen0{\hfil - \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. - \advance\hsize by -2\dimen2 % Rules. - \vbox{ - \hrule height\dimen2 - \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. - \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. - \kern3pt\vrule width\dimen2}% Space to right. - \hrule height\dimen2} - \hfil} - -% The @error{} command. -\def\error{\leavevmode\lower.7ex\copy\errorbox} - -% @tex ... @end tex escapes into raw Tex temporarily. -% One exception: @ is still an escape character, so that @end tex works. -% But \@ or @@ will get a plain tex @ character. - -\def\tex{\begingroup - \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 - \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 - \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie - \catcode `\%=14 - \catcode 43=12 % plus - \catcode`\"=12 - \catcode`\==12 - \catcode`\|=12 - \catcode`\<=12 - \catcode`\>=12 - \escapechar=`\\ - % - \let\b=\ptexb - \let\bullet=\ptexbullet - \let\c=\ptexc - \let\,=\ptexcomma - \let\.=\ptexdot - \let\dots=\ptexdots - \let\equiv=\ptexequiv - \let\!=\ptexexclam - \let\i=\ptexi - \let\{=\ptexlbrace - \let\+=\tabalign - \let\}=\ptexrbrace - \let\*=\ptexstar - \let\t=\ptext - % - \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% - \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% - \def\@{@}% -\let\Etex=\endgroup} - -% Define @lisp ... @endlisp. -% @lisp does a \begingroup so it can rebind things, -% including the definition of @endlisp (which normally is erroneous). - -% Amount to narrow the margins by for @lisp. -\newskip\lispnarrowing \lispnarrowing=0.4in - -% This is the definition that ^^M gets inside @lisp, @example, and other -% such environments. \null is better than a space, since it doesn't -% have any width. -\def\lisppar{\null\endgraf} - -% Make each space character in the input produce a normal interword -% space in the output. Don't allow a line break at this space, as this -% is used only in environments like @example, where each line of input -% should produce a line of output anyway. -% -{\obeyspaces % -\gdef\sepspaces{\obeyspaces\let =\tie}} - -% Define \obeyedspace to be our active space, whatever it is. This is -% for use in \parsearg. -{\sepspaces% -\global\let\obeyedspace= } - -% This space is always present above and below environments. -\newskip\envskipamount \envskipamount = 0pt - -% Make spacing and below environment symmetrical. We use \parskip here -% to help in doing that, since in @example-like environments \parskip -% is reset to zero; thus the \afterenvbreak inserts no space -- but the -% start of the next paragraph will insert \parskip -% -\def\aboveenvbreak{{\advance\envskipamount by \parskip -\endgraf \ifdim\lastskip<\envskipamount -\removelastskip \penalty-50 \vskip\envskipamount \fi}} - -\let\afterenvbreak = \aboveenvbreak - -% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. -\let\nonarrowing=\relax - -% @cartouche ... @end cartouche: draw rectangle w/rounded corners around -% environment contents. -\font\circle=lcircle10 -\newdimen\circthick -\newdimen\cartouter\newdimen\cartinner -\newskip\normbskip\newskip\normpskip\newskip\normlskip -\circthick=\fontdimen8\circle -% -\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth -\def\ctr{{\hskip 6pt\circle\char'010}} -\def\cbl{{\circle\char'012\hskip -6pt}} -\def\cbr{{\hskip 6pt\circle\char'011}} -\def\carttop{\hbox to \cartouter{\hskip\lskip - \ctl\leaders\hrule height\circthick\hfil\ctr - \hskip\rskip}} -\def\cartbot{\hbox to \cartouter{\hskip\lskip - \cbl\leaders\hrule height\circthick\hfil\cbr - \hskip\rskip}} -% -\newskip\lskip\newskip\rskip - -\long\def\cartouche{% -\begingroup - \lskip=\leftskip \rskip=\rightskip - \leftskip=0pt\rightskip=0pt %we want these *outside*. - \cartinner=\hsize \advance\cartinner by-\lskip - \advance\cartinner by-\rskip - \cartouter=\hsize - \advance\cartouter by 18.4pt % allow for 3pt kerns on either -% side, and for 6pt waste from -% each corner char, and rule thickness - \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip - % Flag to tell @lisp, etc., not to narrow margin. - \let\nonarrowing=\comment - \vbox\bgroup - \baselineskip=0pt\parskip=0pt\lineskip=0pt - \carttop - \hbox\bgroup - \hskip\lskip - \vrule\kern3pt - \vbox\bgroup - \hsize=\cartinner - \kern3pt - \begingroup - \baselineskip=\normbskip - \lineskip=\normlskip - \parskip=\normpskip - \vskip -\parskip -\def\Ecartouche{% - \endgroup - \kern3pt - \egroup - \kern3pt\vrule - \hskip\rskip - \egroup - \cartbot - \egroup -\endgroup -}} - - -% This macro is called at the beginning of all the @example variants, -% inside a group. -\def\nonfillstart{% - \aboveenvbreak - \inENV % This group ends at the end of the body - \hfuzz = 12pt % Don't be fussy - \sepspaces % Make spaces be word-separators rather than space tokens. - \singlespace - \let\par = \lisppar % don't ignore blank lines - \obeylines % each line of input is a line of output - \parskip = 0pt - \parindent = 0pt - \emergencystretch = 0pt % don't try to avoid overfull boxes - % @cartouche defines \nonarrowing to inhibit narrowing - % at next level down. - \ifx\nonarrowing\relax - \advance \leftskip by \lispnarrowing - \exdentamount=\lispnarrowing - \let\exdent=\nofillexdent - \let\nonarrowing=\relax - \fi -} - -% Define the \E... control sequence only if we are inside the particular -% environment, so the error checking in \end will work. -% -% To end an @example-like environment, we first end the paragraph (via -% \afterenvbreak's vertical glue), and then the group. That way we keep -% the zero \parskip that the environments set -- \parskip glue will be -% inserted at the beginning of the next paragraph in the document, after -% the environment. -% -\def\nonfillfinish{\afterenvbreak\endgroup} - -% @lisp: indented, narrowed, typewriter font. -\def\lisp{\begingroup - \nonfillstart - \let\Elisp = \nonfillfinish - \tt - \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. - \gobble % eat return -} - -% @example: Same as @lisp. -\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} - -% @small... is usually equivalent to the non-small (@smallbook -% redefines). We must call \example (or whatever) last in the -% definition, since it reads the return following the @example (or -% whatever) command. -% -% This actually allows (for example) @end display inside an -% @smalldisplay. Too bad, but makeinfo will catch the error anyway. -% -\def\smalldisplay{\begingroup\def\Esmalldisplay{\nonfillfinish\endgroup}\display} -\def\smallexample{\begingroup\def\Esmallexample{\nonfillfinish\endgroup}\lisp} -\def\smallformat{\begingroup\def\Esmallformat{\nonfillfinish\endgroup}\format} -\def\smalllisp{\begingroup\def\Esmalllisp{\nonfillfinish\endgroup}\lisp} - -% Real @smallexample and @smalllisp (when @smallbook): use smaller fonts. -% Originally contributed by Pavel@xerox. -\def\smalllispx{\begingroup - \def\Esmalllisp{\nonfillfinish\endgroup}% - \def\Esmallexample{\nonfillfinish\endgroup}% - \indexfonts - \lisp -} - -% @display: same as @lisp except keep current font. -% -\def\display{\begingroup - \nonfillstart - \let\Edisplay = \nonfillfinish - \gobble -} - -% @smalldisplay (when @smallbook): @display plus smaller fonts. -% -\def\smalldisplayx{\begingroup - \def\Esmalldisplay{\nonfillfinish\endgroup}% - \indexfonts \rm - \display -} - -% @format: same as @display except don't narrow margins. -% -\def\format{\begingroup - \let\nonarrowing = t - \nonfillstart - \let\Eformat = \nonfillfinish - \gobble -} - -% @smallformat (when @smallbook): @format plus smaller fonts. -% -\def\smallformatx{\begingroup - \def\Esmallformat{\nonfillfinish\endgroup}% - \indexfonts \rm - \format -} - -% @flushleft (same as @format). -% -\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format} - -% @flushright. -% -\def\flushright{\begingroup - \let\nonarrowing = t - \nonfillstart - \let\Eflushright = \nonfillfinish - \advance\leftskip by 0pt plus 1fill - \gobble -} - -% @quotation does normal linebreaking (hence we can't use \nonfillstart) -% and narrows the margins. -% -\def\quotation{% - \begingroup\inENV %This group ends at the end of the @quotation body - {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip - \singlespace - \parindent=0pt - % We have retained a nonzero parskip for the environment, since we're - % doing normal filling. So to avoid extra space below the environment... - \def\Equotation{\parskip = 0pt \nonfillfinish}% - % - % @cartouche defines \nonarrowing to inhibit narrowing at next level down. - \ifx\nonarrowing\relax - \advance\leftskip by \lispnarrowing - \advance\rightskip by \lispnarrowing - \exdentamount = \lispnarrowing - \let\nonarrowing = \relax - \fi -} - - -\message{defuns,} -% @defun etc. - -% Allow user to change definition object font (\df) internally -\def\setdeffont #1 {\csname DEF#1\endcsname} - -\newskip\defbodyindent \defbodyindent=.4in -\newskip\defargsindent \defargsindent=50pt -\newskip\deftypemargin \deftypemargin=12pt -\newskip\deflastargmargin \deflastargmargin=18pt - -\newcount\parencount -% define \functionparens, which makes ( and ) and & do special things. -% \functionparens affects the group it is contained in. -\def\activeparens{% -\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active -\catcode`\[=\active \catcode`\]=\active} - -% Make control sequences which act like normal parenthesis chars. -\let\lparen = ( \let\rparen = ) - -{\activeparens % Now, smart parens don't turn on until &foo (see \amprm) - -% Be sure that we always have a definition for `(', etc. For example, -% if the fn name has parens in it, \boldbrax will not be in effect yet, -% so TeX would otherwise complain about undefined control sequence. -\global\let(=\lparen \global\let)=\rparen -\global\let[=\lbrack \global\let]=\rbrack - -\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } -\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} -% This is used to turn on special parens -% but make & act ordinary (given that it's active). -\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr} - -% Definitions of (, ) and & used in args for functions. -% This is the definition of ( outside of all parentheses. -\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested - \global\advance\parencount by 1 -} -% -% This is the definition of ( when already inside a level of parens. -\gdef\opnested{\char`\(\global\advance\parencount by 1 } -% -\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. - % also in that case restore the outer-level definition of (. - \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi - \global\advance \parencount by -1 } -% If we encounter &foo, then turn on ()-hacking afterwards -\gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } -% -\gdef\normalparens{\boldbrax\let&=\ampnr} -} % End of definition inside \activeparens -%% These parens (in \boldbrax) actually are a little bolder than the -%% contained text. This is especially needed for [ and ] -\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 } -\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 } -\let\ampnr = \& -\def\lbrb{{\bf\char`\[}} -\def\rbrb{{\bf\char`\]}} - -% Active &'s sneak into the index arguments, so make sure it's defined. -{ - \catcode`& = 13 - \global\let& = \ampnr -} - -% First, defname, which formats the header line itself. -% #1 should be the function name. -% #2 should be the type of definition, such as "Function". - -\def\defname #1#2{% -% Get the values of \leftskip and \rightskip as they were -% outside the @def... -\dimen2=\leftskip -\advance\dimen2 by -\defbodyindent -\noindent -\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% -\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line -\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations -\parshape 2 0in \dimen0 \defargsindent \dimen1 -% Now output arg 2 ("Function" or some such) -% ending at \deftypemargin from the right margin, -% but stuck inside a box of width 0 so it does not interfere with linebreaking -{% Adjust \hsize to exclude the ambient margins, -% so that \rightline will obey them. -\advance \hsize by -\dimen2 -\rlap{\rightline{{\rm #2}\hskip -1.25pc }}}% -% Make all lines underfull and no complaints: -\tolerance=10000 \hbadness=10000 -\advance\leftskip by -\defbodyindent -\exdentamount=\defbodyindent -{\df #1}\enskip % Generate function name -} - -% Actually process the body of a definition -% #1 should be the terminating control sequence, such as \Edefun. -% #2 should be the "another name" control sequence, such as \defunx. -% #3 should be the control sequence that actually processes the header, -% such as \defunheader. - -\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2{\begingroup\obeylines\activeparens\spacesplit#3}% -\parindent=0in -\advance\leftskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup % -\catcode 61=\active % 61 is `=' -\obeylines\activeparens\spacesplit#3} - -% #1 is the \E... control sequence to end the definition (which we define). -% #2 is the \...x control sequence for consecutive fns (which we define). -% #3 is the control sequence to call to resume processing. -% #4, delimited by the space, is the class name. -% -\def\defmethparsebody#1#2#3#4 {\begingroup\inENV % -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}% -\parindent=0in -\advance\leftskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup\obeylines\activeparens\spacesplit{#3{#4}}} - -% @deftypemethod has an extra argument that nothing else does. Sigh. -% #1 is the \E... control sequence to end the definition (which we define). -% #2 is the \...x control sequence for consecutive fns (which we define). -% #3 is the control sequence to call to resume processing. -% #4, delimited by the space, is the class name. -% #5 is the method's return type. -% -\def\deftypemethparsebody#1#2#3#4 #5 {\begingroup\inENV % -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}% -\parindent=0in -\advance\leftskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup\obeylines\activeparens\spacesplit{#3{#4}{#5}}} - -\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2##1 ##2 {\def#4{##1}% -\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}% -\parindent=0in -\advance\leftskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup\obeylines\activeparens\spacesplit{#3{#5}}} - -% These parsing functions are similar to the preceding ones -% except that they do not make parens into active characters. -% These are used for "variables" since they have no arguments. - -\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2{\begingroup\obeylines\spacesplit#3}% -\parindent=0in -\advance\leftskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup % -\catcode 61=\active % -\obeylines\spacesplit#3} - -% This is used for \def{tp,vr}parsebody. It could probably be used for -% some of the others, too, with some judicious conditionals. -% -\def\parsebodycommon#1#2#3{% - \begingroup\inENV % - \medbreak % - % Define the end token that this defining construct specifies - % so that it will exit this group. - \def#1{\endgraf\endgroup\medbreak}% - \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% - \parindent=0in - \advance\leftskip by \defbodyindent - \exdentamount=\defbodyindent - \begingroup\obeylines -} - -\def\defvrparsebody#1#2#3#4 {% - \parsebodycommon{#1}{#2}{#3}% - \spacesplit{#3{#4}}% -} - -% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the -% type is just `struct', because we lose the braces in `{struct -% termios}' when \spacesplit reads its undelimited argument. Sigh. -% \let\deftpparsebody=\defvrparsebody -% -% So, to get around this, we put \empty in with the type name. That -% way, TeX won't find exactly `{...}' as an undelimited argument, and -% won't strip off the braces. -% -\def\deftpparsebody #1#2#3#4 {% - \parsebodycommon{#1}{#2}{#3}% - \spacesplit{\parsetpheaderline{#3{#4}}}\empty -} - -% Fine, but then we have to eventually remove the \empty *and* the -% braces (if any). That's what this does. -% -\def\removeemptybraces\empty#1\relax{#1} - -% After \spacesplit has done its work, this is called -- #1 is the final -% thing to call, #2 the type name (which starts with \empty), and #3 -% (which might be empty) the arguments. -% -\def\parsetpheaderline#1#2#3{% - #1{\removeemptybraces#2\relax}{#3}% -}% - -\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2##1 ##2 {\def#4{##1}% -\begingroup\obeylines\spacesplit{#3{##2}}}% -\parindent=0in -\advance\leftskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup\obeylines\spacesplit{#3{#5}}} - -% Split up #2 at the first space token. -% call #1 with two arguments: -% the first is all of #2 before the space token, -% the second is all of #2 after that space token. -% If #2 contains no space token, all of it is passed as the first arg -% and the second is passed as empty. - -{\obeylines -\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}% -\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{% -\ifx\relax #3% -#1{#2}{}\else #1{#2}{#3#4}\fi}} - -% So much for the things common to all kinds of definitions. - -% Define @defun. - -% First, define the processing that is wanted for arguments of \defun -% Use this to expand the args and terminate the paragraph they make up - -\def\defunargs#1{\functionparens \sl -% Expand, preventing hyphenation at `-' chars. -% Note that groups don't affect changes in \hyphenchar. -% Set the font temporarily and use \font in case \setfont made \tensl a macro. -{\tensl\hyphenchar\font=0}% -#1% -{\tensl\hyphenchar\font=45}% -\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi% -\interlinepenalty=10000 -\advance\rightskip by 0pt plus 1fil -\endgraf\nobreak\vskip -\parskip\nobreak -} - -\def\deftypefunargs #1{% -% Expand, preventing hyphenation at `-' chars. -% Note that groups don't affect changes in \hyphenchar. -% Use \boldbraxnoamp, not \functionparens, so that & is not special. -\boldbraxnoamp -\tclose{#1}% avoid \code because of side effects on active chars -\interlinepenalty=10000 -\advance\rightskip by 0pt plus 1fil -\endgraf\nobreak\vskip -\parskip\nobreak -} - -% Do complete processing of one @defun or @defunx line already parsed. - -% @deffn Command forward-char nchars - -\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} - -\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% -\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @defun == @deffn Function - -\def\defun{\defparsebody\Edefun\defunx\defunheader} - -\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{\putwordDeffunc}% -\defunargs {#2}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @deftypefun int foobar (int @var{foo}, float @var{bar}) - -\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} - -% #1 is the data type. #2 is the name and args. -\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} -% #1 is the data type, #2 the name, #3 the args. -\def\deftypefunheaderx #1#2 #3\relax{% -\doind {fn}{\code{#2}}% Make entry in function index -\begingroup\defname {\defheaderxcond#1\relax$$$#2}{\putwordDeftypefun}% -\deftypefunargs {#3}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) - -\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} - -% \defheaderxcond#1\relax$$$ -% puts #1 in @code, followed by a space, but does nothing if #1 is null. -\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi} - -% #1 is the classification. #2 is the data type. #3 is the name and args. -\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} -% #1 is the classification, #2 the data type, #3 the name, #4 the args. -\def\deftypefnheaderx #1#2#3 #4\relax{% -\doind {fn}{\code{#3}}% Make entry in function index -\begingroup -\normalparens % notably, turn off `&' magic, which prevents -% at least some C++ text from working -\defname {\defheaderxcond#2\relax$$$#3}{#1}% -\deftypefunargs {#4}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @defmac == @deffn Macro - -\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} - -\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{\putwordDefmac}% -\defunargs {#2}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @defspec == @deffn Special Form - -\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} - -\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{\putwordDefspec}% -\defunargs {#2}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @defop CATEGORY CLASS OPERATION ARG... -% -\def\defop #1 {\def\defoptype{#1}% -\defopparsebody\Edefop\defopx\defopheader\defoptype} -% -\def\defopheader #1#2#3{% -\dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index -\begingroup\defname {#2}{\defoptype\ \putwordon\ #1}% -\defunargs {#3}\endgroup % -} - -% @deftypemethod CLASS RETURN-TYPE METHOD ARG... -% -\def\deftypemethod{% - \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader} -% -% #1 is the class name, #2 the data type, #3 the method name, #4 the args. -\def\deftypemethodheader#1#2#3#4{% - \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index - \begingroup - \defname{\defheaderxcond#2\relax$$$#3}{\putwordMethodon\ \code{#1}}% - \deftypefunargs{#4}% - \endgroup -} - -% @deftypeivar CLASS TYPE VARNAME -% -\def\deftypeivar{% - \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader} -% -% #1 is the class name, #2 the data type, #3 the variable name. -\def\deftypeivarheader#1#2#3{% - \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index - \begingroup - \defname{#3}{\putwordInstanceVariableof\ \code{#1}}% - \defvarargs{#3}% - \endgroup -} - -% @defmethod == @defop Method -% -\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} -% -% #1 is the class name, #2 the method name, #3 the args. -\def\defmethodheader#1#2#3{% - \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index - \begingroup - \defname{#2}{\putwordMethodon\ \code{#1}}% - \defunargs{#3}% - \endgroup -} - -% @defcv {Class Option} foo-class foo-flag - -\def\defcv #1 {\def\defcvtype{#1}% -\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} - -\def\defcvarheader #1#2#3{% -\dosubind {vr}{\code{#2}}{\putwordof\ #1}% Make entry in var index -\begingroup\defname {#2}{\defcvtype\ \putwordof\ #1}% -\defvarargs {#3}\endgroup % -} - -% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME -% -\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} -% -\def\defivarheader#1#2#3{% - \dosubind {vr}{\code{#2}}{\putwordof\ #1}% entry in var index - \begingroup - \defname{#2}{\putwordInstanceVariableof\ #1}% - \defvarargs{#3}% - \endgroup -} - -% @defvar -% First, define the processing that is wanted for arguments of @defvar. -% This is actually simple: just print them in roman. -% This must expand the args and terminate the paragraph they make up -\def\defvarargs #1{\normalparens #1% -\interlinepenalty=10000 -\endgraf\nobreak\vskip -\parskip\nobreak} - -% @defvr Counter foo-count - -\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} - -\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% -\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} - -% @defvar == @defvr Variable - -\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} - -\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index -\begingroup\defname {#1}{\putwordDefvar}% -\defvarargs {#2}\endgroup % -} - -% @defopt == @defvr {User Option} - -\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} - -\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index -\begingroup\defname {#1}{\putwordDefopt}% -\defvarargs {#2}\endgroup % -} - -% @deftypevar int foobar - -\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} - -% #1 is the data type. #2 is the name, perhaps followed by text that -% is actually part of the data type, which should not be put into the index. -\def\deftypevarheader #1#2{% -\dovarind#2 \relax% Make entry in variables index -\begingroup\defname {\defheaderxcond#1\relax$$$#2}{\putwordDeftypevar}% -\interlinepenalty=10000 -\endgraf\nobreak\vskip -\parskip\nobreak -\endgroup} -\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}} - -% @deftypevr {Global Flag} int enable - -\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} - -\def\deftypevrheader #1#2#3{\dovarind#3 \relax% -\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} -\interlinepenalty=10000 -\endgraf\nobreak\vskip -\parskip\nobreak -\endgroup} - -% Now define @deftp -% Args are printed in bold, a slight difference from @defvar. - -\def\deftpargs #1{\bf \defvarargs{#1}} - -% @deftp Class window height width ... - -\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} - -\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% -\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} - -% These definitions are used if you use @defunx (etc.) -% anywhere other than immediately after a @defun or @defunx. -% -\def\defcvx#1 {\errmessage{@defcvx in invalid context}} -\def\deffnx#1 {\errmessage{@deffnx in invalid context}} -\def\defivarx#1 {\errmessage{@defivarx in invalid context}} -\def\defmacx#1 {\errmessage{@defmacx in invalid context}} -\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}} -\def\defoptx #1 {\errmessage{@defoptx in invalid context}} -\def\defopx#1 {\errmessage{@defopx in invalid context}} -\def\defspecx#1 {\errmessage{@defspecx in invalid context}} -\def\deftpx#1 {\errmessage{@deftpx in invalid context}} -\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}} -\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}} -\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}} -\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}} -\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}} -\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}} -\def\defunx#1 {\errmessage{@defunx in invalid context}} -\def\defvarx#1 {\errmessage{@defvarx in invalid context}} -\def\defvrx#1 {\errmessage{@defvrx in invalid context}} - - -\message{macros,} -% @macro. - -% To do this right we need a feature of e-TeX, \scantokens, -% which we arrange to emulate with a temporary file in ordinary TeX. -\ifx\eTeXversion\undefined - \newwrite\macscribble - \def\scanmacro#1{% - \begingroup \newlinechar`\^^M - % Undo catcode changes of \startcontents and \doprintindex - \catcode`\@=0 \catcode`\\=12 \escapechar=`\@ - % Append \endinput to make sure that TeX does not see the ending newline. - \toks0={#1\endinput}% - \immediate\openout\macscribble=\jobname.tmp - \immediate\write\macscribble{\the\toks0}% - \immediate\closeout\macscribble - \let\xeatspaces\eatspaces - \input \jobname.tmp - \endgroup -} -\else -\def\scanmacro#1{% -\begingroup \newlinechar`\^^M -% Undo catcode changes of \startcontents and \doprintindex -\catcode`\@=0 \catcode`\\=12 \escapechar=`\@ -\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup} -\fi - -\newcount\paramno % Count of parameters -\newtoks\macname % Macro name -\newif\ifrecursive % Is it recursive? -\def\macrolist{} % List of all defined macros in the form - % \do\macro1\do\macro2... - -% Utility routines. -% Thisdoes \let #1 = #2, except with \csnames. -\def\cslet#1#2{% -\expandafter\expandafter -\expandafter\let -\expandafter\expandafter -\csname#1\endcsname -\csname#2\endcsname} - -% Trim leading and trailing spaces off a string. -% Concepts from aro-bend problem 15 (see CTAN). -{\catcode`\@=11 -\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} -\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} -\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} -\def\unbrace#1{#1} -\unbrace{\gdef\trim@@@ #1 } #2@{#1} -} - -% Trim a single trailing ^^M off a string. -{\catcode`\^^M=12\catcode`\Q=3% -\gdef\eatcr #1{\eatcra #1Q^^MQ}% -\gdef\eatcra#1^^MQ{\eatcrb#1Q}% -\gdef\eatcrb#1Q#2Q{#1}% -} - -% Macro bodies are absorbed as an argument in a context where -% all characters are catcode 10, 11 or 12, except \ which is active -% (as in normal texinfo). It is necessary to change the definition of \. - -% It's necessary to have hard CRs when the macro is executed. This is -% done by making ^^M (\endlinechar) catcode 12 when reading the macro -% body, and then making it the \newlinechar in \scanmacro. - -\def\macrobodyctxt{% - \catcode`\~=12 - \catcode`\^=12 - \catcode`\_=12 - \catcode`\|=12 - \catcode`\<=12 - \catcode`\>=12 - \catcode`\+=12 - \catcode`\{=12 - \catcode`\}=12 - \catcode`\@=12 - \catcode`\^^M=12 - \usembodybackslash} - -\def\macroargctxt{% - \catcode`\~=12 - \catcode`\^=12 - \catcode`\_=12 - \catcode`\|=12 - \catcode`\<=12 - \catcode`\>=12 - \catcode`\+=12 - \catcode`\@=12 - \catcode`\\=12} - -% \mbodybackslash is the definition of \ in @macro bodies. -% It maps \foo\ => \csname macarg.foo\endcsname => #N -% where N is the macro parameter number. -% We define \csname macarg.\endcsname to be \realbackslash, so -% \\ in macro replacement text gets you a backslash. - -{\catcode`@=0 @catcode`@\=@active - @gdef@usembodybackslash{@let\=@mbodybackslash} - @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} -} -\expandafter\def\csname macarg.\endcsname{\realbackslash} - -\def\macro{\recursivefalse\parsearg\macroxxx} -\def\rmacro{\recursivetrue\parsearg\macroxxx} - -\def\macroxxx#1{% - \getargs{#1}% now \macname is the macname and \argl the arglist - \ifx\argl\empty % no arguments - \paramno=0% - \else - \expandafter\parsemargdef \argl;% - \fi - \if1\csname ismacro.\the\macname\endcsname - \message{Warning: redefining \the\macname}% - \else - \expandafter\ifx\csname \the\macname\endcsname \relax - \else \errmessage{The name \the\macname\space is reserved}\fi - \global\cslet{macsave.\the\macname}{\the\macname}% - \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% - % Add the macroname to \macrolist - \toks0 = \expandafter{\macrolist\do}% - \xdef\macrolist{\the\toks0 - \expandafter\noexpand\csname\the\macname\endcsname}% - \fi - \begingroup \macrobodyctxt - \ifrecursive \expandafter\parsermacbody - \else \expandafter\parsemacbody - \fi} - -\def\unmacro{\parsearg\unmacroxxx} -\def\unmacroxxx#1{% - \if1\csname ismacro.#1\endcsname - \global\cslet{#1}{macsave.#1}% - \global\expandafter\let \csname ismacro.#1\endcsname=0% - % Remove the macro name from \macrolist - \begingroup - \edef\tempa{\expandafter\noexpand\csname#1\endcsname}% - \def\do##1{% - \def\tempb{##1}% - \ifx\tempa\tempb - % remove this - \else - \toks0 = \expandafter{\newmacrolist\do}% - \edef\newmacrolist{\the\toks0\expandafter\noexpand\tempa}% - \fi}% - \def\newmacrolist{}% - % Execute macro list to define \newmacrolist - \macrolist - \global\let\macrolist\newmacrolist - \endgroup - \else - \errmessage{Macro #1 not defined}% - \fi -} - -% This makes use of the obscure feature that if the last token of a -% is #, then the preceding argument is delimited by -% an opening brace, and that opening brace is not consumed. -\def\getargs#1{\getargsxxx#1{}} -\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} -\def\getmacname #1 #2\relax{\macname={#1}} -\def\getmacargs#1{\def\argl{#1}} - -% Parse the optional {params} list. Set up \paramno and \paramlist -% so \defmacro knows what to do. Define \macarg.blah for each blah -% in the params list, to be ##N where N is the position in that list. -% That gets used by \mbodybackslash (above). - -% We need to get `macro parameter char #' into several definitions. -% The technique used is stolen from LaTeX: let \hash be something -% unexpandable, insert that wherever you need a #, and then redefine -% it to # just before using the token list produced. -% -% The same technique is used to protect \eatspaces till just before -% the macro is used. - -\def\parsemargdef#1;{\paramno=0\def\paramlist{}% - \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} -\def\parsemargdefxxx#1,{% - \if#1;\let\next=\relax - \else \let\next=\parsemargdefxxx - \advance\paramno by 1% - \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname - {\xeatspaces{\hash\the\paramno}}% - \edef\paramlist{\paramlist\hash\the\paramno,}% - \fi\next} - -% These two commands read recursive and nonrecursive macro bodies. -% (They're different since rec and nonrec macros end differently.) - -\long\def\parsemacbody#1@end macro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% -\long\def\parsermacbody#1@end rmacro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% - -% This defines the macro itself. There are six cases: recursive and -% nonrecursive macros of zero, one, and many arguments. -% Much magic with \expandafter here. -% \xdef is used so that macro definitions will survive the file -% they're defined in; @include reads the file inside a group. -\def\defmacro{% - \let\hash=##% convert placeholders to macro parameter chars - \ifrecursive - \ifcase\paramno - % 0 - \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\scanmacro{\temp}}% - \or % 1 - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \noexpand\braceorline - \expandafter\noexpand\csname\the\macname xxx\endcsname}% - \expandafter\xdef\csname\the\macname xxx\endcsname##1{% - \egroup\noexpand\scanmacro{\temp}}% - \else % many - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \noexpand\csname\the\macname xx\endcsname}% - \expandafter\xdef\csname\the\macname xx\endcsname##1{% - \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% - \expandafter\expandafter - \expandafter\xdef - \expandafter\expandafter - \csname\the\macname xxx\endcsname - \paramlist{\egroup\noexpand\scanmacro{\temp}}% - \fi - \else - \ifcase\paramno - % 0 - \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% - \or % 1 - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \noexpand\braceorline - \expandafter\noexpand\csname\the\macname xxx\endcsname}% - \expandafter\xdef\csname\the\macname xxx\endcsname##1{% - \egroup - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% - \else % many - \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \expandafter\noexpand\csname\the\macname xx\endcsname}% - \expandafter\xdef\csname\the\macname xx\endcsname##1{% - \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% - \expandafter\expandafter - \expandafter\xdef - \expandafter\expandafter - \csname\the\macname xxx\endcsname - \paramlist{% - \egroup - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% - \fi - \fi} - -\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} - -% \braceorline decides whether the next nonwhitespace character is a -% {. If so it reads up to the closing }, if not, it reads the whole -% line. Whatever was read is then fed to the next control sequence -% as an argument (by \parsebrace or \parsearg) -\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx} -\def\braceorlinexxx{% - \ifx\nchar\bgroup\else - \expandafter\parsearg - \fi \next} - -% We mant to disable all macros during \shipout so that they are not -% expanded by \write. -\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}% - \edef\next{\macrolist}\expandafter\endgroup\next} - - -% @alias. -\def\alias#1=#2{\gdef#1{#2}} - - -\message{cross references,} -% @xref etc. - -\newwrite\auxfile - -\newif\ifhavexrefs % True if xref values are known. -\newif\ifwarnedxrefs % True if we warned once that they aren't known. - -% @inforef is relatively simple. -\def\inforef #1{\inforefzzz #1,,,,**} -\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, - node \samp{\ignorespaces#1{}}} - -% @node's job is to define \lastnode. -\def\node{\ENVcheck\parsearg\nodezzz} -\def\nodezzz#1{\nodexxx [#1,]} -\def\nodexxx[#1,#2]{\gdef\lastnode{#1}} -\let\nwnode=\node -\let\lastnode=\relax - -% The sectioning commands (@chapter, etc.) call these. -\def\donoderef{% - \ifx\lastnode\relax\else - \expandafter\expandafter\expandafter\setref{\lastnode}% - {Ysectionnumberandtype}% - \global\let\lastnode=\relax - \fi -} -\def\unnumbnoderef{% - \ifx\lastnode\relax\else - \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}% - \global\let\lastnode=\relax - \fi -} -\def\appendixnoderef{% - \ifx\lastnode\relax\else - \expandafter\expandafter\expandafter\setref{\lastnode}% - {Yappendixletterandtype}% - \global\let\lastnode=\relax - \fi -} - - -% @anchor{NAME} -- define xref target at arbitrary point. -% -{ \catcode`\@ = 11 -% From latex.ltx, to make @anchor truely invisible. -\newdimen\@savsk -\newcount\@savsf -\gdef\@bsphack{\relax - \ifhmode \@savsk\lastskip \@savsf\spacefactor \fi -} -\gdef\@esphack{\relax - \ifhmode \spacefactor\@savsf - \ifdim\@savsk>\z@ \ignorespaces \fi - \fi -} -\gdef\anchor#1{\@bsphack \setref{#1}{Ynothing}\@esphack} -} - -% \setref{NAME}{SNT} defines a cross-reference point NAME, namely -% NAME-title, NAME-pg, and NAME-SNT. Called from \foonoderef. We have -% to set \indexdummies so commands such as @code in a section title -% aren't expanded. It would be nicer not to expand the titles in the -% first place, but there's so many layers that that is hard to do. -% -\def\setref#1#2{{% - \indexdummies - \ifpdf \pdfmkdest{#1}\fi - \dosetq{#1-title}{Ytitle}% - \dosetq{#1-pg}{Ypagenumber}% - \dosetq{#1-snt}{#2}% -}} - -% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is -% the node name, #2 the name of the Info cross-reference, #3 the printed -% node name, #4 the name of the Info file, #5 the name of the printed -% manual. All but the node name can be omitted. -% -\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} -\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} -\def\ref#1{\xrefX[#1,,,,,,,]} -\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup - \def\printedmanual{\ignorespaces #5}% - \def\printednodename{\ignorespaces #3}% - \setbox1=\hbox{\printedmanual}% - \setbox0=\hbox{\printednodename}% - \ifdim \wd0 = 0pt - % No printed node name was explicitly given. - \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax - % Use the node name inside the square brackets. - \def\printednodename{\ignorespaces #1}% - \else - % Use the actual chapter/section title appear inside - % the square brackets. Use the real section title if we have it. - \ifdim \wd1 > 0pt - % It is in another manual, so we don't have it. - \def\printednodename{\ignorespaces #1}% - \else - \ifhavexrefs - % We know the real title if we have the xref values. - \def\printednodename{\refx{#1-title}{}}% - \else - % Otherwise just copy the Info node name. - \def\printednodename{\ignorespaces #1}% - \fi% - \fi - \fi - \fi - % - % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not - % insert empty discretionaries after hyphens, which means that it will - % not find a line break at a hyphen in a node names. Since some manuals - % are best written with fairly long node names, containing hyphens, this - % is a loss. Therefore, we give the text of the node name again, so it - % is as if TeX is seeing it for the first time. - \ifpdf - \leavevmode - \getfilename{#4}% - \ifnum\filenamelength>0 - \pdfannotlink attr{/Border [0 0 0]}% - goto file{\the\filename.pdf} name{#1@}% - \else - \pdfannotlink attr{/Border [0 0 0]}% - goto name{#1@}% - \fi - \BlueGreen - \fi - % - \ifdim \wd1 > 0pt - \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}% - \else - % _ (for example) has to be the character _ for the purposes of the - % control sequence corresponding to the node, but it has to expand - % into the usual \leavevmode...\vrule stuff for purposes of - % printing. So we \turnoffactive for the \refx-snt, back on for the - % printing, back off for the \refx-pg. - {\normalturnoffactive - % Only output a following space if the -snt ref is nonempty; for - % @unnumbered and @anchor, it won't be. - \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% - \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi - }% - % [mynode], - [\printednodename],\space - % page 3 - \turnoffactive \putwordpage\tie\refx{#1-pg}{}% - \fi - \ifpdf \Black\pdfendlink \fi -\endgroup} - -% \dosetq is the interface for calls from other macros - -% Use \normalturnoffactive so that punctuation chars such as underscore -% and backslash work in node names. (\turnoffactive doesn't do \.) -\def\dosetq#1#2{% - {\let\folio=0% - \normalturnoffactive - \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}% - \iflinks - \next - \fi - }% -} - -% \internalsetq {foo}{page} expands into -% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...} -% When the aux file is read, ' is the escape character - -\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}} - -% Things to be expanded by \internalsetq - -\def\Ypagenumber{\folio} - -\def\Ytitle{\thissection} - -\def\Ynothing{} - -\def\Ysectionnumberandtype{% -\ifnum\secno=0 \putwordChapter\xreftie\the\chapno % -\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno % -\else \ifnum \subsubsecno=0 % -\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno % -\else % -\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % -\fi \fi \fi } - -\def\Yappendixletterandtype{% -\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}% -\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno % -\else \ifnum \subsubsecno=0 % -\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno % -\else % -\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % -\fi \fi \fi } - -\gdef\xreftie{'tie} - -% Use TeX 3.0's \inputlineno to get the line number, for better error -% messages, but if we're using an old version of TeX, don't do anything. -% -\ifx\inputlineno\thisisundefined - \let\linenumber = \empty % Non-3.0. -\else - \def\linenumber{\the\inputlineno:\space} -\fi - -% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. -% If its value is nonempty, SUFFIX is output afterward. - -\def\refx#1#2{% - \expandafter\ifx\csname X#1\endcsname\relax - % If not defined, say something at least. - \angleleft un\-de\-fined\angleright - \iflinks - \ifhavexrefs - \message{\linenumber Undefined cross reference `#1'.}% - \else - \ifwarnedxrefs\else - \global\warnedxrefstrue - \message{Cross reference values unknown; you must run TeX again.}% - \fi - \fi - \fi - \else - % It's defined, so just use it. - \csname X#1\endcsname - \fi - #2% Output the suffix in any case. -} - -% This is the macro invoked by entries in the aux file. -% -\def\xrdef#1{\begingroup - % Reenable \ as an escape while reading the second argument. - \catcode`\\ = 0 - \afterassignment\endgroup - \expandafter\gdef\csname X#1\endcsname -} - -% Read the last existing aux file, if any. No error if none exists. -\def\readauxfile{\begingroup - \catcode`\^^@=\other - \catcode`\^^A=\other - \catcode`\^^B=\other - \catcode`\^^C=\other - \catcode`\^^D=\other - \catcode`\^^E=\other - \catcode`\^^F=\other - \catcode`\^^G=\other - \catcode`\^^H=\other - \catcode`\^^K=\other - \catcode`\^^L=\other - \catcode`\^^N=\other - \catcode`\^^P=\other - \catcode`\^^Q=\other - \catcode`\^^R=\other - \catcode`\^^S=\other - \catcode`\^^T=\other - \catcode`\^^U=\other - \catcode`\^^V=\other - \catcode`\^^W=\other - \catcode`\^^X=\other - \catcode`\^^Z=\other - \catcode`\^^[=\other - \catcode`\^^\=\other - \catcode`\^^]=\other - \catcode`\^^^=\other - \catcode`\^^_=\other - \catcode`\@=\other - \catcode`\^=\other - % It was suggested to define this as 7, which would allow ^^e4 etc. - % in xref tags, i.e., node names. But since ^^e4 notation isn't - % supported in the main text, it doesn't seem desirable. Furthermore, - % that is not enough: for node names that actually contain a ^ - % character, we would end up writing a line like this: 'xrdef {'hat - % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first - % argument, and \hat is not an expandable control sequence. It could - % all be worked out, but why? Either we support ^^ or we don't. - % - % The other change necessary for this was to define \auxhat: - % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter - % and then to call \auxhat in \setq. - % - \catcode`\~=\other - \catcode`\[=\other - \catcode`\]=\other - \catcode`\"=\other - \catcode`\_=\other - \catcode`\|=\other - \catcode`\<=\other - \catcode`\>=\other - \catcode`\$=\other - \catcode`\#=\other - \catcode`\&=\other - \catcode`+=\other % avoid \+ for paranoia even though we've turned it off - % Make the characters 128-255 be printing characters - {% - \count 1=128 - \def\loop{% - \catcode\count 1=\other - \advance\count 1 by 1 - \ifnum \count 1<256 \loop \fi - }% - }% - % The aux file uses ' as the escape (for now). - % Turn off \ as an escape so we do not lose on - % entries which were dumped with control sequences in their names. - % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ - % Reference to such entries still does not work the way one would wish, - % but at least they do not bomb out when the aux file is read in. - \catcode`\{=1 - \catcode`\}=2 - \catcode`\%=\other - \catcode`\'=0 - \catcode`\\=\other - % - \openin 1 \jobname.aux - \ifeof 1 \else - \closein 1 - \input \jobname.aux - \global\havexrefstrue - \global\warnedobstrue - \fi - % Open the new aux file. TeX will close it automatically at exit. - \openout\auxfile=\jobname.aux -\endgroup} - - -% Footnotes. - -\newcount \footnoteno - -% The trailing space in the following definition for supereject is -% vital for proper filling; pages come out unaligned when you do a -% pagealignmacro call if that space before the closing brace is -% removed. (Generally, numeric constants should always be followed by a -% space to prevent strange expansion errors.) -\def\supereject{\par\penalty -20000\footnoteno =0 } - -% @footnotestyle is meaningful for info output only. -\let\footnotestyle=\comment - -\let\ptexfootnote=\footnote - -{\catcode `\@=11 -% -% Auto-number footnotes. Otherwise like plain. -\gdef\footnote{% - \global\advance\footnoteno by \@ne - \edef\thisfootno{$^{\the\footnoteno}$}% - % - % In case the footnote comes at the end of a sentence, preserve the - % extra spacing after we do the footnote number. - \let\@sf\empty - \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi - % - % Remove inadvertent blank space before typesetting the footnote number. - \unskip - \thisfootno\@sf - \footnotezzz -}% - -% Don't bother with the trickery in plain.tex to not require the -% footnote text as a parameter. Our footnotes don't need to be so general. -% -% Oh yes, they do; otherwise, @ifset and anything else that uses -% \parseargline fail inside footnotes because the tokens are fixed when -% the footnote is read. --karl, 16nov96. -% -\long\gdef\footnotezzz{\insert\footins\bgroup - % We want to typeset this text as a normal paragraph, even if the - % footnote reference occurs in (for example) a display environment. - % So reset some parameters. - \interlinepenalty\interfootnotelinepenalty - \splittopskip\ht\strutbox % top baseline for broken footnotes - \splitmaxdepth\dp\strutbox - \floatingpenalty\@MM - \leftskip\z@skip - \rightskip\z@skip - \spaceskip\z@skip - \xspaceskip\z@skip - \parindent\defaultparindent - % - % Hang the footnote text off the number. - \hang - \textindent{\thisfootno}% - % - % Don't crash into the line above the footnote text. Since this - % expands into a box, it must come within the paragraph, lest it - % provide a place where TeX can split the footnote. - \footstrut - \futurelet\next\fo@t -} -\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t - \else\let\next\f@t\fi \next} -\def\f@@t{\bgroup\aftergroup\@foot\let\next} -\def\f@t#1{#1\@foot} -\def\@foot{\strut\egroup} - -}%end \catcode `\@=11 - -% Set the baselineskip to #1, and the lineskip and strut size -% correspondingly. There is no deep meaning behind these magic numbers -% used as factors; they just match (closely enough) what Knuth defined. -% -\def\lineskipfactor{.08333} -\def\strutheightpercent{.70833} -\def\strutdepthpercent {.29167} -% -\def\setleading#1{% - \normalbaselineskip = #1\relax - \normallineskip = \lineskipfactor\normalbaselineskip - \normalbaselines - \setbox\strutbox =\hbox{% - \vrule width0pt height\strutheightpercent\baselineskip - depth \strutdepthpercent \baselineskip - }% -} - -% @| inserts a changebar to the left of the current line. It should -% surround any changed text. This approach does *not* work if the -% change spans more than two lines of output. To handle that, we would -% have adopt a much more difficult approach (putting marks into the main -% vertical list for the beginning and end of each change). -% -\def\|{% - % \vadjust can only be used in horizontal mode. - \leavevmode - % - % Append this vertical mode material after the current line in the output. - \vadjust{% - % We want to insert a rule with the height and depth of the current - % leading; that is exactly what \strutbox is supposed to record. - \vskip-\baselineskip - % - % \vadjust-items are inserted at the left edge of the type. So - % the \llap here moves out into the left-hand margin. - \llap{% - % - % For a thicker or thinner bar, change the `1pt'. - \vrule height\baselineskip width1pt - % - % This is the space between the bar and the text. - \hskip 12pt - }% - }% -} - -% For a final copy, take out the rectangles -% that mark overfull boxes (in case you have decided -% that the text looks ok even though it passes the margin). -% -\def\finalout{\overfullrule=0pt} - -% @image. We use the macros from epsf.tex to support this. -% If epsf.tex is not installed and @image is used, we complain. -% -% Check for and read epsf.tex up front. If we read it only at @image -% time, we might be inside a group, and then its definitions would get -% undone and the next image would fail. -\openin 1 = epsf.tex -\ifeof 1 \else - \closein 1 - % Do not bother showing banner with post-v2.7 epsf.tex (available in - % doc/epsf.tex until it shows up on ctan). - \def\epsfannounce{\toks0 = }% - \input epsf.tex -\fi -% -% We will only complain once about lack of epsf.tex. -\newif\ifwarnednoepsf -\newhelp\noepsfhelp{epsf.tex must be installed for images to - work. It is also included in the Texinfo distribution, or you can get - it from ftp://tug.org/tex/epsf.tex.} -% -\def\image#1{% - \ifx\epsfbox\undefined - \ifwarnednoepsf \else - \errhelp = \noepsfhelp - \errmessage{epsf.tex not found, images will be ignored}% - \global\warnednoepsftrue - \fi - \else - \imagexxx #1,,,\finish - \fi -} -% -% Arguments to @image: -% #1 is (mandatory) image filename; we tack on .eps extension. -% #2 is (optional) width, #3 is (optional) height. -% #4 is just the usual extra ignored arg for parsing this stuff. -\def\imagexxx#1,#2,#3,#4\finish{% - \ifx\pdfoutput\undefined - % \epsfbox itself resets \epsf?size at each figure. - \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi - \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi - \begingroup - \catcode`\^^M = 5 % in case we're inside an example - % If the image is by itself, center it. - \ifvmode - \nobreak\bigskip - % Usually we'll have text after the image which will insert - % \parskip glue, so insert it here too to equalize the space - % above and below. - \nobreak\vskip\parskip - \nobreak - \centerline{\epsfbox{#1.eps}}% - \bigbreak - \else - % In the middle of a paragraph, no extra space. - \epsfbox{#1.eps}% - \fi - \endgroup - \else - \centerline{\pdfimage #1.pdf}% - \fi -} - - -\message{localization,} -% and i18n. - -% @documentlanguage is usually given very early, just after -% @setfilename. If done too late, it may not override everything -% properly. Single argument is the language abbreviation. -% It would be nice if we could set up a hyphenation file here. -% -\def\documentlanguage{\parsearg\dodocumentlanguage} -\def\dodocumentlanguage#1{% - \tex % read txi-??.tex file in plain TeX. - % Read the file if it exists. - \openin 1 txi-#1.tex - \ifeof1 - \errhelp = \nolanghelp - \errmessage{Cannot read language file txi-#1.tex}% - \let\temp = \relax - \else - \def\temp{\input txi-#1.tex }% - \fi - \temp - \endgroup -} -\newhelp\nolanghelp{The given language definition file cannot be found or -is empty. Maybe you need to install it? In the current directory -should work if nowhere else does.} - - -% @documentencoding should change something in TeX eventually, most -% likely, but for now just recognize it. -\let\documentencoding = \comment - - -% Page size parameters. -% -\newdimen\defaultparindent \defaultparindent = 15pt - -\chapheadingskip = 15pt plus 4pt minus 2pt -\secheadingskip = 12pt plus 3pt minus 2pt -\subsecheadingskip = 9pt plus 2pt minus 2pt - -% Prevent underfull vbox error messages. -\vbadness = 10000 - -% Don't be so finicky about underfull hboxes, either. -\hbadness = 2000 - -% Following George Bush, just get rid of widows and orphans. -\widowpenalty=10000 -\clubpenalty=10000 - -% Use TeX 3.0's \emergencystretch to help line breaking, but if we're -% using an old version of TeX, don't do anything. We want the amount of -% stretch added to depend on the line length, hence the dependence on -% \hsize. We call this whenever the paper size is set. -% -\def\setemergencystretch{% - \ifx\emergencystretch\thisisundefined - % Allow us to assign to \emergencystretch anyway. - \def\emergencystretch{\dimen0}% - \else - \emergencystretch = .15\hsize - \fi -} - -% Parameters in order: 1) textheight; 2) textwidth; 3) voffset; -% 4) hoffset; 5) binding offset; 6) topskip. Then whoever calls us can -% set \parskip and call \setleading for \baselineskip. -% -\def\internalpagesizes#1#2#3#4#5#6{% - \voffset = #3\relax - \topskip = #6\relax - \splittopskip = \topskip - % - \vsize = #1\relax - \advance\vsize by \topskip - \outervsize = \vsize - \advance\outervsize by 2\topandbottommargin - \pageheight = \vsize - % - \hsize = #2\relax - \outerhsize = \hsize - \advance\outerhsize by 0.5in - \pagewidth = \hsize - % - \normaloffset = #4\relax - \bindingoffset = #5\relax - % - \parindent = \defaultparindent - \setemergencystretch -} - -% @letterpaper (the default). -\def\letterpaper{{\globaldefs = 1 - \parskip = 3pt plus 2pt minus 1pt - \setleading{13.2pt}% - % - % If page is nothing but text, make it come out even. - \internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}% -}} - -% Use @smallbook to reset parameters for 7x9.5 (or so) format. -\def\smallbook{{\globaldefs = 1 - \parskip = 2pt plus 1pt - \setleading{12pt}% - % - \internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}% - % - \lispnarrowing = 0.3in - \tolerance = 700 - \hfuzz = 1pt - \contentsrightmargin = 0pt - \deftypemargin = 0pt - \defbodyindent = .5cm - % - \let\smalldisplay = \smalldisplayx - \let\smallexample = \smalllispx - \let\smallformat = \smallformatx - \let\smalllisp = \smalllispx -}} - -% Use @afourpaper to print on European A4 paper. -\def\afourpaper{{\globaldefs = 1 - \setleading{12pt}% - \parskip = 3pt plus 2pt minus 1pt - % - \internalpagesizes{53\baselineskip}{160mm}{\voffset}{4mm}{\bindingoffset}{44pt}% - % - \tolerance = 700 - \hfuzz = 1pt -}} - -% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin -% 29mm, hence bottom margin 28mm, nominal side margin 3cm. -\def\afourlatex{{\globaldefs = 1 - \setleading{13.6pt}% - % - \afourpaper - \internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}% - % - \globaldefs = 0 -}} - -% Use @afourwide to print on European A4 paper in wide format. -\def\afourwide{% - \afourpaper - \internalpagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}% - % - \globaldefs = 0 -} - -% @pagesizes TEXTHEIGHT[,TEXTWIDTH] -% Perhaps we should allow setting the margins, \topskip, \parskip, -% and/or leading, also. Or perhaps we should compute them somehow. -% -\def\pagesizes{\parsearg\pagesizesxxx} -\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish} -\def\pagesizesyyy#1,#2,#3\finish{{% - \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi - \globaldefs = 1 - % - \parskip = 3pt plus 2pt minus 1pt - \setleading{13.2pt}% - % - \internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}% -}} - -% Set default to letter. -% -\letterpaper - - -\message{and turning on texinfo input format.} - -% Define macros to output various characters with catcode for normal text. -\catcode`\"=\other -\catcode`\~=\other -\catcode`\^=\other -\catcode`\_=\other -\catcode`\|=\other -\catcode`\<=\other -\catcode`\>=\other -\catcode`\+=\other -\catcode`\$=\other -\def\normaldoublequote{"} -\def\normaltilde{~} -\def\normalcaret{^} -\def\normalunderscore{_} -\def\normalverticalbar{|} -\def\normalless{<} -\def\normalgreater{>} -\def\normalplus{+} -\def\normaldollar{$} - -% This macro is used to make a character print one way in ttfont -% where it can probably just be output, and another way in other fonts, -% where something hairier probably needs to be done. -% -% #1 is what to print if we are indeed using \tt; #2 is what to print -% otherwise. Since all the Computer Modern typewriter fonts have zero -% interword stretch (and shrink), and it is reasonable to expect all -% typewriter fonts to have this, we can check that font parameter. -% -\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} - -% Same as above, but check for italic font. Actually this also catches -% non-italic slanted fonts since it is impossible to distinguish them from -% italic fonts. But since this is only used by $ and it uses \sl anyway -% this is not a problem. -\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} - -% Turn off all special characters except @ -% (and those which the user can use as if they were ordinary). -% Most of these we simply print from the \tt font, but for some, we can -% use math or other variants that look better in normal text. - -\catcode`\"=\active -\def\activedoublequote{{\tt\char34}} -\let"=\activedoublequote -\catcode`\~=\active -\def~{{\tt\char126}} -\chardef\hat=`\^ -\catcode`\^=\active -\def^{{\tt \hat}} - -\catcode`\_=\active -\def_{\ifusingtt\normalunderscore\_} -% Subroutine for the previous macro. -\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}} - -\catcode`\|=\active -\def|{{\tt\char124}} -\chardef \less=`\< -\catcode`\<=\active -\def<{{\tt \less}} -\chardef \gtr=`\> -\catcode`\>=\active -\def>{{\tt \gtr}} -\catcode`\+=\active -\def+{{\tt \char 43}} -\catcode`\$=\active -\def${\ifusingit{{\sl\$}}\normaldollar} -%\catcode 27=\active -%\def^^[{$\diamondsuit$} - -% Set up an active definition for =, but don't enable it most of the time. -{\catcode`\==\active -\global\def={{\tt \char 61}}} - -\catcode`+=\active -\catcode`\_=\active - -% If a .fmt file is being used, characters that might appear in a file -% name cannot be active until we have parsed the command line. -% So turn them off again, and have \everyjob (or @setfilename) turn them on. -% \otherifyactive is called near the end of this file. -\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} - -\catcode`\@=0 - -% \rawbackslashxx output one backslash character in current font -\global\chardef\rawbackslashxx=`\\ -%{\catcode`\\=\other -%@gdef@rawbackslashxx{\}} - -% \rawbackslash redefines \ as input to do \rawbackslashxx. -{\catcode`\\=\active -@gdef@rawbackslash{@let\=@rawbackslashxx }} - -% \normalbackslash outputs one backslash in fixed width font. -\def\normalbackslash{{\tt\rawbackslashxx}} - -% \catcode 17=0 % Define control-q -\catcode`\\=\active - -% Used sometimes to turn off (effectively) the active characters -% even after parsing them. -@def@turnoffactive{@let"=@normaldoublequote -@let\=@realbackslash -@let~=@normaltilde -@let^=@normalcaret -@let_=@normalunderscore -@let|=@normalverticalbar -@let<=@normalless -@let>=@normalgreater -@let+=@normalplus -@let$=@normaldollar} - -@def@normalturnoffactive{@let"=@normaldoublequote -@let\=@normalbackslash -@let~=@normaltilde -@let^=@normalcaret -@let_=@normalunderscore -@let|=@normalverticalbar -@let<=@normalless -@let>=@normalgreater -@let+=@normalplus -@let$=@normaldollar} - -% Make _ and + \other characters, temporarily. -% This is canceled by @fixbackslash. -@otherifyactive - -% If a .fmt file is being used, we don't want the `\input texinfo' to show up. -% That is what \eatinput is for; after that, the `\' should revert to printing -% a backslash. -% -@gdef@eatinput input texinfo{@fixbackslash} -@global@let\ = @eatinput - -% On the other hand, perhaps the file did not have a `\input texinfo'. Then -% the first `\{ in the file would cause an error. This macro tries to fix -% that, assuming it is called before the first `\' could plausibly occur. -% Also back turn on active characters that might appear in the input -% file name, in case not using a pre-dumped format. -% -@gdef@fixbackslash{% - @ifx\@eatinput @let\ = @normalbackslash @fi - @catcode`+=@active - @catcode`@_=@active -} - -% Say @foo, not \foo, in error messages. -@escapechar = `@@ - -% These look ok in all fonts, so just make them not special. -@catcode`@& = @other -@catcode`@# = @other -@catcode`@% = @other - -@c Set initial fonts. -@textfonts -@rm - - -@c Local variables: -@c eval: (add-hook 'write-file-hooks 'time-stamp) -@c page-delimiter: "^\\\\message" -@c time-stamp-start: "def\\\\texinfoversion{" -@c time-stamp-format: "%:y-%02m-%02d.%H" -@c time-stamp-end: "}" -@c End: diff --git a/Docs/Support/update-reserved-words.pl b/Docs/Support/update-reserved-words.pl deleted file mode 100755 index 2920e083c9c..00000000000 --- a/Docs/Support/update-reserved-words.pl +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/perl - -# Based on a Emacs macro by david@mysql.com -# Implemented in Perl by jeremy@mysql.com -# 2001-11-20 Fixups by arjen@mysql.com, 2 keywords and 15 synonyms were missing -# 2001-12-07 Fixup by arjen@mysql.com, add column headings for multitable. -# 2002-05-01 Fixup by arjen@mysql.com, use 3 columns instead of 4. -# 2002-05-03 Fixup by arjen@mysql.com, fill last row to full # of columns. -# 2002-06-14 Fixup by arjen@mysql.com, Issue a "bk edit manual.texi". - -print STDERR "Scanning lex.h for symbols..\n"; -open LEX, "<../sql/lex.h"; -while($line = ) { - if($line =~ /\{\s*\"([A-Z_]+)\"/) { - $words{$1} = $1; - } elsif($line =~ /sql_functions/) { - last; - }; -}; -close LEX; - -print STDERR "Scanning sql_yacc.yy for non-reserved words...\n"; -open YACC, "<../sql/sql_yacc.yy"; -while( !~ /^keyword:/) {}; -while(($line = ) =~ /[\s|]+([A-Z_]+)/) { - $keyword = $1; - $keyword =~ s/_SYM//; - delete $words{$keyword}; -}; -close YACC; - - -print STDERR "Copying reserved words to an array...\n"; -foreach(keys %words) { push @words, $words{$_}; }; - -print STDERR "Sorting array...\n"; -@words = sort @words; - -printf STDERR "There are %i reserved words.\n", scalar @words; - -@pre = ("\@item", " \@tab", " \@tab"); - -$list = ""; -for($i=0; $word = shift(@words); $i++) { - $list .= sprintf "%s %s\n", $pre[$i%3], "\@code\{$word\}"; -} -# Fill last row to full # of columns. -for( ; $i%3; $i++) { - $list .= sprintf "%s\n", $pre[$i%3]; -} - -`bk edit manual.texi`; - -open OLD, "manual-tmp.texi"; - -print STDERR "Copying beginning of manual.texi...\n"; -while(($line = ) !~ /START_OF_RESERVED_WORDS/) { print NEW $line; }; -print NEW "\@c START_OF_RESERVED_WORDS\n\n"; -printf NEW "\@c Reserved word list updated %s by %s.\n". - "\@c To regenerate, use Support/update-reserved-words.pl.\n\n", - &pretty_date, $ENV{USER}; - -print STDERR "Inserting list of reserved words...\n"; -# Ensure the fractions add up to 100% otherwise it looks funny in print: -print NEW "\@multitable \@columnfractions .33 .33 .34\n"; -print NEW "\@item \@strong{Word}\n \@tab \@strong{Word}\n \@tab \@strong{Word}\n"; -print NEW $list; -print NEW "\@end multitable\n"; -print STDERR "Skipping over old list...\n"; -while(($line = ) !~ /END_OF_RESERVED_WORDS/) {}; -print NEW "\n\@c END_OF_RESERVED_WORDS\n"; -print STDERR "Copying end of manual.texi...\n"; -while($line = ) { print NEW $line; }; - -close OLD; -close NEW; - -print STDERR "Moving manual-tmp.texi to manual.texi...\n"; -unlink "manual.texi"; -rename "manual-tmp.texi", "manual.texi"; - -print STDERR "Reserved word list updated successfully!\n"; - -sub pretty_date { - @time = ($time = shift)?((localtime($time))[0..6]):((localtime)[0..6]); - - ($sec, $min, $hour, $mday, $mon, $year, $wday) = @time; - $wday = (Sun,Mon,Tue,Wed,Thu,Fri,Sat)[$wday]; - $mon = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)[$mon]; - $year += 1900; - - $pretty = sprintf("%s %s %2i %02i:%02i:%02i %i", - $wday, $mon, $mday, $hour, $min, $sec, $year); - - return $pretty; -}; - diff --git a/Docs/To-be-included-in-the-manual/MySQL-for-dummies b/Docs/To-be-included-in-the-manual/MySQL-for-dummies deleted file mode 100644 index 7b669af18dc..00000000000 --- a/Docs/To-be-included-in-the-manual/MySQL-for-dummies +++ /dev/null @@ -1,271 +0,0 @@ -=============================================================================== -installing/mysql/binary Fri Jul 17 13:03:03 1998 has -=============================================================================== - - MySQL for dummies - Part 1 - How to get the binary distribution running on a UNIX system - - MySQL is a trademark of TcX, Sweden. - -=============================================================================== - -Introduction: - -This is a simple cookbook for the helpless newbie taking his very first steps -with MySQL, when he needs a few hints about the options and access rights -installing the system and starting the basic modules, before he has "aha"ed -on how simple and clean the basic structure of MySQL is. It will not help -you with the intricacies and subtle possibilities of SQL as implemented in -MySQL. - -The information in this document is all contained in the MySQL manual in a -more or less obvious form, but for the newbie that document is a bit over- -whelming in size, and it contains some new concepts that take some getting -used to. Sorry if it is pitched too low for some readers. It is only -intended to get the binary distribution up and running. - -I successfully got MySQL going on both a Sun SparcStation 1 running SunOS 4.1.2 -and 2 Linux systems running SuSE release 5.0, one with kernel version 2.0.30, -one with 2.0.33 by doing exactly what is given here. If it doesn't work -for you, I suggest the problem is with your system and not with the -MySQL binary distribution. - --- Howard Schultens hs@neuro-physiol.med.uni-goettingen.de - -------------------------------------------------------------------------------- - -Nomenclature: - -In the following, 'MySQL' refers to the entire database system distributed -and licensed by TcX. 'mysql' means a specific program in this system. - -------------------------------------------------------------------------------- - -MySQL user administration and access rights ("privileges"): - -It is obvious that MySQL needs its own user management because it is a system -that is implemented on a number of architectures -- you should be able to use -it in an identical way on different operating systems. The MySQL user names -and passwords have basically nothing at all to do with user names and -passwords on whatever operating system you install it on. You will, -unfortunately, have to install your users again on MySQL. But this system has -some big advantages: it is a secure system that allows you to finely -differentiate access rights based on WHO is using a database from WHERE. It -does this by the use of its own database containing 3 tables "user" for the -user names, "db" for the databases, and "host" for the machines that access -databases. "user" and "db" are the most important for the newbie. - -Section 6 of the manual describes all this in detail. - -------------------------------------------------------------------------------- - -Doing it: - -In the following, "foo>" denotes the prompt from your system in user mode, -"foo#" as root/superuser. - - -1) Get the appropriate binary distribution from a mirror site or directly - from TcX at URL http://www.tcx.se. The file name has the form - mysql-VERSION-SYSTEM.tgz - - VERSION = Version number, e.g. 3.21.33 - SYSTEM = OS and architecture, e.g. sunos4.1.4-sparc - - i.e., you would download a file mysql-3.21.33-sunos4.1.4-sparc.tgz. - - This example is for SunOS, but it works exactly analogously on Linux. - -2) cd to /usr/local and unpack this with, e.g. the command - - foo#gzip -c -d mysql-VERSION-SYSTEM.tgz|tar xvf - - -3) The files are stored in a directory /usr/local/mysql-VERSION-SYSTEM - Make a symbolic link to this directory: - - foo#ln -s mysql-VERSION-SYSTEM mysql - - At this point, you might want to create a special user for all your - MySQL stuff. I use "mysql". Then you could do - - foo#chown -R mysql mysql-VERSION-SYSTEM - -4) FIRST, take care of all the PERL stuff: - - o) You need PERL 5.004 or later already installed on your system. Take - care of this first if necessary. - - a) cd to /usr/local/mysql/perl/DBI and do - foo#perl Makefile.PL - foo#make - foo#make test - foo#make install (if "make test" is successful) - - b) cd to /usr/local/mysql/perl/Mysql/modules and do - foo#perl Makefile.PL - foo#make - foo#make test - foo#make install (if "make test" is successful) - - c) As an option, you can install Data::ShowTable, but this is not absolutely - necessary for mysql. Get the PERL module Data-ShowTable-VER.tar.gz - (VER = version, eg. 3.3) from a CPAN mirror: I got mine at - - ftp://ftp.gwdg.de/pub/languages/perl/CPAN/modules/by-category/06_Data_Type_Utilities/Data/Data-ShowTable-3.3.tar.gz - - (You should be able to replace "ftp.gwdg.de" by the name of another - FTP mirror) - - Put this into /usr/local/mysql/perl and unpack it. - You get a directory 'Data-ShowTable-VER'. cd into there and - (as root/superuser) - foo#perl Makefile.PL - foo#make - foo#make test - foo#make install (if "make test" is successful) - -5) cd to /usr/local/mysql and do - foo#scripts/mysql_install_db - - you should be in /usr/local/mysql when you start the script. - -==>*NOTE* you might want to edit this script before you run it the first - time. See method 9b) below. - - If this is successful, one or more copies of the mysql daemon, mysqld, - will be running. On SunOS 4.1.x, you get one. On Linux, 3 are running. - -------------------------------------------------------------------------------- -In the rest of this, I will always suppose you are starting in the directory -/usr/local/mysql, even if it seems mildly inconvenient -------------------------------------------------------------------------------- - -6) You can now select the database 'test' and mess around with it using - the client program bin/mysql: start it with - - foo>bin/mysql -u root test - - This says, "start up the MySQL command-line client with the user name - 'root' and use the database named 'test', which is a subdirectory in - '/usr/local/mysql/data". (n.b. this is NOT the root user of your UNIX - system, it is a MySQL user with the same name. You will notice that you - don't need a password for this user to use mysql). - - Actually, the way the system is set up by bin/mysql_install_db, you - don't even need a user name to access the database 'test'. You can start - the client simply with - - foo>bin/mysql test - - 'mysql' should start up with a greeting and a line telling you what your - connection id and server version is. At this point, the database 'test' - is empty, no tables or anything are defined. - - When you issue SQL commands, DON'T FORGET THE FINAL SEMICOLON, or mysql acts - dumb: - - mysql>select * from user - -> - -> - - and you wonder what's going on. 'mysql' reminds you of this on startup. - -7) When you want to close down the server, do - foo>bin/mysqladmin shutdown - -8) I recommend editing the script bin/safe_mysqld for the binary release - so that it always starts up with the correct directories. I replaced - the entire header up to but not including - - pidfile=$DATADIR/`/bin/hostname`.pid - log=$DATADIR/`/bin/hostname`.log - err=$DATADIR/`/bin/hostname`.err - - with - - MY_BASEDIR_VERSION=/usr/local/mysql - DATADIR=$MY_BASEDIR_VERSION/data - ledir=$MY_BASEDIR_VERSION/bin - cd $MY_BASEDIR_VERSION - - This lets you start the mysql daemon from wherever you like. - -9) Now let's say you want to put some of your own databases and users into - the system. The simplest, most powerful, and dangerous way to do this is - to start up the mysql daemon again with: - - foo>bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data -Sg - - This skips loading the grant tables. The system is open to every kind of - mistake now, so be careful. Any user can muck up the grant tables, ie. - the lists of users, hosts, and databases themselves, so only use this - mode to do these first, very basic things. - - Start the client again now, with - foo>bin/mysql mysql - - This tells the client to use the database 'mysql', which is the directory - that contains the lists (ie. the tables) of all the users, hosts, and - databases in the system, so be careful!!!!!!!!!!!! - - All of what follows is taken essentially from section 6 of the manual. - - a) For the start, just define a couple of users for the MySQL system: - i) an administrator, such as 'mysql', with its own password, that - can do everything with the system: - - mysql> insert into user values('localhost','mysql',password('xyzzy'), - 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); - - * For some reason, on my Linux system with a German keyboard, I have * - * to use the acute accent instead of the apostrophe, otherwise I get * - * parse errors. * - - This defines the user name 'mysql' with password 'xyzzy' that can - do everything. To look at what you just did, type in - - mysql> select * from user; - - mysql types out a table with all the known users and their privileges. - - ii) a privileged user for playing around: - - mysql> insert into user values('localhost','john',password('blah0x1'), - 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); - - iii) create your own database for a todo list, phone numbers, whatever: - - mysql> create database johns_DB; - mysql> insert into db values('localhost','johns_DB','john','Y','Y','Y','Y','Y','Y'); - - The first line creates the databse "johns_DB", but that doesn't - make it visible to mysql. The second line does that. - - iv) When you are done installing users and databases, quit mysql and - issue the command - - foo>bin/mysqladmin reload - - b) Another method to do this was suggested by Sinisa Milivojevic, and that - is to edit the script /usr/local/mysql/scripts/mysql_install_db to - define the databases and install the more important users when you - start the system the very first time. This would have the advantage - that you can save the script and re-install the system with it if you - have to, automatically defining the important structures. It requires - a little more knowledge of the MySQL system to do this. - - You might want to use this method anyway since it saves editing - mysql_install_db to have it install a superuser with a name other - than "root". The places to change are easy to find. You can, of - course, use the first method above and remove the user named 'root' - when you are done. - - -=============================================================================== - -If anyone is interested enough in this document to make suggestions on how -to improve it, I would be glad to get emails on it. I hope it helps -someone get going with MySQL a little easier. - ---Howard - hs@neuro-physiol.med.uni-goettingen.de diff --git a/Docs/Translations/myodbc-br.texi b/Docs/Translations/myodbc-br.texi deleted file mode 100644 index 6cf7edd3e75..00000000000 --- a/Docs/Translations/myodbc-br.texi +++ /dev/null @@ -1,272 +0,0 @@ -@chapter MySQL ODBC Suporte - -@menu -* Quais ODBC OS:: Sistemas Operacionais so suportados por @strong{MyODBC} -* Problemas ODBC:: Como informar problemas com @strong{MySQL} ODBC -* Clientes MyODBC:: Programas que j foram testados com @strong{MyODBC} -* Administrador ODBC:: Como preencher os diversos campos com o programa Administrador -* ODBC e last_insert_id:: Como obter o valor de uma coluna @code{AUTO_INCREMENT} em ODBC -* Informando bug do MyODBC:: Informando problemas com MyODBC -@end menu - -@strong{MySQL} fornece suporte para ODBC atravs do programa @strong{MyODBC}. - - -@node Quais ODBC OS, ODBC Problemas, ODBC, ODBC -@section Sistemas Operacionais suportados por MyODBC - -@strong{MyODBC} um driver 32-bit ODBC (2.50) nvel 0 para Windows95 -e Windows NT. Ns esperamos que algum porte o mesmo para o Windows 3.x. - -@node Problemas ODBC, clientes MyODBC, Quais ODBC OS, ODBC -@section Como informar problemas com MyODBC - -@strong{MyODBC} tem sido testado com Access, Admndemo.exe, C++-Builder, -Centura Team Developer (formalmente Gupta SQL/Windows), ColdFusion (no -Solaris e NT com svc pack 5), Crystal Reports, DataJunction, Delphi, -ERwin, Excel, iHTML, FileMaker Pro, FoxPro, Notes 4.5/4.6, SBSS, Perl -DBD-ODBC, Paradox, Powerbuilder, Powerdesigner 32 bit, VC++ e Visual -Basic. - -Se voc souber de algum outro aplicativo que funcione com @strong{MyODBC}, por favor -nos escreva sobre isso atravs do email @email{myodbc@@lists.mysql.com}. - -@node Clientes MyODBC, Administrador ODBC, Problemas com ODBC, ODBC -@section Programas testados que funcionam com MyODBC - -A maioria dos programas que tm suporte para ODBC, funcionam com o @strong{MyODBC}, -mas cada um dos listados abaixo, tm sido testados por ns ou por informaes de -usurios que confirmaram o seu funcionamento. - -@table @asis -@item @strong{Program} -@strong{Comment} -@item Access -Como fazer Accces funcionar: -@itemize @bullet -@item -Voc dever ter uma chave primria na tabela. -@item -Voc deve ter um campo timestamp em todas as tabelas em que voc quer controlar a -atualizao. - -@item -Somente use campos doubles float. Access falha quando faz comparaes com campos float -simples. -@item -Configure a opo `Return matching rows' quando conectar com o @strong{MySQL}. -@item -O Access no NT acusar colunas @code{BLOB} como @code{OLE OBJECTS}. -Se ao invs disso voc quer colunas @code{MEMO}, deve trocar a coluna para -@code{TEXT} usando @code{ALTER TABLE}. -@item -Access s vezes no lida adequadamente com colunas do tipo @code{DATE}. -Se voc tiver problemas com essas colunas, mude as colunas para @code{DATETIME}. -@item -Em certas situaes, o Access cria consultas SQL ilegais que o -@strong{MySQL} no pode processar. Voc pode resolver isso selecionando o tipo de -consulta @code{"Query|SQLSpecific|Pass-Through"} no menu do Access. -@end itemize -@item DataJunction -Voc tem que trocar para mandar @code{VARCHAR} ao invs de @code{ENUM}, porque -o mesmo exporta o ltimo de uma maneira que causa fadiga ao @strong{MySQL}. -@item Excel -Funciona. Algumas dicas: -@itemize @bullet -@item -Se voc tem problemas com datas, tente selecion-las como strings usando a -funo @code{CONCAT()}. Por exemplo: -@example -select CONCAT(rise_time), CONCAT(set_time) - from sunrise_sunset; -@end example -Os dados de datas enviadas como string so corretamente reconhecidas pelo -Excel97 como dados do tipo time. - -Neste exemplo o propsito de @code{CONCAT()} enganar o ODBC, fazendo-o pensar -que a coluna do 'tipo string'. Sem o @code{CONCAT()}, ODBC sabe que a coluna - do tipo time e o Excel no entender isso. - -Note que isso um bug no Excel, porque o mesmo converte automaticamente a -string para time. Isto muito bom quando o fonte um arquivo -texto, mas no se pode dizer o mesmo quando o fonte uma conexo -ODBC que informa o tipo exato para cada coluna. -@end itemize -@item odbcadmin -Programa Teste para ODBC. -@item Delphi -Voc dever usar DBE 3.2 ou mais atualizado. Configure o campo de opo -`Don't optimize column width' quando conectando com @strong{MySQL}. - -Tambm, h aqui um cdigo muito til que configura tanto a -insero ODBC e a insero BDE para MyODBC (a insero BDE requer um BDE -Alias Editor que pode ser obtido de graa numa Delphi Super Page -perto de voc.): (Obrigado a Bryan Brunton @email{bryan@@flesherfab.com} por isto) - -@example -fReg:= TRegistry.Create; - fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True); - fReg.WriteString('Database', 'Documents'); - fReg.WriteString('Description', ' '); - fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll'); - fReg.WriteString('Flag', '1'); - fReg.WriteString('Password', ''); - fReg.WriteString('Port', ' '); - fReg.WriteString('Server', 'xmark'); - fReg.WriteString('User', 'winuser'); - fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True); - fReg.WriteString('DocumentsFab', 'MySQL'); - fReg.CloseKey; - fReg.Free; - - Memo1.Lines.Add('DATABASE NAME='); - Memo1.Lines.Add('USER NAME='); - Memo1.Lines.Add('ODBC DSN=DocumentsFab'); - Memo1.Lines.Add('OPEN MODE=READ/WRITE'); - Memo1.Lines.Add('BATCH COUNT=200'); - Memo1.Lines.Add('LANGDRIVER='); - Memo1.Lines.Add('MAX ROWS=-1'); - Memo1.Lines.Add('SCHEMA CACHE DIR='); - Memo1.Lines.Add('SCHEMA CACHE SIZE=8'); - Memo1.Lines.Add('SCHEMA CACHE TIME=-1'); - Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT'); - Memo1.Lines.Add('SQLQRYMODE='); - Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE'); - Memo1.Lines.Add('ENABLE BCD=FALSE'); - Memo1.Lines.Add('ROWSET SIZE=20'); - Memo1.Lines.Add('BLOBS TO CACHE=64'); - Memo1.Lines.Add('BLOB SIZE=32'); - - AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines); -@end example - -@item C++Builder -Testado com BDE 3.0. O nico problema conhecido que quando o esquema da tabela -muda, os campos da consulta no so atualizados. BDE entretanto, parece no -reconhecer chaves primrias, somente ndice PRIMARY, no entanto isto no -tem sido um problema. - -@item Visual basic -Para atualizar uma tabela, voc dever definir uma chave primria para a tabela. -@end table - -@node Administrador ODBC, ODBC e last_insert_id, Clientes MyODBC, ODBC -@section Como preencher os diversos campos com o programa Administrador - -Existem trs possibilidades para especificar o nome do servidor em -Windows95: - -@itemize @bullet -@item -Usando o endereo IP do servidor. -@item -Adicionar um arquivo @file{lmhosts} com a seguinte informao: - -@example -ip nomeservidor -@end example - -Por exemplo: - -@example -194.216.84.21 my -@end example - -@item -Configurar o PC para usar DNS. -@end itemize - -Exemplo de como preencher o ``ODBC setup'': -@example -Windows DSN name: teste -Description: Este o meu banco de dados teste -MySql Database: teste -Server: 194.216.84.21 -User: monty -Password: minha_senha -Port: -@end example - -O valor para o campo @code{Windows DSN name} qualquer nome que seja nico -em seu Windows ODBC setup. - -Voc no precisa especificar os valores para os seguintes campos: @code{Server}, -@code{User}, @code{Password} ou @code{Port} na hora de configurar o ODBC. -Entretanto, se voc o faz, esses valores devem ser usados como padro para fazer -uma conexo. Voc tem a opo de trocar os valores nesse instante. - -Se o nmero da porta no for especificado, o valor padro da porta (@value{default_port}) - usado. - -Se voc especificar a opo @code{Read options from C:\my.cnf}, os -grupos @code{client} e @code{odbc} devem ser lidos do arquivo @file{C:\my.cnf}. -Voc pode usar todas as opes que so usadas por @code{mysql_options()}. -@xref{mysql_options, , @code{mysql_options}}. - -@node ODBC e last_insert_id, Informando bug do MyODBC, Administrador ODBC, ODBC -@section Como obter o valor de uma coluna @code{AUTO_INCREMENT} no ODBC - -Um problema muito usual consiste em como saber o valor de uma coluna do tipo -@code{INSERT} quando a mesma gerada automaticamente. Com ODBC, voc pode -fazer uma coisa como esta (assumindo que @code{auto} um campo @code{AUTO_INCREMENT}): - -@example -INSERT INTO foo (auto,text) VALUES(NULL,'text'); -SELECT LAST_INSERT_ID(); -@end example - -Ou se voc somente quer adicionar o valor noutra tabela, faa o -seguinte: - -@example -INSERT INTO foo (auto,text) VALUES(NULL,'text'); -INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text'); -@end example - -Para o benefcio de algumas aplicaes ODBC (pelo menos Delphi e Access), -a seguinte consulta pode ser usada para encontrar o valor do novo registro -adicionado: - -@example -SELECT * FROM tbl_name WHERE auto IS NULL; -@end example - -@node Informando bug do MyODBC, , ODBC e last_insert_id, ODBC -@section Informando problemas com MyODBC - -Se voc encontra dificuldades com MyODBC, deve comear por fazer -um arquivo log no Administrador ODBC (o log voc tem quando -solicita logs do ODBCADMIN) e um log @strong{MyODBC}. Para gerar um log @strong{MyODBC}, -clique a opo `Trace MyODBC' na tela de configurao da conexo -@strong{MyODBC}. -O log ser escrito no arquivo @file{C:\myodbc.log}. -Note que voc deve usar a @code{MYSQL.DLL} e no a -@code{MYSQL2.DLL} para que esta opo funcione! - -Verifique as consultas que MyODBC envia para o servidor @strong{MySQL}; -Voc dever ser capaz de encontrar isto atravs da pesquisa da -string @code{>mysql_real_query} no arquivo @file{myodbc.log}. - -Voc deve tambm tentar duplicar as consultas no monitor @code{mysql} -ou @code{admndemo} para encontrar se o erro do MyODBC ou do @strong{MySQL}. - -Se voc encontrar algo errado, por favor envie somente as linhas -relevantes (mximo 40 linhas) para o @email{myodbc@@lists.mysql.com}. Favor nunca -enviar os arquivos log completos do MyODBC ou do ODBC ! - -Se voc no encontra o qu est errado, a ltima opo - fazer um arquivo (tar ou zip) que contenha um arquivo log do MyODBC, -o arquivo log ODBC e um arquivo README que explique o problema. -Voc o manda para @uref{ftp://www.mysql.com/pub/mysql/secret}. Somente ns da TCX -devemos ter acesso a esses arquivos que voc manda e ns seremos muito discretos com -os dados ! - -Se voc pode fazer um programa que tambm mostre o mesmo problema, favor mand-lo -tambm! - -Se o programa funciona com outro servidor SQL, voc pode fazer um -arquivo log que faa exatamente a mesma coisa com o outro servidor -SQL. - -Lembre que quanto mais informao voc nos fornece, o resultado -que ns podemos resolver o problema! diff --git a/Docs/manual-license-spanish.texi b/Docs/manual-license-spanish.texi deleted file mode 100644 index c9cf2bd53da..00000000000 --- a/Docs/manual-license-spanish.texi +++ /dev/null @@ -1,709 +0,0 @@ -@cindex Licensing terms -@cindex Support terms -@node Licensing and Support, Installing, Questions, Top -@chapter MySQL licensing and support - -@menu -* Licensing policy:: Poltica de licenciamento do @strong{MySQL} -* Copyright:: Direitos autorais usados por @strong{MySQL} -* Commercial use:: Distribuindo comercialmente @strong{MySQL} -* Licensing examples:: Exemplos de situaes de licenciamento -* Cost:: Preos de licenciamento e suporte @strong{MySQL} -* Support:: Tipos de suporte comercial -@end menu - -Este captulo descreve os tipos de licenciamento e suporte do @strong{MySQL}, incluindo: - -@itemize @bullet -@item -Nossa poltica de licenciamento para sistemas operacionais no Microsoft e Microsoft - -@item -Os direitos autorais sob os quais o @strong{MySQL} distribudo -(@pxref{Copyright}) - -@item -Exemplo de situaes quando uma licena necessria -(@pxref{Licensing examples}) - -@item -Preos de licenciamento e suporte (@pxref{Cost}), e -benefcios do suporte (@pxref{Support}) -@end itemize - -@cindex Licensing policy -@node Licensing policy, Copyright, Licensing and Support, Licensing and Support -@section MySQL licensing policy - -Os termos formais do licenciamento para sistemas operacionais no Microsoft tais como -Unix ou OS/2 so especificados em @ref{Public license}. Basicamente, nossa poltica de -licenciamento como segue: - -@itemize @bullet -@item -Para uso interno normal, o @strong{MySQL} geralmente no custa nada. Voc no precisa -nos pagar se no o quiser. - -@item -Uma licena requerida se: - -@itemize @minus -@item -Voc vende o servidor @strong{MySQL} diretamente ou como parte de outro produto ou servio. - -@item -Voc cobra para instalar e manter um servidor @strong{MySQL} no local do cliente - -@item -Voc incluie o @strong{MySQL} numa distribuio que no redistribuda -e voc cobra por alguma parte dessa distribuio -@end itemize - -@item -Para circunstncias sob as quais uma licena do @strong{MySQL} requerida, -voc necessita uma licena por mquina que roda o servidor @code{mysqld}. -Entretanto, uma mquina com mltiplos processadores conta como uma mquina -simples e no h restrio no nmero de servidores que rodam numa s mquina -ou no nmero de clientes concurrentes conectados ao servidor em essa mquina. - -@item -Voc no necessita uma licena para incluir cdigo de programas clientes -comerciais. O acesso de parte de clientes para o @strong{MySQL} de -domnio pblico. O cdigo do cliente @code{mysql} de linha de comando -incluie cdigo da livraria @code{readline} que est sob a licena pblica -GNU. - -@item -@cindex @code{myisampack} -Para clientes que tem comprado 1 licena ou suporte MySQL, ns fornecemos -funcionalidade adicional. Atualmente, isso significa o fornecimento do -utilitrio @code{myisampack} para banco de dados somente de leitura, -rpidos e compactados. (O servidor incluie suporte para ler tais bancos -de dados mas no a ferramenta de compactar usada para criar os mesmos). -Quando os acordos de suporte gerem suficientes recursos, ns liberaremos -esta ferramenta sob a mesma licena do servidor @strong{MySQL}. - -@item -Se seu uso do @strong{MySQL} no requer uma licena, porm voc gosta -do @strong{MySQL} e deseja encorajar um maior desenvolvimento, voc -certamente bem-vindo a adquirir uma licena de qualquer forma. - -@item -Se usa o @strong{MySQL} num contexto comercial de tal forma -que obtm benefcios no seu uso, ns lhe solicitamos que apoie -o desenvolvimento do @strong{MySQL} atravs da compra de algum -nvel de suporte. Ns achamos que se o @strong{MySQL} o ajuda -em seu negcio, razovel que solicitemos sua ajuda para o @strong{MySQL}. -Por outro lado, se voc ns faz perguntas de suporte, no somente est -usando de graa algo no qual ns colocamos um enorme trabalho, voc -tambm est pedindo suporte de graa. -@end itemize - -Para uso em sistemas operacionais Microsoft (Win95/Win98/WinNT), -voc precisa de uma licena @strong{MySQL} depois de 30 dias -de experincia, com a exceo que licenas podem ser requeridas -sem nenhum custo para uso educacional ou para suportar pesquisas -de governo ou universidades. @xref{Winlicense}. -Uma verso shareware do @strong{MySQL}-Win32 que voc pode experimentar -antes de comprar est disponvel em @uref{http://www.mysql.com/mysql_w32.htmy}. -Depois que voc tenha pago, voc ter uma senha que permite seu acesso a uma -nova verso @strong{MySQL}-Win32. - -Se voc tem uma pergunta se for o caso ou no de requerer uma licena para -seu caso em particular do @strong{MySQL}, favor entrar em contato com ns. -@xref{Contact information}. - -Se voc requer uma licena @strong{MySQL}, a forma mais fcil para pagar -a mesma usar o formulrio no seguro servidor TcX em @url{https://www.mysql.com/license.htmy}. -Outras formas de pagamento so mencionadas em @ref{Payment information}. - -@cindex Copyright -@node Copyright, Commercial use, Licensing policy, Licensing and Support -@section Copyrights used by MySQL - -@menu -* Copyright changes:: Possvel futura mudana no direito autoral -@end menu - -Existem vrios direitos autorais diferentes na distribuio @strong{MySQL}: - -@enumerate -@item - -O fonte especfico @strong{MySQL}necessrio para construir o @code{mysqlclient} -livrarias e programas no diretrio @file{client} est em domnio pblico. -Cada arquivo que est em domnio pblico tem um cabealho que claramente notifica -este estado. Isto incluie tudo no diretrio @file{client}e algumas partes -do @code{mysys}, @code{mystring} e @code{dbug} livrarias. - -@item -Algumas pequenas partes do fonte (GNU @code{getopt}) esto cobertas pela -``GNU LIBRARY LIBRARY GENERAL PUBLIC LICENSE''. Ver o arquivo -@file{mysys/COPYING.LIB}. - -@item -Algumas pequenas partes do fonte ( (GNU @code{readline}) esto cobertas pela -``GNU GENERAL PUBLIC LICENSE''. Ver o arquivo @file{readline/COPYING}. - -@item -Algumas partes do fonte (a @code{regexp} livraria) est coberta pelo estilo de -direito autoral Berkeley. - -@item -O outro fonte necessrio para o servidor @strong{MySQL} em plataformas no Microsoft -est coberta pela ``MySQL FREE PUBLIC LICENSE'', a qual baseada na -``Aladdin FREE PUBLIC LICENSE.'' @xref{Public license}. Quando o @strong{MySQL} -est rodando em qualquer sistema operacional Microsoft, outro licenciamento aplicado. -@end enumerate - -Os seguintes pontos direcionam a filosofia sob nossa poltica de direito autoral: - -@itemize @bullet -@item -A livraria cliente SQL deve ser totalmente livre tal que a mesma pode ser includa -em produtos comerciais sem nenhuma limitao. - -@item -Pessoas que querem livre acesso ao programa no qual ns temos colocado uma grande -quantidade de trabalho, podem t-lo, tal que no procurem ganhar dinheiro diretamente -pela distribuio e para benefcio. - -@item -Pessoas que querem manter o direito da propriedade de seu programa, porm tambm -querem o valor de nosso trabalho, podem pagar pelo previlgio. - -@item -O uso normal em casa de GRAA. Mas se voc usa o @strong{MySQL} para algo -importante para voc, voc pode ajudar o desenvolvimento futuro pela -compra de uma licena ou contrato de suporte.@xref{Support}. -@end itemize - -@node Copyright changes, , Copyright, Copyright -@subsection Possible future copyright changes - -Ns poderemos optar para distribuir verses antigas do @strong{MySQL} -com a GPL no futuro. Entretanto, essas verses devem ser identificadas -como @strong{GNU MySQL}. Tambm, todas notas de direitos autorais dos -arquivos relativos devem ser mudados para a GPL. - -@node Commercial use, Licensing examples, Copyright, Licensing and Support -@section Distributing MySQL commercially - -Esta seo um esclarecimento dos termos de licena que so a base na -``MySQL FREE PUBLIC LICENSE'' (FPL). @xref{Public license}. - -O @strong{MySQL} pode ser @strong{usado} livremente , incluindo -entidades comerciais para avaliao ou uso interno sem suporte. -Entretanto, @strong{distribuio} para propsitos comerciais -do @strong{MySQL}, ou qualquer coisa contendo ou derivando do @strong{MySQL} -no seu todo ou parte, requer uma licena comercial escrita da TcX AB, -a nica entidade autorizada para garantir tais licenas. - -Voc no pode incluir o @strong{MySQL} ``de graa'' num pacote contendo -qualquer coisa pela qual um pagamento est sendo feito, exceto como -notado abaixo: - -A inteno da exceo providenciada na segunda clasula da licena -para permitir que organizaes comerciais operando um servidor FTP ou -uma agncia de notcias possam distribuir livremente o @strong{MySQL}, -desde que: - -@enumerate -@item -A organizao complace com as outras provises da FPL, a qual -incluie entre outras coisas um requerimento para distribuir o -cdigo fonte inteiro do @strong{MySQL} e qualquer outro trabalho -derivado, e para distribuir a FPL em si junto com @strong{MySQL}; - -@item -A nica cobrana para abaixar o @strong{MySQL} a cobrana baseada -na distribuio do servio e no numa baseada no contexto da -informao sendo recebida (ex: a cobrana dever ser a mesma para -o recebimento de uma coleo qualquer de bits do mesmo tamanho); - -@item -O servidor ou BBS acessvel para o pblico em geral, ex. o nmero de -telefone ou enedereo IP no guardado em secreto, e qualquer um pode -obter acesso para a informao (possivelmente pagando uma inscrio ou -acesso cobrado que no dependente ou relacionado para comprar qualquer -outra coisa). -@end enumerate - -Se voc quer para distribuir programas em um contexto comercial que -incorpora @strong{MySQL} e voc @strong{no} quer encontrar essas -condies, voc deve contatar TcX AB para encontrar um licenciamento -comercial, o qual envolve um pagamento. O nico meio legal que -voc pode distribuir @strong{MySQL} ou qualquer coisa contendo @strong{MySQL} -so pela distribuio do @strong{MySQL} sob os requerimentos da FPL, ou pela -obteno de uma licena comercial da TcX AB. - -@node Licensing examples, Cost, Commercial use, Licensing and Support -@section Example licensing situations - -@menu -* Products that use MySQL:: Vendendo produtos que usam @strong{MySQL} -* MySQL services:: Vendendo servios relacionados ao @strong{MySQL} -* ISP:: Servios de ISP com @strong{MySQL} -* Web server:: Rodando um servidor web usando o @strong{MySQL}. -@end menu - -Esta seo descreve algumas situaes ilustrando se o caso ou no que -voc deve licenar o servidor @strong{MySQL}. Geralmente esses exemplos -envolvem o fornecimento do @strong{MySQL} como parte de um produto ou -servio que voc est vendendo para um cliente, ou requer que o @strong{MySQL} -seja usado em conjunto com seu produto. Em tais casos, sua responsabilidade -para obter uma licena para o cliente se uma necessria (Este requerimento -pode ser deixado de lado se seu cliente j tem uma licena @strong{MySQL}. -Porm, o vendedor deve enviar informao do cliente e o nmero da licena -para TcX, e a licena dever ser completa, no uma licena OEM). - -Note que uma simples licena do @strong{MySQL} cobre qualquer nmero de -CPUs/usurios/clientes/servidores @code{mysqld} numa s mquina! - -@node Products that use MySQL, MySQL services, Licensing examples, Licensing examples -@subsection Selling products that use MySQL - -Para determinar caso seja necessrio ou no uma licena @strong{MySQL} -quando vendendo a sua aplicao, voc deve perguntar caso seja necessrio -para o funcionamento adequado de sua aplicao a contingncia no uso do -@strong{MySQL} e seja necessrio voc incluir o @strong{MySQL} com seu -produto. Existem vrios casos a considerar: - -@itemize @bullet -@item -Sua aplicao precisa do @strong{MySQL} para funcionar adequadamente ? - -Se o seu produto precisa do @strong{MySQL}, voc necessita uma licena -para cada mquina que roda o servidor @code{mysqld}. Por exemplo, -se voc projeta uma aplicao sobre o @strong{MySQL}, ento voc tem -feito realmente um produto comercial que necessita do servidor, tal que -necessita de uma licena. - -Se sua aplicao no requer o @strong{MySQL}, voc no necessita obter uma -licena. Por exemplo, se o @strong{MySQL} apenas adiciona uma nova caracterstica -a seu produto (tal como adicionando loggin a um banco de dados e se o @strong{MySQL} - usado no lugar de um arquivo texto), o mesmo entra como um uso normal, e uma -licena no precisa ser requerida. - -Em outras palavras, voc necessita de uma licena se voc vende um produto -projetado para uso com o @strong{MySQL} ou que precisa do servidor @strong{MySQL} -para um funcionamento completo. Isto verdadeiro caso haja necessidade ou no de fornecer -o @strong{MySQL} para seu cliente como parte da distribuio de seu produto. - -Isso tambm depende no que voc est fazendo para o cliente. Voc planeja fornecer -a seu cliente com instrues e detalhes na instalao do @strong{MySQL} com seu -programa ?. Ento seu produto contencialmente precisa do @strong{MySQL}; -Sim tal, voc necessita comprar uma licena. Se voc simplesmente usa um banco de -dados que espera j estiver instalado no instante en seu programa comprado, ento -provavelmente no necessita de uma licena. - -@item -Voc incluie o @strong{MySQL} numa distribuio e cobra pela mesma ? - -Se voc incluie @strong{MySQL} com a distribuio que vende para os clientes, -voc necessita uma licena para cada mquina que roda o servidor @code{mysqld}, -porque neste caso voc est vendendo um sistema que incluie @strong{MySQL}. - -Isto verdadeiro no caso que o @strong{MySQL} com seu produto seja requerido -ou opcional. - -@item -Voc no requer nem incluie o @strong{MySQL} com seu produto ? - -Suponha que quer vender um produto projetado de uma maneira geral para usar -com "qualquer banco de dados" e que pode ser configurado para usar qualquer -uma das vrias alternativas de sistemas de banco de dados (@strong{MySQL}, -PostgreSQL, ou qualquer outro. Isto , seu produto no requer @strong{MySQL}, -mas pode suportar qualquer banco de dados com o nvel base de funcionalidade -e voc no depende de qualquer coisa que somente @strong{MySQL} suporta. -Nenhum de vocs paga para ns se o seu cliente realmente seleciona para -usar @strong{MySQL}? - -Neste caso, se voc no fornece, obtm ou configura o @strong{MySQL} para -o cliente e decide o cliente para us-lo, nenhum de vocs precisa de uma -licena. Se voc faz um servio, vide @ref{MySQL services, , -@strong{MySQL} servios}. -@end itemize - -@node MySQL services, ISP, Products that use MySQL, Licensing examples -@subsection Selling MySQL-related services - -Se voc faz uma instalao numa mquina de um cliente do @strong{MySQL} -e h cobrana pelo servio (direta ou indiretamente), ento voc comprar -uma licena @strong{MySQL}. - -Se voc vende uma aplicao para a qual o @strong{MySQL} no estritamente -requerido, porm pode ser usado, uma licena deve indicada, dependendo -como o @strong{MySQL} configurado. Suponha que seu produto no requera e -no incluia o @strong{MySQL} na sua distribuio, porm pode ser configurado -para usar o @strong{MySQL} para os clientes que assim o desejar. (Este pode ser -o caso, por exemplo, se seu produto pode usar qualquer um de servidores de -banco de dados). - -Se o cliente obtm e instala o @strong{MySQL}, nenhuma licena necessria. -Entretanto, se voc faz o servio para seu cliente, ento necessrio uma -licena, porque voc est vendendo um servio que incluie o @strong{MySQL}. - -@node ISP, Web server, MySQL services, Licensing examples -@subsection ISP MySQL services - -Provedores de Servio Internet (ISPs) s vezes hospedam servidores @strong{MySQL} -para seus cliente. - -Se voc um ISP que permite a seus clientes instalar e administrar o -@strong{MySQL} por si prprios na sua mquina sem nenhuma assistncia -de sua parte, nem voc nem o cliente precisa de uma licena @strong{MySQL}. - -Se voc cobra para instalar e administrar o @strong{MySQL} como parte de seu -servio para o cliente, ento voc precisa de uma licena, porque est vendendo -um servio que incluie o @strong{MySQL}. - -@node Web server, , ISP, Licensing examples -@subsection Running a web server using MySQL - -Se voc usa o @strong{MySQL} em conjunto com um servidor web, voc no tem -que pagar uma licena. - -Isto verdadeiro se voc roda um servidor web comercial que usa @strong{MySQL}, -desde que voc no esteja vendendo o @strong{MySQL}. Entretanto, neste caso -ns gostariamos que voc compre suporte @strong{MySQL}, porque @strong{MySQL} -est ajudando a sua empresa. - -@cindex Costs, licensing and support -@cindex Licensing costs -@cindex Support costs -@node Cost, Support, Licensing examples, Licensing and Support -@section MySQL licensing and support costs - -@menu -* Payment information:: Informao de Pagamento -* Contact information:: Informao de contato -@end menu - -Nossos preos atuais de licena so mostrados abaixo. Todos os preos so -em US Dlar. Se voc paga com carto de crdito, a moeda o EURO (European Union Euro), -tais preos diferem levemente. - -@multitable @columnfractions .25 .2 .3 -@item @strong{Nmero de licenas} @tab @strong{Preo por cpia} @tab @strong{Total} -@item 1 @tab US $200 @tab US $200 -@item 10 pacotes @tab US $150 @tab US $1500 -@item 50 pacotes @tab US $120 @tab US $6000 -@end multitable - -Para compras em alto volume (OEM), os seguintes preos so aplicados: - -@multitable @columnfractions .25 .2 .3 .25 -@item @strong{Nmero de licenas} @tab @strong{Preo por cpia} @tab @strong{Mnimo de uma vez} @tab @strong{Pagamento mnimo} -@item 100-999 @tab US $40 @tab 100 @tab US $4000 -@item 1000-2499 @tab US $25 @tab 200 @tab US $5000 -@item 2500-4999 @tab US $20 @tab 400 @tab US $8000 -@end multitable - -Para compras OEM, voc deve atuar como o intermedirio para eventuais -problemas ou solicitaes de seus usurios. Ns tambm requeremos que -clientes OEM tenham ao menos um contrato de suporte extended email. - -Se voc tem uma margem baixa em alto volume de produtos, voc pode falar -com ns sobre outros termos (por exemplo, a porcentagem dos preos de -venda). Se voc faz, por favor seja informativo sobre seu produto, preo, -mercado e qualquer outra informao que seja relevante. - -@cindex @code{myisampack} -Depois de comprar 1 licena @strong{MySQL}, voc ter uma cpia pessoal -do utilitrio @code{myisampack}. Voc no est permitido em distribuir -esse utilitrio porm voc pode distribuir tabelas compactadas com ele. - -Um preo completo de uma licena no um acordo de suporte e incluie um -mnimo suporte. Isto significa que ns tentamos responder qualquer pergunta -relevante. Se a resposta est na documentao, ns direcionamos voc -apropriada seo. Se voc no tem comprado uma licena ou suporte, ns -provavelmente no responderemos ao tudo. - -Se voc descobre o que consideramos um real bug, ns estamos prontificados -a solucionar o erro em qualquer caso. Porm se voc paga por suporte ns -o notificaremos sobre o andamento da soluo ao invs de soluncion-lo -nos prximos lanamentos. - -Suporte mais amplo vendido separadamente. Descries do que incluie cada -nvel de suporte so dadas em @ref{Support}. Custos para os vrios tipos -comerciais de suporte so mostrados abaixo. O nvel de preos de suporte -esto em EURO (European Union Euro). Um EURO aproximadamente 1.17 USD. - -@multitable @columnfractions .3 .3 -@item @strong{Tipo de suporte} @tab @strong{Custo por ano} -@item Basic email support @tab EURO 170 -@item Extended email support @tab EURO 1000 -@item Login support @tab EURO 2000 -@item Extended login support @tab EURO 5000 -@end multitable - -Voc pode atualizar um nvel mais baixo sw suporte para um de maior -nvel, pela diferena entre os preos dos dois nveis. - -@cindex Payment information -@node Payment information, Contact information, Cost, Cost -@subsection Payment information - -Correntemente ns podemos tomar pagamentos SWIFT, cheques ou cartes de crdito. - -O pagamento poder ser feito a: -@example -Postgirot Bank AB -105 06 STOCKHOLM, SWEDEN - -TCX DataKonsult AB -BOX 6434 -11382 STOCKHOLM, SWEDEN - -SWIFT address: PGSI SESS -Nmero da Conta: 96 77 06 - 3 -@end example - -Especificar: licena e/ou suporte, seu nome e endereo de e-mail. - -Em europa e Japo voc pode usar EuroGiro (que pode ser menos caro) para a mesma -conta. - -Se voc quer pagar atravs de cheque, faa-o nominal a ``Monty Program KB'' e mande -um e-mail para o endereo abaixo: - -@example -TCX DataKonsult AB -BOX 6434, Torsgatan 21 -11382 STOCKHOLM, SWEDEN -@end example - -Se voc quer pagar com carto de crdito usando a Internet, voc pode -usar o seguro formulrio de licena da TcX: -@uref{https://www.mysql.com/license.htmy. - -Voc pode tambm imprimir uma cpia do formulrio de licena, prench-lo e mand-lo -via fax para: - - -+46-8-729 69 05 - -Se voc quer que ns uma cobrana para voc, voc pode usar o formulrio de -licena e escrever ``bill us'' no campo de comentrios. Voc pode tambm -mandar uma mensagem via e-mail para @email{sales@@mysql.com} (@strong{not} -@email{mysql@@lists.mysql.com}!) com a informao de sua companhia e pedir -para ns para efetuar a cobrana. - -@cindex Contact information -@node Contact information, , Payment information, Cost -@subsection Contact information - -Para licenciamento comercial, ou se voc tm qualquer pergunta sobre -informao desta seo, por favor contatar a equipe de licenciamento -do @strong{MySQL}. O mais preferido mtodo o e-mail para -@email{mysql-licensing@@mysql.com}. Fax tambm possvel porm sua -manipulao pode demorar muito (Fax +46-8-729 69 05). - -@example -David Axmark -Detron HB -Kungsgatan 65 B -753 21 UPPSALA -SWEDEN -Fone Voz +46-18-10 22 80 (Timezone GMT+1. Fala Sueco e Ingls) -@end example - -@cindex Support, types -@cindex Types of support -@node Support, , Cost, Licensing and Support -@section Types of commercial support - -@menu -* Basic email support:: Basic email support -* Extended email support:: Extended email support -* Login support:: Login support -* Extended login support:: Extended login support -@end menu - -@node Basic email support, Extended email support, Support, Support -@subsection Basic email support - -Basic email support a opo mais barata de suporte e dever ser vista -como uma forma de suportar nosso desenvolvimento do @strong{MySQL} que -uma real opo de suporte. - -Neste nvel de suporte, a lista de e-mail do @strong{MySQL} o preferido -meio de comunicao. Perguntas normalmente podem ser enviadas para a -principal lista de e-mail (@email{mysql@@lists.mysql.com}) ou uma das outras -listas regulares (por exemplo, @email{mysql-win32@@lists.mysql.com} relacionada -s perguntas para o @strong{MySQL} Windows, tal que qualquer pessoa pode j ter -experimentado e resolvido o problema que voc tem. @xref{Asking questions}. - -Entretanto, comprando o suporte basic email support, voc tambm tem acesso -ao e-mail @email{mysql-support@@mysql.com}, o qual no disponvel -como parte do suporte mnimo que se tem quando se adquire uma licena @strong{MySQL}. -Isto significa que para perguntas crticas, voc pode mandar sua mensagem para -@email{mysql-support@@mysql.com}. (Se a mensagem tem dados privados, voc s -deve mandar para o @email{mysql-support@@mysql.com}.) - -@emph{LEMBRE-SE!} para SEMPRE incluir o nmero de registro e data de -trmino quando mandar uma mensagem para -@email{mysql-support@@mysql.com}. - -Basic email support incluie os seguintes tipos de servios: - -@itemize @bullet -@item -Se sua pergunta j est respondida no manual, ns o informamos da correta -seo na qual pode encontrar a resposta. Se a resposta no est no manual, -ns o colocamos na direo certa para resolver seu problema. - -@item -Ns garantimos em tempo apropriado a resposta das mensagem de seu e-mail. -Ns no podemos garantir que podemos resolver qualquer problema, porm ao -menos voc receve uma resposta se podemos contat-lo por e-mail. - -@item -Ns podemos ajud-lo com problemas inesperados quando instala @strong{MySQL} -a partir de uma distribuio binria em plataformas suportadas. Este nvel de -suporte no cobre instalao do @strong{MySQL} a partir de uma distribuio -fonte. Plataformas ``Suportadas'' so aquelas plataformas nas quais o @strong{MySQL} - conhecido que funciona. -@xref{Which OS}. - -@item -Ns ajudaremos voc com bugs e problemas de caractersticas. Qualquer -bug que for encontrado ns o solucionamos no prximo lanamento do @strong{MySQL}. -Se o bug crtico para voc, ns enviamos um e-mail com o patch -to logo como o bug resolvido. Bugs crticos tm sempre para ns a maior -prioridade, para assegurar que sejam solucionados to pronto como possvel. - -@item -Suas sugestes para desenvolvimento posterior do @strong{MySQL} so tomadas -em considerao. Obtendo o email support, voc j ajuda o desenvolvimento -posterior do @strong{MySQL}. Se voc quer pr mais, faa a atualizao -para um nvel mais alto de suporte. - -@item -Se voc quer ns ajudar a otimizar seu sistema, voc deve atualizar -para um nvel maior de suporte. - -@item -@cindex @code{myisampack} -Ns incluimos uma verso binria da ferramenta de compactao @code{myisampack} -para criar rpidos bancos de dados compactados, somente de leitura. O atual -servidor incluie suporte para ler esses bancos de dados mas no a ferramenta -para criar os mesmos. -@end itemize - -@node Extended email support, Login support, Basic email support, Support -@subsection Extended email support - -Extended email support incluie tudo o do basic email support com estas -adies: - -@itemize @bullet -@item -Seu e-mail ser tratado antes dos e-amil dos usurios do basic email support -e dos usurios no registrados. - -@item -Suas sugestes para o prximo desenvolvimento do @strong{MySQL} receber -uma forte considerao. Simples extenses que fazem os gols do @strong{MySQL} -so a implementao em questo de dias. adquirindo o extended email support -voc auxilia daqui para frente o desenvolvimento do @strong{MySQL}. - -@item -Perguntas tpicas que so cobertas pelo extended email support so: - -@itemize @minus -@item -Ns respondemos e (dentro do razovel) resolvemos as perguntas relacionadas -a possveis bugs no @strong{MySQL}. To pronto como os bugs so encontrados -e corregidoa, ns mandamos por e-mail o pacth para ele. - -@item -Ns auxiliamos com inesperados problemas quando voc instala o @strong{MySQL} -a partir do fonte ou distribuio binria nas plataformas suportadas. - -@item -Ns responderemos perguntas sobre caractersticas perdidad e ofereceremos -dicas como trabalhar e contornar elas. - -@item -Ns forneceremos dicas na otimizao do @code{mysqld}para sua situao. -@end itemize - -@item -Voc est permitido a influenciar a prioridade de itens do TODO do @strong{MySQL}. -Isso assegura que as caractersticas que voc realmente precisa sejam implementadas -rapidamente que as mesmas poderia ser de outra forma. -@end itemize - -@node Login support, Extended login support, Extended email support, Support -@subsection Login support - -O Login support incluie tudo do extended email support com estas adies: - -@itemize @bullet -@item -Seu e-mail ter prioridade sobre os usurios do suporte extended email. - -@item -Suas sugestes para o prximo desenvolvimento do @strong{MySQL} ser tomado -com uma alta considerao. Extenses reais que podem ser implementadas num -par de horas e que fazem os gols do @strong{MySQL} sero implementadas -to logo como possvel. - -@item -Se voc tem um problema muito especfico, ns tentaremos logar no seu -sistema para resolver o problema ''no local''. - -@item -Tal como qualquer outro vendedor de banco de dados, no podemos garantir que -podemos recuperar qualquer dado de tabelas corrompidas, porm se o pior acontece -ns poderemos a recuperar tanto quanto seja possvel. O @strong{MySQL}tem provado -ser muito seguro, porm qualquer possvel devido a circuntncias fora de nosso -controle (por exemplo, se seu sistema crash ou algum kill o servidor executando -um comando @code{kill -9}). - -@item -Ns providenciaremos dicas na otimizao de seu sistema e consultas. - -@item -Voc est permitido para chamar um desenvolvedor @strong{MySQL} (moderadamente) e -discutir seu problemas relacionados com o @strong{MySQL}. -@end itemize - -@node Extended login support, , Login support, Support -@subsection Extended login support - -O Extended login support incluie tudo do login support com estas adies: - -@itemize @bullet -@item -Seu e-mail tem a mais alta prioridade possvel. - -@item -Ns ativamente examinamos seu sistema e ajudamos a otimiz-lo assim como suas -consultas. Ns tambm podemos otimizar e/ou extender o @strong{MySQL} -para suprir melhor suas necessidades. - -@item -Voc tambm pode solicitar extenses es peciais apenas para voc. Por exemplo: -@example -mysql> select MY_CALCULATION(col_name1,col_name2) from tbl_name; -@end example - -@item -Ns podemos fornecer uma distribuio binria para todas as atualizaes -mais importantes do @strong{MySQL} para seu sistema, to logo como podemos -obter uma conta em um sistema similar. No pior dos casos, ns podemos requerer -acesso para seu sistema para ser capaz de criar uma distribuio binria. - -@item -Se voc pode providenciar acomodaes e pagar os custos de viagem para um -desenvolvedor @strong{MySQL} para vist-lo e oferecer ajuda com seus problemas. -O suporte Extended login support entitula voc para um encontro pessoal por -ano, porm ns sempre somos muito flexveis para levar para frente nossos -clientes!. -@end itemize - -@node Installing, Compatibility, Licensing and Support, Top - diff --git a/Docs/manual.de.texi b/Docs/manual.de.texi deleted file mode 100644 index 902a9496bbb..00000000000 --- a/Docs/manual.de.texi +++ /dev/null @@ -1,107 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c -@c ********************************************************* -@c -@c This is a dummy placeholder file for manual.de.texi in the -@c MySQL source trees. -@c -@c Note, that the manual has been moved into a separate -@c BitKeeper source tree named "mysqldoc" - do not attempt -@c to add NEWS entries or documentation to this file! All -@c changes to the manual should be done in the mysqldoc tree. -@c -@c See http://www.mysql.com/doc/en/Installing_source_tree.html -@c for information about how to work with BitKeeper source trees. -@c -@c This dummy file is being replaced with the real manual from the -@c mysqldoc tree when building the official source distribution. -@c -@c Please e-mail docs@mysql.com for more information or if -@c you are interested in doing a translation. -@c -@c ********************************************************* -@c -@c %**start of header - -@setfilename mysql.de.info - -@c We want the types in the same index -@syncodeindex tp fn - -@c Get version information. This file is generated by the Makefile!! -@include include.texi - -@ifclear tex-debug -@c This removes the black squares in the right margin -@finalout -@end ifclear - -@c Set background for HTML -@set _body_tags BGCOLOR=silver TEXT=#000000 LINK=#101090 VLINK=#7030B0 -@c Set some style elements for the manual in HTML form. 'suggested' -@c natural language colors: aqua, black, blue, fuchsia, gray, green, -@c lime, maroon, navy, olive, purple, red, silver, teal, white, and -@c yellow. From Steeve Buehler -@set _extra_head - -@settitle Dummy MySQL Reference Manual for version @value{mysql_version}. - -@c We want single-sided heading format, with chapters on new pages. To -@c get double-sided format change 'on' below to 'odd' -@setchapternewpage on - -@paragraphindent 0 - -@c %**end of header - -@ifinfo -@format -START-INFO-DIR-ENTRY -* mysql: (mysql). MySQL documentation. -END-INFO-DIR-ENTRY -@end format -@end ifinfo - -@titlepage -@sp 10 -@center @titlefont{Empty placeholder for the MySQL Reference Manual} -@sp 10 -@center Copyright @copyright{} 1995-2002 MySQL AB -@c blank page after title page makes page 1 be a page front. -@c also makes the back of the title page blank. -@page -@end titlepage - -@c This should be added. The HTML conversion also needs a MySQL version -@c number somewhere. - -@iftex -@c change this to double if you want formatting for double-sided -@c printing -@headings single - -@oddheading @thischapter @| @| @thispage -@evenheading @thispage @| @| MySQL Technical Reference for Version @value{mysql_version} - -@end iftex - -@node Top, (dir), (dir), (dir) - -@ifinfo -This is an empty placeholder file for the MySQL manual. - -The MySQL manual is now maintained in a separate BitKeeper source tree! -Please see @url{http://www.mysql.com/doc/en/Installing_source_tree.html} -for more info on how to work with BitKeeper. - -Please do not attempt to edit this file to add NEWS entries or to add -documentation! Use the one in the @code{mysqldoc} BK tree instead. - -This file will be replaced with the current @code{manual.de.texi} when building -the official source distribution. - -You can find a specific manual for any older version of MySQL -in the binary or source distribution for that version. -@end ifinfo - -@bye diff --git a/Docs/manual.ja.texi b/Docs/manual.ja.texi deleted file mode 100644 index 2a0b0fbf34b..00000000000 --- a/Docs/manual.ja.texi +++ /dev/null @@ -1,38699 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c Copyright 1997, 1998, 1999, 2000 TcX AB, Detron HB and MySQL Finland AB -@c -@c ********************************************************* -@c Note that @node names are used on our Website. -@c So do not change node names without checking -@c Makefile.am and SitePages first. -@c ********************************************************* -@c -@c %**start of header -@setfilename mysql.info -@c We want the types in the same index -@syncodeindex tp fn -@c Get version info. This file is generated by the Makefile!! -@include include.texi -@ifclear tex-debug -@c This removes the black squares in the right margin -@finalout -@end ifclear -@c Set background for HTML -@set _body_tags BGCOLOR=#FFFFFF TEXT=#000000 LINK=#101090 VLINK=#7030B0 -@c @set _body_tags BGCOLOR=silver TEXT=#000000 LINK=#101090 VLINK=#7030B0 -@c Set some style elements for the manual in HTML form. 'suggested' -@c natural language colours: aqua, black, blue, fuchsia, gray, green, -@c lime, maroon, navy, olive, purple, red, silver, teal, white, and -@c yellow. From Steeve Buehler -@set _extra_head -@settitle @strong{MySQL} Reference Manual for version @value{mysql_version}. -@c We want single-sided heading format, with chapters on new pages. To -@c get double-sided format change 'on' below to 'odd' -@setchapternewpage on -@paragraphindent 0 -@c %**end of header - -@ifinfo -@format -START-INFO-DIR-ENTRY -* mysql: (mysql). @strong{MySQL} documentation. -END-INFO-DIR-ENTRY -@end format -@end ifinfo - -@titlepage -@sp 10 -@center @titlefont{@strong{MySQL} Reference Manual} -@sp 10 -@center Copyright @copyright{} 1997, 1998, 1999, 2000 TcX AB, Detron HB and MySQL Finland AB -@end titlepage - -@c This should be added. The HTML conversion also needs a MySQL version -@c number somewhere. - -@iftex -@c change this to double if you want formatting for double-sided -@c printing -@headings single -@everyheading @thispage @| @| @thischapter -@everyfooting @| @| Version: @value{mysql_version} Printed: @today{} -@end iftex - -@node Top, Introduction, (dir), (dir) - -@c @ifhtml -@c -@c -@c @end ifhtml - -@ifinfo -This is a manual for @strong{MySQL}. This version is about the -@value{mysql_version} version of @strong{MySQL}. For a @strong{3.20} -version see the relevant distribution. -@end ifinfo - -@menu -* Introduction:: General Information about @strong{MySQL} -* Questions:: @strong{MySQL} mailing lists and how to ask questions or report errors (bugs) -* Licensing and Support:: @strong{MySQL} licensing and support -* Installing:: Installing @strong{MySQL} -* Compatibility:: How standards-compatible is @strong{MySQL}? -* Privilege system:: The @strong{MySQL} access privilege system -* Reference:: @strong{MySQL} language reference -* Table types:: @strong{MySQL} table types -* Tutorial:: @strong{MySQL} Tutorial -* Server:: @strong{MySQL} Server -* Replication:: Replication -* Performance:: Getting maximum performance from @strong{MySQL} -* MySQL Benchmarks:: The @strong{MySQL} benchmark suite -* Tools:: @strong{MySQL} Utilities -* Maintenance:: Maintaining a @strong{MySQL} installation -* Adding functions:: Adding new functions to @strong{MySQL} -* Adding procedures:: Adding new procedures to @strong{MySQL} -* ODBC:: @strong{MySQL} ODBC Support -* Common programs:: Using @strong{MySQL} with some common programs -* Problems:: Problems -* Common problems:: Solving some common problems with @strong{MySQL} -* Clients:: @strong{MySQL} client tools and APIs -* Comparisons:: How does @strong{MySQL} compare with other databases? -* MySQL internals:: @strong{MySQL} internals -* Environment variables:: @strong{MySQL} environment variables -* Users:: Some @strong{MySQL} users -* Contrib:: Contributed programs -* Credits:: Contributors to @strong{MySQL} -* News:: @strong{MySQL} change history -* Bugs:: Known errors and design deficiencies in @strong{MySQL} -* TODO:: List of things we want to add to @strong{MySQL} in the future (The TODO) -* Porting:: Comments on porting to other systems -* Regexp:: Description of @strong{MySQL} regular expression syntax -* Unireg:: What is Unireg? -* Public license:: The @strong{MySQL} server license -* Win license:: The @strong{MySQL} license for Microsoft operating systems -* Function Index:: SQL command, type and function index -* Concept Index:: Concept Index - -@end menu - -@cindex Overview -@cindex General Information -@node Introduction, Questions, Top, Top -@chapter @strong{MySQL} ˤĤƤΰ̾ - -@menu -* What-is:: @strong{MySQL} Ȥϲ -* Manual-info:: Υޥ˥奢ˤĤ -* History:: @strong{MySQL} -* MySQL-Books:: Books about MySQL -* Features:: @strong{MySQL}μʵǽ -* Stability:: @strong{MySQL} Ϥɤ줯餤꤫ -* Year 2000 compliance:: 2000 ǯб -* General-SQL:: Ū SQL ȥ塼ȥꥢ -* Useful Links:: @strong{MySQL} Ϣ -@end menu - - @strong{MySQL} Υե󥹥ޥ˥奢Ǥ; -@strong{MySQL} С @value{mysql_version} ˤĤƵҤƤޤ - -@strong{MySQL} ȯŸʤΤǡޥ˥奢ˤ˹ޤΤᡢ -饤ǻȤʤ¤ꡢΥС󤬴ڤǤǽޤ -Υޥ˥奢κǿС @uref{http://www.mysql.com/doc.html} ¿ -ͤʷ֤Ƥޤޥ˥奢ξ򸫤ĤĤ餤֤Ĥʤ顢 -ǽ PHP С @uref{http://www.mysql.com/php/manual.php3}  -ȤǽǤ - -@strong{MySQL} ϤȤƤ®ǡޥåɡޥ桼 SQL -(Structured Query Language)ǡ١ФǤ - -Unix OS/2 ץåȥեǤ @strong{MySQL} ϴŪ̵ǤꡢMicrosoft -ץåȥեǤϡ30λѴ֤᤮ƻѤ @strong{MySQL} 饤󥹤 -ʤФʤޤ. @xref{Licensing and Support}. - -@uref{http://www.mysql.com/, @strong{MySQL} ۡڡ} @strong{MySQL} -ˤĤƤκǿ󶡤Ƥޤ - -ΥꥹȤϥޥ˥奢ΤĤͭѤʥƤޤ: - -@itemize @bullet -@item -@strong{MySQL} ǽϤˤĤƤϡ@ref{Features} 򻲾ȤƤ - -@item -󥹥ȡˡˤĤƤ @ref{Installing} 򻲾ȤƤ -@strong{MySQL} 򿷤ޥ OS ˰ܹԤ뤿ΥҥȤˤĤƤ -@ref{Porting} 򻲾ȤƤ - -@item -3.21 ꡼Υåץ졼ɤˤĤƤξϡ -@ref{Upgrading-from-3.21} 򻲾ȤƤ - -@item -@strong{MySQL} ƳΥ塼ȥꥢˤĤƤϡ@ref{Tutorial} 򻲾ȤƤ - -@item -SQL ȥ٥ޡˤĤƤϥ٥ޡ󥰤Υǥ쥯ȥ򻲾 -Ƥ(@file{sql-bench} ǥ쥯ȥǤ) - -@item -ǽȥХˤĤƤ @ref{News} 򻲾ȤƤ - -@item -ΤƤХ̵ǽΰˤĤƤ @ref{Bugs} 򻲾ȤƤ - - -@item -ηײˤĤƤ @ref{TODO} 򻲾ȤƤ - -@item -ΥץȤؤƤι׸ԤΥꥹȤˤĤƤ @ref{Credits} 򻲾ȤƤ - -@end itemize - -@strong{:} - -@c if the @email is at the beginning of a line the texi2html fails -顼(Х)ݡȡ䡢Ȥ -᡼󥰥ꥹ @email{mysql@@lists.mysql.com} äƤ@xref{Bug reports} -ХݡȤ뤿ˤ @code{mysqlbug} ץȤѤ٤Ǥ -@c FIX! RPMs are also binary -ǥȥӥ塼Ǥϡ@code{mysqlbug} ץȤ @file{scripts} ǥ쥯ȥ -˸Ĥ뤳ȤǤޤХʥǥȥӥ塼Ǥϡ@code{mysqlbug} -@file{bin} ǥ쥯ȥ˸Ĥ뤳ȤǤޤ - -@c FIX! Remeber to create the alias! -Υޥ˥奢ؤɲäޤϽ˴ϢƤϡ -@strong{MySQL} ޥ˥奢 (@email{docs@@mysql.com}) -äƤ - -@cindex @strong{MySQL}, what it is -@node What-is, Manual-info, Introduction, Introduction -@section @strong{MySQL} Ȥϲ - -@strong{MySQL} ˥ޥ桼ޥåɤ SQL -ǡ١ФǤSQL ǤäȤݥԥ顼 -ǡ١Ǥ@strong{MySQL} ϡХǡ @code{mysqld} -¿μΥ饤ȥץȥ饤֥꤫ʤ륯饤/ -мǤ - -SQLϡ¸ƥ뤳Ȥñˤ뤿ɸಽ줿Ǥ -㤨Сʤϡʰ򸡺뤿SQLȤäơ -֥Ȥ˴ؤ륫ޡѤ뤳ȤǤޤ -@strong{MySQL} ϡ̿¸ˤ⡢ʬˤϤ䤯ե쥭֥Ǥ - -@strong{MySQL} μŪϹ®ǴǴñ˻ѤǤ뤳ȤǤ -@strong{MySQL} ȼ˳ȯޤ桹ϡȤƤ礭ʥǡ -١¾Υǡ١٥桹󶡤Τ®٤ -˽Ǥ SQL ФɬפȤƤǤ桹ϡ10,000 ơ -֥ޤ 40 ʾΥǡ١δĶ 1996 ǯ @strong{MySQL} -ѤƤޤΥơ֥ 500 ơ֥ʾ 700ʾΥ쥳ɤޤ -100ХȤΡ𴴶̳ΥǡǤ - -@strong{MySQL} Ǥδܤϡǯδ֡ʴĶι⤤׵ -ǻѤƤ롼ΥåȤǤ@strong{MySQL} ϤޤȯǤ -˭٤ǤȤƤͭѤʴؿåȤ󶡤Ƥޤ - -@cindex How to pronounce @strong{MySQL} -@cindex @strong{MySQL}, how to pronounce -@strong{MySQL} θȯ ``My Ess Que Ell'' Ǥ(MY-SEQUEL ǤϤ -ޤ) - -@cindex Manual information -@node Manual-info, History, What-is, Introduction -@section Υޥ˥奢ˤĤ - -Υޥ˥奢ϰʲˤޤ -(ϥɥ̾񤭤ޤɾάСϿ :) ) - -@itemize @bullet -@item ̱ -@item hama -@item dale -@item kippara -@item kenji -@item aoki -@item tok21108 -@item -@item tamori -@end itemize - -@menu -* Manual conventions:: Conventions used in this manual -@end menu - -Υޥ˥奢ϸ Texinfo, ץ졼ƥ, Info, HTML, -PostScript, PDF С -ޤ礭 Postscript PDF С -@strong{MySQL} Υǥȥӥ塼ˤϴޤޤƤޤ󤬡̤˥ -ɤ褦ˤʤäƤޤ@uref{http://www.mysql.com/}. - -ץ饤ޥɥȤ Texinfo եǤHTML С -@code{texi2html} ѹ줿СǼưŪ󶡤ޤץ졼 -ƥȤ Info С @code{makeinfo} 󶡤ޤPostScript -С @code{texi2dvi} @code{divps} Ѥ󶡤ޤPDF -С Ghostscript 桼ƥƥ @code{ps2pdf} 󶡤ޤ - -Υޥ˥奢 David Axmark, Michael (Monty) Widenius, Paul DuBois, -ˤäƺ졢ݻƤޤ¾ι׸ԤˤĤƤ -@ref{Credits} 򻲾ȤƤ - -@node Manual conventions, , Manual-info, Manual-info -@subsection Υޥ˥奢ǻѤƤɽ - -Υޥ˥奢ΰɽѤƤޤ: - -@table @asis -@item @code{constant} -եȤϼΤΤ˻Ѥޤޥ̾, ץ; SQL ơ -ȥ; ǡ١̾, ơ֥̾, ե̾; C Perl ; Ķѿ -: ``@code{mysqladmin} ɤΤ褦ư뤫򸫤뤿ˤϡ -@code{--help} ץĤƵưƤ'' - -@item @file{filename} -dz줿եȤϥե̾ȥѥ̾˻Ѥޤ: `` -ǥȥӥ塼 @file{/usr/local} ǥ쥯ȥ۲˥󥹥ȡ뤵ޤ'' - -@item @samp{c} -dz줿եȤʸ󥹤򼨤ˤѤޤ -: ``磻ɥɤꤹ뤿ˤϡ@samp{%} ʸѤƤ'' - -@item @emph{italic} -åեȤ϶ĴΤ˻Ѥޤ, @emph{Τ褦} - -@item @strong{boldface} -ܡɥեȤϥ̾(㤨С``@strong{process} ưפ -ͿʤǤ'')ȡ@strong{ä˶Ĵ}뤿˻Ѥޤ -@end table - -ޥɤΥץˤäƼ¹Ԥ뤳Ȥ̣뤳Ȥɽ -ޥɤȶɽץץȤˤäơΥץɽޤ㤨С -@code{shell>} ϡʤΥ󥷥뤫¹Ԥ륳ޥɤɽ -@code{mysql>} @code{mysql} 饤ȥץफ¹Ԥ륳ޥɤɽޤ: - -@example -shell> type a shell command here -mysql> type a mysql command here -@end example - -륳ޥɤ Bourne 빽ʸǼޤ@code{csh} Υ -ѤƤϡ鷺ѹƥޥɤȯԤɬפǤ -㤨СĶѿꤷƥޥɤ¹Ԥ륷󥹤ϡBourne -빽ʸǤϼΤ褦ˤʤޤ: - -@example -shell> VARNAME=value some_command -@end example - -@code{csh} ǤϡΤ褦ʥ󥹤¹ԤƤ: - -@example -shell> setenv VARNAME value -shell> some_command -@end example - -ǡ١̾, ơ֥̾, ե̾ϥޥɤִʤФʤ -Ȥ褯ޤΤ褦ִɬפʤȤ򼨤ˡΥޥ˥奢 - @code{db_name}, @code{tbl_name}, @code{col_name} Ѥޤ -㤨СΤ褦ʥơȥȤ򸫤: - -@example -mysql> SELECT col_name FROM db_name.tbl_name; -@end example - -ϡƱͤΥơȥȤϤ뤿ˤϡ餯Τ褦ˡ -ȤΥǡ١̾, ơ֥̾, ե̾򶡵뤹뤳Ȥ̣ޤ: - -@example -mysql> SELECT author_name FROM biblio_db.author_list; -@end example - -SQL ơȥȤʸǤ⾮ʸǤ⵭ҤǤޤΥޥ˥奢뤬 -SQL ơȥȤ򼨤Ȥϡ̤ʥɤƤˤ( -Ĵ뤿)ΥɤʸѤ졢ĤΥơȥ -Ȥ˾ʸѤޤ 㤨С@code{SELECT} ơȥȤ -ˤϼǤ礦: - -@example -mysql> SELECT count(*) FROM tbl_name; -@end example - -@code{COUNT()} ؿǤϡơȥȤϼΤ褦˽񤫤 -ޤ: - -@example -mysql> select COUNT(*) from tbl_name; -@end example - -̤ʶĴտޤʤ硢ƤΥɤʸǽ񤫤ޤ - -ʸǤϡѳ(@samp{[} @samp{]})ϥץñǤ -뤳Ȥ򼨤˻Ѥޤ: - -@example -DROP TABLE [IF EXISTS] tbl_name -@end example - -ʸǤĤΤΤʤ硢ľС(@samp{|})Ƕڤޤ -򥻥åȤĤΥФ֤ȤǤȤϡѳ˥ꥹȤ -ޤ -(@samp{[} and @samp{]}): - -@example -TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) -@end example - -򥻥åȤĤΥФɬפȤϡȳ(@samp{@{} - @samp{@}})˥ꥹȤޤ: - -@example -@{DESCRIBE | DESC@} tbl_name @{col_name | wild@} -@end example - -@cindex @strong{MySQL} version -@node History, MySQL-Books, Manual-info, Introduction -@section @strong{MySQL} - -桹Ȥ®٥ (ISAM) 롼Ѥ롢桹Υơ֥ -³뤿ˡ 桹ϰ -@code{mSQL} ѤĤǤĤΥƥȤθ塢桹 -@code{mSQL} ϲ桹ɬפȤۤɹ®ǤϤʤ٤äƤʤȤ -˻ޤη̡@code{mSQL} ȤۤȤƱ API 󥿥ե -ġ桹Υǡ١ؤο SQL 󥿥ե˵뤷ޤ - API ϥɥѡƥɤΰܿñˤ뤿򤵤ޤ - -@strong{MySQL} ̾ͳϴˤ餫ǤϤޤ󡣲桹Υ١ -ǥ쥯ȥ¿Υ饤֥ȥġƬ ``my'' 10 ǯʾȤ -ƤޤMonty ̼(ǯ㤤) My Ȥ̾ǤΤᡢ -2ĤΤɤ餬 @strong{MySQL} ̾Ϳϡ桹ˤȤäƤ̤ -Ǥ - -@node MySQL-Books, Features, History, Introduction -@section Books about MySQL - -While this manual is still the right place for up to date techical -information, its primary goal is to contain everything there is to know -about @strong{MySQL}. And it is sometimes nice to have a bound book to read -in bed or while you travel. Here are a list of books about @strong{MySQL} (in -English). - -@multitable @columnfractions .3 .7 -@item Title @tab @uref{http://www2.newriders.com/cfm/prod_book.cfm?RecordID=584,MySQL} -@item Publisher @tab New Riders -@item Author @tab Paul DuBois -@item Pub Date @tab 1st Edition December 1999 -@item ISBN @tab 0735709211 -@item Pages @tab 800 -@item Price @tab $49.99 US -@item Downloadable examples @tab @uref{http://mysql.com/Contrib/Examples/samp_db.tar.gz, @code{samp_db.tar.gz}} -@item Errata @tab @uref{http://www.mysql.com/pauls-mysql-book-errata.html, are available here} -@end multitable -Foreword by Michael ``Monty'' Widenius, @strong{MySQL} Moderator - -In @strong{MySQL}, Paul DuBois provides you with a comprehensive guide to -one of the most popular relational database systems. Paul has -contributed to the online documentation for @strong{MySQL}, and is an -active member of the @strong{MySQL} community. The principal @strong{MySQL} -developer, Monty Widenius, and a network of his fellow developers -reviewed the manuscript, providing Paul with the kind of insight -no one else could supply. - -Instead of merely giving you a general overview of @strong{MySQL}, Paul -teaches you how to make the most of its capabilities. Through two -sample database applications that run throughout the book, he -gives you solutions to problems you're sure to face. He helps you -integrate @strong{MySQL} efficiently with third-party tools, such as PHP -and Perl, enabling you to generate dynamic Web pages through -database queries. He teaches you to write programs that access -@strong{MySQL} databases, and also provides a comprehensive set of -references to column types, operators, functions, SQL syntax, -@strong{MySQL} programming, C API, Perl @code{DBI}, and PHP API. -@strong{MySQL} simply gives you the kind of information you won't find -anywhere else. - -If you use @strong{MySQL}, this book provides you with: -@itemize @bullet -@item -An introduction to @strong{MySQL} and SQL -@item -Coverage of @strong{MySQL}'s data types and how to use them -@item -Thorough treatment of how to write client programs in C -@item -A guide to using the Perl @code{DBI} and PHP APIs for developing -command-line and Web-based applications -@item -Tips on administrative issues such as user accounts, backup, -crash recovery, and security -@item -Help in choosing an ISP for @strong{MySQL} access -@item -A comprehensive reference for @strong{MySQL}'s data types, operators, -functions, and SQL statements and utilities -@item -Complete reference guides for @strong{MySQL}'s C API, the Perl @code{DBI} API, -and PHP's @strong{MySQL}-related functions -@end itemize - -@multitable @columnfractions .3 .7 -@item Title @tab @uref{http://www.oreilly.com/catalog/msql/noframes.html,MySQL & mSQL} -@item Publisher @tab O'Reilly -@item Authors @tab Randy Jay Yarger, George Reese & Tim King -@item Pub Date @tab 1st Edition July 1999 -@item ISBN @tab 1-56592-434-7, Order Number: 4347 -@item Pages @tab 506 -@item Price @tab $34.95 -@end multitable - -This book teaches you how to use @strong{MySQL} and @code{mSQL}, two popular and -robust database products that support key subsets of SQL on both Linux -and UNIX systems. Anyone who knows basic C, Java, Perl, or Python can -write a program to interact with a database, either as a stand-alone -application or through a Web page. This book takes you through the -whole process, from installation and configuration to programming -interfaces and basic administration. Includes ample tutorial -material. - -@multitable @columnfractions .3 .7 -@item Title @tab @uref{http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=0672319144,Sams Teach Yourself MySQL in 21 Days} -@item Publisher @tab Sams -@item Authors @tab Mark Maslakowski and Tony Butcher -@item Pub Date @tab June 2000 -@item ISBN @tab 0672319144 -@item Pages @tab N/A -@item Price @tab $39.99 -@end multitable - -Sams Teach Yourself @strong{MySQL} in 21 Days is for intermediate Linux users -who want to move into databases. A large share of the audience to be web -developers needing a database to store large amounts of information that can -be retrieved via the Web. Sams Teach Yourself @strong{MySQL} in 21 Days is a -practical, step-by-step tutorial. The reader will learn to design and employ -this open source database technology into his/her web site using practical, -hands-on examples to follow. - -@multitable @columnfractions .3 .7 -@item Title @tab @uref{http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=0761524452,E-Commerce Solutions with MySQL} -@item Publisher @tab Prima -@item Authors @tab N/A -@item Pub Date @tab September 2000 -@item ISBN @tab 0761524452 -@item Pages @tab 500 -@item Price @tab $39.99 -@end multitable - -No description available. - -@multitable @columnfractions .3 .7 -@item Title @tab @uref{http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=1861004281,Professional MySQL Programming} -@item Publisher @tab Wrox -@item Authors @tab N/A -@item Pub Date @tab July 2000 -@item ISBN @tab 1861004281 -@item Pages @tab 1000 -@item Price @tab $49.99 -@end multitable - -No description available. - -@multitable @columnfractions .3 .7 -@item Title @tab @uref{http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=0672317842,PHP3 and MySQL Web Development} -@item Publisher @tab N/A -@item Authors @tab William Jason Gilmore -@item Pub Date @tab October 2000 -@item ISBN @tab 672317842 -@item Pages @tab N/A -@item Price @tab $39.99 -@end multitable - -No description available. - -@node Features, Stability, MySQL-Books, Introduction -@section @strong{MySQL}μʵǽ - -@strong{MySQL} νפħΤĤʲιܤˤޤ - -@c This list is too technical and should be divided into one feature -@c list comparable to commercial competition and a very technical on -@c with max limits (from crash-me) and so on. -@itemize @bullet -@item -ͥ륹åɤѤ봰ʥޥåɡͭǤдñ -ʣ CPU ѤǤ뤳Ȥ̣ޤ - -@item -C, C++, Ruby, Eiffel, Java, Perl, PHP, Python Tcl API@xref{Clients} - -@item -¿μΥץåȥեưޤ@xref{Which OS} - -@item -¿Υեɷ: 1, 2, 3, 4, 8 ХĹդ/̵, -@code{FLOAT}, @code{DOUBLE}, @code{CHAR}, @code{VARCHAR}, @code{TEXT}, -@code{BLOB}, @code{DATE}, @code{TIME}, @code{DATETIME}, @code{TIMESTAMP}, -@code{YEAR}, @code{SET}, @code{ENUM} @xref{Column types} - -@item -Ŭ줿 one-sweep multi-join ѤȤƤ®硣 - -@item - @code{SELECT} @code{WHERE} ǤƤα黻ҤȴؿΥݡ -ȡ: -@example -mysql> SELECT CONCAT(first_name, " ", last_name) FROM tbl_name - WHERE income/dependents > 10000 AND age > 30; -@end example - -@item -SQL ؿϹ٤˺Ŭ줿饹饤֥̤ƼƤơ -뤳ȤΤǤΤƱ餤®ΤǤ ̡νθ -ϡƤϤޤ - -@item -SQL @code{GROUP BY} @code{ORDER BY} δʥݡȡ롼״ؿ -(@code{COUNT()}, @code{COUNT(DISTINCT)}, @code{AVG()}, @code{STD()}, @code{SUM()}, @code{MAX()}, -@code{MIN()}) Υݡȡ - -@item -ANSI SQL ODBC ʸǤ @code{LEFT OUTER JOIN} Υݡȡ - -@item -Ʊ쥯˰ۤʤǡ١Υơ֥򺮺ߤǤޤ (С -3.22) - -@item -ȤƤǰ øƥ ȥѥɥƥࡣ -ۥȥ١ξǽǤ -Ф³ƤΥѥɥȥեåϰŹ沽Ƥ뤿 -ɤϰǤ - -@item -Windows95 ODBC (Open-DataBase-Connectivity) (Ĥ)Ƥ ODBC -2.5 ؿ¾¿ʤ @strong{MySQL} Ф³뤿ˡ㤨 - Access ѤǤޤ@xref{ODBC} - -@item -ǥå̤ĤΤȤƤ® B-tree ǥơ֥롣 - -@item -ơ֥ 16 ǥåޤƥǥå 1 16 -Υեɤޤϥեɤΰʤޤ祤ǥåĹ 256 ХȤǤ -( @strong{MySQL} ΥѥѹǤޤ)ǥå -@code{CHAR} ޤ @code{VARCHAR} եɤƬʬѤǤޤ - -@item -ĹȲĹΥ쥳ɡ - -@item -ơ֥ȤƻѤϥåơ֥롣 - -@item -礭ʥǡ١桹ϡ50,000,000 쥳ɤޤतĤΥǡ -١ @strong{MySQL} ѤƤޤ - -@item -ƤΥեɤϥǥեͤޤ ơ֥ܤΥ֥åȤ뤿 - @code{INSERT} ѤǤŪͤͿƤʤեɤϤΥ -եͤꤵޤ - -@item -Τ GNU Automake, Autoconf, @code{libtool} ѤƤޤ - -@item -C C++ ǽ񤫤ƤޤϤʼΥѥǥƥȤƤޤ - -@item -ȤƤ®åɥ١Υƥƥࡣ - -@item -꡼ޤ󡣻ΤΥ꡼(@code{purify})ǥ -ȤƤޤ - -@item -@code{myisamchk} ޤǤޤϡơ֥븡ŬΤ -ΤȤƤ®桼ƥƥǤ@xref{Maintenance} - -@item -ۤʤ륭饯åȤδʥݡȡISO-8859-1 (Latin1), big5, ujis ʤɡ -㤨С󥸥ʥ -ʸ @ringaccent{a}, @"a @"o ϥơ֥̾ե̾ȤƵ -ޤ - -@item -ƤΥǡ 򤵤줿饯åȤη¸Ƥޤ̾ʸե -ƤӤϥ¸Ǥ - -@item -Ȥϡ@strong{MySQL} Сưˡ򤵤줿饯åȤ -˽äƹԤʤޤ(ǥեȤϡǥˡ) -˿Ƚɲä뤳Ȥǡ -ѹǽǤȤƤŪʥȤ򸫤ˤϡCzech ȥ -򸫤Ƥ @strong{MySQL} ¿μΥ饯åȤ򥵥ݡ -ѥ¹Ի˻Ǥޤ - -@item -SQL92 ɸˤ褦ʥơ֥ȥեɤΥꥢ̾ - -@item -@code{DELETE}, @code{INSERT}, @code{REPLACE}, @code{UPDATE} -ѹ줿(ƶ)Ԥο֤ޤ -³˥ե饰ꤹ뤳ȤˤꡢŬ礷쥳ɿ֤ -ȤǽǤ - -@item -ؿ̾ϥơ֥̾ե̾Ⱦͤޤ㤨 @code{ABS} ե -̾Ǥ¤ϡؿƤӽФˡؿ̾Ȥ³ @samp{(} δ֤˶ -ʤȤǤ@xref{Reserved words} - -@item -Ƥ @strong{MySQL} ץϥ饤إפ뤿ˡ -@code{--help} @code{-?} ץǸƤӽФȤǤޤ - -@item -Ф¿θǥ饤ȤؤΥ顼å󶡤Ǥޤ -@xref{Languages} - -@item -饤ȤϡTCP/IP ³ޤ Unix åȡ뤤 NT ξ -͡ɥѥפѤ @strong{MySQL} Ф³ޤ - -@item -@strong{MySQL} ͭ @code{SHOW} ޥɤϥǡ١ơ֥롢 -ǥåˤĤƤξФ˻ѤǤޤ@code{EXPLAIN} ޥ -ɤϥץƥޥɤΤ褦˥Ϥ뤫ꤹ뤿˻ -Ǥޤ -@end itemize - -@cindex Stability -@node Stability, Year 2000 compliance, Features, Introduction -@section @strong{MySQL} Ϥɤ줯餤꤫ - -Ǥϡ``@strong{MySQL} Ϥɤ줯餤꤫'' ``ϤΥץ -Ȥ @strong{MySQL} ˰¸Ǥ뤫'' ȤˤĤƲޤ - -桹ϤǡĤ餫ˤ¿οͤ˴طȻפ뤵 -˽פʼΤĤ뤳Ȥߤޤϡ᡼󥰥 -(ǤϤȤƤȯ˥Х𤵤Ƥޤ)ޤ줿󤬰 -֤Ƥޤ - -TcX Ǥϡ@strong{MySQL} 1996 溢桹ΥץȤDz -ʤưƤޤ˥꡼줿桹ϡ@strong{MySQL} - ``ƥȤƤʤ'' ʬ뤳Ȥդޤϡ -桹Ȥϰۤʤˡǥ뿷桼ˤäƤ˸Ĥޤ -ƥ꡼ϡ(¿οǽäƤΤ)ΤΤ -ϾʤʤޤƼΥ꡼ΰĤ ``'' ȸƤ֤ȤǤ -˲桹˾Ǥޤ - -@strong{MySQL} γƥ꡼ϼŪǡ桼 ``쥤'' -ɤλѤ򳫻Ϥˤ꤬ޤΥ桼ϡ -쥤󤫤Τ뤳ȤǤޤ; ǸΤƤ뤳 -Ƥߤޤ - @strong{MySQL} 3.22.x СǰޤΤƤ -ƤХƺǿΥСǽƤޤbugs -񤫤ƤХϽޤ ``߷'' ϢΤΤǤ@xref{Bugs}. - -@strong{MySQL} ʣγؤ͡Ω⥸塼ǽ񤫤Ƥޤ -Υ⥸塼ϡ줾줬ɤΤ褦˥ƥȤƤ뤫ȤȤ˼˥ꥹ -ȤƤޤ: - -@table @strong -@item ISAM ơ֥ --- - @strong{MySQL} 3.22 ȤΥСˤơ -ƤΥǡ¸ȸޤƤ @strong{MySQL} ꡼Ǥϡ -Υˤ(𤵤줿)ХϰĤ⤢ޤʥơ֥ -ͣˡϡˤ륵Ф򻦤ȤǤƳƥ -ƤΥǡϥǥ˥եå夵뤿ᡢʤǡ -˲ȤȤϤޤʤǤ礦 -@strong{MySQL} ΥХΤ˥ǡ -줿ȤХݡȤϰĤ⤢ޤ - -@item The MyISAM table handler --- Beta - @strong{MySQL} 3.23 ǤοǽǤ. - ISAM ơ֥Υɤ򸵤˳ĥƤޤ -¿ʵǽäƤޤ - -@item ѡñ --- -ΥƥˤĹ֥ХϰĤ𤵤Ƥޤ - -@item C 饤ȥ --- -ΤƤϤޤ3.20 ꡼νˤϡ/Хåե -ˤĤ¤ޤ3.21.x ʹߡХåեϥǥեȤ -24M ޤưŪ礭ʤޤ - -@item ɸ९饤ȥץ --- - @code{mysql}, @code{mysqladmin}, @code{mysqlshow}, -@code{mysqldump}, @code{mysqlimport} ޤߤޤ. - -@item Ū SQL --- -Ū SQL ǽƥʸưŪΥƥˤ -𤵤줿ХϰĤ⤢ޤ - -@item ꥪץƥޥ --- - -@item ϰϥץƥޥ --- - -@item 祪ץƥޥ --- - -@item å --- -ϤȤƤ⥷ƥ˰¸ƤޤĤΥƥǤϡϡɸ - OS å (fcntl) Ѥ뤿礭꤬ޤξ -ϡ@strong{MySQL} ǡ @code{--skip-locking} ե饰Ĥư -ǤΤƤϡĤ Linux ƥ NFS ޥȤ -ե륷ƥѻ SunOS Ǥ - -@item Linux å --- -@code{fcntl()} Ǥ꤬ĤäƤޤ @code{mysqld} -ؤ @w{@code{--skip-locking}} ץλѤǽǤޤͤ -0.5 ꡼ lockup 𤷤ޤ1000ʾƱ³Ѥͽ -ǤСLinuxThreads ƥѥ뤹ɬפޤǥե -Ȥ LinuxThread Ǥ¿³¹Ԥ뤳ȤϲǽǤ( 1021 -ˤʤʤ褦ˤƤ)ǥեȤ 2MB Υå֤ϡ -ꥱ԰ˤޤ 1021 ĤΥɥ³ -coredump ޤܤ Linux Notes - -@item Solaris 2.5+ pthread --- -桹ϡ桹ƤʤǤѤƤޤ - -@item MIT å (¾Υƥ) --- -3.20.15 𤵤줿ХϤޤ3.20.15 Τ줿ХϤ -󡣤ĤΥƥǤϡĤ٤ʤȤ -``misfeature'' ޤ(1/20 ä sleep ƥ֤ǹԤʤޤ) -MIT åɤϤ٤Ƥ򾯤٤ޤǥå١ - @code{SELECT} ǤϡơȥȤ̾٤Υե졼ǹԤ뤿ᡢ -mutex locking/thread juggling Ϥޤ - -@item ¾Υåɼ --- ե - ١ -¾ΥƥؤΰܹԤϤޤȤƤ⿷¿ʬ @strong{MySQL} ˡ -¿ΤϥåɼȤˡ¿ΥХäƤޤ - -@item @code{LOAD DATA...}, @code{INSERT ... SELECT} --- -ͤϤ˥Х򸫤ĤȹͤޤϷɸǤ -˥ޥ˥奢ɤåƤ - -@item @code{ALTER TABLE} --- -3.22.12 Ǿѹޤ - -@item DBD --- -ߡJochen Wiedmann -@email{wiedmann@@neckar-alb.de} -ˤäƥƤƤޤա - -@item @code{mysqlaccess} --- -@email{Yves.Carlier@@rug.ac.be} -ˤäƽ񤫤ƤƤޤա - -@item @code{GRANT} --- -@strong{MySQL} 3.22.12 礭ѹԤʤޤ - -@item @strong{MyODBC} (uses ODBC SDK 2.5) --- -ĤΥץǤưƤ褦˸ޤ -@end table - -TcX ʧäܵҤΤ email ݡȤ󶡤Ƥޤ -@strong{MySQL} ᡼󥰥ꥹȤ̾ƤΰŪʼ˲󶡤 -ƤޤХ̾魯˥ѥåǽ졢ʥХˤϡۤȤɤ -⿷꡼ޤ - -@cindex Year 2000 compliance -@node Year 2000 compliance, General-SQL, Stability, Introduction -@section 2000 ǯб - -@strong{MySQL} Ȥ 2000 ǯ(Y2K)ФƲäƤޤ: - -@itemize @bullet -@item -@strong{MySQL} Unix ִؿѤ@code{2069} ǯޤդˤϲ -⤢ޤ; Ƥ2ǯ @code{1970} @code{2069} ϰϤ -ȸʤޤϡ@code{year} ե @code{01} Ǽ -硢@strong{MySQL} Ϥ @code{2001} ȤưȤȤ̣ޤ - -@item -Ƥ @strong{MySQL} մؿϰĤΥե @file{sql/time.cc} ˳Ǽ -졢2000ǯˤȤƤտɲƤޤ - -@item -@strong{MySQL} 3.22 ʹߤΥСǤϡ @code{YEAR} եɷ -@code{0} @code{1901} @code{2155} ޤǤǯ1ХȤdzǼǤ2 -ޤ4ɽǤޤ -@end itemize - -2000ǯǤʤˡ @strong{MySQL} Ѥ륢ץꥱǤ -ˤʤޤ㤨С¿θŤץꥱ4ͤǤϤʤ2( -ۣǤ)ѤǯǼޤϡ@code{00} ޤ -@code{99} Τ褦ͤ ``礱Ƥ'' ͤɽȤƻѤ륢ץꥱ -ˤäƺޤ - -ˤΤϺǤ͡ʥץꥱ͡ -ʥץˤäƽ񤫤Ƥơγơؿ͡ -߹碌Ѥ뤫Ǥ - -ϡMySQL 2030 ǯޤǤդ˲ʤȤ򼨤ñʥƥ -Ǥ - -@example -mysql> DROP TABLE IF EXISTS y2k; -mysql> CREATE TABLE y2k (date date, date_time datetime, time_stamp timestamp); -mysql> INSERT INTO y2k VALUES ("1998-12-31","1998-12-31 23:59:59",19981231235959); -mysql> INSERT INTO y2k VALUES ("1999-01-01","1999-01-01 00:00:00",19990101000000); -mysql> INSERT INTO y2k VALUES ("1999-09-09","1999-09-09 23:59:59",19990909235959); -mysql> INSERT INTO y2k VALUES ("2000-01-01","2000-01-01 00:00:00",20000101000000); -mysql> INSERT INTO y2k VALUES ("2000-02-28","2000-02-28 00:00:00",20000228000000); -mysql> INSERT INTO y2k VALUES ("2000-02-29","2000-02-29 00:00:00",20000229000000); -mysql> INSERT INTO y2k VALUES ("2000-03-01","2000-03-01 00:00:00",20000301000000); -mysql> INSERT INTO y2k VALUES ("2000-12-31","2000-12-31 23:59:59",20001231235959); -mysql> INSERT INTO y2k VALUES ("2001-01-01","2001-01-01 00:00:00",20010101000000); -mysql> INSERT INTO y2k VALUES ("2004-12-31","2004-12-31 23:59:59",20041231235959); -mysql> INSERT INTO y2k VALUES ("2005-01-01","2005-01-01 00:00:00",20050101000000); -mysql> INSERT INTO y2k VALUES ("2030-01-01","2030-01-01 00:00:00",20300101000000); -mysql> INSERT INTO y2k VALUES ("2050-01-01","2050-01-01 00:00:00",20500101000000); -mysql> SELECT * FROM y2k; -+------------+---------------------+----------------+ -| date | date_time | time_stamp | -+------------+---------------------+----------------+ -| 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 | -| 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 | -| 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 | -| 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 | -| 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 | -| 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 | -| 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 | -| 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 | -| 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 | -| 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 | -| 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 | -| 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 | -| 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 | -+------------+---------------------+----------------+ - -13 rows in set (0.00 sec) -@end example - -ϡ@code{DATE} @code{DATETIME} ̤Τʤդˤ -ΤʤȤ򤷤ᤷޤ (դ 9999 ǯޤǰޤ) - -@code{TIMESTAMP} ϡ¸ޤ@code{2030-01-01} ޤǤǤ -@code{TIMESTAMP} 32-bit ޥǤ @code{1970} @code{2030} ϰϤǤ -64-bit ޥǤϡ @code{2106} ǯޤǰޤ - -@strong{MySQL} 2000ǯбǤۣǤʤϤ󶡤ΤϤʤ -ǤǤۣդϥǡ2ǯ͡ˤΰˤĤƤ -@strong{MySQL} ε§ˤĤƤ @ref{Y2K issues} 򻲾ȤƤ - -@node General-SQL, Useful Links, Year 2000 compliance, Introduction -@section Ū SQL ȥ塼ȥꥢ - -ܤ @strong{MySQL} ᡼󥰥ꥹȤοͤˤäƿ侩Ƥޤ: - -@example -Judith S. Bowman, Sandra L. Emerson and Marcy Darnovsky -The Practical SQL Handbook: Using Structured Query Language -Second Edition -Addison-Wesley -ISBN 0-201-62623-3 -http://www.awl.com -@end example - -ܤ @strong{MySQL} 桼ˤĤοƤޤ: - -@example -Martin Gruber -Understanding SQL -ISBN 0-89588-644-8 -Publisher Sybex 510 523 8233 -Alameda, CA USA -@end example - -SQL 塼ȥꥢ뤬ͥåȾˤޤ -@url{http://www.geocities.com/SiliconValley/Vista/2207/sql1.html} - -SQL in 21 Tagen (online book in German language): -@url{http://www.mut.de/leseecke/buecher/sql/inhalt.htm} - -@node Useful Links, , General-SQL, Introduction -@section @strong{MySQL} Ϣ - -Υ󥯰ʳˤ⡢¿ @strong{MySQL} ץࡢġ롢API -@uref{http://www.mysql.com/Contrib/, Contrib directory} 鸫Ĥƥ -ɤ뤳ȤǤޤ - -@subheading Tutorials -@itemize @bullet - -@item @uref{http://www.devshed.com/resource/advanced/mysql/index.html, A -beginner's tutoral of how to start using @strong{MySQL}} - -@item @uref{http://www.analysisandsolutions.com/code/mybasic.htm} -Beginners @strong{MySQL} Tutorial on how to install and set up -@strong{MySQL} on a Windows machine. - -@item @uref{http://www.devshed.com/Server_Side/MySQL/, A lot of @strong{MySQL} tutorials} - -@item @uref{http://www.linuxplanet.com/linuxplanet/tutorials/1046/1/, -Setting Up a @strong{MySQL}-Based Website} - -@item @uref{http://www.hotwired.com/webmonkey/backend/tutorials/tutorial1.html, @strong{MySQL}-Perl tutorial} - -@item @uref{http://www.iserver.com/support/contrib/perl5/modules.html,Installing new Perl modules that require locally installed modules} - -@item @uref{http://www.hotwired.com/webmonkey/databases/tutorials/tutorial4.html, PHP/@strong{MySQL} Tutorial} - -@item @uref{http://www.useractive.com/, Hands on tutorial for @strong{MySQL}} -@end itemize - -@subheading Porting MySQL / Using MySQL on different systems -@itemize @bullet -@item @uref{http://xclave.macnn.com/MySQL/,The MacOS Xclave}. -Running @strong{MySQL} on MacOSX -@item @uref{http://www.prnet.de/RegEx/mysql.html, MySql for MacOSX Server} -@item @uref{http://www.lilback.com/macsql/, Client libraries for the Macintosh} -@end itemize - -@subheading Perl related links -@itemize @bullet -@item -@c Added 991122 -@uref{http://haven.e-cactus.com/dbi_mysql, Perl DBI with @strong{MySQL} FAQ} -@end itemize - -@subheading MySQL discussion forums -@itemize @bullet -@item -@uref{http://www.weberdev.com/, Examples using @strong{MySQL}; (check Top 20)} -@item -@uref{http://futurerealm.com/forum/futureforum.htm, FutureForum Web Discussion Software} -@end itemize - -@c We should get longer descriptions for things in this category! -@subheading Commercial applications that support MySQL -@itemize @bullet -@item -@uref{http://www.supportwizard.com/, SupportWizard; Interactive helpdesk -on the web (This product includes a licensed copy of @strong{MySQL})} -@item -@uref{http://www.stweb.org/, StWeb} -StWeb - Stratos Web and Application server - an easy-to-use, cross -platform, Internet/Intranet development and deployment system for -development of web-enabled applications. The standard version of StWeb -has a native interface to @strong{MySQL} database. -@item -@uref{http://www.rightnowtech.com/, Right Now Web; Web automation for customer service} -@item -@uref{http://www.ecker-software.de, Win32 GUI client} -A Win32 GUI client by David Ecker. -@item -@uref{http://www.icaap.org/Bazaar/, Bazaar; Interactive Discussion Forums with web interface} -@item -@uref{http://www.phonesweep.com/, PhoneSweepT} is the world's first -commercial Telephone Scanner. Many break-ins in recent years have come -not through the Internet, but through unauthorized dial-up -modems. PhoneSweep lets you find these modems by repeatedly placing -phone calls to every phone number that your organization -controls. PhoneSweep has a built-in expert system that can recognize -more than 250 different kinds of remote-access programs, including -Carbon Copy(TM), pcANYWHERET(TM), and Windows NT RAS. All information is stored -in the SQL database. It then generates a comprehensive report detailing -which services were discovered on which dial-up numbers in your -organization. -@end itemize - -@subheading SQL 饤/Report writers - -@itemize @bullet -@item -@uref{http://www.urbanresearch.com/software/utils/urbsql/index.html, -@strong{MySQL} Editor/Utility for MS Windows Platforms.} -@item -@uref{http://www.xnot.com/kmysql, KDE @strong{MySQL} client} -@item -@c EMAIL: bilhaut_f@mail.cpod.fr (Frik Bilhaut) -@uref{http://www.penguinpowered.com/~kmysql, KMySQL} -KMySQL is a database client for KDE that primarily supports @strong{MySQL}. -@item -@uref{http://www.icaap.org/software/kiosk/, Kiosk; a @strong{MySQL} client for -database management}. Written in Perl. Will be a part of Bazaar. -@item -@uref{http://www.geocities.com/SiliconValley/Ridge/4280/GenericReportWriter/grwhome.html, A free report writer in Java} -@item -@uref{http://futurerealm.com/opensource/futuresql.htm, FutureSQL Web Database Administration Tool}. -FutureSQL by Peter F. Brown, is a Free, Open Source Rapid Application -Development web database administration tool, written in Perl, -using @strong{MySQL}. It uses @code{DBI:DBD} and @code{CGI.pm}. - -FutureSQL allows one to easily setup config files to view, edit, delete -and otherwise process records from a @strong{MySQL} database. It uses a data -dictionary, configuration files and templates, and allows "pre-processing" -and "post-processing" on both fields, records and operations. -@item -@uref{http://www.javaframework.de,MySQLExport} -Export of @strong{MySQL} create statements and data in a lot of -different formats (SQL, HTML, CVS, text, ZIP, GZIP...) -@end itemize - -@subheading @strong{MySQL} 򥵥ݡȤ Web ȯġ - -@itemize @bullet -@item -@uref{http://www.php.net/, PHP: A server-side HTML-embedded scripting -language} -@item -@uref{http://www.midgard-project.org, The Midgard Application Server; a -powerful Web development environment based on @strong{MySQL} and PHP} -@item -@uref{http://www.smartworker.org, SmartWorker is a platform for web application development} -@item -@uref{http://xsp.lentus.se/, XSP: e(X)tendible (S)erver (P)ages and is a -HTML embedded tag language written in Java (previously known as XTAGS)} -@uref{http://www.dbServ.de/, dbServ} is an extension to a web server to -integrate databases output into your HTML code. You may use any HTML -function in your output. Only the client will stop you. It works as -standalone server or as JAVA servlet. -@item -@uref{http://www.chilisoft.com/, Platform independent ASP from Chili!Soft} -@c @item -@c no answer from server 990830 -@c @uref{http://www.voicenet.com/~zellert/tjFM, A JDBC driver for @strong{MySQL}} -@item -@uref{http://www.wernhart.priv.at/php/, @strong{MySQL} + PHP demos} -@item -@uref{http://www.dbwww.com/, ForwardSQL: HTML interface to manipulate @strong{MySQL} databases} -@item -@uref{http://www.daa.com.au/~james/www-sql/, WWW-SQL: Display database -information} -@item -@uref{http://www.minivend.com/minivend/, Minivend: A Web shopping cart} -@item -@uref{http://www.heitml.com/, HeiTML: A server-side extension of HTML and -a 4GL language at the same time} -@item -@uref{http://www.metahtml.com/, Metahtml: A Dynamic Programming Language -for WWW Applications} -@item -@uref{http://www.binevolve.com/, VelocityGen for Perl and Tcl} -@item -@uref{http://hawkeye.net/, Hawkeye Internet Server Suite} -@item -@uref{http://www.fastflow.com/, Network Database Connection For Linux} -@item -@uref{http://www.wdbi.net/, -WDBI: Web browser as a universal front end to databases which supports -@strong{MySQL} well.} -@item -@uref{http://www.webgroove.com/, WebGroove Script: HTML compiler and server-side scripting language} -@item -@uref{http://www.ihtml.com/, A server-side web site scripting language} -@item -@uref{ftp://ftp.igc.apc.org/pub/myodbc/README, How to use @strong{MySQL} with ColdFusion on Solaris} -@item -@uref{http://calistra.com/MySQL/,Calistra's ODBC @strong{MySQL} Administrator} -@item -@uref{http://www.webmerger.com, Webmerger} -This CGI tool interprets files and generates dynamic output -based on a set of simple tags. Ready-to-run drivers for @strong{MySQL} and PostgreSQL -through ODBC. -@item -@uref{http://phpclub.unet.ru/index_e.php3, PHPclub}. Tips and tricks for PHP -@item -@uref{http://www.penguinservices.com/scripts, @strong{MySQL} and Perl Scripts} -@item -@uref{http://www.widgetchuck.com, The Widgetchuck; Web Site Tools and Gadgets} -@item -@uref{http://www.adcycle.com/, AdCycle} advertising management software -@item -@uref{http://www.bidsystems.com/pwPage, pwPage} provides an extremely -fast and simple approach to the creation of database forms. That is, -if a database table exists and an HTML page has been constructed using -a few simple guidelines, pwPage can be immediately used for table data -selections, insertions, updates, deletions and selectable table content -reviewing. -@item -@uref{http://www.omnis-software.com/products/studio/studio.html, OMNIS} -OMNIS Studio is a rapid application development (RAD) tool. -@end itemize - -@subheading Database design tools with MySQL support -@itemize @bullet -@item -@uref{http://www.mysql.com/dezign/index.html, "DeZign for -databases" is a database development tool using an -entity relationship diagram (ERD).} -@end itemize - -@subheading @strong{MySQL} ġǤ Web - -@itemize @bullet -@item -@uref{http://bourbon.netvision.net.il/mysql/mod_auth_mysql/, An Apache -authentication module} -@item -@uref{http://www.roxen.com/, The Roxen Challenger Web server} -@end itemize - -@subheading Extensions for other programs -@itemize @bullet -@item -@uref{http://www.seawood.org/msql_bind/, @strong{MySQL} support for BIND -(The Internet Domain Name Server)} -@item -@uref{http://www.inet-interactive.com/sendmail, @strong{MySQL} support for -Sendmail and Procmail} -@end itemize - -@subheading Using @code{MySQL} with other programs - -@itemize @bullet -@item -@uref{http://www.iserver.com/support/addonhelp/database/mysql/msaccess.html, Using @strong{MySQL} with Access} -@item -@uref{http://www.iserver.com/support/contrib/perl5/modules.html,Installing new Perl modules that require locally installed modules} -@end itemize - -@subheading ODBC related links - -@itemize @bullet -@item -@uref{http://www.iodbc.org/,Popular iODBC Driver Manager (libiodbc) now available in Open Source format} -@item -@uref{http://users.ids.net/~bjepson/freeODBC/,The FreeODBC Pages} -@item -@uref{http:/http://genix.net/unixODBC/,unixodbc} -The unixODBC Project goals are to develop and promote unixODBC to be the -definitive standard for ODBC on the Linux platform. -This is to include GUI support for KDE. -@end itemize - -@subheading @strong{API} Ϣ - -@itemize @bullet -@item -@uref{http://www.amedea.cz/mysqlx/index.html, MySQL COM extension} -With this COM objects You can use MySQL also on Windows platform with ASP -pages or Delphi, Visual Basic, Visual C++, ... languages. -@item -@uref{http://www.jppp.com, www.jppp.com} -Partially implemented TDataset-compatible components for @strong{MySQL}. -@item -@uref{http://www.riverstyx.net/qpopmysql/,qpopmysql} -A patch to allow POP3 authentication from a @strong{MySQL} database. -There's also a link to Paul Khavkine's patch for Procmail to allow -any MTA to deliver to users in a @strong{MySQL} database. -@item -@uref{http://www.pbc.ottawa.on.ca,Visual Basic class generator for Active X} -@item -@uref{http://www.lilback.com/macsql/, Client libraries for the Macintosh} -@c @item -@c @uref{http://tfdec1.fys.kuleuven.ac.be/~michael/fpc-linux/mysql, -@c @strong{MySQL} binding to Free Pascal} -@item -@uref{http://www.dedecker.net/jessie/scmdb/, SCMDB}. -SCMDB is an add-on for SCM that ports the mysql C library to scheme (SCM). -With this library scheme developers can make connections to a mySQL -database and use embedded SQL in their programs. -@end itemize - - -@subheading ¾ @strong{MySQL} Ϣ - -@itemize @bullet -@item -@uref{http://www.wix.com/mysql-hosting, Registry of Web providers who -support @strong{MySQL}} -@item -@uref{http://www.softagency.co.jp/mysql/index.en.phtml, Links about using -@strong{MySQL} in Japan/Asia} -@item -@uref{http://www.open.com.au/products.html, Commercial Web defect tracking -system} -@item -@uref{http://www.stonekeep.com/pts/, PTS: Project Tracking System} -@item -@uref{http://tomato.nvgc.vt.edu/~hroberts/mot, Job and software tracking -system} -@c @item -@c Error 404 990830 -@c @uref{http://home.wxs.nl/cgi-bin/planeteers/pgidszoek.cgi, Full-text search engine using @strong{MySQL}} -@item -@uref{http://www.cynergi.net/non-secure/exportsql/, ExportSQL: A script -to export data from Access95+} -@item -@uref{http://SAL.KachinaTech.COM/H/1/MYSQL.html, SAL (Scientific -Applications on Linux) @strong{MySQL} entry} -@item -@c Removed 990510 -@c @item -@c @uref{http://www.cgishop.com/bin/mysqllist, @strong{MySQL} Apps and -@c Utilities Listing} -@c @uref{http://www.luth.se/~goggi/proj/mysql/man/mysql.pdf, The -@c @strong{MySQL} reference manual in Adobe PDF format} -@item -@uref{http://www.infotech-nj.com/itech/index.shtml, A consulting company -which mentions @strong{MySQL} in the right company} -@item -@uref{http://www.pmpcs.com/, PMP Computer Solutions. Database developers using -@strong{MySQL} and @code{mSQL}} -@item -@uref{http://www.aewa.org, Airborne Early Warning Association } -@item -@uref{http://abattoir.cc.ndsu.nodak.edu/~nem/mysql/udf/, @strong{MySQL} UDF Registry} -@item -@uref{http://21ccs.com/~gboersm/y2kmatrix/, Y2K tester} -@end itemize - -@subheading SQL ȥǡ١󥿥ե -@itemize @bullet -@item -@uref{http://java.sun.com/products/jdbc/, The JDBC database access API} -@item -@uref{http://www.gagme.com/mysql, Patch for @code{mSQL} Tcl} -@item -@uref{http://www.amsoft.ru/easysql/, EasySQL: An ODBC-like driver manager} -@item -@uref{http://www.lightlink.com/hessling/rexxsql.html, A REXX interface to SQL databases} -@item -@uref{http://www.binevolve.com/~tdarugar/tcl-sql, Tcl interface} -@end itemize - -@subheading ȥ - -@itemize @bullet -@item -@c Added 990601 -@c EMAIL: thuss@little6.com (Todd Huss) -@uref{http://www.little6.com/about/linux/, Little6 Inc} An online contract and job finding site that is powered by @strong{MySQL}, PHP3 and Linux. -@item -@c Added 990521 -@c EMAIL: nh@delec.com (Hillbrecht Nicole) -@uref{http://www.delec.com/is/products/prep/examples/BookShelf/index.html, DELECis} A tool which makes it very easy to create an automatically generated table documentation. They have used @strong{MySQL} as an example. -@c @item -@c Added 990531. Removed 000201 -> No answer from server -@c EMAIL: sfambro@hotmail.com (Steve Fambro) -@c @uref{http://shredder.elen.utah.edu/steve.html, Steve Fambro} -@c Uses @strong{MySQL} and webmerger. There is an employee database, and a -@c license plate database with all of the registered Utah vehicles (over -@c 1.2 million). The License plate field is indexed.....so the *searches* -@c are instantaneous. -@item -@c Added 990521 -@c EMAIL: info@worldrecords.com (Jim Rota) -@uref{http://www.worldrecords.com, World Records} A search engine for information about music that uses @strong{MySQL} and PHP. -@item -@uref{http://www.webtechniques.com/archives/1998/01/note/, -A Contact Database using @strong{MySQL} and PHP} -@item -@uref{http://modems.rosenet.net/mysql/, Web based interface and Community Calender with PHP} -@item -@uref{http://www.odbsoft.com/cook/sources.htm, Perl package to generate html from a SQL table structure and for generating SQL statements from an html form.} -@item -@uref{http://www.gusnet.cx/proj/telsql/,Basic telephone database using @code{DBI}/@code{DBD}}. -@item -@uref{http://www.productivity.org/projects/mysql/, @strong{TmySQL}; A library to use @strong{MySQL} with Delphi} -@item -@uref{http://tecfa.unige.ch/guides/java/staf2x/ex/jdbc/coffee-break, JDBC examples by Daniel K. Schneider} -@item -@uref{http://www.spade.com/linux/howto/PostgreSQL-HOWTO-41.html,SQL BNF} -@item -@uref{http://www.ooc.com/, Object Oriented Concepts Inc; CORBA applications with examples in source} -@item -@uref{http://www.pbc.ottawa.on.ca/,DBWiz; Includes an example of how to manage own cursors in VB} -@item -@uref{http://keilor.cs.umass.edu/pluribus/, Pluribus} -Pluribus, is a free search engine that learns to improve -the quality of its results over time. Pluribus works by recording -which pages a user prefers among those returned for a query. A user -votes for a page by selecting it; Pluribus then uses that knowledge -to improve the quality of the results when someone else submits the -same (or similar) query. Uses PHP and @strong{MySQL}. -@item -@c EMAIL: paul@sword.damocles.com (Paul Bannister) -@uref{http://www.stopbit.com/, Stopbit} -A technology news site using @strong{MySQL} and PHP -@item -@c Added 990604 -@c EMAIL: ah@dybdahl.dk -@uref{http://www.jokes2000.com/scripts/, Example scripts at Jokes2000} -@item -@uref{http://www.linuxsupportline.com/~kalendar/ KDE based calendar manager} -The calendar manager has both single user (file based) and multi user -(@strong{MySQL} database) support. -@item -@uref{http://tim.desert.net/~tim/imger/,Example of storing/retrieving images with @strong{MySQL} and CGI} -@item -@uref{http://www.penguinservices.com/scripts, Online shopping cart system} -@end itemize - -@subheading Ūʥǡ١ -@itemize @bullet -@item -@uref{http://www.pcslink.com/~ej/dbweb.html, Database Jump Site} -@item -@uref{http://black.hole-in-the.net/guy/webdb/, Homepage of the webdb-l -(Web Databases) mailing list.} -@item -@uref{http://www.symbolstone.org/technology/perl/DBI/index.html, -Perl @code{DBI}/@code{DBD} modules homepage} -@item -@uref{http://www.student.uni-koeln.de/cygwin/, Cygwin tools. UNIX on top of Windows} -@item -@uref{http://dbasecentral.com/, dbasecentral.com; Development and distribution of powerful and easy-to-use database applications and systems.} -@item -@uref{http://www.Tek-Tips.com, Tek-Tips Forums} Tek-Tips Forums are 800+ -independent peer-to-peer non-commercial support forums for Computer -Professionals. Features include automatic e-mail notification of -responses, a links library, and member confidentiality guaranteed. -@end itemize - -@strong{MySQL} Ѥ¿ web ڡ⤢ޤ@xref{Users} -ꥹȤɲäǤΤ @email{webmaster@@mysql.com} äƤ -We now require that you show a -@strong{MySQL} logo somewhere (It is okay to have it on a ``used tools'' page -or something similar) to be added. - -@cindex Reporting errors -@cindex @strong{MySQL} mailing lists -@node Questions, Licensing and Support, Introduction, Top -@chapter @strong{MySQL} ᡼󥰥ꥹȤȼ򤹤ˡޤϥ顼(Х)𤹤ˡ - -@menu -* Mailing-list:: @strong{MySQL} ᡼󥰥ꥹ -* Asking questions:: Х -* Bug reports:: Х𤹤ˡ -* Answering questions:: ᡼󥰥ꥹȤǼ뤿Υɥ饤 -@end menu - -@node Mailing-list, Asking questions, Questions, Questions -@section @strong{MySQL} ᡼󥰥ꥹ - -ᥤ @strong{MySQL} ᡼󥰥ꥹȤɤˤϡå -Żҥ᡼륢ɥ쥹 @email{mysql-subscribe@@lists.mysql.com} äƤ - -ᥤ @strong{MySQL} ᡼󥰥ꥹȤιɤߤϡå -Żҥ᡼륢ɥ쥹 @email{mysql-unsubscribe@@lists.mysql.com} äƤ - -åΥɥ쥹פǤåΥ֥Ȥ -ʸ̵뤵ޤ - -@c the last two addresses in this paragraph are NOT @email because they -@c shouldn't be live links. -⤷ʤΥץ饤ɥ쥹ʪǤʤ硢ɥ쥹Τ˻ꤹ뤳Ȥޤ -subscribe 뤤 unsubscribe ΤȤ˥ϥեդΤȤˤʤ -ɥ쥹򵭽Ҥޤ @samp{@@} ʸ @samp{=} ֤Ѥƽ񤭤ޤ -㤨С @code{john@@host.domain} ǹɤ硢 - @code{mysql-subscribe-john=host.domain@@lists.mysql.com} ˥åޤ - -@email{mysql-subscribe@@lists.mysql.com} @email{mysql-unsubscribe@@lists.mysql.com} -ؤΥ᡼ ezmlm ᡼󥰥ꥹȥץåˤäƼưŪ˽ޤ -ezmlm ˤĤƤξ @uref{http://www.ezmlm.org, The ezmlm Website}. - -ܥ᡼󥰥ꥹȤؤƤԤˤϡ@code{mysql@@lists.mysql.com} ˥åޤ -subscribe 뤤 unsubscribe Υ᡼ - @email{mysql@@lists.mysql.com} @emph{ʤǤ} -Υɥ쥹줿᡼ϡΥ桼Ƥޤޤ - -ʤΥ륵Ȥ¿ @email{mysql@@lists.mysql.com} ɼԤĤȤ -ޤξ硢᡼󥰥ꥹȤꡢ@code{lists.mysql.com} -ĤΥåΥȤ졢ʥꥹȤʣ̤褦 -Ƥξ硢 @strong{MySQL} ꥹȤؤɲäȺϡ -ʤΥƥԤ䤤碌Ʋ - - @strong{MySQL} ᡼󥰥ꥹȤޤ: - -@table @code -@item announce - @strong{MySQL} ȴϢץοСΥʥ󥹤Τ -ǤϡƤ @strong{MySQL} 桼٤Ȳ桹ͤ뾯 -̤ΥꥹȤǤ - -@item mysql -̤ @strong{MySQL} ΤμʥꥹȤǤŪʥꥹȤ -Ԥ٤Τ⤢뤳ȤդƤְäꥹȤƤƤ⡢ -ʤǤ礦 - -@item mysql-digest -ȷ @code{mysql} ꥹȤǤϡ˰󡢰Ĥ -ʥ᡼뤬뤳ȤǸġΥåƤ뤳Ȥ̣ޤ - -@item bugs -ΥꥹȤˤϡǺƸǽʥХݡȤ@code{mysqlbug} -ѤƤ٤Ǥ(Windows Ǽ¹ԤƤϡOS -@strong{MySQL} СεҤޤ٤Ǥ)ǤС -@strong{MySQL} κǿΰС󤫳ȯСѤ -Ȥ٤Ǥ ޤ줿ƥȥǡ'mysql test < script' -Ѥ뤳Ȥǡï⤬ХƸǤ٤ǤΥꥹȤƤ줿 -ΥХϡ @strong{MySQL} ꡼ǽ뤫ɥȲ - ʥɤѹǤС桹Ϥѥå -ƤԤʤޤ - -@item bugs-digest -ȷ @code{bugs} ꥹȤǤ - -@item developer -@strong{MySQL} ɤưͤΤΥꥹȡΥꥹȤǤ -@strong{MySQL} ȯεȥѥåƤǽǤ - -@item developer-digest -@code{developer} ꥹȤΥȥС - -@item java -@strong{MySQL} Java ˤĤƤε¿ JDBC ɥ饤ФˤĤƤǤ - -@item java-digest -@code{java} ꥹȤΥȥС - -@item win32 -Windows NT Τ褦 Microsoft OS @strong{MySQL} ˴Ϣơ - -@item win32-digest -@code{win32} ꥹȤΥȥС - -@item myodbc -ODBC @strong{MySQL} ؤ³˴Ϣơ - -@item myodbc-digest -@code{myodbc} ꥹȤΥȥС - -@item msql-mysql-modules -@strong{MySQL} ǥݡȤ Perl ˤĤƤΥꥹȡ - -@item msql-mysql-modules-digest -@code{msql-mysql-modules} ꥹȤΥȥС -@end table - -ҤΤƱˡƤΥꥹȤιɤޤϹߤǤޤʤ -ιɤޤϹߤΥåϡ@code{mysql} ǤϤʤŬڤʥ᡼󥰥ꥹ -ȤäƤ㤨С @code{myodbc} ꥹȤɤޤϹߤˤϡ -@email{myodbc-subscribe@@lists.mysql.com} ޤ -@email{myodbc-unsubscribe@@lists.mysql.com} ˥᡼ޤ - - -@cindex Net etiquette -@node Asking questions, Bug reports, Mailing-list, Questions -@section ޤϥХ - -᡼󥰥ꥹȤؼҤͤˡʲμƧǤ - -@itemize @bullet -@item -@strong{MySQL} Υ饤ޥ˥奢Ĵ٤뤳ȤϤޤ - -@example -@uref{http://www.mysql.com/Manual_chapter/manual_toc.html} -@end example - -桹ϡĤäβǥޥ˥奢ˤ˹뤳Ȥǡ -ǿݻ褦ȤƤޤ - -@item -@strong{MySQL} ᡼󥰥ꥹȥ֤򸡺ޤ - -@example -@uref{http://www.mysql.com/doc.html} -@end example - -@item -@uref{http://www.mysql.com/} -Ƥ Web ڡ(ޥ˥奢ޤ)򸡺뤿 -@uref{http://www.mysql.com/search.html} ѤǤޤ -@end itemize - -DzĤʤϡ᤯ @strong{MySQL} ԤȤȤ -Ĵ٤ƲޤʤμβĤʤС˿ʤߡ -Υ @email{mysql@@lists.mysql.com} إ᡼ˡˤĤƤɤ - - -@cindex Bug reports -@cindex Reporting bugs -@node Bug reports, Answering questions, Asking questions, Questions -@section Х𤹤ˡ - -ɤХݡȤ񤯤ΤǦѤפޤǽԤʤ -ϲ桹Ȥʤ֤󤷤ޤ -ΥХˤĤƤδʥƥȥޤɤХݡȤϡΥ꡼ -Ǥ줬ǽȤƤ⤯ʤޤ -ǤϡʤΡޤ桹 -νˤʤʤȤˤʤλ֤ϲ񤷤ʤ褦ˡʤݡȤ -񤯤Ȥޤ - -桹ϡХݡȤޤǽʤƤˤĤƤΥݡȤκ -@code{mysqlbug} ץȤѤ뤳Ȥ夷ޤ@code{mysqlbug} - @file{scripts} ǥ쥯ȥꡢޤϡХʥۤǤ -@strong{MySQL} 򥤥󥹥ȡ뤷ǥ쥯ȥ۲ @file{bin} ǥ쥯 -ȥ꤫鸫Ĥޤ@code{mysqlbug} ѤǤʤϡ˵ -ƤƤɬפʾޤ٤Ǥ - -@code{mysqlbug} ץȤϡ¿ξưŪ˸ĤФȤǡ -ݡȤκޤפʲ­ʤ硢ʤ -åˤޤƤ 򿵽ŤɤǡǽҤ٤ -ƤƤξ󤬥ݡ˴ޤޤƤ뤳ȤǧƤ - -ХΤ˼ƥȥ뤳ȤǤС -@email{bugs@@list.mysql.com} ꥹȤˤƤƤ: -ꥹȤˤϡǺƸǽʥХ @code{mysqlbug} ץȤ -Ƥ٤Ǥ(Windows Ǽ¹ԤƤϡOS -@strong{MySQL} СεҤޤ٤Ǥ)ǤС -@strong{MySQL} κǿΰС󤫳ȯСѤ -Ȥ٤Ǥ ޤ줿ƥȥǡ'mysql test < script' -Ѥ뤳ȤǡޤϡХݡȤ˴ޤ줿/PerlץȤ -Ԥ뤳Ȥǡï⤬ХƸǤ٤ǤΥꥹȤƤ줿 -ΥХϡ @strong{MySQL} ꡼ǽ뤫ɥȲ - ʥɤѹǤС桹Ϥѥå -ƤԤʤޤ - -¿ޤå뤳ȤϤǤޤʤ -ΤˤϤǤʤȤȤФƤƤФпͤϻ¤ʤ -Ƥޤޤθ狼äƤȻפĤξܺ٤Ǥʤ -ȸʤƤޤǤɤ§: ¤äȤˤϡ -Ƥ ǽˤʤʬʾޤʤäˡƤӼ䤷 -ԤĤȤפꡢԤ򤢤ʤΥݡȤ˽® -ǤǤϤޤ - -ɤְ㤤ϡѤƤ @strong{MySQL} ۤΥСֹ򼨤 -ʤޤ @strong{MySQL} 򥤥󥹥ȡ뤷ץåȥե(ץ -ȥեΥСֹޤ)ʤǤϤȤƤϢ -ǡ100 ΥХݡȤΤ 99 ξ硢ξ󤬤ʤΩޤ - 桹 ``λǤưʤΡ'' Τ褦ʼȤƤɤ -Ʋ桹ϡ׵ᤵ줿ǽϤ @strong{MySQL} С˼ -Ƥʤޤϡݡ˽Ҥ٤ƤХϿ -@strong{MySQL} СǴ˽ƤǤ뤳Ȥ򸫤Ĥޤ -顼ϥץåȥե¸ǡڥ졼ƥ󥰥ƥȥץåȥե -ΥСֹΤʤȤˤϡ⽤뤳ȤϤǤޤ - -˴ϢƤϡѥˤĤƤξͿ뤳Ȥ˺ʤ -ǤФпͤϥѥΥХ򸫤Ĥơ -@strong{MySQL} ˴ϢƤȹͤޤ¿ΥѥϤĤⳫȯ -ǡС夲뤳ȤˤäƤɤСˤʤޤ꤬ -ѥ˰¸Ƥ뤫ɤꤹˤϡɤΥѥ餬Ѥ -뤫Τ뤳ȤɬפǤƤΥѥϥХݡȤȤߤʤ -졢˽ä𤵤٤Ǥ뤳ȤդƤ - -ǤΩĤΤϡɤХݡȤ˴ޤ뤳ȤǤĤ -ꡢƳƤιԤʤäȤȡΤ˵Ҥ줿ꤽ켫 -ǤɤХݡȤϡХƸˡ򼨤ޤ -ΤǤ - -꤬顼åͿ硢ݡȤ˴ޤ뤳ȤϤȤƤ -פǤ 桹ץѤ륢֤鲿򸡺褦Ȥ -硢顼åϥץबͿΤΤ˰פɤ -(ʸʸ٤Ǥ)ɤΤ褦ʥ顼åä -ФʤƤȤϤƤϤޤ󡨥ݡȤ˴ʥå򥳥ԡ -ĥĤƤ - -MyODBC Ǥ꤬硢MyODBC ȥ졼եߤ٤Ǥ -@xref{MyODBC bug report} - -ʤΥݡȤɤ¿οͤ 80ǥץ쥤ѤƤȤ -ȤФƤƲäơ@code{mysql} ޥɥ饤ġ -ƥݡȤޤϥץΤ褦ʥǥץ쥤ͭ -Ķ(㤨С@code{EXPLAIN SELECT} ơȥ; ҤΥץ -򸫤Ƥ)ˤϡ@code{--vertical} ץ(ޤ @code{\G} ơ -ȥȽü)Ѥ٤Ǥ - -ξݡȤ˴ޤƤ: - -@itemize @bullet -@item -ѤƤ @strong{MySQL} ۤΥСֹ (㤨 @strong{MySQL} -3.22.22)ɤΥСưƤ뤫 @code{mysqladmin version} -¹ԤǸĤޤ@code{mysqladmin} @strong{MySQL} Υ󥹥ȡ -ǥ쥯ȥ۲ @file{bin} ǥ쥯ȥ˸Ĥޤ - -@item -ʤȤƤޥΥ᡼ȥǥ롣 - -@item -ڥ졼ƥ󥰥ƥ̾ȥС¿Υڥ졼ƥ󥰥ƥ -ϡUnix ޥ @code{uname -a} μ¹ԤˤäƤξޤ - -@item -ˤϥ(¥Ȳۥ)̤طޤ路С -ޤƤ - -@item -@strong{MySQL} ΥۤѤƤϡѤѥ̾ -ȥСֹˤĤƤξɬפǤХʥۤξϡ̾ -ɬפǤ - -@item -꤬ѥȯ硢Τʥ顼åȡ顼ȯ -եΥɤβοԤޤƲ - -@item - -Υǡ١ơ֥뤬˴Ϣϡ -@code{mysqldump --no-data db_name tbl_name1 tbl_name2 ...} νϤޤ -ϥǡ١ǤդΥơ֥ˤĤƤξȤƤ -ñǶϤˡǡ桹ʤξ˰פΤˤ -ޤ - -@item -@code{SELECT} ơȥȤǤ®٤˴ؤХǤϡ -@code{EXPLAIN SELECT ...} νϤȡʤȤ @code{SELECT} ơȥ -ȤͿԤο˴ޤ٤ǤʤξˤĤơ¿ -ïʤ褦ˡŬڤͿƤ 㤨 -СϤȤƤɤХݡȤǤʤ @code{mysqlbug} ץȤ -ƤƤޤ: - -@code{mysql} ޥɹԥġ۲Ǥμ¹(: ǥץ쥤 -֤80Ķ륹ơȥȤˤϡ@code{\G} ơȥȽüѤ -Ƥ): - -@example -mysql> SHOW VARIABLES; -mysql> SHOW COLUMNS FROM ...\G - -mysql> EXPLAIN SELECT ...\G - -mysql> FLUSH STATUS; -mysql> SELECT ...; - -mysql> SHOW STATUS; - -@end example - -@item -Х @strong{MySQL} ¹ȯ硢ХƸϥ -ץȤɬפǤΥץȤɬפʥեƤޤ٤ -̩ʥץȤϤʤΤ˻ɤƸǤޤ - -⤷ץȤ󶡤뤳ȤǤʤСʤȤ⡢ -@code{mysqladmin variables extended-status processlist} -Ϸ̤᡼ˤޤ٤Ǥ ϤʤΥƥξ -󶡤ޤ - -@item -@strong{MySQL} ꤫۾ʷ̤ͿȻפϡ̤Ǥ -̤ɤʤ٤Ȥʤΰոȡʤΰոδܤ -ͳޤƤ - -@item -Υץ󶡤ˡ̾ˤ⡢ºݤξ¸ߤ -ΤƱѿ̾ơ֥̾ѤɤǤѿơ -̾˴Ϣ뤳Ȥޤ 餯ϤޤʥǤ -sorry safe ɤǤɡºݤ˻äƤ뤢ʤΥץ -ƱѤ뤳ȤϤʤˤȤäƤñǡ桹ˤȤäƤƤ -̣ɤȤǤ¾οͤ˸ʤǡ򤤤ĤäƤ硢 -@code{ftp} Ѥ @uref{ftp://www.mysql.com/pub/mysql/secret/} ˥ǡ -ž뤳ȤǤޤǡ˺ǹⵡ̩Dz桹ˤ -ϡ˿ʤǡ¾ѿ̾ѤƥץäƤߤƤ -ϺǸȻפäƤ - -@item -ǽʤСϢץͿ줿ƤΥץޤƤ -㤨С@code{mysqld} ǡ󳫻ϻ˻Ѥץ -@strong{MySQL} 饤ȥץ¹Ԥ˻Ѥץ򼨤Ƥ -@code{mysqld}, @code{mysql} ޤ @code{configure} ץ -ؤΥץϤФвؤΥˤʤꡢȤƤϢƤޤ Ȥ -ޤȤΤϰͤǤϤޤ Perl PHP ʤɤ -⥸塼ѤƤ硢ΥСֹޤƤ - -@item -ԤΥƥȥ󶡤Ǥʤ硢ޤϥƥȥơ֥뤬᡼󥰥 -Ȥ˥᡼뤹ˤ礭(10԰ʾ)硢@code{mysqldump} Ѥ -ƤʤΥơ֥פʤ @file{README} ե -٤Ǥ - -@code{tar} @code{gzip} ޤ @code{zip} Ѥơեΰ̥ -֤Υ֤ @code{ftp} Ѥ -@uref{ftp://www.mysql.com/pub/mysql/secret/} žƤ줫 -û @email{mysql@@lists.mysql.com} äƤ - -@item -䤬¥ƥ˴Ϣ硢@code{mysqlaccess} νϡ -@code{mysqladmin reload} νϡ³褦Ȥ줿ƤΥ顼 -åޤƤ ¤ƥȤޤ @code{mysqlaccess} -¹Ԥ٤Ǥθ塢@code{mysqladmin reload version} ¹Ԥ -꤬ȯץǤ³ߤ٤Ǥ@code{mysqlaccess} -@strong{MySQL} 󥹥ȡǥ쥯ȥ۲ @file{bin} ǥ쥯ȥ -˸Ĥޤ - -@item -ʤХˤĤƤΥѥåäƤΤɤǤ -Υѥå٤ơ桹ƤΤǡʤΥѥåХ -ƥȾ󶡤ʤƤ⡢桹Ѥ -ȻפʤǤ桹ϤʤΥѥå򸫤Ĥ뤫⤷ޤ -ޤϡǤʤ⤷ޤ󡣤ξϤѤ -ޤ - -Υѥå˰̣뤳ȤΤ˳ΤʤС桹ϤѤ -ޤ󡣥ƥȥϲ桹ˤμ򤷤ޤѥåꤦƤξ -򰷤Ȥ򼨤ƤѥåưʤΥ(줬 -Ǥ)򸫤Ĥ硢ѥåϻѤʤǤ礦 - -@item -ХȯΤ˰¸ƤΤˤĤƤο¬̾ -ְ㤤Ǥ桹ǤޤǥХåѤƥХμºݤθ򸫤Ĥ -СΤȤϿ¬Ǥޤ - -@item -᡼åˡʤե󥹥ޥ˥奢ȥ᡼륢֤ -åȤ򼨤ƤСʤ򤢤ʤȤ -褷褦ȤȤ¾οͤ狼ޤ - -@item -@code{ѡ顼}ȯ硢ʸ̩˥åƤ -ְäƤΤ򸫤ĤʤС¿ʬѤƤ륯 -@strong{MySQL} θߤΥС󤬥ݡȤƤʤȤȤǤ -ߤΥСѤƤơ@uref{http://www.mysql.com/doc.html} Υ -˥奢뤬ʤλѤƤ륯깽ʸ򥫥СƤʤϡ -@strong{MySQL} ʤΥ򥵥ݡȤƤʤȤ̣Ǥ -硢ʤϡιʸ򤢤ʤȤǼ뤳Ȥ -@email{mysql-support@@mysql.com} email Ǥ褦˿ळ -ȤǤ - -ޥ˥奢뤬ʤλѤƤ빽ʸ򥫥СƤΤ@strong{MySQL} -θŤСѤƤ硢ʸˡ줿ˤĤ -@strong{MySQL} ѹå٤Ǥ@xref{News}ξ硢 -꿷С @strong{MySQL} ؤΥåץ졼ɤǤޤ - -@item -⤷ʤΥǡʤä褦˻פꡢޤϡ -ơ֥˥顼Ȥʤʤ顢 -ޤǽˡơ֥ @code{myisamchk} Ǹߤ٤Ǥ -@xref{Maintenance}. - -@item -⤷ä夦ơ֥뤬ˤʤ褦ʤ顢ġʤΤ -õФ٤Ǥ ξ硢@file{mysql-data-directory/'hostname'.err} ե -äƤΤޤޤƤ礬ޤ Υե뤫 -ϢȴХݡȤ˴ޤƤ -̾ @code{mysqld} κ kill ʤ¤ -ơ֥@strong{Ф}˲ޤ ⤷ʤ @code{mysqld} ̤Τ -Ĥϡ桹ʤΤν󶡤뤳Ȥ -Ϥ뤫˴ñˤʤޤ! -@xref{What is crashing} - -@item -ǽʾ硢ǿ @strong{MySQL} Сɤơ -꤬褵뤫ɤåƤƤ @strong{MySQL} С -̤ƥƥȤ졢ʤưޤ Ƥǽʸ¤ -ߴ褦˺Ƥơ @strong{MySQL} Сڤؤ -뤳ȤǤȲ桹ϿƤޤ @xref{Which version} -@end itemize - -ʤݡȸܵҤʤ顢⤤̤ͥǼ갷 -@email{mysql-support@@mysql.com} ˥ХݡȤ򥯥ݥȤƤ -Ʊͤˡ¾ïиѤ(Ƥ餯Ѥ)ɤΤ뤿 -Ŭڤʥ᡼󥰥ꥹȤˤ⡣ - -@strong{MyODBC} ΥХξˤĤƤϡ@ref{ODBC Problems} 򻲾 -Ƥ - -ĤΰŪβˡΤ @xref{Problems}. - -ʤ˸ĿŪơ᡼󥰥ꥹȤƤʤ -󤷡ʤβμˤʤäֻβä¾οͤˤͿ -ˡ᡼󥰥ꥹȤ뤳ȤϡɤåȤǤ - -@cindex Net etiquette -@node Answering questions, , Bug reports, Questions -@section ᡼󥰥ꥹȤǼ뤿Υɥ饤 - -ʤβؿȹͤ硢Ҥͤͤ˸ĿŪľ -ֻ򤹤ˡ᡼󥰥ꥹȤƤȻפǤ礦ꥸ -Ƽ԰ʳοͤ⤽줫鲸ä褦˽ʬŪ˲ -뤳ȤߤƤ᡼󥰥ꥹȤƤϡʤβ -βȽʣƤʤǧƲ - -ʤֻǡܼʬߤƤΤѤ -뤳Ȥ̳ȴʤDz - -HTML ⡼ɤ ON ˤ֥饦᡼åƤʤǤ - ¿Υ桼ϥ֥饦ǥ᡼ɤǤޤ - -@cindex Licensing terms -@cindex Support terms -@node Licensing and Support, Installing, Questions, Top -@chapter @strong{MySQL} 饤󥹤ȥݡ - -(Τ򤭤ḶʸʻƤޤʸǤʤʸܤ̤Ƥ -⤷̣μ㤤򸫤Ĥʤ顢@email{takeshi@@SoftAgency.co.jp} ϢƤ) - -@menu -* Licensing policy:: @strong{MySQL} licensing policy -* Licensing policy on Win32:: -* Copyright:: Copyrights used by @strong{MySQL} -* Commercial use:: Distributing @strong{MySQL} commercially -* Licensing examples:: Example licensing situations -* Cost:: @strong{MySQL} licensing and support costs -* Support:: Types of commercial support -@end menu - -This chapter describes @strong{MySQL} licensing and support arrangements, -including: - -ܾϤǤ @strong{MySQL} Υ饤󥹤ȥݡȷˤĤƽҤ٤ޤ - -@itemize @bullet -@item -Our licensing policies for non-Microsoft and Microsoft operating systems - -@item -The copyrights under which @strong{MySQL} is distributed -(@pxref{Copyright}) - -@item -Sample situations illustrating when a license is required -(@pxref{Licensing examples}) - -@item -Licensing and support costs (@pxref{Cost}), and -support benefits (@pxref{Support}) -@end itemize - - -@itemize @bullet -@item -Microsoft Mirosoft Υڥ졼ƥ󥰥ƥФ饤󥹤Υݥꥷ - -@item -@strong{MySQL} ۤˤ -(@pxref{Copyright}) - -@item -饤󥹤ɬפȤʤ -(@pxref{Licensing examples}) - -@item -饤󥹤ȥݡȤ (@pxref{Cost}), -ݡȤ (@pxref{Support}) -@end itemize - - -@cindex Licensing policy -@node Licensing policy, Licensing policy on Win32, Licensing and Support, Licensing and Support -@section @strong{MySQL} licensing policy - -The formal terms of the license for non-Microsoft operating systems such as -Unix or OS/2 are specified in @ref{Public license}. Basically, our licensing -policy is as follows: - -UnixOS/2ʤɤޥեȥڥ졼ƥ󥰥ƥˤ饤󥹤 -ʾ @ref{Public license}. Ƥޤ -Ūˡ桹Υ饤󥹤ΥݥꥷϰʲΤ褦ˤʤäƤޤ - -@itemize @bullet -@item -For normal internal use, @strong{MySQL} generally costs nothing. You do not -have to pay us if you do not want to. - -@item -A license is required if: - -@itemize @minus -@item -You sell the @strong{MySQL} server directly or as a part of another product -or service - -@item -You charge for installing and maintaining a @strong{MySQL} server at some -client site - -@item -You include @strong{MySQL} in a distribution that is non-redistributable -and you charge for some part of that distribution -@end itemize - -@item -For circumstances under which a @strong{MySQL} license is required, you need -a license per machine that runs the @code{mysqld} server. However, a -multiple-CPU machine counts as a single machine, and there is no restriction -on the number of @strong{MySQL} servers that run on one machine, or on the -number of clients concurrently connected to a server running on that -machine! - -@item -You do not need a license to include client code in commercial programs. The -client access part of @strong{MySQL} is in the public domain. The -@code{mysql} command line client includes code from the @code{readline} -library that is under the GNU Public License. - -@item -@cindex @code{myisampack} -For customers who have purchased 1 license or @strong{MySQL} support, we provide -additional functionality. Currently, this means we provide the -@code{myisampack} utility for creating fast compressed read-only -databases. (The server includes support for reading such databases but -not the packing tool used to create them.) When support agreements -generate sufficient revenue, we will release this tool under the same -license as the @strong{MySQL} server. - -@item -If your use of @strong{MySQL} does not require a license, but you like -@strong{MySQL} and want to encourage further development, you are certainly -welcome to purchase a license anyway. - -@item -If you use @strong{MySQL} in a commercial context such that -you profit by its use, we ask that you further the development of -@strong{MySQL} by purchasing some level of support. We feel that if -@strong{MySQL} helps your business, it is reasonable to ask that you help -@strong{MySQL}. (Otherwise, if you ask us support questions, you are not -only using for free something into which we've put a lot a work, you're -asking us to provide free support, too.) -@end itemize - - - -@itemize @bullet -@item -ǤλѤϡ@strong{MySQL} ˥ȤϤޤ󡣤⤷˾ޤʤΤǤС -桹˻ʧɬפϤޤ - -@item -饤󥹤ϰʲǤɬפǤ - -@itemize @minus -@item -@strong{MySQL} ľ䤹뤫ޤ¾ʤ䥵ӥΰȤ - @strong{MySQL} 䤹 - -@item -@strong{MySQL} Υ󥹥ȡƥʥ󥹥ӥȤ硣 - -@item -ԲĤʪ @strong{MySQL} ޤᡢΤʤΤĤ򤫤 -@end itemize - -@item -@strong{MySQL} 饤󥹤ɬפʾ𶷤Ȥơ@code{mysqld} Ф -餻ޥ 1 ˤĤ 1 ĤΥ饤󥹤ɬפȤޤ. -ޥ CPU ޥϣΥޥȤߤʤޤ -1Υޥ餻 @strong{MySQL} Фο¤Ϥޤ -Υޥ륵С³륯饤Ȥοˤ¤ -ޤ - -@item -ΤΥץ˥饤ȥɤޤिˡ饤󥹤ɬפȤޤ -@strong{MySQL} Υ饤ȥʬϥѥ֥åɥᥤǤ -@code{mysql} ޥɥ饤󥯥饤ȤϡGNU Public License ˤ -@code{readline} ޤߤޤ - -@item -@cindex @code{myisampack} -For customers who have purchased 1 license or MySQL support, we provide -additional functionality. Currently, this means we provide the -@code{myisampack} utility for creating fast compressed read-only -databases. (The server includes support for reading such databases but -not the packing tool used to create them.) When support agreements -generate sufficient revenue, we will release this tool under the same -license as the @strong{MySQL} server. - -@item -@strong{MySQL} λѤ˥饤󥹤ɬפȤʤǤ⡢@strong{MySQL} , -ؤγȯ夷ʤ,Τ,ʤ饤󥹤ϴޤ -Ƥޤ. - -@item -ʤѤ @strong{MySQL} ѤƤꡢפˤʤäƤΤʤ顢 -桹,ʤĤΥݡȤ뤳Ȥˤä @strong{MySQL} γȯ -¥ʤ褦ߤޤ. 桹,@strong{MySQL} ʤΥӥͥʤС -ʤ @strong{MySQL} 褦Τƻ˹礦ȴޤ. -ʤʤ桹˼ΥݡȤΤǤС -桹¿ϫϤĤΤ̵ǻѤ뤳ȤϤƤ -̵ΥݡȤ󶡤桹ळȤǤ -@end itemize - -If you have any questions as to whether or not a license is required for your -particular use of @strong{MySQL}, please contact us. -@xref{Contact information}. - -@strong{MySQL} λѤ˺ݤƥ饤󥹤ɬפǤ뤫ɤ˴ؤƤμ䤬ʤ -桹䤤碌Ƥ@xref{Contact information}. - -If you require a @strong{MySQL} license, the easiest way to pay for it is to -use the license form on TcX's secure server at -@url{https://www.mysql.com/license.htmy}. Other forms of payment are discussed -in @ref{Payment information}. - -ʤ @strong{MySQL} 饤󥹤ɬפȤƤꡢñʻʧˡ -˾ΤǤСTcXΰʥФˤ饤󥹥եѤ -ȤǤ. @url{https://www.mysql.com/license.htmy}. -ۤλʧˡˤĤƤ @ref{Payment information}. -ܤǤι @uref{http://www.softagency.co.jp/}. - - -@strong{MySQL} licensing policy - -@cindex Licensing on Win32 -@node Licensing policy on Win32, Copyright, Licensing policy, Licensing and Support -@section MySQL licensing policy on Win32 - -For use under Microsoft operating systems (Win95/Win98/WinNT/Win2000), -you need a @strong{MySQL} license after a trial period of 30 days, with -the exceptions that are listed later. @xref{Win license}. - -A shareware version of @strong{MySQL}-Win32, that you can try before -buying, is available at @uref{http://www.mysql.com/mysql_w32.htmy}. This -is based on a very late, stable @strong{MySQL} version, but compiled -with full debugging support, which makes this a lot slower than the -registered version. After you have registered for a @strong{MySQL} -license, you will get a password that will enable you to access the -newest @strong{MySQL}-Win32 version. - -Microsoft ڥ졼ƥ󥰥ƥ(Win95/Win98/WinNT/Win2000)ˤѤǤϡ -ʤ30Υȥ饤֤θ @strong{MySQL} 饤󥹤ɬפȤޤ -@xref{Win license}. - -ʤ˻ߤ뤳ȤǤ @strong{MySQL}-Win32 ΥС -@uref{http://www.mysql.com/mysql_w32.htmy}. ˤޤ. -ϰǤ @strong{MySQL} ١˥ե롦ǥХå⡼ɤǥѥ뤷Ƥꡢ -ϿǤ٤®٤٤ʤäƤޤ -饤ʧä,ʤϺǤ⿷ @strong{MySQL}-Win32 С -뤿ΥѥɤǤ礦. - -ܸ @strong{MySQL}-Win32 ɾǤȿߤ @uref{http://www.softagency.co.jp/}. - -The reason for always requiring a license under Microsoft Windows is -that because Windows is a highly commercial OS with very high -development costs (it usually takes 3 times longer to build and test -things under windows), we see no other alternative than only give the -latest @strong{MySQL} Windows version to paying customers. If we -didn't do this we would not be able to keep up development on -Windows. - -We do give free @strong{MySQL} licenses on request in the following cases: - -@itemize @bullet -@item -Educational purposes, like teaching students. -@item -Non-commercial research settings. -@item -Churches. -@item -Registered charity organizations. -@item -Individual students who have database related educational project. -@item -People who help us with @strong{MySQL} development in some constructive manner. -@end itemize - -If something of the above applies to you, you can apply for a license by -sending an email to @email{mysql-licensing@@mysql.com}. This should include -a full description of for what you need a free @strong{MySQL} license. - -As soon as we can afford it we plan to release @strong{MySQL} Win32 -under the same license as @strong{MySQL} under other OS. This will -however also require that we can find some Windows developers that would -like to work on @strong{MySQL} development under Windows and build -windows version for all @strong{MySQL} releases. - - -@cindex Copyright -@node Copyright, Commercial use, Licensing policy on Win32, Licensing and Support -@section Copyrights used by @strong{MySQL} - -@menu -* Copyright changes:: Possible future copyright changes -@end menu - -There are several different copyrights on the @strong{MySQL} distribution: - -@strong{MySQL} ۤˤ롢Ĥۤʤ륳ԡ饤Ȥ򼨤ޤ - -@enumerate -@item -The @strong{MySQL}-specific source needed to build the -@code{mysqlclient} library and programs in the @file{client} directory -is in the public domain. Each file that is in the public domain has a -header which clearly states so. This includes everything in the -@file{client} directory and some parts of the @code{mysys}, -@code{mystring} and @code{dbug} libraries. - -@item -Some small parts of the source (GNU @code{getopt}) are covered by the -``GNU LIBRARY LIBRARY GENERAL PUBLIC LICENSE''. See the -@file{mysys/COPYING.LIB} file. - -@item -Some small parts of the source (GNU @code{readline}) are covered by the -``GNU GENERAL PUBLIC LICENSE''. See the @file{readline/COPYING} file. - -@item -Some parts of the source (the @code{regexp} library) are covered by a Berkeley -style copyright. - -@item -The other source needed for the @strong{MySQL} server on non-Microsoft -platforms is covered by the ``MySQL FREE PUBLIC LICENSE'', which is based on -the ``Aladdin FREE PUBLIC LICENSE.'' @xref{Public license}. When running -@strong{MySQL} on any Microsoft operating system, other licensing applies. -@end enumerate - -@enumerate -@item -@file{client} ǥ쥯ȥʲ @code{mysqlclient} 饤֥ -ץෲɬפȤ @strong{MySQL} Υϡ -ѥ֥åɥᥤǤ -줾Υѥ֥åɥᥤ󲼤ΥեƬˤϡλƤޤ -ϡ@file{client} ǥ쥯ȥʲեȡ -@code{mysys}, @code{mystring}, @code{dbug} 饤֥ΤĤޤߤޤ - -@item -ΤĤʬ (GNU @code{getopt}) ``GNU LIBRARY GENERAL PUBLIC LICENSE'' - ˽äѹΤǤSee the @file{mysys/COPYING.LIB} file. - -@item -ΤĤʬ (GNU @code{readline}) ``GNU GENERAL PUBLIC LICENSE'' ˽äѹΤǤ -See the @file{readline/COPYING} file. - -@item -ΤĤʬ (@code{regexp} library) С쥤Υԡ饤Ȥ˽äѹΤǤ - -@item -Microsoft ץåȥե @strong{MySQL} Сɬפʥϡ - ``MySQL FREE PUBLIC LICENSE'' ˤޤΥ饤󥹤 ``Aladdin FREE PUBLIC LICENSE'' - 򸵤ˤƤޤ @xref{Public license} -MicrosoftΥڥ졼ƥ󥰥ƥ @strong{MySQL} Ѥϡ -㤦饤󥹤ŬѤޤ@xref{Win license} -@end enumerate - - -The following points set forth the philosophy behind our copyright policy: - -ʲˤΥԡ饤Ȥδǰ򼨤ޤ - - -@itemize @bullet -@item -The SQL client library should be totally free so that it can be included in -commercial products without limitations. - -@item -People who want free access to the software into which we have put a lot of -work can have it, so long as they do not try to make money directly by -distributing it for profit. - -@item -People who want the right to keep their own software proprietary, but also -want the value from our work, can pay for the privilege. - -@item -That means normal in-house use is FREE. But if you use @strong{MySQL} for -something important to you, you may want to help further its development by -purchasing a license or a support contract. @xref{Support}. -@end itemize - - -@itemize @bullet -@item - SQL client 饤֥꡼̵Ǥ뤳ȡ -ϾѤʤФƤ̵¤Ǥ뤳Ȥޤࡣ - -@item -ΤۤԤäв褦Ȥʤ¤ϡ -桹Ϥƺäܥեȥ¤ʤǤ롣 - -@item -ʬȤΥեȥ긢ۤ,桹ΥեȤѤв -ͤƤ͡,ø㤦ȤǤޤ. - -@item -,̾λѤ̵Ǥ뤳Ȥ̣ޤ -,ʤˤȤäƲפʤΤˤѤʤ, -ʤ,ݡȷ뤳Ȥˤä, - @strong{MySQL} ΰؤγȯ򥵥ݡȤ뤫⤷ޤ. -@end itemize - - -@node Copyright changes, , Copyright, Copyright -@subsection Possible future copyright changes - -We may choose to distribute older versions of @strong{MySQL} with the GPL in -the future. However, these versions will be identified as @strong{GNU MySQL}. -Also, all copyright notices in the relevant files will be changed to the -GPL. - -桹, GPL @strong{MySQL} ε켰ΥС֤ۤ⤷ޤ. -ξ,ΥС @strong{GNU MySQL} ȤĤǤ. -ޤ,ϢեΤ٤ƤǸ GPL ѤĤǤ. - - -@node Commercial use, Licensing examples, Copyright, Licensing and Support -@section Distributing @strong{MySQL} commercially - -This section is a clarification of the license terms that are set forth in -the ``MySQL FREE PUBLIC LICENSE'' (FPL). @xref{Public license}. - -ʲ ``MySQL FREE PUBLIC LICENSE'' (FPL) Τ˵ޤ. -@xref{Public license}. - -@strong{MySQL} may be @strong{used} freely, including by commercial -entities for evaluation or unsupported internal use. However, -@strong{distribution} for commercial purposes of @strong{MySQL}, or -anything containing or derived from @strong{MySQL} in whole or in part, -requires a written commercial license from TcX AB, the sole entity -authorized to grant such licenses. - -@strong{MySQL} λѤˤ¤Ϥޤ -ϾѤΤɾ䡢󥵥ݡȤǻѤ뤳Ȥޤߤޤ -ξǤ TcX AB (饤󥹤Ϳ븢¤ͣε) -ˤäƵܤ줿ѥ饤󥹤ɬפǤ -@strong{MySQL} ȤŪ@strong{}뤳ȡ -@strong{MySQL} ΰ뤤ޤʪŪ@strong{}뤳ȡ -@strong{MySQL} Ѥƺäʪΰ뤤ޤʪŪ@strong{}뤳ȡ - -You may not include @strong{MySQL} ``free'' in a package containing -anything for which a charge is being made, except as noted below. - -ȯ뤤ʤʪˤ⡢@strong{MySQL} ``̵'' ǴޤǤϤޤ -ʲϽޤ - -The intent of the exception provided in the second clause of the license is -to allow commercial organizations operating an FTP server or a bulletin board -to distribute @strong{MySQL} freely from it, provided that: - -ܥ饤󥹤Σܤ㳰֤⤦ƤտޤϡΤĤƤ FTP С -Ǽǡͳ @strong{MySQL} ۤ뤳ȤĤ뤿Ǥ - -@enumerate -@item -The organization complies with the other provisions of the FPL, which -include among other things a requirement to distribute the full source -code of @strong{MySQL} and of any derived work, and to distribute the -FPL itself along with @strong{MySQL}; - -@item -The only charge for downloading @strong{MySQL} is a charge based on the -distribution service and not one based on the content of the information -being retrieved (i.e., the charge would be the same for retrieving a -random collection of bits of the same size); - -@item -The server or BBS is accessible to the general public, i.e., the phone -number or IP address is not kept secret, and anyone may obtain access to -the information (possibly by paying a subscription or access fee that is -not dependent on or related to purchasing anything else). -@end enumerate - -@enumerate -@item -Τ FPL ¾ξ뤳ȡ׵ǤȤ櫓 - @strong{MySQL} Ȥʤʪۤȡ - @strong{MySQL} Ȱ FPL Ȥۤ뤳Ȥϼ뤳ȡ - -@item -@strong{MySQL} ɤ԰٤ˤݶ⤹ǡ -ʤۥӥѤǤꡢоʪˤäѤʤ -(㤨СʪäƤƤ̤ƱǤƱʤǤ뤳ȡ) - -@item -СBBS ϰ̤˸Ƥƥǽʤȡ㤨Сֹ -IPɥ쥹Ƥ餺⤬ξ˥Ǥ뤳ȡ -(ʤˤ㤦ȤȤ˴Ϣ¸ꤷʤ䥢ˤʪ) -@end enumerate - -If you want to distribute software in a commercial context that incorporates -@strong{MySQL} and you do @strong{not} want to meet these conditions, you -should contact TcX AB to find out about commercial licensing, which involves -a payment. The only ways you legally can distribute @strong{MySQL} or -anything containing @strong{MySQL} are by distributing @strong{MySQL} under -the requirements of the FPL, or by getting a commercial license from TcX AB. - -@strong{MySQL} Ȥ߹ȥեȥۤ, -ξ@strong{ʤ}ʤ,ʤ,ǧĤ˴ؤ - TcX AB Ϣ٤Ǥ. -ȥ饤󥹤ϻʧ˱ƶ,ݡȤ¾ޤߤޤ. -Ϥʤ @strong{MySQL} Ȥ @strong{MySQL} ޤʪ -ˡŪۤ뤳ȤǤͣˡǤ: -FPLξβ @strong{MySQL} ۤ뤳Ȥ, -ޤ TcX AB 龦ȥ饤󥹤뤳Ȥˤä. - - -@node Licensing examples, Cost, Commercial use, Licensing and Support -@section Example licensing situations饤 - -@menu -* Products that use MySQL:: Selling products that use @strong{MySQL} -* MySQL services:: Selling @strong{MySQL}-related services -* ISP:: ISP @strong{MySQL} services -* Web server:: Running a web server using @strong{MySQL}. -@end menu - -This section describes some situations illustrating whether or not you must -license the @strong{MySQL} server. Generally these examples involve -providing @strong{MySQL} as part of a product or service that you are selling -to a customer, or requiring that @strong{MySQL} be used in conjunction with -your product. In such cases, it is your responsibility to obtain a license -for the customer if one is necessary. (This requirement is waived if your -customer already has a @strong{MySQL} license. But the seller must send -customer information and the license number to TcX, and the license must be a -full license, not an OEM license.) - -ΥǤϡʤɤä @strong{MySQL} Х饤󥹤 -ʤФʤʤݤ򡢤Ĥޤ -̤ˤϡ -@strong{MySQL} ʤܵҤäƤʤ䥵ӥΰ˴ޤޤƤ䡢 -ʤʤ @strong{MySQL} λѤ׵ᤷƤʤɤǤ -Τ褦ʾ硢ܵҤΤ˥饤󥹤ΤϤʤǤǤ -ʤǤˤθܵҤ @strong{MySQL} Υ饤󥹤äƤϤΤޤ -ϸܵҤξȥ饤󥹥ʥСTcXɬפꡢġ -Υ饤󥹤OEM饤󥹤ǤϤʤե饤󥹤ǤʤФʤޤ󡣡 - -Note that a single @strong{MySQL} license covers any number of -CPUs/users/customers/@code{mysqld} servers on a machine! - -@strong{MySQL} 饤󥹰ĤǡΥޥΡ - CPU/桼/ܵҿ/@code{mysqld} 򥫥Сޤ - - -@node Products that use MySQL, MySQL services, Licensing examples, Licensing examples -@subsection Selling products that use @strong{MySQL} - -To determine whether or not you need a @strong{MySQL} license when selling -your application, you should ask whether the proper functioning of your -application is contingent on the use of @strong{MySQL} and whether you -include @strong{MySQL} with your product. There are several cases to -consider: - -ץꥱ䤹Ȥʤ @strong{MySQL} 饤󥹤 -ɬפȤ뤫ɤꤹ뤿ˤ, -ʤΥץꥱŬڤ˵ǽ뤿ˤ @strong{MySQL} ɬפȤ뤫ɤ -ʤ @strong{MySQL} ޤफɤҤͤ٤Ǥ. ͤ뤤Ĥ -Υޤ: - -@itemize @bullet -@item -Does your application require @strong{MySQL} to function properly? - -If your product requires @strong{MySQL}, you need a license for any machine -that runs the @code{mysqld} server. For example, if you've designed your -application around @strong{MySQL}, then you've really made a commercial -product that requires the engine, so you need a license. - -If your application does not require @strong{MySQL}, you need not obtain a -license. For example, if @strong{MySQL} just added some new optional -features to your product (such as adding logging to a database if -@strong{MySQL} is used rather than logging to a text file), it should fall -within normal use, and a license would not be required. - -In other words, you need a license if you sell a product designed -specifically for use with @strong{MySQL} or that requires the @strong{MySQL} -server to function at all. This is true whether or not you provide -@strong{MySQL} for your client as part of your product distribution. - -It also depends on what you're doing for the client. Do you plan to provide -your client with detailed instructions on installing @strong{MySQL} with your -software? Then your product may be contingent on the use of @strong{MySQL}; -if so, you need to buy a license. If you are simply tying into a database -that you expect already to have been installed by the time your software is -purchased, then you probably don't need a license. - -@item -Do you include @strong{MySQL} in a distribution and charge for that -distribution? - -If you include @strong{MySQL} with a distribution that you sell to customers, -you will need a license for any machine that runs the @code{mysqld} server, -because in this case you are selling a system that includes @strong{MySQL}. - -This is true whether the use of @strong{MySQL} with your product -is required or optional. - -@item -Do you neither require for your product nor include @strong{MySQL} with it? - -Suppose you want to sell a product that is designed generally to use ``some -database'' and that can be configured to use any of several supported -alternative database systems (@strong{MySQL}, PostgreSQL, or something -else). That is, your product does not not require @strong{MySQL}, but can -support any database with a base level of functionality, and you don't rely -on anything that only @strong{MySQL} supports. Does one of you owe us money -if your customer actually does choose to use @strong{MySQL}? - -In this case, if you don't provide, obtain or set up @strong{MySQL} for the -customer should the customer decide to use it, neither of you need a -license. If you do perform that service, see @ref{MySQL services, , -@strong{MySQL} services}. -@end itemize - -@itemize @bullet -@item -ʤΥץꥱŬڤ˵ǽ뤿ˤϡ@strong{MySQL} ɬפȤޤ? - -ʤʤ @strong{MySQL} ɬפȤʤ,@strong{mysqld} Ф -餻ɤʥޥˤ饤󥹤ɬפȤޤ. 㤨Фʤ - @strong{MySQL} μǼʬΥץꥱ߷פʤС -˥󥸥ɬפȤ뾦ʤäˤʤΤǡ饤󥹤ɬפǤ. - -ʤΥץꥱ @strong{MySQL} ɬפȤʤʤ,ʤ -饤󥹤ɬפϤޤ 㤨 @strong{MySQL} ʤʤ -ĤοǤդħäʤ -ʥƥȥեؤΥ󥰤ꡢǡ١ؤΥ󥰤 @strong{MySQL} -Ѥ褦ʾˡ̾λѲʤΤǡ饤󥹤ɬפʤǤ礦 - -, @strong{MySQL} ȤȤ˻Ѥʤ䡢 -˵ǽ뤿 @strong{MySQL} ɬפȤΤǤС -饤󥹤ɬפǤʤ @strong{MySQL} ʤΰȤ -ܵҤۤ褦ޤξˤϥ饤󥹤ɬפǤ - -ޤʤܵҤΤˤƤˤͤޤ -ʤ,ʤΥեȥȤȤ @strong{MySQL} 򥤥󥹥ȡ뤷 -ܵҤ󶡤Τײ褷Ƥޤ? ΤФ,ʤʤ - @strong{MySQL} λѤȤƤޤ Ȥ, -ʤ,饤󥹤㤦ɬפޤ. -If you are simply tying into a database -that you expect already to have been installed by the time your software is -purchased, then you probably don't need a license. - -@item - @strong{MySQL} ʪ˴ޤᡢʪ򤫤ޤ - -⤷ܵҤʪ @strong{MySQL} ޤΤǤС - @code{mysqld} С뤤ʤޥ˥饤󥹤ɬפǤ -ʤʤ顢 @strong{MySQL} ޤॷƥäƤ뤫Ǥ - -ʤ @strong{MySQL} λѤ -ɬܤȤƤ褦ץȤƤ褦ŬѤޤ - -@item -ʤʤ @strong{MySQL} 򤽤˴ޤळȤ׵ᤷޤ - -``ʤ餫Υǡ١'' λѤǥ󤷤Ƥʤǡʤ -ĤΥǡ١ƥ -(@strong{MySQL}, PostgreSQL, or something else) 椫Τ -Ѥ褦ĴǽǤʡäʪ򤢤ʤ -ȤƤȲꤷޤ -ξ硢ʤʤ @strong{MySQL} ɬפȤޤ󤬡 -ʤǡ١δܵǽ򥵥ݡȤƤꡢ - @strong{MySQL} 򥵥ݡȤƤΤǤϤޤ -⤷ܵҤ @strong{MySQL} λѤˡʤ桹˻ʧ̳ -Τ - -ξ硢⤷θܵҤΤˡʤ @strong{MySQL} 󶡤ꤢ뤤ϡ -ꤷꡢåȥåפꤷƤʤʤСʤ˥饤󥹤פǤ -⤷ʤܵҤˤäӥ󶡤ʤ顢@ref{MySQL services, , -@strong{MySQL} services}. -@end itemize - - -@node MySQL services, ISP, Products that use MySQL, Licensing examples -@subsection Selling @strong{MySQL}-related services@strong{MySQL} Ϣӥ - -If you perform @strong{MySQL} installation on a client's machine and any -money changes hands for the service (directly or indirectly), then you must -buy a @strong{MySQL} license. - -⤷ @strong{MySQL} 򥯥饤Ȥ˥󥹥ȡ뤷ΥӥǤʤ餫 -򤨤ʤСľܡ鷺ˡʤ @strong{MySQL} 饤󥹤 -ʤƤϤʤޤ - -If you sell an application for which @strong{MySQL} is not strictly required -but can be used, a license may be indicated, depending on how @strong{MySQL} -is set up. Suppose your product neither requires @strong{MySQL} nor includes -it in your product distribution, but can be configured to use @strong{MySQL} -for those customers who so desire. (This would be the case, for example, if -your product can use any of a number of database engines.) - -@strong{MySQL} ϴɬפȤ櫓ǤϤʤ,@strong{MySQL} Ѥ뤳ȤǤ -ץꥱ䤹ʤ, @strong{MySQL} 򥻥åȥåפˡˤä, -饤󥹤ɬפˤʤ礬ޤʤʪ @strong{MySQL} -ޤޤƤ餺ޤ @strong{MySQL} ɬפȤƤʤ -ʤʤϸܵҤδ˾˹碌 @strong{MySQL} Ѥ褦ĴǤΤ -ꤷޤ -㤨,ʤʤ¿Υǡ١󥸥Τɤ줫Ѥ뤳Ȥ -Ǥʤ,ξ˳Ǥ礦. - -If the customer obtains and installs @strong{MySQL}, no license is needed. -If you perform that service for your customer, then a license is needed -because then you are selling a service that includes @strong{MySQL}. - -⤷ܵҼȤ @strong{MySQL} ꤷ󥹥ȡ뤹ʤС -ʤ˥饤󥹤פǤ⤷ʤäӥܵҤ˹Ԥʤ顢 -饤󥹤ɬפǤʤʤ顢 @strong{MySQL} ޤӥ򤢤ʤ -뤳Ȥˤʤ뤫Ǥ - - -@node ISP, Web server, MySQL services, Licensing examples -@subsection ISP @strong{MySQL} services - -Internet Service Providers (ISPs) often host @strong{MySQL} servers for -their customers. - -If you are an ISP that allows customers to install and administer -@strong{MySQL} for themselves on your machine with no assistance from you, -neither you nor your customer need a @strong{MySQL} license. Note that this -doesn't apply if you are are using Win32; In this case you will always -need a license for each computer that runs the @strong{MySQL} server. - -If you charge for @strong{MySQL} installation and administrative support as -part of your customer service, then you need a license because you are selling -a service that includes @strong{MySQL}. - -󥿡ͥåȥӥץХ(ISP) @strong{MySQL} СʬΤҤ -󶡤뤳Ȥ⤷ФФǤ - -⤷ʤ ISP ǡܵҤʤΥޥ @strong{MySQL} 򥤥󥹥ȡ뤷ƴ -ĤƤΤǤ(ʤμ̵) -ʤȸܵҤΤɤˤ @strong{MySQL} 饤󥹤פǤ -⤷ Win32 ѤƤʤ顢ŬѤʤȤդƤ -Win32 ξϡ@strong{MySQL} С¹Ԥ륳ԥ塼 -饤󥹤ɬפǤ - -⤷ʤܵҥӥȤ @strong{MySQL} 򥤥󥹥ȡ뤷뤳Ȥ򤫤ʤ顢 -ʤ @strong{MySQL} ޤӥäƤ뤳ȤˤʤΤǡ -ʤϥ饤󥹤ɬפǤ - - -@node Web server, , ISP, Licensing examples -@subsection Running a web server using @strong{MySQL} - -If you use @strong{MySQL} in conjunction with a web server on Unix, you -don't have to pay for a license. - -This is true even if you run a commercial web server that uses -@strong{MySQL}, since you are not selling @strong{MySQL} itself. However, in -this case we would like you to purchase @strong{MySQL} support, because -@strong{MySQL} is helping your enterprise. - -⤷ʤ UNIX WebС ȤȤ @strong{MySQL} Ѥʤ顢 -饤󥹤㤦ɬפϤޤ - -ϤȤ @strong{MySQL} ѤѤ WebС 餻ƤƤ⡢ - @strong{MySQL} ȤäƤʤΤǡ饤󥹤㤦ɬפϤޤ -ξ硢桹Ϥʤ @strong{MySQL} ݡȷ򤹤뤳Ȥ˾ߤޤ -ʤʤ顢@strong{MySQL} ϤʤλȤƤ뤫Ǥ - - -@cindex Costs, licensing and support -@cindex Licensing costs -@cindex Support costs -@node Cost, Support, Licensing examples, Licensing and Support -@section @strong{MySQL} licensing and support costs - -@menu -* Payment information:: Payment information -* Contact information:: Contact information -@end menu - -Our current license prices are shown below. All prices are in US -Dollars. If you pay by credit card, the currency is EURO (European Union Euro) -so the prices will differ slightly. - -ߤΥ饤󥹤βʤʲ˼ޤƤβʤ US ɥǤ -⤷ʤ쥸åȥɤ㤤ʤС̲ߤ EURO (European Union Euro) -Ǥʲʤ鷺˰ۤʤ - -@multitable @columnfractions .25 .2 .3 -@item @strong{Number of licenses} @tab @strong{Price per copy} @tab @strong{Total} -@item 1 @tab US $200 @tab US $200 -@item 10 pack @tab US $150 @tab US $1500 -@item 50 pack @tab US $120 @tab US $6000 -@end multitable - -For high volume (OEM) purchases, the following prices apply: - -̹(OEM )ξϡ - -@multitable @columnfractions .25 .2 .3 .25 -@item @strong{Number of licenses} @tab @strong{Price per copy} @tab @strong{Minimum at one time} @tab @strong{Minimum payment} -@item 100-999 @tab US $40 @tab 100 @tab US $4000 -@item 1000-2499 @tab US $25 @tab 200 @tab US $5000 -@item 2500-4999 @tab US $20 @tab 400 @tab US $8000 -@end multitable - -For OEM purchases, you must act as the middle-man for eventual problems -or extension requests from your users. We also require that OEM -customers have at least an extended email support contract. Note that -OEM licenses only apply for products where the user doesn't have direct -access to the @strong{MySQL} server (embedded system). In other words: -The @strong{MySQL} server should only be used with the application -that was supplied you. - -OEM 򤹤硢桼˾Фơ -ʤͤȤƿʤƤϤʤޤ - OEM εҤФʤȤĥŻҥ᡼륵ݡȷ׵ᤷޤ -OEM 饤󥹤ϡ@strong{MySQL} СľܥɬפΤʤ -ʤˤΤŬѤޤ (Ȥ߹ߥƥ) ʤС -@strong{MySQL} ϡʤ󶡤Ƥ륢ץꥱȶˤΤ -ѤʤƤϤʤޤ -(OEM MySQL С饤󥹤ΤߤñΤ뤳ȤϤǤޤ) - -If you have a low-margin high-volume product, you can always talk to us -about other terms (for example, a percent of the sale price). If you do, -please be informative about your product, pricing, market and any other -information that may be relevant. - -⤷ʤ¿ʤäƤʤ顢¾ξˤĤƤĤǤ -桹ä礦ȤǤޤ(㤨ͤΥѡơȤ) -⤷ʤʤꤿʤ顢 -ʤʡԾ졢¾Ϣܤ桹Τ餻Ƥ - -@cindex @code{myisampack} -After buying 1 @strong{MySQL} licenses, you will get a personal copy of -the @code{myisampack} utility. You are not allowed to redistribute this -utility but you can distribute tables packed with it. - -1 @code{MySQL} 饤󥹤ι塢@code{myisampack} 桼ƥƥ -Ŀͤऱ˥ԡǤޤκۤϵĤޤ󤬡 -@code{myisampack} ǥѥåơ֥ۤǤޤ - -A full-price license is not a support agreement and includes very minimal -support. This means that we try to answer any relevant question. If the -answer is in the documentation, we will direct you to the appropriate -section. If you have not purchased a license or support, we probably will not -answer at all. - -ʲʥ饤󥹤ϥݡȶǤʤ,˺Ǿ¤ΥݡȤޤߤޤ. ,桹 -ɤʴϢˤ褦Ȥ̣ޤ. ֻɥȤˤʤ, -桹Ŭڤʥ򤢤ʤĤǤ. ʤ饤󥹤ݡȤ -ʤäʤ, 桹Ϥ֤ĤϤޤ. - -If you discover what we consider a real bug, we are likely to fix it in -any case. But if you pay for support we will notify you about the fix -status instead of just fixing it in a later release. - -⤷ʤ桹˥Хȹͤʪ򸫤Ĥ硢ʤǤ -ޤ -, ʤݡȤʧʤ, Υ꡼Ǥˡ -桹Ͻ֤˴ؤƤʤΤĤǤ. - -More comprehensive support is sold separately. Descriptions of what each -level of support includes are given in @ref{Support}. Costs for the various -types of commercial support are shown below. Support level prices are in -EURO (European Union Euro). One EURO is about 1.17 USD. - -ŪʥݡȤ̡䤵ޤ. 줾Υ٥ΥݡȤޤ -ؤ뵭Ҥ @ref{Support}. ˤޤ͡ʥפξѥݡȤβʤϰʲ -ޤ. ݡȥ٥ʤ EURO (European Union Euro) Ǥ -1 EURO Ϥ褽 1.17 USD Ǥ. - -@multitable @columnfractions .3 .3 -@item @strong{Type of support} @tab @strong{Cost per year} -@item Basic email support @tab EURO 170 -@item Extended email support @tab EURO 1000 -@item Login support @tab EURO 2000 -@item Extended login support @tab EURO 5000 -@end multitable - -You may upgrade from any -lower level of support to a higher level of support for the difference -between the prices of the two support levels. - -̥٥ΥݡȤ顢⤤٥ΥݡȤˡ -2ĤΥݡȤβʺʬλʧǡåץ졼ɤǽǤ - - -@cindex Payment information -@node Payment information, Contact information, Cost, Cost -@subsection Payment information - -Currently we can take SWIFT payments, cheques or credit cards. - -,SWIFTʧ,ڼޤϥ쥸åȥɤǤλʧǤޤ. - -Payment should be made to: -ϡ -@example -Postgirot Bank AB -105 06 STOCKHOLM, SWEDEN - -TCX DataKonsult AB -BOX 6434 -11382 STOCKHOLM, SWEDEN - -SWIFT address: PGSI SESS -Account number: 96 77 06 - 3 -@end example - -Specify: license and/or support and your name and email address. - -ʤι饤 / ݡȤ,̾ E᡼륢ɥ쥹򵭽ҤΤȡ - -In Europe and Japan you can use EuroGiro (that should be less expensive) to the -same account. - -衼åѤܤǤ,ʤϻʧ EuroGiro(줬ǤϤʤ) Ѥ뤳ȤǤޤ. - -If you want to pay by cheque, make it payable to ``MySQL Finland AB'' and -mail it to the address below: - -ʤڼˤäƻʧȻפäƤʤ, ``Monty Program KB'' ˻ʧˤ, -ʲΥɥ쥹͹Ƥ. - -@example -TCX DataKonsult AB -BOX 6434, Torsgatan 21 -11382 STOCKHOLM, SWEDEN -@end example - -If you want to pay by credit card over the Internet, you can use -@uref{https://www.tcx.se/license.htmy, TcX's secure license form}. - -󥿡ͥåȾǥ쥸åȥɤǻʧȻפäƤʤ, -ʤ @uref{https://www.tcx.se/license.htmy, TcXΰʥ饤󥹥ե} Ѥ뤳ȤǤޤ. - -You can also print a copy of the license form, fill it in and send it by fax -to: - -ޤΥڡΥԡƽ񤭹,եåȤäưʲˤ뤳ȤǤޤ. - -+46-8-729 69 05 - -If you want us to bill you, you can use the license form and write ``bill -us'' in the comment field. You can also mail a message to -@email{sales@@mysql.com} (@strong{not} @email{mysql@@lists.mysql.com}!) -with your company information and ask us to bill you. - -äߤ,ʤϥ饤󥹥եѤ, - `` ˾'' 񤤤Ƥ. -뤤,ʤβҤξ򵭺ܤå @email{sales@@mysql.com} ˤ, -(@email{mysql@@lists.mysql.com} ǤϤޤ!) -褦˲桹˰ꤹǤޤ - - -@cindex Contact information -@node Contact information, , Payment information, Cost -@subsection Contact information - -For commercial licensing, or if you have any questions about any of the -information in this section, please contact the @strong{MySQL} licensing -team. The much preferred method is by E-Mail to -@email{mysql-licensing@@mysql.com}. Fax is also possible but handling of -these may take much longer (Fax +46-8-729 69 05). - -ǧĤܥ˴ؤ䤬ʤ,ʲϢƤ - -@example -David Axmark -Detron HB -Kungsgatan 65 B -753 21 UPPSALA -SWEDEN -Voice Phone +46-18-10 22 80 (Timezone GMT+1. Swedish and English spoken) -@end example - - -@cindex Support, types -@cindex Types of support -@node Support, , Cost, Licensing and Support -@section Types of commercial support - -@menu -* Basic email support:: Basic email support -* Extended email support:: Extended email support -* Login support:: Login support -* Extended login support:: Extended login support -@end menu - -@node Basic email support, Extended email support, Support, Support -@subsection Basic email supportŻҥ᡼륵ݡ - -Basic email support is a very inexpensive support option and should be -thought of more as a way to support our development of @strong{MySQL} -than as a real support option. We at TCX do give a lot of free support -in all the different @strong{MySQL} lists and the money we get from -basic eamil support is largely used to make this possible. - -Żҥ᡼륵ݡȤѤΤʤݡȥץǤ, -桹 @strong{MySQL} γȯ򥵥ݡȤΥݡȥץǡ -褤ˡȤƹͤ٤Ǥ. - -At this support level, the @strong{MySQL} mailing lists are the preferred -means of communication. Questions normally should be mailed to the primary -mailing list (@email{mysql@@lists.mysql.com}) or one of the other regular -lists (for example, @email{mysql-win32@@lists.mysql.com} for Windows-related -@strong{MySQL} questions), as someone else already may have experienced and -solved the problem you have. @xref{Asking questions}. - -Υݡȥ٥Ǥ, @strong{MySQL} ᡼󥰥ꥹȤϥߥ˥ -ˤϹޤˡǤ. ̾, ϼפʥ᡼󥰥ꥹ -(@email{mysql@@lists.mysql.com}) ¾Υ᡼󥰥ꥹȤΤɤ줫٤ǡ -㤨, Windows ˴Ϣ @strong{MySQL} μΤ @email{mysql-win32@@lists.mysql.com} -¾ïƱи, ˲褷Ƥ뤫⤷ʤǤ - @xref{Asking questions}. - -However, by purchasing basic email support, you also have access to the -support address @email{mysql-support@@mysql.com}, which is not available -as part of the minimal support that you get by purchasing a -@strong{MySQL} license. This means that for especially critical -questions, you can cross-post your message to -@email{mysql-support@@mysql.com}. (If the message contains sensitive -data, you should post only to @email{mysql-support@@mysql.com}.) - -@emph{REMEMBER!} to ALWAYS include your registration number and -expiration date when you send a message to -@email{mysql-support@@mysql.com}. - -Żҥ᡼륵ݡȤ뤳Ȥˤä, ʤϥݡȥɥ쥹 -@email{mysql-support@@mysql.com} ˥Ǥޤ. -(Υ᡼륢ɥ쥹ϺǾ @strong{MySQL} 饤󥹤ιǤԲǽǤ) -ä˽פʼΤ˻ѤƤꡢޤ@email{mysql-support@@mysql.com}. -ȥݥȤ뤳ȤǽǤ -ʥå˵̩Υǡޤޤ硢ʤ @email{mysql-support@@mysql.com}. -٤Ǥ. - -å @email{mysql-support@@mysql.com} Ȥϡ -®ʱμ¤ˤ뤿ˡɬʤϿֹλդźƤ - -Note that if you have encountered a critical repeatable bug and follow -the rules outlined in the manual section of how to report bugs and send -it to @email{bugs@@lists.mysql.com} we promise to try to fix this as -soon as possible, independent of your support level! @xref{Bug reports}. - -Basic email support includes the following types of service: - -Żҥ᡼륵ݡȤϰʲΥӥޤߤޤ - -@itemize @bullet -@item -If your question is already answered in the manual, we will inform you of the -correct section in which you can find the answer. If the answer is not in -the manual, we will point you in the right direction to solve your problem. - -@item -We guarantee a timely answer for your email messages. We can't guarantee -that we can solve any problem, but at least you will receive an answer if we -can contact you by email. - -@item -We will help with unexpected problems when you install @strong{MySQL} from a -binary distribution on supported platforms. This level of support does not -cover installing @strong{MySQL} from a source distribution. ``Supported'' -platforms are those for which @strong{MySQL} is known to work. -@xref{Which OS}. - -@item -We will help you with bugs and missing features. Any bugs that are found are -fixed for the next @strong{MySQL} release. If the bug is critical for -you, we will mail you a patch for it as soon the bug is fixed. Critical -bugs always have the highest priority for us, to ensure that they are -fixed as soon as possible. - -@item -Your suggestions for the further development of @strong{MySQL} will be -taken into consideration. By taking email support you have already -helped the further development of @strong{MySQL}. If you want to have -more input, upgrade to a higher level of support. - -@item -If you want us to help optimize your system, you must upgrade to a -higher level of support. -@end itemize - -@itemize @bullet -@item -⤷ʤμ䤬˥ޥ˥奢ƤΤǤС -򸫤ĤǤ򤢤ʤ˶ޤ -⤷ޥ˥奢̵СΤؤޤ - -@item -ᤤֿݾפޤɬɤǤݾڤפޤ -󤬡ʤ E ᡼ǥ󥿥ȲǽʤоʤȤֿϼǤ - - -@item -ݡȤƤץåȥեˤƥХʥ꡼۷֤ -@strong{MySQL} 򥤥󥹥ȡ뤹ͽʤ꤬줿礪פޤ -Υ٥ΥݡȤǤϥ۷֤ @strong{MySQL} 򥤥󥹥ȡ -ϤդޤƤޤ``ݡо'' ץåȥեȤϡ - @strong{MySQL} ưΤƤΤǤ @xref{Which OS}. - -@item -Х­ʤǽ դäХդƤϼ @strong{MySQL} -꡼ˤľޤ⤷ΥХʤˤȤä̿ŪǤС褽 -ΥХФѥå᡼Ǥꤷޤ̿ŪХϾ˹⤤ͥ٤ˤʤꡢ -ǽʸ¤®Ԥޤ - -@item -ʤ @strong{MySQL} ȯΤˤʤΰոϹθޤ -ʤ E ᡼륵ݡȤ򤪻ʤС⤦ @strong{MySQL} ιʤ -ȯؤμ򤵤ƤˤʤޤäȰո줿ʤС -̤ΥݡȤ˥åץ졼ɤƤ - -@item -⤷ʤ䶡ˤΥƥκŬμ˾ߤǤС -̤ΥݡȤإåץ졼ɤɬפޤ - -@item -@cindex @code{myisampack} -We include a binary version of the @code{myisampack} packing tool for -creating fast compressed read-only databases. The current server includes -support for reading such databases but not the packing tool used to -create them. -@end itemize - - -@node Extended email support, Login support, Basic email support, Support -@subsection Extended email supportĥŻҥ᡼륵ݡ - -Extended email support includes everything in basic email support with -these additions: - -@itemize @bullet -@item -Your email will be dealt with before mail from basic email support users and -non-registered users. - -@item -Your suggestions for the further development of @strong{MySQL} will -receive strong consideration. Simple extensions that suit the basic -goals of @strong{MySQL} are implemented in a matter of days. By taking -extended email support you have already helped the further development -of @strong{MySQL}. - -@item -@item -Typical questions that are covered by extended email support are: - -@itemize @minus -@item -We will answer and (within reason) solve questions that relate to possible -bugs in @strong{MySQL}. As soon as the bug is found and corrected, we -will mail a patch for it. - -@item -We will help with unexpected problems when you install @strong{MySQL} from a -source or binary distribution on supported platforms. - -@item -We will answer questions about missing features and offer hints how to work -around them. - -@item -We will provide hints on optimizing @code{mysqld} for your situation. -@end itemize - -@item -You are allowed to influence the priority of items on the @strong{MySQL} -TODO. This will ensure that the features you really need will be implemented -sooner than they might be otherwise. -@end itemize - -@node Login support, Extended login support, Extended email support, Support -@subsection Login support󥵥ݡ - -Login support includes everything in extended email support with -these additions: - -@itemize @bullet -@item -Your email will be dealt with even before mail from extended email -support users. - -@item -Your suggestions for the further development of @strong{MySQL} will -be taken into very high consideration. Realistic extensions that can be -implemented in a couple of hours and that suit the basic goals of -@strong{MySQL} will be implemented as soon as possible. - -@item -If you have a very specific problem, we can try to log in on your system -to solve the problem ``in place.'' - -@item -Like any database vendor, we can't guarantee that we can rescue any data from -crashed tables, but if the worst happens we will help you rescue as much as -possible. @strong{MySQL} has proven itself very reliable, but anything is -possible due to circumstances beyond our control (for example, if your system -crashes or someone kills the server by executing a @code{kill -9} command). - -@item -We will provide hints on optimizing your system and your queries. - -@item -You are allowed to call a @strong{MySQL} developer (in moderation) and -discuss your @strong{MySQL}-related problems. -@end itemize - -@node Extended login support, , Login support, Support -@subsection Extended login supportĥ󥵥ݡ - -Extended login support includes everything in login support with these -additions: - -@itemize @bullet -@item -Your email has the highest possible priority. - -@item -We will actively examine your system and help you optimize it and your -queries. We may also optimize and/or extend @strong{MySQL} to better -suit your needs. - -@item -You may also request special extensions just for you. For example: -@example -mysql> select MY_CALCULATION(col_name1,col_name2) from tbl_name; -@end example - -@item -We will provide a binary distribution of all important @strong{MySQL} -releases for your system, as long as we can get an account on a -similar system. In the worst case, we may require access to your system -to be able to create a binary distribution. - -@item -If you can provide accommodations and pay for traveler fares, you can even -get a @strong{MySQL} developer to visit you and offer you help with your -troubles. Extended login support entitles you to one personal -encounter per year, but we are as always very flexible towards our customers! -@end itemize - - -@node Installing, Compatibility, Licensing and Support, Top -@chapter @strong{MySQL} Υ󥹥ȡ - -@menu -* Getting MySQL:: @strong{MySQL} ˡ -* Which OS:: @strong{MySQL} ݡȤ OS -* Which version:: Ѥ @strong{MySQL} С -* Many versions:: åץǡȤ꡼ˡȻ -* Installation layouts:: 󥹥ȡ쥤 -* Installing binary:: @strong{MySQL} ХʥۤΥ󥹥ȡ -* Installing source:: @strong{MySQL} ۤΥ󥹥ȡ -* Compilation problems:: Problems compiling? -* MIT-pthreads:: MIT-pthreads ˴ؤ -* Perl support:: Perl installation comments -* Source install system issues:: System-specific notes -* Win32:: Win32 notes -* OS/2:: OS/2 notes -* TcX binaries:: TcX binaries -* Post-installation:: 󥹥ȡȥƥ -* Upgrade:: @strong{MySQL} Υåץ졼/󥰥졼ɻ̤˹ԤʤȤ뤫 -@end menu - -ξϤǤϡɤΤ褦ˤ @strong{MySQL} 󥹥ȡ뤹ΤΤ٤ޤ: - -@itemize @bullet -@item -@strong{MySQL} 뤳ȤǤ륵ȤΥꥹ -@ref{Getting MySQL, , Getting @strong{MySQL}}. - -@item -ɤΥץåȥե򥵥ݡȤƤ뤫 @ref{Which OS}. - -@item -@strong{MySQL} ΤĤΥСϡХʥꡢξʪޤ -ɤΥСѤΤɤΥפѤ뤫뤿ˤ - @ref{Many versions}. - -@item -ХʥȥΥ󥹥ȡˤĤƤ - @ref{Installing binary}, @ref{Installing source}. -줾ΥåȤˤϡʤФ魯⤷ʤ -ƥͭΥ󤬴ޤޤޤ - -@item -󥹥ȡ˹ԤȤ @ref{Post-installation}. -@strong{MySQL} Υ󥹥ȡˤơХʥޤϥۤˤ餺 -ΥץŬѤޤ -@end itemize - - -@cindex Downloading -@cindex @strong{MySQL} version -@cindex Version, latest -@cindex Getting @strong{MySQL} -@node Getting MySQL, Which OS, Installing, Installing -@section @strong{MySQL} ˡ - -ߤΥСȥɤλؼˤĤƤξ -@uref{http://www.mysql.com/, @strong{MySQL} ۡڡ} åƤ - - -TcX Υ󥿡ͥå³Ϥʤ®ޤ; ˰ -ߥ顼ȤΰĤºݤ˥ɤ뤳Ȥ@emph{ᤷޤ} - -ޤ٤Ƥߥ顼 @email{webmaster@@mysql.com} 𤷤Ƥ - - -@c START_OF_MIRROR_LISTING - -@strong{衼å:} - -@itemize @bullet -@item -@c EMAIL: sl@iuinfo.tuwien.ac.at (Tony Sprinzl) -@image{Flags/austria} Austria [Univ. of Technology/Vienna] @ -@uref{http://gd.tuwien.ac.at/db/mysql/, WWW} -@uref{ftp://gd.tuwien.ac.at/db/mysql/, FTP} -@item -@c EMAIL: delian@naturella.com (Delian Delchev) -@image{Flags/bulgaria} Bulgaria [Naturella] @ -@uref{http://archive.nat.bg/pub/mirror/mysql/, WWW} -@uref{ftp://ftp.ntrl.net/pub/mirror/mysql/, FTP} -@item -@c Added: 990614 -@c EMAIL: vuksan@veus.hr (Vladimir Vuksan) -@image{Flags/croatia} Croatia [HULK] @ -@uref{http://ftp.linux.hr/pub/mysql/, WWW} -@uref{ftp://ftp.linux.hr/pub/mysql/, FTP} -@item -@c Added: 990614 -@c EMAIL: kas@informatics.muni.cz (Jan Kasprzak) -@image{Flags/czech-republic} Czech Republic [Masaryk University in Brno] @ -@uref{http://mysql.linux.cz/index.html, WWW} -@uref{ftp://ftp.fi.muni.cz/pub/mysql/, FTP} -@item -@c Added: 990920 -@c EMAIL: (Radek Libovicky) -@image{Flags/czech-republic} Czech Republic [www.sopik.cz] @ -@uref{http://www.mysql.cz/, WWW} -@item -@c Added: 000418 -@c EMAIL: (Ondrej Feela Filip) -@image{Flags/czech-republic} Czech Republic [www.gin.cz] @ -@uref{http://mysql.gin.cz/, WWW} -@uref{ftp://ftp.gin.cz/pub/MIRRORS/www.mysql.com/, FTP} -@item -@c removed 991020 (no DNS entry). New name 991026. Added 991121 -@c Statistics at http://mirror.borsen.dk/ -@c EMAIL: mirrorman@borsen.dk (Michael Kyed) -@image{Flags/denmark} Denmark [Borsen] @ -@uref{ http://mysql.borsen.dk/, WWW} -@item -@c EMAIL: mkp@socsci.auc.dk (Martin Kasper Petersen) -@image{Flags/denmark} Denmark [SunSITE] @ -@uref{http://SunSITE.auc.dk/mysql/, WWW} -@uref{ftp://SunSITE.auc.dk/pub/databases/mysql/, FTP} -@c @item -@c EMAIL: tonu@tradenet.ee (Samuel) -@c @image{Flags/estonia} Estonia [Tradenet] @ -@c @uref{http://mysql.tradenet.ee, WWW} -@item -@c EMAIL: tonu@spam.ee (Tonu Samuel) -@image{Flags/estonia} Estonia [OKinteractive] @ -@uref{http://mysql.mirror.ok.ee, WWW} -@item -@c Changed 990531 -@c EMAIL: Steeve.Devergne@minet.net (Steeve Devergne) -@image{Flags/france} France [minet] @ -@uref{http://www.minet.net/devel/mysql/, WWW} -@item -@c EMAIL: Jaakko.Hyvatti@eunet.fi -@image{Flags/finland} Finland [EUnet] @ -@uref{http://mysql.eunet.fi/, WWW} -@item -@c Added 990829 -@c EMAIL: tomi.hakala@clinet.fi (Tomi Hakala) -@image{Flags/finland} Finland [clinet] @ -@uref{ftp://ftp.clinet.fi/mirrors/ftp.mysql.org/pub/mysql/, FTP} -@item -@c Added 981208 -@c EMAIL: noel@uni-bonn.de (Noel Koethe) -@image{Flags/germany} Germany [Bonn University, Bonn] @ -@uref{http://www.wipol.uni-bonn.de/MySQL//, WWW} -@uref{ftp://ftp.wipol.uni-bonn.de/pub/mirror/MySQL/, FTP} -@item -@c EMAIL: th@rz.fh-wolfenbuettel.de (Thorsten Ludewig) -@image{Flags/germany} Germany [Wolfenbuettel] @ -@uref{http://www.fh-wolfenbuettel.de/ftp/pub/database/mysql/, WWW} -@uref{ftp://ftp.fh-wolfenbuettel.de/pub/database/mysql/, FTP} -@item -@c Ok 980114. Removed 981208 (down > 3 days) ok 981214 -@c EMAIL: straub@gks.de (Hans-Peter Straub) -@image{Flags/germany} Germany [Staufen] @ -@uref{http://mysql.staufen.de/, WWW} -@item -@c Added 990614 -@c EMAIL: thomas.rohde@ecrc.de (Thomas Rohde) -@image{Flags/germany} Germany [Cable & Wireless] @ -@uref{ftp://ftp.ecrc.net/pub/database/mysql/, FTP} -@item -@c Added 981208 -@c EMAIL: christias@noc.ntua.gr (Panagiotis Christias) -@image{Flags/greece} Greece [NTUA, Athens] @ -@uref{http://www.ntua.gr/mysql/, WWW} -@uref{ftp://ftp.ntua.gr/pub/databases/mysql/, FTP} -@c @item -@c File not found 990730 -@c EMAIL: torlasz@xenia.sote.hu (Laszlo L. Tornoc) -@c @image{Flags/hungary} Hungary [Xenia] @ -@c @uref{http://xenia.sote.hu/ftp/mirrors/www.mysql.com/, WWW} -@c @uref{ftp://xenia.sote.hu/pub/mirrors/www.mysql.com/,FTP} -@item -@c EMAIL: mirrors@gm.is (Tomas Edwardsson) -@image{Flags/iceland} Island [GM] @ -@uref{http://mysql.gm.is/, WWW} -@uref{ftp://ftp.gm.is/pub/mysql, WWW} -@c @item -@c Out of date 990906 -@c EMAIL: bourbon@netvision.net.il (Zeev Suraski) -@c @image{Flags/israel} Israel [Netvision] @ -@c @uref{http://mysql.netvision.net.il/, WWW} -@c @item -@c Not working 99.03.06 -@c EMAIL: maruzz@matrice.it (Giovanni Maruzzelli) -@c @image{Flags/italy} Italy [Matrice] @ -@c @uref{http://www.matrice.it/risorse/mysql/, WWW} -@item -@c EMAIL: irena@yacc.it -@image{Flags/italy} Italy [Teta Srl] @ -@uref{http://www.teta.it/mysql/, WWW} -@item -@c Added 991121 -@c EMAIL: nick@iol.ie (Nick Hilliard) -@image{Flags/ireland} Ireland [Ireland On-Line/Dublin] @ -@uref{http://mysql.iol.ie, WWW} -@uref{ftp://ftp.iol.ie/pub/mysql, FTP} -@item -@c EMAIL: W.Sylwestrzak@icm.edu.pl (Wojtek Sylwestrzak) -@c mirroring nightly at 05:25 -@image{Flags/poland} Poland [Sunsite] @ -@uref{http://sunsite.icm.edu.pl/mysql/, WWW} -@uref{ftp://sunsite.icm.edu.pl/pub/unix/mysql/, FTP} -@c @item -@c EMAIL: melo@co.telenet.pt (Pedro Melo) -@c Temp out of service (email from Pedro) -@c @image{Flags/portugal} Portugal [IP] @ -@c @uref{http://mysql.ip.pt, WWW} -@item -@c EMAIL: Equipa de suporte do Leirianet -@image{Flags/portugal} Portugal [lerianet] @ -@uref{http://mysql.leirianet.pt, WWW} -@uref{ftp://ftp.leirianet.pt/pub/mysql/,FTP} -@item -@c EMAIL: kuzmin@dn.ru (Roma Kuzmin) -@image{Flags/russia} Russia [DirectNet] @ -@uref{http://mysql.directnet.ru, WWW} -@uref{ftp://ftp.dn.ru/pub/MySQL, FTP} -@c @item -@c down 990113 -@c EMAIL: nikkic@cityline.ru (Nikki Chumakov) -@c @image{Flags/russia} Russia [Cityline] @ -@c @uref{ftp://mysql.cityline.ru/pub/mysql, FTP} -@c @uref{http://mysql.cityline.ru, WWW} -@c EMAIL: bar@izhcom.ru (Alexander I Barkov) -@item -@image{Flags/russia} Russia [IZHCOM] @ -@uref{http://mysql.udm.net/, WWW} -@uref{ftp://ftp.izhcom.ru/pub/mysql/,FTP} -@item -@c Added 990507 -@c EMAIL: demon@gpad.ac.ru (Dima Sivachenko) -@image{Flags/russia} Russia [Scientific Center/Chernogolovka] @ -@uref{ftp://ftp.chg.ru/pub/databases/mysql/, FTP} -@item -@c EMAIL: sebi@dnttm.ro (Sebastian DEAC) -@image{Flags/romania} Romania [Timisoara] @ -@uref{http://www.dnttm.ro/mysql, WWW} -@uref{ftp://ftp.dnttm.ro/pub/mysql, FTP} -@item -@c EMAIL: tim@lbi.ro (Bogdan Surdu) -@image{Flags/romania} Romania [Bucharest] @ -@uref{http://www.lbi.ro/MySQL, WWW} -@uref{ftp://ftp.lbi.ro/mirrors/ftp.tcx.se, FTP} - -@c @item -@c Removed 20000521 because there is no mirror here. -@c EMAIL: jips@masterd.es (Juan Ignacio P Sacrist) -@c @image{Flags/spain} Spain [MasterD] -@c @uref{http://mysql.masterd.es, WWW} - -@item -@c EMAIL: Patrik.Karen@sdi.slu.se (Patrik Karen) -@c ftp -> remove old files -@image{Flags/sweden} Sweden [Sunet] @ -@uref{http://ftp.sunet.se/pub/unix/databases/relational/mysql/, WWW} -@uref{ftp://ftp.sunet.se/pub/unix/databases/relational/mysql/, FTP} - -@item -@c EMAIL: archive@sunsite.cnlab-switch.ch (Thomas Lenggenhager) -@image{Flags/switzerland} Switzerland [Sunsite] @ -@uref{http://sunsite.cnlab-switch.ch/ftp/mirror/mysql/, WWW} -@uref{ftp://sunsite.cnlab-switch.ch/mirror/mysql/, FTP} - -@c @item -@c @c simon@oyster.co.uk (Simon Gornall) -@c @image{Flags/great-britain} UK [Oyster/UK] @ -@c @uref{ftp://ftp.oyster.co.uk/pub/mysql, FTP} - -@item -@c gareth@omnipotent.net (Gareth Watts) -@image{Flags/great-britain} UK [Omnipotent/UK] @ -@uref{http://mysql.omnipotent.net/, WWW} -@uref{ftp://mysql.omnipotent.net/, FTP} - -@item -@c keet@mordor.plig.net (Christiaan Keet) -@image{Flags/great-britain} UK [PLiG/UK] @ -@uref{http://ftp.plig.org/pub/mysql/, WWW} -@uref{ftp://ftp.plig.org/pub/mysql/, FTP} -@c @item -@c unknown -@c @image{Flags/great-britain} UK [MicroMuse] @ -@c @uref{ftp://ftp.micromuse.co.uk/pub/packages/unix/databases/mysql/, FTP} - -@item -@c lmjm@icparc.ic.ac.uk (Lee McLoughlin) -@image{Flags/great-britain} UK [SunSITE] @ -@uref{http://sunsite.org.uk/packages/mysql/, WWW} -@uref{ftp://sunsite.org.uk/packages/mysql/, FTP} - -@item -@c sander@paco.net (Alexander Ivanov) -@image{Flags/ukraine} Ukraine [PACO] @ -@uref{http://mysql.paco.net.ua, WWW} -@uref{ftp://mysql.paco.net.ua/, FTP} - -@end itemize - -@strong{̥ꥫ:} - -@itemize @bullet -@c @item -@c Not ok 990101 (only to 981007) -@c EMAIL: sysop@polarcom.com (Seamus Venasse) -@c @image{Flags/canada} Canada [Polaris Computing] @ -@c @uref{http://mysql.polaris.ca/, WWW} - -@item -@c Ok 980109 -@c EMAIL: wojtek@tryc.on.ca (Wojtjeck Tryc) -@image{Flags/canada} Canada [Tryc] @ -@uref{http://web.tryc.on.ca/mysql/, WWW} - -@item -@c not updated 990218. Added again 990918 -@c EMAIL: rhooper@cyberus.ca (Roy Hooper) -@image{Flags/canada} Canada [Cyberus] @ -@uref{http://mysql.cyberus.ca/, WWW} -@uref{ftp://mysql.cyberus.ca/, FTP} - -@item -@c EMAIL: mleber@he.net (Mike Leber) -@c Added 980312 -@image{Flags/usa} USA [Hurricane Electric/San Jose] @ -@uref{http://mysql.he.net, WWW} - -@item -@c EMAIL: meltzer@icsnet.com (Jeffrey Meltzer) -@c Added 000108 -@image{Flags/usa} USA [Meltzer/New York State] @ -@uref{ftp://ftp.meltzer.org/pub/mysql/, FTP} - -@c @item -@c No such directory 990830 -@c EMAIL: tps@users.buoy.com (Tim Sailer) -@c @image{Flags/usa} USA [Buoy/New York] @ -@c @uref{http://www.buoy.com/mysql/, WWW} - -@c @item -@c EMAIL: db@hpnc.com (Douglas Bowyer) -@c Added 980107, removed 981124 because of 'file not found' -@c @image{Flags/usa} USA [Hypernet Communications/Dallas] @ -@c @uref{http://epsilon.hpnc.com/mysql, WWW} - -@c @item @c ********************************** -@c Not updated 980106 -@c EX: twh@iquest.net (Thomas Holt) who no longer works there -@c @image{Flags/usa} USA [IQuest/Indiana] @ -@c @uref{http://mirrors.iquest.net/mysql/, WWW} - -@c @item @c ********************************** -@c Only a partial mirror so we exclude it from the list -@c EX: lindberg@id.wustl.edu (Fred Lindberg) -@c @image{Flags/usa} USA [Washington University/St. Louis] @ -@c @uref{ftp://ftp.id.wustl.edu/pub/database/mysql/, FTP} - -@c removed 991111 -> no answer -@c @item -@c EMAIL: andrew@netcasting.net (Andrew Sawyers) -@c @image{Flags/usa} USA [Netcasting/West Coast] @ -@c @uref{ftp://ftp.netcasting.net/pub/mysql/, FTP} - -@c @item -@c No mirror! 980809 David -@c EMAIL: savages@savages.com (Shaun Savage) -@c @image{Flags/usa} USA [Savages/Oregon] @ -@c @uref{http://mysql.savages.com, WWW} - -@item -@c EMAIL: tcobb@staff.circle.net (Troy Cobb) -@image{Flags/usa} USA [Circle Net/North Carolina] @ -@uref{http://www.mysql.net, WWW} - -@item -@c EMAIL: paul@gina.net (Paul Vining) -@c mirrors ftp.sunet.se -@image{Flags/usa} USA [Gina net/Florida] @ -@uref{http://www.gina.net/mysql/, WWW} - -@c Out of date 2000-01-08 (Not updated since 1999-10) -@c @item -@c EMAIL: wswanson@pingzero.net (Wylie Swanson) -@c mirrors mysql.org -@c @image{Flags/usa} USA [pingzero/Los Angeles] @ -@c @uref{http://mysql.pingzero.net/, WWW} - -@item -@c EMAIL: ftpkeeper@mirror.sit.wisc.edu -@image{Flags/usa} USA [Wisconsin University/Wisconsin] @ -@uref{http://mirror.sit.wisc.edu/mysql/, WWW} -@uref{ftp://mirror.sit.wisc.edu/mirrors/mysql/, FTP} - -@item -@c EMAIL: ftp-admin@digex.net -@image{Flags/usa} USA [DIGEX] @ -@uref{ftp://ftp.digex.net/pub/packages/database/mysql/, FTP} - -@item -@c EMAIL: andrew.sawyers@thelinuxstore.com -@image{Flags/usa} USA [LinuxWired/Scottsdale, AZ] @ -@uref{http://mysql.linuxwired.net/, WWW} -@uref{ftp://ftp.linuxwired.net/pub/mirrors/mysql/, FTP} - -@end itemize - -@strong{ꥫ:} - -@itemize @bullet -@item -@c EMAIL: gaiser@matrix.com.br (Roberto Gaiser) -@image{Flags/brazil} Brazil [Matrix] @ -@uref{http://mysql.matrix.com.br, WWW} -@item -@c jpabuyer@vision.cl -@image{Flags/chile} Chile [Vision] @ -@uref{http://mysql.vision.cl/, WWW} - -@c @item -@c Removed 990730 -@c @c EMAIL: dan@amerikanclaris.com (Danilo Lotina F.) -@c @image{Flags/chile} Chile [Amerikanclaris] @ -@c @uref{http://www.labs.amerikanclaris.cl/mysql, WWW} -@c @uref{ftp://ftp.amerikanclaris.cl/pub/mysql, FTP} -@end itemize - -@strong{:} - -@itemize @bullet -@item -@c EMAIL: mirnshi@netchina.com.cn (Meng Lingbo) -@image{Flags/china} China [Freecode] @ -@uref{http://mysql.freecode.com.cn, WWW} - -@item -@c EMAIL: Vincent_Fong@innovator.com.hk (Vincent Fong) -@image{Flags/china} China [Hong Kong] @ -@uref{http://mysql.islnet.net, WWW} - -@item -@c EMAIL: george@netfirm.net (Hongsheng Zhu) -@image{Flags/china} China [Netfirm] @ -@uref{http://mysql.netfirm.net, WWW} - -@item -@c EMAIL: ahmlhs@nmsvr.chosun.com (Ho-sun Lee) -@image{Flags/south-korea} Korea [KREONet] @ -@uref{http://linux.kreonet.re.kr/mysql/, WWW} - -@c @item -@c ftp -> remove old files -@c EX: ahmlhs@nmsvr.chosun.com (Ho-sun Lee) -@c @image{Flags/south-korea} Korea [KREONet] @ -@c @uref{ftp://linux.kreonet.re.kr/pub/tools/db/mysql/, FTP} - -@item -@c Ok 980805 -@c EMAIL: takeshi@SoftAgency.co.jp -@image{Flags/japan} Japan [SoftAgency] @ -@uref{http://www.softagency.co.jp/MySQL, WWW} -@uref{http://www.softagency.co.jp/, ܸMySQLΥ(WWW) } - -@c @item -@c Ok 980109 Removed 990730 -@c EMAIL: satoshi@HappySize.co.jp (Satoshi TATSUOKA) -@c @image{Flags/japan} Japan [HappySize] @ -@c @uref{http://www.happysize.co.jp/mysql/, WWW} -@c @uref{ftp://ftp.happysize.co.jp/pub/mysql/, FTP} - -@item -@c Ok 981204 -@c EMAIL: hiroyuki@nucba.ac.jp (hiroyuki kurimoto) -@image{Flags/japan} Japan [Nagoya Syouka University] @ -@uref{http://mirror.nucba.ac.jp/mirror/mysql, WWW} -@uref{ftp://mirror.nucba.ac.jp/mirror/mysql, FTP} - -@c @item -@c Removed 990308 -@c EMAIL: terence@com5.net (Terence Chan) -@c @image{Flags/singapore} Singapore [Com5 Productions] @ -@c @uref{http://mysql.com5.net, WWW} -@c @uref{ftp://ftp.com5.net/pub/mysql, FTP} - -@item -@c EMAIL: csy@hjc.edu.sg -@image{Flags/singapore} Singapore [HJC] @ -@uref{http://mysql.hjc.edu.sg, WWW} -@uref{ftp://ftp.hjc.edu.sg/mysql, FTP} - -@item -@c 991118: Removed because a user complained about that the page contains -@c nothing about MySQL. 991119: Added again because it is a mirror again -@c EMAIL: dean@ht.net.tw (Dean Lin) -@image{Flags/taiwan} Taiwan [HT] @ -@uref{http://mysql.ht.net.tw, WWW} - -@item -@c EMAIL: linda@ttn.com.tw (Linda Hu) -@image{Flags/taiwan} Taiwan [TTN] @ -@uref{http://mysql.ttn.net, WWW} - -@c @item -@c Ok 980321 No connect -> removed 990730 -@c EMAIL: tby@ccca.nctu.edu.tw (Bao-Yi Tuang) -@c @image{Flags/taiwan} Taiwan [NCTU] @ -@c @uref{http://mysql.taconet.com.tw, WWW} -@c @item -@c Out of date 990905 (~2 months) -@c @item @c ********************************** -@c Error 980106 -@c EX: WolfySu@acer.net (Wolfy Su) -@c @image{Flags/taiwan} Taiwan [Acer] @ -@c @uref{http://mysql.acer.net/, WWW} -@c @item @c ********************************** -@c files to delete -@c EX: service@wownet.net -@c @image{Flags/taiwan} Taiwan [Wownet] @ -@c @uref{ftp://ftp.wownet.net/mysql/, FTP} -@c @item @c ********************************** -@c No conntact 980106 -@c EX: serge@oneway.net -@c @image{Flags/taiwan} Taiwan [Oneway] @ -@c @uref{ftp://ftp.oneway.com.tw/pub/mysql/, FTP} -@end itemize - -@strong{ȥꥢ:} - -@itemize @bullet -@item -@c Added 980610 -@c EMAIL: jason@dstc.edu.au (Jason Andrade) -@image{Flags/australia} Australia [AARNet/Queensland] @ -@uref{http://mirror.aarnet.edu.au/mysql, WWW} -@uref{ftp://mirror.aarnet.edu.au/pub/mysql, FTP} - -@c @item -@c Added 980805. Removed 000102 'no such directory' -@c EMAIL: sdd@ntccc.tas.gov.au (Scott Donovan) -@c @image{Flags/australia} Australia [Tas] @ -@c @uref{http://ftp.tas.gov.au/mysql, WWW} -@c @uref{ftp://ftp.tas.gov.au/pub/mysql, FTP} - -@item -@c Ok 980623 -@c EMAIL: samh@bluep.com (Sam Hadzajlic) -@image{Flags/australia} Australia [Blue Planet/Melbourne] @ -@uref{http://mysql.bluep.com/, WWW} -@c removed because ftp was not working 990729 & 30 -@c @uref{ftp://mysql.bluep.com/pub/mirror1/mysql/, FTP} - -@item -@c Added 990531 -@c EMAIL: gavin@itworks.com.au (Gavin Cameron) -@image{Flags/australia} Australia [ITworks Consulting/Victoria] @ -@uref{http://mysql.itworks.com.au, WWW} - -@c @item -@c 980610 Only the toplevel dir! -@c EMAIL: lucifer@maths.uq.edu.au (David Conran) -@c @image{Flags/australia} Australia FTP @ -@c @uref{ftp://ftp.sage-au.org.au/pub/database/mysql, [Sage]} -@end itemize - -@strong{եꥫ:} - -@itemize @bullet - -@item -@c Ok 981010 -@c EMAIL: nick@mweb.com (Nick Rosenberg) -@image{Flags/south-africa1} South-Africa [Mweb/] @ -@uref{http://www.mysql.mweb.co.za, WWW} - -@item -@c Ok 981010 -@c EMAIL: oskar@is.co.za (Oskar Pearson) -@image{Flags/south-africa1} South-Africa [The Internet Solution/Johannesburg] @ -@uref{ftp://ftp.is.co.za/linux/mysql/, FTP} - -@end itemize - -@c END_OF_MIRROR_LISTING - -@node Which OS, Which version, Getting MySQL, Installing -@section @strong{MySQL} ݡȤ OS - -桹 GNU Autoconf ѤƤޤΤǡ@strong{MySQL} POSIX -ɤ C++ ѥ餬ưƤοƥ˰ܿǽǤ(饤 -ȥɤΥѥ C++ ɬפȤޤåɤɬפǤϤޤ) -桹ϼȤΥեȥ򡢺ǽ Sun Solaris (ߤ 2.5 & 2.6 & 2.7) ǡ -ϰϤ RedHat Linux 5.0 ǡѤȯޤ - -@strong{MySQL} ϼ OS/åɥѥåȤ߹碌ǡѥ -𤵤Ƥޤ¿ OS Ǥϡͥƥ֥åɤϺǿС -ư뤳ȤդƤ - -@itemize @bullet -@item -AIX 4.x with native threads -@item -BSDI 2.x with the included MIT-pthreads package -@item -BSDI 3.0, 3.1 and 4.x with native threads -@item -DEC UNIX 4.x with native threads -@item -FreeBSD 2.x with the included MIT-pthreads package -@item -FreeBSD 3.x with native threads -@item -HP-UX 10.20 with the included MIT-pthreads package -@item -HP-UX 11.x with the native threads. -@item -Linux 2.0+ with LinuxThreads 0.7.1 or @code{glibc} 2.0.7 -@item -MacOS X Server -@item -NetBSD 1.3/1.4 Intel and NetBSD 1.3 Alpha (Requires GNU make) -@item -OpenBSD > 2.5 with native therads. OpenBSD < 2.5 with the included -MIT-pthreads package -@item -OS/2 Warp 3, FixPack 29 and OS/2 Warp 4, FixPack 4 -@item -SGI Irix 6.x with native threads -@item -Solaris 2.5 and above with native threads on SPARC and x86 -@item -SunOS 4.x with the included MIT-pthreads package -@item -SCO OpenServer with a recent port of the FSU Pthreads package -@item -SCO UnixWare 7.0.1 -@item -Tru64 Unix -@item -Win95, Win98, NT and Win2000 (the newest version is currently available -only for users with a @strong{MySQL} license or @strong{MySQL} email -support). For those who wish to test before they buy, we have released -@uref{http://www.mysql.com/mysql_w32.htmy,@strong{MySQL} 3.22.33} (an -older version) as shareware. -@end itemize - -@cindex @strong{MySQL} binary distribution -@cindex @strong{MySQL} source distribution -@cindex Release numbers -@cindex Version, choosing -@cindex Choosing version -@node Which version, Many versions, Which OS, Installing -@section Ѥ @strong{MySQL} С - -make Ԥ˷ϡʤǿγȯ꡼ѤΤ -ޤϺǿΰ꡼ѤΤǤ - -@itemize @bullet -@item -̾ʤǽ @strong{MySQL} ȤϤ硢ޤϥХʥ -ʤ¾Υƥ @strong{MySQL} ܿ褦Ȥ硢 -桹ϳȯ꡼ (ߤ @value{mysql_version}) -ޤȯ꡼ˤ̤˰ХϤޤ󡣤ϡʤΥޥǡ -@code{crash-me} ȥ٥ޡƥȤǴñ˥ƥȤǤޤ -@xref{Benchmarks}: ٤Ƥ @strong{MySQL} ꡼Ϥ줾Υ꡼ - @strong{MySQL} ٥ޡȹϰϤʥƥȥȤǥå -ޤ - -@item -ǤʤơŤƥǼ¹ԤƤƥåץ졼ɤɤ⡢ -ȯǤϻʤϡʤѤƤʪƱ֥ -ǿΤ(ʤѤƤʪ꿷Сʪ) -åץ졼ɤ٤Ǥ ΥСǤϡ̿ŪʥХ -ŪǾѹԤäƤޤ -@end itemize - -make ΣܤηϡۤȥХʥۤΤɤѤ뤫Ǥ: - -@itemize @bullet -@item -ʤߥХʥۤ¸ߤץåȥե @strong{MySQL} -¹ԤΤʤ顢ѤƤ̾ۤ⥤󥹥ȡ -ϴñǤ - -@item -@strong{MySQL} C C++ ɤɤߤ(/ޤѹ) -ϥۤꤹ٤ǤɤϤĤǤˤΥޥ˥奢 -ǤۤϥХʥۤ¿ΥƥȤޤǤޤ -@end itemize - -@strong{MySQL} ̿̾ˡǤϡ꡼ֹ3Ĥοͤȥեå -ޤ㤨С@code{mysql-3.21.17-beta} Τ褦ʥ꡼̾ϼΤ褦 -ᤵޤ: - -@itemize @bullet -@item -ǽο(@code{3})ϥեɽޤƤΥС 3 ꡼ -ƱեեޥåȤޤС 4 줿Ƥ -ơ֥ϿѴɬפޤ (ΤɤġϤ -ޤޤޤ) - -@item -2ܤο(@code{21})ϥ꡼٥Ǥ̾Ĥ򤷤ޤ -Ĥϥ꡼/֥(ߤ @code{22})⤦Ĥϳȯ֥Ǥ(ߤ @code{23}) -̾ξȤǤȯСϤޤǡɥȤʤĤΥ -ƥǤϥѥ˼Ԥޤ - -@item -3ܤο(@code{17})ϥ꡼٥ΥСֹǤϿ -ۤ٤äޤ̤Ϥʤ򤷤꡼٥κǿС -ޤ - -@item -եå(@code{beta})ϥ꡼ΰ٥ɽޤ: - -@itemize @minus -@item -@code{alpha} ϡ100% ƥȤƤʤĤο礭ʥɥ -¸ߤ뤳Ȥ򼨤ΤƤХ News ˵ҤƤޤ -(̾Ϥޤ)@xref{News}¿ alpha ꡼ˤϿ -ɤȳĥ⤢ޤ -礭ʥѹޤ೫ȯΤΤϡalpha ꡼˸ޤ -ƥ꡼˥ƥȤޤ줾 @code{MySQL} ꡼ˤϴ -ΥХϤޤ - -@item -@code{beta} ƤοɤƥȤ줿Ȥ̣ޤ礭ʿ -ΤɲäޤΤƤХϤޤ -alpha СǡʤȤ쥫֡̿ŪʥХ𤵤ʤơ -ޥɤ꿮Ǥʤ褦ʿǽɲäײ褬ʤˡ -alpha beta ˥Сѹޤ - -@item -@code{gamma} beta Ф餯ơư褦˸ΤǤ -ʽɲäޤ -¿¾βҤ꡼ȸƤ֤ΤǤ - -@item -եåʤϡ¿ΰۤʤǡץåȥեͭΥХ -ƥХݡȤʤǤΥС󤬤Ф餯δưƤȤ -̣ޤ ̿ŪʥХ꡼ŬѤޤ -ϲ桹 stable ꡼ȸƤ֤ΤǤ -@end itemize -@end itemize - -@strong{MySQL} ƤΥСϡŪ˻ѤǤ뤳ȤΤ -뤿ᡢ桹ɸƥȤȥ٥ޡ̤ƳǧƤޤɸƥ -Ȥϰ˸ĤäƤΥХå褦˳ĥ뤿ᡢƥ -ȤϤɤݻޤ - -ƤΥ꡼ϾʤƤ⼡ΥƥȤƤ뤳ȤդƤ: - -@table @asis -@item ƥȥ -ϸܵҤΤʥƥΰǤ¿Υơ֥ȲɴȤᥬ -ХȤΥǡäƤޤ - -@item @strong{MySQL} ٥ޡ -ϰŪϰϤΥ¹ԤޤϡŬκǿХåº -˥ɤ®뤫ɤǧƥȤǤ⤢ޤ -@xref{Benchmarks} - -@item @code{crash-me} ƥ -ϡǡ١ݡȤƤ뵡ǽȡε̤¤ꤷ -Ȥޤ@xref{Benchmarks} -@end table - -¾ΥƥȤϲ桹ʴĶǺǿ @strong{MySQL} С桹 -ʤȤ1ĤΥޥǻѤ뤳ȤǤ桹ưΤ 100Х -ʾΥǡޤ - -@node Many versions, Installation layouts, Which version, Installing -@section åץǡȤ꡼ˡȻ - -@strong{MySQL} TcX Ǥʤ®ʲƤơ桹Ϥ¾ -@strong{MySQL} 桼˶ͭƤ餤Ǥ桹ϡ¾οͤɬפȤ -ƤȻפȤƤʵǽäˡ꡼κߤޤ - -桹ϡñʵǽ׵᤹桼μߤޤ桹ϡ桹 -Υ饤󥹥桼Τˤܤä˲桹γĥ email ݡ -ܵҤΤܤơμߤޤ - -꡼ɤɬפϤޤNews ϡ꡼ -ʤ˵벿äƤ뤫ɤ򤢤ʤ˶ޤ -@xref{News} - -桹 @strong{MySQL} ιϼΥݥꥷˤäƹԤޤ - -@itemize @bullet -@item -줾ΥޥʡåץǡȤǡСʸκǸοͤä -ޤפʿǽΥСȤΥޥʡߴäˤϡС -ʸ2ܤοͤäޤեѹǽ -οͤäޤ - -@item -˥ƥȤ줿꡼ǯ 1-2 󸽤ޤʥХ -ĤäϡХեåΥ꡼꡼ޤ - -@item -Υ꡼ 1-8 ˸ޤ - -@item -ĤΥץåȥեΤΥХʥۤϲ桹ˤäƥ᥸㡼꡼ -ޤ¾οͤ¾ΥƥΤ˥Хʥۤޤ -餯ˤǤϤޤ - -@item -̾ʥХ򸫤ĤƽȤˡͭʥѥåޤ - -@item -ǤϤʤɤ⺤餵Хˤϡ桹Τ餻ĺͭʥѥ -ޤ¾ξ硢礭ʥѥåˤ¿礷ޤ - -@item -̿ŪʥХ꡼ˤ硢桹Ͽ꡼ǽʸ -ꤹ˺ޤ¾βҤ⤽Ƥ餤Ǥ:) -@end itemize - -ߤΰ꡼ 3.22 Ǥ; 桹ϤǤ 3.23 γȯ˰ܹԤƤޤ -СǤХϤޤޤ -桹ϡХ``ԤʤʤФʤ''Ȥ̵뤹褦ʡ -ͤƤޤ``ʬ''Ȥϡ``ۤȤɳμ¤˴ư -Τ˱ƶͿʤ''ʤȤɲä뤫⤷ʤȤȤ -̣ޤ - -@node Installation layouts, Installing binary, Many versions, Installing -@section 󥹥ȡ쥤 - -ǤϡХʥȥۤΥ󥹥ȡǥ쥯ȥ -ǥեȤΥ쥤Ȥޤ - -Хʥۤϥѥå뤳Ȥˤꥤ󥹥ȡ뤵졢󥹥ȡ -Ϥʤ򤷤(̾ @file{/usr/local/mysql})μΥǥ쥯 -ޤ: - -@multitable @columnfractions .3 .7 -@item @strong{ǥ쥯ȥ} @tab @strong{ǥ쥯ȥ} -@item @file{bin} @tab 饤ȥץ, @code{mysqld} -@item @file{data} @tab ե, ǡ١ -@item @file{include} @tab 󥯥롼(إå)ե -@item @file{lib} @tab 饤֥ -@item @file{scripts} @tab @code{mysql_install_db} -@item @file{share/mysql} @tab 顼åե -@item @file{sql-bench} @tab ٥ޡ -@end multitable - -ۤ configure ѥ뤷˥󥹥ȡ뤵ޤǥե -ȤǤϥ󥹥ȡ륹ƥåפ @file{/usr/local} ۲Υե򼡤Υ -֥ǥ쥯ȥ˥󥹥ȡ뤷ޤ: - -@multitable @columnfractions .3 .7 -@item @strong{ǥ쥯ȥ} @tab @strong{ǥ쥯ȥ} -@item @file{bin} @tab 饤ȥץȥץ -@item @file{include/mysql} @tab 󥯥롼ɥե -@item @file{info} @tab Info Υɥ -@item @file{lib/mysql} @tab 饤֥ -@item @file{libexec} @tab @code{mysqld} -@item @file{share/mysql} @tab 顼åե -@item @file{sql-bench} @tab ٥ޡ @code{crash-me} ƥ -@item @file{var} @tab ǡ١ȥե -@end multitable - -󥹥ȡΥ쥤ȤϥХʥꥤ󥹥ȡȼۤʤޤ: - -@itemize @bullet -@item -@code{mysqld} Ф @file{/bin} ǤϤʤ -@file{libexec} ǥ쥯ȥ˥󥹥ȡ뤵ޤ -@item -ǡǥ쥯ȥ @file{data} ǤϤʤ -@file{var} Ǥ -@item -@code{mysql_install_db} @file{/usr/local/mysql/scripts} ǤϤʤ -@file{/usr/local/bin} ǥ쥯ȥ˥󥹥ȡ뤵ޤ - -@item -إåեΥǥ쥯ȥ @file{include/mysql} ǡ -饤֥Υǥ쥯ȥ @file{lib/mysql} Ǥ -@file{include} @file{lib} ǤϤޤ -@end itemize - -@node Installing binary, Installing source, Installation layouts, Installing -@section @strong{MySQL} ХʥۤΥ󥹥ȡ - -@menu -* Linux-RPM:: Linux RPM files -* Building clients:: Building client programs -* Binary install system issues:: System-specific issues -@end menu - -ˤ˾ܺ٤Ԥʤޤ: - -@strong{MySQL} Хʥۤ򥤥󥹥ȡ뤹ˤϡΥġ뤬ɬפǤ: - -@itemize @bullet -@item -GNU @code{gunzip}ۤοĹΤᡣ - -@item -Ŭ @code{tar}ۤŸΤᡣGNU @code{tar} ưȤΤ -ޤ -@end itemize - -@cindex RPM -@cindex RedHat Package Manager -Linux ǤϡΥ󥹥ȡˡȤ RPM (RedHat Package -Manager) Ѥ뤳ȤǤޤ @xref{Linux-RPM}. - -@c texi2html fails to split chapters if I use strong for all of this. -꤬Ȥϡ@email{mysql@@lists.mysql.com} ˼Ƥ -@code{mysqlbug} @strong{˻ѤƤ}꤬ХǤʤȤ -⡢@code{mysqlbug} Ϥʤ褹ˤʤǤƥ -ޤ@code{mysqlbug} Ѥʤȡʤβ -ǽʤޤ @code{mysqlbug} ϡۤΥѥå -@file{bin} ǥ쥯ȥ˸Ĥޤ@xref{Bug reports}. - -@strong{MySQL} Хʥۤ򥤥󥹥ȡ뤷Ѥ뤿˹ԤʤʤФʤʤ -Ūʥޥ: - -@example -shell> gunzip < mysql-VERSION-OS.tar.gz | tar xvf - -shell> ln -s mysql-VERSION-OS mysql -shell> cd mysql -shell> scripts/mysql_install_db -shell> bin/safe_mysqld & -@end example - -Ǥ˾ܺ٤³ޤ: - -ХʥۤΥ󥹥ȡˤϡΥƥåפ˽줫 󥹥ȡ -ΥåȥåפȥƥȤΤ @ref{Post-installation} ˿ʤǤ - - -@enumerate -@item -۲ۤ򥢥ѥåǥ쥯ȥǡ˰ܤäƤ -ʲǤϡ@file{/usr/local} ۲ۤ򥢥ѥå@strong{MySQL} -򥤥󥹥ȡ뤹ǥ쥯ȥ @file{/usr/local/mysql} ޤ( -äơʲλؼ @file{/usr/local} ˥եѡߥå -äƤȤߤʤޤǥ쥯ȥ꤬ץƥȤƤϡ -@code{root} ǥ󥹥ȡԤʤɬפޤ) - -@item -ۥե @ref{Getting MySQL, , Getting @strong{MySQL}}. ˥ꥹȤ줿ȤΰĤƤ - -@strong{MySQL} Хʥۤϰ̤줿 @code{tar} ֤Ȥ -졢@file{mysql-VERSION-OS.tar.gz} Τ褦̾ޤ -@code{VERSION} Ͽ(㤨С@code{3.21.15})ǡ@code{OS} ۤտ -Ƥ륪ڥ졼ƥ󥰥ƥμɽޤ(㤨 -@code{pc-linux-gnu-i586}) - -@item -ۤ򥢥ѥå󥹥ȡǥ쥯ȥƤ: - -@example -shell> gunzip < mysql-VERSION-OS.tar.gz | tar xvf - -shell> ln -s mysql-VERSION-OS mysql -@end example - -ǽΥޥɤ @file{mysql-VERSION-OS} Ȥ̾Υǥ쥯ȥ -ޤܤΥޥɤϤΥǥ쥯ȥ˥ܥå󥯤 -ϥ󥹥ȡǥ쥯ȥ @file{/usr/local/mysql} Ȥơ -ñ˻Ȥ뤿Ǥ - -@item -󥹥ȡǥ쥯ȥ˰ܤäƤ: - -@example -shell> cd mysql -@end example - -ĤΥեȥ֥ǥ쥯ȥ꤬ @code{mysql} ǥ쥯ȥ˸ -ޤ󥹥ȡŪκǤפʤΤ @file{bin} -@file{scripts} ֥ǥ쥯ȥǤ - -@table @file -@item bin -@tindex PATH environment variable -@tindex Environment variable, PATH -Υǥ쥯ȥϥ饤ȥץȥФޤǤޤ뤬 -@strong{MySQL} ץĤ褦ˡΥǥ쥯ȥ -եѥ̾򤢤ʤ @code{PATH} Ķѿɲä٤Ǥ@xref{Environment variables}. - -@item scripts -Υǥ쥯ȥ @code{mysql_install_db} ץȤޤǤޤ -ϥХѡߥå뤿˻Ѥޤ -@end table - -@item -@code{mysqlaccess} Ѥ @strong{MySQL} ۤɸξ˻ -ϡ@code{mysqlaccess} @code{mysql} 饤Ȥ򸫤Ĥ -Ȥѹɬפޤ@file{bin/mysqlaccess} ץ - 18 նԽƤΤ褦ʹԤõƤ: - -@example -$MYSQL = '/usr/local/bin/mysql'; # path to mysql executable -@end example - -ѥ @code{mysql} ºݤ˥ƥˤƤ򼨤褦ѹ -ƤԤʤʤȡ@code{mysqlaccess} ¹Ի -@code{broken pipe} 顼ˤʤǤ礦 - -@item -@strong{MySQL} ĥơ֥ޤ - (Ͻ @strong{MySQL} 򥤥󥹥ȡ뤹ȤԤޤ): -@example -shell> scripts/mysql_install_db -@end example - -3.22.10ΥС @strong{MySQL} ϡ@code{mysql_install_db}. ¹Ի -@strong{MySQL} ưƤޤϤ䤳ϵưʤʤޤ - -@item -Perl @code{DBI}/@code{DBD} 󥿥եΥݡȤ򥤥󥹥ȡ뤷 -硢@ref{Perl support} 򸫤Ƥ - -@item -@strong{MySQL} ޥư˼ưŪ˳Ϥ硢 -@code{support-files/mysql.server} 򥷥ƥΥȥåץե뤬˥ -ԡƤʤ @code{support-files/mysql.server} ץȼ -ȡ@ref{Automatic start} ˸Ĥޤ -@end enumerate - -Ƥѥåƥ󥹥ȡ뤵줿塢ۤνȥƥȤԤʤ -٤Ǥ - -@strong{MySQL} СϰʲΥޥɤdzϤǤޤ - -@example -shell> bin/safe_mysqld & -@end example - -@xref{Post-installation}. - -@cindex RPM -@cindex RedHat Package Manager -@c This node name is special -@node Linux-RPM, Building clients, Installing binary, Installing binary -@subsection Linux RPM notes - -⤷ RedHat ʳ Linux ѤƤꡢ.rpm 򡢼ʬѤƤ -ѥåƥδˤ硢@strong{alien : http://kitenet.net/programs/alien/} Ȥġ -Ѥޤ RPM(Debian, Slackware) ʬѤƤѥåηѴƤޤ - - -RPM Ѥ @strong{MySQL} 򥤥󥹥ȡ뤹뤳Ȥ侩ޤ -@strong{MySQL} RPMS RedHat 5.2 ǺƤޤ -¾ @code{rpm} @code{glibc} 򥵥ݡȤƤ Linux ǤưǤ礦 - -RPM file Ǥ, 㤨 @code{Sorry, the host -'xxxx' could not be looked up} ϡsee @ref{Binary notes-Linux}. - -ʲѤǤ RPM files Ǥ: - -@itemize @bullet -@item @code{MySQL-VERSION.i386.rpm} - -@strong{MySQL} С -ñ¾ΥޥäƤ @strong{MySQL} С³ʤ顢 -פǤ礦 - -@item @code{MySQL-client-VERSION.i386.rpm} - -@strong{MySQL} 饤ɸץࡣ -ΥѥåϤۤȤɤξ祤󥹥ȡ뤹뤳ȤˤʤǤ礦 - -@item @code{MySQL-bench-VERSION.i386.rpm} - -٥ޡperl msql-mysql-modules RPM ɬס - -@item @code{MySQL-devel-VERSION.i386.rpm} - -¾ @strong{MySQL} 饤(perl⥸塼Τ褦)򥳥ѥ뤹Τɬפ -饤֥꡼ȥ󥯥롼ɥեޤߤޤ - -@item @code{MySQL-VERSION.src.rpm} - -嵭ƤΥ¾ΥƥѤ RPM ˤΤɬפǤ礦 -(㤨 Alpha or SPARC). -@end itemize - -RPM ѥå˴ޤޤեߤˤ: -@example -shell> rpm -qpl MySQL-VERSION.i386.rpm -@end example - -󥹥ȡκǾˡ - -@example -shell> rpm -i MySQL-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm -@end example - -饤ȥѥå򥤥󥹥ȡ롧 - -@example -shell> rpm -i MySQL-client-VERSION.i386.rpm -@end example - -RPM ϥǡ @file{/var/lib/mysql} ¸ޤ -RPM ϵư˥СΩ褦ˡ@file{/etc/rc.d/} Ͽޤ -(This means that if you have performed a previous -installation, you may want to make a copy of your previously-installed -@strong{MySQL} startup file if you made any changes to it, so you don't lose -your changes.) - -After installing the RPM file(s), the @file{mysqld} daemon should be running -and you should now be able to start using @strong{MySQL}. -@xref{Post-installation}. - -If something goes wrong, can find more information in the binary -installation chapter. @xref{Installing binary}. - -@cindex Client programs, building -@cindex Linking -@node Building clients, Binary install system issues, Linux-RPM, Installing binary -@subsection 饤ȥץΥӥ - -ʬǽ񤤤軰Ԥ @strong{MySQL} 饤ȥץ򥳥ѥ뤹硢 -@code{-lmysqlclient} ץѤƥ󥯤ʤФʤޤ -ޤ @code{-L} ץꤷơ饤֥꤬ɤˤ뤫ꤹɬפ⤢ޤ -㤨Х饤֥꤬ @file{/usr/local/mysql/lib} ˥󥹥ȡ뤵ʤС -󥯤λ @code{-L/usr/local/mysql/lib -lmysqlclient} Ȼꤷޤ - -@strong{MySQL} إåեѤ륯饤ȤΤˡ -ʤ򥳥ѥ뤹ˤϡ@code{-I} ץꤷʤФʤʤ⤢ޤ -(㤨, @code{-I/usr/local/mysql/include}) - - -@node Binary install system issues, , Building clients, Installing binary -@subsection System ͭ - -@menu -* Binary notes-Linux:: Linux notes -* Binary notes-HP-UX:: HP-UX notes -@end menu - -ʲΥǤΥƥ˵ǧ줿ĤΤ򼨤ޤ - -@node Binary notes-Linux, Binary notes-HP-UX, Binary install system issues, Binary install system issues -@subsubsection Linux notes - -TcX ΥХʥ꡼ @code{-static} ǥ󥯤ƤꡢϤʤΥƥब -ɤΥСΥ饤֥꡼ѤƤ뤫ˤɬפޤ -äơLinuxThreads ⤳ξɬפޤ -@code{-static} ǥ󥯤줿ץΥ -ʥߥå󥯤줿ץ礭ʤޤ(3-5%)®ʤޤ -ĤȤơΥƥå󥯤줿ץǤϡ -桼ؿ(UDF)ѤǤʤȤǤ -⤷ UDF Ѥ()(C, C++Ȥ)ʬȤ @strong{MySQL} -ʥߥå󥯤Ѥƥѥ뤷ʤƤϤʤޤ - -⤷ @code{glibc2} ǤϤʤ libc5 ΥƥѤƤʤ顢 -ΥХʥ꡼Ǥϥۥ̾getpwnam()ˤĤ꤬Фޤ -( @code{glibc} ۥ̾getwpent()ˤĤγ饤֥ -¸Ƥ뤿ǡȤ @code{-static} 󥯤Ƥ褷ޤ). -ξ硢@code{mysql_install_db} ¹Ի˰ʲΥ顼ФǤ礦 - -@example -Sorry, the host 'xxxx' could not be looked up -@end example - -뤤ϡ@code{--user} ץ mysqld ư褦ȤȤ -ʲΥ顼Ф硧 - -@example -getpwnam: No such file or directory -@end example - -ϡʲΤΤɤ줫ˡDzǤޤ - -@itemize @bullet -@item -@strong{MySQL} ۤꤷ( RPM @code{tar} ) -󥹥ȡ뤷ޤ - -@item -@code{mysql_install_db --force} ¹Ԥޤ; @code{mysql_install_db} -Ƥ @code{resolveip} ƥȤ¹Ԥޤ -ޤĥơ֥ǥۥ̾ȤʤʤäƤޤ -ۥ̾Ǥʤ IP ɥ쥹Ͽޤ (@code{localhost} Ͻ). -⤷ @code{--force} äƤʤ褦ʸŤ @strong{MySQL} ѤƤʤ顢 -ǥǡ@code{resolveip} ƥȤ @code{mysql_install} ޤ -@item -mysqld @code{--user} @code{su} ǵư -@end itemize - -Linux-Intel binary @strong{MySQL} RPM ꡼ϡäȤ®ʤ褦 -ĴƤޤ桹ϤäȤ᤯ꤷѥ顼˻ѤƤޤ - - -@node Binary notes-HP-UX, , Binary notes-Linux, Binary install system issues -@subsubsection HP-UX notes - -Some of the binary distributions of @strong{MySQL} for HP-UX is -distributed as an HP depot file and as a tar file. To use the depot -file you must be running at least HP-UX 10.x to have access to HP's -software depot tools. - -The HP version of @strong{MySQL} was compiled on an HP 9000/8xx server -under HP-UX 10.20, and uses MIT-pthreads. It is known to work -well under this configuration. -@strong{MySQL} 3.22.26 and newer can also be built with HP's native -thread package. - -Other configurations that may work: - -@itemize @bullet -@item -HP 9000/7xx running HP-UX 10.20+ -@item -HP 9000/8xx running HP-UX 10.30 -@end itemize - -The following configurations almost definitely won't work: - -@itemize @bullet -@item -HP 9000/7xx or 8xx running HP-UX 10.x where x < 2 -@item -HP 9000/7xx or 8xx running HP-UX 9.x -@end itemize - -To install the distribution, use one of the -commands below, where @code{/path/to/depot} is the full path to the depot file: - -@itemize @bullet -@item -To install everything, including the server, client and development tools: - -@example -shell> /usr/sbin/swinstall -s /path/to/depot mysql.full -@end example - -@item -To install only the server: - -@example -shell> /usr/sbin/swinstall -s /path/to/depot mysql.server -@end example - -@item -To install only the client package: - -@example -shell> /usr/sbin/swinstall -s /path/to/depot mysql.client -@end example - -@item -To install only the development tools: - -@example -shell> /usr/sbin/swinstall -s /path/to/depot mysql.developer -@end example -@end itemize - -The depot places binaries and libraries in @file{/opt/mysql} and data in -@file{/var/opt/mysql}. The depot also creates the appropriate entries in -@file{/sbin/init.d} and @file{/sbin/rc2.d} to start the server automatically -at boot time. Obviously, this entails being @code{root} to install. - -To install the HP-UX tar distribution, you must have a copy of GNU @code{tar}. - -@node Installing source, Compilation problems, Installing binary, Installing -@section @strong{MySQL} ۤΥ󥹥ȡ - - @strong{MySQL} 󥹥ȡ뤹뤿ˤϼΥġ뤬ɬ -פǤ: - -@itemize @bullet -@item -GNU @code{gunzip}ۤοĥΤᡣ - -@item -Ŭ @code{tar}ۤŸΤᡣGNU @code{tar} ưȤΤ -ޤ - -@item -ANSI C++ ѥ顣@code{gcc} >= 2.8.1, @code{egcs} >= 1.0.2, SGI C++, -SunPro C++ ƯȤΤƤ륳ѥΤĤǤ -@code{libg++} @code{gcc} ѻˤɬפǤϤޤ@code{gcc} -2.7.x ϡ@file{sql/sql_base.cc} Τ褦ʡ C++ եΤ -Ĥ򥳥ѥǤʤȤХޤ@code{gcc} 2.7.x -ʤС@strong{MySQL} 򥳥ѥǤ褦 @code{gcc} 򥢥å -졼ɤɬפޤ - -@item -ɤ @code{make} ץࡣGNU @code{make} Ͼ˿侩졢ɬ -Ȥޤ꤬ GNU @code{make} 3.75 ʾȤ򤪴ᤷ - -@end itemize - -@c texi2html fails to split chapters if I use strong for all of this. -꤬Ȥϡ@email{mysql@@lists.mysql.com} ˼Ƥ -@strong{@code{mysqlbug} ˻ѤƤ}꤬ХǤʤȤ -⡢@code{mysqlbug} Ϥʤ褹ˤʤǤƥ -ޤ@code{mysqlbug} Ѥʤȡʤβ -ǽʤޤ @code{mysqlbug} ϡۤΥѥå -@file{scripts} ǥ쥯ȥ˸Ĥޤ@xref{Bug reports} - -@menu -* Quick install:: ᤤ󥹥ȡγ -* Applying patches:: ѥåŬ -* configure options:: ŵŪ @code{configure} ץ -@end menu - -@node Quick install, Applying patches, Installing source, Installing source -@subsection ᤤ󥹥ȡγ - -@strong{MySQL} 򥽡饤󥹥ȡ뤹뤿˹ԤʤʤФʤʤ -Ūʥޥ(from an unpacked @code{tar} file): - -@example -shell> ./configure -shell> make -shell> make install -shell> scripts/mysql_install_db -shell> /usr/local/mysql/bin/safe_mysqld & -@end example - -RPM 鳫Ϥϡ - -@example -shell> rpm --rebuild MySQL-VERSION.src.rpm -@end example - -ϥ󥹥ȡǤRPMХʥޤ - -⤷ @code{DBI} @code{Msql-Mysql-modules} Perl ⥸塼򥤥󥹥ȡ뤹ʤ顢 -@code{bin/mysql_setpermission} ץȤѤ뿷桼 -ɲä뤳ȤǤޤ - -ˤ˾ܺ٤Ԥʤޤ: - -ۤΥ󥹥ȡˤϡΥƥåפ˽줫 󥹥ȡ -νȥƥȤΤ @xref{Post-installation} ˿ʤǤ - -@enumerate -@item -ۤ򥢥ѥåǥ쥯ȥǡ˰ܤäƤ - -@item -ۥե @ref{Getting MySQL, , Getting @strong{MySQL}}. ˥ꥹȤ줿ȤΰĤƤ - -@strong{MySQL} ۤϰ̤줿 @code{tar} ֤Ȥ󶡤 -졢@file{mysql-VERSION.tar.gz} Τ褦̾ޤ -@code{VERSION} @value{mysql_version} Τ褦ֹǤ - -@item -ȥǥ쥯ȥۤ򥢥ѥåƤ: -@example -shell> gunzip < mysql-VERSION.tar.gz | tar xvf - -@end example -Υޥɤ @file{mysql-VERSION} Ȥ̾Υǥ쥯ȥޤ - -@item -ѥå줿ۤΥȥåץ٥ǥ쥯ȥ˰ܤäƤ: -@example -shell> cd mysql-VERSION -@end example - -@item -꡼ configure Ƥ򥳥ѥ뤷Ƥ: -@example -shell> ./configure --prefix=/usr/local/mysql -shell> make -@end example -@code{configure} μ¹ԻĤΥץǤޤץ -ΰ @code{./configure --help} ¹ԤƤ@ref{configure -options, , @code{configure} options}, ͭѤʥץΤĤ -ĤƵƤޤ - -@code{configure} Ԥơ뤿 @email{mysql@@lists.mysql.com} ˥᡼ -Ȥ硢@file{config.log} βμˤǤ -ͤԤޤƤ@code{configure} ۾ェλ硢 -@code{configure} νϤκǸοԤޤƤХݡȤ -@code{mysqlbug} ץȤѤƤƤ@xref{Bug reports} - -ѥ뤬Ԥ硢餫Τ褯ǤμΤᡢ -@ref{Compilation problems} 򻲾ȤƤ - -@item -Ƥ򥤥󥹥ȡ뤷Ƥ: -@example -shell> make install -@end example -Υޥɤ @code{root} ȤƼ¹Ԥɬפޤ - -@item -@strong{MySQL} ¥ơ֥Ƥ( @strong{MySQL} -󥹥ȡ뤷ƤʤˤɬפǤ): -@example -shell> scripts/mysql_install_db -@end example - -: 3.22.10 Ť @strong{MySQL} СǤϡ -@code{mysql_install_db} ¹Ի @strong{MySQL} ФϤޤ -ϤϤ俿ǤϤޤ - -@item -Perl @code{DBI}/@code{DBD} 󥿥եΥݡȤ򥤥󥹥ȡ뤷 -硢@ref{Perl support} 򸫤Ƥ - -@item -@strong{MySQL} ޥư˼ưŪ˳Ϥ硢 -@code{support-files/mysql.server} 򥷥ƥΥȥåץե뤬 -˥ԡƤʤ -@code{support-files/mysql.server} ץȼȤȡ@ref{Automatic -start} ˸Ĥޤ -@end enumerate - -Ƥ󥹥ȡ뤵줿塢ۤνȥƥȤԤʤ٤Ǥ - -@strong{MySQL} СʲΥޥɤdzϤǤޤ -@code{BINDIR} @code{safe_mysqld} 󥹥ȡ뤵Ƥǥ쥯ȥ -(@file{/usr/local/bin} by default) Ǥ: - -@example -shell> BINDIR/safe_mysqld & -@end example - -ޥɤ @code{mysqld daemon ended} 顼ǼԤ硢 -@file{mysql-data-directory/'hostname'.err} եˤʤ餫ξ -Ĥ뤳ȤǤޤ 褯뤳ȤȤơǤ¾ @code{mysqld} -äƤʤɤޤ @xref{Multiple servers}. - -@xref{Post-installation} - -@node Applying patches, configure options, Quick install, Installing source -@subsection ѥåŬ - -ѥåϡ᡼󥰡ꥹȤή줿ꡢޤ -@strong{MySQL} FTPȤ @uref{ftp://www.mysql.com/pub/mysql/Downloads/Patches,ѥåꥢ} ֤ޤ - -᡼󥰡ꥹȤΥѥåŬѤˤϡѥåܤäƤå -ե¸ơʤ @strong{MySQL} ĥ꡼ -־Υǥ쥯ȥ꡼˰ưʲΤ褦˥ޥɤ¹Ԥޤ - -@example -shell> patch -p1 < patch-file-name -shell> rm config.cache -shell> make clean -@end example - -FTPȤ֤ѥåϡץ졼ƥȥեȤơ -뤤 @code{gzip} ǰ̤줿եȤۤޤ -ץ졼ƥȤΥѥåξϡ˼᡼󥰥ꥹȤ -ѥåƱͤŬѤޤ ̤줿ѥåŬѤˤϡ - @strong{MySQL} ĥ꡼ -־Υǥ쥯ȥ꡼˰ưʲΤ褦˥ޥɤ¹Ԥޤ - -@example -shell> gunzip < patch-file-name.gz | patch -p1 -shell> rm config.cache -shell> make clean -@end example - -줫̾Υ󥹥ȡλؼ @code{./configure} ƥåפ -Ϥޤ@code{make install} ƥå׼¹Ը塢ʤ @strong{MySQL} -ФƵưޤ - -@code{make install} ¹ԤˡäƤ륵Сߤɬפ뤫⤷ޤ -( @code{mysqladmin shutdown} ǻߤޤ ) -ĤΥƥǤϡ߼¹ԤƤΤߤʤ¤ꡢ -С򥤥󥹥ȡǤʤ褦ˤʤäƤޤ - - -@node configure options, , Applying patches, Installing source -@subsection ŵŪ configure ץ - -@code{configure} ץȤ @strong{MySQL} ۤɤΤ褦˥ե -뤫椹뤿¿ν󶡤ޤŵŪˤϡ -@code{configure} ޥɥ饤˥ץѤƤԤʤޤ -ĤδĶѿѤƤ @code{configure} ˱ƶͿ뤳ȤǤ -ޤ @xref{Environment variables}. - @code{configure} ݡȤ륪ץΰϡΥޥɤ -¹ԤƤ: - -@example -shell> ./configure --help -@end example - -ɤȤ @code{configure} ץΤĤʲޤ: - -@itemize @bullet -@item -@strong{MySQL} 饤ȥ饤֥ȥ饤ȥץ򥳥 -ѥ뤹ˤϡ@code{--without-server} ץѤƤ: - -@example -shell> ./configure --without-server -@end example - -C++ ѥ餬ʤС@code{mysql} ϥѥǤޤ( C++ -׵᤹륯饤ȥץΰĤǤ)ξ硢@code{configure} - C++ ѥƥȤ륳ɤǤޤ줫 -@code{./configure} @code{--without-server} ץĤǼ¹ԤƤ -ѥ륹ƥåפ @code{mysql} κߤޤ -@file{mysql.cc} ˤĤƤηٹ̵Ǥޤ(@code{make} ߤޤ硢 -顼ȯƤĤκ³褦 @code{make -k} Ƥ -) - -@item -եȥǡ١ǥ쥯ȥ @file{/usr/local/var} ۲ˤ -ʤϡΰĤΤ褦 @code{configure} ޥɤѤƤ -: -@example -shell> ./configure --prefix=/usr/local/mysql -shell> ./configure --prefix=/usr/local \ - --localstatedir=/usr/local/mysql/data -@end example -ǽΥޥɤϥ󥹥ȡץեåѹǥեȤ -@file{/usr/local} ǤϤʤ @file{/usr/local/mysql} ۲˥󥹥ȡ뤷 -ޤΥޥɤϥǥեȤΥ󥹥ȡץեå¸ޤ -ǡ١ǥ쥯ȥΥǥեȰ(̾ @file{/usr/local/var}) -񤭤@code{/usr/local/mysql/data} ѹޤ - -@item -UNIX ѤƤơåȤΰ֤ǥեȰ(̾ @file{/tmp} ޤ -@file{/var/run})Ǥʤ¾Τɤˤϡ@code{configure} ޥ -ɤ򼡤Τ褦˻Ѥޤ: -@example -shell> ./configure --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock -@end example -ե̾Хѥ̾ǤʤȤޤ - -@item -Ū󥯤줿ץ򥳥ѥ뤷(㤨СХʥۤ -뤿ᡢä®뤿ᡢĤ RedHat ۤǤ -뤿)ϡΤ褦 @code{configure} ¹Ԥޤ: - -@example -shell> ./configure --with-client-ldflags=-all-static \ - --with-mysqld-ldflags=-all-static -@end example - -@item -@code{gcc} ѤƤơ@code{libg++} @code{libstdc++} 󥹥ȡ -뤵Ƥʤ硢@code{configure} @code{gcc} C++ ѥȤ -ƻѤ뤳ȤƤ: - -@tindex CC environment variable -@tindex Environment variable, CC -@tindex CXX environment variable -@tindex Environment variable, CXX -@example -shell> CC=gcc CXX=gcc ./configure -@end example - -@code{gcc} C++ ѥȤƻѤ@code{libg++} ޤ -@code{libstdc++} Υ󥯤ϻߤޤ - -ѥ󥫤ͭ饤֥ @file{libmysqlclient.so.#} Ǥ -ʤȤ顼ˤʤ硢@code{--disable-shared} ץ -@code{configure} Ϳ뤳ȤǡǤޤξ硢 -@code{configure} ϶ͭ饤֥ @code{libmysqlclient.so.#} - - -@item - @code{NULL} (ʤ@code{NULL} Ƥʤ) -@code{DEFAULT} ͤѤʤ褦 @strong{MySQL} 򥳥եǤ -ޤϡ @code{NULL} ͤ׵᤹ƤιܤͤŪ˻ꤷ -ʤС@code{INSERT} ơȥȤϥ顼ޤǥե -λѤޤˤϡΤ褦 @code{configure} ¹Ԥޤ: - -@tindex CXXFLAGS environment variable -@tindex Environment variable, CXXFLAGS -@example -shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS ./configure -@end example - -@item -ǥեȤǤϡ@strong{MySQL} ISO-8859-1 (Latin1) ʸåȤѤ -ޤǥեȥåȤѹˤϡ@code{--with-charset} ץ -Ѥޤ: -@example -shell> ./configure --with-charset=CHARSET -@end example - -@code{CHARSET} ϼΰĤǤ: @code{big5}, @code{cp1251}, @code{cp1257}, -@code{czech}, @code{danish},@code{dec8}, @code{dos}, @code{euc_kr}, -@code{gb2312}, @code{gbk}, @code{german1}, @code{hebrew}, @code{hp8}, -@code{hungarian}, @code{koi8_ru}, @code{koi8_ukr}, @code{latin1}, @code{latin2}, -@code{sjis}, @code{swe7}, @code{tis620}, @code{ujis}, @code{usa7}, -@code{win1251} or @code{win1251ukr}. -@xref{Character sets}. - -: ʸåȤѹϡե졼֤ @code{make -distclean} Ԥʤɬפޤ (3.23.14 ξ) - -Фȥ饤ȴ֤ʸѴϡ -@code{SET OPTION CHARACTER SET} ޥɤĴ٤٤Ǥ -@xref{SET OPTION, , @code{SET OPTION}}. - -@cindex @code{myisamchk} -@strong{ٹ:} ơ֥ʸåȤѹ硢 -@code{myisamchk -r -q} ƤΥơ֥˼¹ԤɬפޤǤ -ȡǥåȤޤ(ϡ@strong{MySQL} Υ -󥹥ȡĤΥơ֥ۤʤʸåȤѤ -@strong{MySQL} κƥեƺƥ󥹥ȡȯޤ) - -@item -ǥХåɤĤ @strong{MySQL} 򥳥եˤϡ -@code{--with-debug} ץѤޤ: -@example -shell> ./configure --with-debug -@end example -ˤꡢĤΥ顼򸫤ĤʥƤޤޤ졢 -ȯƤ뤫ˤĤƤνϤ󶡤ޤ -@xref{Debugging server}. - -@item -ʤΥ饤ȥץबåɤѤƤ硢 -@strong{MySQL} 饤ȥ饤֥ -@code{--with-thread-safe-client} ǥåɰѤ˥ѥ뤹ɬפ -ޤ; ϡǥեȤǤϤĤΥåɰǤʤؿǡ饤 -֥꤬åɰؿѤ褦ˤʤޤԤʤ -Ǿʥѥեޥ󥹥ڥʥƥޤ̾盧ΥץλѤ -˰Ǥ - -@item -ͭΥƥ˴ط륪ץˤĤƤϡξϤΥƥͭ -ǸĤ뤳ȤǤޤ@xref{Source install system issues} -@end itemize - -@node Compilation problems, MIT-pthreads, Installing source, Installing -@section ѥ꤫ - -Solaris @code{gcc} Ѥ硢ڷٹ̵Ƥ @strong{MySQL} ץब줤˺ޤ -¾ΥƥǤϥ󥯥롼ɥեΰ㤤ٹ𤬽Ф뤫⤷ޤ - MIT-pthreads Ѥݤηٹ @ref{MIT-pthreads} 򻲾ȤƤ -¾ϡʲåƤ - -¿βΤˡ configure ɬפǤ -ʤƹɬפʤСʲ˵ĤƤ - -@cindex Running @code{configure} after prior invocation -@cindex @code{configure}, running after prior invocation -@itemize @bullet -@item -⤷ @code{configure} ټ¹Ԥ˼¹ԤʤС @code{configure} -˺äѤޤξ @file{config.cache} ¸ޤ - @code{configure} ϵưˤΥեõ⤷¸ߤʤС -ξʪȤɤ߹ߤޤ -Ϥʤƥեʤ̵ˤʤޤ -@item -@code{configure} ¹Ԥ뤴Ȥˡ @code{make} ¹Ԥƥѥ뤷ʤФʤޤ -ǽˡΥӥɤǤǤ֥Ȥ򡢾äƤƤ -ʤʤ顢㤦եץˤ줿Ǥ -@end itemize - -Ťե䥪֥ȥեλѤɤᡢ - @code{configure} ˰ʲΥޥɤ¹ԤƤ - -@example -shell> rm config.cache -shell> make clean -@end example - -뤫ˡ@code{make distclean} ȤƤ⹽ޤ - -ʲˡ @strong{MySQL} 򥳥ѥ뤹ݤ˵䤹򤢤Ƥޤ - -@itemize @bullet -@item -@cindex @code{cc1plus} problems -@cindex @code{fatal signal 11} -@cindex @code{sql_yacc.cc} problems -@cindex Internal compiler errors -@cindex Virtual memory problems while compiling -@file{sql_yacc.cc} ѥˡʲΤ褦ʥ顼Ф硢 -꡼åפ­ޤ - -@example -Internal compiler error: program cc1plus got fatal signal 11 - or -Out of virtual memory - or -Virtual memory exhausted -@end example - -ϡ@code{gcc} 饤Ÿ @file{sql_yacc.cc} 򥳥ѥ뤹Τˡ -ȤƤ¿Υ꡼ɬפȤ뤫Ǥ -ξ硢 @code{configure} @code{--with-low-memory} ץǼ¹Ԥޤ - -@example -shell> ./configure --with-low-memory -@end example - -Υץϡ @code{gcc} ѤƤʤ @code{-fno-inline} ץ -ޥɥ饤˲ä@code{gcc} ʳʤ @code{-O0} äޤ -¿Υ꡼ȥåפäƤʤ¤ϡ@code{--with-low-memory} ץѤ٤Ǥ -ϤäʥϡɥǤⵯ뤳ȤΤƤޤ -̾ @code{--with-low-memory} ץǤϲǤޤ - -@item -ɸǤϡ@code{configure} @code{c++} Ȥ̾ǥѥ顼Ѥ -GNU @code{c++} @code{-lg++} Ȥäƥ󥯤ޤ -⤷ @code{gcc} ѤƤʤСե˰ʲΤ褦꤬Ф뤫⤷ޤ - -@cindex C++ compiler cannot create executables -@example -configure: error: installation or configuration problem: -C++ compiler cannot create executables. -@end example - -@tindex CXX environment variable -@tindex Environment variable, CXX -ϡ@code{g++}, @code{libg++} 뤤 @code{libstdc++} ˴ϢΤǤ - -ΰĤȤƹͤ뤳Ȥϡ @code{g++} äƤʤ뤤ϡ -@code{g++} ϤäƤ @code{libg++} @code{libstdc++} ʤȤǤ -@file{config.log} ե c++ ѥ餬ưʤäͳϿƤޤ -褹ꡢʤäƤ C++ ѥ顼 - @code{gcc} ѤƤ⹽ޤ@code{CXX} Ķѿ @code{"gcc -O3"} ȤƤߤƤ -㤨С - -@tindex CXX environment variable -@tindex Environment variables, CXX -@example -shell> CXX="gcc -O3" ./configure -@end example - - @code{gcc} @code{g++} Ʊͤ C++ 򥳥ѥ뤹Τưޤ -@code{libg++} @code{libstdc++} ɸǤϥ󥯤ޤ - -¾βˡϡ@code{g++}, @code{libg++}, @code{libstdc++} 򥤥󥹥ȡ뤹뤳ȤǤ - -@item -⤷ʲΥ顼Τɤ줫硢 GNU @code{make} ΥС夲Ƥ - -@example -making all in mit-pthreads -make: Fatal error in reader: Makefile, line 18: -Badly formed macro assignment - or -make: file `Makefile' line 18: Must be a separator (: - or -pthread.h: No such file or directory -@end example - -@cindex Solaris troubleshooting -@cindex FreeBSD troubleshooting -@cindex Troubleshooting, Solaris -@cindex Troubleshooting, FreeBSD -Solaris FreeBSD @code{make} ץˤ꤬뤳ȤΤƤޤ - -GNU @code{make} version 3.75 ưǧƤޤ - -@tindex CC environment variable -@tindex Environment variable, CC -@tindex CXX environment variable -@tindex Environment variable, CXX -@tindex CFLAGS environment variable -@tindex Environment variable, CFLAGS -@tindex CXXFLAGS environment variable -@tindex Environment variable, CXXFLAGS -@item -⤷ C,C++ Τ˥ե饰Ϳ硢@code{CFLAGS} @code{CXXFLAGS} Ķѿ -ե饰ɲäƤƱͤˡ @code{CC} @code{CXX} ˥ѥ顼̾ -Ϳ뤳ȤǤޤ -㤨С - -@example -shell> CC=gcc -shell> CFLAGS=-O6 -shell> CXX=gcc -shell> CXXFLAGS=-O6 -shell> export CC CFLAGS CXX CXXFLAGS -@end example - -@ref{TcX binaries} ˤϥե饰ꥹȤƤޤ -ʥƥΩĤȻפޤ - -@item -ʲΤ褦ʥ顼ξ硢@code{gcc} ѥ顼򥢥åץ졼ɤƤ - -@example -client/libmysql.c:273: parse error before `__attribute__' -@end example - -@code{gcc} 2.8.1 ư뤳ȤǧƤޤ -@code{gcc} 2.95.2 ʾ򤪴ᤷޤ - -@item -@code{mysqld} ѥ˰ʲΤ褦ʥ顼Ф硢 -@code{configure} @code{accept()}, @code{getsockname()}, @code{getpeername()} -κǸΰФƤޤ - -@example -cxx: Error: mysqld.cc, line 645: In this statement, the referenced - type of the pointer value "&length" is "unsigned long", which - is not compatible with "int". -new_sock = accept(sock, (struct sockaddr *)&cAddr, &length); -@end example - -ˤϡ@file{config.h} ե(@code{configure} ˤ) ޤ -Τ褦ˡ - -@example -/* Define as the base type of the last arg to accept */ -#define SOCKET_SIZE_TYPE XXX -@end example - -@code{XXX} @code{size_t} @code{int} (ʤΥڥ졼ƥ󥰥ƥब¸Ƥ뷿)Ѥޤ -(@code{configure} @file{config.h} ϺľΤǡ -ν @code{configure} ٤˹ԤʤФʤʤȤ) - -@item -@file{sql_yacc.cc} ե @file{sql_yacc.yy} ޤ -̾ -@strong{MySQL} 줿ԡȤȤˤΤǡ -@file{sql_yacc.cc} եʬȤǺ뤳ȤϤޤ -ʲΥ顼ξ硢ƺɬפޤ - -@example -"sql_yacc.yy", line xxx fatal: default action causes potential... -@end example - -Ϥʤ @code{yacc} ΥСԽʬǤ뤳Ȥ򼨤Ƥޤ -@code{bison} (the GNU version of @code{yacc}) ˥󥹥ȡ뤷ƻѤɬפޤ - -@item -⤷ @code{mysqld} @strong{MySQL} 饤ȤǥХåʤ顢 -@code{configure} @code{--with-debug} ץդǼ¹Ԥޤ -ƥѥ뤷饤ȥ饤֥꡼ǥ饤Ȥ󥯤ޤ -@xref{Debugging client}. -@end itemize - -@node MIT-pthreads, Perl support, Compilation problems, Installing -@section MIT-pthreads ˴ؤ - -ΥǤMIT-pthreadsȤäƤ뤵˵ˤĤƤĤҤ٤ -ޤ - -Linux ǤϡMIT-pthreads ѤƤϤʤ餺 -LinuxThreads 򥤥󥹥ȡ뤹٤Ǥ -@xref{Linux}. - -⤷ʤΥƥबΥåɤΥݡȤ󶡤ʤСʤϡ -MIT-pthreadsѥåȤäơ@strong{MySQL} ۤɬפޤ -ˤϤۤȤɤFreeBSDƥࡢSunOS4.x,Solaris 2.4ȤۤĤ -ޤޤޤ -@xref{Which OS}. - -@itemize @bullet -@item -ۤȤɤΥƥǤ @code{--with-mit-threads} ץ -@code{configure} ¹Ԥ뤳Ȥˤäơ -MIT-pthreadsȤ뤳Ȥ뤳ȤǤޤ - -@example -shell> ./configure --with-mit-threads -@end example - -MIT-pthreadsȤ󥽡ǥ쥯ȥǹۤ뤳ȤϥݡȤƤޤ -󡣤ʤʤ顢䤿ϤΥɤػ䤿ѹǾˤǤ - -@item -MIT-pthreadsϡUnixåȼ˻ȤƤ @code{AF_UNIX} ץȥ򥵥ݡȤޤ -ϡ⤷ʤȤäƤ MIT-pthreads 򥳥ѥ뤹СƤ³ϡ -TCP/IP Ȥ(Ĥޤ꾯٤ʤ)Ȥ̣ޤ -⤷ʤ @strong{MySQL} ۤȤǡΥС³ǤʤʤС -ϤʤΥ饤ȤǥեȤ Unix åȤȤä - @code{localhost} ³褦ȤƤΤ⤷ޤ -Ū˥ۥ̾ꤹ뤿ˡۥ̾Υץ - (@code{-h} @code{--host}) @code{mysql} ѤơTCP/IP ³ƤߤƤ - -@item -MIT-pthreads ȤƤ뤫ɤåϥХɤ configure Ȥ -Ԥޤ⤷ʤ @code{--without-server} Ȥäƥ饤ȥɤΤߤ -ӥɤ뤳ȤꤷʤС饤Ȥ MIT-othreads ȤƤ뤫ʤ -Unixå³ǥեȤǻȤƤΤ狼ޤ󡣤ʤʤ Unix åȤ -MIT-pthreads ǤưʤǤޤʤϤΤ褦ʥ󥹥󥹤Ǥ - @code{-h} ޤ @code{--host} Ȥɬפޤ - -@item - @strong{MySQL} MIT-pthreads Ȥäƥѥ뤵ȡѥեޥ󥹾Τ -᥷ƥåϥǥեȤǥǥ֥Ȥޤ @code{--use-locking} ץ -ꤷƥС뤳ȤǡƥåϻȤ褦ˤʤޤ - -@item -Ȥɤ(ʤȤSolarisǤ) pthread @code{bind()} ޥɤϲΥ顼å -ʤ˥åȤؤ bind ˼Ԥ뤳ȤޤϷ̤ȤƥСؤ³ -ԤȤʤޤȤС - -@example -shell> mysqladmin version -mysqladmin: connect to server at '' failed; -error: 'Can't connect to mysql server on localhost (146)' -@end example - -褹뤿 @code{mysqld} СλơƵưƤ -ϻ䤿Сơ˥ꥹȤ褦ȤȤ -ޤ - -@item -MIT-pthreads ȤäƤȡ@code{sleep()} ƥॳ @code{SIGINT} (break) -ǤϳߤǤޤ ϡ@code{mysqladmin --sleep} 餻ƤȤˤ -뤳Ȥ狼äƤޤ -ߤȯƥץߤˡʤϽλ뤿 @code{sleep()} Ԥʤ -ƤϤʤޤ - -@item -󥯤ƤȤ(ʤȤSolarisǤ)ʤϤΤ褦 warning å -Ǥ礦̵뤷Ƥޤޤ - -@example -ld: warning: symbol `_iob' has differing sizes: - (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4; -file /usr/lib/libc.so value=0x140); - /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken -ld: warning: symbol `__iob' has differing sizes: - (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4; -file /usr/lib/libc.so value=0x140); - /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken -@end example - -@item -¾ΤĤ warnings ޤ̵뤷Ƥޤޤ - -@example -implicit declaration of function `int strtoll(...)' -implicit declaration of function `int strtoul(...)' -@end example - -@item -䤿Ϥޤ MIT-pthread ȤȤư @code{readline} Ƥޤ(ɬפǤ -ʤΤǤ餯ïˤ϶̣Ǥ礦) -@end itemize - -@node Perl support, Source install system issues, MIT-pthreads, Installing -@section Perl Υ󥹥ȡˤĤ - -@menu -* Perl installation:: Installing Perl on Unix -* ActiveState Perl:: Installing ActiveState Perl on Win32 -* Win32 Perl:: Installing the @strong{MySQL} Perl distribution on Win32 -* Perl support problems:: Problems using the Perl @code{DBI}/@code{DBD} interface -@end menu - -@node Perl installation, ActiveState Perl, Perl support, Perl support -@subsection Unix ؤ Perl Υ󥹥ȡ - -@strong{MySQL} Perl @code{DBI}/@code{DBD} 󥿡ե򥵥ݡȤޤ@xref{Perl}. -@code{DBI}/@code{DBD} 󥿡ե Perl Υ饤ȤϡPerl 5.004 ʾ夬ɬפǤ -ŤС Perl Ǥ@emph{ưޤ} - -@strong{MySQL} Perl ϡ @strong{MySQL} 饤ȡץߥ󥰡ݡȤ -˥󥹥ȡ뤵Ƥ뤳ȤǤ -⤷ʤ RPM ե뤫 @strong{MySQL} 򥤥󥹥ȡ뤷Τʤ顢 -饤ȡץϡ饤 RPM ˤޤ -饤ȡץߥ󥰡ݡȤϡȯԸ RPM ˤޤ -ȯԸ RPM 򥤥󥹥ȡ뤷ȤΤƲ - - 3.22.8 @strong{MySQL} ۤȤʬۤƤޤ -⤷ Perl ⥸塼򥤥󥹥ȡ뤷ʤ顢@uref{http://www.mysql.com/Contrib} -ǧƤˤƤޤ - -Perl ʪ @code{tar} ǥ֤졢̤Ƥޤ -@file{MODULE-VERSION.tar.gz} Ȥ̿̾§ۤƤޤ -(@code{MODULE} ϥ⥸塼̾@code{VERSION} ϥСֹ) - -@code{Data-Dumper}, @code{DBI}, @code{Msql-Mysql-modules} ɬפǤ -äƤ顢ʲΤ褦ˤƥ󥹥ȡ뤷ޤ -@code{Data-Dumper} ⥸塼ˤޤ¾ƱͤˤǤޤ - -@enumerate -@item -ʪ򥫥ȥǥ쥯ȥŸ -@example -shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf - -@end example - @file{Data-Dumper-VERSION} Ȥǥ쥯ȥޤ - -@item -Ÿǥ쥯ȥޤ -@example -shell> cd Data-Dumper-VERSION -@end example - -@item -ѥ롢󥹥ȡ롧 -@example -shell> perl Makefile.PL -shell> make -shell> make test -shell> make install -@end example -@end enumerate - -⥸塼뤬ư뤫ΤΤ @code{make test} ޥɤϽפǤ -󥿡եɤΥƥȤΤ @code{Msql-Mysql-modules} -󥹥ȡˤΥޥɤ¹Ԥݤˤϡ -@strong{MySQL} СƯƤʤФʤޤ -ǤʤСƥȤϼԤޤ - -꡼ @strong{MySQL} 򥤥󥹥ȡ뤷˾ - @code{Msql-Mysql-modules} ƹۡƥ󥹥ȡ뤹뤳Ȥ -ͤǤ٤Ƥ @code{DBI} ץȤ @strong{MySQL} -åץ졼ɸ˥פ˵Ťϡä -Ƥ - -⤷ Perl module ƥǥ쥯ȥ꡼Perlǥ쥯ȥ -˥󥹥ȡǤʤ硢ʲʸΩޤ - -@example -@uref{http://www.iserver.com/support/contrib/perl5/modules.html} -@end example - -Υڡΰʲ򻲾ȤƤ -@code{Installing New Modules that Require Locally Installed Modules}. - - -@node ActiveState Perl, Win32 Perl, Perl installation, Perl support -@subsection Win32 ؤ ActiveState Perl Υ󥹥ȡ - -Win32 ˡ ActiveState Perl @strong{MySQL} @code{DBD} ⥸塼 -󥹥ȡ뤹ˤϡʲΤ褦ˤʤƤϤʤޤ - -@itemize @bullet -@item Open a DOS shell. -@item ⤷ɬפʤ顢HTTP_proxy ѿ򥻥åȡ 㤨 -@code{set HTTP_proxy=my.proxy.com:3128} -@item PPM ץεư @code{C:\perl\bin\ppm.pl} -@item @code{DBI} Υ󥹥ȡ(⤷äƤʤ) @code{install DBI} -@item ˡ @code{ftp://ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd } 򥤥󥹥ȡ -@end itemize - -The above should work at least with ActiveState Perl 5.6. - -⤷嵭Τ褦˽ʤС @strong{MyODBC} ɥ饤С졢 - @strong{MySQL} С ODBC ͳ³ʤƤϤʤޤ - -@example -use DBI; -$dbh= DBI->connect("DBI:ODBC:$dsn","$user","$password") || - die "Got error $DBI::errstr when connecting to $dsn\n"; -@end example - -@node Win32 Perl, Perl support problems, ActiveState Perl, Perl support -@subsection Win32 ؤ @strong{MySQL} Perl ʪΥ󥹥ȡ - -@strong{MySQL} Perl ۤ @code{DBI}, -@code{DBD:MySQL} , @code{DBD:ODBC} ޤߤޤ - -@itemize @bullet -@item -@uref{http://www.mysql.com/download.html} Perl distribution for Win32 -@item @code{C:} unzip ޤ @file{C:\PERL} Ǥޤ -@item ʤΥѥ @file{C:\PERL\BIN} äޤ -@item ʤΥѥ @file{C:\PERL\BIN\MSWin32-x86-thread} -@file{C:\PERL\BIN\MSWin32-x86} äޤ -@item DOS shell ǡ @code{perl -v} ¹Ԥ @code{perl} ƥȤޤ -@end itemize - -@node Perl support problems, , Win32 Perl, Perl support -@subsection Perl @code{DBI}/@code{DBD} ѻ - -⤷ Perl @code{../mysql/mysql.so} ⥸塼뤬ĤʤȥåФ硢 -ɥ饤֥ @file{libmysqlclient.so} ꤳʤäȹͤޤ - -ʲΤ褦ˡDzˡޤ - -@itemize @bullet -@item -@code{Msql-Mysql-modules} ΥѥǤϡ -@code{perl Makefile.PL} Τ -@code{perl Makefile.PL -static -config} Ȥޤ - -@item -@code{libmysqlclient.so} ¾Υɥ饤֥꤬Ȥ(@file{/usr/lib} Ȥ @file{/lib})˥ԡޤ - -@item -@code{Linux} ξ硢@file{/etc/ld.so.conf} եˡ@code{libmysqlclient.so} - ǥ쥯ȥ񤭲ä@code{ldconfig -v} ¹Ԥޤ - -@item -@tindex LD_RUN_PATH environment variable -@tindex Environment variable, LD_RUN_PATH -@code{LD_RUN_PATH} (@code{LD_LIBRARY_PATH}) Ķѿ @code{libmysqlclient.so} - ǥ쥯ȥ񤭲äޤ -@end itemize - -⤷ @code{DBD-mysql} ǰʲΥ顼Ф硢 -@code{gcc} (뤤ϡ@code{gcc} ǥѥ뤵줿ŤХʥ) ѤƤ -פޤ - -@example -/usr/bin/perl: can't resolve symbol '__moddi3' -/usr/bin/perl: can't resolve symbol '__divdi3' -@end example - -@file{mysql.so} Υ󥯥ޥɤ - @code{-L/usr/lib/gcc-lib/... -lgcc} ɲäƤ -(Perl饤Ȥݤ @code{make} νϤåƤ) -@code{-L} ץ˻ꤹΤϡʤΥƥ @file{libgcc.a} ǥ쥯ȥǤ - -Perl @strong{MySQL} @code{gcc} ѤƺƤʤ⸶ȤƤޤ -ξ硢ξ @code{gcc} ǥѥ뤹뤳Ȥˤꡢߥޥå򤱤뤳ȤǤޤ - -ʥߥå󥯤򥵥ݡȤƤʤƥ(like SCO)Perl⥸塼Ѥ硢 -@code{DBI} @code{DBD-mysql} ޤॹƥåPerlǤޤ -ϡޤ @code{DBI} ɤ󥯤ƤPerläƸߤPerlξ˥󥹥ȡ뤷ޤ -ơ @code{DBD} ɤ򤵤˥󥯤Perlꡢ򥤥󥹥ȡ뤷ޤ - -SCOǤϡĶѿʲΤ褦ˤʤƤϤʤޤ - -@example -shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib -or -shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib -shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib -shell> MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:/usr/skunk/man: -@end example - -ǽ顢@code{DBI} 򥹥ƥå󥯤Perl뤿ˡ - @file{perl/DBI} ǥ쥯ȥǰʲΤ褦˼¹Ԥޤ - -@example -shell> perl Makefile.PL -static -config -shell> make -shell> make install -shell> make perl -@end example - -θ塢ʤϿPerl򥤥󥹥ȡ뤷ʤФʤޤ -@code{make perl} 򤹤ȡ󥹥ȡ˼¹Ԥɬפ @code{make} ޥɤ -ɽޤ -SCOǤϡ@code{make -f Makefile.aperl inst_perl MAP_TARGET=perl} Ȥޤ - -ˡ@code{DBD::mysql} 򥹥ƥå󥯤Perl뤿ˡ - @file{perl/Mysql-modules} ǥ쥯ȥǰʲΤ褦˼¹Ԥޤ - -@example -shell> perl Makefile.PL -static -config -shell> make -shell> make install -shell> make perl -@end example - -⿷Perl򥤥󥹥ȡ뤷ʤƤϤʤޤ -@code{make perl} νϤϻѤ륳ޥɤ򼨤ޤ - -@node Source install system issues, Win32, Perl support, Installing -@section System-specific issue - -ʲΥϡۤ @strong{MySQL} 򥤥󥹥ȡ뤹ݤ -Υƥ˵ǧ줿ΤĤ򼨤ޤ. - -@menu -* Solaris:: Solaris notes -* Solaris 2.7:: Solaris 2.7 notes -* Solaris x86:: Solaris x86 notes -* SunOS:: SunOS 4 notes -* Linux:: Linux notes (all Linux versions) -* Alpha-DEC-Unix:: Alpha-DEC-Unix notes -* Alpha-DEC-OSF1:: Alpha-DEC-OSF1 notes -* SGI-Irix:: SGI-Irix notes -* FreeBSD:: FreeBSD notes -* NetBSD:: NetBSD notes -* OpenBSD:: OpenBSD 2.5 notes -* BSDI:: BSD/OS notes -* SCO:: SCO notes -* SCO Unixware:: SCO Unixware 7.0 notes -* IBM-AIX:: IBM-AIX notes -* HP-UX 10.20:: HP-UX 10.20 notes -* HP-UX 11.x:: -* MaxOSX:: MaxOSX notes -@end menu - -@node Solaris, Solaris 2.7, Source install system issues, Source install system issues -@subsection Solaris notes - -Solaris Ǥ @strong{MySQL} ŸȤȥ֥뤬ФǤ礦 -Solaris @code{tar} Ĺ̾򰷤 @strong{MySQL} Ÿ硢 -ʲΤ褦ʥ顼ˤʤޤ - -@example -x mysql-3.22.12-beta/bench/Results/ATIS-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase, 0 bytes, 0 tape blocks -tar: directory checksum error -@end example - -ξ硢GNU @code{tar} (@code{gtar}) Ÿ˻ѤƤ -ѥ뤺ߤΤΤʲˤޤ -@uref{http://www.mysql.com/Downloads/}. - -Sun ͥƥ֥åɤ Solaris 2.5 ʾưޤ -2.4 ʲξ硢@strong{MySQL} ϻưŪ MIT-pthreads Ѥޤ @xref{MIT-pthreads}. - -⤷configure ˡʲΥ顼Фʤ顧 - -@example -checking for restartable system calls... configure: error can not run test -programs while cross compiling -@end example - -ϥѥ顼Υ󥹥ȡǤʤˤְäƤޤ! -ξ硢ʤϡ꿷Сإѥ顼򥢥åץ졼ɤ٤Ǥ -ʲιԤ @code{config.cache} եɲä뤳Ȥˤäơ -褷Ƥ⤫ޤޤ - -@example -ac_cv_sys_restartable_syscalls=$@{ac_cv_sys_restartable_syscalls='no'@} -@end example - - -⤷ʤ SPARC Solaris ѤƤʤ顢 -@code{gcc} 2.95.2 侩ޤ - @uref{ttp://gcc.gnu.org/}. ǸĤޤ -@code{egs} 1.1.1 @code{gcc} 2.8.1 SPARC ǤϴưʤȤա - -@code{gcc} 2.95.2 Ѥ侩 @code{configure} : - -@example -shell> CC=gcc CFLAGS="-O6" \ - CXX=gcc CXXFLAGS="-O6 -felide-constructors -fno-exceptions -fno-rtti" \ - ./configure --prefix=/usr/local/mysql --with-low-memory -@end example - -⤷ Sun Workshop 4.2 compiler Ѥʤ顢@code{configure} ʲΤ褦ˤޤ - -CC=cc CFLAGS="-xstrconst -Xa -xO4 -native -mt" CXX=CC CXXFLAGS="-xO4 -native -noex -mt" ./configure --prefix=/usr/local/mysql - -@example -shell> CC=cc CFLAGS="-Xa -fast -xO4 -native -xstrconst -mt" \ - CXX=CC CXXFLAGS="-noex -XO4 -mt" \ - ./configure -@end example - -@code{configure} ץȤμιԤ - -@example -#if !defined(__STDC__) || __STDC__ != 1 -@end example - -ʲѤޤ: - -@example -#if !defined(__STDC__) -@end example - -⤷ @code{-Xc} ץ @code{__STDC__} ͭˤ硢 -Sun compiler Solaris @file{pthread.h} إåեѤ -ѥ뤹뤳ȤǤޤ -ϥΥХǤ(󥯥롼ɥե뤫ѥ顼ΥХ) - -⤷ @code{mysqld} ư˰ʲΥ顼Ф硢 -ޥåɤ򳰤(ץ @code{-mt} ) Sun compiler Ȥä - @strong{MySQL} 򥳥ѥ뤷ľƤ - -@example -libc internal error: _rmutex_unlock: rmutex not held -@end example - -@code{-mt} @code{CFLAGS} @code{CXXFLAGS} ˲äޤ - -@code{gcc} @strong{MySQL} 򥳥ѥ뤹Ȥ˰ʲΥ顼Ф硢 - @code{gcc} ʤ Solaris ΥСѤĴƤޤ - -@example -shell> gcc -O3 -g -O2 -DDBUG_OFF -o thr_alarm ... -./thr_alarm.c: In function `signal_hand': -./thr_alarm.c:556: too many arguments to function `sigwait' -@end example - -ξ硢 @code{gcc} ǥѥ뤷ޤ -ʤȤ Solaris 2.5 ǤϡۤȤɤ @code{gcc} ΥХʥΥС󤬸Ť -åɤѤץˤϤΥ󥯥롼ɥեϻȤޤ - -Solaris ƥå󥯤Υƥ饤֥꡼ѰդƤޤ -(@code{libpthreads} and @code{libdl}) -Τᡢ@code{--static} ץ @strong{MySQL} 򥳥ѥǤޤ -⤷ߤ硢ʲΥ顼ˤʤޤ - -@example -ld: fatal: library -ldl: not found -@end example - -⤷¿Υץ® @code{mysqld} ³ߤ硢 - @strong{MySQL} ˰ʲΤ褦˥顼Фޤ: - -@example -Error in accept: Protocol error -@end example - -С @code{--set-variable back_log=50} ץǵưСнǤǤ礦 - -⤷ʬ @strong{MySQL} 饤ȥץ󥯤 -¹Ի˰ʲΤ褦˥顼Ф硧 - -@example -ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory -@end example - -ϰʲΤɤ줫DzǤޤ - -@table @bullet -@item -ʲΥե饰ǥ饤Ȥ󥯤ޤ(@code{-Lpath} ): -@code{-Wl,r/full-path-to-libmysqlclient.so} -@item -@code{libmysqclient.so} @file{/usr/lib} ˥ԡޤ -@item -@tindex LD_RUN_PATH environment variable -@tindex Environment variable, LD_RUN_PATH -@code{LD_RUN_PATH} Ķѿ @file{libmysqlclient.so} ¸ߤȤ -åȤ塢饤Ȥ¹Ԥޤ -@end table - -@code{--with-libwrap} configure ץѻ@code{libwrap.a} ɬ -פȤ饤֥ޤɬפޤ: - -@example ---with-libwrap="/opt/NUtcpwrapper-7.6/lib/libwrap.a -lnsl -lsocket -@end example - -configure @strong{MySQL} @code{-lz} Υ󥯤ߡʤ -󥹥ȡ뤷ƤʤȤ꤬ϡĤ褬ޤ: - -@itemize @bullet -@item -̿ץȥѤǤ褦ˤ硢ftp.gnu.org zlib -ꤷƥ󥹥ȡ뤹ɬפޤ -@item -@code{--with-named-z-libs=no} Ĥ configure Ԥʤޤ -@end itemize - -@node Solaris 2.7, Solaris x86, Solaris, Source install system issues -@subsection Solaris 2.7 notes - -̾Solaris 2.6 ΥХʥ Solaris 2.7 ǻѤǤޤ -ۤȤɤ Solaris 2.6 Solaris 2.7 ŬѤǤޤ - -Solaris 2.7 ϡ󥯥롼ɥեˤĤХޤ -@code{gcc} ǰʲΤ褦ʥ顼Ф硧 - -@example -/usr/include/widec.h:42: warning: `getwc' redefined -/usr/include/wchar.h:326: warning: this is the location of the previous -definition -@end example - -ʲΤ褦ˤƲ򤷤ޤ - -@code{/usr/include/widec.h} @code{.../lib/gcc-lib/os/gcc-version/include} ˥ԡ -41 ܤѹ: - -@example -ѹ - -#if !defined(lint) && !defined(__lint) - -ѹ塧 - -#if !defined(lint) && !defined(__lint) && !defined(getwc) -@end example - -ˡ@file{/usr/include/widec.h} ľѹƤ⤫ޤޤ -ɤˡˤƤ⡢եϡ@file{config.cache} -ä @code{configure} Ƽ¹ԤʤƤϤʤޤ - -@code{make} ¹Ի˰ʲΤ褦ʥ顼ˤʤä硢@code{configure} - @file{curses.h} ե򸡽ФǤƤޤ ( @code{/usr/include/widec.h} -顼Τˤޤ): - -@example -In file included from mysql.cc:50: -/usr/include/term.h:1060: syntax error before `,' -/usr/include/term.h:1081: syntax error before `;' -@end example - -褹ˤϡʲΤĤԤޤ - -@itemize @bullet -@item -ҤȤꡢ@file{/usr/include/widec.h} configure Ƽ¹Ԥޤ -@item -@code{#define HAVE_TERM} Ԥ @file{config.h} ե뤫ä -@code{make} Ƽ¹Ԥޤ -@item -@code{CFLAGS=-DHAVE_CURSES CXXFLAGS=-DHAVE_CURSES ./configure} ȥե㡼ޤ -@end itemize - -@node Solaris x86, SunOS, Solaris 2.7, Source install system issues -@subsection Solarix x86 notes - -@code{gcc} @code{egcs} Solaris x86 ǻѤ硢load ˥פ硢 -ʲΤ褦 @code{configure} ޤ: - -@example -shell> CC=gcc CFLAGS="-O6 -fomit-frame-pointer" \ - CXX=gcc \ - CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" \ - ./configure --prefix=/usr/local/mysql -@end example - - @code{libstdc++} 饤֥꡼ C++ 򤷤ޤ - -⤷줬ʤ硢ǥХå⡼ɤǥѥ뤷 -ǥХåΥȥ졼ե񤭽Ф褦ˤƵư뤫 -@code{gdb} ѤƵưƤ -@xref{Debugging server}. - -@node SunOS, Linux, Solaris x86, Source install system issues -@subsection SunOS 4 notes - -SunOS 4 Ǥ MIT-pthreads ɬפǤ -Τˡ GNU @code{make} @strong{MySQL} Υѥɬפˤʤޤ - -Ĥ SunOS 4 Ǥ dynamic libraries @code{libtool} ꤬ޤ -򤱤뤿ˡʲΤ褦ˤ @code{configure} ޤ - -@example -shell> ./configure --disable-shared --with-mysqld-ldflags=-all-static -@end example - -@code{readline} ΥѥΥ˥󥰤Фޤ -̵뤷ƹޤ - -@code{mysqld} 򥳥ѥ뤹 -Ĥ @code{implicit declaration of function} ˥󥰤Ǥޤ -̵뤷ƹޤ - -@node Linux, Alpha-DEC-Unix, SunOS, Source install system issues -@subsection Linux notes (all Linux versions) - -Linux Ǥ @strong{MySQL} LinuxThreads Ѥޤ -⤷ @code{glibc2} ʤŤ Linux ѤƤ硢 -@strong{MySQL} Υѥˡ -LinuxThreads 򥤥󥹥ȡ뤷ʤФʤޤ -@uref{http://www.mysql.com/Downloads/Linux} - -: 2.1.1 Ȥ @code{glibc} С -@code{pthread_mutex_timedwait} ̿ŪʥХޤ -@code{INSERT DELAYED} Ԥʤ˻Ѥޤ@code{INSERT DELAYED} -Ѥ硢Υѥå glibc 饤֥ɲ@strong{ʤФʤ -ޤ}: -@uref{http://www.mysql.com/Downloads/Patches/glibc-pthread_cond_timedwait.patch} -@strong{MySQL} 3.23.7 @strong{MySQL} 3.22.32 ϤΥХΰŪʲ -ޤǤޤ - -1000ʾƱ³ѤͽǤСLinuxThreads ˤĤѹ -򤷤ơƥѥ뤷MySQL 򿷤 libthread.a Ѥ褦˺ƥ -󥯤ɬפޤsysdeps/unix/sysv/linux/bits/local_lim.h -PTHREAD_THREADS_MAX 4096 äinternals.h STACK_SIZE -256 KB ˸Ƥ: STACK_SIZE ǥեȤ 2MB Ǥ -硢MySQL 1000 ٤³ǰǤʤʤޤ - -glibc 2.1.3-65 ʹߤξ硢STACK_SIZE 䤹ɬפϤޤ; -@code{mysqld} @code{thread_stack} ͤѹǤޤ - -If you use a lot of concurrent connections, you may suffer from a 2.2 -kernel "feature" that penalizes a process for forking or cloning a child -in an attempt to prevent a fork bomb attack. This will cause MySQL not -to scale well as you increase the number of concurrent clients. On -single CPU systems, we have seen this manifested in a very slow thread -creation - which means it may take a long time to connect to MySQL ( as -long as 1 minute), and it may take just as long to shut it down. On -multiple CPU systems, we have observed a gradual drop in query speed as -the number of clients increases. In the process of trying to find a -solution, we have received a kernel patch from one of our users, who -claimed it made a lot of difference for his site. We have done some -limited testing in which the patch greatly improved the scalabitility of -MySQL. The patch is available -@uref{http://www.mysql.com/Downloads/Patches/linux-fork.patch,here} - be -warned, though, that we assume no reponsibility for any damage that this -patch could do - use at your own risk. We have also been told by the -Linux kernel developers that this problem is fixed in 2.4, although we -have not yet done any testing. - -⤷ @code{mysqld} ưʤäꡢ @code{mysql_install_db} ưʤ硢 -ʲɤߤƤ -LinuxThreads @code{libc}/@code{glibc} 饤֥꡼Τ Linux ƥ˵ޤ - @strong{MySQL} ư뤿˴ñˡ¿ޤ -ִñˡϡХʥˤʤä @strong{MySQL} (not the RPM) Ѥ뤳ȤǤ -ΥСΥХʥϡʤȤѥ뤷Τ 10% ۤ®Ǥ礦 -@xref{Compile and link options}. - -ΤƤȤơХʥۤ @code{libc5} θŤ Linux ƥ -(RedHat 4.x , Slackware 3.6ʲ, Debian 1.3 bo ʲʤ) -ǻѤȡۥ̾̿Ūʥ顼Фޤ -@xref{Binary notes-Linux}. - -@code{myisamchk} @code{libc.so.5.3.12} ǻѤȥϥ󥰤ޤ. -ǿ @code{libc} ˥åץ졼ɤƤ - -LinuxThreads ѤƤ硢㣳ĤΥץޤ -ϼ¥åɤǡĤ LinuxThreads ޥ͡㡼Τˡ -Ĥ³Υϥɥˡ⤦ҤȤĤϥ顼ȥʥΥϥɥǤ - -: linux ͥ linuxthread 饤֥ϥǥեȤǤ 1024 -ɤĤȤǤޤϥѥåŬѤƤʤƥǤ -MySQL ؤ³Ϻ 1021 ǤȤȤ̣ޤڡ -@uref{http://www.volano.com/linuxnotes.html} Ϥ¤ɤΤ褦˲ -뤫ξ󤬴ޤޤƤޤ - -⤷ @code{mysqld} ǡץ @code{ps} ʤɤǤߤȻǤ褦Ǥ, -̾盧 @strong{MySQL} Х줿ơ֥äƤޤ -@xref{Crashing}. - -LinuxThreads ѤƤ @code{mysqladmin shutdown} ưʤ硢 -LinuxThreads 0.7.1 ʾ˥åץ졼ɤƤ - -RedHat ѤƤ, ʲΤ褦ʥ顼Ф硧 - -@example -/usr/bin/perl is needed... -/usr/sh is needed... -/usr/sh is needed... -@end example - -ξ硢 @code{rpm} ΥС - @file{rpm-2.4.11-1.i386.rpm} @file{rpm-devel-2.4.11-1.i386.rpm} (ʾ) - ˤʤƤϤޤ - -RedHat 4.2 ϰʲ饢åץ졼ɤǤޤ -@uref{ftp://ftp.redhat.com/updates/4.2/i386}. -뤤¾ξ -@uref{http://www.sunsite.unc.edu/pub/Linux/distributions/redhat/code/rpm/} - -⤷ @strong{MySQL} 饤Ȥ¹ԤưʲΥ顼ˤʤä硧 - -@example -ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory -@end example - -ʲˡDzǤޤ - -@itemize @bullet -@item -饤ȤʲΥե饰(@code{-Lpath}Τ)󥯤ޤ -@code{-Wl,r/path-libmysqlclient.so} -@item -@code{libmysqclient.so} @file{/usr/lib} ˥ԡޤ -@item -@tindex LD_RUN_PATH environment variable -@tindex Environment variable, LD_RUN_PATH -@code{LD_RUN_PATH} Ķѿ @file{libmysqlclient.so} ¸ߤꤷޤ -(饤Ȥ¹Ԥꤷޤ) -@end itemize - -ٻ̥ѥ @code{(fcc / FCC)} ѤƤ硢@strong{MySQL} -ΥѥˤĤ꤬ޤLinux إåեϤȤƤ -@code{gcc} ظǤ뤿Ǥ - - @code{configure} Ԥ @code{fcc/FCC} ưޤ: - -@example -CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE -DCONST=const -DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib -K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=const -Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO '-D_EXTERN_INLINE=static __inline'" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-low-memory -@end example - -@menu -* Linux-x86:: Linux-x86 notes -* Linux-RedHat50:: RedHat 5.0 notes -* Linux-RedHat51:: RedHat 5.1 notes -* Linux-SPARC:: Linux-Sparc notes -* Linux-Alpha:: Linux-Alpha notes -* MKLinux:: MkLinux notes -* Qube2:: Qube2 Linux notes -@end menu - -@node Linux-x86, Linux-RedHat50, Linux, Linux -@subsubsection Linux-x86 notes - -@strong{MySQL} @code{libc} 5.4.12 ʾ夬ɬפǤ@code{libc} 5.4.46 ưޤ -@code{glibc} 2.0.6 ʾǤưޤ -@code{glibc} RPM ˤϤĤ꤬ꡢåץǡȤåƤ -@code{glibc} 2.0.7-19 2.0.7-29 RPM ưޤ - -Ť Linux ʪǤϡ@code{configure} ˰ʲΤ褦ʥ顼Ф뤫⤷ޤ - -@example -Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file. -See the Installation chapter in the Reference Manual. -@end example - - @code{_P} ޥĤΥƤʤǡ -Υ顼åΤ褦н褷Ƥ - -ʲΤ褦ʥ˥󥰤̵뤷ƹޤ - -@example -mysqld.cc -o objs-thread/mysqld.o -mysqld.cc: In function `void init_signals()': -mysqld.cc:315: warning: assignment of negative value `-1' to `long unsigned int' -mysqld.cc: In function `void * signal_hand(void *)': -mysqld.cc:346: warning: assignment of negative value `-1' to `long unsigned int' -@end example - -Debian GNU/Linux Ǥϡ@strong{MySQL} ޥεưΩ뤿ˤϡ -ʲΤ褦ˤޤ - -@example -shell> cp support-files/mysql.server /etc/init.d/mysql.server -shell> /usr/sbin/update-rc.d mysql.server defaults 99 -@end example - -@code{mysql.server} ץȤ @strong{MySQL} 򥤥󥹥ȡ뤷 - @file{share/mysql} directory ˤޤ -뤤ϡ @strong{MySQL} Υ @file{support-files} ǥ쥯ȥˤޤ - - -@code{mysqld} Ĥͤ˥Ȼ˥Ϥ硢 -Ť @file{/lib/libc.a} ѤƤ뤫⤷ޤ -@file{sql/mysqld} õơ @code{make install} ƤߤƤ -ϤĤ Slackware 𤵤줿ݤǤ -RedHat 5.0 @code{glibc} ΥСˤä꤬ȯޤ -@xref{Linux-RedHat50}. - -⤷ @code{mysqld} 󥯤˰ʲΤ褦ʥ顼Ф硢 - @file{libg++.a} 󥹥ȡ뤵Ƥޤ - -@example -/usr/lib/libc.a(putc.o): In function `_IO_putc': -putc.o(.text+0x0): multiple definition of `_IO_putc' -@end example - -@file{libg++.a} λѤ򤱤ˤϡ @code{configure} ʲΤ褦ˤޤ - -@example -shell> CXX=gcc ./configure -@end example - -@node Linux-RedHat50, Linux-RedHat51, Linux-x86, Linux -@subsubsection RedHat 5.0 notes - -⤷ RedHat @strong{MySQL} ꤬硢ޤ @code{glibc} ΥС򿷤ΤˤƤ - -RedHat Υեѥå(including @code{glibc-2.0.7-19} and @code{glibc-devel-2.0.7-19}) -򥤥󥹥ȡ뤷Ƥʤ顢 @strong{MySQL} ʤưϤǤ - -@code{glibc} 2.0.5 ˤ @code{pthread_key_create} ѿʬ˥Хꡢ -åץǡȤɬפǤ@code{glibc} 2.0.5 Ѥ硢 -ƥå󥯤ƺ줿 @strong{MySQL} ХʥʪѤ٤Ǥ -饳ѥ뤷硢 @uref{http://www.mysql.com/Downloads/Linux} ˤ -LinuxThreads νǤ򥤥󥹥ȡ뤹뤫 -뤤 @code{glibc} С󥢥åפʤƤϤʤޤ - -⤷ @code{glibc} or LinuxThreads ΥСΤΤȡ - @code{mysqld} ϥͥ٤˥å夷ޤ -㤨С@code{mysqladmin version} @code{mysqld} ˥å夷ޤ - -ޤΤ饤֥꡼ѤƤȡ @code{mysqld} ϵư˥å夷ޤ -Ĥ Linux systems ǤϡʲΤ褦ˤ configure Ǥ򤱤뤳ȤǤޤ - -@example -shell> ./configure --with-mysqld-ldflags=-all-static -@end example - -RedHat 5.0 Ǥϡ@code{glibc} 2.0.7-19 RPM ñ˥󥹥ȡǤޤΤǡ -󥹥ȡ塢@code{--with-mysqld-ldflags=-all-static} ʤ @code{configure} Ǥޤ - -@code{glibc} 2.0.7 ΥФѥå -@example -@uref{http://www.mysql.com/Download/Linux/glibc-2.0.7-total-patch.tar.gz} -@end example - ˤޤ -Υѥå @strong{MySQL} ƥȤ줿ѥåǡñŬѤǤޤ - -⤷ @strong{MySQL} ۻ˥å夹硢 @strong{MySQL} -ХʥɤƤߤƤϥƥå󥯤ǺƤꡢ -饤֥꡼ξͤ򤱤뤳ȤǤƤ Linux ưϤǤ - -@strong{MySQL} ϥǥХåΤȥ졼ե˾񤭽ФȤǤޤ -褹뤿˥ҥȤˤʤ¿Ϥޤ -@xref{Debugging server}. - -@node Linux-RedHat51, Linux-SPARC, Linux-RedHat50, Linux -@subsubsection RedHat 5.1 notes - -RedHat 5.1 @code{glibc} (@code{glibc} 2.0.7-13) ϥ꡼꡼ޤ -@code{glibc} 2.0.7-19 ˥åץ졼ɤʤƤϤʤޤ -뤤ϡХʥۤ @code{mysqld} Ѥ뤫Ǥ -⤷Ԥʤä硢꡼Ϣ꤬ȯޤ(out of memory, etc.,etc.) -¿ξʲΤ褦ˡ - -@example -Can't create a new thread (errno 11). If you are not out of available -memory, you can consult the manual for any possible OS dependent bug -@end example - -@code{glibc} 2.0.7-19 ˥åץ졼ɸϡ@strong{MySQL} -ʥߥå󥯻(ǥե) configure Ǥޤ -@code{glibc} 2.0.7-19 򥽡饤󥹥ȡ뤷ʤ¤ꡢ -@code{--with-mysqld-ldflags=-all-static} ץ @code{configure} @strong{ѤǤޤ} - -@code{glibc} ΥС @code{rpm -q glibc} dzǧǤޤ - -@node Linux-SPARC, Linux-Alpha, Linux-RedHat51, Linux -@subsubsection Linux-SPARC notes - -Ĥߴؿ, @code{readdir_r()} ޤ -θȤơ@code{SHOW DATABASES} ˶֤ޤ - configure 塢ѥ뤹ˡ -@file{config.h} @code{HAVE_READDIR_R} ȤDz褷ޤ - -¾Ĥϡʤ Linux ˥ѥåƤɬפޤ -ѥå @uref{http://www.mysql.com/patches/Linux-sparc-2.0.30.diff} ˤޤ -Υѥåϡ@code{vger.rutgers.edu} ˤ @file{sparclinux-2.0.30.tar.gz} ѤǤ -( 2.0.30 Ȥϰ㤤ޤѥå2.0.30Ƥʤ褦) - LinuxThreads 0.6 ʾˤʤƤϤʤޤ - - @email{jacques@@solucorp.qc.ca} 󤻤ޤ - -@node Linux-Alpha, MKLinux, Linux-SPARC, Linux -@subsubsection Linux-Alpha notes - -@strong{MySQL} 3.23.12 Linux-Alpha Ǻǽ˥ƥȤ줿СǤ -⤷ @strong{MySQL} Linux-Alpha ǻѤȹͤʤ顢 -ΥС꿷ΤѤޤ - -Linux-Alpha Ǥΰ礭ϡΥץåȥե @code{glibc} -ޤĤ꤬뤳ȤǤ ǿ @code{glibc} 뤳Ȥ -ϤƤ - -We have tested @strong{MySQL} on Alpha with our benchmarks + test suite and -it appears to work nicely. The main thing we haven't yet had time to test -is how things works with many concurrent users. - -When we compiled @strong{MySQL} we where using SuSE 6.3, kernel 2.2.13-SMP, -egcs 1.1.2 and libc-2.1.2-28. - -We used the following configure line: - -@example -CFLAGS="-O6 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --disable-shared -@end example - -If you have access to Compaq's C compiler, the following configure line -will give you about 9 % more performance: -@example -CC=ccc CFLAGS="-fast -O3 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -mcpu=ev6 -Wa,-mev6" CXXLDFLAGS='/usr/lib/compaq/libots-2.2.7/libots.so /usr/lib/compaq/cpml-5.0.0/libcpml_ev6.a' ./configure --prefix=/usr/local/mysql --disable-shared -@end example - -Note that the last example assumes your are using an Alpha EV6 processor. - -Some known problems when running @strong{MySQL} on Linux-Alpha: - -@itemize @bullet -@item -If you create many files ( > 10000) in one directory (as done by the -@code{test-create} in the @strong{MySQL} benchmarks, mysqld may report -the error @code{Can't create/write to file '...' (Errcode: 12)}. This -is probably a bug in the Linux-Alpha kernel. -@item -Debugging threaded applications like @strong{MySQL} will not work with -@code{gdb 4.18}. You should download and use gdb 5.0 instead! -@item -If you try linking mysqld staticly, the resulting image will core dump -at start. In other words, @strong{DON'T} use -@code{--with-mysqld-ldflags=-all-static} -@end itemize - -We don't yet know if the following old information is still relevant, so we -leave this here until we have had time to test Linux-Alpha properly. - -⤷ʥ꤬ (@strong{MySQL} dies unexpectedly -under high load) OS ȥåɤΥХǤ礦 -ξ硢@strong{MySQL} 򥷥ʥѤʤ褦ˡconfigure ˻Ǥޤ - -@example -shell> CFLAGS=-DDONT_USE_THR_ALARM \ - CXXFLAGS=-DDONT_USE_THR_ALARM \ - ./configure ... -@end example - - @strong{MySQL} Υѥեޥ󥹤˱ƶޤ󤬡 -@code{mysqladmin kill} or @code{mysqladmin shutdown} Ѥơ -³ ``sleeping'' ˤʤäƤ륯饤Ȥ kill Ǥޤ -ΥޥɤȯԤȤΥ饤Ȥϻˤޤ - - -@node MKLinux, Qube2, Linux-Alpha, Linux -@subsubsection MkLinux notes - -@strong{MySQL} Ϻǿ @code{glibc} Ѥ MkLinux ưޤ -(@code{glibc} 2.0.7 ǥƥȤޤ). - -@node Qube2, , MKLinux, Linux -@subsubsection Qube2 Linux notes - -Qube2 (Linux Mips) @strong{MySQL} ưˤϡ -ǿ @code{glibc} 饤֥ǤʤƤϤʤޤ(@code{glibc-2.0.7-29C2} ư뤳ȤʬäƤޤ) ơ @code{egcs} C++ compiler (@code{egcs-1.0.2-9}, @code{gcc 2.95.2} ʾ) ѤʤƤϤʤޤ - - -@node Alpha-DEC-Unix, Alpha-DEC-OSF1, Linux, Source install system issues -@subsection Alpha-DEC-Unix notes - -When compiling threaded programs under Digital UNIX, the documentation -recommends the @code{-pthread} option for @code{cc} and @code{cxx} and the -libraries @code{-lmach -lexc} (in addition to @code{-lpthread}). -You should run @code{configure} something like this: - -@example -shell> CC="cc -pthread" CXX="cxx -pthread -O" \ - ./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc" -@end example - -When compiling @code{mysqld}, you may see a couple of warnings like this: - -@example -mysqld.cc: In function void handle_connections()': -mysqld.cc:626: passing long unsigned int *' as argument 3 of -accept(int,sockadddr *, int *)' -@end example - -You can safely ignore these warnings. They occur because @code{configure} -can't detect warnings, only errors. - -If you start the server directly from the command line, you may have problems -with it dying when you log out. (When you log out, your outstanding processes -receive a @code{SIGHUP} signal.) If so, try starting the server like this: - -@example -shell> nohup mysqld [options] & -@end example - -@code{nohup} causes the command following it to ignore any @code{SIGHUP} -signal sent from the terminal. Alternatively, start the server by running -@code{safe_mysqld}, which invokes @code{mysqld} using @code{nohup} for you. - -@node Alpha-DEC-OSF1, SGI-Irix, Alpha-DEC-Unix, Source install system issues -@subsection Alpha-DEC-OSF1 notes - -If you have problems compiling and have DEC @code{CC} and @code{gcc} -installed, try running @code{configure} like this: - -@example -shell> CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \ - ./configure --prefix=/usr/local/mysql -@end example - -If you get problems with the @file{c_asm.h} file, you can create and use -a 'dummy' @file{c_asm.h} file with: - -@example -shell> touch include/c_asm.h -shell> CC=gcc CFLAGS=-I./include \ - CXX=gcc CXXFLAGS=-O3 \ - ./configure --prefix=/usr/local/mysql -@end example - -On OSF1 V4.0D and compiler "DEC C V5.6-071 on Digital UNIX V4.0 (Rev. 878)" -the compiler had some strange behavior (undefined @code{asm} symbols). -@code{/bin/ld} also appears to be broken (problems with @code{_exit -undefined} errors occuring while linking @code{mysqld}). On this system, we -have managed to compile @strong{MySQL} with the following @code{configure} -line, after replacing @code{/bin/ld} with the version from OSF 4.0C: - -@example -shell> CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql -@end example - -With the Digital compiler "C++ V6.1-029", the following should work: - -@example -CC=cc -pthread -CFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host -CXX=cxx -pthread -CXXFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host -export CC CFLAGS CXX CXXFLAGS -./configure --prefix=/usr/mysql/mysql --with-low-memory --enable-large-files --with-mysqld-ldflags=-all-static --disable-shared --with-named-thread-libs="-lmach -lexc -lc" -@end example - -In some versions of OSF1, the @code{alloca()} function is broken. Fix -this by removing the line in @file{config.h} that defines @code{'HAVE_ALLOCA'}. - -The @code{alloca()} function also may have an incorrect prototype in -@code{/usr/include/alloca.h}. This warning resulting from this can be ignored. - -@code{configure} will use the following thread libraries automatically: -@code{--with-named-thread-libs="-lpthread -lmach -lexc -lc"}. - -When using @code{gcc}, you can also try running @code{configure} like this: - -@example -shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure .... -@end example - -If you have problems with signals (@strong{MySQL} dies unexpectedly -under high load) you may have found an OS bug with threads and -signals. In this case you can tell @strong{MySQL} not to use signals by -configuring with: - -@example -shell> CFLAGS=-DDONT_USE_THR_ALARM \ - CXXFLAGS=-DDONT_USE_THR_ALARM \ - ./configure ... -@end example - -This doesn't affect the performance of @strong{MySQL}, but has the side -effect that you can't kill clients that are ``sleeping'' on a connection with -@code{mysqladmin kill} or @code{mysqladmin shutdown}. Instead, the client -will die when it issues its next command. - -With @code{gcc} 2.95.2, you will probably run into the following compile error: - -@example -sql_acl.cc:1456: Internal compiler error in `scan_region', at except.c:2566 -Please submit a full bug report. -@end example - -To fix this you should change to the @code{sql} directory and do a 'cut -and paste' of the last @code{gcc} line, but change @code{-O3} to @code{-O0} (or -@code{-O0} immediately after @code{gcc} if you don't have any @code{-O} -option on your compile line. After this is done you can just change back to -the top level directly and run @code{make} again. - -@node SGI-Irix, FreeBSD, Alpha-DEC-OSF1, Source install system issues -@subsection SGI-IRIX notes - -If you are using Irix 6.5.3 or newer @code{mysqld} will only be able to -create threads if you run it as a user with @code{CAP_SCHED_MGT} -privileges (like @code{root}) or give the @code{mysqld} server this privilege -with the following shell command: - -@example -shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld -@end example - -You may have to undefine some things in @file{config.h} after running -@code{configure} and before compiling. - -In some Irix implementations, the @code{alloca()} function is broken. If the -@code{mysqld} server dies on some @code{SELECT} statements, remove the lines -from @file{config.h} that define @code{HAVE_ALLOC} and @code{HAVE_ALLOCA_H}. -If @code{mysqladmin create} doesn't work, remove the line from -@file{config.h} that defines @code{HAVE_READDIR_R}. You may have to remove -the @code{HAVE_TERM_H} line as well. - -SGI recommends that you install all of the patches on this page as a set: -http://support.sgi.com/surfzone/patches/patchset/6.2_indigo.rps.html - -At the very minimum, you should install the latest kernel rollup, the -latest @code{rld} rollup, and the latest @code{libc} rollup. - -You definately need all the POSIX patches on this page, for pthreads support: - -http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html - -If you get the something like the following error when compiling -@file{mysql.cc}: - -@example -"/usr/include/curses.h", line 82: error(1084): invalid combination of type -@end example - -Then type the following in the top-level directory of your @strong{MySQL} -source tree: - -@example -shell> extra/replace bool curses_bool < /usr/include/curses.h > include/curses.h -shell> make -@end example - -There have also been reports of scheduling problems. If only one thread is -running, things go slow. Avoid this by starting another client. This may lead -to a 2-to-10-fold increase in execution speed thereafter for the other -thread. This is a poorly-understood problem with Irix threads; you may have -to improvise to find solutions until this can be fixed. - -If you are compiling with @code{gcc}, you can use the following -@code{configure} command: - -@example -shell> CC=gcc CXX=gcc CXXFLAGS=-O3 \ - ./configure --prefix=/usr/local/mysql --with-thread-safe-client --with-named-thread-libs=-lpthread -@end example - -@node FreeBSD, NetBSD, SGI-Irix, Source install system issues -@subsection FreeBSD notes - -FreeBSD 3.x is recommended for running @strong{MySQL} since it the thread package -is much more integrated. - -Ǥñ˥󥹥ȡ뤹ˡϡ@uref{http://www.freebsd.org} -mysql-server mysql-client ports Ѥ뤳ȤǤ -@uref{http://www.freebsd.org} - -ϰʲΤ褦⤿餷ޤ -@itemize @bullet -@item -ץƥޥ줿 @strong{MySQL} ư -@item -ư configuration build -@item -ȥåѤΥץȤ /usr/local/etc/rc.d ˥󥹥ȡ -@item -Ability to see which files that are installed with pkg_info -L. And to -remove them all with pkg_delete if you no longer want @strong{MySQL} on that -machine. -@end itemize - -FreeBSD 2.x Ǥ MIT-pthreads 򡢤 versions 3 ʾǤϡ -ͥƥ֤ΥåɤѤƤ -ǶΤĤ 2.2.x Ǥϥͥƥ֤Υå ưǽǤ -mysqld ȤȤ꤬ޤ - -̾μ¤ˤƤƤ Ǥʤȡmysqld ³ݡ -̾ˤȤƤ֤ꡢ³˼ԤǤ礦 - -μ¤ @file{/etc/hosts} ե @code{localhost} ϿƤ褦 -Ƥ (Ǥʤȡǡ١ؤ³꤬Фޤ) - @file{/etc/hosts} եϡʲιԤϤޤ٤Ǥ - -@example -127.0.0.1 localhost localhost.your.domain -@end example - -⤷ @code{configure} MIT-pthread Ѥʬä硢 -MIT-pthreads notes ɤ٤Ǥ @xref{MIT-pthreads}. - -If you get an error from @code{make install} that it can't find -@file{/usr/include/pthreads}, @code{configure} didn't detect that you need -MIT-pthreads. This is fixed by executing these commands: - -@example -shell> rm config.cache -shell> ./configure --with-mit-threads -@end example - -FreeBSD @code{make} ο񤤤 GNU @code{make} Ⱦ㤤ޤ -⤷ @code{make} ˤ꤬Фʤ顢 GNU @code{make} -󥹥ȡ뤹٤Ǥ - -FreeBSD ǤϡǥեȤΥեϥɥξͤȤƤ⾯ʤ -ͤǤ뤳ȤΤƤޤ@xref{Not enough file handles}. -safe_mysqld ulimit -n ΥȤ򳰤/etc/login.conf ե -mysqld 桼ͤäޤ -(/etc/login.conf ѹκݤ cap_mkdb /etc/login.conf ǺƹۤɬפǤ) -⤷ǥեȤѤʤСΥ桼 password ե -Ŭڤ Class Ϳ뤳ȤǤ⡢ѹǽˤʤޤ(use: chpass mysqld-user-name) - -⤷ @strong{MySQL} ߻꤬ʤ顢 - @code{TZ} ĶѿꤷʤƤϤʤޤ @xref{Environment variables}. - - -ǰꤷƥʤ顢 @code{-STABLE} Υͥ -ѤƤ - - -@node NetBSD, OpenBSD, FreeBSD, Source install system issues -@subsection NetBSD notes - -To compile on NetBSD you need GNU @code{make}. Otherwise the compile will crash -when @code{make} tries to run @code{lint} on C++ files. - -@node OpenBSD, BSDI, NetBSD, Source install system issues -@subsection OpenBSD 2.5 notes - -On OpenBSD 2.5, you can compile @strong{MySQL} with native threads with the -following options: - -@example -CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no -@end example - -@node BSDI, SCO, OpenBSD, Source install system issues -@subsection BSD/OS notes - -@menu -* BSDI2:: BSD/OS 2.x notes -* BSDI3:: BSD/OS 3.x notes -* BSDI4:: BSD/OS 4.x notes -@end menu - -@node BSDI2, BSDI3, BSDI, BSDI -@subsubsection BSD/OS 2.x notes - -If you get the following error when compiling @strong{MySQL}, your -@code{ulimit} value for virtual memory is too low: - -@example -item_func.h: In method `Item_func_ge::Item_func_ge(const Item_func_ge &)': -item_func.h:28: virtual memory exhausted -make[2]: *** [item_func.o] Error 1 -@end example - -Try using @code{ulimit -v 80000} and run @code{make} again. If this -doesn't work and you are using @code{bash}, try switching to @code{csh} -or @code{sh}; some BSDI users have reported problems with @code{bash} -and @code{ulimit}. - -If you are using @code{gcc}, you may also use have to use the -@code{--with-low-memory} flag for @code{configure} to be able to compile -@file{sql_yacc.cc}. - -⤷ @strong{MySQL} ߻꤬ʤ顢 - @code{TZ} ĶѿꤷʤƤϤʤޤ @xref{Environment variables}. - -@node BSDI3, BSDI4, BSDI2, BSDI -@subsubsection BSD/OS 3.x notes - -Upgrade to BSD/OS 3.1. If that is not possible, install BSDIpatch M300-038. - -Use the following command when configuring @strong{MySQL}: - -@example -shell> env CXX=shlicc++ CC=shlicc2 \ - ./configure \ - --prefix=/usr/local/mysql \ - --localstatedir=/var/mysql \ - --without-perl \ - --with-unix-socket-path=/var/mysql/mysql.sock -@end example - -The following is also known to work: - -@example -shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 \ - ./configure \ - --prefix=/usr/local/mysql \ - --with-unix-socket-path=/var/mysql/mysql.sock -@end example - -You can change the directory locations if you wish, or just use the -defaults by not specifying any locations. - -If you have problems with performance under heavy load, try using the -@code{--skip-thread-priority} option to @code{safe_mysqld}! This will run -all threads with the same priority; on BSDI 3.1, this gives better -performance (at least until BSDI fixes their thread scheduler). - -If you get the error @code{virtual memory exhausted} while compiling, -you should try using @code{ulimit -v 80000} and run @code{make} again. -If this doesn't work and you are using @code{bash}, try switching to -@code{csh} or @code{sh}; some BSDI users have reported problems with -@code{bash} and @code{ulimit}. - -@node BSDI4, , BSDI3, BSDI -@subsubsection BSD/OS 4.x notes - -BSDI 4.x has some thread related bugs. If you want to use @strong{MySQL} -on this, you should install all thread related patches. At least -M400-023 should be installed. - -On some BSDI 4.x systems, you may get problems with shared libraries. The -symptom is that you can't execute any client programs, like for example -@code{mysqladmin}. In this case you need to reconfigure not to use -shared libraries with the @code{--disable-shared} option to configure. - -@node SCO, SCO Unixware, BSDI, Source install system issues -@subsection SCO notes - -The current port is tested only on a ``sco3.2v5.0.4'' and -``sco3.2v5.0.5'' system. There has also been a lot of progress on a -port to ``sco 3.2v4.2''. - -For the moment the recommended compiler on OpenServer is gcc 2.95.2. With this -you should be able to compile @code{MySQL} with just: - -@example -CC=gcc CXX=gcc ./configure ... (options) -@end example - -@enumerate -@item -For OpenServer 5.0.X you need to use GDS in Skunkware 95 (95q4c). This -is necessary because GNU @code{gcc} 2.7.2 in Skunkware 97 does not have -GNU @code{as}. You can also use @code{egcs} 1.1.2 or newer -@uref{http://www.egcs.com/}. If you are using @code{egcs} 1.1.2 you have -to execute the following command: - -@example -shell> cp -p /usr/include/pthread/stdtypes.h /usr/local/lib/gcc-lib/i386-pc-sco3.2v5.0.5/egcs-2.91.66/include/pthread/ -@end example -@item -You need the port of GCC 2.5.? for this product and the Development -system. They are required on this version of SCO UNIX. You cannot -just use the GCC Dev system. -@item -You should get the FSU Pthreads package and install it first. This can be -found at -@uref{http://www.cs.wustl.edu/~schmidt/ACE_wrappers/FSU-threads.tar.gz}. -You can also get a precompiled package from -@uref{ftp://www.mysql.com/pub/mysql/Downloads/SCO/FSU-threads-3.5c.tar.gz}. -@item -FSU Pthreads can be compiled with SCO UNIX 4.2 with tcpip. Or -OpenServer 3.0 or Open Desktop 3.0 (OS 3.0 ODT 3.0), with the SCO -Development System installed using a good port of GCC 2.5.X ODT or OS -3.0 you will need a good port of GCC 2.5.? There are a lot of problems -without a good port. The port for this product requires the SCO UNIX -Development system. Without it, you are missing the libraries and the -linker that is needed. -@item -To build FSU Pthreads on your system, do the following: -@enumerate -@item -Run @code{./configure} in the @file{threads/src} directory and select -the SCO OpenServer option. This command copies @file{Makefile.SCO5} to -@file{Makefile}. -@item -Run @code{make}. -@item -To install in the default @file{/usr/include} directory, login as root, -then @code{cd} to the @file{thread/src} directory, and run @code{make -install}. -@end enumerate -@item -Remember to use GNU @code{make} when making @strong{MySQL}. -@item -On OSR 5.0.5, you should use the following configure line: -@example -shell> CC="gcc -DSCO" CXX="gcc -DSCO" ./configure -@end example -The @code{-DSCO} is needed to help configure detect some thread -functions properly. If you forget @code{-DSCO}, you will get the following -error message while compiling: -@example -my_pthread.c: In function `my_pthread_mutex_init': -my_pthread.c:374: `pthread_mutexattr_default' undeclared (first use this function) -@end example -@item -If you don't start @code{safe_mysqld} as root, you probably will get only the -default 110 open files per process. @code{mysqld} will write a note about this -in the log file. -@item -With SCO 3.2V5.0.5, you should use FSU Pthreads version 3.5c or newer. -The following @code{configure} command should work: -@example -shell> CC="gcc -belf" ./configure --prefix=/usr/local/mysql --disable-shared -@end example -@item -With SCO 3.2V4.2, you should use FSU Pthreads version 3.5c or newer. -The following @code{configure} command should work: -@example -shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \ - ./configure \ - --with-debug --prefix=/usr/local/mysql \ - --with-named-thread-libs="-lgthreads -lsocket -lgen -lgthreads" \ - --with-named-curses-libs="-lcurses" -@end example -You may get some problems with some include files. In this case, you can -find new SCO-specific include files at -@uref{ftp://www.mysql.com/pub/mysql/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz}. -You should unpack this file in the @file{include} -directory of your @strong{MySQL} source tree. -@end enumerate - -SCO development notes: - -@itemize @bullet -@item -@strong{MySQL} should automatically detect FSU Pthreads and link @code{mysqld} -with @code{-lgthreads -lsocket -lgthreads}. -@item -The SCO development libraries are reentrant in FSU Pthreads. SCO claims -that its libraries' functions are reentrant, so they must be reentrant with -FSU Pthreads. FSU Pthreads on OpenServer tries to use the SCO scheme to -make reentrant library. -@item -FSU Pthreads (at least the version at @code{www.mysql.com}) comes linked with -GNU @code{malloc}. If you encounter problems with memory usage, make sure that -@file{gmalloc.o} -is included in @file{libgthreads.a} and @file{libgthreads.so}. -@item -In FSU Pthreads, the following system calls are pthreads-aware: @code{read()}, -@code{write()}, @code{getmsg()}, @code{connect()}, @code{accept()}, -@code{select()} and @code{wait()}. -@end itemize - -If you want to install DBI on SCO, you have to edit the @file{Makefiles} in -DBI-xxx and each subdirectory: - -@example -OLD: NEW: -CC = cc CC = gcc -belf -CCCDLFLAGS = -KPIC -W1,-Bexport CCCDLFLAGS = -fpic -CCDLFLAGS = -wl,-Bexport CCDLFLAGS = - -LD = ld LD = gcc -belf -G -fpic -LDDLFLAGS = -G -L/usr/local/lib LDDLFLAGS = -L/usr/local/lib -LDFLAGS = -belf -L/usr/local/lib LDFLAGS = -L/usr/local/lib - -LD = ld LD = gcc -belf -G -fpic -OPTIMISE = -Od OPTIMISE = -O1 - -OLD: -CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include - -NEW: -CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include -@end example - -This is because the Perl dynaloader will not load the @code{DBI} modules -if they were compiled with @code{icc} or @code{cc}. - -Perl works best when compiled with @code{cc}. - -@node SCO Unixware, IBM-AIX, SCO, Source install system issues -@subsection SCO Unixware 7.0 notes - -You must use a version of @strong{MySQL} at least as recent as 3.22.13, because -that version fixes some portability problems under Unixware. - -We have been able to compile @strong{MySQL} with the following @code{configure} -command on UnixWare 7.0.1: - -@example -shell> CC=cc CXX=CC ./configure --prefix=/usr/local/mysql -@end example - -If you want to use @code{gcc}, you must use @code{gcc} 2.95.2 or newer. - -@node IBM-AIX, HP-UX 10.20, SCO Unixware, Source install system issues -@subsection IBM-AIX notes - -Automatic detection of @code{xlC} is missing from Autoconf, so a -@code{configure} command something like this is needed when using the IBM -compiler: - -@example -shell> CC="xlc_r -ma -O3 -qstrict -DHAVE_INT_8_16_32" \ - CXX="xlC_r -ma -O3 -qstrict -DHAVE_INT_8_16_32" \ - ./configure -@end example - -If you change the @code{-O3} to @code{-O2} in the above configure line, -you must also remove the @code{-qstrict} option (this is a limitation in -the IBM C compiler). - -If you are using @code{gcc} or @code{egcs} to compile @strong{MySQL}, you -@strong{MUST} use the @code{-fno-exceptions} flag, as the exception -handling in @code{gcc}/@code{egcs} is not thread-safe! (This is tested with -@code{egcs} 1.1.) We recommend the following @code{configure} line with -@code{egcs} and @code{gcc} on AIX: - -@example -shell> CXX=gcc \ - CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \ - ./configure --prefix=/home/monty --with-debug --with-low-memory -@end example - -If you have problems with signals (@strong{MySQL} dies unexpectedly -under high load) you may have found an OS bug with threads and -signals. In this case you can tell @strong{MySQL} not to use signals by -configuring with: - -@example -shell> CFLAGS=-DDONT_USE_THR_ALARM CXX=gcc \ - CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -DDONT_USE_THR_ALARM" \ - ./configure --prefix=/home/monty --with-debug --with-low-memory -@end example - -This doesn't affect the performance of @strong{MySQL}, but has the side -effect that you can't kill clients that are ``sleeping'' on a connection with -@code{mysqladmin kill} or @code{mysqladmin shutdown}. Instead, the client -will die when it issues its next command. - -On some versions of AIX, linking with @code{libbind.a} makes @code{getservbyname} core -dump. This is an AIX bug and should be reported to IBM. - - -@node HP-UX 10.20, HP-UX 11.x, IBM-AIX, Source install system issues -@subsection HP-UX 10.20 notes - -There are a couple of ``small'' problems when compiling @strong{MySQL} on -HP-UX. We recommend that you use @code{gcc} instead of the HP-UX native -compiler, because @code{gcc} produces better code! - -We recommend one to use gcc 2.95 on HP-UX. Don't use high optimization -flags (like -O6) as this may not be safe on HP-UX. - -Note that MIT-pthreads can't be compiled with the HP-UX compiler, -because it can't compile @code{.S} (assembler) files. - -The following configure line should work: - -@example -CFLAGS="-DHPUX -I/opt/dce/include" CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions -fno-rtti" CXX=gcc ./configure --with-pthread --with-named-thread-libs='-ldce' --prefix=/usr/local/mysql --disable-shared -@end example - -If you are compiling @code{gcc} 2.95 yourself, you should NOT link it with -the DCE libraries (@code{libdce.a} or @code{libcma.a}) if you want to compile -@strong{MySQL} with MIT-pthreads. If you mix the DCE and MIT-pthreads -packages you will get a @code{mysqld} to which you cannot connect. Remove -the DCE libraries while you compile @code{gcc} 2.95! - -@node HP-UX 11.x, MaxOSX, HP-UX 10.20, Source install system issues -@subsection HP-UX 11.x notes - -For HPUX 11.x we recommend @strong{MySQL} 3.23.15 or later. - -If you are using @code{gcc} 2.95.1 on a unpatched HPUX 11.x system you will -get the error: - -@example -In file included from /usr/include/unistd.h:11, - from ../include/global.h:125, - from mysql_priv.h:15, - from item.cc:19: -/usr/include/sys/unistd.h:184: declaration of C function `int pthread_atfork(void (*)(...), void (*) -(...), void (*)(...))' conflicts with -/usr/include/sys/pthread.h:440: previous declaration `int pthread_atfork(void (*)(), void (*)(), void (*)())' here -In file included from item.h:306, - from mysql_priv.h:158, - from item.cc:19: -@end example - -The problem is that HP-UX doesn't define @code{pthreads_atfork()} consistently. -It has conflicting prototypes in -@file{/usr/include/sys/unistd.h}:184 and -@file{/usr/include/sys/pthread.h}:440 (I post the details below). - -One solution is to copy @file{/usr/include/sys/unistd.h} into -@file{mysql/include} and edit @file{unistd.h} and change it to match -the definition in @file{pthread.h}. Here's the diff: - -@example -183,184c183,184 -< extern int pthread_atfork(void (*prepare)(), void (*parent)(), -< void (*child)()); ---- -> extern int pthread_atfork(void (*prepare)(void), void (*parent)(void), -> void (*child)(void)); -@end example - -After this, the following configure line should work: - -@example -CFLAGS="-fomit-frame-pointer -O6 -fpic" CXX=gcc CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -O6" ./configure --prefix=/usr/local/mysql --disable-shared -@end example - -Here is some information that a HPUX 11.x user sent us about compile -@strong{MySQL} with HPUX:x compiler - -@itemize @bullet -@item -@example - Environment: - proper compilers. - setenv CC cc - setenv CXX aCC - flags - setenv CFLAGS -D_REENTRANT - setenv CXXFLAGS -D_REENTRANT - setenv CPPFLAGS -D_REENTRANT - % aCC -V - aCC: HP ANSI C++ B3910B X.03.14.06 - % cc -V /tmp/empty.c - cpp.ansi: HP92453-01 A.11.02.00 HP C Preprocessor (ANSI) - ccom: HP92453-01 A.11.01.00 HP C Compiler - cc: "/tmp/empty.c", line 1: warning 501: Empty source file. -@end example -@item -@example - configuration: - ./configure --with-pthread \ - --prefix=/source-control/mysql \ - --with-named-thread-libs=-lpthread \ - --with-low-memory -@end example -@item - added '#define _CTYPE_INCLUDED' to include/m_ctype.h. This - symbol is the one defined in HP's /usr/include/ctype.h: - -@example - /* Don't include std ctype.h when this is included */ - #define _CTYPE_H - #define __CTYPE_INCLUDED - #define _CTYPE_INCLUDED - #define _CTYPE_USING /* Don't put names in global namespace. */ -@end example -@item -I had to use the compile-time flag @code{-D_REENTRANT} to get the -compiler to recognize the prototype for -@code{localtime_r}. Alternatively I could have supplied the prototype -for @code{localtime_r}. But I wanted to catch other bugs without needing -to run into them. I wasn't sure where I needed it so I added it to all -flags. -@item -The optimization flags used by @strong{MySQL} (-O3) are not recognized -by HP's compilers. I did not change the flags. -@end itemize - -@node MaxOSX, , HP-UX 11.x, Source install system issues -@subsection MacOS X notes - -You can get @strong{MySQL} to work on MacOS X by following the links to -the MacOS X ports. @xref{Useful Links}. - -@strong{MySQL} 3.23.7 should include all patches necessary to configure -it on MacOSX. You must however first install the pthread package from -@uref{http://www.prnet.de/RegEx/mysql.html,MySql for MacOSX Server} -before configuring MySQL. - -You might want to also add aliases to your shell's resource file to -access @code{mysql} and @code{mysqladmin} from the command line. - -@example -alias mysql '/usr/local/mysql/bin/mysql' -alias mysqladmin '/usr/local/mysql/libexec/mysqladmin' -@end example - -@node Win32, OS/2, Source install system issues, Installing -@section Win32 notes - -Ǥ Win32 Ǥ @strong{MySQL} λѤȥ󥹥ȡˤĤƽҤ٤ޤ - @strong{MySQL} Win32 ʪ @file{README} եˤҤ٤Ƥޤ - -@menu -* Win32 installation:: Installing @strong{MySQL} on Win32 -* Win95 start:: Starting @strong{MySQL} on Win95 / Win98 -* NT start:: Starting @strong{MySQL} on NT -* Win32 running:: Running @strong{MySQL} on Win32 -* Win32 and SSH:: Connecting to a remote @strong{MySQL} from Win32 with SSH -* Win32 symbolic links:: Splitting data across different disks under Win32 -* Win32 vs. Unix:: @strong{MySQL}-Win32 compared to Unix @strong{MySQL} -@end menu - -@node Win32 installation, Win95 start, Win32, Win32 -@subsection Win32 ؤ @strong{MySQL} Υ󥹥ȡ - -⤷ @strong{MySQL} äƤʤʤ顢ǽ˰ʲ -Сɤ٤Ǥ - -@uref{http://www.mysql.com/mysql_w32.htmy,@strong{MySQL} 3.22.x} - -ܸǤɾǡ(3.22)μϰʲˤʤޤ -@uref{http://www.softagency.co.jp/, @strong{MySQL} ܸ} - -⤷¾Υץफ @strong{MySQL} ³褦ȹͤƤʤ顢 -¿ʬ @strong{MyODBC} ɥ饤СɬפǤ礦 -@uref{http://www.mysql.com/ownload_myodbc.html,@strong{MySQL} download page}. -ˤޤ - -ܸǤ @strong{MyODBC} ɥ饤С ϡ -@uref{http://www.softagency.co.jp/,@strong{MyODBC} ܸ} - -줾ʪΥ󥹥ȡ򤹤ˤϡɤʪ -ɤ Υǥ쥯ȥ unzip @code{Setup.exe} ץ -¹Ԥޤ - -ɸǤϡ@strong{MySQL}-Win32 @file{C:\mysql} ˥󥹥ȡ뤵褦 -ʤäƤޤ ⤷㤦 @strong{MySQL} 򥤥󥹥ȡ뤷ʤ顢 - @file{C:\mysql} ˥󥹥ȡ뤷ˡΥեưޤ - @strong{MySQL} @file{C:\mysql} ưʤС - @code{mysqld} ФơưɬͤФʤޤ -⤷ @strong{MySQL} @file{D:\programs\mysql} ˰ưʤ, -@code{mysqld} ʲΤ褦ˤƵưޤ -@code{D:\programs\mysql\bin\mysqld --basedir D:\programs\mysql} -ʤ @code{C:\mysql\bin\mysqld --help} ȤȡƤΥץɽޤ - -Ǥ @strong{MySQL} Ǥϡ@file{C:\my.cnf} ե - @strong{MySQL} СΥץ򵭽Ҥ뤳ȤǽǤ -@file{\mysql\my-xxxxx.cnf} @file{C:\my.cnf} ˥ԡ -ʬδĶ˹碌ԽƻѤƤ -ƤΥѥˤ @code{\} ǤϤʤ @code{/} ѤʤƤϤʤޤ -⤷ @code{\} Ѥˤϡܤޤ @strong{MySQL} Ǥ - @code{\} ϥʸǤ -@xref{Option files}. - - -@node Win95 start, NT start, Win32 installation, Win32 -@subsection Win95 / Win98 Ǥ @strong{MySQL} ư - -@strong{MySQL} TCP/IP 򥯥饤Ȥ饵Сؤ³˻Ѥޤ -ʤϡʤΥͥåȥΤʤޥ󤫤 @strong{MySQL} С -³ǤǤ礦ˡ Τᡢ@strong{MySQL} ưˡ -ʤ TCP/IP 򥤥󥹥ȡ뤷ʤƤϤʤޤ - Windows CD-ROM ˤޤ - -⤷Ť Win95 (for example OSR2) ѤƤʤ顢 -ϸŤ Winsock ѥåѤƤ뤫⤷ޤ -@strong{MySQL} Winsock 2 ׵ᤷޤ ǿ Winsock -@uref{http://www.microsoft.com,Microsoft} ˤޤ - Win98 ϥǥեȤǿ Winsock 2 饤֥ǤΤǡ - Win98 ˤƤϤޤޤ - -2Ĥΰ㤦 @strong{MySQL} Сޤ - -@multitable @columnfractions .15 .85 -@item @code{mysqld} @tab եǥХåͭˤơư memory allocation å褦˥ѥ -@item @code{mysqld-opt} @tab Pentium ץåѤ˺Ŭʪ -@end multitable - -ξȤ Intel ץå >= i386 ưޤ - -@code{mysqld} Сưˤ, MS-DOS ʲΤ褦ˤʤƤϤʤޤ - -@example -C:\mysql\bin\mysqld -@end example - - @code{mysqld} Хå饦ɤưޤ - -@strong{MySQL} С kill ˤϡ - -@example -C:\mysql\bin\mysqladmin -u root shutdown -@end example - -Note that Win95/Win98 don't support creation of named pipes. On -Win95/Win98, you can only use named pipes to connect to a remote -@strong{MySQL} running on an NT server. - -If @code{mysqld} doesn't start please check whether or not the -@file{\mysql\mysql.err} file contains any reason for this. You can also -try to start it with @code{mysqld --standalone}; In this case you may -get some useful information on the screen that may help solve this. - -The last option is to start @code{mysqld} with @code{--debug}. In this -case @code{mysqld} will write a log file in @file{\mysqld.trace} -that should contain the reason why @code{mysqld} doesn't start. If you -make a bug report about this, please only send the lines where something -seams to go wrong to the mailing list! - -@node NT start, Win32 running, Win95 start, Win32 -@subsection NT Ǥ @strong{MySQL} ư - -The Win95/Win98 section also applies to @strong{MySQL} on NT, with the -following differences: - -TCP/IP @strong{MySQL} ưˤϡservice pack 3(ʾ) ɬܤǤ - -NT Ǥ, С̾ @code{mysqld-nt} Ǥ. ̾ʲΤ褦ˤ - NT ΥӥȤ @strong{MySQL} 򥤥󥹥ȡ뤷ʤƤϤʤޤ - -@example -C:\mysql\bin\mysqld-nt --install -@end example - -(@code{mysqld} @code{mysqld-opt} NT ư뤳Ȥޤ -ϡӥȤƥȤ뤳Ȥ褺ޤ -named pipes λѤޤ) - -@strong{MySQL} ӥεưߤϡ - -@example -NET START mysql -NET STOP mysql -@end example - -ξ硢@code{mysqld} ˡʤ륪ץѤǤʤȤա - -⤷ @code{mysqld-nt} 򥪥ץ̵ǵưɬפʤС - @code{mysqld-nt} 򥹥ɥΥץȤ NT 餻뤳Ȥ -ޤ ⤷ @code{mysqld-nt} 򥪥ץ̵ NT ǵưȡ - @code{mysqld-nt} ϼʬȤ򥵡ӥȤΩ夲褦Ȥޤ -ǥեȤΥӥץѤơ - ⤷ @code{mysqld-nt} ߤƤʤ顢 @code{NET START mysql} -ưʤƤϤʤޤ - -ӥ @code{MySql} Ȥ̾Ͽޤ ٥󥹥ȡ뤷顢 - Services Control Manager (SCM) Utility (ȥѥͥˤ) -Ѥ뤫@code{NET START MySQL} ޥɤѤ뤫ơ -ưʤƤϤʤޤ -⤷ץ󤬤ʤˤꤵƤʤʤ顢@code{MySQL} ӥˡ -SCM Utility "Startup parameters" ˵ҤʤƤϤʤޤ -С @code{mysqld-nt} @code{mysqladmin} SCM utility -@code{NET STOP MySQL} ޥɤߤǤޤ -⤷ SCM Ѥ @code{mysqld-nt} ߤʤ顢 - @code{mysqld shutdown normally} ˤĤƤѤʥåǤޤ -When run as a service, @code{mysqld-nt} has no access to a console and so no -messages can be seen. - -NT ǤϰʲΥ顼åФ뤫⤷ޤ - -@multitable @columnfractions .3 .7 -@item Permission Denied @tab Means that it cannot find @code{mysqld-nt.exe} -@item Cannot Register @tab Means that the path is incorrect -@end multitable - -⤷ @code{mysqld-nt} 򥵡ӥȤƥ󥹥ȡ뤹 -꤬ȯ硢եѥǼ¹ԤƤߤƤ - -@example -C:\mysql\bin\mysqld-nt --install -@end example - -⤷ưʤ褦ʤ顢쥸ȥΥѥ @code{mysqld-nt} -ưǤǤ礦 - -ӥȤ @code{mysqld-nt} ưʤʤʲΤ褦ˤޤ - -@example -C:\mysql\bin\mysqld-nt --standalone -@end example - -or - -@example -C:\mysql\bin\mysqld --standalone --debug -@end example - -ǿΥСǤϡǥХåΥȥ졼 @file{C:\mysqld.trace} ˽Фޤ - -@node Win32 running, Win32 and SSH, NT start, Win32 -@subsection Win32 @strong{MySQL} ¹ - -@strong{MySQL}Ƥ Win32 ץåȥե TCP/IP 򥵥ݡȤ -NT named pipe 򥵥ݡȤޤ -ǥեȤϡNT ǥ³Ȥ˥͡ɡѥפѤ졢 -ΤۤƤξ TCP/IP Ѥޤ - ۥ̾ϤɤΥץȥѤ뤫ޤ - -@multitable @columnfractions .3 .7 -@strong{Host name} @tab @strong{protocol} -@item NULL (none) @tab NT ǤϺǽ˥͡ɡѥפߡưʤ TCP/IP Ѥޤ Win95/Win98 Ǥ TCP/IP Ѥޤ -@item . @tab ͡ɡѥ -@item localhost @tab TCP/IP to current host -@item hostname @tab TCP/IP -@end multitable - -@strong{MySQL} 饤Ȥ named pipes Ū˻Ѥˤϡ -@code{--pipe} ץꤷޤ ơ@code{--socket} ץ -ѥפ̾ꤷޤ - -@strong{MySQL} ưƤ뤫ɤϡʲΤ褦ˤƳǧǤޤ - -@example -C:\mysql\bin\mysqlshow -C:\mysql\bin\mysqlshow -u root mysql -C:\mysql\bin\mysqladmin version status proc -C:\mysql\bin\mysql test -@end example - -⤷ Win95/Win98 @code{mysqld} ؤ³٤褦ʤ顢DNS ꤫⤷ޤ -ξ硢 @code{mysqld} @code{--skip-name-resolve} ץ -ư@strong{MySQL} ĥơ֥ˤϡ@code{localhost} IP ɥ쥹 -Ѥޤ -NT @code{mysqld-nt} @strong{MySQL} СФƤ³ - DNS 򤱤뤿ˡ @code{--pipe} ꤷƥ͡ɡѥפ -ѤǤޤ ϤۤȤɤ @strong{MySQL} 饤Ȥưޤ - -2Ĥ @strong{MySQL} ޥɥ饤ġ뤬ޤ -@multitable @columnfractions .15 .85 -@item @code{mysql} @tab Compiled on native Win32, which offers very limited text -editing capabilities. -@item @code{mysqlc} @tab Compiled with the Cygnus GNU compiler and libraries, which offers @code{readline} editing. -@end multitable - -⤷ @code{mysqlc.exe} Ѥʤ, -@file{C:\mysql\lib\cygwinb19.dll} @file{\windows\system} (ѥ) -˥ԡʤƤϤʤޤ - -Win32 @strong{MySQL} νθ¤ϡƤΥ桼 -ФơƤΥǡ١Ƥθ¤ͿƤޤ -@strong{MySQL} ˤ뤿ˡƤΥ桼˥ѥɤ -ꤹ٤Ǥޤ@code{mysql.user} ơ֥뤫 -@code{Host='localhost'} @code{User=''} ȤʤäƤ쥳ɤ -٤Ǥ - -@code{root} 桼ˤѥɤꤹ٤Ǥ -(The following example starts by removing the anonymous user, that allows -anyone to access the 'test' database) - -@example -C:\mysql\bin\mysql mysql -mysql> DELETE FROM user WHERE Host='localhost' AND User=''; -mysql> QUIT -C:\mysql\bin\mysqladmin reload -C:\mysql\bin\mysqladmin -u root password your_password -@end example - -ѥɤꤷ塢⤷ @code{mysqld} Сߤʤ顢 -ʲΤ褦ˤޤ - -@example -mysqladmin --user=root --password=your_password shutdown -@end example - -If you are using the old shareware version of @strong{MySQL} 3.21 under -Windows, the above command will fail with an error: @code{parse error -near 'SET OPTION password'}. This is because the old shareware version, -which is based on @strong{MySQL} 3.21, doesn't have the @code{SET PASSWORD} -command. The fix is in this case is to upgrade to the 3.22 shareware -version. - -With the newer @strong{MySQL} versions you can easily add new users -and change privileges with @code{GRANT} and @code{REVOKE} commands. -@xref{GRANT}. - - -@node Win32 and SSH, Win32 symbolic links, Win32 running, Win32 -@subsection SSH Ѥƥ⡼Ȥ @strong{MySQL} Win32 ³ - -SSH ѤơWin32 顢ɤäƥ⡼Ȥ MySQL ³뤫Ǥ -(by David Carlson). - -@itemize @bullet -@item -ʤ windows ޥ SSH 饤Ȥ򥤥󥹥ȡ뤷ޤ - ϥե꡼Ǥ -SSH 饤ȤѤޤ @uref{http://www.doc.ic.ac.uk/~ci2/ssh/}. -¾ͭפʾϡ -@uref{http://www.npaci.edu/Security/npaci_security_software.html} and -@uref{http://www.npaci.edu/Security/samples/ssh32_windows/index.html}. -@item -SSH ư Host Name ʤ MySQL С̾ IP ɥ쥹˥åȤޤ -userid 򡢤ʤΥСؤΥ̾˥åȤޤ -@item -"local forwards" 򥯥å @code{local port: 3306}, -@code{host: localhost}, @code{remote port: 3306} ˤ줾쥻åȡ -@item -¸(Save) ¸Ƥ⼡ľǤޤ -@item -SSH ǤʤΥС˥ -@item -ʤˤ ODBC ץꥱ(㤨 Access) ư -@item -ODBC ɥ饤СѤ MySQL ؤοեȥ󥯤 -̾λȺˡѤʤǤС "localhost" -뤳Ȥ㤤ޤ -@end itemize - -That's it. It works very well with a direct Internet connection. I'm -having problems with SSH conflicting with my Win95 network and Wingate - -but that'll be the topic of a posting on another software company's -usegroup! - -@findex Symbolic links -@findex Using multiple disks to start data -@node Win32 symbolic links, Win32 vs. Unix, Win32 and SSH, Win32 -@subsection Splitting data across different disks under Win32 - -On windows @strong{MySQL} 3.23.16 and above is compiled with the -@code{-DUSE_SYMDIR} option. This allows you to put a database on -different disk by adding a symbolic link to it (in a similar manner that -symbolic links works on Unix). - -On windows you make a symbolic link to a database by creating a file -that contains the path to the destination directory and saving this in -the @code{mysql_data} directory under the filename @code{database.sym}. -Note that the symbolic link will only be used if the directory -@code{mysql_data_dir\database} doesn't exist. - -For example if you want to have database @code{foo} on @file{D:\data\foo} you -should create the file @file{C:\mysql\data\foo.sym} that should contains the -text @code{D:\data\foo}. After this, all tables created in the database -@code{foo} will be created in @file{D:\data\foo}. - -@node Win32 vs. Unix, , Win32 symbolic links, Win32 -@subsection @strong{MySQL}-Win32 compared to Unix @strong{MySQL} - -@strong{MySQL}-Win32 Сϸߤ켫ΤȤƤꤷ(stable)֤Ƕ뤵Ƥޤ -MySQL-win32 С ٤ƤεǽUNIXСMySQLбƤޤ -Τ褦㳰ޤ - -@table @strong -@item Win95 ȥå -Win95ϡơΥåɤκΤ˥ᥤΤ褽200ХȤ꡼ -ޤΤˡ⤷ʤ¿³򤹤С@strong{MySQL} γơ³ -åɤΤǡʤWin95ǤĹ֡@code{mysqld} ¹Ԥ٤ǤϤ -ޤ -WinNT and Win98 don't suffer from this bug. - -@item Concurrent reads -@strong{MySQL} depends on the @code{pread()} and @code{pwrite()} calls to be -able to mix @code{INSERT} and @code{SELECT}. As windows doesn't support these -calls, @strong{MySQL} can't currently handle concurrent reads on windows. -We plan to fix this by adding an extra mutex to each open file and simulate -@code{pread()}/@code{pwrite()}. - -@item ֥åɤ߹ -@strong{MySQL} Ϥ줾³Τ˥֥åɤ߹ߤȤޤ -ϰʲλ̣Ƥޤ -@itemize @bullet - -@item -³ϡ@strong{MySQL} UnixСǵ褦ˡ8֤θ˼ưŪ³ -ڤ櫓ǤϤޤ - -@item -⤷³֥ϥ󥰤Сס@strong{MySQL}λʤǤǤ뤳ȤϡԲǽǤ - -@item -@code{mysqladmin kill} ϡ꡼פƤ³ǤƯʤϤǤ - -@item -꡼פƤ³뤫ꡢ@code{mysqladmin shutdown} ϡ䤹뤳ȤǤޤ -@end itemize - -䤿ϡᤤˤ뤳Ȥײ褷Ƥޤ - -@item UDF ؿ -ꡢ@strong{MySQL}-Win32 ϥ桼Ǥؿ򥵥ݡȤޤ - -@item @code{DROP DATABASE} -ʣΥåɤǻȤƤǡ١DROP򤹤뤳ȤǤޤ - -@item ޥ͡㡼 @strong{MySQL} νλ -Windows95ǤϡWindowsνλפ䥿ޥ͡㤫 @strong{MySQL} λ뤳ȤϤǤޤ -@code{mysqladmin shutdown} ǽλʤФʤޤ - -@item ʸʸ̤ʤ̾ -Win32Ǥϥե͡ʸʸ̤ޤΤᡢWin32Ѥ @strong{MySQL} -ϥơ֥̾ʸʸ̤ޤͣ¤ϡ̾Υơȥ -ȤλƱͿʤФʤʤΥǡ١ɽǤ -Τ褦ʥ꡼Ưޤ󡣤줬ɽ @code{MY_TABLE}, @code{my_table} ξ򻲾Ȥ뤫 - - -@example -SELECT * FROM my_table WHERE MY_TABLE.col=1; -@end example - -@item The @samp{\} (ǥ쥯ȥ̾) -Win95Υѥ̾ݡͥȤϡ @samp{\} ˤäΥޤʸƱ @strong{MySQL} Υ -ʸǤ⤢ޤ⤷ʤ @code{LOAD DATA INFILE} ޤ @code{SELECT ... INTO OUTFILE} ȤäơUNIXǤΥե͡ @samp{/} 񤯤褦ˤʤ顢 -\\פ @samp{\} ֥ǻȤʤƤϤʤޤ - -@example -LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr; -SELECT * FROM skr INTO OUTFILE 'C:/tmp/skr.txt'; -@end example - -@item @code{Can't open named pipe} 顼 -⤷ʤǿ mysql-clients NTξ @strong{MySQL}-Win32 ΥС -ȤСʤϡΥ顼뤳ȤˤʤϤǤ: - -@example -error 2017: can't open named pipe to host: . pipe... -@end example - -@tindex .my.cnf file -ϡ @strong{MySQL} Υ꡼С󤬥ǥեȤNTξ˥͡ɥѥפȤäƤ -뤿˵äƤޤ -ʤϿ @strong{MySQL} 饤Ȥˤޤ @file{C:\my.cnf} ե뤵(Υե -ϰʲξޤߤޤ) @code{--host=localhost} ץȤȤˤäƤΥ -顼򤱤ޤ - -@example -[client] -host = localhost -@end example - -@item @code{Access denied for user} error -⤷ʤƱޥ @strong{MySQL} С˥ -@code{Access denied for user: 'some-user@@unknown' to database 'mysql'} - 顼ʤ顢Ϥʤ @strong{MySQL} ʤ -ΥޥΥۥ̾ǤƤʤȤ̣ޤ - -ˤϤ -ϥե @file{\windows\hosts} ꡢʲξ񤯤ȤˤäƤ٤Ǥ -(:Windows95,98ˤ\Windowsե˥ץȤơlmhosts.samץե뤬 -ˤϤǤ) - -@example -127.0.0.1 localhost -@end example -@end table - -ˤWin32꡼ƤïΤˤĤץˤʤäƤ -ޤ: - -@itemize @bullet -@item -Make a single user @code{MYSQL.DLL} server. This should include everything in -a standard @strong{MySQL} server, except thread creation. This will make -@strong{MySQL} much easier to use in applications that don't need a true -client/server and don't need to access the server from other hosts. - -@item -Add some nice ``start'' and ``shutdown'' icons to the @strong{MySQL} installation. -@file{MySQL.DLL}. - -@item -Create a tool to manage registry entries for the @strong{MySQL} startup -options. The registry entry reading is already coded into @code{mysqld.cc}, -but it should be recoded to be more ``parameter'' oriented. -The tool should also be able to update the @file{\my.cnf} file if the user -would prefer to use this instead of the registry. - -@item -NT @code{mysqld} 򥵡ӥȤ @code{--install} ե饰ϿȤ⤷ʤޥɥ -ξǥǥեȤΥץƱä뤳ȤǤСϡɤ -Ϻäơ @file{C:\my.cnf} եˤ뤳ȤѤƤ - - -@item -ʤåץȥåפWin95ǤȡåץȥåפΥ쥸塼व - @code{mysqld} ǡϿ³ޤ󡣻䤿ϡ줬Win95TCP/IPޤ -ϡ @strong{MySQL} Ǥ뤫ɤ狼ޤ - -@item -ޤޥ͡㤫 @code{mysqld} λ뤳ȤǤФۤȤ˿ڤǤ礦 -ΤȤʤ @code{mysqladmin shutdown} ȤʤФʤޤ - -@item -@code{mysql} Υޥɥ饤ġȤ @code{readline} Win32˰ܿޤ󤫡 - -@item -ɸ @strong{MySQL} 饤(@code{mysql}@code{mysqlshow}@code{mysqladmin}ӡ@code{mysqldump})GUI -С󤬤ФǤ礦ͤ - -@item -⤷ @file{net.c} ΥåȤءɤ߹ߡפȡֽ񤭹ߡפinterruptibleʤСϤ -ΤǤ줬ǤWin32 @code{mysqladmin kill} ѤƳ줿åɤ -λǤΤǤ - -@item -@strong{MySQL}-Win32/@strong{MyODBC} ˤĤƽ񤫤줿Windowsץߥ󥰤ΥɥȡĤ餬 -ưƤ뤳ȤǧѤߤǤ뤳ȡ - -@item -@code{mysqld} ϥǥեȥǤϤʤˡCץǵưޤ䤿ϡ -ȽΤˡ @code{mysqld} ˡߤΥȤ碌 - -@item -MysqlManagerˤä¿Υץ - -@item -饤ȤȥСΥߥ˥ץȥѹsocketsTCP/IP -WindowsΥߥ˥Ȥ - -@item -UDF ؿ @code{.DLL} Ǥμ - -@item -Add macros to use the faster thread-safe increment/decrement methods -provided by Win32. - -@end itemize - -¾win32˸ꤵ줿ɾ @strong{MySQL}-Win32 ǥȥӥ塼ƱƤ - @file{README} եƤޤ - - -@node OS/2, TcX binaries, Win32, Installing -@section OS/2 notes - -@strong{MySQL} uses quite a few open files. Because of this, you -should add something like the following to your @file{CONFIG.SYS} file: - -@example -SET EMXOPT=-c -n -h1024 -@end example - -If you don't do this, you will probably run into the following error: - -@example -File 'xxxx' not found (Errcode: 24) -@end example - -When using @strong{MySQL} with OS/2 Warp 3, FixPack 29 or above is -required. With OS/2 Warp 4, FixPack 4 or above is required. This is a -requirement of the Pthreads library. @strong{MySQL} must be installed -in a partition that supports long file names such as HPFS, FAT32, etc. - -The @file{INSTALL.CMD} script must be run from OS/2's own @file{CMD.EXE} -and may not work with replacement shells such as @file{4OS2.EXE}. - -The @file{scripts/mysql-install-db} script has been renamed: it is now called -@file{install.cmd} and is a REXX script which will set up the default -@strong{MySQL} security settings and create the WorkPlace Shell icons -for @strong{MySQL}. - -Dynamic module support is compiled in but not fully tested. Dynamic -modules should be compiled using the Pthreads runtime library. - -@example -gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \ - -o example udf_example.cc -L../lib -lmysqlclient udf_example.def -mv example.dll example.udf -@end example - -@strong{Note:} Due to limitations in OS/2, UDF module name stems must not -exceed 8 characters. Modules are stored in the @file{/mysql2/udf} -directory; the @code{safe-mysqld.cmd} script will put this directory in -the @code{BEGINLIBPATH} environment variable. When using UDF modules, -specified extensions are ignored --- it is assumed to be @file{.udf}. -For example, in Unix, the shared module might be named @file{example.so} -and you would load a function from it like this: - -@example -CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so"; -@end example - -Is OS/2, the module would be named @file{example.udf}, but you would not -specify the module extension: - -@example -CREATE FUNCTION metaphon RETURNS STRING SONAME "example"; -@end example - - -@node TcX binaries, Post-installation, OS/2, Installing -@section TcX binaries - -ӥȤơTcX @strong{MySQL} ΥХʥۤ󶡤Ƥޤ -Υѥ TcX Ǥʤäꡢ桹˥ޥ -󶡤ƤäƤܵҤΥޥǹԤäƤޤ - -ʪ @code{scripts/make_binary_distribution} Ǻ졢 -ʲΥѥ륪ץĴƤޤ - -@table @asis -@item SunOS 4.1.4 2 sun4c with @code{gcc} 2.7.2.1 -@code{CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --disable-shared} - -@item SunOS 5.5.1 sun4u with @code{egcs} 1.0.3a -@code{CC=gcc CFLAGS="-O6 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory} - -@item SunOS 5.6 sun4u with @code{egcs} 2.90.27 -@code{CC=gcc CFLAGS="-O6 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory} - -@item SunOS 5.6 i86pc with @code{gcc} 2.8.1 -@code{CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory} - -@item Linux 2.0.33 i386 with @code{pgcc} 2.90.29 (@code{egcs} 1.0.3a) -@code{CFLAGS="-O6 -mpentium -mstack-align-double -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -mpentium -mstack-align-double -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static} - -@item SCO 3.2v5.0.4 i386 with @code{gcc} 2.7-95q4 -@code{CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql} - -@item AIX 2 4 with @code{gcc} 2.7.2.2 -@code{CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql} - -@item OSF1 V4.0 564 alpha with @code{gcc} 2.8.1 -@code{CC=gcc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory} - -@item Irix 6.3 IP32 with @code{gcc} 2.8.0 -@code{CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql} - -@item BSDI BSD/OS 3.1 i386 with @code{gcc} 2.7.2.1 -@code{CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql} - -@item BSDI BSD/OS 2.1 i386 with @code{gcc} 2.7.2 -@code{CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql} -@end table - -ǼץʳǺŬܤϤǤ⡢ȯԸ -᡼󥰥ꥹȤ˥ݥȤǤޤ -@email{developer@@lists.mysql.com}. - -RPM ۤǤ @strong{MySQL} 3.22 user-contributed ȤƤޤ -3.22 ϤᡢĤ RPM ѥå TcX Ǥ - - -@node Post-installation, Upgrade, TcX binaries, Installing -@section 󥹥ȡȥƥ - -@menu -* mysql_install_db:: Problems running @code{mysql_install_db} -* Starting server:: Problems starting the @strong{MySQL} server -* Automatic start:: Starting and stopping @strong{MySQL} automatically -* Option files:: Option files -@end menu - - @strong{MySQL}򥤥󥹥ȡ뤷(Хʥ꤫Ǥ⥽ǤǤ) -Сư뤿ˡĥơ֥ʤƤϤʤޤ -ޤޥεư߻ˡСưdzϡߤ뤳ȤǤޤ - -̾ĥơ֥Υ󥹥ȡȥСγϤϡ -ǥȥӥ塼ʤʲΤ褦ˤޤ - -@example -shell> ./scripts/mysql_install_db -shell> cd mysql_installation_directory -shell> ./bin/safe_mysqld & -@end example - -Хʥǥȥӥ塼ǤϼԤʤޤ: - -@example -shell> cd mysql_installation_directory -shell> ./bin/mysql_install_db -shell> ./bin/safe_mysqld & -@end example - -ƥȤϡ@strong{MySQL} Υȥåץǥ쥯ȥ꡼ñ˼¹ԤǤޤ -ХʥۤѤ硢(ȥåץǥ쥯ȥ) -󥹥ȡΥǥ쥯ȥ꡼ˤʤǤ礦(@file{/usr/local/mysql}) -ۤξ硢 @strong{MySQL} Υǥ쥯ȥǤ - -ޥɤȤ³ޤ@code{BINDIR} -@code{mysqladmin} @code{safe_mysqld} 󥹥ȡ뤵줿ǥ쥯ȥ򼨤ޤ -ХʥۤѤƤ硢@code{BINDIR} ϥХʥۤ @file{bin} ǥ쥯ȥˤʤޤ -饤󥹥ȡ뤷硢@code{BINDIR} ϡ@code{configure} ̻ꤷʤ¤ꡢ -@file{/usr/local/bin} Ǥ -@code{EXECDIR} @code{mysqld} СΥ󥹥ȡǤ -ХʥۤѤƤ硢 @code{BINDIR} ǥ쥯ȥƱˤʤޤ -饤󥹥ȡ뤷硢@file{/usr/local/libexec} Ǥ - -ƥȤˤĤưʲ˾ܺ٤ޤ: - -@enumerate -@item -ɬפʤС@code{mysqld} Сư @strong{MySQL} εĥơ֥ޤ -(ĥơ֥ϥ桼ɤΤ褦ʸ¤äƥС³ꤹΤǤ) -̾@code{mysql_install_db} ץȤǽޤ - -@example -shell> scripts/mysql_install_db -@end example - -̾@code{mysql_install_db} μ¹ԤϽ @strong{MySQL} 򥤥󥹥ȡ -Ȱ٤ɬפǤ Ǥ˥󥹥ȡ뤵ƤΤ -åץ졼ɤݤˤϤμФޤ -ʤ@code{mysql_install_db} ϼ¤˰ǡǤ˥ơ֥뤬 -¸ߤƤϤʤơ֥⹹ޤ󡣤äơ -¹Ԥ٤ɤ狼ʤϡ@code{mysql_install_db} -餻뤳ȤǤޤ - -@code{mysql_install_db} 6ĤΥơ֥ޤ (@code{user}, @code{db}, -@code{host}, @code{tables_priv}, @code{columns_priv} and @code{func}) -@code{mysql} ǡ١ˡ θ¾֤ˤĤƤ -@ref{Default privileges}. θ¤ @strong{MySQL} @code{root} 桼 -ʤǤǤ褦˵Ĥơ⤬ -@code{'test'} Ȥ̾ @code{'test_'} ǤϤޤ̾ -ǡ١ѤǤ褦˵ĤƤޤ - -⤷ĥơ֥ꤷƤʤ硢Сư˰ʲΥ顼Фޤ - -@tindex host.frm, problems finding -@example -mysqld: Can't find file: 'host.frm' -@end example - -Хʥۤ @strong{MySQL} Ǥϡ⤷ @strong{MySQL} - @code{./bin/safe_mysqld} ¹ԤʤǵưˡΥ顼ޤ! - -@code{root} @code{mysql_install_db} ¹ԤɬפȤʤϻפ⤷ޤ - @strong{MySQL} @code{root} ʳΥ桼ǵưǤޤ -ǡ١ǥ쥯ȥ꤬Сư桼Фɤ߽񤭤ĤƤɤΤǤ -@strong{MySQL} ̥桼餻ˡ @ref{Changing MySQL user, , Changing -@strong{MySQL} user}. - -⤷ @code{mysql_install_db} ꤬Ф顢 -@ref{mysql_install_db, , @code{mysql_install_db}}. 򻲾ȤΤȡ - -@code{mysql_install_db} ץȤ餻ˤϤĤ򤬤ޤ - -@itemize @bullet -@item -@code{mysql_install_db} 餻ԽơĤν֤ѹƤ⤤Ǥ礦 -¿ΥޥƱ򤷤 @strong{MySQL} 򥤥󥹥ȡ뤹ݤ -Ωޤ ξ硢Ĥ @code{INSERT} ʸ @code{mysql.user} -@code{mysql.db} ơ֥ˤɲä褦ˤǤߤޤ! - -@item -⤷󥹥ȡ˵Ĥѹ硢 @code{mysql -u root mysql} @strong{MySQL} @code{root} 桼³ľܵĥơ֥ѹ SQL ʸ¹Ԥޤ - -@item -Ǥ˵ĥơ֥뤬줿֤ǡ˵ĥơ֥ľȤǤޤ -ϤǤ˥󥹥ȡ뤵줿ơ֥뤬䡢@code{mysql_install_db} Խˤפ⤷ޤ -@end itemize - -ˤĤƤ @ref{Default privileges} 餵˾ޤ - -@item -@strong{MySQL} СʲΤ褦ˤƵưޤ -@example -shell> cd mysql_installation_directory -shell> bin/safe_mysqld & -@end example -Фεư꤬С@ref{Starting server} 򸫤Ƥ - -@item -@code{mysqladmin} ǥСäƤ뤫ǧޤ -СΩ夬³դ뤫ǧñˡʲ˼ޤ - -@example -shell> BINDIR/mysqladmin version -shell> BINDIR/mysqladmin variables -@end example - -㤨С@code{mysqladmin version} νϤϤʤΥץåȥե - @strong{MySQL} ΥСϤޤ -ϤϰʲͤˤǤޤ - -@example -shell> BINDIR/mysqladmin version -mysqladmin Ver 6.3 Distrib 3.22.9-beta, for pc-linux-gnu on i686 -TCX Datakonsult AB, by Monty - -Server version 3.22.9-beta -Protocol version 10 -Connection Localhost via UNIX socket -TCP port 3306 -UNIX socket /tmp/mysql.sock -Uptime: 16 sec - -Running threads: 1 Questions: 20 Reloads: 2 Open tables: 3 -@end example - -@code{BINDIR/mysqladmin} λˡϡ@code{--help} ץǵư뤳Ȥˤޤ - -@item -С򥷥åȥ󤹤ˤϡ - -@example -shell> BINDIR/mysqladmin -u root shutdown -@end example - -@item -СꥹȤˤϡ@code{safe_mysqld} @code{mysqld} ľܼ¹Ԥޤ -㤨С - -@example -shell> BINDIR/safe_mysqld --log & -@end example - -@code{safe_mysqld} Ԥʤ顢 @strong{MySQL} Υ󥹥ȡǥ쥯ȥ꡼¹ԤƤߤƤ -⤷Ǥⵯưʤʤ顢@ref{Starting server} 򻲾ȤΤȡ - -@item -ĤδñʥƥȤǥСưƤ뤫ǧǤޤ -ʲΤ褦ˤʤޤ - -@example -shell> BINDIR/mysqlshow -+-----------+ -| Databases | -+-----------+ -| mysql | -+-----------+ - -shell> BINDIR/mysqlshow mysql -Database: mysql -+--------------+ -| Tables | -+--------------+ -| columns_priv | -| db | -| func | -| host | -| tables_priv | -| user | -+--------------+ - -shell> BINDIR/mysql -e "select host,db,user from db" mysql -+------+--------+------+ -| host | db | user | -+------+--------+------+ -| % | test | | -| % | test_% | | -+------+--------+------+ -@end example - -¾Υץåȥե @strong{MySQL} Υѥեޥ󥹤Ӥ뤿 - @file{sql-bench} ˥٥ޡޤ -@file{sql-bench/Results} ǥ쥯ȥˤϡ¾Υǡ١ץåȥե -٥¹Ԥ̤ޤ -ƤΥƥȤ¹ԤˤϡʲΤ褦ˤޤ - -@example -shell> cd sql-bench -shell> run-all-tests -@end example - -RPM Хʥۤˤ @file{sql-bench} ǥ쥯ȥ꤬ޤ -(RPM Υۤˤϴޤޤޤ) -ξ硢٥ޡ򥤥󥹥ȡ뤷ʤƤϤʤޤ -@strong{MySQL} 3.22 ΥХʥۤ顢 -@file{mysql-bench-VERSION-i386.rpm} Ȥ̾ RPM ѥåäƤꡢ -ˤϥ٥ޡΥǡȥɤޤޤޤ - -@file{tests} ֥ǥ쥯ȥǥƥȤ뤳ȤǽǤ -㤨С@file{auto_increment.tst} μ¹ԤϰʲΤ褦ˤޤ - -@example -shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst -@end example - -η̤ @file{./tests/auto_increment.res} ե˽񤭽Фޤ -@end enumerate - - -@node mysql_install_db, Starting server, Post-installation, Post-installation -@subsection @code{mysql_install_db} ¹Ի - -Ǥ @code{mysql_install_db} ¹ԤݤˤǤ魯⤷ʤˤĤƽҤ٤ޤ - -@table @strong -@item @code{mysql_install_db} doesn't install the privilege tables - - @code{mysql_install_db} ¥ơ֥򥤥󥹥ȡǤʤäΥåǤ -³ưʲΤ褦˥åФ硧 - -@example -starting mysqld daemon with databases from XXXXXX -mysql daemon ended -@end example - -ξ硢տ log եĴ٤Ƥ -顼å˽ФƤ @file{XXXXXX} ǥ쥯ȥ˥ե뤬ꡢ - @code{mysqld} ʤȤʤäƤϤǤ -⤷ä狼ʤ硢Υեޤ @code{mysqlbug} Ѥ -ХݡȤƤƤ -@xref{Bug reports}. - -@item There is already a @code{mysqld} daemon running - -ξ硢 @code{mysql_install_db} ¹ԤɬפϤޤ -@code{mysql_install_db} ¹ԤΤ @strong{MySQL} ƥ󥹥ȡ뤷塢 -äǤ - -@item Installing a second @code{mysqld} daemon doesn't work when one daemon is running - -ϤǤ @strong{MySQL} 󥹥ȡ뤵Ƥꡢ -󥹥ȡ㤦Ȥ˹ԤȤȯޤ -(㤨С٤ĤΥ󥹥ȡ¹Ԥʤ) -̤ˤܤΥСưƤ륵СƱݡȡåȤѤƵư褦Ȥȯޤ -ξ硢@code{Can't start server: Bind on TCP/IP port: Address already in use} 顼å -@code{Can't start server : Bind on unix socket...} 顼åФޤ -СϰʲΤ褦ˤư㤦ݡȡåȤǵưǤޤ - -@tindex MYSQL_UNIX_PORT environment variable -@tindex MYSQL_TCP_PORT environment variable -@tindex Environment variable, MYSQL_UNIX_PORT -@tindex Environment variable, MYSQL_TCP_PORT -@example -shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock -shell> MYSQL_TCP_PORT=3307 -shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT -shell> scripts/mysql_install_db -shell> bin/safe_mysqld & -@end example - -The environment variables Ͽ @code{mysqld} ˱ƶ¾δĶѿ -ޤǤޤ@xref{Environment variables} - -θ塢ĤΥǡ㤦ݡȡåȤǼ¹Ԥ褦ˡưץȤѹޤ -㤨С@code{safe_mysqld} Ľ񤭤ޤ@code{--socket}, @code{--port} @code{--basedir} - ץ򤽤줾 @code{safe_mysqld} ˻ꤷޤ - -@item @file{/tmp} ˽񤭹ߵĤ򤢤ʤäƤʤʤ - -⤷åȥեɸξ(@file{/tmp})˺뤿ν񤭹ߵĤʤʤ顢 -뤤ϡե @file{/tmp} ˺Ǥʤʤ顢 -@code{mysql_install_db} μ¹Ի뤤 @code{mysqld} εưѻ -顼ȤʤǤ礦 - -㤦ǥ쥯ȥ꡼˥åȥեեꤹˤϡ - -@tindex TMPDIR environment variable -@tindex MYSQL_UNIX_PORT environment variable -@tindex Environment variable, TMPDIR -@tindex Environment variable, MYSQL_UNIX_PORT -@example -shell> TMPDIR=/some_tmp_dir/ -shell> MYSQL_UNIX_PORT=/some_tmp_dir/mysqld.sock -shell> export TMPDIR MYSQL_UNIX_PORT -@end example - -@file{some_tmp_dir} Ͻ񤭹ߤǽʥǥ쥯ȥ꡼ꤷʤƤϤʤޤ -@xref{Environment variables}. - -θ塢@code{mysql_install_db} 餻СưǤޤ - -@example -shell> scripts/mysql_install_db -shell> BINDIR/safe_mysqld & -@end example - -@item @code{mysqld} crashes at once - -⤷ RedHat 5.0 2.0.7-5 Ť @code{glibc} ѤƤ硢 -Ƥ @code{glibc} ѥåƤʤƤϤʤޤ -˴ؤƤ @strong{MySQL} ᡼Υ֤˾¿ޤ -᡼󥰥ꥹȤΥ֤Υ󥯤 -@uref{http://www.mysql.com/doc.html, @strong{MySQL} documentation page}. -see @ref{Linux}. - -@code{mysqld} @code{--skip-grant-tables} ǵư뤳ȤǤޤ -ưʲΤ褦 @code{mysql} ѤƼʬȤμˤĤäޤ - -@example -shell> BINDIR/safe_mysqld --skip-grant-tables & -shell> BINDIR/mysql -u root mysql -@end example - -@code{mysql} ư @code{mysql_install_db} ˽񤫤Ƥ SQL ޥɤ¹Ԥޤ -ĥơ֥򥵡Сɤ߹ޤˤϡ - @code{mysqladmin flush-privileges} @code{mysqladmin reload} ¹Ԥޤ -@end table - - -@node Starting server, Automatic start, mysql_install_db, Post-installation -@subsection @strong{MySQL} Сư - -̾ @code{mysqld} СεưϡʲλĤˡΤĤǹԤޤ - -@itemize @bullet -@item -@code{mysql.server} ˤ뵯ưΥץȤϥƥεư߻˻Ȥޤ -ܺ٤ @ref{Automatic start} -@item -@code{safe_mysqld} ˤ뵯ư @code{mysqld} ؤŬڤʥץꤷ -ΥץǥСεưߤޤ -@item -NT Ǥ @code{mysqld} 򼡤Τ褦˥ӥȤƥ󥹥ȡ뤹٤Ǥ: -@example -bin\mysqld-nt --install # Install MySQL as a service -@end example - -ȡΤ褦 @code{mysqld} ư/ߤǤޤ: -@example -NET START mysql -NET STOP mysql -@end example - -: ξ mysqld Ф¾ΥץϻѤǤޤ - -Τ褦ˤƥӥǤޤ: -@example -bin\mysqld-nt --remove # remove MySQL as a service -@end example -@item -@code{mysqld} ľܵư -@end itemize - -ɤˡǥСưƤ⡢⤷ư˼ԤСեǧƤ -ʤԤϿƤޤեϥǡ١ǥ쥯ȥˤޤ -(Хʥۤξ @file{/usr/local/mysql/data} ۤξ @file{/usr/local/var} - Windows Ǥ @file{\mysql\mysql.err} ) -ǡ١ǥ쥯ȥ @file{host_name.err} @file{host_name.log} Ȥ -ե (@code{host_name} ϤʤΥС̾) õƤ -ʲΤ褦ˤƤΥեκǸοԤǧޤ - -@example -shell> tail host_name.err -shell> tail host_name.log -@end example - -@code{mysqld} ǡεưˡǡϥǡǥ쥯ȥ˥ǥ쥯ȥѤޤ -ե pid (process ID) ե뤬Υǥ쥯ȥ˽񤱤 -ƥǡ١Υǥ쥯ȥˤ򡢥ǡ׵ᤷޤ - -ǡǥ쥯ȥξʪΥѥ˻ꤵƤޤ -@code{mysqld} ʤΥƥ˥ǡ١ǥ쥯ȥ򸫤Ĥʤä硢 -Сưޤ - @code{mysqld} @code{--help} ץǵư @code{mysqld} -ǥեȤΥѥΤ뤳ȤǤޤΤǡ -Сưʤͳ㤦ѥѤƤ뤿˵äƤ뤫ɤ狼ޤ -ѥ㤦硢@code{mysqld} Υޥɥ饤ΰѥꤷơǥեͤ -񤭤뤳ȤǽǤ(饪ץ @code{safe_mysqld} ˤƱͤ˻ѤǤޤ) - -̾@strong{MySQL} 󥹥ȡ뤵줿ǥ쥯ȥΥ١ǥ쥯ȥ - @code{mysqld} ˶ФϤǤ - @code{--basedir} ץꤷޤ - @code{--help} ץѤХѥѹǧǤޤ -(@code{--help} @emph{ɬ} Ǹ˻Τ) -㤨С - -@example -shell> EXECDIR/mysqld --basedir=/usr/local --help -@end example - -ѥ꤬פ̤˸äȤǧ顢 @code{--help} ץ򳰤ƥСưޤ - -ʲΥ顼ξ硢¾Υץʤ¾ @code{mysqld} Сˤ -@code{mysqld} Ѥ褦ȤƤ TCP/IP åȤȤäƤޤ - -@example -Can't start server: Bind on TCP/IP port: Address already in use - or -Can't start server : Bind on unix socket... -@end example - -¾ @code{mysqld} СäƤʤ @code{ps} dzǧޤ -⤷¾ΥСưƤʤʤ顢 @code{telnet your-host-name tcp-ip-port-number} -ޥɤ¹Ԥ @code{RETURN} 򤿤ƤߤƤ -⤷ @code{telnet: Unable to connect to remote host: Connection refused} Τ褦 -顼Ф硢ʤˤ @code{mysqld} Ѥ褦ȤƤݡȤ˻ȤäƤޤ -@xref{mysql_install_db, , @code{mysql_install_db}}, and @ref{Multiple -servers}. - -@code{safe_mysqld} ץȤϡۤǤХʥۤ @strong{MySQL} Ǥ⡢ -Ȥ㤦˥󥹥ȡ뤵ƤƤ⡢СưǤ褦˺Ƥޤ - @code{safe_mysqld} ϰʲΤɤ줫ĤǤ뤳ȤԤޤ - -@itemize @bullet -@item - @code{safe_mysqld} ư줿ȥǥ쥯ȥ꤫Хѥˡ -Сȥǡ١硣 - @code{safe_mysqld} @file{./bin}, @file{./data} ǥ쥯ȥ(Хʥʪξ) -뤤 @file{./libexec}, @file{./var} ǥ쥯ȥ(ʪξ)õޤ -ʤ @strong{MySQL} 򥤥󥹥ȡ뤷ǥ쥯ȥ(㤨 @file{/usr/local/mysql} ǥ쥯ȥ) - @code{safe_mysqld} ¹Ԥ硢ξŬ礷ޤ - -@item -Сȥǡ١Хѥʲˤʤ硢@code{safe_mysqld} ХѥǤõޤ -ŵŪʥǥ쥯ȥ @file{/usr/local/libexec} @file{/usr/local/var} Ǥ -ºݤΥǥ쥯ȥ @code{safe_mysqld} ʪȤ˷ޤ - @strong{MySQL} 󥹥ȡ뤵줿ɸΥѥ֤ƤʤФʤޤ -@end itemize - -@code{safe_mysqld} ϥСȥǡ١ʬư줿ǥ쥯ȥ꤫Хѥõޤ -äơ @code{safe_mysqld} @strong{MySQL} Υ󥹥ȡǥ쥯ȥ꤫鵯ư¤ϡ - @strong{MySQL} ХʥʪʬιʤȤ˥󥹥ȡǤޤ -ξεưϡ - -@example -shell> cd mysql_installation_directory -shell> bin/safe_mysqld & -@end example - -⤷ @code{safe_mysqld} @strong{MySQL} 󥹥ȡǥ쥯ȥ꤫鵯ưƤ⼺Ԥʤ顢 -@code{safe_mysqld} 򤢤ʤΥƥѤ @code{mysqld} Υѥѥ̾Υץ -񤭴Ƥ⤫ޤޤ -ξ硢 @strong{MySQL} 򥢥åץ졼ɤ硢ʤѹ - @code{safe_mysqld} Ͼ񤭤ΤǡѹΤϥ󥹥ȡ˥ԡƤ -ƤᤵʤƤϤʤޤ - -⤷ @code{mysqld} ǤäƤ硢ʲΥޥɤˤƥѥΤ뤳ȤǤޤ - -@example -shell> mysqladmin variables - -or - -shell> mysqladmin -h 'your-host-name' variables -@end example - -⤷ @code{safe_mysqld} СưƤ³Ǥʤ褦ʤ顢 - @file{/etc/hosts} ե˰ʲΤ褦ʵҤƤ - -@example -127.0.0.1 localhost -@end example - -ϥåɥ饤֥꡼ʤ @strong{MySQL} MIT-pthreads -Ѥ褦ˤƺäƥˤޤ - -Windows ǤϡΤ褦ˤ @code{mysqld} εưߤ뤳ȤǤޤ: - -@example -C:\mysql\bin\mysqld --standalone --debug -@end example - -ϡХåɤư@file{\mysqld.traec} ˥ȥ졼 -Фޤθ褹ˤʤޤ@xref{Win32} - -@node Automatic start, Option files, Starting server, Post-installation -@subsection @strong{MySQL} μưưȼư - -@code{mysql.server} ץȤ @code{start}, @code{stop} ꤹ뤳Ȥˤ -СưߤǤޤ - -@example -shell> mysql.server start -shell> mysql.server stop -@end example - -@code{mysql.server} @strong{MySQL} 󥹥ȡǥ쥯ȥ @file{share/mysql} ǥ쥯ȥꡢ -ޤ @strong{MySQL} ĥ꡼ @file{support-files} ǥ쥯ȥˤޤ - -@code{mysql.server} ϥСư @strong{MySQL} 󥹥ȡ뤵줿 -ǥ쥯ȥ˥ǥ쥯ȥѤ@code{safe_mysqld} ưޤ -⤷ɸʳ˥󥹥ȡ뤷ƤХʥۤѤƤʤ顢 -@code{mysql.server} Խɬפ뤫⤷ޤ -@code{safe_mysqld} ưǥ쥯ȥ @code{cd} 褦ѹޤ -@code{safe_mysqld} ¾ΥץͿ褦 @code{mysql.server} ѤƤ⹽ޤ -¾Υ桼Ǽ¹Ԥ硢@code{mysql_daemon_user=root} ѹƤ⹽ޤ -@code{safe_mysqld} ¾ΥץͿ뤿ˡ -@code{mysql.server} ѹƤ⹽ޤ - -@code{mysql.server stop} ϥС˥ʥäƥСߤޤ -@code{mysqladmin shutdown} ǼưǥСȤȤǤޤ - -@strong{MySQL} ѤƤʤΤˡ饹ȡȥåפ - @file{/etc/rc*} ˽񤭤Ȼפ뤫⤷ޤ -Ǥϡѹ @code{mysql.server} ϡ - @strong{MySQL} 򥢥åץ졼ɤȤ˾񤭤ȤȤǤ -äơѹΤϥ󥹥ȡ˥ԡäƤ٤Ǥ - -⤷ʤΥƥब @file{/etc/rc.local} ưץȤȤƻѤƤʤ顢 -ʲΤ褦ˤ˵Ҥޤ - -@example -/bin/sh -c 'cd /usr/local/mysql ; ./bin/safe_mysqld &' -@end example - -ХեǤ @file{/etc/my.cnf} ˡ @code{mysql.server} -ץ򵭽Ҥ뤳ȤǽǤ@file{/etc/my.cnf} եϰʲΤ褦 -ҤˤʤäƤޤ - -@example -[mysqld] -datadir=/usr/local/mysql/var -socket=/tmp/mysqld.sock -port=3306 - -[mysql.server] -user=mysql -basedir=/usr/local/mysql -@end example - -@code{mysql.server} ץȤϰʲѿѤޤ -@code{user}, @code{datadir}, @code{basedir}, @code{bindir} @code{pid-file}. - -@xref{Option files}. - -@cindex Default options -@cindex Option files -@node Option files, , Automatic start, Post-installation -@subsection ץե ( @code{my.cnf} ) - -@strong{MySQL} 3.22 ΥС饤ȤȤˡץե뤫ǥեȤεưץɤ߹ळȤǤޤ - -UNIX Ǥ @strong{MySQL} ϰʲΥե뤫ǥեȥץɤߤޤ - -@tindex .my.cnf file -@multitable @columnfractions .3 .7 -@item @strong{ե̾} @tab @strong{̣} -@item @code{/etc/my.cnf} @tab ΤΥץ -@item @code{DATADIR/my.cnf} @tab иͭץ -@item @code{~/.my.cnf} @tab 桼ͭץ -@end multitable - -@code{DATADIR} @strong{MySQL} ǡǥ쥯ȥǤ ( -@file{/usr/local/mysql/data} or @file{/usr/local/var}). -Υǥ쥯ȥconfigure˷ꤵƤꡢ @code{--datadir} @code{mysqld} ư˻ꤷƤѹޤ -(Сϥޥɥ饤ΰ˥ץեõޤ -äơ@code{--datadir} ꤷƤ⥪ץեõꤹ뤳ȤˤϤʤޤ) - -Win32 Ǥ @strong{MySQL} ϰʲΥե뤫ǥեȥץɤߤޤ - -@multitable @columnfractions .3 .7 -@item @strong{ե̾} @tab @strong{̣} -@item @code{windows-system-directory\my.ini} -@item @code{C:\my.cnf} @tab ΤΥץ -@item @code{C:\mysql\data\my.cnf} @tab иͭץ -@end multitable - -: Win32 Ǥ @code{\} @code{/} ƤΥѥ򵭽Ҥ٤ -@code{\} Ѥ硢@code{\} @strong{MySQL} Υʸ -ʤΤǡŤ˵Ҥɬפޤ - -@cindex Environment variables -@strong{MySQL} Ͼ嵭ɽˤƤ˥ץեɤߤޤ -⤷ʣץե뤬ä硢夫ɤޤ줿꤬ͭˤʤޤ -ƤΥץϥޥɥ饤ΰ˾񤭤ޤ -ĤΥץϴĶѿǤޤ -ץեȥޥɥ饤ΰϴĶѿ񤭤ޤ - -ʲΥץϥץե򥵥ݡȤޤ@code{mysql}, -@code{mysqladmin}, @code{mysqld}, @code{mysqldump}, @code{mysqlimport}, -@code{myisamchk} and @code{myisampack}. - -ץեˤϡץबݡȤƤ륳ޥɥ饤 long ץ(㤨С@code{-u} ǤϤʤ @code{--user} )񤯤ȤǤޤ -ץ @code{--help} ǵưСǽѿ̾ޤ - -ץեν񼰤ϰʲǤ - -@table @code -@item #comment -Ȥ @samp{#} @samp{;} ʸǻϤޤιԤ̵뤷ޤ - -@item [group] -롼 -@code{group} ϥץץफ롼פ̾Ǥ -θ塢@code{ץ} @code{set-variable} ԤǡΥ롼פ˥ץͿޤ -ΥϰϤϡ¾Υ롼ιԤ뤫եκǸޤǤǤ - -@item option -ϥޥɥ饤 @code{--option} Ǥ - -@item option=value -ϥޥɥ饤 @code{--option=value} Ǥ - -@item set-variable = variable=value -ϥޥɥ饤 @code{--set-variable variable=value} Ǥ - @code{mysqld} ѿǻѤǤ -@end table - -@code{client} 롼פϡƤ @strong{MySQL} 饤(@code{mysqld}Ͻ)Фƥץޤ -ϥС³ݤ˻ѤѥɤǤ륰롼פǤ -(ξ硢ץեϼʬɤ߽񤭤Ǥ褦ˤƤ) - -ץͤˤƤΥ֥ʸϼưǼޤ -ͤȤơ@samp{\b},@samp{\t}, @samp{\n}, @samp{\r}, @samp{\\} and @samp{\s} - Υץ󥹤ѤǤޤ -(@samp{\s} == blank). - -ץե㡧 - -@example -[client] -port=3306 -socket=/tmp/mysql.sock - -[mysqld] -port=3306 -socket=/tmp/mysql.sock -set-variable = key_buffer_size=16M -set-variable = max_allowed_packet=1M - -[mysqldump] -quick -@end example - -桼ץե㡧 - -@example -[client] -# The following password will be sent to all standard MySQL clients -password=my_password - -[mysql] -no-auto-rehash -@end example - -@tindex .my.cnf file -⤷ۤäƤʤ顢 @file{my-xxxx.cnf} Ȥ̾Υץե @file{support-files} ǥ쥯ȥ˸뤳ȤǤޤ -⤷ХʥۤѤƤʤ顢 @file{DIR/share/mysql} ǥ쥯ȥõƤ -( @code{DIR} @strong{MySQL} 󥹥ȡ뤵줿ǥ쥯ȥΥѥ̾ǡ̤ @file{/usr/local/mysql}) - @file{my-xxxx.cnf} եʬΥǥ쥯ȥ @file{.my.cnf} Ȥ̾ǥԡƻѤǤޤ - -@strong{MySQL} ץ˥ץեɤޤʤ褦ˤˤϡ -ޥɥ饤ΰֺǽ @code{--no-defaults} 񤭤ޤ -ϥץκǽǤʤͭˤʤޤ -ɤΥץƤ뤫Τˤϡ@code{--print-defaults} ǽΥץ˻ꤷޤ - -ΥեեŪ˻Ѥ硢ץ -@code{--defaults-file=ǥեȥեΥեѥ} ѤǤޤ -Ԥʤ硢ꤷեɤޤޤ - -ȯԸ󡧡ץեƤΥץ򥳥ޥɥ饤ΰ˽褦˴ñޤƤޤ -ϥץǸ˽ץʣΩԹ褯ưޤ -⤷ץեɤ߹ൡǽΤʤŤץѤƤʤ顢 -äԤդƽ񤱤ФǤ -ưˤĤƤ @strong{MySQL} 饤ȥץΥɤ򻲹ͤˤƤ - - -@node Upgrade, , Post-installation, Installing -@section @strong{MySQL} Υåץ졼/󥰥졼ɻ̤˹ԤʤȤ뤫 - -@strong{MySQL} ȥǡեϡ@strong{MySQL} Ʊ١С -Ǥ¤ꡢƱƥΰۤʤС֤ǤĤǤưǤ -ޤߤΥ١С 3 Ǥ@strong{MySQL} μ¹Ի -ʸåȤѹ줿(ϥȽѹޤ)ƤΥơ֥ - @code{myisamchk -r -q} ԤʤɬפޤʤСǥ -ˤʤޤ - -⤷ʤмä꿷С򶲤Ƥ硢ĤǤ⤢ -θŤ @code{mysqld} @code{mysqld}-'old-version-number' Τ褦ʲ -˥͡Ǥޤ⤷ @code{mysqld} ͽ̲Ԥä -硢ñˤ򥷥åȥ󤷡Ť @code{mysqld} Ƶư뤳Ȥ -Ǥޤ - -åץ졼ɻˤϡ󡢸Ťǡ١Хååפ⤷Ƥ -٤ǤϾмˤʤΤɤȤǤ - -åץ졼ɸ塢ƥѥ뤵줿饤ȥץǡ -@code{Commands out sync} ͽ̥פΤ褦꤬硢 -餯ץΥѥ˸Ťإå饤֥ե -ΤǤ礦ξ硢@file{mysql.h} ե @file{libmysql.a} -֥꤬ @strong{MySQL} ۤΤΤǤ뤫ɤΤ -ˡդå٤Ǥ⤷äƤСץƥ -뤷Ƥ - -⤷ @code{mysqld} СưǤʤȤѥ̵ -³ǤʤȤĤ꤬ȯ硢Υ󥹥ȡǤǤ -Ť @file{my.cnf} ե뤬뤫ɤǧƤ -@code{program-name --print-defaults} dzǧǤޤ. ⤷νϤ -ץ̾ΰʳʪ֤硢ͭˤʤäƤ @code{my.cnf} ե뤬 -ޤ - -꡼ @strong{MySQL} 򥤥󥹥ȡ뤷˾ - @code{Msql-Mysql-modules} ƹۡƥ󥹥ȡ뤹뤳Ȥ -ͤǤ٤Ƥ @code{DBI} ץȤ @strong{MySQL} -åץ졼ɸ˥פ˵Ťϡä -Ƥ - -@menu -* Upgrading-from-3.22:: 3.22 3.23 СؤΥåץ졼 -* Upgrading-from-3.21:: 3.21 3.22 СؤΥåץ졼 -* Upgrading-from-3.20:: 3.20 3.21 СؤΥåץ졼 -* Upgrading-to-arch:: ¾ΥƥؤΥåץ졼 -@end menu - -@cindex Compatibility, between MySQL versions -@node Upgrading-from-3.22, Upgrading-from-3.21, Upgrade, Upgrade -@subsection 3.22 3.23 СؤΥåץ졼 - -@strong{MySQL} 3.23 Ͽ @code{MyISAM} Υơ֥ȡŤ @code{ISAM} -ơ֥򥵥ݡȤޤ -3.23 ѤݡŤơ֥(ISAM) ѴɬפϤޤ -ǥեȤǤϡơ֥뤬 @code{MyISAM} ˤʤޤ -( @code{mysqld} @code{--default-table-type=isam} ץ -ư뤳ȤˤꡢѹǤޤ) - @code{ISAM} ơ֥ @code{MyISAM} ѹˤϡ - @code{ALTER TABLE} Ѥ뤫@code{mysql_convert_table_format} -perl ץȤѤޤ - -3.22 3.21 Υ饤Ȥʤ 3.23 Сưޤ - -ʲˡ3.23 ˥åץ졼ɤȤˡܤɬפΤ󤷤ޤ - -@itemize @bullet -@item @code{IF} ΥǥեȤͷϸξΰ˰¸ޤǽΰǤϤޤ -@item @code{AUTO_INCREMENT} ǤƯޤ -@item @code{INNER} @code{DELAYED} ϡͽˤʤޤ -@item @code{FLOAT(X)} ưˤʤޤͤǤϤޤ -@item @code{DECIMAL(length,dec)} length ϤϤ侮ξޤߤޤ -@item @code{TIME} ʸϰʲΥեޥåȤΤ줫ǤʤФʤޤ -@code{[[[DAYS] [H]H:]MM:]SS[.fraction]} -@code{[[[[[H]H]H]H]MM]SS[.fraction]} -@item @code{LIKE} ϡƱʸ @code{'='} 롼Ѥơ -ӤԤ褦ˤʤޤ -⤷ŤˡˤʤС @strong{MySQL} @code{CXXFLAGS=-DLIKE_CMP_TOUPPER} - ե饰ǥѥ뤷ޤ -@item @code{REGEXP} ϡ̾ʸ( binary) Ǥϡ¸ˤʤޤ -@item @code{MyISAM} ơ֥(@code{.MYI}) θˤϡ@code{CHECK TABLE} -Ѥ뤫@code{myisamchk} Ѥޤ -@code{isamchk} ISAM(@code{.ISM}) ơ֥Ѥ˻Ѥޤ. -@item ⤷3.22 3.23 δ֤Ǹߴ @code{mysqldump} ԤʤС - @code{--opt} @code{--full} ץ @code{mysqldump} ˻ꤷƤϤޤ -@item Ƥ @code{DATE_FORMAT()} åƤ -ƥեޥåʸˤ @samp{%} ʸɬפˤʤޤ -(@strong{MySQL} 3.22 СʹߤǤϤʸˡޤ) -@item -@code{mysql_fetch_fields_direct} ؿˤʤ (ޤǤϥޥäΤ) -@code{MYSQL_FIELD} ǤϤʤ @code{MYSQL_FIELD} ݥ󥿡֤ޤ -@item -@code{mysql_num_fields()} ϡ @code{MYSQL*} object ϤȤȤǤޤ -(Ϻ @code{MYSQL_RES*} ˼ؿˤʤޤ) -ˡ @code{mysql_field_count()} Ѥ٤Ǥ -@item -@code{MySQL} 3.22 Ǥ, @code{SELECT DISTINCT ...} νϤ -ۤȤɤĤ⥽Ȥޤ 3.23 Ǥ, ȤԤä̤ˤ -@code{GROUP BY} @code{ORDER BY} ѤʤƤϤʤޤ -@item -⤷פ쥳ɤ̵ä硢@code{SUM()} 0 @code{NULL} ֤褦ˤʤޤ - ANSI SQL Ǥ -@item -ͽ: @code{CASE, THEN, WHEN, ELSE and END} -@item @code{NULL} ͤǤ @code{AND} @code{OR} ϸ 0 ǤϤʤ -@code{NULL} ֤ޤ -This mostly affects queries that uses @code{NOT} -on an @code{AND/OR} expression as @code{NOT NULL} = @code{NULL}. -@end itemize - -@cindex Compatibility, between MySQL versions -@node Upgrading-from-3.21, Upgrading-from-3.20, Upgrading-from-3.22, Upgrade -@subsection 3.21 3.22 СؤΥåץ졼 - -3.21 3.22 δ֤ˤϸߴ˱ƶѹϤޤ@code{DATE} -ȼä줿ơ֥ϡդγǼ˿ˡѤ뤳Ȥ - pitfall Ǥοեɤ˸ŤС -@code{mysqld} 饢뤳ȤϤǤޤ - -@code{MySQL 3.22} 󥹥ȡ塢Ф򳫻Ϥơ -@code{mysql_fix_privilege_tables} ץȤ¹Ԥ٤Ǥ -@code{GRANT} ޥɤѤ뤿ɬפʸ¤ɲäޤ˺ -ȡ@code{ALTER TABLE} @code{CREATE/DROP INDEX} Ѥ褦Ȥ - @code{Access denied} ˤʤޤ@strong{MySQL} root 桼ѥ -ɤ׵᤹硢@code{mysql_fix_privilege_tables} ؤΰȤƤ -ͿƤ - -C API 󥿥ե @code{mysql_real_connect()} ѹޤ -ؿƤӽФŤ饤ȥץäƤϡ -@code{db} @code{0} ֤(ޤϤ®³Τ @code{db} -Ǥ褦˥饤Ȥ򥳡ǥ󥰤ʤ)ɬפޤ -@code{mysql_real_connect()} ƤӽФ -@code{mysql_init()} ƤФʤƤϤʤޤ -ѹϡ@code{MYSQL} ι¤Τ˥ץ¸뤿 - @code{mysql_options()} ؿͭˤޤ - -@code{mysqld} ѿ @code{key_buffer} @code{key_buffer_size} ̾ -Ѥޤޤ̾⥹ȥåץեǻѤǤ - - - -@node Upgrading-from-3.20, Upgrading-to-arch, Upgrading-from-3.21, Upgrade -@subsection 3.20 3.21 СؤΥåץ졼 - - 3.20.28 ΥС󤬲ƯƤơ3.21.x ѹϡ -Ԥʤɬפޤ: - -@code{safe_mysqld --old-protocol} @code{mysqld} 3.21 Фư -С3.20 ۤΥ饤ȤǤѤǤޤξ硢 -饤ȴؿ @code{mysql_errno()} ϥФΥ顼ϲ֤ -@code{CR_UNKNOWN_ERROR} ֤ޤ (饤ȤΥ顼ˤĤ -ƤƯޤ) ФϸŤ password() å򿷤Τ -˻Ѥޤ - -@code{mysqld} @code{--old-protocol} ץ@emph{Ȥʤ}硢 -ѹ򤹤ɬפޤ: - -@itemize @bullet -@item -ƤΥ饤ȥɤϺƥѥ뤹ɬפޤODBC Ѥ -ƤϿ @strong{MyODBC} 2.x ɥ饤Фꤹɬפޤ -@item -@code{mysql.user} ơ֥ @code{password} եɤ -@code{CHAR(16)} Ѵ뤿ˡץ -@code{scripts/add_long_password} ¹Ԥɬפޤ -@item -ƤΥѥɤ @code{mysql.user} ơ֥˺֤ɬפ -(31ӥåȥѥɤˡ62ӥåȤ뤿) -@item -ơ֥ѹƤʤΤǡɤΥơ֥ѴɬפϤޤ - -@end itemize - -@strong{MySQL} 3.20.28 Ȥʹߤϡ饤Ȥ˱ƶڤܤˡ - @code{user} ơ֥뤳ȤǤޤ3.20.28 -@strong{MySQL} СäƤϡ@code{user} ơ֥Ѵ -ȡѥɤϤξǤϤ⤦Ưޤ󡣰Τᡢǽ˾ʤ - 3.20.28 ˥åץ졼ɤ줫 3.21.x ˥åץ졼ɤ٤ - - -@cindex Protocol mismatch -饤ȥɤ 3.20.x @code{mysqld} ФưΤǡ - 3.21.x ꤬äϡ饤Ȥ⤦ٺƥѥ뤹ɬ -פϤʤŤ 3.20.x ФѤ뤳ȤǤޤ - -@code{mysqld} @code{--old-protocol} ץѤʤ硢Ť -饤Ȥϥ顼åȯޤ: - -@example -ERROR: Protocol mismatch. Server Version = 10 Client Version = 9 -@end example - - Perl 󥿥ե @code{DBI}/@code{DBD} ϸŤ @code{mysqlperl} -󥿥ե⥵ݡȤޤ@code{mysqlperl} Ѥ˹Ԥɬ -פΤѹϡ@code{connect()} ؿΰѹǤ: -@code{host}, @code{database}, @code{user}, @code{password} (@code{user} - @code{password} ν֤ѹޤ) -@xref{Perl DBI Class, , Perl @code{DBI} Class}. - -ѹϸŤץꥱǤΥ˱ƶޤ: - -@itemize @bullet -@item -@code{HAVING} ϸ @code{ORDER BY} ˤʤФޤ -@item -@code{LOCATE()} ؤΥѥ᡼ϸ򴹤ޤ -@item -ͽ줬ĤޤǤդ٤ @code{DATE}, -@code{TIME} @code{TIMESTAMP} Ǥ -@end itemize - -@node Upgrading-to-arch, , Upgrading-from-3.20, Upgrade -@subsection ¾ΥƥؤΥåץ졼 - -⤷@strong{MySQL} 3.23 ѤƤʤС -㤦ƥΥޥˡ@code{.frm}, @code{.MYI},@code{.MYD} ե -ԡ뤳Ȥޤ -ξԴ֤ǡƱưΥեޥåȤ򥵥ݡȤƤ˸¤ޤ -(@strong{MySQL} takes care of any byte swapping issues). - - @strong{MySQL} ǡȥǥåե (@code{ISAM} @file{*.ISD} -@file{*.ISM} ե) ϥƥ¸ǡĤΥǤ OS -¸Ǥץꥱ򡢸ߤΥޥȤϰۤʤ륢ƥ/OS -¾Υޥ˰ܤϡñ˥ե¾Υޥ˥ԡ뤳 -Ȥǥǡ١ܹԤ褦Ȥ٤ǤϤޤ@code{mysqldump} -Ѥ٤Ǥ - -ǥեȤǤ @code{mysqldump} ϡ SQL ơȥȥե -ޤ줫餽Υե¾Υޥž@code{mysql} -ȤؤϤȤͿ뤳ȤǤޤ - -ͭʥץ󤬲򸫤뤿ˤϡ@code{mysqldump --help} Ƥ -ǡ @strong{MySQL} Τ꿷С˰ܤ硢® -ѥȤʥפ뤿ˡ꿷С @code{mysqldump --opt} -Ѥ٤Ǥ - -ĤΥޥ֤ǥǡ١ưǤñ (Ǥ®Ϥʤ) -ˡϡǡ١֤ƤޥǼΥޥɤ¹Ԥ뤳Ȥ -: - -@example -shell> mysqladmin -h 'other hostname' create db_name -shell> mysqldump --opt db_name \ - | mysql -h 'other hostname' db_name -@end example - -٤ͥåȥǥ⡼ȥޥ󤫤ǡ١򥳥ԡϡ -ѤǤޤ: - -@example -shell> mysqladmin create db_name -shell> mysqldump -h 'other hostname' --opt --compress db_name \ - | mysql db_name -@end example - -եη̤Ǽ뤳ȤǤޤ (Ǥϰ̤Ƥޤ): - -@example -shell> mysqldump --quick db_name | gzip > db_name.contents.gz -@end example - -ǡ١ȤޤǤեŪΥޥžơΥ -ޥɤ¹ԤƤ: - -@example -shell> mysqladmin create db_name -shell> gunzip < db_name.contents.gz | mysql db_name -@end example - -@cindex @code{mysqldump} -@cindex @code{mysqlimport} -ǡ١ž¹Ԥ뤿ˡ@code{mysqldump} @code{mysqlimport} -ѤǤޤ礭ʥơ֥Ǥϡñ @code{mysqldump} λ -ȤƤ®Ǥ˼ޥɤǤϡ@code{DUMPDIR} -@code{mysqldump} νϤǼ뤿˻Ѥǥ쥯ȥδ -ѥ̾ɽ路Ƥޤ - -ޤϥեΤΥǥ쥯ȥơǡ١פ -ޤ: - -@example -shell> mkdir DUMPDIR -shell> mysqldump --tab=DUMPDIR db_name -@end example - -줫顢@code{DUMPDIR} ǥ쥯ȥΥեŪΥޥб -ǥ쥯ȥž@strong{MySQL} ˥եɤޤ: - -@example -shell> mysqladmin create db_name # create database -shell> cat DUMPDIR/*.sql | mysql db_name # create tables in database -shell> mysqlimport db_name DUMPDIR/*.txt # load data into tables -@end example - -@code{mysql} ǡ١Υԡ˺ʤǤϾǧơ - (@code{user}, @code{db}, @code{host}) Ǽ뤿Ǥ -@code{mysql} ǡ١򤽤ξ֤ޤǡޥǤ -@strong{MySQL} @code{root} 桼Ȥƥޥɤ¹Ԥɬפޤ - -ޥ @code{mysql} ǡ١Ƴ塢Фǧơ -֥ƥɤ뤿ˡ@code{mysqladmin flush-privileges} ¹ԤƤ - -@cindex Compatibility, with ANSI SQL -@node Compatibility, Privilege system, Installing, Top -@chapter @strong{MySQL} ϤɤΤ褦ɸߴ - -@menu -* Extensions to ANSI:: @strong{MySQL} ANSI SQL92 Фĥ -* Ansi mode:: Runnning @strong{MySQL} in ANSI mode -* Differences from ANSI:: @strong{MySQL} differences compared to ANSI SQL92 -* Missing functions:: @strong{MySQL} ̵ǽ -* Standards:: @strong{MySQL} 򤹤ɸ -* Commit-rollback:: @code{COMMIT}/@code{ROLLBACK} ʤǤޤˡ -@end menu - - -@node Extensions to ANSI, Ansi mode, Compatibility, Compatibility -@section @strong{MySQL} ANSI SQL92 Фĥ - -@strong{MySQL} ϡ¾ SQL ǡ١˸ʤǤĤ -γĥޤǤޤʤѤ硢ɤ¾ SQL -Ф˰ܹԤǤʤʤΤդƤĤΥǤϡ -@code{/*! ... */} ΥȤѤ뤳Ȥǡ@strong{MySQL} ĥޤ -ܹԲǽɤ񤯤ȤǤޤξ硢@strong{MySQL} ϥ -Υɤ¹ԤޤۤSQLСϤ̵뤷ޤ㤨: - -@example -SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ... -@end example - -@code{'!'} θ˥Сֹɲäȡʸˡ @strong{MySQL} С -󤬻ѤСֹ礭ˤΤ߼¹Ԥޤ: - -@example -CREATE /*!32302 TEMPORARY */ TABLE (a int); -@end example - -嵭 3.23.02 ʾξȤ̣ǡΤȤ @strong{MySQL} -@code{TEMPORARY} ɤѤޤ - -@strong{MySQL} ĥʲ˼ޤ: - -@itemize @bullet -@item -եɷ @code{MEDIUMINT}, @code{SET}, @code{ENUM} ͡ -@code{BLOB} @code{TEXT} - -@item -ե° @code{AUTO_INCREMENT}, @code{BINARY}, @code{NULL}, @code{UNSIGNED} -@code{ZEROFILL} - -@item -ƤʸӤϥǥեȤǤϥ¸ǡߤʸå(ǥե -ȤǤ ISO-8859-1 Latin1)˽äȽǤ򹥤ޤʤϡ -@code{BINARY} °ǤʤΥեɤ٤Ǥϡ@strong{MySQL} -ХۥȤξǻѤ ASCII ˽äӤ¹Ԥ褦ˤʤ -ޤ - -@item -@strong{MySQL} ϥǡ١@strong{MySQL} ǡǥ쥯ȥ -ʲΥǥ쥯ȥˡ -ơ֥ǡ١ǥ쥯ȥʲΥե̾ -ޥåפޤϣĤδطޤ: - -@itemize @minus -@item -@cindex Database names, case sensitivity -@cindex Table names, case sensitivity -@cindex Case sensitivity, of database names -@cindex Case sensitivity, of table names -¸Υե̾ OS (UNIXΤ褦) @strong{MySQL} Ǥϡ -ǡ١̾ȥơ֥̾ϥ¸Ǥ -ơ֥̾ε꤬硢˥ǡ١ȥơ֥ -ʸȤˡӤƱ褦̿̾褦ˤޤ - -@item -ơ֥ΥХåå, ͡, ư, , ԡɸॷƥॳޥ -ɤѤǤޤ㤨Сơ֥͡हˤϡơ֥б -@file{.MYD}, @file{.MYI}, @file{.frm} ե͡षƤ -@end itemize - -@item -SQL ʸǤϡ @code{db_name.tbl_name} ʸѤư㤦ǡ١Υơ֥˥Ǥޤ -ĤSQLСƱͤεǽ󶡤ޤ @code{User space} ǥ뤷ޤ -@strong{MySQL} ϰʲΤ褦ʥơ֥륹ڡ򥵥ݡȤޤ: -@code{create table ralph.my_table...IN my_tablespace}. - -@item -ͥեɾǤ @code{LIKE} ޤ - -@item -@code{SELECT} ơȥ @code{INTO OUTFILE} -@code{STRAIGHT_JOIN} λѡ@xref{SELECT, , @code{SELECT}}. - -@item -ɤΤ褦˥ơ֥뤬礵뤫ξܺ٤뤿 @code{EXPLAIN SELECT} - -@item -ǥå̾եɤΰΥǥå @code{CREATE TABLE} -ơȥ @code{INDEX} ޤ @code{KEY} λѡ -@xref{CREATE TABLE, , @code{CREATE TABLE}}. - -@item -@code{CREATE TABLE} Ǥ @code{TEMPORARY} @code{IF NOT EXISTS} λѡ - -@item -'list' Ǥİʾ @code{COUNT(DISTINCT list)} λѡ - -@item -@code{ALTER TABLE} ơȥ @code{CHANGE col_name}, @code{DROP col_name}, -@code{DROP INDEX} λѡ -@xref{ALTER TABLE, ,@code{ALTER TABLE}}. - -@item -@code{ALTER TABLE} ơȥ @code{IGNORE} λѡ - -@item -@code{ALTER TABLE} ơȥʣ @code{ADD}, @code{ALTER}, -@code{DROP}, @code{CHANGE} λѡ - -@item - @code{IF EXISTS} դ @code{DROP TABLE} λѡ - -@item -ʣΥơ֥ @code{DROP TABLE} ˴Ǥ - -@item -@code{DELETE} ơȥȤ @code{LIMIT} ᡣ - -@item -@code{INSERT} @code{REPLACE} ơȥȤ @code{DELAYED} ᡣ - -@item -@code{INSERT}, @code{REPLACE}, @code{DELETE}, @code{UPDATE} ơȥ - @code{LOW_PRIORITY} ᡣ - -@cindex Oracle compatibility -@cindex Compatibility, with Oracle -@item -@code{LOAD DATA INFILE} λѡ¿ξ硢ιʸ ORACLE -@code{LOAD DATA INFILE} ȸߴޤ@xref{LOAD DATA, , @code{LOAD DATA}}. - -@item -@code{OPTIMIZE TABLE} ơȥȡ -@xref{OPTIMIZE TABLE, , @code{OPTIMIZE TABLE}}. - -@item -@code{SHOW} ơȥȡ -@xref{SHOW, , @code{SHOW}}. - -@item -@samp{'} Ǥʤ @samp{"} ޤ @samp{'} ˤäʸ뤳Ȥ -ǽ - -@item - @samp{\} ʸλѡ - -@item -@code{SET OPTION} ơȥȡ@xref{SET OPTION, , @code{SET OPTION}}. - -@item -@code{GROUP BY} ƤΥեɤɬפϤޤ -This gives better performance for some very specific, but quite normal -queries. -@xref{Group by functions}. - -@item -ۤʤ SQL Ķ褿桼Фñˤ뤿ᡢ@strong{MySQL} -¿δؿ̾򥵥ݡȤƤޤ㤨СƤʸؿ ANSI -SQL ODBC ʸξ򥵥ݡȤޤ - -@item -@strong{MySQL} @code{||} @code{&&} 黻ҤC ץߥ󥰸 -Τ褦ˡ¤Ѥ̣򤷤ޤ@strong{MySQL} Ǥ -@code{||} @code{OR}@code{&&} @code{AND} ƱǤɤ -ʸΤᡢ@strong{MySQL} ANSI SQL ʸ黻 @code{||} 򥵥ݡ -Ȥޤ@code{CONCAT()} ˻ѤƤ@code{CONCAT()} -ǤդοΰѤǤΤǡ@code{||} 黻ҤλѤ -@strong{MySQL} ѴΤϴñǤ - -@item -@code{CREATE DATABASE} ޤ @code{DROP DATABASE}. -@xref{CREATE DATABASE, , @code{CREATE DATABASE}}. - -@cindex PostgreSQL compatibility -@cindex Compatibility, with PostgreSQL -@item -@code{MOD()} Ʊ @code{%} @code{N % M} @code{MOD(N,M)} Ǥ -@code{%} C ץޡ PostgreSQL ȤθߴΤ˥ݡȤޤ - -@item -եɥơȥȤǤ @code{=}, @code{<>}, @code{<=} ,@code{<}, -@code{>=}, @code{>}, @code{<<}, @code{>>}, @code{<=>}, -@code{AND}, @code{OR}, @code{LIKE} -㤨С - -@example -mysql> SELECT col1=1 AND col2=2 FROM tbl_name; -@end example - -@item -@code{LAST_INSERT_ID()} ؿ -@xref{mysql_insert_id, , @code{mysql_insert_id()}}. - -@item -@code{REGEXP} ޤ @code{NOT REGEXP} - -@item -1Ĥޤ2ʾΰǤ @code{CONCAT()} ޤ @code{CHAR()} -@strong{MySQL} ǤϡδؿǤդοΰ뤳ȤǤޤ - -@item @code{BIT_COUNT()}, @code{CASE}, @code{ELT()}, -@code{FROM_DAYS()}, @code{FORMAT()}, @code{IF()}, @code{PASSWORD()}, -@code{ENCRYPT()}, @code{md5()}, @code{ENCODE()}, @code{DECODE()}, -@code{PERIOD_ADD()}, @code{PERIOD_DIFF()}, @code{TO_DAYS()}, -@code{WEEKDAY()} ؿ - -@item -ʸΤ @code{TRIM()} ѤǤޤANSI SQL ϰʸ -κ򥵥ݡȤޤ - -@item -@code{GROUP BY} ؿ @code{STD()}, @code{BIT_OR()} @code{BIT_AND()} - -@item -@code{DELETE} + @code{INSERT} @code{REPLACE} λѡ -@xref{REPLACE, , @code{REPLACE}}. - -@item -@code{FLUSH flush_option} ʸ - -@item -@code{:=} ǥơȥǤѿ꤬ǽ: -@example -SELECT @@a:=SUM(total),@@b=COUNT(*),@@a/@@b AS avg FROM test_table; -SELECT @@t1:=(@@t2:=1)+@@t3:=4,@@t1,@@t2,@@t3; -@end example - -@end itemize - -@node Ansi mode, Differences from ANSI, Extensions to ANSI, Compatibility -@section ANSI ⡼ɤǤ MySQL μ¹ - -@code{--ansi} ץĤ mysqld 򳫻Ϥȡ @strong{MySQL} -񤤤Ѥޤ - -@itemize @bullet -@item -@code{||} @code{OR} ǤϤʤʸǤ -@item -ؿ̾ '(' δ֤ǤդοΥڡ֤ȤǤޤϤ٤Ƥ -ؿͽˤޤ -@item -@code{"} (@strong{MySQL} @code{`} ʸ˻)̻Ұʸˤʤꡢ -ʸʸǤϤޤ -@item -@code{REAL} @code{DOUBLE} ƱǤϤʤ @code{FLOAT} Ʊˤʤ -ޤ -@end itemize - -@node Differences from ANSI, Missing functions, Ansi mode, Compatibility -@section @strong{MySQL} ANSI SQL92 Ȥΰ㤤 - -桹 @strong{MySQL} ANSI SQL ɸ ODBC SQL ɸ˽褦˻ߤƤ -ޤĤΥ @strong{MySQL} ϲ㤤ޤ: - -@itemize @bullet -@item -@code{--} ϶³Ȥˤʤޤ@xref{Missing comments} -@item -@code{VARCHAR} եɤǤϡͤǼζ򤬺ޤ -@xref{Bugs} -@item -ĤΥǡ@code{CHAR} եɤۤä @code{VARCHAR} ե -ɤѹޤ@xref{Silent column changes} -@item -ơ֥ˡơ֥ˤĤƤθ¤ϼưŪˤ˴ޤ -ơ֥ˤĤƤθ¤˴ˤϡŪ @code{REVOKE} ȯԤɬ -פޤ@xref{GRANT, , @code{GRANT}}. -@item -@code{NULL AND FALSE} @code{FALSE} ǤϤʤ @code{NULL} ɾޤ -Υǡ¿;פʾɾɬפ뤳ȤɤȤǤϤʤȡ -桹ϹͤƤ뤫Ǥ -@end itemize - -@node Missing functions, Standards, Differences from ANSI, Compatibility -@section @strong{MySQL} ̵ǽ - -εǽ @strong{MySQL} θߤΥСˤϤޤ󡣿ĥ -ͥ٤ˤĤƤϡ򻲹ͤˤƤ -@uref{http://www.mysql.com/Manual_chapter/manual_Todo.html, the -@strong{MySQL} TODO list}ϤΥޥ˥奢 TODO ꥹȤκǿС -Ǥ@xref{TODO} - -@menu -* Missing Sub-selects:: Sub-selects -* Missing SELECT INTO TABLE:: @code{SELECT INTO TABLE} -* Missing Transactions:: ȥ󥶥 -* Missing Triggers:: ȥꥬ -* Missing Foreign Keys:: Foreign Keys -* Missing Views:: ӥ塼 -* Missing comments:: ȳϤȤƤ @samp{--} -@end menu - -@node Missing Sub-selects, Missing SELECT INTO TABLE, Missing functions, Missing functions -@subsection Sub-selects - - @strong{MySQL} ǤϤޤƯޤ: - -@example -SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2); -@end example - -¿ξ硢sub select Ȥʤ˽ľȤǤޤ: - -@example -SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id; -SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL -@end example - -ʣʥ֥Ǥϡ֥ݻ뤿˰ơ֥ -ޤˡǤưʤ礬ޤΥˤϡ -@code{DELETE} ơȥȤǤäȤˤޤ@code{DELETE} ơ -ȥȤǤϡɸ SQL Ǥϡsub select ơjoin 򥵥ݡȤ -ޤ󡣥֥꤬ @strong{MySQL} ˥ݡȤޤǡξˤϣ -Ĥ褬ޤ - -ǽϡ³ץߥ󥰸Perl PHP Τ褦ʡˤѤơ -@code{SELECT} ȯԤƺ쥳ɤΥץ饤ޥꥭ -줫 @code{DELETE} ơȥȡ@code{DELETE FROM ... WHERE -... IN (key1, key2, ...)}ˤۤ뤿ˤͤѤ뤳ȤǤ - -ܤϡ÷ SQL Ѥ@code{DELETE} ơȥȤΥ -Ȥɸ @code{||} ڥ졼ˡ@strong{MySQL} ĥ -@code{CONCAT()} ѤơưŪȤΩƤ뤳ȤǤ㤨: - -@example -SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';') - FROM tab1, tab2 - WHERE tab1.col1 = tab2.col2; -@end example - -Υ򥹥ץȥե֤Ϥ @code{mysql} ޥɥ饤 -󥿥ץ꥿ؤνϤܤΥ󥿥ץ꥿󥹥󥹤˥ѥפ -ޤ: - -@example -prompt> mysql --skip-column-names mydb < myscript.sql | mysql mydb -@end example - -@strong{MySQL} @code{INSERT ... SELECT ...} @code{REPLACE ... -SELECT ...} 򥵥ݡȤޤΩ sub-selects Ϥ餯 3.24.0 -ͭˤʤޤ¾ʸ̮Ǵؿ @code{IN()} ѤǤޤ - -@node Missing SELECT INTO TABLE, Missing Transactions, Missing Sub-selects, Missing functions -@subsection @code{SELECT INTO TABLE} - -@strong{MySQL} Ϥޤ Oracle SQL extension: -@code{SELECT ... INTO TABLE ...} 򥵥ݡȤޤ -@strong{MySQL} @code{INSERT INTO ... SELECT ...} 򥵥ݡȤޤ -ϴŪƱȤǤ - -ˡ@code{INSERT INTO ... SELECT ...} @code{CREATE -TABLE ... SELECT} ѤǤޤ -@xref{INSERT, , @code{INSERT}}. - -@node Missing Transactions, Missing Triggers, Missing SELECT INTO TABLE, Missing functions -@subsection ȥ󥶥 - -@strong{MySQL} ϸߥȥ󥶥򥵥ݡȤ뤿ᡢεȥ -󥶥ơ֥뷿ѤˤͭǤ@xref{COMMIT} - -``ʤ @strong{MySQL} ϥȥ󥶥Υǡ١ǤʤΤ'' Ȥ -``ʤ @strong{MySQL} ϥȥ󥶥򥵥ݡȤʤΤ'' -Ȥä䤬ФФʤޤ - -@strong{MySQL} ϡǡμ갷Ф¾Υѥࡢ -``ȥߥåڥ졼''򥵥ݡȤտޤƷꤷޤ -ȥߥåڥ졼Ʊ뤤Ϥɤѥեޥ󥹤 -󶡤ȤΤ桹ηиӹͤǤ -Ǥ⡢桹ϥȥ󥶥Ūǡ١ѥȥץɾ -򤷤Ƥޤο꡼Τˡơ֥ñ̤ܤˡȥ󥶥 -ơ֥Ƴޤ -λ桹ϡ桼 -ԡɽŻǥȥߥåڥ졼ѤΤ뤤 -ץꥱǥȥ󥶥εǽȤΤ -Ǥ褦ˤ褦ȹͤƤޤ - -̩ integrity ݻˤ @strong{MySQL} εǽɤΤ褦˻Ѥ -Ǥ礦 ơȥ󥶥ŪѥǤεǽɤΤ褦 -ӤΤǤ礦 - -ǽˡȥ󥶥ΥѥǤϡ -⤷ʤΥץꥱ ܤȤʤʬ -``commit'' ``rollback'' θƤӽФ˰¸Ƥʤ顢 -ȥ󥶥ϤˤʤǤ礦 -ޤˡȥ󥶥ϴλǤʤä򵯤 -ǡμ¤˥ǡ١Ͽʤ褦ˤǤޤ -ΥСˤϡưŪ rollback 򤹤뵡Ϳ졢 -ʤΥǡϼǤ礦 - -@strong{MySQL} ϤۤȤɤξ硢δñʥåޤޤ뤳ȤǤꡢ -뤤ϥǡ١̷򸡺ƼưٹɽԤäꤹ -ñʥץȤ¹Ԥ뤳ȤǤ褦ʡ -ݥƥ󥷥򤢤ʤ󶡤ޤ -@strong{MySQL} λѤ䳰ؤΥɲäԤäꤹǡ -̾ǡΤơ֥˽Ǥ뤳ȤդƤ - -ˡ``fatal'' transactional updates ϥȥߥåǽ񤭴뤳ȤǤޤ -ºݡȥ󥶥󤬲褹Ƥ integrity problems - @code{LOCK TABLES} atomic updates ֤뤳Ȥ衢 -ˤϡȥ󥶥Υǡ١ˤŪǤ롢 -ǡ١μưŪǤ뤳̵ˡǽʤϤǤ -In fact,we will go so far as to say that all integrity problems -that transactions solve can be done with @code{LOCK TABLES} or atomic updates, -ensuring that you never will get an automatic abort from the database, -which is a common problem with transactional databases. - -⤷С󤹤Хȥ󥶥ǤƤ򼺤Ȥ˻ߤǤޤ -ξ硢ȥ󥶥ΥƥǤǡƼǤ礦 -The difference -between different systems lies in just how small the time-lap is where -they could lose data. No system is 100% secure, only ``secure -enough''. Even Oracle, reputed to be the safest of transactional -databases, is reported to sometimes lose data in such situations. - -@strong{MySQL} ˤˤϡХååפ뤳Ȥȡ -ͭˤ뤳ȤǤ -ǡʤ¾Υȥ󥶥ĥǡ١ǹԤäƤ褦 -ʤ̤ǤνǽǤ -󡢥ХååפȤ뤳ȤϡɤΥǡ١ѤƤ뤫 -ؤ餺ɤȤǤ - -The transactional paradigm has its benefits and its drawbacks. Many -users and application developers depend on the ease with which they can -code around problems where an ``abort'' appears or is necessary, and they -may have to do a little more work with @strong{MySQL} to either think -differently or write more. If you are new to the atomic operations -paradigm, or more familiar or more comfortable with transactions, do not -jump to the conclusion that @strong{MySQL} has not addressed these -issues. Reliability and integrity are foremost in our minds. Recent -estimates are that there are more than 1,000,000 mysqld servers -currently running, many of which are in production environments. We -hear very, very seldom from our users that they have lost any data, and -in almost all of those cases user error is involved. This is in our -opinion the best proof of @strong{MySQL}'s stability and reliability. - -Lastly, in situations where integrity is of highest importance, -@strong{MySQL}'s current features allow for transaction-level or better -reliability and integrity. If you lock tables with @code{LOCK TABLES}, all -updates will stall until any integrity checks are made. If you only obtain -a read lock (as opposed to a write lock), then reads and inserts are -still allowed to happen. The new inserted records will not be seen by -any of the clients that have a READ lock until they relaease their read -locks. With INSERT DELAYED you can queue insert into a local queue, -until the locks are released, without having to have the client to wait -for the insert to complete. - -``Atomic'', in the sense that we mean it is nothing magical, it only means -that you can be sure that while each specific update is running no other -user can interfere with it and that there will never be an automatic -rollback (which can happen on transaction based systems if you are not -very careful). @strong{MySQL} also guarantees that there will not be -any dirty reads. - -We have thought quite a bit about integrity and performance and we -believe that our atomic operations paradigm allows for both high -reliability and extremely high performance, on the order of three to -five times the speed of the fastest and most optimally tuned of -transactional databases. We didn't leave out transactions because they -are hard to do; The main reason we went with atomic operations as -opposed to transactions is that by doing this we could apply many speed -optimizations that would not otherwise have been possible. - -Many of our users who have speed foremost in their minds are not at all -concerned about transactions. For them transactions are not an -issue. For those of our users who are concerned with or have wondered -about transactions vis a vis @strong{MySQL}, there is a ``@strong{MySQL} -way'' as we have outlined above. For those where safety is more important -than speed, we recommend them to use the @code{BDB} tables for all their -critical data. @xref{BDB}. - -One final note: we are currently working on a safe replication schema -that we believe to be better than any commercial replication system we -know of. This system will work most reliably under the atomic -operations, non-transactional, paradigm. Stay tuned. - -@node Missing Triggers, Missing Foreign Keys, Missing Transactions, Missing functions -@subsection ȥɥץȥȥꥬ - -ȥɥץϡǥѥǤǼǤ SQL ޥɤ -åȤǤ٤줬Ԥʤȡ饤ȤϥΤκȯԤ -ɬפʤȥɥץ򻲾ȤǤޤϤˤ®®٤ -ޤϰ٤ᤵ졢꾯ʤǡФȥ饤 -ȴ֤뤫Ǥ˴ؿ饤֥ĤȤˤ공ǰ -٥夲뤳ȤǤޤ - -ȥꥬ̤ʥ٥Ȥȯ˸ƤӽФ륹ȥɥץǤ -㤨Сȥ󥶥ơ֥뤫쥳ɤ٤˥ȥꥬ졢 -ȥ󥶥󤬺줿˼ưŪбܵҤܵҥơ֥뤫 -Ȥȥɥץ򥤥󥹥ȡ뤹뤳ȤǤޤ - -ײ褵ƤιϥȥɥץǤ褦ˤʤޤ -ȥꥬϽޤȥꥬ̾Ƥ򡢤ɬפȤʤǤ -٤ޤ - -@strong{MySQL} ȥɥץΤˤϡ@ref{TODO} 򻲾 -Ƥ - -@node Missing Foreign Keys, Missing Views, Missing Triggers, Missing functions -@subsection - -: SQL γϥơ֥礹뤿ˤϻѤǤޤ󤬡ؼ -θΤɤѤޤ@code{SELECT} ơȥȤʣ -ơ֥뤫̤硢ơ֥ηˤäƤԤʤޤ - -@example -SELECT * from table1,table2 where table1.id = table2.id; -@end example -@xref{JOIN, , @code{JOIN}}. @xref{example-Foreign keys}. - -@strong{MySQL} Ǥ @code{FOREIGN KEY} ʸϡ¾ SQL ٥ -@code{CREATE TABLE} ޥɤȤθߴΤ¸ߤޤ; ϲ -ʤޤ@code{ON DELETE ...} ʤ @code{FOREIGN KEY} ʸϡŪ -κΤ˼˻ȤޤĤ ODBC ץꥱϡưŪ - @code{WHERE} 󶡤뤿ˡѤޤ̾ -ñ̵ˤǤޤ@code{FOREIGN KEY} ϻåȤƻѤ -ޤơ֥ǹԤ硢Υåϼ -ݤˤפǤĤΥץꥱ󤬤줬¸ߤ뤳Ȥ׵᤹ - @strong{MySQL} Ϥ򥵥ݡȤޤʤ줬ư뤫 -˴ؤ餺ˡ - -@strong{MySQL} Ǥϡĥơ֥뤫쥳ɤŬ -ڤ @code{DELETE} ơȥȤ򥢥ץꥱɲä뤳Ȥǡ -@code{ON DELETE ...} ƤʤȤǤޤºݤ -ϡ®(ĤξϤ®)ƳλѤ⤵ -ޤ - -ᤤ衢ʤȤ¸졢 @code{mysqldump} ODBC ˤ -ƼФ褦ˡ桹 @code{FOREIGN KEY} ĥޤ - -@menu -* Broken Foreign KEY:: Ѥʤͳ -@end menu - -@node Broken Foreign KEY, , Missing Foreign Keys, Missing Foreign Keys -@subsubsection Ѥʤͳ - -桹ɤϤΤ狼ʤ @code{FOREIGN KEY} ˤ¿꤬ -ޤ: - -@itemize @bullet -@item -ϿȤƤʣˤޤϥǡ١˳Ǽ -Фʤ餺μϰưԡǤեѤȤ - ``ɤץ'' Ƥ˴뤫Ǥ - -@item -@code{INSERT} @code{UPDATE} ơȥȤؤ®٤αƶϤΤ -Ƥξ硢ۤȤƤ @code{FOREIGN KEY} åΩޤ -̾ϡơ֥ǥ쥳ɤ뤿Ǥ - -@item -ĤΥơ֥ιˤä¿Υơ֥ǥåݻɬפ⤢ -ޤѤǡ١Τ̤ȯ뤫ǤޤĤΥơ -֥뤫쥳ɤơ줫¾Υơ֥뤫餽ۤ -ȤƤ®Ǥ - -@item -ơ֥뤫鴰ʺԤʤäƤƤΥ쥳ɤʿХ -åפ˥ꥹȥ뤳Ȥˤäơơ֥뤳ȤϤ⤦Ǥ -ޤ - -@item -ľ硢ơ֥Υפȥꥹȥν˹ԤʤʤȤ -ޤ - -@item - create ơȥȤdzƥơ֥뤳Ȥơ֥ˤǤ -ʤ褦 ``줿'' ԤʤȤϤȤƤñǤ -ưƻѤǤȤƤǤ -@end itemize - -ɤ̤ϡODBC ¾ΤĤΥ饤ȥץˡɤ -褦˥ơ֥뤬³뤫򸫤뵡ǽͿѤ³ޤ򼨤 -ץꥱμ򤹤뤳ȤǤ - -@strong{MySQL} ϴ֤ʤ饤ȤɤΤ褦˥ꥸʥ³ -줿䤤碌褦 @code{FOREIGN KEY} -Ǽޤߤ @file{.frm} եˤϤ֤Ϥޤ - -@node Missing Views, Missing comments, Missing Foreign Keys, Missing functions -@subsection ӥ塼 - -@strong{MySQL} ϥӥ塼򥵥ݡȤޤ󡣤 TODO ˤޤ - -@node Missing comments, , Missing Views, Missing functions -@subsection ȳϤȤƤ @samp{--} - -¾ΤĤ SQL ǡ١ϡ@samp{--} 򥳥ȤγϤΤ˻ -Ѥޤ@strong{MySQL} @samp{#} 򥳥ȳʸȤޤ -@code{mysql} ޥɥ饤ġ뤬 @samp{--} ǻϤޤƤιԤ -ȤƤǤ@strong{MySQL} Ǥ C ȥ @code{/* ϥ - */} ѤǤޤ@xref{Comments} - -@strong{MySQL} 3.23.3 ʾ @samp{--} 򥵥ݡȤޤ; ಽȥ -ϡΥɤΤ褦 @code{!payment!} payment ͤưŪ -褦ʲѤƼưŪ SQL ¿ -Ǥ: - -@example -UPDATE tbl_name SET credit=credit-!payment! -@end example - -@code{payment} ͤξ˲Ȼפޤ - -@code{1--1} SQL ʤΤǡ桹 @samp{--} 򥳥ȳϤȸʤ -ȤϤҤɤȤȻפޤ - - @strong{MySQL} 3.23 ǤϼѤǤޤ: @code{1-- ϥ} - -ʹߤǤϡ3.23 @strong{MySQL} С¹ԤƤ -оݤǤ: - -ƥȥե SQL ץब @samp{--} ȤޤǤ硢 -Ѥ٤Ǥ: - -@example -shell> replace " --" " #" < text-file-with-funny-comments.sql \ - | mysql database -@end example - -̾μ: - -@example -shell> mysql database < text-file-with-funny-comments.sql -@end example - -ˡǤ⡢ޥɥե @samp{--} Ȥ @samp{#} -ȤѹǤޤ: - -@example -shell> replace " --" " #" -- text-file-with-funny-comments.sql -@end example - -ϼΥޥɤᤷƤ: - -@example -shell> replace " #" " --" -- text-file-with-funny-comments.sql -@end example - -@node Standards, Commit-rollback, Missing functions, Compatibility -@section @strong{MySQL} 򤷤Ƥɸ - -Entry level SQL92. ODBC level 0-2. - -@node Commit-rollback, , Standards, Compatibility -@section @code{COMMIT}/@code{ROLLBACK} ʤǤޤˡ - -The following mostly apply only for @code{ISAM}, @code{MyISAM} and -@code{HEAP} tables; If you only use transaction safe tables (@code{BDB} -tables) in an a update you can do @code{COMMIT} and @code{ROLLBACK} also -with @code{MySQL}. @xref{COMMIT}. - -The problem with handling @code{COMMIT}-@code{ROLLBACK} efficiently with -the above table types would require a completely different table layout -than @strong{MySQL} uses today. -ηΥơ֥ϡưŪ˥ơ֥򥯥꡼󥢥åפĥåɤɬ -Ȥǥ̤Ϥ礭ʤޤ @strong{MySQL} 򸽺 - 24 ٤Ƥޤޤ - -桹 SQL и(ȥɥץΤ褦ʤ)μˤ -Ǥǡ @code{COMMIT}-@code{ROLLBACK} ɬפȤΤ -äˤޤ󡣤ϤɤǽͿǤ礦 - -ȥ󥶥ɬפȤ롼פϡ̾ @code{LOCK TABLES} ν -ɲǤ fly ǥ쥳ɤιˤϥɬפȤޤ - - -桹 TcX ɬפȤƤΤϡ100% ɸΥǡ١ǤϤʤơ -®ǡ١Ǥ®㲼ʤǤεǽˡ򸫤Ĥ -Ȥˤϡ桹ϤԤʤǤ礦Ф餯ϹԤʤ٤˽פʤ -Ȥ¿ޤβ桹ͥ٤ˤĤƤ TODO åƤ -٥ΥݡȤĸܵҤϤѤ뤳ȤǤƤ̤ͥŤ -Ԥʤޤ - -ߤϼºݤˤ @code{ROLLBACK} Ǥ@code{ROLLBACK} ʤǤ -@code{LOCK TABLES} @code{COMMIT} ΤĤμԤʤ -ȤǤޤ@code{ROLLBACK} 򥵥ݡȤ뤿ˤϡƤθ -쥳ɤǼ@code{ROLLBACK} ȯԤ줿˳ϰ֤Ƥ -褦ˡ@strong{MySQL} ѹʤФʤޤñʾˤϡ -Ԥʤˤ񤷤ޤ(ߤ @code{isamlog} 򤳤Ū˻Ѥ -ޤ)@code{ALTER/DROP/CREATE TABLE} Ǥ @code{ROLLBACK} μ -ԤȤϤȤƤ⺤Ǥ - -@code{ROLLBACK} λѤβΤˡˡѤ뤳ȤǤޤ: - -@enumerate -@item -@code{LOCK TABLES ...} 򥢥ơ֥Ƥå뤿 -Ѥޤ -@item -Υƥȡ -@item - OK ʤ鹹 -@item -@code{UNLOCK TABLES} åβ˻Ѥޤ -@end enumerate - -̤ @code{ROLLBACK} ǽʥȥ󥶥λѤ®Ǥ -ˤǤϤޤ󡣤β򤬽Ǥʤϡï -ɤ kill Ǥξ硢ƤΥåϥ꡼ޤ -Ĥιϼ¹Ԥޤ - -1Υڥ졼ǥ쥳ɤ򹹿ؿѤǤޤΥƥ˥å -ˤäƤȤƤΨŪʥץꥱ뤳ȤǤޤ - -@itemize @bullet -@item -եɤ򸽺ߤͤӤѹ - -@item -ºݤѹ줿եɤ򹹿 -@end itemize - -㤨СĤθܵҾǹԤʤäƤ桹ѹ줿ܵҥǡ -򹹿ѹƤʤǡϥƥȤѹ줿ǡ˰ -¸ѹ줿ǡꥸʥιԤӤޤѹΥƥȤ -@code{UPDATE} ơȥ @code{WHERE} ǹԤޤ쥳ɤ -ʤäϡ桹ϥ饤Ȥ˥å: "Some of the data -you have changed has been changed by another user" ͿƤ줫 -ŤԤȿԤ򥦥ɥɽޤ桼ϸܵҥ쥳ɤΤɤ -ΥСѤ٤Ǥޤ - - ``column locking'' ˻Τ桹ͿޤºݤˤϽʬǤ -ʤʤ顢桹Ϥθߤͤ˴Ϣͤĥեɤ򹹿뤫 -ǤϡŵŪ @code{UPDATE} ơȥȤΤ褦˸ -Ȥ̣ޤ: - -@example -UPDATE tablename SET pay_back=pay_back+'relative change'; - -UPDATE customer - SET - customer_date='current_date', - address='new address', - phone='new phone', - money_he_owes_us=money_he_owes_us+'new_money' - WHERE - customer_id=id AND address='old address' AND phone='old phone'; -@end example - -Ƥ̤ꡢ¾Υ饤Ȥ @code{pay_back} ޤ -@code{money_he_owes_us} եɤͤѹȤƤ⡢ϤȤƤΨŪ -Ưޤ - -@findex mysql_insert_id() -@findex LAST_INSERT_ID() -¿ξ硢桼 @code{ROLLBACK} /ޤ @code{LOCK TABLES} -ĤΥơ֥ǥˡʼ̻Ҥ뤳Ȥ˾ߤޤϡ -@code{AUTO_INCREMENT} եɤ SQL @code{LAST_INSERT_ID()} ؿ C API - @code{mysql_insert_id} λѤˤäơ˸ΨŪ˽Ǥޤ -@xref{mysql_insert_id, , @code{mysql_insert_id()}}. - -@cindex row-level locking -TcX Ǥϡ桹ϤĤǤ⤽򤷤ƥɲǽʤΤǡ桹Ϲԥ٥ -ɬפȤƤޤ˹ԥåɬפȤ륱⤢ޤ -ˤޤǤԥ٥å˾Τʤ顢ơ֥ǥե饰 -ܤѤơΤ褦ˤƹԤʤޤ: - -@example -UPDATE tbl_name SET row_flag=1 WHERE id=ID; -@end example - -ԤĤꡢꥸʥ @code{row_flag} 1 Ǥʤ硢 -@strong{MySQL} ϱƶ줿ԿȤ 1 ֤ޤ - -@strong{MySQL} ҤΥ򼡤ѹȹͤ뤳ȤǽǤ: - -@example -UPDATE tbl_name SET row_flag=1 WHERE id=ID and row_flag <> 1; -@end example - -@node Privilege system, Reference, Compatibility, Top -@chapter @strong{MySQL} Υ桼¤ϤɤΤ褦ư - -@strong{MySQL} ŪɸΥƥ/øƥäƤޤ -ܾϤǤϤɤΤ褦ˤ줬ưҤ٤ޤ - -@menu -* General security:: General security -* Security:: @strong{MySQL} 򥯥åФưˤˡ -* What Privileges:: øƥιԤ -* User names:: @strong{MySQL} user names and passwords -* Connecting:: @strong{MySQL} С³ -* Password security:: Keeping your password secure -* Privileges provided:: @strong{MySQL} 󶡤븢 -* Privileges:: øƥϤɤΤ褦ư -* Connection access:: Access control, stage 1: ³ξǧ -* Request access:: Access control, stage 2: ׵ξǧ -* Privilege changes:: When privilege changes take effect -* Default privileges:: @strong{MySQL} µĤν -* Adding users:: 桼¤ @strong{MySQL} ɲ -* Passwords:: ѥɤˡ -* Access denied:: @code{Access denied} 顼ˤʤΤ -@end menu - -@node General security, Security, Privilege system, Privilege system -@section ƥ - -褯륻ƥδְ㤤򤱤뤿ˡ󥿡ͥåȤ³줿 -ԥ塼 @strong{MySQL} Ѥï⤬Υɤ٤Ǥ - -``ƥ'' εǤϡ٤Ƥγ륢å -(eavesdropping, altering, playback, Denial of Service)Фơ٤ƤΥ -Хۥ(ñʤ @strong{MySQL} ФǤϤʤ)δݸɬפĴ -We do not cover all aspects of availability and fault tolerance -here. - -@strong{MySQL} ϡ桼¹Ԥ褦Ȥ뤹٤Ƥ³ꡢ¾ -ڥ졼Фơꥹ(ACLs: Access Control Lists) -ƥѤޤ@strong{MySQL} 饤ȤȥФδ֤ SSL Ź沽 -³ΥݡȤ⤤Ĥޤǵ륳󥻥ץȤ¿ϡ -@strong{MySQL} ͭΤΤǤϤޤ; ƱŪʥǥϤۤȤ -٤ƤΥץꥱŬѤޤ - -@strong{MySQL} ¹Իǽʸ¤ꤤĤǤ⤳Υɥ饤˽äƤ -: - -@itemize @bullet -@item -@strong{MySQL} ACL ƥؤ٤Ǥ -@code{GRANT} @code{REVOKE} ޥɤ @strong{MySQL} ؤΥ¤뤿ʪǤ -ɬװʾθ¤ïˤͿʤǤ -ƤΥۥȤФơ褦ʵĤͿƤϤޤ - -Checklist: -@itemize @bullet -@item -@code{mysql -u root} ԤäƤߤޤ - -ѥɤҤͤ뤳̵˥Фؤ³Ǥ硢꤬ޤ -ɤΥ桼Ǥ(root ǤʤƤ)@strong{MySQL} Ф˴ʸ¤³ -ޤ @code{root} ѥɤˤĤƤιܤ̤դʧä -@strong{MySQL} 󥹥ȡľƤ - -@item -@code{SHOW GRANTS} Ѥ줬ʤΥĤåޤ -ɬפʤ¤@code{REVOKE} ޥɤѤƺƤ -@end itemize - -@item -ʤʿʸѥɤǡ١¸ʤ褦ˤޤ -ʤΥԥ塼ŶԤϥѥɤδʥꥹȤơ -ѤǤޤ @code{MD5()} ¾ one-way hashing ؿ -ѤƤ -@item -ˤΤäƤñѥɤ˻ѤƤϤޤ ˤ -ץबΤǤ ``xfish98'' Τ褦ʥѥɤϰǤ - ``duag98'' 褤Ǥ礦 "fish" Ǥĺݤˡ -ĤĤ餷ΤǤ ¾ˡȤƤϡ "Mhall" -"Mary had a little lamb" ȤʸƬʸ󤷤ΤǤ -ΤäƤʪˤǤ䤹ѥɤǤΤʤԤˤȤäƤϡ -䤹뤳Ȥ񤷤ѥɤǤ -@item -եƳޤThis protects from at least 50% of all types of - exploits in any software. -@strong{MySQL} եǼ줿֤ -DMZ (˾, ) ֤ޤ - -Checklist: -@itemize @bullet -@item -󥿡ͥåȤ @code{nmap} Τ褦ʥġѤơ -ʤΥޥΥݡȤ򥹥󤷤Ƥߤޤ -@strong{MySQL} ϥǥեȤ 3306 ֤ѤƤޤ -ΥݡȤˤϡۤȤɤξ硢Ǥʤ褦ˤ٤Ǥ - -@strong{MySQL} ݡȤץ󤷤Ƥ뤫ɤå¾δñ -ˡϡĤΥ⡼ȥޥ󤫤 @code{telnet server_host 3306} ¹Ԥ -뤳ȤǤ @code{server_host} Ϥʤ @strong{MySQL} ФΥ -̾Ǥ³ĤΥʸ줿硢ݡȤϥץ󤷤 -ޤ򥪡ץ󤷤Ƥͳˤʤ¤ꡢե -롼ǥ٤Ǥ@code{telnet} ϥ󥰤硢٤ -OK ǤݡȤϥ֥åƤޤ -@end itemize - -@item -桼Ϥ줿ǡϿꤷʤDz -桼ϡWebΥեࡢURL뤤ϤʤΥץफ -ʸ뤳ȤǽǤ ⤷桼ե -@code{; DROP ALL DATABASES ;} Τ褦ʸϤƤ⡢ -ʤΥץꥱϰǤ -϶üǤФƽʤ硢褦ʥƥ˥å -Ѥϥåη̤Ȥơ礭ʥƥ꡼ȥǡӼȯ -ޤ - -ͥǡΥå˺ʤǤ褯ְ㤤ʸ󤷤ݸ -ʤȤǤͤϥǡ١ݸɬפΤʤͭʥǡ -ޤǤ뤫ɤͤޤϴְ㤤ǤʤȤ⡢ -Denial-of-Service פΥåϤΤ褦ʥǡ١Ǥ¹Ԥޤ -ΥפΥåݸäȤñˡϡβ˥ -ȥեѤ뤳ȤǤ: @code{SELECT * FROM table WHERE ID=234} - @code{SELECT * FROM table WHERE ID='234'}@strong{MySQL} ϼưŪ -ˤʸͤѴ餹٤Ƥͥܥޤ - -åꥹ: -@itemize @bullet -@item -٤Ƥ WWW ץꥱ: -@itemize @bullet -@item -ʤ WWW ƤΥեˡ@samp{'} @samp{"} Ϥ뤳ȤߤƤ -⤷ʤ餫 @strong{MySQL} 顼Ǥ顢ʤΥȤߤۤ -褤Ǥ礦 -@item -ʤ URL @code{%22} (@samp{"}), @code{%23} (@samp{#}) , @code{%27} (@samp{'}) ĤƤߤơưŪURL -ѹƻƤߤƤ -@item -ưŪ URL ΥǡפͤҤʸޤʸ˽Ƥߤ -ץꥱϤȻ褦ʥåФưǤ٤ -Ǥ -@item -ͥեɤФơʸڡüʸϤߤƤ -ץꥱϡ @strong{MySQL} ˼ -뤤ϥ顼Ф٤Ǥ ʤͤ @strong{MySQL} 뤳ȤϴǤ -@item -@strong{MySQL} ˥ǡˡΥåޤ -@item -ʤΥץꥱ󤬡ŪǤʤѤΤȰۤʤ桼̾ -Ѥƥǡ١³뤳ȤθƤɬװʾΥ -򥢥ץꥱͿʤDz -@end itemize -@item -PHP 桼: -@itemize @bullet -@item -@code{addslashes()} ؿĴ٤ޤ -@end itemize -@item -@strong{MySQL} C API 桼: -@itemize @bullet -@item -@code{mysql_escape()} API 뤬뤫Ĵ٤ޤ. -@end itemize -@item -@strong{MySQL}++ 桼: -@itemize @bullet -@item -Check out the @code{escape} and @code{quote} modifiers for query streams. -@end itemize -@item -Perl DBI 桼: -@itemize @bullet -@item -Check out the @code{escape} and @code{quote} modifiers (?) for query streams. -@item -Check out the @code{quote()} method. -@end itemize -@end itemize - -@item -Υǡ(Ź沽Ƥʤǡ)򥤥󥿡ͥåȱۤäƤϤޤ -This data is accessible to -everyone who have interest to trap this information and reuse it -somewhere. ⤷ɬפʤ顢SSL Τ褦ʰŹ沽줿̿ -Ѥ٤Ǥ -@strong{MySQL} supports internal SSL connections beginning from -version 3.23.9. -SSH port-forwarding can be used to create an encrypted (and compressed) -tunnel for the communication. -@item -"tcpdump", "strings" 桼ƥƥȤȤؤDz. -ʲΥޥɤǡۤȤɤξ硢Ź沽Ƥʤ -@strong{MySQL} ΥǡǤ礦 -@example -shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings -@end example -( Linux ΤΤǤ¾ΥƥǤϾ㤦Ǥ礦). - Warning: If you do not see data this doesn't actually -always mean that it is encrypted. If you need high security you should -consult with security expert. -@end itemize - - -@node Security, What Privileges, General security, Privilege system -@section @strong{MySQL} 򥯥åФưˤˡ - -@strong{MySQL} С³ȤϡѥɤѤ٤Ǥ -ѥɤϥ֤ͥǡ٤ƥȤǤήޤ - -¾ƤξϥƥȤž졢 -³Ȥͤɤޤޤ -⤷ۤʤ顢̥ץȥ(@strong{MySQL} 3.22 ʾ) -Ѥ뤳Ȥޤˤ硢 -@code{ssh} (@uref{http://www.cs.hut.fi/ssh}) 򥤥󥹥ȡ뤹٤Ǥ -ѤС@strong{MySQL} С @strong{MySQL} 饤 -֤ TCP/IP ͥưŹ沽ޤ - -@strong{MySQL} ƥˤ뤿ˤϡΤȤͤ٤Ǥ: - -@itemize @bullet -@item -Ƥ @strong{MySQL} 桼˥ѥɤѤ٤Ǥ -@code{other_user} ˥ѥɤꤵƤʤ硢 -ïǤ @code{mysql -u other_user db_name} Ȥƴñ¾οͤȤƥǤ -뤳ȤФƤƤΥ饤ȡХץꥱ -ǰŪʿ񤤤ǤƤΥ桼Υѥɤϡ -@code{mysql_install_db} ץȤ¹Խ뤳Ȥǡޤ -@strong{MySQL} @code{root} 桼ϼΤ褦ˤѹ뤳ȤǤޤ - -@example -shell> mysql -u root mysql -mysql> UPDATE user SET Password=PASSWORD('new_password') - WHERE user='root'; -@end example - -@item -@strong{MySQL} ǡ Unix @code{root} 桼Ǽ¹ԤʤǤ -It is very dangerous as any user with @code{FILE} privileges will be able to -create files -as @code{root} (e.g. @code{~root/.bashrc}). To prevent this -@code{mysqld} will refuse to run as @code{root} unless it is specified -directly via @code{--user=root} option. - -@code{mysqld} ǤդΥ桼Ǽ¹ԤǤޤ -ˤ뤿ᡢ Unix 桼 @code{mysql} ɲä뤳ȤǤޤ -@code{mysqld} ¾ Unix 桼ǵưȤƤ⡢ -@strong{MySQL} @code{user} ơ֥ @code{root} 桼̾ѹɬפϤޤ -ʤʤ顢 @strong{MySQL} 桼̾ Unix Υ桼̾ȤϤʤδطʤǤ -root 桼̾ѹɬפϤޤ -@code{mysqld} ¾ Unix 桼ǵư뤿ˡ@code{mysql.server} ԽƤ褤Ǥ礦 -̾ @code{su} ޥɤǹԤޤ -ܤ @ref{Changing MySQL user, , Changing @strong{MySQL} user}. - -@item -@code{mysql.server} ץ Unix @code{root} 桼Τ˥ѥɤ -񤤤硢ΥץȤ @code{root} ɤ褦ˤʤƤ -ʤޤ - -@item -ǡ١ǥ쥯ȥ @code{mysqld} ¹ԤƤ Unix 桼 -ɤ߹ߡ񤭹߲ǽʤȤåƤ - -@item -On Unix platforms, do not run @code{mysqld} as root unless you really -need to. Consider creating a user named @code{mysql} for that purpose. - -@item -@strong{process} ¤ƤΥ桼ͿʤǤεĤͤïǤ -@code{mysqladmin processlist} ޥɤǼ¹ԤƤ륯꡼Ȥ򸫤뤳ȤǤޤ -⤷ï@code{UPDATE user SET password=PASSWORD('not_secure')} ꡼ -¹ԤƤȤơ줬Ƥޤޤ - -@code{mysqld} @strong{process} ¤ĥ桼Ф̤³ꥶ֤ޤ -ΤᡢȤƤ̾³Ȥ줿ȤƤ⡢@strong{MySQL} @code{root} 桼ϡ -ǤåǤޤ - -@item -@strong{file} ƤΥ桼ͿʤǤ桼θ¤ľ -硢@code{mysqld} ǡ¹ԤƤ Unix 桼θ¤ -ե륷ƥΤɤˤǤե񤭹ळȤǤޤ -򾯤ˤ뤿ˡ@code{SELECT ... INTO OUTFILE} ǺƤΥե -ɤ߹߲ǽ졢¸ΥեˤϾ񤭤Ǥޤ - -@tindex /etc/passwd -@strong{file} ¤ϥС餻Ƥ UNIX 桼Ǥ -ƤΥեɤि˻Ѥ줫⤷ޤ -㤨С @file{/etc/passwd} ơ֥˼ि @code{LOAD DATA} -Ѥȡ @code{SELECT} ǤƤɤ뤳Ȥˤʤޤ - -@item -ʤ DNS Ѥʤ硢¥ơ֥ˤϥۥ̾ IP -Ѥ٤Ǥ@code{mysqld} ؤ @code{--secure} ץϸϥۥ̾ -ˤޤɤʾǤ⡢磻ɥɤޤۥ̾򡢵ĥơ֥Ͽ -տ٤Ǥ - -@end itemize - -@code{mysqld} ؤμΥץϥƥ˱ƶޤ: - -@table @code -@item --secure -@code{gethostbyname()} ֤ ip ꥸʥΥۥ᤻̾뤫 -åޤϡï¾ΥۥȤ򿿻ƥ -Ȥ񤷤ޤΥץϤĤۥ̾å -äޤϡ˥åĹ֤뤿ᡢ@strong{MySQL} 3.21 -ǤϥǥեȤǤϥդˤƤޤ@strong{MySQL} 3.22 ǤϤΥץ -ǥեȤͭˤʤäƤޤۥ̾򥭥å夹褦ˤʤäƤޤ - -@item --skip-grant-tables -øƥѤޤ󡣤ƤΥǡ١ؤ -@emph{ʥ} Ϳޤ -(@code{mysqladmin flush-privileges} @code{mysqladmin reload} ¹Ԥ뤳Ȥǡ -ưƤ륵СøƥѤ褦ˤʤޤ) - -@item --skip-name-resolve -ۥ̾Ϥޤ󡣸¥ơ֥Ƥ @code{Host}եɤ IP ɥ쥹 -@code{localhost} ǤʤФʤޤ - -@item --skip-networking -ͥåȥ (TCP/IP) ͳ³Ĥޤ@code{mysqld} ؤƤ³ϡ -Unix åȤǹԤޤMIT-pthreads Unix åȤ򥵥ݡȤʤ -ᡢΥץ MIT-pthreads Ѥ륷ƥǤϡޤưޤ -@end table - - -@node What Privileges, User names, Security, Privilege system -@section øƥιԤ - -@strong{MySQL} øƥδܵǽϡͿ줿ۥȤ³ -桼ǧڤ뤳ȡƥǡ١Ф - @strong{select}, @strong{insert}, @strong{update}, @strong{delete} θ¤Ϳ뤳ȤǤ - -ĥǽƿ̾桼ǽϤޤߡ@code{LOAD DATA INFILE} Τ褦 -@strong{MySQL} ͭεǽѤĤͿޤ - - -@node User names, Connecting, What Privileges, Privilege system -@section @strong{MySQL} 桼̾ȥѥ - -@strong{MySQL} ˤäƻѤ桼̾ȥѥɤλѤΤȡ -UNIX, Windows ǻѤˡȤϡĤۤʤޤ - -@itemize @bullet -@item -@strong{MySQL} ǡ١Υǧڤ˻Ѥ桼̾ϡ -UNIX Υ桼WindowsΥ桼̾ǹԤȤϤޤ(פƤޤ) -Ϥ뤿ᡢ¿ @strong{MySQL} 饤ȤϸߤΥ󤷤Ƥ桼̾ -@strong{MySQL}Υ桼̾Ȥƥߤޤ - @code{-u} @code{--user} åѹǤޤ -ϡƤΥ桼ФѥɤꤷƤʤȡ -ǡ١ˤǤʤȤ̣ޤ -⤷ѥɤ桼ꤷƤʤȡΥ桼̾ǧڤʤ˥С³Ǥޤ - -@item -@strong{MySQL} Υ桼̾ 16ʸޤ(ѿȾ)ѤǤޤ -UNIXϤ8ʸǤ(8ʸ򤳤륷ƥ⤢) - -@item -@strong{MySQL} 桼ΥѥɤϡUnix ΥѥɤȰ㤤ޤ -äơΥޥ Unix Υѥɤ -ǡ١ΥѥɤƱˤɬפϤޤ - -@item -@strong{MySQL} Unix ΥѥɤȤ㤦 -ȼΰŹ沽줿ѥɤѤޤ -@code{PASSWORD()} @code{ENCRYPT()} ؿ򻲾 @ref{Miscellaneous -functions}. -@end itemize - -@node Connecting, Password security, User names, Privilege system -@section @strong{MySQL} С³ - -@strong{MySQL} 饤ȥץϡ̤ηޤäޤ -³ۥ̾³桼̾ƥѥɤǤ -㤨С@code{mysql} ޥɤϰʲΤ褦ʰޤ -(ץΰ @samp{[} @samp{]} ǰϤޤƤʬǤ) - -@example -shell> mysql [-h host_name] [-u user_name] [-pyour_pass] -@end example - -@code{-h}, @code{-u}, @code{-p} ץϰʲǤ -@code{--host=host_name}, @code{--user=user_name}, @code{--password=your_pass} -@code{-p} ȥѥɤδ֤ˤϥڡʤȤ - -@strong{:} ޥɥ饤˥ѥɤͿΤϰǤϤޤ -ƥäƤǡʤ桼 @code{ps auxww} Τ褦ʥޥɤ -ѤǥѥɤդǤޤ -@xref{Option files}. - -@code{mysql} ޥɤϥޥɥ饤˰ʤ³˥ǥեͤѤޤ - -@itemize @bullet -@item -ǥեȤΥۥ̾ @code{localhost}, 桼̾ Unix Υ̾Ǥ - -@item -(@code{-p} ꤵƤʤХѥɤͿޤ) -@end itemize - -Unix Υ桼 @code{joe} ξ硢ʲΥޥɤǤ - -@example -shell> mysql -h localhost -u joe -shell> mysql -h localhost -shell> mysql -u joe -shell> mysql -@end example - -¾ @strong{MySQL} 饤ȤƱ褦ưޤ - -Unix ƥǤϡͤǥեͤˤ³˻Ѥ뤳ȤǤޤ -뤳Ȥˤꡢ󥳥ޥɥ饤˰ͿʤƤ褦ˤʤޤ - -@itemize @bullet -@item -@tindex .my.cnf file -ʬΥۡǥ쥯ȥ @file{.my.cnf} ꡢΥե -@code{[client]} ³ѤΥѥ᥿򵭽ҤǤޤ -εҤϰʲΤ褦Ǥ - -@example -[client] -host=host_name -user=user_name -password=your_pass -@end example - -@xref{Option files}. - -@item -@tindex MYSQL_HOST environment variable -@tindex Environment variable, MYSQL_HOST -@tindex MYSQL_PWD environment variable -@tindex Environment variable, MYSQL_PWD -@tindex USER environment variable -@tindex Environment variable, USER -³Υѥ᥿˴ĶѿѤ뤳ȤǤޤ -ۥ̾ @code{MYSQL_HOST} ĶѿѤޤ -@strong{MySQL} Υ桼̾ @code{USER} ( Windows Τ) ꤵ줿ͤѤޤ -ѥɤ @code{MYSQL_PWD} Ķѿ򸫤ޤϴǤ(Ỳ) -@xref{Environment variables}. -@end itemize - - -@node Password security, Privileges provided, Connecting, Privilege system -@subsection ѥɤˤ - -ʬΥѥɤ¾ͤˤ餱ФΤϴ뤳ȤǤϤޤ -줾ˡ˱٤˱ʲ˼ˡǥ饤ȥץ -ʤΥѥɤ򤢤餻뤳ȤǤޤ - -@itemize @bullet -@item -@code{-pyour_pass} @code{--password=your_pass} ץ򥳥ޥɥ饤ǻѤޤ -ǤǤϤޤ󡣤ʤΥѥɤ (@code{ps} ޥɤΤ褦) -ƥξ֤򸫤륳ޥɤˤƸ뤳ȤǤޤ -(@strong{MySQL} 饤ȤϽˤƥޥɥ饤ΰ򥼥Ǿ񤭤 -ʤ褦ˤƤΤǤִ֤ǤͤƤޤΤǤ) - -@item -@code{-p} 뤤 @code{--password} ץ @code{your_pass} ͿʤǻѤޤ -ξ硢饤ȥץϥߥʥ̤ƥѥɤϤ¥Ƥޤ: - -@example -shell> mysql -u user_name -p -Enter password: ******** -@end example - -饤ȤϤʤϤѥɤ @samp{*} ʸü֤ƤޤΤǡ -̤Τޤ줿ȤƤѥɤϤ狼ޤ - -ϥޥɥ饤˥ѥɤꤹǤ¾Υ桼ˤϸޤ󤫤顣 -ΥѥɤˡüΥץ¹Ԥ˻ѤǤǤ -⤷üΥץȤ饯饤ȥץư硢 -ѥɤü뵡񤬤ޤ -On some systems, you may even find that the first line of your -script is read and interpreted (incorrectly) as your password! - -@item -@tindex .my.cnf file -ե˥ѥɤ񤤤ƤȤǤޤ -㤨СʬΥۡǥ쥯ȥ꡼ˤ @file{.my.cnf} ե @code{[client]} -ˡʲΤ褦ʷǽ񤭤ޤ - -@example -[client] -password=your_pass -@end example - -⤷ @file{.my.cnf} ե˥ѥɤ񤤤Ƥʤ顢եϥ롼פ -¾Υ桼ɤ߽񤭤Ǥʤ褦ˤ٤ǤեΥ⡼ɤ @code{400} - @code{600} ˤޤ - -@xref{Option files}. -@item -@code{MYSQL_PWD} Ķѿ˥ѥɤꤹ뤳ȤǤޤˡ -ƴǤΤǡѤ٤ǤϤޤ -@code{ps} ΤСǤϡ¹ΥץδĶѿɽ륪ץ󤬤ޤ -⤷ @code{MYSQL_PWD} Ķѿ˥ѥɤꤷƤƤ٤Ǹޤ -ΥС @code{ps} äƤʤƥȤƤ⡢ץδĶѿĴ٤ -ˡʤȤϤʤΤǡˡϤޤꤤˡǤϤޤ -@xref{Environment variables}. -@end itemize - -ޤȤȡˡϡ -ѥɥץץȤ֤饤ȥץ¹Ԥ뤫 -Ŭڤʥѡߥå򤫤 @file{.my.cnf} ե˥ѥɤ񤯤 -Ǥ - - -@node Privileges provided, Privileges, Password security, Privilege system -@section @strong{MySQL} 󶡤븢 - -¤ @code{mysql} ǡ١ @code{user}, @code{db}, @code{host}, - @code{tables_priv}, @code{columns_priv} ǹԤޤ -(@code{mysql} ϥǡ١̾Ǥ) -@strong{MySQL} СϡСεư - @ref{Privilege changes} Ƥˡˤꡢ -Υơ֥뤫鸢¤ɤ߹ߤޤ - -@strong{MySQL} 󶡤븢¤̾Τ, -ܥޥ˥奢Ǥϰʲɽ̾ΤѤޤ -ɽι̾줾εĤ븢¤ȤбƤޤ - -@multitable @columnfractions .15 .25 .6 -@item @strong{Privilege} @tab @strong{Column} @tab @strong{Context} -@item @strong{select} @tab @code{Select_priv} @tab tables -@item @strong{insert} @tab @code{Insert_priv} @tab tables -@item @strong{update} @tab @code{Update_priv} @tab tables -@item @strong{delete} @tab @code{Delete_priv} @tab tables -@item @strong{index} @tab @code{Index_priv} @tab tables -@item @strong{alter} @tab @code{Alter_priv} @tab tables -@item @strong{create} @tab @code{Create_priv} @tab databases, tables or indexes -@item @strong{drop} @tab @code{Drop_priv} @tab databases or tables -@item @strong{grant} @tab @code{Grant_priv} @tab databases or tables -@item @strong{references} @tab @code{References_priv} @tab databases or tables -@item @strong{reload} @tab @code{Reload_priv} @tab server administration -@item @strong{shutdown} @tab @code{Shutdown_priv} @tab server administration -@item @strong{process} @tab @code{Process_priv} @tab server administration -@item @strong{file} @tab @code{File_priv} @tab file access on server -@end multitable - -@strong{select}, @strong{insert}, @strong{update}, @strong{delete} θ¤ϡ -¸ߤƤǡ١Υơ֥ФƵĤޤ - -⤷ơ֥뤫ԤФʤ顢@code{SELECT} ʸ¹Ԥ뤿ˤ - @strong{select} ¤Фޤޤ -ǤʤСΤɤΥǡ١˥ĤƤʤǤ⡢ - @code{SELECT} ϼ¹Ԥ뤳ȤǤޤ -㤨Сñʷ׻ @code{mysql} 饤ȤǹԤǤ - -@example -mysql> SELECT 1+1; -mysql> SELECT PI()*2; -@end example - -@strong{index} ¤ϥǥåκ˴()Ĥޤ - -@strong{alter} ¤ @code{ALTER TABLE} μ¹ԤĤޤ - -@strong{create} @strong{drop} ¤ϡǡ١ơ֥κ -뤤ϴ¸ߤǡ١ơ֥˴()Ĥޤ - -ա @code{mysql} ǡ١ϿƤ桼 @strong{drop} ¤Ϳȡ -Υ桼 @strong{MySQL} Υ¤ǼƤǡ١˴Ǥޤ - -@strong{grant} ¤ϡʤ¾Υ桼ФƼʬθ¤Ĥޤ - - @strong{file} θ¤Ϳȡ@code{LOAD DATA INFILE} @code{SELECT ... INTO OUTFILE} ʸѤơСΥեɤ߽񤭤Ǥޤ - @strong{MySQL} Сɤ߽񤭤ǤեФơθ¤Ϳ줿桼ϥեɤ߽񤭤Ǥޤ - -Ĥθ¤ϥɥߥ˴ؤĤǡ@code{mysqladmin} ޥɤѤƼ¹Ԥޤ -ɽ @code{mysqladmin} ޥɤΤɤ줬ɤθ¤бƤ뤫򼨤ޤ - -@multitable @columnfractions .15 .85 -@item @strong{Privilege} @tab @strong{Commands permitted to privilege holders} -@item @strong{reload} @tab @code{reload}, @code{refresh}, -@code{flush-privileges}, -@code{flush-hosts}, @code{flush-logs}, @code{flush-tables} -@item @strong{shutdown} @tab @code{shutdown} -@item @strong{process} @tab @code{processlist}, @code{kill} -@end multitable - -@code{reload} ޥɤϥС˸¤ɹ褦ޤ -@code{refresh} ޥɤƤΥơ֥եå夷ե򳫤ľޤ -@code{flush-privileges} @code{reload} ƱǤ -¾ @code{flush-*} ޥɤ @code{refresh} ưȤ褯Ƥޤ -ŬϰϤʤäƤꡢäȤͭǤ -㤨Сեեå夷硢 -@code{refresh} Ԥ @code{flush-logs} Ǥ - -@code{shutdown} ޥɤϡС򥷥åȥ󤷤ޤ - -@code{processlist} ޥɤϥС¹ԤƤ륹åɤξɽޤ - @code{kill} ޥɤϥСΥåɤkillޤ -ʬΥåɤϾɽkillǤޤ¾ͤΥåɤ򤽤ˤ @strong{process} ¤ɬפǤ - -븢¤ߤ桼ˤθ¤ĤΤϤ褤ͤǤ -¤ͿȤˤϡλΤƤʤФʤޤ - -@itemize @bullet -@item -@strong{grant} ¤Ĥ줿桼ϡ¾Υ桼θ¤ѤǤޤ -ͤΥ桼֤ǰäƤ븢¤ @code{grant} ¤촹뤳ȤǤޤ - -@item -@strong{alter} ¤ϡơ֥̾ѹԤȤˤøƥˤ뤿 -Ѥ뤫⤷ޤ - -@item -@strong{file} ¤ϡСˤƤɤ߹߲ǽʥե -ǡ١˼ळȤǤ @code{SELECT} ʸǥǤޤ -This includes the contents of all databases -hosted by the server! - -@item -@strong{shutdown} ¤ϡ¾Υ桼Ф륵ӥ򡢥С -ߤ뤳Ȥˤäơݤ褦ˤǤޤ - -@item -@strong{process} ¤ϼ¹ԤƤ륯꡼ץ졼ƥȤǸ뤳Ȥ˻Ȥޤ -ѥɤꡢѹΥ꡼ޤߤޤ - -@item - @code{mysql} ǡ١ФƤθ¤ϡѥɤѹ¾θ¤ѹǤޤ -ѥɤϰŹ沽ϿƤꡢդΤ桼Ǥ -ñɤळȤϤǤޤ󤬡θ¤Ĥ줿Υ桼ϡ -ѥɤ㤦ΤѤ뤳ȤǤޤ -@end itemize - -ʲ @strong{MySQL} øƥǹԤΤǤϤޤ - -@itemize @bullet -@item -ݤ桼ꤷꤹ뤳ȤϤǤޤ -˰פ桼³ݤǤޤ - -@item -ǡ١Υơ֥κ˴θ¤Ĥ -ǡ١ΤΤ˴Ǥ롢Τ褦ʥ桼Ǥޤ -@end itemize - - -@node Privileges, Connection access, Privileges provided, Privilege system -@section øƥϤɤΤ褦ư - -@strong{MySQL} øƥϡƤΥ桼Ϳ줿Ĥϰưݾڤޤ -@strong{MySQL} С³Ȥܿͤοȸϡ@strong{³Υۥ} - @strong{³˻Ѥ桼̾} ˤäƳǧޤ -Υƥϡʤοȸ@strong{ʤ׵᤹뤳Ȥ} ˤäơ¤Ϳޤ - -@strong{MySQL} ϤʤΥۥ̾ȥ桼̾ξ򤢤碌ƥåޤ -ϥ󥿡ͥåȾƱ̾Υ桼ɤˤ뤫⤷ʤȤȤ餽Ƥޤ -㤨С@code{whitehouse.gov} ³Ƥ @code{bill} ȡ - @code{microsoft.com} ³Ƥ @code{bill} ƱʪǤɬפϤޤ -@strong{MySQL} Ϥΰ㤦ۥȤ³ƤƱ̾Υ桼ʲΤ褦ˤưޤ - @code{whitehouse.gov} ³ @code{bill} ˤĤ򤢤 -Ȥϰ㤦Ĥ @code{microsoft.com} ³Ƥ @code{bill} Ϳޤ - -@strong{MySQL} ΥȥϰʲĤʤޤ - -@itemize @bullet -@item -Stage 1: С³Ĥ뤫ɤåޤ - -@item -Stage 2: ³ĸ塢СϤ줾ΥꥯȤåޤ -ʤ׵ᤷƤ򡢤ʤ¹ԤǤ뤫ɤåޤ -㤨Сǡ١Υơ֥ιԤμФơ֥˴򤢤ʤ̿ᤷ硢 -СϡʤˤΥơ֥Ф @strong{select} ĤΤ -ǡ١Ф @strong{drop} ĤͿƤΤǧޤ -@end itemize - -С @code{mysql} ǡ١ @code{user}, @code{db}, @code{host} ĤΥơ֥뤫顢 -ΣĤΥ¤ꤷޤ -Υơ֥ΥեɤϰʲΤ褦ˤʤäƤޤ - -@multitable @columnfractions .2 .25 .25 .25 -@item @strong{Table name} @tab @code{user} @tab @code{db} @tab @code{host} - -@item @strong{Scope fields} @tab @code{Host} @tab @code{Host} @tab @code{Host} -@item @tab @code{User} @tab @code{Db} @tab @code{Db} -@item @tab @code{Password} @tab @code{User} @tab - -@item @strong{Privilege fields} @tab @code{Select_priv} @tab @code{Select_priv} @tab @code{Select_priv} -@item @tab @code{Insert_priv} @tab @code{Insert_priv} @tab @code{Insert_priv} -@item @tab @code{Update_priv} @tab @code{Update_priv} @tab @code{Update_priv} -@item @tab @code{Delete_priv} @tab @code{Delete_priv} @tab @code{Delete_priv} -@item @tab @code{Index_priv} @tab @code{Index_priv} @tab @code{Index_priv} -@item @tab @code{Alter_priv} @tab @code{Alter_priv} @tab @code{Alter_priv} -@item @tab @code{Create_priv} @tab @code{Create_priv} @tab @code{Create_priv} -@item @tab @code{Drop_priv} @tab @code{Drop_priv} @tab @code{Drop_priv} -@item @tab @code{Grant_priv} @tab @code{Grant_priv} @tab @code{Grant_priv} -@item @tab @code{References_priv} @tab @tab -@item @tab @code{Reload_priv} @tab @tab -@item @tab @code{Shutdown_priv} @tab @tab -@item @tab @code{Process_priv} @tab @tab -@item @tab @code{File_priv} @tab @tab -@end multitable - -ȥ2ʳ(׵᾵ǧ)ΤˡСϤ 3 Ĥ -ơ֥ˤäƷ줿ĤܤȤޤ⤷ơ֥Ф׵ -ʤС@code{tables_priv} @code{columns_priv} ơ֥ -Ĵ٤ޤΥơ֥ΥեɤϰʲΤ褦ˤʤäƤޤ - -@multitable @columnfractions .2 .25 .25 -@item @strong{Table name} @tab @code{tables_priv} @tab @code{columns_priv} - -@item @strong{Scope fields} @tab @code{Host} @tab @code{Host} -@item @tab @code{Db} @tab @code{Db} -@item @tab @code{User} @tab @code{User} -@item @tab @code{Table_name} @tab @code{Table_name} -@item @tab @tab @code{Column_name} - -@item @strong{Privilege fields} @tab @code{Table_priv} @tab @code{Type} -@item @tab @code{Column_priv} @tab - -@item @strong{Other fields} @tab @code{Timestamp} @tab @code{Timestamp} -@item @tab @code{Grantor} @tab -@end multitable - -ơ֥γƥեɤʬहȡˤ狼ޤ -ŬϰϤꤹե(ʲץե)ȵĤե(ʲ¥ե)Ǥ - -ץեɤϡ¥ơ֥ϿȤˡŬϰϤޤ -㤨С @code{user} ơ֥ @code{Host} @code{User} - @code{'thomas.loc.gov'} @code{'bob'} ϿƤ硢 -Сؤ³ ۥ @code{thomas.loc.gov} 褿 @code{'bob'} ˵Ĥޤ -Ʊͤˡ@code{db} ơ֥ @code{Host}, @code{User}, @code{Db} - @code{'thomas.loc.gov'}, @code{'bob'}, @code{'reports'} ϿƤȡ -ۥ @code{thomas.loc.gov} 褿 @code{bob} Ф @code{reports} ǡ١ؤ³ޤ -@code{tables_priv} @code{columns_priv} ơ֥ϡ -ơ֥뤫ơ֥ȥեɤФˤץեɤޤߤޤ - -@cindex Case sensitivity, in access checking -Υåϡ@code{Host} ͤϥ¸Ӥޤ -@code{User}, @code{Password}, @code{Db}, @code{Table_name} ͤϥ¸Ӥޤ -@code{Column_name} ͤ @strong{MySQL} 3.22.12 ʾǤϥ¸Ӥޤ -(3.22.11 ޤǤ ¸Ǥ) - -¥եɤϡơ֥Ͽ뤳ȤˤͭˤʤäĤ򤷤ᤷ -Ϥɤ¹ԤǤ뤫򼨤ޤ -Сϵĥơ֥ξ桼θ¤뤿ˤޤȤޤ -Υ桼θµĤФˡ @ref{Request access} ˽Ҥ٤Ƥޤ - -ץեɤʸ졢ǥեͤ϶ʸˤʤäƤޤ - -@multitable @columnfractions .15 .15 .7 -@item @strong{Field name} @tab @strong{Type} -@item @code{Host} @tab @code{CHAR(60)} -@item @code{User} @tab @code{CHAR(16)} -@item @code{Password} @tab @code{CHAR(16)} -@item @code{Db} @tab @code{CHAR(64)} @tab (@code{CHAR(60)} for the -@code{tables_priv} and @code{columns_priv} tables) -@item @code{Table_name} @tab @code{CHAR(60)} -@item @code{Column_name} @tab @code{CHAR(60)} -@end multitable - -@code{user}, @code{db}, @code{host} ơ֥Ǥϡ -Ƥθ¥եɤ @code{ENUM('N','Y')} ޤ -ͤ @code{'N'} @code{'Y'} Τɤ餫ǡǥեͤ @code{'N'} Ǥ - -@code{tables_priv} @code{columns_priv} ơ֥Ǥϡ -¥եɤ @code{SET} եɤȤޤ - -@multitable @columnfractions .2 .2 .6 -@item @strong{Table name} @tab @strong{Field name} @tab @strong{Possible set elements} -@item @code{tables_priv} @tab @code{Table_priv} @tab @code{'Select', 'Insert', -'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'} -@item @code{tables_priv} @tab @code{Column_priv} @tab @code{'Select', 'Insert', -'Update', 'References'} -@item @code{columns_priv} @tab @code{column_priv} @tab @code{'Select', 'Insert', -'Update', 'References'} -@end multitable - -СϰʲΤ褦˵ĥơ֥Ѥޤ - -@itemize @bullet -@item -@code{user} ơ֥Υץեɤϡ³׵뤫ݤ뤫ꤷޤ -For allowed connections, any privileges granted in -the @code{user} table indicate the user's global (superuser) privileges. -These privileges apply to @strong{all} databases on the server. -( -㤨С@code{user} ơ֥ θ¤ @code{'Y'} ˤ硢 -ɤʤ @code{Db} @code{Host} @code{'N'} ˤȤƤ @code{'Y'} ΤޤޤǤ롣 -褦 @code{user} ơ֥θµ @code{'Y'} ƤȿǤƤޤȤ -@code{user} ơ֥ˤϺ¤εĤͿ褦ˤ -@code{Db} @code{Host} Ȥˡ줾θµĤ̵ -) - -@item -@code{db} @code{host} ơ֥ϰ˻Ѥޤ - -@itemize @minus -@item -@code{db} ơ֥ΥץեɤϤɤΥۥȤɤΥǡ١ΥǤ뤫ꤷޤ -¥եɤϡɤäǤ뤫ޤ - -@item -@code{host} ơ֥ϡ@code{db} ơ֥Ͽˤ˥ۥȤͿˡ -@code{db} ơ֥γĥȤƻѤޤ -㤨Сͥåȥθꤷޥ󤫤ǡ١Ѥ硢 -@code{db} ơ֥ @code{Host} ͤ϶ˤƤޤ - @code{host} ơ֥ˤ줾ΥۥȤˤĤƤϿԤޤ -εϡ @ref{Request access} Ǿܺ٤˽Ҥ٤Ƥޤ -@end itemize - -@item -@code{tables_priv} @code{columns_priv} ơ֥ @code{db} ơ֥˻Ƥޤ -Ϥ٤Ǥޤ -ǡ١٥ǤϤʤơ֥ȥեɤΥ٥Ϳޤ -@end itemize - -Ը (@strong{reload}, @strong{shutdown},ʤ) @code{user} ơ֥ˤ褦ˡ -ϡϥǡ١ǤϤʤСؤǤꡢ -¾εĥơ֥ˤɬפʤǤ -ޤƤȡεĤϡ@code{user} ơ֥ -Ф狼褦ˤʤޤ - -@strong{file} θ¤ @code{user} ơ֥ˤ褦ˡ -ϴǤϤޤ󤬡Ƥǡ١ˤ餺 -СΥեɤ߽񤭤ǤΤǤ - -@code{mysqld} СϵưˤΥơ֥ɤ߹ߤޤ -ĥơ֥ѹȿǤˡϤ򻲾ȤΤ @ref{Privilege changes} - -Υơ֥Ͽѹ硢פäȤθ¾֤ˤʤäƤǧ뤳ȤϤȤǤ -βˤ, @ref{Access denied}. ƥ˴ؤ륢ɥХ -@ref{Security}. - -ʥġȤ @code{mysqlaccess} ץ( Yves Carlier ) @strong{MySQL} ۤ˴ޤޤƤޤ -@code{mysqlaccess} @code{--help} ץǵưȥإפɽޤ -@code{mysqlaccess} @code{user},@code{db} and @code{host} ơ֥ -ޤ󡣥ơ֥٥θ¡եɥ٥θ¤Ĵ٤ޤ - - -@node Connection access, Request access, Privileges, Privilege system -@section Access control, stage 1: ³ξǧ - -@strong{MySQL} С³ȡʤѥǧڤ³Ƥ褦ޤ -СϤʤοȸˤ³εĵݤԤޤ -⤷ȸפʤ³ݤ³Ĥ硢С stage 2 ؤȿʤߡ׵Ԥޤ - -ȸĤΤΤ˴ŤƳǧޤ - -@itemize @bullet -@item -ʤ³褦ȤƤۥ - -@item -ʤ @strong{MySQL} 桼̾ -@end itemize - -ȸγǧ @code{user} ơ֥Υץե(@code{Host}, @code{User}, @code{Password}) ѤƹԤޤ -С @code{user} ơ֥Ͽ˰פƤۥ̾ȥ桼̾˸¤³Ĥθ塢ѥɤ׵ᤷޤ - -@code{user} ơ֥ΥץեɤϿϰʲΤ褦ˤʤޤ - -@itemize @bullet -@item -@code{Host} ͤϥۥ̾ IP ɥ쥹 @code{'localhost'}(ۥ) Ǥ - -@item -@cindex Wildcards, in @code{mysql.user} table -@code{Host} ˤϥ磻ɥʸ @samp{%} @samp{_} ѤǤޤ - -@item -@code{Host} @code{'%'} ꤹȡƤΥۥȤ˥ޥåޤ -@code{Host} ˤȡ@code{'%'} Ʊˤʤޤ -ͤϡ@emph{ɤʥۥȤ⥵С³Ǥ}ȤȤˤʤޤ - -@cindex Netmask notation, in @code{mysql.user} table -@item -As of MySQL 3.23, for @code{Host} values specified as IP numbers, you -can specify a netmask indicating how many address bits to use for the -network number. For example: - -@example -GRANT ALL PRIVILEGES on db.* to david@'192.58.197.0/255.255.255.0'; -@end example - -This will allow everyone to connect from an IP where the following is true: - -@example -user_ip & netmask = host_ip. -@end example - -In the above example all IP:s in the interval 192.58.197.0 - -192.58.197.255 can connect to the @strong{MySQL} server. - -@item -@cindex Anonymous user -磻ɥʸ @code{User} եɤˤǤޤ󤬡 -@code{User} եɤ֥()ˤ뤳ȤϤǤޤ֥󥯤Ƥ̾˥ޥåޤ -ϥ桼̾ʤ֤³ƤΤŬѤ졢 -饤Ȥ桼̾ʤ¤ꡢƿ̾桼(֥̾)Ȥưޤ -ƤΥΥå˥֥󥯤Υ桼̾Ѥ̣ޤ(that is, during stage 2) - -@item -@code{Password} եɤ϶ˤǤޤξ硢ѥɤʤ³Ǥ뤳Ȥˤʤޤ -@end itemize - -@findex PASSWORD() -֥󥯤 @code{Password} ͤϥѥɤŹ沽ΤǤ -@strong{MySQL} Ϥ⤬褦˥ѥɤʿʸǤ¸ޤ -³ߤ褦ȤƤ桼Υѥɤ⡢(@code{PASSWORD()} ؿ) -Ź沽졢@code{user} ơ֥¸ƤŹ沽ѥɤ -Ӥޤ⤷פʤ顢ѥɤȤȤǤ - -ʲɽϡ³׵ФͿ롢 -@code{user} ơ֥ @code{Host} @code{User} Ǥ - -@multitable @columnfractions .25 .15 .60 -@item @code{Host} @strong{value} @tab @code{User} @strong{value} @tab @strong{Connections matched by entry} -@item @code{'thomas.loc.gov'} @tab @code{'fred'} @tab @code{fred}, @code{thomas.loc.gov} ³ -@item @code{'thomas.loc.gov'} @tab @code{''} @tab @code{thomas.loc.gov} ³ƤƤΥ桼 -@item @code{'%'} @tab @code{'fred'} @tab @code{fred}, ƤΥۥȤ³ -@item @code{'%'} @tab @code{''} @tab ƤΥۥȤ³Ƥ桼 -@item @code{'%.loc.gov'} @tab @code{'fred'} @tab @code{fred}, @code{loc.gov} ɥᥤƤΥۥȤ³ -@item @code{'x.y.%'} @tab @code{'fred'} @tab @code{fred}, @code{x.y.net}, @code{x.y.com},@code{x.y.edu}, ʤɤ³. (ޤͭʻȤǤϤʤǤ) -@item @code{'144.155.166.177'} @tab @code{'fred'} @tab @code{fred}, IP address @code{144.155.166.177} ΥۥȤ³ -@item @code{'144.155.166.%'} @tab @code{'fred'} @tab @code{fred}, @code{144.155.166} class C subnet ƤΥۥȤ³ -@item @code{'144.155.166.0/24'} @tab @code{'fred'} @tab Same as previous example -@end multitable - -@code{Host} IP Υ磻ɥ(㤨 @code{'144.155.166.%'} -֥ͥåȤƤΥۥȤ˥ޥå) Ѥ뤳ȤǤޤ -ξ硢 @code{144.155.166.somewhere.com} Ȥۥ̾ -줫³褦ȤƤ뤫⤷ޤ -Τ褦ʹФ@strong{MySQL} ϿɥåȤǻϤޤۥ̾ݤƤޤ -⤷ @code{1.2.foo.com} Τ褦̾ΥۥȤäƤ硢 -ĥơ֥ @code{Host} ˤФ˥ޥåޤ -IPɥ쥹ΤߡIP Υ磻ɥɤ˥ޥåˤʤޤ - -С³ϡ@code{user} ơ֥Ͽˣİʾ -ޥå뤫⤷ޤ -㤨, @code{thomas.loc.gov} @code{fred} ³ϡ˼줿 -ϿΤΤĤ˥ޥåǤ礦 -СϡʣϿ˥ޥå硢ɤΤ褦ˤƤ椫 -ѤϿ֤ΤǤ礦 -Сϵư @code{user} ơ֥򥽡Ȥ¤Ӵ줿 -Ͽ򸡺뤳Ȥˤꡢ褷ޤ -ǽ˥ޥåϿѤޤ - -@code{user} ơ֥뤬ʲΤ褦˥ȤƤ硧 - -@example -+-----------+----------+- -| Host | User | ... -+-----------+----------+- -| % | root | ... -| % | jeffrey | ... -| localhost | root | ... -| localhost | | ... -+-----------+----------+- -@end example - -СΥơ֥ɤȡ@code{Host} ͤǤμ¤ǤۥȤꤷƤ륨ȥ򡢺ǽ˻Ȥޤ -(@code{Host} @code{'%'} ``٤ƤΥۥ'' ̣ۥ̾ϤäꤷƤΤǤϤޤ) - -@code{Host} ͤƱȥ꤬ä硢äȤΤ @code{User} ͤ桼ꤷƤ륨ȥǽ˻Ȥޤ(@code{User} ͤξ硢``Ǥ'' ̣ޤ) -η̡@code{user} ơ֥ϰʲΤ褦˥Ȥޤ - -@example -+-----------+----------+- -| Host | User | ... -+-----------+----------+- -| localhost | root | ... -| localhost | | ... -| % | jeffrey | ... -| % | root | ... -+-----------+----------+- -@end example - -@cindex Grant tables, sorting -@cindex Sorting, grant tables -@cindex @code{user} table, sorting -³ߤ줿硢С¤Ӵ줿Ͽõǽ˸ĤΤ -Ѥޤ -@code{'localhost'} @code{jeffrey} ³ϡޤǽ @code{Host} @code{localhost} ꤷƤ륨ȥ˥ޥåޤ -桼̾Υȥϡۥ̾ȥ桼̾ξꤷ³ˤޥåޤ -( @code{'%'/'jeffrey'} ȥޥåޤϺǽˤϥޥåޤ) - -⤦㡣@code{user} ʲȲꤷޤ - -@example -+----------------+----------+- -| Host | User | ... -+----------------+----------+- -| % | jeffrey | ... -| thomas.loc.gov | | ... -+----------------+----------+- -@end example - -ϼΤ褦˥Ȥޤ - -@example -+----------------+----------+- -| Host | User | ... -+----------------+----------+- -| thomas.loc.gov | | ... -| % | jeffrey | ... -+----------------+----------+- -@end example - -@code{thomas.loc.gov} @code{jeffrey} ³ϡǽΥȥ˥ޥå -@code{whitehouse.gov} @code{jeffrey} ³ϡܤΥȥ˥ޥåޤ - -ǽ˥Ф,³ΤΥޥå򸫤ĤΤߤȤ,̤θͿ줿 -桼̾餫ˤΥ桼̿̾뤹٤ƤΥȥ꤬ѤȻפȤǤ. -ñǤϤޤ. jeffreyˤthomas.loc.gov³ǽ -ȥˤäƥ桼ʬͤȤơjeffrey'ޤޤʤΥȥˤäƤ -,Ϥ桼̾ʤ㼨ޤ! - -褯ͤ㤤ϡ桼̾Ϳ硢 -С³˥ޥåΤõݤˡ -Υ桼ϿƤƤΥ롼뤬 -ǽ˻Ѥȹͤ뤳ȤǤޤ -Ǥ򼨤ޤ@code{thomas.loc.gov} @code{jeffrey} ³ -ǽ˥ޥåΤϡ @code{User} եɤͤ @code{'jeffrey'} -ʤäƤ륨ȥǤϤʤ桼̾ʤ(Ǥ) Υȥ -˥ޥåޤ - -⤷Сؤ³ޤԤʤ硢 @code{user} ơ֥ɽ -ޥ˥奢ǥȤƤߤơɤΥȥ˺ǽ˥ޥå뤫õƤ - - -@node Request access, Privilege changes, Connection access, Privilege system -@section Access control, stage 2: ׵ξǧ - -³ΩȡСϥơ˰ܤޤ -ΥơǤϡСϤ³뤽줾׵᤬ĤƤ뤫ɤåޤ -åϼ¹Ԥ褦ȤƤΥפˤԤޤ -ĥơ֥Τɤθ¥եɤƤϤޤ뤫򸫤ޤ -鸢¤ @code{user}, @code{db},@code{host}, @code{tables_priv} @code{columns_priv} ơ֥ƳФޤ -ĥơ֥ @code{GRANT} ޥɤޤ -@xref{GRANT, , @code{GRANT}}. -(You may find it helpful to refer to the table shown earlier that lists -the fields present in each of the grant tables; see @ref{Privileges}.) - -@code{user} ơ֥ƤФƴܤȤʤ븢¤桼˳Ƥޤ -ȤȤΥǡ١ĤͿƤʤƤ⡢@code{user} ơ֥꤬ͭˤʤޤ -㤨С@code{user} ơ֥ @strong{delete} Ĥ硢 -Сˤɤʥǡ١ιԤǤΤǤ -ʤС@code{user} ơ֥θ¤ϥѡ桼θ¤ȸäƤ⤤Ǥ礦 -θ¤ϥѡ桼(Сǡ١)ΤߤͿƤǤ -¾Υ桼ϡ@code{user} ơ֥θ¤ @code{'N'} ΤޤޤˤƤ٤Ǥ -ޤ@code{db} ơ֥ @code{host} ơ֥Ѥơ -ǡ١ꤷǥ桼˸¤Ĥ٤Ǥ - -@cindex Anonymous user -@cindex Wildcards, in @code{mysql.db} table -@cindex Wildcards, in @code{mysql.host} table -@code{db} ơ֥ @code{host} ơ֥Υǡ١Ф븢µĤԤޤ -Values in the scope fields may be specified as follows: - -@itemize @bullet -@item -磻ɥʸ @samp{%} @samp{_} @code{Db} ơ֥ @code{Host} եɤ˻ѤǤޤ - -@item -@code{'%'} @code{Host} ͤ ``ۥ'' ̣ޤ -@code{db} ơ֥ @code{Host} ˶ꤹȡ`` @code{host} ơ֥˵ľõˤ'' -Ȥʤޤ - -@item -@code{'%'} ͤ @code{Host} ơ֥ꤹȡ ``ۥ'' Ȥʤޤ - -@item -@code{'%'} ͤ @code{host} ơ֥ @code{Db} եɤꤹȡ - ``ǡ١'' Ȥʤޤ - -@item -@code{User} ͤˤȡƿ̾桼˥ޥåޤ -@end itemize - -@cindex Grant tables, sorting -@cindex Sorting, grant tables -@cindex @code{db} table, sorting -@cindex @code{host} table, sorting -Сưˡ@code{db} ơ֥ @code{host} ơ֥ϥСɤ߹ޤޤ -(@code{user} ơ֥⤳λƱɤޤޤ) -@code{db} ơ֥ @code{Host}, @code{Db}, @code{User} ΥեɤǥȤ졢 -@code{host} ơ֥ @code{Host}, @code{Db} եɤǥȤޤ -@code{user} ơ֥ϡǤ륨ȥǽˡǤʤΤǸ˥Ȥޤ -СϥȤ줿Τ椫顢ǽ˥ޥåΤѤޤ - -@cindex Wildcards, in mysql.tables_priv table -@cindex Wildcards, in mysql.columns_priv table -@code{tables_priv} @code{columns_priv} ơ֥ϡ -Υơ֥ȥեɤФ븢¤Ĥޤ -ץեɤͤϡˤäƵҤޤ - -@itemize @bullet -@item -磻ɥʸ @samp{%} @samp{_} Ϥɤ餫Υơ֥ -@code{Host} եɤ˻ѤǤޤ - -@item -ɤ餫Υơ֥ @code{Host} ͤ @code{'%'} ֥󥯤ˤȡ -``any host.'' ̣ޤ - -@item -@code{Db}, @code{Table_name}, @code{Column_name} եɤϤɤΥơ֥ˤ -磻ɥɤ֥󥯤ϻѤǤޤ -@end itemize - -@code{tables_priv} @code{columns_priv} ơ֥ -@code{Host}, @code{Db}, @code{User} եɤ¤Ӵޤ - @code{db} ơ֥ΥȤ˻Ƥޤ @code{Host} եɤ -磻ɥɤޤΤǡȤϤñʤΤˤʤޤ - -׵ξǧϼΤ褦ˤƹԤޤ -⤷ǧꤹʬΥɤǤʤ顢 -äѤä르ꥺǾǧηԤäƤ˵ŤǤ礦 - -Ԥ׵(@strong{shutdown}, @strong{reload}, etc.)ˤĤƤϡС - @code{user} ơ֥򻲾Ȥޤ(@code{user} ơ֥Ը¤Υեɤ) -ȥ˵ϿƤϼ졢ʳϵݤޤ -㤨С@code{mysqladmin shutdown} ¹Ԥ褦ȤƤ⡢@code{user} ơ֥ @strong{shutdown} ¤Ƥʤм¹ԤǤޤ󡣤λ@code{db} @code{host} ơ֥ϥåޤ(Υơ֥ˤ @code{Shutdown_priv} եɤ̵Ǥ) - -ǡ١ؤ׵ (@strong{insert}, @strong{update}, etc.) ˤơСϤޤǽˡ桼ΥХʸ(ѡ桼) @code{user} 椫õޤ -⤷ĤͿƤСޤ - -@code{user} ơ֥ΥХʸ¤꤬ԽʬǤʤ顢Сϥ桼Υǡ١Ф븢¤ @code{db} ơ֥ @code{host} ơ֥뤫ꤷޤ - -@enumerate -@item -С @code{db} ơ֥ @code{Host},@code{Db},@code{User}եɤ򻲾Ȥޤ -@code{Host} @code{User} եɤϥ桼³Υۥ̾ @strong{MySQL} 桼̾˥ޥåޤ -@code{Db} եɤϥ桼ǡ١̾˥ޥåޤ -@code{Host} @code{User} ˥ޥåΤ̵ä硢ϵݤޤ - -@item -@code{db} ơ֥ @code{Host} եɤǤʤȥ˥ޥå硢 -桼λꤵƤǡ١Ф븢¤ޤ - -@item -@code{Host} եɤͤ @code{db} ơ֥Υȥ˥ޥå硢 -ɤΥۥȤΥǡ١إǤ뤫 @code{host} ơ֥뤫õФޤ -ξ硢@code{host} ơ֥ @code{Host}, @code{Db} եɤȥޥåΤõФޤ -@code{host} ơ֥˥ȥ꤬ʤä硢ϵݤޤ -⤷ޥåȡ桼ǡ١Ф븢¤ϡ -@code{host} ơ֥ @code{db} ơ֥ξˤޤä¤Фޤ -ʤξȤ @code{'Y'} Ǥ븢¡ -(ˡѤȡޤ @code{db} ơ֥Υȥޤʸ¤ꤷƤ -줫 @code{host} ơ֥ΥȥѤơۥȾȤ˸¤ꤷƤȤǤޤ) -@end enumerate - -ǡ١Ф븢¤ @code{db} ơ֥ @code{host} ơ֥Υȥ꤫ꤵ줿塢 -СϤγФ줿¤Ф@code{user} ơ֥ꤵƤ븢¤äޤ -η̤줿¤˥ޥå׵ϼޤ -ǤʤССϥ桼Υơ֥롢եɤФĤ - @code{tables_priv} @code{columns_priv} õޤ -Ϥη̤ˤꡢġݤޤ - -Υ桼θ¤׻ˡεҤϡboolean ɽǼʤС -ʲΤ褦ˤʤǤ礦 - -@example -global privileges -OR (database privileges AND host privileges) -OR table privileges -OR column privileges -@end example - -Ͼʬˤ⤷ޤ󡣤⤷Х @code{user} ȥ -µĤꥯȤ줿ڥ졼ˤԽʬȺǽʬäݡ -Сθ¤ database-, table-, column-ͭθ¤ -ˡʤɲäƤޤΤ - ͳϡꥯȤ1İʾθ¤׵᤹ȤȤǤ -㤨С⤷ʤ @code{INSERT ... SELECT} ʸ¹Ԥʤ顢 -ʤˤ @strong{insert} @strong{select} ĤɬפǤ -ʤθ¤ @code{user} ơ֥륨ȥǰĤθ¤Ĥ졢 - @code{db} ơ֥ǡΤۤθ¤ĤƤȤޤ -ξ硢ʤϡΥꥯȤ¹Ԥ뤿ˡɬפʸ¤äƤޤ -СϤɤΥơ֥롢ñΤǤϡ¤뤳Ȥޤ -¤ϡξΥȥ꡼碌ʤƤϤʤʤΤǤ - -@code{host} ơ֥ ``'' ۥȤΥꥹȤݻ뤿˻ѤǤޤ -TcX Ǥϡ@code{host} ơ֥ˤϥͥåȾƤΥۥȤϿƤޤ -ΥۥȤƤθ¤ĤƤޤ - -դ @code{host} table ǰ@emph{ǤϤʤ}ۥȤꤹ뤳ȤǤޤ - @code{public.your.domain} Ȥޥ󤬰ǤϤʤƤˤȤޤ -ξʲΤ褦ˤơθޥʳΥͥåȥΥۥȤФơĤ뤳ȤǤޤ - -@example -+--------------------+----+- -| Host | Db | ... -+--------------------+----+- -| public.your.domain | % | ... (all privileges set to 'N') -| %.your.domain | % | ... (all privileges set to 'Y') -+--------------------+----+- -@end example - -¤Υơ֥ϡʤλפ̤˵ĤΤ(@code{mysqlaccess}Ѥ)å٤Ǥ - - -@node Privilege changes, Default privileges, Request access, Privilege system -@section ĸ¤ѹȿǤ뤫 - -@code{mysqld} εưƤεĥơ֥ϥ꡼ɤ߹ޤ졢 -λͭˤʤޤ - -@code{GRANT}, @code{REVOKE}, @code{SET PASSWORD} ѤƵĥơ֥ -ѹ硢ľ˥ФΤޤ - -⤷ưǵĥơ֥ѹ(@code{INSERT}, @code{UPDATE} ʤɤ) -@code{FLUSH PRIVILEGES} ʸ @code{mysqladmin flush-privileges} ޥ - @code{mysqladmin reload} ޥɤ¹Ԥơ -С˵ĥơ֥ɤ߹ߤؼʤФʤޤ -ʤССƵưޤǡѹ@emph{ȿǤޤ} -If you change the grant tables manually -but forget to reload the privileges, you will be wondering why your changes -don't seem to make any difference! - -Сĥơ֥ѹΤ硢³Ƥ -饤ȤϡʲΤ褦ʱƶޤ - -@itemize @bullet -@item -ơ֥ȥեɤεĤѹϡΥ饤Ȥ׵ᤫȿǤޤ - -@item -ǡ١ФĤѹϼ @code{USE db_name} ޥɰʹߤ -ͭˤʤޤ - -@end itemize - -Х븢¤ȥѥɤѹϡΥ饤Ȥ³ȿǤޤ - - -@node Default privileges, Adding users, Privilege changes, Privilege system -@section @strong{MySQL} µĤν - -@strong{MySQL} 󥹥ȡ塢@code{scripts/mysql_install_db} ¹ԤƸ¤ΥĤޤ -@xref{Quick install}. -@code{mysql_install_db} ץȤ @code{mysqld} Сư -ʲΤ褦˸¤ƥơ֥Ͽޤ - -@itemize @bullet -@item -@strong{MySQL} @code{root} 桼ϥѡ桼ȤϿ졢 -ƤǤޤ -localhost餷³Ǥޤ - -@strong{:} -@code{root} Υѥɤνͤ϶Ǥ -Ƥοͤ @emph{ѥɤʤ} @code{root} ˤʤ졢ƤθµĤ뤳ȤǤޤ - -@item -@cindex Anonymous user -@code{'test'} 뤤 @code{'test_'} ̾ϤޤäƤǡ١Фơ -ƿ̾桼ǤʤǤǤ褦˵ĤͿޤ - ۥȤƤΥ桼 ѥ̵³Ǥ -ƿ̾桼ȤưȤȤǤ - -@item -¾׵ϵݤޤ㤨С̥桼 @code{mysqladmin shutdown} @code{mysqladmin processlist} ¹ԤǤޤ -@end itemize - -@strong{:} ǥեȤθ¤ Win32 Ǥϰ㤤ޤ -@xref{Win32 running}. - -󥹥ȡξ֤ǤϤʤꥢƤΤǡ -󥹥ȡǽˤ뤳Ȥϡ@strong{MySQL} @code{root} 桼˥ѥɤꤹ뤳ȤǤ -ʲΤ褦ˤޤ(ѥɤ @code{PASSWORD()} ؿѤ뤳Ȥ˺ʤ) - -@example -shell> mysql -u root mysql -mysql> UPDATE user SET Password=PASSWORD('new_password') - WHERE user='root'; -mysql> FLUSH PRIVILEGES; -@end example - -@strong{MySQL} 3.22 ʾǤϡ@code{SET PASSWORD} ʸѤǤޤ: - -@example -shell> mysql -u root mysql -mysql> SET PASSWORD FOR root=PASSWORD('new_password'); -@end example - -password 򥻥åȤ¾ˡȤơ@code{mysqladmin} ޥɤѤǤޤ - -@example -shell> mysqladmin -u root password new_password -@end example - -⤷ǽˡ @code{user} ơ֥Υѥɤľܹʤ顢 -С˵ĥơ֥κɤ߹ߤԤ碌ʤФʤޤ(@code{FLUSH PRIVILEGES} Ѥ) - - @code{root} Υѥɤꤷʤ顢@code{root} ǥС³ -˥ѥɤͿʤФʤޤ - -ɲƥȤ򤷤Ƥ뤿ѥɤ줿ʤ硢 -@code{root} ѥɤ֥󥯤ΤޤޤˤƤȹͤ뤫Τޤ󤬡 -²ƯˤɬꤷƤ - -ɤΤ褦˥ǥեȤθ¤ꤷƤ뤫@code{scripts/mysql_install_db} ƤߤƤ -¾Υ桼ꤹȤ˻ȤǤ礦 - -⤷¤ν֤㤦Τˤƽʤ顢 -@code{mysql_install_db} ¹ԤԽƤ褤Ǥ礦 - -⤷ơ֥˺ľʤ顢@code{mysql} ǡ١Υǥ쥯ȥ¸ߤ -Ƥ @file{*.frm}, @file{*.MYI}, @file{*.MYD} եޤ -(Υǥ쥯ȥ꡼ϥǡ١ǥ쥯ȥ꡼β @code{mysql} Ȥ̾¸ߤޤ -@code{mysqld --help} ȤХǡ١Υǥ쥯ȥ꡼ɽޤ) -ƹߤεľ֤ @code{mysql_install_db} ԽƤ¹Ԥޤ - -@strong{:} @strong{MySQL} 3.22.10 ΥСǤ, -@file{*.frm} եäƤϤޤ. ⤷ääƤޤä硢 -@code{mysql_install_db} ¹Ԥˡ @strong{MySQL} ۤ饳ԡʤ -ʤƤϤʤޤ - - -@node Adding users, Passwords, Default privileges, Privilege system -@section 桼¤ @strong{MySQL} ɲ - -桼ϣĤΰäˡɲäǤޤ -@code{GRANT} ʸѤƹԤˡȡ -@strong{MySQL} εĥơ֥ľˡȤǤ -@code{GRANT} ʸλѤ򤪴ᤷޤ - -ʲǤϡˤ @code{mysql} 饤ȤѤƿ˥桼Ͽ뤫򼨤ޤ -ʲǤϡ¤ǽҤ٤ǥեͤˤʤäƤȤޤ -äѹԤˤϡʤ @code{mysqld} äƤޥ˥󤷤ƤʤƤϤʤޤ󤷡 -ġ@strong{MySQL} @code{root} 桼³ƤʤФʤޤ - @strong{MySQL} @code{root} 桼ˤ - @code{mysql} ǡ١Ф @strong{insert} ¤ -@strong{reload} Υɥߥ˥ȥ졼¤äƤʤФʤޤ -⤷ @code{root} 桼ΥѥɤѤƤʤС - @code{mysql} ޥɤ˥ѥɻͿʤƤϤʤޤ - -@example -shell> mysql --user=root mysql -mysql> GRANT ALL PRIVILEGES ON *.* TO monty@@localhost - IDENTIFIED BY 'some_pass' WITH GRANT OPTION; -mysql> GRANT ALL PRIVILEGES ON *.* TO monty@@"%" - IDENTIFIED BY 'some_pass' WITH GRANT OPTION; -mysql> GRANT RELOAD,PROCESS ON *.* TO admin@@localhost; -mysql> GRANT USAGE ON *.* TO dummy@@localhost; -@end example - - @code{GRANT} ʸǤ3Ĥο桼ޤ: - -@table @code -@item monty -ɤǤ⥵С³Ǥ봰ʥѡ桼 -@strong{MySQL} Ѥˤϥѥ @code{'some_pass'} -Ѥɬפޤ -@code{monty@@localhost} @code{monty@@"%"} ξ @code{GRANT} ʸ -ȯԤʤƤϤʤʤդƤ -⤷ @code{localhost} εĤ򤷤Ͽʤȡ@code{localhost} ³ -@code{mysql_install_db} ưǺ @code{localhost} ؤƿ̾桼ͥ褵ޤ -ʤʤ顢 @code{Host} եɤͤ(֥󥯤ɥɰʳ)Ƥꡢ -Ͽ MySQL ǥȤ˽֤˥Ȥ뤫Ǥ - -@item admin -@code{localhost} ѥɤʤ³Ǥޤ@code{reload}, @code{process} λѤޤ -ϡ@code{mysqladmin reload}, @code{mysqladmin refresh}, @code{mysqladmin flush-*} - @code{mysqladmin processlist} ޥɤμ¹ԤΥ桼˵Ĥޤ -ǡ١ؤΥϵĤƤޤ -ϸǥơ֥ @code{GRANT} ʸȯԤС -ġΥǡ١ؤΥ¤Ǥޤ - -@item dummy -ѥɤʤ localhost Τߡ³Ǥ桼 -Хʸ¤ @code{'N'} ꤵޤ -@code{USAGE} ¤ϸ̵桼Ĥˤʤޤ -ϡǡ١ФƤεĤ夫ͿꤷƤޤ -@end table - -ƱĤ @code{INSERT} ʸѤľǤޤ -С˵ĥơ֥κɤ߹ߤؼޤ - -@example -shell> mysql --user=root mysql -mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'), - 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y') -mysql> INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'), - 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y') -mysql> INSERT INTO user SET Host='localhost',User='admin', - Reload_priv='Y', Process_priv='Y'; -mysql> INSERT INTO user (Host,User,Password) - VALUES('localhost','dummy',''); -mysql> FLUSH PRIVILEGES; -@end example - -@strong{MySQL} ΥСˤꡢ @code{'Y'} ο㤦դƤ -(3.22.11 ΥСǤϹܿʤʤޤ). -@code{admin} 桼ϿǻѤƤ @code{INSERT} γĥ 3.22.11 ʾDzǽǤ - -ѡ桼뤿ˤϡ@code{user} ơ֥εĥեɤ -@code{'Y'} ˤǤޤޤ -@code{db} @code{host} ơ֥Ͽɬ̵ΤǤ - -@code{user} ơ֥εĥեɤϺǸ @code{INSERT} ʸ(@code{dummy} 桼Τ) -ꤵƤޤ󡣤Υեɤϥǥեͤ @code{'N'} ˤʤޤ - @code{GRANT USAGE} ԤΤƱΤǤ - -ʲϡ@code{localhost}, @code{server.domain}, @code{whitehouse.gov} ³ǽ - @code{custom} 桼ɲǤ - @code{custom} 桼 @code{bankaccount} ǡ١ˤ @code{localhost} ³ΤߤĤ졢 -@code{expenses} ǡ١ˤ @code{whitehouse.gov} Τ³Ĥ졢 -@code{customer} ǡ١ˤƤΥۥȤ³Ǥޤ -@code{custom} 桼ϡ @code{stupid} ȤѥɤƤΥۥȤǻѤȤޤ - -Υ桼εĤ @code{GRANT} ʸˤϡʲΤ褦ˤޤ - -@example -shell> mysql --user=root mysql -mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP - ON bankaccount.* - TO custom@@localhost - IDENTIFIED BY 'stupid'; -mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP - ON expenses.* - TO custom@@whitehouse.gov - IDENTIFIED BY 'stupid'; -mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP - ON customer.* - TO custom@@'%' - IDENTIFIED BY 'stupid'; -@end example - -ĥơ֥ľѹƤΥ桼θ¤ꤹˤϤΤ褦ˤޤ -(@code{FLUSH PRIVILEGES} Ǹ˼¹ԤƤ) - -@example -shell> mysql --user=root mysql -mysql> INSERT INTO user (Host,User,Password) - VALUES('localhost','custom',PASSWORD('stupid')); -mysql> INSERT INTO user (Host,User,Password) - VALUES('server.domain','custom',PASSWORD('stupid')); -mysql> INSERT INTO user (Host,User,Password) - VALUES('whitehouse.gov','custom',PASSWORD('stupid')); -mysql> INSERT INTO db - (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, - Create_priv,Drop_priv) - VALUES - ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y'); -mysql> INSERT INTO db - (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, - Create_priv,Drop_priv) - VALUES - ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y'); -mysql> INSERT INTO db - (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, - Create_priv,Drop_priv) - VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y'); -mysql> FLUSH PRIVILEGES; -@end example - -ǽΣĤ @code{INSERT} ʸϡ @code{custom} 桼줾ΥۥȤ -ѥɤĤ³Ǥ褦 @code{user} ơ֥ɲäƤޤ -Ǥϸ¤ϣĤͿƤޤ(¤Υǥեͤ @code{'N'} Ǥ) -λĤ @code{INSERT} ʸϡ@code{bankaccount}, @code{expenses}, @code{customer} - ǡ١Ф볺ۥȤΥĤ @code{custom} 桼Ϳ褦ˡ -@code{db} ơ֥ɲäƤޤ -ĥơ֥뤬ľѹ줿硢򥵡СȿǤ뤿ˡĥơ֥ -ɤ߹ߤ(@code{FLUSH PRIVILEGES}) СˤĤʤФʤޤ - -⤷ɥᥤƤΥޥ³Ĥ硢 -ʲΤ褦 @code{GRANT} ʸȯԤޤ - -@example -mysql> GRANT ... - ON *.* - TO myusername@@"%.mydomainname.com" - IDENTIFIED BY 'mypassword'; -@end example - -ĥơ֥ľѹˤϰʲΤ褦ˤޤ - -@example -mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername', - PASSWORD('mypassword'),...); -mysql> FLUSH PRIVILEGES; -@end example -@code{xmysqladmin}, @code{mysql_webadmin}, @code{xmysql} Ȥä -⡢¥ơ֥ؤͤ/ѹ/ǤޤΥ桼ƥƥ -@uref{http://www.mysql.com/Contrib/,Contrib directory of the @strong{MySQL} -Website}. -˸Ĥ뤳ȤǤޤ - - -@node Passwords, Access denied, Adding users, Privilege system -@section ѥɤˡ -@cindex Passwords, setting -@findex PASSWORD() - -ǽҤ٤ȤƤפʴܸ§ - -@code{INSERT} @code{UPDATE} ǶǤϤʤѥɤꤹ硢 -Ź沽뤿 @code{PASSWORD()} ؿѤʤƤϤʤޤ - @code{user} ơ֥ϥץ졼ƥȤǤʤŹ沽줿ѥɤǤ뤳Ȥ׵ᤷƤ뤫Ǥ -θ§˺Ƥޤä硢ʲΤ褦ˤƥѥɤ򥻥åȤƤޤ⤷ޤ - -@example -shell> mysql -u root mysql -mysql> INSERT INTO user (Host,User,Password) - VALUES('%','jeffrey','biscuit'); -mysql> FLUSH PRIVILEGES; -@end example - - @code{user} ơ֥˥ץ졼ƥȤ @code{'biscuit'} ѥɤȤϿƤޤޤ -@code{jeffrey} 桼ǤΥѥɤѤƥС³褦Ȥȡ - @code{mysql} 饤ȤϰŹ沽ѥɤ򥵡Сޤ -СϰŹ沽줿ѥ(@code{'biscuit'} Ǥ@emph{ޤ}) - @code{user} ơ֥Ͽ줿(@code{'biscuit'}) Ӥޤ -η̡ӤϼԤС³ݤޤ - -@example -shell> mysql -u jeffrey -pbiscuit test -Access denied -@end example - - @code{user} ơ֥ϿѥɤϰŹ沽줿ΤǤʤƤϤʤޤ -@code{INSERT} ʸϰʲΤ褦ˤƻѤʤƤϤʤޤ - -@example -mysql> INSERT INTO user (Host,User,Password) - VALUES('%','jeffrey',PASSWORD('biscuit')); -@end example - -@code{SET PASSWORD} ʸѤϡʲΤ褦ˤʤƤϤʤޤ - -@example -mysql> SET PASSWORD FOR jeffrey@@"%" = PASSWORD('biscuit'); -@end example - -⤷ @code{GRANT ... IDENTIFIED BY} ʸ @code{mysqladmin password} ޥ -ǥѥɤꤷ硢@code{PASSWORD()} ؿɬפޤ -ξȤ⡢ѥɤŹ沽ƤޤΤǡ -ʲΤ褦@code{'biscuit'}Ϳޤ - -@example -mysql> GRANT USAGE ON *.* TO jeffrey@@"%" IDENTIFIED BY 'biscuit'; - -shell> mysqladmin -u jeffrey password biscuit -@end example - -@strong{} @code{PASSWORD()} ѥɤŹ沽뤳ȤդƤ -ΰŹ沽 UNIX ΥѥɤǻѤƤŹ沽Ȱ㤦ȤˤαդƤ -UNIX ѥɥե˵ϿƤŹ @code{PASSWORD()} Ź沽ʪƱǤ⡢ -ƱѥɤǤȤϻפʤǤ -@xref{User names}. - -@node Access denied, , Passwords, Privilege system -@section @code{Access denied} 顼ˤʤΤ - -⤷@strong{MySQL} С³褦Ȥ @code{Access denied} 顼 -Ƥޤä顢ʲ˵ȤβΤλɸȤʤǤ礦: - -@itemize @bullet -@item -@strong{MySQL} 򥤥󥹥ȡ뤷ˡץ @code{mysql_install_db} ¹Ԥ -ĥơ֥ޤ -Ƥʤм¹ԤƤ@xref{Default privileges} -µĤΥơ֥뤬Ƥ뤫ˤϰʲΤ褦ˤޤ - -@example -shell> mysql -u root test -@end example - -̤ϥ顼ʤ³Ǥޤ -@strong{MySQL} ǡ١ǥ쥯ȥ @file{user.MYD} ե뤬뤫ɤǤåޤ -(̤ @file{PATH/var/mysql/user.MYD} Ǥ @code{PATH} @strong{MySQL} 򥤥󥹥ȡ뤷ǥ쥯ȥ꡼ѥ򼨤ޤ) - -@item -ƥ󥹥ȡ뤷ϡʲΤ褦ˤƥС³ƥ桼ȥꤷʤƤϤʤޤ - -@example -shell> mysql -u root mysql -@end example - -֤Ǥϡ@strong{MySQL} @code{root} 桼ѥɤʤϿƤΤǡ -ʤ³ǤϤǤ -ϥƥʾ֤ʤΤǡ -¾ @strong{MySQL} 桼ϿƤˡ -@code{root} ΥѥɤꤷƤƤ - -⤷ @code{root} ³褦ȤưʲΥ顼Ф硧 - -@example -Access denied for user: '@@unknown' to database mysql -@end example - - @code{user} ơ֥ˡ @code{User} ե = @code{root} -@code{mysqld} ꥾֤Ǥʤäۥ̾ǡ饤ȤϿƤʤǤ -ξ硢 @file{/etc/hosts} ե뤢뤤 @file{\windows\hosts} եԽ -ۥ̾ɲä@code{--skip-grant-tables} ץǥСꥹȤޤ - -@cindex @code{mysql_fix_privilege_tables} -⤷ 3.22.11 @strong{MySQL} 3.22.11 ʾ˥С󥢥åפʤ顢 -@code{mysql_fix_privilege_tables} ץȤ¹Ԥޤ -¹ԤƤʤʤ顢Υ顼ˤʤޤ -ĥơ֥ι¤ @strong{MySQL} 3.22.11 ѹ졢 -@code{GRANT} ʸǽƤޤ - -@item -⤷ĥơ֥ľѤ(@code{INSERT} @code{UPDATE} ʸ) -ѹ̵뤵Ƥ褦ʤСС˥ơ֥ɤ߹ߤ뤿ˡ -@code{FLUSH PRIVILEGES} ʸ @code{mysqladmin flush-privileges} ޥɤ -¹ԤפФƤ -¹Ԥʤä硢ѹϼΥСΥꥹȤޤȿǤޤ -@code{root} 桼ΥѥɤꤷȤǤ⡢ -¾ɤ߹ߤޤǤϿѥɤפǤ -ʤʤ顢СϿѥɤޤΤʤǤ - -@code{mysqladmin reload} ԤäƤ⡢¤ͭʤΤϡ -ΥޥȯԸ˿³饤ȤФƤǤ -(¿θ¾󤬥С˥å夵Ƥ뤿Ǥ) - -@item -⤷ʤθ¤åѹ줿褦˻פäʤ顢 -ѡ桼¤ѤΤΤޤ󡣵ĥơ֥κɤ߹ߤ -饤Ȥ³ȿǤޤǤ³ƤǤ -@ref{Privilege changes}. ˼ﲼǤϱƶޤ - -@item -ƥȤΤˤϡ@code{mysqld} ǡ @code{--skip-grant-tables} ץ -dzϤ٤Ǥ @strong{MySQL} ǧơ֥ѹǤ - @code{mysqlaccess} 򡢤ʤξǧƯɤΥåΤ˻ -ѤǤޤ -@code{mysqladmin flush-privileges} @code{mysqld} ǡ˿ǧơ֥ -Ѥ򳫻Ϥ褦Τ餻ޤ @code{--skip-grant-tables} ץ񤭤ޤ -桼εĥơ֥ɤ߹ޤΤˡСΩ夲ľɬפϤޤ - -@item -Perl, PHP, Python ޤ ODBC ǥ꤬ä⡢ -@code{mysql -u user_name db_name} ޤ @code{mysql -u user_name -pyour_pass db_name} ǡ -¤ƥȤƤ(@code{-p} password δ֤ˤ϶ -򤬤ʤȤդƤ@code{--password=your_password} ʸǤ -ѥɤͿޤ) -@code{mysql} 饤Ȥ³Ǥʤ顢θ¤ǤϤʤ -ץǤ - -@item -⤷ʤΥѥɤƯʤΤǤС -@code{INSERT}, @code{UPDATE}, @code{SET PASSWORD} ʸǥѥɤꤹȤ - @code{PASSWORD()} ؿѤʤФʤʤȤפФƤ - @code{PASSWORD()} ؿϡ@code{GRANT ... INDENTIFIED BY} ʸ -@code{mysqladmin password} ޥɤǤפǤ -@xref{Passwords}. - -@item -@code{localhost} ϥΥۥ̾Ǥ -⤷饤ȤۥȤꤻ³Ƥ硢@code{localhost} ǥեȤǻѤޤ - MIT-pthreads ѤƤ硢@code{localhost} ؤ³ϼԤޤ -(@code{localhost} ؤ³ϡUnixåȤѤޤ MIT-pthreads å³򥵥ݡȤƤʤǤ) -꤬륷ƥǤϡС̾ꤹ뤿 @code{--host} ץѤ٤Ǥ - TCP/IP ³Ѥ @code{mysqld} С³ޤ -ξ硢@code{user} ơ֥ˡСμ¥ۥ̾ϿƤʤƤϤʤޤ -(ϥ饤ȥץ򥵡СƱۥȾưƤ翿Ȥʤޤ) - -@item -@code{mysql -u user_name db_name} Ѥƥǡ١³ƤȤ - @code{Access denied} 顼ȯ硢@code{user} ơ֥㤤ͤޤ -@code{mysql -u root mysql} ¹Ԥʲ SQL ʸƤ - -@example -mysql> SELECT * FROM user; -@end example - -@code{Host} @code{User} ˤʤΥԥ塼̾ @strong{MySQL} 桼̾˥ޥåϿʤƤʤФʤޤ - -@item -@code{Access denied} 顼ϡɤΥ桼³ƤɤΥۥȤ³褦ȤƤ뤫ѥɤѤƤΤå˽Ϥޤ -̾顼ˤʤäƤۥ̾ȥ桼̾ޥå륨ȥ꤬ @code{user} ơ֥˰ĤϤʤФʤޤ - -@item -¾ΥۥȤ @strong{MySQL} С³ߤ˰ʲΥ顼Ф硢 -@code{user} ơ֥ˤʤƤۥȤ˥ޥåԤޤ - -@example -Host ... is not allowed to connect to this MySQL server -@end example - -@code{mysql} ޥɤ򥵡СΥۥȾǻѤơ -@code{user}, @code{db}, @code{host} ơ֥ˡ³褦ȤƤ 桼̾ۥ̾ -äвǤǤ礦 -⤷С @strong{MySQL} 3.22 ǤϤʤ³褦ȤƤۥȤ IP ۥ̾狼ʤ硢 -@code{user} ơ֥ @code{Host} եɤ @code{'%'} ꤷ -@code{mysqld} @code{--log} ץǺƵưƤ -ƥ饤ȥۥȤ³С@strong{MySQL} Υե -ΥۥȤξ󤬵ϿƤϤǤ -줬狼Сꤷ @code{user} ơ֥ @code{Host} եɤ @code{'%'} -˵Ͽ줿ۥ֤̾ޤ(ϥƥˤ餷ޤ) - -@item -@code{mysql -u root test} ưΤ @code{mysql -h your_hostname -u root test} - @code{Access denied} ֤硢 -@code{user} ơ֥ۥ̾ѤƤʤȻפޤ -@code{user} ơ֥ @code{Host} եɤ˥ۥ̾ǤǻꤷƤʤ -ѤƤ륷ƥΥ꥾֤ FQDN (or vice-versa) ֤Ƥ뤫Ȼפޤ -㤨С@code{user} ơ֥ @code{'tcx'} ۥȤäȤơ -DNS @strong{MySQL} @code{'tcx.subnet.se'} ۥ̾Ȥ֤硢 -ưޤ -@code{user} ơ֥ @code{Host} եɤͤˡʤΥۥȤ IP ֹäƤ -(@code{user} ơ֥ @code{Host} ͤ˥磻ɥɤѤ뤳ȤǤޤ@code{'tcx.%'} Τ褦ˡ -ۥ̾ͤ @samp{%} ʸǽ餻ϡ@emph{ǤϤʤ}@emph{侩ޤ}) - -@item -⤷ @code{mysql -u user_name test} ư @code{mysql -u user_name other_db_name} -ưʤϡ@code{db} ơ֥ @code{other_db_name} Υȥ꤬ -ϿƤޤ - -@item -@code{mysql -u user_name db_name} ϥСǤư뤬 -@code{mysql -u host_name -u user_name db_name} 饤ȥۥȾưʤ硢 -@code{user} ơ֥뤫 @code{db} ơ֥˥饤ȥۥȤ̾ϿƤޤ - -@item -@code{Access denied} θ⤷嵭ƤϤޤʤϡ -@code{user} ơ֥뤫 @code{Host} ˥磻ɥɤѤƤ륨ȥƾõƤߤƤ(@samp{%} @samp{_} ޤͤǤ) -褯ְ㤤ϡ@code{localhost} Ф @code{localhost} Ʊޥ夫 -³Ĥȹͤ -@code{Host}=@code{'%'} @code{User}=@code{'some user'} Ͽ뤳ȤǤ -ưޤ󡣤ʤʤ顢ǥեȤθ¤ -@code{Host}=@code{'localhost'} @code{User}=@code{''} ޤޤƤ뤫Ǥ -@code{Host} ͤ @code{'localhost'} ξ硢 @code{'%'} -Ū˻ꤵƤΤǡ@code{localhost} ³ˤϤ -ѤΤǤ λϡܤϿȤ -@code{Host}=@code{'localhost'} @code{User}=@code{'some_user'} ɲä뤫 -뤤ϡ@code{Host}=@code{'localhost'} @code{User}=@code{''} 뤳ȤǤ - -@item -⤷ʲΥ顼Ф -@code{db} @code{host} ơ֥꤬Τ⤷ޤ󡣡 - -@example -Access to database denied -@end example - -⤷ @code{db} ơ֥ @code{Host} եɤϿˤϡ -@code{host} ơ֥ˡ@code{db} ơ֥ϿƤ -ۥȤʪİʾ夢뤫ɤǧƤ - -⤷ @code{SELECT ... INTO OUTFILE} @code{LOAD DATA INFILE} SQL ʸ -ѤƤˤΥ顼Ф硢 -@code{user} ơ֥ΤʤϿ @strong{file} ¤ -ĤƤʤȻפޤ - -@item -@cindex Configuration files -@cindex Environment variables -@tindex .my.cnf file -饤ȥץ³˺ݤơ -եꤵ줿ͤĶѿͤѤ뤳ȤդƤ -⤷饤ȥץबäͤ³˻ѤƤ褦ʤ顢 -Ķѿȥۡǥ쥯ȥˤ @file{.my.cnf} եǧƤ -󥷥ƥ磻ɤ @strong{MySQL} ե⡢ѥ᥿ҤƤʤ -åƤߤƤ@xref{Option files}. -⤷饤Ȥ򥪥ץʤǵưƤ @code{Access denied} Ǥʤ顢 -ץե˸Ťѥɤ񤫤Ƥ뤫ǧƤ -@xref{Option files}. - -@item -⤷ƼԤʤ顢@code{mysqld} ǡǥХåץǵưƤ -㤨С@code{--debug=d,general,query}ϥͥ˻ߤۥȤ桼ξ -ޤ¹Ԥޥɤɽޤ @xref{Debugging server}. - -@item -⤷ @strong{MySQL} θµĤˤĤƤ¾꤬ꡢ -᡼󥰡ꥹȤݥȤʤƤϤʤȴС -Ĥ @strong{MySQL} ĥơ֥Υפ󶡤Ʋ -@code{mysqldump mysql} ޥɤǥפǤޤ -ĤΤ褦ˡ @code{mysqlbug} ץȤǥݥȤƤ@xref{Bug reports}. -ȤˤϤϡ @code{mysqldump} ¹Ԥ뤿ˡ -@code{mysqld} @code{--skip-grant-tables} ץǼ¹Ԥʤ -ʤ⤷ޤ -@end itemize - - -@node Reference, Table types, Privilege system, Top -@chapter @strong{MySQL} ե - -@menu -* Literals:: ƥ:ʸȿͤɤΤ褦˽񤯤 -* Variables:: 桼ѿ -* Column types:: եɷ -* Functions:: ؿ -* CREATE DATABASE:: @code{CREATE DATABASE} ʸ -* DROP DATABASE:: @code{DROP DATABASE} ʸ -* CREATE TABLE:: @code{CREATE TABLE} ʸ -* ALTER TABLE:: @code{ALTER TABLE} ʸ -* DROP TABLE:: @code{DROP TABLE} ʸ -* OPTIMIZE TABLE:: @code{OPTIMIZE TABLE} ʸ -* CHECK TABLE:: @code{CHECK TABLE} syntax -* REPAIR TABLE:: @code{REPAIR TABLE} syntax -* DELETE:: @code{DELETE} ʸ -* SELECT:: @code{SELECT} ʸ -* JOIN:: @code{JOIN} ʸ -* INSERT:: @code{INSERT} ʸ -* REPLACE:: @code{REPLACE} ʸ -* LOAD DATA:: @code{LOAD DATA INFILE} ʸ -* UPDATE:: @code{UPDATE} ʸ -* USE:: @code{USE} ʸ -* FLUSH:: @code{Flush} ʸ (åΥꥢ) -* KILL:: @code{KILL} ʸ -* SHOW:: @code{SHOW} ʸ (ơ֥եɤʤɤˤĤƤξ) -* EXPLAIN:: @code{EXPLAIN} ʸ (@code{SELECT}ˤĤƤξ ) -* DESCRIBE:: @code{DESCRIBE} ʸ (ե̾ˤĤƤξ) -* COMMIT:: -* LOCK TABLES:: @code{LOCK TABLES/UNLOCK TABLES} ʸ -* SET OPTION:: @code{SET OPTION} ʸ -* GRANT:: @code{GRANT} @code{REVOKE} ʸ -* CREATE INDEX:: @code{CREATE INDEX} ʸ -* DROP INDEX:: @code{DROP INDEX} ʸ -* Comments:: Comment ʸ -* CREATE FUNCTION:: @code{CREATE FUNCTION} ʸ -* Reserved words:: Is @strong{MySQL} picky about reserved words? -@end menu - - -@cindex Strings -@cindex Strings, escaping characters -@node Literals, Variables, Reference, Reference -@section ƥ:ʸȿͤɤΤ褦˽񤯤 - -@menu -* String syntax:: Strings -* Number syntax:: Numbers -* Hexadecimal values:: -* NULL values:: @code{NULL} values -* Legal names:: Database, table, index, column and alias names -@end menu - -@node String syntax, Number syntax, Literals, Literals -@subsection ʸ - -ʸʸ¤ӤǤ(@samp{'})ޤŰ(@samp{"})dz -ޤ(Ԥ ANSI ⡼ɤǼ¹ԤƤʤΤ) 㡧 - -@example -'a string' -"another string" -@end example - -ʸǤϡĤΥ󥹤̤ʰ̣ޤΥ -󥹤Τ줾@emph{ʸ}ȤΤХåå -(@samp{\})ǻϤޤޤ@strong{MySQL} ϼΥץ󥹤ǧ -ޤ - -@c these aren't really functions, but that's probably the most reasonable index -@table @code -@findex \0 (ASCII 0) -@findex NUL -@item \0 -ASCII 0 (@code{NUL}) ʸ - -@findex \n (newline) -@findex newline (\n) -@item \n -ʸ - -@findex \t (tab) -@findex tab (\t) -@item \t -ʸ - -@findex \r (carriage return) -@findex return (\r) -@findex carriage return (\r) -@item \r -꥿ʸ - -@findex \b (backspace) -@findex backspace (\b) -@item \b -Хåڡʸ - -@findex \' (single quote) -@findex single quote (\') -@item \' -(@samp{'}) - -@findex \" (double quote) -@findex double quote (\") -@item \" -Ű(@samp{"}) - -@findex \\ (escape) -@findex escape (\\) -@item \\ -Хåå(@samp{\})ʸ - -@findex % (wildcard character) -@findex Wildcard character (%) -@item \% -@samp{%} ʸ @samp{%} 磻ɥʸȤƲᤵʸ̮ -ǡ@samp{%} ΤΤ򸡺뤿˻Ѥޤ -@xref{String comparison functions}. - -@findex _ (wildcard character) -@findex Wildcard character (_) -@item \_ -@code{_} ʸ @samp{_} 磻ɥʸȤƲᤵʸ̮ -ǡ@code{_} ΤΤ򸡺뤿˻Ѥޤ -@xref{String comparison functions}. -@end table - -Ĥʸʸ̮ @samp{\%} ޤ @samp{\_} Ѥȡʸ - @samp{%} @samp{_} ǤϤʤ@samp{\%} @samp{\_} ֤ޤ - -@noindent -ʸ˰ޤˡϤĤޤ: - -@itemize @bullet -@item -@samp{'} dzʸ @samp{'} @samp{''} Ȥƽ񤯤ȤǤ -ޤ - -@item -@samp{"} dzʸ @samp{"} @samp{""} Ȥƽ񤯤ȤǤ -ޤ - -@item -˥ʸ (@samp{\}) ֤ȤǤޤ - -@item -@samp{"} dz줿ʸ @samp{'} ̰ɬפϤʤŤˤ -ꡢפɬפϤޤƱ褦ˡ@samp{'} dz줿ʸ - @samp{"} ̰ɬפϤޤ -@end itemize - - @code{SELECT} ơȥȤϡȤȥפɤΤ褦Ư -򼨤ޤ: - -@example -mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello'; -+-------+---------+-----------+--------+--------+ -| hello | "hello" | ""hello"" | hel'lo | 'hello | -+-------+---------+-----------+--------+--------+ - -mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello"; -+-------+---------+-----------+--------+--------+ -| hello | 'hello' | ''hello'' | hel"lo | "hello | -+-------+---------+-----------+--------+--------+ - -mysql> SELECT "This\nIs\nFour\nlines"; -+--------------------+ -| This -Is -Four -lines | -+--------------------+ -@end example - -@cindex Quoting binary data - -Хʥǡ @code{BLOB} եɤ硢ʸ򥨥 -󥹤ɽɬפޤ: -@table @code -@item NUL -ASCII 0@samp{\0} (Хåå ASCII @samp{0} ʸ) ֤ -٤Ǥ -@item \ -ASCII 92, Хåå塣@samp{\\} ɽƤ -@item ' -ASCII 39, 䡣@samp{\'} ɽƤ -@item " -ASCII 34, Ű䡣@samp{\"} ɽƤ -@end table - -@cindex Quoting -@cindex @code{BLOB}, inserting binary data -@findex mysql_escape_string() -@findex DBI->quote -C ɤ񤯾硢@code{INSERT} ʸ򥨥פ뤿ˡC API -ؿ @code{mysql_escape_string()} ѤǤޤ@xref{C API function -overview}. Perl Ǥϡ@code{DBI} ѥå @code{quote} ᥽åɤ -ѤơüʸŬʥץ󥹤ѴǤޤ@xref{Perl -DBI Class, , Perl @code{DBI} Class}. - -嵭üʸΤɤ줫ޤǽΤƤʸˤĤơ -ؿѤ٤Ǥ - -@node Number syntax, Hexadecimal values, String syntax, Literals -@subsection - -Ͽ¤Ӥɽޤ -ư @samp{.} Ǿʬ䤷ޤ -ɤηɽ @samp{-} ˤĤޤ - -ʿͤ: - -@example -1221 -0 --32 -@end example - -ͭư㡧 - -@example -294.42 --32032.6809e+10 -148.00 -@end example - -ưʸ̮ǻѤ뤫⤷ޤ ξ硢ư -Ѵޤ - -@tindex Hexadecimal values -@node Hexadecimal values, NULL values, Number syntax, Literals -@subsection 16ˡ - -@strong{MySQL} 16ˡͤ򥵥ݡȤޤ -ͤʸ̮Ǥϡ(64ӥå)Τ褦˿񤤤ޤ -ʸʸ̮ǤϡhexηΤ줾ΥڥʸѴ줿 -Хʥ꡼ʸΤ褦˿񤤤ޤ - -@example -mysql> SELECT 0xa+0 - -> 10 -mysql> select 0x5061756c; - -> Paul -@end example - -16ʿɽϡODBC ˤ BLOB ͤͿ뤿ˤФлѤޤ - -@tindex NULL value -@node NULL values, Legal names, Hexadecimal values, Literals -@subsection @code{NULL} - -@code{NULL} ``no data'' ̣ͷ @code{0} ʸ󷿤ζʸ -Ȥϰۤʤ뤳ȤդƤ -@xref{Problems with NULL, , Problems with @code{NULL}}. - -ƥȥեɤ߹ߤ񤭽Фˡ@code{NULL} @code{\N} -ɽޤ (@code{LOAD DATA INFILE}, @code{SELECT ... INTO OUTFILE}). -@xref{LOAD DATA, , @code{LOAD DATA}}. -@node Legal names, , NULL values, Literals -@subsection ǡ١̾ơ֥̾ǥå̾ե̾ꥢ̾ - -@menu -* Name case sensitivity:: Case sensitivity in names -@end menu - -ǡ١̾ơ֥̾ǥå̾ե̾ꥢ̾ -@strong{MySQL} ǤƱ§˴Ťޤ: - -@tindex Quoting of identifiers -@tindex ` -@tindex " -: § @strong{MySQL} 3.23.6 ѹޤϼ̻(ǡ١ -̾ơ֥̾ե̾) @code{`} ǤΥȤƳǤ -(ANSI ⡼ɤǼ¹Ԥϡ@code{"} ⼱̻Ҥ򥯥Ȥ뤿Ư -) - -@multitable @columnfractions .15 .7 .78 -@item @strong{̻} @tab @strong{Ĺ} @tab @strong{ʸ} -@item ǡ١ @tab 64 @tab ǥ쥯ȥ̾ȤƵ뤹٤Ƥʸ@code{/} -@item ơ֥ @tab 64 @tab ե̾ȤƵ뤹٤Ƥʸ@code{/} @code{.} -@item ե @tab 64 @tab ٤Ƥʸ -@item ꥢ @tab 255 @tab ٤Ƥʸ -@end multitable - -: 嵭˲ä̻ˤ ASCII(0) ASCII(255) Ƥޤ - -: ̻Ҥ¤줿ñǤäüʸޤϡѤ -ˤϾ @code{`} ǥȤɬפޤ: - -@example -SELECT * from `select` where `select`.id > 100; -@end example - -@strong{MySQL} ΥСǤϡ̾ε§ϼ˽ޤ: - -@itemize @bullet -@item -̾ϡߤʸåȤΥե٥åȤȿʸꡢ@samp{_} -@samp{$} ޤߤޤǥեʸåȤ ISO-8859-1 Latin1 Ǥ - @code{mysqld} @code{--default-character-set} ץ -Ϳ뤳ȤѹǤޤ. (3.23.14 ʾξΤߡ -ΥСǤ @strong{MySQL} ƥѥ뤬ɬ) -@xref{Character sets}. - -@item -̾ϡ̾ȤǤդʸǻϤ뤳ȤǤޤäˡ̾Ͽ -ǻϤ뤳ȤǤޤ(¾¿ΥƥȰۤʤޤ) -@emph{}̾ˤϤǤޤ - -@item -̾ @samp{.} ʸѤ뤳ȤϤǤޤ󡣥եɤ򻲾ȤǤ褦 -˷ĥ뤿˻Ѥ뤿Ǥ() -@end itemize - -@code{1e} Τ褦̾ϻѤʤȤ򴫤ޤ@code{1e+1} Τ褦ʼ -ޤǤϡ @code{1e + 1} ȤơޤϿ -@code{1e+1} ȤƲᤵޤ - -@strong{MySQL} ǤϼηΤ줫Ѥƥեɤ򻲾ȤǤޤ: - -@multitable @columnfractions .35 .65 -@item @strong{եɤλˡ} @tab @strong{̣} -@item @code{col_name} @tab ǻѤơ֥¸ߤƤ @code{col_name} Ȥ̾Υե -@item @code{tbl_name.col_name} @tab ߤΥǡ١Υơ֥ @code{tbl_name} Υե @code{col_name} -@item @code{db_name.tbl_name.col_name} @tab ǡ١ @code{db_name} -Υơ֥ @code{tbl_name} Υե @code{col_name}η 3.22 ʹ -ͭǤ -@item -@code{`column_name`} @tab ɤǤäüʸޤեɡ -@end multitable - -ȤۣǤʤʤСơȥΥեɻȤ @code{tbl_name} -ޤ @code{db_name.tbl_name} 򵭽ҤɬפϤޤ㤨Сơ -֥ @code{t1} @code{t2} 줾ե @code{c} ޤߡ@code{t1} -@code{t2} ξѤ @code{SELECT} ơȥȤ @code{c} -ФȤޤξ硢@code{c} ϥơȥȤǻѤơ֥ -֤ͣǤʤΤۣǤΤᡢ@code{t1.c} ޤ @code{t2.c} -Ҥ뤳ˤɤΥơ֥̣뤫򼨤ɬפޤƱ -ˡǡ١ @code{db1} Υơ֥ @code{t} ȥǡ١ -@code{db2} Υơ֥ @code{t} Ф硢Υơ֥ι -ܤϡ@code{db1.t.col_name} @code{db2.t.col_name} ȤƻȤɬ -ޤ - -@cindex ODBC compatibility -@cindex Compatibility, with ODBC -ʸ @code{.tbl_name} ϸߤΥǡ١Υơ֥ @code{tbl_name} -̣ޤιʸϤĤ ODBC @samp{.} ʸơ֥̾ -֤˵Ƥޤ - -@node Name case sensitivity, , Legal names, Legal names -@subsubsection ̾Υ¸ -@cindex Database names, case sensitivity -@cindex Table names, case sensitivity -@cindex Column names, case sensitivity -@cindex Alias names, case sensitivity -@cindex Case sensitivity, of database names -@cindex Case sensitivity, of table names -@cindex Case sensitivity, of column names -@cindex Case sensitivity, of alias names - -@strong{MySQL} Ǥϡǡ١ȥơ֥ϡǥ쥯ȥ -Υǥ쥯ȥΥեбޤΤᡢư륪ڥ졼 -ƥ󥰥ƥΥ¸ϡǡ١ȥơ֥̾Υ¸ꤷޤ -ǡ١̾ȥơ֥̾ Unix Ǥϥ¸ǡWin32 Ǥϥ -¸Ǥ - -@strong{:} Win32 Ǥϥǡ١̾ȥե̾ϥ¸Ǥ -Ʊǡǡ١ơ֥ۤʤ륱ѤƻȤ٤ -ǤϤޤ -ʲΥưޤ󡣤ʤʤ @code{my_table} @code{MY_TABLE} ξ -ȤƤ뤫Ǥ - -@example -mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1; -@end example - -ե̾Ƥξǥ¸Ǥ - -ơ֥̾ϥ¸Ǥ -ʲΥưޤ󡣤ʤʤ @code{a} @code{A} Υꥢξ -ȤƤ뤫Ǥ - -@example -mysql> SELECT col_name FROM tbl_name AS a - WHERE a.col_name = 1 OR A.col_name = 2; -@end example - -եɤΥꥢ̾ϥ¸Ǥ - - -@node Variables, Column types, Literals, Reference -@section 桼ѿ - -@strong{MySQL} ϡ@code{@@variablename} ʸǥåɸͭѿ򥵥ݡ -Ȥޤѿ̾ϸߤʸåȤΥե٥åȤȿ -@samp{_}@samp{$}@samp{.} ʸʤޤǥեʸåȤ -ISO-8859-1 Latin1 Ǥ - @code{mysqld} @code{--default-character-set} ץ -Ϳ뤳ȤѹǤޤ. (3.23.14 ʾξΤߡ -ΥСǤ @strong{MySQL} ƥѥ뤬ɬ) -@xref{Character sets} - -ѿϽɬפϤޤ󡣥ǥեȤǤ @code{NULL} Ǥꡢ -͡¿͡ʸͤǼǤޤ٤ƤΥåѿϡåɤλ -ȼưŪ˲ޤ - -@code{SET} ʸѿǤޤ: - -@example -SET @@variable= @{ integer expression | real expression | string expression @} -[,@@variable= ...]. -@end example - -@code{@@variable:=expr} ʸǡѿꤹ뤳ȤǽǤ: - -@example -select @@t1:=(@@t2:=1)+@@t3:=4,@@t1,@@t2,@@t3; -+----------------------+------+------+------+ -| @@t1:=(@@t2:=1)+@@t3:=4 | @@t1 | @@t2 | @@t3 | -+----------------------+------+------+------+ -| 5 | 5 | 1 | 4 | -+----------------------+------+------+------+ -@end example - -(桹 @code{:=} ʸѤɬפޤ@code{=} ӤΤ -ͽ󤵤ƤǤ) - -桼ѿϼǻѤǤޤ: ϸߡ -@code{SELECT} ơȥȤ @code{LIMIT} ᡢ@code{LOAD DATA} ơ -Ȥ @code{IGNORE number LINES} Τ褦ˡͤŪ׵ᤵʸ -̮ǤλѤޤߤޤ - -@strong{:} @code{SELECT} ơȥȤǤϡ줾μϥ饤 -Ȥ줿ˤɾޤϡ@code{SELECT} ꤵ줿ѿ -ɬפȤ뼰򻲾Ȥ @code{HAVING}, @code{GROUP BY}, @code{ORDER BY} -᤬ǤʤȤ̣ޤ㤨СΥơȥȤϴ̤ˤư -ޤ: - -@example -SELECT (@@aa:=id) AS a, (@@aa+3) AS b FROM table_name HAVING b=5; -@end example - -ͳϡ@code{@@aa} ߤΥ쥳ɤͤǤϤʤ˼ä쥳 -ɤ @code{id} ͤˤʤ뤫Ǥ - -@node Column types, Functions, Variables, Reference -@section եɷ - -@strong{MySQL}¿Υեɷ򥵥ݡȤƤꡢϣĤΥƥ˥롼ײޤ: ͷյڤӻַʸ(ʸ) -ξϤǤϤޤѤǤ뷿γפϤޤꡢ줫ƥƥγƥեɷν׵̤ȡ°ˤĤƤΤܺ٤ʾ󶡤ޤ -פϰտŪ˴ʷˤޤȤƤޤͤȤƻǤ񼰤Τ褦ʥեɷͭղþϡܺ٤ˤĴ٤Ʋ - -@strong{MySQL}ǥݡȤեɷϰʲ˼̤Ǥ³ʸΰ̣Τ˻Ȥޤ: - -@table @code -@item M -ɽ̣ޤɽ 255. - -@item D -ưŬѤ졢ʲηɽޤ -ͤ 30 Ǥ @code{M}-2 礭ʤäƤϤޤ -@end table - -楫å(@samp{[}ڤ@samp{]})ϷΰǤꡢ줬ץǤ뤳Ȥɽޤ - -@tindex Types - -@c The @w{-number} stuff keeps a linebreak from occurring between -@c the - and number. - -⤷եɤ @code{ZEROFILL} ꤷ硢 - @strong{MySQL} ϼư @code{UNSIGNED} °򤽤Υեɤ -ɲäޤ - -@table @code -@tindex TINYINT -@item TINYINT[(M)] [UNSIGNED] [ZEROFILL] - -ȤƤ⾮ĤϰϤ @code{-128}@code{127}ʤϰϤ @code{0}@code{255} - -@tindex SMALLINT -@item SMALLINT[(M)] [UNSIGNED] [ZEROFILL] - -ĤϰϤ @code{-32768}@code{32767}ʤϰϤ @code{0}@code{65535} - -@tindex MEDIUMINT -@item MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] - -֤椢ϰϤ @code{-8388608}@code{8388607}ʤϰϤ @code{0}@code{16777215} - -@tindex INT -@item INT[(M)] [UNSIGNED] [ZEROFILL] - -̾椢ϰϤ @code{-2147483648}@code{2147483647}ʤϰϤ @code{0}@code{4294967295} - -@tindex INTEGER -@item INTEGER[(M)] [UNSIGNED] [ZEROFILL] - -ϡ@code{INT}ƱǤ - -@tindex BIGINT -@item BIGINT[(M)] [UNSIGNED] [ZEROFILL] - -礭椢ϰϤ @code{-9223372036854775808}@code{9223372036854775807} -ʤϰϤ @code{0}@code{18446744073709551615} -Ƥα黻դ @code{BIGINT} ޤ @code{DOUBLE} ǹԤ뤿ᡢ -̵ @code{9223372036854775807} (63 bits) 礭 -ӥåȴؿʳǻѤ٤ǤϤޤ -@code{-}@code{+}ڤ@code{*}ϡξΰ@code{INTEGER}ͤλ@code{BIGINT}黻ȤȤդƲϡĤ礭ΤԤʤ(֤ؿη̤礭Ǥ)̤@code{9223372036854775807}礭ͽʤ̤뤳ȤȤȤ̣Ƥޤ - -@tindex FLOAT(precision) -@item FLOAT(precision) [ZEROFILL] - -ưʤˤϤǤޤñưǤ -@code{precision} @code{<=24} ǡưǤ 2553 δ֤Ǥ -ηϼǽҤ٤@code{FLOAT}@code{DOUBLE}˻Ƥޤ -@code{FLOAT(X)}ϡ@code{FLOAT}ڤ@code{DOUBLE}˰פƱϰϤäƤޤ -ɽ侮ʲޤ - -@strong{MySQL} 3.23 ǤϡưǤ -@strong{MySQL} СǤ, @code{FLOAT(precision)} Ͼ˾2 - - -@cindex ODBC compatibility -@cindex Compatibility, with ODBC -ιʸ ODBC ߴǤ - -@tindex FLOAT -@tindex FLOAT(M,D) -@item FLOAT[(M,D)] [ZEROFILL] - -ưʤˤϤǤޤ -ϰϤ @code{@w{-3.402823466E+38}}@code{@w{-1.175494351E-38}} @code{0} -@code{@w{1.175494351E-38}}@code{3.402823466E+38}Ǥ -M ɽ D ϾǤ̵24ʲ @code{FLOAT} -ñựޤ - -@tindex DOUBLE -@tindex FLOAT(precision) -@item DOUBLE[(M,D)] [ZEROFILL] - -̾ưʤˤϤǤޤ -ϰϤ @code{@w{-1.7976931348623157E+308}}@code{@w{-2.2250738585072014E-308}} @code{0}@code{2.2250738585072014E-308}@code{1.7976931348623157E+308}Ǥ -M ɽ D ϾǤ̵ @code{DOUBLE} 25 <= X -<= 53 Ǥ @code{FLOAT(X)} ựޤ - -@tindex DOUBLE PRECISION -@tindex REAL -@item DOUBLE PRECISION[(M,D)] [ZEROFILL] -@itemx REAL[(M,D)] [ZEROFILL] - -@code{DOUBLE}ƱǤ - -@tindex DECIMAL -@item DECIMAL[(M[,D])] [ZEROFILL] - -ѥå̵ưʤˤϤǤޤ@code{CHAR}եɤΤ褦˿񤤤ޤ`ѥå̵'ϡͤʸȤƳǼ뤳Ȥ̣ͤΤ줾η塢ڤǤ@samp{-}ˣʸѤޤ -@code{D}0λͤϾ侮ޤ@code{DECIMAL}ͤκϰϤ@code{DOUBLE}ƱǤºݤϰϤ@code{DECIMAL}եɤͿ줿@code{M}ڤ@code{D}˶ޤ - -@code{D} ά 0 ꤵ줤ޤ@code{M} ά -10 ꤵޤ - -@strong{MySQL} 3.22 Ǥϡ @code{M} 侮ޤߤޤ - -@tindex NUMERIC -@item NUMERIC(M,D) [ZEROFILL] - -@code{DECIMAL}Ʊ - -@tindex DATE -@item DATE - -աݡȤϰϤ@code{'1000-01-01'}@code{'9999-12-31'}ޤǡ -@strong{MySQL}@code{'YYYY-MM-DD'}ν񼰤@code{DATE}ͤɽޤ@code{DATE}եɤؤͤγƤϡʸ⤷ϿͤΤ줫λѤޤ - -@tindex DATETIME -@item DATETIME - -դȻȤ߹碌ݡȤϰϤ@code{'1000-01-01 00:00:00'}@code{'9999-12-31 23:59:59'}Ǥ@strong{MySQL}@code{DATETIME}ͤ@code{'YYYY-MM-DD HH:MM:SS'}Ȥ񼰤ɽޤ@code{DATETIME}եɤؤͤγƤϡʸ⤷ϿͤΤ줫λѤޤ - -@tindex TIMESTAMP -@item TIMESTAMP[(M)] - -ॹסϰϤ@code{'1970-01-01 00:00:00'}@code{2106}ǯޤǤǤ@strong{MySQL}@code{TIMESTAMP}ͤ@code{YYYYMMDDHHMMSS}@code{YYMMDDHHMMSS}@code{YYYYMMDD}@code{YYMMDD}Ȥ񼰤ɽ@code{M}@code{14}(⤷ϸäƤʾͤꤷ)@code{12}@code{8}@code{6}Τ줬ꤵ줿˰¸ޤʤ@code{TIMESTAMP}եɤؤͤγƤϡʸ⤷ϿͤΤ줫λѤޤ -@code{TIMESTAMP}եɤϡǸ줿ưŪꤹΤǡ@code{INSERT}@code{UPDATE}λϿΤΩޤ -@code{NULL}ͤͿ뤳ȤˤäƤ⡢߻Ǥޤ -@xref{Date and time types} - -@tindex TIME -@item TIME - -֡ϰϤ@code{'-838:59:59'}@code{'838:59:59'}Ǥ -@strong{MySQL}@code{TIME}ͤ@code{'HH:MM:SS'}Ȥ񼰤ɽޤ@code{TIME}եɤؤͤγƤϡʸ⤷ϿͤΤ줫λѤޤ - -@tindex YEAR -@item YEAR[(2|4)] - -ǯ2ޤ4(ǥեȤ4)ͤϡ4Ǥ -@code{1901}@code{2155}, @code{0000} ǡ2(7069)Ǥ 19702069 -Ǥ@strong{MySQL} @code{YEAR} ͤ @code{YYYY} ɽޤ -@code{YEAR} եɤؤͤγƤʸȿΤɤǤѤǤ -(@code{YEAR} @strong{MySQL} 3.22 ǤοǤ) - -@tindex NATIONAL CHAR -@tindex NCHAR -@tindex CHAR -@tindex CHARACTER -@item [NATIONAL] CHAR(M) [BINARY] - -ĹʸǡǼˤɬꤵ줿ĹޤDZ¦˶ޤ -@code{M}ϰϤ 1 255 ʸǤ³ζͤμФ˺ -ޤ@code{BINARY} ɤͿʤ硢@code{CHAR} ͤΥȤ -ӤϡǥեʸåȤ˽äƥ¸ˡǹԤʤޤ - -@code{NATIONAL CHAR} (û @code{NCHAR}) ϡANSI SQL ǡCHAR ե -ɤǥեʸåȤѤ뤳ȤˡǤ -@code{MySQL} ǤϥǥեȤǤ - -@code{CHAR} @code{CHARACTER} άǤ - -@strong{MySQL} @code{CHAR(0)} Υեɤޤϼ -ˡºݤˤϤ⤦ͤȤƤʤեɤ¸ߤ뤳Ȥ˰¸Ƥ -ʤĤθŤץꥱбɬפǤĤ -ͤ뤳ȤǤեɤɬפȤˤȤƤɤȤǤ: -@code{NOT NULL} ȤƤʤ @code{CHAR(0)} 1ӥåȤͭ -Ĥͤ뤳ȤǤޤ: @code{NULL} ޤ @code{""} - -@tindex CHARACTER VARYING -@tindex CHAR VARYING -@tindex VARCHAR -@item [NATIONAL] VARCHAR(M) [BINARY] - -Ĺʸ : -³ζϳǼ˺ޤ( ANSI SQL ͤȰۤʤޤ) -@code{M}ϰϤ 1 255 ʸǤ -@code{BINARY} ɤͿʤ硢ȤӤϥ˰¸ޤ -@xref{Silent column changes}. - -@code{VARCHAR} @code{CHARACTER VARYING} άǤ - -@tindex TINYBLOB -@tindex TINYTEXT -@item TINYBLOB -@itemx TINYTEXT - -Ĺ 255 (2^8 - 1) ʸ @code{TEXT}/@code{BLOB}@xref{Silent column changes}. - -@tindex BLOB -@tindex TEXT -@item BLOB -@itemx TEXT - -Ĺ 65535 (2^16 - 1) ʸ @code{TEXT}/@code{BLOB}@xref{Silent column changes}. - -@tindex MEDIUMBLOB -@tindex MEDIUMTEXT -@item MEDIUMBLOB -@itemx MEDIUMTEXT - -Ĺ 16777215 (2^24 - 1) ʸ @code{TEXT}/@code{BLOB}@xref{Silent column changes}. - -@tindex LONGBLOB -@tindex LONGTEXT -@item LONGBLOB -@itemx LONGTEXT - -Ĺ 4294967295 (2^32 - 1) ʸ @code{TEXT}/@code{BLOB}@xref{Silent column changes}. - -@tindex ENUM -@item ENUM('value1','value2',...) - - -оݤȤʤʸϡͤĤͥꥹ@code{'value1', 'value2',...}(@code{NULL})Фޤ@code{ENUM}Ϻ65535ĤθͭͤĤȤǤޤ - -@tindex SET -@item SET('value1','value2',...) - -ȡ -оݤȤʤʸ0ʾͤ줾ͥꥹ@code{'value1', 'value2',...}ФʤФʤޤ -@code{SET}ϡ 64ĤǤĤȤǤޤ -@end table - -@menu -* Storage requirements:: Column type storage requirements -* Numeric types:: Numeric types -* Date and time types:: Date and time types -* String types:: String types -* Casts:: Cast operators -* Choosing types:: Choosing the right type for a column -* Indexes:: Column indexes -* Multiple-column indexes:: Multiple-column indexes -* Other-vendor column types:: Using column types from other database engines -@end menu - -@cindex Storage requirements -@node Storage requirements, Numeric types, Column types, Column types -@subsection եɥפν - -@strong{MySQL}ݡȤƥեɥν̤򡢥ƥ̤˰ʲ˵Ҥޤ - -@subheading ͥ - -@multitable @columnfractions .35 .65 -@item @strong{եɥ} @tab @strong{} -@item @code{TINYINT} @tab 1 byte -@item @code{SMALLINT} @tab 2 bytes -@item @code{MEDIUMINT} @tab 3 bytes -@item @code{INT} @tab 4 bytes -@item @code{INTEGER} @tab 4 bytes -@item @code{BIGINT} @tab 8 bytes -@item @code{FLOAT(X)} @tab X <= 24 ξ 425 <= X <= 53 ξ 8 -@item @code{FLOAT} @tab 4 bytes -@item @code{DOUBLE} @tab 8 bytes -@item @code{DOUBLE PRECISION} @tab 8 bytes -@item @code{REAL} @tab 8 bytes -@item @code{DECIMAL(M,D)} @tab @code{M} bytes (@code{M < D} ξ @code{D}+2) -@item @code{NUMERIC(M,D)} @tab @code{M} bytes (@code{M < D} ξ @code{D}+2) -@end multitable - -@subheading դȻ֥ - -@multitable @columnfractions .35 .65 -@item @strong{եɥ} @tab @strong{} -@item @code{DATE} @tab 3 bytes -@item @code{DATETIME} @tab 8 bytes -@item @code{TIMESTAMP} @tab 4 bytes -@item @code{TIME} @tab 3 bytes -@item @code{YEAR} @tab 1 byte -@end multitable - -@subheading ʸ󥿥 - -@multitable @columnfractions .35 .65 -@item @strong{եɥ} @tab @strong{} -@item @code{CHAR(M)} @tab @code{M} bytes, @code{1 <= M <= 255} -@item @code{VARCHAR(M)} @tab @code{L}+1 bytes, where @code{L <= M} and -@code{1 <= M <= 255} -@item @code{TINYBLOB}, @code{TINYTEXT} @tab @code{L}+1 bytes, -where @code{L} < 2^8 -@item @code{BLOB}, @code{TEXT} @tab @code{L}+2 bytes, -where @code{L} < 2^16 -@item @code{MEDIUMBLOB}, @code{MEDIUMTEXT} @tab @code{L}+3 bytes, -where @code{L} < 2^24 -@item @code{LONGBLOB}, @code{LONGTEXT} @tab @code{L}+4 bytes, -where @code{L} < 2^32 -@item @code{ENUM('value1','value2',...)} @tab 1 or 2 bytes, ͤο˰¸ (ͤ 65535 ) -@item @code{SET('value1','value2',...)} @tab 1, 2, 3, 4 or 8 bytes, Ǥο˰¸ ( 64 ) -@end multitable - -@code{VARCHAR}@code{BLOB}ڤ@code{TEXT}ϲĹǤꡢ̤ϡեɤΤȤ祵ȤϤषեͤμºݤĹ˰¸ޤ(ɽ@code{L}ɽޤ) -㤨С@code{VARCHAR(10)}եɤϡ10ʸʬĹʸݻ뤳Ȥޤºݤν̤ϡʸĹ(@code{L})ȡĹϿ뤿ΣХȤäޤʸ@code{'abcd'}ˤƤϡ@code{L}ϣǡ̤ϣХȤǤ - -@code{BLOB}@code{TEXT}ϡեͤĹϿΤˡϣХɬפȤΤȤĹ˰¸ޤ - -ơ֥뤬Ĺեɷޤ硢Υ쥳ɥեޥåȤޤĹȤʤǤ礦 -ơ֥뤬줿@strong{MySQL}ϳΤʾβեɤĹפĹפѹѤ򵯤ȤդƲ - -@code{ENUM}֥ȤΥϡۤʤͤοˤäƷޤ -󤹤255ǤϡХȤѤޤ -󤹤65535ǤϡХȤѤޤ - -@code{SET}֥ȤΥϡۤʤǤοˤäƷޤ -ȤΥ@code{N}Ȥȡ֥Ȥ@code{(N+7)/8}ХȤͭϣХȤھ夲ޤ -Ĥ@code{SET}ϡ磶ǤĤȤǤޤ - -@node Numeric types, Date and time types, Storage requirements, Column types -@subsection ͷ - -@strong{MySQL} ANSI/ISO SQL92 ͷ򤹤٤ƥݡȤޤη -Τʿͥǡ(@code{NUMERIC}, @code{DECIMAL}, @code{INTEGER}, -@code{SMALLINT})ͷ(@code{FLOAT}, @code{REAL}, @code{DOUBLE -PRECISION})ޤߤޤ @code{INT} @code{INTEGER} Ʊǡ -@code{DEC} @code{DECIMAL} ƱǤ - -@strong{MySQL} Ǥ @code{NUMERIC} @code{DECIMAL} ϡSQL92 ɸǵ -Ƥ褦ƱȤƼƤޤΤ٤ݻ -Ȥפ(㤨жǡ)˻ѤޤηΰĤΥե -ɤ٤礭Ǥޤ(̾Ϥޤ); 㤨: - -@example - salary DECIMAL(9,2) -@end example - -Ǥϡ@code{9} (@code{precisoin}) ͤǼפʿͤηɽ -ޤ @code{2} (@code{scale}) Ͼ³ƳǼɽ -ޤäơξ @code{salary} եɤ˳Ǽ뤳ȤǤ -ϰϤϡ@code{-9999999.99} @code{9999999.99} ǤANSI/ISO SQL92 -Ǥϡʸ @code{DECIMAL(p)} @code{DECIMAL(p,0)} ǤƱͤˡ -ʸ @code{DECIMAL} @code{DECIMAL(p,0)} Ǥ @code{p} -ͤηϼ˵Ƥޤ@code{DECIMAL}/@code{NUMERIC} ǡΤ -ΰۤʤϡ@strong{MySQL} ϸߥݡȤƤޤ󡣤ημ -פ٤礭ξŪ椹뵡ǽФΤǡ -̾ǤϤޤ - -@code{DECIMAL} @code{NUMERIC} ͤϡͤξ٤ݻ뤿ᡢХ -ʥưȤƤǤϤʤʸȤƳǼޤ1ʸͤΤ -η(@code{scale} > 0 ξ) @samp{-} (ξ)˻Ѥ -@code{scale} 0 ξ硢@code{DECIMAL} @code{NUMERIC} ͤϾ -Ⱦޤߤޤ - -@code{DECIMAL} @code{NUMERIC} ͤκϰϤ @code{DOUBLE} ƱǤ - @code{DECIMAL} @code{NUMERIC} եɤͿºݤϰϤ -եɤͿ줿 @code{precision} @code{scale} ˤäƶ -Υեɤˡꤵ줿 @code{scale} ǵ¿ξ -ĿͤƤ줿硢ͤϤ @code{scale} ˴ݤޤ -@code{DECIMAL} @code{NUMERIC} եɤˡꤵ줿(ޤϥǥե -) @code{precision} @code{scale} Ǽ줿ϰϤĶ礭ͤ -Ƥ@strong{MySQL} ϤϰϤбͤɽͤǼޤ - -ANSI/ISO SQL92 ɸФĥȤơɽ˥ꥹȤ褦ˡ -@strong{MySQL} @code{TINYINT}, @code{MEDIUMINT}, @code{BIGINT} -ݡȤޤ@strong{MySQL} ˤäƥݡȤ¾γĥȤơ -ǡδܥɤ³Ƴ˻ꤹͤɽ(㤨 -@code{INT(4)})ޤΥץϡեɤ˻ꤵ줿 -⾯ʤͤɽκ¦뤿˻Ѥޤե -ɤ˳Ǽ뤳ȤǤͤϰϤ䡢եɤ˻ꤵ줿Ķ -ˤĤɽ󤵤ޤ󡣥ץγĥ° -@code{ZEROFILL} ꤷƻѤ줿硢ǥեȤ 0 -֤ޤ㤨С@code{INT(5) ZEROFILL} Ȥ줿ե -ɤǤϡ @code{4} @code{0004} ȤƼФޤ: ե -ɽ礭ͤǼ硢@strong{MySQL} ʣ join -Τ˰ơ֥ˡθǤ礦ξ -@strong{MySQL} ϥǡꥸʥΥե˹äƤ뤳ȤѤ -뤿Ǥ - -٤Ƥϥץ(ɸ)° @code{UNSIGNED} ĤȤǤ -ޤ̵ͤϥեοĤơեɤ -ƾ礭ͤϰϤɬפʻ˻ѤǤޤ - -@code{FLOAT} ϶ǡɽ˻ѤޤANSI/ISO SQL92 ɸ -ϡ@code{FLOAT} ɤ³˥ץ(ؿϰϤǤ -ʤ)λƤޤ@strong{MySQL} ϤΥץٻ -ݡȤƤޤ @code{FLOAT} ٤λ̵ǥեɷ -ȤƻѤ줿ϡ@strong{MySQL} ͤǼ뤿4ХȤѤ -@code{FLOAT} ɤ³2ĤοͤͿ빽ʸ⥵ݡȤ -ޤΥץǤΡǽοͤͤɬפ̤ХȤɽޤ -2ܤοͤϡǼɽ뾮ηꤷޤ(@code{DECIMAL} -@code{NUMERIC} Ʊ)@strong{MySQL} եɤ˻ꤵ줿礭 -ηĿͤ򤳤Υեɤ˳ǼͤγǼ;פʷ -褦ͤݤޤ - -@code{REAL} @code{DOUBLE PRECISION} ٻޤ -ANSI/ISO SQL92 ɸФĥȤơ@strong{MySQL} @code{DOUBLE} -@code{DOUBLE PRECISION} ƱȤǧޤ@code{REAL} ٤ -@code{DOUBLE PRECISION} λ⾮Ȥ׵᤹ɸȰۤʤꡢ -@strong{MySQL} Ϥɤ8ХȤپͤȤƼƤޤ -("ANSI ⡼"Ǽ¹ԤƤʤ)ܿˤ뤿ˤϡ -ǡͤγǼ׵᤹륳ɤϡ٤侮λ̵ -@code{FLOAT} @code{DOUBLE PRECISION} Ѥ٤Ǥ - -եɤηͤεϰϤĶͤ褦Ȥȡ@strong{MySQL} -ͤϰϤäѤڤͤᡢη̤ޤ - -㤨С @code{INT} եɤϰϤ @code{-2147483648} @code{2147483647} Ǥ -⤷ @code{-9999999999} @code{INT} եɤ褦ȤȡͤϰϤκͤ -졢 @code{-2147483648} ޤƱͤˡ@code{9999999999} ξ硢 - @code{2147483647} ޤ - -ơ@code{INT} եɤ̵ξ硢եɤϰϤ礭 -ƱǤ³ͤ @code{0} @code{4294967296} ˤʤޤ -⤷ @code{-9999999999} @code{9999999999} 褦Ȥȡ -ͤ @code{0} @code{4294967296} Ȥޤ - -@code{ALTER TABLE}, @code{LOAD DATA INFILE}, @code{UPDATE} ޤ - multi-row @code{INSERT} Ѵ `ٹ' Ȥޤ - - -@cindex Types, Date and Time -@cindex Date and Time types -@node Date and time types, String types, Numeric types, Column types -@subsection դȻ֤η - -@menu -* Y2K issues:: Y2K issues and date types -* DATETIME:: The @code{DATETIME}, @code{DATE} and @code{TIMESTAMP} types -* TIME:: The @code{TIME} type -* YEAR:: The @code{YEAR} type -@end menu - -դȻ֤η @code{DATETIME}, @code{DATE}, @code{TIMESTAMP}, -@code{TIME}, @code{YEAR} Ǥ. Ϥ줾ͤŬϰϤꡢ -``zero'' ϤʤְäͤꤷѤޤ: @strong{MySQL} -μ¤ '̩Ǥʤ' դ͡㤨 @code{1999-11-31} Ǽ뤳 -ȤǤޤͳϡդåǤϥץꥱ -ꡢSQL ФˤϤʤȹͤƤ뤫Ǥդ'®'å뤿 -ˡ@strong{MySQL} Ϸ 012 ϰϤǤ뤫 031 ϰϤǤ뤫 -åޤҤϰϤϡ@strong{MySQL} @code{DATE} ޤ -@code{DATETIME} եɤˡޤϷ 0 ǤդǼǤ뤿 -ƤޤϡΤդΤʤϿɬפ -ץꥱͭѤǤξ硢@code{1999-00-00} -@code{1999-01-00} Τ褦դñϿǤޤ(󡢤Τ褦 -դ @code{DATE_SUB()} @code{DATE_ADD} Τ褦ʴؿǻѤơ -֤뤳ȤϴԤǤޤ) - -ϡդȻַǺȤˡŪ˹θʤФʤʤȤǤ: - -@itemize @bullet -@item -@strong{MySQL}ϡɸͿ줿դ֤ͤФޤͿ줿¿ͤʷ(㤨Сꤵ줿ͤդַ˳ƤꡢӤ)ᤷ褦Ȼߤޤ -Ǥ⡢ǽҤ٤ݡȤޤ -ϡͤͿ뤳ȤԤ¾ηͤѤ褦ʻ֤ȡɤΤ褦ʷ̤Ȥʤ뤫ͽۤǤޤ - -@item -@strong{MySQL} ϤĤηͤѤƤޤ -ǯʬˤʬϺͿƤȴԤƤޤ -դ ǯ-- ν(㤨С@code{'98-09-04'})ǤʤƤϤʤޤ ---ǯ --ǯ ͤʤɤǤȤƤ褦ʷǤäƤϤʤޤ -(㤨С@code{'09-04-98'}@code{'04-09-98'}). - -@item -@strong{MySQL} ϡ⤷ͤʸ̮դȻ֤ηѤȡ -ưŪդȻ֤ͤľޤդԤޤ - -@item -@strong{MySQL} ϰϳθäͤդȻַȤƼä -(ΥκǽߤƤ)ͤ ``'' Ѵޤ -(㳰ϡϰϳ@code{TIME}ͤŬڤ@code{TIME}ϰϤθ³ͤڤͤ뤳ȤǤ) -ʲˡ줾η `' η򼨤ޤ - -@multitable @columnfractions .3 .7 -@item @strong{եɥ} @tab @strong{`'} -@item @code{DATETIME} @tab @code{'0000-00-00 00:00:00'} -@item @code{DATE} @tab @code{'0000-00-00'} -@item @code{TIMESTAMP} @tab @code{00000000000000} (length depends on display size) -@item @code{TIME} @tab @code{'00:00:00'} -@item @code{YEAR} @tab @code{0000} -@end multitable - -@item -`'̤ͤǤɽ˼줿ͤŪ˻ѤơǼ껲ȤǤޤ -ͤϡ @code{'0'} @code{0} Ѥ뤳Ȥˤꡢʷ˽񤯤ȤǤޤ - -@item -@strong{MyODBC} ǻѤƤ `' դȻ֤ϡ -@strong{MyODBC} 2.50.12 ʾǤϼưŪ @code{NULL} Ѵޤ - ODBC ͤ򰷤ʤǤ -@end itemize - -@cindex Year 2000 issues -@node Y2K issues, DATETIME, Date and time types, Date and time types -@subsubsection 񣲣ǯȥǡ - -@strong{MySQL} Τ2000ǯФưǤ(@pxref{Year 2000 compliance}) - @strong{MySQL} 󼨤ͤ˴ؤƤϤǤϤޤ2 -ǯϤϲʤΤ狼ʤΤۣǤΤ褦ͤ @strong{MySQL} -ǯ4ȤäƤ뤳Ȥ4ηѴƤޤޤ - - @strong{MySQL} ۣդ @code{DATETIME}, @code{DATE}, @code{TIMESTAMP} - @code{YEAR} ˴ؤơʲ -롼˽äƲᤷޤ - -@itemize @bullet -@item -@code{00-69} ϰϤǯ @code{2000-2069} Ѵ - -@item -@code{70-99} ϰϤǯ @code{1970-1999} Ѵ -@end itemize - -Υ롼ϥạ̇̄Ƥ뤫ФʿͿ -᤮ʤȤդƤ @strong{MySQL} ȯŪˡͤ -ʤۣǤʤ4ǯޤϤͿ٤Ǥ - -@code{ORDER BY} 2 @code{YEAR/DATE/DATETIME} Ȥޤ - -: @code{MIN()} @code{MAX()} Τ褦ʤĤδؿ @code{TIMESTAMP/DATE} -Ѵޤǯ2ΥॹפϤδؿư -Ȥ̣ޤξνϡ@code{TIMESTAMP/DATE} 4ǯη -Ѵ뤫@code{MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS))} Τ褦ʲ -Ѥ뤳ȤǤ - -@tindex DATETIME -@tindex DATE -@tindex TIMESTAMP -@node DATETIME, TIME, Y2K issues, Date and time types -@subsubsection @code{DATETIME}, @code{DATE}, @code{TIMESTAMP} - -@code{DATETIME}, @code{DATE}, @code{TIMESTAMP}Ϥߤ˴ϢƤޤΥ -Ϥħȡ줾줬ɤƱǤɤ㤦򼨤ޤ - -@code{DATETIME} դȻξޤͤɬפʾ˻Ȥޤ@strong{MySQL} - @code{DATETIME} ͤ @code{'YYYY-MM-DD HH:MM:SS'} ΥեޥåȤǼФɽޤ -ݡȤϰϤ @code{'1000-01-01 00:00:00'} @code{'9999-12-31 23:59:59'} Ǥ -(֥ݡȤפȤϤ˲ͤǤưΤޤݾڤθ¤ǤϤʤȤ̣Ǥ) - -@code{DATE} ϻʬʤդͤΤߤɬפʾ˻Ȥޤ@strong{MySQL} - @code{DATE} ͤ@code{'YYYY-MM-DD'} ΥեޥåȤǼФɽޤݡȤ -ϰϤ @code{'1000-01-01'} @code{'9999-12-31'} Ǥ - -@code{TIMESTAMP} פ @code{INSERT} @code{UPDATE} ˼ưŪ -ߤդȻޡ󶡤뷿Ǥ -⤷ʣ @code{TIMESTAMP} եɤˤϺǽ -ΰĤưŪ˹ޤ - -ǽ @code{TIMESTAMP} եɤμưϰʲΤ줫ξǵޤ - -@itemize @bullet -@item -ΥեɤŪ @code{INSERT} ޤ @code{LOAD DATA INFILE} ʸǻꤵƤʤȤ -@item -ΥեɤŪ @code{UPDATE} ʸǻꤵ줺ġ¾ΥեɤͤѤä硣 -(ȤȥեɤäƤͤƱͤ˹褦Ȥ @code{UPDATE} ʸ @code{TIMESTAMP} -եɤ򹹿ʤȤաʤʤ餢եɤ򸽺ߤƱͤѤ褦ȤƤ -@strong{MySQL} ϸΨΤˤ̵뤹뤫Ǥ) -@item -Ū @code{TIMESTAMP} եɤ @code{NULL} ˤ硣 -@end itemize - -ǽʳ @code{TIMESTAMP} եɤ⸽ߤդȻˤ뤳ȤǤޤΥեɤ -@code{NULL} ޤ @code{NOW()} ˤ뤳ȤǤ - -ɤ @code{TIMESTAMP} եɤŪ˾ͤ򥻥åȤ뤳ȤǸߤǤʤͤ -뤳ȤǤޤϺǽ @code{TIMESTAMP} եɤˤĤƤƱǤ -㤨 @code{TIMESTAMP} եɤ򤢤쥳ɤ줿Ȥˤθ夽ι -ƤѲʤ褦ˤȤ褦ʤȤ˻Ȥޤ - -@itemize @bullet -@item -@strong{MySQL} ˥쥳ɤ줿ȤˤΥեɤ򥻥åȤ롣Ǹ˽ -롣 - -@item -ʹߤ¾ΥեɤФ빹 @code{TIMESTAMP} եɤ򤽤켫ΤäƤͤ -Ū˹롣 -@end itemize - -μˡ @code{DATATIME} եɤ @code{NOW()} ǽʹߤι -ۤäƤΤƱ褦˴ñǤȤ狼Ǥ礦 - -@code{TIMESTAMP} ͤ @code{1970} ǯκǽ餫 @code{2037} ǯΤɤλޤǤϰϤͭǡ -1äλʬǽޤͤϿͤȤɽޤ - -@strong{MySQL} @code{TIMESTAMP} ͤФɽΤ˻ȤեޥåȤϰʲɽ -˼褦ˤɽ˰¸ޤܰդΡ @code{TIMESTAMP} եޥ -Ȥ14Ǥ @code{TIMESTAMP} եɤϤûɽ뤳ȤǤޤ - -@multitable @columnfractions .3 .7 -@item @strong{եɷ} @tab @strong{ɽեޥå} -@item @code{TIMESTAMP(14)} @tab @code{YYYYMMDDHHMMSS} -@item @code{TIMESTAMP(12)} @tab @code{YYMMDDHHMMSS} -@item @code{TIMESTAMP(10)} @tab @code{YYMMDDHHMM} -@item @code{TIMESTAMP(8)} @tab @code{YYYYMMDD} -@item @code{TIMESTAMP(6)} @tab @code{YYMMDD} -@item @code{TIMESTAMP(4)} @tab @code{YYMM} -@item @code{TIMESTAMP(2)} @tab @code{YY} -@end multitable - -Ƥ @code{TIMESTAMP} եɤɽ˴طʤƱǼޤ -ȤŪɽ 6 , 8 , 12 14 Ǥɽϥơ֥ -Ǥդͤ˻Ǥޤ 0 14 ʾͤ϶Ū 14 ˤʤޤ1 - 13 ޤǤδΥ϶Ū˰礭ˤʤޤ - -@code{DATETIME}, @code{DATE}, @code{TIMESTAMP} ͤϰʲζ̥եޥåȥåȤΤ줫 -ȤäƻǤޤ - -@itemize @bullet -@item -ʸ @code{'YYYY-MM-DD HH:MM:SS'} @code{'YY-MM-DD HH:MM:SS'} η -""Ƥޤ -- դζڤʸȤơʤɵ -ѤǤޤ㤨С@code{'98-12-31 11:30:45'}, @code{'98.12.31 11+30+45'}, -@code{'98/12/31 11*30*45'}, @code{'98@@12@@31 11^30^45'} Ǥ - -@item -ʸ @code{'YYYY-MM-DD'} @code{'YY-MM-DD'} η -""Ǥޤ -㤨, @code{'98-12-31'},@code{'98.12.31'}, @code{'98/12/31'}, @code{'98@@12@@31'} -Ǥ - -@item -ʸ @code{'YYYYMMDDHHMMSS'} ޤ @code{'YYMMDDHHMMSS'} եޥåȡ -ִˤ䤫ʡʸˡǧƤơɵաʬζڤ -ȤƻȤޤ㤨 @code{'98-12-31 11:30:45'}, @code{'98.12.31 11+30+45'}, - @code{'98/12/31 11*:30*:45'}, @code{'98@@12@@31 11^30^45'} Ǥ - -@item -ʸ @code{'YYYY-MM-DD'} ޤ @code{'YY-MM-DD'} եޥåȡִˤ䤫ʡʸˡ -ǧƤޤ㤨 @code{'98-12-31'}, @code{'98.12.31'}, @code{'98/12/31'}, @code{'98@@12@@31'} -Ǥ - -@item -ڤʸʤʸ @code{'YYYYMMDDHHMMSS'} ޤ @code{'YYMMDDHHMMSS'} եޥ -ȤȤựΤΡ㤨 @code{'19970523091528'} @code{'970523091528'} - @code{'1997-05-23 09:15:28'} Ȳᤵޤ @code{'971122129015'} ̵ -(ʬʬ) @code{'0000-00-00 00:00:00'} ˤʤޤ - -@item -ڤʸʤʸ @code{'YYYYMMDD'} ޤ @code{'YYMMDD'} եޥåȤǡդ -ựΤΡ㤨 @code{'19970523'} @code{'970523'} @code{'1997-05-23'} Ȳ -ޤ @code{'971332'} ̵(ʬ) @code{'0000-00-00'} -ˤʤޤ - -@item - @code{YYYYMMDDHHMMSS} ޤ @code{YYMMDDHHMMSS} ΥեޥåȤοͤǡȤư -̣ΤΡ㤨 @code{19830905132800} @code{830905132800} - @code{'1983-09-05 13:28:00'} Ȳᤵޤ - -@item - @code{YYYYMMDD} ޤ @code{YYMDD} ΥեޥåȤοͤդȤựΤΡ -㤨 @code{19830905} @code{830905} @code{'1983-09-05'} ȤƲᤵޤ - -@item - @code{NOW()} @code{CURRENT_DATE} Τ褦 - @code{DATETIME} , @code{DATE} , @code{TIMESTAMP} ΥƥȤ -ǽ֤ͤؿη̡ -@end itemize - -̵ @code{DATETIME} , @code{DATE} , @code{TIMESTAMP} ͤŬڤʡ֥ͤѴޤ( - @code{'0000-00-00 00:00:00'} , @code{'0000-00-00'} ޤ @code{00000000000000} ) - -ʬ˶ڤʸǻꤵͤǡͤ10̤ξ -2ǻꤷʤƤ⤫ޤޤ @code{'1979-6-9'} @code{'1979-06-09'} -Ʊͤ˻ʬ˶ڤʸǻꤵͤǡʬä - @code{10} ̤ξ2ǻꤷʤƤ⤫ޤޤ @code{'1979-10-30 1:2:3'} - @code{'1979-10-30 01:02:03'} Ǥ - -ͤǤƤͤ 6, 8, 12 ޤ 14 Ǥɬפޤ⤷ο -ͤ 8 ޤ 14 ĹλϤ줾 @code{YYYYMMDD} @code{YYYYMMDDHHMMSS} ե -ޥåȤǡǽ 4 ǯͿΤȲꤵޤ⤷οͤ 6 -ޤ12Ĺλ @code{YYMMDD} @code{YYMMDDHHMMSS} եޥåȤǺǽ2 -ǯͿΤȲꤵޤʳĹοͤϤȤ @code{0} ɲ -ƤΤΤäȤᤤĹΤΤȲᤵޤ - -ڤʤʸͿͤϤ켫ȤĹȤäƲᤵޤ -⤷ʸ8ޤ14ʸʤǯϺǽ4ʸͿȲꤵ -Ǥʤкǽ2ʸͿȲꤵޤʸϺ -鱦ǯʬäʸɽƤʬ˲ᤵ -ޤĤޤ6ʸʲʸϻȤäƤϤʤȤȤǤ㤨 -1999ǯ3ꤹĤ @code{'9903'} ꤷ硢 @strong{MySQL} ϡ֥ -ơ֥ޤǯȷʬ @code{99} @code{03} Ǥʬ礱 -Ƥ()ͤͭդǤʤ˵ޤ - -@code{TIMESTAMP} եɤͭͤɽ˴طʤꤵ줿ͤǹ٤ -ʬǽdzǼޤΤȤϤĤΰ̣礤ޤ - -ǯͤǻꤵ줿硢ʬʤΤۣͤȤʤޤ -@strong{MySQL} ǯͤʲ˼§ˤäѴޤ - -@itemize @bullet -@item -ηTIMESTAMP(4)ǤäƤTIMESTAMP(2)ǤäƤǯ -뤳ȡǤʤ̵ͤ0Ǽޤ - -@item -⤷û @code{TIMESTAMP} @code{ALTER TABLE} ȤäƳĥ褦Ȥ硢 -ĥˤϡֱƤ׾󤬸ޤ - -@item -Ʊͤ @code{TIMESTAMP} եɤ̤᤿⡢ͤɽ줿ˤ꾯ʤ -ʤȤơϼޤ - -@item - @code{TIMESTAMP} ͤϺǹ٤λʬǽdzǼޤŪ˳Ǽ -ͤľǤؿ @code{UNIX_TIMESTAMP()} ΤߤǤ¾δؿϥեޥ -ȤƼФ줿ͤˤĤޤĤޤꡢ @code{HOUR()} @code{SECOND()} ʤ -δؿ @code{TIMESTAMP} ͤбʬեޥåȤ줿ͤǴޤޤʤ -ȤȤǤޤ㤨 @code{TIMESTAMP} @code{HH} ʬɽʤ -Ȥ10ʾʤɽʤΤǡû @code{TIMESTAMP} ͤ @code{HOUR()} -ԤäƤ̵̣ͤޤ -@end itemize - -շ¾շΥ֥Ȥ˳ĥƻꤹ뤳ȤǤޤ -ͤѲη򵯤ǽޤ - -@itemize @bullet -@item -@code{DATE} ͤ @code{DATETIME} @code{TIMESTAMP} ʪͿ硢 -ʬ @code{'00:00:00'} ˤʤޤ @code{DATE} ͤ -ξäƤʤǤ - -@item -@code{DATETIME} @code{TIMESTAMP} ͤ @code{DATE} ʪͿ硢 -ʬϺޤ @code{DATE} ͤ -ξäƤʤǤ - -@item - @code{DATETIME}, @code{DATE}, @code{TIMESTAMP} ͤƱեޥåȤΥåȤȤäɽ -ޤɤηƱͤϰϤäƤ櫓ǤϤʤȤФƤ -Ƥ㤨 @code{TIMESTAMP} ͤ @code{1970} ǯ @code{2037} ǯͤˤϤǤ -ޤ󡣤Ĥޤ @code{'1968-01-01'} Ȥͤ @code{DATETIME} @code{DATE} ͤȤƤͭǤ - @code{TIMESTAMP} ͤȤƤ̵ǡΤ褦ʥ֥Ȥꤷ - @code{0} Ѵޤ -@end itemize - -դͤꤹȤȤդƤ: - -@itemize @bullet -@item -ʸȤƻꤵͤνʥեޥåȤ٤ʤ褦㤨 - @code{'10:11:12'} @samp{':'} ڤʸȤΤ褦˸ޤդΥ -ƥȤǻȤȤ @code{'2010-11-12'} Ȳᤵޤ@code{'10:45:15'} @code{'45'} -ͭʷǤϤʤΤ @code{'0000-00-00'} Ѵޤ - -@item -2ɽǯʬʤΤۣǤ @strong{MySQL} ϰʲΥ롼 -2ǯᤷޤ - -@itemize @minus -@item -@code{00-69} ϰϤˤǯͤ @code{2000-2069} ǯȤ롣 - -@item -@code{70-99} ϰϤˤǯͤ @code{1970-1999} ǯȤ롣 -@end itemize -@end itemize - -@tindex TIME -@node TIME, YEAR, DATETIME, Date and time types -@subsubsection @code{TIME} - -@strong{MySQL} @code{TIME} ͤ @code{'HH:MM:SS'} - (ʬ礭 @code{'HHH:MM:SS'}) -ȤեޥåȤǰޤɽޤ -(ʬ礭 @code{'HHH:MM:SS'}) -@code{TIME} ͤϰϤ @code{'-838:59:59'} @code{'838:59:59'} ϰϤǤ -ʬʤ礭Τϡ@code{TIME} ϰʤ24ְ -λɽΤѤǤϤʤв֤Ĥλݤδֳ -(ɤ⣲֤ۤꡢοˤʤ⤢ޤ)ɽ뤳 -⤢뤫Ǥ - -@code{TIME} ͤ͡ʥեޥåȤǻǽǤ - -@itemize @bullet -@item -ʸ @code{'D HH:MM:SS.fraction'} Ȥեޥåȡ -(@strong{MySQL}Ϥޤ fraction time եɤ¸Ǥޤ) -ʲ ``'' ʸˡѤǤޤ - -@code{HH:MM:SS.fraction}, @code{HH:MM:SS}, @code{HH:MM}, @code{D HH:MM:SS}, -@code{D HH:MM}, @code{D HH} or @code{SS}. Here @code{D} is days between 0-33. - -@item -ʸ @code{'HHMMSS'} Ȥ褦˶ڤΤʤեޥåȤǻȤͭ -ʤΡ㤨 @code{'101112'} @code{'10:11:12'} Ȳᤵޤ @code{'109712'} ̵(ʬ -ʬ̵̣) @code{'00:00:00'} ˤʤޤ - -@item -ͤ @code{HHMMSS} ΥեޥåȤǻȤͭʤΡ -㤨 @code{101112} @code{'10:11:12'} Ȳᤵޤ -̤ηǤޤ: @code{SS}, @code{MMSS},@code{HHMMSS}, -@code{HHMMSS.fraction}: @strong{MySQL} Ϥޤ fraction ¸Ǥ -ޤ - -@item -㤨 @code{CURRENT_TIME} Τ褦 @code{TIME} ΥƥȤǼդ֤ͤ -ؿη̡ -@end itemize - -ʸǻγζڤޤ @code{TIME} ͤˤĤƤϡʬä @code{10} ʲ -ξ硢οꤹɬפϤޤ@code{'8:3:2'} @code{'08:03:02'} Ʊ -Ǥ - -û @code{TIME} ͤ @code{TIME} եɤȤƻꤹդǤ -@strong{MySQL} ϤͤäȤⱦüηäɽȲꤷƲᤷޤ -(@strong{MySQL} @code{TIME} ͤ -λȤƤв֤ȤƲᤷޤ)㤨 @code{'11:12'},@code{'1112'}, - @code{1112} @code{'00:11:12'} (1112ʬ)ɽƤĤǤƤ⡢ -@strong{MySQL} Ϥ @code{'00:00:12'} (11ʬ12)ȤƲᤷޤ -Ʊͤ @code{'12'} @code{12} @code{'00:00:12'} Ȳᤷޤ - -@code{TIME} ϰϳˤͤͰʳΤϰϤüͤŬ˥ -פޤ㤨 @code{'-850:00:00'} @code{'850:00:00'} -줾 @code{'-838:59:59'} @code{'838:59:59'} ˤʤޤ - -̵ @code{TIME} ͤ @code{'00:00:00'} Ѵޤ - @code{'00:00:00'} Τͭ @code{TIME} ͤʤΤǡ -ơ֥¸줿'00:00:00'Ȥͤ餽줬Ȥ - @code{'00:00:00'} Ȼꤵ줿ͤʤΤ̵ʤѴ줿̤ʤΤ -̤ˡϤʤȤդƤ - - -@tindex YEAR -@node YEAR, , TIME, Date and time types -@subsubsection @code{YEAR} - -@code{YEAR} ǯɽΤ˻Ȥ1ХȤͤǤ - -@strong{MySQL} @code{YEAR} ͤ @code{YYYY} ȤեޥåȤǰ -ޤɽޤϰϤ @code{1901} @code{2155} Ǥ - -@code{YEAR} ͡ʥեޥåȤǻǽǤ - -@itemize @bullet -@item -@code{'1901'} @code{'2155'} ϰϤˤ4ʸ - -@item -@code{1901} @code{2155} ϰϤˤ4ο͡ - -@item -@code{'00'} @code{'99'} ϰϤˤ2ʸ -@code{'00'} @code{'69'} ޤǤ @code{'70'} -@code{'99'} ޤǤϰϤϤ줾 @code{2000} @code{2069} ޤ - @code{1970} @code{1999} ޤǤϰϤ -YEARѴޤ - -@item -@code{1} @code{99} ϰϤˤ2ο͡@code{1} @code{69} ޤ - @code{70} @code{99} ޤǤϰϤ -줾 @code{2001} @code{2069} ޤǤ @code{1970} @code{1999} ޤ -ϰϤ @code{YEAR} Ѵޤ -2οͤξ2ʸξȼ㴳ۤʤäƤդ -ʤʤ0ͤȤƻꤷ2000ǯȤƲᤵ뤳 -ȤǤʤǤξʸ @code{'0'} ޤ @code{'00'} @emph{ꤷʤ -ʤޤ}Ǥʤп0̵YEARͤ򼨤 @code{0000} Ѵޤ - -@item -㤨 @code{NOW()} Τ褦 @code{YEAR} ƥȤǼ֤ͤؿη -̡ -@end itemize - -̵ @code{YEAR} ͤ @code{0000} Ѵޤ - - -@node String types, Choosing types, Date and time types, Column types -@subsection ʸ - -ʸ󷿤 @code{CHAR}, @code{VARCHAR}, @code{BLOB}, @code{TEXT}, -@code{ENUM} @code{SET} Ǥ - -@tindex CHAR -@tindex VARCHAR -@menu -* CHAR:: The @code{CHAR} and @code{VARCHAR} types -* BLOB:: The @code{BLOB} and @code{TEXT} types -* ENUM:: The @code{ENUM} type -* SET:: The @code{SET} type -@end menu - -@node CHAR, BLOB, String types, String types -@subsubsection @code{CHAR} @code{VARCHAR} - -@code{CHAR} @code{VARCHAR} Ϥ褯ƤޤǼФμ˰㤤ޤ - -@code{CHAR} եɤĹϥơ֥ȤĹ˸ꤵޤĹ - 1 255 ޤǤͤޤ@code{CHAR} ǼȤˤϻꤵ줿Ĺ -ʤ褦˱¦˶򤬵ͤޤ@code{CHAR} ͤФ줿ˤϱ¦ -(³)ζϼޤ - -@code{VARCHAR} եɤͤϲĹʸǤ -@code{VARCHAR} եɤ @code{CHAR} ե -Ʊ 1 255 ޤǤĹǤޤ -(@strong{MySQL} 3.23 Ǥ, @code{CHAR} Ĺ 0 255 ޤǵƤޤ.) - @code{CHAR} Ȱۤʤ @code{VARCHAR} ͤɬפʸʬ -ĹϿ1 ХȤ­ΰ˳ǼޤͤˤϷ碌ΤζϤĤ -ޤ󡣸³ζͤγǼ˼ޤ(ζν ANSI -SQLͤȤϰäƤޤ) - -⤷ @code{CHAR} ޤ @code{VARCHAR} եɤˡեɤκĹ -ۤĹͤͿϡŬ礹褦ڤͤޤ - -ʲɽϤĤΥեɷΰ㤤@code{CHAR(4)} @code{VARCHAR(4)} ͡ -ʸͤǼ̤򼨤ȤɽƤޤ - -@c Need to use @(space) to make sure second column values retain spacing -@c in output for table below. - -@multitable @columnfractions .2 .15 .2 .2 .25 -@item @strong{} @tab @code{CHAR(4)} @tab @strong{ɬפʳǼ} @tab @code{VARCHAR(4)} @tab @strong{ɬפʳǼ} -@item @code{''} @tab @code{'@ @ @ @ '} @tab 4 Х @tab @code{''} @tab 1 Х -@item @code{'ab'} @tab @code{'ab@ @ '} @tab 4 Х @tab @code{'ab'} @tab 3 Х -@item @code{'abcd'} @tab @code{'abcd'} @tab 4 Х @tab @code{'abcd'} @tab 5 Х -@item @code{'abcdefgh'} @tab @code{'abcd'} @tab 4 Х @tab @code{'abcd'} @tab 5 Х -@end multitable - -@code{CHAR(4)} եɤθ³ζϼФˤȤΤΤǡCHAR(4) -@code{VARCHAR(4)} ФͤϤɤξǤƱǤ - -@code{CHAR} @code{VARCHAR} եɤͤϥơ֥ @code{BINARY} ° -Ĥʤ¤ꡢʸȾʸ̤ʤǥȡӤޤ@code{BINARY} °Ϥ -ͤʸʸ̤ơMySQLФ¹ԤƤޥ -ASCII˥ȡӤ뤳Ȥ̣ޤ - -@code{BINARY} °ϡָŪפǤĤޤꡢ⤷ @code{BINARY} ǤȻꤵ줿 -եɤˤȼΤ @code{BINARY} ͤȤӤΤǤ - -@strong{MySQL} ϥơ֥˲Ǥ餺@code{CHAR} ޤ @code{VARCHAR} -եɤѹޤ -@xref{Silent column changes}. - -@tindex BLOB -@tindex TEXT -@node BLOB, ENUM, CHAR, String types -@subsubsection @code{BLOB} @code{TEXT} - -@code{BLOB} 礭ʥХʥ귿Υ֥ȤǡĹΥǡݻǤޤ -4 Ĥ @code{BLOB} ʤ @code{TINYBLOB}, @code{BLOB}, -@code{MEDIUMBLOB} @code{LONGBLOB} ݻǤǡκĹ㤦Ǥ -@xref{Storage requirements}. - -4 Ĥ @code{TEXT} ʤ @code{TINYTEXT}, @code{TEXT}, @code{MEDIUMTEXT} - @code{LONGTEXT} 4 Ĥ @code{BLOB} бƱĹ -ǼäƤޤ @code{TEXT} @code{BLOB} ΰ㤤ϡ -@code{TEXT} ϥ˰¸ʤǥȤӤ졢 -@code{BLOB} ϥ˰¸(ʸɤ)Ӥ뤳ȤǤ -ʤС@code{TEXT} ϡ˰¸ʤ @code{BLOB} Ǥ - -⤷ @code{BLOB} @code{TEXT} եɤˤκĹʾͤͿ줿硢 -ͤϤäޤ褦ڤȤޤ - -ۤȤɤǡ@code{TEXT} եɤ @code{VARCHAR} 礭ʪȸʤȤޤ -Ʊͤˡ@code{BLOB} եɤ @code{VARCHAR BINARY} եɤ礭ʤäʪǤ -㤤ϡ - -@itemize @bullet -@item -@strong{MySQL} 3.23.2 ʾǤϡ@code{BLOB} @code{TEXT} -ǥåĤȤޤΥСǤ -ǥåĤȤޤ - -@item -@code{VARCHAR} եɤǹԤäƤ褦ˤϡ@code{BLOB} @code{TEXT} եɤ -ͤθˤĤƤϢ³ʸڤȤޤ - -@item -@cindex Default values, @code{BLOB} and @code{TEXT} columns -@cindex @code{BLOB} columns, default values -@cindex @code{TEXT} columns, default values -@code{BLOB} @code{TEXT} @code{DEFAULT} ͤĤȤޤ -@end itemize - -@code{MyODBC} @code{BLOB} @code{LONGVARBINARY} Ȥơ -@code{TEXT} @code{LONGVARCHAR} Ȥޤ - -@code{BLOB} @code{TEXT} եɤ϶üĹΤǡѤݤˤϡ -ĤκäˤǤ魯⤷ޤ - -@itemize @bullet -@item -⤷ @code{GROUP BY} @code{ORDER BY} @code{BLOB} եɤ @code{TEXT} ե -ǻѤʤ顢եɤͤĹΤΤѴʤƤϤʤޤ -ɸŪˡϡ @code{SUBSTRING} ؿѤ뤳ȤǤ -ȤС - -@example -mysql> select comment from tbl_name,substring(comment,20) as substr - ORDER BY substr; -@end example - -⤷򤷤ʤ硢եɤκǽ @code{max_sort_length} ХȤ -Ȼ˻Ѥޤ @code{max_sort_length} Υǥեͤ 1024; -ͤ @code{mysqld} Сư @code{-O} ץѤ뤳Ȥ -ѹǤޤ -եɤΰ֤ꤹ뤳ȤˤäƤꥢѤ뤳Ȥˤäơ - @code{BLOB} @code{TEXT} ͤ group Ǥޤ - -@example -mysql> select id,substring(blob_col,1,100) from tbl_name - GROUP BY 2; -mysql> select id,substring(blob_col,1,100) as b from tbl_name - GROUP BY b; -@end example - -@item -@code{BLOB} ޤ @code{TEXT} ֥ȤκĹϤηˤꤵޤ -ʤ饤ȤȥФδ֤Ǽºݤ뤳ȤǤϺĹϡ -Ѳǽʥ̤ȥߥ˥ХåեΥˤäƷꤵޤ -åХåեѤ뤳ȤǤޤξ硢Сȥ饤ȡ -ξѹʤФʤޤ@xref{Server parameters}. -@end itemize - -줾 @code{BLOB}, @code{TEXT} եɤϡդΥȤ줿֥Ȥˤäơ -Ǥɽ뤳ȤդƤ. -ϥơ֥뤬Ȥ˰٤Ȥ¾ΥեɤȤоŪǤ - -@tindex ENUM -@node ENUM, SET, BLOB, String types -@subsubsection @code{ENUM} - -@code{ENUM} ϥȥ󥰥֥Ȥǡ -ͤϡ̾ơ֥Υե󤵤줿ͤ椫Фޤ - -ͤϤǤ ʸ (@code{""}) @code{NULL} 뤳Ȥޤ - -@itemize @bullet -@item -⤷ @code{ENUM} ̵ (󤵤Ƥͤ˴ޤޤʤʸ) -硢 Υ顼ˤʤʸ˶ʸޤ - -@item -⤷ @code{ENUM} @code{NULL} 줿, @code{NULL} ϤΥեɤ -ĤͤȤʤꡢǥեͤ @code{NULL} ˤʤޤ - ⤷ @code{ENUM} @code{NOT NULL} 줿ʤС ǥեͤϡ -ꥹȤκǽͤˤʤޤ -@end itemize - -󤵤줿줾ͤϥǥåޤ - -@itemize @bullet -@item -ꥹȤǤ 1 ֤ޤ - -@item -ʸ顼Υǥåͤ 0 - @code{ENUM} ͤͿƤ쥳ɤ򸫤Ĥ뤿 -ʲΤ褦 @code{SELECT} ʸѤǤ뤳Ȥ̣ޤ - -@example -mysql> SELECT * FROM tbl_name WHERE enum_col=0; -@end example - -@item -@code{NULL} Υǥåͤ @code{NULL}. -@end itemize - -ȤСեɤ @code{ENUM("one", "two", "three")} 줿ʤ顢 -ʲ˼ͤȤޤ 줾Υǥåͤ⼨ޤ - -@multitable @columnfractions .2 .8 -@item @strong{} @tab @strong{ǥå} -@item @code{NULL} @tab @code{NULL} -@item @code{""} @tab 0 -@item @code{"one"} @tab 1 -@item @code{"two"} @tab 2 -@item @code{"three"} @tab 3 -@end multitable - -Ϻ 65535 ĤǤޤDzǽǤ - -@code{ENUM} եɤͤͿʸʸ̵طǤ -ǥեɤ鸡ͤϡʸʸޤ -ϥơ֥Ϳ줿ꥹȤͤǤ - -⤷ @code{ENUM} ͤʸ̮Ǹ硢ΥС -ν֤֤ͤäƤޤ -⤷ @code{ENUM} ˿ͤ褦Ȥ硢οͤΰ֤ˤ -Сޤ -( @code{LOAD DATA} ǤƯޤ󡣤Ϥ٤ƤϤʸ -Ȥưޤ) - -@code{ENUM} ͤФեɻ˥ꥹȤ줿˽äƥȤ -ޤ -(Ĥޤꡢ@code{ENUM} ͤϥǥåͤ˽äƥȤޤ) -㤨С@code{ENUM("a", "b")} ʤ @code{"a"} @code{"b"} ˥Ȥ졢 -@code{ENUM("b", "a")} ʤ @code{"b"} @code{"a"} ˥Ȥޤ -ʸ϶ǤϤʤʸ˥Ȥ졢 -@code{NULL} ¾¤Ӥޤ - -@code{ENUM} եɤǻǽͤΥꥹȤƼꤿʤС -Τ褦ˤޤ -@code{SHOW COLUMNS FROM table_name LIKE enum_column_name} -ܤΥեɤ @code{ENUM} ʬϤޤ - -@tindex SET -@node SET, , ENUM, String types -@subsubsection @code{SET} - -@code{SET} ʸ֥Ȥǥʾͻޤ -ơ֥ˤϡ줾ͤϥꥹȤФ٤Ǥ -@code{SET} Υեɤͤϡ(@samp{,}) -ڤ¤٤줿ʣΥСǹƤޤ -ϡ @code{SET} С˥ޤޤळȤʤ -ȤȤǤ - -㤨С -@code{SET("one", "two") NOT NULL} Ȼꤵ줿եɤϰʲͤȤޤ - -@example -"" -"one" -"two" -"one,two" -@end example - -@code{SET} Ϻ 64 ĤΰۤʤäСƤޤ - -@strong{MySQL} @code{SET} ͤͤȤޤ줿 -ͤκDz̤ΥӥåȤǽΥСбޤ⤷ @code{SET} ͤ -ͤʸ̮Ǹ硢ͤϥեɤͤбޤ -⤷С @code{SET} եɤ줿硢 -ʿɽͤСοͤȤƷꤵޤ -@code{SET("a","b","c","d")} ȥեɤ줿Ȥޤ -СϰʲΣʿͤޤ - -@multitable @columnfractions .2 .2 .6 -@item @code{SET} @strong{member} @tab @strong{10ʿ} @tab @strong{ʿ} -@item @code{a} @tab @code{1} @tab @code{0001} -@item @code{b} @tab @code{2} @tab @code{0010} -@item @code{c} @tab @code{4} @tab @code{0100} -@item @code{d} @tab @code{8} @tab @code{1000} -@end multitable - -⤷Υեɤ @code{9} Ϳ硢ϣʿ @code{1001} Ǥ顢 -1 ܤ 4 ܤ @code{SET} СǤ @code{"a"} @code{"d"} -򤵤졢̡ @code{"a,d"} Ȥʤޤ - -1İʾ @code{SET} ǤޤͤˤƤ,ʤͤȤ,Ǥɤ -ǵܤƤΤϽפǤϤޤ. ޤ,ǤͿ줿Τ -פǤϤޤ. ͤȤ, ͤΤ줾Ǥ -ɽޤΤȤơ֥Ϳ줿Ǥ¤Ӥޤ -㤨Сեɤ @code{SET("a","b","c","d")} ꤵƤʤ顢 -@code{"a,d"}, @code{"d,a"}, @code{"d,a,a,d,d"} ϸ @code{"a,d"} -ʤޤ - -@code{SET} ͤϿͤȤޤ -@code{NULL} ͤ @code{NULL} @code{SET} ͤ˥Ȥޤ - -̾@code{LIKE} @code{FIND_IN_SET()} Ѥ @code{SET} ե - @code{SELECT} Ԥޤ - -@example -mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%'; -mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0; -@end example - -ʲưޤ - -@example -mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2'; -mysql> SELECT * FROM tbl_name WHERE set_col & 1; -@end example - -ǽʸϴפΤõޤ -ܤܤΥСޤͤõޤ - -⤷ @code{SET} եɤǽʤ٤ƤΥСΤꤿ硧 - @code{SHOW COLUMNS FROM table_name LIKE set_column_name} Ȥ -ܤˤ蘆 @code{SET} ʬϤޤ - -@cindex Types, choosing -@cindex Choosing types -@node Choosing types, Indexes, String types, Column types -@subsection եɷ - -äȤΨ褯ǼˤϡƤˤưΤʷѤ뤳ȤǤ -㤨С@code{1}-@code{99999} -ˤϡ@code{MEDIUMINT UNSIGNED} ɤηǤ - -ɤϡʾͤΤɽǤ@strong{MySQL} Ǥ -@code{DECIMAL} Ѥ٤ǤʸȤƳǼΤΥ -ȯޤΤפǤʤ @code{DOUBLE} Ǥ⽽ʬɤ -Ǥ - -٤Τᡢ @code{BITINT} ˳Ǽ꾮ѴǤޤ -ϡƤη׻ǹԤʤ褦ˤ̤ưѴ -ᤷޤ - -@cindex Indexes -@cindex Keys -@node Indexes, Multiple-column indexes, Choosing types, Column types -@subsection եɥǥå - -@strong{MySQL} ƤΥեɤϥǥåĤȤǤޤ -ŬڤʥեɤǤΥǥåλѤϡ@code{SELECT} -ǽ夹ɤˡǤ - -ĤΥơ֥ˤϺ16ĤΥǥåޤ -ǥåκĹ256ХȤǡ - @strong{MySQL} ѥѹǤޤ - -@code{CHAR} @code{VARCHAR} եɤˤƬ˥ǥåĤȤǤޤ -եΤ򥤥ǥåꡢ -ϤϤ뤫᤯ʤǥ̤ǤǤޤ - -@code{CREATE TABLE} ʸǥեɤ˥ǥåˤϡ -ʲΤ褦ˤޤ - -@example -KEY index_name (col_name(length)) -@end example - -ʲ @code{name} եɤκǽ10ʸ˥ǥåϤФޤ: - -@example -mysql> CREATE TABLE test ( - name CHAR(200) NOT NULL, - KEY index_name (name(10))); -@end example - - @code{BLOB} @code{TEXT} եɤǤϡΥեɤƬʬ -ǥåĥʤƤϤʤޤ եɤΤ˥ǥåĥޤ - - -@node Multiple-column indexes, Other-vendor column types, Indexes, Column types -@subsection ʣեɥǥå - -@strong{MySQL} ϰۤʤեɤΥåȤ˰ĤΥǥåĤȤǤޤ -ǥåϺ15ĤΥޤǵޤ -(@code{CHAR} @code{VARCHAR} եɤƬ򥤥ǥåȤƻѤǤޤ) - -ʣեɥǥåϡ -Ȥ줿(ǥå줿եɤͤ礵Ƥ) -򰷤ȤǤޤ - -ǥå줿ФơΤͤ @code{WHERE} ǻꤷ -Ȥ¾ΥեɤͤꤷʤȤ⡢ -@strong{MySQL} ʣեɥǥåѤޤ - -ʲΥơ֥뤬ȲꤷƤ - -@example -mysql> CREATE TABLE test ( - id INT NOT NULL, - last_name CHAR(30) NOT NULL, - first_name CHAR(30) NOT NULL, - PRIMARY KEY (id), - INDEX name (last_name,first_name)); -@end example - -@code{name} ǥåϡ@code{last_name} @code{first_name} ˤޤ륤ǥåǤ -Υǥåϡ@code{last_name} Ф륯䡢 -@code{name} ǥåϰʲΥǻȤޤ - -@example -mysql> SELECT * FROM test WHERE last_name="Widenius"; - -mysql> SELECT * FROM test WHERE last_name="Widenius" - AND first_name="Michael"; - -mysql> SELECT * FROM test WHERE last_name="Widenius" - AND (first_name="Michael" OR first_name="Monty"); - -mysql> SELECT * FROM test WHERE last_name="Widenius" - AND first_name >="M" AND first_name < "N"; -@end example - - @code{name} ǥåϰʲΥǤϻѤޤ: - -@example -mysql> SELECT * FROM test WHERE first_name="Michael"; - -mysql> SELECT * FROM test WHERE last_name="Widenius" -OR first_name="Michael"; -@end example - -@strong{MySQL} ǽ夲뤿ˤɤǥåѤƤ뤫 -ܤϤ顧 @ref{MySQL indexes, , @strong{MySQL} indexes}. - - -@cindex Type portability -@node Other-vendor column types, , Multiple-column indexes, Column types -@subsection ¾Υǡ١󥸥Υեɷλ - -ۤΥ٥SQLñ˽񤱤褦ˡ @strong{MySQL} ϰʲɽ -᤹եɷ򥵥ݡȤޤϡơ֥ -¾Υǡ١󥸥󤫤 @strong{MySQL} ˴ñ˰ܹԤƤޤ - -@multitable @columnfractions .4 .6 -@item @strong{Other vendor type} @tab @strong{MySQL type} -@item @code{BINARY(NUM)} @tab @code{CHAR(NUM) BINARY} -@item @code{CHAR VARYING(NUM)} @tab @code{VARCHAR(NUM)} -@item @code{FLOAT4} @tab @code{FLOAT} -@item @code{FLOAT8} @tab @code{DOUBLE} -@item @code{INT1} @tab @code{TINYINT} -@item @code{INT2} @tab @code{SMALLINT} -@item @code{INT3} @tab @code{MEDIUMINT} -@item @code{INT4} @tab @code{INT} -@item @code{INT8} @tab @code{BIGINT} -@item @code{LONG VARBINARY} @tab @code{MEDIUMBLOB} -@item @code{LONG VARCHAR} @tab @code{MEDIUMTEXT} -@item @code{MIDDLEINT} @tab @code{MEDIUMINT} -@item @code{VARBINARY(NUM)} @tab @code{VARCHAR(NUM) BINARY} -@end multitable - -⤷¾Υ٥ηѤƥơ֥Ȥȡ -ơ֥ΥեɤηΥޥåԥ󥰤ȯ -@code{DESCRIBE tbl_name} ʸȯԤޤ - @strong{MySQL} ϡѤ줿 @strong{MySQL} ηѤ -ơ֥Ȥ𤲤ޤ - -@cindex Functions for @code{SELECT} and @code{WHERE} clauses -@node Functions, CREATE DATABASE, Column types, Reference -@section @code{SELECT} @code{WHERE} ǻѤؿ - -SQL ơȥ @code{select_expression} ޤ -@code{where_definition} ϸҤδؿѤǤդμʤޤ - -黻ȴؿ򼰤ǸƤֻܥɥȤ˼ƤΰʳΡ -@code{NULL} ޤ༰Ͼ @code{NULL} ͤޤ - -@strong{:} ؿ̾Ȥ³δ֤ˤϡϤޤ -ϴؿθƤӽФȡؿƱ̾Υơ֥(ե)λȤ - @strong{MySQL} ѡ̤Τޤ - -@need 2000 -Ǥϡ@code{mysql} ץνϤûʤäƤޤĤޤ: - -@example -mysql> select MOD(29,9); -1 rows in set (0.00 sec) - -+-----------+ -| mod(29,9) | -+-----------+ -| 2 | -+-----------+ -@end example - -ϼѴƤޤ: - -@example -mysql> select MOD(29,9); - -> 2 -@end example - -@menu -* Grouping functions:: Grouping functions -* Arithmetic functions:: Normal arithmetic operations -* Bit functions:: Bit functions -* Logical functions:: Logical operations -* Comparison functions:: Comparison operators -* String comparison functions:: String comparison functions -* Control flow functions:: Control flow functions -* Casts:: Cast operators -* Mathematical functions:: Mathematical functions -* String functions:: String functions -* Date and time functions:: Date and time functions -* Miscellaneous functions:: Miscellaneous functions -* Group by functions:: Functions for @code{GROUP BY} clause -@end menu - -@node Grouping functions, Arithmetic functions, Functions, Functions -@subsection 롼ײؿ -@cindex Grouping of expressions -@table @code - -@findex () (parentheses) -@findex parentheses ( and ) -@item ( ... ) -ݤä ɾͥ٤뤿˻Ѥޤ -@example -mysql> select 1+2*3; - -> 7 -mysql> select (1+2)*3; - -> 9 -@end example -@end table - -@node Arithmetic functions, Bit functions, Grouping functions, Functions -@subsection ̾λѱ黻 - -̤λѱ黻ͭǤ -@code{-}, @code{+}, @code{*} ϡĤΰʤ - @code{BIGINT} (64bit) Ƿ׻뤳ȤդƤ - -@cindex Arithmetic expressions -@table @code -@findex + (addition) -@findex addition (+) -@item + -­ -@example -mysql> select 3+5; - -> 8 -@end example - -@findex - (subtraction) -@findex subtraction (-) -@item - - -@example -mysql> select 3-5; - -> -2 -@end example - -@findex * (multiplication) -@findex multiplication (*) -@item * -ݤ -@example -mysql> select 3*5; - -> 15 -mysql> select 18014398509481984*18014398509481984.0; - -> 324518553658426726783156020576256.0 -mysql> select 18014398509481984*18014398509481984; - -> 0 -@end example - -Ǹμη̤Ǥʤʤ̤ 64 ӥåȤĶǤ - -@findex / (division) -@findex division (/) -@item / -껻 -@example -mysql> select 3/5; - -> 0.60 -@end example - -0 dzä硢@code{NULL} ˤʤޤ - -@example -mysql> select 102/(1-1); - -> NULL -@end example - -黻̤ˤʤˤ @code{BIGINT} ѤƳ껻Ϸ׻ޤ -@end table - -@findex Arithmetic functions -@findex Bit functions -@findex Functions, arithmetic -@findex Functions, bit -@node Bit functions, Logical functions, Arithmetic functions, Functions -@subsection ӥåȴؿ - -Ϻ 64 ӥåȤϰϤޤ@strong{MySQL} @code{BIGINT} (64-bit) 黻Ѥ뤿Ǥ - -@table @code -@findex | (bitwise OR) -@findex OR, bitwise -@item | -ӥåȱ黻 OR -@example -mysql> select 29 | 15; - -> 31 -@end example - -@findex & (bitwise AND) -@findex AND, bitwise -@item & -ӥåȱ黻 AND -@example -mysql> select 29 & 15; - -> 13 -@end example - -@findex << (left shift) -@item << - longlong (@code{BIGINT}) number ʬӥåȤ򥷥եȤޤ -@example -mysql> select 1 << 2 - -> 4 -@end example - -@findex >> (right shift) -@item >> - longlong (@code{BIGINT}) number ʬӥåȤ򥷥եȤޤ -@example -mysql> select 4 >> 2 - -> 1 -@end example - -@findex ~ -@item ~ -Invert all bits. -@example -mysql> select 5 & ~1 - -> 4 -@end example - -@findex BIT_COUNT() -@item BIT_COUNT(N) - @code{N} ĥӥåȤäƤ뤫(ʿɽȤΣο) -@example -mysql> select BIT_COUNT(29); - -> 4 -@end example -@end table - -@findex Logical functions -@node Logical functions, Comparison functions, Bit functions, Functions -@subsection 黻 - -Ƥؿ @code{1} (TRUE) or @code{0} (FALSE) ֤ޤ - -@table @code -@findex NOT, logical -@findex ! (logical NOT) -@item NOT -@itemx ! -ꡣ @code{0} ʤ @code{1} ֤Ǥʤ @code{0} ֤ޤ -㳰: @code{NOT NULL} @code{NULL} ֤ޤ. -@example -mysql> select NOT 1; - -> 0 -mysql> select NOT NULL; - -> NULL -mysql> select ! (1+1); - -> 0 -mysql> select ! 1+1; - -> 1 -@end example -Ǹ @code{1} ֤ޤʤʤ顢ɾ - @code{(!1)+1} ƱǤ - -@findex OR, logical -@findex || (logical OR) -@item OR -@itemx || -¡Τɤ줫 @code{0} ޤ @code{NULL} Ǥʤ @code{1} ֤ޤ -@example -mysql> select 1 || 0; - -> 1 -mysql> select 0 || 0; - -> 0 -mysql> select 1 || NULL; - -> 1 - -@end example - -@findex AND, logical -@findex && (logical AND) -@item AND -@itemx && -ѡƤΰ @code{0} ޤ @code{NULL} Ǥʤ @code{1} ֤ޤ -@example -mysql> select 1 && NULL; - -> 0 -mysql> select 1 && 0; - -> 0 -@end example -@end table - -@cindex Casts -@cindex Type conversions -@findex Comparison operators -@node Comparison functions, String comparison functions, Logical functions, Functions -@subsection ӱ黻 - -@code{1} (TRUE), @code{0} (FALSE) ޤ @code{NULL} ֤ޤ -δؿϿͤʸξƯޤ -ɬפʤСʸϼưŪ˿Ѵ졢ʸѴޤ -(PerlʤäƤߤ) - -@strong{MySQL} ϰʲε§ӤԤޤ - -@itemize @bullet -@item -ɤ餫ޤξΰ @code{NULL} ξϡӷ̤ @code{NULL} -Ǥ@code{<=>} 黻Ҥޤ - -@item -ξΰʸξ硢ʸȤӤޤ - -@item -ξΰξ硢ȤӤޤ - -@item -16ʿͤϡ⤷ͤӤʤΤǤСʸȤưޤ - -@item -@cindex ODBC compatibility -@cindex Compatibility, with ODBC -ΰ @code{TIMESTAMP} ޤ @code{DATETIME} եɤǡ¾ΰ -ξϡ timestamp ѴޤϤ ODBC -եɥˤ뤿Ǥ - -@item -¾ξư(real)ȤӤޤ -@end itemize - -ʸӤϡ˰¸ɸΥ饯åȤ˽ä -Ԥޤ(ISO-8859-1 Latin1 ǥեȤǤ English Ǥ) - -ʲϡӤΤʸͤѴƤǤ - -@example -mysql> SELECT 1 > '6x'; - -> 0 -mysql> SELECT 7 > '6x'; - -> 1 -mysql> SELECT 0 > 'x6'; - -> 0 -mysql> SELECT 0 = 'x6'; - -> 1 -@end example - -@table @code -@findex = (equal) -@findex equal (=) -@item = - -@example -mysql> select 1 = 0; - -> 0 -mysql> select '0' = 0; - -> 1 -mysql> select '0.0' = 0; - -> 1 -mysql> select '0.01' = 0; - -> 0 -mysql> select '.01' = 0.01; - -> 1 -@end example - -@findex <> (not equal) -@findex not equal (<>) -@findex != (not equal) -@findex not equal (!=) -@item <> -@itemx != -ʤ -@example -mysql> select '.01' <> '0.01'; - -> 1 -mysql> select .01 <> '0.01'; - -> 0 -mysql> select 'zapp' <> 'zappp'; - -> 1 -@end example - -@findex <= (less than or equal) -@findex less than or equal (<=) -@item <= -꾮 -@example -mysql> select 0.1 <= 2; - -> 1 -@end example - -@findex < (less than) -@findex less than (<) -@item < -꾮 -@example -mysql> select 2 <= 2; - -> 1 -@end example - -@findex >= (greater than or equal) -@findex greater than or equal (>=) -@item >= -礭 -@example -mysql> select 2 >= 2; - -> 1 -@end example - -@findex > (greater than) -@findex greater than (>) -@item > -礭 -@example -mysql> select 2 > 2; - -> 0 -@end example - -@findex <=> (Equal to) -@item <=> -(NULL ) -@example -mysql> select 1 <=> 1, NULL <=> NULL, 1 <=> NULL; - -> 1 1 0 -@end example - -@findex IS NULL -@findex IS NOT NULL -@item IS NULL -@itemx IS NOT NULL -ͤ @code{NULL} ȤǤ뤫ɤΥƥ -@example -mysql> select 1 IS NULL, 0 IS NULL, NULL IS NULL: - -> 0 0 1 -mysql> select 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; - -> 1 1 0 -@end example - -@findex BETWEEN ... AND -@item expr BETWEEN min AND max -⤷ @code{expr} @code{min} ʾ塢 @code{max} ʲʤ @code{1}֤ޤ -Ǥʤʤ @code{0} ֤ޤ - ƤΰƱʤС@code{(min <= expr AND expr <= max)} ƱǤ - ǽΰ (@code{expr}) ϤΤ褦ˡꤷޤ - -@itemize @bullet -@item -⤷ @code{exor} @code{TIMESTAMP}, @code{DATE}, @code{DATETIME} ե -ɤʤ顢ǾȺϤ餬ξƱեޥåȤˤʤޤ -@item -⤷ @code{expr} ʸʤ顢¸ӤԤޤ -@item -⤷ @code{expr} Хʥʸʤ顢¸ӤԤޤ -@item -⤷ @code{expr} ʤ顢ӤԤޤ -@item -¾ư(¿)Ӥޤ -@end itemize - -@example -mysql> select 1 BETWEEN 2 AND 3; - -> 0 -mysql> select 'b' BETWEEN 'a' AND 'c'; - -> 1 -mysql> select 2 BETWEEN 2 AND '3'; - -> 1 -mysql> select 2 BETWEEN 2 AND 'x-3'; - -> 0 -@end example - -@findex IN -@item expr IN (value,...) -⤷ @code{expr} @code{IN} ꥹȤˤͤΤɤ줫ʤС@code{1} ֤ޤ -Ǥʤ @code{0} ֤ޤ -⤷Ƥͤʤ顢٤Ƥͤ @code{expr} η˽äɾ졢 -ȤޤθˤϥХʥꥵѤޤ - @code{IN} ꥹȤͿ硢@code{IN} ®ʤ뤳Ȥ̣ޤ -⤷ @code{expr} ¸ʸʤ顢¸ΤӤޤ -@example -mysql> select 2 IN (0,3,5,'wefwf'); - -> 0 -mysql> select 'wefwf' IN (0,3,5,'wefwf'); - -> 1 -@end example - -@findex NOT IN -@item expr NOT IN (value,...) -@code{NOT (expr IN (value,...))} Ʊ - -@findex ISNULL() -@item ISNULL(expr) -@code{expr} @code{NULL} ʤ @code{1} 򡢤Ǥʤ @code{0} ֤ޤ -@example -mysql> select ISNULL(1+1); - -> 0 -mysql> select ISNULL(1/0); - -> 1 -@end example - -@code{NULL} ͤ @code{=} ѤӤϾ˵(false) Ȥʤ뤳Ȥ -դƤ - -@findex COALESCE() -@item COALESCE(list) -list Ρǽ˸줿 -@code{NULL} Ǥ֤ޤ - -@example -mysql> select COALESCE(NULL,1); - -> 1 -mysql> select COALESCE(NULL,NULL,NULL); - -> NULL -@end example - -@findex INTERVAL() -@item INTERVAL(N,N1,N2,N3,...) -⤷ @code{N} < @code{N1} ʤ @code{0} ֤ޤ -⤷ @code{N} < @code{N2} ʤ @code{1} ֤ޤ -ƤΰȤưޤ - @code{N1} < @code{N2} < @code{N3} < @code{...} < @code{Nn}ư뤿 -ɬפʤȤǤϥХʥ긡Ѥޤ(®Ǥ) - -@example -mysql> select INTERVAL(23, 1, 15, 17, 30, 44, 200); - -> 3 -mysql> select INTERVAL(10, 1, 10, 100, 1000); - -> 2 -mysql> select INTERVAL(22, 23, 30, 44, 200); - -> 0 -@end example -@end table - -@findex String comparison functions -@findex Functions, string comparison -@node String comparison functions, Casts, Comparison functions, Functions -@subsection ʸӴؿ - -@cindex Case sensitivity, in string comparisons -@cindex String comparisons, case sensitivity -̾Ӥɽ¸Ǥʤ硢Ӥϥ¸ǹԤޤ - -@table @code -@findex LIKE -@item expr LIKE pat [ESCAPE 'escape-char'] -SQL δñɽӤǤ@code{1} (TRUE) ޤ @code{0} (FALSE) ֤ޤ -@code{LIKE} ˤ2ĤΥ磻ɥɤޤ: - -@multitable @columnfractions .1 .9 -@item @code{%} @tab Ǥդοʸ(0ʸޤ)Ŭ礷ޤ -@item @code{_} @tab ̩1ĤʸŬ礷ޤ -@end multitable - -@example -mysql> select 'David!' LIKE 'David_'; - -> 1 -mysql> select 'David!' LIKE '%D%v%'; - -> 1 -@end example - -磻ɥʸΥƥȤ򤹤뤿ˤϡʸԤƤʤä - -@code{ESCAPE} ꤷʤϡʸ @code{'\'} Ȥޤ: - -@multitable @columnfractions .1 .9 -@item @code{\%} @tab 1Ĥ @code{%} Ŭ礷ޤ -@item @code{\_} @tab 1Ĥ @code{_} Ŭ礷ޤ -@end multitable - -@example -mysql> select 'David!' LIKE 'David\_'; - -> 0 -mysql> select 'David_' LIKE 'David\_'; - -> 1 -@end example - -㤦ʸꤹˤϡ @code{ESCAPE} Ѥޤ: - -@example -mysql> select 'David_' LIKE 'David|_' ESCAPE '|'; - -> 1 -@end example - -@code{LIKE} ϿɽǤޤ -( @strong{MySQL} ΡANSI SQL @code{LIKE} ФĥǤ) - -ա @strong{MySQL} ʸ C ΥʸѤƤΤ(e.g., -@samp{\n}), @code{LIKE} λʸȤƻѤˤ @samp{\} -ܤʤƤϤʤޤ 㤨С @samp{\n} õˤϡ@samp{\\n} -Ҥޤ @samp{\} õˤϡ @samp{\\\\} (Хååϡ -Ĥϥѡ˼졢ѥޥåԤݤˤ⤦ҤȤ -졢פõ˻ĤäĤΥХåå夬Ѥޤ) - -@findex NOT LIKE -@item expr NOT LIKE pat [ESCAPE 'escape-char'] -@code{NOT (expr LIKE pat [ESCAPE 'escape-char'])} Ʊ - -@example -mysql> select 10 LIKE '1%'; - -> 1 -@end example - -@cindex mSQL compatibility -@cindex Compatibility, with mSQL -@findex REGEXP -@findex RLIKE -@item expr REGEXP pat -@itemx expr RLIKE pat -ѥ @code{pat} Фʸ @code{expr} ΥѥޥåԤޤ -ѥ @code{pat} ɽγĥѤǤޤ@xref{Regexp}. -⤷ @code{expr} @code{pat} ˥ޥåʤ @code{1} ֤ -Ǥʤ @code{0} ֤ޤ -@code{RLIKE} @code{REGEXP} Ʊǡ@code{mSQL} ߴ󶡤ޤ -: @strong{MySQL} C ׹ʸʸ˻ѤƤ(@code{\n}) - @code{REGEXP} ǻѤ @code{'\'} ʸϤ٤ơŤ˽񤫤ʤ -ʤޤ -@code{MySQL} 3.23.4 @code{REGEXP} ϡ̤ʸ (not binary) ϥ¸Ǥ - -@example -mysql> select 'Monty!' REGEXP 'm%y%%'; - -> 0 -mysql> select 'Monty!' REGEXP '.*'; - -> 1 -mysql> select 'new*\n*line' REGEXP 'new\\*.\\*line'; - -> 1 -mysql> select "a" REGEXP "A", "a" REGEXP BINARY "A"; - -> 1 0 -@end example - -@item -@code{REGEXP} and @code{RLIKE} ϡʸηꤹ硢 -ȤΥ饯åȤѤޤ -(ISO-8859-1 Latin1 ǥե) - -@findex NOT REGEXP -@item expr NOT REGEXP pat -@itemx expr NOT RLIKE pat -@code{NOT (expr REGEXP pat)} Ʊ. - -@findex STRCMP() -@item STRCMP(expr1,expr2) -ʸƱʤ @code{0} ֤ޤǤʤСǽΰȽǾ - @code{-1} ֤ޤǤʤ @code{1} ֤ޤ - -@example -mysql> select STRCMP('text', 'text2'); - -> -1 -mysql> select STRCMP('text2', 'text'); - -> 1 -mysql> select STRCMP('text', 'text'); - -> 0 -@end example -@end table - -@findex Casts -@node Casts, Control flow functions, String comparison functions, Functions -@subsection Cast operators - -@table @code -@findex BINARY -@item @code{BINARY} -@code{BINARY} 黻Ҥϡʹߤ³ʸХʥ˥㥹Ȥޤ -ϤȤեɤ @code{BINARY} @code{BLOB} ǤʤƤ⡢ -¸ǥեɤӤ뤳ȤñˡǤ -@example -mysql> select "a" = "A"; - -> 1 -mysql> select BINARY "a" = "A"; - -> 0 -@end example - -@code{BINARY} @strong{MySQL} 3.23.0 о줷ޤ -@end table - -@findex Control flow functions -@findex Functions, control flow -@node Control flow functions, Mathematical functions, Casts, Functions -@subsection եؿ - -@table @code -@findex IFNULL() -@item IFNULL(expr1,expr2) -@code{expr1} @code{NULL} Ǥʤ @code{expr1} 򡢤Ǥʤ -@code{expr2} ֤ޤ -@code{IFNULL()} Ϥɤʸ̮ǻѤ줿ˤͤʸ֤ޤ -@example -mysql> select IFNULL(1,0); - -> 1 -mysql> select IFNULL(0,10); - -> 0 -mysql> select IFNULL(1/0,10); - -> 10 -mysql> select IFNULL(1/0,'yes'); - -> 'yes' -@end example - -@findex NULLIF() -@item NULLIF(expr1,expr2) -@code{expr1 = expr2} ʤ顢@code{expr1} ֤Ǥʤ -@code{NULL} ֤ޤ -@example -mysql> select NULLIF(1,1); - -> 1 -mysql> select NULLIF(1,2); - -> NULL -@end example - -: 硢@code{expr1} @strong{MySQL} Ǥ2ɾޤ - -@findex IF() -@item IF(expr1,expr2,expr3) -@code{expr1} (@code{expr1 <> 0} and @code{expr1 <> NULL}) ξ - @code{expr2} ֤Ǥʤ @code{expr3} ֤ޤ -@code{IF()} Ϥɤʸ̮ǻѤ줿ˤͤʸ֤ޤ - -@example -mysql> select IF(1>2,2,3); - -> 3 -mysql> select IF(1<2,'yes','no'); - -> 'yes' -mysql> select IF(strcmp('test','test1'),'no','yes'); - -> 'no' -@end example - -@code{expr1} @code{INTEGER} ȤɾޤưѤ硢 -ӱ黻Ѥ٤Ǥ뤳Ȥ̣ޤ - -@example -mysql> select IF(0.1,1,0); - -> 0 -mysql> select IF(0.1<>0,1,0); - -> 1 -@end example - -κǽǤϡ @code{IF(0.1)} @code{0} ֤ޤʤʤ @code{0.1} -ͤȤѴ @code{IF(0)} ˤʤꡢȤˤƥȷ̤ -֤뤫Ǥ ϤʤδԤźʤ⤷ޤ - ܤξ硢 Ӥϡưͤ󥼥ɤƥȤޤ -ӷ̤ȤƻѤޤ - -@code{IF()} ΥǥեȤͷ(ơ֥˳ǼȤʤ -ޤ) @strong{MySQL} 3.23 ǤϼΤ褦˷׻ޤ: - -@multitable @columnfractions .7 .3 -@item expr2 ޤ expr3 ʸ֤ @tab ʸ -@item expr2 ޤ expr3 ư֤ͤ @tab ư -@item expr2 ޤ expr3 ֤ @tab -@end multitable - -@findex CASE -@item CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END -@item CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END - -ǽμ @code{value=compare-value} ʤ @code{result} ֤ޤ -ܤμǤϡǽξ[condition] ʤС @code{result} ֤ޤ -⤷ޥå result ͤʤС @code{ELSE} ʲ result ֤ޤ -⤷ @code{ELSE} ʬʤС @code{NULL} ֤ޤ - -@example -mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END; - -> "one" -mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END; - -> "true" -mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END; - -> NULL -@end example -@end table - -@findex Mathematical functions -@findex Functions, mathematical -@node Mathematical functions, String functions, Control flow functions, Functions -@subsection شؿ -٤Ƥοشؿϥ顼ξ @code{NULL} ֤ޤ - -@table @code -@findex - (unary minus) -@findex minus, unary (-) -@findex unary minus (-) -@item - -档ѹޤ -@example -mysql> select - 2; - -> -2 -@end example - -Υڥ졼 @code{BIGINT} ȤȤ˻Ѥ줿硢 -֤ͤ @code{BIGINT} Ǥ뤳ȤդƤ! @code{-2^63} ͤ -Ĥ⤷ʤ @code{-} ǻѤƤϤʤʤȤ̣ޤ - -@findex ABS() -@item ABS(X) -Returns the absolute value of @code{X}. -@example -mysql> select ABS(2); - -> 2 -mysql> select ABS(-32); - -> 32 -@end example - -δؿ @code{BIGINT} ͤȤȤ˻ѤȰǤ - -@findex SIGN() -@item SIGN(X) -@code{X} ˤäơ @code{-1}, @code{0} or @code{1} -֤ޤ -@example -mysql> select SIGN(-32); - -> -1 -mysql> select SIGN(0); - -> 0 -mysql> select SIGN(234); - -> 1 -@end example - -@findex MOD() -@findex % (modulo) -@findex modulo (%) -@item MOD(N,M) -@itemx % -; ( C @code{%} 黻ҤΤ褦 ). -@code{N} @code{M} dzäȤ;꤬֤ޤ -@example -mysql> select MOD(234, 10); - -> 4 -mysql> select 253 % 7; - -> 1 -mysql> select MOD(29,9); - -> 2 -@end example - -δؿ @code{BIGINT} ͤǤ˻ѤǤޤ - -@findex FLOOR() -@item FLOOR(X) -@code{X} 礭ʤʤΤ֤ͤޤ. -@example -mysql> select FLOOR(1.23); - -> 1 -mysql> select FLOOR(-1.23); - -> -2 -@end example - -֤ͤ @code{BIGINT} ѴƤ뤳Ȥ! - -@findex CEILING() -@item CEILING(X) -@code{X} 꾮ʤʤΤǾ֤ͤޤ. -@example -mysql> select CEILING(1.23); - -> 2 -mysql> select CEILING(-1.23); - -> -1 -@end example - -֤ͤ @code{BIGINT} ѴƤ뤳Ȥ! - -@findex ROUND() -@item ROUND(X) -@code{X} ˴ݤ᤿(ͼθ)֤ޤ -@example -mysql> select ROUND(-1.23); - -> -1 -mysql> select ROUND(-1.58); - -> -2 -mysql> select ROUND(1.58); - -> 2 -@end example - -֤ͤ @code{BIGINT} ѴƤ뤳Ȥ! - -@findex ROUND() -@item ROUND(X,D) -@code{X} @code{D} ǻꤷ˴ݤ᤿(ͼθ)֤ޤ -⤷ @code{D} @code{0} ʤ, ̤Ͼ̵ˤʤ뤫 -ʬˤʤǤ礦 -@example -mysql> select ROUND(1.298, 0); - -> 1 -@end example - -@findex EXP() -@item EXP(X) -ؿؿ : @code{e} (п) @code{X} 衣 -@example -mysql> select EXP(2); - -> 7.389056 -mysql> select EXP(-2); - -> 0.135335 -@end example -@findex LOG() -@item LOG(X) -п @code{X} -@example -mysql> select LOG(2); - -> 0.693147 -mysql> select LOG(-2); - -> NULL -@end example -If you want the log of a number @code{X} to some arbitary base @code{B}, use -the formula @code{LOG(X)/LOG(B)}. - -@findex LOG10() -@item LOG10(X) -п(10Ȥп) @code{X} -@example -mysql> select LOG10(2); - -> 0.301030 -mysql> select LOG10(100); - -> 2.000000 -mysql> select LOG10(-100); - -> NULL -@end example - -@findex POW() -@findex POWER() -@item POW(X,Y) -@itemx POWER(X,Y) -@code{X} @code{Y} 衣 -@example -mysql> select POW(2,2); - -> 4.000000 -mysql> select POW(2,-2); - -> 0.250000 -@end example - -@findex SQRT() -@item SQRT(X) -@code{X} ʿ֤ޤ -@example -mysql> select SQRT(4); - -> 2.000000 -mysql> select SQRT(20); - -> 4.472136 -@end example - -@findex PI() -@item PI() - -@example -mysql> select PI(); - -> 3.141593 -@end example - -@findex COS() -@item COS(X) - @code{X}@code{X} ϥ饸 -@example -mysql> select COS(PI()); - -> -1.000000 -@end example - -@findex SIN() -@item SIN(X) - @code{X}@code{X} ϥ饸 -@example -mysql> select SIN(PI()); - -> 0.000000 -@end example - -@findex TAN() -@item TAN(X) -󥸥 @code{X}@code{X} ϥ饸 -@example -mysql> select TAN(PI()+1); - -> 1.557408 -@end example - -@findex ACOS() -@item ACOS(X) -@code{X} Υ֤ޤϥ @code{X} Ǥͤ -@code{X} @code{-1} @code{1} ϰϤˤʤ @code{NULL} -֤ޤ -@example -mysql> select ACOS(1); - -> 0.000000 -mysql> select ACOS(1.0001); - -> NULL -mysql> select ACOS(0); - -> 1.570796 -@end example - -@findex ASIN() -@item ASIN(X) -@code{X} Υ֤ޤϥ @code{X} ǤͤǤ -@code{X} @code{-1} @code{1} ϰϤˤʤ @code{NULL} ֤ -ޤ -@example -mysql> select ASIN(0.2); - -> 0.201358 -mysql> select ASIN('foo'); - -> 0.000000 -@end example - -@findex ATAN() -@item ATAN(X) -@code{X} Υ󥸥Ȥ֤ޤϥ󥸥Ȥ @code{X} -ͤǤ -@example -mysql> select ATAN(2); - -> 1.107149 -mysql> select ATAN(-2); - -> -1.107149 -@end example - -@findex ATAN2() -@item ATAN2(X,Y) -Ĥѿ @code{X} @code{Y} Υ󥸥Ȥ֤ޤξΰ -椬̤ξݸ¤ꤹ뤿˻Ѥ뤳Ȥơ@code{Y / X} -󥸥Ȥη׻ƱͤǤ -@example -mysql> select ATAN(-2,2); - -> -0.785398 -mysql> select ATAN(PI(),0); - -> 1.570796 -@end example - -@findex COT() -@item COT(X) -@code{X} Υ󥸥Ȥ֤ޤ -@example -mysql> select COT(12); - -> -1.57267341 -mysql> select COT(0); - -> NULL -@end example - -@findex RAND() -@item RAND() -@itemx RAND(N) -@code{0} @code{1.0} ֤Υư֤ͤޤ -⤷ @code{N} Ϳ硢ɤȤƤͤѤޤ -@example -mysql> select RAND(); - -> 0.5925 -mysql> select RAND(20); - -> 0.1811 -mysql> select RAND(20); - -> 0.1811 -mysql> select RAND(); - -> 0.2079 -mysql> select RAND(); - -> 0.7888 -@end example -@code{RAND()} ͤĥեɤ @code{ORDER BY} ǻѤǤޤ -@code{ORDER BY} ϥեɤʣɾ뤿Ǥ - - @strong{MySQL} 3.23 Ǥ, ǽǤ: -@code{SELECT * FROM table_name ORDER BY RAND()} - - @code{SELECT * FROM table1,table2 WHERE a=b AND c select LEAST(2,0); - -> 0 -mysql> select LEAST(34.0,3.0,5.0,767.0); - -> 3.0 -mysql> select LEAST("B","A","C"); - -> "A" -@end example -3.22.5 @strong{MySQL} Ǥϡ@code{MIN()} @code{LEAST} ˻ѤǤޤ - -@findex GREATEST() -@item GREATEST(X,Y,...) -İʾΰꡢ桢֤ͤޤ - @code{LEAST} λƱ褦Ӥޤ - -@example -mysql> select GREATEST(2,0); - -> 2 -mysql> select GREATEST(34.0,3.0,5.0,767.0); - -> 767.0 -mysql> select GREATEST("B","A","C"); - -> "C" -@end example - -3.22.5 @strong{MySQL} Ǥϡ@code{MAX()} @code{GREATEST} ˻ѤǤޤ - -@findex DEGREES() -@item DEGREES(X) - @code{X} 饸󤫤٤Ѵ֤ޤ -@example -mysql> select DEGREES(PI()); - -> 180.000000 -@end example - -@findex RADIANS() -@item RADIANS(X) - @code{X} ٤饸Ѵ֤ޤ -@example -mysql> select RADIANS(90); - -> 1.570796 -@end example - -@findex TRUNCATE() -@item TRUNCATE(X,D) -ʲ @code{D} @code{X} ڤΤƤ֤ͤޤ -@code{D} @code{0} ξ硢̤Ͼޤ -@example -mysql> select TRUNCATE(1.223,1); - -> 1.2 -mysql> select TRUNCATE(1.999,1); - -> 1.9 -mysql> select TRUNCATE(1.999,0); - -> 1 -@end example -@end table - -@findex String functions -@findex Functions, string -@node String functions, Date and time functions, Mathematical functions, Functions -@subsection ʸؿ - -С¦Υѥ᥿ @code{max_allowed_packet} ̤Ĺ礭硢 -ʸؿ @code{NULL} ֤ޤ @xref{Server parameters}. - -ʸΰ֤򰷤ؿˤƤϡֺǽΰ֤Ͽ 1 Ǥ - -@table @code -@findex ASCII() -@item ASCII(str) -@code{str} κüʸ ASCII ֤ͤޤ -@code{str} ʸξ @code{0} ֤ޤ -@code{str} @code{NULL} ξ @code{NULL} ֤ޤ - -@example -mysql> select ASCII('2'); - -> 50 -mysql> select ASCII(2); - -> 50 -mysql> select ASCII('dx'); - -> 100 -@end example - -See also the @code{ORD()} function. - -@findex ORD() -@item ORD(str) -ʸ str κüʸޥХʸξ硢ʸASCII ͤ -η֤ȤˤꡢޥХʸΥɤ֤ޤ: -@code{((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]}. -üʸޥХʸǤʤϡ@code{ASCII()} ؿƱͤ -ޤ - -@example -mysql> select ORD('2'); - -> 50 -@end example - -@findex CONV() -@item CONV(N,from_base, to_base) -򡢿ʿΰ㤦Ѵޤ - @code{N} @code{from_base} ʿ @code{to_base} ʿ -ѴΡʸɽ֤ޤ -⤷ @code{NULL} ʤ @code{NULL} ֤ޤ - @code{N} ȤƲᤵޤʸǻꤷޤ -Ǿοʿ @code{2} ǡ @code{36} Ǥ -@code{to_base} ʤ顢@code{N} դοˤʤޤ -@code{CONV} 64-bit ٤ưޤ - -@example -mysql> select CONV("a",16,2); - -> '1010' -mysql> select CONV("6E",18,8); - -> '172' -mysql> select CONV(-17,10,-18); - -> '-H' -mysql> select CONV(10+"10"+'10'+0xa,10,10); - -> '40' -@end example - -@findex BIN() -@item BIN(N) -@code{N} ʿˤ֤ͤޤ@code{N} longlong ͤǤ - @code{CONV(N,10,2)} ƱǤ -@code{N} @code{NULL} ʤ @code{NULL} ֤ޤ. - -@example -mysql> select BIN(12); - -> '1100' -@end example - -@findex OCT() -@item OCT(N) -@code{N} 8ʿͤɽʸ֤ޤ@code{N} longlong ͤǤ - @code{CONV(N,10,8)} ƱǤ@code{N} @code{NULL} ξ -@code{NULL} ֤ޤ - -@example -mysql> select OCT(12); - -> '14' -@end example - -@findex HEX() -@item HEX(N) -@code{N} 16ʿͤɽʸ֤ޤ@code{N} -longlong(@code{BIGINT}) ͤǤ @code{CONV(N,10,16)} ƱǤ -@code{N} @code{NULL} ξ @code{NULL} ֤ޤ - -@example -mysql> select HEX(255); - -> 'FF' -@end example - -@findex CHAR() -@item CHAR(N,...) - ASCII ͤˤäͿ줿ʸʤʸ֤ޤ -@code{NULL} Фޤ - -@example -mysql> select CHAR(77,121,83,81,'76'); - -> 'MySQL' -mysql> select CHAR(77,77.3,'77.3'); - -> 'MMM' -@end example - -@findex CONCAT() -@item CONCAT(str1,str2,...) -礷̤֤ޤ @code{NULL} ʤ @code{NULL} ֤ޤ. -2İʾΰɬפȤޤ -ͤΰʸѴޤ -@example -mysql> select CONCAT('My', 'S', 'QL'); - -> 'MySQL' -mysql> select CONCAT('My', NULL, 'QL'); - -> NULL -mysql> select CONCAT(14.3); - -> '14.3' -@end example - -@findex CONCAT_WS() -@item CONCAT_WS(separator, str1, str2,...) - -@code{CONCAT_WS()} ϶ڤʸĤ CONCAT (CONCAT With Separator) ̣ -@code{CONCAT()} üʷǤǽΰϡĤΰζڤʸ -ǤڤʸϻĤΰƱ褦ʸǤڤʸ -@code{NULL} ξ硢̤ @code{NULL} ˤʤޤؿ϶ڤʸ - @code{NULL} ȶʸФޤڤʸϷ礵ʸδ֤ -ɲäޤ -@example -mysql> select CONCAT_WS(",","First name","Second name","Last Name"); - -> 'First name,Second name,Last Name' -mysql> select CONCAT_WS(",","First name",NULL,"Last Name"); - -> 'First name,Last Name' -@end example - -@findex LENGTH() -@findex OCTET_LENGTH() -@findex CHAR_LENGTH() -@findex CHARACTER_LENGTH() -@item LENGTH(str) -@itemx OCTET_LENGTH(str) -@itemx CHAR_LENGTH(str) -@itemx CHARACTER_LENGTH(str) -ʸ @code{str} Ĺ -@example -mysql> select LENGTH('text'); - -> 4 -mysql> select OCTET_LENGTH('text'); - -> 4 -@end example - -: @code{CHAR_LENGTH()} ˤĤƤϡޥХʸϰ٤ -Ȥޤ - -@findex LOCATE() -@findex POSITION() -@item LOCATE(substr,str) -@itemx POSITION(substr IN str) -@code{str} ˤ @code{substr} ʸΰ֤֤ޤǽΰ֤ 1 Ǥ -@code{str} @code{substr} ʤ @code{0} ֤ޤ -@example -mysql> select LOCATE('bar', 'foobarbar'); - -> 4 -mysql> select LOCATE('xbar', 'foobar'); - -> 0 -@end example - -δؿϥޥХȤǤǤ - -@findex LOCATE() -@item LOCATE(substr,str,pos) -ʸ @code{str} ˺ǽ˸줿 @code{substr} ʸΰ֤֤ޤ -@code{pos} ϸ򳫻Ϥ֤Ǥ -@code{str} @code{substr} ʤ @code{0} ֤ޤ -@example -mysql> select LOCATE('bar', 'foobarbar',5); - -> 7 -@end example - -δؿϥޥХȤǤǤ - -@findex INSTR() -@item INSTR(str,substr) -ʸ @code{str} κǽʸ @code{substr} ΰ֤֤ޤ -ϰؤäƤ뤳ȤΤơ -2ĤΰͿ @code{LOCATE} ƱǤ - -@example -mysql> select INSTR('foobarbar', 'bar'); - -> 4 -mysql> select INSTR('xbar', 'foobar'); - -> 0 -@end example - -δؿϥޥХȤǤǤ - -@findex LPAD() -@item LPAD(str,len,padstr) -@code{str} Ĺ @code{len} ˤʤޤʸ @code{str} λϤ @code{padstr} ޤ -@example -mysql> select LPAD('hi',4,'??'); - -> '??hi' -@end example - -@findex RPAD() -@item RPAD(str,len,padstr) -@code{str} Ĺ @code{len} ˤʤޤʸ @code{str} ν @code{padstr} ޤ -@example -mysql> select RPAD('hi',5,'?'); - -> 'hi???' -@end example - -@findex LEFT() -@item LEFT(str,len) -ʸ @code{str} κǽ餫 @code{len} Ĥʸޤ - -@example -mysql> select LEFT('foobarbar', 5); - -> 'fooba' -@end example - -δؿϥޥХȤǤǤ - -@findex RIGHT() -@item RIGHT(str,len) -ʸ @code{str} κǸ夫 @code{len} Ĥʸޤ - -@example -mysql> select RIGHT('foobarbar', 4); - -> 'rbar' -@end example - -δؿϥޥХȤǤǤ - -@findex SUBSTRING() -@findex MID() -@item SUBSTRING(str,pos,len) -@itemx SUBSTRING(str FROM pos FOR len) -@itemx MID(str,pos,len) -@code{str} @code{pos} ֤ @code{len} ʸʬʸ֤ޤ -@code{FROM} ΰ㤤 ANSI SQL 92 ʸǤ - -@example -mysql> select SUBSTRING('Quadratically',5,6); - -> 'ratica' -@end example - -δؿϥޥХȤǤǤ - -@findex SUBSTRING() -@item SUBSTRING(str,pos) -@item SUBSTRING(str FROM pos) -ʸ @code{str} @code{pos} ʹߤʸ֤ޤ - -@example -mysql> select SUBSTRING('Quadratically',5); - -> 'ratically' -mysql> select SUBSTRING('foobarbar' FROM 4); - -> 'rbar' -@end example - -δؿϥޥХȤǤǤ - -@findex SUBSTRING_INDEX() -@item SUBSTRING_INDEX(str,delim,count) -@code{str} 顢ڤʸ @code{delim} @code{count} ĸ줿֤ -ʸ֤ޤ@code{count} ξʸϺ鸡졢 -@code{count} ξʸϱ鸡ޤ - -@example -mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2); - -> 'www.mysql' -mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2); - -> 'mysql.com' -@end example - -δؿϥޥХȤǤǤ - -@findex LTRIM() -@item LTRIM(str) -ʸ @code{str} κǽ餫ʸޤ -@example -mysql> select LTRIM(' barbar'); - -> 'barbar' -@end example - -@findex RTRIM() -@item RTRIM(str) -ʸ @code{str} κǸ夫ʸޤ -@example -mysql> select RTRIM('barbar '); - -> 'barbar' -@end example - -@findex TRIM() -@item TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) -Ƥ @code{remstr} ץեåޤϥեå @code{str} -ʸ֤ޤ@code{BOTH}, @code{LEADING} @code{TRAILING} -Ѥʤ硢@code{BOTH} ŬѤޤ@code{remstr} Ϳʤȡ -򤬺ޤ -@example -mysql> select TRIM(' bar '); - -> 'bar' -mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx'); - -> 'barxxx' -mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx'); - -> 'bar' -mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz'); - -> 'barx' -@end example - -δؿϥޥХȤǤǤ - -@findex SOUNDEX() -@item SOUNDEX(str) -@code{str} soundex ʸ֤ޤȯ``Ʊ''Ĥʸ -Ʊ soundex ʸޤ``ɸ'' soundex ʸ4ʸĹǤ -@code{SOUNDEX()} ؿǤդĹʸ֤ޤ@code{SUBSTRING()} -̤˻Ѥơ``ɸ'' soundex ʸ뤳ȤǤޤͿ줿 -ʸ󥢥ե٥åʸ̵뤵ޤA-Z ȾʳΤ٤ƤιŪ -ʥե٥åʸ첻Ȥߤʤޤ - -@example -mysql> select SOUNDEX('Hello'); - -> 'H400' -mysql> select SOUNDEX('Quadratically'); - -> 'Q36324' -@end example - -@findex SPACE() -@item SPACE(N) -@code{N} Ĥζʸ֤ޤ -@example -mysql> select SPACE(6); - -> ' ' -@end example - -@findex REPLACE() -@item REPLACE(str,from_str,to_str) -ʸ @code{str} Ƥʸ @code{from_str} @code{to_str} -֤ޤ - -@example -mysql> select REPLACE('www.mysql.com', 'w', 'Ww'); - -> 'WwWwWw.mysql.com' -@end example - -δؿϥޥХȤǤǤ - -@findex REPEAT() -@item REPEAT(str,count) -@code{str} @code{count} 󷫤֤ޤ@code{count <= 0} ξ -ʸ֤ޤ@code{str} ޤ @code{count} @code{NULL} -ޤϡ@code{LENGTH(str)*count > max_allowed_packet} ξ -@code{NULL} ֤ޤ - -@example -mysql> select REPEAT('MySQL', 3); - -> 'MySQLMySQLMySQL' -@end example - -@findex REVERSE() -@item REVERSE(str) -ʸ @code{str} ȿžޤ -@example -mysql> select REVERSE('abc'); - -> 'cba' -@end example - -δؿϥޥХȤǤǤ - -@findex INSERT() -@item INSERT(str,pos,len,newstr) -@code{str} @code{pos} ֤ @code{len} Ĺʸ -@code{newstr} ֤ޤ@code{str} κǽΰ֤1Ǥ - -@example -mysql> select INSERT('Quadratic', 3, 4, 'What'); - -> 'QuWhattic' -@end example - -δؿϥޥХȤǤǤ - -@findex ELT() -@item ELT(N,str1,str2,str3...) -@code{N} = @code{1} ʤ @code{str1} @code{N} = @code{2} ʤ @code{str2} ֤ޤ -@code{N} @code{1} 꾮硢ޤϰο礭 @code{NULL} -֤ޤ -@code{ELT()} @code{FIELD()} εդǤ - -@example -mysql> select ELT(1, 'ej', 'Heja', 'hej', 'foo'); - -> 'ej' -mysql> select ELT(4, 'ej', 'Heja', 'hej', 'foo'); - -> 'foo' -@end example - -@findex FIELD() -@item FIELD(str,str1,str2,str3,...) -@code{str1}, @code{str2}, @code{str3}, @code{...} ꥹ @code{str} Υǥå -֤ޤ@code{str} Ĥʤ @code{0} ֤ޤ -@code{FIELD()} @code{ELT()} εդǤ - -@example -mysql> select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); - -> 2 -mysql> select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo'); - -> 0 -@end example - -@findex FIND_IN_SET() -@item FIND_IN_SET(str,strlist) -@code{str} @code{strlist} ˤС @code{1} @code{N} ֤ޤ -@code{strlist} ϡ줾ΰۤʤͤ ',' ʬ䤵줿ʸǤǽ -ʸǣܤ @code{SET} Υեɤξ@code{FIND_IN_SET} -ӥåȱ黻ѤƺŬޤ -@code{strlist} ʸʤ @code{0} ֤ޤ -ɤ餫ΰ @code{NULL} ʤ @code{NULL} ֤ޤ. -δؿϺǽΰ ',' ޤ硢ޤưʤǤ礦 - -@example -mysql> SELECT FIND_IN_SET('b','a,b,c,d'); - -> 2 -@end example - -@findex MAKE_SET() -@item MAKE_SET(bits,str1,str2,...) -@code{bits} ˻ꤵ줿ӥåȤбʸΥåȤ֤ޤ -(ʸʣξ硢 @samp{,} Ƕڤޤ) -@code{str1} ӥå 0 б@code{str2} ӥå 1 б -@code{str3} ӥå 2 б... Ȥʤޤ -@code{str1}, @code{str2}, @code{...} ˴ޤޤƤ @code{NULL} ʸ -̤ˤɲäޤ - -@example -mysql> SELECT MAKE_SET(1,'a','b','c'); - -> 'a' -mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world'); - -> 'hello,world' -mysql> SELECT MAKE_SET(0,'a','b','c'); - -> '' -@end example - -@findex EXPORT_SET() -@item EXPORT_SET(bits,on,off,[separator,[number_of_bits]]) -'bits' Ϳ줿ͤФ -ƤΥåȤƤӥåȤ 'on' ǻꤵ줿ʸɽ -ꥻåȤƤӥåȤ 'off' ǻꤵ줿ʸɽʸ֤ޤ -줾ʸ 'separator' (ǥե',') Ǽ줿ʸǶڤ졢 -'number_of_bits' (default 64) Ϳ줿ΥӥåȤɽޤ - -@example -mysql> SELECT EXPORT_SET(5,'Y','N',',',4); - -> Y,N,Y,N -@end example - -@findex LCASE() -@findex LOWER() -@item LCASE(str) -@itemx LOWER(str) -@code{str} 򸽺ߤΥ饯åȥޥåԥ - (ǥե ISO-8859-1 Latin1) ˤäƾʸѴޤ - -δؿϥޥХȤǤǤ - -@example -mysql> select LCASE('QUADRATICALLY'); - -> 'quadratically' -@end example - -@findex UCASE() -@findex UPPER() -@item UCASE(str) -@itemx UPPER(str) -@code{str} 򸽺ߤΥ饯åȥޥåԥ - (ǥե ISO-8859-1 Latin1) ˤäʸѴޤ - -@example -mysql> select UCASE('Hej'); - -> 'HEJ' -@end example - -δؿϥޥХȤǤǤ - -@findex FILE -@item LOAD_FILE(file_name) -եɤ߹ߡեȤʸȤ֤ޤ ե -СˤʤƤϤʤ餺եեѥǻꤷʤФʤޤ -ơ @strong{file} ¤ʤФʤޤ ե -ɤ߹߲ǽǤʤФʤ餺ơ @code{max_allowed_packet} -ǤʤФʤޤ - -Τɤ줫ͳǡ⤷ե뤬¸ߤʤɤ߹ʤ硢 -δؿ @code{NULL} ֤ޤ - -@example -mysql> UPDATE table_name - SET blob_column=LOAD_FILE("/tmp/picture") - WHERE id=1; -@end example -@end table - -@strong{MySQL} ɬפȤпͤʸѴޤ -դƱͤ˹Ԥޤ - -@example -mysql> SELECT 1+"1"; - -> 2 -mysql> SELECT concat(2,' test'); - -> '2 test' -@end example - -Ū˿ͤʸѴС@code{CONCAT()} ˰ȤϤƲ - - -ʸؿϰȤƥХʥʸͿȡ̤ʸХʥ -ʸˤʤޤʸѴ줿ͤϥХʥʸȤߤʤޤ -Ӥˤƶޤ - -@findex Date and time functions -@findex Functions, date and time -@node Date and time functions, Miscellaneous functions, String functions, Functions -@subsection դȻؿ - -줾ηͤϰϤȻ֤ͤҤͭʷˤĤƤ - @ref{Date and time types}. - -մؿѤ: -@code{date_col} ǿ30ǤƤΥ쥳ɤ򤷤ޤ: - -@example -mysql> SELECT something FROM table - WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30; -@end example - -@table @code -@findex DAYOFWEEK() -@item DAYOFWEEK(date) -@code{date} ޤ (@code{1} = , @code{2} = , ... @code{7} = ) - ODBC ɸ˽ޤ -@example -mysql> select DAYOFWEEK('1998-02-03'); - -> 3 -@end example - -@findex WEEKDAY() -@item WEEKDAY(date) -@code{date} ޤ (@code{0} = , @code{1} = , ... @code{6} = ) -@example -mysql> select WEEKDAY('1997-10-04 22:23:00'); - -> 5 -mysql> select WEEKDAY('1997-11-05'); - -> 2 -@end example - -@findex DAYOFMONTH() -@item DAYOFMONTH(date) -֤ޤ (@code{1} - @code{31}) -@example -mysql> select DAYOFMONTH('1998-02-03'); - -> 3 -@end example - -@findex DAYOFYEAR() -@item DAYOFYEAR(date) -ǯ֤ޤ (@code{1}-@code{366}) -@example -mysql> select DAYOFYEAR('1998-02-03'); - -> 34 -@end example - -@findex MONTH() -@item MONTH(date) -֤ޤ (@code{1} - @code{12}) -@example -mysql> select MONTH('1998-02-03'); - -> 2 -@end example - -@findex DAYNAME() -@item DAYNAME(date) -֤̾ޤ -@example -mysql> select DAYNAME("1998-02-05"); - -> 'Thursday' -@end example - -@findex MONTHNAME() -@item MONTHNAME(date) -֤̾ޤ -@example -mysql> select MONTHNAME("1998-02-05"); - -> 'February' -@end example - -@findex QUARTER() -@item QUARTER(date) -@code{date} ˤĤƤǯλȾ֤ޤϰϤ @code{1} -@code{4} Ǥ -@example -mysql> select QUARTER('98-04-01'); - -> 2 -@end example - -@findex WEEK() -@item WEEK(date) -@itemx WEEK(date,first) -Ĥξ硢@code{date} ˤĤƤν֤ޤϰϤ @code{0} -@code{53} (53κǽȤΤ⤢ꤨޤ)ǡ -ǽǤĤη @code{WEEK()} ϡγϤ -Ǥޤ2 @code{0} ξ硢γϤǤ2 - @code{1} ξ硢γϤϷǤ -@example -mysql> select WEEK('1998-02-20'); - -> 7 -mysql> select WEEK('1998-02-20',0); - -> 7 -mysql> select WEEK('1998-02-20',1); - -> 8 -mysql> select WEEK('1998-12-31',1); - -> 53 -@end example - -@findex YEAR() -@item YEAR(date) -ǯ֤ޤ (@code{1000} - @code{9999}). -@example -mysql> select YEAR('98-02-03'); - -> 1998 -@end example -@item YEARWEEK(date) -@itemx YEARWEEK(date,first) -ǡǯȽ֤ޤ2 @code{WEEK()} 2ȤޤäƱ -褦Ưޤ: ǯκǽȺǸνǤϡǯ date ǯȤϰۤ -뤳Ȥޤ -@example - -mysql> select YEARWEEK('1987-01-01'); - -> 198653 -@end example - -@findex HOUR() -@item HOUR(time) -֤ޤ (@code{0} - @code{23}) -@example -mysql> select HOUR('10:05:03'); - -> 10 -@end example - -@findex MINUTE() -@item MINUTE(time) -ʬ֤ޤ (@code{0}-@code{59}) -@example -mysql> select MINUTE('98-02-03 10:05:03'); - -> 5 -@end example - -@findex SECOND() -@item SECOND(time) -ä֤ޤ (@code{0} to @code{59}) -@example -mysql> select SECOND('10:05:03'); - -> 3 -@end example - -@findex PERIOD_ADD() -@item PERIOD_ADD(P,N) -@code{N} @code{P} ( @code{YYMM} ޤ @code{YYYYMM}) ɲ -ޤ@code{YYYYMM} ֤ޤ - -: ְ @code{P} ͤǤ@emph{ޤ} - -@example -mysql> select PERIOD_ADD(9801,2); - -> 199803 -@end example - -@findex PERIOD_DIFF() -@item PERIOD_DIFF(P1,P2) - @code{P1} @code{P2} κη֤ޤ@code{P1} @code{P2} Ϸ - @code{YYMM} ޤ @code{YYYYMM} Ǥ - -: ְ @code{P1} @code{P2} ͤǤ@emph{ޤ} - -@example -mysql> select PERIOD_DIFF(9802,199703); - -> 11 -@end example - -@findex DATE_ADD() -@findex DATE_SUB() -@findex ADDDATE() -@findex SUBDATE() -@findex EXTRACT(type FROM date) -@item DATE_ADD(date,INTERVAL expr type) -@itemx DATE_SUB(date,INTERVAL expr type) -@itemx ADDDATE(date,INTERVAL expr type) -@itemx SUBDATE(date,INTERVAL expr type) - -ؿդα黻˻Ѥޤ @strong{MySQL} 3.22 -ǽǤ @code{ADDDATE()} @code{SUBDATE()} -@code{DATE_ADD()} , @code{DATE_SUB()} ƱǤ - -@strong{MySQL} 3.23 Ǥ, @code{+} @code{-} -@code{DATE_ADD()} , @code{DATE_SUB()} ˻ѤǤޤ. (See example) - -@code{date} ˤϡ@code{DATETIME} @code{DATE} ͤꤷޤ -ͤ黻Ϥޤ -@code{expr} ˤϡdate ͤꤷޤ -@code{expr} @samp{-} ϤޤäƤС򼨤ޤ -@code{type} Ϥɤ줰餤δ֤򼨤ɤǤ - -@code{EXTRACT(type FROM date)} ؿϡdate 'type' ʬ֤ޤ - -ʲɽˡ@code{type} @code{expr} δϢ򼨤ޤ - -@multitable @columnfractions .18 .3 .42 -@item @code{type} @strong{} @tab @strong{̣} @tab @code{expr} @strong{Υեޥå} -@item @code{SECOND} @tab @tab @code{SECONDS} -@item @code{MINUTE} @tab ʬ @tab @code{MINUTES} -@item @code{HOUR} @tab @tab @code{HOURS} -@item @code{DAY} @tab @tab @code{DAYS} -@item @code{MONTH} @tab @tab @code{MONTHS} -@item @code{YEAR} @tab ǯ @tab @code{YEARS} -@item @code{MINUTE_SECOND} @tab ʬ @tab @code{"MINUTES:SECONDS"} -@item @code{HOUR_MINUTE} @tab ֤ʬ @tab @code{"HOURS:MINUTES"} -@item @code{DAY_HOUR} @tab Ȼ @tab @code{"DAYS HOURS"} -@item @code{YEAR_MONTH} @tab ǯ ȷ @tab @code{"YEARS-MONTHS"} -@item @code{HOUR_SECOND} @tab ֤ʬ @tab @code{"HOURS:MINUTES:SECONDS"} -@item @code{DAY_MINUTE} @tab ʬ @tab @code{"DAYS HOURS:MINUTES"} -@item @code{DAY_SECOND} @tab ʬ @tab @code{"DAYS HOURS:MINUTES:SECONDS"} -@end multitable - -@strong{MySQL} ϡ @code{expr} եޥåΤʤڤޤ -ɽζڤʸƤڤʸǤ ⤷ @code{date} - @code{DATE} ͤǡ@code{YEAR}, @code{MONTH}, @code{DAY} ʬΤߤޤ -׻򤹤ʤ顢̤ @code{DATE} ֤ͤޤ ʳʤ @code{DATETIME} ͤ -֤ޤ - -@example -mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND; - -> 1998-01-01 00:00:00 -mysql> SELECT INTERVAL 1 DAY + "1997-12-31"; - -> 1998-01-01 -mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND; - -> 1997-12-31 23:59:59 -mysql> SELECT DATE_ADD("1997-12-31 23:59:59", - INTERVAL 1 SECOND); - -> 1998-01-01 00:00:00 -mysql> SELECT DATE_ADD("1997-12-31 23:59:59", - INTERVAL 1 DAY); - -> 1998-01-01 23:59:59 -mysql> SELECT DATE_ADD("1997-12-31 23:59:59", - INTERVAL "1:1" MINUTE_SECOND); - -> 1998-01-01 00:01:00 -mysql> SELECT DATE_SUB("1998-01-01 00:00:00", - INTERVAL "1 1:1:1" DAY_SECOND); - -> 1997-12-30 22:58:59 -mysql> SELECT DATE_ADD("1998-01-01 00:00:00", - INTERVAL "-1 10" DAY_HOUR); - -> 1997-12-30 14:00:00 -mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY); - -> 1997-12-02 -mysql> SELECT EXTRACT(YEAR FROM "1999-07-02"); - -> 1999 -mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03"); - -> 199907 -mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03"); - -> 20102 -@end example - -⤷ʤλꤹ interval ͤûʤ( @code{type} ɤ -䤵ͤޤǤʤ) @strong{MySQL} interval ͤΰ -ʬꤷ˺줿ΤȲꤷޤ -㤨С⤷ @code{type} @code{DAY_SECOND} ˻ꤷ硢 - @code{expr} ͤ ʬ ʤʪȴԤޤ -Ǥʤ @code{"1:10"} Τ褦ͤꤷƤʤ顢 - @strong{MySQL} ϡ ʬ˺ơʬ Ϳ줿 -ꤷޤ -Ĥޤꡢ @code{"1:10" DAY_SECOND} @code{"1:10" MINUTE_SECOND} -򤵤ΤǤ -ϡ@strong{MySQL} @code{TIME} ͤǤϤʤв֤ɽȲ -ˡƤޤ - -⤷ͤѤ줿ʤ顢̤ @code{NULL} Ǥ. -⤷ @code{MONTH} @code{YEAR_MONTH} @code{YEAR} ­ơ -̤Ȥʤդκ礭ˤʤ褦ʤ顢 -ϡκ˽ޤ - -@example -mysql> select DATE_ADD('1998-01-30',Interval 1 month); - -> 1998-02-28 -@end example - -Τ褦ˡ@code{INTERVAL} @code{type} ɤ -¸ǤϤޤ - -@findex TO_DAYS() -@item TO_DAYS(date) - @code{date} Ϳȡ0ǯ֤ޤ - -@example -mysql> select TO_DAYS(950501); - -> 728779 -mysql> select TO_DAYS('1997-10-07'); - -> 729669 -@end example - -@code{TO_DAYS()} ϥ쥴ꥪγ(1582)ͤǤλѤտޤ -ޤѹ줿˼줿θƤʤǤ - -@findex FROM_DAYS() -@item FROM_DAYS(N) -Given a daynumber @code{N}, returns a @code{DATE} value. - -@example -mysql> select FROM_DAYS(729669); - -> '1997-10-07' -@end example - -@code{FROM_DAYS()} ϥ쥴ꥪγ(1582)ͤǤλѤտޤ -Ƥޤѹ줿˼줿θƤʤǤ - -@findex DATE_FORMAT() -@item DATE_FORMAT(date,format) -@code{date} ͤ @code{format} ʸ˽äޤλ꤬ -@code{format} ʸǻѤǤޤ: -@multitable @columnfractions .1 .9 -@item @code{%M} @tab ̾ (@code{January}..@code{December}) -@item @code{%W} @tab (@code{Sunday}..@code{Saturday}) -@item @code{%D} @tab Ѹ쥵եåդ (@code{1st}, @code{2nd}, @code{3rd}, etc.) -@item @code{%Y} @tab 4ǯ -@item @code{%y} @tab 2ǯ -@item @code{%X} @tab ǯκǽ4ο͡'%V' ȶ˻Ѥޤ -@item @code{%x} @tab ǯκǽϷ4ο͡'%v' ȶ˻Ѥޤ -@item @code{%a} @tab ά줿̾ (@code{Sun}..@code{Sat}) -@item @code{%d} @tab , (@code{00}..@code{31}) -@item @code{%e} @tab , (@code{0}..@code{31}) -@item @code{%m} @tab , (@code{01}..@code{12}) -@item @code{%c} @tab , (@code{1}..@code{12}) -@item @code{%b} @tab ά줿̾ (@code{Jan}..@code{Dec}) -@item @code{%j} @tab ǯ (@code{001}..@code{366}) -@item @code{%H} @tab (@code{00}..@code{23}) -@item @code{%k} @tab (@code{0}..@code{23}) -@item @code{%h} @tab (@code{01}..@code{12}) -@item @code{%I} @tab (@code{01}..@code{12}) -@item @code{%l} @tab (@code{1}..@code{12}) -@item @code{%i} @tab ʬ, (@code{00}..@code{59}) -@item @code{%r} @tab , 12 (@code{hh:mm:ss [AP]M}) -@item @code{%T} @tab , 24 (@code{hh:mm:ss}) -@item @code{%S} @tab (@code{00}..@code{59}) -@item @code{%s} @tab (@code{00}..@code{59}) -@item @code{%p} @tab @code{AM} or @code{PM} -@item @code{%w} @tab (@code{0}=Sunday..@code{6}=Saturday) -@item @code{%U} @tab (@code{0}..@code{53}), ΤϤޤ ˤȤ -@item @code{%u} @tab (@code{0}..@code{53}), ΤϤޤ ˤȤ -@item @code{%V} @tab (@code{1}..@code{53}), ΤϤޤ'%X' ȶ˻Ѥޤ -@item @code{%v} @tab (@code{1}..@code{53}), ΤϤޤϷ'%x' ȶ˻Ѥޤ -@item @code{%%} @tab ƥ @samp{%} -@end multitable - -¾Ƥʸϲᤵ줺˷̤˥ԡޤ - -@example -mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); - -> 'Saturday October 1997' -mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); - -> '22:23:00' -mysql> select DATE_FORMAT('1997-10-04 22:23:00', - '%D %y %a %d %m %b %j'); - -> '4th 97 Sat 04 10 Oct 277' -mysql> select DATE_FORMAT('1997-10-04 22:23:00', - '%H %k %I %r %T %S %w'); - -> '22 22 10 10:23:00 PM 22:23:00 00 6' -mysql> select DATE_FORMAT('1999-01-01', '%X %V'); - -> '1998 52' -@end example - -@strong{MySQL} 3.23 Ǥϡ @code{%} ʸϥեޥåʸɬɬפȤޤ -ΥСǤϡ @code{%} ʸϥץǤ - -@findex TIME_FORMAT() -@item TIME_FORMAT(time,format) -Ͼ嵭 @code{DATE_FORMAT()} Τ褦˻Ѥޤ -@code{format} ץǤϡ,ʬ,äǤޤ -¾Υץ @code{NULL} or @code{0} Ϳޤ - -@findex CURDATE() -@findex CURRENT_DATE -@item CURDATE() -@itemx CURRENT_DATE -դ֤ޤդηϡ@code{CURDATE()} ͤޤʸΤɤ -ʸ̮ǻѤ줿˰¸ @code{YYYYMMDD} ޤ @code{'YYYY-MM-DD'} ֤ޤ - -@example -mysql> select CURDATE(); - -> '1997-12-15' -mysql> select CURDATE() + 0; - -> 19971215 -@end example - -@findex CURTIME() -@findex CURRENT_TIME -@item CURTIME() -@itemx CURRENT_TIME -ߤλ @code{HHMMSS} ޤ @code{'HH:MM:SS'} η֤ޤ - @code{CURTIME()} ͤޤʸΤɤʸ̮ǻѤ줿˰ -¸ޤ - -@example -mysql> select CURTIME(); - -> '23:50:26' -mysql> select CURTIME() + 0; - -> 235026 -@end example - -@findex NOW() -@findex SYSDATE() -@findex CURRENT_TIMESTAMP -@item NOW() -@itemx SYSDATE() -@itemx CURRENT_TIMESTAMP -ߤλ֤ޤͤޤʸΤɤʸ̮ǻѤ줿˰¸ - @code{YYYYMMDDHHMMSS} ޤ @code{'YYYY-MM-DD HH:MM:SS'} ֤ޤ - -@example -mysql> select NOW(); - -> '1997-12-15 23:50:26' -mysql> select NOW() + 0; - -> 19971215235026 -@end example - -@findex UNIX_TIMESTAMP() -@item UNIX_TIMESTAMP() -@itemx UNIX_TIMESTAMP(date) -ʤǸƤӽФ줿ϡUNIX timestamp (GMT @code{'1970-01-01 00:00:00'} -ÿ) Ǥ̾ϡ@code{TIMESTAMP} եɤȤƸƤӽФեɤ -ͤÿ֤ޤ@code{date} ϥǤ @code{DATE} ʸ@code{DATETIME} -ʸ󡢤ޤ @code{YYMMDD} ޤ @code{YYYYMMDD} οͤǤ - -@example -mysql> select UNIX_TIMESTAMP(); - -> 882226357 -mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00'); - -> 875996580 -@end example - -@code{UNIX_TIMESTAMP} @code{TIMESTAMP} եɤ˻Ѥ줿硢 -δؿϡۤ ``ʸ UNIX ॹ'' Ѵ򤹤뤳Ȥʤ -ͤޤ - -@findex FROM_UNIXTIME() -@item FROM_UNIXTIME(Unix_timestamp) -ʸ̮(/ʸ)˰¸ơ@code{'YYYY-MM-DD HH:MM:SS'} ޤ -@code{YYYYMMDDHHMMSS} timestamp ʸ֤ޤ - -@example -mysql> select FROM_UNIXTIME(875996580); - -> '1997-10-04 22:23:00' -mysql> select FROM_UNIXTIME(875996580) + 0; - -> 19971004222300 -@end example - -@findex FROM_UNIXTIME() -@item FROM_UNIXTIME(unix_timestamp,format) -@code{format} ˽ä줿 Unix timestamp ʸ֤ޤ -@code{format} @code{DATE_FORMAT()} ؿΥȥ˰줿ΤƱ -ҤޤळȤǤޤ - -@example -mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(), - '%Y %D %M %h:%i:%s %x'); - -> '1997 23rd December 03:43:30 x' -@end example - -@findex SEC_TO_TIME() -@item SEC_TO_TIME(seconds) -@code{seconds} ʬäѴ֤ޤؿʸʸ̮ޤϿ -ʸ̮ΤɤǻѤ줿˰¸ơ@code{'HH:MM:SS'} ޤ -@code{HHMMSS} ֤ͤޤ - -@example -mysql> select SEC_TO_TIME(2378); - -> '00:39:38' -mysql> select SEC_TO_TIME(2378) + 0; - -> 3938 -@end example - -@findex TIME_TO_SEC() -@item TIME_TO_SEC(time) -@code{time} äѴޤ - -@example -mysql> select TIME_TO_SEC('22:23:00'); - -> 80580 -mysql> select TIME_TO_SEC('00:39:38'); - -> 2378 -@end example -@end table - -@findex Miscellaneous functions -@findex Functions, miscellaneous -@node Miscellaneous functions, Group by functions, Date and time functions, Functions -@subsection ¾δؿ - -@table @code -@findex DATABASE() -@item DATABASE() -ߤΥǡ١֤̾ޤ -@example -mysql> select DATABASE(); - -> 'test' -@end example - -⤷ǡ١򤵤Ƥʤʤ顢@code{DATABASE()} ϶ʸ֤ޤ - -@findex USER() -@findex SYSTEM_USER() -@findex SESSION_USER() -@item USER() -@itemx SYSTEM_USER() -@itemx SESSION_USER() -ߤ @strong{MySQL} 桼֤̾ޤ -@example -mysql> select USER(); - -> 'davida@@localhost' -@end example - -@strong{MySQL} 3.22.11 ʹߤǤϡδؿϥ桼̾ȥ饤ȤΥۥ̾ޤߤޤ -桼̾ʬФˤϼΤ褦ˤޤ -ʤϥۥ̾ޤޤƤʤȤưǤ礦ˡ - -@example -ysql> select substring_index(USER(),"@@",1); - -> 'davida' -@end example - -@findex PASSWORD() -@item PASSWORD(str) -ץ졼ƥȤΥѥ @code{str} ѥʸ׻ޤ - @code{user} ĥơ֥ @code{Password} եɤˡ -Ź沽줿 @strong{MySQL} ѥɤ¸ݤ˻Ѥޤ - -@example -mysql> select PASSWORD('badpwd'); - -> '7f84554057dd964b' -@end example - -@cindex Password encryption, reversibility of -@code{PASSWORD()} ŹԲĵդǤ - -@code{PASSWORD()} UNIX ΥѥɤŹ沽ΤƱˡ -Ź沽Ԥ櫓ǤϤޤ -UNIX Υѥɤ @strong{MySQL} ΥѥɤƱȻפäƤϤޤ -UNIX Υѥɥե¸ͤ @code{PASSWORD()} ֤ -ͤƤϤޤ -@code{ENCRYPT()} ȡ - -@findex ENCRYPT() -@item ENCRYPT(str[,salt]) -UNIX @code{crypt()} ƥॳ @code{str} Ź沽ޤ -@code{salt} 2ʸʸǤ -(@strong{MySQL} 3.22.16 , @code{salt} 2ʸʾ褦ˤʤޤ) - -@example -mysql> select ENCRYPT("hello"); - -> 'VxuFAJXVARROc' -@end example - -ƥ @code{crypt()} ѤǤʤ @code{ENCRYPT()} Ͼ -@code{NULL} ֤ޤ - -ʤȤ⤤ĤΥƥǤϡ -@code{ENCRYPT()} @code{str} ʸκǽ 8 ʸʳ̵뤷ޤ - @code{crypt()} ƥॳο񤤤ˤäƷŤޤ - -@findex ENCODE() -@item ENCODE(str,pass_str) -ѥɤȤ @code{pass_str} Ѥ @code{str} Ź沽ޤ -沽ˤϡ@code{DECODE()}Ѥޤ - -̤ϥХʥʸǤեɤˤ¸ @code{BLOB} -եɷѤƤ - -@findex DECODE() -@item DECODE(crypt_str,pass_str) -Ź沽줿ʸ @code{crypt_str} ѥɤȤ @code{pass_str} -Ѥ沽ޤ@code{crypt_str} @code{ENCODE()} ֤줿ʸ -Ǥ٤Ǥ - -@findex MD5() -@item MD5(string) -ʸ MD5 åष̤֤ޤ ͤ 32 16ɽǤ -㤨Хϥå奭ȤƻѤǤ褦ˡ - -@example -mysql> select MD5("testing") - -> 'ae2b1fca515949e5d54fb22b8ed95575' -@end example - - "RSA Data Security, Inc. MD5 Message-Digest Algorithm". - -@findex LAST_INSERT_ID([expr]) -@item LAST_INSERT_ID([expr]) -Ǹ @code{AUTO_INCREMENT} եɤƼưŪ줿֤ͤޤ -@xref{mysql_insert_id, , @code{mysql_insert_id()}}. - -@example -mysql> select LAST_INSERT_ID(); - -> 195 -@end example - -Ǹκ줿 ID Ϥ줾Υͥ˥С˰ݻޤ -¾Υ饤ȤѹǤʤǤ礦 -⤷¾ޥåͤ @code{AUTO_INCREMENT} ե -ͤ @code{NULL} Ǥ @code{0} ǤʤȤȡ -򹹿Ƥ⡢ ѹޤ - -@cindex Sequence emulation -⤷ @code{UPDATE} @code{LAST_INSERT_ID()} ΰ @code{expr} ꤹȡ -ͤ @code{LAST_INSERT_ID()} ͤȤ֤ޤ - ֹΥߥ졼˻ѤǤޤ - -ǽ˥ơ֥ - -@example -mysql> create table sequence (id int not null); -mysql> insert into sequence values (0); -@end example - -ưʲΤ褦ˤƥֹ - -@example -mysql> UPDATE sequence SET id=last_insert_id(id+1); -@end example - -@code{LAST_INSERT_ID()} θƤӽФ̵ǥֹ뤳Ȥǽ -ǤˡǤδؿѤ桼ƥƥϡID ͤǸ˼ưŪ -줿ͤȤƥФ˴ޤ@strong{MySQL} ̾Ǥդ -@code{AUTO_INCREMENT} ͤɤ߹ǿ ID ФȤǤޤ -С@code{LAST_INSERT_ID()} (̵) Ͽ ID ֤ޤC API - @code{mysql_insert_id()} ⤳ͤ뤿˻ѤǤޤ - -@findex FORMAT() -@item FORMAT(X,D) -@code{'#,###,###.##'} Τ褦ʷ( @code{X} )ǿ @code{D} -ޤ ⤷ @code{D} @code{0} ʤ, ̤ˤϤʤ -⾮ޤޤޤ - -@example -mysql> select FORMAT(12332.123456, 4); - -> '12,332.1235' -mysql> select FORMAT(12332.1,4); - -> '12,332.1000' -mysql> select FORMAT(12332.2,0); - -> '12,332' -@end example - -@findex VERSION() -@item VERSION() -@strong{MySQL} ФΥС֤ޤ -@example -mysql> select VERSION(); - -> '3.23.13-log' -@end example - -: С @code{-log} ǽϥ󥰤ͭǤ뤳Ȥ -̣ޤ - -@findex CONNECTION_ID() -@item CONNECTION_ID() -³³ ID (@code{thread_id}) ֤ޤ٤Ƥ³³Ȥΰ - ID ޤ -@example -mysql> select CONNECTION_ID(); - -> 1 -@end example - - -@findex GET_LOCK() -@item GET_LOCK(str,timeout) -@code{timeout} äΥॢȤǡ@code{str} ̾դ줿åγ -ޤå @code{1}, ॢȤξ @code{0}, 顼ξ( -­䥹åɤ @code{mysqladmin kill} ǻ줿ʤ) @code{NULL} -֤ޤ@code{RELEASE_LOCK} μ¹ԡ @code{GET_LOCK} μ¹ԡ -åɤνλξˡåϲޤδؿϥץꥱ -å쥳ɥåΥߥ졼ȤΤ˻ѤǤޤ -ϡƱ̾ΥåԤȤ¾Υ饤ȤΥꥯȤ -֥åޤ Ϳ줿̾Υå˱Ƥ륯饤Ȥϡ -Ĵƥå󥰤ԤˡʸѤǤޤ - -@example -mysql> select GET_LOCK("lock1",10); - -> 1 -mysql> select GET_LOCK("lock2",10); - -> 1 -mysql> select RELEASE_LOCK("lock2"); - -> 1 -mysql> select RELEASE_LOCK("lock1"); - -> NULL -@end example - -ܤ @code{RELEASE_LOCK()} @code{NULL} ֤ޤ -ʤʤ顢 @code{"lock1"} ϡܤ @code{GET_LOCK()} θƤӽФǡ -ưŪ˲뤫Ǥ - -@findex RELEASE_LOCK() -@item RELEASE_LOCK(str) -@code{GET_LOCK} dzå @code{str} ޤå -줿 @code{1}, ΥåɤˤäƥåƤʤ @code{0} -(ξ硢åϲޤ), -@code{str}¸ߤʤ @code{NULL} ֤ޤ -⤷ @code{GET_LOCK()} 򥳡뤷ʤä硢 -뤤ϡ˲Ƥϡå¸ߤʤǤ礦 - -@findex BENCHMARK() -@item BENCHMARK(count,expr) -@code{BENCHMARK()} ؿ @code{expr} Ϳ줿ʸ @code{count} -֤¹Ԥޤ @strong{MySQL} Τʸνɤ줰餤 -®ΤΤΤ˻ѤǤ礦 ̤Ͼ @code{0} Ǥ -ꤷƤѤϡ @code{mysql} 饤ȤǤ -륯μ¹Ի֤Τ뤿λѤǤ - -@example -mysql> select BENCHMARK(1000000,encode("hello","goodbye")); -+----------------------------------------------+ -| BENCHMARK(1000000,encode("hello","goodbye")) | -+----------------------------------------------+ -| 0 | -+----------------------------------------------+ -1 row in set (4.74 sec) -@end example - -𤵤줿֤ϡ饤ȤǤηв֤Ǥ С¦ CPU ֤Ǥ -ޤ@code{BENCHMARK()} 򲿲󤫼¹ԤơХޥ٤νŤ -θƷ̤᤹뤳Ȥ򴫤ޤ - -@findex INET_NTOA() -@item INET_NTOA(expr) -ɽФͥåȥɥ쥹(4 ޤ 8 Х) ֤ޤ - -@example -mysql> select INET_NTOA(3520061480); - -> "209.207.224.40" -@end example - -@findex INET_ATON() -@item INET_NTOA(expr) -ͥåȥɥ쥹Фͤɽ֤ޤɥ쥹 4 ޤ -8 Хȥɥ쥹Ǥ - -@example -mysql> select INET_ATON("209.207.224.40"); - -> 3520061480 -@end example -@end table - -@findex GROUP BY functions -@findex Functions, GROUP BY -@node Group by functions, , Miscellaneous functions, Functions -@subsection @code{GROUP BY} δؿ - -@code{GROUP BY} ʤ 롼״ؿѤʤ顢 -ƤΥ쥳ɤ򥰥롼ײ뤳Ȥˤʤޤ - -@table @code -@findex COUNT() -@item COUNT(expr) -@code{SELECT} ʸˤä쥳 桢ͤ @code{NULL} -쥳ɤο֤ޤ - -@example -mysql> select student.student_name,COUNT(*) - from student,course - where student.student_id=course.student_id - GROUP BY student_name; - -@end example - -줿쥳ɤο쥳 @code{NULL} ͤޤफɤǡ -@code{COUNT(*)} ֤ͤϤϤ֤ۤʤޤ - -⤷ @code{SELECT} ĤΥơ֥뤫鸡ġ -¾Υեɤ뤳Ȥʤ -@code{WHERE} ᤬̵ʤС -@code{COUNT(*)} ®뤿˺Ŭޤ -㤨С - -@example -mysql> select COUNT(*) from student; -@end example - -@findex COUNT(DISTINCT) -@findex DISTINCT -@item COUNT(DISTINCT expr,[expr...]) -ۤʤͤοΥȤ֤ޤ - -@example -mysql> select COUNT(DISTINCT results) from student; -@end example - -@strong{MySQL} ǤϡΥꥹȤͿ뤳Ȥǡ̸Ĥμȹ礻ο -ȤǤޤANSI SQL Ǥϡ٤Ƥμ @code{CODE(DISTINCT ..)} -礹ɬפޤ - -@findex AVG() -@item AVG(expr) -@code{expr}ʿ͡ - -@example -mysql> select student_name, AVG(test_score) - from student - GROUP BY student_name; -@end example - -@findex MIN() -@findex MAX() -@item MIN(expr) -@itemx MAX(expr) -@code{expr}.κǾ/͡ -@code{min()} @code{max()} ʸȡǾ/ʸ֤ͤޤ - -@example -mysql> select student_name, MIN(test_score), MAX(test_score) - from student - GROUP BY student_name; -@end example - -@findex SUM() -@item SUM(expr) -@code{expr}ι. -: ̥åȤ쥳ɤ֤ʤϡ NULL ֤ޤ - -@findex STD() -@findex STDDEV() -@cindex Oracle compatibility -@cindex Compatibility, with Oracle -@item STD(expr) -@itemx STDDEV(expr) -@code{expt} ɸͶƳ(standard derivative) @code{ANSI SQL} ФĥǤ -δؿ @code{STDDEV()} ϡOracle ߴΤ󶡤ޤ - -@findex BIT_OR() -@item BIT_OR(expr) -@code{expr} ƤΥӥåȤ @code{OR}64 ӥå(@code{BIGINT}) -٤Ƿ׻ޤ - -@findex BIT_AND() -@item BIT_AND(expr) -@code{expr} ƤΥӥåȤ @code{AND}64 ӥå(@code{BIGINT}) -٤Ƿ׻ޤ -@end table - -@strong{MySQL} @code{GROUP BY} ĥƤޤ@code{SELECT} ɽ -@code{GROUP BY} ˸ʤեɤޤϷ׻ѤǤޤ @emph{Υ롼 -פΤƤβǽ} ɽƤޤλѤˤꡢɬפʤեɤ -ΥȤȥ롼פ򤱤Τǡ⤤ǽޤ㤨СΥ -Ǥ @code{customer.name} ǥ롼פɬפϤޤ: - -@example -mysql> select order.custid,customer.name,max(payments) - from order,customer - where order.custid = customer.custid - GROUP BY order.custid; -@end example - -ANSI SQL Ǥϡ@code{GROUP BY} @code{customer.name} ɲäɬפޤ -@strong{MySQL} ǤϡANSI ⡼ɤǼ¹ԤƤʤϡname ϾĹǤ - -@code{GROUP BY} άեɤ롼ǰդǤʤϡ -εǽѤʤǤ - -ĤΥǤϡ줬դǤʤǤ⡢@code{MIN()} -@code{MAX()} Υեͤ뤿˻Ѥ뤳ȤǤޤ -ϡ@code{sort} եκǾͤޤ쥳ɤ -@code{column} ͤͿޤ: - -@example -substr(MIN(concat(sort,space(6-length(sort)),column),7,length(column))) -@end example - -@cindex @code{ORDER BY}, aliases in -@cindex Aliases, in @code{ORDER BY} clauses -@cindex @code{GROUP BY}, aliases in -@cindex Aliases, in @code{GROUP BY} clauses -@cindex Expressions, aliases for -@cindex Aliases, for expressions -: @strong{MySQL} 3.22 (ޤϤ) ѤƤ硢ޤ -ANSI SQL ˽ȤƤϡ@code{GROUP BY} @code{ORDER BY} -ѤǤޤ󡣼̾Ѥ뤳ȤǤ¤Ǥޤ: - -@example -mysql> SELECT id,FLOOR(value/100) AS val FROM tbl_name - GROUP BY id,val ORDER BY val; -@end example - -@code{MySQL} 3.23 ǤϼԤʤȤǤޤ: - -@example -mysql> SELECT id,FLOOR(value/100) FROM tbl_name ORDER BY RAND(); -@end example - -@findex CREATE DATABASE -@node CREATE DATABASE, DROP DATABASE, Functions, Reference -@section @code{CREATE DATABASE}ʸ - -@example -CREATE DATABASE [IF NOT EXISTS] db_name -@end example - -@code{CREATE DATABASE} Ϳ줿̾Υǡ١ޤǡ١̾ȤƵ̿̾§ϡ@ref{Legal names}˰ͤޤ -⤷ǡ١Ǥ¸ߤƤˤ⤫餺 @code{IF NOT EXISTS} -ꤷƤʤä顢顼ȯޤ - -@strong{MySQL}ˤǡ١ϡǡ١Υơ֥եޤǥ쥯ȥȤƼޤϥǡ١˥ơ֥¸ߤ@code{CREATE DATABASE}ơȥȤϡ@strong{MySQL}ǡǥ쥯ȥ겼˥ǥ쥯ȥǤ - -@cindex @code{mysqladmin} -@code{mysqladmin}Ǥǡ١뤳ȤǤޤ -@xref{Programs}. - -@findex DROP DATABASE -@node DROP DATABASE, CREATE TABLE, CREATE DATABASE, Reference -@section @code{DROP DATABASE}ʸ - -@example -DROP DATABASE [IF EXISTS] db_name -@end example - -@code{DROP DATABASE}ϡǡ١ƤΥơ֥ȶ˥ǡ١˴ޤ@strong{ΥޥɤλѤˤդʧäƲ} - -@code{DROP DATABASE}ϡǡ١ǥ쥯ȥ꤫줿եο֤ޤ줾Υơ֥@file{.MYD}ե롿@file{.MYI}ե롿@file{.frm}ե뤳Ȥ顢̾盧ͤϥơ֥ΣܤοȤʤޤ - -@strong{MySQL} 3.22ʹߤǤϡǡ١¸ߤʤȤ˵륨顼ɤˡ @code{IF EXISTS} Ѥ뤳ȤǤޤ - -@cindex @code{mysqladmin} -@code{mysqladmin}Ǥǡ١˴뤳ȤǤޤ -@xref{Programs}. - -@findex CREATE TABLE -@node CREATE TABLE, ALTER TABLE, DROP DATABASE, Reference -@section @code{CREATE TABLE}ʸ - -@menu -* Silent column changes:: Silent column changes -@end menu - -@example -CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] -[table_options] [select_statement] - -create_definition: - col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] - [PRIMARY KEY] [reference_definition] - or PRIMARY KEY (index_col_name,...) - or KEY [index_name] (index_col_name,...) - or INDEX [index_name] (index_col_name,...) - or UNIQUE [INDEX] [index_name] (index_col_name,...) - or [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...) - [reference_definition] - or CHECK (expr) - -type: - TINYINT[(length)] [UNSIGNED] [ZEROFILL] - or SMALLINT[(length)] [UNSIGNED] [ZEROFILL] - or MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] - or INT[(length)] [UNSIGNED] [ZEROFILL] - or INTEGER[(length)] [UNSIGNED] [ZEROFILL] - or BIGINT[(length)] [UNSIGNED] [ZEROFILL] - or REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] - or DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] - or FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] - or DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] - or NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL] - or CHAR(length) [BINARY] - or VARCHAR(length) [BINARY] - or DATE - or TIME - or TIMESTAMP - or DATETIME - or TINYBLOB - or BLOB - or MEDIUMBLOB - or LONGBLOB - or TINYTEXT - or TEXT - or MEDIUMTEXT - or LONGTEXT - or ENUM(value1,value2,value3,...) - or SET(value1,value2,value3,...) - -index_col_name: - col_name [(length)] - -reference_definition: - REFERENCES tbl_name [(index_col_name,...)] - [MATCH FULL | MATCH PARTIAL] - [ON DELETE reference_option] - [ON UPDATE reference_option] - -reference_option: - RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT - -table_options: - TYPE = @{ISAM | MYISAM | HEAP@} -or AUTO_INCREMENT = # -or AVG_ROW_LENGTH = # -or CHECKSUM = @{0 | 1@} -or COMMENT = "string" -or MAX_ROWS = # -or MIN_ROWS = # -or PACK_KEYS = @{0 | 1@} -or PASSWORD = "string" -or DELAY_KEY_WRITE = @{0 | 1@} -or ROW_FORMAT= @{ default | dynamic | static | compressed @} -or RAID_TYPE= @{1 | STRIPED | RAID0 @} RAID_CHUNKS=# RAID_CHUNKSIZE=#; - -select_statement: - [IGNORE | REPLACE] SELECT ... (Some legal select statement) -@end example - - -@code{CREATE TABLE}ϥȥǡ١ˡͿ줿̾Υơ֥ -ޤơ֥̾ȤƵ̿̾§ϡ@xref{Legal names} -ͤޤ -ȥǡ١̵䡢ơ֥뤬¸ߤƤϥ顼 -ȯޤ - -@strong{MySQL} 3.22 ʹߤǤϥơ֥̾ @code{db_name.tbl_name} ȤͿǤޤ -ϥȥǡ١뤫ɤˤ˴طʤưޤ - -@strong{MySQL} 3.23 Ǥϡơ֥ @code{TEMPORARY} ɤѤ뤳Ȥ -Ǥޤ ơ֥ϡ⤷ͥ硢ưǾõޤ -ơ֥̾Ϥ줾³ȤǤ -ϡĤΰ㤦³ǡƱ̾ΰơ֥ -ͤ뤳ȤʤѤǤȤǤ -ˤϡ¸ߤơ֥Ʊ̾ǤäƤ⡢ơ֥ϻѤǤޤ -(ơ֥뤬ޤǡºߤơ֥ϱޤ) - -@strong{MySQL} 3.23 ʹߤǤϡ @code{IF NOT EXISTS} ɤѤǤޤ -ϡ⤷ơ֥뤬¸ߤƤ硢顼ȯޤ -ơ֥ι¤դɤޤǤϸʤȤա - -줾Υơ֥ϡǡ١ǥ쥯ȥˤʲʣ -եɽޤ MyISAM Υơ֥硧 - -@multitable @columnfractions .2 .8 -@item @strong{ե} @tab @strong{Ū} -@item @code{tbl_name.frm} @tab ơ֥()ե -@item @code{tbl_name.MYD} @tab ǡե -@item @code{tbl_name.MYI} @tab ǥåե -@end multitable - -եɤФη°ξܺ٤ϡ@ref{Column types}򻲾ȤΤȡ - -@itemize @bullet -@item - @code{NULL}@code{NOT NULL}ꤵʤä硢եɤ@code{NULL}ꤵ줿ΤȤưޤ - -@item - Υեɤˤղ°@code{AUTO_INCREMENT}ꤹ뤳ȤǤޤ@code{AUTO_INCREMENT}Υեɤ@code{NULL}@code{0}硢եɤˤ@code{value+1}ͤåȤޤ@code{value}ϡΥơ֥եɤˤ븽ߤκͤǤ -@code{AUTO_INCREMENT} @code{1} Ϥޤޤ. -@xref{mysql_insert_id, , @code{mysql_insert_id()}}. - - 쥳ɤ@code{AUTO_INCREMENT}եɤκͤޤǤ硢ͤϼ˺Ѥޤ( ISAM ơ֥ξǡMyISAM ơ֥Ǥϵޤ) -ޤơ֥ƤΥ쥳ɤ @code{DELETE FROM TABLE} (@code{WHERE}̵) -ѤƺϡϤᤫ֤ľޤ - -@strong{:} 1ĤΥơ֥ˤ1Ĥ@code{AUTO_INCREMENT}եɤǤޤ󡣤ޤǥåꤹɬפޤ -@strong{MySQL} 3.23 auto_increment եɤοäƤ -ưޤοϤȤƤ礭οȤߤʤ -ϡͤؤ 'wrap' over ٤򤹤뤿 -ȡǥŪ 0 ޤ auto_increment եɤ뤳Ȥʤ -Ȥμ¤ˤ뤿ˡԤʤޤ - -@cindex ODBC compatibility -@cindex Compatibility, with ODBC -@strong{MySQL} 򤤤Ĥ ODBC ץꥱȸߴˤ뤿ˡ -ǺǸ줿쥳ɤ򸫤Ĥ뤳ȤǤޤ: - -@example -SELECT * FROM tbl_name WHERE auto_col IS NULL -@end example - -@item -@code{TIMESTAMP}եɤˤ@code{NULL}ͤϡ¾Υե°Ȱä򤷤ޤ@code{NULL}@code{TIMESTAMP}եɤ˳Ǽ뤳ȤϤǤޤ@code{NULL}ͤλϸ߻򥻥åȤ뤳Ȥ̣ޤ@code{TIMESTAMP}եɤΤ褦˿񤦤Τǡ̾@code{NULL}°@code{NOT NULL}°ŬѤǤޤ󡣤ꤷƤ̵뤵ޤ - - @strong{MySQL}饤Ȥϡ°פ@code{TIMESTAMP}եɤѤǤФ@code{TIMESTAMP}եɤؤ@code{NULL}ŬѤ𤷤ޤ@code{TIMESTAMP}եɤϼºݤˤ@code{NULL}ͤ¸뤳ȤϤޤ@code{DESCRIBE tbl_name}Ѥơơ֥ʸ뤳Ȥˤꡢθݤǧ뤳ȤǤޤ - - @code{TIMESTAMP}եɤ@code{0}ꤹ뤳Ȥϡ@code{NULL}ꤹ뤳ȤʤȤդƤʤʤ顢@code{0}@code{TIMESTAMP}ͤȤǤ뤫Ǥ - -@item -եɤФ @code{DEFAULT} ͤꤵʤ @strong{MySQL} -ưŪˤƤޤ - -եɤ @code{NULL} ͤȤƼϡǥեͤ -@code{NULL} Ǥ - -եɤ @code{NOT NULL} Ȥ줿ϡǥեͤϥե -ɷ˰¸ޤ: - -@itemize @minus -@item -@code{AUTO_INCREMENT} 줿ʳοͷΥեɤФƤϡ -ͤ@code{0}Ȥʤޤ -@code{AUTO_INCREMENT}եɤǤϡǥեͤϼΥֹˤʤޤ - -@item -@code{TIMESTAMP} ʳշȻ﷿ΥեɤФƤϡ -ͤϤηˤŬڤ``''ͤȤʤޤ -㳰: եɤΥơ֥Ǻǽ@code{TIMESTAMP}եɤǤ硢ͤϸ߻ˤʤޤ -@xref{Date and time types}. - -@item -@code{ENUM} ʳʸ󷿤ΥեɤФƤϡͤ϶ʸȤʤޤ -@code{ENUM} ǤϡǥեͤϺǽͤǤ -@end itemize - -@item -@code{KEY}ϡ@code{INDEX}ƱǤ - -@item -@strong{MySQL}Ǥϡ@code{UNIQUE}ϸͭͤĤȤǤޤ󡣴¸ߤ쥳ɤȥͤʣ쥳ɤ褦Ȥ硢顼ȯޤ - -@item -@code{PRIMARY KEY} ϥˡ @code{KEY} ǡ٤ƤΥեɤ -@code{NOT NULL} ȤʤФʤʤȤ̤¤ȼޤ -@strong{MySQL} Ǥϥ @code{PRIMARY} ̾դޤơ֥ -@code{PRIMARY KEY} ĤĤȤǤޤ@code{PRIMARY KEY} -ʤˡץꥱ󤬥ơ֥ @code{PRIMARY KEY} Ҥͤȡ -@strong{MySQL} @code{PRIMARY KEY} Ȥơ@code{NULL} եɤ -ʤǽ @code{UNIQUE} ֤ޤ - -@item -@code{PRIMARY KEY}ʣեɥǥåȤǤޤʤ顢1ĤΥեǤ@code{PRIMARY KEY}°Ѥʣ祤ǥå뤳ȤǤޤΤǡեˤϡץ饤ޥꡦñȥեɤξΤߤȤƲʣեɤξϡ@code{PRIMARY KEY(index_col_name,...)}ʸѤʤФʤޤ - -@item -@code{PRIMARY} @code{UNIQUE} ĤΥեɤʤꡢη -硢 @code{_rowid} ȤƤ⻲Ȥ뤳ȤǤޤ(3.23.11 Ǥο -ǽ) - -@item -ǥå̾Ƥʤ硢դ̾դ뤿ˡ@code{index_col_name}κǽΥե̾(@code{_2}, @code{_3}, ...)Τ褦ʥեåղäΤƤޤơ֥뤬ѤƤ륤ǥå̾ϡ@code{SHOW INDEX FROM tbl_name}ˤǧ뤳ȤǤޤ -@xref{SHOW, , @code{SHOW}}. - -@item -@cindex @code{NULL} values, and indexes -@cindex Indexes, and @code{NULL} values -@code{MyISAM} ơ֥Τߤ@code{NULL} ͤĥեɤФ -ǥåĤȤޤ -¾Υơ֥뷿ξ硢եɤ @code{NOT NULL} ʤƤϤʤޤ - -@item -@code{col_name(length)}ʸ򶦤˻ꤹ뤳Ȥǡ@code{CHAR}ե@code{VARCHAR}եɤΰʬ򥤥ǥåȤǤޤˤꥤǥåեŬ٤˾뤳ȤǤޤ -@xref{Indexes}. - -@item -@cindex @code{BLOB} columns, indexing -@cindex Indexes, and @code{BLOB} columns -@cindex @code{TEXT} columns, indexing -@cindex Indexes, and @code{TEXT} columns -@code{MyISAM} ơ֥뷿Τߤ @code{BLOB} @code{TEXT} եɾ -ǥåĤȤޤ @code{BLOB} @code{TEXT} եɤ -ǥåĥ硢ˡǥåĹꤷʤƤϤʤޤ -@example -CREATE TABLE test (blob_col BLOB, index(blob_col(10))); -@end example - -@item -@code{TEXT}եɤ@code{BLOB}եɤ @code{ORDER BY} @code{GROUP BY} -Ѥȡǽ@code{max_sort_length}ХȤѤޤ -@xref{BLOB, , @code{BLOB}}. - -@item -@code{FOREIGN KEY}@code{CHECK}ڤ@code{REFERENCES}ϼºݤˤϲԤޤ󡣤ιʸϡߴΤѰդƤꡢ¾SQLФΥɤΰܿưפˤꡢȾȶ˥ơ֥褦ʥץꥱư뤳ȤŪȤƤޤ -@xref{Missing functions}. - -@item -Ƥ@code{NULL}եɤϡ1ӥå;פ˾񤷡ľΥХȤ˴ݤޤ - -@item -쥳ɤκĹϡʲΤ褦ˤƵޤ: - -@example -쥳ɤĹ = 1 - + (եɤĹι) - + (NULLեɤο + 7)/8 - + (Ĺեɤο) -@end example - -@item @code{table_options} @code{SELECT} ץϡ -@strong{MySQL} 3.23 ʾǤΤ߼ޤ - -ơ֥뷿ϡ - -@multitable @columnfractions .20 .80 -@item ISAM @tab ꥸʥΥơ֥ @xref{ISAM}. -@item MyISAM @tab ХʥߴΥơ֥ @xref{MyISAM}. -@item HEAP @tab Υơ֥Υǡϡ꡼ˤΤߤ @xref{HEAP}. -@item BDB ޤ Berkeley_db @tab ȥ󥶥ʥơ֥ @xref{BDB}. -@end multitable -@xref{Table types}. - -¾Υơ֥륪ץȤäơơ֥ο񤤤Ŭޤ -Ƥξϡץɬפޤ -Ū˻ꤵʤä硢ץϤ٤ƤΥơ֥뷿˺Ѥޤ - -@multitable @columnfractions .20 .80 -@item @code{AUTO_INCREMENT} @tab ʤΥơ֥˥åȤ auto_increment -@item @code{AVG_ROW_LENGTH} @tab ơ֥˴ޤޤ쥳ɤĹΤ褽ʿ͡ ĹΥ쥳ɤľˤΤߡ򥻥åȤޤ -@item @code{CHECKSUM} @tab @strong{MySQL} ƤΥ쥳ɤå硢 1 ˥åȤޤ (Ϲ٤ޤơ֥򸫤ĤФ䤹ʤޤ) (MyISAM) -@item @code{COMMENT} @tab ơ֥Ρ60ʸ -@item @code{MAX_ROWS} @tab ʤơ֥¸ȹͤƤ쥳ɿ -@item @code{MIN_ROWS} @tab ʤơ֥¸ȹͤƤ쥳ɿ -@item @code{PACK_KEYS} @tab 꾮ǥåˤʤ顢 1 ˤޤ Ϲ٤ޤɤ߽Ф®ʤޤ (MyISAM, ISAM). -@item @code{PASSWORD} @tab @code{.frm} եѥդǰŹ沽 Υץϡɸ @strong{MySQL} СǤϤʤˤԤޤ -@item @code{DELAY_KEY_WRITE} @tab ơ֥뤬ޤǥơ֥ι餻硢1ꤷޤ(MyISAM) -@item @code{ROW_FORMAT} @tab 쥳ɤɤΤ褦˳Ǽ뤫ޤ(Τ) -@end multitable - -@code{MyISAM} ơ֥ѤʤС@strong{MySQL} -@code{max_rows * avg_row_length} ͤ򡢥ơ֥뤬ɤΤ餤礭ʤ뤫 -ο˻Ѥޤ -⤷嵭Υץʤˤꤷʤä硢ơ֥κ祵 -4G ˤʤޤ(ʤ OS 2G ݡȤƤʤ 2G ޤ) - -@code{PACK_KEYS} Ѥʤ硢ǥեȤʸѥå -ϥѥåޤ@code{PACK_KEYS=1} ѤȤ˿ͤѥå - - -Хʥͥѥå@strong{MySQL} ϥץեå̤ -ޤϡƱͤ¿ľˤ礭ʲäȤ -̣ޤץեå̤ϡΥβХȤΥƱǤ -뤫򼨤;פ1ХȤ٤ƤΥɬפȤʤ뤳Ȥ̣ޤ( -: 쥳ɤؤΥݥ󥿤ϡ̤θΤ high-byte-first-order ǥ -ľ˳Ǽޤ)ϡ2ĤΥ쥳ɤƱ¿ľ硢Τ -٤Ƥ'Ʊ'̾2Х(쥳ɤؤΥݥ󥿤ޤ)ɬפȤ -ȤȤǤ̾ΥӤƤߤƤ̾Υϡ -Υ'γǼ' + ݥ󥿥(̾4)ɬפȤޤ -٤ƤΥۤʤäƤȡ @code{NULL} ͤĤȤǤ -ǤϤʤǤϡ1ХȤ񤷤ޤ(ξ硢ѥå줿 -Ĺϡ @code{NULL} λ˥ޡΤ˻ѤΤƱХ -dzǼޤ) - -@item -⤷ @code{CREATE STATEMENT} θ @code{SELECT} ꤹʤС -@strong{MySQL} ϡ@code{SELECT} ֤äƤƤιܤ뤿ˡ -եɤޤ -㤨С - -@example -mysql> CREATE TABLE test (a int not null auto_increment, - primary key (a), key(b)) - TYPE=HEAP SELECT b,c from test2; -@end example - - 3ĤΥեɤ @code{HEAP} ơ֥˺ޤ -⤷ǡơ֥˥ԡƤ˥顼ʤ顢 -Υơ֥ϼưŪ˾õ뤳ȤդƤ - -@item -@code{RAID_TYPE} ץϡ絬ϥե򥵥ݡȤƤʤ OS -2G/4G¤ˤ򤷤ޤޤ@code{RAID} ǥ쥯ȥ̤ʪ -ǥ֤ȤˤꡢIO ܥȥͥå餵®٤뤳ȤǤ -@code{RAID_TYPE} ϡ@strong{MySQL} @code{--with-raid} ǥե -Сɤ OS ǤƯޤߡ@code{RAID_TYPE} -@code{STRIPED} Ƥޤ(@code{1} @code{RAID0} Ϥ̾ -Ǥ) - -@code{RAID_TYPE=STRIPED} @code{MyISAM} ơ֥˻ꤹȡ -@code{MyISAM} ϥǡ١ǥ쥯ȥ 00, 01, 02 Ȥ̾ -@code{RAID_CHUNKS} ֥ǥ쥯ȥޤΥǥ쥯ȥΤ -줾ˡ@code{MyISAM} @code{table_name.MYD} ޤǡե -˥ǡ񤭹ޤ@code{RAID} ϥɥϺǽ -@code{RAID_CHUNKSIZE} *1024 ХȤǽΥեˡ -@code{RAID_CHUNKSIZE} *1024 ХȤ򼡤Υե˥ޥåפޤ -@end itemize - - -@node Silent column changes, , CREATE TABLE, CREATE TABLE -@subsection ۤΥեѹ - -ĤΥˤ@strong{MySQL}ϡ@code{CREATE TABLE}ơȥȤͿ줿եۤѹޤ -( @code{ALTER TABLE} ǵ뤫⤷ޤ) - -@itemize @bullet -@item -եĹ4̤@code{VARCHAR}եɤ@code{CHAR}ѹޤ - -@item -ơ֥ˤĤβĹեɤ硢Ū˥쥳ΤĹȤʤޤ -η̡ơ֥뤬ĤβĹե(@code{VARCHAR}@code{TEXT}ڤ@code{BLOB}) -ĤʤС3ʸ礭եĹƤ@code{CHAR}եɤϡ -@code{VARCHAR}եɤѹޤ -ΤȤϡեɤλˡˤϱƶޤ -@strong{MySQL}Ǥϡ@code{VARCHAR}ʸǼ뤿1Ĥμʤ˲᤮ޤ -@strong{MySQL}ϡڡΥСԤޤơ֥®Ԥޤ -@xref{Table types}. - -@item -@code{TIMESTAMP}եɤɽϡ214ϰϤζǤʤФʤޤɽ014礭ꤷ硢14˶ޤ113ϰϤδξ硢礭ζͤ˶ޤ - -@item -@code{TIMESTAMP} եɤˤ @code{NULL} Ǥޤ @code{NULL} -ߤ򥻥åȤޤ -@code{NULL} and @code{NOT NULL} °̾ˡǤŬѤ줺 -Ϳ̵뤵ޤ -@code{DESCRIBE tbl_name} Ͼ @code{TIMESTAMP} եɤ @code{NULL} ͤ -줿𤲤ޤ - -@item -@strong{MySQL} ¾ SQL ǡ١λѤƤ뷿 @strong{MySQL} -ޥåפޤ @xref{Other-vendor column types}. -@end itemize - -⤷ @strong{MySQL} եɤη򤢤ʤꤷΤȰ㤦Τˤɤ -Τꤿ硢ơ֥κalter ˡ @code{DESCRIBE tbl_name} ʸ -ȯԤޤ - -@cindex @code{myisampack} -@code{myisampack}Ѥƥơ֥򰵽̤硢̤Υեѹٵ뤳Ȥޤ -@xref{Compressed format}. - -@findex ALTER TABLE -@node ALTER TABLE, DROP TABLE, CREATE TABLE, Reference -@section @code{ALTER TABLE}ʸ - -@example -ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...] - -alter_specification: - ADD [COLUMN] create_definition [FIRST | AFTER column_name ] - or ADD [COLUMN] (create_definition, create_definition,...) - or ADD INDEX [index_name] (index_col_name,...) - or ADD PRIMARY KEY (index_col_name,...) - or ADD UNIQUE [index_name] (index_col_name,...) - or ALTER [COLUMN] col_name @{SET DEFAULT literal | DROP DEFAULT@} - or CHANGE [COLUMN] old_col_name create_definition - or MODIFY [COLUMN] create_definition - or DROP [COLUMN] col_name - or DROP PRIMARY KEY - or DROP INDEX index_name - or RENAME [AS] new_tbl_name - or table_options -@end example - -@code{ALTER TABLE}ϡ¸Υơ֥ι¤ѹǽˤޤ -㤨Сեɤɲäǥåκ˴¸Υե°ѹڤӥեɤơ֥뤽ΤΤ̾ѹǤ -ޤơ֥ΥȤơ֥ηѹ뤳ȤǽǤ -@xref{CREATE TABLE, , @code{CREATE TABLE}}. - -⤷ @code{ALTER TABLE} ǥեѤƤ @code{DESCRIBE tbl_name} -եɤѹƤʤȼʤ顢 @strong{MySQL} - @ref{Silent column changes}. ˽Ҥ٤ƤͳΰĤѹƤʤǽ -ޤ 㤨С @code{VARCHAR} եɤ @code{CHAR} ˤ褦Ȥ, -@strong{MySQL} ϤΥơ֥¾βĹΥեɤ뤫ꡢ -@code{VARCHAR} Τޤޤˤ褦Ȥޤ - -@code{ALTER TABLE}ϥꥸʥΥơ֥ΰŪʥԡ뤳Ȥˤưޤ -ԡؤѹȤλȡꥸʥΥơ֥Ϻ쿷줿̾ѹޤƤѹưŪ˿ơ֥ФƼ»ܤ뤳Ȥˤꡢäѹ̵˴λޤ@code{ALTER TABLE}¹ԤƤ֡ꥸʥΥơ֥¾Υ饤ȤɤߤǽǤΥơ֥ؤι񤭹ߤϡơ֥뤬λȤʤޤ٤餵ޤ - -@itemize @bullet -@item -@code{ALTER TABLE}ȤˤϡΥơ֥@strong{select}@strong{insert} -@strong{delete}@strong{update}@strong{create}줫@strong{drop} -¤ɬפǤ - -@item -@code{IGNORE}ANSI SQL92Ф@strong{MySQL}γĥǤ -ϡơ֥Υˡǽʣäư椷ޤ -@code{IGNORE}ꤵʤ硢ԡϰ۾ェλХåޤ -@code{IGNORE}ꤵ줿硢ˡνʣä쥳ɤФǽΥ쥳ɤѤ¾Ϻޤ - -@item -1Ĥ@code{ALTER TABLE}ơȥȤǡ@code{ADD}@code{ALTER} -@code{DROP}줫@code{CHANGE}ʣŪȯԤǽǤ -ϡ@code{ALTER TABLE}ơȥ1Ĥ -ʤANSI SQL92Ф@strong{MySQL}γĥǤ - -@item -@code{CHANGE col_name}@code{DROP col_name}ڤ@code{DROP -INDEX}ANSI SQL92Ф@strong{MySQL}γĥǤ - -@item -@code{MODIFY} @code{Oracle} @code{ALTER TABLE} ĥǤ - -@item -ץ@code{COLUMN}ϼ­ǤꡢҤʤȤǽǤ - -@item -¾Υץ̵@code{ALTER TABLE tbl_name RENAME AS new_name}Ѥȡ -@strong{MySQL}@code{tbl_name}˰פơ֥̾ñѹޤ -ƥݥơ֥κɬפȤޤ - -@item -@code{create_definition}ϡ@code{CREATE TABLE}ˤ@code{ADD}@code{CHANGE}ƱʸѤޤ -@xref{CREATE TABLE, , @code{CREATE TABLE}}. - -@item -@code{CHANGE old_col_name create_definition}Ѥ뤳Ȥˤեɤ̾ѹ뤳ȤǤޤ -Τ褦ʤȤԤˤϡեɤε̾Τȿ̾Ρ줫餽Υեɤθߤηꤹɬפޤ㤨С@code{INTEGER}եɤ@code{a}@code{b}ѹ硢ʲΤ褦˼¹Ԥ뤳ȤǤޤ: - -@example -mysql> ALTER TABLE t1 CHANGE a b INTEGER; -@end example - -⤷եɤ̾Ѥ뤳ȤʤѹǤäƤ⡢ - @code{CHANGE} ʸϡȤƱ̾ǤäƤ⡢ -Ĥ̾ꤹ褦׵ᤷޤ -: - -@example -mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL; -@end example - - @strong{MySQL} 3.22.16a , @code{MODIFY} Ѥơ -̾ѹ򤹤뤳Ȥʤեɤηѹ뤳ȤǤޤ - -@example -mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL; -@end example - -@item -@code{CHANGE} @code{MODIFY} Ѥơեɤΰ˥ǥå -¸ߤ褦ʥեɤû褦ȤƤ(㤨 @code{VARCHAR} ե -ɤκǽ10ʸˤ˥ǥå)ǥå줿ʸ -եɤû뤳ȤϤǤޤ - -@item -@code{CHANGE} @code{MODIFY} Ѥƥեɤηѹ硢 -@strong{MySQL}ϲǽʸ¤꿷˥ǡ򥳥СȤ褦Ȼߤޤ - -@item -@strong{MySQL} 3.22ʹߤǤϡ@code{FIRST}@code{ADD ... AFTER col_name}Ѥơơ֥Υ쥳λꤷ֤ˡեɤɲä뤳ȤǤޤ -ǥեȤǤϡեɤ(Υ쥳ɤ)Ǹɲäޤ - -@item -@code{ALTER COLUMN}ϡեɤοʽͤꤷꡢեɤθŤͤꤷޤ -Ťͤ졢եɤ@code{NULL}硢ʽͤ@code{NULL}Ȥʤޤ -@code{NULL}ʤ硢@strong{MySQL}ϤͤƤޤ -Ƥͤϡ -@ref{CREATE TABLE, , @code{CREATE TABLE}}. Ƥޤ - -@item -@code{DROP INDEX}ϡǥåޤANSI SQL92Ф@strong{MySQL}γĥǤ - -@item -եɤơ֥뤫ȡΥեɤޤޤƤ륤ǥå⤽Υեɤޤ -ǥåƤΥեɤȡΥǥåޤ - -@item -@code{DROP PRIMARY KEY}ϡץ饤ޥꡦǥåޤ⤷ץ饤ޥꥤǥå¸ߤʤСΥơ֥κǽ@code{UNIQUE}ǥåޤ -(@strong{MySQL}ϡŪ@code{PRIMARY KEY}ꤵʤкǽ@code{UNIQUE}@code{PRIMARY KEY}Ȥưޤ) - -@item -@findex mysql_info() -C APIؿ@code{mysql_info()}ˤꡢɤΥ쥳ɤԡ줿(@code{IGNORE}ꤵƤ)ɤΥ쥳ɤˡνʣˤ줿Ĵ٤뤳ȤǤޤ - -@item -@cindex Foreign keys -@cindex References -@code{FOREIGN KEY}@code{CHECK}ڤ@code{REFERENCES}ϡºݤˤ -⤷ޤ󡣤ιʸϡߴΤѰդƤꡢ -¾SQLФΥɤΰܿưפˤꡢ -Ⱦȶ˥ơ֥褦ʥץꥱư -뤳ȤŪȤƤޤ -@xref{Missing functions}. -@end itemize - -ʲϡ@code{ALTER TABLE}λɽǤ -˼褦˺줿ơ֥@code{t1}Ϥޤ: - -@example -mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10)); -@end example - -ơ֥@code{t1}̾@code{t2}ѹˤ: - -@example -mysql> ALTER TABLE t1 RENAME t2; -@end example - -ե @code{a} @code{INTEGER} @code{TINYINT NOT NULL} -(̾Ʊޤޤ)ѹ -@code{b} @code{CHAR(10)} @code{CHAR(20)} ѹĤġ -̾ @code{b} @code{c}ѹˤ: - -@example -mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20); -@end example - -@code{TIMESTAMP}ɲä̾@code{d}Ȥˤ: - -@example -mysql> ALTER TABLE t2 ADD d TIMESTAMP; -@end example - -ե@code{d}˥ǥåɲäե@code{a}ץ饤ޥꡦȤˤ: - -@example -mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a); -@end example - -ե@code{c}ˤ: - -@example -mysql> ALTER TABLE t2 DROP COLUMN c; -@end example - -@code{c} Ȥ̾ @code{NULL} Ĥʤ @code{AUTO_INCREMENT} -եɤɲäˤ: - -@example -mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, - ADD INDEX (c); -@end example - -Dz桹 @code{c} 򥤥ǥåꤷΤϡ @code{AUTO_INCREMENT} եɤ -ǥåǤ٤ǡ @code{c} @code{NOT NULL} ꤷƤΤ -ǥåեɤ @code{NULL} ˤǤʤǤ - -@code{AUTO_INCREMENT} եɤɲä硢եɤͤ -ưŪ˥ֹޤ - -See also @xref{ALTER TABLE problems, , @code{ALTER TABLE} problems}. - - -@findex DROP TABLE -@node DROP TABLE, OPTIMIZE TABLE, ALTER TABLE, Reference -@section @code{DROP TABLE}ʸ - -@example -DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...] -@end example - -@code{DROP TABLE}ϡ11İʾΥơ֥˴ޤơ֥ƤΥǡȥơ֥@emph{˴}ޤΤǡΥޥɤλѤϿŤ˹ԤäƤ - -@strong{MySQL} 3.22ʹߤǤϡơ֥뤬¸ߤʤȤ˵륨顼ɤˡ @code{IF EXISTS} Ѥ뤳ȤǤޤ - - -@findex OPTIMIZE TABLE -@node OPTIMIZE TABLE, CHECK TABLE, DROP TABLE, Reference -@section @code{OPTIMIZE TABLE}ʸ - -@example -OPTIMIZE TABLE tbl_name -@end example - -@code{OPTIMIZE TABLE}ϡơ֥ʬꡢĹȤʤäƤơ֥(@code{VARCHAR}@code{BLOB}⤷@code{TEXT}եɤĥơ֥)¿ѹä˻Ѥ٤Ǥ -줿쥳ɤϥ󥯥ꥹȤǰݻ졢@code{INSERT}ϡŤ쥳ɰ֤Ѥޤ -̤ΰ뤿@code{OPTIMIZE TABLE}Ѥ뤳ȤǤޤ - -@code{OPTIMIZE TABLE}ϡꥸʥΥơ֥ΰŪʥԡ뤳Ȥˤưޤ -Ťơ֥Ͽơ֥(̤ѥ쥳ɤ)ԡ졢 -Υơ֥뤬Ƥ鿷ơ֥̾ѹޤ -@code{OPTIMIZE TABLE}¹ԤƤ֡ꥸʥΥơ֥¾Υ饤ȤɤߤǽǤ -Υơ֥ؤι񤭹ߤϡơ֥뤬λȤʤޤ٤餵ޤ -ƤѹưŪ˿ơ֥ФƼ»ܤ뤳Ȥˤꡢäѹ̵˴λޤ - - -@findex CHECK TABLE -@node CHECK TABLE, REPAIR TABLE, OPTIMIZE TABLE, Reference -@section @code{CHECK TABLE} ʸ - -@example -CHECK TABLE tbl_name[,tbl_name...] [TYPE = QUICK] -@end example - -ơ֥Υ顼åޤΥޥɤϼΥեɤĥơ -֤ޤ: - -@multitable @columnfractions .35 .65 -@item Table @tab ơ֥̾ -@item Op @tab 'check' -@item Msg_type @tab @code{status}, @code{error}, @code{info}, @code{warning} ΰġ -@item Msg_text @tab å -@end multitable - -: å줿ƥơ֥Ф¿Υ쥳ɤޤ -Σ쥳ɤ @code{Msg_type status} ˤʤꡢ̾ @code{OK} Ǥ -Ǥ@code{OK} ʤϡơ֥ν̤̾¹Ԥ٤ -@xref{Table maintenance} - -@code{TYPE=QUICK} Ϳ줿ϡ@strong{MySQL} ϸĹ쥳ɥơ -֥Υ쥳ɤޤ - -@code{CHECK TABLE} @code{MyISAM} ơ֥ươ֥Ф -@code{myisamchk -m table_name} μ¹ԤƱȤǤ - -@findex REPAIR TABLE -@node REPAIR TABLE, DELETE, CHECK TABLE, Reference -@section @code{REPAIR TABLE} ʸ - -@example -REPAIR TABLE tbl_name[,tbl_name...] [TYPE = QUICK] -@end example - -@code{REPAIR TABLE} @code{MyISAM} ơ֥ưޤơ֥ -@code{myisamchk -r table_name} ¹Ԥ뤳ȤƱǤ - -줿ơ֥ޤޥɤϼΥեɤޤơ֥֤ -: - -@multitable @columnfractions .35 .65 -@item Table @tab ơ֥̾ -@item Op @tab 'repair' -@item Msg_type @tab @code{status}, @code{error}, @code{info}, @code{warning} Τɤ줫 -@item Msg_text @tab å -@end multitable - -: 줿ƥơ֥ξ¿Υ쥳ɤ뤳ȤޤǸ -Σ쥳ɤ @code{Msg_type status} ˤʤꡢ̾ @code{OK} Ǥ٤ -Ǥ@code{OK} ʤС@code{myisamchk -o} ǥơ֥ν -ߤ٤Ǥ@code{REPAIR TABLE} Ϥޤ @code{myisamchk} Τ٤ƤΥץ -ƤʤǤᤤ衢桹ϤˤͽǤ - -If @code{TYPE=QUICK} is given then @strong{MySQL} will try to do a -@code{REPAIR} of only the index tree. - -@findex DELETE -@node DELETE, SELECT, REPAIR TABLE, Reference -@section @code{DELETE}ʸ - -@example -DELETE [LOW_PRIORITY] FROM tbl_name - [WHERE where_definition] [LIMIT rows] -@end example - -@code{DELETE}ϡ@code{tbl_name}ꡢ@code{where_definition}ˤͿ줿쥳ɤ줿쥳ɿ֤ޤ - -@code{WHERE}ꤹ뤳Ȥʤ@code{DELETE}ȯԤ硢ƤΥ쥳ɤޤ -@strong{MySQL}ϡơ֥ƺ뤳ȤǼ¸ƤꡢϡƤΥ쥳ɤºݤ˺⤫ʤ᤯ưޤ -ξ@code{DELETE}ϡƶΤä쥳ɿȤ0֤ޤ -(ƺϡΥǡǼƤե򥪡ץ󤹤뤳Ȥʤ»ܤޤ顢@strong{MySQL}ϼºݤ˺줿쥳ɿ֤ȤǤޤ -Ȥǡե䥤ǥåե뤬𤵤줿ȤƤ⡢ơ֥ե@file{tbl_name.frm}ͭǤ¤ꡢΤ褦ˡǥơ֥κƺǽȤʤޤ) - -⤷ƤΥ쥳ɤƤˡĤΥ쥳ɤä졢ĤΥ쥳ɤ -ԡɤˤƤΤΤꤿʤС -@code{DELETE} ʸʲΤ褦˻Ѥޤ - -@example -mysql> DELETE FROM tbl_name WHERE 1>0; -@end example - - @code{DELETE FROM tbl_name} @code{WHERE} ʤǹԤ⡢ -ȤƤ٤Ǥʤʤ٤ǾäȤ뤫Ǥ - -@code{LOW_PRIORITY}ꤷ硢Υơ֥ɤǤ륯饤Ȥʤʤޤ@code{DELETE}μ¹Ԥ٤餻ޤ - -줿쥳ɤϥ󥯥ꥹȤǰݻ졢@code{INSERT}ϡŤ쥳ɰ֤Ѥޤ -ե꾮ϡ@code{OPTIMIZE TABLE}ơȥȤơ֥κΤ@code{myisamchk}ƥƥѤƤ -@code{OPTIMIZE TABLE}ñǤ@code{myisamchk}᤯ưޤ -@xref{OPTIMIZE TABLE, , @code{OPTIMIZE TABLE}}, -@ref{Optimization}. - -@strong{MySQL}-ò @code{DELETE} @code{LIMIT rows} ץ -С˾äΥ쥳ɿĤޤ @code{DELETE} ޥɤ -ޤ¿λ֤ʤ˻Ѥޤ -@code{LIMIT} ͤ affected row οʤʤޤǡ -ñ @code{DELETE} ޥɤ򷫤֤Ǥ - -@findex SELECT -@node SELECT, JOIN, DELETE, Reference -@section @code{SELECT}ʸ - -@example -SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] - [HIGH_PRIORITY] - [DISTINCT | DISTINCTROW | ALL] - select_expression,... - [INTO @{OUTFILE | DUMPFILE@} 'file_name' export_options] - [FROM table_references - [WHERE where_definition] - [GROUP BY @{unsigned_integer | col_name | formula@}] - [HAVING where_definition] - [ORDER BY @{unsigned_integer | col_name | formula@} [ASC | DESC] ,...] - [LIMIT [offset,] rows] - [PROCEDURE procedure_name] ] -@end example - -@code{SELECT}̾1Ĥޤ1İʾΥơ֥뤫쥳ɤ򸡺ФΤ˻Ѥޤ -@code{select_expression} ϼФեɤ򼨤ޤ -@code{SELECT}Ϥޤơ֥λȤʤ˷׻ˤäƵ줿쥳ɤФ˻Ѥޤ: - -@example -mysql> SELECT 1 + 1; - -> 2 -@end example - -ƤΥɤλѤϡ嵭˼褦ʽΤͿɬפޤ㤨С@code{HAVING}ɬ@code{GROUP BY}θ塢@code{ORDER BY}ǤʤФʤޤ - -@itemize @bullet - -@item -@cindex Aliases, on expressions -@cindex Expression aliases -@code{SELECT}ɽǤϡ@code{AS}ˤ̾λ꤬ǽǤ̾ϡե̾ɽȤƻȤ졢@code{ORDER BY}ڤ@code{HAVING}ȤȤ˻Ѥ뤳ȤǤޤ -: - -@example -mysql> select concat(last_name,', ',first_name) AS full_name - from mytable ORDER BY full_name; -@end example - -@item -@code{FROM table_references}ϡ(㤨С򤹤쥳ɤˤꡢ1Ϥʾ)礹ơ֥ΥꥹȤ򼨤ޤ -ΥꥹȤϤޤ@code{LEFT OUTER JOIN}ȤޤळȤޤ -@xref{JOIN, , @code{JOIN}}. - -@item -@code{col_name}@code{tbl_name.col_name}@code{db_name.tbl_name.col_name}Τ褦ˤƥեɤɽȤǤޤ -@code{SELECT}ơȥǤλȤۣǤʤС@code{tbl_name}@code{db_name.tbl_name}Τ褦ʥץեåܺ٤˵ҤɬפϤޤ -ŪʥեɤλɬפȤۣʻȤϡ@ref{Legal names}򻲾ȤΤȡ - -@item -@cindex Aliases, for tables -@cindex Table aliases -ơ֥뻲Ȥϡ@code{tbl_name AS alias_name}@code{tbl_name alias_name}Ȥä̾Ѥ뤳ȤǽǤ - -@example -mysql> select t1.name, t2.salary from employee AS t1, info AS t2 - where t1.name = t2.name; -mysql> select t1.name, t2.salary from employee t1, info t2 - where t1.name = t2.name; -@end example - -@item -@code{LIKE}ɽˤơ磻ɥɡ饯Ǥ@samp{%}@samp{_} -ϡ̾Υ磻ɥɤȤƤΰ̣뤿@samp{\}θ֤뤳Ȥˤꡢ@samp{%}@samp{_}θ˻Ȥޤ - -@item -Ѥ򤵤줿եɤϡ@code{ORDER BY}@code{GROUP BY}ˤơե̾եɤΥꥢ̾ϥեֹˤƻؤȤǤޤեֹ1Ϥޤޤ - -@example -mysql> select college, region, seed from tournament - ORDER BY region, seed; -mysql> select college, region AS r, seed AS s from tournament - ORDER BY r, s; -mysql> select college, region, seed from tournament - ORDER BY 2, 3; -@end example - -ս¤٤ˤϡ @code{ORDER BY} ǡʤ¤٤ȻפäƤ -եɤ̾θˡ @code{DESC} (descending) ɤ -ɲäޤ -ǥեȤϾǤ @code{ASC} ɤꤷȤˤʤޤ - -@item -@code{HAVING}ϡ@code{select_expression}ˤƤɤΥեɤ̾䥨ꥢ̾ǤؤȤǤޤ -ϺǸŬѤ졢饤Ȥ˥ƥबľ˼¹ԤΤǡŬޤ -@code{WHERE}ǽ񤯤٤Τ@code{HAVING}ѤƤϤޤ -㤨СΤ褦˽񤤤ƤϤޤ: - -@example -mysql> select col_name from tbl_name HAVING col_name > 0; -@end example - -ˡΤ褦˽񤤤Ƥ: - -@example -mysql> select col_name from tbl_name WHERE col_name > 0; -@end example - -@strong{MySQL} 3.22.5ʹߤǤϡΤ褦˥򵭽Ҥ뤳ȤǤޤ: - -@example -mysql> select user,max(salary) from users - group by user HAVING max(salary)>10; -@end example - -@strong{MySQL}θŤСǤϡ˼Τ褦˵ҤǤޤ: - -@example -mysql> select user,max(salary) AS sum from users - group by user HAVING sum>10; -@end example - -@item -@code{SQL_SMALL_RESULT}, @code{SQL_BIG_RESULT}, @code{SQL_BUFFER_RESULT}, -@code{STRAIGHT_JOIN}, @code{HIGH_PRIORITY} ANSI SQL92 Ф @strong{MySQL} ĥǤ - -@item -@code{HIGH_PRIORITY} ϡơ֥ι @code{SELECT} ͥ褵ޤ -ϰ٤Ǵλ롢ȤƤ®ˤΤŬѤ٤Ǥ -⤷꡼ɥåƤơ֥뤬äȤ -Ȥ update ʸΥơ֥βԤäƤȤƤ⡢ -@code{SELECT HIGH_PRIORITY} ϼ¹Ԥޤ - -@item -@code{SQL_BIG_RESULT} @code{GROUP BY} @code{DISTINCT} ȶ˻Ѥ -Ǥ̥åȤ¿Υ쥳ɤĤȤ򥪥ץƥޥΤ餻ޤ -ξ硢ɬפʤ @strong{MySQL} ϥǥ١ΰơ֥ľܻ -ޤ@code{MySQL} Ϥξ硢@code{GROUP BY} ǾΥǰơ -Ԥʤ˥ȤԤʤȤ򤷤ޤ - -@item -@code{SQL_SMALL_RESULT} (@strong{MySQL} ͭΥץ) @code{GROUP BY} - @code{DISTINCT} ȶ˻ѤǤ -̥åȤʤ뤳Ȥ򥪥ץƥޥΤ餻ޤξ硢 -@strong{MySQL} ϥȤˡ®ơ֥̤¸Τ -˻Ѥޤ @strong{MySQL} 3.23 Ǥϡ̾ɬפǤϤޤ - -@item -@code{STRAIGHT_JOIN}ϡ@code{FROM}ˤƵҤ줿ơ֥ν˽äƷ礹褦ץƥޥ˶ޤץƥޥơ֥ŬʽǷ礷ʤˡΥԡɥåפΤˤѤ뤳ȤǽǤ -@xref{EXPLAIN, , @code{EXPLAIN}}. - -@item -@code{LIMIT} ϡ @code{SELECT} ʸ֤쥳ɿꤹΤ -Ѥޤ @code{LIMIT} ϰĤĤοΰޤ - -2Ϳ줿ʤСǽΰϺǽΥ쥳ɤΥեåȤ򼨤2Ĥΰ֤쥳ɤκ򼨤ޤ -Υ쥳ɤΥեåȤ0Ǥ(1ǤϤޤ) - -@example -mysql> select * from table LIMIT 5,10; # 615ܤ֤ -@end example - -⤷Ĥʤ顢֤٤쥳ɤκԿꤷȤˤʤޤ - -@example -mysql> select * from table LIMIT 5; # ǽ5ԤФ -@end example - -С@code{LIMIT n} @code{LIMIT 0,n} ƱǤ - -@item -@tindex /etc/passwd -@code{SELECT}ν񼰡@code{SELECT ... INTO OUTFILE 'file_name'}ϡ򤵤줿쥳ɤե˽񤭹ߤޤ -եϥе˺졢¸ߤեǤäƤϤʤޤ(@file{/etc/passwd}Τ褦ʥե˲ɻߤޤ) -@code{SELECT ... INTO OUTFILE}ϡ@code{LOAD DATA INFILE}εդǤ@code{export_options}ιʸϡ@code{LOAD DATA INFILE}ơȥȤΰǻȤ@code{FIELDS}@code{LINES}Ʊ褦ʹǤ -@xref{LOAD DATA, , @code{LOAD DATA}}. - -@code{INTO OUTFILE}ȤȤס饯@code{ASCII 0} (nul)ƤΥߥ͡饯ϡǥեȤǥפ뤳Ȥ˵ĤƤ -@xref{LOAD DATA, , @code{LOAD DATA}}. - -̤ȤƼФƥȥեǤϡ -ʲ˼ʸ @code{ESCAPED BY} ʸˤäƥפޤ - -@itemize @bullet -@item @code{ESCAPED BY} ʸ -@item @code{FIELDS TERMINATED BY} κǽʸ -@item @code{LINES TERMINATED BY} κǽʸ -@end itemize - -ˡ @code{ASCII 0} ϡ@code{ESCAPED BY} 0 (@code{ASCII 48}) ˥СȤޤ - -ʤ @code{FIELDS TERMINATED BY}, @code{ESCAPED BY}, @code{LINES TERMINATED BY} -ꤵƤʸ⡢פʤФʤʤͳϡ -ƥȥեɤ֤褦ˤ뤿ʤΤǤ -@code{ASCII 0} ϤĤΥڡ㡼Ǥ⸫褦ˤ뤿 -פΤǤ - -̤Υե SQL ʸޤǤʤΤǡ⥨פɬפϤޤ -@end itemize - -@findex DUMPFILE -@code{INTO OUTFILE} @code{INTO DUMPFILE} Ѥȡ -@strong{MySQL} ϥեˣ쥳ɤ񤭤ޤեɤԤνü -Ȥ٤ƤΥפޤߤޤ󡣤ϥե BLOB Ǽ -Ǥ - -@findex JOIN -@findex INNER JOIN -@findex CROSS JOIN -@findex LEFT JOIN -@findex LEFT OUTER JOIN -@findex NATURAL LEFT JOIN -@findex NATURAL LEFT OUTER JOIN -@findex STRAIGHT_JOIN -@node JOIN, INSERT, SELECT, Reference -@section @code{JOIN} ʸ - -@strong{MySQL}ϡʲ˼@code{SELECT}ơȥȤˤ@code{JOIN}ʸ򥵥ݡȤޤ: - -@example -table_reference, table_reference -table_reference [CROSS] JOIN table_reference -table_reference INNER JOIN table_reference join_condition -table_reference STRAIGHT_JOIN table_reference -table_reference LEFT [OUTER] JOIN table_reference join_condition -table_reference LEFT [OUTER] JOIN table_reference -table_reference NATURAL [LEFT [OUTER]] JOIN table_reference -@{ oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr @} -@end example - -Where @code{table_reference} is defined as -@example -table_name [[AS] alias] [USE INDEX (key_list)] [IGNORE INDEX (key_list)] -@end example - -and @code{join_condition} is defined as - -@example -ON conditional_expr | -USING (column_list) -@end example - -Note that in version before 3.23.16 the @code{INNER JOIN} didn't take -a join condition! - -@cindex ODBC compatibility -@cindex Compatibility, with ODBC -˼Ǹ@code{LEFT OUTER JOIN}ʸϡODBCȤθߴΤ¸ߤޤ - -@itemize @bullet -@item -table referenceϡ@code{tbl_name AS alias_name}@code{tblname alias_name}ˤ̾ꤹ뤳ȤǤޤ - -@example -mysql> select t1.name, t2.salary from employee AS t1, info AS t2 - where t1.name = t2.name; -@end example - -@item -@code{INNER JOIN}@code{,} ()ϡƱǤɤѤơ֥֤ľѤȤޤ̾@code{WHERE}ˤơơ֥뤬ɤΤ褦˥󥯤٤ޤ - -@item -@code{ON}ϡ@code{WHERE}ǻѤ褦ʾʸν񼰤Ǥ - -@item -⤷@code{LEFT JOIN} @code{ON} @code{USING} ˤ -¦Υơ֥˥ޥå쥳ɤ̵ä硢 -ƤΥեɤ@code{NULL}Ǥ1ĤΥ쥳ɤ¦Υơ֥ȤƻѤޤ -λ¤ϡơ֥ˤĤơ¾Υơ֥б쥳ɤ¸ߤʤ쥳ɤõȤȤѤǤޤ: - -@example -mysql> select table1.* from table1 - LEFT JOIN table2 ON table1.id=table2.id - where table2.id is NULL; -@end example - -ϡ@code{table1}⡢@code{id}ͤ@code{table2}¸ߤʤƤΥ쥳ɤ򸡺ޤ(¨@code{table2}Υ쥳ɤȰפʤ@code{table1}ƤΥ쥳ɡ) -󡢤ξ@code{table2.id}ϡ@code{NOT NULL}ƤΤȲꤷޤ - -@item -@code{USING} @code{(column_list)}Υե̾ꥹȤϡξΥơ֥¸ߤʤФʤޤ@code{USING}᤬Τ褦: - -@example -A LEFT JOIN B USING (C1,C2,C3,...) -@end example - -뤳Ȥϡ@code{ON}Τ褦ΤƱǤ: - -@example -A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,... -@end example - -@item -Ʊե̾2ĤΥơ֥ @code{NATURAL [LEFT] JOIN} ϡ -@code{USING} ȼä @code{INNER JOIN} @code{LEFT JOIN} -ƱȤޤ - -@item -@code{STRAIGHT_JOIN}ϡ¦Υơ֥ˡ˺¦Υơ֥ɤळȤС@code{JOIN}ƱȤǤϡ祪ץƥޥʽǥơ֥Ϥ褦ʤޤʻ֤˻ѤǤޤ - -@item -@strong{MySQL} 3.23.12 顢ơ֥뤫Фˡ -@strong{MySQL} ɤΥǥåѤ٤ȤҥȤͿ뤳Ȥ -Ǥ褦ˤʤޤϡ@strong{MySQL} ְäǥå -ѤƤ뤳Ȥ @code{EXPLAIN} ͭѤǤ@code{USE INDEX -(key_list)} ꤹ뤳Ȥˤäơơ֥뤫쥳ɤ򸫤Ĥ뤿ˡ -ꤵ줿ǥåΰĤѤ褦 @strong{MySQL} 뤳 -ȤǤޤ̤ιʸ @code{IGNORE INDEX (key_list)} ϡ@strong{MySQL} -ΥǥåѤʤ褦뤿˻ѤǤޤ -@end itemize - -: - -@example -mysql> select * from table1,table2 where table1.id=table2.id; -mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id; -mysql> select * from table1 LEFT JOIN table2 USING (id); -mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id - LEFT JOIN table3 ON table2.id=table3.id; -mysql> select * from table1 USE INDEX (key1,key2) WHERE key1=1 and key2=2 AND - key3=3; -mysql> select * from table1 IGNORE INDEX (key3) WHERE key1=1 and key2=2 AND - key3=3; -@end example - -@xref{LEFT JOIN optimization, , @code{LEFT JOIN} optimization}. - -@findex INSERT -@node INSERT, REPLACE, JOIN, Reference -@section @code{INSERT}ʸ - -@example - INSERT [LOW_PRIORITY | DELAYED] [IGNORE] - [INTO] tbl_name [(col_name,...)] - VALUES (expression,...),(...),... -or INSERT [LOW_PRIORITY | DELAYED] [IGNORE] - [INTO] tbl_name [(col_name,...)] - SELECT ... -or INSERT [LOW_PRIORITY | DELAYED] [IGNORE] - [INTO] tbl_name - SET col_name=expression, col_name=expression, ... -@end example - -@code{INSERT}ϡ¸Υơ֥˿쥳ɤޤ -@code{INSERT ... VALUES}񼰤ϡͤܤȤƥ쥳ɤޤ -@code{INSERT ... SELECT}񼰤ϡ¾ɽ(ʣ)Ф쥳ɤޤ -ʣͥꥹȤѤ@code{INSERT ... VALUES}񼰤ϡ@strong{MySQL} 3.22.5ʹߤǥݡȤƤޤ -@code{col_name=expression}ʸϡ@strong{MySQL} 3.22.10ʹߤǥݡȤƤޤ - -@code{tbl_name}ϡ쥳ɤơ֥Ǥե̾ꥹȤϡ³ơȥȤΥեɤؤޤ - -@itemize @bullet -@item -⤷ʤեɤ @code{INSERT ... VALUES} @code{INSERT ... SELECT} ʤɤ -ʤСƤΥեɤͤ @code{VALUES()} ͿʤƤϤʤޤ -ơ֥Υեɽ礬ʾ硢Ĵ٤뤿@code{DESCRIBE tbl_name}ѤƲ - -@item -ơ֥ΰΥեɤꤷʤ硢ꤵʤäեɤˤϡ줾νͤꤵޤͤγƤϡ@ref{CREATE TABLE, , @code{CREATE TABLE}}. ǽҤ٤Ƥޤ - -@item -@code{NULL}@code{TIMESTAMP}եɤ硢եɤˤϸ߻郎åȤޤ¾ͤ硢ꤵ줿ͤñ˥åȤޤ - -@item -@code{expression}ϡͥꥹƬ˶ᤤΥեɤ򻲾ȤʤФʤޤ -㤨СΤ褦˵ҤǤޤ: - -@example -mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2); -@end example - -Τ褦ˤϵҤǤޤ: - -@example -mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15); -@end example - -@item -@code{LOW_PRIORITY}ꤷ硢@code{INSERT}μ¹ԤϤΥơ -֥뤫ͤɤ߹९饤Ȥʤʤޤ٤餵ޤξ硢 -饤Ȥ insert ʸλޤԤޤơ֥뤬ˤ˻Ѥ -硢Ĺ֤ޤϥ饤Ȥ٤˷³ -@code{INSERT DELAYED} оŪǤ - -@item -⤷ @code{IGNORE} ɤ @code{INSERT} ͤȤȤ Ϳʤ顢 -ơ֥ @code{PRIMARY} @code{UNIQUE} ˤǤ¸ߤʣ -Τ̵뤵졢ޤ -¿ŹԤͤޤ쥳ɤ @code{INSERT} ˥ @code{IGNORE} ꤷʤ硢 -ơ֥ @code{PRIMARY} @code{UNIQUE} ˽ʣݤˡ -۾ェλޤ -@code{IGNORE} ꤷ硢ʣ륭ͤĥ쥳ɤޤ -C API ؿ @code{mysql_info()} ˤꡢơ֥ˤĤΥ쥳ɤ줿 -å뤳ȤǤޤ - -@item -@strong{MySQL}@code{DONT_USE_DEFAULT_FIELDS}ץˤ¤Ƥ硢@code{NULL}ͤʤƤΥեɤŪͤ򤷤ʤ@code{INSERT}ơȥȤϡ顼ޤ -@xref{configure options, , @code{configure} options}. - -@item -ʲξϡ@code{INSERT INTO ... SELECT}ơȥȤΤѰդƤޤ: - -@itemize @minus -@item -꡼ϡ@code{ORDER BY}ޤळȤǤޤ - -@item -@code{INSERT}ơȥȤΥåȤȤʤơ֥ϡ꡼@code{SELECT}@code{FROM}˻Ǥޤ󡣤ʤʤ顢Υơ֥뤫@code{SELECT}ANSI SQLǶؤƤ뤫Ǥ(ϡ@code{SELECT}¹쥳ɤФ뤳ȤǽǤ뤳ȤǤ䤤碌ѤȤˡΤ褦ʾǺ𤷤䤹ʤޤ) - -@item -@code{AUTO_INCREMENT}եɤϡ̤̾ưޤ -@end itemize -@end itemize - -@findex mysql_info() -¿ŤͥꥹȤ @code{INSERT ... SELECT ...} @code{INSERT ... VALUES()} ơȥȤѤ硢꡼˴ؤ뤿 C APIؿ @code{mysql_info()} Ѥ뤳ȤǤޤ -ξν񼰤ϰʲ˼ʸΤ褦ˤʤޤ: - -@example -Records: 100 Duplicates: 0 Warnings: 0 -@end example - -@code{Duplicates}ϡ¸ߤˡǥåͤȽʣ뤳ȤˤꡢǤʤä쥳ɿɽޤ -@code{Warnings}ϡ줿եɤ餫ε路ͤǤäȤɽޤٹϡΤ褦ʾβȯޤ: - -@itemize @bullet -@item -@code{NOT NULL}줿եɤؤ@code{NULL}եɤˤϽͤꤵޤ - -@item -ͥեɤϰϤĶͤΥåȡͤϰθ³ͤޤ - -@item -ͥեɤؤ @code{`10.34 a'} Τ褦ͤΥåȡäƤ르ߤϼ졢ĤοʬޤͤͤȤȽǤǤʤä硢եɤˤ @code{0} åȤޤ - -@item -@code{CHAR}@code{VARCHAR}@code{VARCHAR}@code{TEXT}@code{BLOB}եɤؤκĹĶʸͤϥեɤκĹڤΤƤޤ - -@item -ϻեɤؤΥե°ȿ°Ŭ``''ͤåȤޤ -@end itemize - -@findex INSERT DELAYED -@findex DELAYED - -@code{INSERT} ʸ @code{DELAYED} ץ @strong{MySQL} ȼ -ץǡ @code{INSERT} ˽λ뤳ȤԤƤʤ -饤ȤľˡȤƤΩޤ -ϡ󥰤Τ @strong{MySQL} ѤΰŪǡλ -Ĺ֤ @code{SELECT} ơȥȤŪ˼¹ԤǤޤ -@code{DELAYED} @strong{MySQL} 3.22.15 Ƴޤ - ANSI SQL92 Ф @strong{MySQL} ĥǤ - -@code{INSERT DELAYED} Ѥ饤Ȥϰ ok Ȥʤꡢơ֥ -¾ΥåɤǻǤʤ˥쥳ɤޤ - -@code{INSERT DELAYED} Ѥۤפϡ -¿Υ饤Ȥ insert Ʊ«ͤ졢ĤΥ֥å -񤫤뤳ȤǤ ¿̡ insert ¹Ԥ -ȤƤ®ʤޤ - -ߡ塼󥰤줿쥳ɤϡ餬ơ֥ޤ -꡼ݻƤǤ ϡ⤷ @code{mysqld} -ˡ (@code{kill -9}) ǥ뤷ꡢ @code{mysqld} ͽ -硢塼󥰤Ƥ쥳ɤϥǥ˽񤫤줺ޤ - -@code{DELAYED} ץ @code{INSERT} @code{REPLACE} ǻѤ硢 -ʲΤȤޤ - ``å'' Ȥ @code{INSERT DELAYED} ޥɤåɤ򤵤 -``ϥɥ顼'' ȤΥơ֥ΤƤ -@code{INSERT DELAYED} ʸ륹åɤؤޤ - -@itemize @bullet -@item -åɤơ֥Ф @code{DELAYED} ʸ¹ԤȤ -Υơ֥ФƤ @code{DELAYED} ʸ -뤿˥ϥɥ顼åɤޤ -⤷Τ褦ʥϥɥ顼¸ߤƤʤˤϡ - -@item -ΥåɤϡΥϥɥ顼 @code{DELAYED} å˻äƤ뤫 -ɤåޤ ⤷äƤʤʤ顢褦 -ϥɥ顼˹𤲤ޤ -Ȥ¾Υåɤ @code{READ} @code{WRITE} å򤽤Υơ֥ -äƤȤƤ⡢ @code{DELAYED} å뤳ȤǤޤ -Υϥɥ顼Ƥ @code{ALTER TABLE} å - @code{FLUSH TABLES} Ԥޤ Υơ֥빽¤ǿǤΤ -μ¤ˤ뤿ˡ - -@item -åɤ @code{INSERT} ơȥȤ¹Ԥޤ쥳ɤơ֥ -˽ˡϥɥ饹åɤˤäƴ륭塼˺ǸΥ쥳ɤ -ԡ֤ޤʸˡ顼ϥåɤˤäΤ졢饤ȥץ -𤵤ޤ - -@item -饤ȤϷ̹Ԥνʣ @code{AUTO_INCREMENT} ͤ -Ǥޤ ϥС뤳ȤǤޤ ʤʤ顢 - @code{INSERT} ϥ󥵡ȥڥ졼󤬴˽λ -֤뤫Ǥ ⤷ C API ѤƤʤ顢 @code{mysql_info()} ؿ -Ʊͤͳˤʤˤ֤ޤ - -@item -ϡ쥳ɤΥơ֥ insert 줿ȤΥϥɥ顼å -ˤäƹޤ ʣ쥳ɤξ硢 ϺǽιԤ -줿Ȥ˹ޤ - -@item -줾 @code{delayed_insert_limit} 쥳ɤ񤫤줿塢Υϥɥ顼 -ʤ @code{SELECT} ʸޤƤʤǧޤ -⤷ʤ顢³ˤФƼ¹Ԥǽˤޤ - -@item -ϥɥ顼Υ塼˥쥳ɤʤʤäȤơ֥ϥåޤ -⤷ @code{INSERT DELAYED} ޥɤ @code{delayed_insert_timeout} ð -դʤСϥɥ顼Ͻλޤ - -@item -⤷Υϥɥ顼Υ塼 @code{delayed_queue_size} ʾΥ쥳ɤ -˱ƤʤСΥåɤϡ塼;͵Ԥޤ - @code{mysqld} С delayed 줿塼Ƥ -꡼μ¤˻Ѥʤ褦ˤΤΩޤ - -@item -Υϥɥ顼åɤ @strong{MySQL} ץꥹȤ @code{Command} -ˡ @code{delayed_insert} ȶɽޤ - @code{FLUSH TABLES} ޥɤ @code{KILL thread_id} ¹Ԥ뤳Ȥǡ -kill ǤǤ礦 -ϡλˡ塼ƤΥ쥳ɤơ֥ -¸褦Ȥޤ -δ֡Υåɤϡ¾Υåɤ褿ʤ - @code{INSERT} ޥɤդޤ -⤷θ @code{INSERT DELAYED} ޥɤ¹Ԥʤ顢 -ϥɥ顼åɤޤ - -@item -嵭ΤȤϡ⤷ @code{INSERT DELAYED} ޥɤäƤʤ顢 - @code{INSERT DELAYED} ޥɤϡ̤ @code{INSERT} ޥɤ⤤ -ͥ٤ĤȤȤǤ -¾ update ޥɤ @code{INSERT DELAY} 塼ˤʤޤǡ -뤤ï @code{KILL thread_id} @code{FLUSH TABLES} ¹Ԥ -ϥɥ顼򥭥뤹ޤǡ -Ԥޤ - -@item -ʲΥơѿ @code{INSERT DELAYED} ޥɤˤĤƤξ -Ϳޤ - -@multitable @columnfractions .35 .65 -@item @code{Delayed_insert_threads} @tab ϥɥ顼åɤο -@item @code{Delayed_writes} @tab @code{INSERT DELAYED} ǽ񤫤쥳ɿ -@item @code{Not_flushed_delayed_rows} @tab 񤭹ߤԤĥ쥳ɿ -@end multitable - -ѿ @code{SHOW STATUS} ʸȯԤ - @code{mysqladmin extended-status} ޥɤ¹Ԥ뤳ȤǸޤ. -@end itemize - -: @code{INSERT DELAYED} ϡơ֥뤬Ǥʤ硢̾ -INSERT ٤ʤޤ@code{INSERT DELAYED} Ѥƥơ֥ˤ -̤Υåɤ륵ФΡɲäΥСإåɤ⤢ޤϡ -μ¤ˤɬפȤˤ @code{INSERT DELAYED} Ѥ٤Ȥ -̣ޤ - -@findex REPLACE -@node REPLACE, LOAD DATA, INSERT, Reference -@section @code{REPLACE}ʸ - -@example - REPLACE [LOW_PRIORITY | DELAYED] - [INTO] tbl_name [(col_name,...)] - VALUES (expression,...) -or REPLACE [LOW_PRIORITY | DELAYED] - [INTO] tbl_name [(col_name,...)] - SELECT ... -or REPLACE [LOW_PRIORITY | DELAYED] - [INTO] tbl_name - SET col_name=expression, col_name=expression,... -@end example - -@code{REPLACE}ϡơ֥θŤ쥳ɤˡǥå -쥳ɤƱͤľˡ쥳ɤˡ -Ť쥳ɤȤȤС@code{INSERT}Ʊ褦 -ưޤ -@xref{INSERT, , @code{INSERT}}. - -@findex LOAD DATA INFILE -@node LOAD DATA, UPDATE, REPLACE, Reference -@section @code{LOAD DATA INFILE}ʸ - -@example -LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] - INTO TABLE tbl_name - [FIELDS - [TERMINATED BY '\t'] - [OPTIONALLY] ENCLOSED BY ''] - [ESCAPED BY '\\' ]] - [LINES TERMINATED BY '\n'] - [IGNORE number LINES] - [(col_name,...)] -@end example - -@code{LOAD DATA INFILE}ơȥȤϡƥȥե뤫ơ֥ؤȡ -쥳ɤ®ɤ߹ߤޤ @code{LOCAL} ɤꤵСե -饤ȡۥȤɤ߹ޤޤ -@code{LOCAL}ꤵʤСեϥФ˰֤ɬפޤ -(@code{LOCAL}ϡ@strong{MySQL} 3.22.6ʹߤѤǤޤ) - -ƥͳ顢Фƥȥեɤ߽Фϡ -ե뤬ǡ١ǥ쥯ȥ¸ߤ뤫 -Ƥɤ߹߸¤ɬפޤ -ޤХե @code{LOAD DATA INFILE} Ѥˤϡ -ǡ١ @strong{file} ¤ʤФʤޤ -@xref{Privileges provided}. - -⤷ @code{LOW_PRIORITY} ꤷ硢@code{LOAD DATA} ʸ -Υơ֥뤫¾Υ饤Ȥɤ߹ߤԤäƤ֡ -٤餵ޤ - -@code{LOCAL} Ѥ򤹤ȡ饤ȡۥȤ饵СۥȤ -եƤžʬ¿٤ʤǤ礦 -ʤСΥեɤ߹Τˡ -@strong{file} ¤ɬפʤȤȤǤ - -@cindex @code{mysqlimport} -@code{mysqlimport}ƥƥϡǡեɤ߹ߤ˻Ѥ뤳ȤǤޤ; ϡФ@code{LOAD DATA INFILE}ޥɤ뤳Ȥˤäƽ¸Ƥޤ -@code{--local}ץϡ@code{mysqlimport}ˡ饤ȡۥȤǡեɤ߹ޤޤ -饤ȤȥФ̥ץȥ򥵥ݡȤƤС®ʥͥåȥǤɤѥեޥ󥹤뤿ˡ@code{--compress}ץꤹ뤳ȤǤޤ - -СۥȤ˥ե֤硢ФϡʲΥ롼Ѥޤ: - -@itemize @bullet -@item -ʥѥǥե̾Ϳ줿硢Фϥѥ̾򤽤Τޤ޻Ѥޤ - -@item -ʣιǤХѥȶ˥ե̾Ϳ줿硢ФϡФΥǡǥ쥯ȥʲեõޤ - -@item -ե̾ñͿ줿硢Фϡ -ȤΥǡ١ǥ쥯ȥõޤ -@end itemize - -Υ롼ϡե뤬 @file{myfile.txt} Τ褦Ϳ -ǡ١ǥ쥯ȥ꤫ե뤬ɤ߽Ф졢 -@file{./myfile.txt} Τ褦ͿС򤷤Ƥǡ١Υǡǥ쥯ȥ꤫ -ե뤬ɤ߽ФȤ̣Ǥ뤳ȤդƲ - -㤨Сʲ @code{LOAD DATA} ʸϡ@file{data.txt} ե -@code{db1} ǡ١ǥ쥯ȥ꤫ɤߤޤ ʤʤ顢@code{db1} -򤵤Ƥǡ١Ǥ Ȥ@code{db2} ǡ١ -Υơ֥ˡե뤫ɤ߹ǡȤƤ⡣ - -ʲ˼褦ʹʸǤϡե @code{db1} ǡ١ǥ쥯ȥ -ɤޤޤ@code{db2} ǤϤޤ: - -@example -mysql> USE db1; -mysql> LOAD DATA INFILE "data.txt" INTO TABLE db2.my_table; -@end example - -@code{REPLACE} @code{IGNORE} ɤϡǤ¸ߤˡ -ʣƤ쥳ɤϤФǤ -@code{REPLACE} ξ硢ƱˡĴ¸Υ쥳ɤϿ쥳ɤ -֤ޤ -@code{IGNORE} ξ硢¸Υ쥳ɤΥˡȽʣ륭Ŀ쥳ɤ -Фޤ ⤷ɤꤷʤä硢ʣĤä -顼ȯƥȥե̵뤵ޤ - -@code{LOCAL} ɤѤƥǡ뤫ɤ硢 -СžȤˡΤޤ -ǥǥեȤưȤƤ @code{IGNORE} ꤵ줿Τ -Ʊˤʤޤ - -@code{LOAD DATA INFILE}ϡ@code{SELECT ... INTO OUTFILE}εդǤ -@xref{SELECT, , @code{SELECT}}. -ǡ١եإǡ񤭹ˤϡ@code{SELECT ... INTO OUTFILE}Ѥޤ -ե뤫ǡ١ɤ᤹ˤϡ@code{LOAD DATA INFILE}Ѥޤ -@code{FIELDS}@code{LINES}ιʸξΥޥɤȤƱǤ -ɤ⥪ץǤξꤹϡ@code{FIELDS}ϡ@code{LINES}˻ꤷʤФʤޤ - -@code{FIELDS}ꤷ硢(@code{TERMINATED BY}@code{[OPTIONALLY] ENCLOSED BY}ڤ@code{ESCAPED BY})ϡʤȤ⣱ĤꤷʤФʤʤȤơޤץȤʤޤ - -@code{FIELDS}ꤷʤä硢ͤϰʲΤ褦˵ҤΤȤʤޤ: - -@example -FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' -@end example - -@code{LINES}ꤷʤä硢ͤϰʲΤ褦˵ҤΤȤʤޤ: - -@example -LINES TERMINATED BY '\n' -@end example - -ȡ@code{LOAD DATA INFILE} νͤϡϤؽ񤭹ݤ˰ʲΤ褦˿񤤤ޤ: - -@itemize @bullet -@item -Ԥ쥳ɤζȤߤʤ - -@item -ʸˤäƥեɤڤ - -@item -ʸǥեɤϤǤʤΤȤ - -@item -ʸʸڤ@samp{\}@samp{\}뤳ȤˤꡢեͤΰΥƥʸǤȤƽ롣 -@end itemize - -դˡ@code{LOAD DATA INFILE}νͤϡϤɤ߹ݤ˰ʲΤ褦˿񤤤ޤ: - -@itemize @bullet -@item -եɴ֤˥ʸ - -@item -ΥʸǤեɤϤޤʤ - -@item -@samp{\}λѤˤꡢեͤǻѤ륿ʸʸ@samp{\}򥨥פ - -@item -쥳ɤν˲ʸ -@end itemize - - @code{FIELDS ESCAPED BY '\\'}Ƚ񤤤硢ñΥХååȤɤ߽ФͤȤ뤿ˡĤΥХååꤷʤФʤʤȤդƲ - -@code{IGNORE number LINES} ץϥեƬˤ쥳ɤ̵뤹Τ -Ѥޤ - -@example -mysql> LOAD DATA INFILE "/tmp/file_name" into table test IGNORE 1 LINES; -@end example - -ǡ١եإǡ񤭡줫ǤΥե뤫ǡ١إǡɤ᤹ˡ@code{SELECT ... INTO OUTFILE}Ф@code{LOAD DATA INFILE}Ȥ硢Υեɤȥ쥳ɤμ谷˴ؤ륪ץϡפʤФʤޤ󡣤ʤС@code{LOAD DATA INFILE}Ŭڤ˥եʤǤ礦 - եɤ򥳥ޤǶڤäƥեؽ񤭽Фˡ@code{SELECT ... INTO OUTFILE}ѤȤ: - -@example -mysql> SELECT * FROM table1 INTO OUTFILE 'data.txt' - FIELDS TERMINATED BY ',' - FROM ... -@end example - -޶ڤե뤫ɤ᤹ᡢơȥȤϤʤǤ礦: - -@example -mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2 - FIELDS TERMINATED BY ','; -@end example - -ȤƼ˼褦ʥơȥȤǥեɤ߹⤦ȤƤ⡢ưʤǤ礦ʤʤ顢ϡ@code{LOAD DATA INFILE}Фƥեɤδ֤˥֤õ褦ؼ뤫Ǥ: - -@example -mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2 - FIELDS TERMINATED BY '\t'; -@end example - -餯줾ϹԤñΥեɤȤƽǤ礦 - -@code{LOAD DATA INFILE}ϳեɤ߽ФȤǤޤ -㤨СdBASEեޥåȤΥեϡեɤ򥳥ޤǶڤ졢֥륯ơǰϤޤƤޤ -쥳ɤʸǶڤƤȤ顢˼եɵڤӥ쥳ɤμ谷ץꤷޥɤΤ褦ʥեɤ߹Τ˻ѤǤޤ - -@example -mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name - FIELDS TERMINATED BY ',' ENCLOSED BY '"' - LINES TERMINATED BY '\n'; -@end example - -ĤΥեɵڤӥ쥳ɤμ谷ץˡʸ(@code{''})ꤹ뤳ȤޤǤʤʤ顢@code{FIELDS [OPTIONALLY] ENCLOSED BY}@code{FIELDS ESCAPED BY}ͤñʸǤʤФʤޤ@code{FIELDS TERMINATED BY}@code{LINES TERMINATED BY}ϣİʾʸȤʤǤ礦㤨С꥿ʸȲʸΥڥǶڤ줿쥳ɤ񤭹ꡢΤ褦ʥ쥳ɤޤեɤ߹ꤹˤϡ@code{LINES TERMINATED BY '\r\n'}ꤷޤ - -@code{FIELDS [OPTIONALLY] ENCLOSED BY}ϡեɤΰ椷ޤϤκ(@code{SELECT ... INTO OUTFILE})@code{OPTIONALLY}ʤʤ顢ƤΥեɤ@code{ENCLOSED BY}ʸǰϤޤޤΤ褦ʽ(եɶڤ˥ޤ)򼡤˼ޤ: - -@example -"1","a string","100.20" -"2","a string containing a , comma","102.20" -"3","a string containing a \" quote","102.20" -"4","a string containing a \", quote and comma","102.20" -@end example - -@code{OPTIONALLY}ꤹС@code{ENCLOSED BY}ʸϡ @code{CHAR}եɤ@code{VARCHAR}եɤΤ߰ϤΤ˻Ѥޤ: - -@example -1,"a string",100.20 -2,"a string containing a , comma",102.20 -3,"a string containing a \" quote",102.20 -4,"a string containing a \", quote and comma",102.20 -@end example - -եͤˤ@code{ENCLOSED BY}ʸνиϡ@code{ESCAPED BY}ʸ򤽤֤Ȥˤꥨפ뤳ȤդƲ@code{ESCAPED BY}ͤ˶ꤹȡ@code{LOAD DATA INFILE}ˤɤ߹ʤϤǤ礦㤨СΤ褦˥ʸˤ硢ʲ˼褦ʽϤȤʤޤܤΣܤΥեɤˡ(ä)եɤڤ뤫Τ褦ʥȤ³ޤޤǤ뤳Ȥ뤷Ʋ: - -@example -1,"a string",100.20 -2,"a string containing a , comma",102.20 -3,"a string containing a " quote",102.20 -4,"a string containing a ", quote and comma",102.20 -@end example - -Ϥˤơ@code{ENCLOSED BY}ʸꤵƤꡢ줬եͤξü˸줿硢ʸϼޤ(ϡ@code{OPTIONALLY}ꤵ줿ɤ˹餺ƤϤޤޤ;@code{OPTIONALLY}ϲϤˤϸ̤ޤ) - @code{ESCAPED BY}ʸ֤줿@code{ENCLOSED BY}ʸνиϡߤΥեͤΰȤƽޤŪˤϡեɤ켫ȡ@code{ENCLOSED BY}ʸǻϤޤäƤ硢եɤȯ룲Ť@code{ENCLOSED BY}ʸϡñ@code{ENCLOSED BY}ʸȤƽޤ - 㤨С@code{ENCLOSED BY '"'}ꤵȡϰʲΤ褦ޤ: - -@example -"The ""BIG"" boss" -> The "BIG" boss -The "BIG" boss -> The "BIG" boss -The ""BIG"" boss -> The ""BIG"" boss -@end example - -@code{FIELDS ESCAPED BY}ϡüʸɤΤ褦˽񤭹ɤ߹ꤹ뤫椷ޤ - @code{FIELDS ESCAPED BY}ʸǤʤ硢ϤˤƼΤ褦ʸ(ʸ)Υץեå˻Ѥޤ: -@itemize @bullet -@item -@code{FIELDS ESCAPED BY}ʸ -@item -@code{FIELDS [OPTIONALLY] ENCLOSED BY}ʸ -@item -@code{FIELDS TERMINATED BY}ͤ@code{LINES TERMINATED BY}ͤκǽʸ -@item -ASCII 0 (ʸθ³Ƽºݤ˽񤫤ʸASCII @code{'0'}ǡ''ХȤǤϤޤ) -@end itemize - -@code{FIELDS ESCAPED BY}ʸǤСɤʸ⥨פޤ -äˡեͤ˼ʸޤǤʤСʸ˶ꤹΤϤޤɤͤȤϸʤǤ礦 - -Ϥˤơ@code{FIELDS ESCAPED BY}ʸǤʤ硢ʸνиϼ졢³ʸϥեͤΰȤƤΤޤ޼ޤ -㳰ϡפ줿@samp{0}@samp{N}Ǥ(㤨Сʸ@samp{\}Ǥ@code{\0}@code{\N}) - Υ󥹤ϡASCII 0(''Х) @code{NULL}Ȥƽޤ@code{NULL}ε§ϲ򻲾ȤƲ - -@samp{\}-escape syntax˴ؤ뤳ʳξϡ@ref{Literals}ȡ - -եɤȥ쥳ץ󤬳μ¤ߺѤ: - -@itemize @bullet -@item -@code{LINES TERMINATED BY}ʸ@code{FIELDS TERMINATED BY}Ǥʤ硢ƥ쥳ɤޤ@code{FIELDS TERMINATED BY}ǽ餻ޤ - -@item -@code{FIELDS TERMINATED BY}@code{FIELDS ENCLOSED BY}ͤξȤ(@code{''})λ(ڤʤ)ĹԥեޥåȤѤޤ -ĹԥեޥåȤǤϡեɴ֤˶ڤʸ󤬻Ѥޤ -ꡢեͤϡեɤ``ɽ''Ȥäƽ񤭹ޤ줿ꡢɤ߹ޤޤ -㤨Сեɤ@code{INT(7)}Ƥ硢եɤͤ7ʸηȤäƽ񤭹ޤޤ -Ϥˤƥեɤϡʸɤ߹ߤˤޤ -ĹԥեޥåȤϤޤ@code{NULL}ͤ˹Ѥޤ;򻲾ȤΤȡ -: ޥХʸåȤѤƤϸĹեޥåȤƯ - -@end itemize - -@code{FIELDS}@code{LINES}ץˤ@code{NULL}ͤ¿ͤʼ谷: - -@itemize @bullet -@item -@code{FIELDS}@code{LINES}νͤΤˡϻ@code{NULL}@code{\N}Ȥƽ񤭹ޤ졢ϻ@code{\N}@code{NULL}Ȥɤ߹ޤޤ(ΤȤʤ顢@code{ESCAPED BY}ʸ@samp{\}Ȥޤ) - -@item -@code{FIELDS ENCLOSED BY}̵@code{NULL}Υեͤ@code{NULL}ͤȤɤ߹ޤޤ(ϡʸ@code{'NULL'}Ȥɤ߹ޤ@code{FIELDS ENCLOSED BY}ʸǰϤޤ줿@code{NULL}Ȥϰۤʤޤ) - -@item -@code{FIELDS ESCAPED BY}λ@code{NULL}@code{NULL}Ȥƽ񤭹ޤޤ - -@item -Ĺԥեޥå(@code{FIELDS TERMINATED BY}@code{FIELDS ENCLOSED BY}ξ˵ޤ)ˤơ@code{NULL}ϡʸȤƽ񤭹ޤޤ -ϡեǤϡ@code{NULL}ͤȶͤθʬĤʤȤȤ򼨤Ƥ뤳ȤդƲե뤫ǡɤ᤹ξԤ̤ʤФʤʤ硢ĹԥեޥåȤϻѤ٤ǤϤޤ -@end itemize - -@code{REPLACE}@code{IGNORE}ϡˡͤʣ쥳ɤ¸ߤϥ쥳ɤμ谷椷ޤ -@code{REPLACE}ꤷ硢ƱˡͤĿ쥳ɤϡ¸ߤƱˡǤ쥳ɤ֤ޤ -@code{IGNORE}ꤷ硢¸ߤ쥳ɤΥˡͤȽʣϥ쥳ɤϡåפޤ -ΥץꤷƤʤ硢ʣȯ줿ǥ顼ȯƥȥեλĤ̵뤵ޤ - -@code{LOAD DATA INFILE}ǥݡȤʤ: -@itemize @bullet - -@item -Ĺ(@code{FIELDS TERMINATED BY}@code{FIELDS ENCLOSED BY}ξ)@code{BLOB}եɡ -@item -륻ѥ졼¾Ʊ⤷¾ΥץեåȤ硢@code{LOAD DATA INFILE}ϡϽǤʤǤ礦 -㤨Сʲ@code{FIELDS}θȤʤޤ: - -@example -FIELDS TERMINATED BY '"' ENCLOSED BY '"' -@end example - -@item -@code{FIELDS ESCAPED BY}ǡեͤˡ@code{FIELDS ENCLOSED BY}ͤ@code{LINES TERMINATED BY}ͤθ@code{FIELDS TERMINATED BY}ͤ褦ʤΤޤ硢եɤԤɤ߹ߤǤڤƤޤޤ -ϡ@code{LOAD DATA INFILE}եɤ쥳ɤνλ֤ʤȤˤȯޤ -@end itemize - -ϡ@code{persondata}ơ֥ƤΥեɤɤ߹ߤޤ: - -@example -mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata; -@end example - -եɥꥹȤꤵƤޤ󤫤顢@code{LOAD DATA INFILE}ϡϥ쥳ɤơ֥Τ줾ΥեɤޤΤꤷޤ -@code{FIELDS}@code{LINES}νͤѤޤ - -ơ֥ΰΥեɤΤɤ߹ߤ硢եɥꥹȤꤷޤ: - -@example -mysql> LOAD DATA INFILE 'persondata.txt' - INTO TABLE persondata (col1,col2,...); -@end example - -ơ֥ΥեɽϥեΥեɽ礬ۤʤˤ⡢@strong{MySQL}˥ơ֥Υեɤϥեɤб򶵤뤿ˡեɥꥹȤꤷʤФʤޤ - -ϥ쥳ɤΥեɿʤ硢ϥեͤͿʤեɤϡͤꤵޤ -ͤγƤˤĤƤϡ@ref{CREATE TABLE, , @code{CREATE TABLE}}. -ǽҤ٤Ƥޤ - -ΥեͤѴޤ - -@itemize @bullet -@item -ʸξ硢 եɤͤ϶ʸ˥åȤޤ - -@item -ͷξ硢եɤͤ @code{0} ˥åȤޤ - -@item -դȻηξ硢 եɤͤ ``zero'' ΰ̣ͤåȤޤ -@xref{Date and time types}. -@end itemize - -@code{TIMESTAMP} եɤϡեͤ @code{NULL} ͤꤵƤ⤷ϡ -եɥꥹȤꤵƤ @code{TIMESTAMP} եɤΥꥹȤƤ -(ǽ@code{TIMESTAMP}եɤΤ)߻郎ꤵǤ - -ϥ쥳ɤΥեɿ¿硢;ʬʥեɤ̵뤵졢ٹο䤵ޤ - -@code{LOAD DATA INFILE}ƤϤʸʸȤߤʤȤ顢@code{INSERT}ơȥȤǤǤ褦@code{ENUM}եɤ@code{SET}եɤؤοͤλϤǤޤƤ@code{ENUM}ڤ@code{SET}ͤʸȤͿʤФޤ - -@findex mysql_info() -@code{LOAD DATA INFILE}νλξ뤿C APIؿ@code{mysql_info()}Ѥ뤳ȤǤޤν񼰤ϰʲ˼褦ʤΤǤ: - -@example -Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 -@end example - -@code{LOAD DATA INFILE} ϥ쥳ɤΥեɿβ­äˤ -ٹС@code{INSERT} ơȥ -(@xref{INSERT, , @code{INSERT}}. ) ˤͤ -ٹȯΤƱǡٹȯޤ -ٹϤɤˤ¸ޤ ٹοƤޤäˤ -ѤǤޤ ⤷ٹΤꤿηٹͳΤꤿΤʤ顢 -ˡޤ @code{SELECT ... INTO OUTFILE} Ѥ -¾ΥեȤꥸʥΥե٤ޤ - -@code{INSERT}Ӥ@code{LOAD DATA INFILE}θΨ@code{LOAD DATA INFILE}ι®ˤĤƤΤܤϡ@xref{Insert speed}򻲾ȤΤȡ - -@findex UPDATE -@node UPDATE, USE, LOAD DATA, Reference -@section @code{UPDATE} ʸ - -@example -UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1,col_name2=expr2,... - [WHERE where_definition] [LIMIT #] -@end example - -@code{UPDATE} ϥơ֥¸ߤ쥳ɤΥեɤ򡢿ͤ˹ޤ -@code{SET} ϤɤΥեɤɤäͤˤ٤򼨤ޤ -@code{WHERE} ᤬Ϳ줿硢٤쥳ɤꤹ뤳Ȥˤʤޤ -ʳϡƤΥ쥳ɤ򹹿ޤ - -@code{LOW_PRIORITY} ɤꤷ硢@code{UPDATE} μ¹Ԥϡ -ơ֥ɤǤ륯饤Ȥʤʤޤǡ٤餵ޤ - -@code{IGNORE} ɤꤷϡupdate ʸϡ -update ťΥ顼ȤƤ⡢۾ェλޤ -Rows that would cause conflicts will not be updated. - -ɽ @code{tbl_name} Υեɤ򥢥ȡ@code{UPDATE} -ϸߤΥեͤѤޤ㤨СΥơȥȤ -@code{age} եɤˤθͤ꣱礭ͤꤷޤ: - -@example -mysql> UPDATE persondata SET age=age+1; -@end example - -@code{UPDATE} Ϻ鱦ɾޤ㤨Сʲʸ @code{age} եɤ -2ܤˤΤ1䤷ޤ - -@example -mysql> UPDATE persondata SET age=age*2, age=age+1; -@end example - -⤷եɤ˸ߤäƤͤꤷ硢@strong{MySQL} ϤΤ -ͤϹޤ - -@findex mysql_info() -@code{UPDATE} ѹ줿쥳ɿ֤ޤ -@strong{MySQL} 3.22 ʾǤϡC API ؿ @code{mysql_info()} -ޥå줿쥳ɿ֤ޤޤ @code{UPDATE} ˵ -˥󥰤ο֤ޤ - -@strong{MySQL} 3.23 Ǥϡ @code{LIMIT #} ǻꤷ쥳ɤѹ -Ǥޤ - -@findex USE -@node USE, FLUSH, UPDATE, Reference -@section @code{USE} ʸ - -@example -USE db_name -@end example - -@code{USE db_name} ʸϡ @strong{MySQL} @code{db_name} ǡ١ -θΥΥǥեȤΥǡ١ˤ褦˻ؼޤ -ꤵ줿ǡ١ϡåκǸޤǡ뤤ϡ¾ @code{USE} ʸ -ȯԤޤǻĤޤ - -@example -mysql> USE db1; -mysql> SELECT count(*) FROM mytable; # selects from db1.mytable -mysql> USE db2; -mysql> SELECT count(*) FROM mytable; # selects from db2.mytable -@end example - -@code{USE} ʸΥǡ١򥫥ȤˤƤ⡢ -¾Υǡ١Υơ֥뤫饢뤳Ȥ˸ޤ -ʲ @code{db1} ǡ١ @code{author} ơ֥ȡ - @code{db2} ǡ١ @code{editor} ơ֥˥Ǥ - -@example -mysql> USE db1; -mysql> SELECT author_name,editor_name FROM author,db2.editor - WHERE author.editor_id = db2.editor.editor_id; -@end example - -@cindex Sybase compatibility -@cindex Compatibility, with Sybase -@code{USE} ʸ Sybase θߴΤ󶡤Ƥޤ - -@cindex @code{mysqladmin} -@findex FLUSH -@node FLUSH, KILL, USE, Reference -@section @code{FLUSH} ʸ (åΥꥢ) - -@example -FLUSH flush_option [,flush_option] -@end example - -@code{FLUSH} ޥɤ @strong{MySQL} ѤƤå -Ĥ򤭤줤˾äȤǤޤ -@code{FLUSH} ¹Ԥˤϡ @strong{reload} ¤ʤФʤޤ - -@code{flush_option} ˤϰʲĤǤޤ - -@multitable @columnfractions .15 .85 -@item @code{HOSTS} @tab ۥȥåơ֥ˤޤʤΥۥȤ -IP ɥ쥹Ѥꡢ@code{Host ... is blocked} Ȥ顼å -Фϥۥȥơ֥륭åٶˤʤƤϤʤޤ -ʻꤷۥȤФ @code{max_connect_errors} ʾ³顼Ф硢 -@strong{MySQL} ϲ -ꤷΥۥȤΤʤ³׵ݤޤۥȥơ֥륭åξõϡ -Ƥ³褦ˤޤ@xref{Blocked host}. -@code{mysqld} -@code{-O max_connection_errors=999999999} ϤΥ顼å -Ǥޤ - -@item @code{LOGS} @tab ɸΥեȹե -ĤƺƤӳޤ -⤷եĥ̵ǻꤷƤ硢ե -ĥҤֹϡΥե 1 䤷ˤʤޤ -ե̾˳ĥѤ硢@strong{MySQL} ϹեĤƳޤ -@xref{Update log}. - -@item @code{PRIVILEGES} @tab @code{mysql} ǡ١εĥơ֥뤫顢 -¾ɹޤ - -@item @code{TABLES} @tab ƤγƤơ֥Ĥޤ - -@item @code{TABLES WITH READ LOCK} @tab Closes all open tables and locks all tables for read until one executes @code{UNLOCK TABLES}. - -@item @code{STATUS} @tab ۤȤɤΥơѿ 0 ˤޤ -@end multitable - -˼ޥɤϡ@code{mysqladmin} ѤƤ¹ԤǤޤ -@code{mysqladmin} ΰϤ줾졢 -@code{flush-hosts}, @code{flush-logs}, @code{reload}, @code{flush-tables} -ʤޤ - -@code{FLUSH} ޥɤ¹Ԥˤϡ@strong{reload} ¤ʤФʤޤ - -@cindex @code{mysqladmin} -@findex KILL -@node KILL, SHOW, FLUSH, Reference -@section @code{KILL} ʸ - -@example -KILL thread_id -@end example - -@code{thread_id} ˤϡ@code{mysqld} ³äƤ륹åɤ ID -Ƕڤäƻꤷޤ -@code{SHOW PROCESSLIST} ޥɤäƤ륹åɤΤ뤳ȤǤ - @code{KILL thread_id} ޥɤǥåɤ KILL Ǥޤ - -⤷ @strong{process} ¤ʤ顢ƤΥåɤǧKILL ޤ -ǤʤСʬΥåɤ -ǧKILL Ǥޤ - -@code{mysqladmin processlist} @code{mysqladmin kill} 򥹥åɤ - KILL ˻ѤǤޤ - -@findex SHOW DATABASES -@findex SHOW TABLES -@findex SHOW COLUMNS -@findex SHOW FIELDS -@findex SHOW INDEX -@findex SHOW KEYS -@findex SHOW STATUS -@findex SHOW VARIABLES -@findex SHOW PROCESSLIST -@findex SHOW TABLE STATUS -@findex SHOW GRANTS -@node SHOW, EXPLAIN, KILL, Reference -@section @code{SHOW} ʸ (ơ֥եɤʤɤˤĤƤξ) - -@example - SHOW DATABASES [LIKE wild] -or SHOW TABLES [FROM db_name] [LIKE wild] -or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] -or SHOW INDEX FROM tbl_name [FROM db_name] -or SHOW STATUS [LIKE wild] -or SHOW VARIABLES [LIKE wild] -or SHOW [FULL] PROCESSLIST -or SHOW TABLE STATUS [FROM db_name] [LIKE wild] -or SHOW GRANTS FOR user -@end example - -@code{SHOW} ϥǡ١ơ֥롢եɡСˤĤƤξͿޤ -@code{LIKE wild} Ѥ줿硢@code{wild} ʸ̾ SQL 磻ɥ - (@samp{%} @samp{_}) Ǥ - -@code{tbl_name FROM db_name} ˡ@code{db_name.tbl_name} ѤǤޤ -ĤƱǤ - -@example -mysql> SHOW INDEX FROM mytable FROM mydb; -mysql> SHOW INDEX FROM mydb.mytable; -@end example - -@code{SHOW DATABASES} @strong{MySQL} СΥǡ١򼨤ޤ -@code{mysqlshow} ޥɤǤƱޤ - -@code{SHOW TABLES} ϻꤵ줿ǡ١Υơ֥ɽޤ -@code{mysqlshow db_name} ޥɤǤƱޤ - -@strong{NOTE}: ⤷桼˥ơ֥Ф븢¤̵硢 -ơ֥ @code{SHOW TABLES} @code{mysqlshow db_name} ׵ -ɽޤ - -@code{SHOW COLUMNS} Ϳ줿ơ֥Υեɤɽޤ -⤷Υեɤηʤ @code{CREATE TABLE} ʸ¹ԻͿΤ -㤦ϡ @strong{MySQL} ϡեɤηȤѹ뤳Ȥ -뤳ȤդƤ -@xref{Silent column changes}. - -@code{DESCRIBE} ʸ @code{SHOW COLUMNS} Ȼ褦ʾ󶡤ޤ -@xref{DESCRIBE, , @code{DESCRIBE}}. - -@code{SHOW TABLE STATUS} (С 3.23 οǽ) @code{SHOW STATUS} -Τ褦Ǥ줾Υơ֥ˤĤƤ¿ξ󶡤ޤ -@code{mysqlshow --status db_name} ޥɤ¹ԤƤƱΤޤ -ʲιܤ֤äƤޤ - -@multitable @columnfractions .30 .70 -@item @strong{} @tab @strong{̣} -@item @code{Name} @tab ơ֥̾ -@item @code{Type} @tab ơ֥μ (BDB, ISAM, MyISAM or HEAP) -@item @code{Row_format} @tab 쥳ɤ¸ (Fixed, Dynamic, or Compressed) -@item @code{Rows} @tab 쥳ɿ -@item @code{Avg_row_length} @tab 쥳ɤʿĹ -@item @code{Data_length} @tab ǡե礭 -@item @code{Max_data_length} @tab ǡեκ -@item @code{Index_length} @tab ǥåե礭 -@item @code{Data_free} @tab Ƥ줿ѤƤʤХȿ -@item @code{Auto_increment} @tab autoincrement -@item @code{Create_time} @tab ơ֥ -@item @code{Update_time} @tab ֺǸ˹줿 -@item @code{Check_time} @tab ֺǸ˥å줿 -@item @code{Create_options} @tab @code{CREATE TABLE} ǻѤ줿ĥץ -@item @code{Comment} @tab ơ֥ˤĤ줿 (뤤ϡʤΥơ֥@strong{MySQL} ǤʤΤĤξ). -@end multitable - -@code{SHOW FIELDS} @code{SHOW COLUMNS} ̾ȤƻѤ졢 -@code{SHOW KEYS} @code{SHOW INDEX} ̾ȤƻѤޤ -ơ֥Υեɤ䥤ǥå @code{mysqlshow db_name tbl_name} - @code{mysqlshow -k db_name tbl_name} Ǥ⸫ޤ - -@code{SHOW INDEX} ODBC Ǥ @code{SQLStatistics} -˶ᤤǡǥåξɽޤ -ʲιܤ֤ޤ - -@multitable @columnfractions .35 .65 -@item @strong{} @tab @strong{̣} -@item @code{Table} @tab ơ֥̾ -@item @code{Non_unique} @tab ǥåʣޤޤʤʤ 0 -@item @code{Key_name} @tab ǥå̾ -@item @code{Seq_in_index} @tab ǥåιֹ档1 Ϥޤޤ -@item @code{Column_name} @tab ե̾ -@item @code{Collation} @tab ˤΥեɤǥåǥȤ뤫. @strong{MySQL} Ǥ, @code{A} (Ascending) @code{NULL} (Not sorted) ˤʤޤ -@item @code{Cardinality} @tab ǥåΥˡͤο @code{isamchk -a} μ¹Ԥǹޤ -@item @code{Sub_part} @tab ⤷Υեɤǥå˰ʬѤƤ硢Υǥå˻ѤƤ륭饯򤷤᤹ ⤷ΤǥåƤʤ @code{NULL} -@end multitable - - -@cindex @code{mysqladmin} -@code{SHOW STATUS} @code{mysqladmin extended-status} ƱͤˡФΥơ -ͿޤϤϼȤϰۤʤ뤫⤷ޤ: - -@example -+--------------------------+--------+ -| Variable_name | Value | -+--------------------------+--------+ -| Aborted_clients | 0 | -| Aborted_connects | 0 | -| Connections | 17 | -| Created_tmp_tables | 0 | -| Delayed_insert_threads | 0 | -| Delayed_writes | 0 | -| Delayed_errors | 0 | -| Flush_commands | 2 | -| Handler_delete | 2 | -| Handler_read_first | 0 | -| Handler_read_key | 1 | -| Handler_read_next | 0 | -| Handler_read_rnd | 35 | -| Handler_update | 0 | -| Handler_write | 2 | -| Key_blocks_used | 0 | -| Key_read_requests | 0 | -| Key_reads | 0 | -| Key_write_requests | 0 | -| Key_writes | 0 | -| Max_used_connections | 1 | -| Not_flushed_key_blocks | 0 | -| Not_flushed_delayed_rows | 0 | -| Open_tables | 1 | -| Open_files | 2 | -| Open_streams | 0 | -| Opened_tables | 11 | -| Questions | 14 | -| Slow_launch_threads | 0 | -| Slow_queries | 0 | -| Threads_connected | 1 | -| Threads_running | 1 | -| Uptime | 149111 | -+--------------------------+--------+ -@end example - -˼ơѿϰʲ˼ΰ̣ޤ - -@multitable @columnfractions .35 .65 -@item @code{Aborted_clients} @tab 饤Ȥ³Ĥ˻ǤޤäǤ줿ͥ -@item @code{Aborted_connects} @tab @strong{MySQL} С³ߤƼԤ -@item @code{Bytes_received} @tab 饤ȤХȿ -@item @code{Bytes_sent} @tab 饤ȤХȿ -@item @code{Connections} @tab @strong{MySQL} С³ߤ -@item @code{Created_tmp_tables} @tab ơȥȼ¹˰ۤΤ˺줿ơ֥ο -@item @code{Delayed_insert_threads} @tab delayed insert ϥɥ顼åɤο -@item @code{Delayed_writes} @tab @code{INSERT DELAYED} ǽ񤫤줿쥳ɿ -@item @code{Delayed_errors} @tab @code{INSERT DELAYED} ǽ񤫤줿쥳ɤǤʤ餫Υ顼Τä쥳ɿ (֤ @code{duplicate key}). -@item @code{Flush_commands} @tab @code{FLUSH} ޥɤμ¹Բ -@item @code{Handler_delete} @tab ơ֥뤫쥳ɤ뤿Υꥯȿ -@item @code{Handler_read_first} @tab ơ֥κǽΥ쥳ɤɤिΥꥯȿ -@item @code{Handler_read_key} @tab ˴Ťƥ쥳ɤɤिΥꥯȿ -@item @code{Handler_read_next} @tab ǼΥ쥳ɤɤिΥꥯȿ -@item @code{Handler_read_rnd} @tab ֤˴Ťƥ쥳ɤɤिΥꥯȿ -@item @code{Handler_read_rnd_next} @tab ǡեμΥ쥳ɤɤ׵ο -¿Υơ֥륹Ԥʤ硢Ϲ⤯ʤޤ - ̾ϥơ -֥뤬ǥåƤʤ¸ߤ륤ǥåͭ˻Ȥ -˥꤬񤫤ƤʤȤ򼨺ޤ -@item @code{Handler_update} @tab ơ֥Υ쥳ɤ򹹿뤿׵ -@item @code{Handler_write} @tab ơ֥˥쥳ɤ뤿Υꥯȿ -@item @code{Key_blocks_used} @tab åǻѤ줿֥å -@item @code{Key_read_requests} @tab å夫饭֥åɤ߹ꥯȿ -@item @code{Key_reads} @tab Disk ʪŪ˥֥åɤ -@item @code{Key_write_requests} @tab å˥֥å񤭹ꥯȿ -@item @code{Key_writes} @tab DiskʪŪ˥֥å񤭹 -@item @code{Max_used_connections} @tab Ʊ³ -@item @code{Not_flushed_key_blocks} @tab åˤ륭֥åǡѹ줿ΤΤޤDisk˽񤭽ФƤʤ֥å -@item @code{Not_flushed_delayed_rows} @tab @code{INSERT DELAY} ǽ񤭽ФԤäƤ쥳ɿ -@item @code{Open_tables} @tab ץ󤵤Ƥơ֥ -@item @code{Open_files} @tab ץ󤵤Ƥե -@item @code{Open_streams} @tab Ƥ륹ȥ꡼ (˥˻Ѥ) -@item @code{Opened_tables} @tab ץ󤵤줿ơ֥ -@item @code{Questions} @tab С줿ο -@item @code{Slow_launch_threads} @tab ³ @code{slow_launch_time} ʾפåɿ -@item @code{Slow_queries} @tab @code{long_query_time} ʾ˻֤Τäο -@item @code{Threads_cached} @tab åɥåΥåɿ -@item @code{Threads_connected} @tab ߳Ƥ³ -@item @code{Threads_running} @tab ꡼פƤʤåɤο -@item @code{Uptime} @tab СäƤÿ -@end multitable - -ˤĤƤΤĤȡ - -@itemize @bullet -@item -⤷ @code{Opened_tables} 礭С @code{table_cache} ѿ -ΤǤ礦 -@item -⤷ @code{key_reads} 礭С @code{key_cache} ʤǤ礦 -åҥåȥ졼Ȥ -@code{key_reads}/@code{key_read_requests} Ƿ׻Ǥޤ -@item -⤷ @code{Handler_read_rnd} 礭С -@strong{MySQL} ˥ơ֥򥹥󤵤褦¿Υ -䡢 Ѥʤ JOIN Ƥޤ -@end itemize - -@code{SHOW VARIABLES} @strong{MySQL} ƥѿΤĤͤ򼨤ޤ -@code{mysqlshow variables} ޥɤǤƱޤ -⤷ɸͤŬʤʤ顢ۤȤɤѿ @code{mysqld} ư -ޥɥ饤ΥץȤͿ뤳ȤˤꡢѹǤޤ -ϤϰʲΤ褦ˤʤޤեޥåȤϤ֤㤦Ǥ礦 - -@example -+------------------------+--------------------------+ -| Variable_name | Value | -+------------------------+--------------------------+ -| back_log | 5 | -| connect_timeout | 5 | -| basedir | /my/monty/ | -| datadir | /my/monty/data/ | -| delayed_insert_limit | 100 | -| delayed_insert_timeout | 300 | -| delayed_queue_size | 1000 | -| join_buffer_size | 131072 | -| flush_time | 0 | -| interactive_timeout | 28800 | -| key_buffer_size | 1048540 | -| language | /my/monty/share/english/ | -| log | OFF | -| log_update | OFF | -| long_query_time | 10 | -| low_priority_updates | OFF | -| max_allowed_packet | 1048576 | -| max_connections | 100 | -| max_connect_errors | 10 | -| max_heap_table_size | 16777216 | -| max_delayed_threads | 20 | -| max_join_size | 4294967295 | -| max_sort_length | 1024 | -| max_tmp_tables | 32 | -| net_buffer_length | 16384 | -| port | 3306 | -| protocol-version | 10 | -| record_buffer | 131072 | -| skip_locking | ON | -| slow_launch_time | 2 | -| socket | /tmp/mysql.sock | -| sort_buffer | 2097116 | -| table_cache | 64 | -| thread_stack | 131072 | -| tmp_table_size | 1048576 | -| tmpdir | /machine/tmp/ | -| version | 3.23.0-alpha-debug | -| wait_timeout | 28800 | -+------------------------+--------------------------+ -@end example - -@xref{Server parameters, ,Server parameters}. - -@findex Threads -@findex PROCESSLIST -@code{SHOW PROCESSLIST} ϤɤΥåɤäƤ뤫ɽޤ -@code{mysqlshow processlist} ޥɤǤƱޤ -⤷ @strong{process} ¤ʤ顢ƤΥåɤߤޤ -¤ʤʤ顢ʬΥåɤޤ -@xref{KILL, , @code{KILL}}. -@code{FULL} ץѤʤ硢ƥκǽ100ʸɽ -ޤ - -@code{SHOW GRANTS FOR user} ϥ桼εĤʣ뤿ȯԤɬפ - grant ޥɤꥹȤޤ - -@example -mysql> SHOW GRANTS FOR root@@localhost; -+---------------------------------------------------------------------+ -| Grants for root@@localhost | -+---------------------------------------------------------------------+ -| GRANT ALL PRIVILEGES ON *.* TO 'root'@@'localhost' WITH GRANT OPTION | -+---------------------------------------------------------------------+ -@end example - -@findex EXPLAIN -@findex SELECT, optimizing -@node EXPLAIN, DESCRIBE, SHOW, Reference -@section @code{EXPLAIN} ʸ (@code{SELECT}ˤĤƤξ) - -@example - EXPLAIN tbl_name -or EXPLAIN SELECT select_options -@end example - -@code{EXPLAIN tbl_name} ϡ @code{DESCRIBE tbl_name} -@code{SHOW COLUMNS FROM tbl_name} ƱǤ - -⤷ @code{EXPLAIN} Ȥʤä @code{SELECT} ʸ¹Ԥ硢 -@strong{MySQL} Ϥ @code{SELECT} ư뤫 -˥ơ֥뤬礵뤫ξͿޤ - -@code{EXPLAIN} ξ򸵤ˡǥåѤ® @code{SELECT} -뤿˥ơ֥˥ǥåäʤƤϤʤʤȤ狼ޤ -ơ֥κŬ⥪ץˤäƸ뤳ȤǤޤ -@code{SELECT} ʸǤηŪ˺Ŭˤ @code{STRAIGHT_JOIN} äޤ - -ñǤϤʤ join Τˡ@code{EXPLAIN} @code{SELECT} ʸǻѤƤ -줾Υơ֥ξ֤ޤ -ơ֥ɤޤɽޤ@strong{MySQL} one-sweep multi-join method -ѤƤ join 褷ޤ @strong{MySQL} ϺǽΥơ֥뤫 -쥳ɤ߹ߡܤΥơ֥뤫ޥå쥳ɤõƻܤõȤȤǤ -ƤΥơ֥뤬򤵤줿եɤϤơ֥ΰ -ޥå쥳ɤĥơ֥򸫤Ĥޤ back-track ޤ -Υ쥳ɤϤΥơ֥뤫ɤޤ졢Υơ֥뤫³ޤ - -@code{EXPLAIN} νϤϰʲΥեɤޤߤޤ - -@table @code -@item table -ϥ쥳ɤȤơ֥ - -@item type -join . ͡ʥפϸҤޤ - -@item possible_keys -@code{possible_keys} ܤϡ@strong{MySQL} ơ֥뤫쥳ɤ򸫤Ĥ뤿 -ɤΥǥåѤǤ򼨤ޤ -: Υեɤϥơ֥νˤޤä¸ޤ󡣤ϡ -possible_keys ΤĤΥϡ줿ơ֥Ǥμ¹Ԥ˻ѤǤ -ʤȤ̣ޤ - -ιܤʤ顢Ϣ -ǥå̵ȤȤǤξ硢ʤ @code{WHERE} -Ĵ٤뤳Ȥˤäơǽ夵뤳ȤǤ뤫⤷ޤ -⤷줬ǥåŬ礷եɤ򻲾ȤƤʤС -ˤȤȡŬڤʥǥå @code{EXPLAIN} ǥ -⤦٥åƤߤƤ - -ơ֥뤬ɤʥǥåäƤ뤫ߤˤϡ@code{SHOW INDEX FROM tbl_name} Ȥޤ - -@item key -@code{key} ܤϡ @strong{MySQL} Ѥȼºݤ˷᤿򼨤ޤ -ɤΥǥåФʤäʤС @code{NULL} Ǥ -@strong{MySQL} ְäǥå򤹤硢Ƥ -@strong{MySQL} ¾ΥǥåѤ褦˶뤳ȤǤޤ -@code{myisamchk --analyze} λѡ@xref{myisamchk syntax}ޤ -@code{USE INDEX/IGNORE INDEX} λѤˤäơ@xref{JOIN} - -@item key_len -@code{key_len} ܤϡ@strong{MySQL} Ѥȷ᤿Ĺ򼨤ޤ -⤷ @code{key} @code{NULL} ʤ顢Ĺ @code{NULL} Ǥ -: @strong{MySQL} ޥѡȥΤĤΥѡȤºݤ˻ -뤫򼨤ޤ - -@item ref -@code{ref} ܤϡơ֥뤫쥳ɤ select 뤿ˡɤΥեɤ - @code{key} ȶ˻Ѥ줿򼨤ޤ - -@item rows -@code{rows} եɤϡ@strong{MySQL} ¹Ԥ뤿˸ -ɬפȹͤƤ쥳ɤο򼨤ޤ - -@item Extra -This column contains additional information of how @strong{MySQL} will -resolve the query. Here follows an explanation of the different text -strings that can be found in this column: - -@table @code -@item Not exists -@strong{MySQL} was able to do a @code{LEFT JOIN} optimisation on the -query and will not examine more rows in this table for a row combination -after it founds one rows that matches the @code{LEFT JOIN} criteria. -@item @code{range checked for each record (index map: #)} -@strong{MySQL} didn't find a real good index to use. It will instead for -each row combination in the preceding tables do a check which index to -use (if any) use this index to retrieve the rows from the table. This -isn't very fast but is of course faster than having to do a join without -an index. -@item Using filesort -@strong{MySQL} will need to do an extra pass to find out how to retrieve -the rows in sorted order. The sort is done by going through all rows -according to the @code{join type} and storing the sort key + pointer to -the row for all rows that match the @code{WHERE}. Then the keys are -sorted. Finally the rows are retrieved in sorted order. -@item Using index -The column information is retrieved from the table using only -information in the index tree without having to do an additional seek to -read the actually row. This can be done when all the used columns for -the table are part of the same index. -@item Using temporary -To be able to resolve the query @strong{MySQL} will need to create a -temporary table to hold the result. This typically happens if you do an -@code{ORDER BY} on a different column set than you did an @code{GROUP -BY} on. -@item where used -A @code{WHERE} clause will be used to restrict which rows will be -matched against the next table or sent to the client. If you don't have -this information and the the table is of type @code{ALL} or @code{index} -you may have something wrong in your query (if you don't intend to -fetch/examine all rows from the table). -@end table - -If you want to get your queries as fast as possible, you should look out for -@code{Using filesort} and @code{Using temporary}. -@end table - -join type ϰʲΤΤޤɤʪ˽񤤤Ƥޤ - -@cindex System table -@cindex Table, system -@table @code -@item system -ơ֥뤬쥳ɤäƤ (= system table). @code{const} join type -̤ʾǤ - -@cindex Constant table -@cindex Table, constant -@item const -ơ֥ϡǤޥå쥳ɤ򣱤ĤäƤꡢϥ -ǽɤޤޤ -1 ĤΥ쥳ɤǤ뤿ᡢΥ쥳Υեɤͤ -ץƥޥˤäƾȤƤߤʤޤ -1ɤޤΤǡ@code{const} ơ֥ϤȤƤ®Ǥ! - -@item eq_ref -Υơ֥Τ줾Υ쥳ɤȷ礹ݡΥơ֥뤫1쥳ɤޤޤ - join Ǥ @code{const} ɤǤ -ǥåƤΥѡȤ join ǻѤ졢ġǥå -@code{UNIQUE} @code{PRIMARY KEY} ǤȤˡϻѤޤ - -@item ref -ǥåͤ˹ä٤ƤΥ쥳ɤϡΥơ֥뤫쥳ɤȷ礹뤿ˡ -Υơ֥뤫ɤޤǤ礦 -⤷ join ΰֺƬʬѤʤС -뤤ϡ -⤷Υ @code{UNIQUE} @code{PRIMARY KEY} Ǥʤ -(ʤ顢⤷ join ͤ򸵤˰ĤΡ쥳ɤǤʤ) -@code{ref} ϻѤޤ -⤷ΥĤΥޥå쥳ɤ˻Ѥʤ顢 -join ɤǤ - -@item range -줿ϰˤ쥳ɤΤߤޤ -@code{ref} ܤϤɤΥǥåѤƤ뤫ޤ - -@item index -@code{ALL} ƱǤǥåĥ꡼Τߤޤ -ϡǥåեϥǡե⾮ᡢ̾ @code{ALL} ®Ǥ - -@item ALL -Υơ֥Υ쥳ɤȤΤ줾ηˤơơ֥뤬ޤ -⤷Υơ֥뤬ǽΥơ֥ @code{const} ֤ǤϤʤʤ顢̾ -ɤޤ¾ξ֤Ǥ@strong{ȤƤ}ʤޤ -̡쥳ɤᤤơ֥뤫餫ͤ˴ŤƸ뤳ȤǤ褦ˡ -ǥåɲä뤳Ȥˤ @code{ALL} 򤱤뤳ȤǽǤ -@end table - -@code{EXPLAIN} Ϥ @code{rows} եΤ٤Ƥͤ䤹Ȥˤ -ꡢjoin ɤΤ褦ɤʤ뤫ɤɽ뤳ȤǤޤϡ -@strong{MySQL} ¹Ԥθ򤹤ɬפ쥳ɤΤ褽ο -Τ餻ޤο @code{max_join_size} ѿǤΥ¤ˤ -Ѥޤ -@xref{Server parameters}. - -ʲϡ@code{EXPLAIN} 󶡤򸵤ˡ @code{JOIN} Ŭ -Ǥ뤫Ǥ - -ʲΤ褦 @code{EXPLAIN} Ǹ @code{SELECT} ʸȤޤ - -@example -EXPLAIN SELECT tt.TicketNumber, tt.TimeIn, - tt.ProjectReference, tt.EstimatedShipDate, - tt.ActualShipDate, tt.ClientID, - tt.ServiceCodes, tt.RepetitiveID, - tt.CurrentProcess, tt.CurrentDPPerson, - tt.RecordVolume, tt.DPPrinted, et.COUNTRY, - et_1.COUNTRY, do.CUSTNAME - FROM tt, et, et AS et_1, do - WHERE tt.SubmitTime IS NULL - AND tt.ActualPC = et.EMPLOYID - AND tt.AssignedPC = et_1.EMPLOYID - AND tt.ClientID = do.CUSTNMBR; -@end example - -ǤϡʲΤ褦˲ꤷޤ - -@itemize @bullet -@item -եɤϰʲΤ褦Ƥޤ - -@multitable @columnfractions .1 .2 .7 -@item @strong{Table} @tab @strong{Column} @tab @strong{Column type} -@item @code{tt} @tab @code{ActualPC} @tab @code{CHAR(10)} -@item @code{tt} @tab @code{AssignedPC} @tab @code{CHAR(10)} -@item @code{tt} @tab @code{ClientID} @tab @code{CHAR(10)} -@item @code{et} @tab @code{EMPLOYID} @tab @code{CHAR(15)} -@item @code{do} @tab @code{CUSTNMBR} @tab @code{CHAR(15)} -@end multitable - -@item -ơ֥ϰʲΥǥåޤ - -@multitable @columnfractions .1 .9 -@item @strong{Table} @tab @strong{Index} -@item @code{tt} @tab @code{ActualPC} -@item @code{tt} @tab @code{AssignedPC} -@item @code{tt} @tab @code{ClientID} -@item @code{et} @tab @code{EMPLOYID} (primary key) -@item @code{do} @tab @code{CUSTNMBR} (primary key) -@end multitable - -@item -@code{tt.ActualPC} ͤϡ褦ʬۤ(֤)ޤ -@end itemize - -ǽ顢ʤŬԤƤʤ֤Ǥϡ@code{EXPLAIN} ʸ -ʲξ󼨤ޤ - -@example -table type possible_keys key key_len ref rows Extra -et ALL PRIMARY NULL NULL NULL 74 -do ALL PRIMARY NULL NULL NULL 2135 -et_1 ALL PRIMARY NULL NULL NULL 74 -tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 - range checked for each record (key map: 35) -@end example - -줾Υơ֥ǡ@code{type} @code{ALL} ˤʤäƤޤ - @strong{MySQL} ƤΥơ֥礹뤳Ȥ򼨤ޤ -줾Υơ֥ιԿʬäʪĴ٤ΤǡȤƤĹ֤ޤ -ξ硢@code{74 * 2135 * 74 * 3872 = 45,268,558,720} Ĵ٤뤳Ȥˤʤޤ -ơ֥뤬粽Ȥˤ֤ͤƤ.... - -꤬ޤ(ޤ) @strong{MySQL} եɤΥǥåŪ -ѤǤƤޤ -ξǤϡ@code{VARCHAR} @code{CHAR} ϡ餬ƱĹƤС -Ѥ꤬ޤ -@code{tt.ActualPC} @code{CHAR(10)} Ƥꡢ -@code{et.EMPLOYID} @code{CHAR(15)} ǤĹϰ㤤ޤ - -礤ˤꡢ@code{ALTER TABLE} Ȥä -@code{ActualPC} Ĺ 10 ʸ 15 ʸˤޤ - -@example -mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15); -@end example - - @code{tt.ActualPC} and @code{et.EMPLOYID} ξȤ @code{VARCHAR(15)} ˤʤޤ - @code{EXPLAIN} ʸ¹Ԥľȡʲ󼨤ޤ - -@example -table type possible_keys key key_len ref rows Extra -tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 where used -do ALL PRIMARY NULL NULL NULL 2135 - range checked for each record (key map: 1) -et_1 ALL PRIMARY NULL NULL NULL 74 - range checked for each record (key map: 1) -et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1 -@end example - -ޤǤϤޤ󤬡褯ʤäƤޤ(@code{rows} ͤ -̤ 74 꾮ʤޤ)ξ硢¹ԤϿäǤ礦 - -@code{tt.AssignedPC = et_1.EMPLOYID} @code{tt.ClientID = -do.CUSTNMBR} ӤˤơեɤĹΰ㤤ӽ뤳ȤǤޤ: - -@example -mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15), - MODIFY ClientID VARCHAR(15); -@end example - - @code{EXPLAIN} ϰʲϤޤ - -@example -table type possible_keys key key_len ref rows Extra -et ALL PRIMARY NULL NULL NULL 74 -tt ref AssignedPC,ClientID,ActualPC ActualPC 15 et.EMPLOYID 52 where used -et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1 -do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1 -@end example - - ``ۤȤ'' ɤ˶ᤤǤ - -ĤϡǥեȤǤϡ@strong{MySQL} @code{tt.ActualPC} եͤ -ޤ٤ʤʬۤƤꤷƤꡢ @code{tt} ơ֥ξˤŬ礷ޤ -ˤ⡢ @strong{MySQL} ˶ΤϤȤƤñǤ - -@example -shell> myisamchk --analyze PATH_TO_MYSQL_DATABASE/tt -shell> mysqladmin refresh -@end example - - join ``'' Ǥ -@code{EXPLAIN} ϰʲη̤򼨤ޤ - -@example -table type possible_keys key key_len ref rows Extra -tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 where used -et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1 -et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1 -do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1 -@end example - - @code{EXPLAIN} ν @code{rows} ܤϡ @strong{MySQL} JOIN ץƥޥ -ˤ롢``¬'' Ǥ -κŬΤˡοͤºݤ˶ᤤɤå٤Ǥ -ǤʤС@code{SELECT} ơȥȤ @code{STRAIGHT_JOIN} -@code{FROM} ˰ۤʤǥơ֥¤٤뤳Ȥǡɤѥեޥ󥹤 -ޤ - -@findex DESC -@findex DESCRIBE -@node DESCRIBE, COMMIT, EXPLAIN, Reference -@section @code{DESCRIBE} ʸ (եɤˤĤƤξ) - -@example -@{DESCRIBE | DESC@} tbl_name @{col_name | wild@} -@end example - -@code{DESCRIBE} ϥեɤˤĤƤξͿޤ -@code{col_name} ϥեɤϥե̾ޤʸǤ -ʸ SQL @samp{%},@samp{_} 磻ɥɤޤޤ - -⤷եɤηʤ @code{CREATE TABLE} ʸͿʪȰäƤʤ顢 - @strong{MySQL} եɤηѹƤ뤳ȤդƤ -@xref{Silent column changes}. - -@cindex Oracle compatibility -@cindex Compatibility, with Oracle -Υޥɤ Oracle θߴΤˤޤ - -@code{SHOW} ʸϻ褦ʾ󶡤ޤ -@xref{SHOW, , @code{SHOW}}. - -@findex BEGIN -@findex COMMIT -@findex ROLLBACK -@node COMMIT, LOCK TABLES, DESCRIBE, Reference -@section @code{BEGIN/COMMIT/ROLLBACK} ʸ - -ǥեȤǤ @strong{MySQL} @code{autocommit} ⡼ɤưޤ -ϡ¹ԤȤ @strong{MySQL} ǥ˳Ǽ뤳 -̣ޤ - -⤷ @code{BDB} Υơ֥Ѥʤ, ʲΥޥɤ @strong{MySQL} -@code{autocommit} ⡼ɤǤϤʤ֤ˤ뤳ȤǤޤ - -@example -SET AUTOCOMMIT=0 -@end example - -θ塢ǥѹǼ뤿ˤ @code{COMMIT} Ѥޤ -̵뤹뤿ˤ @code{ROLLBACK} ɬפޤ - -If you want to switch from @code{AUTOCOMMIT} mode for one serie of -statements, you can use the @code{BEGIN} statement. - -@example -BEGIN; -SELECT @@A:=SUM(salary) FROM table1 WHERE type=1; -UPDATE table2 SET summmary=@@A WHERE type=1; -COMMIT; -@end example - -: ȥ󥶥ơ֥ѤƤʤϡ@code{autocommit} -⡼ɤΥơˤϰ¸ˡѹϤ˳Ǽޤ@xref{Table -types}. - -@findex LOCK TABLES -@findex UNLOCK TABLES -@node LOCK TABLES, SET OPTION, COMMIT, Reference -@section @code{LOCK TABLES/UNLOCK TABLES} ʸ - -@example -LOCK TABLES tbl_name [AS alias] @{READ | [READ LOCAL] | [LOW_PRIORITY] WRITE@} - [, tbl_name @{READ | [LOW_PRIORITY] WRITE@} ...] -... -UNLOCK TABLES -@end example - -@code{LOCK TABLES} ϥȤΥåɤΤ˥ơ֥åޤ -@code{UNLOCK TABLES} ϤΥåɤƤΥåޤ -ȥåɤˤäƥå줿ƤΥơ֥ϡ -åɤ¾ @code{LOCK TABLES} ȯԤ䥵С³Ĥ硢 -ưDzޤ - -åɤơ֥ @code{READ} åľ硢Υå(¾ƤΥå) -ơ֥뤫ɤ߹ߤǤޤåɤơ֥ @code{WRITE} åľ硢 -Υåɤơ֥ @code{READ} @code{WRITE} Ǥޤ -¾Υåɤϥ֥åޤ - -@code{READ LOCAL} @code{READ} ΰ㤤ϡ@code{READ LOCAL} ϡå -ݻƤ֤˥եꥯȤʤ @code{INSERT} ơȥȤ¹Ԥ -뤳ȤǤϥåݻƤ֤ @strong{MySQL} γ -ǡ١ե褦ȤϻѤǤޤ - -줾ΥåɤϤ餬ƤΥåޤԤޤ(ॢ̵) - -@code{WRITE} å̡Ǥ¤깹Ԥ碌뤿ᡢ - @code{READ} å̤ͥ⤯ʤäƤޤ -Ϥ륹åɤ @code{READ} å򤫤ʳΥåɤ @code{WRITE} -׵ᤷ硢 @code{READ} ϡ@code{WRITE} åɤå򤷡ޤ -ԤĤȤȤǤ -@code{LOW_PRIORITY WRITE} ѤС -@code{WRITE} åԤäƤ륹åɤ @code{READ} å뤳ȤǤޤ -@code{LOW_PRIORITY WRITE} @code{READ} å򤷤Ƥ륹åɤĤʤ -狼äƤ˻Ѥ٤Ǥ - -@code{LOCK TABLES} ѤȤѤ褦ȤƤΥơ֥ -٤Ǥ -ƥǻѤ褦ȤƤΤƱꥢȤʤФʤޤ -⤷ʣơ֥Ѥʤ(alias Ȥʤä) -줾 alias å٤Ǥ -Υݥꥷϥơ֥åǥåɥåե꡼ˤ뤳ȤΤˤޤ - -@code{INSERT DELAYED} ǻѤƤ뤤ʤơ֥⡢å٤ǤϤޤ -ξ @code{INSERT} ̤ΥåɤǹԤʤ뤫Ǥ - -̾Ƥñ @code{UPDATE} ʸˤƤϡơ֥åɬפϤޤ -åɤϡ¾Υåɤ߼¹ԤƤ SQL ʸ˴Ĥ뤳ȤǤޤ -ϥơ֥å褤ޤʾǤ - -@itemize @bullet -@item -ơ֥ޤȤ¿¹Ԥ褦Ȥ硢Ѥ褦ȤƤơ -֥åȤȤƤ®ʤޤ¾Υåɤ @code{READ} -줿ơ֥ιϤǤޤ󤷡¾Υåɤ @code{WRITE} å줿 -ơ֥ɤळȤϤǤޤ -@item -@code{MySQL} ϥȥ󥶥Ķ򥵥ݡȤʤᡢ¾Υåɤ -@code{SELECT},@code{UPDATE}δ֤ʤȤݾڤϡ -@code{LOCK TABLES} Ѥɬפޤ -ϰΤˤ @code{LOCK TABLES} ɬפȤޤ - -@example -mysql> LOCK TABLES trans READ, customer WRITE; -mysql> select sum(value) from trans where customer_id= some_id; -mysql> update customer set total_value=sum_from_previous_statement - where customer_id=some_id; -mysql> UNLOCK TABLES; -@end example - - @code{LOCK TABLES} Ѥʤ硢@code{SELECT} μ¹Ԥ @code{UPDATE} -¹ԤԤ֤ˡ¾Υåɤ @code{trans} Ԥ䤬Ǥޤ -@end itemize - -ù (@code{UPDATE customer SET value=value+new_value}) ޤ -@code{LAST_INSERT_ID()} ؿλѤˤꡢ¿ξ @code{LOCK TABLES} -Ǥޤ - -Ĥξ硢桼٥å: @code{GET_LOCK()} @code{RELEASE_LOCK()} λ -ˤäƤǤޤΥåϥΥϥåơ֥ -졢®Τ @code{pthread_mutex_lock()} Ǽޤ -@xref{Miscellaneous functions}. - -åݥꥷΤʤˤĤƤ @ref{Internal locking} 򸫤Ƥ - - -@findex SET OPTION -@node SET OPTION, GRANT, LOCK TABLES, Reference -@section @code{SET OPTION} ʸ - -@example -SET [OPTION] SQL_VALUE_OPTION= value, ... -@end example - -@code{SET OPTION} ϥФ䥯饤Ȥ˱ƶ͡ʥץꤷޤ. -ߤΥå󤬽뤫,ޤϤʤۤʤäͤ˥ץꤹޤ, -ꤵ줿ץͤϻĤäƤޤ. - -@table @code -@item CHARACTER SET character_set_name | DEFAULT -ϻꤵ줿ޥåԥ󥰤˽äơ٤Ƥʸ򥯥饤Ȥ饯饤Ȥ˥ޥåפޤ. -ߡ@code{character_set_name} ˻Ǥ륪ץ @code{cp1251_koi8} Ǥ, -@strong{MySQL} Υˤ @file{sql/convert.cc} եԽ뤳Ȥˤä, -ưפ˿ޥåԥ󥰤ä뤳ȤǤޤ. ɸΥޥåԥ󥰤᤹ˤϡ -@code{character_set_name} @code{DEFAULT} ꤷޤ - -@code{CHARACTER SET} ץꤹ뤿ιʸϡ -¾Υץꤹ빽ʸȰۤʤäƤ뤳ȤդƤ. - -@item PASSWORD = PASSWORD('some password') -@cindex Passwords, setting -ߤΥ桼Υѥɤꤷޤʤƿ̾Υ桼⡢ -ʬȥѥɤѤ뤳ȤǤޤ! - -@item PASSWORD FOR user = PASSWORD('some password') -@cindex Passwords, setting -ߥ󤷤ƤۥȤ桼Υѥɤꤷޤ -@code{mysql} ǡ١˥Ǥ桼¹ԤǤޤ -桼 @code{user@@hostname} ͿʤƤϤʤޤ - @code{user} @code{hostname} ϡ@code{mysql.user} ơ֥ -@code{User}, @code{Host} եɤϿƤʤƤϤʤޤ -㤨С@code{User} @code{Host} եɤ @code{'bob'} -@code{'%.loc.gov'} ʤСʲΤ褦ˤޤ - -@example -mysql> SET PASSWORD FOR bob@@"%.loc.gov" = PASSWORD("newpass"); - -ޤ - -mysql> UPDATE mysql.user SET password=PASSWORD("newpass") where user="bob' and host="%.loc.gov"; -@end example - -@item SQL_AUTO_IS_NULL = 0 | 1 -@code{1} (ǥե) ꤹȡΤ褦ˤơauto_increment 쥳 -ɤĥơ֥ǡǸ줿쥳ɤ򸫤Ĥ뤳ȤǤޤ: -@code{WHERE auto_increment_column IS NULL}ϡAccess Τ褦ʤ - ODBC ץˤäƻѤޤ - -@item SET AUTOCOMMIT= 0 | 1 -@code{1} ꤹȡơ֥ؤΤ٤ƤѹϤ˹Ԥʤޤ -To start -an multi command transaction you have to use the @code{BEGIN} -statement. @xref{COMMIT}. -@code{0} ꤹȡΥȥ󥶥/˴뤿ˡ -@code{COMMIT} / @code{ROLLBACK} Ѥɬפޤ@xref{COMMIT} -: @code{AUTOCOMMIT} ⡼ɤ @code{AUTOCOMMIT} ⡼ɤѹ -@strong{MySQL} Ϥ٤ƤΥץȥ󥶥ưŪ -@code{COMMIT} ޤ - -@item SQL_BIG_TABLES = 0 | 1 -@cindex The table is full -@code{0} ξ硢Ƥΰơ֥ϥ꡼ǤϤʤǥ˽񤭽Фޤ -Ͼ٤ʤޤ¿ΰơ֥ɬפȤ礭 @code{SELECT} -¹ԤƤ⡢@code{The table tbl_name is full} 顼Фʤʤޤ -³ˤ뤳ͤΥǥեͤ @code{1} (꡼˰ơ֥) -Ǥ - -@item SQL_BIG_SELECTS = 0 | 1 -@code{1} ξ硢ȤƤ֤Τ @code{SELECT} ¹Ԥ줿硢 -@strong{MySQL} Ϥߤޤ -Ϥޤ˧ʤ(ְä) @code{WHERE} ʸȯԤ줿ȤΩޤ -@code{max_join_size} ԰ʾƤ褦 @code{SELECT} -礭ʥޤ -³ˤ뤳ͤΥǥեͤ @code{0} Ǥ -(Ƥ @code{SELECT} ʸޤ) - -@item SQL_BUFFER_RESULT = 0 | 1 -@code{SQL_BUFFER_RESULT} ϰե֤ @code{SELECT} η -Ū֤ޤ @strong{MySQL} ơ֥å᤯ -򤷡饤Ȥط̥åȤ뤿Ĺ֤ݤ -Ωޤ - -@item SQL_LOW_PRIORITY_UPDATES = 0 | 1 -@code{1} ξ硢Ƥ @code{INSERT}, @code{UPDATE}, @code{DELETE}, - @code{LOCK TABLE WRITE}ʸϡ -оݤȤʤơ֥ @code{SELECT} @code{LOCK TABLE READ} -ʤʤޤԤޤ - -@item SQL_MAX_JOIN_SIZE = value | DEFAULT -餯 @code{value} ¿쥳ɤȹ礻ɬפ褦 -@code{SELECT} Ĥޤ󡣤ͤꤹ뤳ȤǡѤʤ - @code{SELECT} Ĺ֤ݤǤ @code{SELECT} ªǤ - @code{DEFAULT} ʳͤꤹȡ@code{SQL_BIG_SELECTS} -饰ꥻåȤޤ@code{SQL_BIG_SELECTS} ե饰Ƥꤹȡ -@code{SQL_MAX_JOIN_SIZE} ѿ̵뤵ޤ@code{-O max_join_size=#} -@code{mysqld} ư뤳ȤǡѿΥǥեͤǤޤ - -@item SQL_SAFE_MODE = 0 | 1 -@code{1} ꤹȡ@code{WHERE} ǥ @code{LIMIT} Ѥʤ - @code{UPDATE} ޤ @code{DELETE} ԤʤȤ -@strong{MySQL} ܡȤޤϡ SQL ޥɤδ -äªǽˤޤ - -@item SQL_SELECT_LIMIT = value | DEFAULT -@code{SELECT} ʸ֤쥳ɤκ͡ -⤷ @code{SELECT} @code{LIMIT} ѤƤ硢@code{LIMIT} - @code{SQL_SELECT_LIMIT} ͤͥ褵ޤ -³ˤ뤳ͤɸͤ ``unlimited''. -⤷ߥåȤѤƤʤС@code{SQL_SELECT_LIMIT} - @code{DEFAULT} ꤹ뤳Ȥˤꡢɸ᤹ͤȤǤޤ - -@item SQL_LOG_OFF = 0 | 1 -ͤ @code{1} ξ硢⤷饤Ȥ @strong{process} ¤äƤʤС -Υ饤ȤΥԤޤ -Ϲ˱ƶޤ - -@item SQL_LOG_UPDATE = 0 | 1 -@code{0} ξ硢⤷饤Ȥ @strong{process} ¤äƤʤС -Υ饤ȤιεϿϹԤޤ -̾Υˤϱƶޤ - -@item TIMESTAMP = timestamp_value | DEFAULT -饤Ȥ˻֤ꤷޤ -⤷쥳ɤΥꥹȥ˹Ѥ硢ꥸʥΥॹפ뤿˻Ѥޤ - -@item LAST_INSERT_ID = # -@code{LAST_INSERT_ID()} ֤ͤꤷޤ -ơ֥򹹿륳ޥ @code{LAST_INSERT_ID()} Ѥ硢 -Ϲ¸ޤ - -@item INSERT_ID = # - @code{AUTO_INCREMENT} ͤ -@code{INSERT} ޥɤ˽äƻѤͤ򥻥åȤޤ -ϹˤäƻѤޤ - -@end table - -@findex GRANT -@findex REVOKE -@node GRANT, CREATE INDEX, SET OPTION, Reference -@section @code{GRANT} @code{REVOKE} ʸ - -@example -GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] - ON @{tbl_name | * | *.* | db_name.*@} - TO user_name [IDENTIFIED BY 'password'] - [, user_name [IDENTIFIED BY 'password'] ...] - [WITH GRANT OPTION] - -REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] - ON @{tbl_name | * | *.* | db_name.*@} - FROM user_name [, user_name ...] -@end example - -@code{GRANT} @strong{MySQL} 3.22.11 ʾǼƤޤ; -@strong{MySQL} СǤϡ@code{GRANT} ơȥȤϲԤʤ - - -@code{GRANT} @code{REVOKE} ޥɥåȤμŪϡƥ - @strong{MySQL} 桼˼ΣĤθ¥٥θͿä -ȤǤ褦ˤ뤳ȤǤ: - -@table @strong -@item Global ٥ -Global ¤Ϳ줿оƤΥǡ١ŬѤޤθ¤ -@code{mysql.user} ơ֥˳Ǽޤ - -@item Database ٥ -Database ¤Ϳ줿ǡ١ƤΥơ֥ŬѤޤ -θ¤ @code{mysql.db} ơ֥ @code{mysql.host} ơ֥˳Ǽޤ - -@item Table ٥ -Table ¤Ϳ줿ơ֥ƤΥեɤŬѤޤθ¤ -@code{mysql.tables_priv} ơ֥˳Ǽޤ - -@item Column ٥ -Column ¤Ϳ줿ơ֥ΰĤΥեɤŬѤޤθ¤ -@code{mysql.column_priv} ơ֥˳Ǽޤ -@end table - -@code{GRANT} ư @ref{Adding users}. - -@code{GRANT} @code{REVOKE} ơȥȤˤ @code{priv_type} ˤ -ʲǤޤ: - -@example -ALL PRIVILEGES FILE RELOAD -ALTER INDEX SELECT -CREATE INSERT SHUTDOWN -DELETE PROCESS UPDATE -DROP REFERENCES USAGE -@end example - -@code{ALL} @code{ALL PRIVILEGES} ƱǤ. -@code{REFERENCES} Ϥޤ¹Ԥޤ -@code{USAGE} ``no privileges'' ƱǤ. -Ϥʤθ¤ʤ桼˻Ѥޤ. - -桼鸢µĤˤϡ@code{GRANT OPTION} ץͤ -@code{priv_type} ꤷޤ - -@example -REVOKE GRANT OPTION ON ... FROM ...; -@end example - -ơ֥ФĤΤ˻Ǥ @code{priv_type} ϼΥեɤǤ -@code{SELECT},@code{INSERT}, @code{UPDATE}, @code{DELETE}, @code{CREATE}, @code{DROP}, -@code{GRANT}, @code{INDEX}, @code{ALTER}. - -եɤФĤΤ˻Ǥ @code{priv_type} ϼΥեɤǤ -( @code{column_list} ѤŬѤޤ) -@code{SELECT}, @code{INSERT}, @code{UPDATE}. - -@code{WITH GRANT OPTION} ϡ@code{GRANT} ʸѤ -¾Υ桼˸¤Ϳ뤳ȤǤ褦ˤޤ - -@code{ON *.*} ѤƥХ븢¤Ǥޤ -@code{ON db_name.*} Ѥƥǡ١¤Ǥޤ@code{ON *} -ꤹȡߤΥǡ١θ¤Ǥޤ -(@strong{ٹ} ߤΥǡ١ʤ֤ @code{ON *} ꤷ硢 -global ¤˱ƶޤ) - -桼ؤθζͿ¾ΥۥȤŬ뤿ˡ@strong{MySQL} - @code{user_name} ͤ @code{user@@host} ηǽ񤱤褦ˤƤޤ -üʸ(@samp{%} Τ褦) @code{user_name} ͤꤷ硢 -桼ۥ̾򥯥ȤǤޤ; -(㤨 @code{'test-user'@@'test-hostname'}) - -ۥ̾˥磻ɥɤѤǤޤ㤨С@code{user@@"%.loc.gov"} -@code{loc.gov} ɥᥤƤΥۥȤ @code{user} Ϳ -@code{user@@"144.155.166.%"} @code{144.155.166} 饹C֥ͥåȤ -ۥȤ @code{user} Ȥʤޤ - -ñ @code{user} Ƚ񤯤 @code{user@@"%"} ƱǤ. -@strong{ա} ⤷ƿ̾桼 @strong{MySQL} Сؤ³ -(ǥեȤǤ)ƤΥ桼 @code{username@@localhost} ä٤Ǥ -ʤʤ顢ƿ̾桼Ʊޥ󤫤 @strong{MySQL} СȤ -Ѥ뤫Ǥ -ƿ̾桼 @code{mysql.user} 桼ơ֥ˡ @code{User=''} ȤϿƤޤ -ǧˤϡʲΤ褦ˤޤ - -@example -mysql> SELECT Host,User FROM mysql.user WHERE User=''; -@end example - -, @code{GRANT} ϥۥ̾ơ֥̾ǡ١̾ե̾ -60ʸޤǻѤǤޤ桼̾Ϻ16ʸޤǤǤ - -ơ֥/եɤθ¤ global(桼ȥǡ١)¤ -@code{GRANT} ¤ @code{OR} ޤ㤨С桼 -@code{mysql.user} ơ֥ global @strong{select} ¤äƤ硢 -ϥǡ١ơ֥/եɥ٥ΥȥǤϵݤǤޤ - -եɤθϼΤ褦˷׻Ǥޤ: -@example -global privileges -OR (database privileges AND host privileges) -OR table privileges -OR column privileges -@end example - -¿ξ硢ۤʤ븢¥٥ΰĤǥ桼˸ͿΤǡ̾ -ҤΤ褦ˤʣǤϤޤ:) -¤Υåξܺ٤Ϣ@ref{Privilege system}. - -桼ؤθζͿ¾ΥۥȤŬ뤿ˡ@strong{MySQL} ϥ桼 -̾ @code{user@@host} ǻǤ뤳Ȥ򥵥ݡȤޤñʷ - @code{user} @code{user@@%} ƱǤüʸ(@code{.} Τ褦 -)ǥۥ̾ꤷ硢@code{"user"@@"hostname"} ʸѤǤ -ޤ - -桼ȥۥ̾Ȥ¸ߤʤ硢ȥ @code{mysql.user} ơ -֥ɲä졢@code{DELETE} ޥɤǺޤǤ˻Ĥޤ -ʤ @code{GRANT} @code{user} ơ֥Ͽޤ - @code{REVOKE} ϤǤޤ; -ˤ @code{DELETE} ѤʤƤϤʤޤ - -@cindex Passwords, setting -@strong{MySQL} 3.22.12 ʾǤϡ -桼줿硢뤤ϡʤХʸ¤ĤƤ硢 -桼Υѥɤ @code{IDENTIFIED BY} ѤǤޤ -Ǥ˥桼˥ѥɤ硢ꤵ줿ѥɤ֤ޤ - -@strong{ٹ} ⤷桼äƤ -@code{IDENTIFIED BY} ꤷʤС Υ桼ϥΡѥɤǤ -ϴǤ - -ѥɤ @code{SET PASSWORD} ޥɤǤǤޤ -@xref{SET OPTION, , @code{SET OPTION}}. - -ǡ١˸¤ @code{GRANT} 硢@code{mysql.db} ơ֥ -ȥɬפʾޤƤΥǡ١¤ -@code{REVOKE} Ǻ줿ΥȥϺޤ - -桼ơ֥˲⸢¤äƤʤ硢ơ֥ΰ׵(㤨 -С@code{SHOW TABLES} ơȥȤ)ˤϡơ֥ϸޤ - -@code{WITH GRANT OPTION} ϡ¾Υ桼ˡʬäƤ븢¤Ϳ뤳ȤǤޤ -@strong{µ}¾ͿդƤ -ʤȵĤͿ桼㤦¤äƤ硢 -Ϳ븢¤εĤϡĤ碌ʪˤʤޤ - -ʬȤäƤʤ¤¾Υ桼Ϳ뤳ȤϤǤޤ -@strong{µ}Ϥʤͭ븢¤εĤͿ뤳ȤǤޤ - -ʤ桼˳̤θ¥٥Ϳ硢˥桼äƤ뤤ʤ븢 -(뤤 ĸ) ϤΥ桼ˤäƤĤͿޤ -ʤǡ١Ф @strong{insert} Ĥ򤢤桼ͿȲꤷޤ -⤷ǡ١Ф @strong{select} ¤Ϳꡢ -@code{WITH GRANT OPTION} Ԥȡ桼 @strong{select} ¤Ǥʤ - @strong{insert} 뤳Ȥˤʤޤ -⤷ @strong{update} ¤桼ͿȡΥ桼 -@strong{insert}, @strong{select}, @strong{update} ǽǤ - -@strong{alter} ¤̥桼Ϳ٤ǤϤޤ󡣤ξ -桼ϥơ֥͡ǤˡǸ¤뤳Ȥߤ뤳Ȥ -ޤ - -ա⤷ table/column ¤ͤΥ桼ˤͿ硢 - @strong{MySQL} ƤΥ桼Фƥơ֥ȥեɤξǧ¤Ƥޤ - @strong{MySQL} 򾯤٤ޤ - -@code{mysqld} ϻƤθ¤ϥɤ߹ޤޤǡ١ -ơ֥롢եɸ¤ϰٸ̤ޤ桼٥븢¤ϥ桼³ -̤ޤ -εĥơ֥ @code{GRANT} @code{REVOKE} ȤäѹƤ -СˤϤȿǤޤ -⤷εĥơ֥ưѹ(@code{INSERT}, @code{UPDATE}, ѹ) -@code{FLUSH PRIVILEGES} ʸ¹Ԥ뤫@code{mysqladmin flush-privileges} ¹Ԥ -С˵ĥơ֥κɤ߹ߤԤ碌ʤƤϤʤޤ -@xref{Privilege changes}. - -@code{ANSI SQL GRANT} @strong{MySQL} @code{GRANT} Ȥ礭ʰ㤤: - -@itemize @bullet -@item -ANSI SQL ϥХȥǡ١٥뾵ǧANSI SQL - @strong{MySQL} ݡȤƤθ¤򥵥ݡȤޤ -@item -ANSI SQL ǥơ֥˴Υơ֥Ƥθ¤˴ -ޤ@code{ANSI SQL} Ǹ¤ä硢θ¤˴Ťƾǧ -Ƥθ¤äޤ@code{MySQL} ǤϡƤθ¤Ū -@code{REVOKE} ޥɤޤ @strong{MySQL} ¥ơ֥ˤäƤ -˴ޤ -@end itemize - - -@cindex Indexes -@cindex Indexes, multi-part -@cindex Multi-part index -@findex CREATE INDEX -@node CREATE INDEX, DROP INDEX, GRANT, Reference -@section @code{CREATE INDEX} ʸ - -@example -CREATE [UNIQUE] INDEX index_name ON tbl_name (col_name[(length)],... ) -@end example - -@code{CREATE INDEX} ʸ @strong{MySQL} 3.22 ΥСǤϤʤˤ⤷ޤ -3.22 ʹߤǡ@code{CREATE INDEX} ϥǥåκΤ @code{ALTER TABLE} - ƤӤƤޤ -@xref{ALTER TABLE, , @code{ALTER TABLE}}. - -̾ơ֥ƤΥǥå @code{CREATE TABLE} -ơ֥Ȥ˰٤˺ޤ -@xref{CREATE TABLE, , @code{CREATE TABLE}}. -@code{CREATE INDEX} ϴ¸ߤơ֥Фǥåɲäޤ - -եɤ @code{(col1,col2,...)} Ȥƻꤹȡʣեɥǥåޤ -ǥåͤϡͿ줿եɤͤϢ뤷ơޤ - -@code{CHAR} @code{VARCHAR} եɤǤϡǥåϥեɤΰʬѤ -ޤ @code{col_name(length)} ʸѤޤ -(@code{BLOB} @code{TEXT} Ǥ length ɬפǤ) -ǽ10ʸ򥤥ǥåȤƻѤˤϡιʸϰʲΤ褦ˤƻѤޤ(@code{name} եɤ˥ǥåޤ) - -@example -mysql> CREATE INDEX part_of_name ON customer (name(10)); -@end example - -եɤΰʬ򥤥ǥå˻ѤСǥåեϤ뤫˾뤳ȤǤޤ -ۤȤɤ̾ǽ10ʸˤ̾ۤʤΤǡ -Υǥå @code{name} եѤϤФǥå٤ -٤ʤ뤳ȤϤޤ󡣤ޤ¿ΥǥڡǤ - @code{INSERT} ®ΤǤ - -@strong{MySQL} version 3.23.2 ʾ @code{MyISAM} Υơ֥ѤƤ硢 -@code{NULL} ͤĥեɤ䡢 @code{BLOB}/@code{TEXT} եɤФ -ǥåĥ뤳ȤǽǤ - -@strong{MySQL} ɤΤ褦ˤƥǥåѤ뤫 -@ref{MySQL indexes, , @strong{MySQL} indexes}. - -@findex DROP INDEX -@node DROP INDEX, Comments, CREATE INDEX, Reference -@section @code{DROP INDEX} ʸ - -@example -DROP INDEX index_name ON tbl_name -@end example - -@code{DROP INDEX} @code{index_name} Ȥ̾Υǥåơ֥ -@code{tbl_name} ˴ޤ -@code{DROP INDEX} @strong{MySQL} 3.22 ΥСǤϤʤˤ⤷ޤ -3.22 ʹߤǡ@code{DROP INDEX} ϥǥå˴Τ -@code{ALTER TABLE} ƤӤƤޤ -@xref{ALTER TABLE, , @code{ALTER TABLE}}. - -@findex Comment syntax -@node Comments, CREATE FUNCTION, DROP INDEX, Reference -@section ʸ - -@strong{MySQL} @code{# ޤ} , @code{-- ޤ} @code{/* -ޤʣ */} Ƚ񼰤򥵥ݡȤޤ: - -@example -mysql> select 1+1; # ΥȤϹޤ³ -mysql> select 1+1; -- ΥȤϹޤ³ -mysql> select 1 /* Ϲ楳 */ + 1; -mysql> select 1+ -/* - -ʣԥ -*/ -1; -@end example - -@code{--} ȥ @code{--} θ˺ĤΥڡ -ɬפǤ뤳Ȥա - -Сϥȹʸ򤷤ޤ @code{mysql} 饤Ȥ - @code{/* ... */} ȤʬϤˤϤĤ¤ޤ - -@itemize @bullet -@item -󥰥륯Ȥȥ֥륯ʸϰʸΥȡγϤ -ޤȤȤǤäƤ⡣ -⤷ȤǥȤܤΥȤ˥ޥåʤä硢 -ѡϥȤλƤʤǧޤ -@code{mysql} å⡼ɤǼ¹ԤƤ硢 -ץץȤ @code{mysql>} @code{'>} @code{">} Ѥޤ - -@item -ߥ SQL ʸνλ򼨤³ʸϼιʸγϤ -ʤޤ -@end itemize - -¤ @code{mysql} å⡼ɤǼ¹ԤƤȡ -@code{mysql} ˥եɤ߹ޤƤ ( @code{mysql < some-file} ) -ξǸޤ - -@strong{MySQL} ANSI SQL Ȥ @samp{--} 򥵥ݡȤޤ -@xref{Missing comments}. - - -@findex CREATE FUNCTION -@findex DROP FUNCTION -@findex UDF functions -@findex User-defined functions -@findex Functions, user-defined -@node CREATE FUNCTION, Reserved words, Comments, Reference -@section @code{CREATE FUNCTION/DROP FUNCTION} ʸ - -@example -CREATE [AGGREGATE] FUNCTION function_name RETURNS @{STRING|REAL|INTEGER@} - SONAME shared_library_name - -DROP FUNCTION function_name -@end example - -桼ؿ (UDF : user-definable functions) - @strong{MySQL} ˿ؿĥˡǤ - @strong{MySQL} Υͥƥ()ؿ -(@code{ABS()}, @code{CONCAT()} Τ褦)Ʊ褦ưޤ - -@code{AGGREGATE} @strong{MySQL} 3.23 οץǤ -@code{AGGREGATE} ؿϡ@code{SUM} @code{COUNT()} Τ褦ʥͥƥ֤ -@strong{MySQL} @code{GROUP} ؿΤ褦Τưޤ - -@code{CREATE FUNCTION} ϡؿ̾ͭ饤֥̾ -@code{mysql.func} ƥơ֥ˡ¸ޤ -ؿκ˴Ԥˤϡ @code{mysql} ǡ١Фơ - @strong{insert} , @code{delete} ¤ʤФʤޤ - -ƤδؿϥСεưɤ߹ޤޤ - @code{--skip-grant-tables} ץ @code{mysqld} ˤĤƤʤС -ξ硢UDF νФ졢UDF ǺäؿϻѤǤޤ -(ؿ @code{CREATE FUNCTION} ǥɤ졢 @code{DROP FUNCTION} Ǻޤ) - -桼ؿ˴ؤ뤵ʤ @ref{Adding functions}. -UDF ᥫ˥ưˤϡؿ C C++ ǽ񤫤ƤʤФʤޤ -ġʤΥڥ졼ƥ󥰥ƥबʥߥåǥ󥰤 -ݡȤƤʤФʤޤ󡣤 @code{mysqld} ϥƥåǤϤʤ -ʥߥåǥѥ뤵ƤʤФʤޤ - -@cindex Keywords -@cindex Reserved words -@cindex Reserved words, exceptions -@node Reserved words, , CREATE FUNCTION, Reference -@section Is @strong{MySQL} picky about reserved words? - -̤ϡեɤ̾ @code{TIMESTAMP} Ȥ @code{GROUP} Ȥ - @strong{MySQL} ޤƤǡؿ̾Ʊ̾ˤơ -ơ֥ä˵ޤ -Τ褦ʤȤϹԤޤ(㤨 @code{ABS} ϥե̾ˤǤޤ) -ؿȤƻѤ硢 -̾ե̾ȤƻѤƤʤ顢 -ؿ̾ @samp{(} δ֤ζϵޤ - -ʲθ @strong{MySQL} ͽ󤵤Ƥޤ -ΤۤȤɤϡ ANSI SQL92 ˤäơ -ơ֥롢ե̾ȤƤλѤ϶ػߤƤޤ(㤨 @code{group}) -ޤĤθ @strong{MySQL} ɬפȤ @code{yacc} ѡ -ѤƤΤͽ󤵤Ƥޤ - -@c This is fixed by including the symbols table from lex.h here and then running -@c fix-mysql-reserved-words in emacs (or let David do it): -@c (defun fix-mysql-reserved-words () -@c (interactive) -@c (let ((cnt 0)) -@c (insert "\n@item ") -@c (while (looking-at "[ \t]*{ +\"\\([^\"]+\\)\"[ \t]*,.*\n") -@c (replace-match "@code{\\1}") -@c (incf cnt) -@c (if (> cnt 3) -@c (progn -@c (setf cnt 0) -@c (insert "\n@item ")) -@c (insert " @tab "))))) -@c But remove the non alphanumeric entries by hand first. -@c Updated after 3.23.4 990928 by David - -@multitable @columnfractions .25 .25 .25 .25 -@item @code{action} @tab @code{add} @tab @code{aggregate} @tab @code{all} -@item @code{alter} @tab @code{after} @tab @code{and} @tab @code{as} -@item @code{asc} @tab @code{avg} @tab @code{avg_row_length} @tab @code{auto_increment} -@item @code{between} @tab @code{bigint} @tab @code{bit} @tab @code{binary} -@item @code{blob} @tab @code{bool} @tab @code{both} @tab @code{by} -@item @code{cascade} @tab @code{case} @tab @code{char} @tab @code{character} -@item @code{change} @tab @code{check} @tab @code{checksum} @tab @code{column} -@item @code{columns} @tab @code{comment} @tab @code{constraint} @tab @code{create} -@item @code{cross} @tab @code{current_date} @tab @code{current_time} @tab @code{current_timestamp} -@item @code{data} @tab @code{database} @tab @code{databases} @tab @code{date} -@item @code{datetime} @tab @code{day} @tab @code{day_hour} @tab @code{day_minute} -@item @code{day_second} @tab @code{dayofmonth} @tab @code{dayofweek} @tab @code{dayofyear} -@item @code{dec} @tab @code{decimal} @tab @code{default} @tab @code{delayed} -@item @code{delay_key_write} @tab @code{delete} @tab @code{desc} @tab @code{describe} -@item @code{distinct} @tab @code{distinctrow} @tab @code{double} @tab @code{drop} -@item @code{end} @tab @code{else} @tab @code{escape} @tab @code{escaped} -@item @code{enclosed} @tab @code{enum} @tab @code{explain} @tab @code{exists} -@item @code{fields} @tab @code{file} @tab @code{first} @tab @code{float} -@item @code{float4} @tab @code{float8} @tab @code{flush} @tab @code{foreign} -@item @code{from} @tab @code{for} @tab @code{full} @tab @code{function} -@item @code{global} @tab @code{grant} @tab @code{grants} @tab @code{group} -@item @code{having} @tab @code{heap} @tab @code{high_priority} @tab @code{hour} -@item @code{hour_minute} @tab @code{hour_second} @tab @code{hosts} @tab @code{identified} -@item @code{ignore} @tab @code{in} @tab @code{index} @tab @code{infile} -@item @code{inner} @tab @code{insert} @tab @code{insert_id} @tab @code{int} -@item @code{integer} @tab @code{interval} @tab @code{int1} @tab @code{int2} -@item @code{int3} @tab @code{int4} @tab @code{int8} @tab @code{into} -@item @code{if} @tab @code{is} @tab @code{isam} @tab @code{join} -@item @code{key} @tab @code{keys} @tab @code{kill} @tab @code{last_insert_id} -@item @code{leading} @tab @code{left} @tab @code{length} @tab @code{like} -@item @code{lines} @tab @code{limit} @tab @code{load} @tab @code{local} -@item @code{lock} @tab @code{logs} @tab @code{long} @tab @code{longblob} -@item @code{longtext} @tab @code{low_priority} @tab @code{max} @tab @code{max_rows} -@item @code{match} @tab @code{mediumblob} @tab @code{mediumtext} @tab @code{mediumint} -@item @code{middleint} @tab @code{min_rows} @tab @code{minute} @tab @code{minute_second} -@item @code{modify} @tab @code{month} @tab @code{monthname} @tab @code{myisam} -@item @code{natural} @tab @code{numeric} @tab @code{no} @tab @code{not} -@item @code{null} @tab @code{on} @tab @code{optimize} @tab @code{option} -@item @code{optionally} @tab @code{or} @tab @code{order} @tab @code{outer} -@item @code{outfile} @tab @code{pack_keys} @tab @code{partial} @tab @code{password} -@item @code{precision} @tab @code{primary} @tab @code{procedure} @tab @code{process} -@item @code{processlist} @tab @code{privileges} @tab @code{read} @tab @code{real} -@item @code{references} @tab @code{reload} @tab @code{regexp} @tab @code{rename} -@item @code{replace} @tab @code{restrict} @tab @code{returns} @tab @code{revoke} -@item @code{rlike} @tab @code{row} @tab @code{rows} @tab @code{second} -@item @code{select} @tab @code{set} @tab @code{show} @tab @code{shutdown} -@item @code{smallint} @tab @code{soname} @tab @code{sql_big_tables} @tab @code{sql_big_selects} -@item @code{sql_low_priority_updates} @tab @code{sql_log_off} @tab @code{sql_log_update} @tab @code{sql_select_limit} -@item @code{sql_small_result} @tab @code{sql_big_result} @tab @code{sql_warnings} @tab @code{straight_join} -@item @code{starting} @tab @code{status} @tab @code{string} @tab @code{table} -@item @code{tables} @tab @code{temporary} @tab @code{terminated} @tab @code{text} -@item @code{then} @tab @code{time} @tab @code{timestamp} @tab @code{tinyblob} -@item @code{tinytext} @tab @code{tinyint} @tab @code{trailing} @tab @code{to} -@item @code{type} @tab @code{use} @tab @code{using} @tab @code{unique} -@item @code{unlock} @tab @code{unsigned} @tab @code{update} @tab @code{usage} -@item @code{values} @tab @code{varchar} @tab @code{variables} @tab @code{varying} -@item @code{varbinary} @tab @code{with} @tab @code{write} @tab @code{when} -@item @code{where} @tab @code{year} @tab @code{year_month} @tab @code{zerofill} -@end multitable - -ʲ ANSI SQL Ǥϥեɡơ֥̾ȤƤλѤػߤƤޤ - @strong{MySQL} ǤϵĤƤޤ -ϡ̾̾ǡ¿οͤ̾Ȥ -ѤƤ뤫Ǥ - -@itemize @bullet -@item @code{ACTION} -@item @code{BIT} -@item @code{DATE} -@item @code{ENUM} -@item @code{NO} -@item @code{TEXT} -@item @code{TIME} -@item @code{TIMESTAMP} -@end itemize - -@cindex Table types, Choosing -@cindex BDB table type -@cindex Berkeley_db table type -@cindex ISAM table type -@cindex HEAP table type -@cindex MySQL table types -@cindex MyISAM table type -@node Table types, Tutorial, Reference, Top -@chapter MySQL table types - -With MySQL you can currently (version 3.23.6) choose between three basic -table formats. When you create a new table, you can tell @strong{MySQL} -which table type it should use for the table. @strong{MySQL} will -always create a @code{.frm} file to hold the table and column -definitions. Depending on the table type the index and data will be -stored in other files. - -The default table type in @strong{MySQL} is @code{MyISAM}. If you are -trying to use a table type that is not incompiled or activated, -@strong{MySQL} will instead create a table of type @code{MyISAM}. - -@code{ALTER TABLE} ʸѤСơ֥㤦ѹǤޤ -@xref{ALTER TABLE, , @code{ALTER TABLE}}. - -Note that @strong{MySQL} supports two different kind of -tables. Transactions safe tables (@code{BDB}) and not transaction safe -tables (@code{ISAM},@code{MyISAM} and @code{HEAP}. - -Advantages of transaction safe tables (TST) - -@itemize @bullet -@item -Safer; Even if @code{MySQL} crashes or you get hardware problems, you -can get your data back; Either by automatic recovery or from a backup -+ the transaction log. -@item -You can combine many statements and accept these all in one go with -the @code{COMMIT} command. -@item -You can execute @code{ROLLBACK} to ignore your changes (if you are not -running in auto commit mode). -@item -If an update fails, all your changes will be restored. (With NTST tables all -changes that has taken place are permanent) -@end itemize - -Advantages of not transaction safe tables (NTST): - -@itemize @bullet -@item -Much faster as there is no transcation overhead. -@item -Will use less disk space as there is no overhead of transactions. -@item -Will use less memory to do updates. -@end itemize - -You can combine TST and NTST tables in the same statements to get the best -of both worlds. - -@menu -* MyISAM:: MyISAM tables -* ISAM:: ISAM tables -* HEAP:: HEAP tables -* BDB:: -@end menu - -@node MyISAM, ISAM, Table types, Table types -@section MyISAM tables - -@code{MyISAM} ϡ@strong{MySQL} 3.23 ǤΥǥեȤΥơ֥Ǥ - @code{ISAM} ɤˤ¿ʳĥǽäƤޤ - -ǥå @code{.MYI} (MYindex) ĥҤΤĤե¸졢 -ǡϡ @code{.MYD} (MYData) ĥҤΤĤե¸ޤ -@code{myisamchk} 桼ƥƥѤơ @code{MyISAM} ơ֥ -ǽǤ @xref{Crash recovery}. - -The following is new in @code{MyISAM}: - -@itemize @bullet -@item -륹åɤɤ߹Υơ֥Ф㤦åɤ -Ʊơ֥ˡԤ @code{INSERT} Ǥޤ -Ϥʤ -You can @code{INSERT} new rows in a table without deleted rows, -while other threads are reading from the table. -@item -ե (63 bit) Υݡȡ -filesystems/operating systems ե򥵥ݡȤƤ硣 -@item -ǡϡ̥ХȤˤޤ ϡǡ򡢥ޥOS -¸ˤޤ -The only requirement is that the machine uses two's-complement -signed integers (as every machine for the last 20 years has) -and IEEE floating point format (also totally dominant among mainstream -machines). The only area of machines that may not support binary -compatibility are embedded systems (because they sometimes have peculiar -processors). -@item -ͥϹ̥ХȤ˽񤫤ޤ ϥǥåΰΨ -ɤޤ -@item -Internal handling of one @code{AUTO_INCREMENT} column. @code{MyISAM} -will automatically update this on @code{INSERT/UPDATE}. The -@code{AUTO_INCREMENT} value can be reset with @code{myisamchk}. This -will make @code{AUTO_INCREMENT} columns faster (at least 10 %) and old -numbers will not be reused as with the old ISAM. Note that when a -@code{AUTO_INCREMENT} is defined on the end of a multi-part-key the old -behavior is still present. -@item -When inserted in sorted order (as when you are using an @code{AUTO_INCREMENT} -column) the key tree will be split so that the high node only contains one -key. This will improve the space utilization in the key tree. -@item -@code{BLOB} @code{TEXT} եɤ˥ǥåĥޤ -@item -@code{NULL} ͤ򥤥ǥåĥ줿եɤ˵ޤ This takes 0-1 -bytes/key. -@item -ߡκĹϥǥեȤ 500 Ǥ In cases of keys longer -than 250 bytes, a bigger key block size than the default of 1024 bytes -is used for this key. -@item -Maximum number of keys/table enlarged to 32 as default. This can be -enlarged to 64 without having to recompile @code{myisamchk}. -@item -There is a flag in the @code{MyISAM} file that indicates whether or not the -table was closed correctly. This will soon be used for automatic repair -in the @strong{MySQL} server. -@item -@code{myisamchk} will mark tables as checked if one runs it with -@code{--update-state}. @code{myisamchk --fast} will only check those -tables that don't have this mark. -@item -@code{myisamchk -a} stores statistics for key parts (and not only for -whole keys as in @code{ISAM}). -@item -Dynamic size rows will now be much less fragmented when mixing deletes -with updates and inserts. This is done by automatically combining adjacent -deleted blocks and by extending blocks if the next block is deleted. -@item -@code{myisampack} @code{BLOB} @code{VARCHAR} եɤѥå뤳ȤǽǤ -@end itemize - -@code{MyISAM} also supports the following things, which @strong{MySQL} -will be able to use in the near future. - -@itemize @bullet -@item -Support for a true @code{VARCHAR} type; A @code{VARCHAR} column starts -with a length stored in 2 bytes. -@item -Tables with @code{VARCHAR} may have fixed or dynamic record length. -@item -@code{VARCHAR} and @code{CHAR} may be up to 64K. -All key segments have their own language definition. This will enable -@strong{MySQL} to have different language definitions per column. -@item -A hashed computed index can be used for @code{UNIQUE}; This will allow -you to have @code{UNIQUE} on any combination of columns in a table. (You -can't search on a @code{UNIQUE} computed index, however.) -@end itemize - -@menu -* Key space:: Space needed for keys -* MyISAM table formats:: -@end menu - -@node Key space, MyISAM table formats, MyISAM, MyISAM -@subsection Space needed for keys - -@strong{MySQL} can support different index types, but the normal type is -ISAM or MyISAM. These use a B-tree index and you can roughly calculate -the size for the index file as @code{(key_length+4)/0.67}, summed over -all keys. (This is for the worst case when all keys are inserted in -sorted order and we don't have any compressed keys.) - -String indexes are space compressed. If the first index part is a -string, it will also be prefix compressed. Space compression makes the -index file smaller than the above figures if the string column has a lot -of trailing space or is a @code{VARCHAR} column that is not always used -to the full length. Prefix compression is used on keys that start -with a string. Prefix compression helps if there are many strings -with an identical prefix. - -In @code{MyISAM} tables, you can also prefix compress numbers by specifying -@code{PACK_KEYS=1} when you create the table. This helps when you have -many integer keys which have an identical prefix when the numbers are stored -high-byte first. - -@node MyISAM table formats, , Key space, MyISAM -@subsection MyISAM table formats - -@strong{MyISAM} supports 3 different table types. 2 of them are chosen -automatically depending on the type of columns you are using. The third, -compressed tables, can only be created with the @code{myisampack} tool. - -@menu -* Static format:: Static (Fixed-length) table characteristics -* Dynamic format:: Dynamic table characteristics -* Compressed format:: Compressed table characteristics -@end menu - -@node Static format, Dynamic format, MyISAM table formats, MyISAM table formats -@subsubsection Static (Fixed-length) table characteristics - -This is the default format. It's used when the table contains no -@code{VARCHAR}, @code{BLOB} or @code{TEXT} columns. - -ΥեޥåȤϡǤñ㡢ġʥեޥåȤǤ -, Disk ˺ơ֥ǡǤ®եޥåȤǤ⤢ޤ -ϥǥΥǡ򸫤Ĥ䤹Ǥ -When looking up something with an index and static -format it is very simple, just multiply the row number with the row length. - -Also when scanning a table it is very easy to read a constant number of -records with each disk read. - -ȤΤϡͤʤȤǤ -⤷ˡŪ(Ĺ) MyISAM ե˽񤭹ˡ -ʤΥԥ塼å夷硢 -@code{myisamchk} ϡ줾Υ쥳ɤγȽλ°פ˸Ĥ뤳Ȥ -ޤ -So it can usually reclaim all records except the -partially written one. -MySQL ǤϡˡƤΥǥåƹۤǤ뤳ȤդƤ - -@itemize @bullet -@item -Ƥ @code{CHAR}, @code{NUMERIC}, @code{DECIMAL} եɤϡΥե -Ĺ­ʤʬˤϥڡޤ -@item -ȤƤ® -@item -å夷䤹 -@item -åθƹۤ䤹ʤʤ쥳ɤꤵ줿֤˳ƤƤ -뤫顣 -@item -Doesn't have to be reorganized (with @code{myisamchk}) unless a huge number of -records are deleted and you want to return free disk space to the operating -system. -@item -̾ưŪơ֥¿Υǥ̤ɬס -@end itemize - -@node Dynamic format, Compressed format, Static format, MyISAM table formats -@subsubsection Dynamic table characteristics - -This format is used if the table contains any @code{VARCHAR}, @code{BLOB} -or @code{TEXT} columns or if the table was created with -@code{ROW_FORMAT=dynamic}. - -ηϾʣǤ ʤʤ餽줾Υ쥳ɤ쥳ɤɤΤ餤 -ĹäƤ뤫ϿإåäƤ뤫Ǥ -One record can also end up at more than one -location when it is made longer at an update. - -@code{OPTIMIZE table} @code{myisamchk} Ѥơơ֥ -ե饰ơ뤳ȤǽǤ -If you have static data that you access/change a lot in the same -table as some @code{VARCHAR} or @code{BLOB} columns, it might be a good -idea to move the dynamic columns to other tables just to avoid -fragmentation. - -@itemize @bullet -@item -ƤʸեɤưŪˤʤޤʤ4byteûʪϽޤ -@item -줾Υ쥳ɤƬˤϡեɤξ֤ɽӥåȡޥåפޤ -ΥӥåȤϡɤʸեɤʸ(@code{''})ʤΤ -ɤοͥեɤʤΤ򼨤ޤ -(ϥեɤͤ @code{NULL} ͤȤϰ㤤ޤ) -⤷ʸեɤʸĹ(³ϼ) -äꡢ뤤ϡͥեɤͤ Ǥäϡ -Υեɤϥӥåȡޥåפ˥ޡ졢ͤϥǥˤ¸ޤ -ʸǤϤʤϡʸΥХȿӥåȡޥåפ˵Ͽ졢 -ʸ󼫿Ȥեɤ¸ޤ -@item -̾ĹΥơ֥⾯ʤǥ̤Ǥߤޤ -@item -줾Υ쥳ɤϡ׵ᤵ줿ΥڡѤޤ -⤷쥳ɤ礭ʤȡ׵ᤵ줿ʬ¿Ҥʬޤ -η̡쥳ɤΥե饰ơȯޤ -@item -If you update a row with information that extends the row length, the -row will be fragmented. In this case, you may have to run @code{myisamchk --r} from time to time to get better performance. Use @code{myisamchk -ei -tbl_name} for some statistics. -@item -Not as easy to reconstruct after a crash, because a record may be fragmented -into many pieces and a link (fragment) may be missing. -@item -Ԥ쥳ɤĹϡ - -@example -3 -+ (եɿ + 7) / 8 -+ (char եɤο) -+ ͥեɤѥå -+ ʸĹ -+ (NULL եɤο + 7) / 8 -@end example - -There is a penalty of 6 bytes for each link. A dynamic record is linked -whenever an update causes an enlargement of the record. Each new link will be -at least 20 bytes, so the next enlargement will probably go in the same link. -If not, there will be another link. You may check how many links there are -with @code{myisamchk -ed}. All links may be removed with @code{myisamchk -r}. -@end itemize - -@node Compressed format, , Dynamic format, MyISAM table formats -@subsubsection Compressed table characteristics - -ɤ߹Ѥηǡץġ @code{myisampack} Ǻޤ -(@code{pack_isam} for @code{ISAM} tables). - -@code{myisampack} and @code{pack_isam} are available to all customers -that have bought a @strong{MySQL} license or @code{MySQL} support -for their internal use. - -@itemize @bullet -@item -The uncompress code exists in all @strong{MySQL} distributions so that -even customers who don't have @code{myisampack} can read tables that -were compressed with @code{myisampack} -@item -Compressed tables takes very little disk space. This minimizes disk usage which -is very nice when using slow disks (like CD-ROMs). -@item -Each record is compressed separately (very little access overhead). The -header for a record is fixed (1-3 bytes) depending on the biggest record in the -table. Each column is compressed differently. Some of the compression types -are: -@itemize @minus -@item -There is usually a different Huffman table for each column. -@item -Suffix space compression. -@item -Prefix space compression. -@item -Numbers with value @code{0} are stored using 1 bit. -@item -If values in an integer column have a small range, the column is stored using -the smallest possible type. For example, a @code{BIGINT} column (8 bytes) may -be stored as a @code{TINYINT} column (1 byte) if all values are in the range -@code{0} to @code{255}. -@item -If a column has only a small set of possible values, the column type is -converted to @code{ENUM}. -@item -A column may use a combination of the above compressions. -@end itemize -@item -Can handle fixed or dynamic length records, but not @code{BLOB} or @code{TEXT} -columns. -@item -Can be uncompressed with @code{myisamchk}. -@end itemize - -@node ISAM, HEAP, MyISAM, Table types -@section ISAM tables - -You can also use the deprecated ISAM table type. This will disappear -rather soon because @code{MyISAM} is a better implementation of the same -thing. ISAM uses a @code{B-tree} index. The index is stored in a file -with the @code{.ISM} extension and the data is stored in file with the -@code{.ISD} extension. You can check/repair ISAM tables with the -@code{isamchk} utility. @xref{Crash recovery}. - -@code{ISAM} has the following features/properties: - -@itemize @bullet -@item Compressed and fixed length keys -@item Fixed and dynamic record length -@item 16 keys with 16 key parts / key -@item Max key length 256 (default) -@item Data is stored in machine format; this is fast, but is machine/OS dependent. -@end itemize - -Most of the things for @code{MyISAM} tables are also true for @code{ISAM} -tables. @xref{MyISAM}. The major differences compared to @code{MyISAM} -tables are: - -@itemize @bullet -@item ISAM tables are not binary portable across OS/Platforms. -@item Can't handle tables > 4G. -@item Only support prefix compression on strings -@item Smaller key limits. -@item Dynamic tables gets more fragmented. -@item Tables are compressed with @code{pack_isam} rather than with @code{myisampack}. -@end itemize - -@node HEAP, BDB, ISAM, Table types -@section HEAP tables - -@code{HEAP} tables use a hashed index and are stored in memory. This -makes them very fast, but if @strong{MySQL} crashes you will lose all -data stored in them. @code{HEAP} is very useful as temporary tables! - -@strong{MySQL} HEAP ơ֥ϡ100% ʥåߥåϥå󥰤 -ѤƤޤʥСեꥢ̵ˡˡ -There is no extra space needed for free lists. -@code{HEAP} tables also don't have problems with delete + inserts, which -normally is common with hashed tables.. - -@example -mysql> CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) as down - FROM log_table GROUP BY ip; -mysql> SELECT COUNT(ip),AVG(down) FROM test; -mysql> DROP TABLE test; -@end example - -Here are some things you should consider when you use @code{HEAP} tables: - -@itemize @bullet -@item -You should always use specify @code{MAX_ROWS} in the @code{CREATE} statement -to ensure that you accidently do not use all memory. -@item -Indexes will only be used with @code{=} and @code{<=>} (but are VERY fast). -@item -@code{HEAP} tables can only use whole keys to search for a row; compare this -to @code{MyISAM} tables where any prefix of the key can be used to find rows. -@item -@code{HEAP} tables use a fixed record length format. -@item -@code{HEAP} doesn't support @code{BLOB}/@code{TEXT} columns. -@item -@code{HEAP} doesn't support @code{AUTO_INCREMENT} columns. -@item -@code{HEAP} doesn't support an index on a @code{NULL} column. -@item -You can have non-unique keys in a @code{HEAP} table (this isn't common for -hashed tables). -@item -@code{HEAP} tables are shared between all clients (just like any other -table). -@item -You can't search for the next entry in order (that is to use the index -to do a @code{ORDER BY}). -@item -Data for @code{HEAP} tables are allocated in small blocks. The tables -are 100% dynamic (on inserting). No overflow areas and no extra key -space is needed. Deleted rows are put in a linked list and are -reused when you insert new data into the table. -@item -You need enough extra memory for all HEAP tables that you want to use at -the same time. -@item -To free memory, you should execute @code{DELETE FROM heap_table} or -@code{DROP TABLE heap_table}. -@item -@strong{MySQL} cannot find out how approximately many rows there -are between two values (this is used by the range optimizer to decide which -index to use). This may affect some queries if you change a @code{MyISAM} -table to a @code{HEAP} table. -@item -To ensure that you accidentally don't do anything stupid, you can't create -@code{HEAP} tables bigger than @code{max_heap_table_size}. -@end itemize - -Memory needed for one row in a @code{HEAP} table is: - -SUM_OVER_ALL_KEYS(max_length_of_key + sizeof(char*)*2) + -ALIGN(length_of_row+1,sizeof(char*)) - -@code{sizeof(char*)} is 4 on 32 bit machines and 8 on 64 bit machines. - -@node BDB, , HEAP, Table types -@section BDB or Berkeley_db tables - -Berkeley DB (@uref{http://www.sleepycat.com}) has provided @strong{MySQL} -with a transaction safe table handler. This will survive crashes and -also provides @code{COMMIT} and @code{ROLLBACK} on transactions. In -order to build MySQL 3.23.x (BDB support first appeared in 3.23.15) with -support for @code{BDB} tables, you will need Berkeley DB 3.1.11 or newer -which can be downloaded from @uref{http://www.mysql.com/download_3.23.html}; -or also from Sleepycat's download page at @uref{http://www.sleepycat.com/download.html}. - -Even if Berkeley DB is in itself very tested and reliably, the -@strong{MySQL} interface is still very alpha, but we are actively -improving and optimizing it to get it this stable real soon. - -If you are running with @code{AUTOCOMMIT=0} then your changes in @code{BDB} -tables will not be updated until you execute @code{COMMIT}. Instead of commit -you can execute @code{ROLLBACK} to forget your changes. @xref{COMMIT}. - -The following options to @code{mysqld} can be used to change the behavour of -BDB tables: - -@multitable @columnfractions .30 .70 -@item --bdb-home= directory @tab Berkeley home direcory -item --bdb-lock-detect=# @tab Berkeley lock detect. One of (DEFAULT, OLDEST, RANDOM or YOUNGEST) -@item --bdb-logdir=directory @tab Berkeley DB log file directory -@item --bdb-nosync @tab Don't synchronously flush logs -@item --bdb-recover @tab Start Berkeley DB in recover mode -@item --bdb-tmpdir=directory @tab Berkeley DB tempfile name -@item --skip-bdb @tab Don't use berkeley db. -@end multitable - -If you use @code{--skip-bdb}, @strong{MySQL} will not initialize the -Berkeley DB library and this will save a lot of memory. You can of course -not use @code{BDB} tables if you are using this option. - -Some characteristic of @code{BDB} tables: - -@itemize @bullet -@item -All @code{BDB} tables must have a primary key. -@item -If all columns you access in a @code{BDB} tables is part of the same index or -part of the the primary key then @strong{MySQL} can execute the query -without having to access the actual row. In a @code{MyISAM} table the -above holds only if the columns are part of the same index. -@item -@code{LOCK TABLES} works on @code{BDB} tables as with other tables. If -you don't use @code{LOCK TABLE}, @strong{MYSQL} will issue an internal -multiple write lock on the table to ensure that the table will be -properly locked if one another thread issues a table lock. -@item -@code{ALTER TABLE} doesn't yet work on @code{BDB} tables. -@item -Internal locking in @code{BDB} tables are done on page level. -@item -Scanning is slower than with @code{MyISAM} tables as one has data in BDB -tables is stored in B-trees and not in a separate data file. -@item -One must in the application always be prepared to handle the case that -any change of a @code{BDB} table may make an automatic rollback and any -read may fail with a deadlock error. -@item -Keys are not compressed to previous keys as with ISAM or MyISAM -tables. In other words, the key information will take a little more -space in @code{BDB} tables compared to MyISAM tables with don't use -@code{PACK_KEYS=0}. -@item -One must do a @code{FLUSH LOGS} from time to time to sync to get checkpoints -for the @code{BDB} tables. -@item -As transaction logs take more place than ordinary logs it's more important -to rotate and remove old logs when using @code{BDB} tables than using other table -types. -@end itemize - -Some things that we have to fix in the near future: - -@itemize @bullet -@item -Remove the requirement that @code{BDB} tables must have a primary key. This -will be fixed by having an automatic hidden auto_increment column for -the tables without a primary key. -@item -@code{LOCK TABLES} should work as for other @strong{MySQL} tables. -@item -@code{ALTER TABLE} doesn't yet work. -@item -@code{SHOW TABLE STATUS} doesn't yet provide that much information for BDB -tables. -@end itemize - -@node Tutorial, Server, Table types, Top -@chapter MySQL 塼ȥꥢ - -@menu -* Connecting-disconnecting:: Connecting to and disconnecting from the server -* Entering queries:: Entering queries -* Examples:: Examples -* Searching on two keys:: -* Database use:: Creating and using a database -* Getting information:: Getting information about databases and tables -* Batch mode:: Using @code{mysql} in batch mode -* Twin:: Queries from twin project -@end menu - -ξϤǤϡ @code{mysql} 饤ȥץλѤλ -ñʥǡ١κȻѤλȤƤȤ夲ޤ -@code{mysql} (``terminal monitor'' ``monitor'' ȤƻȤޤ) -@strong{MySQL} С³Ǥå⡼ɤΥץǡ -μ¹Ԥ̤ɽǽǤ -@code{mysql} ϥХå⡼ɤǽǤ ޤե˽񤤤Ƥ -ƤΥե @code{mysql} ˼¹Ԥޤ -ɤˡǤ @code{mysql} ϤξϤǥСޤ - -@code{mysql} 󶡤륪ץ򸫤ˤϡ @code{--help} ץ -¹Ԥޤ - -@example -shell> mysql --help -@end example - -ξϤǤ @code{mysql} ˤʤΥޥ˥󥹥ȡ뤵ƤΤȤ -ޤ @strong{MySQL} С³ǽǤȤޤ ⤷Ǥʤʤ顢 -ʤ @strong{MySQL} ԤϢäƤ -(⤷@emph{ʤȤ}Ԥʤ顢Υޥ˥奢¾Υ򻲾ȤƤ) - -ܾϤǤϥǡ١ΤΥץǡ١λѤˤĤƽҤ٤ޤ -⤷ʤ¸ߤƤǡ١˥˶̣ʤ顢 -ξϤΥǡ١ơ֥κˡɤФƤ⤫ޤޤ - -ξϤܼŪˤϥ塼ȥꥢǤΤǡ¿ξܺ٤ϡʤ餺㤦Ϥˤޤ -˽񤫤Ƥǡ -˾ܤˤĤƤϥޥ˥奢ŬڤʥĴ٤Ʋ - - -@node Connecting-disconnecting, Entering queries, Tutorial, Tutorial -@section Сؤ³ - -С @code{mysql} ޥɤ³뤿ˤϡ̾ -@strong{MySQL} 桼̾ѥɤꤹɬפǤ礦 -⤷ʤ󤷤ƤʳΥޥξǥСäƤС -ʤϡۥ̾ɬפǤ礦 -ޤʤδԤ䤤碌ơʤȤ٤³ΤΥѥ᡼򸫤ĤФƲ -(ʤɤΤ褦ʥۥȡ桼̾ȥѥɤȤ٤ʤΤ) -Ŭڤʥѥ᡼ΤäƤСʤϡʲΤ褦ˤ³Ǥޤ - -@example -shell> mysql -h host -u user -p -Enter password: ******** -@end example - -@code{********} ȤƤʬˤϤʤΥѥɤޤ -@code{mysql} @code{Enter password:} ץץȤФȤˡ - -ưСĤξ @code{mysql>} ץץȤޤ - -@example -shell> mysql -h host -u user -p -Enter password: ******** -Welcome to the MySQL monitor. Commands end with ; or \g. -Your MySQL connection id is 459 to server version: 3.22.20a-log - -Type 'help' for help. - -mysql> -@end example - -ΥץץȤ @code{mysql} ޥϤԤäƤ֤򼨤ޤ - -Ĥ @strong{MySQL} 󥹥ȥ졼ǤϡۥȤ -¹ԤƤ륵Сˡ桼``ƿ̾''(̵̾)³Ƥޤ -⤷ʤΥޥ󤬤ξƤϤޤʤ顢@code{mysql} 򥪥ץ̵ -ư٤Ǥ - -@example -shell> mysql -@end example - -³塢 @code{mysql>} ץץȤǡ@code{QUIT} ȥפ -ĤǤ³ڤ뤳ȤǤޤ - -@example -mysql> QUIT -Bye -@end example - -control-D ǤƤ⤫ޤޤ - -ʲΥǤΤۤȤɤǤϡʤС³ƤΤ -Ƥޤξ @code{mysql>} ץץȤˤäơ򼨤Ƥޤ - - -@node Entering queries, Examples, Connecting-disconnecting, Tutorial -@section - -ΥǽҤ٤褦ˡʤСȤĤʤäƤ뤳ȤΤƲ -ξ֤ǤϤޤɤʥǡ١򤷤Ƥʤ֤ǤϤޤޤ -Ǥϡơ֥κǡϡФ⡢ -˥ȯԤ뤫˽֤ޤ -ΥǤϡʤȤ @code{mysql} ư˴줵뤿ˡ -ʤäƤߤ뤳ȤǤǤĤΥѤơ -ޥϤδŪʸ§Ҥ٤ޤ - -СΥС󡢺դ򥵡С䤤碌롢ñʥޥ -ˤޤ ʲΤ褦 @code{mysql>} ץץȤθϤ - RETURN 򲡤ƤߤƤ - -@example -mysql> SELECT VERSION(), CURRENT_DATE; -+--------------+--------------+ -| version() | CURRENT_DATE | -+--------------+--------------+ -| 3.22.20a-log | 1999-03-19 | -+--------------+--------------+ -1 row in set (0.01 sec) -mysql> -@end example - -Υϡ@code{mysql} ΤĤλƤޤ - -@itemize @bullet -@item -̾ޥɤϡߥǽ SQL ơȥȤ顢ޤ -(ߥɬפȤʤĤ㳰ޤ -˽Ҥ٤ @code{QUIT} ϤΤΰĤǤ¾ФƤޤ) - -@item -ޥɤȯԤȡ@code{mysql} Ϥ򥵡Сꡢ̤ɽޤ -θ塢 @code{mysql>} ץץȤФ¾Υޥɤդ֤Ǥ -ޤ - -@item -@code{mysql} ϥη̤ɽˤƽФޤ ǽιԤϹܤΥ٥̾Ǥ -βιԤˡη̤³ޤ ̾ܤΥ٥̾ϥǡ١Υơ֥뤫 -ʤФե̾ˤʤޤ ơ֥Υե̾ʳμ -ʤΤʤ(礦Τ褦)@code{mysql} Ϳ줿Ȥ -ܤΥ٥̾Ȥɽޤ - -@item -@code{mysql} ϲ쥳(rows)֤äƤ򼨤¹Ԥˤɤ줯餤λ֤ -ä⼨ޤ ϤäѤʥСΥѥեޥ󥹤򼨤ޤ -ͤ wall clock time (CPU ޥ󥿥ǤϤʤ) ѤƤꡢˡ -С١ӥͥåȥԤ֤ȤäװˤƶΤǡ -ΤǤ -(ξϤ¾ˤƤ ``rows in set'' ιԤϾʤޤ) -@end itemize - -ɤϡʤʸʸǤ⵭ҤǤޤ -ʲ˼ƱǤ - -@example -mysql> SELECT VERSION(), CURRENT_DATE; -mysql> select version(), current_date; -mysql> SeLeCt vErSiOn(), current_DATE; -@end example - -ʲΥϡ@code{mysql} ñʷ׻ȤƻѤǤ - -@example -mysql> SELECT SIN(PI()/4), (4+1)*5; -+-------------+---------+ -| SIN(PI()/4) | (4+1)*5 | -+-------------+---------+ -| 0.707107 | 25 | -+-------------+---------+ -@end example - - -ޤǤϸƤޥɤϡŪûԤΤʸǤ -ʤϰԤʣʸ񤯤Ȥޤ -줾ʸνˤϥߥդޤ - -@example -mysql> SELECT VERSION(); SELECT NOW(); -+--------------+ -| version() | -+--------------+ -| 3.22.20a-log | -+--------------+ - -+---------------------+ -| NOW() | -+---------------------+ -| 1999-03-19 00:15:33 | -+---------------------+ -@end example - -ޥɤϰԤˤɬפ⤢ޤ ʣԤˤ錄ĹޥɤǤꤢޤ -@code{mysql} ϥߥǡʸνȸʤޤ ιԤκǸʸκǸȤ -ʤޤ ʤʤС@code{mysql} ϼͳϤߥ󤬸ޤǤ -Ϥ줿Ԥ¹Ԥޤ - -ʣԤˤޤäʸǤ - -@example -mysql> SELECT - -> USER() - -> , - -> CURRENT_DATE; -+--------------------+--------------+ -| USER() | CURRENT_DATE | -+--------------------+--------------+ -| joesmith@@localhost | 1999-03-18 | -+--------------------+--------------+ -@end example - -Ǥϡʣˤޤ륯ˤơǽιԤϤΤȡ -˥ץץȤ @code{mysql>} @code{->} Ѥ뤫򼨤Ƥޤ - @code{mysql} ޤʸäƤ餺ĤʬϤԤäƤ -Ȥ򼨤ޤ The prompt is your friend, because it provides -valuable feedback. If you use that feedback, you will always be aware of -what @code{mysql} is waiting for. - -˥ޥɤμ¹Ԥ褦Ȼפä硢 -@code{\c} Ǥ򥭥󥻥Ǥޤ - -@example -mysql> SELECT - -> USER() - -> \c -mysql> -@end example - -Here, too, notice the prompt. It switches back to @code{mysql>} after you -type @code{\c}, providing feedback to indicate that @code{mysql} is ready -for a new command. - -ʲɽˡ @code{mysql} ΥץץȤȤξ֤򼨤ޤ - -@multitable @columnfractions .10 .9 -@item @strong{ץץ} @tab @strong{̣} -@item @code{mysql>} @tab ޥɤԾ -@item @code{@ @ @ @ ->} @tab ʣԤˤޤ륳ޥɤΡιԤϤԤäƤ֡ -@item @code{@ @ @ @ '>} @tab 󥰥륯 (@samp{'}) ǻϤ줿ʸΡιԤϤԤäƤ֡ -@item @code{@ @ @ @ ">} @tab ֥륯 (@samp{"}) ǻϤ줿ʸΡιԤϤԤäƤ֡ -@end multitable - -ʤʸ򥻥ߥǽ餹Ȥ˺Ƽ¹Ԥˡ -ʣԤԤޤ ξ硢 @code{mysql} -ϤԤޤ - -@example -mysql> SELECT USER() - -> -@end example - -If this happens to you (you think you've entered a statement but the only -response is a @code{->} prompt), most likely @code{mysql} is waiting for the -semicolon. If you don't notice what the prompt is telling you, you might sit -there for a while before realizing what you need to do. Enter a semicolon to -complete the statement, and @code{mysql} will execute it: - -@example -mysql> SELECT USER() - -> ; -+--------------------+ -| USER() | -+--------------------+ -| joesmith@@localhost | -+--------------------+ -@end example - -The @code{'>} and @code{">} prompts occur during string collection. -In @strong{MySQL}, you can write strings surrounded by either @samp{'} -or @samp{"} characters (for example, @code{'hello'} or @code{"goodbye"}), -and @code{mysql} lets you enter strings that span multiple lines. When you -see a @code{'>} or @code{">} prompt, it means that you've entered a line -containing a string that begins with a @samp{'} or @samp{"} quote character, -but have not yet entered the matching quote that terminates the string. -That's fine if you really are entering a multiple-line string, but how likely -is that? Not very. More often, the @code{'>} and @code{">} prompts indicate -that you've inadvertantly left out a quote character. For example: - -@example -mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30; - "> -@end example - -If you enter this @code{SELECT} statement, then hit RETURN and wait for the -result, nothing will happen. Instead of wondering, ``why does this -query take so long?,'' notice the clue provided by the @code{">} prompt. It -tells you that @code{mysql} expects to see the rest of an unterminated -string. (Do you see the error in the statement? The string @code{"Smith} is -missing the second quote.) - -At this point, what do you do? The simplest thing is to cancel the command. -However, you cannot just type @code{\c} in this case, because @code{mysql} -interprets it as part of the string that it is collecting! Instead, enter -the closing quote character (so @code{mysql} knows you've finished the -string), then type @code{\c}: - -@example -mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30; - "> "\c -mysql> -@end example - -The prompt changes back to @code{mysql>}, indicating that @code{mysql} -is ready for a new command. - -It's important to know what the @code{'>} and @code{">} prompts signify, -because if you mistakenly enter an unterminated string, any further lines you -type will appear to be ignored by @code{mysql} --- including a line -containing @code{QUIT}! This can be quite confusing, especially if you -don't know that you need to supply the terminating quote before you can -cancel the current command. - -@node Examples, Searching on two keys, Entering queries, Tutorial -@section Examples of common queries - -Here follows examples of how to solve some common problems with -@strong{MySQL}. - -Some of the examples use the table @code{shop} to hold the price of each -article (item number) for certain traders (dealers). Supposing that each -trader has a single fixed price per article, then (@code{item}, -@code{trader}) is a primary key for the records. - -You can create the example table as: - -@example -CREATE TABLE shop ( - article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, - dealer CHAR(20) DEFAULT '' NOT NULL, - price DOUBLE(16,2) DEFAULT '0.00' NOT NULL, - PRIMARY KEY(article, dealer)); - -INSERT INTO shop VALUES -(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69), -(3,'D',1.25),(4,'D',19.95); -@end example - -Okay, so the example data is: - -@example -SELECT * FROM shop - -+---------+--------+-------+ -| article | dealer | price | -+---------+--------+-------+ -| 0001 | A | 3.45 | -| 0001 | B | 3.99 | -| 0002 | A | 10.99 | -| 0003 | B | 1.45 | -| 0003 | C | 1.69 | -| 0003 | D | 1.25 | -| 0004 | D | 19.95 | -+---------+--------+-------+ -@end example - -@menu -* example-Maximum-column:: -* example-Maximum-row:: -* example-Maximum-column-group:: -* example-Maximum-column-group-row:: -* example-Foreign keys:: -@end menu - -@node example-Maximum-column, example-Maximum-row, Examples, Examples -@subsection The maximum value for a column - -``What's the highest item number?'' - -@example -SELECT MAX(article) AS article FROM shop - -+---------+ -| article | -+---------+ -| 4 | -+---------+ -@end example - -@node example-Maximum-row, example-Maximum-column-group, example-Maximum-column, Examples -@subsection The row holding the maximum of a certain column - -``Find number, dealer, and price of the most expensive article.'' - -In ANSI SQL this is easily done with a sub-query: - -@example -SELECT article, dealer, price -FROM shop -WHERE price=(SELECT MAX(price) FROM shop) -@end example - -In @strong{MySQL} (which does not yet have sub-selects), just do it in -two steps: - -@enumerate -@item -Get the maximum price value from the table with a @code{SELECT} statement. -@item -Using this value compile the actual query: -@example -SELECT article, dealer, price -FROM shop -WHERE price=19.95 -@end example -@end enumerate - -Another solution is to sort all rows descending by price and only -get the first row using the @strong{MySQL} specific @code{LIMIT} clause: - -@example -SELECT article, dealer, price -FROM shop -ORDER BY price DESC -LIMIT 1 -@end example - -@strong{Note}: If there are several most expensive articles (e.g. each 19.95) -the @code{LIMIT} solution shows only one of them! - -@node example-Maximum-column-group, example-Maximum-column-group-row, example-Maximum-row, Examples -@subsection Maximum of column: per group: only the values - -``What's the highest price per article?'' - -@example -SELECT article, MAX(price) AS price -FROM shop -GROUP BY article - -+---------+-------+ -| article | price | -+---------+-------+ -| 0001 | 3.99 | -| 0002 | 10.99 | -| 0003 | 1.69 | -| 0004 | 19.95 | -+---------+-------+ -@end example - -@node example-Maximum-column-group-row, example-Foreign keys, example-Maximum-column-group, Examples -@subsection The rows holding the group-wise maximum of a certain field - -``For each article, find the dealer(s) with the most expensive price.'' - -In ANSI SQL, I'd do it with a sub-query like this: - -@example -SELECT article, dealer, price -FROM shop s1 -WHERE price=(SELECT MAX(s2.price) - FROM shop s2 - WHERE s1.article = s2.article) -@end example - -In @strong{MySQL} it's best do it in several steps: - -@enumerate -@item -Get the list of (article,maxprice). @xref{example-Maximum-column-group-row}. -@item -For each article get the corresponding rows which have the stored maximum -price. -@end enumerate - -This can easily be done with a temporary table: - -@example -CREATE TEMPORARY TABLE tmp ( - article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, - price DOUBLE(16,2) DEFAULT '0.00' NOT NULL); - -LOCK TABLES article read; - -INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article; - -SELECT article, dealer, price FROM shop, tmp -WHERE shop.article=tmp.article AND shop.price=tmp.price; - -UNLOCK TABLES; - -DROP TABLE tmp; -@end example - -If you don't use a @code{TEMPORARY} table, you must also lock the 'tmp' table. - -`Can it be done with a single query?'' - -Yes, but only by using a quite inefficient trick that I call the -``MAX-CONCAT trick'': - -@example -SELECT article, - SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer, - 0.00+LEFT( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price -FROM shop -GROUP BY article; - -+---------+--------+-------+ -| article | dealer | price | -+---------+--------+-------+ -| 0001 | B | 3.99 | -| 0002 | A | 10.99 | -| 0003 | C | 1.69 | -| 0004 | D | 19.95 | -+---------+--------+-------+ -@end example - -The last example can of course be made a bit more efficient by doing the -splitting of the concatenated column in the client. - -@node example-Foreign keys, , example-Maximum-column-group-row, Examples -@subsection Using foreign keys - -You don't need foreign keys to join 2 tables. - -The only thing @strong{MySQL} doesn't do is @code{CHECK} to make sure that -the keys you use really exist in the table(s) you're referencing and it -doesn't automatically delete rows from table with a foreign key -definition. If you use your keys like normal, it'll work just fine! - - -@example -CREATE TABLE persons ( - id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, - name CHAR(60) NOT NULL, - PRIMARY KEY (id) -); - -CREATE TABLE shirts ( - id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, - style ENUM('t-shirt', 'polo', 'dress') NOT NULL, - color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL, - owner SMALLINT UNSIGNED NOT NULL REFERENCES persons, - PRIMARY KEY (id) -); - - -INSERT INTO persons VALUES (NULL, 'Antonio Paz'); - -INSERT INTO shirts VALUES -(NULL, 'polo', 'blue', LAST_INSERT_ID()), -(NULL, 'dress', 'white', LAST_INSERT_ID()), -(NULL, 't-shirt', 'blue', LAST_INSERT_ID()); - - -INSERT INTO persons VALUES (NULL, 'Lilliana Angelovska'); - -INSERT INTO shirts VALUES -(NULL, 'dress', 'orange', LAST_INSERT_ID()), -(NULL, 'polo', 'red', LAST_INSERT_ID()), -(NULL, 'dress', 'blue', LAST_INSERT_ID()), -(NULL, 't-shirt', 'white', LAST_INSERT_ID()); - - -SELECT * FROM persons; -+----+---------------------+ -| id | name | -+----+---------------------+ -| 1 | Antonio Paz | -| 2 | Lilliana Angelovska | -+----+---------------------+ - -SELECT * FROM shirts; -+----+---------+--------+-------+ -| id | style | color | owner | -+----+---------+--------+-------+ -| 1 | polo | blue | 1 | -| 2 | dress | white | 1 | -| 3 | t-shirt | blue | 1 | -| 4 | dress | orange | 2 | -| 5 | polo | red | 2 | -| 6 | dress | blue | 2 | -| 7 | t-shirt | white | 2 | -+----+---------+--------+-------+ - - -SELECT s.* FROM persons p, shirts s - WHERE p.name LIKE 'Lilliana%' - AND s.owner = p.id - AND s.color <> 'white'; - -+----+-------+--------+-------+ -| id | style | color | owner | -+----+-------+--------+-------+ -| 4 | dress | orange | 2 | -| 5 | polo | red | 2 | -| 6 | dress | blue | 2 | -+----+-------+--------+-------+ -@end example - -@findex UNION -@node Searching on two keys, Database use, Examples, Tutorial -@section Searching on two keys - -@strong{MySQL} doesn't yet optimize when you search on two different -keys combined with @code{OR} (Searching on one key with different @code{OR} -parts is optimized quite good): - -@example -SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1' -OR field2_index = '1' -@end example - -The reason is that we haven't yet had time to come up with an efficient -way to handle this in the general case. (The @code{AND} handling is -in comparison now completely general and works very well). - -For the moment you can solve this very efficently by using a -@code{TEMPORARY} table; This type of optimization is also very good if -you are using very complicated queries where the SQL server does the -optimizations in the wrong order. - -@example -CREATE TEMPORARY TABLE tmp -SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'; -INSERT INTO tmp -SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1'; -SELECT * from tmp; -DROP TABLE tmp; -@end example - -The above way to solve this query is in effect an @code{UNION} of two queries. - -@node Database use, Getting information, Searching on two keys, Tutorial -@section Creating and using a database - -@menu -* Creating database:: Creating a database -* Creating tables:: Creating a table -* Loading tables:: Loading data into a table -* Retrieving data:: Retrieving information from a table -* Multiple tables:: Using more than one table -@end menu - -Now that you know how to enter commands, it's time to access a database. - -Suppose you have several pets in your home (your ``menagerie'') and you'd -like to keep track of various types of information about them. You can do so -by creating tables to hold your data and loading them with the desired -information. Then you can answer different sorts of questions about your -animals by retrieving data from the tables. This section shows how to do -all that: - -@itemize @bullet -@item -How to create a database -@item -How to create a table -@item -How to load data into the table -@item -How to retrieve data from the table in various ways -@item -How to use multiple tables -@end itemize - -The menagerie database will be simple (deliberately), but it is not difficult -to think of real-world situations in which a similar type of database might -be used. For example, a database like this could be used by a farmer to keep -track of livestock, or by a veterinarian to keep track of patient records. - -Use the @code{SHOW} statement to find out what databases currently exist -on the server: - -@example -mysql> SHOW DATABASES; -+----------+ -| Database | -+----------+ -| mysql | -| test | -| tmp | -+----------+ -@end example - -The list of databases is probably different on your machine, but the -@code{mysql} and @code{test} databases are likely to be among them. The -@code{mysql} database is required because it describes user access -privileges. The @code{test} database is often provided as a workspace for -users to try things out. - -If the @code{test} database exists, try to access it: - -@example -mysql> USE test -Database changed -@end example - -Note that @code{USE}, like @code{QUIT}, does not require a semicolon. (You -can terminate such statements with a semicolon if you like; it does no harm.) -The @code{USE} statement is special in another way, too: it must be given on -a single line. - -You can use the @code{test} database (if you have access to it) for the -examples that follow, but anything you create in that database can be -removed by anyone else with access to it. For this reason, you should -probably ask your @strong{MySQL} administrator for permission to use a -database of your own. Suppose you want to call yours @code{menagerie}. The -administrator needs to execute a command like this: - -@example -mysql> GRANT ALL ON menagerie.* TO your_mysql_name; -@end example - -where @code{your_mysql_name} is the @strong{MySQL} user name assigned to -you. - -@node Creating database, Creating tables, Database use, Database use -@subsection Creating and selecting a database - -If the administrator creates your database for you when setting up your -permissions, you can begin using it. Otherwise, you need to create it -yourself: - -@example -mysql> CREATE DATABASE menagerie; -@end example - -Under Unix, database names are case sensitive (unlike SQL keywords), so you -must always refer to your database as @code{menagerie}, not as -@code{Menagerie}, @code{MENAGERIE} or some other variant. This is also true -for table names. (Under Windows, this restriction does not apply, although -you must refer to databases and tables using the same lettercase throughout a -given query.) - -Creating a database does not select it for use, you must do that explicitly. -To make @code{menagerie} the current database, use this command: - -@example -mysql> USE menagerie -Database changed -@end example - -Your database needs to be created only once, but you must select it for use -each time you begin a @code{mysql} session. You can do this by issuing a -@code{USE} statement as shown above. Alternatively, you can select the -database on the command line when you invoke @code{mysql}. Just specify its -name after any connection parameters that you might need to provide. For -example: - -@example -shell> mysql -h host -u user -p menagerie -Enter password: ******** -@end example - -Note that @code{menagerie} is not your password on the command just shown. -If you want to supply your password on the command line after the @code{-p} -option, you must do so with no intervening space (e.g., as -@code{-pmypassword}, not as @code{-p mypassword}). However, putting your -password on the command line is not recommended, because doing so exposes it -to snooping by other users logged in on your machine. - -@node Creating tables, Loading tables, Creating database, Database use -@subsection Creating a table - -Creating the database is the easy part, but at this point it's empty, as -@code{SHOW TABLES} will tell you: - -@example -mysql> SHOW TABLES; -Empty set (0.00 sec) -@end example - -The harder part is deciding what the structure of your database should be: -what tables you will need, and what columns will be in each of them. - -You'll want a table that contains a record for each of your pets. This can -be called the @code{pet} table, and it should contain, as a bare minimum, -each animal's name. Because the name by itself is not very interesting, the -table should contain other information. For example, if more than one person -in your family keeps pets, you might want to list each animal's owner. You -might also want to record some basic descriptive information such as species -and sex. - -How about age? That might be of interest, but it's not a good thing to store -in a database. Age changes as time passes, which means you'd have to update -your records often. Instead, it's better to store a fixed value such as -date of birth. Then, whenever you need age, you can calculate it as the -difference between the current date and the birth date. @strong{MySQL} -provides functions for doing date arithmetic, so this is not difficult. -Storing birth date rather than age has other advantages, too: - -@itemize @bullet -@item -You can use the database for tasks such as generating reminders for upcoming -pet birthdays. (If you think this type of query is somewhat silly, note that -it is the same question you might ask in the context of a business database -to identify clients to whom you'll soon need to send out birthday greetings, -for that computer-assisted personal touch.) - -@item -You can calculate age in relation to dates other than the current date. For -example, if you store death date in the database, you can easily calculate -how old a pet was when it died. -@end itemize - -You can probably think of other types of information that would be useful in -the @code{pet} table, but the ones identified so far are sufficient for now: -name, owner, species, sex, birth and death. - -Use a @code{CREATE TABLE} statement to specify the layout of your table: - -@example -mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), - -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE); -@end example - -@code{VARCHAR} is a good choice for the @code{name}, @code{owner} and -@code{species} columns because the column values will vary in length. The -lengths of those columns need not all be the same, and need not be -@code{20}. You can pick any length from @code{1} to @code{255}, whatever -seems most reasonable to you. (If you make a poor choice and it turns -out later that you need a longer field, @strong{MySQL} provides an -@code{ALTER TABLE} statement.) - -Animal sex can be represented in a variety of ways, for example, @code{"m"} -and @code{"f"}, or perhaps @code{"male"} and @code{"female"}. It's simplest -to use the single characters @code{"m"} and @code{"f"}. - -The use of the @code{DATE} data type for the @code{birth} and @code{death} -columns is a fairly obvious choice. - -Now that you have created a table, @code{SHOW TABLES} should produce some -output: - -@example -mysql> SHOW TABLES; -+---------------------+ -| Tables in menagerie | -+---------------------+ -| pet | -+---------------------+ -@end example - -To verify that your table was created the way you expected, use -a @code{DESCRIBE} statement: - -@example -mysql> DESCRIBE pet; -+---------+-------------+------+-----+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+---------+-------------+------+-----+---------+-------+ -| name | varchar(20) | YES | | NULL | | -| owner | varchar(20) | YES | | NULL | | -| species | varchar(20) | YES | | NULL | | -| sex | char(1) | YES | | NULL | | -| birth | date | YES | | NULL | | -| death | date | YES | | NULL | | -+---------+-------------+------+-----+---------+-------+ -@end example - -You can use @code{DESCRIBE} any time, for example, if you forget the names of -the columns in your table or what types they are. - -@node Loading tables, Retrieving data, Creating tables, Database use -@subsection Loading data into a table - -After creating your table, you need to populate it. The @code{LOAD DATA} and -@code{INSERT} statements are useful for this. - -Suppose your pet records can be described as shown below. -(Observe that @strong{MySQL} expects dates in @code{YYYY-MM-DD} format; -this may be different than what you are used to.) - -@multitable @columnfractions .16 .16 .16 .16 .16 .16 -@item @strong{name} @tab @strong{owner} @tab @strong{species} @tab @strong{sex} @tab @strong{birth} @tab @strong{death} -@item Fluffy @tab Harold @tab cat @tab f @tab 1993-02-04 @tab -@item Claws @tab Gwen @tab cat @tab m @tab 1994-03-17 @tab -@item Buffy @tab Harold @tab dog @tab f @tab 1989-05-13 @tab -@item Fang @tab Benny @tab dog @tab m @tab 1990-08-27 @tab -@item Bowser @tab Diane @tab dog @tab m @tab 1998-08-31 @tab 1995-07-29 -@item Chirpy @tab Gwen @tab bird @tab f @tab 1998-09-11 @tab -@item Whistler @tab Gwen @tab bird @tab @tab 1997-12-09 @tab -@item Slim @tab Benny @tab snake @tab m @tab 1996-04-29 @tab -@end multitable - -Because you are beginning with an empty table, an easy way to populate it is to -create a text file containing a row for each of your animals, then load the -contents of the file into the table with a single statement. - -You could create a text file @file{pet.txt} containing one record per line, -with values separated by tabs, and given in the order in which the columns -were listed in the @code{CREATE TABLE} statement. For missing values (such -as unknown sexes, or death dates for animals that are still living), you can -use @code{NULL} values. To represent these in your text file, use -@code{\N}. For example, the record for Whistler the bird would look like -this (where the whitespace between values is a single tab character): - -@multitable @columnfractions .15 .15 .15 .15 .25 .15 -@item @code{Whistler} @tab @code{Gwen} @tab @code{bird} @tab @code{\N} @tab @code{1997-12-09} @tab @code{\N} -@end multitable - -To load the text file @file{pet.txt} into the @code{pet} table, use this -command: - -@example -mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet; -@end example - -You can specify the column value separator and end of line marker explicitly -in the @code{LOAD DATA} statement if you wish, but the defaults are tab and -linefeed. These are sufficient for the statement to read the file -@file{pet.txt} properly. - -When you want to add new records one at a time, the @code{INSERT} statement -is useful. In its simplest form, you supply values for each column, in the -order in which the columns were listed in the @code{CREATE TABLE} statement. -Suppose Diane gets a new hamster named Puffball. You could add a new record -using an @code{INSERT} statement like this: - -@example -mysql> INSERT INTO pet - -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL); -@end example - -Note that string and date values are specified as quoted strings here. Also, -with @code{INSERT}, you can insert @code{NULL} directly to represent a -missing value. You do not use @code{\N} like you do with @code{LOAD DATA}. - -From this example, you should be able to see that there would be a lot more -typing involved to load -your records initially using several @code{INSERT} statements rather -than a single @code{LOAD DATA} statement. - -@node Retrieving data, Multiple tables, Loading tables, Database use -@subsection Retrieving information from a table - -@menu -* Selecting all:: Selecting all data -* Selecting rows:: Selecting particular rows -* Selecting columns:: Selecting particular columns -* Sorting rows:: Sorting rows -* Date calculations:: Date calculations -* Working with NULL:: Working with @code{NULL} values -* Pattern matching:: Pattern matching -* Counting rows:: Counting rows -@end menu - -The @code{SELECT} statement is used to pull information from a table. -The general form of the statement is: - -@example -SELECT what_to_select -FROM which_table -WHERE conditions_to_satisfy -@end example - -@code{what_to_select} indicates what you want to see. This can be a list of -columns, or @code{*} to indicate ``all columns.'' @code{which_table} -indicates the table from which you want to retrieve data. The @code{WHERE} -clause is optional. If it's present, @code{conditions_to_satisfy} specifies -conditions that rows must satisfy to qualify for retrieval. - -@node Selecting all, Selecting rows, Retrieving data, Retrieving data -@subsubsection Selecting all data - -The simplest form of @code{SELECT} retrieves everything from a table: - -@example -mysql> SELECT * FROM pet; -+----------+--------+---------+------+------------+------------+ -| name | owner | species | sex | birth | death | -+----------+--------+---------+------+------------+------------+ -| Fluffy | Harold | cat | f | 1993-02-04 | NULL | -| Claws | Gwen | cat | m | 1994-03-17 | NULL | -| Buffy | Harold | dog | f | 1989-05-13 | NULL | -| Fang | Benny | dog | m | 1990-08-27 | NULL | -| Bowser | Diane | dog | m | 1998-08-31 | 1995-07-29 | -| Chirpy | Gwen | bird | f | 1998-09-11 | NULL | -| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | -| Slim | Benny | snake | m | 1996-04-29 | NULL | -| Puffball | Diane | hamster | f | 1999-03-30 | NULL | -+----------+--------+---------+------+------------+------------+ -@end example - -This form of @code{SELECT} is useful if you want to review your entire table, -for instance, after you've just loaded it with your initial dataset. As it -happens, the output just shown reveals an error in your data file: Bowser -appears to have been born after he died! Consulting your original pedigree -papers, you find that the correct birth year is 1989, not 1998. - -There are are least a couple of ways to fix this: - -@itemize @bullet -@item -Edit the file @file{pet.txt} to correct the error, then empty the table -and reload it using @code{DELETE} and @code{LOAD DATA}: - -@example -mysql> DELETE FROM pet; -mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet; -@end example - -However, if you do this, you must also re-enter the record for Puffball. - -@item -Fix only the erroneous record with an @code{UPDATE} statement: - -@example -mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser"; -@end example -@end itemize - -As shown above, it is easy to retrieve an entire table. But typically you -don't want to do that, particularly when the table becomes large. Instead, -you're usually more interested in answering a particular question, in which -case you specify some constraints on the information you want. Let's look at -some selection queries in terms of questions about your pets that they -answer. - -@node Selecting rows, Selecting columns, Selecting all, Retrieving data -@subsubsection Selecting particular rows - -You can select only particular rows from your table. For example, if you want -to verify the change that you made to Bowser's birth date, select Bowser's -record like this: - -@example -mysql> SELECT * FROM pet WHERE name = "Bowser"; -+--------+-------+---------+------+------------+------------+ -| name | owner | species | sex | birth | death | -+--------+-------+---------+------+------------+------------+ -| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | -+--------+-------+---------+------+------------+------------+ -@end example - -The output confirms that the year is correctly recorded now as 1989, not 1998. - -String comparisons are normally case-insensitive, so you can specify the -name as @code{"bowser"}, @code{"BOWSER"}, etc. The query result will be -the same. - -You can specify conditions on any column, not just @code{name}. For example, -if you want to know which animals were born after 1998, test the @code{birth} -column: - -@example -mysql> SELECT * FROM pet WHERE birth >= "1998-1-1"; -+----------+-------+---------+------+------------+-------+ -| name | owner | species | sex | birth | death | -+----------+-------+---------+------+------------+-------+ -| Chirpy | Gwen | bird | f | 1998-09-11 | NULL | -| Puffball | Diane | hamster | f | 1999-03-30 | NULL | -+----------+-------+---------+------+------------+-------+ -@end example - -You can combine conditions, for example, to locate female dogs: - -@example -mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f"; -+-------+--------+---------+------+------------+-------+ -| name | owner | species | sex | birth | death | -+-------+--------+---------+------+------------+-------+ -| Buffy | Harold | dog | f | 1989-05-13 | NULL | -+-------+--------+---------+------+------------+-------+ -@end example - -The preceding query uses the @code{AND} logical operator. There is also an -@code{OR} operator: - -@example -mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird"; -+----------+-------+---------+------+------------+-------+ -| name | owner | species | sex | birth | death | -+----------+-------+---------+------+------------+-------+ -| Chirpy | Gwen | bird | f | 1998-09-11 | NULL | -| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | -| Slim | Benny | snake | m | 1996-04-29 | NULL | -+----------+-------+---------+------+------------+-------+ -@end example - -@code{AND} and @code{OR} may be intermixed. If you do that, it's a good idea -to use parentheses to indicate how conditions should be grouped: - -@example -mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m") - -> OR (species = "dog" AND sex = "f"); -+-------+--------+---------+------+------------+-------+ -| name | owner | species | sex | birth | death | -+-------+--------+---------+------+------------+-------+ -| Claws | Gwen | cat | m | 1994-03-17 | NULL | -| Buffy | Harold | dog | f | 1989-05-13 | NULL | -+-------+--------+---------+------+------------+-------+ -@end example - -@node Selecting columns, Sorting rows, Selecting rows, Retrieving data -@subsubsection Selecting particular columns - - -If you don't want to see entire rows from your table, just name the columns -in which you're interested, separated by commas. For example, if you want to -know when your animals were born, select the @code{name} and @code{birth} -columns: - -@example -mysql> SELECT name, birth FROM pet; -+----------+------------+ -| name | birth | -+----------+------------+ -| Fluffy | 1993-02-04 | -| Claws | 1994-03-17 | -| Buffy | 1989-05-13 | -| Fang | 1990-08-27 | -| Bowser | 1989-08-31 | -| Chirpy | 1998-09-11 | -| Whistler | 1997-12-09 | -| Slim | 1996-04-29 | -| Puffball | 1999-03-30 | -+----------+------------+ -@end example - -To find out who owns pets, use this query: - -@example -mysql> SELECT owner FROM pet; -+--------+ -| owner | -+--------+ -| Harold | -| Gwen | -| Harold | -| Benny | -| Diane | -| Gwen | -| Gwen | -| Benny | -| Diane | -+--------+ -@end example - -@findex DISTINCT -However, notice that the query simply retrieves the @code{owner} field from -each record, and some of them appear more than once. To minimize the output, -retrieve each unique output record just once by adding the keyword -@code{DISTINCT}: - -@example -mysql> SELECT DISTINCT owner FROM pet; -+--------+ -| owner | -+--------+ -| Benny | -| Diane | -| Gwen | -| Harold | -+--------+ -@end example - -You can use a @code{WHERE} clause to combine row selection with column -selection. For example, to get birth dates for dogs and cats only, -use this query: - -@example -mysql> SELECT name, species, birth FROM pet - -> WHERE species = "dog" OR species = "cat"; -+--------+---------+------------+ -| name | species | birth | -+--------+---------+------------+ -| Fluffy | cat | 1993-02-04 | -| Claws | cat | 1994-03-17 | -| Buffy | dog | 1989-05-13 | -| Fang | dog | 1990-08-27 | -| Bowser | dog | 1989-08-31 | -+--------+---------+------------+ -@end example - -@node Sorting rows, Date calculations, Selecting columns, Retrieving data -@subsubsection Sorting rows - -You may have noticed in the preceding examples that the result rows are -displayed in no particular order. However, it's often easier to examine -query output when the rows are sorted in some meaningful way. To sort a -result, use an @code{ORDER BY} clause. - -Here are animal birthdays, sorted by date: - -@example -mysql> SELECT name, birth FROM pet ORDER BY birth; -+----------+------------+ -| name | birth | -+----------+------------+ -| Buffy | 1989-05-13 | -| Bowser | 1989-08-31 | -| Fang | 1990-08-27 | -| Fluffy | 1993-02-04 | -| Claws | 1994-03-17 | -| Slim | 1996-04-29 | -| Whistler | 1997-12-09 | -| Chirpy | 1998-09-11 | -| Puffball | 1999-03-30 | -+----------+------------+ -@end example - -To sort in reverse order, add the @code{DESC} (descending) keyword to the -name of the column you are sorting by: - -@example -mysql> SELECT name, birth FROM pet ORDER BY birth DESC; -+----------+------------+ -| name | birth | -+----------+------------+ -| Puffball | 1999-03-30 | -| Chirpy | 1998-09-11 | -| Whistler | 1997-12-09 | -| Slim | 1996-04-29 | -| Claws | 1994-03-17 | -| Fluffy | 1993-02-04 | -| Fang | 1990-08-27 | -| Bowser | 1989-08-31 | -| Buffy | 1989-05-13 | -+----------+------------+ -@end example - -You can sort on multiple columns. For example, to sort by type of -animal, then by birth date within animal type with youngest animals first, -use the following query: - -@example -mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC; -+----------+---------+------------+ -| name | species | birth | -+----------+---------+------------+ -| Chirpy | bird | 1998-09-11 | -| Whistler | bird | 1997-12-09 | -| Claws | cat | 1994-03-17 | -| Fluffy | cat | 1993-02-04 | -| Fang | dog | 1990-08-27 | -| Bowser | dog | 1989-08-31 | -| Buffy | dog | 1989-05-13 | -| Puffball | hamster | 1999-03-30 | -| Slim | snake | 1996-04-29 | -+----------+---------+------------+ -@end example - -Note that the @code{DESC} keyword applies only to the column name immediately -preceding it (@code{birth}); @code{species} values are still sorted in -ascending order. - -@node Date calculations, Working with NULL, Sorting rows, Retrieving data -@subsubsection դη׻ - -@strong{MySQL} ϤĤդη׻Ԥؿ󶡤ޤ -㤨Сǯη׻դʬФꡣ - -ڥåȤǯ𤬲ͤʤΤΤ뤿ˤϡߤդȤκ׻ -ޤ ΤˤϡĤդľꡢ 365 -(ǯ) dzޤ - -@example -mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 FROM pet; -+----------+-------------------------------------+ -| name | (TO_DAYS(NOW())-TO_DAYS(birth))/365 | -+----------+-------------------------------------+ -| Fluffy | 6.15 | -| Claws | 5.04 | -| Buffy | 9.88 | -| Fang | 8.59 | -| Bowser | 9.58 | -| Chirpy | 0.55 | -| Whistler | 1.30 | -| Slim | 2.92 | -| Puffball | 0.00 | -+----------+-------------------------------------+ -@end example - -ưޤɤĤΤȤޤ -1ˡη̤ϡ⤷쥳ɤˤĤν֤ͿСñ¤Ӵ -褽ʤȡ -2ˡǯθФϡΤޤޤǤϤʤʤΤʬޤ - -ǽ @code{ORDER BY name} ä뤳Ȥ name ¤Ӵޤ -ܤФƤϡ㤦ФϤ˸褦ˡθФ -ޤ ( եɤΥꥢ ȸƤӤޤ) : - -@example -mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age - -> FROM pet ORDER BY name; -+----------+------+ -| name | age | -+----------+------+ -| Bowser | 9.58 | -| Buffy | 9.88 | -| Chirpy | 0.55 | -| Claws | 5.04 | -| Fang | 8.59 | -| Fluffy | 6.15 | -| Puffball | 0.00 | -| Slim | 2.92 | -| Whistler | 1.30 | -+----------+------+ -@end example - -@code{name} ǤϤʤ @code{age} ¤Ӵˤϡ @code{ORDER BY} -ʲΤ褦Ѥޤ - -@example -mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age - -> FROM pet ORDER BY age; -+----------+------+ -| name | age | -+----------+------+ -| Puffball | 0.00 | -| Chirpy | 0.55 | -| Whistler | 1.30 | -| Slim | 2.92 | -| Claws | 5.04 | -| Fluffy | 6.15 | -| Fang | 8.59 | -| Bowser | 9.58 | -| Buffy | 9.88 | -+----------+------+ -@end example - -꤬˻ǤޤäưʪΡǯĴ٤Τˤ -ѤǤޤ ɤưʪǤ뤫ɤϡ@code{death} ͤ @code{NULL} -ɤȽǤޤ ͤ @code{NULL} ʤС @code{death} @code{birth} -κη׻Ԥޤ - -@example -mysql> SELECT name, birth, death, (TO_DAYS(death)-TO_DAYS(birth))/365 AS age - -> FROM pet WHERE death IS NOT NULL ORDER BY age; -+--------+------------+------------+------+ -| name | birth | death | age | -+--------+------------+------------+------+ -| Bowser | 1989-08-31 | 1995-07-29 | 5.91 | -+--------+------------+------------+------+ -@end example - -ΥǤϡ @code{death != NULL} ǤϤʤ @code{death IS NOT NULL} -Ѥޤ ʤʤ顢 @code{NULL} ̤ͤǤ ϸDz⤷ޤ -@xref{Working with NULL, , Working with @code{NULL}}. - -⤷ʤưʪΤꤿȤޤ μη׻Ǥϡ -ǯطޤ @code{birth} եɤηñ -ФʤǤ礦 @strong{MySQL} դʬФĤδؿ -󶡤ޤ @code{YEAR()}, @code{MONTH()}, @code{DAYOFMONTH()} ʤɡ -Ǥ @code{MONTH()} Ǥ礦 줬ɤΤ褦ưΤˤϡ -@code{birth} @code{MONTH(birth)} ξɽ륯¹ԤƤߤޤ - -@example -mysql> SELECT name, birth, MONTH(birth) FROM pet; -+----------+------------+--------------+ -| name | birth | MONTH(birth) | -+----------+------------+--------------+ -| Fluffy | 1993-02-04 | 2 | -| Claws | 1994-03-17 | 3 | -| Buffy | 1989-05-13 | 5 | -| Fang | 1990-08-27 | 8 | -| Bowser | 1989-08-31 | 8 | -| Chirpy | 1998-09-11 | 9 | -| Whistler | 1997-12-09 | 12 | -| Slim | 1996-04-29 | 4 | -| Puffball | 1999-03-30 | 3 | -+----------+------------+--------------+ -@end example - -ޤưʪ򸫤ĤΤϴñǤ 4Ȥޤ -ȡ5ޤưʪõޤ - -@example -mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5; -+-------+------------+ -| name | birth | -+-------+------------+ -| Buffy | 1989-05-13 | -+-------+------------+ -@end example - -⤷ߤ12ʤ顢äȺ뤫⤷ޤ ο (@code{12}) -1 ­ 13 ޤưʪõ櫓ˤϤޤ 1ޤ -ưʪõޤ - -ߤʤΤ򵤤ˤ뤳Ȥʤư륯񤯤ȤǽǤ -ˡǤϡʤϷο򥯥˻Ѥ뤳Ȥޤ -@code{DATE_ADD()} ؿͿդ餢֤­ȤǽǤ -⤷ @code{NOW()} ͤ 1 ­ @code{MONTH()} Ƿ -ʬФη̤Ĵ٤뤿˻Ѥޤ - -@example -mysql> SELECT name, birth FROM pet - -> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH)); -@end example - -ƱȤǤ̤ˡȤơ;ؿ Ѥ̤ 1 ­ˡޤ -(⤷12ʤ顢;ؿ (@code{MOD}) Ѥ̤ @code{0} ˤʤޤ) - -@example -mysql> SELECT name, birth FROM pet - -> WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1; -@end example - -Note that @code{MONTH} return a number between 1 and 12. And -@code{MOD(something,12)} returns a number between 0 and 11. So the -addition has to be after the @code{MOD()} oterwise we would go from -November (11) to January (1). - -@node Working with NULL, Pattern matching, Date calculations, Retrieving data -@subsubsection @code{NULL} ͤο - -ʤ˴ޤǤϡ@code{NULL} ͤˤ϶ä⤷ޤ -ǰŪˡ@code{NULL} ͤ ``̵'' ``̤Τ'' ̣ -¾ͤ⤤֤ۤʤäưޤ -@code{NULL} ɾκݤˤϡͤӱ黻 @code{=}, @code{<}, @code{!=} -Ѥ뤳ȤϽޤ ʤȤǥ⤹뤿ˡʲΤ褦ˤƤߤƤ - -@example -mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL; -+----------+-----------+----------+----------+ -| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL | -+----------+-----------+----------+----------+ -| NULL | NULL | NULL | NULL | -+----------+-----------+----------+----------+ -@end example - -μ¤ˤӤ餤ʤ̣̤ޤ -ˡ @code{IS NULL} , @code{IS NOT NULL} 黻ҤѤޤ - -@example -mysql> SELECT 1 IS NULL, 1 IS NOT NULL; -+-----------+---------------+ -| 1 IS NULL | 1 IS NOT NULL | -+-----------+---------------+ -| 0 | 1 | -+-----------+---------------+ -@end example - -@strong{MySQL} Ǥ, 0 falseʵ ǡ1 trueʿˤǤ - - @code{NULL} ̤ʰϤʤʤΤ Υ򸫤Ƥ -ɤưʪϤƤʤȤŤ뤿ˤϡ -@code{death != NULL} ǤϤʤ @code{death IS NOT NULL} λѤ -ɬפȤΤǤ - -@node Pattern matching, Counting rows, Working with NULL, Retrieving data -@subsubsection ѥ󡦥ޥå - -@strong{MySQL} ɸSQLΥѥ󡦥ޥå󶡤ޤ -ޤĥ줿ɽˤΥѥ󡦥ޥå - @code{vi}, @code{grep} and @code{sed} ʤ UNIX Υ桼ƥƥ -ѤƤʪȻƤޤ󶡤ޤ - -SQL ѥ󡦥ޥåϡ @samp{_} Ǥʤ룱ʸȤפ -@samp{%} Ǥ0ʾʸ˰פޤ -@strong{MySQL} ǤϡǥեȤ SQL ѥϥ¸Ǥ -Ĥʲ˼ޤ SQLѥѤ硢 @code{=} -@code{!=} Ѥʤ褦դƤ @code{LIKE} @code{NOT LIKE} -˻Ѥޤ - -@samp{b} Ϥޤ̾򸫤Ĥˤ: - -@example -mysql> SELECT * FROM pet WHERE name LIKE "b%"; -+--------+--------+---------+------+------------+------------+ -| name | owner | species | sex | birth | death | -+--------+--------+---------+------+------------+------------+ -| Buffy | Harold | dog | f | 1989-05-13 | NULL | -| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | -+--------+--------+---------+------+------------+------------+ -@end example - -@samp{fy} ǽ̾򸫤Ĥˤ: - -@example -mysql> SELECT * FROM pet WHERE name LIKE "%fy"; -+--------+--------+---------+------+------------+-------+ -| name | owner | species | sex | birth | death | -+--------+--------+---------+------+------------+-------+ -| Fluffy | Harold | cat | f | 1993-02-04 | NULL | -| Buffy | Harold | dog | f | 1989-05-13 | NULL | -+--------+--------+---------+------+------------+-------+ -@end example - -@samp{w} ޤ̾򸫤Ĥˤ: - -@example -mysql> SELECT * FROM pet WHERE name LIKE "%w%"; -+----------+-------+---------+------+------------+------------+ -| name | owner | species | sex | birth | death | -+----------+-------+---------+------+------------+------------+ -| Claws | Gwen | cat | m | 1994-03-17 | NULL | -| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | -| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | -+----------+-------+---------+------+------------+------------+ -@end example - -5ʸ̾򸫤Ĥˤ, @samp{_} ѥʸѤơ - -@example -mysql> SELECT * FROM pet WHERE name LIKE "_____"; -+-------+--------+---------+------+------------+-------+ -| name | owner | species | sex | birth | death | -+-------+--------+---------+------+------------+-------+ -| Claws | Gwen | cat | m | 1994-03-17 | NULL | -| Buffy | Harold | dog | f | 1989-05-13 | NULL | -+-------+--------+---------+------+------------+-------+ -@end example - -@strong{MySQL} Ǥ¾Υѥ󡦥ޥåη󶡤ޤɽγĥѤơ -Υѥ󡦥ޥåƥȤݤˤϡ@code{REGEXP} @code{NOT REGEXP} -黻ҡʤ뤤@code{RLIKE}, @code{NOT RLIKE} 黻ҡƱǤ -Ѥޤ - -ĥɽΤĤħ - -@itemize @bullet -@item -@samp{.} ϤʤʸȤפޤ - -@item -@samp{[...]} ϡäˤʸȰפޤ -㤨С@samp{[abc]} @samp{a}, @samp{b} 뤤 @samp{c} ˥ޥåޤ -ʸϰϻꤹˤϥåѤޤ @samp{[a-z]} Ϥʤ -ʸΥե٥åʸˤפ @samp{[0-9]} Ϥʤˤ -פޤ - -@item -@samp{*} ϡ˻ꤵƤʸ 0 İʾ˥ޥåޤ -㤨С@samp{x*} ʸ @samp{x} ĤϢ³Ƥʪ˥ޥå -@samp{[0-9]*} ϤʤͤȤޥå @samp{.*} Ϥʸ -פޤ - -@item -ɽϥ¸Ǥ ʸʸɤǤޥå硢 -ʸ饹ѤǤޤ 㤨С @samp{[aA]} ʸʸ @samp{a} -ޥå@samp{[a-zA-Z]} ʸʸΤʤ륢ե٥åʸˤޥåޤ - -@item -ѥϡƥȤ줿ͤΤɤˤ硢ޥåޤ -(SQL patterns match only if they match the entire value). - -@item -ͤΤϤᡢ뤤Ͻ˰֤ꤷƥޥåϡ -ѥν˥ޥå @samp{^} Ѥ -ѥν˥ޥå @samp{$} Ѥޤ -(ϥ󥫡ȸƤФޤ) -@end itemize - -ʲϳĥ줿ɽɤưǤ -˼ @code{LIKE} Υ @code{REGEXP} ǰʲΤ褦˽񤭴ޤ - -@samp{b} ǻϤޤ̾ߤĤˤϡ@samp{^} ̾Ƭ˥ޥå - @samp{[bB]} Ȥơʸʸˤޥåޤ - -@example -mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]"; -+--------+--------+---------+------+------------+------------+ -| name | owner | species | sex | birth | death | -+--------+--------+---------+------+------------+------------+ -| Buffy | Harold | dog | f | 1989-05-13 | NULL | -| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | -+--------+--------+---------+------+------------+------------+ -@end example - -@samp{fy} ǽ̾򸫤Ĥˤϡ @samp{$} Ѥ̾ -Ǹ˥ޥåޤ - -@example -mysql> SELECT * FROM pet WHERE name REGEXP "fy$"; -+--------+--------+---------+------+------------+-------+ -| name | owner | species | sex | birth | death | -+--------+--------+---------+------+------------+-------+ -| Fluffy | Harold | cat | f | 1993-02-04 | NULL | -| Buffy | Harold | dog | f | 1989-05-13 | NULL | -+--------+--------+---------+------+------------+-------+ -@end example - -@samp{w} ޤ̾򸫤Ĥˤϡ@samp{[wW]} Ѥ -ʸʸ˥ޥåޤ - -@example -mysql> SELECT * FROM pet WHERE name REGEXP "[wW]"; -+----------+-------+---------+------+------------+------------+ -| name | owner | species | sex | birth | death | -+----------+-------+---------+------+------------+------------+ -| Claws | Gwen | cat | m | 1994-03-17 | NULL | -| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | -| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | -+----------+-------+---------+------+------------+------------+ -@end example - -ɽϤ⤷ΤɤˤǤ⤢Хޥå뤿ᡢ -SQL ѥΤ褦ˡѥ˥磻ɥɤɬפϤޤ - -5ʸ̾򸫤Ĥˤϡ@samp{^} @samp{$} Ѥ̾νȽ -ޥåδ֤ @samp{.} 5ޤ - -@example -mysql> SELECT * FROM pet WHERE name REGEXP "^.....$"; -+-------+--------+---------+------+------------+-------+ -| name | owner | species | sex | birth | death | -+-------+--------+---------+------+------------+-------+ -| Claws | Gwen | cat | m | 1994-03-17 | NULL | -| Buffy | Harold | dog | f | 1989-05-13 | NULL | -+-------+--------+---------+------+------------+-------+ -@end example - -Υ @samp{@{n@}} ``@code{n}󷫤֤'' ڥ졼 -񴹤ǽǤ - -@example -mysql> SELECT * FROM pet WHERE name REGEXP "^.@{5@}$"; -+-------+--------+---------+------+------------+-------+ -| name | owner | species | sex | birth | death | -+-------+--------+---------+------+------------+-------+ -| Claws | Gwen | cat | m | 1994-03-17 | NULL | -| Buffy | Harold | dog | f | 1989-05-13 | NULL | -+-------+--------+---------+------+------------+-------+ -@end example - -@node Counting rows, , Pattern matching, Retrieving data -@subsubsection Counting rows - -Databases are often used to answer the question, ``How often does a certain -type of data occur in a table?'' For example, you might want to know how -many pets you have, or how many pets each owner has, or you might want to -perform various kinds of censuses on your animals. - -Counting the total number of animals you have is the same question as ``How -many rows are in the @code{pet} table?,'' because there is one record per pet. -The @code{COUNT()} function counts the number of non-@code{NULL} results, so -the query to count your animals looks like this: - -@example -mysql> SELECT COUNT(*) FROM pet; -+----------+ -| COUNT(*) | -+----------+ -| 9 | -+----------+ -@end example - -Earlier, you retrieved the names of the people who owned pets. You can -use @code{COUNT()} if you want to find out how many pets each owner has: - -@example -mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; -+--------+----------+ -| owner | COUNT(*) | -+--------+----------+ -| Benny | 2 | -| Diane | 2 | -| Gwen | 3 | -| Harold | 2 | -+--------+----------+ -@end example - -Note the use of @code{GROUP BY} to group together all records for each -@code{owner}. Without it, all you get is an error message: - -@example -mysql> SELECT owner, COUNT(owner) FROM pet; -ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) -with no GROUP columns is illegal if there is no GROUP BY clause -@end example - -@code{COUNT()} and @code{GROUP BY} are useful for characterizing your -data in various ways. The following examples show different ways to -perform animal census operations. - -Number of animals per species: - -@example -mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; -+---------+----------+ -| species | COUNT(*) | -+---------+----------+ -| bird | 2 | -| cat | 2 | -| dog | 3 | -| hamster | 1 | -| snake | 1 | -+---------+----------+ -@end example - -Number of animals per sex: - -@example -mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; -+------+----------+ -| sex | COUNT(*) | -+------+----------+ -| NULL | 1 | -| f | 4 | -| m | 4 | -+------+----------+ -@end example - -(In this output, @code{NULL} indicates ``sex unknown.'') - -Number of animals per combination of species and sex: - -@example -mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; -+---------+------+----------+ -| species | sex | COUNT(*) | -+---------+------+----------+ -| bird | NULL | 1 | -| bird | f | 1 | -| cat | f | 1 | -| cat | m | 1 | -| dog | f | 1 | -| dog | m | 2 | -| hamster | f | 1 | -| snake | m | 1 | -+---------+------+----------+ -@end example - -You need not retrieve an entire table when you use @code{COUNT()}. For -example, the previous query, when performed just on dogs and cats, looks like -this: - -@example -mysql> SELECT species, sex, COUNT(*) FROM pet - -> WHERE species = "dog" OR species = "cat" - -> GROUP BY species, sex; -+---------+------+----------+ -| species | sex | COUNT(*) | -+---------+------+----------+ -| cat | f | 1 | -| cat | m | 1 | -| dog | f | 1 | -| dog | m | 2 | -+---------+------+----------+ -@end example - -Or, if you wanted the number of animals per sex only for known-sex animals: - -@example -mysql> SELECT species, sex, COUNT(*) FROM pet - -> WHERE sex IS NOT NULL - -> GROUP BY species, sex; -+---------+------+----------+ -| species | sex | COUNT(*) | -+---------+------+----------+ -| bird | f | 1 | -| cat | f | 1 | -| cat | m | 1 | -| dog | f | 1 | -| dog | m | 2 | -| hamster | f | 1 | -| snake | m | 1 | -+---------+------+----------+ -@end example - -@node Multiple tables, , Retrieving data, Database use -@subsection Using more than one table - -The @code{pet} table keeps track of which pets you have. If you want to -record other information about them, such as events in their lives like -visits to the vet or when litters are born, you need another table. What -should this table look like? - -@itemize @bullet -@item -It needs to contain the pet name so you know which animal each event pertains -to. - -@item -It needs a date so you know when the event occurred. - -@item -It needs a field to describe the event. - -@item -If you want to be able to categorize events, it would be useful to have an -event type field. -@end itemize - -Given these considerations, the @code{CREATE TABLE} statement for the -@code{event} table might look like this: - -@example -mysql> CREATE TABLE event (name VARCHAR(20), date DATE, - -> type VARCHAR(15), remark VARCHAR(255)); -@end example - -As with the @code{pet} table, it's easiest to load the initial records -by creating a tab-delimited text file containing the information: - -@multitable @columnfractions .15 .15 .15 .55 -@item Fluffy @tab 1995-05-15 @tab litter @tab 4 kittens, 3 female, 1 male -@item Buffy @tab 1993-06-23 @tab litter @tab 5 puppies, 2 female, 3 male -@item Buffy @tab 1994-06-19 @tab litter @tab 3 puppies, 3 female -@item Chirpy @tab 1999-03-21 @tab vet @tab needed beak straightened -@item Slim @tab 1997-08-03 @tab vet @tab broken rib -@item Bowser @tab 1991-10-12 @tab kennel -@item Fang @tab 1991-10-12 @tab kennel -@item Fang @tab 1998-08-28 @tab birthday @tab Gave him a new chew toy -@item Claws @tab 1998-03-17 @tab birthday @tab Gave him a new flea collar -@item Whistler @tab 1998-12-09 @tab birthday @tab First birthday -@end multitable - -Load the records like this: - -@example -mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event; -@end example - -Based on what you've learned from the queries you've run on the @code{pet} -table, you should be able to perform retrievals on the records in the -@code{event} table; the principles are the same. But when is the -@code{event} table by itself insufficient to answer questions you might ask? - -Suppose you want to find out the ages of each pet when they had their -litters. The @code{event} table indicates when this occurred, but to -calculate age of the mother, you need her birth date. Because that is -stored in the @code{pet} table, you need both tables for the query: - -@example -mysql> SELECT pet.name, (TO_DAYS(date) - TO_DAYS(birth))/365 AS age, remark - -> FROM pet, event - -> WHERE pet.name = event.name AND type = "litter"; -+--------+------+-----------------------------+ -| name | age | remark | -+--------+------+-----------------------------+ -| Fluffy | 2.27 | 4 kittens, 3 female, 1 male | -| Buffy | 4.12 | 5 puppies, 2 female, 3 male | -| Buffy | 5.10 | 3 puppies, 3 female | -+--------+------+-----------------------------+ -@end example - -There are several things to note about this query: - -@itemize @bullet -@item -The @code{FROM} clause lists two tables because the query needs to pull -information from both of them. - -@item -When combining (joining) information from multiple tables, you need to -specify how records in one table can be matched to records in the other. -This is easy because they both have a @code{name} column. The query uses -@code{WHERE} clause to match up records in the two tables based on the -@code{name} values. - -@item -Because the @code{name} column occurs in both tables, you must be specific -about which table you mean when referring to the column. This is done -by prepending the table name to the column name. -@end itemize - -You need not have two different tables to perform a join. Sometimes it is -useful to join a table to itself, if you want to compare records in a table -to other records in that same table. For example, to find breeding pairs -among your pets, you can join the @code{pet} table with itself to pair up -males and females of like species: - -@example -mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species - -> FROM pet AS p1, pet AS p2 - -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m"; -+--------+------+--------+------+---------+ -| name | sex | name | sex | species | -+--------+------+--------+------+---------+ -| Fluffy | f | Claws | m | cat | -| Buffy | f | Fang | m | dog | -| Buffy | f | Bowser | m | dog | -+--------+------+--------+------+---------+ -@end example - -In this query, we specify aliases for the table name in order to be able -to refer to the columns and keep straight which instance of the table -each column reference is associated with. - -@node Getting information, Batch mode, Database use, Tutorial -@section ǡ١ȥơ֥ξ - -ǡ١ơ֥̾Ǥä뤤ϥơ֥ι¤ϤɤǤä -(ʤȤեɤäΤ)˺Ƥޤä硣 -@strong{MySQL} ǤϤĤΥǡ١ȥơ֥ξ󶡤ʸ̤ -ޤ - -ʤϴ @code{SHOW DATABASES} ΤäƤϤ, ϥС -ǡ١ΰɽޤ 򤷤Ƥǡ١ -Ǥ뤫Τˤϡ@code{DATABASE()} ؿѤޤ - -@example -mysql> SELECT DATABASE(); -+------------+ -| DATABASE() | -+------------+ -| menagerie | -+------------+ -@end example - -⤷ǡ١ޤ򤷤ƤʤС̤ϥ֥󥯤Ǥ - -ǡ١˴ޤޤơ֥򸫤Ĥˤ(ȤСʤơ֥̾ -Τʤ)ΥޥɤѤޤ - -@example -mysql> SHOW TABLES; -+---------------------+ -| Tables in menagerie | -+---------------------+ -| event | -| pet | -+---------------------+ -@end example - -⤷ơ֥ι¤Τꤿʤ顢@code{DESCRIBE} ޥɤǤ -ϥơ֥Τ줾ΥեɤˤĤƤξɽޤ - -@example -mysql> DESCRIBE pet; -+---------+-------------+------+-----+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+---------+-------------+------+-----+---------+-------+ -| name | varchar(20) | YES | | NULL | | -| owner | varchar(20) | YES | | NULL | | -| species | varchar(20) | YES | | NULL | | -| sex | char(1) | YES | | NULL | | -| birth | date | YES | | NULL | | -| death | date | YES | | NULL | | -+---------+-------------+------+-----+---------+-------+ -@end example - -@code{Field} ϥե̾򼨤@code{Type} ϥեɤΥǡ -@code{Null} ϤΥեɤ @code{Null} ͤޤफ򼨤 -@code{Key} ϤΥեɤǥåƤ뤫򼨤 -@code{Default} ϥեɤΥǥեȤͤ򼨤ޤ - -⤷ơ֥˥ǥåäƤʤ顢 -@code{SHOW INDEX FROM tbl_name} ξ򼨤ޤ - -@node Batch mode, Twin, Getting information, Tutorial -@section @code{mysql} ΥХå⡼ɤǤλ - -ΥǤϡ@code{mysql} å⡼ɤǻѤϤ -̤ɽޤ @code{mysql} ϥХå⡼ɤǤ¹ԲǽǤ -Ԥˤϡʤ¹Ԥޥɤե˽񤤤Ƥ -Υե뤫Ϥɤ߹褦ˤ @code{mysql} ¹Ԥޤ - -@example -shell> mysql < batch-file -@end example - -⤷³ѥ᥿ꤹɬפϡʲΤ褦ˤʤǤ礦 - -@example -shell> mysql -h host -u user -p < batch-file -Enter password: ******** -@end example - -ˡ @code{mysql} ѤȤʤϥץȥե -¹Ԥ뤳ȤˤʤǤ礦 - -ʤץȤѤΤ ˤϰʲͳޤ - -@itemize @bullet -@item -⤷֤¹Ԥ(Ȥ轵Ȥ)ץȤ񤯤Ȥǡ -μ¹Ԥ٤ˤʤޥɤ򥿥פ뤳ȤʤȤǽǤ - -@item -⤷ˤ륯˻񤯾硢򥳥ԡ -ץȥեԽǤޤ - -@item -Хå⡼ɤϥγȯʣˤޤ륳ޥɤˤΩޤ -⤷ޥɤְäƤȤƤƤǤľɬפޤ -顼뤿˥ץȤԽƤ @code{mysql} ˼¹Ԥޤ - -@item -⤷¿νϤФ褦ʥξ硢ڡ㡼ѤƽϤ򸫤뤳Ȥ -ޤ Ϥ뤷Ʋ̤鸫ʤʤꤤǤ礦 - -@example -shell> mysql < batch-file | more -@end example - -@item -ʤϤԤˡ̤ե˽񤭽ФȤǽǤ - -@example -shell> mysql < batch-file > mysql.out -@end example - -@item -ʤϡ¾ͤؤΤʤΥץȤۤ뤳ȤǤޤˤꡢۤοͤ -ޥɤ¹Ԥ뤳ȤǤޤ - -@item -ĤξǤϡå⡼ɤǤϻѤѤޤ ȤС - @code{cron} ֤ȤƼ¹Ԥ硣 ξ硢Хå⡼ɤǤʤФʤޤ - -@item -üʤʸ @code{mysql} ޥɤϤ硣 -ȤСEUC-JP, Shift_JIS δʸʤɤϡüĶˤäƤľϤǤʤ⤢Ǥ礦 -@end itemize - -@code{mysql} Хå⡼ɤǻѤ뤫å⡼ɤǻѤ뤫ǡ -ǥեȤνϷѤޤ 㤨С @code{SELECT DISTINCT species FROM pet} -Ϥå⡼ɤǤϼΤ褦ˤʤޤ - -@example -+---------+ -| species | -+---------+ -| bird | -| cat | -| dog | -| hamster | -| snake | -+---------+ -@end example - -Хå⡼ɤǤϡ - -@example -species -bird -cat -dog -hamster -snake -@end example - -⤷Хå⡼ɤǤå⡼ɤΤ褦ʽϤˤϡ@code{mysql -t} Ȥޤ -ˡ¹ԤޥɤɽʤС@code{mysql -vvv} Ȥޤ - -@node Twin, , Batch mode, Tutorial -@section Queries from twin project - -At Analytikerna and Lentus, we have been doing the systems and field work -for a big research project. This project is a collaboration between the -Institute of Environmental Medicine at Karolinska Institutet Stockholm -and the Section on Clinical Research in Aging and Psychology at the -University of Southern California. - -The project involves a screening part where all twins in Sweden older -than 65 years are interviewed by telephone. Twins who meet certain -criteria are passed on to the next stage. In this latter stage, twins who -want to participate are visited by a doctor/nurse team. Some of the -examinations include physical and neuropsychological examination, -laboratory testing, neuroimaging, psychological status assessment, and family -history collection. In addition, data are collected on medical and -environmental risk factors. - -More information about Twin studies can be found at: - -@example -@url{http://www.imm.ki.se/TWIN/TWINUKW.HTM} -@end example - -The latter part of the project is administered with a web interface -written using Perl and @strong{MySQL}. - -Each night all data from the interviews are moved into a @strong{MySQL} -database. - -@menu -* Twin pool:: Find all non-distributed twins -* Twin event:: Show a table on twin pair status -@end menu - -@node Twin pool, Twin event, Twin, Twin -@subsection Find all non-distributed twins - -The following query is used to determine who goes into the second part of the -project: - -@example -select - concat(p1.id, p1.tvab) + 0 as tvid, - concat(p1.christian_name, " ", p1.surname) as Name, - p1.postal_code as Code, - p1.city as City, - pg.abrev as Area, - if(td.participation = "Aborted", "A", " ") as A, - p1.dead as dead1, - l.event as event1, - td.suspect as tsuspect1, - id.suspect as isuspect1, - td.severe as tsevere1, - id.severe as isevere1, - p2.dead as dead2, - l2.event as event2, - h2.nurse as nurse2, - h2.doctor as doctor2, - td2.suspect as tsuspect2, - id2.suspect as isuspect2, - td2.severe as tsevere2, - id2.severe as isevere2, - l.finish_date -from - twin_project as tp - /* For Twin 1 */ - left join twin_data as td on tp.id = td.id and tp.tvab = td.tvab - left join informant_data as id on tp.id = id.id and tp.tvab = id.tvab - left join harmony as h on tp.id = h.id and tp.tvab = h.tvab - left join lentus as l on tp.id = l.id and tp.tvab = l.tvab - /* For Twin 2 */ - left join twin_data as td2 on p2.id = td2.id and p2.tvab = td2.tvab - left join informant_data as id2 on p2.id = id2.id and p2.tvab = id2.tvab - left join harmony as h2 on p2.id = h2.id and p2.tvab = h2.tvab - left join lentus as l2 on p2.id = l2.id and p2.tvab = l2.tvab, - person_data as p1, - person_data as p2, - postal_groups as pg -where - /* p1 gets main twin and p2 gets his/her twin. */ - /* ptvab is a field inverted from tvab */ - p1.id = tp.id and p1.tvab = tp.tvab and - p2.id = p1.id and p2.ptvab = p1.tvab and - /* Just the sceening survey */ - tp.survey_no = 5 and - /* Skip if partner died before 65 but allow emigration (dead=9) */ - (p2.dead = 0 or p2.dead = 9 or - (p2.dead = 1 and - (p2.death_date = 0 or - (((to_days(p2.death_date) - to_days(p2.birthday)) / 365) - >= 65)))) - and - ( - /* Twin is suspect */ - (td.future_contact = 'Yes' and td.suspect = 2) or - /* Twin is suspect - Informant is Blessed */ - (td.future_contact = 'Yes' and td.suspect = 1 and id.suspect = 1) or - /* No twin - Informant is Blessed */ - (ISNULL(td.suspect) and id.suspect = 1 and id.future_contact = 'Yes') or - /* Twin broken off - Informant is Blessed */ - (td.participation = 'Aborted' - and id.suspect = 1 and id.future_contact = 'Yes') or - /* Twin broken off - No inform - Have partner */ - (td.participation = 'Aborted' and ISNULL(id.suspect) and p2.dead = 0)) - and - l.event = 'Finished' - /* Get at area code */ - and substring(p1.postal_code, 1, 2) = pg.code - /* Not already distributed */ - and (h.nurse is NULL or h.nurse=00 or h.doctor=00) - /* Has not refused or been aborted */ - and not (h.status = 'Refused' or h.status = 'Aborted' - or h.status = 'Died' or h.status = 'Other') -order by - tvid; -@end example - -Some explanations: -@table @asis -@item @code{concat(p1.id, p1.tvab) + 0 as tvid} -We want to sort on the concatenated @code{id} and @code{tvab} in -numerical order. Adding @code{0} to the result causes @strong{MySQL} to treat the -result as a number. -@item column @code{id} -This identifies a pair of twins. It is a key in all tables. -@item column @code{tvab} -This identifies a twin in a pair. It has a value of @code{1} or @code{2}. -@item column @code{ptvab} -This is an inverse of @code{tvab}. When @code{tvab} is @code{1} this is -@code{2}, and vice versa. It exists to save typing and to make it easier for -@strong{MySQL} to optimize the query. -@end table - -This query demonstrates, among other things, how to do lookups on a -table from the same table with a join (@code{p1} and @code{p2}). In the example, this -is used to check whether a twin's partner died before the age of 65. If so, -the row is not returned. - -All of the above exist in all tables with twin-related information. We -have a key on both @code{id,tvab} (all tables) and @code{id,ptvab} -(@code{person_data}) to make queries faster. - -On our production machine (A 200MHz UltraSPARC), this query returns -about 150-200 rows and takes less than one second. - -The current number of records in the tables used above: -@multitable @columnfractions .3 .5 -@item @strong{Table} @tab @strong{Rows} -@item @code{person_data} @tab 71074 -@item @code{lentus} @tab 5291 -@item @code{twin_project} @tab 5286 -@item @code{twin_data} @tab 2012 -@item @code{informant_data} @tab 663 -@item @code{harmony} @tab 381 -@item @code{postal_groups} @tab 100 -@end multitable - -@node Twin event, , Twin pool, Twin -@subsection Show a table on twin pair status - -Each interview ends with a status code called @code{event}. The query -shown below is used to display a table over all twin pairs combined by -event. This indicates in how many pairs both twins are finished, in how many -pairs one twin is finished and the other refused, and so on. - -@example -select - t1.event, - t2.event, - count(*) -from - lentus as t1, - lentus as t2, - twin_project as tp -where - /* We are looking at one pair at a time */ - t1.id = tp.id - and t1.tvab=tp.tvab - and t1.id = t2.id - /* Just the sceening survey */ - and tp.survey_no = 5 - /* This makes each pair only appear once */ - and t1.tvab='1' and t2.tvab='2' -group by - t1.event, t2.event; - -@end example - -@cindex Server functions -@node Server, Replication, Tutorial, Top -@chapter @strong{MySQL} Сե󥯥 - -@menu -* Languages:: @strong{MySQL} ݡȤƤϡ -* Table size:: @strong{MySQL} ϥơ֥ɤ줯餤礭Ǥ뤫 -@end menu - -@cindex Which languages @strong{MySQL} supports -@cindex Language support -@node Languages, Table size, Server, Server -@section @strong{MySQL} ݡȤƤϡ - -@code{mysqld} ϼθǥ顼å󶡤Ǥޤ: , -, Ѹ(ǥե), Estonia, ե󥹸, ɥĸ, Υ륦, Υ륦 -,ݡɸ, ݥȥ, ڥ줽ƥǥ졣 - - @code{mysqld} 򳫻Ϥ뤿ˤ @code{--language=lang} ޤ - @code{-L lang} åΰĤȤޤ: - -@example -shell> mysqld --language=swedish -@end example - -or: - -@example -shell> mysqld --language=/usr/local/share/swedish -@end example - -̾ƾʸǤ뤳ȤդƤ - -ե(ǥեȤǤ)ξˤޤ -@file{@var{mysql_base_dir}/share/@var{LANGUAGE}/}. - -顼åե򹹿ϡ @file{errmsg.txt} եԽ - @file{errmsg.sys} ե뤿˰ʲΤ褦˼¹Ԥޤ: - -@example -shell> comp_err errmsg.txt errmsg.sys -@end example - -⤷ @strong{MySQL} 򿷤Τ˥åץ졼ɤʤ顢ʬƱȤˡ - @file{errmsg.txt} ե˽ۤɤƤ - -@menu -* Character sets:: ǡȥȤ˻Ѥ륭饯å -* Adding character set:: 饯åȤɲ -* String collating:: String collating support -* Multi-byte characters:: Multi-byte character support -@end menu - -@node Character sets, Adding character set, Languages, Languages -@subsection ǡȥȤ˻Ѥ륭饯å - -ǥեȤǤϡ@strong{MySQL} ISO8859-1 (Latin1) 饯åȤѤ -ޤ USA 衼åѤǻѤ륭饯åȤǤ - -饯åȤ̾ȤƵʸȡ@code{ORDER BY} @code{GROUP BY} -ޥɤˤäƥȤˡꤷޤ -饯åȤϡ̾ȤƻѤƤ褤ʸ @code{SELECT} ʸ - @code{ORDER BY} @code{GROUP BY} ޥɤѤˡꤷޤ - -You can change the character set with the -@code{--default-character-set} option when you start the server. -The character sets available depend on the @code{--with-charset=charset} -option to @code{configure}, and the character set configuration files -listed in @file{SHAREDIR/charsets/Index}. -@xref{Quick install}. - -When a client connects to a @strong{MySQL} server, the server sends the -default character set in use to the client. The client will switch to -use this character set for this connection. - -One should use @code{mysql_real_escape_string()} when escaping strings -for a SQL query. @code{mysql_real_escape_string()} is identical to the -old @code{mysql_escape_string()} function, except that it takes the MYSQL -connection handle as the first parameter. - -If the client is compiled with different paths than where the server is -installed and the user that configured @strong{MySQL} didn't included all -character sets in the @strong{MySQL} binary one must specify for -the client where it can find the additional character sets it will need -if the server runs with a different character set than the client. - -On can specify this by putting in a @strong{MySQL} option file: - -@example -[client] -default-set-dir=/usr/local/mysql/share/mysql/charsets -@end example - -where the path points to where the dynamic @strong{MySQL} character sets -are stored. - -One can force the client to use specific character set by specifying: - -@example -[client] -default-character-set=character-set-name -@end example - -but normally this is never needed. - -To add another character set to @strong{MySQL}, use the following procedure: - -@node Adding character set, String collating, Character sets, Languages -@subsection 饯åȤɲ - -@enumerate -@item -Decide if the set is simple or complex. If the character set -does not need to use special string collating routines for -sorting, and does not need mulit-byte character support, it is -simple. If it needs either of those features, it is complex. - -@item -If the character set is simple, then create the file -@file{sql/share/charsets/MYSET.conf}, and add MYSET the -@file{sql/share/charsets/Index} file. Read the -@file{sql/share/charsets/README} for more instructions. - -@item -Add the character set name to the @code{CHARSETS_AVAILABLE} and -@code{COMPILED_CHARSETS} lists in @code{configure.in}. - -@item -Reconfigure, recompile and test. - -@item -If the character set is complex, create the file -@file{strings/ctype-MYSET.c} ե @strong{MySQL} Υǥ쥯ȥʲ˺ޤ - -@item -Add MYSET to the end of the @file{sql/share/charsets/Index} file. Take -note of its position in the file - this is its character set number, -denoted @code{MYNUMBER} below. - -@item -ɬפΤĴ٤뤿ˡ¸ @file{ctype-*.c} եΰĤ򸫤Ƥ -ΥեǻѤ̾ϡ -@code{ctype_MYSET}, @code{to_lower_MYSET} Τ褦ˤʤФʤȤդƤ - -Near the top of the file, place a special comment like this: - -@example -/* - * This comment is parsed by configure to create ctype.c, - * so don't change it unless you know what you are doing. - * - * .configure. number_MYSET=MYNUMBER - * .configure. strxfrm_multiply_MYSET=N - * .configure. mbmaxlen_MYSET=N - */ -@end example - -The @code{configure} program uses this comment to include -the character set into the @strong{MySQL} library automatically. - -The strxfrm_multiply and mbmaxlen lines will be explained in -the following sections. Only include them if you the string -collating functions or the multi-byte character set functions, -respectively. - -@code{to_lower[]} @code{to_upper[]} ϡ줾Υ饯åȤ˱ -ʸʸбñǤ -㤨С - -@example -to_lower['A'] should contain 'a' -to_upper['a'] should contain 'A' -@end example - -@code{sort_order[]} ʸɤΤ褦˥Ȥ٤ΥޥåפǤ¿Υ -ȤǤϡ @code{to_upper[]} ƱǤ (¸) -@strong{MySQL} @code{sort_order[character]} ͤ򸵤ʸ򥽡Ȥޤ -For more complicated sorting rules, see -the discussion of string collating below. - -@code{ctype[]} ϳʸӥåȤǡ1ޤΥӥå1ʸޤ -( @code{to_lower[]}, @code{to_upper[]},@code{sort_order[]}ϡʸͤǥǥåޤ -@code{ctype[]}ʸ+1 ǥǥåޤ - EOF 뤿ˤ֤ȤƤΤǡˡѤƤޤ) -@file{m_ctype.h} ˼Υӥåȥޥ򸫤뤳ȤǤޤ: - -@example -#define _U 01 /* Upper case */ -#define _L 02 /* Lower case */ -#define _N 04 /* Numeral (digit) */ -#define _S 010 /* Spacing character */ -#define _P 020 /* Punctuation */ -#define _C 040 /* Control character */ -#define _B 0100 /* Blank */ -#define _X 0200 /* heXadecimal digit */ -@end example - -줾ʸФ @code{ctype[]} ϡʸꤹ뤿 -ӥåȤˤʤäƤʤФʤޤ -ȤС@code{'A'} ʸ (@code{_U}) 16 (@code{_X}) ξȤ -°Τǡ@code{ctype['A'+1]} ϰʲͤޤޤʤƤϤʤޤ: -@example -_U + _X = 01 + 0200 = 0201 -@end example - -@item -Add support for the string collating or multi-byte features needed, as -described in the following sections. - -@item -@code{CHARSETS_AVAILABLE} ꥹȤ @code{configure.in} @code{COMPILED_CHARSETS} ꥹ -˥饯å̾ɲäޤ - -@item -configureȥѥ򤷤ʤƥȤƤ -@end enumerate - -@cindex String collating -@node String collating, Multi-byte characters, Adding character set, Languages -@subsection String collating support - -If the sorting rules for your language are too complex to be handled -with the simple @code{sort_order[]} table, you need to use the string -collating functions. - -Right now the best documentation on this is the character sets that are -already implemented. Look at the big5, czech, gbk, sjis and tis160 -character sets for examples. - -You must specify the @code{strxfrm_multiply_MYSET=N} value in the -special comment at the top of the file. @code{N} should be set to -the maximum ratio the strings may grow during my_strxfrm_MYSET (it -must be a positive integer). - -@cindex Multi-byte characters -@node Multi-byte characters, , String collating, Languages -@subsection ޥХʸΥݡ - -If your character set includes multi-byte characters, you need to use -the multi-byte character functions. - -Right now the best documentation on this is the character sets that are -already implemented. Look at the euc_kr, gb2312, gbk, sjis and ujis -character sets for examples. - -You must specify the @code{mbmaxlen_MYSET=N} value in the -special comment at the top of the file. @code{N} should be set to -the size in bytes of the largest character in the set. - - -@cindex Table size -@cindex Size of tables -@node Table size, , Languages, Server -@section @strong{MySQL} ϥơ֥ɤ줯餤礭Ǥ뤫 - -@strong{MySQL} 3.22 Υơ֥륵¤ 4G Ǥ -@strong{MySQL} 3.23 ο @code{MyISAM} ǤϡΥơ֥륵 800ƥХ -(2 ^ 63 bytes) Ǥ. - -Ȥ̤ OS ȤΥե륵¤ޤ -㤨ФĤ OS ǤϰʲΤ褦ˤʤäƤޤ - -@multitable @columnfractions .6 .4 -@item Linux-Intel @tab 2G (or 4G with reiserfs) -@item Linux-Alpha @tab 8T (?) -@item Solaris 2.5.1 @tab 2G (possible 4G with patch) -@item Solaris 2.6 @tab 4G -@item Solaris 2.7 Intel @tab 4G -@item Solaris 2.7 ULTRA-SPARC @tab 8T (?) -@end multitable - -ϡ̾@strong{MySQL} Υơ֥륵 -ڡ졼ƥ󥰥ƥˤä¤ȤȤǤ - -By default, @strong{MySQL} tables have a maximum size of about 4G. You can -check the maximum table size for a table with the @code{SHOW TABLE STATUS} -command or with the @code{myisamchk -dv table_name}. -@xref{SHOW}. - -If you need bigger tables than 4G (and your operating system supports -this), you should set the @code{AVG_ROW_LENGTH} and @code{MAX_ROWS} -parameter when you create your table. @xref{CREATE TABLE}. You can -also set these later with @code{ALTER TABLE}. @xref{ALTER TABLE}. - -If you need to have bigger tables than 2G / 4G - -⤷礭ʥơ֥꡼ɥ꡼ǻѤʤ顢@code{myisampack}ȤäʣΥơ֥礷ǰ̤뤳ȤǤޤ@code{myisampack}ϾʤȤ 50% ơ֥򰵽̤뤳ȤǤη̡礭ʥơ֥Ѥ뤳ȤǤޤ -@xref{myisampack, , @code{myisampack}}. - -¾ˡȤơ"Ʊ褦"ơ֥ĤˤǤ MERGE 饤֥꡼ޤˡޤ -("Ʊ褦" ȤϡƱܾäƤΥơ֥뤬Ƥ֤򤵤ޤ) -MERGE ϥǥå򥵥ݡȤƤʤᡢƱΥơ֥뤷Ǥޤ -˥ǥåεǽᤤɲäͽǤ - -@cindex Replication -@node Replication, Performance, Server, Top -@chapter Replication in MySQL - -@menu -* Replication Intro:: Introduction -* Replication Implementation:: -* Replication HOWTO:: HOWTO -* Replication Features:: Replication Features. Replication Features. Replication Features. Replication Features. Replication Features. Replication Features. Replication Features. Replication Features -* Replication Options:: Replication Options in my.cnf -* Replication SQL:: SQL Commands related to replication -@end menu - -@node Replication Intro, Replication Implementation, Replication, Replication -@section Introduction - -One way replication can be used both to increase robustness and -speed. For robustness you have two systems and switch to the backup if -you have problems with the master. The extra speed is achieved by -sending a part of the non-updating queries to the replica server. Of -course this only works if non-updating queries dominate, but that is the -normal case. - -Starting in 3.23.15, @strong{MySQL} supports one-way replication -internally. One server acts as the master, while the other acts as the -slave. Note that one server could play the roles of master in one pair -and slave in the other. The master server keeps a binary log of updates -and an index file to binary logs to keep track of log rotation. The -slave upon connecting informs the master where it left off sinse the -last successfully propogated update, catches up on the updates, and then -blocks and waits for the master to notify it of the new updates. - -@node Replication Implementation, Replication HOWTO, Replication Intro, Replication -@section Replication Implementation Overview - -@strong{MySQL} internal replication uses the master-slave approach. One -server is designated as the master, while the other ( or others) as -slave(s). The master keeps a binary log of updates. The slave connects -to the master, catches up on the missed updates, and then starts -receiving updates immediately as they come to the master. If the -connection is lost, the slave will reconnect. If the master goes down, -the slave will keep trying to connect every @code{master-connect-retry} -seconds until the master comes back up and the connection can be -established. The slave keeps track of where it left off in the -replication process, so it can use the info in the case it goes down and -gets restarted later. - -@node Replication HOWTO, Replication Features, Replication Implementation, Replication -@section HOWTO -Below is a quick HOWTO on how to set up replication on your current system: - -@itemize @bullet -@item -Upgrade both slave and master to 3.23.15 or higher. -@item -Set up special replication user(s) on the master with the @code{FILE} -privilege and permission to connect from all the slaves -@item -Take a snapshot of all the tables/databases on the master that could -possibly be involved in the update queries before taking the next step -@item -In @code{my.cnf} on the master add @code{log-bin} and restart it. Make -sure there are no important updates to the master between the time you -have taken the snapshot and the time master is restarted with -@code{log-bin} option -@item -Load the snapshot of the master to all the slaves -@item -Add the following to @code{my.cnf} on the slave(s): - -@example -master-host= -master-user= -master-password= -@end example - -replacting the values in <> with what is relevant to your system. - -@item Restart the slave(s) - -@end itemize - -After you have done the above, the master and the slave(s) should be in -sync. - -@node Replication Features, Replication Options, Replication HOWTO, Replication -@section Replication Features - -Below is an explanation of what is supported and what is not: - -@itemize @bullet -@item -Replication will be done correctly with @code{AUTO_INCREMENT}, -@code{LAST_INSERT_ID}, and @code{TIMESTAMP} values -@item -@code{LOAD DATA INFILE} will be handled properly as long as the file -still resides on the master server at the time of update -propogation. @code{LOAD LOCAL DATA INFILE} will be skipped. -@item -Update queries that use user variables are not replication-safe (yet) -@item -If the query on the slave gets an error, the slave thread will -terminate, and a message will appear in @code{.err} file. You should -then connect to the slave manually, fix the cause of the error -(eg. non-existent table), and then run @code{SLAVE START} sql command ( available starting in 3.23.16, -in 3.23.15 you will have to restart the server). -@item -If connection to the master is lost, the slave will retry immediately, -and then in case of failure every @code{master-connect-retry} (default -60) seconds. Because of this, it is safe to shut down the master, and -then restart it after a while. The slave will also be able to deal with -network connectivity outages. -@item -Shutting down the slave (cleanly) is also safe, as it keeps track of -where it left off. Unclean shutdowns might produce problems, especially -if disk cache was not synced before the system died. Your system fault -tolerance will be greatly increased if you have a good UPS. -@item -If the master is listening on a non-standard port, you will also need to -specify this with @code{master-port} parameter in @code{my.cnf} . -@item -In 3.23.15,all of the tables and databases will be replicated. Starting in 3.23.16, you -can restrict replication to a set of databases with @code{replicate-do-db} directives in -@code{my.cnf} or just excluse a set of databases with @code{replicate-ignore-db}. -@item -Starting in 3.23.16, @code{SET SQL_LOG_BIN = 0} will turn off replication (binary) logging on the -master, and @code{SET SQL_LOG_BIN = 1} will turn in back on - you must have the process privilege to do -this. -@item The slave thread does not log updates to the binary log of the slave, so it is possible to couple -two servers in a mutual master-slave relationship. You can actually set up a load balancing scheme and -do queries safely on either of the servers. Just do not expect to do LOCK TABLES on one server, then -connect to the other and still have that lock :-) . -@end itemize - -@node Replication Options, Replication SQL, Replication Features, Replication -@section Replication Options in my.cnf - -The table below explains the replications options in @code{my.cnf} . All of the are available -starting in 3.23.15 unless indicated otherwise. - -@multitable @columnfractions .25 .25 .25 .25 -@item @strong{Option} @tab @strong{Description} @tab @strong{Where to set} @tab @strong{Example} -@item @code{log-bin} @tab Should be set on the master. Tells it to keep a binary update -log. If a parameter is specified, the log will be written to the specified location. @tab Master @tab -@code{log-bin} -@item @code{log-bin-index} @tab Because the user could issue @code{FLUSH LOGS} command, we need to -know which log is currently active and which ones have been rotated out and it what sequence. This info -is stored in the binary log index file. The default is `hostname`.index . You can use this option -if you want to be a rebel. @tab Master @tab @code{log-bin-index=db.index} -@item @code{master-host} @tab Master hostname or IP address for replication. If not set, -the slave thread will not be started @tab Slave @tab @code{master-host=db-master.mycompany.com} -@item @code{master-user} @tab The user the slave thread will authenticate as when connecting to -the master. The user must have @code{FILE} privilige. If the master user is not set, user @code{test} - is assumed. @tab Slave @tab @code{master-user=scott} -@item @code{master-password} @tab The password the slave thread will authenticate with when -connecting to the master. If not set, empty password is assumed @tab Slave @tab -@code{master-password=tiger} -@item @code{master-port} @tab The port the master is listening on. If not set, the compiled setting of -@code{MYSQL_PORT} is assumed. If you have not tinkered with @code{configure} options, this should be -3306. @tab Slave @tab @code{master-port=3306} -@item @code{master-connect-retry} @tab The number of seconds the slave thread will sleep before retrying -to connect to the master in case the master goes down or the connection is lost. -Default is 60. @tab Slave @tab @code{master-connect-retry=60} -@item @code{master-info-file} @tab The location of the file that remembers where we left off on the - master during the replication process. The default is master.info in the data directory. -Sasha: The only reason I see for ever changing the default is the desire to -be rebelious. @tab Slave @tab @code{master-info-file=master.info} -@item @code{replicate-do-db} @tab Tells the slave thread to restrict replication to the specified database. To sp -cify more than one database, use the directive multiple times, once for each database. -Note that this will only work if you do not use cross-database queries such as -@code{UPDATE some_db.some_table SET foo='bar'} while having selected a different or -no database. @tab Slave @tab @code{replicate-ignore-db=some_db} -@item @code{replicate-ignore-db} @tab Tells the slave thread to not replicate to the specified -database. To specify more than one database to ignore, use the directive multiple times, -once for each database. You must not use cross database updates for this option. @tab Slave @tab @code{replicate- -o-db=some_db} -@item @code{sql-bin-update-same} @tab If set, setting @code{SQL_LOG_BIN} to a value will -automatically set @code{SQL_LOG_UPDATE} to the same value and vice -versa. @tab Master @tab @code{sql-bin-update-same} - -@item @code{log-slave-updates} @tab Tells the slave to log the updates from the slave thread to the binary log. Off by default. You will need to turn it on if you plan to daisy-chain the slaves @tab Slave @tab @code{log-slave-updates} - -@end multitable - -@node Replication SQL, , Replication Options, Replication -@section SQL commands related to replication - -Replication can be controlled through the SQL interface. Below is the -summary of commands: - -@multitable @columnfractions .30 .40 .30 -@item @strong{Command} @tab @strong{Description} @tab @strong{Where to run} -@item @code{SLAVE START} @tab Starts the slave thread. @tab Slave -@item @code{SLAVE STOP} @tab Stops the slave thread. @tab Slave -@item @code{SET SQL_LOG_BIN=0} @tab Disables update logging @tab Master -@item @code{SET SQL_LOG_BIN=1} @tab Re-enable update logging @tab Master -@end multitable - -@cindex Performance -@cindex Optimization -@node Performance, MySQL Benchmarks, Replication, Top -@chapter MySQL κǽҤˤ - -Optimization is a complicated task because it ultimately requires -understanding of the whole system. While it may be possible to do some -local optimizations with small knowledge of your system/application, the -more optimal you want your system to become the more you will have to -know about it. - -So this chapter will try to explain and give some examples of different -ways to optimize @strong{MySQL}. But remember that there are always some -(increasingly harder) ways to make the system even faster left to do. - -@menu -* Optimize Basics:: Optimization overview -* System:: System/Compile time and startup parameter tuning -* Data size:: Get your data as small as possible -* MySQL indexes:: How @strong{MySQL} uses indexes -* Query Speed:: Speed of queries that access or update data -* Tips:: Other optimization tips -* Benchmarks:: Using your own benchmarks -* Design:: Design choices -* Design Limitations:: MySQL design limitations/tradeoffs -* Portability:: Portability -* Internal use:: What have we used MySQL for? -@end menu - -@node Optimize Basics, System, Performance, Performance -@section Ŭ - -ƥ®뤿κǤפʬϡŪ߷פǤ -You also need to know what kinds of things your system will be -doing, and what your bottlenecks are. - -ʥܥȥͥåϡ -@itemize @bullet -@item Disk -ҤΥǡ򸫤Ĥ뤿ˤϡǥ˻֤ޤ -1999ǯκǿΥǥǤϡΤʿѻ֤ϡ10ms̾꾮Ǥ -äơ桹ϡ 1ä1000 뤳ȤǤޤ -λ֤ϡĤΥơ֥ǤʤСǡäȶ˥ǥλ֤ -ä뤳ȤˤʤꡢȤƤŬΤ񤷤ʤäƤޤ -Ŭˡϡǡ 1İʾΥǥʬǤ -@item Disk reading/writing -When the disk is at the correct position we need to read the data. With -modern disks in 1999 one disk delivers something like 10-20Mb/s. This -is easier to optimize than seeks because you can read in parallel from -multiple disks. -@item CPU cycles -ǡᥤ󡦥꡼줿(ޤϴ˥¸ߤƤ)ˡ -̤뤿ˤϡɬפޤ -꡼̤⾮ʥơ֥äƤ硢ϡ¤װȤʤޤ -ơ֥Ǥϡԡɤϡ̾ˤϤʤޤ -@item Memory bandwidth -CPU å˼ޤʤ褦ʥǡ׵ᤷ硢ᥤ󡦥꡼ -ΥХϥܥȥͥåˤʤޤ -ϤۤȤɤΥƥʬˤܥȥͥåȤʤޤ -ïϤΤäƤ٤Ǥ -@end itemize - -@node System, Data size, Optimize Basics, Performance -@section ƥࡢѥȥѥ᥿Υ塼˥ - -We start with the system level things since some of these decisions have -to be made very early. In other cases a fast look at this part may -suffice because it not that important for the big gains. However, it is always -nice to have a feeling about how much one could gain by changing things -at this level. - -Ȥ٤ OS ϤȤƤפǤ ʣ CPU ĥޥǤϡ -Solaris (ʤʤ顢Solaris ΥåɤϤȤƤ餷ư뤫) -뤤ϡLinux ( kernel 2.2 ɤ SMP 򥵥ݡȤƤ뤫) -Ѥ٤Ǥ 32bit ޥ Linux Ǥϡ2G bytes Υե륵 -¤ޤ Ͽե륷ƥ (XFS) Υ꡼ -ʤʤäߤΤǤ - -Because we have not run @strong{MySQL} in production on that many platforms we -advice you to test your intended platform before choosing it, if possible. - -Other tips: -@itemize @bullet -@item -ʬ RAM ʤСƤ swap 򳰤Ƥ褤Ǥ礦 -ĤΥƥǤϡȤ꡼ƤƤ⡢ -swap Ѥ礬ޤ - -@item -Υå򤱤뤿ᡢ@code{--skip-locking} @strong{MySQL} ץ -Ѥޤ -Note that this will not impact @strong{MySQL}'s functionality as -long as you only run one server. -@code{myisamchk} ¹ԤˡСߤ뤳Ȥ˺ʤǤ -On some system -this switch is mandatory because the external locking does not work in any -case. - -MIT åɤǥѥ뤹 @code{--skip-locking} ǥեȤǤ -ƤΥץåȥե MIT åɤ @code{flock()} ˥ݡȤ -ƤʤǤ - -@code{--skip-locking} ѤǤʤĤξ֤ϡ -⤷ʤʣ @strong{MySQL} @emph{С} (饤ȤǤϤʤ) -ƱǡФ餻ƤǤ -Or run -@code{myisamchk} on the table without first flushing and locking the -@code{mysqld} server tables first. - -Ȥ @code{--skip-locking} ѤƤƤ⡢ -@code{LOCK TABLES} / @code{UNLOCK TABLES} λѤϲǽǤ -@end itemize - -@menu -* Compile and link options:: How compiling and linking affects the speed of MySQL -* Disk issues:: Disk issues -* Server parameters:: Tuning server parameters -* Table cache:: How MySQL opens and closes tables -* Creating many tables:: Drawbacks of creating large numbers of tables in the same database -* Open tables:: Why so many open tables? -* Memory use:: How MySQL uses memory -* Internal locking:: How MySQL locks tables -* Table locking:: Table locking issues -@end menu - -@node Compile and link options, Disk issues, System, System -@subsection MySQL ®٤˱ƶ륳ѥȥˡ - -ΥƥȤ¿ Linux @strong{MySQL} ٥ޡǹԤޤ -¾ OS ˤĤƤ⤤ĤλɸͿޤ - -@code{-static} ǤΥ󥯻˺®μ¹Էޤ -TCP/IP Unix åȤǡ١ؤ -³˻Ѥ뤳Ȥ⡢ɤǽͿޤ - -Linux Ǥϡ@code{pgcc} @code{-O6} ǥѥ뤷˺®Υɤޤ -Υץ @file{sql_yacc.cc} 򥳥ѥ뤹ȡ@code{gcc/pgcc} -Ƥδؿ򥤥饤ˤ뤿¿ΥɬפȤΤǡ200M Υ꤬ɬפǤ -@code{libstdc++} 饤֥ä򤱤뤿ˤϡ -@strong{MySQL} configure @code{CXX=gcc} ꤹ٤Ǥ - -ɤѥ顼ƥѥ顼Υץϡ10-30% -®٤θ⤿餷ޤ ϤʤȤ MySQL 򥳥ѥ뤹 -˽פʤȤǤ - -Intel Ǥϡ㤨 pgcc Cygnus CodeFusion compiler Ǻ®Ȥʤޤ -桹 Fujitsu ѥ顼ǤƥȤޤ -@strong{MySQL} Ŭץǥѥ뤹ˤϡ -ޤʥХե꡼ǤϤޤǤ - -Here is a list of some mesurements that we have done: -@itemize @bullet -@item -@code{pgcc} Ѥ @code{-O6} Ƥ򥳥ѥ뤹ȡ -@code{gcc} 2.95.2 ŤСǤϡ -@code{mysqld} С 11% ®ʤޤ - -@item -ưŪ(@code{-static}) ̵)ξ硢̤ 13% ٤ʤޤ -Note that you still can use a dynamic linked MySQL library. It -is only the server that is critical for performance. - -@item -(localhost ؤ³) Unix åȤ TCP/IP Ѥȡ̤ 7.5% ٤ʤޤ - -@item -SPARCstation 10 Ǥϡ@code{gcc} 2.7.3 Sun Pro C++ 4.2 13% ®ʤޤ - -@item -󥰥ץå Solaris 2.5.1 Ǥϡmit-pthreads Solaris ͥƥ֥åɤ 8-12% ٤ʤޤ -With more load/CPUs the difference should -get bigger. -@end itemize - -TCX ˤۤƤ @strong{MySQL}-Linux ۤ @code{pgcc} ǥѥ뤵 -ޤ -but we had to go back to regular gcc because of a bug in pgcc that would -generate the code that does not run on AMD. We will continue using gcc until that bug is resolved. -In the meantime, if you have a non-AMD machine, you can get a faster binary by compiling with pgcc. -The Linux binary is linked statically. - -@node Disk issues, Server parameters, Compile and link options, System -@subsection Disk - -@itemize @bullet -@item -˽Ҥ٤ǥ礭ʥܥȥͥåǤ ϡǡŪ -å󥰤Բǽˤʤۤɡ礭ʤϤȤˡˤʤäƤޤ -For large databases, -where you access data more or less randomly, you can count on that you -will need at least one disk seek to read and a couple of disk seeks to -write things. 򾯤ʤˤϡdisk֤ξʤǥ -Ѥޤ -@item -ѤǤǥԥɥο䤷ޤ(ˤäƥǥ -ΥСإåɤϽ̾ޤ) -ϰ㤦ǥ˥ܥå󥯤Ϥäꡢȥ饤פԤȤ -ǽǤ -@table @strong -@item symbolic link λ -̾Υǡǥ쥯ȥ꤫顢㤦ǥء -ǥåǡե򥷥ܥå󥯤뤳ȤǤ - ꡼ ®ޤ (⤷Υǥ -¾˻ѤƤʤ). @xref{Symbolic links}. -@item Striping -ȥ饤ԥ󥰤ϡʣΥǥФơޤǡκǽΥ֥å -1ܤ disk ˽񤭡2ܤΥ֥å2ܤdisk˽񤭡缡 N -(N disk ο) ޤǽ˽񤤤Ƥޤ ϡ⤷ǡȥ饤פ -⾮С褤ѥեޥ󥹤뤳Ȥޤ -ȥ饤ԥ󥰤ϡOS ȥ饤פΥˤȤƤ¸Ƥ뤳ȤդƤ -ΤᡢʤΥץꥱΥ٥ޡȥ饤ץˤä -ѤǤ礦 @xref{Benchmarks}. - -ȥ饤ԥ󥰤Υԡɤΰ㤤ϡ@strong{ȤƤ} ѥ᥿˰¸Ƥޤ -Depending on how you set the striping parameters and -number of disks you may get difference in orders of magnitude. Note that -you have to choose to optimize for random or sequential access. -@end table -@item -Τᡢʤ RAID 0+1 (striping + mirroring) Ѥ -פ⤷ޤ N ĤΥɥ饤֤ΥǡΤ -2*N ĤΥɥ饤֤ɬפȤʤޤ -Ϥ⤷⤬ʤа֤褤ˡǤ礦 ǽΨŪˤ -갷ˡܥ塼ࡦޥ͡ȡեȥ񤹤ɬפ -äƤ褤Ǥ -@item -A good option is to have semi-important data (that can be re-generated) -on RAID 0 disk while store really important data (like host information -and logs) on a RAID 0+1 or RAID N disks. RAID N can be a problem if you -have many writes because of the time to update the parity bits. -@item -ǡ١˻ѤƤե륷ƥ mount ѥ᥿ѹƤ -ɤǤ礦 ĤδñˡȤƤϡnoatime ץǥե륷ƥ -ޥȤޤ inode ˤǸ˥֤ι -åפޤ Ǥ餫 ǥ򤱤뤳ȤǤǤ礦 -@end itemize - -@menu -* Symbolic links:: Using symbolic links for databases and tables -@end menu - -@node Symbolic links, , Disk issues, Disk issues -@subsubsection ǡ١ȥơ֥˥ܥå󥯤Ѥ - -ơ֥ȥǡ١Υե MySQL Υǡ١ǥ쥯ȥ꡼ -㤦˰ư Фƥܥå󥯤ĥ뤳ȤǤޤ -㤨Хǥ̤ʤʤäơǡ١ưˤʤǤ礦 - -@strong{MySQL} ơ֥뤬ܥå󥯤Ǥ뤳Ȥ˵Ť硢 -symlink ϤˤμΤΥơ֥Ѥޤ - @code{realpath()} 򥵥ݡȤƤΥƥƯޤʾ -ʤȤ Linux Solaris @code{realpath()} 򥵥ݡȤޤˡ -@code{realpath()} 򥵥ݡ ȤʤƥǤϡsymlink ȥơ֥ -Ʊ˻Ѥ٤Ǥޤ ơ֥ϥơ֥ι̷⤹ˤʤǤ礦 - -@strong{MySQL} ϥǥեȤǤϥǡ١ƱΤΥ󥯤򥵥ݡȤޤ -ǡ١֤Υܥå󥯤ʤ¤ꡢƯǤ礦 -@strong{MySQL} ǡǥ쥯ȥ @code{db1} ǡ١Ȥơ - @code{db2} @code{db1} Υܥå󥯤ˤȤޤ: - -@example -shell> cd /path/to/datadir -shell> ln -s db1 db2 -@end example - -ȡ@code{db1} @code{tbl_a} ơ֥ @code{db2} @code{tbl_a} ơ֥ȤƸޤ -⤷륹åɤ @code{db1.tbl_a} 򹹿¾Υåɤ @code{db2.tbl_a} -硢 ꤬ȯޤ - -äѤɤƤ⤷硢@file{mysys/mf_format.c} ʲΤ褦ѹޤ: - -@example -if (!lstat(to,&stat_buff)) /* Check if it's a symbolic link */ - if (S_ISLNK(stat_buff.st_mode) && realpath(to,buff)) -@end example - -Change the code to this: - -@example -if (realpath(to,buff)) -@end example - -@cindex Startup parameters -@node Server parameters, Table cache, Disk issues, System -@subsection Сѥ᡼Υ塼˥ - -@code{mysqld} СѤƤ븽ߤΥХåե򼡤뤳ȤǤޤ: - -@example -shell> mysqld --help -@end example - -η̡Ƥ @code{mysqld} ץȼΤ褦ʥեǽѿΥꥹ -ޤϷ̤ˤϥǥեͤޤޤ졢ʲΤ褦ɽޤ: - -@example -Possible variables for option --set-variable (-O) are: -back_log current value: 5 -connect_timeout current value: 5 -delayed_insert_timeout current value: 300 -delayed_insert_limit current value: 100 -delayed_queue_size current value: 1000 -flush_time current value: 0 -interactive_timeout current value: 28800 -join_buffer_size current value: 131072 -key_buffer_size current value: 1048540 -lower_case_table_names current value: 0 -long_query_time current value: 10 -max_allowed_packet current value: 1048576 -max_connections current value: 100 -max_connect_errors current value: 10 -max_delayed_threads current value: 20 -max_heap_table_size current value: 16777216 -max_join_size current value: 4294967295 -max_sort_length current value: 1024 -max_tmp_tables current value: 32 -max_write_lock_count current value: 4294967295 -net_buffer_length current value: 16384 -query_buffer_size current value: 0 -record_buffer current value: 131072 -sort_buffer current value: 2097116 -table_cache current value: 64 -thread_concurrency current value: 10 -tmp_table_size current value: 1048576 -thread_stack current value: 131072 -wait_timeout current value: 28800 -@end example - -⤷ @code{mysqld} С餻Ƥʤ顢ʲΥޥɤǤѿͤ򸫤뤳ȤǤޤ: - -@example -shell> mysqladmin variables -@end example - -ΥץϰʲΤ褦˷Ƥ -buffer size, buffer length, stack size byte ñ̤Ϳޤ -ͤθ @samp{K} @samp{M} ɲäȡХȡᥬХȤˤʤޤ -㤨С@code{16M} 16ᥬХȤ򼨤ޤʸʸζ̤Ϥʤ -@code{16M} @code{16m} Ʊ̣ˤʤޤ - -ƯΥС׾ @code{SHOW STATUS} ǻȤǤޤ. @xref{SHOW}. - -@table @code -@item @code{ansi_mode}. -⤷ @code{mysqld} @code{--ansi} ץǵưƤʤ顢@code{ON}. -@xref{Ansi mode}. - -@item @code{back_log} -@strong{MySQL} Ƥ̤³׵οǤ @strong{MySQL} -åɤ@strong{Τ}¿³׵ȤƤû֤ˡƯ -ޤ³ΥåȿåɤγϤϥᥤ󥹥åɤˤ -(ۤΤ鷺)ޤback_log ϡ@strong{MySQL} ִŪ˿ -׵ؤβߤˡû֤δ֤˥åǤ³Ǥ -û֤¿³Ԥˤäɬפޤ - -ʤ顢 TCP/IP ³ listen 塼ΥǤ -ڥ졼ƥ󥰥ƥϤΥ塼礭¤Ƥޤ -UNIX ƥॳ @code{listen(2)} Υޥ˥奢ڡˡ˾ܺ٤ޤ -ͤ¤ˤ硢ȤOSΥɥȤ򸫤Ƥ -@code{back_log} 򤳤OSͤ¿äƤ̤ޤ - -@item @code{thread_cache_size} -How many threads we should keep keep in a cache for reuse. When a -client disconnects the clients threads is put in the cache if there -isn't more than @code{thread_cache_size} threads from before. All new -threads are first taken from the cache and only when the cache is empty -a new thread is created. This variable can be increased to improve -performance if you have a lot of new connections (Normally this doesn't -however give a notable performance improvement if you have a good -thread implementation). - -@item @code{concurrent_inserts} -⤷ @code{ON} (ϥǥեȤǤ) ʤ顢@code{MySQL} ϡ -@code{SELECT} ꤬¹ԤƤ @code{MyISAM} ơ֥Фơ -Ʊ @code{INSERT} ѤǤ褦ˤޤ -Υץ @code{mysqld} Υץ @code{--safe} @code{--skip-new} -ꤹ뤳Ȥ @code{OFF} ˤǤޤ - -@item @code{connect_timeout} -@code{mysqld} С³ѥåȤԤÿ (@code{Bad handshake} ֤ޤǤÿ) - -@item @code{delayed_insert_timeout} -ɤ줰餤 @code{INSERT DELAYED} åɤ @code{INSERT} ʸԤĤ٤ - -@item @code{delayed_insert_limit} -@code{delayed_insert_limit} ĤΥ쥳ɤ塢 @code{INSERT DELAYED} ϥɥ顼 -ԤƤ @code{SELECT} ʸʤåޤ ⤷ʤ顢 -³ˤμ¹Ԥޤ - -@item @code{delay_key_write} -⤷ enabled Ǥ(줬ǥե)@strong{MySQL} @code{CREATE TABLE} ʸ -@code{DELAY_KEY_WRITE} ץºŤޤ -@code{DELAY_KEY_WRITE}ץꤵƺ줿ơ֥ΥХåեϡ -Υǥåιˤϥեå夵줺ơ֥뤬Ĥ줿Ȥˤ -եå夵ޤ ϥν񤭽Ф®ޤ⤷Ѥʤ顢 -ƤΥơ֥ @code{myisamchk --fast --force} ǼưŪ˸褦ˤ٤Ǥ -⤷ @code{mysqld} @code{--delay-key-write_for_all_tables} ץդ -ư硢ϡƤΥơ֥뤬 @code{delay_key_write} ץꤵ -줿ΤȤưդƤ -Υե饰ϡ@code{mysqld} @code{--skip-new} @code{--safe-mode} ץ -ǵư̵ˤ뤳Ȥޤ - -@item @code{delayed_queue_size} -What size queue (in rows) should be allocated for handling @code{INSERT -DELAYED}. If the queue becomes full, any client that does @code{INSERT -DELAYED} will wait until there is room in the queue again. - -@item @code{flush_time} -줬⤷󥼥˥åȤ줿ʤ顢 @code{flush_time} äȤ -ƤΥơ֥뤬Ĥޤ (꥽βDiskؤsyncΤ) - -@item @code{init_file} -Сưˡ@code{--init-file} ץͿե̾Ǥ -ΥեˤϡСư˼¹Ԥ SQL ʸ񤤤Ƥޤ - -@item @code{interactive_timeout} -The number of seconds the server waits for activity on an interactive -connection before closing it. 󥿥饯ƥ 饤Ȥˤϡ -C API @code{mysql_real_connect()} @code{CLIENT_INTERACTIVE} ץ -åȤޤ See also @code{wait_timeout}. - -@item @code{join_buffer_size} -ΥХåե(ǥå̵)ʷ˻Ѥޤ2Ĥ -ơ֥֤δʷ礴Ȥ1Ƥޤǥåɲä -ʤ®ʷ뤿ˡäƤ̾ -®ɤˡϡǥåɲä뤳ȤǤ - -@c Make texi2html support index @anchor{Index cache size}. Then change -@c some xrefs to point here -@item @code{key_buffer_size} -ǥå֥åϥХåե졢ƤΥåɤ˶ͭޤ -@code{key_buffer_size} ϥǥå֥åΤΥХåեǤ - -Increase this to get better index handling (for all reads and multiple -writes) to as much as you can afford; 64M on a 256M machine that mainly -runs @strong{MySQL} is quite common. If you however make this too big -(more than 50 % of your total memory?) your system may start to page -and become REALLY slow. Remember that because @strong{MySQL} does not cache data -read, that you will have to leave some room for the OS filesystem cache. - -You can check the performance of the key buffer by doing @code{show -status} and examine the variables @code{Key_read_requests}, -@code{Key_reads}, @code{Key_write_requests} and @code{Key_writes}. The -@code{Key_reads/Key_read_request} ratio should normally be < 0.01. -The @code{Key_write/Key_write_requests} is usually near 1 if you are -using mostly updates/deletes but may be much smaller if you tend to -do updates that affect a lot of rows at the same time or if you are -using @code{delay_key_write}. @xref{SHOW}. - -To get even more speed when writing many rows at the same time use -@code{LOCK TABLES}. @xref{LOCK TABLES, , @code{LOCK TABLES}}. - -@item @code{lower_case_table_names} -Change all table names to lower case on disk. - -@item @code{long_query_time} -⤷륯꤬()֤С@code{Slow_queries} 󥿡 -䤵ޤ - -@item @code{max_allowed_packet} -ĤΥѥåȤκ祵åХåե @code{net_buffer_length} ХȤ˽ޤ -@code{max_allowed_packet}ޤ礭뤳ȤǤޤΥǥեͤϡ -礭ʥѥåȡְäѥåȤˤϾͤǤ -礭 @code{BLOB} ѤƤϡäɬפޤѤ - @code{BLOB} Ʊ餤礭٤Ǥ - -@item @code{max_connections} -Ʊ饤Ȥοäϡ@code{mysqld} ĥե -ǥץο䤹ɬפǤ礦 -ҤΥեǥץ¤򻲾ȤΤȡ @xref{Too many connections}. - -@item @code{max_connect_errors} -⤷ۥȤ³Ǥͤʾˤʤä硢ʸ塢 -ΥۥȤ³䤷ޤ@code{FLUSH HOSTS} ޥɤ -ۥȤεݤǤޤ - -@item @code{max_delayed_threads} -ͤĶ @code{INSERT DELAYED} 򰷤åɤưǤޤ -⤷Ƥ @code{INSERT DELAYED} åɤѤƤơ˿ơ֥ -ǡ褦ȤȡΥ쥳ɤ @code{DELAYED} ͿƤʤ -Ʊͤޤ - -@item @code{max_join_size} -@code{max_join_size} ¿쥳ɤ򿨤ȥ顼֤ޤĹ֤򤫤 -ɴԤ֤褦 @code{WHERE} ʤη褦ʥ桼ä -ˤꤷƤ - -@item @code{max_heap_table_size} -Don't allow creation of heap tables bigger than this. - -@item @code{max_sort_length} -@code{BLOB} ޤ @code{TEXT} ܾǥȤ˻ѤХȿ -(ǽ @code{max_sort_length} ХȤ줾ͤǻѤǤĤ̵뤵ޤ) - -@item @code{max_tmp_tables} -(ΥץϤޤʤˤԤޤ). -饤ȤƱ˥ץǤơ֥κ͡ - -@item @code{max_write_lock_count} -After this many write locks, allow some read locks to run in between. - -@item @code{net_buffer_length} -̿Хåե֤ǤΥ˥ꥻåȤޤ̾ѹ -٤ǤϤޤ󤬡ȤƤ⾮ʥꤷʤϡԤ -ΥꤷƤ -( ϡ饤ȤƤSQLʸĹʬФǤ礦 -⤷ʸͤ򤳤硢ХåեϼưŪ礭ʤޤ - @code{max_allowed_packet} ХȤޤǤǤ) - -@item @code{net_retry_count} -If a read on a communication port is interrupted, retry this many times -before giving up. This value should be quite high on @code{FreeBSD} as -internal interrupts is sent to all threads. - -@item @code{record_buffer} -Ԥƥåɤ󤹤ơ֥ˡΥΥХ -եƤޤ¿νԤϡäƤ - - -@item @code{query_buffer_size} -The initial allocation of the query buffer. If most of your queries are -long (like when inserting blobs), you should increase this! - -@item @code{skip_show_databases} -ϡ @code{PROCESS_PRIV} ¤äƤʤ桼 - @code{SHOW DATABASES} ˻ߤޤ ⤷¾ͤΥǡ١ -ơ֥򸫤褦Ȥͤ򡢤ʤۤʤС -ϥƥ򶯲Ǥޤ - -@item @code{sort_buffer} -ȤԤɬפƥåɤΥΥХåեƤޤ -® @code{ORDER BY} ޤ @code{GROUP BY} ΤˤϤ䤷Ƥ - -@xref{Temporary files}. - -@item @code{table_cache} -ƤΥåɤˤĤƤΥץơ֥οäϡ -@code{mysqld}׵᤹륪ץեǥץο -ä뤳ȤդʤȤޤ -@strong{MySQL} ϥˡơ֥2ĤΥեǥץɬפ -ޤ -ҤΥեǥץ¤򻲾ȤΤȡ -You can check if you -need to increase the table cache by checking the @code{Opened_tables} -variable. @xref{SHOW}. If this variable is big and you don't do -@code{FLUSH TABLES} a lot (which just forces all tables to be closed and -reopenend), then you should increase the value of this variable. - -ơ֥륭å夬ɤΤ褦ƯϤ򻲾 @ref{Table cache}. - -@item @code{tmp_table_size} -꡼ ơ֥뤬ͤĶ褦Ȥ硢@strong{MySQL} -ưŪˡdisk ١ @code{MyISAM} ơ֥Ѵޤ -¿Ū @code{GROUP BY} Ԥϡ - @code{tmp_table_size} äƤ - -@item @code{thread_stack} -ƥåɤΥå礭@code{crash-me} ˤäƸФ¿ -¤˰¸ޤǥեȤǤϡ̾Υڥ졼Ф -ʬȤäƤޤ -@xref{Benchmarks}. - -@item @code{wait_timeout} -СͥĤޤǤ˥ƥ֤ʥͥԤÿ -@code{interactive_timeout} ⻲ȤΤȡ -@end table - -@strong{MySQL} ϤȤƤ⥹֥ʥ르ꥺѤޤΤ -̾ϤȤƤ⾯ʤưޤɤǽ뤿 -@strong{MySQL} ¿ΥͿ뤳ȤǤޤ - -When tuning a @strong{MySQL} server, the two most important variables to use -are @code{key_buffer_size} and @code{table_cache}. You should first feel -confident that you have these right before trying to change any of the -other variables. - -¿Υ(>=256M)¿Υơ֥äƤơŬ٤Υ饤ȿǺǽ -硢Τ褦ʤΤѤޤ: - -@example -shell> safe_mysqld -O key_buffer=64M -O table_cache=256 \ - -O sort_buffer=4M -O record_buffer=1M & -@end example - -If you have only 128M and only a few tables, but you still do a lot of -sorting, you can use something like: - -@example -shell> safe_mysqld -O key_buffer=16M -O sort_buffer=1M -@end example - -¿³Ǿʤꤷʤ硢Τ褦ʤΤѤޤ: - -@example -shell> safe_mysqld -O key_buffer=512k -O sort_buffer=100k \ - -O record_buffer=100k & -@end example - -or even: - -@example -shell> safe_mysqld -O key_buffer=512k -O sort_buffer=16k \ - -O table_cache=32 -O record_buffer=8k -O net_buffer=1K & -@end example - -⤷ȤƤ¿³ꡢ@code{mysqld} ³Фƾʤ꡼ -ư褦ꤵƤСåפɤ߽񤭤ˤѥեޥ󥹤㲼ޤ -ʬʥ꡼СƤ³ˤ @code{mysqld} Υѥեޥɤʤޤ - -@code{mysqld} ؤΥץѹ硢ΥФΥ󥹥󥹤ˤ -ͭǤ뤳ȤդƲ - -ѥ᡼ѹθ̤򸫤ˤϡΤ褦ˤޤ: - -@example -shell> mysqld -O key_buffer=32m --help -@end example - -@code{--help} ץϺǸˤĤƤ -¾Υץ --help θˤĤȡΥץȿǤޤ - -@cindex Table cache -@findex table_cache -@node Table cache, Creating many tables, Server parameters, System -@subsection @strong{MySQL} ϤɤΤ褦˥ơ֥Υץ & Ԥʤ - -@code{table_cache} , @code{max_connections} , @code{max_tmp_tables} -С֤ˤƤեκ˱ƶޤ -⤷ѿΤΰġ뤤ʣäʤ顢 -ʤΥڥ졼ƥ󥰡ƥΡ1 ץ˳ - ե롦ǥץ κͤ䤹Ȥˤʤ뤫⤷ޤ -¿ΥƥǤϤ¤䤹ȤǽǤ -ɤäƹԤϡʤλѤƤ OS ΥɥȤ򸫤Ƥ -ͤѹˡϡƥˤäƤޤޤǤ - -@code{table_cache} @code{max_connections} ˴Ϣޤ -㤨 200 ΥͥƱ˳ʤ顢ʤȤ @code{200 * n} -ơ֥롦å夬ɬפǤ @code{n} join ˤơ֥ -Ǥ - -ץơ֥ΥåϺ @code{table_cache} ޤ礭ʤޤ( -եȤ 64, @code{mysqld} Υץ @code{-O table_cache=#} ѹǽ) -å夬դˤʤäơ¾Υåɤơ֥Υץߤ -ޤ @code{mysqladmin refresh} @code{mysqladmin flush-tables} -Ѥơơ֥ϥޤ - -å夬äѤˤʤä硢Сϰʲν֤ä -åѤǤ褦֤ޤ - -@itemize @bullet -@item -߻ȤƤʤơ֥뤬ޤäȤѤƤʤơ֥뤫餫ˡ - -@item -⤷å夬դǥơ֥뤳Ȥ褺˿ơ֥ -ץ׵᤬硢åϰŪʳĥɬפȤޤ - -@item -⤷Υå夬ĥ֤Ƥơġơ֥뤬Ѿ֤ -̤Ѿ֤˰ܹԤ硢Υơ֥Ĥ졢å夫ޤ -@end itemize - -ơ֥ϳƱ (Ƥ) ץ󤵤ޤϡƱơ֥2ĤΥ -ɤ¹ԤƤ硢ޤƱ(@code{AS} )ơ֥2󥢥 -硢ơ֥2󥪡ץ󤹤ɬפ뤳Ȥ̣ޤǽΥơ֥Υ -ץ2ĤΥե뵭һҤѤ³ơ֥γƻѤ1ĤΥե뵭 -ҤѤޤ - - -@node Creating many tables, Open tables, Table cache, System -@subsection Drawbacks of creating large numbers of tables in the same database - -⤷Υե뤬ĤΥǥ쥯ȥˤ硢ץ󡢥 -٤ʤǤ礦 ⤷ @code{SELECT} ʸ¿Υơ֥Ф -¹Ԥ硢ơ֥륭å夬դʤСΥСإåɤ¿ʤǤ礦 -ʤʤ顢줾Υơ֥ˤĤץ󤷡ʤƤϤʤʤǤ -ΥСإåɤ¤ˤϡơ֥륭å礭ޤ - -@node Open tables, Memory use, Creating many tables, System -@subsection Τʤ¿Υơ֥򥪡ץ󤹤Τ - -@code{mysqladmin status} ¹ԤȡΤ褦ʤΤޤ: - -@example -Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12 -@end example - -Τˤä6Ĥơ֥뤬ʤΤˡΤ褦ʷ̤ФΤǾǤ뤫⤷ޤ - -@strong{MySQL} ϥޥåɤʤΤǡƱơ֥ǰ٤¿Υ -ޤƱեǰۤʤ֤2ĤΥåɤǡǾ -ᡢƱưƥåɤΤơ֥Ƥӥץ󤷤ޤϤ -ΥȥǡեˤĤƤΰĤγĥե뵭һҤѤޤ -ǥåե뵭һҤƤΥåɴ֤Ƕͭޤ - - -@cindex Memory use -@node Memory use, Internal locking, Open tables, System -@subsection MySQL ϤɤΤ褦˥ѤΤ - -ʲ @code{mysqld} СɤΤ褦˥꡼Ѥ뤫Ĥޤ -СͿѿ̾ϡСΥ꡼λ˴Ϣ̾ȤʤäƤޤ - -@itemize @bullet -@item -Хåե (ѿ @code{key_buffer}) ƤΥåɤǶͭ졢 -Ĥɬ׻˳Ƥޤ -@xref{Server parameters}. - -@item -³ϤĤΥåɶ֤Ѥޤ -å (64K, ѿ @code{thread_stack}), ³Хåե(variable -@code{net_buffer_length}), ̥Хåե(variable -@code{net_buffer_length})³Хåեȷ̥ХåեɬפȤʤä -ưŪ˺ @code{max_allowed_packet} ޤޤ -꤬äƤΥʸΥԡƤޤ - -@item -ƤΥåɤƱ١ͭޤ - -@item -ޤ memory-mapped ѤƤޤ (̥ơ֥Ͻޤ̤) - 4GB 32bit ֤¿礭ʥơ֥򰷤ˤϾǤ -64bit ɥ쥹֤ĥƥ桹줿桹 mmemory-mapping ̾˥ݡȤޤ - -@item -ơ֥ۤƽ缡Ԥʤ׵ϡɤ߹ߥХåեƤޤ -(ѿ record_buffer) - -@item -Ƥη1ѥǹԤʤ졢¿ηϰơ֥Ѥ˹Ԥʤ -ޤ¿ΰơ֥ϥ١(HEAP)Υơ֥Ǥ礭ʥ쥳 -ɥ (= եĹι) İơ֥ޤϡ@code{BLOB} ޤ -ơ֥ϥǥ֤ޤ - -@strong{MySQL} 3.23.2 ǤϡHEAP ơ֥뤬 -@code{tmp_table_size} Υۤȡ顼 @code{The table tbl_name is full} -Ф뤳ȤǤ桹ϡɬ׻˥ (HEAP) ơ֥ǥ١ - (NISAM) ơ֥˼ưŪѹ뤳Ȥˤꡢޤ -򤹤뤿ᡢ@code{mysqld} ؤ @code{tmp_table_size} ץ -ϥ饤¦ SQL ץ @code{SQL_BIG_TABLES} äǤޤ -@xref{SET OPTION, , @code{SET OPTION}}. -@strong{MySQL} 3.20 Ǥϡơ֥κ祵 -@code{recordbuffer*16} ǤΤᡢΥСѤƤȡ -@code{recordbuffer} ɲäɬפޤ @code{mysqld} @code{--big-tables} -Ϥ뤳Ȥǡ˰ơ֥ǥ˳ǼǤޤ -¿ʣʥ®٤˱ƶޤ - -@item -ۤȤɤΥꥯȤϡ1,2ĤΰեȤ鷺ʥȥХåեؤγƤԤޤ -@xref{Temporary files}. - -@item -ѷȱ黻˻ѤۤȤƤΥϥꥹȥǹ -ʤޤʹܤɬפȤꥪСإåɤϤʤ̾ -/򤵤ޤͽʤ礭ʸˤ -Ƥޤ( @code{malloc()} @code{free()} ǹԤʤޤ) - -@item -ƥǥåեϰ٥ץ󤵤졢ǡեϳƱ¹ԥ -˰٥ץ󤵤ޤƱåɤˤϡơ֥빽¤ƥեɤι¤ - @code{3 * n} ΥΥХåեƤޤ -( @code{n} @code{BLOB} ΥեɤĹޤʤ쥳ɤκĹǤ ) -@code{BLOB} 5 8 Х + @code{BLOB} ǡĹѤޤ - -@item -@code{BLOB} ijƥơ֥Ǥϡ礭 @code{BLOB} ɤ߹ߤǥХåե -ưŪ˳礵ޤơ֥Υ򤹤硢Ƥ줿ХåեϺ -礭 @code{BLOB} Ʊ礭ˤʤޤ - -@item -ƤλѤƤơ֥Υơ֥ϥɥ顼ϥå¸졢 -FIFO Ȥƴޤ -̾å 64 ĤΥơ֥Ǥơ֥뤬 2 Ĥμ¹ԤƤ륹 -åɤƱ˻Ѥ硢å˥ơ֥ 2 ĤΥȥ꤬ -ޤ -@xref{Table cache}. - -@item -@code{mysqladmin refresh} ϻѤƤʤƤΥơ֥򥯥 -ѤƤƤΥơ֥򡢼¹楹åɤä˥ -˥ޡޤ¿λѥΤͭǤƤΥ -ե⥯Ⱥƥץ󤵤ޤ -@end itemize - -@strong{mysqld} ¹Ի@code{ps} ¾Υץϡ줬¿Υ -ѤƤ𤹤Ǥ礦ϰۤʤäꥢɥ쥹Υ -ɥåˤäȯޤ㤨СSolaris ps ϥå֤̤ѥ -ѥȤƷ׻ޤ'swap -s' ͭʥåפå -뤳ȤǤΤޤ桹ϻΤΥ꡼Хץ -@code{mysqld} ƥȤޤΤᡢ꡼ޤ - -@node Internal locking, Table locking, Memory use, System -@subsection @strong{MySQL} ϤɤΤ褦˥ơ֥å뤫 - -@strong{MySQL} ƤΥåϥǥåɥåե꡼Ǥϡ˥ -곫ϻ˰٥åɬפȤƤ׵ᤷƱǥơ֥ -뤳ȤǴޤ - -@strong{MySQL} Ѥ @code{WRITE} åϼΤ褦Ưޤ: - -@itemize @bullet -@item -ơ֥˥åʤ write å֤ޤ -@item -Ǥʤ write å塼˥å֤ޤ -@end itemize - -@strong{MySQL} @code{READ} åϼΤ褦ưޤ: - -@itemize @bullet -@item -ơ֥ write åʤ read å֤ޤ -@item -Ǥʤ read å塼˥å֤ޤ -@end itemize - -å줿Ȥǽ write å塼Υåɤˡθ -read å塼Υåɤ˥åͿޤ - -ϡƱơ֥¿ι򤹤硢@code{SELECT} ʸ -update ʤʤޤԤ뤳Ȥ̣ޤ - -Ʊơ֥¿ @code{INSERT} ¿ @code{SELECT} Ԥ硢褹 -ϡ¾Υơ֥˹Ԥơޤˡΰơ֥뤫ƤΥ쥳 -ɤ⤦Υơ֥ update ޤ - -ϼΥɤǹԤޤ: -@example -mysql> LOCK TABLES real_table WRITE, insert_table WRITE; -mysql> insert into real_table select * from insert_table; -mysql> delete from insert_table; -mysql> UNLOCK TABLES; -@end example - -ޤ꤭äͥ踢Ϳ뤿ᡢ@code{INSERT} ʸ @code{LOW_PRIORITY} @code{HIGH_PRIORITY} ץ󤬻ѤǤޤ -@xref{INSERT, , @code{INSERT}}. - -ĤΥ塼Ѥ褦 @file{mysys/thr_lock.c} Υåɤѹ -뤳ȤǤޤξ硢ĤΥץꥱΤˡ -write å read åƱ̤ͥˤޤ - -@node Table locking, , Internal locking, System -@subsection ơ֥롦å󥰤 - -@strong{MySQL} Υơ֥롦å󥰤Υɤϥǥåɥåե꡼Ǥ - -@strong{MySQL} ϤȤƤ®åԡɤ뤿ˡ -(쥳ɤΥåեɤΥå) ơ֥ΥåѤޤ -礭ʥơ֥ˤϡ ơ֥Υåϥ쥳ɤΥåϤ뤫ɤǤ -ĤȤ꤬ޤ - -@strong{MySQL} 3.23.7 ʾǤϡ륹åɤ @code{MyISAM} ơ֥ɤǤˡ -Ʊơ֥˥쥳ɤǤޤ -ϸߡʤˤΤưޤ - -ơ֥ΥåϤΥåɤƱˤơ֥뤫ɤ߽ФΤǽˤޤ -⤷륹åɤơ֥Ф׵Ф硢 -Ϥޤǽ¾ŪʥʤФʤޤ. -ιδ֡λޤǡΥơ֥˥褦Ȥ -¾ƤΥåɤԤ뤳Ȥˤʤޤ - -̾ǡ١ι @code{SELECT} פȤ뤿ᡢ -ơ֥򹹿ƤΥåɤơ֥뤫򸡺륹åɤ -⤤̤ͥޤ Υơ֥Фơ¿νŤ꤬ȯԤ -ˡ Դ˽ʤȤμ¤ˤ뤿Ǥ - -@strong{MySQL 3.23.7} 顢@code{max_write_lock_count} ѿѤǤޤ -ϡĤΥơ֥Фơꤵ줿 INSERT Ԥ줿ˡ -@code{SELECT} ȯԤ褦ˤޤ - -1Ĥμ꤬ʲǤ - -@itemize @bullet -@item -륯饤Ȥ¹ԤĹ֤Τ @code{SELECT} ȯԡ -@item -θˡ¾Υ饤ȤѤƤơ֥Ф @code{UPDATE} ȯԡ -Υ饤Ȥ @code{SELECT} λޤԤޤ -@item -¾Υ饤ȤƱơ֥Ф @code{SELECT} ʸȯԡ -@code{UPDATE} @code{SELECT} ⤤ͥ٤ĤΤǡ - @code{SELECT} @code{UPDATE} λޤԤޤ -ϰֺǽ @code{SELECT} λޤԤޤ -@end itemize - -ΤĤβǽʲϰʲ̤Ǥ - -@itemize @bullet -@item -@code{SELECT} ʸ®¹ԤǤ褦˻ߤޤ Ԥˤꡢ -ĤΥޥ꡼ơ֥ʤФʤʤ⤷ޤ. - -@item -@code{mysqld} @code{--low-priority-updates} ץǵư -ƤΤơ֥򹹿빽ʸФơ @code{SELECT} ʸ -㤤ͥ٤Ϳޤ ξ硢ҤΥʥꥪκǸ @code{SELECT} ʸ -@code{INSERT} ʸλ˼¹Ԥޤ - -@item -@code{LOW_PRIORITY} °Ѥơ @code{INSERT},@code{UPDATE},@code{DELETE} ʸ -㤤ͥ٤Ϳ뤳Ȥޤ - -@item -Start @code{mysqld} with a low value for @strong{max_write_lock_count} to give -@code{READ} locks after a certain number of @code{WRITE} locks. - -@item -SQL ޥɤ @code{SET SQL_LOW_PRIORITY_UPDATES=1} Ѥơ -ΥåɤƤι㤤ͥ٤˻ꤹǤޤ -@xref{SET OPTION, , @code{SET OPTION}}. - -@item -@code{HIGH_PRIORITY} °Ѥơ @code{SELECT} ȤƤפǤ -ꤹ뤳ȤǽǤ. @xref{SELECT, , @code{SELECT}}. - -@item -⤷ @code{INSERT} @code{SELECT} 򤢤碌ƻѤ꤬硢 - @code{MyISAM} ơ֥ڤؤޤ @code{SELECT} - @code{INSERT} Ʊ˹Ԥޤ - -@item -⤷ @code{INSERT} @code{SELECT} ʸ˺ߤΤʤ顢 -@code{INSERT} @code{DELAYED} °Ϥ褵Ǥ礦 -@xref{INSERT, , @code{INSERT}}. - -@item -⤷ @code{SELECT} @code{DELETE} ꤬ʤ顢 -@code{DELETE} @code{LIMIT} ץ󤬽ˤʤǤ礦 - @xref{DELETE, , @code{DELETE}}. -@end itemize - -@node Data size, MySQL indexes, System, Performance -@section ǽʸ¤ǡ򾮤 - -One of the most basic optimization is to get your data (and indexes) to -take as little space on the disk (and in memory) as possible. This can -give huge improvements because disk reads are faster and normally less -main memory will be used. Indexing also takes less resources if -done on smaller columns. - -@strong{MySQL} supports a lot of different table types and row formats. -Choosing the right table format may give you a big performance gain. -@xref{Table types}. - -ʲ˵󤲤ƥ˥åѤСơ֥ǤΥѥեޥ󥹤θ塢 -¸ΰν̾ǽǤ礦 - -@itemize @bullet -@item -ǽʤС־ʷѤޤ @strong{MySQL} -ǥȥ꡼󤹤¿ηäƤޤ -@item -꾮ǽʤлѤޤ 㤨С -@code{MEDIUMINT} @code{INT} ɤǤ礦 -@item -ǽʤեɤ @code{NOT NULL} ƤƤ® -ƥե1ӥåȤ󤷤ޤ -Note that if you really need -@code{NULL} in your application you should definitely use it. Just avoid -haveing it on all columns by default. -@item -ĹΥե (@code{VARCHAR}, @code{TEXT}, @code{BLOB}) ʤϡ -ꥵ쥳ɷѤޤ -Ϥʤ®Ǥˤ餫ΰϲ񤷤ޤ -@xref{MyISAM table formats}. -@item -줾Υơ֥ϲǽʸ¤ûץ饤ޥꡦǥåĤ٤Ǥ -ϣ쥳ɤդˤΨŪˤޤ -@item -줾Υơ֥ˤĤơɤΥơ֥ηѤ뤫 -ޤ @xref{Table types}. -@item -ɬפʪˤǥåޤ -ǥåϸˤɤǤ®¸ˤɤޤ -⤷ơ֥եɤȤ߹碌ǥ뤳ȤۤȤɤǤС -˥ǥåޤ ǽΥǥåʬϡäȤ -Ѥեɤˤ٤Ǥ -If you are -ALWAYS using many columns you should use the column with more duplicates -first to get better compression of the index. -@item -⤷ǥåƬβʸǰäƤʤ顢ʬˤ -ǥåĥɤǤ礦 @strong{MySQL} ʸեɤ -ʬФƤΥǥå򥵥ݡȤޤ -ûǥåϡǥڡ󤹤Ǥʤ -ǥåΥå˼ޤ䤹ʤ뤳Ȥˤꡢǥ⾯ʤʤΤǡ -®ʤޤ @xref{Server parameters}. -@item -ĤξǡȤƤ褯ơ֥򣲤Ĥʬ䤹뤳Ȥϡ -פˤʤ뤳Ȥޤ -This is especially true if it is a dynamic -format table and it is possible to use a smaller static format table that -can be used to find the relevant rows when scanning the table. -@end itemize - -@node MySQL indexes, Query Speed, Data size, Performance -@section MySQL ϤɤΤ褦˥ǥåѤ뤫 - -Indexes are used to find rows with a specific value of one column -fast. -ǥåʤ硢@strong{MySQL} ϡΥ쥳ɤĤޤǡ -ǽΥ쥳ɤơ֥ʤƤޤ 礭ʥơ֥Ǥ¿ -֤ޤ ⤷䤤碌˥ǥåäեɤ -硢@strong{MySQL} ƤΥǡߤ뤳Ȥʤǡΰ֤® -뤳ȤǤޤ ⤷ơ֥뤬1000쥳ɻäƤȤȡ -֤ƬʤƤȤ٤ơϾʤȤ100®Ȥ -ʤޤ Note that is you need to access almost all 1000 -rows it is faster to read sequentially because we then avoid disk seeks. - -Ƥ @strong{MySQL} ǥå, @code{PRIMARY}, @code{UNIQUE} @code{INDEX()} - B tree ˳ǼޤʸϼưŪ˻ϤȽζ򤬰̤ޤ -@xref{CREATE INDEX, , @code{CREATE INDEX}}. - -Indexes are used to: -@itemize @bullet -@item -@code{WHERE}˥ޥåԤᤤ - -@item -join ¹ԤȤ¾Υơ֥뤫ιԤθ - -@item -Ϳ줿եɤ @code{MAX()} @code{MIN()} ͤγФ - -@item -ơ֥򥽡Ȥ롼ײǡ(롼ײ)ֺ(Ƭ) -ѤƹԤ(㤨 @code{ORDER BY key_part_1,key_part_2 }) -⤷ @code{DESC} ꤬СƤΥϵսɤޤޤ - -The index can also be used even if the @code{ORDER BY} doesn't match the index -exactly, as long as all the not used index parts and all the extra -are @code{ORDER BY} columns are constants in the @code{WHERE} clause. The -following queries will use the index to resolve the @code{ORDER BY} part. - -@example -SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3; -SELECT * FROM foo WHERE column=constant ORDER BY column, key_part1; -SELECT * FROM foo WHERE key_part1=const GROUP BY key_part2; -@end example - -@item -ǡե򻲾Ȥ뤳Ȥʤͤ򸡺硣 -⤷ѤƤΥեɤͤǤġֺ(Ƭ)硢 -ͤϥǥåĥ꡼鸡졢ϤȤƤ®ʤޤ - -@end itemize - -ʲΤ褦 @code{SELECT} ʸȯԤȤޤ - -@example -mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2; -@end example - -⤷ @code{col1} @code{col2} ʣեɥǥåƤ硢 -˻פäȤη̤ޤ -If separate single-column -indexes exist on @code{col1} and @code{col2}, the optimizer tries to -find the most restrictive index by deciding which index will find fewer -rows and using that index to fetch the rows. - -@cindex Indexes, leftmost prefix of -@cindex Leftmost prefix of indexes -⤷ơ֥뤬ʣեɥǥåĤʤ顢ǥåƬֺʬ -쥳ɤ򸫤Ĥ뤿κŬ˻Ѥޤ㤨С3ĤΥե - @code{(col1,col2,col3)} ФưĤΥǥåäƤȤޤ -ȡ @code{(col1)}, @code{(col1,col2)} , -@code{(col1,col2,col3)} ǥǥåޤ - -⤷ֺ˻ꤷƤեɤǥåƤʤʤ顢 -@strong{MySQL} ʬŪʥǥåѤޤ - -ʲΤ褦 @code{SELECT} ʸȯԤȤޤ - -@example -mysql> SELECT * FROM tbl_name WHERE col1=val1; -mysql> SELECT * FROM tbl_name WHERE col2=val2; -mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3; -@end example - -⤷ǥå @code{(col1,col2,col3)} ˤʤС -˼ǽΥǥåѤޤܻܤΥ -ǥåĥեɤȯưޤ -@code{(col2)} @code{(col2,col3)} ϡ@code{(col1,col2,col3)} -Ƭֺ˻ꤵƤޤ - -@findex LIKE, and indexes -@findex LIKE, and wildcards -@cindex Indexes, and @code{LIKE} -@cindex Wildcards, and @code{LIKE} -@strong{MySQL} ϡ⤷ @code{LIKE} 磻ɥɤϤޤäƤʤơ -ꤵ줿ʸǻϤޤäƤʤ顢 -@code{LIKE} ɾ˥ǥåѤޤ -㤨Сʲ @code{SELECT} ʸϥǥåѤޤ: - -@example -mysql> select * from tbl_name where key_col LIKE "Patrick%"; -mysql> select * from tbl_name where key_col LIKE "Pat%_ck%"; -@end example - -ܤʸϡ@code{"Patrick" <= key_col < "Patricl"} Ȥʤ쥳ɤθޤ -ܤʸϡ@code{"Pat" <= key_col < "Pau"} Ȥʤ쥳ɤθޤ - -ʲ @code{SELECT} ʸϥǥåѤޤ: -@example -mysql> select * from tbl_name where key_col LIKE "%Patrick%"; -mysql> select * from tbl_name where key_col LIKE other_col; -@end example - -ǽʸϡ@code{LIKE} 磻ɥʸǻϤޤäƤޤ -ܤʸϡ@code{LIKE} ǤϤޤ - -@findex IS NULL, and indexes -@cindex Indexes, and @code{IS NULL} -Searching using @code{column_name IS NULL} will use indexes if column_name -is an index. - -@strong{MySQL} ̾־ʤ쥳ɿ򸫤Ĥ륤ǥåѤޤ -ǥåϡʲ˼黻ҤѤӤǤեɤФơѤޤ -@code{=}, @code{>}, @code{>=}, @code{<}, @code{<=}, @code{BETWEEN} -@code{'something%'} ͤƬ˥磻ɥɤʤ @code{LIKE} - -@code{WHERE} Ƥ @code{AND} ˤʤǥåϡ -κŬ˻Ѥޤ -In other words: To be able to use an -index, a prefix of the index must be used in every @code{AND} group. - -ʲ @code{WHERE} ϥǥåѤޤ -@example -... WHERE index_part1=1 AND index_part2=2 AND other_column=3 -... WHERE index=1 OR A=10 AND index=2 /* index = 1 OR index = 2 */ -... WHERE index_part1='hello' AND index_part_3=5 - /* optimized like "index_part1='hello'" */ -... WHERE index1=1 and index2=2 or index1=3 and index3=3; - /* Can use index on index1 but not on index2 or index 3 */ -@end example - -ʲ @code{WHERE} ϥǥå@strong{Ѥޤ} -@example -... WHERE index_part2=1 AND index_part3=2 /* index_part_1 is not used */ -... WHERE index=1 OR A=10 /* Index is not used in both AND parts */ -... WHERE index_part1=1 OR index_part2=10 /* No index spans all rows */ -@end example - -@node Query Speed, Tips, MySQL indexes, Performance -@section ǡ򥢥륯® - -ǽˡƤΥ˱ƶĤλΤ٤ޤ -ʣʸ¤ԤȡСإåɤ¿ʤޤ - -⤷ʤʤ @code{GRANT} ʸԤäƤʤС -@strong{MySQL} ϥѡߥåθ򾯤ŬʤǤ礦 -So if you have a very high volume it -may be worth the time to avoid grants. Otherwise more permission check -results in a larger overhead. - -⤷ @strong{MySQL} ؿΤΤμ¤ƤΤʤС - @strong{MySQL} 饤¦ϰʲΤ褦ˤʤޤ - -@example -mysql> select benchmark(1000000,1+1); -+------------------------+ -| benchmark(1000000,1+1) | -+------------------------+ -| 0 | -+------------------------+ -1 row in set (0.32 sec) -@end example - -Ǥ @strong{MySQL} 1,000,000 @code{+} 0.32 äǼ¹ԤǤƤޤ -(ʤ @code{PentiumII 400MHz} ޥ) - -Ƥ @strong{MySQL} ؿϺŬƤޤ -Ĥ㳰뤫⤷ޤ -@code{benchmark(loop_count,expression)}ϤʤΥ -򸫤Ĥ뤿ΤȤƤ褤ġǤ - -@menu -* Estimating performance:: Estimating query performance -* SELECT speed:: Speed of @code{SELECT} queries -* Where optimizations:: How MySQL optimizes @code{WHERE} clauses -* LEFT JOIN optimization:: How MySQL optimizes @code{LEFT JOIN} -* LIMIT optimization:: How MySQL optimizes @code{LIMIT} -* Insert speed:: Speed of @code{INSERT} queries -* Update speed:: Speed of @code{UPDATE} queries -* Delete speed:: Speed of @code{DELETE} queries -@end menu - -@node Estimating performance, SELECT speed, Query Speed, Query Speed -@subsection ǽɾ - -ۤȤɤξ硢ǥ뤳ȤǤΥѥեޥ󥹤ͽ¬Ǥޤ -ʥơ֥Ǥϡ̾1Υǥǥ쥳ɤ򸫤ĤǤ礦 -(ǥå֤󥭥å夵Τ) 礭ʥơ֥Ǥϡ -褽ͽ¬Ȥơ(B++ ĥ꡼ǥåѤƤ) -@code{log(row_count) / -log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + -1} 1쥳ɤ򸫤ĤΤɬפȤʤǤ礦 - -@strong{MySQL} Ǥϡǥå֥å̾ 1024 ХȤǡ -ǡݥ󥿡̾ 4 ХȤǤ ϡ -ǥåĹ 3 (medium integer) ǡ 500,000 쥳ɤơ֥Ǥϡ -@code{log(500,000)/log(1024/3*2/(3+4)) + 1} = 4 Ȥʤޤ - -As the above index would require about 500,000 * 7 * 3/2 = 5.2M, -(assuming that the index buffers are filled to 2/3 (which is typical) ) -you will probably have much of the index in memory and you will probably -only need 1-2 calls to read data from the OS to find the row. - -񤭹߻ˤϡξ硢ǥå񤭹 -õФΤˡ4 ꡢˡ̾ǥå򹹿 -쥳ɤ񤯤Τ 2 ɬפǤ - -Note that the above doesn't mean that your application will slowly -degenerate by N log N! As long as everything is cached by the OS or SQL -server things will only go marginally slower while the table gets -bigger. After the data gets too big to be cached, things will start to -go much slower until your applications is only bound by disk-seeks -(which increase by N log N). To avoid this, increase the index cache as -the data grows. @xref{Server parameters}. - -@node SELECT speed, Where optimizations, Estimating performance, Query Speed -@subsection @code{SELECT} ® - -̾٤ @code{SELECT ... WHERE} ®ˤϡ -ޤǽ˥ǥå뤫ɤåޤ@xref{MySQL -indexes, , @strong{MySQL} indexes}. -㤦ơ֥򻲾Ȥˤϡ̤ϥǥåȤʤ٤Ǥ -@code{EXPLAIN} ޥɤѤС@code{SELECT} ǤɤΥǥå -ѤƤ뤫ǧǤޤ -@xref{EXPLAIN, , @code{EXPLAIN}}. - -Some general tips: - -@itemize @bullet -@item -To help @strong{MySQL} optimize queries better, run @code{myisamchk ---analyze} on a table after it has been loaded with relevant data. This -updates a value for each index part that indicates the average number of -rows that have the same value. (For unique indexes, this is always 1, -of course.). @strong{MySQL} will use this to decide which index to -choose when you connect two tables with 'a non-constant expression'. -You can check the result from the @code{analyze} run by doing @code{SHOW -INDEX FROM table_name} and examining the @code{Cardinality} column. - -@item -ǥåȥǡ򥤥ǥå˽äƥȤˤϡ -@code{myisamchk --sort-index --sort-records=1} Ѥޤ -(⤷ ܤΥǥå˥Ȥʤ) -If you -have a unique index from which you want to read all records in order -according to that index, this is a good way to make that faster. -ΥˡϺŬ֤ǤϽ񤫤줺ޤ礭ʥơ֥Ǥ -¿λ֤뤳ȤդƤ -@end itemize - -@cindex Optimizations -@node Where optimizations, LEFT JOIN optimization, SELECT speed, Query Speed -@subsection MySQL ϤɤΤ褦 @code{WHERE} Ŭ뤫 - -@code{WHERE} κŬϡ@code{WHERE} ۤȤ @code{SELECT} ǻѤ뤿ᡢ -@code{SELECT} ֤Ƥޤ ƱŬ -@code{DELETE} @code{UPDATE} ʸǤѤޤ - -ΥκŬϤޤԽʬǤ -ʤʤ顢 @strong{MySQL} ϤȤƤ¿κŬԤäƤꡢ -ƤˤĤƤ񤱤֤桹ϤȤޤ - -@strong{MySQL}ˤŬΤĤʲ˼ޤ: - -@itemize @bullet -@item -̤ν (Ƥɬפʳ̤Ϻޤ): -@example - ((a AND b) AND c OR (((a AND b) AND (c AND d)))) --> (a AND b AND c) OR (a AND b AND c AND d) -@end example -@item -ݻ: -@example - (a b>5 AND b=c AND a=5 -@end example -@item -ν (ݻΤɬפȤޤ): -@example - (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6) --> B=5 OR B=6 -@end example -@item -ǥå˻ѤƤɽϰ٤ɾޤ -@item -ĤΥơ֥ @code{WHERE} ʤ @code{CONST(*)} ϡơ֥뤫 -ľܼФޤϤޤƱﲼǤǤդ @code{NOT NULL} ɽ -ΤˤԤޤ -@item -ɽ᤯Фޤ -@strong{MySQL} Բǽ @code{SELECT} ʸ᤯Ĥ0 Ԥ̤Ȥ֤ޤ -@item -@code{GROUP BY} ޤ group ؿ (@code{COUNT()}, @code{MIN()}...) Ѥʤϡ -@code{HAVING} @code{WHERE} ȥޡޤ -@item -ƥַˤĤƤ® @code{WHERE} ɾ뤿ˡޤǽʸ¤ -᤯쥳ɤ򥹥åפ뤿ˡƥַˤĤƤñ -@code{WHERE} ۤޤ -@cindex Constant table -@cindex Table, constant -@item -Ƥơ֥򥯥꡼¾Υơ֥ɤߤޤ -ơ֥ϼǤ: -@itemize @minus -@item -0 ޤ 1 ԤΥơ֥롣 -@item -@code{WHERE} @code{UNIQUE} ǥå @code{PRIMARY KEY} Ѥ줿ơ֥ǡ -ġƤΥǥåǻѤƤơ -ġǥåΥѡȤ @code{NOT NULL} Ƥơ֥롣 -@end itemize -ʲΥơ֥Τ褦Ѥơ֥: -@example -mysql> SELECT * FROM t WHERE primary_key=1; -mysql> SELECT * FROM t1,t2 - WHERE t1.primary_key=1 AND t2.primary_key=t1.id; -@end example - -@item -ơ֥礹뤿˺ɤηȹ礻򸫤ĤޤƤβǽ -@code{ORDER BY} ޤ @code{GROUP} ƤΥեɤƱơ֥ξϡ -Υơ֥Ϸ˺ǽͥ褵ޤ -@item -@code{ORDER BY} @code{GROUP BY} ᤬硢ޤ @code{ORDER BY} @code{GROUP BY} 祭塼 -κǽΥơ֥ǤϤʤ¾Υơ֥뤫ιܤޤ硢ơ֥뤬ޤ -@item -⤷ @code{SQL_SMALL_RESULT} Ѥʤ, @strong{MySQL} ϥ꡼ΰ켡ơ֥ -Ѥޤ -@item -@code{DISTINCT} ϡƤΥեɤФ @code{GROUP BY} Ѵ뤿ᡢ -@code{ORDER BY} ȹ路 @code{DISTINCT} ¿ξǰơ֥뤬 -ɬפˤʤޤ -@item -ƥơ֥Υǥåϥꤵ졢Ԥ 30% ̤ʤɤΥǥåѤޤ -Τ褦ʥǥåĤʤ硢ᤤơ֥(quick table scan)Ѥޤ -@item -Ʊ褦ˡ@strong{MySQL} ϥǡեĴ٤Ϥʤǥå -쥳ɤɤळȤǽǤ⤷ƤΥեɤͷΥǥåʤ顢 -ǥåĥ꡼β˻Ѥޤ -@item -ƥ쥳ɤϤˡ@code{HAVING} Ŭ礹Τ򥹥åפޤ -@end itemize - -ʲϤȤƤ®Ǥ: - -@example -mysql> SELECT COUNT(*) FROM tbl_name; -mysql> SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name; -mysql> SELECT MAX(key_part2) FROM tbl_name - WHERE key_part_1=constant; -mysql> SELECT ... FROM tbl_name - ORDER BY key_part1,key_part2,... LIMIT 10; -mysql> SELECT ... FROM tbl_name - ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10; -@end example - -ʲΥϥǥåĥ꡼ΤߤѤޤ(ǥåƤեɤ -ͷȲꤷޤ) - -@example -mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val; -mysql> SELECT COUNT(*) FROM tbl_name - WHERE key_part1=val1 AND key_part2=val2; -mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1; -@end example - -ʲΥϡȤ줿Ԥθ˥ǥåѤޤ - -@example -mysql> SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,... -mysql> SELECT ... FROM tbl_name ORDER BY key_part1 DESC,key_part2 DESC,... -@end example - -@node LEFT JOIN optimization, LIMIT optimization, Where optimizations, Query Speed -@subsection MySQL ϤɤΤ褦 @code{LEFT JOIN} Ŭ뤫 - -@code{A LEFT JOIN B} @strong{MySQL} ˰ʲΤ褦ȤߤޤƤޤ - -@itemize @bullet -@item -The table @code{B} is set to be dependent on table @code{A} and all tables -that @code{A} is dependent on. -@item -ơ֥ @code{A} @code{LEFT JOIN} ˻ѤƤΥơ֥ -ʤ @code{B} Ͻˤ˰¸ȡåȤޤ -@item -Ƥ @code{LEFT JOIN} 郎 @code{WHERE} ˰ưޤ -@item -All standard join optimizations are done, with the exception that a table is -always read after all tables it is dependent on. If there is a circular -dependence then @strong{MySQL} will issue an error. -@item -Ƥ @code{WHERE} κŬԤޤ -@item -@code{WHERE} ˥ޥå쥳ɤ @code{A} ˤꡢ -@code{LEFT JOIN} ˥ޥå쥳ɤ @code{B} ˤʤ硢 -ƤΥեɤ @code{NULL} ˥åȤ줿 @code{B} Υ쥳ɤ -ޤ -@item -If you use @code{LEFT JOIN} to find rows that doesn't exist in some -table and you have the following test: @code{column_name IS NULL} in the -@code{WHERE} part, where column_name is a column that is declared as -@code{NOT NULL}, then @code{MySQL} will stop searching after more rows -(for a particular key combination) after it has found one row that -matches the @code{LEFT JOIN} condition. -@end itemize - -The table read order forced by @code{LEFT JOIN} and @code{STRAIGHT JOIN} will help -the join optimizer (which calculates in which order tables should be joined) to do -its work much more quickly as there are fewer table permutations to check. - -Note that the above means that if you do a query of type: - -@example -SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key -@end example - -Then @strong{MySQL} will do a full scan on @code{b} as the @code{LEFT JOIN} will -force it to be read before @code{d}. - -The fix in this case is to change the query to: - -@example -SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key -@end example - -@node LIMIT optimization, Insert speed, LEFT JOIN optimization, Query Speed -@subsection MySQL ϤɤΤ褦 @code{LIMIT} Ŭ뤫 - -In some cases @strong{MySQL} will handle the query differently when you are -using @code{LIMIT #} and not using @code{HAVING}: - -@itemize @bullet -@item -⤷ @code{LIMIT} ѤƸꤷ select Ԥʤ顢 @strong{MySQL} ϡ -硢ơ֥⡢ǥåѤ褦Ȥޤ -@item -⤷ @code{LIMIT #} @code{ORDER BY} ȶ˻Ѥʤ, @strong{MySQL} -ǽ @code{#} Ԥ򸫤Ĥ餹ˡơ֥ΥȤϹԤ鷺ˡ -Ȥ򽪤餻ޤ -@item -@code{LIMIT #} @code{DISTINCT} ȶ˻Ѥʤ, @strong{MySQL} -@code{#} Ĥΰդʥ쥳ɤ򸫤Ĥǽޤ -@item -In some cases a @code{GROUP BY} can be resolved by reading the key in order -(or do a sort on the key) and then calculate summaries until the -key value changes. In this case @code{LIMIT #} will not calculate any -unnecessary @code{GROUP BY}'s. -@item -@strong{MySQL} ϡǽ @code{#} Ԥ򥯥饤Ȥäľˡ -Ǥޤ -@item -@code{LIMIT 0} Ͼ᤯η̤֤ޤ -ϥΥå̤Ȥեɤη뤿ѤǤޤ -@item -ơ֥礭ϡ褹뤿ˤɤ줰餤Υڡ뤫 -׻Τˡ@code{LIMIT #} Ѥޤ -@end itemize - -@node Insert speed, Update speed, LIMIT optimization, Query Speed -@subsection @code{INSERT} ® - -쥳ɤ֤Ϥ褽ʤޤ: - -@itemize @bullet -@item -³: (3) -@item -򥵡Ф: (2) -@item -β: (2) -@item -쥳ɤ: (1 x size of record) -@item -ǥå: (1 x number of indexes) -@item -: (1) -@end itemize - - () ֤Ǥϡơ֥ΥץˤСإ -(Ʊưƥ1Ԥʤޤ)ϹθƤޤ - -ơ֥Υϥǥå N log N ٤ޤ (B-tree) - -INSERT ®뤤Ĥˡ - -@itemize @bullet -@item -⤷Ʊ饤Ȥ¿Υ쥳ɤƱ˥󥵡Ȥʤ顢 -ʣͤ񤱤 @code{INSERT} ʸѤޤ ϸġ @code{INSERT} ʸ -ȯԤ٤ơȤƤ®ʤޤ -@item -⤷㤦饤Ȥ¿Υ쥳ɤƱ˥󥵡Ȥʤ顢 - @code{INSERT DELAYED} ʸλѤǡ®ʤǤ礦 @xref{INSERT, -, @code{INSERT}}. -@item -@code{MyISAM} Ǥϡʣ @code{SELECT} äƤơ֥Фơ -Ʊˡ쥳ɤǤޤ Υơ֥Ф -쥳ɤκʤˡ -@item -ƥȥե뤫ơ֥˥ǡ򤤤ϡ @code{LOAD DATA INFILE} -Ѥޤ Ϥ @code{INSERT} ʸȯԤ٤̾ 20 -®ʤޤ -@xref{LOAD DATA, , @code{LOAD DATA}}. -@item -ơ֥뤬¿ΥǥåäƤ硢ˡǡ @code{LOAD DATA INFILE} -¹Ԥ®뤳ȤǽǤ -ʲμǹԤޤ - -@enumerate -@item -Optionally create the table with @code{CREATE TABLE}. For example using -@code{mysql} or Perl-DBI. - -@item -@code{FLUSH TABLES} μ¹ԡ 뤤 @code{mysqladmin flush-tables} -ޥɤμ¹ԡ - -@item -@code{myisamchk --keys-used=0 -rq /path/to/db/tbl_name} λѡ -ϻꤵ줿ơ֥뤫ƤΥǥåޤ - -@item -Υơ֥ @code{LOAD DATA INFILE} Ѥƥǡޤ. -Ϥʤ륤ǥå⹹ʤǤ礦Τᡢ®ʤǤ礦 - -@item -⤷ @code{myisampack} 򤪻ǡơ֥򰵽̤ʤ顢 -@code{myisampack} ¹Ԥޤ. @xref{Compressed format}. - -@item -@code{myisamchk -r -q /path/to/db/tbl_name} ǥǥåƹ. - disk ˽񤭹˥ǥå˺ޤ -¿Υǥ򤱤뤳ȤΤǤȤƤ®ʤޤ -Ǥ夬äǥåĥ꡼ϡХ󥹤Τ褤Τˤʤޤ - -@item -@code{FLUSH TABLES} μ¹ԡ 뤤 @code{mysqladmin flush-tables} -ޥɤμ¹ԡ -@end enumerate - -μϡ MySQL @code{LOAD DATA INFILE} Ȥ߹फ⤷ޤ -@item -ơ֥å뤳Ȥǡ®뤳ȤǽǤ - -@example -mysql> LOCK TABLES a WRITE; -mysql> INSERT INTO a VALUES (1,23),(2,34),(4,33); -mysql> INSERT INTO a VALUES (8,26),(6,29); -mysql> UNLOCK TABLES; -@end example - -®ٺϡƤ @code{INSERT} ʸǥǥåХåե٤ǥ˥ -å夵뤳ȤǤ̾ @code{INSERT} ʸΤƱ餤¿Υǥ -Хåեեå夬ޤñ칽ʸƤΥ쥳ɤϡåʤǤޤ - -åʣ³ƥȤι׻֤㤯ޤĤΥåɤκ -Ԥ֤Ͼ夬ޤ(åԤäƤ뤫) -㤨: - -@example -thread 1 does 1000 inserts -thread 2, 3, and 4 does 1 insert -thread 5 does 1000 inserts -@end example - -åѤʤ硢2, 3 4 1 5 ˽ޤå -Ѥ硢2,3,4 1 5 ˽뤳ȤϤ餯ޤ󤬡 -׻֤ 40 % ®ʤޤ - -@code{INSERT}, @code{UPDATE} , @code{DELETE} ϡ @strong{MySQL} ǤϤȤƤ®Τǡ -1 Ԥ 5 İʾ塢ͤ 򤹤Фơ -åɲäСŪˤɤǽޤ -ȤƤ¿ insert Ԥʤ硢 -¾ΥåɤˤΥåơ֥ؤΥͿ뤿 - 1000 쥳ɤȤ˰١@code{UNLOCK TABLES} - @code{LOCK TABLES} Ԥޤ Ǥޤɤǽޤ - - @code{LOAD DATA INFILE} ϤȤƤ®Ǥ -@end itemize - -@code{LOAD DATA INFILE} @code{INSERT} 򶦤®뤿ˤϡ -Хåե䤷ޤ @xref{Server parameters}. - -@node Update speed, Delete speed, Insert speed, Query Speed -@subsection @code{UPDATE} ® - -@code{UPDATE} @code{SELECT} Τ褦˺Ŭޤ -񤭹ߤΥСإåɤäޤ -񤭹®٤ϡǡ礭륤ǥå -ͤޤ ѹʤǥåϹޤ - -Also another way to get fast updates is to delay updates and then do -many updates in a row later. -ʸ¿ιԤС⤷ơ֥뤬åƤС -ʸǰĤŤĹ⡢ȤƤ®ʤޤ - -Note that, with dynamic record format, updating a record to -a longer total length may split the record. So if you do this often -it is very important to @code{OPTIMIZE TABLE} sometimes. -@xref{OPTIMIZE TABLE, , @code{OPTIMIZE TABLE}}. - -@node Delete speed, , Update speed, Query Speed -@subsection @code{DELETE} ® - -1쥳ɤ֤ϡ礦ɥǥåο㤷ޤ -®쥳ɤʤ顢ǥåå -䤷ޤ @xref{Server parameters}. - -ơ֥椫쥳ɤ礭ʬä⡢ -ƤΥ쥳ɤäۤȤƤ®Ǥ - -@node Tips, Benchmarks, Query Speed, Performance -@section Ŭ˴ؤ뤽¾ν - -Unsorted tips for faster systems: - -@itemize @bullet -@item -ͥ󥪡Сإåɤ򤱤뤿ˡǡ١Фơ -༡ͥȤʤ褦ˡ³ݤޤ -If you can't use persistent connections and you are doing a -lot of new connections to the database, you may want to change the value -of the @code{thread_cache_size} variable. @xref{Server parameters}. -@item -ʤΥ꤬ơ֥ΥǥåѤƤ뤫Ĥåޤ -@strong{MySQL} Ǥ @code{EXPLAIN} ޥɤǤ줬Ԥޤ -@xref{EXPLAIN, Explain, Explain, manual}. -@item -ѹ褦ʥơ֥Фơʣ @code{SELECT} -򤱤褦˻ߤޤ ϥơ֥롦å򤱤뤿Ǥ -@item - @code{MyISAM} ơ֥Ǥϡơ֥˥쥳ɤ(̵) -ƤˡƱˡƱơ֥뤫ǡɤळȤǽǤ -줬ʤˤȤäƽ׹ܤǤʤ顢 -쥳ɤκɬפΤʤˡ䡢¿Υ쥳ɤ @code{OPTIMIZE TABLE} -¹Ԥ뤳Ȥ򡢹θ٤Ǥ -@item -In some cases it may make sense to introduce a column that is 'hashed' -based on information from other columns. If this column is short and -reasonably unique it may be much faster than a big index on many -columns. In @strong{MySQL} its very easy to use this extra column: -@code{SELECT * from table where hash='calculated hash on col1 and col2' -and col_1='constant' and col_2='constant' and ..} -@item -¿ѹʤơ֥ФƤϡƤ @code{VARCHAR} @code{BLOB} -եɤ򤱤褦˻ߤ٤Ǥ -You will get dynamic row length as soon as you -are using a single @code{VARCHAR} or @code{BLOB} columns. @xref{Table -types}. -@item -̾ơ֥㤦ơ֥ʬ뤳Ȥϡ쥳ɤ礭ʤ -Ωޤ -쥳ɤ˥ݡΥ쥳ɤκǽΥХȤ򸫤Ĥ뤿 -ǥ֤ޤ -After finding -the data most new disks can read the whole row fast enough for most -applications. The only cases it really matters to split up a table is if -its a dynamic row size table (see above) that you can change to a fixed -row size. Or if you very often need to scan the table and don't need -most of the columns. @xref{Table types}. -@item -⤷¿Υ쥳ɤξ򸵤ˤ׻(ΤΥȤȤ) -ä夦Ԥɬפʤ顢ơ֥Ѱդ༡󥿡 -¿ʬɤǤ礦 -@code{UPDATE table set count=count+1 where index_column=constant} ι -ȤƤ®Ǥ - -ϡ@strong{MySQL} Τ褦ʥơ֥롦å -(multiple readers / single writers)ĥǡ١ -Ȥǡ˽פʤȤǤ -This will -also give better performance with most databases as the row locking -manager in this case will have less to do. -@item -⤷礭ʥơ֥뤫פɬפʤ顢 -ơ֥ˡޥ꡼ơ֥Ѥޤ -Maintaing the summarys should be -much faster than trying to do statistics 'live'. It's much faster to -re-generate new summary tables from the logs when things changes -(depending on business decisions) than to have to change the running -application! -@item -If possible one should classify reports as 'live' or 'statistical', -where data needed for statistical reports are only generated based on -summary tables that are generated from the actual data. -@item -եɤˤϥǥեͤȤѤƲ -ͤǥեȤȤϰ㤦˸¤ꡢͤޤ - @strong{MySQL} ɬפȤʬϤ򾯤ʤ󥵡Ȥ®٤夷ޤ -@item -ǤϡBLOB ˥ǡѥå¸ΤǤ -ξ硢BLOB 줿ͤ ѥåѥå 뤿Υɤ -ʤΥץꥱȤ߹ޤʤƤϤʤޤ -ϡ¿ΥǤ礦 -ϡŪ(Ĺ)ơ֥빽¤ŬʤǡäƤ -Ѥˤʤޤ -@item -̾ʤƤΥǡĹ̵褦(ǡ١ -裳 , 3rd Normal Form , 3NF ȸƤФ) -褦Ȥ뤫⤷ޤ󤬡ꥹԡɤϡ -ʣ䥵ޥ꡼ơ֥κ򤪤ƤϤޤ -@item -ȥɡץ UDF (桼ؿ) Ϥѥեޥ󥹤 -ˤϤ褤ˡ⤷ޤ -In this case you should however always have a way -to do this some other (slower) way if you use some database that doesn't -support this. -@item -You can always gain something by caching queries/answers in your -application and trying to do many inserts/updates at the same time. If -your database supports lock tables (like @strong{MySQL} and Oracle), -this should help to ensure that the index cache is only flushed once -after all updates. -@item -ǡ򤹤ˤϽɬפʤȤ@code{INSERT /*! DELAYED */} Ѥޤ -ϡΥǥؤν񤭹ߤǡ¿Υ쥳ɤΤǡ -®ʤޤ -@item -SELECT פʾ硢@code{INSERT /*! LOW_PRIORITY */} Ѥޤ -@item -塼̵뤷 SELECT ͥŪ˹ԤȤ -@code{SELECT /*! HIGH_PRIORITY */} Ѥޤ -ϡȤï񤭹ߤԤäƤȤƤ⡢ SELECT -¹Ԥޤ -@item -ʣ @code{INSERT} ʸλѡ ¿Υ쥳ɤĤ SQL ޥɤ -뤳Ȥޤ -(¿ SQL С򥵥ݡȤƤޤ) -@item -礭ʥǡɤ߹ߤˤ @code{LOAD DATA INFILE} Ѥޤ -This if -faster than normal inserts and will be even faster when @code{myisamchk} -is integrated in @code{mysqld}. -@item -դͤ뤿ˡ @code{AUTO_INCREMENT} Ѥޤ -@item -ưŪơ֥եޥåȤλѻˤϡե饰ơ򤱤뤿ˡ -@code{OPTIMIZE TABLE} Ѥޤ -@xref{OPTIMIZE TABLE, , @code{OPTIMIZE TABLE}}. - -@item -ǽʤ @code{HEAP} ơ֥򥹥ԡɥåפΤ˻Ѥޤ. @xref{Table -types}. -@item -̾ Web СʤС᡼ϥե¸٤Ǥ -ǡ١ˤϡեλ(ѥȤ)Τߤޤ -μͳϡ̾ Web Сϥǡ١⥳ƥĤ -褯å夷Ƥ뤫Ǥ ǥեѤʤ顢 -®ƥñ뤳ȤǤޤ -@item -פǤʤǡǡ褯ʪϡơ֥ˤޤ -(like -information about the last shown banner for users that doesn't have -cookies) -@item -Columns with identical information in different tables should be -declared identical and have identical names. Before version 3.23 you -got slow joins otherwise. - -̾ñˤƤcustomer ơ֥Ǥ @code{customer_name} - @code{name} ȤȤˡ ¾ SQL Сؤΰܿθʤ顢 -̾ 18 ʸû٤Ǥ -@item -⤷˥ϥԡɤɬפʤ顢SQL СݡȤƤʪȤ -㤦٥Υǡ¸Υ󥿡եܤ٤Ǥ -㤨С @strong{MySQL} @code{MyISAM} ľܥ뤳Ȥϡ -SQL 󥿡ե𤷤ƥ⡢25®ʤǤ礦 -ǽˤˤϡΥǡϡץꥱƱޥˤʤƤϤʤ餺 -̾ĤΥץǥ٤Ǥ -(ʤʤ顢եåϡȤƤ٤) -ϡ@strong{MySQL} С @code{MyISAM} Υ٥Υޥɤ -ƳDzǤǤ礦 (Ϥ褤ѥեޥ󥹤뤳Ȥν롢 -ñˡΰĤǤ) By carefully designing the database interface -it should be quite easy to support this types of optimisations. -@item -¿ξ硢ǡ١ǡ򥢥(³ݻƤ) -ƥȥե뤫ǡ򥢥®Ǥ ʤʤ顢 -ǡ١ϥƥȥե⥳ѥȤˤʤʿͥǡξˡ -Τᡢǥʤʤ뤫Ǥ -ޤԤܤ򸫤Ĥ뤿ˡƥȥեϤɬפʤޤ -@item -ʣ⥹ԡɥåפ˻ѤǤǤ礦 @xref{Replication}. -@item -@code{DELAY_KEY_WRITE=1} 줿ơ֥ϡǥåι®ʤޤ -ϤΥǥåե뤬Ĥޤǥǥ˵ϿʤǤ -äơʤˤ @code{mysqld} 򥭥뤷Ƥơ֥뤬פʤ褦ˤ뤿ᡢ -@code{mysqld} ưˤϡ@code{myisamchk} 򤽤Υơ֥ФƼ¹Ԥ٤Ǥ -As the key information can always be generated -from the data you should not lose anything by using @code{DELAY_KEY_WRITE}. -@end itemize - -@node Benchmarks, Design, Tips, Performance -@section Using your own benchmarks - -You should definately benchmark your application and database to find -out where the bottlenecks are. By fixing it (or by replacing the -bottleneck with a 'dummy module') you can then easily identify the next -bottleneck (and so on). Even if the overall performance for your -application is sufficient you should at least make a plan for each -bottleneck, and decide how to solve it if someday you really need the -extra performance. - -For an example of portable benchmark programs look at the @strong{MySQL} -benchmark suite. @xref{MySQL Benchmarks, , @strong{MySQL} Benchmarks}. You -can take any program from this suite and modify it for your needs. By doing this, -you can try different solutions to your problem and test which is really the -fastest solution for you. - -It is very common that some problems only occur when the system is very -heavily loaded. We have had many customers who contact us when they -have a (tested) system in production and have encountered load problems. In -every one of these cases so far it has been problems with basic design -(table scans are NOT good at high load) or OS/Library issues. Most of -this would be a @strong{LOT} easier to fix if the systems were not -already in production. - -To avoid problems like this you should put some effort into benchmarking -your whole application under the worst possible load! You can use Sasha's -recent hack for this - -@uref{http://www.mysql.com/Contrib/mysql-bench-0.6.tar.gz, mysql-super-smack}. -As the name suggests, it can bring your system down to its knees if you ask it, -so make sure to use it only on your developement systems. - -@node Design, Design Limitations, Benchmarks, Performance -@section Design choices - -@code{MySQL} ϡ쥳ɤΥǡȥǥå̤Υե¸ޤ -¾¿(ۤȤ)ǡ١ǤϡƱե˥ǡȥǥå -ߤ¸ޤ 桹ϡǶΥƥˤϡ@strong{MySQL} -ɤȿƤޤ - -Another way to store the row data is to keep the information for each -column in a separate area (examples are SDBM and Focus). This will cause a -performance hit for every query that accesses more than one column. Because -this degenerates so quickly when more than one column is accessed, -we believe that this model is not good for general purpose databases. - -The more common case is that the index and data are stored together -(like in Oracle/Sybase et al). In this case you will find the row -information at the leaf page of the index. The good thing with this -layout is that it, in many cases, depending on how well the index is -cached, saves a disk read. The bad things with this layout is: - -@table @bullet -@item -Table scanning is much slower because you have to read through the indexes -to get at the data. -@item -You lose a lot of space as you must duplicate indexes from the nodes -(as you can't store the row in the nodes). -@item -Deletes will degenerate the table over time (as indexes in nodes are -usually not updated on delete). -@item -You can't use only the index table to retrieve data for a query. -@item -The index data is harder to cache. -@end table - -@node Design Limitations, Portability, Design, Performance -@section MySQL design limitations/tradeoffs - -Because @strong{MySQL} uses extremely fast table locking (multiple readers / -single writers) the biggest remaining problem is a mix of a steady stream of -inserts and slow selects on the same table. - -We belive that for a huge number of systems the extremely fast -performance in other cases make this choice a win. This case is usually -also possible to solve by having multiple copies of the table, but it -takes more effort and hardware. - -We are also working on some extensions to solve this problem for some -common application niches. - -@node Portability, Internal use, Design Limitations, Performance -@section Portability - -Because all SQL servers implement different parts of SQL, it takes work to -write portable SQL applications. For very simple selects/inserts it is -very easy but the more you need the harder it gets. If you want an -application that is fast with many databases it becomes even harder! - -To make a complex application portable you need to choose a number of -SQL servers that it should work with. - -You can use the @strong{MySQL} crash-me program/web-page -@uref{http://www.mysql.com/crash-me-choose.htmy} to find functions, -types and limits you can use with a selection of database -servers. Crash-me now tests far from everything possible but it -is still comprehensive with about 450 things tested. - -For example, you shouldn't have column names longer than 18 characters -if you want to be able to use Informix or DB2. - -Both the @strong{MySQL} benchmarks and crash-me programs are very -database-independent. By taking a look at how we have handled this, you -can get a feeling of what you have to do to write your application -database-independent. The benchmarks themselves can be found in the -@file{sql-bench} directory in the @strong{MySQL} source -distribution. They are written in Perl with DBI database interface -(which solves the access part of the problem). - -See @uref{http://www.mysql.com/benchmark.html} the results from this -benchmark. - -As you can see in these results all databases have some weak points. That -is, they have different design compromises that lead to different -behavior. - -If you strive for database independence you need to get a good feeling -of each SQL server's bottlenecks. @strong{MySQL} is VERY fast in -retrieving and updating things, but will have a problem in mixing slow -readers/writers on the same table. Oracle on the other hand has a big -problem when you try to access rows that you have recently updated -(until they are flushed to disk). Transaction databases in general are -not very good at generating summary tables from log tables as in this -case row locking is almost useless. - -To get your application @emph{really} database-independent you need to define -an easy extendable interface through which you manipulate your data. As -C++ is available on most systems, it makes sense to use a C++ classes -interface to the databases. - -If you use some specific feature for some database (like the -@code{REPLACE} command in @strong{MySQL}), you should code a method for -the other SQL servers to implement the same feature (but slower). With -@strong{MySQL} you can use the @code{/*! */} syntax to add -@strong{MySQL} specific keywords to a query. The code inside -@code{/**/} will be treated as a comment (ignored) by most other SQL -servers. - -If REAL high performance is more important than exactness, like in some -web applications, a possibility is to create an application layer that -caches all results to give you even higher performance. By letting -old results 'expire' after a while you can keep the cache reasonably -fresh. This is quite nice in case of extremely high load, in which case -you can dynamically increase the cache and set the expire timeout higher -until things get back to normal. - -In this case the table creation information should contain information -of the initial size of the cache and how often the table should normally -be refreshed. - -@node Internal use, , Portability, Performance -@section What have we used MySQL for? - -@strong{MySQL} νγȯˤϡ@strong{MySQL} ϲ桹ΤäȤθܵҤ˹礦褦 -ǽޤ ϡĤΥǥξȼ -ΤˡҸˤƤʾʡ˥ǡ갷ޤ - -桹ϡ٤ƤŹ顢ܡʥɼ谷Ρν֤ޤȤޤ -ơŹΥʤˤȤäͭפʾ󡢤Źι𥭥ڡ -Ҥˤɤٱƶڤܤ󶡤뤳Ȥ桹˵Ƥޤ - -ΥǡϡȤƤ礭 (700/ μ갷) -桹ϤθܵҤ󶡤ɬפΤǡ 410ǯʬäƤޤ -桹ϡޡ顢餬ΥǡǤ뿷ݡȤ -¨ˡɥȤ׵ޤ - -桹ϤƤηȤξ򰵽̤ 'transaction' ơ֥ -¸뤳ȤDz褷ޤ -We have a set of simple macros (script) that -generates summary tables grouped by different criteria (product group, -customer id, store ...) from the transaction tables. -ΥݡȤ Web ڡǡϾ perl ץȤưŪ -ޤ perl script Web Page ʬϤSQL ʸ -¹Ԥ̤ޤ -We would have used PHP or mod_perl instead but they were -not available at that time. - -ǡΤˡ桹ϴñʥġ @code{C} Ǥޤ - SQL Υη̤򸵤(̤ˤĤ򤷤) GIF 󶡤ޤ -ưŪ perl ץ(@code{HTML} եʬϤ)¹Ԥޤ - -In most cases a new report can simply be done by copying an existing -script and modifying the SQL query in it. In some cases we will need to -add more fields to an existing summary table or generate a new one, but -this is also quite simple as we keep all transactions tables on disk. -(Currently we have at least 50G of transactions tables and 200G of other -customer data). - -We also let our customers access the summary tables directly with ODBC -so that the advanced users can themselves experiment with the data. - -桹Ϥ Sun Ultra SPARCstation (2x200 Mz) ǰäƤޤ -ʤ⤢ޤ -We recently upgraded one of our servers to a 2 -CPU 400 Mhz UltraSPARC and we are now planning to start handling -transactions on the product level, which would mean a ten-fold increase -of data. We think we can keep up with this by just adding more disk to -our systems. - -We are also experimenting with Intel-Linux to be able to get more CPU -power cheaper. ߡ桹ϥХʥߴΥǡ١եޥåȤäƤ -(new in 3.23) 桹Ϥ򥢥ץꥱΤĤʬ˻ѤϤǤ礦 - -Our initial feelings are that Linux will perform much better on low to -medium load but Solaris will perform better when you start to get a -high load because of extreme disk IO, but we don't yet have anything -conclusive about this. After some discussion with a Linux Kernel -developer this might be a side effect of Linux giving so much resources -to the batch job that the interactive performance gets very low. This -makes the machine feel very slow and unresponsive while big batches are -going. Hopefully this will be better handled in future Linux Kernels. - -@node MySQL Benchmarks, Tools, Performance, Top -@chapter @strong{MySQL} ٥ޡ - -ˤ @strong{MySQL} ٥ޡ( @code{crash-me}) -Ѿβ⤬񤫤ϤǤޤ񤫤Ƥޤ -ߡ٥ޡΥɤȷ̤ϥ @file{sql-bench} ǥ쥯ȥˤޤ -( Web ڡ @uref{http://www.mysql.com/crash-me-choose.htmy} ˤ) - -ʤ SQL Υѥեޥ󥹤ɤΤΤ򡢤ɤʥ桼ФƤ -Τ٥ޡǤ - -Note that this benchmark is single threaded so it measures the minimum -time for the operations. - -For example (run on the same NT 4.0 machine): - -@multitable @columnfractions .6 .2 .2 -@strong{Reading 2000000 rows by index} @tab @strong{Seconds} @tab @strong{Seconds} -@item mysql @tab 367 @tab 249 -@item mysql_odbc @tab 464 -@item db2_odbc @tab 1206 -@item informix_odbc @tab 121126 -@item ms-sql_odbc @tab 1634 -@item oracle_odbc @tab 20800 -@item solid_odbc @tab 877 -@item sybase_odbc @tab 17614 -@end multitable - -@multitable @columnfractions .6 .2 .2 -@strong{Inserting (350768) rows} @tab @strong{Seconds} @tab @strong{Seconds} -@item mysql @tab 381 @tab 206 -@item mysql_odbc @tab 619 -@item db2_odbc @tab 3460 -@item informix_odbc @tab 2692 -@item ms-sql_odbc @tab 4012 -@item oracle_odbc @tab 11291 -@item solid_odbc @tab 1801 -@item sybase_odbc @tab 4802 -@end multitable - -In the above test @strong{MySQL} was run with a 8M index cache. - -Note that Oracle is not included because they asked to be removed. All -Oracle benchmarks has to be passed by Oracle! We believe that makes -Oracle benchmarks @strong{VERY} biased because the above bechmarks are -supposed to show what a standard installation can do for a single -client. - -@code{crash-me} ϡǡ١ݡȤ뵡ǽǽϡ¤ˤĤơ -ºݤ˥餻Ƴǧޤ -㤨СʲΤ褦ʻˤĤĴ٤ޤ - -@itemize @bullet -@item -ݡȤƤܤηϤʤˤ -@item -ݡȤ륤ǥåκ -@item -ɤΤ褦ʴؿΤ -@item -륯礭ϤɤޤǤ -@item -@code{VARCHAR} Ϥɤޤ礭ǤΤ -@end itemize - -@node Tools, Maintenance, MySQL Benchmarks, Top -@chapter @strong{MySQL} 桼ƥƥ - -@menu -* Programs:: ¹ԥե뤬ԤʤȤϡ -* mysql:: ޥɥ饤ġ -* mysqladmin:: Administering a @strong{MySQL} server -* mysqldump:: Dumping the structure and data from @strong{MySQL} databases and tables -* mysqlimport:: Importing data from text files -* mysqlshow:: -* myisampack:: The @strong{MySQL} compressed read-only table generator -@end menu - -@cindex Environment variables -@node Programs, mysql, Tools, Tools -@section ͡ @strong{MySQL} ץγ - -Ф̿ @code{mysqlclient} 饤֥ѤƤƤ -@strong{MySQL} 饤ȤϼδĶѿѤޤ: - -@tindex MYSQL_UNIX_PORT environment variable -@tindex Environment variable, MYSQL_UNIX_PORT -@tindex MYSQL_TCP_PORT environment variable -@tindex Environment variable, MYSQL_TCP_PORT -@tindex MYSQL_PWD environment variable -@tindex Environment variable, MYSQL_PWD -@tindex MYSQL_DEBUG environment variable -@tindex Environment variable, MYSQL_DEBUG -@multitable @columnfractions .25 .75 -@item @strong{Name} @tab @strong{Description} -@item @code{MYSQL_UNIX_PORT} @tab ǥեȤΥå; @code{localhost} ؤ³˻Ѥ -@item @code{MYSQL_TCP_PORT} @tab ǥեȤ TCP/IP ݡ -@item @code{MYSQL_PWD} @tab ǥեȤΥѥ -@item @code{MYSQL_DEBUG} @tab ǥХåץ -@item @code{TMPDIR} @tab tables/files ǥ쥯ȥ -@end multitable - -@code{MYSQL_PWD} λѤϰǤϤޤ -@xref{Connecting}. - -@tindex MYSQL_HISTFILE environment variable -@tindex Environment variable, MYSQL_HISTFILE -@tindex HOME environment variable -@tindex Environment variable, HOME -@cindex History file -@cindex Command line history -@tindex .mysql_history file -@file{mysql} 饤Ȥϡ@code{MYSQL_HISTFILE} Ķѿ -ꤵƤե˥ޥɥ饤񤭽Фޤ -ǥեȤեϡ @file{$HOME/.mysql_history} ǡ@code{$HOME} - @code{HOME} ĶѿͤǤ @xref{Environment variables}. - -Ƥ @strong{MySQL} ץ¿͡ʥץޤ -Υץδˤϥå @code{--help} ѤƤ -@code{mysql --help} Ƥ - -ץեǡƤɸ९饤ȤΥǥեȤΥץ -ѹ뤳ȤǽǤ -@ref{Option files}. - -@strong{MySQL} ץʲ˼ޤ: - -@table @code - -@cindex @code{myisamchk} -@item myisamchk -@strong{MySQL} ơ֥å, Ŭƽޤ -@code{myisamchk} ˤ¿εǽΤǡϳƤƤޤ -@xref{Maintenance}. - -@cindex @code{make_binary_release} -@item make_binary_release -ѥ뤵줿 @strong{MySQL} ΥХʥ꡼ޤ¾ - MySQL 桼ؤΤˡftp @code{ftp.tcx.se} @file{/pub/mysql/Incoming} -뤳ȤǤޤ - -@cindex @code{msql2mysql} -@item msql2mysql -@code{mSQL} ץ @strong{MySQL} Ѵ륷륹ץȡ -ΥǽǤ櫓ǤϤޤ󤬡ѴɤȤͿޤ - -@cindex Scripts -@cindex @code{mysql} -@item mysql -@code{mysql} ϴñ SQL (GNU @code{readline} Ĥ) ǤŪʻѤ -÷䤤碌򥵥ݡȤޤŪ˻ѤȡASCII ơ֥ -Ƿ̤Ϳޤե륿ȤƻѤȡϤϥ֤Ƕڤ -ޤʤϵưΥץ¾ΤΤѹǤޤˡ -ʤϰʲΤ褦˴ñ˥ץȤ¹ԤǤޤ: - -@example -shell> mysql database < script.sql > output.tab -@end example - -饤ȤΥ꤬ʬǤʤȤˤ꤬ϡ -@code{--quick} åѤƤ Ϸ̤ФΤ - @code{mysql_store_result()} @code{mysql_use_result()} -褦 @code{mysql} ˶ޤ - -@cindex @code{mysqlaccess} -@item mysqlaccess -ۥ, 桼ƥǡ١ȹ礻Ǹ¤å뤿Υ -ץȡ - -@cindex @code{mysqladmin} -@item mysqladmin -桼ƥƥǡ١κ/˴reload (桼ɤ -) refresh (ǥؤΥơ֥Υեå, եκƥ -ץ)ФΥСȽȾ־Ϳޤ -@xref{mysqladmin, , @code{mysqladmin}}. - -@cindex @code{mysqlbug} -@item mysqlbug -@strong{MySQL} Хݡȥץȡ -ΥץȤ @strong{MySQL} ᡼󥰥ꥹȤ˥ХݡȤФݡ -˻Ѥޤ - -@cindex @code{mysqld} -@item mysqld -SQL ǡ󡣤Ͼ˼¹ԤƤޤ - -@cindex @code{mysqldump} -@item mysqldump -@strong{MySQL} ǡ١ SQL ơȥȤޤϥ֤Ƕڤ줿 -ȤΥե˥פޤIgor Romanenko ˤäŪ˥ϥ -줿ե꡼ -@xref{mysqldump, , @code{mysqldump}}. - -@cindex @code{mysqlimport} -@item mysqlimport -ĤޤʣΥƥȥե򤽤줾Υơ֥ɤ߹ߤޤ@code{LOAD -DATA INFILE} ǥݡȤƤηѤǤޤ @xref{mysqlimport, , @code{mysqlimport}}. - -@cindex @code{mysqlshow} -@item mysqlshow -ǡ١, ơ֥, ܤƥǥåˤĤƤξɽޤ - -@cindex @code{mysql_install_db} -@item mysql_install_db -@strong{MySQL} ǧơ֥ǥեȤθ¤Ǻޤ̾ - @strong{MySQL} ꡼򿷤ƥ˥󥹥ȡ뤹˰ -¹Ԥޤ - -@cindex @code{replace} -@item replace -@code{msql2mysql} ǻѤХʥꡣեޤɸϾʸ -桼ƥƥץࡣĹʸ˺ǽŬ礹뤿ͭ¾ -֥ޥѤޤʸ򴹤뤿˻ѤǤޤ㤨С -@code{a} @code{b} Ϳ줿եǸ򴹤ޤ: - -@example -shell> replace a b b a -- file1 file2 ... -@end example - -@cindex @code{safe_mysqld} - -@item safe_mysqld -@code{mysqld} ǡ򤤤ĤΰʵǽdzϤޤ顼ˤϺƵư -¹Իեصޤ -@end table - -@cindex Scripts -@cindex @code{mysql} -@node mysql, mysqladmin, Programs, Tools -@section ޥɥ饤ġ롡 @code{mysql} - -@code{mysql} ϥץ SQL shell Ǥ(GNU @code{readline} äƤޤ). -å⡼ɤȡå⡼ɤäƤޤ å⡼ɤǻѤ줿硢 -η̤ ASCII ơ֥ΥեޥåȤͿޤ -å⡼ɤǻѤ줿(㤨Хե륿Ȥ)̤ϥֶڤ -եޥåȤ֤ޤ -(ϥեޥåȤϥޥɥ饤ΥץѹǤޤ) -ʲΤ褦ˤƥץȤ¹ԤǤޤ - -@example -shell> mysql database < script.sql > output.tab -@end example - -⤷饤Ȥǥ꡼­꤬Ф硢@code{--quick} ץ -Ѥޤ @code{mysql} ˡ̥åȤݤˡ -@code{mysql_store_result()} ǤϤʤ @code{mysql_use_result()} -Ѥޤ - -@code{mysql} λѤϤȤƤñǤ -@code{mysql database} @code{mysql --user=user_name --password=your_password d -atabase} Τ褦ˤƤϤޤ -SQL ʸϤʸ @samp{;}, @samp{\g} or @samp{\G} ǽ -return/enter 򲡤ޤ - -@code{mysql} ϰʲΥץ򥵥ݡȤޤ - -@table @code -@item -?, --help -help ɽƽλ -@item -A, --no-auto-rehash -ưϥå򤷤ʤ ơ֥ȥեɤμˤ 'rehash' ѤʤƤ -ʤޤ @code{mysql} εư®ޤ -@item -B, --batch -̤򥿥ֶڤꡢ쥳ɤϣԤǽϤޤ history եϻѤޤ -@item -C, --compress -С饤ȴ֤̿򰵽̤ޤ -@item -#, --debug[=...] -ǥХå ǥեȤ 'd:t:o,/tmp/mysql.trace' -@item -D, --database=.. -Ѥǡ١ @code{my.cnf} ե뤬Ǥ -@item -e, --execute=... -ޥɤ¹Ԥƽλ (Output like with --batch) -@item -E, --vertical -ľ˥쥳ɤϤޤ ΥץꤷƤʤƤ⡢ -SQL ʸ @code{\G} ǽλ硢Ʊ褦˿ľ˽Ϥޤ -@item -f, --force -SQL 顼ȤƤ⡢³ޤ -@item -i, --ignore-space -ؿ̾θˤĤڡ̵뤷ޤ -@item -h, --host=... -ꤷۥȤ³ޤ -@item -H, --html -̤ HTML եޥåȤ֤ޤ -@item -L, --skip-line-numbers -顼εԤֹ񤭤ޤ ϥ顼åޤ̤ -ӤǤ -@item -n, --unbuffered -줾Υ˥Хåեեå夷ޤ -@item -N, --skip-column-names -̤ˡե̾񤭽Фޤ -@item -O, --set-variable var=option -ѿͤ򥻥åȤޤ @code{--help} lists variables -@item -o, --one-database -ǥեȤΥǡ١Τ߹ޤ update ե -Ѥƹ硢¾Υǡ١ι򤱤Ǥ -@item -p[password], --password[=...] -С³ݤΥѥɡ ⤷ѥɤޥɥ饤 -ꤵƤʤä硢tty ǥѥɤ䤤蘆ޤ -@code{-p} Ѥ硢Υץȥѥɤδ֤ˤ -ڡפȤȤդƤ -@item -P --port=... -³˻Ѥ TCP/IP ݡֹ -@item -q, --quick -̤򥭥å夻쥳ɤŤĽϤޤ -Ϥ⤷Ϥߤ硢С٤ޤ -ҥȥեϻѤޤ -@item -r, --raw -׽򤷤ʤͤ񤭽Фޤ @code{--batch} ȤȤ˻Ѥޤ -@item -s, --silent -Žͥ⡼ -@item -S --socket=... -³˻Ѥ åȥե -@item -t --table -ɽηǽϤޤ batch ⡼ɰʳǤΥǥեȤǤ -@item -T, --exit-info -Only used when debugging. --exit-info=0 will print some usage information -one exit. -@item -u, --user=# -桼̾ -@item -U, --safe-updates[=#], --i-am-a-dummy[=#] -Ѥ @code{UPDATE} and @code{DELETE} ΤߤԤޤ -ϸҤޤ Υץ⤷ @code{my.cnf} ˽񤤤Ƥϡ -@code{--safe-updates=0} ǤΥץꥻåȤǤޤ -@item -v, --verbose -Ĺϡ (-v -v -v ɽνϤͿ) -@item -V, --version -Сɽƽλ -@item -w, --wait -⤷³硢ǤʤǡԤäơƻԤޤ -@end table - -⤷ޥɥ饤 'help' Ǥä硢@code{mysql} ϥݡȤ -ޥɤɽޤ - -@example -mysql> help - -MySQL commands: -help (\h) Display this text -? (\h) Synonym for `help' -clear (\c) Clear command -connect (\r) Reconnect to the server. Optional arguments are db and host -edit (\e) Edit command with $EDITOR -exit (\q) Exit mysql. Same as quit -go (\g) Send command to mysql server -ego (\G) Send command to mysql server; Display result vertically -print (\p) Print current command -quit (\q) Quit mysql -rehash (\#) Rebuild completion hash -source (\.) Execute a SQL script file. Takes a file name as an argument -status (\s) Get status information from the server -use (\u) Use another database. Takes database name as argument -@end example - -@code{status} ޥɤϡѤƤ -³ȥСˤĤƤξ򤤤Ĥɽޤ -⤷ @code{--safe-updates} ⡼ɤǻѤƤ硢 @code{status} -ʤΥ˱ƶ @code{mysql} ѿͤɽޤ - -鿴Ԥʵưץ(@strong{MySQL} 3.23.11 Ƴޤ)ϡ -@code{--safe-mode} (뤤 @code{--i-am-a-dummy}) ǡ - @code{DELETE FROM table_name} @code{WHERE} ˺ -¹Ԥ褦ȤΤˤޤ -Υץ󤬻Ѥȡ @code{mysql} ³ @strong{MySQL} С -ʲΤ褦ʥޥɤޤ - -@example -SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#, - SQL_MAX_JOIN_SIZE=#max_join_size#" -@end example - - @code{#select_limit#} @code{#max_join_size#} ѿ - @code{mysql} ޥɤ饻åȲǽǤ -@xref{SET OPTION, @code{SET}}. - -θ̤ϡ - -@itemize bullet -@item -⤷ @code{WHERE} ǥѤƤʤС@code{UPDATE} @code{DELETE} -ϵĤޤ @code{LIMIT} Ѥ @code{UPDATE/DELETE} -¹ԤǤޤ -@example -UPDATE table_name SET not_key_column=# WHERE not_key_column=# LIMIT 1; -@end example -@item -Ƥ¿ʷ̤ϼưŪ @code{#select_limit#} 쥳ɤޤǤޤޤ -@item -ɾ @code{#max_join_size} ʾιԤɬפȤǤ @code{SELECT} -Ǥޤ -@end itemize - -@node mysqladmin, mysqldump, mysql, Tools -@section @strong{MySQL} Сδ( @code{mysqladmin} ) - -ڥ졼¹Ԥ뤿Υ桼ƥƥ󥿥å: - -@example -shell> mysqladmin [OPTIONS] command [command-option] command ... -@end example - -@code{mysqladmin --help} ˤäơץΰˤ뤳ȤǤޤ - -ߤ @code{mysqladmin} ϰʲΥޥɤ򥵥ݡȤޤ - -@multitable @columnfractions .3 .7 -@item create databasename @tab ǡ١κ -@item drop databasename @tab ǡ١ȥơ֥ -@item extended-status @tab Сĥơ -@item flush-hosts @tab å夵ƤۥȤեå塣 -@item flush-logs @tab ƤΥեå -@item flush-tables @tab ƤΥơ֥եå -@item flush-privileges @tab ĥơ֥κɤ߹ (reload Ʊ) -@item kill id,id,... @tab mysql åɤ kill. -@item password new-password @tab Ťѥɤ new-password ѹ -@item ping @tab mysqld Ƥ뤫å -@item processlist @tab ߳ư mysql åɤɽ -@item reload @tab ĥơ֥κɤ߹ -@item refresh @tab ơ֥եå夷եĤƳޤ -@item shutdown @tab С󤵤ޤ -@item slave-start @tab Start slave replication thread -@item slave-stop @tab Stop slave replication thread -@item status @tab Сûơޤ -@item variables @tab ѿɽ -@item version @tab ССޤ -@end multitable - -ƤΥޥɤϡˡʥץեåǾάǽǤ -㤨С - -@example -shell> mysqladmin proc stat -+----+-------+-----------+----+-------------+------+-------+------+ -| Id | User | Host | db | Command | Time | State | Info | -+----+-------+-----------+----+-------------+------+-------+------+ -| 6 | monty | localhost | | Processlist | 0 | | | -+----+-------+-----------+----+-------------+------+-------+------+ -Uptime: 10077 Threads: 1 Questions: 9 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 2 Memory in use: 1092K Max memory used: 1116K -@end example - -@code{mysqladmin status} ޥɤη̤ϡʲιܤޤ: - -@multitable @columnfractions .3 .7 -@item Uptime @tab @strong{MySQL} Сεưÿ -@item Threads @tab ƯΥåɿ (clients) -@item Questions @tab @code{mysqld} ϤƤΥ饤ȤΥ -@item Slow queries @tab @code{long_query_time} ä֤Τäο -@item Opens @tab @code{mysqld} ơ֥ -@item Flush tables @tab @code{flush ...}, @code{refresh} and @code{reload} ޥɤμ¹Բ -@item Open tables @tab ߳Ƥơ֥ο -@item Memory in use @tab mysqld ΥɤˤäľܳƤ줿 (only available when @strong{MySQL} is compiled with --with-debug) -@item Max memory used @tab mysqld ΥɤˤäľܳƤ꡼ (only available when @strong{MySQL} is compiled with --with-debug) -@end multitable - -If you do @code{mysqladmin shutdown} on a socket (in other words, on a -the computer where @code{mysqld} is running), @code{mysqladmin} will -wait until the @code{MySQL} @code{pid-file} is removed to ensure that -the @code{mysqld server} has stopped properly. - -@node mysqldump, mysqlimport, mysqladmin, Tools -@section @strong{MySQL} ǡ١ȥơ֥뤫顢¤ȥǡס( @code{mysqldump} ) - -ǡ١뤤ϡ -Хååס¾SQLСؤΥǡưŪȤǡΤޤȤޤꡢ -פ뤿Υ桼ƥƥ -פϡơ֥κΤ SQL ʸޤߤޤ - -@example -shell> mysqldump [OPTIONS] database [tables] -OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] -OR mysqldump [OPTIONS] --all-databases [OPTIONS] -@end example - -⤷ơ֥ꤻ@code{--databases} @code{--all-databases} -Ѥʤäʤ顢ǡ١ƤΥơ֥뤬פޤ - -@code{mysqldump --help} ˤäơץΰˤ뤳ȤǤޤ - -⤷ @code{mysqldump} @code{--quick} @code{--opt} ʤǼ¹ԤʤС -@code{mysqldump} Ϸ̤ɽˡ̤ƥɤ뤳Ȥ -դƤ -礭ʥǡ١פݤˤʤǤ礦 - -@code{mysqldump} ϰʲΥץ򥵥ݡȤޤ - -@table @code -@item --add-locks -ơ֥Υפ @code{LOCK TABLES} ʸɲä -ơ֥Υ׸ @code{UNLOCK TABLE} ʸɲäޤ -( Ȥ @strong{MySQL} Ȥˤ®ʤޤ ). -@item --add-drop-table -ơ֥ create ʸˡ@code{drop table} ʸɲäޤ -@item -A, --all-databases -Dump all the databases. This will be same as @code{--databases} with all -databases selected. -@item -a, --all -Include all @strong{MySQL} specific create options. -@item --allow-keywords -(ͽ) Ʊ̾ĥեɤκޤ -ϡ줾Υեɤˡơ֥̾դ­ޤ -@item -c, --complete-insert - INSERT ʸ(ե̾񤤤ʸ) Ѥޤ -@item -C, --compress -⤷Сȥ饤Ȥ̤򥵥ݡȤƤʤС -ξԤδ֤ǹԤ̿ư̤ޤ -@item -B, --databases -To dump several databases. Note the difference in usage; In this case -no tables are given. All name arguments are regarded as databasenames. -@code{USE db_name;} will be included in the output before each new database. -@item --delayed -@code{INSERT DELAYED} ޥɤѤƥ쥳ɤ INSERT ޤ -@item -e, --extended-insert -ޥ饤 @code{INSERT} ʸѤޤ(ϤȤݡ -ꥳѥȤ®ʤޤ) -@item -#, --debug[=option_string] -Trace usage of the program (for debugging). -@item --help -Display a help message and exit. -@item --fields-terminated-by=... -@itemx --fields-enclosed-by=... -@itemx --fields-optionally-enclosed-by=... -@itemx --fields-escaped-by=... -@itemx --lines-terminated-by=... -Υץ @code{-T} ȤȤ˻Ѥ졢 -@code{LOAD DATA INFILE} Ʊͤΰ̣ʤޤ -@xref{LOAD DATA, , @code{LOAD DATA}}. -@item -F, --flush-logs -פˡ @strong{MySQL} СΥեեå夷ޤ -@item -f, --force, -פ SQL 顼ȯƤ⡢פ³ޤ -@item -h, --host=.. -ꤵ줿ۥȤ @strong{MySQL} Сפޤ -ǥեȤΥۥȤ @code{localhost}. -@item -l, --lock-tables. -פ򳫻ϤȤƤΥơ֥åޤ The tables are locked with -@code{READ LOCAL} to allow concurrent inserts in the case of @code{MyISAM} -tables. -@item -n, --no-create-db -'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 -ơ֥κ( @code{CREATE TABLE} ʸ) 񤭽Фޤ -@item -d, --no-data -ơ֥Υ쥳ɤ񤭽Фޤ -ϥơ֥ι¤ФȤˤȤƤǤ -@item --opt -@code{--quick --add-drop-table --add-locks --extended-insert --lock-tables} Ʊ. -@strong{MySQL} Сɤ߽Ф֤ûˤƤޤ -@item -pyour_pass, --password[=your_pass] -С³ݤΥѥɤͿޤ -⤷ @samp{=your_pass} ʬͿʤäϡ -@code{mysqldump} ϥѥɤΥץץȤޤ -@item -P port_num, --port=port_num -С³ݤ˻Ѥ TCP/IP ݡֹ档 - ( @code{localhost} ʳΥۥȤؤ³˻Ѥޤ - @code{localhost} ξϡUnix åȤѤޤ) -@item -q, --quick -Хåեˤߤޤstdout ľܽФޤ -@code{mysql_use_result()} 򤳤˻ѤƤޤ -@item -S /path/to/socket, --socket=/path/to/socket -@code{localhost} ³ݤΥåȥեλ (ǥեȤ /tmp/mysql.sock ) -@item --tables -Overrides option --databases (-B). -@item -T, --tab=path-to-some-directory -Ϳ줿ơ֥ˡ -SQL CREATE ʸޤ @code{table_name.sql} ե롢 -ǡޤ @code{table_name.txt} եޤ -@strong{NOTE}: - @code{mysqld} ǡäƤޥ @code{mysqldump} -¹Ԥˤưޤ - @code{.txt} եΥեޥåȤϡ - @code{--fields-xxx} @code{--lines--xxx} ץ˽ޤ -@item -u user_name, --user=user_name -С³ݤ @strong{MySQL} 桼̾ -ǥեȤǤϡUnix Υ̾ˤʤޤ -@item -O var=option, --set-variable var=option -ѿͤ򥻥åȡ ǽѿϸǼޤ -@item -v, --verbose -Ĺ⡼ɡ ץबԤäƤ뤫ɽޤ -@item -V, --version -С򼨤ƽλ -@item -w, --where='where-condition' -򤵤줿쥳ɤΤߤס ȤɬܤǤ - -@example -"--where=user='jimf'" "-wuserid>1" "-wuserid<1" -@end example -@item -O net_buffer_length=#, where # < 24M -When creating multi-row-insert statements (as with option -@code{--extended-insert} or @code{--opt}), @code{mysqldump} will create -rows up to @code{net_buffer_length} length. If you increase this -variable, you should also ensure that the @code{max_allowed_packet} -variable in the @strong{MySQL} server is bigger than the -@code{net_buffer_length}. -@end table - -@code{mysqldump} ̤λѤϥǡ١ΥХååפǤ礦 @xref{Backup}. - -@example -mysqldump --opt database > backup-file.sql -@end example - -¾ @strong{MySQL} Сإǡ١򥳥ԡˤǤ - -@example -mysqldump --opt database | mysql ---host=remote-host -C database -@end example - -It is possible to dump several databases with one command: - -@example -mysqldump --databases database1 [database2 database3...] > my_databases.sql -@end example - -If all the databases are wanted, one can use: - -@example -mysqldump --all-databases > all_databases.sql -@end example - - -@node mysqlimport, mysqlshow, mysqldump, Tools -@section ƥȥե뤫ǡࡡ( @code{mysqlimport} ) - -@code{mysqlimport} ϡ@code{LOAD DATA INFILE} SQL ʸ -ޥɥ饤󥤥󥿡ե󶡤ޤ -@code{mysqlimport} ΥץΤۤȤɤ - @code{LOAD DATA INFILE} ؤƱץбޤ -@xref{LOAD DATA, , @code{LOAD DATA}}. - -@code{mysqlimport} μ¹ԤϰʲΤ褦ˤޤ: - -@example -shell> mysqlimport [options] database textfile1 [textfile2....] -@end example - -@code{mysqlimport} ϡޥɥ饤ΰͿ줿ե̾γĥҤꡢ -ĥҤä̾򡢥եƤơ֥̾Ȥޤ -㤨С@file{patient.txt}, @file{patient.text}, @file{patient} Ȥ -եơ@code{patient} ȤȤ̾Υơ֥˼ޤޤ - -@code{mysqlimport} ϰʲΥץ򥵥ݡȤޤ: - -@table @code -@item -c, --columns=... -This option takes a comma separated list of field names as an argument. -The field list is passed to LOAD DATA INFILE MySQL sql command, which -mysqlimport calls MySQL to execute. For more information, please see -@code{LOAD DATA INFILE}. @xref{LOAD DATA, , @code{LOAD DATA}}. -@item -C, --compress -饤ȤȥСξ̤򥵥ݡȤƤʤ顢 -饤ȡС֤ǤꤵƤξ򰵽̤ޤ - -@item -#, --debug[=option_string] -ץΥȥ졼(ǥХå) - -@item -d, --delete -ƥȥե˥ơ֥ˤޤ - -@item --fields-terminated-by=... -@itemx --fields-enclosed-by=... -@itemx --fields-optionally-enclosed-by=... -@itemx --fields-escaped-by=... -@itemx --lines-terminated-by=... -Υץϡ@code{LOAD DATA INFILE} бʸƱ̣ˤʤޤ -@xref{LOAD DATA, , @code{LOAD DATA}}. - -@item -f, --force -顼̵뤷ޤ㤨Сƥȥեơ֥뤬ʤ硢 -ĤΥեν˰ܤޤ @code{--force} ʤС -ơ֥뤬ʤ @code{mysqlimport} Ͻλޤ - -@item --help -إפɽƽλ - -@item -h host_name, --host=host_name -̾ꤵ줿 @strong{MySQL} С˥ǡޤ -ǥեȤǤ @code{localhost}. - -@item -i, --ignore -@code{--replace} ץ򸫤Ƥ - -@item -l, --lock-tables -줾Υƥȥեˡ񤭹ޤ -@strong{Ƥ}ơ֥åޤ -ϳμ¤ˡ٤ƤΥơ֥򥵡оƱޤ - -@item -L, --local -饤Ȥϥեɤߤޤ -ǥեȤǤϡ@code{localhost} ³硢ƥȥե -СˤȲꤵޤ(@code{localhost} ϥǥե) - -@item -pyour_pass, --password[=your_pass] -С³Ȥ˻Ѥѥɡ -⤷ @samp{=your_pass} ΤȤ˥ѥɤ񤫤ʤС -@code{mysqlimport} ϥѥɤΤΥץץȤޤ - -@item -P port_num, --port=port_num -ۥȤ³뤿 TCP/IP ݡֹ档 -( @code{localhost} ۥȤؤ³˻Ѥޤ -@code{localhost} ؤϡUNIX åȤѤޤ) - -@item -r, --replace -@code{--replace} @code{--ignore} ץϡ -ϤƤ쥳ɤΥˡͤ -¸ߤƤ쥳ɤΥˡͤƱ硢 -ϤƤǡμ갷ꤷޤ -⤷ @code{--replace} ꤵƤʤ顢 -ˤ쥳ɤϿɤޤ줿쥳ɤ֤ޤ -⤷ @code{--ignore} ꤵƤʤ顢 -Ϥ줿ʪ̵뤵ޤ -ɤΥץꤷƤʤ硢 -ͤŤʤäƤȥ顼ȯ -ƥȥեλĤʬ̵뤵ޤ - -@item -s, --silent -Žͥ⡼ɡ顼Ϥޤ - -@item -S /path/to/socket, --socket=/path/to/socket -@code{localhost} ؤ³˻Ѥ륽åȥեꤷޤ - -@item -u user_name, --user=user_name -С³˻Ѥ @strong{MySQL} 桼̾λꡣ -ǥեȤϡUnix Υ̾ - -@item -v, --verbose -Ĺ⡼ɡץबƤˤĤ¿Ϥޤ - -@item -V, --version -Сɽƽλ -@end table - -Here follows a sample run of using @code{mysqlimport}: - -@example -$ mysql --version -mysql Ver 9.33 Distrib 3.22.25, for pc-linux-gnu (i686) -$ uname -a -Linux xxx.com 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown -$ mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test -$ ed -a -100 Max Sydow -101 Count Dracula -. -w imptest.txt -32 -q -$ od -c imptest.txt -0000000 1 0 0 \t M a x S y d o w \n 1 0 -0000020 1 \t C o u n t D r a c u l a \n -0000040 -$ mysqlimport --local test imptest.txt -test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 -$ mysql -e 'SELECT * FROM imptest' test -+------+---------------+ -| id | n | -+------+---------------+ -| 100 | Max Sydow | -| 101 | Count Dracula | -+------+---------------+ -@end example - -@node mysqlshow, myisampack, mysqlimport, Tools -@section Showing databases, tables and columns@code{mysqlshow} - -@code{mysqlshow} can be used to quickly look at which databases exist, -their tables, and the table's columns. - -With the @code{mysql} program you can get the same information with the -@code{SHOW} commands. @xref{SHOW}. - -@code{mysqlshow} is invoked like this: - -@example -shell> mysqlshow [OPTIONS] [database [table [column]]] -@end example - -@itemize @bullet -@item -If no database is given, all matching databases are shown. -@item -If no table is given, all matching tables in database are shown. -@item -If no column is given, all matching columns and column types in table -are shown. -@end itemize - -Note that in newer @strong{MySQL} versions you only see those -database/tables/columns for which you have some privileges. - -If the last argument contains a shell or SQL wildcard (@code{*}, @code{?}, -@code{%} or @code{_}) then only what's matched by the wildcard is shown. -This may cause some confusion when you try to display the columns for a -table with a @code{_} as in this case @code{mysqlshow} only shows you -the table names that matches the pattern. This is easily fixed by -adding an extra @code{%} last on the command line (as a separate -argument). - -@cindex @code{myisampack} -@cindex @code{pack_isam} -@node myisampack, , mysqlshow, Tools -@section @strong{MySQL} ΰ̤줿ɤ߹ѥơ֥른ͥ졼( @code{myisampack} @code{pack_isam} ) - -@code{myisampack} is used to compress MyISAM tables and @code{pack_isam} -is used to compress ISAM tables. Because ISAM tables are deprecated, we -will only discuss @code{myisampack} here. - -@code{myisampack} ϡ -1 @strong{MySQL} 饤󥹰ʾޤ @strong{MySQL} ݡȤʸ -̤ʥ桼ƥƥǤϥХʥۤΤᡢ -ĤΥץåȥեǤͭǤ - -In the following we only talk about @code{myisampack}, but everything -is also true for @code{pack_isam}. - -@code{myisampack} ϥơ֥γƹܤ̡˰̤褦ƯޤŸΤ -ξϡơ֥뤬ץ󤵤줿˥ɤޤޤϡΤ1쥳 -ɤŸɬפ褦ʡġΥ쥳ɤؤΥˤȤƤ -ǽͿޤMSDOS Stacker ѻΤ褦ˡǥ֥å -ʤ礭ޤ -̾@code{myisampack} ϥǡե 4070% ˥ѥåޤ - -@strong{MySQL} ϰ̤줿ơ֥ǥޥå (@code{mmap()}) Ѥޤ -@code{mmap()} Ưʤϡ̾Υեɤ߽񤭤Ѥޤ - - @code{myisampack} ˤ2Ĥ¤ޤ: -@itemize @bullet -@item -ѥå塢ơ֥ɤ߹Ѥˤʤޤ -@item -@code{myisampack} can also pack @code{BLOB} or @code{TEXT} columns. The -older @code{pack_isam} could not do this. -@end itemize - -¤ν TODO ˤޤͥ٤㤤Ǥ - -@code{myisampack} ϰʲΤ褦ˤƵưޤ: - -@example -shell> myisampack [options] filename ... -@end example - -줾Υե̾ϥǥåե(@file{.MYI})̾Ǥ -⤷ǡǥ쥯ȥ˥ȥǥ쥯ȥưƤʤʤ顢 -եΥѥꤷʤƤϤʤޤ@file{.MYI} ĥҤ -ά뤳ȤǽǤ - -@code{myisampack} ϰʲΥץ򥵥ݡȤޤ: - -@table @code -@item -b, --backup -@code{tbl_name.OLD} ȤƥХååפޤ. - -@item -#, --debug=debug_options -ǥХåϡ@code{debug_options} @code{'d:t:o,filename'}. - -@item -f, --force -ե뤬¸ߤƤ褦礭ʤŪ˥ơ֥ -ѥåޤ -@code{myisampack} ϥơ֥򰵽̤Ƥ֡ -ե @file{tbl_name.TMD} Ȥ̾Ǻޤ -⤷ @code{myisampack} kill 硢 @file{.TMD} ե뤬ä -ʤޤ̾@code{myisampack} @file{tbl_name.TMD} ե뤬 -¸ߤϥ顼ǽλޤ @code{--force} Ѥȡ -@code{myisampack} ϤΤ褦ʾǤơ֥ѥåޤ - -@item -?, --help -إץåϤƽλ - -@item -j big_tbl_name, --join=big_tbl_name -ƤΥơ֥򥳥ޥɥ饤ǻꤷ @code{big_tbl_name} Ĥ -ޤȤޤ礵ƤΥơ֥ƱǤʤФʤޤ -(Ʊ̾ƱܷƱǥå) - -@item -p #, --packlength=# -Specify the record length storage size, in bytes. The value should be 1, 2 -or 3. (@code{myisampack} stores all rows with length pointers of 1, 2 or 3 -bytes. In most normal cases, @code{myisampack} can determine the right length -value before it begins packing the file, but it may notice during the packing -process that it could have used a shorter length. In this case, -@code{myisampack} will print a note that the next time you pack the same file, -you could use a shorter record length.) - -@item -s, --silent -Silent mode. Write output only when errors occur. - -@item -t, --test -Don't pack table, only test packing it. - -@item -T dir_name, --tmp_dir=dir_name -Use the named directory as the location in which to write the temporary table. - -@item -v, --verbose -Verbose mode. Write info about progress and packing result. - -@item -V, --version -Display version information and exit. - -@item -w, --wait -Wait and retry if table is in use. -If the @code{mysqld} server was invoked with the @code{--skip-locking} -option, it is not a good idea to invoke @code{myisampack} if the table might -be updated during the packing process. -@end table - -The sequence of commands shown below illustrates a typical table compression -session: - -@example -shell> ls -l station.* --rw-rw-r-- 1 monty my 994128 Apr 17 19:00 station.ISD --rw-rw-r-- 1 monty my 53248 Apr 17 19:00 station.ISM --rw-rw-r-- 1 monty my 994128 Apr 17 19:00 station.MYD --rw-rw-r-- 1 monty my 53248 Apr 17 19:00 station.MYI --rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm - -shell> myisamchk -dvv station - -MyISAM file: station -Isam-version: 2 -Creation time: 1996-03-13 10:08:58 -Recover time: 1997-02-02 3:06:43 -Data records: 1192 Deleted blocks: 0 -Datafile: Parts: 1192 Deleted data: 0 -Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2 -Max datafile length: 54657023 Max keyfile length: 33554431 -Recordlength: 834 -Record format: Fixed length - -table description: -Key Start Len Index Type Root Blocksize Rec/key -1 2 4 unique unsigned long 1024 1024 1 -2 32 30 multip. text 10240 1024 1 - -Field Start Length Type -1 1 1 -2 2 4 -3 6 4 -4 10 1 -5 11 20 -6 31 1 -7 32 30 -8 62 35 -9 97 35 -10 132 35 -11 167 4 -12 171 16 -13 187 35 -14 222 4 -15 226 16 -16 242 20 -17 262 20 -18 282 20 -19 302 30 -20 332 4 -21 336 4 -22 340 1 -23 341 8 -24 349 8 -25 357 8 -26 365 2 -27 367 2 -28 369 4 -29 373 4 -30 377 1 -31 378 2 -32 380 8 -33 388 4 -34 392 4 -35 396 4 -36 400 4 -37 404 1 -38 405 4 -39 409 4 -40 413 4 -41 417 4 -42 421 4 -43 425 4 -44 429 20 -45 449 30 -46 479 1 -47 480 1 -48 481 79 -49 560 79 -50 639 79 -51 718 79 -52 797 8 -53 805 1 -54 806 1 -55 807 20 -56 827 4 -57 831 4 - -shell> myisampack station.MYI -Compressing station.MYI: (1192 records) -- Calculating statistics - -normal: 20 empty-space: 16 empty-zero: 12 empty-fill: 11 -pre-space: 0 end-space: 12 table-lookups: 5 zero: 7 -Original trees: 57 After join: 17 -- Compressing file -87.14% - -shell> ls -l station.* --rw-rw-r-- 1 monty my 127874 Apr 17 19:00 station.ISD --rw-rw-r-- 1 monty my 55296 Apr 17 19:04 station.ISM --rw-rw-r-- 1 monty my 127874 Apr 17 19:00 station.MYD --rw-rw-r-- 1 monty my 55296 Apr 17 19:04 station.MYI --rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm - -shell> myisamchk -dvv station - -MyISAM file: station -Isam-version: 2 -Creation time: 1996-03-13 10:08:58 -Recover time: 1997-04-17 19:04:26 -Data records: 1192 Deleted blocks: 0 -Datafile: Parts: 1192 Deleted data: 0 -Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1 -Max datafile length: 16777215 Max keyfile length: 131071 -Recordlength: 834 -Record format: Compressed - -table description: -Key Start Len Index Type Root Blocksize Rec/key -1 2 4 unique unsigned long 10240 1024 1 -2 32 30 multip. text 54272 1024 1 - -Field Start Length Type Huff tree Bits -1 1 1 constant 1 0 -2 2 4 zerofill(1) 2 9 -3 6 4 no zeros, zerofill(1) 2 9 -4 10 1 3 9 -5 11 20 table-lookup 4 0 -6 31 1 3 9 -7 32 30 no endspace, not_always 5 9 -8 62 35 no endspace, not_always, no empty 6 9 -9 97 35 no empty 7 9 -10 132 35 no endspace, not_always, no empty 6 9 -11 167 4 zerofill(1) 2 9 -12 171 16 no endspace, not_always, no empty 5 9 -13 187 35 no endspace, not_always, no empty 6 9 -14 222 4 zerofill(1) 2 9 -15 226 16 no endspace, not_always, no empty 5 9 -16 242 20 no endspace, not_always 8 9 -17 262 20 no endspace, no empty 8 9 -18 282 20 no endspace, no empty 5 9 -19 302 30 no endspace, no empty 6 9 -20 332 4 always zero 2 9 -21 336 4 always zero 2 9 -22 340 1 3 9 -23 341 8 table-lookup 9 0 -24 349 8 table-lookup 10 0 -25 357 8 always zero 2 9 -26 365 2 2 9 -27 367 2 no zeros, zerofill(1) 2 9 -28 369 4 no zeros, zerofill(1) 2 9 -29 373 4 table-lookup 11 0 -30 377 1 3 9 -31 378 2 no zeros, zerofill(1) 2 9 -32 380 8 no zeros 2 9 -33 388 4 always zero 2 9 -34 392 4 table-lookup 12 0 -35 396 4 no zeros, zerofill(1) 13 9 -36 400 4 no zeros, zerofill(1) 2 9 -37 404 1 2 9 -38 405 4 no zeros 2 9 -39 409 4 always zero 2 9 -40 413 4 no zeros 2 9 -41 417 4 always zero 2 9 -42 421 4 no zeros 2 9 -43 425 4 always zero 2 9 -44 429 20 no empty 3 9 -45 449 30 no empty 3 9 -46 479 1 14 4 -47 480 1 14 4 -48 481 79 no endspace, no empty 15 9 -49 560 79 no empty 2 9 -50 639 79 no empty 2 9 -51 718 79 no endspace 16 9 -52 797 8 no empty 2 9 -53 805 1 17 1 -54 806 1 3 9 -55 807 20 no empty 3 9 -56 827 4 no zeros, zerofill(2) 2 9 -57 831 4 no zeros, zerofill(1) 2 9 -@end example - -The information printed by @code{myisampack} is described below: - -@table @code -@item normal -The number of columns for which no extra packing is used. - -@item empty-space -The number of columns containing -values that are only spaces; these will occupy 1 bit. - -@item empty-zero -The number of columns containing -values that are only binary 0's; these will occupy 1 bit. - -@item empty-fill -The number of integer columns that don't occupy the full byte range of their -type; these are changed to a smaller type (for example, an @code{INTEGER} -column may be changed to @code{MEDIUMINT}). - -@item pre-space -The number of decimal columns that are stored with leading space. In this -case, each value will contain a count for the number of leading spaces. - -@item end-space -The number of columns that have a lot of trailing space. In this case, each -value will contain a count for the number of trailing spaces. - -@item table-lookup -The column had only a small number of different values, and that were -converted to an @code{ENUM} before Huffman compression. - -@item zero -The number of columns for which all values are zero. - -@item Original trees -The initial number of Huffman trees. - -@item After join -The number of distinct Huffman trees left after joining -trees to save some header space. -@end table - -After a table has been compressed, @code{myisamchk -dvv} prints additional -information about each field: - -@table @code -@item Type -The field type may contain the following descriptors: - -@table @code -@item constant -All rows have the same value. - -@item no endspace -Don't store endspace. - -@item no endspace, not_always -Don't store endspace and don't do end space compression for all values. - -@item no endspace, no empty -Don't store endspace. Don't store empty values. - -@item table-lookup -The column was converted to an @code{ENUM}. - -@item zerofill(n) -The most significant @code{n} bytes in the value are always 0 and are not -stored. - -@item no zeros -Don't store zeros. - -@item always zero -0 values are stored in 1 bit. -@end table - -@item Huff tree -The Huffman tree associated with the field. - -@item Bits -The number of bits used in the Huffman tree. -@end table - -After you have run @code{pack_isam}/@code{myisampack} you must run -@code{isamchk}/@code{myisamchk} to recreate the index. At this time you -can also sort the index blocks and create statistics that is needed for -the @strong{MySQL} optimizer to work more efficiently. - -@example -myisamchk -rq --analyze --sort-index table_name.MYI -isamchk -rq --analyze --sort-index table_name.ISM -@end example - -After you have installed the packed table into the @strong{MySQL} database -directory you should do @code{mysqladmin flush-tables} to force @code{mysqld} -to start using the new table. - -@node Maintenance, Adding functions, Tools, Top -@chapter Maintaining a @strong{MySQL} installation - -@menu -* Table maintenance:: Using @code{myisamchk} for table maintenance and crash recovery -* Maintenance regimen:: Setting up a table maintenance regimen -* Table-info:: Getting information about a table -* Crash recovery:: Using @code{myisamchk} for crash recovery -* Log files:: Log file maintenance -@end menu - -@node Table maintenance, Maintenance regimen, Maintenance, Maintenance -@section ơ֥Υƥʥ󥹡å夫νΤ @code{myisamchk} - -Starting with @strong{MySQL} 3.23.13, you can check tables MyISAM with the -@code{CHECK TABLE} command. @xref{CHECK TABLE}. You can repair tables -with the @code{REPAIR TABLE} command. @xref{REPAIR TABLE}. - -MyISAM ơ֥ (@code{.MYI} and @code{.MYD}) θˤ @code{myisamchk} -Ѥޤ -ISAM ơ֥ (@code{.ISM} and @code{.ISD}) θˤ @code{isamchk} -Ѥޤ -@xref{Table types}. - -ʲʸ @code{myisamchk} ˤĤƽҤ٤Ƥޤ@code{isamchk} ˤ⤹٤ -ƤϤޤޤ - -@code{myisamchk} 桼ƥƥϡǡ١Υơ֥ξꡢ -åꡢơ֥νŬ˻Ѥޤ -ʲΥǤϡ @code{myisamchk} εưˡ(ץޤ) -ơ֥ݼ饹塼Τ -@code{myisamchk} οʵǽλȤҤ٤ޤ - -⤷ @code{mysqld} @code{--skip-locking} 餻Ƥʤ顢 -( Linux ʤɡĤΥƥǥǥեȤǤ) -@code{mysqld} ơ֥ѤƤȤʤƱơ֥Ф - @code{myisamchk} dzμ¤˸Ǥޤ󡣤⤷ @code{myisamchk} ˡ - @code{mysqld} ̤ƤΥơ֥򥢥ʤΤμ¤ʤ顢 -ơ֥򸡺 @code{mysqladmin flush-tables} Ԥ٤Ǥ -Ǥʤ硢ơ֥θ @code{mysqld} Ȥ٤Ǥ -⤷ @code{mysqld} ơ֥򹹿 @code{myisamchk} ¹Ԥ硢 -ơ֥뤬ѹ줿ݤΥ˥󥰤ǤǤ礦 - -⤷ @code{--skip-locking} ѤƤʤʤ顢ĤǤ @code{myisamchk} -ѤǤޤ¹ԤƤ֡ƤΥơ֥򹹿륯饤Ȥ -@code{myisamchk} ǤޤԤޤ - -⤷ @code{myisamchk} ơ֥νŬ˻Ѥʤ顢κˡ -@code{mysqld} Υơ֥Ф˻Ѥʤ褦ˤʤ -ʤޤ󡣤 @code{--skip-locking} ѤƤ˵ꤨޤ -⤷ @code{mysqld} 󤵤Ƥʤʤ顢 @code{myisamchk} ¹ˡ - @code{mysqladmin flush-tables} ¹Ԥ٤Ǥ - -ơ֥νȺŬΤˡۤȤɤξ硢 @code{OPTIMIZE TABLES} -ޥɤѤǤޤ @code{myisamchk} ٤ơ -٤Ƴμ¤Ǥ⤢ޤ(fatal errorȯξ) -ȿ̡ˡñǥơ֥Υեå򵤤ˤɬפޤ -@xref{OPTIMIZE TABLE, , @code{OPTIMIZE TABLE}}. - -@menu -* myisamchk syntax:: @code{myisamchk} ưʸ -* myisamchk memory:: @code{myisamchk} -@end menu - -@node myisamchk syntax, myisamchk memory, Table maintenance, Table maintenance -@section @code{myisamchk} ưʸ - -@code{myisamchk} ϰʲΤ褦ˤƵưޤ: - -@example -shell> myisamchk [options] tbl_name -@end example - -@code{options} ˡʤ @code{myisamchk} ˤȤꤷޤ -ϸҤޤ(@code{myisamchk --help} ȼ¹ԤСץΰޤ) -ץ󤬤ʤС @code{myisamchk} ñ˥ơ֥򸡺Ǥ -¿ξ뤤ϡ @code{myisamchk} ˸ιư餻ˤĤƤϡҤޤ - -@code{tbl_name} ϸơ֥̾Ǥ -⤷ɤ㤦ǥ쥯ȥˤǡ١Ф @code{myisamchk} 餻ʤ顢 - @code{myisamchk} ˤϥե뤬ɤˤ뤫狼ʤΤǡ -եΥѥꤷʤФʤޤ -ºݡ @code{myisamchk} ϤʤѤƤե뤬ǡ١Υǥ쥯ȥˤ뤫ɤϹθޤ -ۤξ˥ǡ١ơ֥Υե򥳥ԡΥԡեФ -¹Ԥ뤳ȤǤޤ - -@code{myisamchk} ޥɥ饤ˤϡʣΥơ֥̾Ǥޤ -ޤǥåե̾(@file{.MYI} ΤĤե)Ǥ - @file{*.MYI} ȤСǥ쥯ȥƤΥơ֥뤬Ǥޤ -㤨СߤΥȥǥ쥯ȥ꤬ǡ١ǥ쥯ȥʤС -Υǥ쥯ȥƤΥơ֥ϡʲΤ褦ˤƸǤޤ - -@example -shell> myisamchk *.MYI -@end example - -ǡ١ǥ쥯ȥäƤʤ硢 -ѥꤹ뤳ȤˤƤΥơ֥뤬Ǥޤ - -@example -shell> myisamchk /path/to/database_dir/*.MYI -@end example - -@strong{MySQL} ǡǥ쥯ȥΥѥ˥磻ɥɤѤ뤳Ȥˤꡢ -ǡ١ƤΥơ֥⸡Ǥޤ - -@example -shell> myisamchk /path/to/datadir/*/*.MYI -@end example - -@code{myisamchk} ϰʲΥץޤ: - -@table @code -@item -a, --analyze -ʬ()ʬϤޤ - @strong{MySQL} ΤĤη®ޤ - -@item -#, --debug=debug_options -ǥХåνϡ -@code{debug_options} Ϥ褯 @code{'d:t:o,filename'} Ȥޤ - -@item -d, --description -ơ֥˴ؤ뤤餫ξɽޤ - -@item -e, --extend-check -ơ֥ŰŪ˸ޤ -üʾˤɬפȤޤ -̾ @code{myisamchk} ϡΥץʤƤΥ顼򸫤ĤϤǤ - -@item -f, --force -ŤŪʥե񤭤ޤ -@code{myisamchk} @code{-r} ʤ餻ƥơ֥򸡺ƤȤˡ -@code{-f} ѤʤС -@code{myisamchk} ϥåǥ顼Фơ֥Фơ -ưŪ @code{-r} ȼäơƳޤ - -@item --help -إפɽƽλ - -@item -i, --information -줿ơ֥׾ɽ - -@item -k #, --keys-used=# -@code{-r} ȶ˻Ѥޤ -NISAM ơ֥ϥɥ顼˺ǽ @code{#} ǥå򹹿褦˻ؼޤ -If you are using MyISAM tells which keys to use, where each -binary bit stands for one key (First key is bit 0). -ϥ󥵡Ȥ®ޤ -󥢥ƥ֤ˤʤäǥåϡ@code{myisamchk -r} ѤкƤӥƥ֤ˤʤޤ - -@item -l, --no-symlinks -˥ܥå󥯤ɤޤ -̾@code{myisamchk} ϥܥå󥯤ؤơ֥⽤ޤ - -@item -q, --quick -@code{-r} ȶ˻Ѥ졢᤯Ԥޤ -̾ꥸʥΥǡեϸޤ - @code{-q} ꤹȡŪ˥ꥸʥΥǡեѤޤ - -@item -r, --recover -⡼ɡ -Can fix almost anything except unique keys that aren't unique -(which is a extremely unlikely error with ISAM/MyISAM tables). -If you want to recover a table, this is the option to try first. Only if -myisamchk reports that the table can't be recovered by @code{-r}, you -should then try @code{-o}. (Note that in the unlikely case that @code{-r} -fails, the data file is still intact). - -@item -o, --safe-recover -⡼ɡ -ŤˡѤޤ (reads through all rows in order and updates -all index trees based on the found rows) - @code{-r} ٤Ǥ @code{-r} ʤΤⰷޤ -Normally one should always first repair with -@code{-r} and only if this fails use @code{-o}. - -@item -O var=option, --set-variable var=option -ѿͤޤǽѿϸҤޤ - -@item -s, --silent -Žͥ⡼ɡ -顼ΤߤϤޤ - @code{-s} ꤹ(@code{-ss})@code{myisamchk} -ۤȤɽϤ򤷤ʤʤޤ - -@item -S, --sort-index -ǥå֥åΥȡ -ϡץꥱǤ ``read-next'' ®ޤ - -@item -R index_num, --sort-records=index_num -ǥå˽äƥȡ -ϤʤΥǡ褯֤Υǥåؤ - @code{SELECT}, @code{ORDER BY} ڥ졼®ޤ -(κǽΥȤ٤ʤ뤫⤷ޤ) -ơ֥ΥǥåֹߤĤˤ @code{SHOW INDEX} Ѥޤ - @code{myisamchk} ơ֥Υǥå򸫤ĤΤƱǹԤޤ -ǥåֹ 1 Ϥޤޤ - -@item -u, --unpack -@code{pack_isam} ǥѥå줿ơ֥򥢥ѥåޤ - -@item -U, --update-status -Store in the @file{.MYI} file when the table was checked and if the table was -crashed. This should be used to get full benefit of the @code{--fast} -option, but you shouldn't use this if option if the @code{mysqld} server is -using the table and you are running @code{mysqld} with -@code{--skip-locking}. - -@item -v, --verbose -Ĺ⡼ɡ¿Ϥޤ -@code{-d} @code{-e} ץȶ˻ѤǤޤ -@code{-v} ʣꤹ(@code{-vv}, @code{-vvv})äȽϤ¿ʤޤ - -@item -V, --version -@code{myisamchk} Сɽƽλ - -@item -w, --wait -ơ֥뤬åƤԤޤ -@end table - -@code{--set-variable} (@code{-O}) ץDzǽѿ - -@example -key_buffer_size current value: 16776192 -read_buffer_size current value: 262136 -write_buffer_size current value: 262136 -sort_buffer_size current value: 2097144 -sort_key_blocks current value: 16 -decode_bits current value: 9 -@end example - -@code{key_buffer_size} is only used when you check the table with @code{-e} or -repair it with @code{-o}. -@code{sort_buffer_size} is used when you repair the table with @code{-r}. - -If you want a faster repair, set the above variables to about 1/4 of your -available memory. You can set both variables to big values as only one -of the above buffers will be used at at time. - -@node myisamchk memory, , myisamchk syntax, Table maintenance -@section @code{myisamchk} - -@code{myisamchk} 餹ǥ꡼ʬϽפǤ -@code{myisamchk} @code{-O} ץʾΥϻѤޤ -ȤƤ礭ʥեΤ @code{myisamchk} 򤫤ʤ顢 -꡼ɤ줯餤Ѥ뤫ǽ˷ʤƤϤʤޤ -ǥեȤϸ 3M Ѥޤ礭ͤѤ뤳Ȥǡ -@code{myisamchk} ®ưǤޤ -㤨С32MBytesRAMʤ顢ʲΤ褦˻Ǥޤ -(¾Υץꤷ): - -@example -shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ... -@end example - -@code{-O sort=16M} λѤ¿ξ礪餯ʬǤ礦 - -@code{myisamchk} @code{TMPDIR} ˰եѤޤ -@code{TMPDIR} ե륷ƥؤƤϡñ out of -memory 顼Ǥ礦 -If this happens, set @code{TMPDIR} to point at some directory -with more space and restart @code{myisamchk} - - -@node Maintenance regimen, Table-info, Table maintenance, Maintenance -@section ơ֥ݼ - -꤬ȯޤԤĤꡢŪ˥ơ֥򸡺褤ͤǤ -ݼŪˤϡ@code{myisamchk -s} ǥơ֥򸡺Τ褤Ǥ礦 -@code{-s} ץϥȥ⡼ɤʤΤǡ顼ˤåϤޤ - -@tindex .pid (process ID) file -С򳫻ϤȤ˥ơ֥򸡺Τ褤ͤǤ -㤨С˥ޥ󤬥֡Ȥ줿ʤ顢ƤΥơ֥˴ؤ -αƶʤɬפޤʤ``expected crashed table''Ǥ -֡ȸˤ⤷Ť @file{.pid} ե(ץID) ʤС -24ְѹ줿ơ֥Ф @code{myisamchk} 餻Ƹ褦ˡ -@code{safe_mysqld} ˥ƥȤɲäƤ⹽ޤ -(@file{.pid} ե @code{mysqld} ư˺졢̾、λ˾äޤ -Ȼ @file{.pid} ե뤬¸ߤʤ @code{mysqld} ۾ェλȤ򼨤ޤ) - -ɤƥȤϡ@file{.pid} եκְʹߤѹ줿 -ƤΥơ֥򸡺ƥȤǤ - -̾Υƥ౿ˤơ֥򸡺٤Ǥ -TcX Ǥϡ˰١ @code{cron} Ѥƽפʥơ֥򸡺Ƥޤ -@file{crontab} եˤϰʲΤ褦˵Ҥޤ - -@example -35 0 * * 0 /path/to/myisamchk -s /path/to/datadir/*/*.MYI -@end example - -ϲ줿ơ֥ξϤޤΤǡɬפȤиԤ櫓Ǥ - -ͽ۳λΤDz줿ơ֥(ϡɥΥȥ֥뤬) -2,3ǯ֡ơ֥ϲ줿ȤϤޤ(Ǥ) -Τǡ콵֤˰٤ΥåǤ⽽ʬǤ - -24ְѹ줿ƤΥơ֥Фơ -@code{myisamchk -s} ռ¹Ԥ򴫤ޤ -Сʤϲ桹Ʊ餤 @strong{MySQL} -ꤹ뤳Ȥˤʤޤ - - -@node Table-info, Crash recovery, Maintenance regimen, Maintenance -@section ơ֥ - -ơ֥뤫ܺ/פ뤿ˤϡˡѤޤǤ˾ܺ٤ʾ -򤤤Ĥޤ - -@table @code -@item myisamchk -d tbl_name -@code{myisamchk} ``describe mode'' Ǽ¹Ԥơ֥Ҥޤ -@code{--skip-locking} ꤷ @strong{MySQL} Сư硢 -@code{myisamchk} myisamchk ¹˹줿ơ֥ˤĤƥ顼𤷤ޤ. - @code{myisamchk} describe mode Ǥϥơ֥ѤʤΤǡ -ǡ˲Ϥޤ - -@item myisamchk -d -v tbl_name -@code{myisamchk} Ƥ뤳Ȥ˴ؤ롢¿ξФˤϡ -@code{-v} ĤƾĹ⡼ɤ餻褦ˤޤ - -@item myisamchk -eis tbl_name -ơ֥뤫Ǥפʾ򼨤ޤ -ơ֥ΤɤޤʤФʤʤΤǡ٤Ǥ - -@item myisamchk -eiv tbl_name -@code{-eis} ȻƤ뤬ԤäƤ뤫ɽޤ -@end table - -@code{myisamchk -d} Ϥ: -@example -ISAM file: company.MYI -Data records: 1403698 Deleted blocks: 0 -Recordlength: 226 -Record format: Fixed length - -table description: -Key Start Len Index Type -1 2 8 unique double -2 15 10 multip. text packed stripped -3 219 8 multip. double -4 63 10 multip. text packed stripped -5 167 2 multip. unsigned short -6 177 4 multip. unsigned long -7 155 4 multip. text -8 138 4 multip. unsigned long -9 177 4 multip. unsigned long - 193 1 text -@end example - - -@code{myisamchk -d -v} Ϥ: -@example -ISAM file: company.MYI -Isam-version: 2 -Creation time: 1996-08-28 11:44:22 -Recover time: 1997-01-12 18:35:29 -Data records: 1403698 Deleted blocks: 0 -Datafile: Parts: 1403698 Deleted data: 0 -Datafilepointer (bytes): 3 Keyfile pointer (bytes): 3 -Max datafile length: 3791650815 Max keyfile length: 4294967294 -Recordlength: 226 -Record format: Fixed length - -table description: -Key Start Len Index Type Root Blocksize Rec/key -1 2 8 unique double 15845376 1024 1 -2 15 10 multip. text packed stripped 25062400 1024 2 -3 219 8 multip. double 40907776 1024 73 -4 63 10 multip. text packed stripped 48097280 1024 5 -5 167 2 multip. unsigned short 55200768 1024 4840 -6 177 4 multip. unsigned long 65145856 1024 1346 -7 155 4 multip. text 75090944 1024 4995 -8 138 4 multip. unsigned long 85036032 1024 87 -9 177 4 multip. unsigned long 96481280 1024 178 - 193 1 text -@end example - - -@code{myisamchk -eis} Ϥ: -@example -Checking ISAM file: company.MYI -Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4 -Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4 -Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4 -Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3 -Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3 -Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3 -Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3 -Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3 -Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4 -Total: Keyblocks used: 98% Packed: 17% - -Records: 1403698 M.recordlength: 226 Packed: 0% -Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00 -Recordblocks: 1403698 Deleteblocks: 0 -Recorddata: 317235748 Deleted data: 0 -Lost space: 0 Linkdata: 0 - -User time 1626.51, System time 232.36 -Maximum resident set size 0, Integral resident set size 0 -Non physical pagefaults 0, Physical pagefaults 627, Swaps 0 -Blocks in 0 out 0, Messages in 0 out 0, Signals 0 -Voluntary context switches 639, Involuntary context switches 28966 -@end example - -@code{myisamchk -eiv} Ϥ: -@example -Checking ISAM file: company.MYI -Data records: 1403698 Deleted blocks: 0 -- check file-size -- check delete-chain -index 1: -index 2: -index 3: -index 4: -index 5: -index 6: -index 7: -index 8: -index 9: -No recordlinks -- check index reference -- check data record references index: 1 -Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4 -- check data record references index: 2 -Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4 -- check data record references index: 3 -Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4 -- check data record references index: 4 -Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3 -- check data record references index: 5 -Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3 -- check data record references index: 6 -Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3 -- check data record references index: 7 -Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3 -- check data record references index: 8 -Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3 -- check data record references index: 9 -Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4 -Total: Keyblocks used: 9% Packed: 17% - -- check records and index references -[LOTS OF ROW NUMBERS DELETED] - -Records: 1403698 M.recordlength: 226 Packed: 0% -Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00 -Recordblocks: 1403698 Deleteblocks: 0 -Recorddata: 317235748 Deleted data: 0 -Lost space: 0 Linkdata: 0 - -User time 1639.63, System time 251.61 -Maximum resident set size 0, Integral resident set size 0 -Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0 -Blocks in 4 out 0, Messages in 0 out 0, Signals 0 -Voluntary context switches 10604, Involuntary context switches 122798 -@end example - -ǻѤ줿ơ֥Υǡե륵򤳤˼ޤ: - -@example --rw-rw-r-- 1 monty tcx 317235748 Jan 12 17:30 company.ISD --rw-rw-r-- 1 davida tcx 96482304 Jan 12 18:35 company.ISM --rw-rw-r-- 1 monty tcx 317235748 Jan 12 17:30 company.MYD --rw-rw-r-- 1 davida tcx 96482304 Jan 12 18:35 company.MYI -@end example - -@code{myisamchk} ʲ˼ޤ -``keyfile'' ϥǥåեǤ -``Record'' ``row'' ƱǤ - -@table @code -@item ISAM file -ISAM (index) ե̾ - -@item Isam-version -ISAM ΥС󡣸ߤϾ 2 - -@item Creation time -ǡե뤬줿 - -@item Recover time -ǥå/ǡե뤬Ǹ˺ƹۤ줿 - -@item Data records -쥳/Ԥο - -@item Deleted blocks -ͽ󤵤줿ΰޤäƤ֥å -ΥڡǾˤ뤿˼ʬΥơ֥Ŭ뤳ȤǤޤ -@xref{Optimization}. - -@item Datafile: Parts -ưŪʥ쥳ɷˤĤΥǡ֥å뤫ɽޤ -ʬʤǺŬ줿ơ֥Ǥ @code{Data records} ƱǤ - -@item Deleted data -ƤʤǡΥХȿ -ΥڡǾˤ뤿˼ʬΥơ֥Ŭ뤳ȤǤޤ -@xref{Optimization}. - -@item Datafile pointer -ǡեݥ󥿤礭(Хȿ) 2, 3, 4 ޤ 5 -ȤǤ¿Υơ֥ 2 ХȤǴޤϤޤ -@strong{MySQL} Ǥޤ󡣸ơ֥ǤϤϥ쥳ɥɥ -ǤưŪơ֥ǤϤϥХȥɥ쥹Ǥ - -@item Keyfile pointer -ǡեݥ󥿤ΥХȿ 1, 2 ޤ 3 ХȤǤ -¿Υơ֥ 2 ХȤǴޤ @strong{MySQL} ǤϼưŪ -׻ޤϾ˥֥åɥ쥹Ǥ - -@item Max datafile length -ơ֥Υǡե (@code{.MYD} ե) ǤĹ (Хȿ) - -@item Max keyfile length -ơ֥Υե (@code{.MYI} ե) ǤĹ (Хȿ) - -@item Recordlength -ƥ쥳/ԤѤΰ礭(Хȿ) - -@item Record format -ƥơ֥ιԤķǤ @code{Fixed length} Ѥޤ -¾ͤDzǽʪ@code{}@code{ѥå}ޤ - -@item table description -ơ֥ƤΥΥꥹȡƥˤĤơĤ٥󶡤 -ޤ: - -@table @code -@item Key -Υֹ档 - -@item Start -ΥǥåϤ쥳/ΰ֡ - -@item Len -ǥåĹѥå줿ͤǤϡϾ˹ܤδĹˤʤޤ - -ʸˤƤϡʸιܤƬʬ˥ǥåĤˤʤޤΤǡ -ǥåܤκĹ⤳ͤûʤǤ礦 - -@item Index -@code{unique} or @code{multip.} (multiple). ΥǥåǤ1Ĥͤʣ -¸ߤޤ - -@item Type -Υǥåĥǡ - NISAM ǡǡ -@code{packed}, @code{stripped} @code{empty} ץޤ - -@item Root -롼ȥǥå֥åΥɥ쥹 - -@item Blocksize -ƥǥå֥åΥϥǥեȤǤ 1024 Ǥ -ѹǤޤ - -@item Rec/key -ϥץƥޥˤäƻѤͤǤΥͤȤΥ쥳 -ɿΤ餻ޤˡϾ1ͤޤϥơ֥뤬ɤ -줿(ޤ礭ѹ줿) @code{myisamchk -a} ǹޤ -ʤϥǥեͤ 30 Ϳޤ -@end table - -@item -κǽǤϡ9ܤΥ2ĤʬäޥѡȥǤ - -@item Keyblocks used -Ѥ줿֥åΥѡơΥơ֥ @code{myisamchk} Ǻ -뤿ᡢͤϤȤƤ⤯ʤޤ (ŪʺˤȤƤ᤯ʤޤ) - -@item Packed -@strong{MySQL} ϰ̤ǥΥѥåߤޤ -@code{CHAR}/@code{VARCHAR}/@code{DECIMAL} ǤѤǤޤ̾ -褦ĹʸǤϡϻΰ˸餷ޤλܤǤ4 -Υ10ʸĹǡΰ60%θޤ - -@item Max levels -Υ Btree οĹ礭ʥơ֥Ϲ⤤ͤޤ - -@item Records -ơ֥뤬äƤԿ - -@item M.recordlength -ʿѤιĹơ֥Ǥϡϥ쥳ĹǤ - -@item Packed -@strong{MySQL} ʸκǸ夫ޤˤä󤵤줿 -ѡơ @code{Packed} ϼޤ - -@item Recordspace used -ǡե뤬Ѥ줿ѡơ - -@item Empty space -ǡե뤬ѤƤʤѡơ - -@item Blocks/Record -쥳Υ֥å (i.e., Ҳ쥳ɤι) -ϸơ֥ǤϾ1Ǥͤϲǽʸ - 1.0 αޤޤ줬礭ϡ@code{myisamchk} ǥơ֥֤Ǥޤ -@xref{Optimization}. - -@item Recordblocks -Ѥ줿֥å (links) 귿ǤϤϥ쥳ɿƱǤ - -@item Deleteblocks -줿֥å (links) - -@item Recorddata -ǡեˤºݤΥ桼ǡΥХȿ - -@item Deleted data -ǡեˤ줿(unused)ǡΥХȿ - -@item Lost space -쥳ɤûĹ˹줿硢Ĥΰ褬ޤ -ϤΤ褦ʾüƤιפǤin bytes. - -@item Linkdata -ưŪλѻ֥åϥݥ(47Х)˥󥯤ޤ@code{Linkdata} -Υݥ󥿤ƤιפǤ -@end table - -ơ֥뤬 @code{pack_isam} ǰ̤Ƥʤ顢@code{myisamchk -d} -줾Υơ֥륳˴ؤɲþϤޤ -@ref{myisampack, ,@code{myisampack}}. 򻲾ȤƤ -ξҤΰ̣ޤ - -@node Crash recovery, Log files, Table-info, Maintenance -@section Using @code{myisamchk} for crash recovery - -@strong{MySQL} ǡǼ˻Ѥեϡ -ϰϤˤ錄äƥƥȤޤǡ١Υơ֥뤬 -˲뤫⤷ʤŪޤ: - -@itemize @bullet -@item -@code{mysqld} ץ񤭹ߺ killed 줿 -@item -ͽ̥ԥ塼(㤨Ÿڤ줿) -@item -ϡɥ顼 -@end itemize - -Ǥϡ@strong{MySQL} ΥǡΰˡҤ٤ޤ -⤷ơ֥뤬ˤʤΤǤС -ʤϡͳ򸫤Ĥ褦ߤ٤Ǥ! -@xref{Debugging server}. - -˲ν򤹤硢ɥǡ١Τ줾Υơ֥ @code{tbl_name} ϡ -ǡ١ǥ쥯ȥˤ뻰ĤΥե˰פɡ򤹤 -ȤƤפǤ - -@multitable @columnfractions .2 .8 -@item @strong{File} @tab @strong{Purpose} -@item @file{tbl_name.frm} @tab Table definition (form) file -@item @file{tbl_name.MYD} @tab Data file -@item @file{tbl_name.MYI} @tab Index file -@end multitable - -黰ĤΥե͡ˡ˲ޤ -ξǤ꤬䤹ΤϡǡեȥǥåեǤ - -@code{myisamchk} @file{.MYD} ե(ǡ)Υԡ԰Ԥʤޤ -νκǸˡŤ @file{.MYD} եäե򥪥ꥸʥ̾ѹޤ -⤷ @code{--quick} ץѤʤ顢@code{myisamchk} - @file{.MYD} եΰեޤ󡣤Τꡢ@file{.MYD} ե -Ȳꤷƿǥåեޤ -λ @file{.MYD} եϤޤ -ξ硢@code{myisamchk} ϼư @file{.MYD} եδְ㤤򸡽Ф -ߤΤǡǤ - -@code{myisamchk} @code{--quick} ץꤹ뤳ȤǤޤ -ξ硢@code{myisamchk} ϤĤΥ顼(νʣȤ)ǤߤϤޤ - @file{.MYD} եѹޤ - -̾ν¹Ԥ뤿˥ǥΥڡζ̵˸¤äơ - @code{--quick} ꤬Ωޤ -ξ,ʤ @code{myisamchk} 餻˥Хååפ -ʤȤȤ٤Ǥ - -@menu -* Check:: ơ֥Υ顼åˡ -* Repair:: ơ֥νˡ -* Optimization:: ơ֥κŬ -@end menu - -@cindex Checking tables for errors -@node Check, Repair, Crash recovery, Crash recovery -@subsection ơ֥Υ顼åˡ - -ơ֥åˤ,ʲΥޥɤѤƤ: - -@table @code -@item myisamchk tbl_name -Ϥ٤Ƥθ99.99%򸫤Ĥޤ -줬Ĥ뤳ȤǤʤʪϡǡե˲@strong{}Ǥ -(ˤޤ)⤷ơ֥åʤ顢ץʤ - @code{myisamchk} 餹@code{-s} or @code{--silent} ץĤޤ - -@item myisamchk -m tbl_name -This finds 99.999% of all errors. It checks first all index for errors and -then it reads through all rows. It calculates a checksum for all keys in -the rows and verifies that they checksum matches the checksum for the keys -in the index tree. - -@item myisamchk -e tbl_name -ƤΥǡŰŪ˥åޤ -(@code{-e} ``extended check'' ΰ) -ƤΥˤĤơ餬Ԥǧ뤿ˡ -ɤ߹ߥåԤޤ -ϤΥ礭ʥơ֥Ǥϡ֤ޤ -@code{myisamchk} ̾ǽΥ顼Ĥäǻߤޤޤ -⤷ʤ顢@code{--verbose} (@code{-v}) ץäޤ - @code{myisamchk} 򥨥顼20ĽФޤư³ޤ -̤˻Ѥϡ@code{myisamchk} ǽʬǤ(ơ֥̾ʳΰϰ̵) - -@item myisamchk -e -i tbl_name -ΥޥɤȻƤޤ @code{-i} ץ @code{myisamchk} ˤ餫 -׾Ф褦ˤޤ -@end table - -@node Repair, Optimization, Check, Crash recovery -@subsection ơ֥νˡ - -ơ֥˲Ȥơ꤬ͽǤꡢʲΤ褦ʥ顼Фꤷޤ - -@itemize @bullet -@item -@file{tbl_name.frm} is locked against change -@item -Can't find file @file{tbl_name.MYI} (Errcode: ###) -@item -Got error ### from table handler (Error 135 is an exception in this case) -@item -Unexpected end of file -@item -Record file is crashed -@end itemize - -ξ硢ʤϼʬΥơ֥ʤФʤޤ -@code{myisamchk} ϤۤȤɤ򸫤ĤФޤ - -ϰʲǵҤ4ĤʳƧߤޤ -Ϥˡʤϥǡ١ǥ쥯ȥ @code{cd} -ơ֥եΥѡߥåǧ٤Ǥ -ե @code{mysqld} ¹ԤƤUnix桼ɤ߹߲ǽ -Ǥ褦ˤƤ(ΤΤˤʤ˥եΥɬ) -⤷եѹ򤹤ɬפʤСեؤν񤭹ߵĤɬפǤ - -If you are using @strong{MySQL} 3.23.16 and above you can (and should) use the -@code{CHECK} and @code{REPAIR} commands to check and repair @code{MyISAM} -tables. @xref{CHECK TABLE}. @xref{REPAIR TABLE}. - -The manual section about table maintenence includes the options to -@code{isamchk}/@code{myisamchk}. @xref{Table maintenance}. - -The following section is for the cases where the above command fails or -if you want to use the extended features that isamchk/myisamchk provides. - -If you are going to repair a table from the command line, you must first -take down the @code{mysqld} server. Note that when you do -@code{mysqladmin shutdown} on a remote server, the @code{mysqld} server -will still be alive for a while after @code{mysqladmin} returns until -all queries are stopped and all keys have been flushed to disk. - -@noindent -@strong{Stage 1: ơ֥å} - -@code{myisamchk *.MYI} (֤äƤ褤ʤ @code{myisamchk -e *.MYI}) -¹Ԥޤ -@code{-s} (silent) ץפʾνϤ򤪤ޤ - -If the mysqld server is done you should use the --update option to tell -@code{myisamchk} to mark the table as 'checked'. - -@code{myisamchk} 顼֤ˤơ֥ɬפޤ -ξ硢Stage 2 ؿʤߤޤ - -å˴̯ʥ顼(@code{out of memory} 顼Τ褦) 硢 -뤤 @code{myisamchk} 硢Stage 3 ˿ʤǤ - -@noindent -@strong{Stage 2: ñǰʽ} - -ޤǽ @code{myisamchk -r -q tbl_name} ߤƤ -(@code{-r -q} ``quick recovery mode''ΰ) -ϥǡե˿ʤǥǥåեνߤޤ -⤷ǡե뤬ƤȥǡեǤκ󥯥ݥȤ -ޤǤʤ顢ưƥơ֥ޤ -塢Υơ֥ν˿ʤǤ -ԤϡʲμǻߤƤ - -@enumerate -@item -³˥ǡեХååפƤ - -@item -@code{myisamchk -r tbl_name} Ѥޤ(@code{-r} ``recovery mode''ΰ) -ʥ쥳ɤȺ줿쥳ɤǡե뤫õ -ǥåե(.MYI)ƹۤޤ - -@item -嵭Ԥ硢@code{myisamchk --safe-recover tbl_name} ѤƲ -Safe recovery ⡼ɤϸŤˡѤƽޤ -̤ν⡼ɤǤϹԤʤ򤤤ĤäƤޤ(٤Ǥ) -@end enumerate - -åޤϽˡ­Τ褦̯ʥ顼Ǥ硢ޤ -@code{myisamchk} å夷ϡStage 3 ˿ʤǤ - -@noindent -@strong{Stage 3: 񤷤} - -ǥåե(.MYI)κǽ 16K ֥å˲줿硢 -ޤʾޤ硢ޤϥǥåե뤬ʤˤ -ܽʳФޤ -ξ硢ǥåեեɬפޤ -Τ褦ˤƤ: - -@enumerate -@item -ǡե .MYD եɤ˰ưޤ - -@item -Υǡȥǥåե뤿ˡ -ơ֥ǥץեѤޤ - -@example -shell> mysql db_name -mysql> DELETE FROM tbl_name; -mysql> quit -@end example - -@item -Ťǡե򿷤äǡե˥ԡޤ -(Ťǡե move ƤϤޤ󡨤ʤƬ꤬ޤ) -@end enumerate - -Stage 2 äƤ @code{myisamchk -r -q} ϴưޤ -(̵¥롼פˤϤʤޤ). - -@noindent -@strong{Stage 4: ȤƤ񤷤} - -ϡǥץե(.frm)⥯å夷ˤȯޤ -ȯ뤳ȤϤޤ󡣤ʤʤǥץե -ơ֥뤬줿˽񤫤뤳ȤϤʤǤ - -@enumerate -@item -ǥץեХååפꥹȥơStage 3 äƤ -ǥåեΥꥹȥǤޤ Stage 2 äƤ -Ԥξ硢@code{myisamchk -r} dzϤ٤Ǥ - -@item -ХååפäƤʤƤ⡢ơ֥뤬ɤΤ褦˺줿ΤΤä -С¾Υǡ١˥ơ֥Υԡޤ -ǡեۤɺäǡ١ -ǥץեȥǥåե򡢲줿ǡ١ -ưޤϿǥץեȥǥåե -Ϳ뤳ȤˤʤޤǡեϤΤޤ޻ĤäƤޤ -Stage 2 ˿ʤߡǥåեνԤäƤ -@end enumerate - -@node Optimization, , Repair, Crash recovery -@subsection ơ֥κŬ - -Ҳ줿쥳ɤηȡ -쥳ɤκȹ̵̤ʥڡӽ -Ԥˤϡ⡼(recovery mode) @code{myisamchk} ¹Ԥޤ - -@example -shell> myisamchk -r tbl_name -@end example - -SQL @code{OPTIMIZE TABLE} ǤƱͤ˥ơ֥ŬǤޤ -@code{OPTIMIZE TABLE} ϴñǤ @code{myisamchk} ®Ǥ - - -@code{myisamchk} ˤϡʤơ֥ǽ夵Τ˻Ѥ뤳ȤǤ -¾¿Υץ󤬤ޤ: - -@table @code -@item -S, --sort-index -ǥåĥ꡼֥åΥȡ߽˥Ȥޤ -ϥ(seek)ŬѤơ֥(scan)®ޤ - -@item -R index_num, --sort-records=index_num -ǥåˤ륽ȡϤʤΥǡɤ֤ -ΥǥåѤ @code{SELECT} , @code{ORDER BY} ®ޤ -(ǽˤ¹ԤƥȤȤϻ֤ȤƤ⤫ޤ) -ơ֥Υǥåֹ򸫤Ĥ뤿ˡ @code{SHOW INDEX} Ѥޤ - @code{myisamchk} ԤΤƱͤνǥơ֥Υǥåɽޤ -ǥåֹ 1 鳫Ϥޤ - -@item -a, --analyze -ơ֥Υ֤ʬϡ -Υơ֥뤫쥳ɤݤˡ -(join)Υѥեޥ󥹤夵ޤ -@end table - -For a full description of the option see @ref{myisamchk syntax}. - -@node Log files, , Crash recovery, Maintenance -@section Log file maintenance - -@strong{MySQL} եȤȤ˻Ѥ硢 -ʤϡŤե ࡼ/Хåå - @strong{MySQL} ˿ե˥褦˻ؼȻפȤǤ礦 -@xref{Update log}. - -@code{Redhat} Linux ˤƤϡ@code{mysql-log-rotate} ץȤ -˻ѤǤޤ ⤷ RPM ǥȥӥ塼 @strong{MySQL} -󥹥ȡ뤷ʤ顢ΥץȤϼưǥ󥹥ȡ뤵ƤϤǤ - -¾ΥƥǤϡʬȤûץȤ򥤥󥹥ȡ뤷ޤ -@code{cron} ǥե򰷤褦ˤޤ - -@code{mysqladmin flush-logs} ޥɤ @code{FLUSH LOGS} SQLʸǡ -@strong{MySQL} ˿եѤ뤳Ȥޤ -⤷ʤ @strong{MySQL} 3.21 ѤƤʤ顢 - @code{mysqladmin refresh} ѤʤƤϤʤޤ - -嵭ΥޥɤϡʲΤ褦ưޤ - -@itemize @bullet -@item -⤷̾Υ (@code{--log}) ѤƤʤСΥե -ĤƤƤӳޤ -(@file{mysql.log} ǥեȤΥե). -@item -⤷ (@code{--log-update}) ѤƤʤ顢 -Ĥե򳫤ޤΤ -եˤĤƤֹޤ -@end itemize - -⤷ѤƤʤ顢ʤϡ flush Ǥ褯ơ -λХååפΤŤեưޤ - ⤷̤ΥȤäƤСʤϰʲΤ褦ˤ뤳ȤǤޤ: - -@example -shell> cd mysql-data-directory -shell> mv mysql.log mysql.old -shell> mysqladmin flush-tables -@end example - -Ƥơ@file{mysql.old} Хååפޤ. - -@node Adding functions, Adding procedures, Maintenance, Top -@chapter @strong{MySQL} ؤοؿɲ - -@strong{MySQL}˿ؿɲäˤ2Ĥˡޤ: - -@itemize @bullet -@item 桼ؿ(UDF:user-definable function)󥿥ե̤ƴؿɲäǤޤ -桼ؿϡ@code{CREATE FUNCTION} @code{DROP FUNCTION} ơ -ȥȤѤơưŪɲáޤ -@xref{CREATE FUNCTION, , @code{CREATE FUNCTION}}. - -@item ͥƥ(ӥȥ) @strong{MySQL} ؿȤƴؿɲäǤޤ -ͥƥִؿ @code{mysqld} Ф礵졢Ūͭˤʤޤ -@end itemize - -줾ˡˤϡͭޤ: - -@itemize @bullet -@item -桼ؿ񤯾硢мȤɲä륪֥ȥե򥤥 -ȡ뤹ɬפޤؿ򥵡Ф礹礢Ԥʤɬ -Ϥޤ -@item -UDF Хʥ @strong{MySQL} ۤɲä뤳ȤǤޤͥƥִ -ϥۤѹɬפǤ -@item -@strong{MySQL} ۤ򥢥åץ졼ɤ硢˥󥹥ȡ뤵줿 UDF -λѤ³ǤޤͥƥִؿǤϡåץ졼ɤ٤ѹ򷫤 -֤ɬפޤ -@end itemize - -ؿɲä뤿ˤɤˡѤƤ⡢@code{ABS()} -@code{SOUNDEX()} Τ褦ʥͥƥִؿƱ褦˻Ѥ뤳ȤǤ - - -@menu -* Adding UDF:: 桼ؿɲ -* Adding native function:: ͥƥִؿɲ -@end menu - -@cindex Adding user-definable functions -@cindex User-definable functions, adding -@cindex Functions, user-definable, adding -@node Adding UDF, Adding native function, Adding functions, Adding functions -@section 桼ؿɲ - -@menu -* UDF calling sequences:: UDF calling sequences -* UDF arguments:: Argument processing -* UDF return values:: Return values and error handling -* UDF compiling:: Compiling and installing user-definable functions -@end menu - -UDF ư뤿ˤϡؿ C C++ ǽ񤫤ɬפꡢOS -ưŪǥ󥰤򥵥ݡȤɬפޤ@strong{MySQL} - @file{sql/udf_example.cc} ޤǤơϣĤοؿ -ƤޤUDF θƤӽФˡɤΤ褦ƯϤΥե򻲹ͤˤ -Ƥ - -SQL ơȥȤǻѤ줾δؿˤĤơб C (ޤ -C++) ؿ٤ǤǤϡ̾ ``xxx'' ץؿ̾ -ƻѤƤޤSQL C/C++ ˡ distinquish 뤿ˡ -@code{XXX()} (ʸ) SQL ؿƤӽФɽ路@code{xxx()} (ʸ) - C/C++ ؿƤӽФɽ路ޤ - -@code{XXX()} Υ󥿥ե뤿˽ C/C++ ؿ: - -@table @asis -@item @code{xxx()} (ɬ) -ᥤؿϴؿ̤׻ȤǤSQL C/C++ ؿ -ͷбϼ˼ޤ: - -@multitable @columnfractions .2 .8 -@item @strong{SQL } @tab @strong{C/C++ } -@item @code{STRING} @tab @code{char *} -@item @code{INTEGER} @tab @code{long long} -@item @code{REAL} @tab @code{double} -@end multitable - -@item @code{xxx_init()} (ץ) -@code{xxx()} νؿϼΤ褦˻Ѥޤ: - -@itemize @bullet -@item -@code{XXX()} ΰοΥå -@item -׵ᤵ뷿ɤΥåޤᥤؿƤФ˾ -˰褦 @strong{MySQL} -@item -ᥤؿɬפȤγ -@item -̤κĹλ -@item -(@code{REAL} ؿǤ) κλ -@item -̤ @code{NULL} ˤʤ뤫ɤλ -@end itemize - -@item @code{xxx_deinit()} (ץ) -@code{xxx()} νλؿ(deinitialization function)Ͻؿˤ -ƳƤ줿٤Ǥ -@end table - -SQL ơȥȤ @code{XXX()} ƤӽФȤ@strong{MySQL} ϰ -åƤΤ褦ˡɬפʥåȥåפԤʤ碌뤿ˡ -ؿ @code{xxx_init()} ƤӽФޤ@code{xxx_init()} 顼 -֤硢SQL ơȥȤϥ顼åȶ˰۾ェλᥤ -ؿȽλؿϸƤӽФޤ󡣤ǤʤСᥤؿ -@code{xxx()} ƹ˸ƤӽФޤƤιԤ줿塢λؿ -@code{xxx_deinit()} ɬפݽԤʤˡƤӽФޤ - -ƤδؿϥåɰǤʤƤϤޤ(ᥤؿǤʤ -ؿȽλؿƱͤǤ)ѹ줦륰ХѿŪѿ -Ƥ뤳ȤϵʤȤ̣ޤ ꤬ɬפʾϡ -@code{xxx_init()} dzơ@code{xxx_deinit()} Ǥ٤Ǥ - -@node UDF calling sequences, UDF arguments, Adding UDF, Adding UDF -@subsection UDF ƤӽФ - -ᥤؿϲ˼褦٤ǤͷȰϡ -@code{CREATE FUNCTION} ơȥȤǡSQL ؿ @code{XXX()} -@code{STRING}, @code{INTEGER}, @code{REAL} Τɤ뤫˰¸ -ưۤʤ뤳ȤդƤ: - -@noindent -@code{STRING} ؿǤ: - -@example -char *xxx(UDF_INIT *initid, UDF_ARGS *args, - char *result, unsigned long *length, - char *is_null, char *error); -@end example - -@noindent -@code{INTEGER} ؿǤ: - -@example -long long xxx(UDF_INIT *initid, UDF_ARGS *args, - char *is_null, char *error); -@end example - -@noindent -@code{REAL} ؿǤ: - -@example -double xxx(UDF_INIT *initid, UDF_ARGS *args, - char *is_null, char *error); -@end example - -ȽλؿϼΤ褦ޤ: - -@example -my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message); - -void xxx_deinit(UDF_INIT *initid); -@end example - -@code{initid} ϣĤδؿƤϤޤ @code{UDF_INIT} -¤Τ򼨤ؿ֤Ǿã뤿˻Ѥޤ@code{UDF_INIT} -¤ΤΥФϲ˰ޤؿѹƤΥФ -٤Ǥ(Ф˥ǥեȤѤˤϡ̤ѹΤޤޤˤƤ -) - -@table @code -@item my_bool maybe_null -@code{xxx()} @code{NULL} ֤硢@code{xxx_init()} -@code{maybe_null} @code{1} ꤹ٤ǤǥեͤϡΤ -줫 @code{maybe_null} Ȥ줿硢@code{1} Ǥ - -@item unsigned int decimals -ηǥեͤϥᥤؿϤξκ -(㤨Сؿ @code{1.34}, @code{1.345}, @code{1.3} Ϥ줿硢 -ǥեȤ 3 Ǥ@code{1.345} 3 ξĤǤ) - -@item unsigned int max_length -ʸ̤κĹǥեͤϴؿͷ˰¸ưۤʤޤʸ -ؿǤϡǥեȤϺǤĹĹǤؿǤϡǥե -Ȥ 21 Ǥ¿ؿǤϡǥեȤ 13 @code{initid->decimals} -Ǽ뾮ηäΤǤ(ʹؿǤϡĹȾ -ʸޤߤޤ) - -@item char *ptr -켫ȤŪΤ˴ؿѤǤݥ󥿤Ǥ㤨Сؿϳ -Ƥؿ֤ã뤿ˡ@code{initid->ptr} ѤǤޤ -@code{xxx_init()} ǤϡΥݥ󥿤˳Ƥޤ: - -@example -initid->ptr = allocated_memory; -@end example - -@code{xxx()} @code{xxx_deinit()} Ǥϡ@code{initid->ptr} 򻲾Ȥơ -Ѥޤϲޤ -@end table - -@node UDF arguments, UDF return values, UDF calling sequences, Adding UDF -@subsection - -@code{args} ϼ˼Ф @code{UDF_ARGS} ¤ΤؤΥݥ -Ǥ: - -@table @code -@item unsigned int arg_count -οؿΰοǸƤӽФ뤳ȤԤϡ -ؿǤͤåƤ㤨: - -@example -if (args->arg_count != 2) -@{ - strcpy(message,"XXX() requires two arguments"); - return 1; -@} -@end example - - -@item enum Item_result *arg_type -ηǽʷͤ @code{STRING_RESULT}, @code{INT_RESULT}, -@code{REAL_RESULT} Ǥ - -Ϳ줿Ǥ뤳ȤȡǤʤ票顼֤Ȥμ¤ˤ -뤿ˡؿ @code{arg_type} åƤ㤨 -: - -@example -if (args->arg_type[0] != STRING_RESULT - && args->arg_type[1] != INT_RESULT) -@{ - strcpy(message,"XXX() requires a string and an integer"); - return 1; -@} -@end example - -ؿΰη׵᤹뤿ƤȤơؿѤơ -@code{arg_type} Ǥ뷿Ǥޤ @strong{MySQL} -@code{xxx()} γƸƤӽФˤη˶褦ˤޤ -СǽΣĤΰʸ褦˻ꤹˤϡ -@code{xxx_init()} ǼԤʤäƤ: - -@example -args->arg_type[0] = STRING_RESULT; -args->arg_type[1] = INT_RESULT; -@end example - -@item char **args -@code{args->args} ϡؿƤФΰΰŪˤĤơ -ؿãޤ @code{i} ˤĤơ -@code{args->args[i]} ϰͤΤݥȤޤ(ͤؤ -ˡˤĤƤϸҡ)ˤĤơ@code{args->args[i]} @code{0} -ǤѤɽǡ@code{3}, @code{4*7-2}, -@code{SIN(3.14)} ʤɤǤϹԤԤѹͤ򻲾Ȥ -ɽǡ̾ǸƤӽФؿʤɤǤ - -ᥤؿΤ줾θƤӽФˤĤơ@code{args->args} ϸ߽ -ƤԤϤºݤΰޤǤޤ - -ؿϼΤ褦˰ @code{i} 򻲾ȤǤޤ: - -@itemize @bullet -@item -@code{STRING_RESULT} ΰϡХʥǡޤǤդĹΥǡ -νᡢʸݥ󥿡ĹȤͿޤʸƤ -@code{args->args[i]} ȤͭǡʸĹ @code{args->lengths[i]} -ʸ NULL üȤߤʤ٤ǤϤޤ - -@item -@code{INT_RESULT} ΰˤĤơ@code{args->args[i]} -@code{long long} ͤ˥㥹Ȥɬפޤ: - -@example -long long int_val; -int_val = *((long long*) args->args[i]); -@end example - -@item -@code{REAL_RESULT} ΰˤĤơ@code{args->args[i]} -@code{double} ͤ˥㥹Ȥɬפޤ: - -@example -double real_val; -real_val = *((double*) args->args[i]); -@end example -@end itemize - -@item unsigned long *lengths -ؿǤϡ@code{lengths} ϳưˤĤƤκʸĹ򼨤 -ޤᥤؿγƸƤӽФˤĤƤϡ@code{lengths} ϡ߽ -ƤԤϤǤդʸμºݤĹޤǤޤ -@code{INT_RESULT}, @code{REAL_RESULT} ΰˤĤƤϡ@code{lengths} -ϤޤκĹޤǤޤ(ؿˤĤƤ) -@end table - -@node UDF return values, UDF compiling, UDF arguments, Adding UDF -@subsection ͤȥ顼 - -ؿϡ顼̵ @code{0} 򡢤Ǥʤ @code{1} -֤٤Ǥ顼ȯϡ@code{xxx_init()} NULL ü顼 -å @code{message} ѥ᡼˳Ǽ٤ǤΥå -饤Ȥ֤ޤåХåե @code{MYSQL_ERRMSG_SIZE} -ʸĹǤ80 ʸ꾮ݤĤ褦˻ߤ٤ǤɸŪü -̤˥եåȤ褦ˤǤ - -ᥤؿ @code{xxx()} ֤ͤ @code{long long} @code{double} -ˤĤƤϴؿͤǤʸؿˤĤƤϡ@code{result} -@code{length} ʸ֤ޤ@code{result} ϾʤȤ 255 -ХĹΥХåեǤƤͤĹꤷƤ -: - -@example -memcpy(result, "result string", 13); -*length = 13; -@end example - -ʸؿ̾Ϸ̤ݥȤ֤ͤޤ - -ᥤؿ @code{NULL} ͤͤ򼨤ˤϡ@code{is_null} -@code{1} ꤷƤ: - -@example -*is_null = 1; -@end example - -ᥤؿǥ顼ͤ򼨤ˤϡ@code{error} ѥ᡼ @code{1} -ꤷޤ: - -@example -*error = 1; -@end example - -@code{xxx()} ǤդιԤˤĤ @code{*error} @code{1} ꤹ硢 -ؿͤϸߤιԤˤĤƤȡθ @code{XXX()} ƤӽФ륹ơ -ȤˤäƽǤդιԤˤĤ @code{NULL} Ǥ(@code{xxx()} -³ԤˤĤƤϸƤӽФޤ) @strong{:} 3.22.10 - @strong{MySQL} СǤϡ@code{*error} @code{*is_null} -ξꤹ٤Ǥ: - -@example -*error = 1; -*is_null = 1; -@end example - -@node UDF compiling, , UDF return values, Adding UDF -@subsection 桼ؿΥѥȥ󥹥ȡ - -UDF եϥФưۥȾǥѥ뤵쥤󥹥ȡ -뤵ʤФʤޤ󡣤νϥץ UDF ե -@file{udf_example.cc} ˤĤƼޤ @strong{MySQL} -ۤ˴ޤޤƤޤΥեϼδؿޤߤޤ: - -@itemize @bullet -@item -@code{metaphon()} ʸ metaphon ʸ֤ޤϻˤ -soundex ʸǤ˱ѸѤĴƤޤ -@item -@code{myfunc_double()} ϰʸ ASCII ͤιפĹιפ -ä֤ͤޤ -@item -@code{myfunc_int()} ϰĹιפ֤ޤ -@item -@code{lookup()} ϥۥ̾ IP ֹ֤ޤ -@item -@code{reverse_lookup()} IP ֹΥۥ֤̾ޤδؿʸ -@code{"xxx.xxx.xxx.xxx"} ޤϣĤοͤȤȤ˸ƤФޤ -@end itemize - -ưŪɲǽեϡΤ褦ʲ餫ΥޥɤѤơͭ -ȥեȤƥѥ뤵٤Ǥ: - -@example -shell> gcc -shared -o udf_example.so myfunc.cc -@end example - -@strong{MySQL} ĥ꡼ @file{sql} ǥ쥯ȥǼΥޥɤ -¹Ԥ뤳ȤˤꡢƥΥѥ饪ץñĤ -ȤǤޤ: - -@example -shell> make udf_example.o -@end example - -@code{make} ɽΤ˻ѥ륳ޥɤ¹Ԥ٤Ǥ -᤯ @code{-c} ץơ@code{-o udf_example.so} -ˤĤƤ(ĤΥƥǤϡޥɤ @code{-c} Ĥ -ɬפޤ) - -UDF ޤඦ֥ͭȤ򥳥ѥ뤹ȡ򥤥󥹥ȡ뤷Ƥ -Ȥ @strong{MySQL} Τ餻ɬפޤ@file{udf_example.cc} -ζ֥ͭȤΥѥϡ@file{udf_example.so} Τ褦ʲ -ե̾󶡤ޤ(ºݤ̾ϥץåȥեˤäѤޤ) -Υե @file{/usr/lib} Τ褦 @code{ld} õɤΥǥ쥯 -ȥ˥ԡƤ¿ΥƥǤϡ@code{LD_LIBRARY} ޤ -@code{LD_LIBRARY_PATH} ĶѿꤷơUDF ؿե뤬ǥ -ȥ򼨤ȤǤޤ@code{dlopen} ޥ˥奢ڡϥƥ -Ѥ٤ѿ򶵤Ƥޤ @code{mysql.server} ޤ -@code{safe_mysqld} ꤷ@code{mysqld} Ƶư٤Ǥ - -饤֥꤬󥹥ȡ뤵줿塢@code{mysqld} ˿ؿˤĤƼ -ޥɤΤ٤Ǥ: - -@example -mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "udf_example.so"; -mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME "udf_example.so"; -mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "udf_example.so"; -mysql> CREATE FUNCTION lookup RETURNS STRING SONAME "udf_example.so"; -mysql> CREATE FUNCTION reverse_lookup RETURNS STRING SONAME "udf_example.so"; -@end example - -ؿ @code{DROP FUNCTION} ѤƺǤޤ: - -@example -mysql> DROP FUNCTION metaphon; -mysql> DROP FUNCTION myfunc_double; -mysql> DROP FUNCTION myfunc_int; -mysql> DROP FUNCTION lookup; -mysql> DROP FUNCTION reverse_lookup; -@end example - -@code{CREATE FUNCTION} @code{DROP FUNCTION} ơȥȤ -@code{mysql} ǡ١Υƥơ֥ @code{func} 򹹿ޤ -ؿ̾ͭ饤֥̾ϥơ֥¸ޤ˴ǽ -Τˤϡ@code{mysql} ǡ١ @strong{insert} -@strong{delete} ¤ɬפޤ - -Ƥؿɲä뤿 @code{CREATE FUNCTION} Ѥ٤ -ǤϤޤ󡣴ؿκƥ󥹥ȡ뤬ɬפʾϡ@code{DROP FUNCTION} -Ǥ줫 @code{CREATE FUNCTION} Ǻƥ󥹥ȡ뤹٤ -㤨СؿοСκƥѥ򤷤硢 -@code{mysqld} С뤿ˡԤʤɬפǤ -ǤʤСФϸŤСλѤ³ޤ - -@code{mysqld} @code{--skip-grant-tables} ץǵưʤƤ⡢ -ͭʴؿϥФγ˺ɤ߹ߤޤξ硢UDF -Ф졢UDF ̵ˤʤޤ(ͭʴؿ @code{CREATE FUNCTION} ǥ -ɤƤΤǡ@code{DROP FUNCTION} ǺƤʤΤǤ) - -@cindex Adding native functions -@cindex Native functions, adding -@cindex Functions, native, adding -@node Adding native function, , Adding UDF, Adding functions -@section ͥƥִؿɲ - -ͥƥִؿɲä뤿Υץʲ˼ޤХʥۤ -ϥͥƥִؿɲäǤʤȤդƤץ -@strong{MySQL} ɤѹɬפȤ뤿Ǥ@strong{MySQL} -ۤ鼫ʬǥѥ뤹ɬפޤޤ@strong{MySQL} -¾ΥС˰ܹԤ(㤨СС󤬥꡼줿 -)СǤΥץ򷫤֤ɬפޤ - -ͥƥ @strong{MySQL} ؿɲä뤿ˤϡΥƥåפ˽ -Ƥ: - -@enumerate -@item -@code{sql_functions[]} Ǵؿ̾Ƥ @file{lex.h} ˣ -ɲäƤ -@item -@file{sql_yacc.yy} ˣɲäƤĤϡ@code{yacc} -٤ץץåܥؼޤ(ϥեƬɲä٤ -Ǥ)줫ؿѥ᡼Υѥ᡼ȤȤ -``item'' @code{simple_expr} ѡ§ɲäޤ㤨С줬 -Τ褦ư뤫򸫤ˤϡ@file{sql_yacc.yy} @code{SOUNDEX} -ƤνåƤ -@item -@file{item_func.h} ǡؿͤޤʸΤɤ֤˰¸ -ơ@code{Item_num_func} ޤ @code{Item_str_func} Ѿ륯饹 -Ƥ -@item -@file{item_func.cc} ǡͤޤʸΤɤδؿ뤫˰ -¸ơΰĤɲäƤ: -@example -double Item_func_newname::val() -longlong Item_func_newname::val_int() -String *Item_func_newname::Str(String *str) -@end example -@item -餯δؿ٤Ǥ: -@example -void Item_func_newname::fix_length_and_dec() -@end example -δؿͿ줿˴ŤƾʤȤ @code{max_length} ׻ -٤Ǥ@code{max_length} ϴؿ֤ʸκǤδؿϡ -ᥤؿ @code{NULL} ֤ͤȤʤϡ@code{maybe_null = 0} -ꤹ٤Ǥؿϡ @code{maybe_null} ѿå뤳 -ȤǡؿǤդΰ @code{NULL} ֤뤫ɤåǤ - -@end enumerate - -ƤδؿϥåɰǤɬפޤ - -ʸؿˤĤƤϡΤĤɲøƤबޤ: -@itemize @bullet -@item -@code{String *str} ϡ̤ݻ뤿˻ѤʸХåե -󶡤ޤ -@item -ؿϷ̤ݻʸ֤٤Ǥ -@item -ƤθߤʸؿϡФɬפǤʤ¤ꡢƤ򤱤 -˻ߤƤ -@end itemize - -@node Adding procedures, ODBC, Adding functions, Top -@chapter Adding new procedures to MySQL - -In @strong{MySQL}, you can define a procedure in C++ that can access and -modify the data in a query before it is sent to the client. The modification -can be done on row by row or @code{GROUP BY} level. - -We have created an example procedure in @strong{MySQL} 3.23 to -show you what can be done. - -@menu -* procedure analyse:: Procedure analyse -* Writing a procedure:: Writing a procedure. -@end menu - -@node procedure analyse, Writing a procedure, Adding procedures, Adding procedures -@section Procedure analyse - -@code{analyse([max elements,[max memory]])} - -This procedure is defined in the @file{sql/sql_analyse.cc}. This -examines the result from your query and returns an analysis of the -results. - -@itemize @bullet -@item -@code{max elements} (default 256) is the maximum number of distinct values -@code{analyse} will notice per column. This is used by @code{analyse} to check if -the optimal column type should be of type @code{ENUM}. -@item -@code{max memory} (default 8192) is the maximum memory @code{analyse} should -allocate per column while trying to find all distinct values. -@end itemize - -@example -SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]]) -@end example - -@node Writing a procedure, , procedure analyse, Adding procedures -@section Writing a procedure. - -For the moment, the only documentation for this is the source. :( - -You can find all information about procedures by examining the following files: - -@itemize @bullet -@item @file{sql/sql_analyse.cc} -@item @file{sql/procedure.h} -@item @file{sql/procedure.cc} -@item @file{sql/sql_select.cc} -@end itemize - -@cindex ODBC -@cindex Windows -@cindex MyODBC -@node ODBC, Common programs, Adding procedures, Top -@chapter @strong{MySQL} ODBC Support - -@menu -* Which ODBC OS:: Operating systems supported by @strong{MyODBC} -* ODBC administrator:: How to fill in the various fields in the ODBC administrator program -* ODBC Problems:: How to report problems with @strong{MySQL} ODBC -* MyODBC clients:: Programs known to work with @strong{MyODBC} -* ODBC and last_insert_id:: How to get the value of an @code{AUTO_INCREMENT} column in ODBC -* MyODBC bug report:: Reporting problems with MyODBC -@end menu - -@strong{MySQL} @strong{MyODBC} ץ ODBC ǽ󶡤ޤ - -@node Which ODBC OS, ODBC administrator, ODBC, ODBC -@section Operating systems supported by @strong{MyODBC} - -@strong{MyODBC} 32-bit ODBC (2.50) level 0 driver ǡ -ODBC 줿ץꥱ @strong{MySQL} ³˻Ѥޤ -@strong{MyODBC} ϡWindows95, Windows98, NT ȤۤȤɤ Unix ưޤ - -̾@strong{MyODBC} Windows ޥˤ󥹥ȡ뤷ޤ -ʤΥץब ColdFusion Τ褦˥ǡ١ؤ³ -ODBC Ѥ˸¤ꡢUNIX @strong{MyODBC} ɬפǤ - -@strong{MyODBC} ϥѥ֥åɥᥤǡǿʪϰʲˤޤ -@uref{http://www.mysql.com/download_myodbc.html}. - -ܸʸɤбʪϡ -@uref{http://www.SoftAgency.co.jp/}. - -⤷UNIX @strong{MyODBC} 򥤥󥹥ȡ뤷ʤ顢 @strong{ODBC} -ޥ͡㡼ɬפǤ礦 @strong{MyODBC} UNIX ODBC ޥ͡㡼 -Ǥư뤳ȤΤƤޤ @strong{MySQL} useful links page -@strong{ODBC}-related links ˡĤ뤳ȤǤޤ -@xref{Useful Links}. - -Windows/NT ξ硢@strong{MyODBC} 򥤥󥹥ȡˤΤ褦 -顼ˤʤ뤫⤷ޤ: - -@example -An error occurred while copying C:\WINDOWS\SYSTEM\MFC30.DLL. Restart Windows -and try installing again (before running any applications which use ODBC) -@end example - -The problem in this case is that some other program is using ODBC and -because of how windows is designed, one cannot in this case install new -ODBC drivers with Microsoft's ODBC setup program. :( -褹ˤϡ ǥե⡼ɡǤǥԥ塼Ω夲ľ -(windows ֡ȻˡF8򲡤Ȥǡե⡼ɤ򤬲ǽǤ) -@strong{MyODBC} 򥤥󥹥ȡ뤷ơ֡Ȥޤ - -@itemize @bullet -@item -Windows ޥ󤫤 UNIX ODBC ץꥱѤ³ˤϡ -ޤǽ Windows ޥ @strong{MyODBC} 򥤥󥹥ȡ뤷ʤƤ -ʤޤ -@item -UNIX @strong{MySQL} СФơ桼 Windows ޥ -ĤͿޤ ϡ @code{GRANT} ޥɤDzǽǤ -@xref{GRANT,,@code{GRANT}}. -@item -ODBC DSN ʲΤ褦ˤƺʤƤϤʤޤ - -@itemize @bullet -@item -Windows ޥΥȥѥͥ򳫤 -@item -ODBC ֥륯å -@item -"桼DSN" 򥯥å -@item -"ɲ..." ܥ򥯥å -@item -ǡ β̤顢@strong{MySQL} ӡλܥ򥯥å -@item -TCX @strong{MySQL} Driver Υǥե꤬ޤ -@xref{ODBC administrator}. -@end itemize - -@item -ץꥱưȥѥͥꤷ ODBC DSN Ӥޤ -@end itemize - -MyODBC ̤ˤϡ@strong{MySQL} ³Υץ󤬤Ĥ -Ǥ褦ˤʤäƤޤ -⤷꤬ϡޤ - - -@node ODBC administrator, ODBC Problems, Which ODBC OS, ODBC -@section ODBC ץγƼܤˤϡ - -Windows95 Υ̾εҤˤ3Ĥβǽޤ: - -@itemize @bullet -@item -Ф IP ɥ쥹λ -@item -ե @file{\windows\lmhosts} ؤμξɲ: - -@example -ip hostname -@end example - -㤨С - -@example -194.216.84.21 my -@end example - -@item -DNS Ѥ褦ꤷޤ -@end itemize - -@code{ODBC setup} ˡ: -@example -Windows DSN name: test -Description: This is my test database -MySql Database: test -Server: 194.216.84.21 -User: monty -Password: my_password -Port: -@end example - -@code{Windows DSN name} ܤͤϡʤwindows ODBC setup ˤ -դ̾Ǥ - -ODBC setup ̤ǡ@code{Server}, @code{User}, @code{Password}, @code{Port} - եɤꤹɬפϤޤ -򤹤ȡǥС³ݤˡ -ꤷͤǥեͤȤƻѤޤ -ѻͤѹ륪ץϤޤ - -ݡֹ椬ꤵƤʤʤ顢ǥեȥݡ (@value{default_port}) Ѥޤ - -⤷ץ @code{Read options from C:\my.cnf} ˤ, -@code{client} @code{odbc} 롼פ @file{C:\my.cnf} ե뤫ɤޤޤ -@code{mysql_options()} ǻѤǤƤΥץѲǽǤ -@xref{mysql_options}. - - -@node ODBC Problems, MyODBC clients, ODBC administrator, ODBC -@section @strong{MyODBC}ǤɤΤ褦𤹤٤ - -@strong{MyODBC} ϰʲǥƥȤޤ Access, Admndemo.exe, C++-Builder, -Borland Builder 4, Centura Team Developer (formerly Gupta SQL/Windows), -ColdFusion (on Solaris and NT with svc pack 5), Crystal Reports, -DataJunction, Delphi, ERwin, Excel, iHTML, FileMaker Pro, FoxPro, Notes -4.5/4.6, SBSS, Perl DBD-ODBC, Paradox, Powerbuilder, Powerdesigner 32 -bit, VC++ and Visual Basic. - -@strong{MyODBC} ư¾ΥץꥱˤĤƤΤäƤʤ顢 -@email{myodbc@@lists.mysql.com} ޤǥ᡼򤯤 - -With some programs you may get an error like: -@code{Another user has modifies the record that you have modified}. In most -cases this can be solved by doing one of the following things: - -@itemize @bullet -@item -Add a primary key for the table if there isn't one already. -@item -Add a timestamp column if there isn't one already. -@item -Only use double float fields. Some programs may fails when they comparing -single floats. -@end itemize - -If the above doesn't help, you should do a @code{MyODBC} trace file and -from this try to figure out why things goes wrong. - -@node MyODBC clients, ODBC and last_insert_id, ODBC Problems, ODBC -@section @strong{MyODBC}ư뤳ȤΤƤץ - -¿Υץब @strong{MyODBC} ưޤϲ桹ȤƥȤ -ޤϲͤ¾Υ桼ưȤξڤΤǤ: - -@table @asis -@item @strong{Program} -@strong{Comment} -@item Access -Access ưˤ: -@itemize @bullet -@item -ơ֥˥ץ饤ޥꥭꤷʤФʤޤ -@item -ǽʥơ֥Ƥˡtimestamp ʤФʤޤ -@item -֥եȷ(¿)ѤǤޤAccessǤϥ󥰥եȤӤϼԤޤ -@item -@strong{MySQL} ³ݤϡ'Return matching rows' ץ򥻥åȤޤ -@item -NT Access @code{BLOB} եɤ @code{OLE OBJECTS} ǧޤ -⤷ @code{MEMO} եɤ˻Ѥʤ顢 @code{ALTER TABLE} Ȥäơ -@code{TEXT} ˥եɤѹʤƤϤʤޤ -@item -Access @code{DATE} եɤ򤤤ĤȤޤ -⤷꤬ä硢եɷ @code{DATETIME} ѤƤ -@end itemize -@item -ϡ@strong{MySQL} Ǥʤְä SQL -뤫⤷ޤ ϥΥ˥塼 -@code{"Query|SQLSpecific|Pass-Through"} 򤹤 -ľȤǽǤ -@item Borland Builder 4 -When you start a query you can use the property @code{Active} or use the -method @code{Open}. Note that @code{Active} will start by automatically issue -a @code{SELECT * FROM ...} query that may not be a good thing if your tables -are big! - -@item ColdFusion (On Unix) -The following information is taken from the ColdFusion documentation: - -Use the following information to configure ColdFusion Server for Linux -to use the unixODBC driver with @strong{MyODBC} for @strong{MySQL} data -sources. Allaire has verified that @strong{MyODBC} version 2.50.26 -works with @strong{MySQL} version 3.22.27 and ColdFusion for Linux. (Any -newer version should also work). You can download @strong{MyODBC} at -@uref{http://www.mysql.com/download_myodbc.html} - -ColdFusion 4.5.1 allows you to us the ColdFusion Administrator to add -the @strong{MySQL} data source. However, the driver is not included with -ColdFusion 4.5.1. Before the @strong{MySQL} driver will appear in the ODBC -datasources drop-down list, you must build and copy the @strong{MyODBC} driver -to @file{/opt/coldfusion/lib/libmyodbc.so}. - -@item DataJunction -You have to change it to output @code{VARCHAR} rather than @code{ENUM}, as -it exports the latter in a manner that causes @strong{MySQL} grief. -@item Excel -ưSome tips: -@itemize @bullet -@item -դ꤬硢@code{CONCAT()} ؿѤʸȤ SELECT ƤߤƤ -㤨С -@example -select CONCAT(rise_time), CONCAT(set_time) - from sunrise_sunset; -@end example -ˡʸȤ֤äƤͤExcel97 ǻ֤Ȥư褦ˤ٤Ǥ - - @code{CONCAT()} ŪϡեɤηʸǤ ODBC ޤȤǤ -@code{CONCAT()} ʤСODBC ϥեɤηդȤ狼Τǡ -Excel ٤ϤǤʤʤޤ - - Excel ΥХǤʤʤʸưդľΤǤ顣 -ñ˥ƥȥեξ򰷤ʤФΤǤ -ƹܤηΤ餻 ODBC ³ξ򰷤ϡȤƤ򤫤ˡǤ -@end itemize -@item odbcadmin -ODBC Υƥȥץ. -@item Delphi -DBE 3.2 ʾɬѤƤ -@strong{MySQL} ³ݤˤϡ'Don't optimize column width' ץ򥻥åȤޤ - -ODBCȥBDEȥξ򥻥åȥåפ뤪ΩĤǤ - Delphi Υ򼨤ޤ -( BDE Delphi Super Page ̵ BDE Alias Editor ɬפǤ) -: (Thanks to Bryan Brunton @email{bryan@@flesherfab.com} for this) - -@example -fReg:= TRegistry.Create; - fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True); - fReg.WriteString('Database', 'Documents'); - fReg.WriteString('Description', ' '); - fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll'); - fReg.WriteString('Flag', '1'); - fReg.WriteString('Password', ''); - fReg.WriteString('Port', ' '); - fReg.WriteString('Server', 'xmark'); - fReg.WriteString('User', 'winuser'); - fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True); - fReg.WriteString('DocumentsFab', 'MySQL'); - fReg.CloseKey; - fReg.Free; - - Memo1.Lines.Add('DATABASE NAME='); - Memo1.Lines.Add('USER NAME='); - Memo1.Lines.Add('ODBC DSN=DocumentsFab'); - Memo1.Lines.Add('OPEN MODE=READ/WRITE'); - Memo1.Lines.Add('BATCH COUNT=200'); - Memo1.Lines.Add('LANGDRIVER='); - Memo1.Lines.Add('MAX ROWS=-1'); - Memo1.Lines.Add('SCHEMA CACHE DIR='); - Memo1.Lines.Add('SCHEMA CACHE SIZE=8'); - Memo1.Lines.Add('SCHEMA CACHE TIME=-1'); - Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT'); - Memo1.Lines.Add('SQLQRYMODE='); - Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE'); - Memo1.Lines.Add('ENABLE BCD=FALSE'); - Memo1.Lines.Add('ROWSET SIZE=20'); - Memo1.Lines.Add('BLOBS TO CACHE=64'); - Memo1.Lines.Add('BLOB SIZE=32'); - - AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines); -@end example - -@item C++Builder -BDE 3.0,ƥȤޤͣΤ줿ϡ -ơ֥륹ޤѲեɤʤȤǤ -BDE ϡindex PRIMARY ǧץ饤ޥ꡼ǧƤʤ褦˻פޤϤۤǤϤʤǤ -@item Visual Basic -ơ֥ιǽˤ뤿ᡢơ֥˥ץ饤ޥ꡼ʤƤϤʤޤ - -Visual Basic with ADO can't handle big integers; This means that some queries -like @code{SHOW PROCESSLIST} will not work properly. The fix is to set -add the option @code{OPTION=16834} in the ODBC connect string or set -the @code{Change BIGINT columns to INT} option in the MyODBC connect screen. -@end table - -@node ODBC and last_insert_id, MyODBC bug report, MyODBC clients, ODBC -@section @code{AUTO_INCREMENT} եɤͤ ODBC ˡ - -̤ϡ@code{INSERT} ǼưŪIDͤ뤳ȤǤ -ODBCǤϡʲΤ褦ˤޤ( @code{auto} @code{AUTO_INCREMENT} եɤǤ) - -@example -INSERT INTO foo (auto,text) VALUES(NULL,'text'); -SELECT LAST_INSERT_ID(); -@end example - -⤷ϡ¾Υơ֥IDʤʲΤ褦ˤޤ - -@example -INSERT INTO foo (auto,text) VALUES(NULL,'text'); -INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text'); -@end example - -ĤODBCץꥱ(ʤȤDelphiAccess)ϡ -줿Ԥ򸫤ĤΤˡʲΥ꤬ѤǤޤ -@example -SELECT * FROM tbl_name WHERE auto IS NULL; -@end example - -@node MyODBC bug report, , ODBC and last_insert_id, ODBC -@section Reporting problems with MyODBC - -⤷ @strong{MyODBC} ѻ񤷤ˤä硢 -ODBC ޥ͡Υե (ODBCADMIN ꥯȤȤΥ) - @strong{MyODBC} ΥϤ٤Ǥ -ϤʤˤλˤʤϤǤ -@strong{MyODBC} ˤϡ @strong{MyODBC} connect/configure ̤ - 'Trace MyODBC' ץåޤ - @file{C:\myodbc.log} ˽񤭽Фޤ -ΥץѤꡢ @code{MYSQL2.DLL} ǤϤʤ - @code{MYSQL.DLL} ѤʤƤϤʤޤ - -MyODBC @strong{MySQL} СäƤ륯ǧޤ - @file{myodbc.log} եˡ@code{>mysql_real_query} -ʸ󤬴ޤޤƤԤǤ - -ޤMyODBC @strong{MySQL} Υ顼򸫤Ĥ뤿ˤϡ -Ʊޥɤ@code{mysql} ޥɤ @code{admndemo} Ǥ٤Ǥ - -⤷ȯʤ顢طԤʺ40ԡ @email{myodbc@@lists.mysql.com} -äƤ MyODBC ODBC ΥեƤʤ褦 -Ƥ - -⤷򸫤Ĥ뤳Ȥʤä硢MyODBC ե롢 -ODBC ե롢 README եޤ -(tar zip) ޤ - @uref{ftp://www.mysql.com/pub/mysql/secret}. ޤ -TCX åץɤ줿ե˥Ǥޤ - -⤷򸫤뤿ΥץäƤʤ顢Ʊޤ - -⤷Υץब¾ SQL Сưʤ顢 -¾ SQL СƱȤ򤷤 ODBC ե٤Ǥ - -¿ξ򤢤ʤ󶡤С桹褷䤹ʤ뤳Ȥ -ǰƬˤƤ - -@node Common programs, Problems, ODBC, Top -@chapter ĤΰŪʥץǤ @code{MySQL} λ - -@menu -* Apache:: Apache Ǥ MySQL λ -@end menu - -@node Apache, , Common programs, Common programs -@section Apache Ǥ MySQL λ - -Contrib ˤϡ -@strong{MySQL} ǡ١ϿƤ桼 -ǧڤ褦ˤʤץȡ - @strong{MySQL} ơ֥˽񤭹ץब -ޤޤƤޤ @xref{Contrib}. - -ʲΤ褦 Apache ե˵ҤС -Apache ΥΥեޥåȤ@code{MySQL} ɤߤ䤹ʪѹǤޤ - -@example -LogFormat \ - "\"%h\",%@{%Y%m%d%H%M%S@}t,%>s,\"%b\",\"%@{Content-Type@}o\", \ - \"%U\",\"%@{Referer@}i\",\"%@{User-Agent@}i\"" -@end example - -С@strong{MySQL} ǡʲΤ褦ˤǤޤ - -@example -LOAD DATA INFILE '/local/access_log' INTO TABLE table_name -FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' -@end example - -@node Problems, Common problems, Common programs, Top -@chapter Ȥ褯륨顼 - -@menu -* What is crashing:: How to determinate what is causing problems -* Crashing:: What to do if @strong{MySQL} keeps crashing -* Common errors:: Some common errors when using @strong{MySQL} -* Full disk:: How @strong{MySQL} handles a full disk -* Multiple sql commands:: How to run SQL commands from a text file -* Temporary files:: Where @strong{MySQL} stores temporary files -* Problems with mysql.sock:: How to protect @file{/tmp/mysql.sock} -* Error Access denied:: @code{Access denied} error -* Changing MySQL user :: How to run @strong{MySQL} as a normal user -* Resetting permissions:: How to reset a forgotten password. -* File permissions :: Problems with file permissions -* Not enough file handles:: File not found -* Using DATE:: Problems using @code{DATE} columns -* Timezone problems:: Timezone problems -* Case sensitivity:: Case sensitivity in searches -* Problems with NULL:: Problems with @code{NULL} values -* Problems with alias:: Problems with @code{alias} -* Deleting from related tables:: Deleting rows from related tables -* No matching rows:: Solving problems with no matching rows -* ALTER TABLE problems:: Problems with @code{ALTER TABLE}. -* Change column order:: How to change the order of columns in a table -@end menu - -@menu -* Crashing:: What to do if @strong{MySQL} keeps crashing -@end menu - -@node What is crashing, Crashing, Problems, Problems -@section How to determinate what is causing problems - -When you run into problems, the first thing you should do is to find out -which program / piece of equipment is causing problems. - -@itemize @bullet -@item -If you have one of the following symptoms, then it is probably a hardware -(like memory, motherboard, CPU, or harddisk) or kernel problem: -@itemize @bullet -@item -The keyboard doesn't work. This can normally be checked by pressing -Caps Lock; If the Caps Lock light doesn't change you have to replace -your keyboard. (Before doing this, you should however try to reboot -your computer and check all cables to the keyboard :) -@item -The mouse pointer doesn't move. -@item -The machine doesn't answer to a remote machine's pings. -@item -Different, unrelated programs don't behave correctly. -@item -If your system rebooted unexpectedly (a faulty user level program should -NEVER be able to take down your system). -@end itemize - -In this case you should start by checking all your cables and run some -diagnostic tool to check your hardware! -You should also check if there are any patches, updates or service -packs for your operating system that could likely solve your problems. -Check also that all your libraries (like glibc) are up to date. - -It's always good to use a machine with ECC memory to discover -memory problems early! -@item -If your keyboard is locked up, you may be able to fix this by -logging into your machine from another machine and execute -@code{kbd_mode -a} on it. - -@item -Please examine your system log file, (/var/log/messages or similar) for -reasons for your problems. If you think the problem is in @strong{MySQL} -then you should also examine @strong{MySQL}'s log files. @xref{Update log}. - -@item -If you don't think you have hardware problems, you should try to find -out which program is causing problems. - -Try using @code{top}, @code{ps}, @code{taskmanager} or some similar program, -to check which program is taking all CPU, or is locking the machine. - -@item -Check with @code{top}, @code{df} or a similar programs if you are out of -memory, disk space, open files or some other critical resource. - -@item -If the problem is some runaway process, you can always try to kill if. If it -doesn't want to die, this is probably a bug in the operating system. -@end itemize - -If after you have examined all other possibilities and you have -concluded that its the @strong{MySQL} server or a @strong{MySQL} client -that is causing the problem, it's time to do a bug report for our -mailing list or our support team. In the bug report, try to describe -very detailed how the system is behaving and what you think is -happening. You should also state why you think it's @strong{MySQL} that -is causing the problems. Take in consideration all the situations in -this chapter. State any problems exactly how they appear when you -examine your system.. Use the 'cut and paste' method for any output -and/or error messages from programs and/or log files! - -Try to describe very detailed which program is not working and all -symptoms you see! We have in the past got many bug reports that just -states "the system doesn't work". This doesn't provide us with any -information of what could be the problem. - -If a program fails, it's always useful to know: - -@itemize @bullet -@item -Has the program in question made a segmentation fault (core dumped)? -@item -Is the program taking the whole CPU? Check with @code{top}. Let the -program run for a while, it may be evaluating something heavy. -@item -If it's the @code{mysqld} server that is causing problems; Can you -do @code{mysqladmin -u root ping}, or @code{mysqladmin -u root processlist}? -@item -What does a client program say (try with @code{mysql} for example) -when you try to connect to the @strong{MySQL} server? -Does the client jam? Do you get any output from the program? -@end itemize - -When send a bug report, you should of course follow the outlines -described in this manual. @xref{Asking questions}. - -@node Crashing, Common errors, What is crashing, Problems -@subsection @strong{MySQL} å夹˹Ԥ - -Ƥ @strong{MySQL} Сϥ꡼¿Υץåȥե -ƥȤޤ @strong{MySQL} ˤʤХʤȤȤ -̣ޤȯΤǡ鷺ʥХ뤫⤷ޤ -⤷꤬ä硢ƥ򥯥å夷Ƥ뤫򸫤Ĥ褦Ȥϡ -᤯뤿ΤɤǤ⤢ޤ - -ޤǽ, @code{mysqld} ǡ󤬻ʤʤФʤʤɤ, ޤ -Ϥ꤬饤ȤǽʤФʤʤɤĴ٤٤Ǥ -@code{mysqladmin version} ¹Ԥ뤳Ȥˤꡢ @code{mysqld} С -ɤ줰餤ƯƤ狼ޤ ⤷ @code{mysqld} Ǥʤ顢 -¹Ԥ뤳ȤˤäƤΤå뤳ȤǤޤ. mysqldʤ顢 -θ @file{mysql-data-directory/'hostname'.err} ǸĤ뤫⤷ޤ - -Many crashes of @strong{MySQL} is caused by corrupted index / data -files. @strong{MySQL} will update the data on disk, with the -@code{write()} system call, after every SQL statement and before the -client is notified about the result (this is not true if you are running -with @code{delayed_key_writes}, in which case only the data is written). -This means that the data is safe even if mysqld crashes as the OS will -ensure that the not flushed data is written to disk. -You can force @strong{MySQL} to sync everything to disk by starting -@code{mysqld} with @code{--flush}. - -The above means that normally you shouldn't get corrupted tables unless: - -@itemize @bullet -@item -Someone/something killed @code{mysqld} or the machine in the middle -of an update. -@item -You have found a bug in @code{mysqld} that caused it to die in the -middle of an update. -@item -Someone is manipulating the data/index files outside of @strong{mysqld} -without locking the table properly. -@item -If you are running many @code{mysqld} servers on the same data on a -system that doesn't support good file system locks (normally handled by -the @code{lockd} deamon.) or if you are running -multiple servers with @code{--skip-locking} -@item -You have a crashed index/data file that contains very wrong data that -got mysqld confused. -@item -You have found a bug in the data storage code. This isn't that likely, -but it's at least possible. In this case you can try to change the file -type to another database handler by using @code{ALTER TABLE} on a -repaired copy of the table! -@end itemize - -å夹ͳΤΤ񤷤Τǡޤ¾οͤư -Τʤǥå夹ΤɤåƤΤȤԤ -Ƥ - -@itemize @bullet -@item -@code{mysqld} ǡ @code{mysqladmin shutdown} ߤ, ƤΥơ֥ -@code{myisamchk --silent --force */*.MYI} ¹Ԥ @code{mysqld} ǡ -Ƶưޤ. Ϥ줤ʾ֤鳫Ϥ뤳Ȥˤʤޤ -@xref{Maintenance}. - -@item -@code{mysqld --log} Ѥξ󤫤Υ꤬С򥭥뤷Ƥ뤫 -ĤФƤ 95% ΥХΥ˴طޤ -̾盧ϡ @strong{MySQL} ƵưΡեκǸΥΰĤǤ - -򡢰ʲμdzǧ뤳Ȥޤ - -@itemize @bullet -@item -@strong{MySQL} ǡ ( @code{mysqladmin shutdown} ) ߡ -@item -@strong{MySQL} ǡ١ǥ쥯ȥХååס -(As the server is stopped, you can just copy the files to some other -directory) -@item -ƤΥơ֥뤬Τ@code{myisamchk -s */*.MYI} ǥå -⤷ơ֥뤬Ƥ褦ʤ顢 -@code{myisamchk -r path-to-table.MYI} Ǥ -You should take the backup -before checking the tables as the problem could be related to corrupted -tables. -@item -ե @strong{MySQL} ǡǥ쥯ȥ꤫ ( ư) -@item -@code{safe_mysqld --log-update} @code{safe_mysql --log --log-update} ǥСư -@item -If @code{mysqld} now dies, you have two options: -@itemize @bullet -@item -First take a backup of your backup database. (Just copy the file(s) -somewhere again). This is because we want to keep the original start -situation untouched. Start a mysqld process on the other backup database -(you can do this with option @code{--datadir=/path/to/backup/}). -@item -Just restore the backup on your original database and restart @code{mysqld}. -You will not any lose information, because you have the @code{log-update} file. -@end itemize -@item - -Now you can test if the problem is a specific update statement by executing -@code{mysql database_name < path-to-log-update-file}. - -You can also use the script @code{mysql_find_rows} to just execute some of the -update statements if you want to narrow down the problem. - -If mysqld now crashes, then you have something repeatable -available. Please mail @email{bugs@@lists.mysql.com}, or -@email{developers@@mysql.com}, or (if you are a support customer) to -@email{support@@mysql.com} about the problem and the @strong{MySQL} team -will fix it as soon as possible. -@end itemize - -@item -٥ޡޤ @strong{MySQL} ɤƥȤ -ʤΥץꥱ򥷥ߥ졼Ȥ륳ɤɲä뤳ȤǤ -ޤ٥ޡϥۤǤ @strong{MySQL} 󥹥ȡǥ쥯 -۲ @file{bench} ǥ쥯ȥˡХʥۤǤ @file{sql-bench} -ǥ쥯ȥ˸Ĥޤ - -@item -@code{fork_test.pl} @code{fork2_test.pl} ޤ - -@item -顼ʤ@file{mysql-data-directory/'hostname'.err} եǧޤ - -@item -ǥХåѤ @strong{MySQL} 򥳥եȡʤ˥顼 -򸫤ĤФΤñˤʤޤ@code{configure} -@code{--with-debug} ץĤ @strong{MySQL} ƥե -ƥѥ뤷Ƥ@xref{Debugging server}. - -@item -ǥХåѤ @strong{MySQL} 򥳥եȡĤΥ顼򸡽Ф -ʥƤޤޤϲƤ뤫ˤĤƤ¿ -νϤ󶡤ޤ - -@item -ʤ OS κǿΥѥåŬѤޤ - -@item -@code{--skip-locking} ץ @code{mysqld} ˻ѤƤ -ĤΥƥǤϡ@code{lockd} åޥ͡ưޤ; -@code{--skip-locking} ץ @code{mysqld} ˳å󥰤 -ʤ褦ޤ(Ʊǡ2Ĥ @code{mysqld} Ф -ưȤǤ@code{myisamchk} λѻդʤФʤȤ -̣ޤƥȤȤƤΥץȤϻؼǤޤ) - -@item -@code{mysqld} ưƤΤ˱ʤ褦˸ -@code{mysqladmin -u root processlist} ޤ -@code{mysqld} ϤפƤǤޤƤ³Ǥ -뤳ȤĤå꤬뤳ȤǤ@code{mysqladmin -processlist} ̾盧ξǤ³뤳ȤǤߤ³ -ξ֤ˤĤƤͭѤʾ󶡤Ǥޤ - -@item -̤Υɥǡ׽ϤΤ˥ޥ @code{mysqladmin -i 5 status} -򥯥桢ԤäƤ - -@item -Ƥ: -@enumerate -@item -@code{gdb} (ޤ¾ΥǥХå) @code{mysqld} 򳫻ϤƤ - -@item -ʤΥƥȥץȤ¹ԤƤ - -@item -Print the backtrace and the local variables at the 3 lowest levels. In gdb you -can do this with the following commands when @code{mysqld} has crashed inside -gdb: - -@example -backtrace -info local -up -info local -up -info local -@end example - -With gdb you can also examine which threads there exists with @code{info -threads} and switch to a specific thread with @code{thread #}, where -@code{#} is the thread id. -@end enumerate - -@item -@strong{MySQL} ˥åޤϴְä񤤤򤵤뤢ʤΥץ -Υߥ졼Ȥ Perl ץȤǻߤƤ - -@item -ޤ̾ΥХݡȤäƤ@xref{Bug reports}̾ -⤵˾ܺ٤ˤƤ@strong{MySQL} ¿οͤΤƯ -뤿ᡢåϤʤΥԥ塼¸ߤ벿(㤨С -ʤ̤ʥƥ饤֥˴Ϣ顼)ƤȻפ - -@item -⤷ĹΥ쥳ɤ򰷤ơ֥꤬ä硢 -⤷@code{BLOB/TEXT} եɤϻѤƤ餺@code{VARCHAR} ե -ѤƤʤ顢Ƥ @code{VARCHAR} եɤ - @code{ALTER TABLE} @code{CHAR} ѹƤߤƤ - @strong{MySQL} ˸Ĺ쥳ɤѤ褦ˤޤ -Ĺ쥳ɤϾ;ʬΰȤޤꥨ顼Ф -ʤޤ - -ߤβĹΥ쥳ɤΥɤ TCX ǾʤȤ⣳ǯʾʤ -ѤƤޤ ĹΥ쥳ɤϤꥨ顼ηꡢ -嵭λȤɤǥǤ -@end itemize - -@node Common errors, Full disk, Crashing, Problems -@section @strong{MySQL}ѻΤ褯뤤ĤΥ顼 - -@menu -* Gone away:: @code{MySQL server has gone away} error -* Can not connect to server:: @code{Can't connect to [local] MySQL server} error -* Blocked host:: @code{Host '...' is blocked} error -* Too many connections:: @code{Too many connections} error -* Out of memory:: @code{Out of memory} error -* Packet too large:: @code{Packet too large} error -* Full table:: @code{The table is full} error -* Commands out of sync:: @code{Commands out of sync} error in client -* Ignoring user:: @code{Ignoring user} error -* Cannot find table:: @code{Table 'xxx' doesn't exist} error -@end menu - -@node Gone away, Can not connect to server, Common errors, Common errors -@subsection @code{MySQL server has gone away} 顼 - -Υ @code{Lost connection to server -during query} 顼˴ؤ뤳Ȥ⥫Сޤ - -@code{MySQL server has gone away} 顼ΤäȤŪͳϡ -ॢȤ³򥯥ȤǤǥեȤǤϡⵯʤ -硢Ф 8 ָ³򥯥ޤ -λ֤ mysqld ư @code{wait_timeout} ѿͿ뤳ȤˤꡢѹǤޤ - -@code{mysqladmin version} ¹Ԥ뤳Ȥ @strong{MySQL} Ǥ뤫ɤ -ޤ uptime Ϥɤ줰餤åǤޤ - -ץȤξϡưŪ˺³뤿˥饤Ȥ饯ȯ -Ԥɬפޤ - -ξ硢̾盧Υ顼ɤޤ: -(OS ¸Ǥ): - -@multitable @columnfractions .3 .7 -@item @code{CR_SERVER_GONE_ERROR} @tab 饤ȤС䤤碌뤳ȤǤʤä -@item @code{CR_SERVER_LOST} @tab 饤ȤС˽񤭹ߤԤäȤˤϥ顼̵äɤ⡢䤤碌Фƴ˲֤äƤʤ -@end multitable - -ְäƤ뤫礭륯򥵡Фäˤ⤳Υ顼ȯ -ޤ@code{mysqld} ְä֥å硢饤Ȥβְä -ȸʤ³򥯥ޤ礭ʥ꤬ɬפʾ硢㤨礭 -@code{BLOB} Ưϡ@code{mysqld} 򥪥ץ @code{-O max_query_size=#} -(ǥե 1M) ǵư뤳Ȥǥ¤äǤޤĥ -׵ˤäƳƤޤΤᡢ@code{mysqld} 礭ʥȯԤ -礭ʷ̹Ԥ֤ɬפΤ¿ΥѤޤ - - -@node Can not connect to server, Blocked host, Gone away, Common errors -@subsection @code{Can't connect to [local] MySQL server} 顼 - -UNIX @strong{MySQL} 饤Ȥ @code{mysqld} Ф2Ĥΰۤʤˡ³Ǥ -: Unix å, ϥե륷ƥΥե(ǥե -@file{/tmp/mysql.sock})̤³ޤޤ TCP/IP, ϥݡ -̤³ޤUnix åȤ TCP/IP ®ǤФ -Ʊԥ塼³ȤޤUnix åȤϡۥ̾ -ꤷʤ礫̤ʥۥ̾ @code{localhost} ꤷ˻Ѥ -ޤ - -On Windows you can connect only with TCP/IP if the @code{mysqld} server -is running on Win95/Win98. If it's running on NT, you can also connect -with named pipes. The name of the named pipe is @code{MySQL}. If you -don't give a hostname when connecting to @code{mysqld}, a @strong{MySQL} client -will first try to connect to the named pipe and if this doesn't work it -will connect to the TCP/IP port. You can force the use of named pipes -on Windows by using @code{.} as the hostname. - -(2002) @code{Can't connect to ...} 顼ϡ̾@strong{MySQL} С -ƥäƤʤʤְäåȥե -TCP/IP ݡȤѤ @code{mysqld} ³褦Ȥˤޤ - -Start by check -С @code{mysqld} ȤץäƤ뤫 ( @code{ps} Ѥơ Windows ξϥޥ͡Ǥߤ) -ǧ뤳Ȥ鳫ϤƤ -@xref{Starting server}. - -@code{mysqld} ץäƤʤ顢㤦³ȤǥС -ǧ뤳ȤǤޤʤ󡢥ݡֹȥåȤΥѥϤʤ -åȥåפΤȤϰ㤦Ǥ礦ˡ - -@example -shell> mysqladmin version -shell> mysqladmin variables -shell> mysqladmin -h `hostname` version variables -shell> mysqladmin -h `hostname` --port=3306 version -shell> mysqladmin -h 'ip for your host' version -shell> mysqladmin --socket=/tmp/mysql.sock version -@end example - -@code{hostname} ޥɤϥեɥȤǤʤХåơ -ϤǤ뤳ȤդƤ @code{ۥ̾} (ȤΥۥ̾) - @code{mysqladmin} ޥɤͿޤ - -@code{Can't connect to local MySQL server} 顼ꤦͳȤơ - -@itemize @bullet -@item @code{mysqld} is not running. -@item MIT-pthreads Ѥ륷ƥǼ¹ԤƤ롣 -ͥƥ֥åɤʤƥǼ¹ԤƤ @code{mysqld} MIT-pthreads ѥåѤޤ -@xref{Which OS}. -MIT-pthreads åɤϥåȤ򥵥ݡȤޤ -ΤᡢФ³Ͼ˥ۥ̾Ϳɬפޤ -Сؤ³å뤿ˡʲƤ -@example -shell> mysqladmin -h `hostname` version -@end example - -@item ï @code{mysqld} Ѥ unix å (default @file{/tmp/mysqld.sock}). -줫 @code{cron} @strong{MySQL} åȤƤ뤫⤷ޤ(㤨 @file{/tmp} ǥ쥯ȥ꤫Ťե褦ʥ) -ĤǤ @code{mysqladmin version} ¹Ԥ -@code{mysqladmin} Ѥ륽åȤ¸ߤ뤫åǤޤ -ξνϡ@file{mysqld.sock} äʤ褦 @code{cron} ѹ뤫ޤϥåȤɤ¾ξ˰ܤȤǤ - -@strong{MySQL} ./configure ˥åȤꤹˤϰʲΤ褦ˤޤ: -@example -shell> ./configure --with-unix-socket-path=/path/to/socket -@end example - -ޤ@code{safe_mysqld} @code{--socket=/path/to/socket} ץꤷƵưƤ⹽ޤ󤷡 -@code{MYSQL_UNIX_PORT} Ķѿ򥻥åȤ @strong{MySQL} 饤Ȥ¹ԤƤ⤫ޤޤ - -@item @code{--socket=/path/to/socket} ץ @code{mysqld} СưǤޤ -⤷СΥåȤΥѥѤ硢@strong{MySQL} 饤Ȥˡѥ򶵤ʤФʤޤ -ξ硢 @code{MYSQL_UNIX_PORT} Ķѿꤹ뤳ȤˤǽǤ -åȤΥƥȤ򤹤硢ʲΤ褦ˤޤ - -@example -shell> mysqladmin --socket=/path/to/socket version -@end example - -@item -Linux ѤƤƥåɤĻȤʥפˡ -ξ硢¾ @code{mysqld} åɤ򥭥뤷ʤФʤޤ -ȤС@code{mysql_zap} ץȤ򡢿 @strong{MySQL} С -ư˼¹Ԥޤ @xref{Crashing}. -@end itemize - -⤷ @code{Can't connect to MySQL server on some_hostname} 顼ξ, -ʤΤ򸫤Ĥ뤿ˡʲμƧߤޤ - -@itemize @bullet -@item -⤷ @code{telnet your-host-name tcp-ip-port-number} ¹Ԥ -Сåפʤ顢 @code{RETURN} 򲿲󤫤Ƥ -⤷ΥݡȤ @strong{MySQL} СäƤʤ顢 -äƤ @strong{MySQL} СΥСʥСޤ -쥹ݥ󥹤ϤǤ -⤷ @code{telnet: Unable to connect to remote host: Connection refused} Τ褦 -顼ˤʤäʤСΥݡȤѤƤ륵СϤޤ - -@item -Υޥ @code{mysqld} ǡ³ƤߤƤ -@code{mysqld} Ѥ褦˻ꤵ줿 TCP/IP ݡȤåƤ -@code{mysqladmin variables} @code{port} ѿ - -@item -@code{mysqld} С @code{--skip-networking} ץǵưƤʤ -ǧƤ -@end itemize - -@node Blocked host, Too many connections, Can not connect to server, Common errors -@subsection @code{Host '...' is blocked} 顼 - -ʲΥ顼ξ硧 - -@example -Host 'hostname' is blocked because of many connection errors. -Unblock with 'mysqladmin flush-hosts' -@end example - - @code{mysqld} ¿ @code{'hostname'} ۥȤ³顼(@code{max_connect_errors}) -ȯޤ - @code{max_connect_errors} ȯ塢@code{mysqld} ϲ(åˤ륵СؤΥåʤ)äȽǤΥۥȤ³򤤤äݤ褦ˤޤ -ˤϡ@code{mysqladmin flush-hosts} ޥɤ¹Ԥޤ - -ǥեȤǤϡ10³顼ȯˡ@code{mysqld} ϤΥۥȤݤޤ -ͤϰʲΤ褦ˤƴñѹǤޤ - -@example -shell> safe_mysqld -O max_connect_errors=10000 & -@end example - -⤷Υ顼ۥȤФȯʤСޤǽˤΥۥȤ TCP/IP ³Զ礬ʤåƤ -⤷ TCP/IP ³ưƤʤ褦ʤ顢 @code{max_connect_errors} ͤ䤹ȤϤ褯ʤȤǤ - -@node Too many connections, Out of memory, Blocked host, Common errors -@subsection @code{Too many connections} 顼 - -⤷ @strong{MySQL} ³褦Ȥ @code{Too many connections} Ȥʤä硢 -ϴ @code{max_connections} ʬ饤Ȥ @code{mysqld} Сؤ -³ԤƤޤ - -⤷ǥեȤ100¿³ɬפȤʤС -@code{max_connections} ѿ¿ͤͿơ@code{mysqld} -ꥹȤʤƤϤʤޤ - -ºݤϡ@code{mysqld} (@code{max_connections}+1) ĤΥ饤Ȥ³Ƥޤ -ǸΣĤϡ @code{process} ¤ĥ桼Τ˼äƤޤ -By not giving this privilege to normal users (they shouldn't need this), an -administrator with this privilege can login and use @code{SHOW PROCESSLIST} -to find out what could be wrong. @xref{SHOW}. - -@node Out of memory, Packet too large, Too many connections, Common errors -@subsection @code{Out of memory} 顼 - -ԤäơΥ顼Τ褦ʤΤ: - -@example -mysql: Out of memory at line 42, 'malloc.c' -mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k) -ERROR 2008: MySQL client ran out of memory -@end example - -顼 @strong{MySQL} 饤 @code{mysql} ˴ط뤳ȤդƤ -顼ͳñǡ饤ȤΤǼΤ˽ʬʥ -ƤʤȤǤ - -褹ˤꡢޤǽ˥꡼ǧƤ -Υ꡼̤η̤֤ΤǤ礦 -⤷ʤ顢@code{mysql --quick} ѤƤ -Ϸ̤Ф @code{mysql_use_result()} Ѥޤ -ϥ饤ȤΥ­䤤ޤ(С¿ΰϼޤ) - -@node Packet too large, Full table, Out of memory, Common errors -@subsection @code{Packet too large} 顼 - -@strong{MySQL} 饤Ȥ @code{max_allowed_packet} 礭ʥ֥å @code{mysqld} С@code{Packet too large} 顼ȯޤ - -@code{mysql} 饤ȤѤ硢@code{mysql --set-variable=max_allowed_packet=8M} - ǥ饤Ȥ򳫻Ϥ뤳ȤǡХåե礭Ǥޤ - -⤷(@code{DBI} Τ褦)ѥåȥǤʤ饤ȤѤƤ硢 -ѥåȥꤷƥСΩ夲ľޤ - @code{mysqld} Υץ @code{max_allowed_packet} 礭ͤꤹ뤳ȤǹԤޤ -㤨С @code{BLOB} εϰϤäѤΥǡơ֥硢 -@code{--set-variable=max_allowed_packet=24M} ץꤷƥСưɬפޤ - -@cindex The table is full -@node Full table, Commands out of sync, Packet too large, Common errors -@subsection @code{The table is full} 顼 - -Υ顼ϡŤ @strong{MySQL} Сˤơ -ơ֥뤬 @code{tmp_table_size} 礭ʤ -ȯޤ򤹤뤿ˡ@code{mysqld} Υץ @code{-O -tmp_table_size=#} áޤϡSQL ץ @code{SQL_BIG_TABLES} -Υ˻ѤǤޤ@xref{SET OPTION, , @code{SET OPTION}}. - -@code{mysqld} @code{--big-tables} ץꤷƵưޤ -ƤΥ꡼Ф @code{SQL_BIG_TABLES} ѤΤƱǤ - -In @strong{MySQL} 3.23 in-memory temporary tables will automaticly be -converted to a disk based @code{MyISAM} table after the table size gets -bigger than @code{tmp_table_size}. - -@cindex Commands out of sync -@node Commands out of sync, Ignoring user, Full table, Common errors -@subsection @code{Commands out of sync} error in client - -@code{Commands out of sync; You can't run this command now} 򥯥饤 -ȥ硢饤ȴؿְä֤ǸƤӽФޤ - -㤨С@code{mysql_use_result()} ѤƤơ@code{mysql_free_result()} -Ԥ˿μ¹ԤߤȯޤϤޤǡ -֤ĤΥμ¹Ԥ򡢴֤ @code{mysql_use_result()} -@code{mysql_store_result()} ̵ǻߤˤȯޤ - - -@node Ignoring user, Cannot find table, Commands out of sync, Common errors -@subsection @code{Ignoring user} 顼 - -ʲΥ顼ξ硧 - -@code{Found wrong password for user: 'some_user@@some_host'; Ignoring user} - - @code{mysqld} γϤޤ 'reload' @code{user} ơ֥ѥ -ɤʤȥ򸫤ĤȤ̣ޤ -ñ˥ȥ꤬ĥƥ˵ݤƤǤ - -뤳ȤȤβ: - -@itemize @bullet -@item -С @code{mysqld} 򡢸ŤСѤ @code{user} ơ֥餻ƤΤ⤷ޤ -@code{mysqlshow mysql user} ԤȤˤäƤ򸡾ڤǤޤ -ѥɥեɤ 16 ʸûɤåƤ -⤷ʤ顢뤿ˡ@code{scripts/add_long_password} ץȤ¹ԤƤ - -@item -桼Ťѥ(8ʸ) ѤƤơ@code{mysqld} @code{--old-protocol} ץǵưƤʤΤ⤷ޤ -ѥɤ @code{user} ơ֥Υ桼򹹿뤫@code{--old-protocol} -դ @code{mysqld} ƵưƤ - -@item -@findex PASSWORD() -@code{user} ơ֥Υѥɤ@code{PASSWORD()} ؿѤʤϿΤ⤷ޤ -ξ硢@code{user} ơ֥Υѥɤ@code{mysql} Ѥƹޤ -@code{PASSWORD()} ؿϰʲΤ褦ˤƻѤޤ - -@example -mysql> update user set password=PASSWORD('your password') - where user='XXX'; -@end example -@end itemize - -@node Cannot find table, , Ignoring user, Common errors -@subsection @code{Table 'xxx' doesn't exist} error - -⤷ @code{Table 'xxx' doesn't exist} @code{Can't find file: 'xxx' (errno: 2)} - 顼Ф硢ѤƤǡ١ @code{xxx} Ȥ̾Υơ֥뤬 -դʤäȤ򼨤ޤ - -ǡ١ȥơ֥¸ˡ@strong{MySQL} ϥǥ쥯ȥȥեѤ -ǡ١ȥơ֥̾@strong{¸}Ǥ! -(Win32 Ǥϥǡ١ȥơ֥̾ϥ¸Ǥ -Υơ֥Ф䤤碌ơƱǽ񤫤ʤƤϤʤޤ) - -@code{SHOW TABLES} Ѥƥǡ١Υơ֥ǧǤޤ. @xref{SHOW, , @code{SHOW}}. - -@cindex Full disk -@cindex Disk full -@node Full disk, Multiple sql commands, Common errors, Problems -@section @strong{MySQL} ϥեǥɤΤ褦˰ - -@noindent -ǥե뤬 @strong{MySQL} ϼΤȤԤޤ: - -@itemize @bullet -@item -ߤιԤ񤯤Τ˽ʬΰ褬뤫ɤ1ʬ1åޤ -ʬʥǥϡⵯʤä褦˷³ޤ -@item -6ʬ˥ե˥ǥեٹ𤹤륨ȥ񤭽Фޤ -@end itemize - -@noindent -ξ硢ʲΤ褦ˤޤ - -@itemize @bullet -@item -³뤿ˤϡƤΥ쥳ɤΤ˽ʬΰɬפ -ޤ -@item -åɤ򥢥ܡȤ뤿ˤϡ@code{mysqladmin kill} 򥹥åɤ -ɬפޤåɤϼ(1ʬ)ǥå˥ܡȤ -ޤ -@item -¾Υåɤ ``disk full'' ȯơ֥Ԥ뤳Ȥդ -¿ ``locked'' åɤ硢disk full ԤİĤΥ -ɤ kill 뤳Ȥǡ¾Υåɤη³ޤ -@end itemize - - -@node Multiple sql commands, Temporary files, Full disk, Problems -@section ƥȥե뤫 SQL ޥɤ¹ - -@code{mysql} 饤ȤϰʲΤ褦ˤŪ˻Ѥޤ - -@example -shell> mysql database -@end example - - SQL ޥɤե˽񤤤Ƥ @code{mysql} ɤ߹ޤ뤳ȤǤޤ -ƥȥե @file{text_file} ˼¹Ԥޥɤ񤤤Ƥ -ʲΤ褦ˤ @code{mysql} ưޤ - -@example -shell> mysql database < text_file -@end example - -ƥȥեƬ @code{USE db_name} ʸ񤯤ȤǤޤ -ξ硢ǡ١̾򥳥ޥɥ饤Ϳɬפ̵ʲΤ褦ˤǤޤ - -@example -shell> mysql < text_file -@end example - -@xref{Programs}. - - -@node Temporary files, Problems with mysql.sock, Multiple sql commands, Problems -@section @strong{MySQL} եǼ - -@strong{MySQL} ϰեǼȤ @code{TMPDIR} Ķѿͤ -Ѥޤ@code{TMPDIR} ꤷƤʤС@strong{MySQL} ϥƥΥǥե -ȤѤޤ̾ @file{/tmp} ޤ @file{/usr/tmp} Ǥ@code{TMPDIR} -硢@code{safe_mysqld} Խơʬΰ褬¾Υǥ쥯ȥ -褦 @code{TMPDIR} ꤹ٤Ǥ -@code{--tmpdir} ץ @code{mysqld} Ϳ뤳Ȥǡեǥ쥯ȥꤹ뤳ȤǽǤ - -@strong{MySQL} Ƥΰե ``ե'' Ȥޤ - @code{mysqld} λˡե뤬ʤȤμ¤ˤ -ޤեѤ '' ¦̤ϡǥ -ˤ礭ʰե򸫤ĤʤȤǤ - -Ȼ (@code{ORDER BY} ޤ @code{GROUP BY})@strong{MySQL} ̾Ĥޤ -ΰեѤޤɬפʺΥǥ̤: - -@example -(length of what is sorted + sizeof(database pointer)) -* number of matched rows -* 2 -@end example - -@code{sizeof(database_pointer)} ̾Ǥ礭ʥơ֥ -Τ礭ʤ뤳Ȥ⤢ޤ - -Ĥ @code{SELECT} ϰŪ SQL ơ֥ޤϱ -եǤϤʤ@file{SQL_*} Ȥ̾Ǥ - -@code{ALTER TABLE} , @code{OPTIMIZE TABLE} ϰơ֥򥪥ꥸʥơ֥Ʊǥ쥯ȥ -ޤ - - -@node Problems with mysql.sock, Error Access denied, Temporary files, Problems -@section @file{/tmp/mysql.sock} ˡ - -⤷ï @strong{MySQL} Υåȥե @file{/tmp/mysql.sock} äʤ顢 -ۤȤɤ Unix Ǥ褦ˡ @file{/tmp} @code{sticky} ӥåȤ򤿤Ƥݸޤ -@code{root} ǥ󤷤ơʲΤ褦ˤޤ - -@example -shell> chmod +t /tmp -@end example - -ϥեΥʡȥѡ桼(@code{root}) Τߤ - @file{/tmp} ΥեäȤǤޤ - -@code{sticky} ӥåȤΩäƤ뤫ǧˤϡ @code{ls -ld /tmp} Ԥޤ -ѡߥåκǸΥӥåȤ @code{t} ʤСåȤƤޤ - -@node Error Access denied, Changing MySQL user , Problems with mysql.sock, Problems -@section @code{Access denied} 顼 - -@xref{Privileges}.@xref{Access denied}. - - -@node Changing MySQL user , Resetting permissions, Error Access denied, Problems -@section ̥桼 @strong{MySQL} ưˡ - -@code{mysqld} (@strong{MySQL} ) ïǤⳫϤ¹Ԥ뤳ȤǤޤ -@code{mysqld} 桼 @code{user_name} Ǽ¹Ԥ褦ѹ뤿ˤϡԤʤɬפ -ޤ: - -@enumerate -@item -Сߤޤ (use @code{mysqladmin shutdown}). - -@item -@code{user_name} ɤ߽񤭤Ǥ褦ˡǡ١ǥ쥯ȥȤΥեΥѡߥåѹޤ( Unix @code{root} 桼Ǽ¹ԤɬפǤ礦) - -@example -shell> chown -R user_name /path/to/mysql/datadir -@end example - -@strong{MySQL} ǡ١ǥ쥯ȥΥǥ쥯ȥ꡼ե뤬ܥå󥯤ξ硢 -󥯤Υǥ쥯ȥȥեѹޤ@code{chown -R} ϥܥåѹƤޤ - -@item -桼 @code{user_name} ǥФưޤޤ @strong{MySQL} 3.22 ʹߤѤ -ϡ@code{mysqld} Unix @code{root} ǵư @code{--user=user_name} åѤޤ -@code{mysqld} ϡ³ĤˡͿ줿 Unix user @code{user_name} Ǽ¹Ԥ褦ڤؤޤ - -@item -ƥƵư @code{mysql.server} Ѥ @code{mysqld} ư硢桼 -@code{user_name} ؤ @code{su} Ԥʤ褦ˤޤ @code{--user} åѤ @code{mysqld} ư褦 @code{mysql.server} ѹ٤Ǥ -(No changes to @code{safe_mysqld} are necessary.) -@end enumerate - -λǡʤ @code{mysqld} ץ Unix user @code{user_name} ưޤ - -ĤΤȤѤޤ󡣤ϸµĥơ֥Ǥǥե -(ѡߥåơ֥륤󥹥ȡ륹ץ@code{mysql_install_db}¹Ըθ) Ǥϡ@code{mysql}ǡ١ؤΥǡ١κ˴ϥ桼 @strong{MySQL} user @code{root} Ǥ -ѹʤȡϤΤޤޤǤ -@code{root} ʳUnix userǥ󤷤ƤǤ⡢ʤ -@strong{MySQL} @code{root} user ȤƥϲǽǤ - ץ @code{-u root} 򥯥饤ȥץ˥ץꤹǤ - -@strong{MySQL} @code{root} Ȥƥˤϡ -ޥɥ饤 @code{-u root} ѤǤȤդƤ -Unix @code{root} user @strong{MySQL} 餻Ƥ Unix 桼Ǥɬפ@emph{ʤ}ȤդƤ -@strong{MySQL} Υѡߥå@strong{MySQL} Υ桼ϡ -UNIX 桼Ȥϴ̤ΤΤǤUNIX 桼˴طΤϡ饤 -Ȥ @code{-u} ץѤʤǤξ硢饤Ȥ -@strong{MySQL} ؤΥ򡢤ʤ UNIX ̾ǻߤޤ - -ʤ UNIX ޥ󤽤켫ȤǤʤϡʤȤ @strong{MySQL} -ơ֥ @strong{MySQL} @code{root} 桼ˤϥѥɤꤹ٤Ǥ -ɤï @code{mysql -u root db_name} Ԥʤब˾ळȤƤ¹ԤǤƤޤǤ - - -@node Resetting permissions, File permissions , Changing MySQL user , Problems -@section ˺줿ѥɤꥻåȤ - -⤷ @strong{MySQL} @code{root} 桼Υѥɤ˺줿硢 -ʲΤ褦ˤľȤǽǤ - -@enumerate -@item -@code{mysqld} С @code{kill} Ȥ -(@code{kill -9} ǤϤޤ) -PID ֹ̾ @strong{MySQL} ǡǥ쥯ȥ @code{.pid} եȤ -񤫤Ƥޤ - -@example -kill `cat /mysql-data-directory/hostname.pid` -@end example - - UNIX @code{root} 桼@strong{MySQL} С¹Ԥ -桼ǹԤޤ - -@item -@code{mysqld} @code{--skip-grant-tables} ץǵư - -@item -@code{mysql -h hostname mysql} @code{mysqld} С³ -@code{GRANT} ޥɤǥѥɤѹޤ @xref{GRANT,,@code{GRANT}}. -@code{mysqladmin -h hostname -u user password 'new password'} -ǤѹǽǤ - -@item -ĥơ֥ɤ߹ߤޤ -@code{mysqladmin -h hostname flush-privileges} SQL ʸ -@code{FLUSH PRIVILEGES} ¹Ԥޤ -@end enumerate - - -@node File permissions , Not enough file handles, Resetting permissions, Problems -@section եѡߥå - -եѡߥå꤬硢 -㤨Сơ֥ @code{mysql} Ϥ: - -@example -ERROR: Can't find file: 'path/with/filename.frm' (Errcode: 13) -@end example - -@tindex UMASK environment variable -@tindex Environment variable, UMASK - @code{UMASK} Ķѿ @code{mysqld} ư˴ְäƥåȤƤȹͤޤ -ǥեȤ umask @code{0660} Ǥ. -ϰʲΤ褦ˤ @code{safe_mysqld} Ω夲ѹǤޤ: - -@example -shell> UMASK=384 # = 600 in octal -shell> export UMASK -shell> /path/to/safe_mysqld & -@end example - -@tindex UMASK_DIR environment variable -@tindex Environment variable, UMASK_DIR -By default @strong{MySQL} will create database and @code{RAID} -directories with permission type 0700. You can modify this behaviour by -setting the the @code{UMASK_DIR} variable. If you set this, new -directories are created with the combined @code{UMASK} and -@code{UMASK_DIR}. For example, if you want to give group access to -all new directories, you can do: - -@example -shell> UMASK_DIR=504 # = 770 in octal -shell> export UMASK_DIR -shell> /path/to/safe_mysqld & -@end example - -@xref{Environment variables}. - -@node Not enough file handles, Using DATE, File permissions , Problems -@section File not found - -@code{ERROR '...' not found (Errcode: 23)}, @code{Can't open file: ... (errno: 24)} - @code{errcode 23} @code{errno 24} Υ顼 @strong{MySQL} 硢 - @strong{MySQL} ˽ʬʥե뵭һҤƤʤäȤ̣ޤ -@code{perror #} Ϥɤߤ䤹Υ顼åͿޤ: - -@example -shell> perror 23 -File table overflow -shell> perror 24 -Too many open files -@end example - - @code{mysqld} ¿Υե򳫤ȤȤ˵ޤ -@code{mysqld} ˰٤˳ե¿ʤ褦ꡢ뤤ϡ -@code{mysqld} ե뵭һҤοͿǤޤ - -@code{mysqld} ٤˳եο򾯤ʤˤϡ@code{-O table_cache=32} ץ(ǥեȤ64) @code{safe_mysqld} Ϳ뤳ȤDzǽǤ -ޤ@code{max_connections} (ǥեȤ90)򾯤ʤʤСե⾯ʤǤޤ - -@tindex ulimit -@code{mysqld} 갷ե뵭һҤοѹˤϡ @code{safe_mysqld} Խޤ - @code{ulimit -n 256} ȥȤƤޤ -ΥȤϤ(@code{'#'}ʸä)256 @code{mysqld} ѹƤ - -@code{ulimit} ϥڥ졼ƥ󥰥ƥǤե뵭һҤοǤޤ -⤷ OS °ʾ˥ե뵭һҤΥץ䤷硢 -ȤΥڥ졼ƥ󥰥ƥΥɥȤ򸫤н褷Ƥ - -@code{tcsh} ѤƤ @code{ulimit} ưʤȤդƤ -@code{tcsh} ϸߤ¤򤢤ʤ䤤碌Ƥ⡢äͤ𤹤Ǥ礦 -ξ硢@code{safe_mysqld} @code{sh} ǵư٤Ǥ - - -@node Using DATE, Timezone problems, Not enough file handles, Problems -@section @code{DATE} եɻѻ - - @code{DATE} η @code{'YYYY-MM-DD'} ǤANSI SQL ˽äƼºݤˤ¾Τϵ -󡣹ޤ @code{SELECT} ʸ WHERE ǤϤηѤ٤Ǥʤ: - -@example -mysql> SELECT * FROM tbl_name WHERE date >= '1997-05-05'; -@end example - -ؤΤ @strong{MySQL} ϡդͤʸ̮ǻѤȡդưŪ˿ -ͤѴޤˤꡢ @code{TIMESTAMP}, @code{DATE} ޤ -@code{DATETIME} եɤǤ @code{WHERE} ˡȼͳդꤹ뤳ȤǤޤ -(εҤᡢɵդΥѥ졼ȤƻѤޤ -㤨С@code{'1998-08-15'} @code{'1998#08#15'} ƱǤ.) -⤷󥻥ѥ졼Τʤ(㡧@code{'19980815'})դȤѴƤޤ - -̤ @code{'0000-00-00'} @code{'0000-00-00'} ȤƳǼФޤ -@strong{MyODBC} ̤ @code{'0000-00-00'} դѤ@strong{MyODBC} 2.50.12 ʾǤϼ -ưŪ @code{NULL} ѴޤODBC Ϥդμ򰷤ʤǤ - -ϼưȤ̣ޤ: - -@example -mysql> INSERT INTO tbl_name (idate) VALUES (19970505); -mysql> INSERT INTO tbl_name (idate) VALUES ('19970505'); -mysql> INSERT INTO tbl_name (idate) VALUES ('97-05-05'); -mysql> INSERT INTO tbl_name (idate) VALUES ('1997.05.05'); -mysql> INSERT INTO tbl_name (idate) VALUES ('1997 05 05'); -mysql> INSERT INTO tbl_name (idate) VALUES ('0000-00-00'); - -mysql> SELECT idate FROM tbl_name WHERE idate >= '1997-05-05'; -mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505; -mysql> SELECT mod(idate,100) FROM tbl_name WHERE idate >= 19970505; -mysql> SELECT idate FROM tbl_name WHERE idate >= '19970505'; -@end example - -@noindent -ưޤ: - -@example -mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,'19970505')=0; -@end example - -@code{STRCMP()} ʸؿǡ@code{idate} ʸѴơʸӤԤޤ -@code{'19970505'} դˤѴƤ줺դӤԤޤ - -@strong{MySQL} դɤåʤȤդƤ -ְä(㤨 @code{'1998-2-31'})ǼȡδְäդǼ -ޤդŪԲǽʾ硢@code{0} @code{DATE} եɤ˳Ǽޤ -ϼ®٤ǡդΥåϥФǤϤʤץꥱǤȲ桹 -ϹͤƤޤ - -@cindex Timezone problems -@tindex TZ environment variable -@tindex Environment variable, TZ -@node Timezone problems, Case sensitivity, Using DATE, Problems -@section Timezone problems - -⤷ @code{SELECT NOW()} ʤΥ֤ǤϤʤ GMT ֤ʤ顢 - @code{TZ} ĶѿTimezone ꤷʤƤϤʤޤ -ĶѿϡС¹Ԥ˹ԤʤƤϤʤޤ -ȤС@code{safe_mysqld} @code{mysql.server} ץȤ -Ԥޤ - - -@cindex Case sensitivity, in searches -@cindex Chinese -@cindex Big5 Chinese character encoding -@node Case sensitivity, Problems with NULL, Timezone problems, Problems -@section Υ¸ - -ǥեȤǤ @strong{MySQL} եɤϥ¸Ǥ ( -¸ˤʤʤĤʸåȤϤޤsuch as @code{czech}) -ϡ@code{col_name LIKE 'a%'} -Ǹ硢@code{A} ޤ @code{a} ǻϤޤƤΥեɤ뤳Ȥ -̣ޤ򥱡¸ˤΤʤ顢Ϥޤåˤ -@code{INDEX(column, "A")=0} Τ褦ʤȤ򡢤ޤʸΤƱɤ -ˤ @code{STRCMP(column, "A") = 0} ѤƤ - -ñ @code{>=, >, =, <, <=}Ȥƥ롼ײϡʸ ``sort value'' -ǹԤޤƱͤʸ (like E, e and @'e)Ʊʸ -ưޤ - -@code{LIKE} ӤϳʸʸǹԤޤ -(E == e but E <> @'e) - -@code{column} 򤤤ĤǤ⥱¸ǰϡ @code{BINARY} -ȤƤ@xref{CREATE TABLE, , @code{CREATE TABLE}}. - -big5 󥳡ǥ󥰤ȸƤФǡѤƤϡƤ -ʸܤ @code{BINARY} ˤƤϡbig5 󥳡ǥʸ -ΥȽ礬 ascii ɤˤʤäƤ뤿ᡢǽޤ - - -@cindex NULL values vs. empty values -@tindex NULL -@node Problems with NULL, Problems with alias, Case sensitivity, Problems -@section @code{NULL} ͤǤ - -SQL ν鿴ԤΤ꤬ʺϡ@code{NULL} ͤʸ @code{''} Ʊʪȹͤ뤳 -ȤǤޤ 㤨СΥơȥȤ̤Τ -ΤǤ: - -@example -mysql> INSERT INTO my_table (phone) VALUES (NULL); -mysql> INSERT INTO my_table (phone) VALUES (""); -@end example - -ξʸȤ @code{phone} եɤͤƤޤ -Τ @code{NULL} ͤܤΤ϶ʸƤޤ -Τ ``ֹΤʤ'' ȸʤ졢ܤΤ ``ä -äƤʤ'' ȸʤޤ - -SQL Ǥϡ @code{NULL} ¾Ƥ(Ȥ @code{NULL} Ǥ)Ӥˡ˵ -ʤͤǤ @code{NULL} ޤ༰ϡäǤ꤬ʤС @code{NULL} ͤ -ιܤ @code{NULL} ֤ޤ: - -@example -mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL); -@end example - -@code{NULL} ͤåȤƤܤ򸡺硢 - @code{=NULL} ƥȤԤʤǤ - @code{expr = NULL} FALSE ʤΤǡʤιԤ֤ޤ -㤨аʲ㡧 - -@example -mysql> SELECT * FROM my_table WHERE phone = NULL; -@end example - -@code{NULL} ͤĥեɤ򸡺ϡ@code{IS NULL} ƥȤѤʤƤϤ -󡣼 @code{NULL} ֹȶֹ򸫤Ĥˡ򼨤Ƥޤ: - -@example -mysql> SELECT * FROM my_table WHERE phone IS NULL; -mysql> SELECT * FROM my_table WHERE phone = ""; -@end example - -@strong{MySQL} Ǥϡ¾¿ SQL ФΤ褦ˡ@code{NULL} ͤ -ǥåեɤƤޤ󡣤Υեɤ @code{NOT NULL} -ƤϤޤ -ǥåեɤˤϡ@code{NULL} ꤹ뤳ȤϤǤޤ - -@findex LOAD DATA INFILE -@code{LOAD DATA INFILE} ǥǡɤ߹ȤϡΥեɤ @code{''} ǹޤ -ܤ @code{NULL} ͤˤϡƥȥե @code{\N} Ѥ٤Ǥ -ƥȤƤ @code{'NULL'} 줬ǻѤƤޤ -@xref{LOAD DATA, , @code{LOAD DATA}}. - -@code{ORDER BY} ѻ, @code{NULL} ͤϺǽ󼨤ޤ. -@code{DESC} Ѥƹ߽˥Ȥ@code{NULL} ͤϺǸˤʤޤ -@code{GROUP BY} ѻ, Ƥ @code{NULL} ͤȸʤޤ - -@code{NULL} 뤿ᡢδؿѤǤޤ: -@code{IS NULL}, @code{IS NOT NULL}, @code{IFNULL()}. - -@cindex @code{TIMESTAMP}, and @code{NULL} values -@cindex @code{AUTO_INCREMENT}, and @code{NULL} values -@cindex @code{NULL} values, and @code{TIMESTAMP} columns -@cindex @code{NULL} values, and @code{AUTO_INCREMENT} columns -ĤιܷǤϡ@code{NULL} ͤϥϥɥȤưޤ -⤷ơ֥κǽ @code{TIMESTAMP} @code{NULL} ʤ顢 -ߤդȻ郎ޤ⤷ @code{AUTO_INCREMENT} @code{NULL} ͤʤ顢 -Υֹ椬ޤ - -@tindex alias -@node Problems with alias, Deleting from related tables, Problems with NULL, Problems -@section @code{alias} - -@code{GROUP BY}, @code{ORDER BY}, @code{HAVING} ˤ -ܤ򻲾ȤꥨꥢѤǤޤ -ꥢϹܤȤƤɤ̾ΤͿΤ˻Ѥޤ - -@example -SELECT SQRT(a*b) as rt FROM table_name GROUP BY rt HAVING rt > 0; -SELECT id,COUNT(*) AS cnt FROM table_name GROUP BY id HAVING cnt > 0; -SELECT id AS "Customer identity" FROM table_name; -@end example - - ANSI SQL @code{WHERE} ǥꥢ򻲾Ȥ뤳Ȥ -ĤƤʤȤդƤ @code{WHERE} ¹Ԥ -ܤͤޤꤵƤʤǤ㤨СʲΥ @strong{ޤǤ} - -@example -SELECT id,COUNT(*) AS cnt FROM table_name WHERE cnt > 0 GROUP BY id; -@end example - -ɤιԤ @code{GROUP BY} ˴ޤޤ뤫뤿 @code{WHERE} ʸ -¹Ԥǡ -줿̤ΤɤιԤȤꤹ뤿 @code{HAVING} Ѥޤ - - -@node Deleting from related tables, No matching rows, Problems with alias, Problems -@section Deleting rows from related tables - -@strong{MySQL} ϸ sub-select ̤ݡȤǡޤ - @code{DELETE} ʸʣΥơ֥򰷤⥵ݡȤƤޤ -äơĤΥơ֥˴Ϣ쥳ɤäˤϡʲΤ褦ˤƹԤޤ - -@enumerate -@item -Ĥ @code{WHERE} ѤơܤȤʤơ֥뤫Ԥ @code{SELECT} -@item -ƱﲼǡܤȤʤơ֥˴ޤޤԤ @code{DELETE} -@item -@code{DELETE FROM related_table WHERE related_column IN (selected_rows)} -@end enumerate - -@code{related_column} Υιʸ1,048,576 (ǥեȤ @code{max_allowed_packet} ) 򤳤硢 -򤤤Ĥʬ䤷ơʣ @code{DELETE} ʸˤʤƤϤʤޤ - -@code{related_column} ǥåǡ100-1000 @code{related_column}ä硢 -Ϥ䤯 @code{DELETE} Ǥޤ -⤷ @code{related_column} ǥåǤʤ硢®٤ @code{IN} ΰο̵طˤʤޤ - - -@node No matching rows, ALTER TABLE problems, Deleting from related tables, Problems -@section Solving problems with no matching rows - -ʣʥ꡼Ԥäơ⤷ʤη̤֤ʤС -Υ꡼β򸫤Ĥ뤿ᡢʲμ³Ԥޤ - -@enumerate -@item -@code{EXPLAIN} Ѥƥ꡼ƥȤʴְ㤤򸫤Ĥޤ -@xref{EXPLAIN, , @code{EXPLAIN}}. - -@item -@code{WHERE} ǻѤƤեɤ Select Ƥߤޤ - -@item -̤֤äƤޤǡİĥ꡼ơ֥Ƥޤ -ơ֥뤬礭硢@code{LIMIT 10} 򥯥꡼ǻѤ뤳Ȥɤޤ - -@item -Ԥ˥ޥå٤Ǥ @code{SELECT} Ƥߤޤ -ξ硢select Τϡ嵭ǺǸ˼ơ֥ФƹԤޤ - -@item -⤷ @code{FLOAT} @code{DOUBLE} ΤΤӤʤ顢 - @code{=} ϻѤʤǤϤۤȤɤΥԥ塼ˤơ -ưͤϤԤäͤˤʤʤǤ - -@example -mysql> SELECT * FROM table_name WHERE float_column=3.5; - -> -mysql> SELECT * FROM table_name WHERE float_column between 3.45 and 3.55; -@end example - -In most cases, changing the @code{FLOAT} to a @code{DOUBLE} will fix this! - -@item -⤷ʤˤⰭȤ򸫤Ĥ뤳ȤǤʤä硢 -ʥƥȤĤä @code{mysql test < query.sql} ԤäƤߤƤ -@code{mysqldump --quick database tables > query.sql} ǥƥȥեǤޤ -Υե򥨥ǥԽĤinsertԤ(¿ʤ)äޤ -ƥեκǸselectʸդ­ޤ - -ƥȤԤˤϡ - -@example -shell> mysqladmin create test2 -shell> mysql test2 < query.sql -@end example - -@code{mysqlbug} Ѥ @email{mysql@@lists.mysql.com} ˥ƥȤƤƤ -@end enumerate - -@node ALTER TABLE problems, Change column order, No matching rows, Problems -@section Problems with @code{ALTER TABLE}. - -⤷ @code{ALTER TABLE} ʲΤ褦ʥ顼ǻ硧 - -@example -Error on rename of './database/name.frm' to './database/B-a.frm' (Errcode: 17) -@end example - -ϰ @code{ALTER TABLE} @strong{MySQL} å夷Ƥꡢ -@file{A-something} @file{B-something} Ȥ̾ΡäήƤ -Ťơ֥뤬¸ߤƤޤ -ξ硢@strong{MySQL} ǡǥ쥯ȥꡢ@code{A-} @code{B-} ǻϤޤ -̾ĥեƾäޤ -(äˤɤ˰ưƤ⹽ޤ) - -@code{ALTER TABLE} ϰʲΤ褦ưޤ: - -@itemize @bullet -@item ѹ׵Τä @file{A-xxx} Ȥ̾οơ֥ -@item Υơ֥ƤιԤ @file{A-xxx} ˥ԡ -@item Υơ֥ @file{B-xxx} ̾ѹ -@item @file{A-xxx} ϸΥơ֥̾̾ѹ롣 -@item @file{B-xxx} Ͼõ롣 -@end itemize - -⤷̾ѹκݤ꤬ȡ@strong{MySQL} ѹä褦ưޤ -̿Ū꤬(ꤨޤ)@strong{MySQL} ϸθŤơ֥ - @file{B-xxx} Ȥ̾ΤޤޤˤƤޤñ̾ѹХǡޤ - -@node Change column order, , ALTER TABLE problems, Problems -@section How to change the order of columns in a table - -The whole point of SQL is to abstract the application from the data -storage format. You should always specify the order in wish you wish to -retrieve your data. For example: - -@example -SELECT col_name1, col_name2, col_name3 FROM tbl_name; -@end example - -will return columns in the order @code{col_name1}, @code{col_name2}, @code{col_name3}, whereas: - -@example -SELECT col_name1, col_name3, col_name2 FROM tbl_name; -@end example - -will return columns in the order @code{col_name1}, @code{col_name3}, @code{col_name2}. - -You should @strong{NEVER}, in an application, use @code{SELECT *} and -retrieve the columns based on their position, because the order in which columns are -returned @strong{CANNOT} be guaranteed over time; A simple change to -your database may cause your application to fail rather dramatically. - -If you want to change the order of columns anyway, you can do it as follows: - -@enumerate -@item -Create a new table with the columns in the right order. -@item -Execute -@code{INSERT INTO new_table SELECT fields-in-new_table-order FROM old_table}. -@item -Drop or rename @code{old_table} -@item -@code{ALTER TABLE new_table RENAME old_table} -@end enumerate - -@node Common problems, Clients, Problems, Top -@chapter Solving some common problems with @strong{MySQL} - -@cindex Replication -@menu -* Log Replication:: Ѥǡ١ʣ -* Backup:: ǡ١ΥХåå -* Update log:: The update log -* Multiple servers:: Ʊޥʣ @strong{MySQL} С餻 -@end menu - -@cindex Database replication -@cindex Log Replication, database -@node Log Replication, Backup, Common problems, Common problems -@section Ѥǡ١ʣ - -Now that master-slave internal replication is available starting in 3.23.15, this is the recommended way. -However, it is still possible to replicate a database by using the update log. -@xref{Update log}. ϡĤΥǡ١ޥ()ȤưդޤäƤ -(ƤΥǡѹǹԤޤ)ġİʾ¾ΥС졼() -ưƤ뤳Ȥ׵ᤷޤ -졼֤򹹿ˤ -@code{mysql < update_log} ¹ԤǤ -졼֥ǡ١Υۥȡ桼ѥɤ򥳥ޥɤΥץͿ -ޥϤ˻Ѥޤ - -⤷ơ֥뤫ʤˤʤ硢 @code{TIMESTAMP} եɤѤС -Ǹʣʸˡ줿Τѹ줿Τ -ߥ顼С˥ԡǤޤ(ǸʣԤä֤ӤФǤޤ) - -(Τ)ȥॹ(ξ¦)ξѤ2Ĥˡ -ƥ뤳ȤǤޤξϡƱǡξ¦ -줿ˡʤͤǤʤФʤޤ󡣤ʤϤ餯 -줿ꤹΤ뤿ˡŤСݻ -礦 - -λԤʣˤ SQL ơȥȤǹԤ뤿ᡢǡ١򹹿 -륹ơȥǼδؿϻȤäƤϤޤ󡣤¾ -ԡΥФȤϰ㤦֤ͤǤ: - -@itemize @bullet -@item @code{DATABASE()} -@item @code{GET_LOCK()} and @code{RELEASE_LOCK()} -@item @code{RAND()} -@item @code{USER()}, @code{SYSTEM_USER()} or @code{SESSION_USER()} -@item @code{VERSION()}, @code{CONNECT_ID()} -@end itemize - -Ƥλؿϡɬפʾ˥ߥ顼˥ॹפ褦ˤơ -˻ѤǤޤ@code{LAST_INSERT_ID()} ˻ѤǤޤ - - -@cindex Backups -@node Backup, Update log, Log Replication, Common problems -@section ǡ١ΥХåå - -@strong{MySQL} ơ֥ϥեȤƳǼ뤿ᡢХååפ -ΤϴñǤ̷ΤʤХååפ뤿ˤϡ@code{LOCK TABLES} -Ϣơ֥ǹԤäƤ@xref{LOCK TABLES, , @code{LOCK TABLES}}. -ɤ߹ߥå -ɬפʤΤǡΥơ֥ǥǡ١ǥ쥯ȥΥեΥԡ -ԤƤ֤⡢¾Υåɤϥ³Ǥޤ⤷ϡơ֥ -SQL ٥ǥХååפΤǤС@code{SELECT INTO OUTFILE} -ѤǤޤ - -¾ˡ @code{mysqldump} ץѤ뤳ȤǤ: - -@enumerate -@item -եХååפȤˤϡ - -@example -shell> mysqldump --tab=/path/to/some/dir --opt --full -@end example - -㤷Сäǡѹ򤷤ʤΤǤС -ñƤΥơ֥ե(@file{*.frm}, @file{*.MYD}, @file{*.MYI} files) -ԡǤ⹽ޤ -The script @code{mysqlhotcopy} does use this method. - -@item -@cindex Log file, names -@code{mysqld} ߤᡢ @code{--log-update[=file_name]} ץĤƵưޤ -@xref{Update log}. եϡ @code{mysqldump} ¹Ը˹Ԥ줿ǡ١ѹ -ʣ뤿ξͿƤޤ -@end enumerate - -⤷ꥹȥ򤷤ʤФʤʤ硢ޤǽ @code{myisamchk -r} ¹Ԥ -ơ֥νߤƤ -ۤȤɤξ硢99.9% ϤǤϤǤ -⤷ @code{myisamchk} Ԥ硢ʲΤ褦ˤޤ -(This will only work if you have started @strong{MySQL} with -@code{--log-update}. @xref{Update log}.) - -@enumerate -@item -ꥸʥ @code{mysqldump} Хååץǡꥹȥޤ -@item -ʲΥޥɤΤ褦ˤơ˵ϿƤѹŬѤޤ -@example -shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql -@end example -@end enumerate - -@code{ls} ϡƤιե뤿˹Ԥޤ - -@code{SELECT * INTO OUTFILE 'file_name' FROM tbl_name} ǤŪХååפ -@code{LOAD DATA FROM INFILE 'file_name' REPLACE ...} ǤΥꥹȥԤ -ȤǤޤʣ쥳ɤ򤱤뤿ˤϡơ֥ @code{PRIMARY KEY} - or a @code{UNIQUE} ɬפǤ@code{REPLACE} ϡ'ʣǥå' ͤä硢 -쥳ɤ˸Ť쥳ɤΤ֤뤳Ȥ̣ޤ - -@cindex Update log -@node Update log, Multiple servers, Backup, Common problems -@section - -@code{--log-update=file_name}ץѤ@code{mysqld}ưȡ -ǡ򹹿ƤSQLޥɤե˽񤭤ޤ -⤷ file_name Ϳʤäϡۥ̾ǥեȤǻѤޤ -⤷ file_name ˥ǥ쥯ȥѥޤޤʤäϡ -Υեϥǡǥ쥯ȥ˽񤫤ޤ -⤷ file_name ĥʤäʤ顢@code{mysqld} -@code{file_name.#} Ȥǥեޤ -Υեϥǡǥ쥯ȥˤ졢 -̾ @code{file_name.#} Ȥ̾ˤʤäƤޤ - -@code{#} @code{mysqladmin refresh} @code{mysqladmin flush-logs} ¹Ԥ٤ˡ -뤤 @code{FLUSH LOGS} ʸ¹ԤꡢСꥹȤ٤ -ưŪǤ - -⤷ @code{--log} @code{-l} ץѤ硢ե̾ -@code{mysqld} Υ @file{hostname.log} ˽񤭽Фޤ -ξ硢ꥹȤեåԤäƤ⿷եޤ -(٥ƺ٥ץ󤷤ޤ) -ǥեȤǤϡ@code{mysql.server} ץȤ @code{-l} ץղä -@strong{MySQL} Сưޤ -⤷ @strong{MySQL} Υѥեޥ󥹤򤢤ִĶʤɤǻѤ硢 -@code{mysql.server} ץȤ @code{-l} ץ򳰤Ƥ - -ϡºݤ˹줿ǡΥơȥȤ񤯤ᡢӤӤưޤ -@code{WHERE} Ѥ @code{UPDATE} @code{DELETE} Ƿ̤ʤä硢 -Ͻ񤭽Фޤ -Ǥ˥åȤƤͤˡ⤦ٹܤ򹹿褦 @code{UPDATE} ⥹åפޤ - -եι˽äƥǡ١򹹿ϡԤޤ -(ե̾ @file{file_name.#} Ȳꤷޤ): - -@example -shell> ls -1 -t -r file_name.[0-9]* | xargs cat | mysql -@end example - -@code{ls} ƤΥե¤٤뤿˻ѤƤޤ - -ϡå˥Хååפ֤ޤꤿ뤤ϡ -Хååפ夫饯å夹ޤǤδ֤ΥǡιԤ -ʾ˻Ȥޤ - -@cindex Database replication -@cindex Replication, database -@cindex Database mirroring -@cindex Mirroring, database -ϰ㤦ۥȤΥǡ١Υߥ顼ޥǡ١ʣˤѤǤޤ -@xref{Replication}. - -@cindex Multiple servers -@node Multiple servers, , Update log, Common problems -@section Ʊޥʣ @strong{MySQL} С餻 - -ƱޥʣΥС餻礬ޤ -㤨СǤ¸ߤƤ륵СϤΤޤޤˤƤơ @strong{MySQL} ƥȤ䡢 -뤤ϡ󥿡ͥåȥץХĤǤơ@strong{MySQL} 򤽤줾θܵѤ󶡤ʤɡ - -ʣΥС򤿤硢ñˡȤơ -TCP/IP ݡȡåȥեѤơС򥳥ѥ뤹ˡޤ - -ǤäƤ륵СǥեȤΥݡֹȥåȥեưƤȤޤ -СˤϡʲΤ褦 @code{configure} ޤ - -@example -shell> ./configure --with-tcp-port=port_number \ - --with-unix-socket=file_name \ - --prefix=/usr/local/mysql-3.22.9 -@end example - -@code{port_number} @code{file_name} ˤϡǥեȤΥݡֹ桢åȥեȤϰ㤦Τꤷޤ - @code{--prefix} 򡢤ǤäƤ @strong{MySQL} Υ󥹥ȡȤϰ㤦ǥ쥯ȥ꡼˻ꤷޤ - -äƤ @strong{MySQL} СΥåȤȥݡȤΤˤϡʲΤ褦ˤޤ - -@example -shell> mysqladmin -h hostname --port=port_number variables -@end example - -ʤѤƤݡȤ @strong{MySQL} СäƤС -ѹǽ @strong{MySQL} ѿ(åȥե̾ޤ)Ϥޤ - -Ω夲ץ(餯 @file{mysql.server} ե)Խ -ʣ @strong{MySQL} СΩƤ⹽ޤ - -ξ硢 @strong{MySQL} Сƥѥ뤹ɬפϤޤ -@code{safe_mysqld} ΥץꤷƥСưСݡȤȥåȤѹǤޤ - -@example -shell> /path/to/safe_mysqld --socket=file-name --port=port_number -@end example - -⤷¾ΥС󥰤ԤäƤǥ쥯ȥƱǡ١ǥ쥯ȥ -СǻѤΤǤСե̾ꤹ٤Ǥ -( @code{safe_mysqld} @code{--log} @code{--log-update} ꤹ) -ʤȡξΥСƱե˽񤭹⤦Ȥ뤫Ǥ - -@strong{Warning}: ̾ĥСƱǡ١ƤϤޤ -⤷ѤƤ OS fault-free system locking 򥵥ݡȤƤʤȡ -ỴʤȤˤʤǤ礦 - -⤷ܤΥС˰㤦ǡ١ǥ쥯ȥѤ硢 - @code{safe_mysqld} @code{--datadir=path} ץꤷޤ - -@example -shell> /path/to/safe_mysqld --datadir=/new/path/to/datadir \ - --socket=file-name --port=file-name -@end example - -⤷㤦ݡȤäƤ @strong{MySQL} Сˡ -ޤ㤦ݡȤѤ褦˺줿饤Ȥ³硢 -ʲΤ褦ˤޤ - -@itemize @bullet -@item -饤Ȥ @code{--host 'hostname' --port=port_numer} -@code{[--host localhost] --socket=file_name} ץǵưޤ - -@item -C 뤤 Perl ץξ硢ݡȤȥåȤͿ뤳ȤǤޤ - -@item -@tindex MYSQL_UNIX_PORT environment variable -@tindex MYSQL_TCP_PORT environment variable -@tindex Environment variable, MYSQL_UNIX_PORT -@tindex Environment variable, MYSQL_TCP_PORT -@code{MYSQL_UNIX_PORT} @code{MYSQL_TCP_PORT} Ķѿ UNIX åȥե - TCP/IP ΥݡֹȥåȤ饤ȤΩޤ -⤷Υݡֹ䥽åȥե˻ѤΤǤС - @file{.login} ե뤫ʤˤ˴Ķѿ򥻥åȤ褦˽񤤤ƤФ褤Ǥ礦 -@xref{Environment variables}. @xref{Programs}. - -@item -@tindex .my.cnf file -ʤΥۡǥ쥯ȥ @file{.my.cnf} եˡ -̾Ѥݡֹȥåȥե񤯤ȤǤޤ -@xref{Option files}. -@end itemize - -@node Clients, Comparisons, Common problems, Top -@chapter @strong{MySQL} 饤ȥġ API - -@menu -* C:: @strong{MySQL} C API -* C API datatypes:: C API ǡ -* C API function overview:: C API ؿ -* C API functions:: C API ؿ -* Perl:: @strong{MySQL} Perl API -* Eiffel:: @strong{MySQL} Eiffel wrapper -* Java:: @strong{MySQL} Java connectivity (JDBC) -* PHP:: @strong{MySQL} PHP API -* Cplusplus:: @strong{MySQL} C++ APIs -* Python:: @strong{MySQL} Python APIs -* Tcl:: @strong{MySQL} Tcl APIs -* Ruby:: @strong{MySQL} Ruby API -@end menu - -@node C, C API datatypes, Clients, Clients -@section @strong{MySQL} C API - -C API ɤ @strong{MySQL} ȤȤۤޤ -@code{libmysqlclient} 饤֥˴ޤޤ졢C ץफǡ١ -Υޤ - -MySQL ǥȥӥ塼Υ饤Ȥ¿ C ǽ񤫤ƤޤC API λ -ˡ򼨤õʤ顢Υ饤ȤĴ٤Ƥ - -¾Υ饤 API ¿(Java )ϡ@strong{MySQL} Ф -̿ˤΥ饤֥ѤޤΤᡢ㤨С¾Υ饤ȥ -ǻѤΤƱĶѿ¿뤳ȤǤޤ -ϥ饤֥꤫黲Ȥ뤫ǤѿΥꥹȤˤĤƤ -@ref{Programs} 򻲾ȤƲ - -饤ȤϺ̿Хåեޤǽ˳ƤХ -եΥ(16K Х)ϼưŪ˺祵(ǥեȤ 24M)ޤä -ޤХåեɬפ˱ä뤿ᡢñ˥ǥեȤκ -¤äƤ⡢ǻ񸻤Ѥ뤳ȤϤޤ󡣤Υ -ϼ˴ְä̿ѥåȤΤΥåǤ - -̿ХåեϰĤ SQL ơȥ(饤Ȥ饵Фؤ̿)ȡ -֤ǡ(Ф饯饤Ȥؤ̿)Σ쥳ɤޤΤ -ʬ礭ʤƤϤޤ󡣳ƥåɤ -̿ХåեϡǤդΥ쥳ɤ䥯뤿ˡꤵ줿¤ޤưŪ -礷ޤ㤨С 16M Υǡޤ @code{BLOB} ͤ硢 -ʤȤ 16M ̿Хåե¤Ȥƻɬפޤ(Фȥ饤 -Ȥξ) -饤ȤΥǥեȤκͤ 24M ǤФκͤΥǥեȤ -1M Ǥϥеưˡ@code{max_allowed_packet} ѥ᡼ -ͤѹ뤳Ȥˤꡢ䤹Ȥޤ -@xref{Server parameters}. - -@strong{MySQL} Фϡƥ˳̿Хåե -@code{net_buffer_length} ХȤ˽̾ޤ -饤ȤǤϡ³˳Ƥ줿ХåեΥϡ³ĤޤǸޤ -饤ȥ³줿Ĵޤ - -åɥץߥ󥰤Ԥʤϡ@strong{MySQL} C API -@code{--with-thread-safe-client} դǥѥ뤹٤Ǥ C -API ³Υåɰˤޤξ˸¤ꡢĤΥåɤƱ -³ͭǤޤ: - -@table @asis -@item -ĤΥåɤƱ³Ʊ @strong{MySQL} ˥뤳Ȥ -Ǥޤä @code{mysql_query()} @code{mysql_store_result()} δ -ǡ¾ΥåɤƱ³ѤʤȤμ¤ˤɬפޤ -@item -¿Υåɤ @code{mysql_store_result()} ǼФ줿̡η̥ -Ȥ˥Ǥޤ -@item -@code{mysql_use_result} Ѥ硢̥åȤޤǡ¾ -ΥåɤƱ³DzҤͤʤȤμ¤ˤɬפޤ -@end table - -@node C API datatypes, C API function overview, C, Clients -@section C API ǡ -@table @code - -@tindex MYSQL C type -@item MYSQL -ι¤ΤϰĤΥǡ١³Υϥɥɽ路ޤϤۤȤ - @strong{MySQL} ؿ˻Ѥޤ - -@tindex MYSQL_RES C type -@item MYSQL_RES -ι¤Τϥ쥳ɤ֤(@code{SELECT}, @code{SHOW}, @code{DESCRIBE}, @code{EXPLAIN})η̤ɽ -ޤ꤫֤ϡλĤǤ@emph{̥å}ȸ -Фޤ - -@tindex MYSQL_ROW C type -@item MYSQL_ROW -ϥǡΣ쥳ɤΰʷɽǤϸߥХʸȤƼ -Ƥޤ(եͤХʥǡޤळȤ硢 NULL -üʸȤưȤϤǤޤ󡣤Τ褦ͤ NULL ХȤ -ळȤ뤫Ǥ) @code{mysql_fetch_row()} θƤӽФˤ쥳ɤ -ޤ - -@tindex MYSQL_FIELD C type -@item MYSQL_FIELD -ι¤ΤϥեɤˤĤƤξ󡢤Ĥޤեɤ̾ -ޤǤޤΥФϸǤ˾ܺ٤Ƥޤ -@code{mysql_fetch_field()} 򷫤֤ƤӽФȤˤꡢƥեɤ -@code{MYSQL_FIELD} ¤Τ뤳ȤǤޤ -եͤϤι¤ΤΰǤϤޤ; @code{MYSQL_ROW} ¤ -Τ˴ޤޤƤޤ - -@tindex MYSQL_FIELD_OFFSET C type -@item MYSQL_FIELD_OFFSET -ϡ@strong{MySQL} եɥꥹȤؤΥեåȤΰʷɽǤ -(@code{mysql_field_seek()} ǻѤޤ)եåȤϥ쥳Υե -ֹǡ0 Ϥޤޤ - -@tindex my_ulonglong C type -@tindex my_ulonglong values, printing -@item my_ulonglong -쥳ɿ @code{mysql_affected_rows()}, -@code{mysql_num_rows()} @code{mysql_insert_id()} ˻Ѥ뷿Ǥ -η @code{0} @code{1.84e19} ϰϤͿޤ - -ƥˤäƤϡ@code{my_ulonglong} ͤɽ褦ȤƤ⡢ư -ʤȤޤͤɽˤϡ@code{unsigned long} Ѵ -@code{%lu} Ͻ񼰤ѤƤ: -@example -printf (Number of rows: %lu\n", (unsigned long) mysql_num_rows(result)); -@end example -@end table - -@noindent -@code{MYSQL_FIELD} ¤ΤϼΥФޤߤޤ: - -@table @code -@item char * name -եɤ̾nullüʸ - -@item char * table -Υեɤޤơ֥̾׻줿եɤǤʤΤͭ -Ǥ׻줿եɤǤϡ@code{table} ͤ϶ʸǤ - -@item char * def -ΥեɤΥǥե͡nullüʸ - @code{mysql_list_fields()} ѻˤꤵޤ - -@item enum enum_field_types type -եɤη -@code{type} ͤϼΰĤǤ: - -@multitable @columnfractions .3 .55 -@item @strong{} @tab @strong{ΰ̣} -@item @code{FIELD_TYPE_TINY} @tab @code{TINYINT} ե -@item @code{FIELD_TYPE_SHORT} @tab @code{SMALLINT} ե -@item @code{FIELD_TYPE_LONG} @tab @code{INTEGER} ե -@item @code{FIELD_TYPE_INT24} @tab @code{MEDIUMINT} ե -@item @code{FIELD_TYPE_LONGLONG} @tab @code{BIGINT} ե -@item @code{FIELD_TYPE_DECIMAL} @tab @code{DECIMAL} ޤ @code{NUMERIC} ե -@item @code{FIELD_TYPE_FLOAT} @tab @code{FLOAT} ե -@item @code{FIELD_TYPE_DOUBLE} @tab @code{DOUBLE} ޤ @code{REAL} ե -@item @code{FIELD_TYPE_TIMESTAMP} @tab @code{TIMESTAMP} ե -@item @code{FIELD_TYPE_DATE} @tab @code{DATE} ե -@item @code{FIELD_TYPE_TIME} @tab @code{TIME} ե -@item @code{FIELD_TYPE_DATETIME} @tab @code{DATETIME} ե -@item @code{FIELD_TYPE_YEAR} @tab @code{YEAR} ե -@item @code{FIELD_TYPE_STRING} @tab ʸ (@code{CHAR} ޤ @code{VARCHAR}) ե -@item @code{FIELD_TYPE_BLOB} @tab @code{BLOB} ޤ @code{TEXT} ե (Ĺꤹˤ @code{max_length} ѤƲ) -@item @code{FIELD_TYPE_SET} @tab @code{SET} ե -@item @code{FIELD_TYPE_ENUM} @tab @code{ENUM} ե -@item @code{FIELD_TYPE_NULL} @tab @code{NULL} ե -@item @code{FIELD_TYPE_CHAR} @tab 侩; @code{FIELD_TYPE_TINY} ˻ѤƤ -@end multitable - -@code{IS_NUM()} ޥǡեɤͥפɤƥȤǤޤ -եɤͤξ硢@code{type} Ф @code{IS_NUM()} Ϥ -TRUE ɾޤ: - -@example -if (IS_NUM(field->type)) - printf("Field is numeric\n"); -@end example - -@item unsigned int length -եɤϥơ֥ǻꤵ줿ΤǤ - -@item unsigned int max_length -̥åȤΥեɤκ(ºݤη̥åȤΥ쥳ɤκĹե -Ĺ)@code{mysql_store_result()} ޤ @code{mysql_list_fields()} -Ѥϡϥեɤκˤʤޤ -@code{mysql_use_result()} Ѥϡѿͤ 0 ˤʤޤ - -@item unsigned int flags -եɤμΥӥåȥե饰@code{flags} ͤ 0 ޤϼΥӥåȤΰ -ʾȤ߹碌Ǥ: - -@multitable @columnfractions .3 .55 -@item @strong{ե饰} @tab @strong{ե饰ΰ̣} -@item @code{NOT_NULL_FLAG} @tab եɤ @code{NULL} ˤǤʤ -@item @code{PRI_KEY_FLAG} @tab եɤϥץ饤ޥꥭΰǤ -@item @code{UNIQUE_KEY_FLAG} @tab եɤϥˡΰǤ -@item @code{MULTIPLE_KEY_FLAG} @tab եɤˡΰǤ -@item @code{UNSIGNED_FLAG} @tab եɤ @code{UNSIGNED} °äƤ -@item @code{ZEROFILL_FLAG} @tab եɤ @code{ZEROFILL} °äƤ -@item @code{BINARY_FLAG} @tab եɤ @code{BINARY} °äƤ -@item @code{AUTO_INCREMENT_FLAG} @tab եɤ @code{AUTO_INCREMENT} °äƤ -@item @code{ENUM_FLAG} @tab եɤ @code{ENUM} Ǥ (侩) -@item @code{BLOB_FLAG} @tab եɤ @code{BLOB} ޤ @code{TEXT} Ǥ (侩) -@item @code{TIMESTAMP_FLAG} @tab եɤ @code{TIMESTAMP} Ǥ (侩) -@end multitable - -@code{BLOB_FLAG}, @code{ENUM_FLAG}, @code{TIMESTAMP_FLAG} λѤϿ侩 -ޤ󡣤Ϸ°ǤϤʤեɤη򼨤Ǥ - @code{field->type} @code{FIELD_TYPE_BLOB}, @code{FIELD_TYPE_ENUM}, -@code{FIELD_TYPE_TIMESTAMP} ФƥƥȤ򤪴ᤷޤ - -@noindent - @code{flags} ͤŵŪʻѤ򼨤Ƥޤ: - -@example -if (field->flags & NOT_NULL_FLAG) - printf("Field can't be null\n"); -@end example - -@code{flags} ͤο֤Ĵ٤뤿ˡʥޥѤǤ -ޤ: - -@multitable @columnfractions .3 .5 -@item @code{IS_NOT_NULL(flags)} @tab Υեɤ @code{NOT NULL} ȤƤп -@item @code{IS_PRI_KEY(flags)} @tab Υեɤץ饤ޥꥭʤп -@item @code{IS_BLOB(flags)} @tab Υեɤ @code{BLOB} ޤ @code{TEXT} ʤп (侩; @code{field->type} ƥȤƲ) -@end multitable - -@item unsigned int decimals -ͥեɤξ -@end table - -@node C API function overview, C API functions, C API datatypes, Clients -@section C API ؿ - -C API ˤϼ˰줿ؿ¸ߤޤδؿϼǤ -ܺ٤Ƥޤ -@xref{C API functions} - -@multitable @columnfractions .3 .7 -@item @strong{mysql_affected_rows()} @tab -Ǹ @code{UPDATE}, @code{DELETE}, @code{INSERT} ˤäƱƶ -줿쥳ɿ֤ޤ - -@item @strong{mysql_close()} @tab -³򥯥ޤ - -@item @strong{mysql_connect()} @tab -@strong{MySQL} Ф³ޤδؿϿ侩ޤ; -@code{mysql_real_connect()} ѤƤ - -@item @strong{mysql_change_user()} @tab -³ΤΥ桼ȥǡ١ѹޤ - -@item @strong{mysql_create_db()} @tab -ǡ١ޤδؿϿ侩ޤ; SQL ޥ - @code{CREATE DATABASE} ѤƤ - -@item @strong{mysql_data_seek()} @tab -̥åǤդΥ쥳ɤ˥ޤ - -@item @strong{mysql_debug()} @tab -Ϳ줿ʸ @code{DBUG_PUSH} Ԥʤޤ - -@item @strong{mysql_drop_db()} @tab -ǡ١˴ޤδؿϿ侩ޤ; SQL ޥ - @code{DROP DATABASE} ѤƤ - -@item @strong{mysql_dump_debug_info()} @tab -ФˡǥХå˽񤭽Фޤ - -@item @strong{mysql_eof()} @tab -̥åȤκǸΥ쥳ɤɤޤ줿ɤȽꤷޤδؿϿ侩ޤ -; @code{mysql_errno()} ޤ @code{mysql_error()} ѤƲ - - -@item @strong{mysql_errno()} @tab -Ǹ @strong{MySQL} ؿΥ顼ֹ֤ޤ - -@item @strong{mysql_error()} @tab -Ǹ @strong{MySQL} ؿΥ顼å֤ޤ - -@item @strong{mysql_real_escape_string()} @tab -Escapes special characters in a string for use in a SQL statement taking -into account the current charset of the connection. - -@item @strong{mysql_escape_string()} @tab -SQL ơȥǻѤ뤿ʸüʸ򥨥פޤ - -@item @strong{mysql_fetch_field()} @tab -ơ֥μΥեɤη֤ޤ - -@item @strong{mysql_fetch_field_direct()} @tab -ơ֥Ρֹǻꤵ줿եɤη֤ޤ - -@item @strong{mysql_fetch_fields()} @tab -ƤΥեɹ¤Τ֤ޤ - -@item @strong{mysql_fetch_lengths()} @tab -ߤΥ쥳ƤΥեɤĹ֤ޤ - -@item @strong{mysql_fetch_row()} @tab -̥åȤ鼡Υ쥳ɤФޤ - -@item @strong{mysql_field_seek()} @tab -ꤵ줿եɾ˥եɥ֤ޤ - -@item @strong{mysql_field_count()} @tab -ǸΥη̤Υեɤο֤ޤ - -@item @strong{mysql_field_tell()} @tab -Ǹ @code{mysql_fetch_field()} ǻѤ줿եɥΰ֤ -ޤ - -@item @strong{mysql_free_result()} @tab -̥åȤˤäƻѤ줿ޤ - -@item @strong{mysql_get_client_info()} @tab -饤ȥС֤ޤ - -@item @strong{mysql_get_host_info()} @tab -³ʸ֤ޤ - -@item @strong{mysql_get_proto_info()} @tab -³˻ѤץȥС֤ޤ - -@item @strong{mysql_get_server_info()} @tab -ФΥСֹ֤ޤ - -@item @strong{mysql_info()} @tab -Ǹ˼¹Ԥ줿ˤĤƤξ֤ޤ - -@item @strong{mysql_init()} @tab -@code{MYSQL} ¤ΤޤϽޤ - -@item @strong{mysql_insert_id()} @tab -@code{AUTO_INCREMENT} եɤ˺Ǹ줿 ID ֤ޤ - -@item @strong{mysql_kill()} @tab -ꤵ줿åɤ򻦤ޤ - -@item @strong{mysql_list_dbs()} @tab -ʰɽŬ礹ǡ١֤̾ޤ - -@item @strong{mysql_list_fields()} @tab -ʰɽŬ礹ե֤̾ޤ - -@item @strong{mysql_list_processes()} @tab -ߤΥХåɤΥꥹȤ֤ޤ - -@item @strong{mysql_list_tables()} @tab -ʰɽŬ礹ơ֥֤̾ޤ - -@item @strong{mysql_num_fields()} @tab -̥åΥեɿ֤ޤ - -@item @strong{mysql_num_rows()} @tab -̥åΥ쥳ɿ֤ޤ - -@item @strong{mysql_options()} @tab -@code{mysql_connect()} Τ³ץꤷޤ - -@item @strong{mysql_ping()} @tab -Фؤ³ưƤ뤫ɤåޤ -ɬפǤк³ޤ - -@item @strong{mysql_query()} @tab -NULL üʸȤƵҤ줿 SQL ¹Ԥޤ - -@item @strong{mysql_real_connect()} @tab -@strong{MySQL} Ф³ޤ - -@item @strong{mysql_real_query()} @tab -줿ʸȤƵҤ줿 SQL ¹Ԥޤ - -@item @strong{mysql_reload()} @tab -¥ơ֥ɤ߹ߤ褦˥Ф˻ؼޤ - -@item @strong{mysql_row_seek()} @tab -̥åΤ쥳ɤإޤ@code{mysql_row_tell()} ֤ͤ -Ѥޤ - -@item @strong{mysql_row_tell()} @tab -쥳ɥΰ֤֤ޤ - -@item @strong{mysql_select_db()} @tab -ǡ١򤷤ޤ - -@item @strong{mysql_shutdown()} @tab -ǡ١Ф򥷥åȥ󤷤ޤ - -@item @strong{mysql_start_slave()} @tab -Starts slave replication thread - -@item @strong{mysql_stat()} @tab -ʸǥо֤֤ޤ - -@item @strong{mysql_store_result()} @tab -饤Ȥ˴ʷ̥åȤФޤ - -@item @strong{mysql_stop_slave()} @tab -Stops slave replication thread - -@item @strong{mysql_thread_id()} @tab -ߤΥå ID ֤ޤ - -@item @strong{mysql_thread_save()} @tab -Returns 1 if the clients are compiled as threadsafe. - -@item @strong{mysql_use_result()} @tab -ƥ쥳ɤưŪ̥åȤޤ -@end multitable - -Ф³ˤϡ³ϥɥ뤿 @code{mysql_init()} -ƤӤ줫 @code{mysql_real_connect()} 򤽤ΥϥɥǸƤӤ -ޤ (ۥ̾桼̾ѥɤΤ褦¾ξ˲ä) -Upon connection, @code{mysql_real_connect()} sets the -@code{reconnect} flag (part of the MYSQL structure) to a value of -@code{1}. This flag indicates, in the event that a query cannot be -performed because of a lost connection, to try reconnecting to the -server before giving up. -³ -νλϡ³λ뤿 @code{mysql_close()} ƤӤ -ޤ - -³ͭʴ֤ϡ饤Ȥ @code{mysql_query()} ޤ -@code{mysql_real_query()} Ѥ SQL 򥵡ФǤޤ -ΣĤΰ㤤ϡ@code{mysql_query()} NULLüʸȤƥ꤬Ҥ -뤳ȤԤΤФ@code{mysql_real_query()} Ͽ줿ʸ -Ԥ뤳ȤǤʸ󤬥Хʥǡ(NULХȤޤߤȤ)ޤ -ϡ@code{mysql_real_query()} Ѥɬפޤ - -@code{SELECT} (㤨С@code{INSERT}, @code{UPDATE}, -@code{DELETE})Ǥϡɤ줯餤Υ쥳ɤƶ(ѹ)줿 -@code{mysql_affected_rows()} ƤӽФȤǸĤФȤǤޤ - -@code{SELECT} Ǥϡ򤵤줿쥳ɤ̥åȤȤƼФޤ -(: ĤΥơȥȤϡ쥳ɤ֤Ȥ -@code{SELECT}˻Ƥޤ @code{SHOW}, @code{DESCRIBE}, -@code{EXPLAIN} Ǥ @code{SELECT} ơȥȤƱˡǰ -٤Ǥ) - -饤Ȥ̥åȤˤϣĤˡޤܤϡ -@code{mysql_store_result()} ƤӽФȤḁ̇̄åΤ٤ˤ٤ -ФȤǤδؿϥФ饯ˤä֤뤹٤ƤΥ쥳 -ɤ򥯥饤Ȥ˳Ǽޤܤϡ -@code{mysql_use_result()} ƤӽФȤǡ쥳ɤȤη̥åȼ -뤳ȤǤδؿϼФޤºݤˤϥ -鲿Υ쥳ɤޤ - -ɤξǤ⡢@code{mysql_fetch_row()} ƤӽФƥ쥳ɤ˥ -ޤ@code{mysql_store_result()} Ǥϡ@code{mysql_fetch_row()} ϴ -ФƤ쥳ɤ˥ޤ -@code{mysql_use_result()} Ǥϡ@code{mysql_fetch_row()} ϼºݤ˥Ф -쥳ɤФޤƥ쥳ɤΥǡͤΥˤĤƤξ -@code{mysql_fetch_lengths()} ƤӽФȤޤ - -̥åȤǤνäϡ@code{mysql_free_result()} ƤӽФ -줬ѤƤƲ - -ΣĤμФŪʤΤǤ饤ȥץϡɬפ -äƤäȤŬڤʥץ򤹤٤ǤŪˡ饤Ȥϰ -̤ @code{mysql_store_result()} Ѥ뷹ˤޤ - -@code{mysql_store_result()} ϡ٤ƤΥ쥳ɤ򥯥饤Ȥ˼ -뤿ᡢϢ³ƥ쥳ɤ򥢥ǤǤʤ̥åθ -Υ쥳ɰ֤ѹ뤿ˡ@code{mysql_data_seek()} -@code{mysql_row_seek()} Ѥơ̥åȤ˰ư뤳Ȥ -Ǥޤޤ@code{mysql_num_rows()} ƤӽФȤǡ쥳ɿ򸫤 -뤳ȤǤޤ@code{mysql_store_result()} ɬץϡ礭 -ʷ̥åȤǤϤȤƤ⤯out-of-memory ֤ǽ⤯ʤ - - -@code{mysql_use_result()} ϡ٤˰ĤΥ쥳ɤݻ뤿ᡢ -饤Ȥ̥åȤ׵꤬᤹ʤȤǤʤơΥ -Сإåɤ⾯ʤΤǡ@code{mysql_use_result()} Ϥ®ʤޤˡ -ϡФι«򤱤뤿ᡢƥ쥳ɤ᤯ɬפ뤳 -ȡ̥åǥ쥳ɤΥॢǤʤȡʥ쥳ɤ -˥뤳ȤǤޤˡơ٤ƤΥ쥳ɤФʤ -¤ꡢ̥åˤĤΥ쥳ɤ뤫Τ뤳ȤǤʤȤǤ -ˡʤõƤ򡢸ǸĤ뤳ȤǤơ꤬ -褷ȤƤ⡢٤ƤΥ쥳ɤФ@emph{ʤФʤޤ} - -API ϥ饤Ȥ꤬ @code{SELECT} Ǥ뤫ɤΤ뤳Ȥʤˡ -ɬ׻쥳ɤФ˥Ŭڤ˱Ǥ褦ˤޤ -줾 @code{mysql_query()}ʤޤ @code{mysql_real_query()}ˤθǡ -@code{mysql_store_result()} ƤӽФȤǡ줬ǽǤ̥åȤ -ƤӽФȡ @code{SELECT} Ǥꡢ쥳ɤɤळȤ -Ǥޤ̥åȸƤӽФԤϡ̤ºݤ˴Ԥ줿Τ -뤫ɤꤹ뤿ˡ@code{mysql_field_count()} ƤӽФƤ -@code{mysql_field_count()} 0 ֤ϡϥǡ֤ -ʥ꤬ @code{INSERT}, @code{UPDATE}, @code{DELETE} Ǥ뤳Ȥ -ޤˡĤޤ쥳ɤ֤뤳ȤԤǤޤ -@code{mysql_field_count()} 0 Ǥʤϡϥ쥳ɤ֤٤ -Τˡ֤ʤäȤȤǤϥ꤬ @code{SELECT} ǼԤ -ȤȤ򼨤ޤɤΤ褦˹ԤʤȤǤ뤫ϡ -@code{mysql_field_count()} 򻲾ȤƤ - -@code{mysql_store_result()} @code{mysql_use_result()} Ϥɤ⡢ -åȤեɤˤĤƤξʥեɤο̾䷿ʤɡˤ -뤳ȤǤޤ@code{mysql_fetch_field()} 򷫤֤ƤӽФ -ǽ֤ˡޤϡ@code{mysql_fetch_field_direct()} ƤӽФȤǥ쥳 -Υեֹǡ쥳Υեɾ˥뤳ȤǤ -ޤߤΥեɥ֤ @code{mysql_field_seek()} ƤӽФ -ȤѹǤޤեɥϡθ -@code{mysql_fetch_field()} ƤӽФ˱ƶޤ -@code{mysql_fetch_fields()} ƤӽФȤǡ٤ˤ٤ƤΥեɤξ -뤳ȤǤޤ - -顼θСˤĤƤϡ@code{mysql_errno()} -@code{mysql_error()} ؿˡˤäơ@strong{MySQL} ϥ顼ؤΥ -󶡤ޤϡǸ˸ƤӽФ줿ޤϼԤؿ -ĤƤΥ顼ɤȥ顼å֤顼IJȯ -ꤹ뤳ȤǤޤ - -@node C API functions, Perl, C API function overview, Clients -@section C API ؿ - -@menu -* mysql_affected_rows:: @code{mysql_affected_rows()} -* mysql_close:: @code{mysql_close()} -* mysql_connect:: @code{mysql_connect()} -* mysql_change_user:: @code{mysql_change_user()} -* mysql_create_db:: @code{mysql_create_db()} -* mysql_data_seek:: @code{mysql_data_seek()} -* mysql_debug:: @code{mysql_debug()} -* mysql_drop_db:: @code{mysql_drop_db()} -* mysql_dump_debug_info:: @code{mysql_dump_debug_info()} -* mysql_eof:: @code{mysql_eof()} -* mysql_errno:: @code{mysql_errno()} -* mysql_error:: @code{mysql_error()} -* mysql_escape_string:: @code{mysql_escape_string()} -* mysql_fetch_field:: @code{mysql_fetch_field()} -* mysql_fetch_fields:: @code{mysql_fetch_fields()} -* mysql_fetch_field_direct:: @code{mysql_fetch_field_direct()} -* mysql_fetch_lengths:: @code{mysql_fetch_lengths()} -* mysql_fetch_row:: @code{mysql_fetch_row()} -* mysql_field_count:: @code{mysql_field_count()} -* mysql_field_seek:: @code{mysql_field_seek()} -* mysql_field_tell:: @code{mysql_field_tell()} -* mysql_free_result:: @code{mysql_free_result()} -* mysql_get_client_info:: @code{mysql_get_client_info()} -* mysql_get_host_info:: @code{mysql_get_host_info()} -* mysql_get_proto_info:: @code{mysql_get_proto_info()} -* mysql_get_server_info:: @code{mysql_get_server_info()} -* mysql_info:: @code{mysql_info()} -* mysql_init:: @code{mysql_init()} -* mysql_insert_id:: @code{mysql_insert_id()} -* mysql_kill:: @code{mysql_kill()} -* mysql_list_dbs:: @code{mysql_list_dbs()} -* mysql_list_fields:: @code{mysql_list_fields()} -* mysql_list_processes:: @code{mysql_list_processes()} -* mysql_list_tables:: @code{mysql_list_tables()} -* mysql_num_fields:: @code{mysql_num_fields()} -* mysql_num_rows:: @code{mysql_num_rows()} -* mysql_options:: @code{mysql_options()} -* mysql_ping:: @code{mysql_ping()} -* mysql_query:: @code{mysql_query()} -* mysql_real_connect:: @code{mysql_real_connect()} -* mysql_real_escape_string:: @code{mysql_real_escape_string()} -* mysql_real_query:: @code{mysql_real_query()} -* mysql_reload:: @code{mysql_reload()} -* mysql_row_seek:: @code{mysql_row_seek()} -* mysql_row_tell:: @code{mysql_row_tell()} -* mysql_select_db:: @code{mysql_select_db()} -* mysql_shutdown:: @code{mysql_shutdown()} -* mysql_stat:: @code{mysql_stat()} -* mysql_store_result:: @code{mysql_store_result()} -* mysql_thread_id:: @code{mysql_thread_id()} -* mysql_use_result:: @code{mysql_use_result()} -* NULL mysql_store_result:: Why is it that after @code{mysql_query()} returns success, @code{mysql_store_result()} sometimes returns @code{NULL?} -* Query results:: What results can I get from a query? -* Getting unique ID:: How can I get the unique ID for the last inserted row? -* C API linking problems:: Problems linking with the C API -* Thread-safe clients:: How to make a thread-safe client -@end menu - -ʲǤϡ@code{NULL} ΰޤͤ C ץߥ󥰸 - @code{NULL} ̣ޤ@strong{MySQL} @code{NULL} ͤǤϤޤ - -ؿ̾ݥ󥿤֤ͤޤؿ˵Ҥ硢 -ݥ󥿤֤ؿϡ򼨤 @code{NULL} ֤ͤ顼򼨤 - @code{NULL} ֤ޤ֤ؿϡ򼨤 0 ֤ -顼򼨤0֤ޤ``0'' ϴؿ¾˽Ҥ٤Ƥʤ -ꡢΰ̣ˤʤ뤳ȤդƤ; ؿ¾˽Ҥ٤Ƥ硢 -Ф 0 ʳθͭͤƥȤʤǤ: - -@example -if (result) /* */ - ... error ... - -if (result < 0) /* ְ㤤 */ - ... error ... - -if (result == -1) /* ְ㤤 */ - ... error ... -@end example - -ؿ顼֤Ȥؿ @strong{顼} ᤬륨顼 -Ƥޤ@code{mysql_errno()} θƤӽФˤäƤɤ줬ȯ -򸫤ĤФȤǤޤ顼ɽʸ -@code{mysql_error()} θƤӽФˤäޤ - -@findex @code{mysql_affected_rows()} -@node mysql_affected_rows, mysql_close, C API functions, C API functions -@subsection @code{mysql_affected_rows()} - -@code{my_ulonglong mysql_affected_rows(MYSQL *mysql)} - -@subsubheading - -Ǹ @code{UPDATE}, @code{DELETE}, @code{INSERT} ˤäƱƶ -줿(ѹ줿)Կ֤ޤ@code{UPDATE}, @code{DELETE}, @code{INSERT} ơ -ȤǤ @code{mysql_query()} ľ˸ƤӽФޤ@code{SELECT} ơ -ȤǤϡ @code{mysql_num_rows()} ˻ư򤷤ޤ - -@code{mysql_affected_rows()} ϸߥޥȤƼƤޤ - -@subsubheading - -0 礭ϱƶ줿ԿޤϼФ줿Կ򼨤ޤ - @code{WHERE} Ŭ礷쥳ɤʤޤϥ꤬ޤ¹Ԥ -Ƥʤ 0 Ǥ꤬顼֤@code{SELECT} -Ĥ @code{mysql_store_result()} ƤФ -@code{mysql_affected_rows()} ƤФ줿 -1 Ǥ - -@subsubheading 顼 - -̵ - -@subsubheading - -@example -mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"); -printf("%d products updated",mysql_affected_rows(&mysql)); -@end example - -@findex @code{mysql_close()} -@node mysql_close, mysql_connect, mysql_affected_rows, C API functions -@subsection @code{mysql_close()} - -@code{void mysql_close(MYSQL *mysql)} - -@subsubheading -˥ץ󤵤줿³򥯥ޤϥɥ뤬 @code{mysql_init()} - @code{mysql_connect()} ǼưŪ˳Ƥ줿硢 -@code{mysql_close()} @code{mysql} Ǽ³ϥɥβԤʤ -ޤ - -@subsubheading - -̵ - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 - -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä - -@item CR_SERVER_LOST -Фؤ³˼줿 - -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_connect()} -@node mysql_connect, mysql_change_user, mysql_close, C API functions -@subsection @code{mysql_connect()} - -@code{MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)} - -@subsubheading - -δؿϿ侩ޤ @code{mysql_real_connect()} λѤ -ᤷޤ - -@code{mysql_connect()} @code{host} ưƤ @strong{MySQL} ǡ -١󥸥ؤ³γΩߤޤ@code{mysql_get_client_info()} -¾Τ٤Ƥ API ؿ¹Ԥ@code{mysql_connect()} λ -Ƥɬפޤ - -ѥ᡼ΰ̣ @code{mysql_real_connect()} бѥ᡼ƱǤ -³ѥ᡼ @code{NULL} ˤǤ뤳Ȥۤʤޤξ C API -³¤Τ˼ưŪ˥ơ@code{mysql_close()} ƤӽФˤ -ޤΥץ³Ԥ˥顼å -ФȤǤʤȤǤ@code{mysql_errno()} ޤ -@code{mysql_error()} 饨顼ˤϡ @code{MYSQL} ݥ -󶡤ɬפޤ - -@subsubheading - -@code{mysql_real_connect()} Ʊ - -@subsubheading 顼 - -@code{mysql_real_connect()} Ʊ - -@findex @code{mysql_change_user()} -@node mysql_change_user, mysql_create_db, mysql_connect, C API functions -@subsection @code{mysql_change_user()} - -@code{my_bool mysql_change_user(MYSQL *mysql, const char *user, const -char *password, const char *db)} - -@subsubheading - -桼ѹ@code{mysql} Ǽ줿³ǡ@code{db} Ǽ줿ǡ -١ǥեȡʸߤΡ˥ǡ١ˤʤޤθΥǤϡ -Ūʥǡ١λޤǤʤơ֥뻲ȤˤĤơΥǡ١ -ǥեȤˤʤޤ - -δؿ @strong{MySQL} 3.23.3 Ƴޤ - -@code{mysql_change_user()} ³줿桼ǧڤʤ硢ޤϥǡ -١Ѥ븢¤äƤʤ˼Ԥޤξ硢桼ȥǡ -١ѹޤ - -ǥեȥǡ١ʤ硢@code{db} ѥ᡼ -@code{NULL} Ǥޤ - -@subsubheading - - 0顼ȯ0 - -@subsubheading 顼 - -@code{mysql_real_connect()} ΤƱǤ - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@item ER_UNKNOWN_COM_ERROR -@strong{MySQL} ФϤΥޥɤƤʤʤ餯ŤСˡ -@item ER_ACCESS_DENIED_ERROR -桼ޤϥѥɤְäƤ롣 -@item ER_BAD_DB_ERROR -ǡ١¸ߤʤ -@item ER_DBACCESS_DENIED_ERROR -桼ǡ١ؤΥäƤʤ -@item ER_WRONG_DB_NAME -ǡ١̾Ĺ᤮롣 -@end table - -@subsubheading - -@example -if (mysql_change_user(&mysql, "user", "password", "new_database")) -@{ - fprintf(stderr, "Failed to change user. Error: %s\n", - mysql_error(&mysql)); -@} -@end example - -@findex @code{mysql_create_db()} -@node mysql_create_db, mysql_data_seek, mysql_change_user, C API functions -@subsection @code{mysql_create_db()} - -@code{int mysql_create_db(MYSQL *mysql, const char *db)} - -@subsubheading -@code{db} ˤäƻꤵ줿ǡ١ޤ - -δؿϿ侩ޤ @code{mysql_query()} ȤäơSQL -@code{CREATE DATABASE} ơȥȤȯԤ뤳Ȥ򤪴ᤷޤ - -@subsubheading - -ǡ١κ0顼ȯ0 - -@subsubheading 顼 -@table @code - -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 - -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä - -@item CR_SERVER_LOST -Фؤ³˼줿 - -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@subsubheading - -@example -if(mysql_create_db(&mysql, "my_database")) -@{ - fprintf(stderr, "Failed to create new database. Error: %s\n", - mysql_error(&mysql)); -@} -@end example - -@findex @code{mysql_data_seek()} -@node mysql_data_seek, mysql_debug, mysql_create_db, C API functions -@subsection @code{mysql_data_seek()} - -@code{void mysql_data_seek(MYSQL_RES *result, unsigned long long offset)} - -@subsubheading -̥åǤդΥ쥳ɤ˥ޤϡ̥åȹ¤ -Τ٤Ƥη̤äƤ뤳Ȥ׵ᤷޤΤᡢ -@code{mysql_data_seek()} @code{mysql_store_result()} ȶˤѤ졢 -@code{mysql_use_result()} ȶˤϻѤǤޤ - -եåȤͤ @code{0} @code{mysql_num_rows(result)-1} ǤʤƤ -ʤޤ - -@subsubheading - -̵ - -@subsubheading 顼 -̵ - -@findex @code{mysql_debug()} -@node mysql_debug, mysql_drop_db, mysql_data_seek, C API functions -@subsection @code{mysql_debug()} - -@code{void mysql_debug(char *debug)} - -@subsubheading -Ϳ줿ʸ @code{DBUG_PUSH} Ԥʤޤ@code{mysql_debug()} - Fred Fish debug library ѤޤδؿѤ뤿ˤϡǥХ -򥵥ݡȤ褦ˡ饤ȥ饤֥򥳥ѥ뤹ɬפ -ޤ -@xref{Debugging server}. @xref{Debugging client}. - -@subsubheading - -̵ - -@subsubheading 顼 -̵ - -@subsubheading - -˼ƤӽФϡ饤ȥ饤֥꤬饤ȥޥ -@file{/tmp/client.trace} ˥ȥ졼եޤ: - -@example -mysql_debug("d:t:O,/tmp/client.trace"); -@end example - -@findex @code{mysql_drop_db()} -@node mysql_drop_db, mysql_dump_debug_info, mysql_debug, C API functions -@subsection @code{mysql_drop_db()} - -@code{int mysql_drop_db(MYSQL *mysql, const char *db)} - -@subsubheading -@code{db} ˤäƻꤵ줿ǡ١˴ޤ - -δؿϿ侩ޤ @code{mysql_query()} ȤäơSQL -@code{DROP DATABASE} ơȥȤȯԤ뤳Ȥ򤪴ᤷޤ - -@subsubheading - -ǡ١˴0顼ȯ0 - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@subsubheading - -@example -if(mysql_drop_db(&mysql, "my_database")) - fprintf(stderr, "Failed to drop the database: Error: %s\n", - mysql_error(&mysql)); -@end example - -@findex @code{mysql_dump_debug_info()} -@node mysql_dump_debug_info, mysql_eof, mysql_drop_db, C API functions -@subsection @code{mysql_dump_debug_info()} - -@code{int mysql_dump_debug_info(MYSQL *mysql)} - -@subsubheading - -ĤΥǥХå˥פ褦˥Ф˻ؼޤư -򤹤뤿ˤϡ³줿桼 @strong{process} äƤʤ -Фʤޤ - -@subsubheading - -ޥɤ0ޥɤԤ0 - -@subsubheading 顼 -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_eof()} -@node mysql_eof, mysql_errno, mysql_dump_debug_info, C API functions -@subsection @code{mysql_eof()} - -@code{my_bool mysql_eof(MYSQL_RES *result)} - -@subsubheading - -δؿϿ侩ޤ@code{mysql_errno()} @code{mysql_error()} -˻ѤǤޤ - -@code{mysql_eof()} Ϸ̥åȤκǸΥ쥳ɤɤޤ줿ɤĴ٤ - - -@code{mysql_store_result()} θƤӽФơ̥åȤꤷ硢 -饤ȤϰĤΥڥ졼Ǥ٤ƤΥåȤޤξ硢 -@code{mysql_fetch_row()} ֤ @code{NULL} ϡ˷̥åȤνü -ãȤ̣@code{mysql_eof()} ƤɬפϤޤ - -̥åȼФνΤ @code{mysql_use_result()} -硢åȤΥ쥳ɤ @code{mysql_fetch_row()} 򷫤֤Ƥ֤Ȥ -ꡢҤȤĤĥФޤν³ǥ顼ȯ -뤿ᡢ@code{mysql_fetch_row()} @code{NULL} ϡ̾ɬ -̥åȤνüãȤ̣ޤ󡣤ξ -@code{mysql_eof()} Ѥơä򸡽ФǤޤ̥åȤ -üã @code{mysql_eof()} 0֤ͤ顼ȯ - 0 ֤ޤ - -Ū @code{mysql_eof()} ɸ @strong{MySQL} 顼ؿ -@code{mysql_errno()} @code{mysql_error()} ̤ޤΥ顼 -ؿƱ󶡤ΤǡλѤ @code{mysql_eof()} ⹥ -ޤ@code{mysql_eof()} ϸ߿侩ޤ󡣡ʼºݡ¿ξ -󶡤ޤ顼ؿϥ顼ȯΥ顼ͳ򼨤ޤ -@code{mysql_eof()} Ͽ֤ͤޤ - -@subsubheading - -顼ȯʤä0̥åȤνüã0 - -@subsubheading 顼 -̵ - -@subsubheading - - @code{mysql_eof} λˡ򼨤ޤ: - -@example -mysql_query(&mysql,"SELECT * FROM some_table"); -result = mysql_use_result(&mysql); -while((row = mysql_fetch_row(result))) -@{ - // do something with data -@} -if(!mysql_eof(result)) // mysql_fetch_row() failed due to an error -@{ - fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); -@} -@end example - -ɸ @strong{MySQL} 顼ؿƱ̤뤳ȤǤޤ: - -@example -mysql_query(&mysql,"SELECT * FROM some_table"); -result = mysql_use_result(&mysql); -while((row = mysql_fetch_row(result))) -@{ - // do something with data -@} -if(mysql_errno(&mysql)) // mysql_fetch_row() failed due to an error -@{ - fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); -@} -@end example - -@findex @code{mysql_errno()} -@node mysql_errno, mysql_error, mysql_eof, C API functions -@subsection @code{mysql_errno()} - -@code{unsigned int mysql_errno(MYSQL *mysql)} - -@subsubheading - -@code{mysql} ˤäƻꤵ줿³ǡǸ˸ƤӽФ줿 API ؿݤΥ顼 -ɤ֤ޤ0ϥ顼ȯʤäȤ̣ޤ饤 -ȥ顼åֹ @file{errmsg.h} ˥ꥹȤƤޤ -顼åֹ @file{mysqld_error.h} ˥ꥹȤƤޤ - -@subsubheading : - -顼͡顼ȯƤʤ0 - -@subsubheading 顼 -̵ - -@findex @code{mysql_error()} -@node mysql_error, mysql_escape_string, mysql_errno, C API functions -@subsection @code{mysql_error()} - -@code{char *mysql_error(MYSQL *mysql)} - -@subsubheading - -@code{mysql} ˤäƻꤵ줿³ǡ @code{mysql_error()} -Ǹ˸ƤӽФ줿 API ؿݤ򡢥顼åȤ֤ޤ -顼ȯʤä϶ʸ (@code{""}) ֤ޤ -ϼΣĤΥƥȤƱǤ뤳Ȥ̣ޤ: - -@example -if(mysql_errno(&mysql)) -@{ - // an error occurred -@} - -if(mysql_error(&mysql)[0] != '\0') -@{ - // an error occurred -@} -@end example - -饤ȥ顼åθ @strong{MySQL} -ȥ饤֥κƥѥѹǤޤߤϤĤθǽ񤫤줿 -饤ȥ顼åǤޤ -@xref{Languages}. - -@subsubheading - -顼ɽ魯ʸ -顼ȯƤʤ϶ʸ - -@subsubheading 顼 -̵ - -@findex @code{mysql_escape_string()} -@node mysql_escape_string, mysql_fetch_field, mysql_error, C API functions -@subsection @code{mysql_escape_string()} - -You should use @code{mysql_real_escape_string()} instead! - -This is identical to @code{mysql_real_escape_string()} except that it takes -the connection as the first argument. @code{mysql_real_escape_string()} -will escape the string according to the current character set while @code{mysql_escape_string()} -does not respect the current charset setting. - -@findex @code{mysql_fetch_field()} -@node mysql_fetch_field, mysql_fetch_fields, mysql_escape_string, C API functions -@subsection @code{mysql_fetch_field()} - -@code{MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)} - -@subsubheading - -̥åȤΰĤΥեɤ @code{MYSQL_FIELD} ¤ΤȤ֤ -̥åƤΥեɤˤĤƾФˤϡδؿ -֤ƤǤ@code{mysql_fetch_field()} ϥեɤĤäƤ - @code{NULL} ֤ޤ - -@code{mysql_fetch_field()} ϡ @code{SELECT} ¹Ԥ뤿Ӥˡ -ǽΥեɤˤĤƤξ֤褦˥ꥻåȤޤ -@code{mysql_fetch_field()} ֤եɤ -@code{mysql_field_seek()} θƤӽФˤƶ򤦤ޤ - -ơ֥ @code{SELECT} 뤿 @code{mysql_query()} Ƥӡ - @code{mysql_store_result()} ƤǤʤ硢 -@code{mysql_fetch_field()} @code{BLOB} եɤĹ䤤碌˻ -Ѥȡ@strong{MySQL} ϥǥեȤ blob Ĺ (8K bytes) ֤ޤ -(8K ˤʤΤϡ@strong{MySQL} @code{BLOB} κĹΤʤ -ǤϤĤեǽˤʤ٤Ǥ) ٷ̥åȤФ -С@code{field->max_length} ϻꤷǤΤΥեɤκ -Ĺޤߤޤ - -@subsubheading - -ߤΥեɤ @code{MYSQL_FIELD} ¤ΡեɤĤäƤʤ -@code{NULL} - -@subsubheading 顼 -̵ - -@subsubheading - -@example -MYSQL_FIELD *field; - -while((field = mysql_fetch_field(result))) -@{ - printf("field name %s\n", field->name); -@} -@end example - -@findex @code{mysql_fetch_fields()} -@node mysql_fetch_fields, mysql_fetch_field_direct, mysql_fetch_field, C API functions -@subsection @code{mysql_fetch_fields()} - -@code{MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)} - -@subsubheading - -̥åȤΤ٤Ƥ @code{MYSQL_FIELD} ¤Τ֤ޤƹ¤Τ -̥åȤΰĤΥեɤΥե󶡤ޤ - -@subsubheading - -̥åȤƤιܤ @code{MYSQL_FIELD} ¤Τ - -@subsubheading 顼 -̵ - -@subsubheading - -@example -unsigned int num_fields; -unsigned int i; -MYSQL_FIELD *fields; - -num_fields = mysql_num_fields(result); -fields = mysql_fetch_fields(result); -for(i = 0; i < num_fields; i++) -@{ - printf("Field %u is %s\n", i, fields[i].name); -@} -@end example - -@findex @code{mysql_fetch_field_direct()} -@node mysql_fetch_field_direct, mysql_fetch_lengths, mysql_fetch_fields, C API functions -@subsection @code{mysql_fetch_field_direct()} - -@code{MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)} - -@subsubheading - -̥åΥեɤ򼨤եֹ @code{fieldnr} Ϳ졢 -ΥեɤΥե @code{MYSQL_FIELD} ¤ΤȤ֤ޤ -δؿǤդΥեɤˤĤƤФȤ˻ѤǤޤ -@code{fieldnr} ͤ 0 @code{mysql_num_fields(result)-1} ϰϤˤ -٤Ǥ - -@subsubheading - -ꤵ줿եɤ @code{MYSQL_FIELD} ¤Ρ - -@subsubheading 顼 -̵ - -@subsubheading - -@example -unsigned int num_fields; -unsigned int i; -MYSQL_FIELD *field; - -num_fields = mysql_num_fields(result); -for(i = 0; i < num_fields; i++) -@{ - field = mysql_fetch_field_direct(result, i); - printf("Field %u is %s\n", i, field->name); -@} -@end example - -@findex @code{mysql_fetch_lengths()} -@node mysql_fetch_lengths, mysql_fetch_row, mysql_fetch_field_direct, C API functions -@subsection @code{mysql_fetch_lengths()} - -@code{unsigned long *mysql_fetch_lengths(MYSQL_RES *result)} - -@subsubheading - -̥åθߤΥ쥳ɤΥեɤĹ֤ޤեɤͤ򥳥ԡ硢 -ĹϺŬˤͭѤǤ@code{strlen()} θƤӽФǤ -Ǥ -ˡ̥åȤХʥǡľϡǡΥꤹ뤿ˤδؿ@emph{ȤʤФʤޤ} -ʤʤ @code{strlen()} NULL ʸޤեɤˤĤƤη̤֤ʤǤ - -եɤĹ @code{NULL} ͤޤեɤĹ 0 ǤΣ -ĤΥ̤ˡˤĤƤϡ@code{mysql_fetch_row()} 򻲾 -Ʋ - -@subsubheading - -ƥեɤΥ (ü NUL ʸϴޤߤޤ)󶡤 unsigned long - -顼ȯ @code{NULL} - -@subsubheading 顼 -@code{mysql_fetch_lengths()} Ϸ̥åȤθߤΥ쥳ɤˤĤƤͭ -Ǥ@code{mysql_fetch_row()} ƤӽФޤϷ̤ƤΥ쥳ɤ -ФˤƤ硢@code{NULL} ֤ޤ - -@subsubheading - -@example -MYSQL_ROW row; -unsigned long *lengths; -unsigned int num_fields; -unsigned int i; - -row = mysql_fetch_row(result); -if (row) -@{ - num_fields = mysql_num_fields(result); - lengths = mysql_fetch_lengths(result); - for(i = 0; i < num_fields; i++) - @{ - printf("Column %u is %lu bytes in length.\n", i, lengths[i]); - @} -@} -@end example - -@findex @code{mysql_fetch_row()} -@node mysql_fetch_row, mysql_field_count, mysql_fetch_lengths, C API functions -@subsection @code{mysql_fetch_row()} - -@code{MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)} - -@subsubheading - -̥åȤμΥ쥳ɤФޤ@code{mysql_store_result()} θ˻Ѥȡ -ʾФ쥳ɤʤϡ@code{NULL} ֤ޤ -@code{mysql_use_result()} θ˻Ѥʤ顢 -ʾФ쥳ɤʤ䥨顼ȯ @code{NULL} ֤ޤ - -쥳ͤο @code{mysql_num_fields(result)} ˤäͿޤ -@code{row} @code{mysql_fetch_row()} θƤӽФͤݻ -硢ͤؤΥݥ󥿤 @code{row[0]} -@code{row[mysql_num_fields(result)-1} Ȥƥޤ쥳 -@code{NULL} ͤ@code{NULL} ݥ󥿤ˤäƼޤ - -쥳ɤΥեͤĹϡ@code{mysql_fetch_lengths()} θƤӽФ -Ǥޤեɤ @code{NULL} ޤեɤϤɤĹ -0 ޤ; եͤΥݥ󥿤å뤳Ȥǡ̤Ǥ -ޤݥ󥿤 @code{NULL} ξ硢եɤ @code{NULL} Ǥ; -ʤХեɤ϶Ǥ - -@subsubheading - -Υ쥳ɤ @code{MYSQL_ROW} ¤Ρ顼ȯ⤦Ф -ɤʤ @code{NULL} - -@subsubheading 顼 - -@table @code -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@subsubheading - -@example -MYSQL_ROW row; -unsigned int num_fields; -unsigned int i; - -num_fields = mysql_num_fields(result); -while ((row = mysql_fetch_row(result))) -@{ - unsigned long *lengths; - lengths = mysql_fetch_lengths(result); - for(i = 0; i < num_fields; i++) - @{ - printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL"); - @} - printf("\n"); -@} -@end example - -@findex @code{mysql_field_count()} -@node mysql_field_count, mysql_field_seek, mysql_fetch_row, C API functions -@subsection @code{mysql_field_count()} - -@code{unsigned int mysql_field_count(MYSQL *mysql)} - -3.22.24 @code{MySQL} СѤƤ硢 -@code{unsigned int mysql_num_fields(MYSQL *mysql)} ˻Ѥ٤ - - -@subsubheading - -³κǸΥΥեɿ֤ޤ - -δؿ̾ @code{mysql_store_result()} @code{NULL} ֤ʤ -ƤΤ褦˷̥åȥݥ󥿤äƤʤˤ˻Ѥޤξ硢 -@code{mysql_store_result()} Ǥʤ̤󶡤٤ɤĴ٤뤿 -ˡ@code{mysql_field_count()} ƤӽФȤǤޤϡ꤬ -@code{SELECT}ʤޤ @code{SELECT}˻˥ơȥȤǤ뤫Τ뤳 -̵ˡ饤ȥץˡŬڤʹưȤ餻뤳ȤǤޤ -˼ϡɤΤ褦˹ԤʤȤǤ뤫Ƥޤ - -@xref{NULL mysql_store_result, , @code{NULL mysql_store_result()}}. - -@subsubheading - -̥åΥեֹɽ unsigned integer - -@subsubheading 顼 -̵ - -@subsubheading - -@example -MYSQL_RES *result; -unsigned int num_fields; -unsigned int num_rows; - -if (mysql_query(&mysql,query_string)) -@{ - // error -@} -else // query succeeded, process any data returned by it -@{ - result = mysql_store_result(&mysql); - if (result) // there are rows - @{ - num_fields = mysql_num_fields(result); - // retrieve rows, then call mysql_free_result(result) - @} - else // mysql_store_result() returned nothing; should it have? - @{ - if(mysql_field_count(&mysql) == 0) - @{ - // query does not return data - // (it was not a SELECT) - num_rows = mysql_affected_rows(&mysql); - @} - else // mysql_store_result() should have returned data - @{ - fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); - @} - @} -@} -@end example - -̤ˡϡ@code{mysql_field_count(&mysql)} ƤӽФ -@code{mysql_errno(&mysql)} ֤뤳ȤǤξ硢ơȥ - @code{SELECT} ɤ @code{mysql_field_count()} ͤ¬ -ǤϤʤľ @code{mysql_store_result()} Υ顼åޤ - -@findex @code{mysql_field_seek()} -@node mysql_field_seek, mysql_field_tell, mysql_field_count, C API functions -@subsection @code{mysql_field_seek()} - -@code{MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)} - -@subsubheading - -Ϳ줿եåȤ˥եɥꤷޤ -@code{mysql_fetch_field()} θƤӽФϤΥեåȤбեɤ -Фޤ - -쥳ɤκǽ˥ˤϡ0 @code{offset} ͤϤƤ - -@subsubheading - -եɥ͡ - -@subsubheading 顼 -̵ - -@findex @code{mysql_field_tell()} -@node mysql_field_tell, mysql_free_result, mysql_field_seek, C API functions -@subsection @code{mysql_field_tell()} - -@code{MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)} - -@subsubheading - -Ǹ @code{mysql_fetch_field()} ˻Ѥեɥΰ֤ -ޤͤ @code{mysql_field_seek()} ؤΰȤƻѤǤޤ - -@subsubheading - -եɥθߤΥեåȡ - -@subsubheading 顼 -̵ - -@findex @code{mysql_free_result()} -@node mysql_free_result, mysql_get_client_info, mysql_field_tell, C API functions -@subsection @code{mysql_free_result()} - -@code{void mysql_free_result(MYSQL_RES *result)} - -@subsubheading - -@code{mysql_store_result()}, @code{mysql_use_result()}, -@code{mysql_list_dbs()} ˤäƷ̥åȤ˳Ƥ줿 -ޤ̥åȤDzԤʤä@code{mysql_free_result()} Ƥ -ФƤ줬Ѥɬפޤ - -@subsubheading - -̵ - -@subsubheading 顼 -̵ - -@findex @code{mysql_get_client_info()} -@node mysql_get_client_info, mysql_get_host_info, mysql_free_result, C API functions -@subsection @code{mysql_get_client_info()} - -@code{char *mysql_get_client_info(void)} - -@subsubheading - -饤ȥ饤֥Сɽ魯ʸ֤ޤ - -@subsubheading - -@strong{MySQL} 饤ȥ饤֥Сɽ魯ʸ - -@subsubheading 顼 -̵ - -@findex @code{mysql_get_host_info()} -@node mysql_get_host_info, mysql_get_proto_info, mysql_get_client_info, C API functions -@subsection @code{mysql_get_host_info()} - -@code{char *mysql_get_host_info(MYSQL *mysql)} - -@subsubheading - -³פɽ魯ʸ֤ޤФΥۥ̾ޤߤޤ - -@subsubheading - -Хۥ̾³פɽ魯ʸ - -@subsubheading 顼 -̵ - -@findex @code{mysql_get_proto_info()} -@node mysql_get_proto_info, mysql_get_server_info, mysql_get_host_info, C API functions -@subsection @code{mysql_get_proto_info()} - -@code{unsigned int mysql_get_proto_info(MYSQL *mysql)} - -@subsubheading - -ߤ³˻ѤƤץȥС֤ޤ - -@subsubheading Return values - -ߤ³˻ѤƤץȥСɽ魯̵͡ - -@subsubheading 顼 -̵ - -@findex @code{mysql_get_server_info()} -@node mysql_get_server_info, mysql_info, mysql_get_proto_info, C API functions -@subsection @code{mysql_get_server_info()} - -@code{char *mysql_get_server_info(MYSQL *mysql)} - -@subsubheading - -ФΥСֹɽ魯ʸ֤ޤ - -@subsubheading - -ФΥСֹɽ魯ʸ - -@subsubheading 顼 -̵ - -@findex @code{mysql_info()} -@node mysql_info, mysql_init, mysql_get_server_info, C API functions -@subsection @code{mysql_info()} - -@code{char * mysql_info(MYSQL *mysql)} - -@subsubheading - -ǤǶ˼¹Ԥ줿ˤĤƤξʸ֤ޤ -ʲ˵󤲤빽ʸ˸¤ޤ -¾ιʸǤ@code{mysql_info()} @code{NULL} ֤ޤ -ʸη -ϥηˤä͡Ǥޤ (ͤǤ; ʸϥ -Ŭͤޤߤޤ): - -@table @code -@item INSERT INTO ... SELECT ... -String format: @code{Records: 100 Duplicates: 0 Warnings: 0} -@item INSERT INTO ... VALUES (...),(...),(...)... -String format: @code{Records: 3 Duplicates: 0 Warnings: 0} -@item LOAD DATA INFILE ... -String format: @code{Records: 1 Deleted: 0 Skipped: 0 Warnings: 0} -@item ALTER TABLE -String format: @code{Records: 3 Duplicates: 0 Warnings: 0} -@item UPDATE -String format: @code{Rows matched: 40 Changed: 40 Warnings: 0} -@end table - -: ʣͥꥹȤơȥ˵Ҥ줿ˤ -@code{mysql_info()} ϡ@code{INSERT ... VALUES} ơȥȤ -@code{NULL}֤ͤޤ - -@subsubheading - -ǤǶ˼¹Ԥ줿ˤĤƤɲþɽ魯ʸ󡣥ͭ -ʾ󤬤ʤ @code{NULL} ݥ󥿡 - -@subsubheading 顼 -̵ - -@findex @code{mysql_init()} -@node mysql_init, mysql_insert_id, mysql_info, C API functions -@subsection @code{mysql_init()} - -@code{MYSQL * mysql_init(MYSQL *mysql)} - -@subsubheading - -@code{mysql_real_connect()} Ŭ @code{MYSQL} ֥Ȥγ -ޤϽԤʤޤ @code{NULL} ݥ󥿤ξ硢ؿϿ -֥ȤƤƽ֤ޤǤʤХ֥Ȥ -졢֥ȤΥɥ쥹֤ޤ֥Ȥ -Ƥ줿硢@code{mysql_close()} ϤΥ֥Ȥޤ - -@subsubheading - -줿 @code{MYSQL*} ϥɥ롢ޤϿ֥Ȥ -Τ˽ʬʥ꤬ʤä @code{NULL} ݥ󥿡 - -@subsubheading 顼 -­ξ @code{NULL} ֤ޤ - -@findex @code{mysql_insert_id()} -@node mysql_insert_id, mysql_kill, mysql_init, C API functions -@subsection @code{mysql_insert_id()} - -@code{my_ulonglong mysql_insert_id(MYSQL *mysql)} - -@subsubheading - -Υˤä @code{AUTO_INCREMENT} եɤ줿 ID ֤ޤ -@code{AUTO_INCREMENT} եɤޤơ֥ @code{INSERT} -¹ԤǡδؿѤƤ - -: Υ꤬ @code{AUTO_INCREMENT} ͤʤä硢 -@code{mysql_insert_id()} @code{0} ֤ޤΤͤ¸ɬ -פ硢ͤ륯ľ @code{mysql_insert_id()} Ƥӽ -Ȥ˵ĤƤ - -ޤSQL @code{LAST_INSERT_ID()} ˺Ǹ줿 -@code{AUTO_INCREMENT} ͤޤߡ֤ǥꥻåȤʤȤդƲ -δؿͤϥݼ餵뤫Ǥ - -@subsubheading - -Υˤäƹ줿 @code{AUTO_INCREMENT} եɤ͡³ -Υ꤬ʤ硢꤬ @code{AUTO_INCREMENT} ͤ򹹿ʤä -ˤ 0 ֤ޤ - -@subsubheading 顼 -̵ - -@findex @code{mysql_kill()} -@node mysql_kill, mysql_list_dbs, mysql_insert_id, C API functions -@subsection @code{mysql_kill()} - -@code{int mysql_kill(MYSQL *mysql, unsigned long pid)} - -@subsubheading - -@code{pid} ǻꤵ줿åɤ򻦤褦˥Фߤޤ - -@subsubheading - -0Ի0 - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_list_dbs()} -@node mysql_list_dbs, mysql_list_fields, mysql_kill, C API functions -@subsection @code{mysql_list_dbs()} - -@code{MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)} - -@subsubheading - -оΡ@code{wild} ǻꤵ줿ʰɽŬ礹롢ǡ١ -̾ʤ̥åȤ֤ޤ@code{wild} ϥ磻ɥʸ -@samp{%} ޤ @samp{_} ޤळȤǤޤޤƤΥǡ١ -Ŭ礹褦 @code{NULL} ݥ󥿤ˤǤޤ@code{mysql_list_dbs()} -θƤӽФϥ @code{SHOW databases [LIKE wild]} ¹ԤΤƱ -Ǥ - -@code{mysql_free_result()} Ƿ̥åȤɬפޤ - -@subsubheading - - @code{MYSQL_RES} ̥åȡԤ @code{NULL} - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_OUT_OF_MEMORY -­ -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_list_fields()} -@node mysql_list_fields, mysql_list_processes, mysql_list_dbs, C API functions -@subsection @code{mysql_list_fields()} - -@code{MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)} - -@subsubheading - -Ϳ줿ơ֥Ρ@code{wild} ǻꤵ줿ʰɽŬ礹 -ե̾ʤ̥åȤ֤ޤ@code{wild} ϥ磻ɥ -ʸ @samp{%} ޤ @samp{_} ޤळȤǤޤޤƤΥե -ɤŬ礹褦 @code{NULL} ݥ󥿤ˤǤޤ -@code{mysql_list_fields()} ϥ @code{SHOW COLUMNS FROM table [LIKE -wild]} ¹ԤΤƱͤǤ - -: @code{mysql_list_fields()} @code{SHOW COLUMNS FROM -tbl_name} λѤ򴫤ޤ - -@code{mysql_free_result()} Ƿ̥åȤɬפޤ - -@subsubheading - - @code{MYSQL_RES} ̥åȡ顼ȯ @code{NULL} - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_list_processes()} -@node mysql_list_processes, mysql_list_tables, mysql_list_fields, C API functions -@subsection @code{mysql_list_processes()} - -@code{MYSQL_RES *mysql_list_processes(MYSQL *mysql)} - -@subsubheading - -ߤΥХåɤ򼨤̥åȤ֤ޤ @code{mysqladmin -processlist} @code{SHOW PROCESSLIST} -𤵤ΤƱξǤ - -@code{mysql_free_result()} Ƿ̥åȤɬפޤ - -@subsubheading - - @code{MYSQL_RES} ̥åȡԤ @code{NULL} - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_list_tables()} -@node mysql_list_tables, mysql_num_fields, mysql_list_processes, C API functions -@subsection @code{mysql_list_tables()} - -@code{MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)} - -@subsubheading - -@code{wild} ǻꤵ줿ʰɽŬ礹롢ߤΥǡ١ -Υơ֥̾ʤ̥åȤ֤ޤ@code{wild} ϥ磻ɥ -ʸ @samp{%} ޤ @samp{_} ޤळȤǤޤޤƤΥơ֥ -Ŭ礹褦 @code{NULL} ݥ󥿤ˤǤޤ -@code{mysql_list_tables()} ϥ @code{SHOW tables [LIKE wild]} -ԤΤƱͤǤ - -@code{mysql_free_result()} Ƿ̥åȤɬפޤ - -@subsubheading - - @code{MYSQL_RES} ̥åȡԤ @code{NULL} - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_num_fields()} -@findex @code{mysql_field_count()} -@node mysql_num_fields, mysql_num_rows, mysql_list_tables, C API functions -@subsection @code{mysql_num_fields()} - -@code{unsigned int mysql_num_fields(MYSQL_RES *result)} - -ޤ - -@code{unsigned int mysql_num_fields(MYSQL *mysql)} - -ܤη @strong{MySQL} 3.23 ʾǤưޤ@code{MYSQL*} -̤ϡ @code{unsigned int mysql_field_count(MYSQL*mysql)} -ѤʤƤϤޤ - -@subsubheading - -̥åΥեɿ֤ޤ - -: ̥åȤؤΥݥ󥿤ޤ³ϥɥΤ줫եɤο -뤳ȤǤޤ@code{mysql_store_result()} ޤ -@code{mysql_use_result()} @code{NULL} ֤ʤĤޤ̥åȥݥ -̵˾硢³ϥɥѤޤξ硢 -@code{mysql_field_count()} ƤӽФơ@code{mysql_store_result()} -Ǥʤ̤󶡤٤ɤǤޤˤꡢ饤ȥץ -ϥ꤬ @code{SELECT}ʤޤ @code{SELECT} ˻˥ơȥ -ȤäɤΤ뤳ȤʤˡŬڤʹư뤳ȤǤޤʲ˼ -ϤɤΤ褦˹ԤʤƤޤ - -@xref{NULL mysql_store_result, , @code{NULL mysql_store_result()}}. - -@subsubheading - -̥åΥեɿɽ魯̵ - -@subsubheading 顼 -̵ - -@subsubheading - -@example -MYSQL_RES *result; -unsigned int num_fields; -unsigned int num_rows; - -if (mysql_query(&mysql,query_string)) -@{ - // error -@} -else // query succeeded, process any data returned by it -@{ - result = mysql_store_result(&mysql); - if (result) // there are rows - @{ - num_fields = mysql_num_fields(result); - // retrieve rows, then call mysql_free_result(result) - @} - else // mysql_store_result() returned nothing; should it have? - @{ - if (mysql_errno(&mysql)) - @{ - fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); - @} - else if (mysql_field_count(&mysql) == 0) - @{ - // query does not return data - // (it was not a SELECT) - num_rows = mysql_affected_rows(&mysql); - @} - @} -@} -@end example - -ʷ̥åȤ֤٤Ǥ뤳ȤΤäƤΡˡϡ -@code{mysql_errno(&mysql)} @code{mysql_field_count(&mysql)} -0 ɤΥå֤뤳ȤǤϲˤ -ޤ - -@findex @code{mysql_num_rows()} -@node mysql_num_rows, mysql_options, mysql_num_fields, C API functions -@subsection @code{mysql_num_rows()} - -@code{my_ulonglong mysql_num_rows(MYSQL_RES *result)} - -@subsubheading - -̥åΥ쥳ɿ֤ޤ - -@code{mysql_num_rows()} λѤϡ̥åȤ֤Τ -@code{mysql_store_result()} @code{mysql_use_result()} ΤɤѤ -뤫˰¸ޤ@code{mysql_store_result()} Ѥ硢 -@code{mysql_num_rows()} Ϥ˸Ƥ֤ȤǤޤ -@code{mysql_use_result()} Ѥ硢̥åȤƤΥ쥳ɤ -Фޤǡ@code{mysql_num_rows()} ֤ͤޤ - -@subsubheading - -̥åȤΥ쥳ɿ - -@subsubheading 顼 -̵ - -@findex @code{mysql_options()} -@node mysql_options, mysql_ping, mysql_num_rows, C API functions -@subsection @code{mysql_options()} - -@code{int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)} - -@subsubheading - -̤³ץꤷ³ο񤤤˱ƶͿ뤿˻ѤǤޤ -δؿʣΥץꤹ뤿ʣƤ֤ȤǤޤ - -@code{mysql_options()} @code{mysql_init()} θǡ -@code{mysql_connect()} @code{mysql_real_connect()} ˸ƤФʤ -ʤޤ - -@code{option} ꤷץǤ; @code{arg} ϥץ -ФͤǤץξ硢@code{arg} ͤؤΥݥ󥿤 - - -ͭʥץ: - -@multitable @columnfractions .25 .25 .5 -@item @strong{ץ} @tab @strong{} @tab @strong{ǽ} -@item @code{MYSQL_OPT_CONNECT_TIMEOUT} @tab @code{unsigned int *} @tab ³ॢȡáˡ -@item @code{MYSQL_OPT_COMPRESS} @tab Ѥʤ @tab ̥饤ȡХץȥѤ롣 -@item @code{MYSQL_OPT_NAMED_PIPE} @tab Ѥʤ @tab NT @strong{MySQL} Фؤ³̾եѥפѤ롣 -@item @code{MYSQL_INIT_COMMAND} @tab @code{char *} @tab @strong{MySQL} Фؤ³˼¹Ԥ륳ޥɡ³˼ưŪ˺Ƽ¹Ԥ롣 -@item @code{MYSQL_READ_DEFAULT_FILE} @tab @code{char *} @tab @file{my.cnf} ˻ꤵ줿ץե뤫饪ץɤ߹ࡣ -@item @code{MYSQL_READ_DEFAULT_GROUP} @tab @code{char *} @tab @file{my.cnf} ޤ @code{MYSQL_READ_DEFAULT_FILE} ǻꤵ줿ե뤫ꤵ줿롼פΥץɤ߹ࡣ -@end multitable - -: @code{MYSQL_READ_DEFAULT_FILE} @code{MYSQL_READ_DEFAULT_GROUP} -Ѥ硢@code{client} 롼פɤޤޤ - -ץե˻ꤵ륰롼פϼΥץޤळȤǤ -: - -@multitable @columnfractions .3 .7 -@item @code{compress} @tab ̥饤ȡХץȥѤ롣 -@item @code{database} @tab ³̿ǥǡ١ꤵʤ硢Υǡ١³롣 -@item @code{debug} @tab ǥХåץ -@item @code{host} @tab ǥեȥۥ̾ -@item @code{init-command} @tab @strong{MySQL} Фؤ³˼¹Ԥ륳ޥɡ³˼ưŪ˺Ƽ¹Ԥ롣 -@item @code{password} @tab ǥեȥѥ -@item @code{pipe} @tab NT @strong{MySQL} Фؤ³̾եѥפѤ롣 -@item @code{port} @tab ǥեȥݡֹ -@item @code{return-found-rows} @tab @code{UPDATE} ѻ@code{mysql_info()} 줿Ԥ˸ĤäԤ֤褦ˤ롣 -@item @code{socket} @tab ǥեȥåֹ -@item @code{timeout} @tab ³ॢȡáˡ -@item @code{user} @tab ǥեȥ桼 -@end multitable - -ץեˤĤƤΤʤϡ@ref{Option files} 򻲾Ȥ - - -@subsubheading - -ξ0̤ΤΥץѤ0 - -@subsubheading - -@example -MYSQL mysql; - -mysql_init(&mysql); -mysql_options(&mysql,MYSQL_OPT_COMPRESS,0); -mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc"); -if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)) -@{ - fprintf(stderr, "Failed to connect to database: Error: %s\n", - mysql_error(&mysql)); -@} -@end example - -嵭ϡ̥饤ȡХץȥѤ@code{my.cnf} ե - @code{odbc} 󤫤ɲåץɤ褦ˡ饤Ȥ -׵ᤷޤ - -@findex @code{mysql_ping()} -@node mysql_ping, mysql_query, mysql_options, C API functions -@subsection @code{mysql_ping()} - -@code{int mysql_ping(MYSQL *mysql)} - -@subsubheading - -Фؤ³ưƤ뤫ɤåޤ󤷤Ƥ -ϡưŪ˺³ߤޤ - -δؿϡĹŤˤƤ륯饤ȤФ³򥯥 -ɤåʤȺ³ˤ뤿˻ѤǤޤ - -@subsubheading - -ФƤ0¾ͤϥ顼򼨤ޤ - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_query()} -@node mysql_query, mysql_real_connect, mysql_ping, C API functions -@subsection @code{mysql_query()} - -@code{int mysql_query(MYSQL *mysql, const char *query)} - -@subsubheading -NULL üʸ @code{query} Ǽ SQL ¹ԤޤϤ -ȤĤ SQL ơȥȤǤʤФʤޤ󡣽üΥߥ -(@samp{;}) @code{\g} 򥹥ơȥȤɲä٤ǤϤޤ - -@code{mysql_query()} ϥХʥǡޤ९ˤϻѤǤޤʥ -ʥǡ @samp{\0} ʸޤळȤޤϥʸ -ǸȤƲᤵޤˡξ硢@code{mysql_real_query()} -ѤƤ - -If you want to know if the query should return a result set or not, you can -use @code{mysql_field_count()} to check for this. -@xref{mysql_field_count, @code{mysql_field_count}}. - -@subsubheading - -꤬0꤬Ԥ0 - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_real_connect()} -@node mysql_real_connect, mysql_real_escape_string, mysql_query, C API functions -@subsection @code{mysql_real_connect()} - -@code{MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, - const char *user, const char *passwd, const char *db, - unsigned int port, const char *unix_socket, - unsigned int client_flag)} - -@subsubheading - -@code{host} ưƤ @strong{MySQL} ǡ١󥸥ؤ³ -γΩߤޤ -@code{mysql_get_client_info()} ʳ¾ API ؿ¹Ԥˡ -@code{mysql_real_connect()} Ƥɬפޤ - -@code{mysql_real_connect()} ƤӽФˡ@code{MYSQL} ¤Τ -Ͻ뤿 @code{mysql_init()} Ƥɬפ뤳Ȥդ - - -@itemize @bullet -@item -ǽΥѥ᡼ϴ¸ @code{MYSQL} ¤ΤΥɥ쥹Ǥ -@code{mysql_real_connect()} Ƥˡ@code{MYSQL} ¤ΤνΤ - @code{mysql_init()} ƤɬפޤҤ򻲾ȤƤ - -@item -@code{host} ͤϥۥ̾ IP ɥ쥹ΤɤǤǽǤ -@code{host} @code{NULL} ޤʸ @code{"localhost"} ξϥ -ۥȤؤ³ȤߤʤޤOS åȤ򥵥ݡȤ(Unix) -ޤ̾Ĥѥפ򥵥ݡȤ(Win32)Фؤ TCP/IP ³ -˻Ѥޤ - -@item -@code{user} ѥ᡼ϥ桼 @strong{MySQL} ID äƤޤ -@code{user} @code{NULL} ξ硢ߤΥ桼ȤߤʤޤWindows -ODBC ǤϡߤΥ桼Ū˻ꤵʤФʤޤUnix -ϸߤΥ̾ŬѤޤ -Windows ODBC Ǥ, ȤΥ桼̾ͿʤФʤޤ -@xref{ODBC administrator}. - -@item -@code{passwd} ѥ᡼ @code{user} ΥѥɤäƤޤ -⤷ @code{passwd} @code{NULL} ξ硢Υѥɥեɤ -@code{user} ơ֥Υ쥳ɤŬåޤΤ褦 -ˡǡѥɤҤ줿ɤˤäƥ桼ۤʤ븢¤褦 -ˡǡ١Ԥ @strong{MySQL} øƥꤹ뤳ȤǤ -ޤ - -: @code{mysql_connect()} ƤӽФ @code{passwd} Ź沽ʤ -ǤѥɤΰŹ沽ϥ饤 API ǼưŪ˽ޤ - -@item -@code{db} @code{NULL} Ǥʤ硢³Ϥͤǥեȥǡ١ -˥åȤޤ - -@item -@code{port} 0 Ǥʤ硢ͤ TCP/IP ³ΥݡֹȤƻѤ -ޤ@code{host} ѥ᡼³Υפꤹ뤳ȤդƤ - - -@item -@code{unix_socket} @code{NULL} Ǥʤ硢ʸϻѤ륽å -ޤ̾Ĥѥפ򵭽Ҥޤ@code{host} ѥ᡼³Υפ -ꤹ뤳ȤդƤ - -@item -client_flag ͤ̾ 0 ǤȤƤüʾΤἡΥե饰Ȥ -碌Ǥޤ: - -@multitable @columnfractions .25 .7 -@item @strong{ե饰̾} @tab @strong{ե饰ΰ̣} -@item @code{CLIENT_FOUND_ROWS} @tab ƶ줿ԿǤϤʤĤäԿ֤ޤ -@item @code{CLIENT_NO_SCHEMA} @tab @code{db_name.tbl_name.col_name} ޤ󡣤 ODBC ΤǤ; ιʸѤ硢ѡ顼ޤϤĤ ODBC ץΥХΥȥåפΩޤ -@item @code{CLIENT_COMPRESS} @tab ̥ץȥѤޤ -@item @code{CLIENT_ODBC} @tab 饤Ȥ ODBC 饤ȡ @code{mysqld} 򤵤 ODBC-եɥѹޤ -@end multitable -@end itemize - -@code{mysql_real_connect()} κǽΰ @code{NULL} ݥ󥿤򵭽Ҥ -뤳ȤǤޤ C API ³¤ΤΥơ -@code{mysql_close()} ƤӽФ˼ưŪ˲ޤˡ -ϡ³Ԥ @code{mysql_real_connect()} Υ顼 -ФȤǤʤȤǤ - -ǽΰ @code{NULL} ݥ󥿤Ǥʤϡ¸ߤ @code{MYSQL} -¤ΤΥɥ쥹Ǥ٤Ǥ - -@subsubheading - -³ @code{MYSQL*} ³ϥɥǤ³Ԥ - C @code{NULL} ݥ󥿤Ǥ -³ȡǽΥѥ᡼ @code{NULL} Ǥʤ硢ͤϤΥѥ -᡼ͤƱǤ - -@subsubheading 顼 - -@table @code -@item CR_CONN_HOST_ERROR -@strong{MySQL} Фؤ³˼Ԥ - -@item CR_CONNECTION_ERROR - @strong{MySQL} Фؤ³˼Ԥ - -@item CR_IPSOCK_ERROR -IP åȤ˼Ԥ - -@item CR_OUT_OF_MEMORY -­ - -@item CR_SOCKET_CREATE_ERROR -Unix åȤ˼Ԥ - -@item CR_UNKNOWN_HOST -ۥ̾ IP ɥ쥹򸫤ĤΤ˼Ԥ - -@item CR_VERSION_ERROR -ۤʤץȥСѤ륯饤ȥ饤֥ǥФؤ -³ߤ̤ΥץȥߥޥåϡȤƤŤ饤ȥ饤 -֥Ѥơ@code{--old-protocol} ץդdzϤƤʤ -Ф³ȯޤ - -@item CR_NAMEDPIPEOPEN_ERROR; -Win32 ̾Ĥѥפ˼Ԥ - -@item CR_NAMEDPIPEWAIT_ERROR; -Win32 ̾Ĥѥפ wait ˼Ԥ - -@item CR_NAMEDPIPESETSTATE_ERROR; -Win32 Υѥץϥɥγ˼Ԥ -@end table - -@subsubheading - -@example -MYSQL mysql; - -mysql_init(&mysql); -mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name"); -if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)) -@{ - fprintf(stderr, "Failed to connect to database: Error: %s\n", - mysql_error(&mysql)); -@} -@end example - -By using @code{mysql_options()} the @strong{MySQL} library will read the -@code{[client]} and @code{your_prog_name} sections in the @code{my.cnf} -file which will ensure that your program will work, even if someone has -set up @strong{MySQL} in some non-standard way. - -Note that upon connection, @code{mysql_real_connect()} sets the @code{reconnect} -flag (part of the MYSQL structure) to a value of @code{1}. This flag indicates, -in the event that a query cannot be performed because of a lost connection, to -try reconnecting to the server before giving up. - - -@findex @code{mysql_real_escape_string()} -@node mysql_real_escape_string, mysql_real_query, mysql_real_connect, C API functions -@subsection @code{mysql_real_escape_string()} - -@code{unsigned int mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned int length)} - -@subsubheading - -@code{from} ʸSQL ơȥȤȤƥФ뤳ȤǤ -褦ˡߤΥ饯åȤθʤѴޤ -̤ @code{to} ꡢü null ʸɲäޤ -Ѵʸ @samp{NUL} (ASCII 0), @samp{\n}, @samp{\r}, @samp{\}, -@samp{'}, @samp{"}, Control-Z Ǥ(@pxref{Literals}). - -@code{from} Ǽʸ -@code{length} ХĹǤʤФʤޤ -@code{to} ХåեˤϾʤȤ @code{length*2+1} ХĹƤ -ɬפޤʺǰξ硢줾ʸХȤѴ뤳Ȥ -ꡢ˽ü null ХȤΤξ꤬ɬפǤ -@code{mysql_escape_string()} Ȥ@code{to} -Ƥ @code{NUL} üʸˤʤޤ -ͤѴ줿ʸĹǤü null ʸϴޤߤޤ - -@subsubheading - -@example -char query[1000],*end; - -end = strmov(query,"INSERT INTO test_table values("); -*end++ = '\''; -end += mysql_real_escape_string(&mysql, end,"What's this",11); -*end++ = '\''; -*end++ = ','; -*end++ = '\''; -end += mysql_real_escape_string(&mysql, end,"binary data: \0\r\n",16); -*end++ = '\''; -*end++ = ')'; - -if (mysql_real_query(&mysql,query,(unsigned int) (end - query))) -@{ - fprintf(stderr, "Failed to insert row, Error: %s\n", - mysql_error(&mysql)); -@} -@end example - -嵭 @code{strmov()} ؿ @code{mysqlclient} 饤֥˴ޤޤƤ -ơ@code{strcpy()} Τ褦Ưޤǽΰν null ؤΥݥ -󥿤֤ޤ - -@subsubheading - -@code{to} ֤줿ͤĹü null ʸϴޤߤޤ - -@subsubheading 顼 -̵ - - -@findex @code{mysql_real_query()} -@node mysql_real_query, mysql_reload, mysql_real_escape_string, C API functions -@subsection @code{mysql_real_query()} - -@code{int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)} - -@subsubheading - -@code{query} Ǽ SQL ¹Ԥޤ @code{length} -ĹǤϤҤȤĤ SQL ơȥȤǤʤФʤޤ󡣽ü -Υߥ(@samp{;}) @code{\g} 򥹥ơȥȤɲä٤ǤϤ - - -Хʥǡޤ९ @code{mysql_real_query()} -@emph{ʤФʤޤ}Хʥǡ @samp{\0} ʸޤळ -뤫Ǥ -ޤ@code{mysql_real_query()} @code{mysql_query()} ®Ǥ - @code{strlen()} ƤФʤǤ - -If you want to know if the query should return a result set or not, you can -use @code{mysql_field_count()} to check for this. -@xref{mysql_field_count, @code{mysql_field_count}}. - -@subsubheading - -꤬0꤬Ԥ0 - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_reload()} -@node mysql_reload, mysql_row_seek, mysql_real_query, C API functions -@subsection @code{mysql_reload()} - -@code{int mysql_reload(MYSQL *mysql)} - -@subsubheading - -@strong{MySQL} Фˡơ֥ɤ߹ߤ褦˰ꤷ -ޤ³줿桼 @strong{reload} ¤ɬפޤ - -δؿϿ侩ޤˡSQL @code{FLUSH PRIVILEGES} ơȥ -ȤȯԤ @code{mysql_query()} λѤ侩ޤ - -@subsubheading - -0Ի0 - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_row_seek()} -@node mysql_row_seek, mysql_row_tell, mysql_reload, C API functions -@subsection @code{mysql_row_seek()} - -@code{MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset)} - -@subsubheading -쥳ɥ򥯥̥åХ쥳ɤꤷޤϡ -̥åȹ¤ΤΤ٤Ƥη̤äƤ뤳Ȥ׵ᤷޤΤᡢ -@code{mysql_row_seek()} @code{mysql_store_result()} ȶˤѤǤ -@code{mysql_use_result()} ȶˤϻѤǤޤ - -եåȤ @code{mysql_row_tell()} ޤ @code{mysql_row_seek()} ƤӤ -ͤǤ٤Ǥͤñʥ쥳ֹǤϤޤ; -ֹѤƷ̥åΥ쥳ɤ˥ϡ -@code{mysql_data_seek()} ˻ѤƤ - -@subsubheading - -쥳ɥͤ͡Ϥθ @code{mysql_row_seek()} ƤӤ -ϤȤǤޤ - -@subsubheading 顼 -̵ - -@findex @code{mysql_row_tell()} -@node mysql_row_tell, mysql_select_db, mysql_row_seek, C API functions -@subsection @code{mysql_row_tell()} - -@code{MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)} - -@subsubheading - -Ǹ @code{mysql_fetch_row()} ˤĤƥ쥳ɥθߤΰ֤֤ޤ -ͤ @code{mysql_row_seek()} ؤΰȤƻѤǤޤ - -@code{mysql_row_tell()} @code{mysql_store_result()} θˤѤ -ǡ@code{mysql_use_result()} θˤϻѤ٤ǤϤޤ - -@subsubheading - -ԥθߤΥեåȡ - -@subsubheading 顼 -̵ - -@findex @code{mysql_select_db()} -@node mysql_select_db, mysql_shutdown, mysql_row_tell, C API functions -@subsection @code{mysql_select_db()} - -@code{int mysql_select_db(MYSQL *mysql, const char *db)} - -@subsubheading - -@code{mysql} Ǽ븽ߤ³ˡǥե(ߤ)ǡ١Ȥ - @code{db} Ǽǡ١Ѥ褦˻ؼޤʹߤΥ -ǤϡŪ˥ǡ١ꤷʤơ֥뻲ȤˤĤơΥǡ -١ǥեȤˤʤޤ - -³줿桼ǡ١Ѥ븢¤äƤȾʤ -С@code{mysql_select_db()} ϼԤޤ - -@subsubheading - -0Ի0 - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_shutdown()} -@node mysql_shutdown, mysql_stat, mysql_select_db, C API functions -@subsection @code{mysql_shutdown()} - -@code{int mysql_shutdown(MYSQL *mysql)} - -@subsubheading - -ǡ١Ф˥åȥ󤹤褦׵ᤷޤ³줿桼 - @strong{shutdown} ¤äƤɬפޤ - -@subsubheading - -0Ի0 - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_stat()} -@node mysql_stat, mysql_store_result, mysql_shutdown, C API functions -@subsection @code{mysql_stat()} - -@code{char *mysql_stat(MYSQL *mysql)} - -@subsubheading - -@code{mysqladmin status} 󶡤ΤƱͤξʸȤ֤ -äǤ uptime ȡ¹Υåɿ䤤碌ɤ߹ -ץơ֥ޤߤޤ - -@subsubheading - -о֤ɽ魯ʸ󡣥顼ȯ @code{NULL} - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_store_result()} -@node mysql_store_result, mysql_thread_id, mysql_stat, C API functions -@subsection @code{mysql_store_result()} - -@code{MYSQL_RES *mysql_store_result(MYSQL *mysql)} - -@subsubheading - -ǡФ(@code{SELECT}, @code{SHOW}, @code{DESCRIBE}, -@code{EXPLAIN})ˡ@code{mysql_store_result()} ޤ -@code{mysql_use_result()} ƤӽФɬפޤ - -If you want to know if the query should return a result set or not, you can -use @code{mysql_field_count()} to check for this. -@xref{mysql_field_count, @code{mysql_field_count}}. - -@code{mysql_store_result()} ϥΤ٤Ƥη̤򥯥饤Ȥɤ߹ߡ -@code{MYSQL_RES} ¤Τơι¤Τ˷̤֤ޤ - -@code{mysql_store_results()} returns a null pointer if the query didn't return -a result sets (If the query was for example an @code{INSERT} statement). - -@code{mysql_store_results()} returns also null pointer if reading of the -result set failed. You can check if you got an error by checking if -@code{mysql_error()} doesn't return a null pointer, if -@code{mysql_errno()} returns <> 0 or if @code{mysql_field_count()} -returns <> 0. - -֤쥳ɤ̵硢η̥åȤ֤ޤ (η̥åȤ -@code{NULL} ͤȤϰۤʤޤ) - - @code{mysql_store_result()} ƤӽФ null ݥ󥿡Ǥʤ -̤Ǥ顢̥åˤĤΥ -ɤ뤫򸫤Ĥ뤿ˡ@code{mysql_num_rows()} ƤӽФȤ -ޤ - -̥åȤ쥳ɤФ @code{mysql_fetch_row()} ƤӽФ -ȤǤޤޤ̥åθߤΥ쥳ɰ֤꡿뤿 - @code{mysql_row_seek()} @code{mysql_row_tell()} ƤӽФȤǤ -ޤ - -ٷ̥åȤǹԤʤȡ@code{mysql_free_result()} ƤӽФɬפ -ޤ - -@xref{NULL mysql_store_result, , @code{NULL mysql_store_result()}}. - -@subsubheading - -̤ @code{MYSQL_RES} ̹¤Ρ顼 @code{NULL} - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_OUT_OF_MEMORY -­ -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@findex @code{mysql_thread_id()} -@node mysql_thread_id, mysql_use_result, mysql_store_result, C API functions -@subsection @code{mysql_thread_id()} - -@code{unsigned long mysql_thread_id(MYSQL *mysql)} - -@subsubheading - -ߤ³Υå ID ֤ޤͤϡåɤ򻦤 -@code{mysql_kill()} ؤΰȤƻѤǤޤ - -³ơ@code{mysql_ping()} Ǻ³硢å ID ѹ -ޤϥå ID ǻȤ˼ƳǼ٤ǤϤʤȤ -̣ޤɬפʻˤ٤Ǥ - -@subsubheading - -ߤ³Υå ID - -@subsubheading 顼 -̵ - -@findex @code{mysql_use_result()} -@node mysql_use_result, NULL mysql_store_result, mysql_thread_id, C API functions -@subsection @code{mysql_use_result()} - -@code{MYSQL_RES *mysql_use_result(MYSQL *mysql)} - -@subsubheading - -ǡФ(@code{SELECT}, @code{SHOW}, @code{DESCRIBE}, -@code{EXPLAIN})ˡ @code{mysql_store_result()} ޤ -@code{mysql_use_result()} ƤӽФɬפޤ - -@code{mysql_use_result()} Ϸ̥åȸ򳫻Ϥޤ, -@code{mysql_store_result()} Τ褦ˡºݤ˥饤Ȥ˷̥åȤɤ -ޤ. ˡƥ쥳ɤ @code{mysql_fetch_row()} ƤӤԤ -뤳Ȥˤꡢġ˼Фޤ -@code{mysql_use_result()} ϥη̤򡢰ơ֥Хåե -˳Ǽ뤳̵Фľɤ߹ߤޤ -@code{mysql_store_result()} ⤤餫®ʤѤޤ -ξ硢饤ȤϸߤιԤ³Хåե -( @code{max_allowed_packet} bytes ޤä ) ΥƤޤ - -饤¦dzƹԤ -Ĥ¿νԤʤ䡢桼 @code{^S} () -ϤǤ褦ʲ̤˽Ϥϡ@code{mysql_use_result()} Ѥ -٤ǤϤޤ󡣤ϥФϢȤƤꡢ¾Υåɤ -ǡФơ֥򹹿⤷ޤ - -@code{mysql_use_result()} ѻ@code{NULL} ͤФޤ -@code{mysql_fetch_row()} ¹ԤɬפޤʤȡΥ -Υ꤫̤Фޤ˺ȡC API ϥ顼 -@code{Commands out of sync; You can't run this command now} Ϳޤ - -@code{mysql_use_result()} ֤̤Ǥϡ -@code{mysql_data_seek()}, @code{mysql_row_seek()}, -@code{mysql_row_tell()}, @code{mysql_num_rows()}, -@code{mysql_affected_rows()} ѤǤޤ -ޤ@code{mysql_use_result()} λޤ¾ΥȯԤǤޤ -(ƤιԤեåˡեå줿ԿΤ뤿 -@code{mysql_num_rows} ƤӽФȤǤޤ) - -ٷ̥åȤǹԤʤȡ@code{mysql_free_result()} ƤӽФɬפ -ޤ - -@subsubheading - -̤ @code{MYSQL_RES} ̹¤Ρ顼 @code{NULL} - -@subsubheading 顼 - -@table @code -@item CR_COMMANDS_OUT_OF_SYNC -ʽ˥ޥɤ¹Ԥ줿 -@item CR_OUT_OF_MEMORY -­ -@item CR_SERVER_GONE_ERROR -@strong{MySQL} Фʤʤä -@item CR_SERVER_LOST -Фؤ³˼줿 -@item CR_UNKNOWN_ERROR -̤ΤΥ顼ȯ -@end table - -@node NULL mysql_store_result, Query results, mysql_use_result, C API functions -@subsection @code{mysql_query()} ֤塢@code{mysql_store_result()} @code{NULL} ֤ΤϲΡ - -@code{mysql_query()} θƤӽФ -@code{mysql_store_result()} @code{NULL} ֤Ȥޤ줬 -äȤξΤɤ줫ọ̇ޤ: - -@itemize @bullet -@item -@code{malloc()} Ԥ (㤨С̥åȤ礭᤮) - -@item -ǡɤʤä (³Υ顼) - -@item -꤬ǡ֤ʤä (@code{INSERT}, @code{UPDATE}, @code{DELETE}) -@end itemize - -ơȥȤǤʤ̤󶡤뤫ɤ -@code{mysql_field_count()} θƤӽФˤäƤĤǤåǤޤ -@code{mysql_field_count()} 0 ֤硢̤϶ǺǸΥͤ -֤ʤơȥȤǤ (㤨С@code{INSERT} @code{DELETE}) -@code{mysql_field_count()} 0 ֤ͤ硢ơȥȤ϶Ǥʤ -̤󶡤ޤ -@code{mysql_field_count()} ؿ򻲾ȤƤ - -@code{mysql_error()} ޤ @code{mysql_errno()} ƤӽФȤˤä -顼ΥƥȤǤޤ - -@node Query results, Getting unique ID, NULL mysql_store_result, C API functions -@subsection ꤫̤ϲ - -ˤä֤̥åȤ˲äơξ뤳ȤǤޤ: - -@itemize @bullet -@item -@code{mysql_affected_rows()} ϡ@code{INSERT}, @code{UPDATE} ޤ -@code{DELETE} ԤʤäκǸΥǡƶ줿Կ֤ޤ -@code{WHERE} ᤬ʤ @code{DELETE} Ѥơơ֥뤬ڤͤ -㳰ǤϤȤƤ®Ǥ ξ硢 -@code{mysql_affected_rows()} ϱƶ줿Կ 0 ֤ޤ - -@item -@code{mysql_num_rows()} Ϸ̥åȤΥ쥳ɿ֤ޤ -@code{mysql_store_result()} Ǥϡ@code{mysql_num_rows()} -@code{mysql_store_result()} ˸ƤӽФȤǤޤ -@code{mysql_use_result()} Ǥϡ@code{mysql_num_rows()} -@code{mysql_fetch_row()} Ǥ٤ƤΥ쥳ɤФˤƤֽФ -ȤǤޤ - -@item -@code{mysql_insert_id()} ϡ@code{AUTO_INCREMENT} ǥåĥơ -֥˹ԤǸΥˤä줿 ID ֤ޤ -@xref{mysql_insert_id, , @code{mysql_insert_id()}}. - -@item -ĤΥ (@code{LOAD DATA INFILE...}, @code{INSERT INTO ... -SELECT ...}, @code{UPDATE}) ɲþ֤ޤ̤ -@code{mysql_info()} ֤ޤ -֤ʸηˤĤƤϡ@code{mysql_info()} 򻲾ȤƤ -@code{mysql_info()} ɲþ󤬤ʤ - @code{NULL} ݥ󥿤֤ޤ -@end itemize - -@node Getting unique ID, C API linking problems, Query results, C API functions -@subsection Ǹ줿ԤΥˡ ID ɤΤ褦뤫 - -@code{AUTO_INCREMENT} °Ĺܤޤơ֥˥쥳ɤ -硢@code{mysql_insert_id()} ؿͿ줿 ID 뤳ȤǤޤ - -@code{mysql_query()} Ϥʸ@code{LAST_INSERT_ID()} ؿ -Ѥ뤳ȤǤ⡢ID ФȤǤޤ - -Υɤ¹Ԥ뤳Ȥǡ@code{AUTO_INCREMENT} ǥåѤ -ɤåǤޤϡ꤬ @code{AUTO_INCREMENT} -ǥåȼ @code{INSERT} äɤåǤޤ: - -@example -if (mysql_error(&mysql)[0] == 0 && - mysql_num_fields(result) == 0 && - mysql_insert_id(&mysql) != 0) -@{ - used_id = mysql_insert_id(&mysql); -@} -@end example - -줿Ǹ ID ³˥ǰݻƤޤ¾Υ饤 -ˤäѹϤޤ¾ @code{AUTO_INCREMENT} ܤޥå -(ʤ@code{NULL} Ǥʤ @code{0} Ǥʤ) ǹǤ⡢ѹ -ޤ - -ޤ¾Υơ֥ˤ ID 褦Ȥ硢ǹԤʤȤǤޤ: - -@example -INSERT INTO foo (auto,text) - VALUES(NULL,'text'); # generate ID by inserting NULL -INSERT INTO foo2 (id,text) - VALUES(LAST_INSERT_ID(),'text'); # use ID in second table -@end example - -@node C API linking problems, Thread-safe clients, Getting unique ID, C API functions -@subsection C API ǤΥ󥯤 - -C API ǥ󥯤ĤΥƥǤϼΥ顼ˤʤޤ: - -@example -gcc -g -o client test.o -L/usr/local/lib/mysql -lmysqlclient -lsocket -lnsl - -Undefined first referenced - symbol in file -floor /usr/local/lib/mysql/libmysqlclient.a(password.o) -ld: fatal: Symbol referencing errors. No output written to client -@end example - -ϡʤΥƥǤϡѥ/󥯹ԤκǸˡmath 饤 - (@code{-lm}) ޤɬפ뤳Ȥ̣ޤ - -@node Thread-safe clients, , C API linking problems, C API functions -@subsection åɰ饤Ȥˡ - -饤Ȥ `ۤȤ' åɰǤ礭 -@file{net.c} (åȤɤ߹ߤ򤹤륵֥롼ޤե) -߰ǤʤȤǤϡФĹɤ߹ߤǤǤ -ˡȤΥ顼ȤθǹԤʤޤ -If you -install an interrupt handlers for the @code{SIGPIPE} interrupt, -the socket handling should be thread safe. - -ɸ९饤ȥ饤֥ϥåɥץǥѥ뤵Ƥޤ - -åɰ饤(MySQLСȤ̿ˡ -¾Υåɤ饤ȤΥåɤ interrupt 򤫤ꡢ -ॢȤ򥻥åȤꤹ) -뤿ˤϡ@code{-lmysys}, @code{-lstring}, -@code{-ldbug} 饤֥ȥФѤ @code{net_serv.o} Ѥ - - -If you don't need interrupts or timeouts you can just compile the client -library @code{(mysqlclient)} to be thread safe and use this. In this -case you don't have to worry about the @code{net_serv.o} object file or -the other @strong{MySQL} libraries. - -åɥ饤ȤѤ@file{thr_alarm.c} 롼礤˻ -ѤǤޤ@code{mysys} 饤֥꤫Υ롼Ѥ硢Ф -ʤФʤʤȤ @code{my_init()} ǽ˸Ƥ֤ȤǤ - -@code{mysql_real_connect()} ƤδؿϸߥåɰǤ -ɰ饤ȥ饤֥򥳥ѥ뤷򥹥åɰʥޥʡǻ -Ѥ뤿ˡ򡢼դޤ( -@code{mysql_real_connect()} ˤĤƤդϡºݤˤ -@code{mysql_connect()} ˤͭǤ @code{mysql_connect()} Ͽ侩 -ޤΤǡȤˤ @code{mysql_real_connect()} Ѥ٤Ǥ) - -@code{mysql_real_connect()} 򥹥åɰˤ뤿ˤϡ饤Ȥ򼡤 -ޥɤǺƥѥ뤹ɬפޤ: - -@example -shell> ./configure --enable-thread-safe-client -@end example - -This will ensure that the client library will use the header files required -for thread safe programs and also that @code{mysql_real_connect()} will use -a thread safe version of the @code{gethostbyname()} call. - -ɸ९饤ȤΥ󥯻̤ܥΤᤤĤΥ顼Ф -礦ϥǥեȤǤ pthread 饤֥꤬ޤޤƤʤǤ - -@c ̤ @file{libmysqld.a} 饤֥ϸߥåɰǤ - -@c 2ĤΥåɤƱ³ϥɥ (@code{mysql_connect()} ֤) -@c Ʊ˻ѤǤޤ2ĤΥåɤ@code{mysql_store_result()} -@c 줿ۤʤ @code{MYSQL_RES} ݥ󥿤ѤǤȤƤǤ - -̤ @file{libmysqlclient.a} 饤֥ϥåɰǤΰ̣ -뤳ȤϡƱ³ϥɥ(@code{mysql_real_connect()} ֤)ˡƱ -ˣĤΥåɤ饯Ԥʤʤ¤ꡢ饤ȥɤϥåɰ -ȤȤǤ; 饤ȡХץȥϡͿ줿³Ʊ -˰Ĥ׵ޤʣΥåɤƱ³Ѥϡ -@code{mysql_query()} @code{mysql_store_result()} Ȥ߹碌Τޤ -mutex lock Ԥʤɬפޤ @code{mysql_store_result()} Ѱ -ǤȡåϲǤ¾ΥåɤƱ³˥ԤʤȤ -Ǥޤ(¾θդǸȡåץȥѤ¤ꡢ̤Υ -åɤϡ@code{mysql_store_result()} ̤ @code{MYSQL_RES} -󥿤ѤǤޤ) POSIX åɤǥץԤʤ硢 -@code{pthread_mutex_lock()} @code{pthread_mutex_unlock()} mutex -lock γΩȲ˻ѤǤޤ - -@code{mysql_store_result()} Ǥʤ @code{mysql_use_result()} Ѥ -硢@code{mysql_use_result()} β @code{mysql_fetch_row()} ƤӽФ -åɬפǤåɲ饤Ȥ˰ɤΤϡ -@code{mysql_use_result()} ѤʤȤǤ - -@node Perl, Eiffel, C API functions, Clients -@section @strong{MySQL} Perl API - -Ǥ Perl @code{DBI} 󥿡եˤĤƽҤ٤롣 -Υ󥿡ե @code{mysqlperl} Ǥä -@code{DBI}/@code{DBD} Perl 󥿡եȤƸ߿侩ƤΤǡ -@code{mysqlperl} ˴ؤƤϤǤϽҤ٤ʤ - -@menu -* DBI with DBD:: @code{DBI} with @code{DBD::mysql} -* Perl DBI Class:: The @code{DBI} interface -* DBI-info:: More @code{DBI}/@code{DBD} information -@end menu - -@node DBI with DBD, Perl DBI Class, Perl, Perl -@subsection @code{DBI} with @code{DBD::mysql} - -@code{DBI} ¿Υǡ١ȤΰŪʥ󥿡եǤ롣 -ϡ¿Υǡ١ư륹ץȤѹʤ˽񤱤뤳Ȥ̣롣 -Τˤϡ줾Υǡ١ѤΥǡ١ɥ饤 (DBD) ɬפǤ롣 -@strong{MySQL} ǤϡΥɥ饤Ф @code{DBD::mysql} Ǥ롣 - -Perl5 DBI ˴ؤܺ٤ϡ@code{DBI}å֥ڡ򻲾ȤΤȡ -@example -@uref{http://www.symbolstone.org/technology/perl/DBI/index.html} -@end example -Object Oriented Programming (OOP) ˴ؤܺ٤ϡPerl OOP ڡ򻲾ȤΤȡ -@example -@uref{http://language.perl.com/info/documentation.html} -@end example - -Installation instructions for @strong{MySQL} Perl support are given in -@ref{Perl support}. - -@cindex @code{DBI} Perl module -@node Perl DBI Class, DBI-info, DBI with DBD, Perl -@subsubsection The @code{DBI} interface - -@noindent -@strong{Portable DBI methods} - -@multitable @columnfractions .3 .7 -@item @code{connect} @tab ǡ١Ф³ -@item @code{disconnect} @tab ǡ١ФȤ³ڤ -@item @code{prepare} @tab SQLʸꤹ -@item @code{execute} @tab ꤵ줿SQLʸ¹Ԥ -@item @code{do} @tab SQLʸꤷ¹Ԥ -@item @code{quote} @tab 뤿Υʸޤ @code{BLOB} -@item @code{fetchrow_array} @tab եɤȤƼΥ쥳ɤФ -@item @code{fetchrow_arrayref} @tab եɤ󻲾ȤȤƼΥ쥳ɤФ -@item @code{fetchrow_hashref} @tab ϥåơ֥ؤλȤȤƼΥ쥳ɤФ -@item @code{fetchall_arrayref} @tab ȤǡФ -@item @code{finish} @tab ̿λ꥽饷ƥڤΥ -@item @code{rows} @tab ƶΤä쥳ɤο֤ -@item @code{data_sources} @tab ۥȾѤǤǡ١֤ -@item @code{ChopBlanks} @tab @code{fetchrow_*} ᥽åɤɤ -@item @code{NUM_OF_PARAMS} @tab ꤵ줿̿ʸ placeholder ο -@item @code{NULLABLE} @tab ɤΥեɤ @code{NULL} ͤ뤫 -@item @code{trace} @tab Perform tracing for debugging -@end multitable - -@noindent -@strong{MySQL ͭ᥽å} - -@multitable @columnfractions .3 .7 -@item @code{insertid} @tab Ǹ @code{AUTO_INCREMENT} -@item @code{is_blob} @tab ɤΥեɤ @code{BLOB} -@item @code{is_key} @tab ɤΥեɤ -@item @code{is_num} @tab ɤΥեɤͷ -@item @code{is_pri_key} @tab ɤΥեɤץ饤ޥꥭ -@item @code{is_not_null} @tab ɤΥեɤ @code{NULL} ͤ@code{NULLABLE} ȡ -@item @code{length} @tab Ѳǽʥեɥκ -@item @code{max_length} @tab ºݤ¸ߤƤեɥκ -@item @code{NAME} @tab ե̾ -@item @code{NUM_OF_FIELDS} @tab ֤줿եɤο -@item @code{table} @tab ֤줿åȤΥơ֥̾ -@item @code{type} @tab ƤΥեɤη -@item @code{_CreateDB} @tab ǡ١ -@item @code{_DropDB} @tab ǡ١롣 @strong{Υ᥽åɤϴǤ} -@end multitable - -ʲˡܺ٤ Perl ᥽åɤβ⤬롣 -Variables used for method return values have these meanings: - -@table @code -@item $dbh -Database handle - -@item $sth -Statement handle - -@item $rc -Return code (often a status) - -@item $rv -Return value (often a row count) -@end table - -@noindent -@strong{ DBI ᥽å} - -@table @code - -Generally the 'do' statement is MUCH faster (and is preferable) -than prepare/execute for statements that doesn't contain parameters. - -@findex DBI->connect() -@findex connect() DBI method -@item connect($data_source, $username, $password) -ǡȤΥǡ١³򤹤뤿 @code{connect} Ȥ -@code{$data_source} ͤ @code{DBI:driver_name:} ǤϤ뤳ȡ -@code{DBD::mysql} ɥ饤СѤ @code{connect} λ㡧 -@example -$dbh = DBI->connect("DBI:mysql:$database", $user, $password); -$dbh = DBI->connect("DBI:mysql:$database:$hostname", - $user, $password); -$dbh = DBI->connect("DBI:mysql:$database:$hostname:$port", - $user, $password); -@end example -桼̾ޤϥѥɤ̤ξ硢 @code{DBI} ϴĶѿǤ - @code{DBI_USER} @code{DBI_PASS} 򤽤줾Ȥ -ۥ̾ꤷʤϡ@code{'localhost'} ǥեȤȤʤ롣 -ݡֹꤷʤϡ@strong{MySQL} ݡȡ@value{default_port} -ǥեȤȤʤ롣 - -As of @code{Msql-Mysql-modules} version 1.2009, -the @code{$data_source} value allows certain modifiers: - -@table @code -@item mysql_read_default_file=file_name -Read @file{filename} as an option file. For information on option files, -see @ref{Option files}. - -@item mysql_read_default_group=group_name -The default group when reading an option file is normally the -@code{[client]} group. By specifying the @code{mysql_read_default_group} -option, the default group becomes the @code{[group_name]} group. - -@item mysql_compression=1 -Use compressed communication between the client and server (@strong{MySQL} -3.22.3 or later). - -@item mysql_socket=/path/to/socket -Specify the pathname of the Unix socket that is used to connect -to the server (@strong{MySQL} 3.21.15 or later). -@end table - -Multiple modifiers may be given; each must be preceded by a semicolon. - -For example, if you want to avoid hardcoding the user name and password into -a @code{DBI} script, you can take them from the user's @file{~/.my.cnf} -option file instead by writing your @code{connect} call like this: - -@example -$dbh = DBI->connect("DBI:mysql:$database" - . ";mysql_read_default_file=$ENV@{HOME@}/.my.cnf", - $user, $password); -@end example - -This call will read options defined for the @code{[client]} group in the -option file. If you wanted to do the same thing, but use options specified -for the @code{[perl]} group as well, you could use this: - -@example -$dbh = DBI->connect("DBI:mysql:$database" - . ";mysql_read_default_file=$ENV@{HOME@}/.my.cnf" - . ";mysql_read_default_group=perl", - $user, $password); -@end example - -@findex DBI->disconnect -@findex disconnect DBI method -@item disconnect -@code{disconnect} ᥽åɤϡǡ١ȤΥǡ١ϥɥǤ롣 -ץλľ˸ƤӽФΤŵŪǤ롣 -㡧 -@example -$rc = $dbh->disconnect; -@end example - -@findex DBI->prepare() -@findex prepare() DBI method -@item prepare($statement) -ǡ١󥸥Ǽ¹Ԥ뤿SQLʸꤷ@code{execute} ᥽åɤ -ѽ륹ơȥȥϥɥ @code{($sth)} ֤ -Typically you handle @code{SELECT} statements (and @code{SELECT}-like statements -such as @code{SHOW}, @code{DESCRIBE} and @code{EXPLAIN}) by means of -@code{prepare} and @code{execute}. -㡧 -@example -$sth = $dbh->prepare($statement) - or die "Can't prepare $statement: $dbh->errstr\n"; -@end example - -@findex DBI->execute -@findex execute DBI method -@item execute -@code{execute} ᥽åɤϡꤵ줿SQLʸ¹Ԥ롣 @code{SELECT} ʸΤȤϡ -ƶΤä쥳ɤο֤ ⤷ʤѲʤäʤ顢 @code{execute} @code{"0E0"} -( Perl Ǥ Ǥ Ǥ⤢) ֤ -@code{SELECT} ʸΤȤϡSQL׵򳫻ϤΤߤǤ롣 -ǡ @code{fetch_*} ᥽åɤΰĤ򵭽Ҥɬפ롣 -㡧 -@example -$rv = $sth->execute - or die "can't execute the query: $sth->errstr; -@end example - -@findex DBI->do() -@findex do() DBI method -@item do($statement) -@code{do} ᥽åɤSQLʸꡦ¹ԤƶΤä쥳ɤο֤ -Υ᥽åɤϡ selectʸʤ١ʥɥ饤Сθ³ΤˤǤʤʸ -٤μ¹ԡinserts, deletes ʤɡˤǺѤʸΤȤ˰ŪѤ롣 -㡧 -@example -$rv = $dbh->do($statement) - or die "Can't execute $statement: $dbh- >errstr\n"; -@end example - -@findex DBI->quote() -@findex quote() DBI method -@cindex Quoting strings -@cindex Strings, quoting -@item quote($string) -@code{quote} ᥽åɤϡʸ˥ʸȤѤ졢 -ʸʸγ¦ղä롣 -㡧 -@example -$sql = $dbh->quote($string) -@end example - -@findex DBI->fetchrow_array -@findex fetchrow_array DBI method -@item fetchrow_array -Υ᥽åɤϥǡμΥ쥳ɤФեɤͤȤ֤ -㡧 -@example -while(@@row = $sth->fetchrow_array) @{ - print qw($row[0]\t$row[1]\t$row[2]\n); -@} -@end example - -@findex DBI->fetchrow_arrayref -@findex fetchrow_arrayref DBI method -@item fetchrow_arrayref -Υ᥽åɤϥǡμΥ쥳ɤФեɤͤؤλȤȤ֤ -㡧 -@example -while($row_ref = $sth->fetchrow_arrayref) @{ - print qw($row_ref->[0]\t$row_ref->[1]\t$row_ref->[2]\n); -@} -@end example - -@findex DBI->fetchrow_hashref -@findex fetchrow_hashref DBI method -@item fetchrow_hashref -Υ᥽åɤϥǡΥ쥳ɤФ̾ͤΥڥΥեɤޤ -ϥåơ֥ؤλȤ֤Υ᥽åɤϡǼ󻲾 -@code{fetchrow_arrayref}ˤ⤫ʤΨŪǤϤʤ㡧 -@example -while($hash_ref = $sth->fetchrow_hashref) @{ - print qw($hash_ref->@{firstname@}\t$hash_ref->@{lastname@}\t\ - $hash_ref- > title@}\n); -@} -@end example - -@findex DBI->fetchall_arrayref -@findex fetchall_arrayref DBI method -@item fetchall_arrayref -Υ᥽åɤϡSQLʸ֤줿ǡʥ쥳ɡˤƤ뤿˻Ȥ -Υ᥽åɤϡƥ쥳ɤؤλȤؤλȤ֤ -ҤΥ롼פȤäƥǡѡɽ롣㡧 -@example -my $table = $sth->fetchall_arrayref - or die "$sth->errstr\n"; -my($i, $j); -for $i ( 0 .. $#@{$table@} ) @{ - for $j ( 0 .. $#@{$table->[$i]@} ) @{ - print "$table->[$i][$j]\t"; - @} - print "\n"; -@} -@end example - -@findex DBI->finish -@findex finish DBI method -@item finish -Υơȥȥϥɥ뤫餽ʾǡФʤȤ򼨤ơȥȥϥɥ䡢ĤǤƥ꥽뤿ˤΥ᥽åɤƤӽФ㡧 -@example -$rc = $sth->finish; -@end example - -@findex DBI->rows -@findex rows DBI method -@item rows -Ǹ̿ˤꡢʥǡιʤɤǡ˱ƶΤä쥳ɤο֤ -Υ᥽åɤ @code{do} 뤤 @code{SELECT} @code{execute} ʸ -¹ԤˡƤȤ롣㡧 -Example: -@example -$rv = $sth->rows; -@end example - -@findex DBI->@{NULLABLE@} -@findex NULLABLE DBI method -@item NULLABLE -γǤФ֡ͤؤλȤ֤ -TRUE ǤФΥեɤ @code{NULL} ͤޤޤƤ뤳Ȥ򼨤㡧 -Example: -@example -$null_possible = $sth->@{NULLABLE@}; -@end example - -@findex DBI->@{NUM_OF_FIELDS@} -@findex NUM_OF_FIELDS DBI method -@item NUM_OF_FIELDS -°ϡ@code{SELECT} ʸ @code{SHOW FIELDS} ʸˤä֤줿 -եɤο򼨤Ƥ롣̿ʸ̤֤ɤåΤˡ -ȤȤ롧ͤϡ@code{INSERT}, @code{DELETE} ޤ - @code{UPDATE} Τ褦 @code{SELECT} ʸ򼨤Ƥ롣㡧 -Example: -@example -$nr_of_fields = $sth->@{NUM_OF_FIELDS@}; -@end example - -@findex DBI->data_sources() -@findex data_sources() DBI method -@item data_sources($driver_name) -Υ᥽åɤϡ@code{'localhost'} ۥȾ @strong{MySQL} Ф -Ѳǽʥǡ١̾ޤ֤㡧 -@example -@@dbs = DBI->data_sources("mysql"); -@end example - -@findex DBI->@{ChopBlanks@} -@findex ChopBlanks DBI method -@item ChopBlanks -°ϡ @code{fetchrow_*} ᥽åɤ֤ͤζ -뤫ɤꤹ롣㡧 -@example -$sth->@{'ChopBlanks'@} =1; -@end example - -@findex DBI->trace -@findex trace DBI method -@item trace($trace_level) -@itemx trace($trace_level, $trace_filename) -The @code{trace} method enables or disables tracing. When invoked as a -@code{DBI} class method, it affects tracing for all handles. When invoked as -a database or statement handle method, it affects tracing for the given -handle (and any future children of the handle). Setting @code{$trace_level} -to 2 provides detailed trace information. Setting @code{$trace_level} to 0 -disables tracing. Trace output goes to the standard error output by -default. If @code{$trace_filename} is specified, the file is opened in -append mode and output for @emph{all} traced handles is written to that -file. Example: -@example -DBI->trace(2); # trace everything -DBI->trace(2,"/tmp/dbi.out"); # trace everything to /tmp/dbi.out -$dth->trace(2); # trace this database handle -$sth->trace(2); # trace this statement handle -@end example - -@tindex DBI_TRACE environment variable -@tindex Environment variable, DBI_TRACE -You can also enable @code{DBI} tracing by setting the @code{DBI_TRACE} -environment variable. Setting it to a numeric value is equivalent to calling -@code{DBI->(value)}. Setting it to a pathname is equivalent to calling -@code{DBI->(2,value)}. - -@end table - -@noindent -@strong{MySQL ͭ᥽å} - -The methods shown below are @strong{MySQL}-specific and not part of the -@code{DBI} standard. Several of them are now deprecated: -@code{is_blob}, @code{is_key}, @code{is_num}, @code{is_pri_key}, -@code{is_not_null}, @code{length}, @code{max_length}, and @code{table}. -Where @code{DBI}-standard alternatives exist, they are noted below. - -@table @code -@findex DBI->@{insertid@} -@findex insertid DBI method -@cindex AUTO_INCREMENT, using with DBI -@item insertid -@strong{MySQL} ħǤ @code{AUTO_INCREMENT} ȤȤ -ư夬ͤ˵롣㡧 -Example: -@example -$new_id = $sth->@{insertid@}; -@end example - -As an alternative, you can use @code{$dbh->@{'mysql_insertid'@}}. - -@findex DBI->@{is_blob@} -@findex is_blob DBI method -@item is_blob -γǤФ֡ͤؤλȤ֤TRUE Ǥ -Υեɤ @code{BLOB} ͤǤ뤳Ȥ򼨤㡧 -@example -$keys = $sth->@{is_blob@}; -@end example - -@findex DBI->@{is_key@} -@findex is_key DBI method -@item is_key -γǤФ֡ͤؤλȤ֤TRUE Ǥ -ΥեɤǤ뤳Ȥ򼨤 -㡧 -@example -$keys = $sth->@{is_key@}; -@end example - -@findex DBI->@{is_num@} -@findex is_num DBI method -@item is_num -γǤФ֡ͤؤλȤ֤TRUE Ǥ -ΥեɤͷǤ뤳Ȥ򼨤 -㡧 -@example -$nums = $sth->@{is_num@}; -@end example - -@findex DBI->@{is_pri_key@} -@findex is_pri_key DBI method -@item is_pri_key -γǤФ֡ͤؤλȤ֤TRUE Ǥ -Υեɤץ饤ޥ꡼Ǥ뤳Ȥ򼨤 -㡧 -@example -$pri_keys = $sth->@{is_pri_key@}; -@end example - -@findex DBI->@{is_not_null@} -@findex is_not_null DBI method -@item is_not_null -γǤФ֡ͤؤλȤ֤FALSE Ǥ -Υեɤ @code{NULL} ͤޤळȤ򼨤 -㡧 -@example -$not_nulls = $sth->@{is_not_null@}; -@end example - -@code{is_not_null} is deprecated; -Ҥ @code{NULLABLE} °Ѥۤ˾ޤ줬 DBI ɸǤ롣 - -@findex DBI->@{length@} -@findex length DBI method -@findex DBI->@{max_length@} -@findex max_length DBI method -@item length -@itemx max_length -줾Υ᥽åɤϡեɥؤλȤ֤@code{length} ϡ -ʥơ֥뵭Ҥ줿˳ƥեɤѲǽͤ򼨤 -@code{max_length} ϡơ֥˼ºݤ¸ߤƤͤ򼨤㡧 - -@example -$lengths = $sth->@{length@}; -$max_lengths = $sth->@{max_length@}; -@end example - -@findex DBI->@{NAME@} -@findex NAME DBI method -@item NAME -ե̾ؤλȤ֤ -㡧 -@example -$names = $sth->@{NAME@}; -@end example - -@findex DBI->@{table@} -@findex table DBI method -@item table -ơ֥̾ؤλȤ֤ -㡧 -@example -$tables = $sth->@{table@}; -@end example - -@findex DBI->@{type@} -@findex type DBI method -@item type -եɤηؤλȤ֤ -㡧 -@example -$types = $sth->@{type@}; -@end example - -@end table - -@node DBI-info, , Perl DBI Class, Perl -@subsection @code{DBI}/@code{DBD} ˴ؤ뤽ʾξ - -@code{DBI} ˴ؤ뤽ʾξ @code{perldoc} ޥɤ롣 - -@example -perldoc DBI -perldoc DBI::FAQ -perldoc DBD::mysql -@end example - -¾ΥեޥåȤѴġ롢@code{pod2man}, @code{pod2html} ʤɤ -ȤȤ롣 - -Ƥ@code{DBI} κǿ @code{DBI} å֥ڡǸ뤳Ȥ롧 -@example -@uref{http://www.symbolstone.org/technology/perl/DBI/index.html} -@end example - -@node Eiffel, Java, Perl, Clients -@section @strong{MySQL} Eiffel wrapper - -The @strong{MySQL} @uref{http://www.mysql.com/Contrib/,Contrib directory} -contains an Eiffel wrapper written by Michael Ravits - -You can also find this at: -@url{http://www.netpedia.net/hosting/newplayer/} - -@node Java, PHP, Eiffel, Clients -@section @strong{MySQL} Java connectivity (JDBC) - -There are 2 supported JDBC drivers for @strong{MySQL} (the twz and mm driver). -You can find a copy of these at @uref{http://www.mysql.com/Contrib}. -For documentation consult any JDBC documentation and the -drivers own documentation for @strong{MySQL} specific features. - -@node PHP, Cplusplus, Java, Clients -@section @strong{MySQL} PHP API - -PHP is a server-side, HTML embedded scripting language that may be used to -create dynamic web pages. It contains support for accessing several -databases, including @strong{MySQL}. PHP may be run as a separate program, -or compiled as a module for use with the Apache web server. - -The distribution and documentation are available at the -@uref{http://www.php.net/, PHP website}. - -@menu -* PHP problems:: -@end menu - -@node PHP problems, , PHP, PHP -@subsection Common problems with MySQL and PHP - -@itemize bullet -@item Error: "Maximum Execution Time Exeeded" -This is a PHP limit; Go into the @file{php3.ini} file and set the maximum -execution time up from 30 seconds to something higher, as needed. -It is also not a bad idea to double the ram allowed per script to 16 instead of -8 MB. -@item Error: "Fatal error: Call to unsupported or undefined function mysql_connect() in .." -This means that your PHP version isn't compiled with @strong{MySQL} support. -You can either compile a dynamic @strong{MySQL} module and load it into PHP or -recompile PHP with built-in @code{MySQL} support. This is described in -detail in the PHP manual. -@end itemize - -@node Cplusplus, Python, PHP, Clients -@section @strong{MySQL} C++ APIs - -Two API's is available in the @strong{MySQL} -@uref{http://www.mysql.com/Contrib/,Contrib directory}. - -@node Python, Tcl, Cplusplus, Clients -@section @strong{MySQL} Python APIs - -The @strong{MySQL} @uref{http://www.mysql.com/Contrib/,Contrib directory} -contains a Python -interface written by Joseph Skinner. - -You can also use the Python interface to iODBC to access a -@strong{MySQL} server. -@uref{http://starship.skyport.net/~lemburg/,mxODBC} - -@node Tcl, Ruby, Python, Clients -@section @strong{MySQL} Tcl APIs - -@uref{http://www.binevolve.com/~tdarugar/tcl-sql/, Tcl at binevolve}. -The -@uref{http://www.mysql.com/Contrib,Contrib directory} contains a Tcl -interface that is based on msqltcl 1.50. - -@cindex Ruby -@node Ruby, , Tcl, Clients -@section @strong{MySQL} Ruby API - -ʲΥȤˡRuby MySQL 󥿡եޤ - -@uref{http://www.tmtm.org/, www.tmtm.org ȤߤޤҤ Web ڡ} - -@node Comparisons, MySQL internals, Clients, Top -@chapter How @strong{MySQL} compares to other databases - -@menu -* Compare mSQL:: @strong{MySQL} @code{mSQL} Ȥ -* Compare PostgreSQL:: @strong{MySQL} @code{PostgreSQL} Ȥ -@end menu - -@node Compare mSQL, Compare PostgreSQL, Comparisons, Comparisons -@section @strong{MySQL} @code{mSQL} Ȥ - -ϡ@strong{MySQL} ȯԤˤäƽ񤫤ƤޤΤǡΤĤ -ɤDz桹ΤäƤ¾δְ㤤Ϥޤ - -For a list of all supported limits, functions and types, see the -@uref{http://www.mysql.com/crash-me-choose.htmy, @code{crash-me} web page}. - -@table @strong -@item Performance - -®ӤΤϡä @strong{MySQL} ٥ޡȤ򸫤Ʋ -@xref{Benchmarks}. - -Because there is no thread creation overhead, a small parser, few features and -simple security, @code{mSQL} should be quicker at: - -@itemize @bullet -@item -Tests that perform repeated connects and disconnects, running a very simple -query during each connection. -@item -@code{INSERT} operations into very simple tables with few columns and keys. -@item -@code{CREATE TABLE} and @code{DROP TABLE}. -@item -@code{SELECT} on something that isn't an index. (A table scan is very -easy.) -@end itemize - -Υڥ졼ϤȤƤñʤΤǡϤΥСإåɤ⤯ʤ -ˤɤΤ񤷤Ǥ³Ω줿 @strong{MySQL} -ϤȤƤɤǽˤʤޤ - -¾ΤΤǤ @strong{MySQL} @code{mSQL} ¿¾ SQL Ȥ -®Ǥ: - -@itemize @bullet -@item -Complex @code{SELECT} operations. -@item -礭ʷ̤μФ (@strong{MySQL} Ϥɤ, ®Ƥ -ʥץȥޤ) -@item -Ĺʸĥơ֥롣@strong{MySQL} Ϥ˸ΨŪʽ @code{VARCHAR} -˥ǥåĤȤǤޤ -@item -¿Υեɤĥơ֥ν -@item -礭ʥ쥳ĹΥơ֥ν -@item -@code{SELECT} with many expressions. -@item -@code{SELECT} on large tables. -@item -Ʊ¿³ޤ@strong{MySQL} ϴʥޥåɤǤ -³Ϥ켫ȤΥåɤޤϡ餬¾Ԥɬפʤ -Ȥ̣ޤ(Ʊơ֥ѹ륯꤬¹Ԥ) -@code{mSQL} ǤϡƤ¾³ϡǽΤ - ꤬Ĺû -ؤ餺 - ¹Ԥ졢ޤԤɬפޤθ弡³Ϳ -졢¾ƤϺƤԤޤ -@item -Joins. -@code{mSQL} can become pathologically slow if you change the order of tables -in a @code{SELECT}. In the benchmark suite, a time more than 15000 times -slower than @strong{MySQL} was seen. This is due to @code{mSQL}'s lack of a -join optimizer to order tables in the optimal order. However, if you put the -tables in exactly the right order in @code{mSQL}2 and the @code{WHERE} is -simple and uses index columns, the join will be relatively fast! -@xref{Benchmarks}. -@item -@code{ORDER BY} and @code{GROUP BY}. -@item -@code{DISTINCT}. -@item -@code{TEXT} ޤ @code{BLOB} եɤλѡ -@end itemize - -@item SQL Features - -@itemize @bullet -@item @code{GROUP BY} and @code{HAVING}. -@code{mSQL} does not support @code{GROUP BY} at all. -@strong{MySQL} @code{HAVING} ȼ @code{GROUP BY} 䡢δ - @code{count()}, @code{avg()}, @code{min()}, @code{max()}, -@code{sum()} @code{std()} 򥵥ݡȤޤ@code{min()} -@code{max()} ʸΰޤ@code{count(*)} ϡ⤬ -ξˤȤƤ®֤褦˺Ŭޤ@code{mSQL} -@code{GROUP BY} ݡȤޤ - -@item @code{INSERT} and @code{UPDATE} with calculations. -@strong{MySQL} can do calculations in an @code{INSERT} or @code{UPDATE}. -For example: -@example -mysql> UPDATE SET x=x*10+y WHERE x<20; -@end example - -@item Aliasing. -@strong{MySQL} ϥեɤΥꥢ̾ޤ - -@item Qualifying column names. -In @strong{MySQL}, if a column name is unique among the tables used in a -query, you do not have to use the full qualifier. - -@item @code{SELECT} with functions. -@strong{MySQL} has many functions (too many to list here; see @ref{Functions}). - -@end itemize - -@item ΰǽ -ϡơ֥ɤΤ褦˾Ǥ뤫Ǥ - -@strong{MySQL} ϤȤƤ̩ʷޤȤƤ⾮ΰѤơ֥Ǥ -뤿Ǥ@strong{MySQL} ǡͭѤϡ3ХĹ @code{MEDIUMINT} -Ǥ10,000,000 쥳ɤľ硢1쥳ɤ1ХȤǤ -ƤפǤ - -@code{mSQL2} 4Ĥη(char,text,int,real)ʤΤǡʥơ֥ -Τ񤷤Ǥ - -@item -ҴŪȽǤΤ񤷤Ǥ@strong{MySQL} ΰˤĤƤ -@ref{Stability} 򻲾ȤƤ - -桹ˤ @code{mSQL} ηиޤ󡣤Τᡢ桹Ϥˤ -Ƥϲޤ - -@item -⤦ĤνפϤ饤󥹤Ǥ@strong{MySQL} -@code{mSQL} ʥ饤󥹤äƤޤ @code{mSQL} -¤ǤʤȤ⡢ʤѤ򤷤Ƥˡ饤 -ޤ email ݡȤؤλʧθ뤳ȤФƤƲ -@strong{MySQL} ޤ᤿ʤ硢󤳤Υ饤󥹤γ׵ -ޤ - - -@item Perl interfaces -@strong{MySQL} ϴŪ @code{mSQL} Ʊ perl 󥿥եȡĤ -õǽޤ - -@item JDBC (Java) -@strong{MySQL} currently has 4 JDBC drivers: -@itemize @bullet -@item -The gwe driver: A Java interface by GWE technologies (not supported anymore). -@item -The jms driver: An improved gwe driver by Xiaokun Kelvin ZHU -@email{X.Zhu@@brad.ac.uk}. -@item -The twz driver: A type 4 JDBC driver by Terrence W. Zellers -@email{zellert@@voicenet.com}. This is commercial but is free for private -and educational use. -@item -The mm driver: A type 4 JDBC driver by Mark Matthews -@email{mmatthew@@ecn.purdue.edu}. This is released under the GPL. -@end itemize - -The recommended drivers are the twz or mm driver. Both are reported to work -excellently. - -We know that @code{mSQL} has a JDBC driver, but we have too little experience -with it to compare. - -@item ȯ® -@strong{MySQL} ϤȤƤ⾮ȯäƤޤ桹 C C++ Υǥ -󥰤ȤƤ®Ԥʤޤåɡؿ @code{GROUP BY} ʤɤϤޤ -@code{mSQL} ˤϼƤޤΤǡit has a lot of chatching up to -do. ξǤĤθ̤뤿ˡǯ @code{mSQL} @file{HISTORY} ե -򸫤ơ@strong{MySQL} Reference Manual News ӤǤޤ(@pxref{News})®ȯ줿¿Τ -ʤˤʤޤ - -@item 桼ƥƥץ -@code{mSQL} @strong{MySQL} ¿ζ̣ɥѡƥġ -Ƥޤ̤ؤΰܹ (@code{mSQL} -> @strong{MySQL}) ϤȤƤñǤ -@strong{MySQL} ϡۤȤƤζ̣ @code{mSQL} ץꥱ -äƤޤ - -@strong{MySQL} ˤϡñ @code{msql2mysql} ץबѰդƤޤ -ϡ@code{mSQL} @strong{MySQL} C API ؿΥڥΰ㤤ץǤ -For example, it changes instances of @code{msqlConnect()} to -@code{mysql_connect()}. -@code{mSQL} MySQL ؤѴ̾ʬѤǤ -@end table - -@menu -* Using mSQL tools:: How to convert @code{mSQL} tools for @strong{MySQL} -* Protocol differences:: How @code{mSQL} and @strong{MySQL} client/server communications protocols differ -* Syntax differences:: How @code{mSQL} 2.0 SQL syntax differs from @strong{MySQL} -@end menu - -@node Using mSQL tools, Protocol differences, Compare mSQL, Compare mSQL -@subsection How to convert @code{mSQL} tools for MySQL - -According to our experience, it would just take a few hours to convert tools -such as @code{msql-tcl} and @code{msqljava} that use the -@code{mSQL} C API so that they work with the @strong{MySQL} C API. - -The conversion procedure is: - -@enumerate -@item -륹ץ @code{msql2mysql} 򥽡˼¹ԤޤХʥץ -@code{replace} ɬפǤ @strong{MySQL} ۤޤ -@item -Compile. -@item -ƤΥѥ饨顼ޤ. -@end enumerate - -@strong{MySQL} @code{mSQL} ֤ C API ΰ㤤: -@itemize @bullet -@item -@strong{MySQL} @code{MYSQL} ¤Τ³ȤƻѤޤ (@code{mSQL} -@code{int} Ѥޤ) -@item -@code{mysql_connect()} @code{MYSQL} ¤ΤؤΥݥ󥿤ѥ᡼ȤƻѤޤ -򥰥Хꡢγ @code{malloc()} ѤΤϴñǤ -@code{mysql_connect()} also takes two parameters for specifying the user and -password. You may set these to @code{NULL, NULL} for default use. -@item -@code{mysql_error()} @code{MYSQL} ¤Τѥ᡼ȤƻѤޤŤɤ -Ԥ硢ʤθŤ @code{msql_error()} ɤإѥ᡼ɲäƤ -@item -@strong{MySQL} returns an error number and a text error message for all -errors. @code{mSQL} returns only a text error message. -@item -Some incompatibilities exist as a result of @strong{MySQL} supporting -multiple connections to the server from the same process. -@end itemize - -@node Protocol differences, Syntax differences, Using mSQL tools, Compare mSQL -@subsection How @code{mSQL} and MySQL client/server communications protocols differ - -There are enough differences that it is impossible (or at least not easy) -to support both. - -The most significant ways in which the @strong{MySQL} protocol differs -from the @code{mSQL} protocol are listed below: - -@itemize @bullet -@item -åХåե¿η̹Ԥޤޤ -@item -ޤϲߤΥХåե礭硢Фȥ饤ȤΥ -եǽ¤ޤǡåХåեưŪ礵ޤ -@item -ƤΥѥåȤϡѥåȤνʣ丫򸫤ĤФˡֹŤ -Ƥޤ -@item -Ƥιܤ ASCII 졢ܤιԤĹϥѥå줿Хʥꥳǥ -(1,2 ޤ 3 Х)ޤ -@item -@strong{MySQL} ϥХåեʤ̤ɤ߹߲ǽǤ(饤˴ʥ -ȤǼɬפޤ) -@item -Ĥν񤭹/ɤ߹ߤ 30 ðʾ夫ȡФ³򥯥 - -@item -³ 8 ֲⵯʤȡФ³򥯥ޤ -@end itemize - -@node Syntax differences, , Protocol differences, Compare mSQL -@subsection @strong{MySQL} & @code{mSQL} 2.0 ֤ SQL ʸΰ㤤ϡ - -@noindent -@strong{Column types} - -@table @code -@item @strong{MySQL} -¾˲äιܥץ󷿤ޤ (among others; see -@pxref{CREATE TABLE, , @code{CREATE TABLE}}): -@itemize @bullet -@item -@code{ENUM} type for one of a set of strings. -@item -@code{SET} type for many of a set of strings. -@item -@code{BIGINT} type for 64-bit integers. -@end itemize -@item -@strong{MySQL} also supports -the following additional type attributes: -@itemize @bullet -@item -ܤؤ @code{UNSIGNED} ץ -@item -ܤؤ @code{ZEROFILL} ץ -@item -@code{PRIMARY KEY} ޤƤܤؤ @code{AUTO_INCREMENT} ץ -@xref{mysql_insert_id, , @code{mysql_insert_id()}}. -@item -Ƥιܤؤ @code{DEFAULT} -@end itemize -@item mSQL2 -@code{mSQL} column types correspond to the @strong{MySQL} types shown below: -@multitable @columnfractions .15 .85 -@item @code{mSQL} @strong{type} @tab @strong{Corresponding @strong{MySQL} type} -@item @code{CHAR(len)} @tab @code{CHAR(len)} -@item @code{TEXT(len)} @tab @code{TEXT(len)}. @code{len} is the maximal length. -And @code{LIKE} works. -@item @code{INT} @tab @code{INT}. With many more options! -@item @code{REAL} @tab @code{REAL}. Or @code{FLOAT}. Both 4- and 8-byte versions are available. -@item @code{UINT} @tab @code{INT UNSIGNED} -@item @code{DATE} @tab @code{DATE}. Uses ANSI SQL format rather than @code{mSQL}'s own format. -@item @code{TIME} @tab @code{TIME} -@item @code{MONEY} @tab @code{DECIMAL(12,2)}. A fixed-point value with two decimals. -@end multitable -@end table - -@noindent -@strong{Index creation} - -@table @code -@item @strong{MySQL} -Indexes may be specified at table creation time with the @code{CREATE TABLE} -statement. -@item mSQL -Indexes must be created after the table has been created, with separate -@code{CREATE INDEX} statements. -@end table - -@noindent -@strong{To insert a unique identifier into a table} - -@table @code -@item @strong{MySQL} -Use @code{AUTO_INCREMENT} as a column type -specifier. -@xref{mysql_insert_id, , @code{mysql_insert_id()}}. -@item mSQL -Create a @code{SEQUENCE} on a table and select the @code{_seq} column. -@end table - -@noindent -@strong{To obtain a unique identifier for a row} - -@table @code -@item @strong{MySQL} -Add a @code{PRIMARY KEY} or @code{UNIQUE} key to the table and use this. -New in 3.23.11: If the @code{PRIMARY} or @code{UNIQUE} key consists of only one -column and this is of type integer, one can also refer to it as -@code{_rowid}. -@item mSQL -Use the @code{_rowid} column. Observe that @code{_rowid} may change over time -depending on many factors. -@end table - -@noindent -@strong{To get the time a column was last modified} - -@table @code -@item @strong{MySQL} -Add a @code{TIMESTAMP} column to the table. This column is automatically set -to the current date and time for @code{INSERT} or @code{UPDATE} statements if -you don't give the column a value or if you give it a @code{NULL} value. - -@item mSQL -Use the @code{_timestamp} column. -@end table - -@noindent -@strong{@code{NULL} value comparisons} - -@table @code -@item @strong{MySQL} -@strong{MySQL} follows -ANSI SQL and a comparison with @code{NULL} is always @code{NULL}. -@item mSQL -In @code{mSQL}, @code{NULL = NULL} is TRUE. You -must change @code{=NULL} to @code{IS NULL} and @code{<>NULL} to -@code{IS NOT NULL} when porting old code from @code{mSQL} to @strong{MySQL}. -@end table - -@noindent -@strong{String comparisons} - -@table @code -@item @strong{MySQL} -Normally, string comparisons are performed in case-independent fashion with -the sort order determined by the current character set (ISO-8859-1 Latin1 by -default). If you don't like this, declare your columns with the -@code{BINARY} attribute, which causes comparisons to be done according to the -ASCII order used on the @strong{MySQL} server host. -@item mSQL -All string comparisons are performed in case-sensitive fashion with -sorting in ASCII order. -@end table - -@noindent -@strong{Case-insensitive searching} - -@table @code -@item @strong{MySQL} -@code{LIKE} is a case-insensitive or case-sensitive operator, depending on -the columns involved. If possible, @strong{MySQL} uses indexes if the -@code{LIKE} argument doesn't start with a wildcard character. -@item mSQL -Use @code{CLIKE}. -@end table - -@noindent -@strong{Handling of trailing spaces} - -@table @code -@item @strong{MySQL} -Strips all spaces at the end of @code{CHAR} and @code{VARCHAR} -columns. Use a @code{TEXT} column if this behavior is not desired. -@item mSQL -Retains trailing space. -@end table - -@noindent -@strong{@code{WHERE} clauses} - -@table @code -@item @strong{MySQL} -@strong{MySQL} correctly prioritizes everything (@code{AND} is evaluated -before @code{OR}). To get @code{mSQL} behavior in @strong{MySQL}, use -parentheses (as shown below). -@item mSQL -Evaluates everything from left to right. This means that some logical -calculations with more than three arguments cannot be expressed in any -way. It also means you must change some queries when you upgrade to -@strong{MySQL}. You do this easily by adding parentheses. Suppose you -have the following @code{mSQL} query: -@example -mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4; -@end example -To make @strong{MySQL} evaluate this the way that @code{mSQL} would, -you must add parentheses: -@example -mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4)))); -@end example -@end table - -@noindent -@strong{Access control} - -@table @code -@item @strong{MySQL} -Has tables to store grant (permission) options per user, host and -database. @xref{Privileges}. -@item mSQL -Has a file @file{mSQL.acl} in which you can grant read/write privileges for -users. -@item -@end table - -@node Compare PostgreSQL, , Compare mSQL, Comparisons -@section How @strong{MySQL} compares to PostgreSQL - -We would first like to note that @code{PostgreSQL} and @strong{MySQL} -are both widely used products but their design goals are completely -different. This means that for some applications @strong{MySQL} is more -suitable and for others @code{PostgreSQL} is more suitable. When -choosing which database to use you should first check if the databases -feature set is good enough to satisfy your application. If you need -speed then @strong{MySQL} is probably your best choice, if you need some -of the extra features that @code{PostgreSQL} can offer you should use -@code{PostgreSQL}. - -@code{PostgreSQL} Ϥ˿ʤǽ򤤤ĤäƤޤ桼ȥ -롼롢ȥ󥶥Τ褦ʡ -(currently it's -has about same symantic as @code{MySQL}'s transactions in that the -transaction is not 100 % atomic) - ANSI SQL ODBC ɸ෿ -ǽ¿礱Ƥޤݡ/̤ݡȤη/ؿδʰ -@uref{http://www.mysql.com/crash-me-choose.htmy, @code{crash-me} web page} 򸫤Ƥ - -̾@code{PostgreSQL} @strong{MySQL} ȤƤ٤Ǥ -@xref{Benchmarks}. This is due largely to they have only -transaction safe tables and that their transactions system is not as -sophisticated as Berkeley DB's. In @strong{MySQL} you can decide per -table if you want the table to be fast or take the speed penalty of -making it transaction safe. - -The most important things that @code{PostgreSQL} supports that @strong{MySQL} -don't yet support: - -@table @code -@item Sub select -@item Foregin keys -@item Stored procedures -@item An extendable type system. -@item A way to extend the SQL to handle new key types (like R-trees) -@end table - -@strong{MySQL} on the other hand supports a many ANSI SQL constructs -that @code{PostgreSQL} doesn't support; Most of these can be found at the -@uref{http://www.mysql.com/crash-me-choose.htmy, @code{crash-me} web page}. - -If you really need the rich type system @code{PostgreSQL} offers and you -can afford the speed penalty of having to do everything transaction -safe, you should take a look at @code{PostgreSQL}. -@node MySQL internals, Environment variables, Comparisons, Top -@chapter MySQL internals - -This chapter describes a lot of things that you need to know when -working on the @strong{MySQL} code. - -@menu -* MySQL threads:: -@end menu - -@node MySQL threads, , MySQL internals, MySQL internals -@section MySQL threads - -@strong{MySQL} СϰʲΥåɤޤ - -@itemize @bullet -@item -TCP/IP ³ϥɥϡƤ³׵򰷤ˡ -ǧڤԤΥåSQL륹åɤޤ -@item -NTǤϡ͡ɡѥסϥɥ顼åɤޤ -ϥ͡ɡѥפ³׵ФTCP/IP³åɤƱͤưޤ -@item -ʥ륹åɤϡƤΥʥ򰷤ޤ -This thread also normally handles -alarms and calls @code{process_alarm()} to force timeouts on connections -that have been idle too long. -@item -If compiled with @code{-DUSE_ALARM_THREAD}, a dedicated thread that -handles alarms is created. This is only used on some systems where -there are some problems with @code{sigwait()} or if one wants to use the -@code{thr_alarm()} code in ones application without a dedicated signal -handling thread. -@item -⤷ @code{--flush-time} ץѤʤ顢 -ƤΥơ֥֤ǥեå夹뤿Υåɤޤ -@item -Every connection has its own thread. -@item -Every different table on which one uses @code{INSERT DELAYED} gets its -own thread. -@item -If you use @code{--master-host} , slave replication thread will be started to read and apply -updates from the master. -@end itemize - -@code{mysqladmin processlist} only shows the connection and @code{INSERT -DELAYED} threads. - - -@page -@node Environment variables, Users, MySQL internals, Top -@appendix Environment variables - -Here follows a list of all environment variables that are used directly or -indirectly by @strong{MySQL}. Most of these can also be found at other -places in this manual. - -Note that any options on the command line will take precedence over -values specified in configuration files and environment variables, and -values in configuration files take precedence over values in environment -variables. - -In many cases its preferable to use a configure file instead of environment -variables to modify the behaviour of @strong{MySQL}. @xref{Option files}. - -@tindex CCX environment variable -@tindex Environment variable, CCX -@tindex CC environment variable -@tindex Environment variable, CC -@tindex CFLAGS environment variable -@tindex Environment variable, CFLAGS -@tindex CXXFLAGS environment variable -@tindex Environment variable, CXXFLAGS -@tindex DBI_USER environment variable -@tindex Environment variable, DBI_USER -@tindex DBI_TRACE environment variable -@tindex Environment variable, DBI_TRACE -@tindex HOME environment variable -@tindex Environment variable, HOME -@tindex LD_RUN_PATH environment variable -@tindex Environment variable, LD_RUN_PATH -@tindex MYSQL_DEBUG environment variable -@tindex Environment variable, MYSQL_DEBUG -@tindex MYSQL_HISTFILE environment variable -@tindex Environment variable, MYSQL_HISTFILE -@tindex MYSQL_HOST environment variable -@tindex Environment variable, MYSQL_HOST -@tindex MYSQL_PWD environment variable -@tindex Environment variable, MYSQL_PWD -@tindex MYSQL_TCP_PORT environment variable -@tindex Environment variable, MYSQL_TCP_PORT -@tindex MYSQL_UNIX_PORT environment variable -@tindex Environment variable, MYSQL_UNIX_PORT -@tindex PATH environment variable -@tindex Environment variable, PATH -@tindex TMPDIR environment variable -@tindex Environment variable, TMPDIR -@tindex TZ environment variable -@tindex Environment variable, TZ -@tindex UMASK_DIR environment variable -@tindex Environment variable, UMASK_DIR -@tindex UMASK environment variable -@tindex Environment variable, UMASK -@tindex USER environment variable -@tindex Environment variable, USER - -@multitable @columnfractions .2 .8 -@item @code{CCX} @tab Set this to your C++ compiler when running configure. -@item @code{CC} @tab Set this to your C compiler when running configure. -@item @code{CFLAGS} @tab Flags for your C compiler when running configure. -@item @code{CXXFLAGS} @tab Flags for your C++ compiler when running configure. -@item @code{DBI_USER} @tab The default user name for Perl DBI. -@item @code{DBI_TRACE} @tab Used when tracing Perl DBI. -@item @code{HOME} @tab The default path for the @code{mysql} history file is @file{$HOME/.mysql_history}. -@item @code{LD_RUN_PATH} @tab Used to specify where your @code{libmysqlclient.so} is. -@item @code{MYSQL_DEBUG} @tab Debug-trace options when debugging -@item @code{MYSQL_HISTFILE} @tab The path to the @code{mysql} history file. -@item @code{MYSQL_HOST} @tab Default host name used by the @code{mysql} command line prompt. -@item @code{MYSQL_PWD} @tab The default password when connecting to mysqld. Note that use of this is insecure! -@item @code{MYSQL_TCP_PORT} @tab The default TCP/IP port. -@item @code{MYSQL_UNIX_PORT} @tab The default socket; used for connections to @code{localhost}. -@item @code{PATH} @tab Used by the shell to finds the @strong{MySQL} programs. -@item @code{TMPDIR} @tab The directory where temporary tables/files are created. -@item @code{TZ} @tab This should be set to your local timezone. @xref{Timezone problems}. -@item @code{UMASK_DIR} @tab The user-directory creation mask when creating directories. Note that this is anded with @code{UMSK} ! -@item @code{UMASK} @tab The user-file creation mask when creating files. -@item @code{USER} @tab The default user on Windows to use when connection to @code{mysqld}. -@end multitable - -@page -@node Users, Contrib, Environment variables, Top -@appendix Some MySQL users - -@appendixsec General news sites - -@itemize @bullet - -@item @uref{http://www.yahoo.com/, Yahoo!} - -@item @uref{http://slashdot.org/, Slashdot: A pro-Linux/tech news and comment/discussion site} - -@item @uref{http://www.linux.com/, All about Linux} - -@item @uref{http://www.linuxtoday.com/, Linuxtoday} - -@item @uref{http://www.32bitsonline.com/, 32Bits Online: because there's -more than one way to compute} - -@item @uref{http://www.freshmeat.net/, Freshmeat: News about new versions of computer related stuff} - -@end itemize - -@appendixsec Some Web search engines - -@itemize @bullet - -@item @uref{http://www.aaa.com.au, AAA Matilda Web Search} - -@item @uref{http://www.whatsnu.com/, What's New} - -@item @uref{http://www.aladin.de/, Aladin} - -@item @uref{http://www.columbus-finder.de/, Columbus Finder} - -@item @uref{http://www.spider.de/, Spider} - -@item @uref{http://www.blitzsuche.de/, Blitzsuche} - -@item @uref{http://www.indoseek.co.id, Indoseek Indonesia} - -@item @uref{http://www.yaboo.dk/, Yaboo - Yet Another BOOkmarker} - -@item @uref{http://www.yahoosuck.com, Yahoosuck} - -@item @uref{http://www.ozsearch.com.au, OzSearch Internet Guide} - -@item @uref{http://www.splatsearch.com/, Splat! Search} - -@end itemize - -@appendixsec Some Information search engines concentrated on some area - -@itemize @bullet - -@item @uref{http://www.tucows.com/, TuCows Network; Free Software archive} - -@item @uref{http://www.jobvertise.com,Jobvertise: Post and search for jobs} - -@item @uref{http://www.musicdatabase.com, The Music Database} - -@item @uref{http://www.soccersearch.com, Fotball (Soccer) search page} - -@item @uref{http://www.headrush.net/takedown, TAKEDOWN - wrestling} - -@item @uref{http://www.lyrics.net, The International Lyrics Network} - -@item @uref{http://TheMatrix.com/~matrix/band_search.phtml, Musicians looking for other musicians (Free Service)} - -@item @uref{http://www.addall.com/AddBooks/Stores.html,AddALL books searching and price comparison} - -@item @uref{http://www.herbaria.harvard.edu/Data/Gray/gray.html,Harvard's Gray Herbarium Index of Plant Names} - -@item @uref{http://www.game-developer.com/,The Game Development Search Engine} - -@item @uref{http://www.i-run.com/html/cookbook.html,My-Recipe.com; Cookbook at i-run.com} - -@item @uref{www.theinnkeeper.com, The Innkeeper Vacation Guides} - -@item @uref{http://www.macgamedatabase.com/, The Mac Game Database uses PHP and MySQL} -@c From: Marc Antony Vose - -@item @uref{http://www.csse.monash.edu.au/publications/, Research -Publications at Monash University in Australia} - -@item @uref{http://www.ipielle.emr.it/bts/index.html, -Occupational Health & Safety website databse (a project for the ECC)} -@c c.presutti@ipielle.emr.it - -@item @uref{http://data.mch.mcgill.ca/, Bioinformatics databases at the -Montreal Children's Hospital using MySQL} -@c saeed@www.debelle.mcgill.ca -@end itemize - -@appendixsec Online magazines - -@itemize @bullet -@item @uref{http://www.spoiler.com, Spoiler Webzine}. -An online magazine featuring music, literature, arts, and design content. -@item @uref{http://www.linux-magazin.de/newsflash/, Daily news about Linux in German language} -@item @uref{http://www.betazine.com,Betazine - The Ultimate Online Beta Tester's Magazine} -@item @uref{http://www.currents.net/ccinfo/aboutcc.html,Computer Currents Magazine} -@end itemize - -@appendixsec Web sites that use MySQL as a backed - -@itemize @bullet - -@item @uref{http://lindev.jmc.tju.edu/qwor, Qt Widget and Object Repository} - -@item @uref{http://www.samba-choro.com.br, Brazilian samba site (in Portuguese)} - -@item @uref{http://pgss.iss.uw.edu.pl/en_index.ISS, Polish General Social Survey} - -@item @uref{http://www.expo2000.com, Expo2000} World-wide distribution of -tickets for this event is implemented using @strong{MySQL} and tcl/tk. More than -5000 travel-agencies all over the world have access to it. - -@item @uref{http://www.freevote.com/, FreeVote.com is a free voting -service with millions of users.} - -@item @uref{http://f1.tauzero.se, Forza Motorsport} -@end itemize - -@appendixsec Some Domain/Internet/Web and related services - -@itemize @bullet - -@item @uref{http://www.wix.com/mysql-hosting, Registry of Web providers that -support @strong{MySQL}} - -@item @uref{http://www.yi.org/, Dynamic DNS Services} - -@item @uref{http://www.dynodns.net/, Dynamic domain name service} - -@item @uref{http://www.ods.org/, Open DNS Project; free dynamic DNS service} - -@c @item @uref{http://dynodns.net, Free dynamic DNS implementation} -@c EMAIL: A Moore - -@item @uref{http://www.fdns.net/, Free 3rd level domains} - -@item @uref{http://worldcommunity.com/, Online Database} - -@item @uref{http://www.bigbiz.com, BigBiz Internet Services} - -@item @uref{http://virt.circle.net, The Virt Gazette} - -@item @uref{http://www.california.com, Global InfoNet Inc} - -@item @uref{http://www.webhosters.com, WebHosters - A Guide to WWW Providers} - -@item @uref{http://online.dn.ru, Internet information server} - -@item @uref{http://www.stopbit.com, A technology news site} - -@item @uref{http://www.worldnetla.net, WorldNet Communications - An Internet Services Provider} - -@item @uref{http://www.netizen.com.au/, Netizen: Australian-based web consultancy} - -@item @uref{http://www.trainingpages.co.uk, Search site for training courses in the UK} - -@item @uref{http://chat.nitco.com, Gannon Chat (GPL). Written in Perl and Javascript} - -@item @uref{http://www.addurls.com/,A general links directory} - -@item @uref{http://www.bookmarktracker.com, A web-based bookmark management service} - -@item @uref{http://www.cdrom.com,Walnut Creek CDROM} - -@item @uref{http://www.wwwthreads.org/, WWWThreads; Interactive discussion Forums} - -@item @uref{http://pvmon.portici.enea.it/Meteo, In Italian; Storage data from meteo station} - -@item @uref{http://www.buysell.net/, Online "Person To Person" Auction} - -@item @uref{http://tips.pair.com,Tips on web development} - -@item @uref{http://www.mailfriends.com, Mailfriends.com is a FREE service for -everybody who wants to find friends over the internet.} - -@item @uref{http://www.uninova.com/cgi-bin/wctelnets?list, Web Page Telnet BBS List} - -@item @uref{http://www.uninova.com/cnc.html,UniNova Digital Postcards} - -@c @item @uref{http://cabinboy.powersurfr.com, An Internet RFC search engine} - -@item @uref{http://www.dslreports.com, DSL providers search with reviews} -Made with @strong{MySQL} and Modperl, all pages are generated dynamically out of -the @strong{MySQL} database -@end itemize - -@appendixsec Web sites that use @code{PHP} and MySQL - -@itemize @bullet -@c @item @uref{http://www.wh200th.com, White House 200th Anniversary site} - -@item @uref{http://war.jgaa.com:8080/support/index.php3, Jgaa's Internet - Official Support Site} - -@item @uref{http://io.incluso.com, Ionline - online publication:} @strong{MySQL}, -PHP, Java, Web programming, DB development - -@item @uref{http://www.baboo.com, BaBoo(Browse and bookmark). Free web-based bookmark manager and Calendar} - -@item @uref{http://www.courses.pjc.cc.fl.us/Schedule/index.php, Course -Schedule System at Pensacola Junior College} - -@item @uref{http://www.fccj.org, Florida Community College at Jacksonville} - -@item @uref{http://www.32bit.com/, 32bit.com; An extensive shareware / freeware archive} - -@item @uref{http://www.jokes2000.com/, Jokes 2000} -@c Added 990604; EMAIL: ah@dybdahl.dk - - -@item @uref{http://www.burken.nu/ , Burken.NU} Burken is a webhotel that -provides scripts, among other things, for remote users, like counters, -guestbooks etc. -@c Added 990608; EMAIL: spacedmp@SpaceDump.Burken.NU (Anders Olausson) - -@item @uref{http://tips.pair.com, tips.pair.com} Contains tips on html, -javascript, 2d/3d graphics and PHP3/MySQL. All pages are generated from -a database. -@c Added 990614; EMAIL: downey@image.dk (Rune Madsen) - -@end itemize - -@appendixsec Some MySQL consultants - -@itemize @bullet - -@item @uref{http://www.ayni.com, Ayni AG} - -@item @uref{http://worldcommunity.com/, Online Database} - -@item @uref{http://www2.dataguard.no/,DataGuard (Uses @strong{MySQL} and PHP)} - -@item @uref{http://wwits.net/programs/mysql.phtml, WWITS (Uses @strong{MySQL} and PHP)} - -@item @uref{http://www.worldcommunity.com/, WCN - The World Community Network} - -@item @uref{http://www.chipcastle.com, Chip Castle Dot Com Inc} -@c Added 990603 EMAIL: chip@chipcastle.com (Chip Castle) - - -@item @uref{http://www.cyber.com.au/, Cybersource Pty. Ltd} - -@item @uref{http://www.spring.de, Spring infotainment gmbh & co. kg} -@c added 990905 "Oliver Pischke" - -@item @uref{http://www.wamdesign.com/, Develops websites using MySQL} -@c Added 990905; max@wamdesign.com - -@item @uref{http://www.berkeleyconsultants.com, Berkeley Consultants Group} - -@end itemize - -@appendixsec Programming - -@itemize @bullet -@item @uref{http://www.perl.org/cpan-testers, The Perl CPAN Testers results page} -@end itemize - - -@appendixsec Uncategorized pages - -@itemize @bullet - -@item @uref{http://www.feature-showcase.com/htmls/demo_mysql.sql, -AZC.COM's Feature Showcase} - -@item @uref{http://www.teach.org.uk/subjects/trainingcourse/g.html, Course Search} - -@item @uref{http://www.northerbys.com, Northerbys Online Auctions} - -@item @uref{http://www.schiphol.nl/flights/home.htm, Amsterdam Airport Schiphol} - -@item @uref{http://TheMatrix.com/seventhsin/query.phtml, CD database} - -@item @uref{http://TheMatrix.com/~flmm/GEAR.html, Used Audio Gear Database} - -@item @uref{http://www.kiss.de/musik-mueller, Musical note-sheets} - -@item @uref{http://www.bagism.com, Bagism - A John Lennon fan page} - -@item @uref{http://www.selftaught.com/, US Folk art broker} - -@item @uref{http://organizer.net/, Mail reading on the web} - -@item @uref{http://www.mypage.org/, Free home pages on www.somecoolname.mypage.org} - -@item @uref{http://www.schulweb.de/, Der Server f@"ur Schulen im Web (In German)} - -@item @uref{http://www.ald.net/, Auldhaefen Online Services} - -@item @uref{http://www.cary.net/, CaryNET Information Center} - -@item @uref{http://www.dataden.com/, Dataden Computer Systems} - -@item @uref{http://andree.grm.se/, Andr@'emuseet (In Swedish)} - -@item @uref{http://www.him.net/, HOMESITE Internet Marketing} - -@item @uref{http://www.jade-v.com/techinfo.html, Jade-V Network Services } - -@item @uref{http://ww2010.atmos.uiuc.edu/(Gl)/abt/aknw/tech.rxml, -Weather World 2010 Technical Credits} @* - -@item @uref{http://gimp.foebud.org/registry/doc/, About The Gimp plugin registry} - -@item @uref{http://www.fast-inc.com/Products/Archiver/database.html, Java tool -Archiver technical detail (Slightly optimistic about @strong{MySQL} -ANSI-92 compliance)} - -@item @uref{http://www.gamesdomain.com/cheats/usrcheat.phtml, Games Domain Cheats Database} - -@item @uref{http://www.kcilink.com/poweredby/, The "Powered By" Page (Kcilink)} - -@item @uref{http://www.netcasting.net/index.whtml, Netcasting} - -@item @uref{http://homepages.tig.com.au/~mjj/nbltips, NBL (Australian National Basketball League) tipping} - -@item @uref{http://www.cgishop.com/, CGI shop} - -@item @uref{http://www.whirlycott.com/, Whirlycott: Website Design} - -@item @uref{http://www.mtp.dk, Museum Tusculanum Press} - -@item @uref{http://csdgi.historie.ku.dk/biblio, Centro Siciliano di Documentazione} - -@item @uref{http://caribou.dyn.ml.org:8000, Quake statistics database} - -@item @uref{http://www.astroforum.ch, Astroforum: Astrologie and related things (in German)} - -@item @uref{http://www.opendebate.com, OpenDebate - Interactive Polls & Open Discussion} - -@item @uref{http://vermeer.organik.uni-erlangen.de/dissertationen/, Online chemical dissertation server} - -@item @uref{http://www.freschinfo.com, FreSch! The Free Scholarship Search Service} - -@item @uref{http://www.nada.kth.se/~staffanu/pinball, Stockholm Pinball Locator} - -@item @uref{http://www.hek.com, HEK A construction company} - -@item @uref{http://www.nbi.nl, Elsevier Bussines Information} - -@item @uref{http://vaccination.medicallink.se/, Medical Links (Using ColdFusion and @strong{MySQL})} - -@item @uref{http://www.joblink-usa.com, Search for jobs & people at JobLink-USA} - -@item @uref{http://www.skydive.net/competfs, Competition Formation Skydiving} - -@item @uref{http://www.galaxy-net.net/Galaxy-NET Telecommunications, E-commerce and internal accounting} - -@item @uref{http://www.borsen.dk/, Denmark's leading business daily newspaper Borsen} - -@item @uref{http://tmmm.simplenet.com/indb/, The Internet NES Database} - -@item @uref{http://www.russia.cz, Travel agency in Prague in 3 languages} - -@item @uref{http://www.linkstation.de, Linkstation} - -@item @uref{http://www.peoplestaff.com, Searchable online database at Peoplestaff} - -@item @uref{http://www.dreamhorse.com, A searchable database system for horse classified ads} - -@item @uref{http://pootpoot.com/,The Poot site} - -@item @uref{http://grateful.net/hw_html/,"Playin' in the LAN"; a network monitoring suite} - -@c Update from Christopher Milton 1999-12-21 -@item @uref{http://www.usapa.army.mil,U.S. Army Publishing Agency} - -@item @uref{http://www.nekretnine.co.yu/,Realestate handling in Yugoslavia} - -@item @uref{http://demo.cpsoft.com/pims/devFAQ.html, PIMS; a Patient Information Management System} - -@item @uref{http://cpsoft.com,Pilkington Software Inc} - -@item @uref{http://www.no-quarter.org/,A Vietnam Veteran's Memorial (The Wall) database.} - -@item @uref{http://www.gamers-union.com/,Gamer's Union specializes inauctions of used & out of print gaming material} - -@item @uref{http://www.montereyhigh.com/office/dbul.php3, A daily bulletin at Monterey High school} - -@item @uref{http://www.myEastside.com,Community-owned site serving Lake -Washington's Eastside residents and businesses} - -@item @uref{http://bowling-france.net/,French bowling site}. -@end itemize - -Send any additions to this list to @email{webmaster@@mysql.com}. - -@page -@node Contrib, Credits, Users, Top -@appendix Contributed programs - -Many users of @strong{MySQL} have contributed @emph{very} useful support -tools and addons. - -@ifclear web -A list of what is available at @uref{http://www.mysql.com/Contrib} -(or any mirror) is shown below. -If you want to build @strong{MySQL} support for the Perl @code{DBI}/@code{DBD} -interface, you should fetch the @code{Data-Dumper}, @code{DBI}, and -@code{Msql-Mysql-modules} files and install them. -@xref{Perl support}. -@end ifclear - - -@uref{http://www.mysql.com/Contrib/00-README, 00-README} -This listing. - -@appendixsec API's - -@itemize @bullet -@item Perl modules -@itemize @bullet -@item @uref{http://www.mysql.com/Contrib/Data-Dumper-2.101.tar.gz, Data-Dumper-2.101.tar.gz} -Perl @code{Data-Dumper} module. Useful with @code{DBI}/@code{DBD} support for -older perl installations. - -@item @uref{http://www.mysql.com/Contrib/DBI-1.13.tar.gz, DBI-1.13.tar.gz} -Perl @code{DBI} module. - -@item @uref{http://www.mysql.com/Contrib/KAMXbase1.0.tar.gz,KAMXbase1.0.tar.gz} -Convert between @file{.dbf} files and @strong{MySQL} tables. Perl -module written by Pratap Pereira @email{pereira@@ee.eng.ohio-state.edu}, -extened by Kevin A. McGrail @email{kmcgrail@@digital1.peregrinehw.com}. -This converter can handle MEMO fields. - -@item @uref{http://www.mysql.com/Contrib/Msql-Mysql-modules-1.2209.tar.gz, Msql-Mysql-modules-1.2209.tar.gz} -Perl @code{DBD} module to access mSQL and @strong{MySQL} databases.. - -@item @uref{http://www.mysql.com/Contrib/Data-ShowTable-3.3.tar.gz, Data-ShowTable-3.3.tar.gz} -Perl @code{Data-ShowTable} module. Useful with @code{DBI}/@code{DBD} support. -@end itemize - -@item JDBC -@itemize @bullet -@item @uref{http://www.mysql.com/Contrib/mm.mysql.jdbc-1.2c.tar.gz, mm.mysql.jdbc-1.2c.tar.gz} -The mm JDBC driver for @strong{MySQL}. This is a production release -and is actively developed. By Mark Matthews -(@email{mmatthew@@ecn.purdue.edu}). - -@item @uref{http://www.mysql.com/Contrib/mm.mysql.jdbc-2.0pre5.tar.gz, mm.mysql.jdbc-2.0pre5.tar.gz} -The mm JDBC driver for @strong{MySQL}. This is a pre-release beta version -and is actively developed. By Mark Matthews -(@email{mmatthew@@ecn.purdue.edu}). -The two drivers above have an LGPL -license. Please check @uref{http://www.worldserver.com/mm.mysql/} for -the latest drivers (and other JDBC information) because these drivers may be ou -updated as frequently. - -@item @uref{http://www.mysql.com/Contrib/twz1jdbcForMysql-1.0.4-GA.tar.gz, twz1jdbcForMysql-1.0.4-GA.tar.gz} -The twz driver: A type 4 JDBC driver by Terrence W. Zellers -@email{zellert@@voicenet.com}. This is commercial but is free for -private and educational use. -@c no answer from server 990830 -@c You can always find the latest driver at @uref{http://www.voicenet.com/~zellert/tjFM/}. -@item -@item @uref{http://www.mysql.com/Contrib/pmdamysql.tgz,pmdamysql.tgz} -A @strong{MySQL} PMDA. Provides @strong{MySQL} server status and configuration -variables. -@end itemize - -@item C++ -@itemize @bullet - -@item @uref{http://www.mysql.com/Contrib/mysql-c++-0.02.tar.gz, mysql-c++-0.02.tar.gz} -@strong{MySQL} C++ wrapper library. By Roland Haenel, -@email{rh@@ginster.net}. - -@item @uref{http://www.mysql.com/Contrib/MyDAO.tar.gz, MyDAO} -@strong{MySQL} C++ API. By Satish @email{spitfire@@pn3.vsnl.net.in}. Inspired -by Roland Haenel's C++ API and Ed Carp's MyC library. - -@item @uref{http://www.mysql.com/download_mysql++.html, mysql++} -@strong{MySQL} C++ API (More than just a wrapper library). Originally by -@email{kevina@@clark.net}. Nowadays maintained by Sinisa at TCX. - -@item @uref{http://nelsonjr.homepage.com/NJrAPI,NJrAPI} -A C++ database independent library that supports @strong{MySQL}. -@end itemize - -@item Delphi -@itemize @bullet -@item @uref{http://www.mysql.com/Contrib/delphi-interface.gz, delphi-interface.gz} -Delphi interface to @code{libmysql.dll}, by Blestan Tabakov, -@email{root@@tdg.bis.bg}. - -@item @uref{http://www.mysql.com/Contrib/DelphiMySQL2.zip, DelphiMySQL2.zip} -Delphi interface to @code{libmysql.dll}, by @email{bsilva@@umesd.k12.or.us} - -@item @uref{http://www.mysql.com/Contrib/Udmysel.pas, Udmysql.pas} -A wrapper for libmysql.dll for usage in Delphi. By Reiner Sombrowsky. - -@item @uref{http://www.fichtner.net/delphi/mysql.delphi.phtml, A Delphi interface to @strong{MySQL}.} -With source code. By Matthias Fichtner. - -@item @uref{http://www.productivity.org/projects/mysql/, @strong{TmySQL} -A library to use @strong{MySQL} with Delphi} - -@item @uref{http://www.geocities.com/CapeCanaveral/2064/mysql.html, Delphi TDataset-component} -@end itemize - -@item @uref{http://www.mysql.com/Contrib/mysql-ruby-2.2.0.tar.gz, mysql-ruby-2.2.0.tar.gz} -@strong{MySQL} Ruby module. By TOMITA Masahiro @email{tommy@@tmtm.org} -@uref{http://www.netlab.co.jp/ruby/,Ruby} is an Object-Oriented Interpreter Language. - -@item @uref{http://www.mysql.com/Contrib/JdmMysqlDriver-0.1.0.tar.gz,JdmMysqlDriver-0.1.0.tar.gz} -A VisualWorks 3.0 Smalltalk driver for @strong{MySQL}. By -@email{joshmiller@@earthlink.net} - -@item @uref{http://www.mysql.com/Contrib/Db.py, Db.py} -Python module with caching. By @email{gandalf@@rosmail.com}. - -@item @uref{http://www.mysql.com/Contrib/MySQLmodule-1.4.tar.gz, MySQLmodule-1.4.tar.gz} -Python interface for @strong{MySQL}. By Joseph Skinner @email{joe@@earthlight.co.nz}; Modified by Joerg Senekowitsch @email{senekow@@ibm.net} - -@item @uref{http://www.mysql.com/Contrib/mysql_mex_1_1.tar.gz, mysql_mex_1_1.tar.gz} -An interface program for the Matlab program by MathWorks. The interface -is done by Kimmo Uutela and John Fisher (not by Mathworks). -Check @uref{http://boojum.hut.fi/~kuutela/mysqlmex.html,mysqlmex.html} -for more information. - -@item @uref{http://www.mysql.com/Contrib/mysqltcl-1.53.tar.gz, mysqltcl-1.53.tar.gz} -Tcl interface for @strong{MySQL}. Based on @file{msqltcl-1.50.tar.gz}. -Updated by Tobias Ritzau, @email{tobri@@ida.liu.se}. - -@item @uref{http://www.mysql.com/Contrib/MyC-0.1.tar.gz, MyC-0.1.tar.gz} -A Visual Basic-like API, by Ed Carp. - -@item @uref{http://www.mysql.com/Contrib/sqlscreens-1.0.1.tar.gz, sqlscreens-1.0.1.tar.gz} -Tcl/TK code to generate database screens. By Jean-Francois Dockes. - -@item @uref{http://www.mysql.com/Contrib/Vdb-dflts-2.1.tar.gz, Vdb-dflts-2.1.tar.gz} -This is a new version of a set of library utilities intended -to provide a generic interface to SQL database engines such that your -application becomes a 3-tiered application. The advantage is that you -can easily switch between and move to other database engines by -implementing one file for the new backend without needing to make any -changes to your applications. By @email{damian@@cablenet.net}. - -@item @uref{http://www.mysql.com/Contrib/DbFramework-1.10.tar.gz, DbFramework-1.10.tar.gz} -DbFramework is a collection of classes for manipulating @strong{MySQL} -databases. The classes are loosely based on the CDIF Data Model -Subject Area. By Paul Sharpe @email{paul@@miraclefish.com}. - -@item @uref{http://www.mysql.com/Contrib/pike-mysql-1.4.tar.gz, pike-mysql-1.4.tar.gz} -@strong{MySQL} module for pike. For use with the Roxen web server. - -@item @uref{http://www.mysql.com/Contrib/squile.tar.gz, squile.tar.gz} -Module for @code{guile} that allows @code{guile} to interact with SQL -databases. By Hal Roberts. - -@item @uref{http://www.mysql.com/Contrib/stk-mysql.tar.gz, stk-mysql.tar.gz} -Interface for Stk. Stk is the Tk widgets with Scheme underneath instead of Tcl. -By Terry Jones - -@item @uref{http://www.mysql.com/Contrib/eiffel-wrapper-1.0.tar.gz,eiffel-wrapper-1.0.tar.gz}. -Eiffel wrapper by Michael Ravits. -@end itemize - -@appendixsec Clients - -@itemize @bullet -@item Graphical clients -@itemize @bullet -@item @uref{http://www.mysql.com/download_clients.html, mysqlgui homepage} -The @strong{MySQL} GUI client homepage. By Sinisa at TCX. -@item @uref{http://www.mysql.com/Contrib/kmysqladmin-0.4.1.tar.gz, kmysqladmin-0.4.1.tar.gz} -@item @uref{http://www.mysql.com/Contrib/kmysqladmin-0.4.1-1.src.rpm, kmysqladmin-0.4.1-1.src.rpm} -@item @uref{http://www.mysql.com/Contrib/kmysqladmin-0.4.1-1.i386.rpm, kmysqladmin-0.4.1-1.i386.rpm} -An administration tool for the @strong{MySQL} server using QT / KDE. Tested -only on Linux. - -@item @uref{http://www.mysql.com/Contrib/mysql-admin-using-java+swing.tar.gz, Java client -using Swing} By Fredy Fischer, @email{se-afs@@dial.eunet.ch}. Ypu can -always find the latest version -@uref{http://www.trash.net/~ffischer/admin/index.html, here}. - -@item @uref{http://www.mysql.com/Contrib/mysqlwinadmn.zip, mysqlwinadmn.zip} -Win32 GUI (binary only) to administrate a database, by David B. Mansel, -@email{david@@zhadum.org}. - -@item @uref{http://www.mysql.com/Contrib/netadmin.zip, netadmin.zip} A -administrator tool for @strong{MySQL} on Windows 95/98 and Windows NT -4.0. Only tested with @strong{MySQL} 3.23.5 - 3.23.7. Written using the -Tmysql components. - -You can write queries and show tables, indexes, table syntax and -administrate user,host and database and so on. The is still beta and -have still some bugs. you can test the program with all features. Please -send bugs and hints to Marco Suess @email{ms@@it-netservice.de}. Original -URL @url{http://www.it-netservice.de/pages/software/index.html}. - -@item @uref{http://www.mysql.com/Contrib/xmysqladmin-1.0.tar.gz, xmysqladmin-1.0.tar.gz} -A front end to the @strong{MySQL} database engine. It allows reloads, -status check, process control, myisamchk, grant/revoke privileges, -creating databases, dropping databases, create, alter, browse and drop -tables. Originally by Gilbert Therrien, @email{gilbert@@ican.net} but -now in public domain and supported by TcX. - -@item @uref{http://www.mysql.com/Contrib/xmysql-1.9.tar.gz, xmysql-1.9.tar.gz} -@item @uref{http://web.wt.net/~dblhack, xmysql home page} -A front end to the @strong{MySQL} database engine. It allows for simple -queries and table maintenance, as well as batch queries. By Rick -Mehalick, @email{dblhack@@wt.net}. -Requires @uref{http://bragg.phys.uwm.edu/xforms,xforms 0.88} to work. -@item @uref{http://www.tamos.net/sw/dbMetrix,dbMetrix} -An open source client for exploring databases and executing SQL. Supports -@strong{MySQL}, Oracle, PostgreSQL and mSQL. -@item @uref{http://www.multimania.com/bbrox/GtkSQL,GtkSQL} -A query tool for @strong{MySQL} and PostgreSQL. -@item @uref{http://dbman.linux.cz/,dbMan} -A query tool written in Perl. Uses DBI and Tk. -@item @uref{http://www.mysql.com/Downloads/Win32/ArtronicWINAdmin.exe,Atronic's -@strong{MySQL} client for Win32} -@item @uref{http://www.mysql.com/Contrib/mascon1.exe, mascon1.exe} -You can get the newest one from -@uref{http://www.SciBit.com,http://www.SciBit.com}. -@item @uref{http://www.virtualbeer.net/dbui/,DBUI} -DBUI is a Gtk graphical database editor. -@end itemize - -@item Web clients -@itemize @bullet -@item @uref{http://www.mysql.com/Contrib/mysqladmin-atif-1.0.tar.gz, mysqladmin-atif-1.0.tar.gz} -WWW @strong{MySQL} administrator for the @code{user,} @code{db} and -@code{host} tables. By Tim Sailer, modified by Atif Ghaffar -@email{aghaffar@@artemedia.ch}. - -@item @uref{http://www.mysql.com/Contrib/mysql-webadmin-1.0a8-rz.tar.gz, mysql-webadmin-1.0a8-rz.tar.gz} -A tool written in PHP-FI to administrate @strong{MySQL} databases -remotely over the web within a Web-Browser. By Peter Kuppelwieser, -@email{peter.kuppelwieser@@kantea.it}. Updated by Wim Bonis, bonis@@kiss.de. -Not maintained anymore! - -@item @uref{http://www.mysql.com/Contrib/mysqladm.tar.gz, mysqladm.tar.gz} -@strong{MySQL} Web Database Administration written in Perl. By Tim -Sailer. - -@item @uref{http://www.mysql.com/Contrib/mysqladm-2.tar.gz, mysqladm-2.tar.gz} -Updated version of @file{mysqladm.tar.gz}, by High Tide. - -@item @uref{http://www.mysql.com/Contrib/billowmysql.zip, billowmysql.zip} -Updated version of @file{mysqladm.tar.gz}, by Ying Gao. - -@item @uref{http://www.mysql.com/Contrib/myadmin-0.4.tar.gz, myadmin-0.4.tar.gz} -@item @uref{http://myadmin.cheapnet.net/, MyAdmin home page} -A web based mysql administrator by Mike Machado. - -@item @uref{http://www.mysql.com/Contrib/phpMyAdmin_2.0.1.tar.gz,phpMyAdmin_2.0.1.tar.gz} -A set of PHP3-scripts to adminstrate @strong{MySQL} over the WWW. - -@item @uref{http://www.htmlwizard.net/phpMyAdmin/, phpMyAdmin home page} -A PHP3 tool in the spirit of mysql-webadmin, by Tobias Ratschiller, tobias@@dnet.it - -@item @uref{http://www.mysql.com/Contrib/useradm.tar.gz, useradm.tar.gz} -@strong{MySQL} administrator in PHP. By Ofni Thomas -@email{othomas@@vaidsystems.com}. -@end itemize -@item @uref{http://www.mysql.com/Contrib/mysql-editor.tar.gz,mysql-editor.tar.gz} -This cgi scripts in Perl enables you to edit content of Mysql -database. By Tomas Zeman. -@end itemize - - -@appendixsec Web tools - -@itemize @bullet - -@item @uref{http://www.mysql.com/Contrib/mod_mysql_include_1.0.tar.gz, mod_mysql_include_1.0.tar.gz} -Apache module to include HTML from MySQL queries into your pages, and run update queries. -Originally written to implement a simple fast low-overhead banner-rotation system. -By Sasha Pachev. - -@item @uref{http://www.odbsoft.com/cook/sources.htm} -This package has various functions for generating html code from a SQL -table structure and for generating SQL statements (Select, Insert, -Update, Delete) from an html form. You can build a complete forms -interface to a SQL database (query, add, update, delete) without any -programming! By Marc Beneteau, @email{marc@@odbsoft.com}. - -@item @uref{http://www.mysql.com/Contrib/sqlhtml.tar.gz, sqlhtml.tar.gz} -SQL/HTML is an HTML database manager for @strong{MySQL} using @code{DBI} 1.06. - -@item @uref{http://www.mysql.com/Contrib/udmsearch-2.2.1b.tar.gz, UdmSearch 2.2.1b (stable version)} -@item @uref{http://www.mysql.com/Contrib/udmsearch-3.0.5.tar.gz, UdmSearch 3.0.5 (development version)} -@item @uref{http://mysearch.udm.net, UdmSearch home page} -A @strong{MySQL}- and PHP- based search engine over HTTP. By -Alexander I. Barkov @email{bar@@izhcom.ru}. - -@item @uref{http://www.mysql.com/Contrib/wmtcl.doc, wmtcl.doc} -@item @uref{http://www.mysql.com/Contrib/wmtcl.lex, wmtcl.lex} -With this you can write HTML files with inclusions of TCL code. By -@email{vvs@@scil.npi.msu.su}. - -@item @uref{http://www.mysql.com/Contrib/www-sql-0.5.7.lsm, www-sql-0.5.7.lsm} -@item @uref{http://www.mysql.com/Contrib/www-sql-0.5.7.tar.gz, www-sql-0.5.7.tar.gz} -A CGI program that parses an HTML file containing special tags, parses -them and inserts data from a @strong{MySQL} database. - -@item @uref{http://www.mysql.com/Contrib/genquery.zip, genquery.zip} -Perl SQL database interface package for html. - -@item @uref{http://www.mysql.com/Contrib/cgi++-0.8.tar.gz, cgi++-0.8.tar.gz} -A macro-processor to simply writing CGI/Database programs in C++ by Sasha Pachev. - -@item @uref{http://www.mysql.com/Contrib/webboard-1.0.zip, WebBoard 1.0} -EU-Industries Internet-Message-Board. - -@item @uref{http://www.mysql.com/Contrib/DBIx-TextIndex-0.02.tar.gz, DBIx-TextIndex-0.02.tar.gz} -Full-text searching with Perl on @code{BLOB}/@code{TEXT} columns by Daniel Koch. -@end itemize - -@appendixsec Performance Benchmarking tools - -@itemize @bullet -@item @uref{http://www.mysql.com/Contrib/mysql-bench-0.6.tar.gz, mysql-super-smack and friends} -User-customizable multi-threaded tool set to benchmark @strong{MySQL}. By Sasha Pachev. -@end itemize - -@appendixsec Authentication tools - -@itemize @bullet -@item @uref{http://www.mysql.com/Contrib/ascend-radius-mysql-0.7.1.patch.gz, -ascend-radius-mysql-0.7.1.patch.gz} -This is authentication and logging patch using @strong{MySQL} for -Ascend-Radius. By @email{takeshi@@SoftAgency.co.jp}. - -@item @uref{http://www.mysql.com/Contrib/icradius-0.10.tar.gz, icradius 0.10} -@uref{http://www.mysql.com/Contrib/icradius.README, icradius readme file} - -@item @uref{http://www.mysql.com/Contrib/checkpassword-0.81-mysql-0.6.5.patch.gz, -checkpassword-0.81-mysql-0.6.5.patch.gz} -@strong{MySQL} authentication patch for QMAIL and checkpassword. These are -useful for management user(mail,pop account) by @strong{MySQL}. -By @email{takeshi@@SoftAgency.co.jp} - -@item @uref{http://www.mysql.com/Contrib/jradius-diff.gz, jradius-diff.gz} -@strong{MySQL} support for Livingston's Radius 2.01. Authentication and -Accounting. By Jose de Leon, @email{jdl@@thevision.net} - -@item @uref{http://www.mysql.com/Contrib/mod_auth_mysql-2.20.tar.gz, mod_auth_mysql-2.20.tar.gz} -Apache authentication module for @strong{MySQL}. By Zeev Suraski, -@email{bourbon@@netvision.net.il}. - -@strong{Please} register this module at: -@url{http://bourbon.netvision.net.il/mysql/mod_auth_mysql/register.html}. The -registering information is only used for statistical purposes and will -encourage further development of this module! - -@item @uref{http://www.mysql.com/Contrib/mod_log_mysql-1.05.tar.gz, mod_log_mysql-1.05.tar.gz} -@strong{MySQL} logging module for Apache. By Zeev Suraski, -@email{bourbon@@netvision.net.il}. - -@item @uref{http://www.mysql.com/Contrib/mypasswd-2.0.tar.gz, mypasswd-2.0.tar.gz} -Extra for @code{mod_auth_mysql}. This is a little tool that allows you -to add/change user records storing group and/or password entries in -@strong{MySQL} tables. By Harry Brueckner, @email{brueckner@@respublica.de}. - -@item @uref{http://www.mysql.com/Contrib/mysql-passwd.README, mysql-passwd.README} -@item @uref{http://www.mysql.com/Contrib/mysql-passwd-1.2.tar.gz, mysql-passwd-1.2.tar.gz} -Extra for @code{mod_auth_mysql}. This is a two-part system for use with -@code{mod_auth_mysql}. - -@item @uref{http://www.mysql.com/Contrib/pam_mysql.tar.gz, pam_mysql.tar.gz} -This module authenticates users via @code{pam}, using @strong{MySQL}. - -@item @uref{http://www.mysql.com/Contrib/nsapi_auth_mysql.tar, nsapi_auth_mysql.tar} -Netscape Web Server API (NSAPI) functions to authenticate (BASIC) users -against @strong{MySQL} tables. By Yuan John Jiang. - -@item @uref{http://www.mysql.com/Contrib/qmail-1.03-mysql-0.6.5.patch.gz, -qmail-1.03-mysql-0.6.5.patch.gz} -Patch for qmail to authenticate users from a @strong{MySQL} table. - -@item @uref{http://www.mysql.com/Contrib/pwcheck_mysql-0.1.tar.gz,pwcheck_mysql-0.1.tar.gz} -An authentication module for the Cyrus IMAP server. By Aaron Newsome. -@end itemize - -@appendixsec Converters - -@itemize @bullet -@item @uref{http://www.mysql.com/Contrib/dbf2mysql-1.13.tgz, dbf2mysql-1.13.tgz} -Convert between @file{.dbf} files and @strong{MySQL} tables. By Maarten -Boekhold, @email{boekhold@@cindy.et.tudelft.nl}, and Michael Widenius. -This converter can't handle MEMO fields. - -@item @uref{http://www.mysql.com/Contrib/dbf2mysql.zip, dbf2mysql.zip} -Convert between FoxPro @file{.dbf} files and @strong{MySQL} tables on Win32. -By Alexander Eltsyn, @email{ae@@nica.ru} or @email{ae@@usa.net}. - -@item @uref{http://www.mysql.com/Contrib/dump2h-1.20.gz, dump2h-1.20.gz} -Convert from @code{mysqldump} output to a C header file. By Harry Brueckner, -@email{brueckner@@mail.respublica.de}. - -@item @uref{http://www.mysql.com/Contrib/exportsql.txt, exportsql.txt} -A script that is similar to @code{access_to_mysql.txt}, except that this -one is fully configurable, has better type conversion (including -detection of @code{TIMESTAMP} fields), provides warnings and suggestions -while converting, quotes @strong{all} special characters in text and -binary data, and so on. It will also convert to @code{mSQL} v1 and v2, -and is free of charge for anyone. See -@uref{http://www.cynergi.net/prod/exportsql/} for latest version. By -Pedro Freire, @email{support@@cynergi.net}. Note: Doesn't work with -Access2! -@item @uref{http://www.mysql.com/Contrib/access_to_mysql.txt, access_to_mysql.txt} -Paste this function into an Access module of a database which has the -tables you want to export. See also @code{exportsql}. By Brian Andrews. -Note: Doesn't work with Access2! - -@item @uref{http://www.mysql.com/Contrib/importsql.txt, importsql.txt} -A script that does the exact reverse of @code{exportsql.txt}. That is, -it imports data from @strong{MySQL} into an Access database via -ODBC. This is very handy when combined with exportsql, because it lets you -use Access for all DB design and administration, and synchronize with -your actual @strong{MySQL} server either way. Free of charge. See -@uref{http://www.netdive.com/freebies/importsql/} for any updates. -Created by Laurent Bossavit of NetDIVE. -@strong{Note:} Doesn't work with Access2! - -@item @uref{http://www.mysql.com/Contrib/msql2mysqlWrapper-1.0.tgz, /msql2mysqlWrapper 1.0} -A C wrapper from @code{mSQL} to @strong{MySQL}. By @email{alfred@@sb.net} - -@item @uref{http://www.mysql.com/Contrib/sqlconv.pl, sqlconv.pl} -A simple script that can be used to copy fields from one @strong{MySQL} table to -another in bulk. Basically, you can run @code{mysqldump} and pipe it to -the @code{sqlconv.pl} script and the script will parse through the -@code{mysqldump} output and will rearrange the fields so they can be -inserted into a new table. An example is when you want to create a new -table for a different site you are working on, but the table is just a -bit different (ie - fields in different order, etc.). -By Steve Shreeve. -@end itemize - -@appendixsec Using MySQL with other products - -@itemize @bullet -@item @uref{http://www.mysql.com/Contrib/emacs-sql-mode.tar.gz, emacs-sql-mode.tar.gz} -Raw port of a SQL mode for XEmacs. Supports completion. Original by -Peter D. Pezaris @email{pez@@atlantic2.sbi.com} and partial -@strong{MySQL} port by David Axmark. - -@item @uref{http://www.mysql.com/Downloads/Win32/MyAccess97_Ver_1_01.zip, MyAccess97 1.01} -MyAccess is an AddIn for Access 97 and handles a lot of maintanance work -for @strong{MySQL} databases. - -@item @uref{http://www.mysql.com/Downloads/Win32/MyAccess2000_Ver_1_01.zip, MyAccess2000 1.01} -MyAccess is an AddIn for Access 2000 and handles a lot of maintanance work -for @strong{MySQL} databases. - -@uref{http://www.mysql.com/Downloads/Win32/MyAccess-1.01.readme, -MyAccess-readme}. By Hubertus Hiden. - -@item @uref{http://www.mysql.com/Contrib/radius-0.3.tar.gz, radius-0.3.tar.gz} -Patches for @code{radiusd} to make it support @strong{MySQL}. By Wim Bonis, -@email{bonis@@kiss.de}. -@end itemize - -@appendixsec Useful tools - -@itemize @bullet -@item @uref{http://www.mysql.com/Contrib/mysql_watchdog.pl, mysql_watchdog.pl} -Monitor the @strong{MySQL} daemon for possible lockups. By Yermo Lamers, -@email{yml@@yml.com}. - -@item @uref{http://www.mysql.com/Contrib/mysqltop.tar.gz, mysqltop.tar.gz} -Sends a query in a fixed time interval to the server and shows the -resulting table. By Thomas Wana. -@item @uref{http://www.mysql.com/Contrib/mysql_structure_dumper.tar.gz,mysql_structure_dumper.tar.gz} -Prints out the structure of the all tables in a database. By Thomas Wana. - -@item @uref{http://www.mysql.com/Contrib/mysql_structure_dumper.tgz, structure_dumper.tgz} -Prints the structure of every table in a database. By Thomas Wana. - -@item @uref{http://www.mysql.com/Contrib/mysqlsync, mysqlsync-1.0-alpha.tar.gz}. -A perl script to keep remote copies of a @strong{MySQL} database in sync with a -central master copy. By Mark Jeftovic. @email{markjr@@easydns.com} -@item @uref{http://www.mysql.com/Contrib/MySQLTutor-0.2.tar.gz, MySQLTutor}. -MySQLTutor. A tutor of @strong{MySQL} for beginners - -@item @uref{http://www.mysql.com/Contrib/MySQLDB.zip, MySQLDB.zip} -A COM library for @strong{MySQL} by Alok Singh. -@item @uref{http://www.mysql.com/Contrib/MySQLDB-readme.html, MySQLDB-readme.html} - -@item @uref{http://www.mysql.com/Contrib/mysql_replicate.pl, mysql_replicate.pl} -Perl program that handles replication. By @email{elble@@icculus.nsg.nwu.edu} - -@item @uref{http://www.mysql.com/Contrib/DBIx-TextIndex-0.02.tar.gz, DBIx-TextIndex-0.02.tar.gz} -Perl program that uses reverse indexing to handle text searching. -By Daniel Koch. -@end itemize - -@appendixsec RPMs for common tools (Most are for RedHat 6.1) - -@itemize @bullet -@item @uref{http://www.mysql.com/Contrib/perl-Data-ShowTable-3.3-2.i386.rpm,perl-Data-ShowTable-3.3-2.i386.rpm} -@item @uref{http://www.mysql.com/Contrib/perl-Msql-Mysql-modules-1.2210-2.i386.rpm,perl-Msql-Mysql-modules-1.2210-2.i386.rpm} -@item @uref{http://www.mysql.com/Contrib/php-pg-3.0.13-1.i386.rpm,php-pg-3.0.13-1.i386.rpm} -@item @uref{http://www.mysql.com/Contrib/php-pg-manual-3.0.13-1.i386.rpm,php-pg-manual-3.0.13-1.i386.rpm} -@item @uref{http://www.mysql.com/Contrib/php-pg-mysql-3.0.13-1.i386.rpm,php-pg-mysql-3.0.13-1.i386.rpm} -@item @uref{http://www.mysql.com/Contrib/phpMyAdmin-2.0.5-1.noarch.rpm,phpMyAdmin-2.0.5-1.noarch.rpm} -@end itemize - -@appendixsec Useful functions -@itemize @bullet -@item @uref{http://www.mysql.com/Contrib/mysnprintf.c,mysnprintf.c} -sprintf() function for SQL queries that can escape blobs. By Chunhua Liu. -@end itemize - -@appendixsec Uncategorized - -@itemize @bullet - -@item @uref{http://www.mysql.com/Contrib/findres.pl, findres.pl} -Find reserved words in tables. By Nem W Schlecht. - -@item @uref{http://www.mysql.com/Contrib/handicap.tar.gz, handicap.tar.gz} -Performance handicapping system for yachts. Uses PHP. By -@email{rhill@@stobyn.ml.org}. - -@item @uref{http://www.mysql.com/Contrib/hylalog-1.0.tar.gz, hylalog-1.0.tar.gz} -Store @code{hylafax} outgoing faxes in a @strong{MySQL} database. By Sinisa -Milivojevic, @email{sinisa@@mysql.com}. - -@item @uref{http://www.mysql.com/Contrib/mrtg-mysql-1.0.tar.gz, mrtg-mysql-1.0.tar.gz} -@strong{MySQL} status plotting with MRTG, by Luuk de Boer, @email{luuk@@wxs.nl}. - -@item @uref{http://www.mysql.com/Contrib/wuftpd-2.4.2.18-mysql_support.2.tar.gz, wuftpd-2.4.2.18-mysql_support.2.tar.gz} -Patches to add logging to @strong{MySQL} for WU-ftpd. By Zeev Suraski, -@email{bourbon@@netvision.net.il}. - -@item @uref{http://www.mysql.com/Contrib/wu-ftpd-2.6.0-mysql.4.tar.gz,wu-ftpd-2.6.0-mysql_support.4.tar.gz} -Patches to add logging to @strong{MySQL} for WU-ftpd 2.6.0. By, -@email{takeshi@@SoftAgency.co.jp}, based on Zeev Suraski wuftpd patches. - -@item @uref{http://www.mysql.com/Contrib/Old-Versions, Old-Versions} -Previous versions of things found here that you probably won't be -interested in. -@end itemize - - -@page -@node Credits, News, Contrib, Top -@appendix Contributors to MySQL - -Contributors to the @strong{MySQL} distribution are listed below, in -somewhat random order: - -@table @asis -@item Michael (Monty) Widenius -Has written the following parts of @strong{MySQL}: -@itemize @bullet -@item -All the main code in @code{mysqld}. -@item -New functions for the string library. -@item -Most of the @code{mysys} library. -@item -The @code{ISAM} and @code{MyISAM} libraries (B-tree index file -handlers with index compression and different record formats). -@item -The @code{heap} library. A memory table system with our superior full dynamic -hashing. In use since 1981 and published around 1984. -@item -The @code{replace} program (look into it, it's COOL!). -@item -@strong{MyODBC}, the ODBC driver for Windows95. -@item -Fixing bugs in MIT-pthreads to get it to work for @strong{MySQL}. And -also Unireg, a curses-based application tool with many utilities. -@item -Porting of @code{mSQL} tools like @code{msqlperl}, @code{DBD}/@code{DBI} and -@code{DB2mysql}. -@item -Most parts of crash-me and the @strong{MySQL} benchmarks. -@end itemize -@item David Axmark -@itemize @bullet -@item -Coordinator and main writer for the @strong{Reference Manual}, including -enhancements to @code{texi2html}. Also automatic website updating from -this manual. -@item -Autoconf, Automake and @code{libtool} support. -@item -The licensing stuff. -@item -Parts of all the text files. (Nowadays only the @file{README} is -left. The rest ended up in the manual.) -@item -Our Mail master. -@item -Lots of testing of new features. -@item -Our in-house ``free'' software lawyer. -@item -Mailing list maintainer (who never has the time to do it right...) -@item -Our original portability code (more than 10 years old now). Nowadays -only some parts of @code{mysys} are left. -@item -Someone for Monty to call in the middle of the night when he just got -that new feature to work. :-) -@end itemize -@item Paul DuBois -Help with making the Reference Manual correct and understandable. That -includes rewriting Monty's and David's attempts at English into English -as other people know it. -@item Gianmassimo Vigazzola @email{qwerg@@mbox.vol.it} or @email{qwerg@@tin.it} -The initial port to Win32/NT. -@item Kim Aldale -Helped to rewrite Monty's and David's early attempts at English into -English. -@item Allan Larsson (The BOSS at TcX) -For all the time he has allowed Monty to spend on this ``maybe useful'' -tool (@strong{MySQL}). Dedicated user (and bug finder) of Unireg & @strong{MySQL}. -@item Per Eric Olsson -For more or less constructive criticism and real testing of the dynamic -record format. -@item Irena Pancirov @email{irena@@mail.yacc.it} -Win32 port with Borland compiler. @code{mysqlshutdown.exe} and -@code{mysqlwatch.exe} -@item David J. Hughes -For the effort to make a shareware SQL database. We at TcX started with -@code{mSQL}, but found that it couldn't satisfy our purposes so instead we -wrote a SQL interface to our application builder Unireg. @code{mysqladmin} -and @code{mysql} are programs that were largely influenced by their -@code{mSQL} counterparts. We have put a lot of effort into making the -@strong{MySQL} syntax a superset of @code{mSQL}. Many of the APIs ideas are -borrowed from @code{mSQL} to make it easy to port free @code{mSQL} programs -to @strong{MySQL}. @strong{MySQL} doesn't contain any code from @code{mSQL}. -Two files in the distribution (@file{client/insert_test.c} and -@file{client/select_test.c}) are based on the corresponding (non-copyrighted) -files in the @code{mSQL} distribution, but are modified as examples showing -the changes necessary to convert code from @code{mSQL} to @strong{MySQL}. -(@code{mSQL} is copyrighted David J. Hughes.) -@item Fred Fish -For his excellent C debugging and trace library. Monty has made a number -of smaller improvements to the library (speed and additional options). -@item Richard A. O'Keefe -For his public domain string library. -@item Henry Spencer -For his regex library, used in @code{WHERE column REGEXP regexp}. -@item Free Software Foundation -From whom we got an excellent compiler (@code{gcc}), the @code{libc} library -(from which we have borrowed @file{strto.c} to get some code working in Linux) -and the @code{readline} library (for the @code{mysql} client). -@item Free Software Foundation & The XEmacs development team -For a really great editor/environment used by almost everybody at TcX/detron. -@item Patrick Lynch -For helping us acquire @code{www.mysql.com}. -@item Fred Lindberg -For setting up qmail to handle @strong{MySQL} mailing list and for the -incredible help we got in managing the @strong{MySQL} mailing lists. -@item Igor Romanenko @email{igor@@frog.kiev.ua} -@code{mysqldump} (previously @code{msqldump}, but ported and enhanced by -Monty). -@item Tim Bunce, Alligator Descartes -For the @code{DBD} (Perl) interface. -@item Andreas Koenig @email{a.koenig@@mind.de} -For the Perl interface to @strong{MySQL}. -@item Eugene Chan @email{eugene@@acenet.com.sg} -For porting PHP to @strong{MySQL}. -@item Michael J. Miller Jr. @email{mke@@terrapin.turbolift.com} -For the first @strong{MySQL} manual. And a lot of spelling/language -fixes for the FAQ (that turned into the @strong{MySQL} manual a long -time ago). -@item Giovanni Maruzzelli @email{maruzz@@matrice.it} -For porting iODBC (Unix ODBC). -@item Chris Provenzano -Portable user level pthreads. From the copyright: This product includes -software developed by Chris Provenzano, the University of California, -Berkeley, and contributors. We are currently using version 1_60_beta6 -patched by Monty (see @file{mit-pthreads/Changes-mysql}). -@item Xavier Leroy @email{Xavier.Leroy@@inria.fr} -The author of LinuxThreads (used by @strong{MySQL} on Linux). -@item Zarko Mocnik @email{zarko.mocnik@@dem.si} -Sorting for Slovenian language and the @file{cset.tar.gz} module that makes -it easier to add other character sets. -@item "TAMITO" @email{tommy@@valley.ne.jp} -The @code{_MB} character set macros and the ujis and sjis character sets. -@item Yves Carlier @email{Yves.Carlier@@rug.ac.be} -@code{mysqlaccess}, a program to show the access rights for a user. -@item Rhys Jones @email{rhys@@wales.com} (And GWE Technologies Limited) -For the JDBC, a module to extract data from @strong{MySQL} with a Java -client. -@item Dr Xiaokun Kelvin ZHU @email{X.Zhu@@brad.ac.uk} -Further development of the JDBC driver and other @strong{MySQL}-related -Java tools. -@item James Cooper @email{pixel@@organic.com} -For setting up a searchable mailing list archive at his site. -@item Rick Mehalick @email{Rick_Mehalick@@i-o.com} -For @code{xmysql}, a graphical X client for @strong{MySQL}. -@item Doug Sisk @email{sisk@@wix.com} -For providing RPM packages of @strong{MySQL} for RedHat Linux. -@item Diemand Alexander V. @email{axeld@@vial.ethz.ch} -For providing RPM packages of @strong{MySQL} for RedHat Linux-Alpha. -@item Antoni Pamies Olive @email{toni@@readysoft.es} -For providing RPM versions of a lot of @strong{MySQL} clients for Intel -and SPARC. -@item Jay Bloodworth @email{jay@@pathways.sde.state.sc.us} -For providing RPM versions for @strong{MySQL} 3.21 versions. -@item Jochen Wiedmann @email{wiedmann@@neckar-alb.de} -For maintaining the Perl @code{DBD::mysql} module. -@item Therrien Gilbert @email{gilbert@@ican.net}, Jean-Marc Pouyot @email{jmp@@scalaire.fr} -French error messages. -@item Petr snajdr, @email{snajdr@@pvt.net} -Czech error messages. -@item Jaroslaw Lewandowski @email{jotel@@itnet.com.pl} -Polish error messages. -@item Miguel Angel Fernandez Roiz -Spanish error messages. -@item Roy-Magne Mo @email{rmo@@www.hivolda.no} -Norwegian error messages and testing of 3.21.#. -@item Timur I. Bakeyev @email{root@@timur.tatarstan.ru} -Russian error messages. -@item @email{brenno@@dewinter.com} && Filippo Grassilli @email{phil@@hyppo.com} -Italian error messages. -@item Dirk Munzinger @email{dirk@@trinity.saar.de} -German error messages. -@item Billik Stefan @email{billik@@sun.uniag.sk} -Slovak error messages. -@item Stefan Saroiu @email{tzoompy@@cs.washington.edu} -Romanian error messages. -@item Peter Feher -Hungarian error messages -@item David Sacerdote @email{davids@@secnet.com} -Ideas for secure checking of DNS hostnames. -@item Wei-Jou Chen @email{jou@@nematic.ieo.nctu.edu.tw} -Some support for Chinese(BIG5) characters. -@item Wei He @email{hewei@@mail.ied.ac.cn} -A lot of functionality for the Chinese(GBK) character set. -@item Zeev Suraski @email{bourbon@@netvision.net.il} -@code{FROM_UNIXTIME()} time formatting, @code{ENCRYPT()} functions, and -@code{bison} advisor. -Active mailing list member. -@item Luuk de Boer @email{luuk@@wxs.nl} -Ported (and extended) the benchmark suite to @code{DBI}/@code{DBD}. Have -been of great help with @code{crash-me} and running benchmarks. Some new -date functions. The mysql_setpermissions script. -@item Jay Flaherty @email{fty@@utk.edu} -Big parts of the Perl @code{DBI}/@code{DBD} section in the manual. -@item Paul Southworth @email{pauls@@etext.org}, Ray Loyzaga @email{yar@@cs.su.oz.au} -Proof-reading of the Reference Manual. -@item Alexis Mikhailov @email{root@@medinf.chuvashia.su} -User definable functions (UDFs); @code{CREATE FUNCTION} and -@code{DROP FUNCTION}. -@item Andreas F. Bobak @email{bobak@@relog.ch} -The @code{AGGREGATE} extension to UDF functions. -@item Ross Wakelin @email{R.Wakelin@@march.co.uk} -Help to set up InstallShield for @strong{MySQL}-Win32. -@item Jethro Wright III @email{jetman@@li.net} -The @file{libmysql.dll} library. -@item James Pereria @email{jpereira@@iafrica.com} -Mysqlmanager, a Win32 GUI tool for administrating @strong{MySQL}. -@item Curt Sampson @email{cjs@@portal.ca} -Porting of MIT-pthreads to NetBSD/Alpha and NetBSD 1.3/i386. -@item Sinisa Milivojevic @email{sinisa@@mysql.com} -Compression (with @code{zlib}) to the client/server protocol. -Perfect hashing for the lexical analyzer phase. -@item Antony T. Curtis @email{antony.curtis@@olcs.net} -Porting of @strong{MySQL} to OS/2. -@item Martin Ramsch @email{m.ramsch@@computer.org} -Examples in the @strong{MySQL} Tutorial. -@item Tim Bunce -Author of @code{mysqlhotcopy}. -@item Steve Harvey -For making @code{mysqlaccess} more secure. -@item Jeremy Cole @email{jeremy@@spaceapes.com} -Proofreading and editing this fine manual. -@end table - -Other contributors, bugfinders and testers: James H. Thompson, Maurizio -Menghini, Wojciech Tryc, Luca Berra, Zarko Mocnik, Wim Bonis, Elmar -Haneke, @email{jehamby@@lightside}, @email{psmith@@BayNetworks.COM}, -@email{duane@@connect.com.au}, Ted Deppner @email{ted@@psyber.com}, -Mike Simons, Jaakko Hyv@"atti. - -And lots of bug report/patches from the folks on the mailing list. - -And a big tribute to those that help us answer questions on the -@code{mysql@@lists.mysql.com} mailing list: - -@table @asis -@item Daniel Koch @email{dkoch@@amcity.com} -Irix setup. -@item Luuk de Boer @email{luuk@@wxs.nl} -Benchmark questions. -@item Tim Sailer @email{tps@@users.buoy.com} -@code{DBD-mysql} questions. -@item Boyd Lynn Gerber @email{gerberb@@zenez.com} -SCO related questions. -@item Richard Mehalick @email{RM186061@@shellus.com} -@code{xmysql}-related questions and basic installation questions. -@item Zeev Suraski @email{bourbon@@netvision.net.il} -Apache module configuration questions (log & auth), PHP-related -questions, SQL syntax related questions and other general questions. -@item Francesc Guasch @email{frankie@@citel.upc.es} -General questions. -@item Jonathan J Smith @email{jsmith@@wtp.net} -Questions pertaining to OS-specifics with Linux, SQL syntax, and other -things that might be needing some work. -@item David Sklar @email{sklar@@student.net} -Using @strong{MySQL} from PHP and Perl. -@item Alistair MacDonald @email{A.MacDonald@@uel.ac.uk} -Not yet specified, but is flexible and can handle Linux and maybe HP-UX. -Will try to get user to use @code{mysqlbug}. -@item John Lyon @email{jlyon@@imag.net} -Questions about installing @strong{MySQL} on Linux systems, using either -@file{.rpm} files, or compiling from source. -@item Lorvid Ltd. @email{lorvid@@WOLFENET.com} -Simple billing/license/support/copyright issues. -@item Patrick Sherrill @email{patrick@@coconet.com} -ODBC and VisualC++ interface questions. -@item Randy Harmon @email{rjharmon@@uptimecomputers.com} -@code{DBD}, Linux, some SQL syntax questions. -@end table - -@node News, Bugs, Credits, Top -@appendix @strong{MySQL} change history - -ѹ @strong{MySQL} ˻ܤƱˡޥ˥奢ѹ뤳ȤդƤ -⤷ޥ˥奢ˤƤΤ -@uref{http://www.mysql.com/download.html,@strong{MySQL} download page} -С MySQL Ĥʤ硢ΥСϤޤ꡼Ƥޤ - -@menu -* News-3.23.x:: Changes in release 3.23.x (Released as alpha) -* News-3.22.x:: Changes in release 3.22.x (Recommended version) -* News-3.21.x:: Changes in release 3.21.x -* News-3.20.x:: Changes in release 3.20.x -* News-3.19.x:: Changes in release 3.19.x -@end menu - -@node News-3.23.x, News-3.22.x, News, News -@appendixsec Changes in release 3.23.x (Released as alpha) - -꡼3.23ӥ꡼3.223.21Ȥΰ㤤ϡ -3.23ISAM饤֥( MyISAM )ޤȤȤǤ -ϸŤISAMꡢSQLˤȤäƤ塼˥󥰤Ƥޤ - -3.23꡼ϳȯǡǽ®ڡդäǤ礦 -ꡢ桹ϡΥ꡼򡢤Υ꡼Τߤˤ뵡ǽ -(եΥݡȡӡޥ¸Υơ֥) -ɬפȤƤ桼ФƤΤߡޤ -( MySQL 3.23ƤοǽϡƥȤޤ -Υ꡼¿οɤޤΤǡ٤ƤƥȤ뤳Ȥ񤷤Ǥ) - -We are not adding any more new features that are likely to break any -old code in @strong{MySQL} 3.23 so this version should stabilise pretty soon -and will soon be declared beta, gamma and release. - -@menu -* News-3.23.18:: Changes in release 3.23.18 -* News-3.23.17:: Changes in release 3.23.17 -* News-3.23.16:: Changes in release 3.23.16 -* News-3.23.15:: Changes in release 3.23.15 -* News-3.23.14:: Changes in release 3.23.14 -* News-3.23.13:: Changes in release 3.23.13 -* News-3.23.12:: Changes in release 3.23.12 -* News-3.23.11:: Changes in release 3.23.11 -* News-3.23.10:: Changes in release 3.23.10 -* News-3.23.9:: Changes in release 3.23.9 -* News-3.23.8:: Changes in release 3.23.8 -* News-3.23.7:: Changes in release 3.23.7 -* News-3.23.6:: Changes in release 3.23.6 -* News-3.23.5:: Changes in release 3.23.5 -* News-3.23.4:: Changes in release 3.23.4 -* News-3.23.3:: Changes in release 3.23.3 -* News-3.23.2:: Changes in release 3.23.2 -* News-3.23.1:: Changes in release 3.23.1 -* News-3.23.0:: Changes in release 3.23.0 -@end menu - -@node News-3.23.18, News-3.23.17, News-3.23.x, News-3.23.x -@appendixsubsec Changes in release 3.23.18 -@itemize @bullet -@item -Fixed a problem from 3.23.17 when choosing character set on the client side. -@item -Added @code{FLUSH TABLES WITH READ LOCK} to make a global lock suitable to -make a copy of @strong{MySQL} data files. -@item -@code{CREATE TABLE ... SELECT ... PROCEDURE} now works. -@item -Internal temporary tables will now uses compressed index when using -@code{GROUP BY} on @code{VARCHAR/CHAR} columns. -@item -Fixed a problem when locking the same table with both a @code{READ} and a -@code{WRITE} lock. -@item -Fixed problem with myisamchk and @code{RAID} tables. -@end itemize - -@node News-3.23.17, News-3.23.16, News-3.23.18, News-3.23.x -@appendixsubsec Changes in release 3.23.17 -@itemize @bullet -@item -Fixed a bug in @code{find_in_set()} when the first argument was @code{NULL}. -@item -Added table locks to Berkeley DB. -@item -Fixed a bug with @code{LEFT JOIN} and @code{ORDER BY} where the first -table had only one matching row. -@item -Added 4 sample @code{my.cfg} example files in the @file{support-files} -directory. -@item -Fixed @code{duplicated key} problem when doing big @code{GROUP BY}'s. -(This bug was probably introduced in 3.23.15). -@item -Changed syntax for @code{INNER JOIN} to match ANSI SQL. -@item -Added @code{NATURAL JOIN} syntax. -@item -A lot of fixes in the @code{BDB} interface. -@item -Added handling of @code{--no-defaults} and @code{--defaults-file} to -@code{safe_mysqld.sh} and @code{mysql_install_db.sh}. -@item -Fixed bug in reading compressed tables with many threads. -@item -Fixed that @code{USE INDEX} works with @code{PRIMARY} keys. -@item -Added @code{BEGIN} statement to start a transaction in @code{AUTOCOMMIT} mode. -@item -Added symbolic links support for Win32. -@item -Changed protocol to let client know if the server is in AUTOCOMMIT mode -and if there is a pending transaction. If there is a pending transaction -the client library will give an error before reconnecting to the server to -let the client know that the server did a rollback. -The protocol is still backward compatible with old clients -@item -@code{KILL} now works on a thread that is locked on a 'write' to a dead client. -@item -Fixed memory leak in the replication slave thread -@item -Added new option @code{log-slave-updates} to allow daisy-chaining the slaves -@item -Fixed compile error on FreeBSD and other systems where @code{pthread_t} -is not the same as @code{int} -@item -Fixed master shutdown aborting the slave thread -@item -Fixed a race condition in @code{INSERT DELAYED} code when doing -@code{ALTER TABLE}. -@item -Added deadlock detection sanity checks to @code{INSERT DELAYED} -@end itemize - -@node News-3.23.16, News-3.23.15, News-3.23.17, News-3.23.x -@appendixsubsec Changes in release 3.23.16 -@itemize @bullet -@item -Added option @code{TYPE=QUICK} to @code{CHECK} and @code{REPAIR}. -@item -Fixed bug in @code{REPAIR TABLE} when the table was in use by other threads. -@item -Added a thread cache to make it possible to debug @strong{MySQL} with -@code{gdb} when one does a lot of reconnects. This will also improve -systems where you can't use persistent connections. -@item -Lots of fixes in the Berekely DB interface. -@item -@code{UPDATE IGNORE} will not abort if an update results in a -@code{DUPLICATE_KEY} error. -@item -Put @code{CREATE TEMPORARY TABLE} commands in the update log. -@item -Fixed bug in handling of masked IP numbers in the privilege tables. -@item -Fixed bug with @code{delayed_key_writes} tables and @code{CHECK TABLE}. -@item -Added @code{replicate-do-db} and @code{replicate-ignore-db} options to -restrict which databases get replicated -@item -Added @code{SQL_LOG_BIN} option -@end itemize - -@node News-3.23.15, News-3.23.14, News-3.23.16, News-3.23.x -@appendixsubsec Changes in release 3.23.15 -@itemize @bullet -@item -To start @code{mysqld} as @code{root} one must now use the @code{--user=root} option. -@item -Added interface to Berkeley DB. (This is not yet functional; Play with it at -your own risk!) -@item -Replication between master and slaves. -@item -Fixed bug that other threads could steal a lock when a thread had -a lock on a table and did a @code{FLUSH TABLES} command. -@item -Added the @code{slow_launch_time} variable and the @code{Slow_launch_threads} -status variable to @code{mysqld}. These can be examined with -@code{mysqladmin variables} and @code{mysqladmin extended-status}. -@item -Added functions @code{INET_NTOA()} and @code{INET_ATON()}. -@item -The default type of @code{IF()} now depends on the second and -third arguments and not only on the second argument. -@item -Fixed case when @code{myisamchk} could go into a loop when trying to -repair a crashed table. -@item -Don't write @code{INSERT DELAYED} to update log if @code{SQL_LOG_UPDATE=0}. -@item -Fixed problem with @code{REPLACE} on @code{HEAP} tables. -@item -Added possible character sets and time zone to @code{SHOW VARIABLES}. -@item -Fixed bug in locking code that could result it locking problems with -concurrent inserts under high load. -@item -Fixed a problem with @code{DELETE} of many rows on a table with -compressed keys where @strong{MySQL} scanned the index to find the rows. -@item -Fixed problem with @code{CHECK} on table with deleted keyblocks. -@item -Fixed a bug in reconnect (at the client side) where it didn't free memory -properly in some contexts. -@item -Fixed problems in update log when using @code{LAST_INSERT_ID()} to update -a table with an auto_increment key. -@item -Added function @code{NULLIF()}. -@item -Fixed bug when using @code{LOAD DATA INFILE} on a table with -@code{BLOB/TEXT} columns. -@item -Optimised MyISAM to be faster when inserting keys in sorted order. -@item -@code{EXPLAIN SELECT..} now also prints out whether @strong{MySQL} needs to -create a temporary table or use file sorting when resolving the @code{SELECT}. -@item -Added optimization to skip @code{ORDER BY} parts where the part is a -constant expression in the @code{WHERE} part. Indexes can now be used -even if the @code{ORDER BY} doesn't match the index exactly, as long as -all the not used index parts and all the extra @code{ORDER BY} -columns are constants in the @code{WHERE} clause. @xref{MySQL indexes}. -@item -@code{UPDATE} and @code{DELETE} on a whole unique key in the @code{WHERE} part, -is now faster than before. -@item -Changed @code{RAID_CHUNKSIZE} to be in 1024 byte increments. -@item -Fixed coredump in LOAD_FILE(NULL) - you have to be as stupid as Sasha to try this :-) -@end itemize - -@node News-3.23.14, News-3.23.13, News-3.23.15, News-3.23.x -@appendixsubsec Changes in release 3.23.14 -@itemize @bullet -@item -Fixed a bug in @code{CONCAT()} where one of the arguments was a function -that returned a modified argument. -@item -@code{myisamchk} ̿ŪʥХ ΥХϥǥåե -إå򡢥ơ֥åƤʤΤˤ⤫餺Ƥ -This confused the -@code{mysqld} daemon if it updated the same table at the same time. Now -the status in the index file is only updated if one uses -@code{--update-state}. With older @code{myisamchk} versions you shoul -use @code{--read-only} when only checking tables, if there is the -slightest chance that the @code{mysqld} server is working on the table at the -same time! -@item -Fixed that @code{DROP TABLE} is logged in the update log. -@item -Fixed problem when searching on @code{DECIMAL()} key field -where the column data contained leading zeros. -@item -auto_increment ǽΥǤʤ @code{myisamchk} ΥХ -@item -Allow @code{DATETIME} in ISO8601 format: 2000-03-12T12:00:00 -@item -ưŪ饯åȡ Ĥ @code{mysqld} Хʥǡ¿ΰ㤦 -饯åȤ򰷤褦ˤʤä -(@code{mysqld} Ȼ˻Ǥޤ). -@item -@code{REPAIR TABLE} ޥɤɲá -@item -@code{mysql_thread_safe()} C API ؿɲá -@item -@code{UMASK_DIR} Ķѿɲá -@item -@code{CONNECTION_ID()} ؿɲ -@item -When using @code{=} on @code{BLOB} or @code{VARCHAR BINARY} keys, where -only a part of the column was indexed, the whole column of the result -row wasn't compared. -@item -sjis 饯åȤ @code{ORDER BY} -@item -When running in ANSI mode, don't allow columns to be used that aren't in -the @code{GROUP BY} part. -@end itemize - -@node News-3.23.13, News-3.23.12, News-3.23.14, News-3.23.x -@appendixsubsec Changes in release 3.23.13 -@itemize @bullet -@item -Fixed problem when doing locks on the same table more than 2 times in -the same @code{LOCK TABLE} command; This fixed the problem one got when running -the test-ATIS test with @code{--fast}. -@item -@code{SQL_BUFFER_RESULT} ץ @code{SELECT} ɲ -@item -Removed end space from double/float numbers in results from temporary -tables. -@code{CHECK TABLE} ޥɤɲá -@item -Added changes for MyISAM in 3.23.12 that didn't get into the source -distribution because of CVS problems. -@item -Fixed bug so that mysqladmin shutdown will wait for the local server to close -down. -@item -Fixed a possible endless loop when calculating timestamp. -@item -Added print_defaults to the .rpm files. Removed mysqlbug from the client -rpm file. -@end itemize - -@node News-3.23.12, News-3.23.11, News-3.23.13, News-3.23.x -@appendixsubsec Changes in release 3.23.12 -@itemize @bullet -@item -Fixed bug in @code{MyISAM} involving @code{REPLACE ... SELECT} which could -give a corrupted table. -@item -Fixed bug in @code{myisamchk} where it wrongly reset the auto_increment value. -@item -Linux Alpha Ѥ¿Υѥåɲ. @strong{MySQL} now appears to be relatively -stable on Alpha. -@item -ʣ쥳ɤ®Ĥ뤿Υϥå岽줿Ѥ뤿ˡ -@code{HEAP} ơ֥ @code{DISTINCT} ѹ -This mostly concerns queries of -type @code{SELECT DISTINCT ... GROUP BY ..}. This fixes a problem where -not all duplicates were removed in queries of the above type. -ɲäɤϡȤƤ® -@item -MacOS X @code{MySQL} 򥳥ѥǤ褦ˤʤѥåɲ -@item -ץ @code{IF NOT EXISTS} @code{CREATE DATABASE} ɲ. -@item -¿Υǡ١Ʊ˥פǤ褦ˡ -@code{--all-databases} @code{--databases} ץ @code{mysqldump} ɲá -@item -@code{MyISAM} ơ֥ΰ̤ @code{DECIMAL()} ǥåΥХ -@item -0 timestamp ¸ȤΥХ -@item -³ @code{mysqladmin shutdown} ¹Ԥˡ@code{mysqladmin} -λ pidfile ̵ʤޤԤĤ褦ˤʤä -@item -Ĥ @code{COUNT(DISTINCT ...)} ǥǤΤ -@item -Fixed that @code{myisamchk} works properly with RAID:ed tables. -@item -Fixed problem with @code{LEFT JOIN} and @code{key_field IS NULL}. -@item -Fixed bug in @code{net_clear()} which could give the error @code{Aborted -connection} in the @strong{MySQL} clients. -@item -Added options @code{USE INDEX (key_list)} and @code{IGNORE INDEX (key_list)} as -join parameters in @code{SELECT}. -@item -@code{DELETE} and @code{RENAME} should now work on @code{RAID} tables. -@end itemize - -@node News-3.23.11, News-3.23.10, News-3.23.12, News-3.23.x -@appendixsubsec Changes in release 3.23.11 -@itemize @bullet -@item -@code{ALTER TABLEL tbl_name ADD (field_list)} ʸĤ -@item -Fixed problem with optimizer that could sometimes use wrong keys. -@item -@code{GRANT/REVOKE ALL PRIVILEGES} @code{GRANT OPTION} ˱ƶʤäΤ -@item -Removed extra @code{)} from the output of @code{SHOW GRANTS} -@item -Fixed problem when storing numbers in timestamps. -@item -Fix problem with timezones that have half hour offsets. -@item -@code{CREATE} ʸǤ @code{UNIQUE INDEX} λѤġ -@item -@code{mysqlhotcopy} - @strong{MySQL} ǡ١Хååפ -ġ롣 By Tim Bunce. -@item - @code{mysqlaccess}. Thanks to Steve Harvey for this. -@item -@code{--i-am-a-dummy} @code{--safe-updates} ץ @code{mysql} ɲá -@item -@code{select_limit} @code{max_join_size} ѿ @code{mysql} ɲá -@item -SQL ѿɲá @code{SQL_MAX_JOIN_SIZE} @code{SQL_SAFE_UPDATES}. -@item -Added @code{READ LOCAL} lock that doesn't lock the table for concurrent -inserts. (This is used by @code{mysqldump}). -@item -Changed that @code{LOCK TABLES .. READ} doesn't anymore allow concurrent -inserts. -@item -ץ @code{--skip-delay-key-write} @code{mysqld} ɲá -@item -Fixed security problem in the protocol regarding password checking. -@item -@code{_rowid} can now be used as an alias for an integer type unique indexed -column. -@item -Added back blocking of @code{SIGPIPE} when compiling with @code{--thread-safe-clients} -to make things safe for old clients. -@end itemize - -@node News-3.23.10, News-3.23.9, News-3.23.11, News-3.23.x -@appendixsubsec Changes in release 3.23.10 -@itemize @bullet -@item -Fixed bug in 3.23.9 where memory wasn't properly freed when doing -@code{LOCK TABLES}. -@end itemize - -@node News-3.23.9, News-3.23.8, News-3.23.10, News-3.23.x -@appendixsubsec Changes in release 3.23.9 -@itemize @bullet -@item -Fixed problem that affected queries that did arithmetic on group functions. -@item -Fixed problem with timestamps and @code{INSERT DELAYED}. -@item -Fixed that @code{date_column BETWEEN const_date AND const_date} works. -@item -Fixed problem when only changing a 0 to @code{NULL} in a table with -@code{BLOB/TEXT} columns. -@item -Fixed bug in range optimizer when using many key parts and or on the middle -key parts: @code{WHERE K1=1 and K3=2 and (K2=2 and K4=4 or K2=3 and K4=5)} -@item -@code{source} ޥɤ @code{mysql} ɲá @code{mysql} 饤 -ǡХåեɤळȤǤ롣 Original patch by Matthew Vanecek. -@item -@code{WITH GRANT OPTION} ץ̿ŪʥХ -@item -Don't give an unnecessary @code{GRANT} error when using tables from many -databases in the same query. -@item -Added VIO wrapper (needed for SSL support ; By Andrei Errapart and -Tnu Samuel). -@item -Fixed optimizer problem on @code{SELECT} when using many overlapping indexes. -@strong{MySQL} should now be able to choose keys even better when there -is many keys to choose from. -@item -Changed optimizer to prefer a range key instead of a ref key when the -range key can uses more columns than the ref key (which only can use -columns with =). For example, the following type of queries should now -be faster: @code{SELECT * from key_part_1=const and key_part_2 > const2} -@item -Fixed bug that a change of all @code{VARCHAR} columns to @code{CHAR} columns -didn't change row type from dynamic to fixed. -@item -Disabled floating point exceptions for FreeBSD to fix core dump when -doing @code{SELECT floor(pow(2,63))}. -@item -@code{mysqld} εưץ @code{--delay-key-write} -@code{--delay-key-write-for-all-tables} ѹ -@item -Added @code{read-next-on-key} to @code{HEAP} tables. This should fix all -problems with @code{HEAP} tables when using not @code{UNIQUE} keys. -@item -ѿΥǥեȤɽ륪ץ򥯥饤Ȥɲ -@item -@code{mysqld} @code{--log-slow-queries} ɲá ϻ֤Τä -ƤΥ̤Υե˵Ͽ롣ɤΤ餤֤ä -@item -@code{WHERE key_column=RAND(...)} ԤäȤǤХ -@item -Fixed optimization bug in @code{SELECT .. LEFT JOIN ... key_column IS NULL}, -when @code{key_column} could contain @code{NULL} values. -@item -Fixed problem with 8-bit characters as separators in @code{LOAD DATA INFILE}. -@end itemize - -@node News-3.23.8, News-3.23.7, News-3.23.9, News-3.23.x -@appendixsubsec Changes in release 3.23.8 -@itemize @bullet -@item -8G 礭ʥǥåե򰷤ä -@item -NetBSD Ѥκǿ mit-pthread Υѥåɲá -@item -ॾ < GMT - 11 ξ -@item -@code{NISAM} Υѥå줿κΥХ -@item -Ĥ @code{ORDER BY ... DESC} ¹Ԥݤ @code{ISAM} -@item -Fixed bug when doing a join on a text key which didn't covert the whole key. -@item -ץ @code{--delay-key-write} delayed key writing ͭˤƤʤäΤ -@item -Fixed update of @code{TEXT} column which only involved case changes. -@item -Fixed that @code{INSERT DELAYED} doesn't update timestamps that are given. -@item -@code{YEARWEEK()} ؿɲäȡ@code{x}, @code{X}, @code{v}, -@code{V} ץ @code{DATE_FORMAT()} ؤɲá -@item -Fixed problem with @code{MAX(indexed_column)} and HEAP tables. -@item -Fixed problem with @code{BLOB NULL} keys and @code{LIKE} "prefix%". -@item -Fixed problem with @code{MyISAM} and fixed length rows < 5 bytes. -@item -Fixed problem that could cause @strong{MySQL} to touch freed memory when -doing very complicated @code{GROUP BY} queries. -@item -Fixed core dump if you got a crashed table where an @code{ENUM} field value -was too big. -@end itemize - -@node News-3.23.7, News-3.23.6, News-3.23.8, News-3.23.x -@appendixsubsec Changes in release 3.23.7 -@itemize @bullet -@item -LinuxĶˤơ@code{pthread_mutex_timedwait} 򤱤褦ˤ -δؿ @code{INSERT DELAYED} ǻѤƤ @xref{Linux}. -@item -Fixed that one will get at 'disk full' error message if one gets disk full -when doing sorting (instead of waiting until we got more disk space). -@item -@code{MyISAM} ǡ 250 ʸĶΥХ -@item -@code{MyISAM} ˤơ¾ΥåɤɤǤơ֥Ф -¾Υåɤ @code{INSERT} Ʊ˹ԤȤǤ褦ˤʤä -@item -Added variable @code{max_write_lock_count} to @code{mysqld} to force a -@code{READ} lock after a certain number of @code{WRITE} locks. -@item -Inverted flag @code{delayed_key_write} on @code{show variables}. -@item -@code{concurrency} ѿ @code{thread_concurrency} ˲̾ -@item -ʲδؿޥХȡդˤʤä -@code{LOCATE(substr,str)}, @code{POSITION(substr IN str)}, -@code{LOCATE(substr,str,pos)}, @code{INSTR(str,substr)}, -@code{LEFT(str,len)}, @code{RIGHT(str,len)}, -@code{SUBSTRING(str,pos,len)}, @code{SUBSTRING(str FROM pos FOR len)}, -@code{MID(str,pos,len)}, @code{SUBSTRING(str,pos)}, @code{SUBSTRING(str -FROM pos)}, @code{SUBSTRING_INDEX(str,delim,count)}, @code{RTRIM(str)}, -@code{TRIM([[BOTH | TRAILING] [remstr] FROM] str)}, -@code{REPLACE(str,from_str,to_str)}, @code{REVERSE(str)}, -@code{INSERT(str,pos,len,newstr)}, @code{LCASE(str)}, @code{LOWER(str)}, -@code{UCASE(str)} and @code{UPPER(str)}; Patch by Wei He. -@item -Fix core dump when releasing a lock from a non-existant table. -@item -Remove locks on tables before starting to remove duplicates. -@item -@code{FULL} ץ @code{SHOW PROCESSLIST} ɲá -@item -@code{--verbose} ץ @code{mysqladmin} ɲá -@item -HEAP MyISAM ؤμưѴΥХ -@item -HEAP ơ֥Фơinsert + delete + insert + scan table Ԥäݤ -Х -@item -Alpha ץåȥեǤΡ@code{REPLACE()} @code{LOAD DATA INFILE} -ΥХ -@item -@code{mysqld} ѿ @code{interactive_timeout} ɲ. -@item -@code{mysql_data_seek()} ΰ @code{ulong} @code{ulonglong} -ѹ. -@end itemize - -@node News-3.23.6, News-3.23.5, News-3.23.7, News-3.23.x -@appendixsubsec Changes in release 3.23.6 - -@itemize @bullet -@item -@code{mysqld} @code{-O lower_case_table_names=@{0|1@}} ץɲá -ϥơ֥̾Ū˾ʸˤޤ -@item -@code{SELECT ... INTO DUMPFILE} ɲá -@item -mysqld @code{--ansi} ץɲá ϤĤδؿ -@code{ANSI SQL} ߴˤޤ -@item -Temporary tables now starts with @code{#sql}. -@item -Added quoting of identifiers with @code{`} (@code{"} in @code{--ansi} mode). -@item -Changed to use snprintf() when printing floats to avoid some buffer -overflows on FreeBSD. -@item -FreeBSD ǡ@code{floor()} 򥪡Сեդˤ -@item -@code{--quote-names} ץ @code{mysqldump} ɲ -@item -Fixed bug that one could make a part of a @code{PRIMARY KEY NOT NULL}. -@item -Fixed @code{encrypt()} to be thread safe and not reuse buffer. -@item -MyODBC @code{mysql_odbc_escape_string()} ؿbig5 򥵥ݡȤ -@item -Rewrote the table handler to use classes. This introduces a lot of new code, -but will make table handling faster and better. -@item -桼ѿΥѥå(Sashaˤ)ɲá -@item -Changed that @code{FLOAT} and @code{DOUBLE} (without any length modifiers) are -not anymore fixed decimal point numbers. -@item -@code{FLOAT(X)} ΰ̣ѹ: X <=24 ʤС @code{FLOAT} Ʊǡ -24 < X <= 53 Ǥʤ @code{DOUBLE} Ʊˤʤޤ -@item -@code{DECIMAL(X)} @code{DECIMAL(X,0)} Υꥢˤʤޤ -ޤ @code{DECIMAL} @code{DECIMAL(10,0)} Υꥢˤʤޤ -The same goes for @code{NUMERIC}. -@item -@code{ROW_FORMAT=@{default | dynamic | static | compressed@}} ץ -@code{CREATE_TABLE} ɲ. -@item -@code{DELETE FROM table_name} ơ֥ưʤä -@item -@code{CHAR_LENGTH()} ؿޥХȥդѹ -@item -@code{ORD(string)} ؿɲ. -@end itemize - -@node News-3.23.5, News-3.23.4, News-3.23.6, News-3.23.x -@appendixsubsec Changes in release 3.23.5 - -@itemize @bullet -@item -ǡϥɥΤĤ Y2K -@item -@code{SELECT DISTINCT ... ORDER BY RAND()} -@item -Sergei A. Golubchik ˤ MyISAM Υ٥ǤΥƥȥΥѥåɲ -@item -̵full JOIN ѤݤΥå奪Сե -@item -Ĥ configure -@item -Some small changes to make parsing faster. -@item -ALTER TABLE + adding a column after the last field didn't work. -@item -2ĤΥauto_incrementեɤѤȤ -@item -@code{MyISAM} auto_increment 򥵥֥ѡȤȤƻѤǤ褦ˤʤä -@code{ CREATE TABLE foo (a int not null auto_increment, b char(5), primary key (b,a)) } -@item -Fixed bug in @code{MyISAM} with packed char keys that could be @code{NULL}. -@item -ե̾ @code{CREATE TABLE table_name SELECT ... } ˤȤ硢ưʤä -@item -Allow use of @code{NATIONAL} and @code{NCHAR} when defining character columns. - This is the same as not using @code{BINARY}. -@item -@code{NULL} Υեɤ @code{PRIMARY KEY} ( @code{UNIQUE} ) ˤ -ʤʤä -@item -Clear @code{LAST_INSERT_ID} if one uses this in ODBC: -@code{WHERE auto_increment_column IS NULL}. This seems to fix some problems -@item -@code{WHERE auto_increment_column IS NULL} ѤƺǸ˥쥳ɤ줿ˡ -@code{SET SQL_AUTO_IS_NULL=0|1} ϥΥϥɥ󥰤 on/off ˤʤä -@item -Added new @code{mysqld} variable concurrency for Solaris. -@item -@code{--relative} ץ @code{mysqladmin} ɲá - @code{extended-status} ѹΥ˥򤹤硢ˤʤä -@item -Υơ֥Ф @code{COUNT(DISTINCT..)} ѤݤΥХ -@item -Υ饯å @code{GBK} ɲá -@item -@code{LOAD DATA INFILE} @code{BLOB} եɤ˻Ѥݤ -@item -黻 @code{~} (negation) ɲá -@item -@code{UDF} ؿǤ -@end itemize - -@node News-3.23.4, News-3.23.3, News-3.23.5, News-3.23.x -@appendixsubsec Changes in release 3.23.4 - -@itemize @bullet -@item -@code{DATETIME} @code{TIME} եɤȤ'day' -¸褦Ȼߤʤʤä -@item -low endian Υޥ float/double ¸ -( @code{SUM()} ˱ƶ.) -@item -TCP/IP ³ connect timeout ɲá -@item -ǥåǡ @code{NULL} ͤĤ⤷ʤΤ @code{LIKE} "%" ݤ -@item -@code{REVOKE ALL PRIVILEGES} Ƥθ¤äƤʤäΤ -@item -ꥸʥΥơ֥̾Ʊ̾ǰơ֥褦ˤ -@item -ǡ١ؤθ¤򤢤桼Ϳݡ -Υ桼¾Υ桼˸¤Ϳ뤳Ȥʤä -@item -ޥɡ @code{SHOW GRANTS FOR user} (by Sinisa). -@item - @code{date_add} syntax: @code{date/datetime + INTERVAL # interval_type}. -By Joshua Chamas. -@item -@code{LOAD DATA REPLACE} θ¤Υå -@item -Solaris 2.7 ǤΡ줿 include եư -@item -big file system 򸡽ФݤΤĤ configure -@item -@code{REGEXP} ϥ¸ˤʤä⤷ХʥʸǤʤϡ -@end itemize - -@node News-3.23.3, News-3.23.2, News-3.23.4, News-3.23.x -@appendixsubsec Changes in release 3.23.3 - -@itemize @bullet -@item -NetBSD Ǥ MIT-pthreads ѥåɲá -@item -MyISAM range bug -@item -@code{ORDER BY} ΥǥեȤƤ @code{ASC} ˤʤä -@item -@code{LIMIT} @code{UPDATE} ɲá -@item -饤ȴؿ @code{mysql_change_user()}. -@item -@code{SHOW VARIABLES} ˥饯åȤɲá -@item -@code{--[whitespace]} Ȥ򥵥ݡȤ -@item -Allow @code{INSERT into tbl_name VALUES ()}, that is, you may now specify -an empty value list to insert a row in which each column is set to its -default value. -@item -Changed @code{SUBSTRING(text FROM pos)} to conform to ANSI SQL. (Before this -construct returned the rightmost 'pos' characters). -@item -ĤΥƥ @code{GROUP BY} Ȥʤä @code{SUM(..)} 0 ֤褦ˤʤä -@item -@code{SHOW TABLE STATUS} νϤѹ -@item -@code{DELAY_KEY_WRITE} ץ @code{CREATE TABLE} ɲá -@item -@code{AUTO_INCREMENT} 򤤤ʤ륭ʬ˻ѤǤ褦ˤ -@item -@code{YEAR(NOW())} , @code{YEAR(CURDATE())} -@item -Added @code{CASE} construct. -@item - @code{COALESCE()}. -@end itemize - -@node News-3.23.2, News-3.23.1, News-3.23.3, News-3.23.x -@appendixsubsec Changes in release 3.23.2 - -@itemize @bullet -@item -Fixed range optimizer bug: @code{SELECT * FROM table_name WHERE -key_part1 >= const AND (key_part2 = const OR key_part2 = const)}. The -bug was that some rows could be duplicated in the result. -@item -Running @code{myisamchk} without @code{-a} updated the index -distribution wrong. -@item -@code{SET SQL_LOW_PRIORITY_UPDATES=1} gave parse error before. -@item -@code{WHERE} ˻ѤƤ륤ǥåեɤ򹹿Ǥ褦ˤʤä -@code{UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100} -@item -Date handling should now be a bit faster. -@item -Added handling of fuzzy dates (dates where day or month is 0): -(Like: 1999-01-00) -@item -Fixed optimization of @code{SELECT ... WHERE key_part1=const1 AND -key_part_2=const2 AND key_part1=const4 AND key_part2=const4} ; Indextype -should be @code{range} instead of @code{ref}. -@item -Linux Alpha @code{egcs} 1.1.2 optimizer ΥХ(@code{BLOB} ѻ) -@item -Fixed problem with @code{LOCK TABLES} combined with @code{DELETE FROM table}. -@item -MyISAM ơ֥ @code{NULL} ͤ @code{BLOB/TEXT} եɤ˥褦ˤʤä -@item -ʲJOIN®ʤä -@code{SELECT ... FROM t1 LEFT JOIN t2 ON ... WHERE t2.not_null_column IS NULL}. -@item -@code{ORDER BY} and @code{GROUP BY} can be done on functions. -@item -Changed handling of 'const_item' to allow handling of @code{ORDER BY RAND()}. -@item -@code{WHERE key_column = function} ǥǥåѤ褦ˤʤä -@item -㤨եɤƱ˥ѥåƤʤƤ⡢ -@code{WHERE key_column = column_name} ǥǥåѤ褦ˤʤä -@item -@code{WHERE column_name IS NULL} ǥǥåѤ褦ˤʤä -@item -Changed heap tables to be stored in low_byte_first order (to make it easy -to convert to MyISAM tables) -@item -Automatic change of HEAP temporary tables to MyISAM tables in case of -'table is full' errors. -@item -@code{--init-file=file_name} ץ @code{mysqld} ɲá -@item -@code{COUNT(DISTINCT value,[value,...])} -@item -@code{CREATE TEMPORARY TABLE} now creates a temporary table, in its own -namespace, that is automatically deleted if connection is dropped. -@item -ͽ (@code{CASE} ׵): @code{CASE, THEN, WHEN, ELSE and END}. -@item -ؿ @code{EXPORT_SET()} , @code{MD5()}. -@item -GB2312 쥭饯åȤ򥵥ݡȡ -@end itemize - -@node News-3.23.1, News-3.23.0, News-3.23.2, News-3.23.x -@appendixsubsec Changes in release 3.23.1 - -@itemize @bullet -@item -ĤΥѥ -@end itemize - -@node News-3.23.0, , News-3.23.1, News-3.23.x -@appendixsubsec Changes in release 3.23.0 - -@itemize @bullet -@item -¿οħơ֥롦ϥɥ顼饤֥( @code{MyISAM} ) -@xref{MyISAM}. -@item -꡼ @code{HEAP} ơ֥Ǥ褦ˤʤޤ -õȤƤ®Ǥ -@item -̥ե򥵥ݡȤƤOSǡե (63 bit) Υݡȡ -@item -ؿ @code{LOAD_FILE(filename)} ϥեȤʸͤȤɤߤޤ -@item -黻 @code{<=>} ϡ @code{=} Τ褦˿񤤤ޤ -⤷ξդΰ @code{NULL} ʤ顢֤ޤ -ϥơ֥֤ѹӤΩޤ -@item -ODBC 3.0 @code{EXTRACT(interval FROM datetime)} ؿɲá -@item -@code{FLOAT(X)} եɤϡ¸ͤݤޤ -ϸ줿Ȥ ʳɽ (1.0 E+10) ˤʤ뤫⤷ޤ -@item -@code{REPLACE} ®ʤä -@item -@code{LIKE} ʸӤ @code{=} Τ˿񤦤褦ѹ - @code{'e' LIKE '@'e'} ˤʤȤȤǤ -@item -@code{SHOW TABLE STATUS} ϥơ֥ˤĤƤξ¿Ф褦ˤʤޤ -@item -@code{LIKE} @code{SHOW STATUS} ޥɤɲá -@item -@code{SHOW COLUMNS} Privileges ܤɲá -@item -@code{SHOW INDEX} @code{packed} @code{comment} ܤɲá -@item -ơ֥ؤΥȤɲá ( @code{CREATE TABLE ... COMMENT "xxx"}). -@item -@code{UNIQUE} 򼡤Τ褦ɲá -@code{CREATE TABLE table_name (col int not null UNIQUE)} -@item - create ʸ @code{CREATE TABLE table_name SELECT ....} -@item - create ʸ @code{CREATE TABLE IF NOT EXISTS ...} -@item -@code{CHAR(0)} եɤκĤ -@item -@code{DATE_FORMAT()} ϡեޥåʸ @samp{%} ɬפˤʤä -@item -@code{DELAYED} ͽˤʤä (sorry about that :( ). -@item -ץ㡼ɲá @code{analyse}, file: @file{sql_analyse.c}. -ϥΥǡˤĤޤ ʲͤˤƤߤƤ -@example -SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]]) -@end example - ץ㡼ϡơ֥ΥǡåˡȤƤΩޤ -@item -@code{BINARY} cast to force a string to be compared case sensitively. -@item -@code{--skip-show-database} ץ @code{mysqld} ɲá -@item -@code{BLOB}/@code{TEXT} եɤˤơ @code{UPDATE} 줿 -쥳ɤåǤ褦ˤʤޤ -@item -@code{INNER JOIN} ɲá @strong{}: @code{INNER} ͽˤʤޤ -@item -@strong{MySQL} ơ֥ΥۥȤ˥ͥåȥޥ򥵥ݡȤ -@code{IP/NETMASK} ȤơͥåȥޥǤޤ -@item -If you compare a @code{NOT NULL DATE/DATETIME} column with @code{IS -NULL}, this is changed to a compare against @code{0} to satisfy some ODBC -applications. (By @email{shreeve@@uci.edu}). -@item -@code{NULL IN (...)} @code{0} ǤϤʤ @code{NULL} ֤ޤ - @code{null_column NOT IN (...)} @code{NULL} ͤ˥ޥåʤΤμ¤ˤޤ -@item -@code{TIME} եˡưͤΤ -@item -Changed parsing of @code{TIME} strings to be more strict. Now the -fractional second part is detected (and currently skipped). The -following formats are supported: -@table @code -@item [[DAYS] [H]H:]MM:]SS[.fraction] -@item [[[[[H]H]H]H]MM]SS[.fraction] -@end table -@item -Detect (and ignore) second fraction part from @code{DATETIME}. -@item -@code{LOW_PRIORITY} ° @code{LOAD DATA INFILE} ɲá -@item -ǥեȤΥǥå̾򡢥եɤ̾Ʊˤ -@item -ǥեȤ³ 100 ѹ -@item -@code{LOAD DATA INFILE} ˡ礭ʥХåեѤ褦ˤ -@item -@code{DECIMAL(x,y)} ANSI SQL ˽äư褦ˤʤä -@item -Added aggregate UDF functions. Thanks to Andreas F. Bobak -@email{bobak@@relog.ch} for this! -@item -@code{LAST_INSERT_ID()} is now updated for @code{INSERT INTO ... SELECT}. -@item -Some small changes to the join table optimizer to make some joins faster. -@item -@code{SELECT DISTINCT} ®ʤä - @code{MyISAM} ο @code{UNIQUE} Ѥޤ -@strong{MySQL} 3.22 Ȱİ㤦ϡ @code{DISTINCT} νϤ -ȤʤȤǤ -@item -Ƥ C 饤 API ͭ饤֥˺뤿ᡢ -ޥؿˤʤޤ Τᡢ @code{mysql_num_fields()} -@code{MYSQL} ȤȤƥǤ @code{mysql_field_count()} -ѤʤƤϤʤޤ -@item -@code{LIBWRAP} ɲ; Patch by Henning P . Schmiedehausen. -@item -Don't allow @code{AUTO_INCREMENT} for other than numerical columns. -@item -@code{AUTO_INCREMENT} λѤϡեɤưŪ -@code{NOT NULL} ˤޤ -@item -Show @code{NULL} as the default value for AUTO_INCREMENT columns. -@item -@code{SQL_BIG_RESULT} ɲ; @code{SQL_SMALL_RESULT} ǥեȤˤʤޤ -@item -Added a shared library RPM. This enchancement was contributed by David -Fox (dsfox@@cogsci.ucsd.edu). -@item -@code{--enable-large-files/--disable-large-files} å @code{configure} -ɲá See @file{configure.in} for some systems where this is -automatically turned off because of broken implementations. -@item -@code{readline} 4.0 ˥åץ졼 -@item - @code{CREATE TABLE} ץ @code{PACK_KEYS} @code{CHECKSUM}. -@item -@code{mysqld} ץ @code{--default-table-type} ɲá -@end itemize - -@node News-3.22.x, News-3.21.x, News-3.23.x, News -@appendixsec Changes in release 3.22.x - -3.22 Ϥ᤯ʥɤοǽޤƤޤ -ѹ 3.21 ˹ԤʤΤϡ3.21 ΰ٤ݤĤˤϤȤƤ¿ѹɬפȤ뤫Ǥ -ѹϥ᥸㡼СѹǤϤʤΤǡñ˾㳲ʤ 3.22 ˥åץ졼ɤǤޤ -@xref{Upgrading-from-3.21}. - -3.22 Ͽ @code{DBD-mysql} (1.20xx) ɥ饤СΤߤ򿷤³ץȥФƻѤޤ - -@menu -* News-3.22.35:: Changes in release 3.22.35 -* News-3.22.34:: Changes in release 3.22.34 -* News-3.22.33:: Changes in release 3.22.33 -* News-3.22.32:: Changes in release 3.22.32 -* News-3.22.31:: Changes in release 3.22.31 -* News-3.22.30:: Changes in release 3.22.30 -* News-3.22.29:: Changes in release 3.22.29 -* News-3.22.28:: Changes in release 3.22.28 -* News-3.22.27:: Changes in release 3.22.27 -* News-3.22.26:: Changes in release 3.22.26 -* News-3.22.25:: Changes in release 3.22.25 -* News-3.22.24:: Changes in release 3.22.24 -* News-3.22.23:: Changes in release 3.22.23 -* News-3.22.22:: Changes in release 3.22.22 -* News-3.22.21:: Changes in release 3.22.21 -* News-3.22.20:: Changes in release 3.22.20 -* News-3.22.19:: Changes in release 3.22.19 -* News-3.22.18:: Changes in release 3.22.18 -* News-3.22.17:: Changes in release 3.22.17 -* News-3.22.16:: Changes in release 3.22.16 -* News-3.22.15:: Changes in release 3.22.15 -* News-3.22.14:: Changes in release 3.22.14 -* News-3.22.13:: Changes in release 3.22.13 -* News-3.22.12:: Changes in release 3.22.12 -* News-3.22.11:: Changes in release 3.22.11 -* News-3.22.10:: Changes in release 3.22.10 -* News-3.22.9:: Changes in release 3.22.9 -* News-3.22.8:: Changes in release 3.22.8 -* News-3.22.7:: Changes in release 3.22.7 -* News-3.22.6:: Changes in release 3.22.6 -* News-3.22.5:: Changes in release 3.22.5 -* News-3.22.4:: Changes in release 3.22.4 -* News-3.22.3:: Changes in release 3.22.3 -* News-3.22.2:: Changes in release 3.22.2 -* News-3.22.1:: Changes in release 3.22.1 -* News-3.22.0:: Changes in release 3.22.0 -@end menu - -@node News-3.22.35, News-3.22.34, News-3.22.x, News-3.22.x -@appendixsubsec Changes in release 3.22.35 -@itemize @bullet -@item -Fixed problem with @code{STD()}. -@item -Merged changes from the newest @code{ISAM} library from 3.23. -@item -Fixed problem with @code{INSERT DELAYED}. -@item -Fixed a bug core dump when using a @code{LEFT JOIN}/@code{STRAIGHT_JOIN} -on a table with only one row. -@end itemize - -@node News-3.22.34, News-3.22.33, News-3.22.35, News-3.22.x -@appendixsubsec Changes in release 3.22.34 -@itemize @bullet -@item -Fixed problem with @code{GROUP BY} on @code{TINYBLOB} columns; This -caused bugzilla to not show rows in some queries. -@item -Had to do total recompile of the Windows binary version as VC++ didn't -compile all relevant files for 3.22.33 :( -@end itemize - -@node News-3.22.33, News-3.22.32, News-3.22.34, News-3.22.x -@appendixsubsec Changes in release 3.22.33 -@itemize @bullet -@item -Fixed problems in windows when locking tables with @code{LOCK TABLE} -@item -Quicker kill of @code{SELECT DISTINCT} queries. -@end itemize - -@node News-3.22.32, News-3.22.31, News-3.22.33, News-3.22.x -@appendixsubsec Changes in release 3.22.32 -@itemize @bullet -@item -ͤ timestamps ¸ݤ -@item -Fix problem with timezones that have half hour offsets. -@item -@code{mysqlhotcopy} - @strong{MySQL} ǡ١򥳥ԡ -ġ. By Tim Bunce. -@item -@code{mysqlaccess} ʤä. Thanks to Steve Harvey for this. -@item -Fixed security problem in the protocol regarding password checking. -@item -Fixed problem that affected queries that did arithmetic on @code{GROUP} functions. -@item -Fixed a bug in the @code{ISAM} code when deleting rows on tables with -packed indexes. -@end itemize - -@node News-3.22.31, News-3.22.30, News-3.22.32, News-3.22.x -@appendixsubsec Changes in release 3.22.31 - -@itemize @bullet -@item -Win32 ǤΤĤξʥХ -@end itemize - - -@node News-3.22.30, News-3.22.29, News-3.22.31, News-3.22.x -@appendixsubsec Changes in release 3.22.30 - -@itemize @bullet -@item -Fixed optimizer problem on @code{SELECT} when using many overlapping indexes. -@item -Disabled floating point exceptions for FreeBSD to fix core dump when -doing @code{SELECT floor(pow(2,63))}. -@item -Added print of default arguments options to all clients. -@item -@code{WITH GRANT OPTION} ץ̿ŪʥХ. -@item -Fixed non-critical Y2K problem when writing short date to log files. -@end itemize - -@node News-3.22.29, News-3.22.28, News-3.22.30, News-3.22.x -@appendixsubsec Changes in release 3.22.29 - -@itemize @bullet -@item -Upgraded the configure and include files to match the latest 3.23 version. -This should increase portability and make it easier to build shared libraries. -@item -NetBSD Ѥκǿ mit-pthread Υѥåɲá -@item -ॾ < GMT - 11 ξ -@item -@code{NISAM} Υѥå줿κΥХ -@item -Fixed problem that could cause @strong{MySQL} to touch freed memory when -doing very complicated @code{GROUP BY} queries. -@item -Fixed core dump if you got a crashed table where an @code{ENUM} field value -was too big. -@item -Added @code{mysqlshutdown.exe} and @code{mysqlwatch.exe} to the Windows -distribution. -@item -Ф @code{ORDER BY} ԤäȤ -@item -Fixed that @code{INSERT DELAYED} doesn't update timestamps that are given. - -@end itemize - -@node News-3.22.28, News-3.22.27, News-3.22.29, News-3.22.x -@appendixsubsec Changes in release 3.22.28 - -@itemize @bullet -@item -Fixed problem with @code{LEFT JOIN} and @code{COUNT()} on a column which -was declared @code{NULL} + and it had a @code{DEFAULT} value. -@item -@code{CONCAT()} 򤢤 @code{WHERE} ǻѤݤ˥פ -@item -Fixed problem with @code{AVG()} and @code{STD()} with @code{NULL} values. -@end itemize - -@node News-3.22.27, News-3.22.26, News-3.22.28, News-3.22.x -@appendixsubsec Changes in release 3.22.27 - -@itemize @bullet -@item -@file{my_ctype.h} Ρ¾Υ饯åȤΥץȥפ -@item -configure Ρե륷ƥ򸡽Фʬ -@item -礭BLOBեɤ򥽡ȤȤΥХ -@item -@code{ROUND()} will now work on Win32. -@end itemize - -@node News-3.22.26, News-3.22.25, News-3.22.27, News-3.22.x -@appendixsubsec Changes in release 3.22.26 - -@itemize @bullet -@item - @code{BLOB/TEXT} եɤ @code{REVERSE()} ݤ˥פΤ -@item -@code{/*! */} Сֹ ĥ -@item -Changed @code{SUBSTRING(text FROM pos)} to conform to ANSI SQL. (Before this -construct returned the rightmost 'pos' characters). -@item -Fixed problem with @code{LOCK TABLES} combined with @code{DELETE FROM table} -@item -@code{INSERT ... SELECT} @code{SQL_BIG_TABLES} ѤƤʤäΤ -@item -@code{SET SQL_LOW_PRIORITY_UPDATES=#} ưƤʤä -@item -Ĥ @code{GRANT ... IDENTIFIED BY} ѹƤľ˥ѥɤ -ȿǤʤäΤ -@item -ʲκŬΥХ -@code{SELECT * FROM table_name WHERE key_part1 >= const AND (key_part2 = const OR key_part2 = const)} -@item -Fixed bug in compression key handling in ISAM. -@end itemize - -@node News-3.22.25, News-3.22.24, News-3.22.26, News-3.22.x -@appendixsubsec Changes in release 3.22.25 - -@itemize @bullet -@item -󥹥ȡξ -@end itemize - -@node News-3.22.24, News-3.22.23, News-3.22.25, News-3.22.x -@appendixsubsec Changes in release 3.22.24 - -@itemize @bullet -@item -@code{DATA} ͽǤʤʤä -@item -ä쥳ɤʤơ֥κŬΥХ -@item -@code{LOCK TABLES table_name READ; FLUSH TABLES;} ѤݤΥХ -@item -HP-UX ΥѥåŬѡ -@item -@code{isamchk} Win32 ư褦ˤʤä -@item -Changed @file{configure} to not use big file handling on Linux as this -crashes some RedHat 6.0 systems -@end itemize - -@node News-3.22.23, News-3.22.22, News-3.22.24, News-3.22.x -@appendixsubsec Changes in release 3.22.23 - -@itemize @bullet -@item -Autoconf 2.13, Automake 1.4, @code{libtool} 1.3.2 Ѥ褦˥åץ졼ɡ -@item -Better support for SCO in @code{configure}. -@item -Added option @code{--defaults-file=###} to option file handling to force use -of only one specific option file. -@item -@code{MySQL} 3.23 Υɤ̵뤹褦 -@code{CREATE} ʸĥ -@item -@code{LOCK TABLES} ǥåƤơ֥ @code{INSERT DELAYED} -ѤݤΡǥåɥå -@item -¾Υåɤ˥åƤơ֥ @code{DROP TABLE} Ѥݤ - -@item -@code{GRANT/REVOKE} ޥɤ update log ɲá -@item -顼ܤ򸡽Ф褦 @code{isamchk} -@item -@code{NATURAL LEFT JOIN} ΥХ -@end itemize - -@node News-3.22.22, News-3.22.21, News-3.22.23, News-3.22.x -@appendixsubsec Changes in release 3.22.22 - -@itemize @bullet -@item -@code{mysql_init()} θľ @code{mysql_close()} ɤȤ -(C API) -@item -Better client error message when you can't open socket. -@item -delayed_insert åɤǤʤäȤ - @code{delayed_insert_thread} ɽ -@item - @code{CONCAT()} ΰ¿ΥХ -@item -DEC 3.2 SCO Υѥåɲá -@item -NT ΥӥȤ @strong{MySQL} 򥤥󥹥ȡ뤷ݤ -ѥ -@item -@strong{MySQL}-Win32 VC++ 6.0 ǥѥ뤵褦ˤʤä -(VC++ 5.0 Τ) -@item -@strong{MySQL}-Win32 ο󥹥ȡ顼 -@end itemize - -@node News-3.22.21, News-3.22.20, News-3.22.22, News-3.22.x -@appendixsubsec Changes in release 3.22.21 - -@itemize @bullet -@item -ơ֥뤬¾Υåɤ˥å줿ȤΡ@code{DELETE FROM TABLE} - -@item -Fixed bug in @code{LEFT JOIN} involving empty tables. -@item -@code{mysql.db} եɤ @code{char(32)} @code{char(60)} ѹ -@item -@code{MODIFY} @code{DELAYED} ͽǤʤʤä -@item - @code{TIME} եɤˤ褦ȤȤΥХ -@item -@code{GRANT} ޥɤǿ @strong{MySQL} 桼Ͽ -@code{Host '..' is not allowed to connect to this MySQL server} Ȥʤ -@item -Linux @code{TCP_NODELAY} Ѥ褦ѹ ( TCP/IP ³®ޤ) -@end itemize - -@node News-3.22.20, News-3.22.19, News-3.22.21, News-3.22.x -@appendixsubsec Changes in release 3.22.20 - -@itemize @bullet -@item -Fixed @code{STD()} for big tables when result should be 0. -@item -ĤOS update log ԤƤʤäΤ -@item -@code{INSERT DELAYED} had some garbage at end in the update log. -@end itemize - -@node News-3.22.19, News-3.22.18, News-3.22.20, News-3.22.x -@appendixsubsec Changes in release 3.22.19 - -@itemize @bullet -@item -@code{mysql_install_db} ΥХ (from 3.22.17). -@item -ǥեȤΥå 8M ѹ -@item -@code{BLOB} եɤǰơ֥뤬ɬפȤ륯 -@end itemize - -@node News-3.22.18, News-3.22.17, News-3.22.19, News-3.22.x -@appendixsubsec Changes in release 3.22.18 - -@itemize @bullet -@item -Linuxǡ3.22.17̿Ūν @code{shutdown} 塢Ƥ -åɤμ¤˻ʤʤä -@item -@code{-O flush-time=#} ץ @code{mysqld} ɲá This is mostly -useful on Win32 and tells how often @strong{MySQL} should close all -unused tables and flush all updated tables to disk. -@item -@code{VARCHAR} եɤ @code{CHAR} Ӥݤ˥Ū -ѤƤʤäΤ -@end itemize - -@node News-3.22.17, News-3.22.16, News-3.22.18, News-3.22.x -@appendixsubsec Changes in release 3.22.17 - -@itemize @bullet -@item -@code{--log-update} ѤȤȥǥեȤΥǡ١ꤷʤ -³ȤΥפ -@item -Ĥ @code{configure} Ȱܿ -@item -Using @code{LEFT JOIN} on tables that had circular dependencies caused -@code{mysqld} to hang forever. -@end itemize - -@node News-3.22.16, News-3.22.15, News-3.22.17, News-3.22.x -@appendixsubsec Changes in release 3.22.16 - -@itemize @bullet -@item -@code{mysqladmin processlist} could kill the server if a new user logged in. -@item -@code{DELETE FROM table_name WHERE key_column=column_name} -ޥåԤ1Ԥ⸫ĤʤΤ -@item -@code{DATE_ADD(column,...)} ưʤΤ -@item -@code{INSERT DELAYED} could deadlock with status 'upgrading lock' -@item -2ʸʾΥȤѤǤ褦ˡ@code{ENCRYPT()} ĥ -@item -@code{longlong2str} ϰ꤫ʤ®ʤä@code{Intel x86} Ѥ -ΥɤϺŬ줿֥ǽľ -@item -@code{ALTER TABLE} @code{MODIFY} ɤɲ -@end itemize - -@node News-3.22.15, News-3.22.14, News-3.22.16, News-3.22.x -@appendixsubsec Changes in release 3.22.15 - -@itemize @bullet -@item -@code{GRANT} @code{IDENTIFIED BY} ȶ˻Ѥݡ¾󤬥եå夵ޤ -ͭˤʤʤ -@item -Name change of some variables in @code{SHOW STATUS}. -@item -Fixed problem with @code{ORDER BY} with 'only index' optimization when there -were multiple key definitions for a used column. -@item -@code{DATE} and @code{DATETIME} columns are now up to 5 times faster than -before. -@item -@code{INSERT DELAYED} can be used to let the client do other things while the -server inserts rows into a table. -@item -⤷2Ĥΰ㤦ǡ١Υơ֥Ѥ硢 -@code{LEFT JOIN USING (col1,col2)} ưʤä -@item -@code{LOAD DATA LOCAL INFILE} ե뤬ʤͳ UNIX Ǥưʤä -@item -ȤƤû(<4Х)ʤ @code{VARCHAR}/@code{BLOB} Ǥν -error 127 ιԤõ˵ǽä -@item -Updating @code{BLOB/TEXT} through formulas didn't work for short (< 256 char) -strings. -@item -ۥȾ @code{GRANT} ¹Ԥ硢ΥۥȤκǽΥͥ -@code{mysqld} ̲ǽä -@item -ꥢ̾Ʊ̾ @code{ORDER BY} ǻѤΥХ -name as an alias. -@item -Added @code{BENCHMARK(loop_count,expression)} function to time expressions. -@end itemize - -@node News-3.22.14, News-3.22.13, News-3.22.15, News-3.22.x -@appendixsubsec Changes in release 3.22.14 - -@itemize @bullet -@item -륹ץȤεưΤˡ@code{mysqld} ΰʤĤ -@item -Setting a @code{TIMESTAMP} column to @code{NULL} didn't record the timestamp -value in the update log. -@item -Fixed lock handler bug when one did -@code{INSERT INTO TABLE ... SELECT ... GROUP BY}. -@item -Added a patch for @code{localtime_r()} on Win32 so that it will not crash -anymore if your date is > 2039, but instead will return a time of all zero. -@item -Names for -user-defined functions are no longer case sensitive. -@item -Added escape of @code{^Z} (ASCII 26) to @code{\Z} as @code{^Z} doesn't -work with pipes on Win32. -@item - @strong{MySQL} ꡼Τˡ@code{mysql_fix_privileges} ϡ -UDF ΥݡȤΤˡܤ @code{mysql.func} ɲä롣 -( type enum ('function','aggregate') NOT NULL ɲä줿 ) -@end itemize - -@node News-3.22.13, News-3.22.12, News-3.22.14, News-3.22.x -@appendixsubsec Changes in release 3.22.13 - -@itemize @bullet -@item -Saving @code{NOW()}, @code{CURDATE()} or @code{CURTIME()} directly in a -column didn't work. -@item -@code{WHERE} ᤬̵硢@code{SELECT COUNT(*) ... LEFT JOIN ...} ưʤä -@item -UnixWare 7.0.x @strong{MySQL} 򥳥եǤ褦 @file{config.guess} 򹹿 -UnixWare 7.0.x. -@item -Changed the implementation of @code{pthread_cond()} on the Win32 version. -@code{get_lock()} now correctly times out on Win32! -@end itemize - -@node News-3.22.12, News-3.22.11, News-3.22.13, News-3.22.x -@appendixsubsec Changes in release 3.22.12 - -@itemize @bullet -@item -@code{WHERE} @code{DATE_ADD()} @code{DATE_SUB()} Ѥݤ -@item -@code{GRANT ... TO user IDENTIFIED BY 'password'} ʸǥѥɤ򥻥åȤǤ褦ˤ -@item -¿Υơ֥ @code{SELECT} @code{GRANT} ǧݤΥХ -@item -RPM ۤǤ @code{mysql_fix_privilege_tables} եɲá -ϥ饤ȥѥå˴ޤᡢǥեȤǤϵưʤ -@item -@code{SQL_SMALL_RESULT} ץ @code{SELECT} ɲá -϶Ū®ơ֥Ѥ롣 -̤Ȥ狼äƤ˻Ѥͭ -@item -ĤʤƤ¿ѤǤ褦ˤ -@item -@code{DATE_ADD}/@code{DATE_SUB()} η̡ʬʤ硢 -κˤ褦ˤ -@item -@code{GRANT} 򥱡¸ӤƤΤ -@item -빽ʸȤ߹碌 @code{ALTER TABLE} core ϤХ - @file{sql_list.h} ˤäΤǤ -@item -The hostname in @code{user@@hostname} can now include @samp{.} and @samp{-} -without quotes in the context of the @code{GRANT}, @code{REVOKE} and -@code{SET PASSWORD FOR ...} statements. -@item -礭ʰեɬפȤơ֥ؤ @code{isamchk} -@end itemize - -@node News-3.22.11, News-3.22.10, News-3.22.12, News-3.22.x -@appendixsubsec Changes in release 3.22.11 - -@itemize @bullet -@item -@strong{}: 3.22.11˥åץ졼ɤ硢ɬ @code{mysql_fix_privilege_tables} ץȤ¹ԤʤƤϤʤޤ -Ͽ @code{GRANT} ƥΤ˼¹Ԥޤ -⤷ԤʤС@code{ALTER TABLE} @code{CREATE INDEX}, @code{DROP INDEX} -¹Ԥ褦Ȥ @code{Access denied} ˤʤޤ -@item -ơ֥롢ऴȤ˥桼ΥФƵĤݤǤޤ -@item -@code{USER()} @code{user@@host} ֤褦ѹ -@item -¾Υ桼 @code{PASSWORD} 򥻥åȤ빽ʸѹ -@item -ޥɡ@code{FLUSH STATUS} ϤۤȤɤΥơѿ򥼥˥åȤޤ -@item -ơѿ @code{aborted_threads}, @code{aborted_connects}. -@item -ץ @code{connection_timeout} -@item -ȤΥݡ (by Pruet Boonma -@email{pruet@@ds90.intanon.nectec.or.th}). -@item -ХܸΥ顼å -@item -Configuration and portability fixes. -@item -Added option @code{SET SQL_WARNINGS=1} to get a warning count also for simple -inserts. -@item -FreeBSD ǥåȥ󤹤뤿ˡ@code{SIGQUIT} Τ @code{SIGTERM} Ѥޤ -@item -@code{mysql} ץ @code{\G} (print vertically) ɲ -@item -@code{SELECT HIGH_PRIORITY} ... killed @code{mysqld}. -@item -@code{IS NULL} on a @code{AUTO_INCREMENT} column in a @code{LEFT JOIN} didn't -work as expected. -@item -New function @code{MAKE_SET()}. -@end itemize - -@node News-3.22.10, News-3.22.9, News-3.22.11, News-3.22.x -@appendixsubsec Changes in release 3.22.10 - -@itemize @bullet -@item -mysql_install_db @strong{MySQL} Сưʤʤޤ! -mysql_install_db Ԥäˡ@code{safe_mysqld} mysqld 򳫻Ϥɬפޤ - @strong{MySQL} RPM ѥåϥС򤿤褦ˤƤޤ -@item -@code{--bootstrap} @code{mysqld} ɲá@code{mysql_install_db} ϤѤޤ -ΰ RPM ѥå @strong{MySQL} Υ󥹥ȡάޤ -@item -@code{+, - (sign and minus), *, /, %, ABS() and MOD()} Υɤ -@code{BIGINT}ǻѤδ򤷤ޤ(64 bit safe). -@item -@code{ALTER TABLE} mysqld 򥯥å夵Х -@item -ʣ̤硢@strong{MySQL}Ͼˤλݤ𤹤褦ˤʤޤ -(ΥСǤϡ@code{INSERT} λˤåФޤǤ) -@item -New syntax: @code{INSERT INTO table_name SET column=value,column=value,...} -@item -@file{.err} եΥϿˡtime stamp Ĥ褦ˤޤ -@item -@code{MYSQL_INIT_COMMAND} ץ @code{mysql_options()} ɲá -(³׵᤹˻ѤǤ) -@item -@code{MYSQL_READ_DEFAULT_FILE} @code{MYSQL_READ_DEFAULT_GROUP} - @code{mysql_options()}ɲá -@strong{MySQL} ץե뤫ʲΥѥ᡼ɤ߼롧 -@code{port}, -@code{socket}, @code{compress}, @code{password}, @code{pipe}, @code{timeout}, -@code{user}, @code{init-command}, @code{host} and @code{database} - ()ץեΥǥեȤ /etc/my.cnf , install_directory/share/mysql/my.cnf -@item -UDF ʸ @code{maybe_null} ɲ -@item -Added option @code{IGNORE} to @code{INSERT} statemants with many rows. -@item -koi8 饯򥽡Ȥ -koi8ѤƤ桼ϡ@code{CHAR} @code{VARCHAR} -ǥåˤƤơ֥Фơ@strong{ɬ} @code{isamchk -rq} ¹Ԥ뤳ȡ -@item -ץ @code{mysql_setpermission} (Luuk de Boer ) -ϻꤵ줿ǡ١ФƥĤ桼 -ñϿƤޤ -@item -Allow use of hexadecimal strings (0x...) when specifying a constant string -(like in the column separators with @code{LOAD DATA INFILE}). -@item -OS/2 ˰ܿ (thanks to Antony T. Curtis @email{antony.curtis@@olcs.net}). -@item -@code{SHOW STATUS} Ǥѿ䤷ޤޤ@code{SHOW VARIABLES} -褦ʽϥեޥåȤѹޤ -@item -@code{extended-status} ޥɤ @code{mysqladmin} ɲá -Ͽƥѿɽޤ -@end itemize - -@node News-3.22.9, News-3.22.8, News-3.22.10, News-3.22.x -@appendixsubsec Changes in release 3.22.9 - -@itemize @bullet -@item -@code{SET SQL_LOG_UPDATE=0} caused a lockup of the server. -@item -New SQL command: @code{FLUSH [ TABLES | HOSTS | LOGS | PRIVILEGES ] [, ...]} -@item -New SQL command: @code{KILL} @code{thread_id} . -@item -AIX, DEC OSF1 4.x @strong{MySQL} ñ˥ѥǤ褦 -include եѹ -@item -@code{ALTER TABLE} Ѥ @code{INT} 饵ξ @code{CHAR()} -ѹˤƤԶ -@item -@code{SELECT HIGH_PRIORITY} ɲá -@code{SELECT} ˤơȤ¾ @code{SELECT} ԤäƤ륹åɤäȤƤ⡢ -@code{WRITE LOCK} 뤳ȤǤޤ -@item -Moved wild_compare to string class to be able to use @code{LIKE} on -@code{BLOB}/@code{TEXT} columns with \0. -@item -Added @code{ESCAPE} option to @code{LIKE} -@item -@code{mysqladmin debug} ˤơ¿νϤ褦ˤ -@item -Win32 ˤơ@code{--flush} ץĤ @code{mysqld} ưǤ褦ˤʤޤ -ϥåץǡȤäǤ٤ƤΥơ֥ǥ˥եå夷ޤ -Υץˤ NT/Win98 ǤưȤǤޤ -@strong{ȤƤ} ٤ʤޤ -@end itemize - -@node News-3.22.8, News-3.22.7, News-3.22.9, News-3.22.x -@appendixsubsec Changes in release 3.22.8 - -@itemize @bullet -@item -Czech character sets should now work much better. You must also install -@uref{ftp://www.mysql.com/pub/mysql/Downloads/Patches/czech-3.22.8-patch}. -This patch should also be installed if you are using a character set with -uses @code{my_strcoll()}! The patch should always be safe to install (for any system), -but as this patch changes ISAM internals it's not yet in the default -distribution. -@item -@code{DATE_ADD()} and @code{DATE_SUB()} didn't work with group functions. -@item -@code{mysql} will now also try to reconnect on @code{USE DATABASE} commands. -@item -Fix problem with @code{ORDER BY} and @code{LEFT JOIN} and @code{const} tables. -@item -Fixed problem with @code{ORDER BY} if the first @code{ORDER BY} column -was a key and the rest of the @code{ORDER BY} columns wasn't part of the key. -@item -Fixed a big problem with @code{OPTIMIZE TABLE}. -@item -@strong{MySQL} clients on NT will now by default first try to connect with -named pipes and after this with TCP/IP. -@item -Fixed a problem with @code{DROP TABLE} and @code{mysqladmin shutdown} on Win32 -(a fatal bug from 3.22.6). -@item -Fixed problems with @code{TIME columns} and negative strings. -@item -Added an extra thread signal loop on shutdown to avoid some error messages -from the client. -@item -@strong{MySQL} now uses the next available number as extension for the update -log file. -@item -Added patches for UNIXWARE 7. -@end itemize - -@node News-3.22.7, News-3.22.6, News-3.22.8, News-3.22.x -@appendixsubsec Changes in release 3.22.7 - -@itemize @bullet -@item -Added @code{LIMIT} clause for the @code{DELETE} statement. -@item -You can now use the @code{/*! ... */} syntax to hide @strong{MySQL}-specific -keywords when you write portable code. @strong{MySQL} will parse the code -inside the comments as if the surrounding @code{/*!} and @code{*/} comment -characters didn't exist. -@item -@code{OPTIMIZE TABLE tbl_name} can now be used to reclaim disk space -after many deletes. Currently, this uses @code{ALTER TABLE} to re-generate -the table, but in the future it will use an integrated @code{isamchk} -for more speed. -@item -Upgraded @code{libtool} to get the configure more portable. -@item -Fixed slow @code{UPDATE} and @code{DELETE} operations when using -@code{DATETIME} or @code{DATE} keys. -@item -Changed optimizer to make it better at deciding when to do a full join -and when using keys. -@item -You can now use @code{mysqladmin proc} to display information about your own -threads. Only users with the @strong{Process_priv} privilege can get -information about all threads. -@item -Added handling of formats @code{YYMMDD}, @code{YYYYMMDD}, -@code{YYMMDDHHMMSS} for numbers when using @code{DATETIME} and -@code{TIMESTAMP} types. (Formerly these formats only worked with strings.) -@item -Added connect option @code{CLIENT_IGNORE_SPACE} to allow use of spaces -after function names and before @samp{(} (Powerbuilder requires this). -This will make all function names reserved words. -@item -Added the @code{--log-long-format} option to @code{mysqld} to enable timestamps -and INSERT_ID's in the update log. -@item -Added @code{--where} option to @code{mysqldump} (patch by Jim Faucette). -@item -The lexical analyzer now uses ``perfect hashing'' for faster parsing of SQL -statements. -@end itemize - -@node News-3.22.6, News-3.22.5, News-3.22.7, News-3.22.x -@appendixsubsec Changes in release 3.22.6 - -@itemize @bullet -@item -Faster @code{mysqldump}. -@item -For the @code{LOAD DATA INFILE} statement, you can now use the new @code{LOCAL} -keyword to read the file from the client. @code{mysqlimport} will -automatically use @code{LOCAL} when importing with the TCP/IP protocol. -@item -Fixed small optimize problem when updating keys. -@item -Changed makefiles to support shared libraries. -@item -@strong{MySQL}-NT can now use named pipes, which means that you can now use -@strong{MySQL}-NT without having to install TCP/IP. -@end itemize - -@node News-3.22.5, News-3.22.4, News-3.22.6, News-3.22.x -@appendixsubsec Changes in release 3.22.5 - -@itemize @bullet -@item -All table lock handing is changed to avoid some very subtle -deadlocks when using @code{DROP TABLE}, @code{ALTER TABLE}, @code{DELETE FROM -TABLE} and @code{mysqladmin flush-tables} under heavy usage. -Changed locking code to get better handling of locks of different types. -@item -Updated @code{DBI} to 1.00 and @code{DBD} to 1.2.0. -@item -Added a check that the error message file contains error messages suitable for -the current version of @code{mysqld}. (To avoid errors if you accidentally -try to use an old error message file.) -@item -All count structures in the client (@code{affected_rows()}, -@code{insert_id()},...) are now of type @code{BIGINT} to allow 64-bit values -to be used. -This required a minor change in the @strong{MySQL} protocol which should affect -only old clients when using tables with @code{AUTO_INCREMENT} values > 24M. -@item -The return type of @code{mysql_fetch_lengths()} has changed from @code{uint *} -to @code{ulong *}. This may give a warning for old clients but should work -on most machines. -@item -Change @code{mysys} and @code{dbug} libraries to allocate all thread variables -in one struct. This makes it easier to make a threaded @file{libmysql.dll} -library. -@item -Use the result from @code{gethostname()} (instead of @code{uname()}) when -constructing @file{.pid} file names. -@item -New better compressed server/client protocol. -@item -@code{COUNT()}, @code{STD()} and @code{AVG()} are extended to handle more than -4G rows. -@item -You can now store values in the range @code{-838:59:59} <= x <= -@code{838:59:59} in a @code{TIME} column. -@item -@strong{WARNING: INCOMPATIBLE CHANGE!!} -If you set a @code{TIME} column to too short a value, @strong{MySQL} now -assumes the value is given as: @code{[[[D ]HH:]MM:]SS} instead of -@code{HH[:MM[:SS]]}. -@item -@code{TIME_TO_SEC()} and @code{SEC_TO_TIME()} can now handle negative times -and hours up to 32767. -@item -Added new option -@code{SET OPTION SQL_LOG_UPDATE=@{0|1@}} to allow users with -the @strong{process} privilege to bypass the update log. -(Modified patch from Sergey A Mukhin @email{violet@@rosnet.net}.) -@item -Fixed fatal bug in @code{LPAD()}. -@item -Initialize line buffer in @file{mysql.cc} to make @code{BLOB} reading from -pipes safer. -@item -Added @code{-O max_connect_errors=#} option to @code{mysqld}. -Connect errors are now reset for each correct connection. -@item -Increased the default value of @code{max_allowed_packet} to @code{1M} in -@code{mysqld}. -@item -Added @code{--low-priority-updates} option to @code{mysqld}, to give -table-modifying operations (@code{INSERT}, @code{REPLACE}, @code{UPDATE}, -@code{DELETE}) lower priority than retrievals. You can now use -@code{@{INSERT | REPLACE | UPDATE | DELETE@} LOW_PRIORITY ...} You can -also use @code{SET OPTION SQL_LOW_PRIORITY_UPDATES=@{0|1@}} to change -the priority for one thread. One side effect is that @code{LOW_PRIORITY} -is now a reserved word. :( -@item -Add support for @code{INSERT INTO table ... VALUES(...),(...),(...)}, -to allow inserting multiple rows with a single statement. -@item -@code{INSERT INTO tbl_name} is now also cached when used with @code{LOCK TABLES}. -(Previously only @code{INSERT ... SELECT} and @code{LOAD DATA INFILE} were -cached.) -@item -Allow @code{GROUP BY} functions with @code{HAVING}: -@example -mysql> SELECT col FROM table GROUP BY col HAVING COUNT(*)>0; -@end example -@item -@code{mysqld} will now ignore trailing @samp{;} characters in queries. This -is to make it easier to migrate from some other SQL servers that require the -trailing @samp{;}. -@item -Fix for corrupted fixed-format output generated by @code{SELECT INTO OUTFILE}. -@item -@strong{WARNING: INCOMPATIBLE CHANGE!!} -Added Oracle @code{GREATEST()} and @code{LEAST()} functions. You must now use -these instead of the @code{MAX()} and @code{MIN()} functions to get the -largest/smallest value from a list of values. These can now handle @code{REAL}, -@code{BIGINT} and string (@code{CHAR} or @code{VARCHAR}) values. -@item -@strong{WARNING: INCOMPATIBLE CHANGE!!} -@code{DAYOFWEEK()} had offset 0 for Sunday. Changed the offset to 1. -@item -Give an error for queries that mix @code{GROUP BY} columns and fields when -there is no @code{GROUP BY} specification. -@item -Added @code{--vertical} option to @code{mysql}, for printing results in -vertical mode. -@item -Index-only optimization; some queries are now resolved using -only indexes. Until @strong{MySQL} 4.0, this works only for numeric columns. -@xref{MySQL indexes, , @strong{MySQL} indexes}. -@item -Lots of new benchmarks. -@item -A new C API chapter and lots of other improvements in the manual. -@end itemize - -@node News-3.22.4, News-3.22.3, News-3.22.5, News-3.22.x -@appendixsubsec Changes in release 3.22.4 - -@itemize @bullet -@item -Added @code{--tmpdir} option to @code{mysqld}, for specifying the location -of the temporary file directory. -@item -@strong{MySQL} now automatically changes a query from an ODBC client: -@example -SELECT ... FROM table WHERE auto_increment_column IS NULL -@end example -to: -@example -SELECT ... FROM table WHERE auto_increment_column == LAST_INSERT_ID() -@end example -This allows some ODBC programs (Delphi, Access) to retrieve the newly -inserted row to fetch the @code{AUTO_INCREMENT} id. -@item -@code{DROP TABLE} now waits for all users to free a table before deleting it. -@item -Fixed small memory leak in the new connect protocol. -@item -New functions @code{BIN()}, @code{OCT()}, @code{HEX()} and @code{CONV()} for -converting between different number bases. -@item -Added function @code{SUBSTRING()} with 2 arguments. -@item -If you created a table with a record length smaller than 5, you couldn't -delete rows from the table. -@item -Added optimization to remove const reference tables from @code{ORDER BY} and -@code{GROUP BY}. -@item -@code{mysqld} now automatically disables system locking on Linux and Win32, -and for systems that use MIT-pthreads. You can force the use of locking -with the @code{--enable-locking} option. -@item -Added @code{--console} option to @code{mysqld}, to force a console window -(for error messages) when using Win32. -@item -Fixed table locks for Win32. -@item -Allow @samp{$} in identifiers. -@item -Changed name of user-specific configuration file from @file{my.cnf} to -@file{.my.cnf} (Unix only). -@item -Added @code{DATE_ADD()} and @code{DATE_SUB()} functions. -@end itemize - -@node News-3.22.3, News-3.22.2, News-3.22.4, News-3.22.x -@appendixsubsec Changes in release 3.22.3 - -@itemize @bullet -@item -Fixed a lock problem (bug in @strong{MySQL} 3.22.1) when closing temporary tables. -@item -Added missing @code{mysql_ping()} to the client library. -@item -Added @code{--compress} option to all @strong{MySQL} clients. -@item -Changed @code{byte} to @code{char} in @file{mysql.h} and @file{mysql_com.h}. -@end itemize - -@node News-3.22.2, News-3.22.1, News-3.22.3, News-3.22.x -@appendixsubsec Changes in release 3.22.2 - -@itemize @bullet -@item -Searching on multiple constant keys that matched more than 30% of the rows -didn't always use the best possible key. -@item -New functions @code{<<}, @code{>>}, @code{RPAD()} and @code{LPAD()}. -@item -You can now save default options (like passwords) in a configuration file -(@file{my.cnf}). -@item -Lots of small changes to get @code{ORDER BY} to work when no records are found -when using fields that are not in @code{GROUP BY} (@strong{MySQL} extension). -@item -Added @code{--chroot} option to @code{mysqld}, to start @code{mysqld} in -a chroot environment (by Nikki Chumakov @email{nikkic@@cityline.ru}). -@item -Trailing spaces are now ignored when comparing case-sensitive strings; -this should fix some problems with ODBC and flag 512! -@item -Fixed a core-dump bug in the range optimizer. -@item -Added @code{--one-thread} option to @code{mysqld}, for debugging with -LinuxThreads (or @code{glibc}). (This replaces the @code{-T32} flag) -@item -Added @code{DROP TABLE IF EXISTS} to prevent an error from occurring if the -table doesn't exist. -@item -@code{IF} and @code{EXISTS} are now reserved words (they would have to -be sooner or later). -@item -Added lots of new options to @code{mysqldump}. -@item -Server error messages are now in @file{mysqld_error.h}. -@item -The server/client protocol now supports compression. -@item -All bug fixes from @strong{MySQL} 3.21.32. -@end itemize - -@node News-3.22.1, News-3.22.0, News-3.22.2, News-3.22.x -@appendixsubsec Changes in release 3.22.1 - -@itemize @bullet -@item -Added new C API function @code{mysql_ping()}. -@item -Added new API functions @code{mysql_init()} and @code{mysql_options()}. -You now MUST call @code{mysql_init()} before you call -@code{mysql_real_connect()}. -You don't have to call @code{mysql_init()} if you only use -@code{mysql_connect()}. -@item -Added @code{mysql_options(...,MYSQL_OPT_CONNECT_TIMEOUT,...)} so you can set a -timeout for connecting to a server. -@item -Added @code{--timeout} option to @code{mysqladmin}, as a test of -@code{mysql_options()}. -@item -Added @code{AFTER column} and @code{FIRST} options to -@code{ALTER TABLE ... ADD columns}. -This makes it possible to add a new column at some specific location -within a row in an existing table. -@item -@code{WEEK()} now takes an optional argument to allow handling of weeks when -the week starts on Monday (some European countries). By default, -@code{WEEK()} assumes the week starts on Sunday. -@item -@code{TIME} columns weren't stored properly (bug in @strong{MySQL} 3.22.0). -@item -@code{UPDATE} now returns information about how many rows were -matched and updated, and how many ``warnings'' occurred when doing the update. -@item -Fixed incorrect result from @code{FORMAT(-100,2)}. -@item -@code{ENUM} and @code{SET} columns were compared in binary (case-sensitive) -fashion; changed to be case insensitive. -@end itemize - -@node News-3.22.0, , News-3.22.1, News-3.22.x -@appendixsubsec Changes in release 3.22.0 - -@itemize @bullet -@item -New (backward compatible) connect protocol that allows you to -specify the database to use when connecting, to get much faster -connections to a specific database. - -The @code{mysql_real_connect()} call is changed to: - -@example -mysql_real_connect(MYSQL *mysql, const char *host, const char *user, - const char *passwd, const char *db, uint port, - const char *unix_socket, uint client_flag) -@end example -@item -Each connection is handled by its own thread, rather than by the -master @code{accept()} thread. This fixes permanently the telnet bug -that was a topic on the mail list some time ago. -@item -All TCP/IP connections are now checked with backward resolution of -the hostname to get better security. @code{mysqld} now has a local hostname -resolver cache so connections should actually be faster than before, -even with this feature. -@item -A site automatically will be blocked from future connections if someone -repeatedly connects with an ``improper header'' (like when one uses telnet). -@item -You can now refer to tables in different databases with references of the form -@code{tbl_name@@db_name} or @code{db_name.tbl_name}. This makes it possible to -give a user read access to some tables and write access to others simply by -keeping them in different databases! -@item -Added @code{--user} option to @code{mysqld}, to allow it to run -as another Unix user (if it is started as the Unix @code{root} user). -@item -Added caching of users and access rights (for faster access rights checking) -@item -Normal users (not anonymous ones) can change their password with -@code{mysqladmin password 'new_password'}. This uses encrypted passwords -that are not logged in the normal @strong{MySQL} log! -@item -All important string functions are now coded in assembler for x86 Linux -machines. This gives a speedup of 10% in many cases. -@item -For tables that have many columns, the column names are now hashed for -much faster column name lookup (this will speed up some benchmark -tests a lot!) -@item -Some benchmarks are changed to get better individual timing. -(Some loops were so short that a specific test took < 2 seconds. The -loops have been changed to take about 20 seconds to make it easier -to compare different databases. A test that took 1-2 seconds before -now takes 11-24 seconds, which is much better) -@item -Re-arranged @code{SELECT} code to handle some very specific queries -involving group functions (like @code{COUNT(*)}) without a @code{GROUP BY} but -with @code{HAVING}. The following now works: -@example -mysql> SELECT count(*) as C FROM table HAVING C > 1; -@end example -@item -Changed the protocol for field functions to be faster and avoid some -calls to @code{malloc()}. -@item -Added @code{-T32} option to @code{mysqld}, for running all queries under the -main thread. This makes it possible to debug @code{mysqld} under Linux with -@code{gdb}! -@item -Added optimization of @code{not_null_column IS NULL} (needed for some Access -queries). -@item -Allow @code{STRAIGHT_JOIN} to be used between two tables to force the optimizer -to join them in a specific order. -@item -String functions now return @code{VARCHAR} rather than @code{CHAR} and -the column type is now @code{VARCHAR} for fields saved as @code{VARCHAR}. -This should make the @strong{MyODBC} driver better, but may break some old -@strong{MySQL} clients that don't handle @code{FIELD_TYPE_VARCHAR} the same -way as @code{FIELD_TYPE_CHAR}. -@item -@code{CREATE INDEX} and @code{DROP INDEX} are now implemented through -@code{ALTER TABLE}. -@code{CREATE TABLE} is still the recommended (fast) way to create indexes. -@item -Added @code{--set-variable} option @code{wait_timeout} to @code{mysqld}. -@item -Added time column to @code{mysqladmin processlist} to show how long a query -has taken or how long a thread has slept. -@item -Added lots of new variables to @code{show variables} and some new to -@code{show status}. -@item -Added new type @code{YEAR}. @code{YEAR} is stored in 1 byte with allowable -values of 0, and 1901 to 2155. -@item -Added new @code{DATE} type that is stored in 3 bytes rather than 4 bytes. -All new tables are created with the new date type if you don't use the -@code{--old-protocol} option to @code{mysqld}. -@item -Fixed bug in record caches; for some queries, you could get -@code{Error from table handler: #} on some operating systems. -@item -Added @code{--enable-assembler} option to @code{configure}, for x86 machines -(tested on Linux + @code{gcc}). This will enable assembler functions for the -most important string functions for more speed! -@end itemize - -@node News-3.21.x, News-3.20.x, News-3.22.x, News -@appendixsec Changes in release 3.21.x - -@menu -* News-3.21.33:: Changes in release 3.21.33 -* News-3.21.32:: Changes in release 3.21.32 -* News-3.21.31:: Changes in release 3.21.31 -* News-3.21.30:: Changes in release 3.21.30 -* News-3.21.29:: Changes in release 3.21.29 -* News-3.21.28:: Changes in release 3.21.28 -* News-3.21.27:: Changes in release 3.21.27 -* News-3.21.26:: Changes in release 3.21.26 -* News-3.21.25:: Changes in release 3.21.25 -* News-3.21.24:: Changes in release 3.21.24 -* News-3.21.23:: Changes in release 3.21.23 -* News-3.21.22:: Changes in release 3.21.22 -* News-3.21.21a:: Changes in release 3.21.21a -* News-3.21.21:: Changes in release 3.21.21 -* News-3.21.20:: Changes in release 3.21.20 -* News-3.21.19:: Changes in release 3.21.19 -* News-3.21.18:: Changes in release 3.21.18 -* News-3.21.17:: Changes in release 3.21.17 -* News-3.21.16:: Changes in release 3.21.16 -* News-3.21.15:: Changes in release 3.21.15 -* News-3.21.14b:: Changes in release 3.21.14b -* News-3.21.14a:: Changes in release 3.21.14a -* News-3.21.13:: Changes in release 3.21.13 -* News-3.21.12:: Changes in release 3.21.12 -* News-3.21.11:: Changes in release 3.21.11 -* News-3.21.10:: Changes in release 3.21.10 -* News-3.21.9:: Changes in release 3.21.9 -* News-3.21.8:: Changes in release 3.21.8 -* News-3.21.7:: Changes in release 3.21.7 -* News-3.21.6:: Changes in release 3.21.6 -* News-3.21.5:: Changes in release 3.21.5 -* News-3.21.4:: Changes in release 3.21.4 -* News-3.21.3:: Changes in release 3.21.3 -* News-3.21.2:: Changes in release 3.21.2 -* News-3.21.0:: Changes in release 3.21.0 -@end menu - -@node News-3.21.33, News-3.21.32, News-3.21.x, News-3.21.x -@appendixsubsec Changes in release 3.21.33 - -@itemize @bullet -@item -Fixed problem when sending @code{SIGHUP} to @code{mysqld}; -@code{mysqld} core dumped when starting from boot on some systems. -@item -Fixed problem with losing a little memory for some connections. -@item -@code{DELETE FROM tbl_name} without a @code{WHERE} condition is now done the -long way when you use @code{LOCK TABLES} or if the table is in use, to -avoid race conditions. -@item -@code{INSERT INTO TABLE (timestamp_column) VALUES (NULL);} didn't set timestamp. -@end itemize - -@node News-3.21.32, News-3.21.31, News-3.21.33, News-3.21.x -@appendixsubsec Changes in release 3.21.32 - -@itemize @bullet -@item -Fixed some possible race conditions when doing many reopen/close on the same -tables under heavy load! This can happen if you execute @code{mysqladmin -refresh} often. This could in some very rare cases corrupt the header of the -index file and cause error 126 or 138. - -@item -Fixed fatal bug in @code{refresh()} when running with the @code{--skip-locking} -option. -There was a ``very small'' time gap after a @code{mysqladmin refresh} when -a table could be corrupted if one thread updated a table while another -thread did @code{mysqladmin refresh} and another thread started a new update -ont the same table before the first thread had finished. -A refresh (or @code{--flush-tables}) will now not return until all used tables -are closed! -@item -@code{SELECT DISTINCT} with a @code{WHERE} clause that didn't match any rows -returned a row in some contexts (bug only in 3.21.31). -@item -@code{GROUP BY} + @code{ORDER BY} returned one empty row when no rows where -found. -@item -Fixed a bug in the range optimizer that wrote -@code{Use_count: Wrong count for ...} in the error log file. -@end itemize - -@node News-3.21.31, News-3.21.30, News-3.21.32, News-3.21.x -@appendixsubsec Changes in release 3.21.31 -@itemize @bullet -@item -Fixed a sign extension problem for the @code{TINYINT} type on Irix. -@item -Fixed problem with @code{LEFT("constant_string",function)}. -@item -Fixed problem with @code{FIND_IN_SET()}. -@item -@code{LEFT JOIN} core dumped if the second table is used with a constant -@code{WHERE/ON} expression that uniquely identifies one record. -@item -Fixed problems with @code{DATE_FORMAT()} and incorrect dates. -@code{DATE_FORMAT()} now ignores @code{'%'} to make it possible to extend -it more easily in the future. -@end itemize - -@node News-3.21.30, News-3.21.29, News-3.21.31, News-3.21.x -@appendixsubsec Changes in release 3.21.30 -@itemize @bullet -@item -@code{mysql} now returns an exit code > 0 if the query returned an error. -@item -Saving of command line history to file in @code{mysql} client. -By Tommy Larsen @email{tommy@@mix.hive.no}. -@item -Fixed problem with empty lines that were ignored in @file{mysql.cc}. -@item -Save the pid of the signal handler thread in the pid file instead -of the pid of the main thread. -@item -@email{tommy@@valley.ne.jp} ˤܸ쥭饯å(SJIS, UJIS)Υݡ. -@item -Changed @code{safe_mysqld} to redirect startup messages to -@code{'hostname'.err} instead -of @code{'hostname'.log} to reclaim file space on @code{mysqladmin refresh}. -@item -@code{ENUM} always had the first entry as default value. -@item -@code{ALTER TABLE} wrote two entries to the update log. -@item -@code{sql_acc()} now closes the @code{mysql} grant tables after a reload to -save table space and memory. -@item -Changed @code{LOAD DATA} to use less memory with tables and @code{BLOB} -columns. -@item -Sorting on a function which made a division / 0 produced a wrong set -in some cases. -@item -Fixed @code{SELECT} problem with @code{LEFT()} when using the czech character -set. -@item -Fixed problem in @code{isamchk}; it couldn't repair a packed table in a very -unusual case. -@item -@code{SELECT} statements with @code{&} or @code{|} (bit functions) failed on -columns with @code{NULL} values. -@item -When comparing a field = field, where one of the fields was a part key, -only the length of the part key was compared. -@end itemize - -@node News-3.21.29, News-3.21.28, News-3.21.30, News-3.21.x -@appendixsubsec Changes in release 3.21.29 -@itemize @bullet -@item -@code{LOCK TABLES} + @code{DELETE from tbl_name} never removed locks properly. -@item -Fixed problem when grouping on an @code{OR} function. -@item -Fixed permission problem with @code{umask()} and creating new databases. -@item -Fixed permission problem on result file with @code{SELECT ... INTO OUTFILE ...} -@item -Fixed problem in range optimizer (core dump) for a very complex query. -@item -Fixed problem when using @code{MIN(integer)} or @code{MAX(integer)} in -@code{GROUP BY}. -@item -Fixed bug on Alpha when using integer keys. (Other keys worked on Alpha). -@item -Fixed bug in @code{WEEK("XXXX-xx-01")}. -@end itemize - -@node News-3.21.28, News-3.21.27, News-3.21.29, News-3.21.x -@appendixsubsec Changes in release 3.21.28 -@itemize @bullet -@item -Fixed socket permission (clients couldn't connect to Unix socket on Linux). -@item -Fixed bug in record caches; for some queries, you could get -@code{Error from table handler: #} on some operating systems. -@end itemize - -@node News-3.21.27, News-3.21.26, News-3.21.28, News-3.21.x -@appendixsubsec Changes in release 3.21.27 -@itemize @bullet -@item -Added user level lock functions @code{GET_LOCK(string,timeout)}, -@code{RELEASE_LOCK(string)}. -@item -Added @code{opened_tables} to @code{show status}. -@item -Changed connect timeout to 3 seconds to make it somewhat harder -for crackers to kill @code{mysqld} through telnet + TCP/IP. -@item -Fixed bug in range optimizer when using -@code{WHERE key_part_1 >= something AND key_part_2 <= something_else}. -@item -Changed @code{configure} for detection of FreeBSD 3.0 9803xx and above -@item -@code{WHERE} with string_column_key = constant_string didn't always find -all rows if the column had many values differing only with characters of -the same sort value (like e and @'e). -@item -Strings keys looked up with 'ref' were not compared in case-sensitive fashion. -@item -Added @code{umask()} to make log files non-readable for normal users. -@item -Ignore users with old (8-byte) password on startup if not using -@code{--old-protocol} option to @code{mysqld}. -@item -@code{SELECT} which matched all key fields returned the values in the -case of the matched values, not of the found values. (Minor problem.) -@end itemize - -@node News-3.21.26, News-3.21.25, News-3.21.27, News-3.21.x -@appendixsubsec Changes in release 3.21.26 -@itemize @bullet -@item -@code{FROM_DAYS(0)} now returns "0000-00-00". -@item -In @code{DATE_FORMAT()}, PM and AM were swapped for hours 00 and 12. -@item -Extended the default maximum key size to 256. -@item -Fixed bug when using @code{BLOB}/@code{TEXT} in @code{GROUP BY} with many -tables. -@item -An @code{ENUM} field that is not declared @code{NOT NULL} has @code{NULL} as -the default value. -(Previously, the default value was the first enumeration value.) -@item -Fixed bug in the join optimizer code when using many part keys -on the same key: @code{INDEX (Organization,Surname(35),Initials(35))}. -@item -Added some tests to the table order optimizer to get some cases with -@code{SELECT ... FROM many_tables} much faster. -@item -Added a retry loop around @code{accept()} to possibly fix some problems on some -Linux machines. -@end itemize - -@node News-3.21.25, News-3.21.24, News-3.21.26, News-3.21.x -@appendixsubsec Changes in release 3.21.25 -@itemize @bullet -@item -Changed @code{typedef 'string'} to @code{typedef 'my_string'} for better -portability. -@item -You can now kill threads that are waiting on a disk full condition. -@item -Fixed some problems with UDF functions. -@item -Added long options to @code{isamchk}. Try @code{isamchk --help}. -@item -Fixed a bug when using 8 bytes long (alpha); @code{filesort()} didn't work. -Affects @code{DISTINCT}, @code{ORDER BY} and @code{GROUP BY} on 64-bit -processors. -@end itemize - -@node News-3.21.24, News-3.21.23, News-3.21.25, News-3.21.x -@appendixsubsec Changes in release 3.21.24 -@itemize @bullet -@item -Dynamic loadable functions. Based on source from Alexis Mikhailov. -@item -You couldn't delete from a table if no one had done a @code{SELECT} on the -table. -@item -Fixed problem with range optimizer with many @code{OR} operators on key parts -inside each other. -@item -Recoded @code{MIN()} and @code{MAX()} to work properly with strings and -@code{HAVING}. -@item -Changed default umask value for new files from @code{0664} to @code{0660}. -@item -Fixed problem with @code{LEFT JOIN} and constant expressions in the @code{ON} -part. -@item -Added Italian error messages from @email{brenno@@dewinter.com}. -@item -@code{configure} now works better on OSF1 (tested on 4.0D). -@item -Added hooks to allow @code{LIKE} optimization with international character -support. -@item -Upgraded @code{DBI} to 0.93. -@end itemize - -@node News-3.21.23, News-3.21.22, News-3.21.24, News-3.21.x -@appendixsubsec Changes in release 3.21.23 -@itemize @bullet -@item -The following symbols are now reserved words: -@code{TIME}, @code{DATE}, @code{TIMESTAMP}, @code{TEXT}, @code{BIT}, -@code{ENUM}, @code{NO}, @code{ACTION}, @code{CHECK}, @code{YEAR}, -@code{MONTH}, @code{DAY}, @code{HOUR}, @code{MINUTE}, @code{SECOND}, -@code{STATUS}, @code{VARIABLES}. -@item -Setting a @code{TIMESTAMP} to @code{NULL} in @code{LOAD DATA INFILE ...} didn't -set the current time for the @code{TIMESTAMP}. -@item -Fix @code{BETWEEN} to recognize binary strings. Now @code{BETWEEN} is -case sensitive. -@item -Added @code{--skip-thread-priority} option to @code{mysqld}, for systems -where @code{mysqld}'s thread scheduling doesn't work properly (BSDI 3.1). -@item -Added ODBC functions @code{DAYNAME()} and @code{MONTHNAME()}. -@item -Added function @code{TIME_FORMAT()}. This works like @code{DATE_FORMAT()}, -but takes a time string (@code{'HH:MM:DD'}) as argument. -@item -Fixed unlikely(?) key optimizer bug when using @code{OR}s of key parts -inside @code{AND}s. -@item -Added command @code{variables} to @code{mysqladmin}. -@item -A lot of small changes to the binary releases. -@item -Fixed a bug in the new protocol from @strong{MySQL} 3.21.20. -@item -Changed @code{ALTER TABLE} to work with Win32 (Win32 can't rename open files). -Also fixed a couple of small bugs in the Win32 version. -@item -All standard @strong{MySQL} clients are now ported to @strong{MySQL}-Win32. -@item -@strong{MySQL} can now be started as a service on NT. -@end itemize - -@node News-3.21.22, News-3.21.21a, News-3.21.23, News-3.21.x -@appendixsubsec Changes in release 3.21.22 -@itemize @bullet -@item -Starting with this version, all @strong{MySQL} distributions will be -configured, compiled and tested with @code{crash-me} and the benchmarks on -the following platforms: SunOS 5.6 sun4u, SunOS 5.5.1 sun4u, SunOS 4.14 sun4c, -SunOS 5.6 i86pc, Irix 6.3 mips5k, HP-UX 10.20 hppa, AIX 4.2.1 ppc, -OSF1 V4.0 alpha, FreeBSD 2.2.2 i86pc and BSDI 3.1 i386. -@item -Fix @code{COUNT(*)} problems when the @code{WHERE} clause didn't match any -records. (Bug from 3.21.17.) -@item -Removed that @code{NULL = NULL} is true. Now you must use @code{IS NULL} -or @code{IS NOT NULL} to test whether or not a value is @code{NULL}. -(This is according to ANSI SQL but may break -old applications that are ported from @code{mSQL}.) -You can get the old behavior by compiling with @code{-DmSQL_COMPLIANT}. -@item -Fixed bug that core dumped when using many @code{LEFT OUTER JOIN} clauses. -@item -Fixed bug in @code{ORDER BY} on string formula with possible @code{NULL} values. -@item -Fixed problem in range optimizer when using <= on sub index. -@item -Added functions @code{DAYOFYEAR()}, @code{DAYOFMONTH()}, @code{MONTH()}, -@code{YEAR()}, @code{WEEK()}, @code{QUARTER()}, @code{HOUR()}, @code{MINUTE()}, -@code{SECOND()} and @code{FIND_IN_SET()}. -@item -Added command @code{SHOW VARIABLES}. -@item -Added support of ``long constant strings'' from ANSI SQL: -@example -mysql> SELECT 'first ' 'second'; -> 'first second' -@end example -@item -Upgraded mSQL-Mysql-modules to 1.1825. -@item -Upgraded @code{mysqlaccess} to 2.02. -@item -Fixed problem with Russian character set and @code{LIKE}. -@item -Ported to OpenBSD 2.1. -@item -New Dutch error messages. -@end itemize - -@node News-3.21.21a, News-3.21.21, News-3.21.22, News-3.21.x -@appendixsubsec Changes in release 3.21.21a -@itemize @bullet -@item -Configure changes for some operating systems. -@end itemize - -@node News-3.21.21, News-3.21.20, News-3.21.21a, News-3.21.x -@appendixsubsec Changes in release 3.21.21 -@itemize @bullet -@item -Fixed optimizer bug when using -@code{WHERE data_field = date_field2 AND date_field2 = constant}. -@item -Added command @code{SHOW STATUS}. -@item -Removed @file{manual.ps} from the source distribution to make it smaller. -@end itemize - -@node News-3.21.20, News-3.21.19, News-3.21.21, News-3.21.x -@appendixsubsec Changes in release 3.21.20 -@itemize @bullet -@item -Changed the maximum table name and column name lengths from 32 to 64. -@item -Aliases can now be of ``any'' length. -@item -Fixed @code{mysqladmin stat} to return the right number of queries. -@item -Changed protocol (downward compatible) to mark if a column has the -@code{AUTO_INCREMENT} attribute or is a @code{TIMESTAMP}. This is needed for -the new Java driver. -@item -Added Hebrew sorting order by Zeev Suraski. -@item -Solaris 2.6: Fixed @code{configure} bugs and increased maximum table size -from 2G to 4G. -@end itemize - -@node News-3.21.19, News-3.21.18, News-3.21.20, News-3.21.x -@appendixsubsec Changes in release 3.21.19 -@itemize @bullet -@item -Upgraded @code{DBD} to 1823. This version implements @code{mysql_use_result} in -@code{DBD-Mysql}. -@item -Benchmarks updated for empress (by Luuk). -@item -Fixed a case of slow range searching. -@item -Configure fixes (@file{Docs} directory). -@item -Added function @code{REVERSE()} (by Zeev Suraski). -@end itemize - -@node News-3.21.18, News-3.21.17, News-3.21.19, News-3.21.x -@appendixsubsec Changes in release 3.21.18 -@itemize @bullet -@item -Issue error message if client C functions are called in wrong order. -@item -Added automatic reconnect to the @file{libmysql.c} library. If a write command -fails, an automatic reconnect is done. -@item -Small sort sets no longer use temporary files. -@item -Upgraded @code{DBI} to 0.91. -@item -Fixed a couple of problems with @code{LEFT OUTER JOIN}. -@item -Added @code{CROSS JOIN} syntax. @code{CROSS} is now a reserved word. -@item -Recoded @code{yacc}/@code{bison} stack allocation to be even safer and to allow -@strong{MySQL} to handle even bigger expressions. -@item -Fixed a couple of problems with the update log. -@item -@code{ORDER BY} was slow when used with key ranges. -@end itemize - -@node News-3.21.17, News-3.21.16, News-3.21.18, News-3.21.x -@appendixsubsec Changes in release 3.21.17 -@itemize @bullet -@item -Changed documentation string of @code{--with-unix-socket-path} to avoid -confusion. -@item -Added ODBC and ANSI SQL style @code{LEFT OUTER JOIN}. -@item -The following are new reserved words: @code{LEFT}, @code{NATURAL}, -@code{USING}. -@item -The client library now uses the value of the environment variable -@code{MYSQL_HOST} as the default host if it's defined. -@item -@code{SELECT col_name, SUM(expr)} now returns @code{NULL} for @code{col_name} -when there are matching rows. -@item -Fixed problem with comparing binary strings and @code{BLOB}s with ASCII -characters over 127. -@item -Fixed lock problem: when freeing a read lock on a table with multiple -read locks, a thread waiting for a write lock would have been given the lock. -This shouldn't affect data integrity, but could possibly make @code{mysqld} -restart if one thread was reading data that another thread modified. -@item -@code{LIMIT offset,count} didn't work in @code{INSERT ... SELECT}. -@item -Optimized key block caching. This will be quicker than the old algorithm when -using bigger key caches. -@end itemize - -@node News-3.21.16, News-3.21.15, News-3.21.17, News-3.21.x -@appendixsubsec Changes in release 3.21.16 - -@itemize @bullet -@item -Added ODBC 2.0 & 3.0 functions @code{POWER()}, @code{SPACE()}, -@code{COT()}, @code{DEGREES()}, @code{RADIANS()}, @code{ROUND(2 arg)} -and @code{TRUNCATE()}. -@item -@strong{WARNING: INCOMPATIBLE CHANGE!!} @code{LOCATE()} parameters were -swapped according to ODBC standard. Fixed. -@item -Added function @code{TIME_TO_SEC()}. -@item -In some cases, default values were not used for @code{NOT NULL} fields. -@item -Timestamp wasn't always updated properly in @code{UPDATE SET ...} statements. -@item -Allow empty strings as default values for @code{BLOB} and @code{TEXT}, to -be compatible with @code{mysqldump}. -@end itemize - -@node News-3.21.15, News-3.21.14b, News-3.21.16, News-3.21.x -@appendixsubsec Changes in release 3.21.15 - -@itemize @bullet -@item -@strong{WARNING: INCOMPATIBLE CHANGE!!} @code{mysqlperl} is now from -Msql-Mysql-modules. This means that @code{connect()} now takes -@code{host}, @code{database}, @code{user}, @code{password} arguments! The old -version took @code{host}, @code{database}, @code{password}, @code{user}. -@item -Allow @code{DATE '1997-01-01'}, @code{TIME '12:10:10'} and -@code{TIMESTAMP '1997-01-01 12:10:10'} formats required by ANSI SQL. -@strong{WARNING: INCOMPATIBLE CHANGE!!} This has the unfortunate -side-effect that you no longer can have columns named @code{DATE}, @code{TIME} -or @code{TIMESTAMP}. :( Old columns can still be accessed through -@code{tablename.columnname}!) -@item -Changed Makefiles to hopefully work better with BSD systems. Also, -@file{manual.dvi} is now included in the distribution to avoid having stupid -@code{make} programs trying to rebuild it. -@item -@code{readline} library upgraded to version 2.1. -@item -A new sortorder german-1. That is a normal ISO-Latin1 with a german sort -order. -@item -Perl @code{DBI}/@code{DBD} is now included in the distribution. @code{DBI} -is now the recommended way to connect to @strong{MySQL} from Perl. -@item -New portable benchmark suite with @code{DBD}, with test results from -@code{mSQL} 2.0.3, @strong{MySQL}, PostgreSQL 6.2.1 and Solid server 2.2. -@item -@code{crash-me} is now included with the benchmarks; This is a Perl program -designed to find as many limits as possible in a SQL server. Tested with -@code{mSQL}, PostgreSQL, Solid and @strong{MySQL}. -@item -Fixed bug in range-optimizer that crashed @strong{MySQL} on some queries. -@item -Table and column name completion for @code{mysql} command line tool, by Zeev -Suraski and Andi Gutmans. -@item -Added new command @code{REPLACE} that works like @code{INSERT} but -replaces conflicting records with the new record. @code{REPLACE INTO -TABLE ... SELECT ...} works also. -@item -Added new commands @code{CREATE DATABASE db_name} and @code{DROP -DATABASE db_name}. -@item -Added @code{RENAME} option to @code{ALTER TABLE}: @code{ALTER TABLE name -RENAME AS new_name}. -@item -@code{make_binary_distribution} now includes @file{libgcc.a} in -@file{libmysqlclient.a}. This should make linking work for people who don't -have @code{gcc}. -@item -Changed @code{net_write()} to @code{my_net_write()} because of a name -conflict with Sybase. -@item -@cindex ODBC compatibility -@cindex Compatibility, with ODBC -New function @code{DAYOFWEEK()} compatible with ODBC. -@item -Stack checking and @code{bison} memory overrun checking to make @strong{MySQL} -safer with weird queries. -@end itemize - -@node News-3.21.14b, News-3.21.14a, News-3.21.15, News-3.21.x -@appendixsubsec Changes in release 3.21.14b - -@itemize @bullet -@item -Fixed a couple of small @code{configure} problems on some platforms. -@end itemize - -@node News-3.21.14a, News-3.21.13, News-3.21.14b, News-3.21.x -@appendixsubsec Changes in release 3.21.14a - -@itemize @bullet -@item -Ported to SCO Openserver 5.0.4 with FSU Pthreads. -@item -HP-UX 10.20 should work. -@item -Added new function @code{DATE_FORMAT()}. -@item -Added @code{NOT IN}. -@item -Added automatic removal of 'ODBC function conversions': @code{@{fn now() @}} -@item -Handle ODBC 2.50.3 option flags. -@item -Fixed comparison of @code{DATE} and @code{TIME} values with @code{NULL}. -@item -Changed language name from germany to german to be consistent with -the other language names. -@item -Fixed sorting problem on functions returning a @code{FLOAT}. Previously, the -values were converted to @code{INT}s before sorting. -@item -Fixed slow sorting when sorting on key field when using -@code{key_column=constant}. -@item -Sorting on calculated @code{DOUBLE} values sorted on integer results instead. -@item -@code{mysql} no longer needs a database argument. -@item -Changed the place where @code{HAVING} should be. According to ANSI, it should -be after @code{GROUP BY} but before @code{ORDER BY}. @strong{MySQL} 3.20 -incorrectly had it last. -@item -Added Sybase command @code{USE DATABASE} to start using another database. -@item -Added automatic adjusting of number of connections and table cache size -if the maximum number of files that can be opened is less than needed. -This should fix that @code{mysqld} doesn't crash even if you haven't done a -@code{ulimit -n 256} before starting @code{mysqld}. -@item -Added lots of limit checks to make it safer when running with too little -memory or when doing weird queries. -@end itemize - -@node News-3.21.13, News-3.21.12, News-3.21.14a, News-3.21.x -@appendixsubsec Changes in release 3.21.13 - -@itemize @bullet -@item -Added retry of interrupted reads and clearing of @code{errno}. -This makes Linux systems much safer! -@item -Fixed locking bug when using many aliases on the same table in the same -@code{SELECT}. -@item -Fixed bug with @code{LIKE} on number key. -@item -New error message so you can check whether the connection was lost while -the command was running or whether the connection was down from the start. -@item -Added @code{--table} option to @code{mysql} to print in table format. -Moved time and row information after query result. -Added automatic reconnect of lost connections. -@item -Added @code{!=} as a synonym for @code{<>}. -@item -Added function @code{VERSION()} to make easier logs. -@item -New multi-user test @file{tests/fork_test.pl} to put some strain on the -thread library. -@end itemize - -@node News-3.21.12, News-3.21.11, News-3.21.13, News-3.21.x -@appendixsubsec Changes in release 3.21.12 - -@itemize @bullet -@item -Fixed @code{ftruncate()} call in MIT-pthreads. This made @code{isamchk} -destroy the @file{.ISM} files on (Free)BSD 2.x systems. -@item -Fixed broken @code{__P_} patch in MIT-pthreads. -@item -Many memory overrun checks. All string functions now return @code{NULL} -if the returned string should be longer than @code{max_allowed_packet} bytes. -@item -Changed the name of the @code{INTERVAL} type to @code{ENUM}, because -@code{INTERVAL} is used in ANSI SQL. -@item -In some cases, doing a @code{JOIN} + @code{GROUP} + @code{INTO OUTFILE}, -the result wasn't grouped. -@item -@code{LIKE} with @code{'_'} as last character didn't work. Fixed. -@item -Added extended ANSI SQL @code{TRIM()} function. -@item -Added @code{CURTIME()}. -@item -Added @code{ENCRYPT()} function by Zeev Suraski. -@item -Fixed better @code{FOREIGN KEY} syntax skipping. New reserved words: -@code{MATCH}, @code{FULL}, @code{PARTIAL}. -@item -@code{mysqld} now allows IP number and hostname to the @code{--bind-address} -option. -@item -Added @code{SET OPTION CHARACTER SET cp1251_koi8} to enable conversions of -data to/from cp1251_koi8. -@item -Lots of changes for Win95 port. In theory, this version should now be -easily portable to Win95. -@item -Changed the @code{CREATE COLUMN} syntax of @code{NOT NULL} columns to be after -the @code{DEFAULT} value, as specified in the ANSI SQL standard. This will -make @code{mysqldump} with @code{NOT NULL} and default values incompatible with -@strong{MySQL} 3.20. -@item -Added many function name aliases so the functions can be used with -ODBC or ANSI SQL92 syntax. -@item -Fixed syntax of @code{ALTER TABLE tbl_name ALTER COLUMN col_name SET DEFAULT -NULL}. -@item -Added @code{CHAR} and @code{BIT} as synonyms for @code{CHAR(1)}. -@item -Fixed core dump when updating as a user who has only @strong{select} privilege. -@item -@code{INSERT ... SELECT ... GROUP BY} didn't work in some cases. An -@code{Invalid use of group function} error occurred. -@item -When using @code{LIMIT}, @code{SELECT} now always uses keys instead of record -scan. This will give better performance on @code{SELECT} and a @code{WHERE} -that matches many rows. -@item -Added Russian error messages. -@end itemize - -@node News-3.21.11, News-3.21.10, News-3.21.12, News-3.21.x -@appendixsubsec Changes in release 3.21.11 - -@itemize @bullet -@item -Configure changes. -@item -@strong{MySQL} now works with the new thread library on BSD/OS 3.0. -@item -Added new group functions @code{BIT_OR()} and @code{BIT_AND()}. -@item -Added compatibility functions @code{CHECK} and @code{REFERENCES}. -@code{CHECK} is now a reserved word. -@item -Added @code{ALL} option to @code{GRANT} for better compatibility. (@code{GRANT} -is still a dummy function.) -@item -Added partly-translated dutch messages. -@item -Fixed bug in @code{ORDER BY} and @code{GROUP BY} with @code{NULL} columns. -@item -Added function @code{last_insert_id()} to retrieve last @code{AUTO_INCREMENT} -value. This is intended for clients to ODBC that can't use the -@code{mysql_insert_id()} API function, but can be used by any client. -@item -Added @code{--flush-logs} option to @code{mysqladmin}. -@item -Added command @code{STATUS} to @code{mysql}. -@item -Fixed problem with @code{ORDER BY}/@code{GROUP BY} because of bug in @code{gcc}. -@item -Fixed problem with @code{INSERT ... SELECT ... GROUP BY}. -@end itemize - -@node News-3.21.10, News-3.21.9, News-3.21.11, News-3.21.x -@appendixsubsec Changes in release 3.21.10 - -@itemize @bullet -@item -New @code{mysqlaccess}. -@item -@code{CREATE} now supports all ODBC types and the @code{mSQL} @code{TEXT} type. -All ODBC 2.5 functions are also supported (added @code{REPEAT}). This provides -better portability. -@item -Added text types @code{TINYTEXT}, @code{TEXT}, @code{MEDIUMTEXT} and -@code{LONGTEXT}. These are actually @code{BLOB}types, but all searching is -done in case-insensitive fashion. -@item -All old @code{BLOB} fields are now @code{TEXT} fields. This only -changes that all searching on strings is done in case-sensitive fashion. -You must do an @code{ALTER TABLE} and change the field type to @code{BLOB} -if you want to have tests done in case-sensitive fashion. -@item -Fixed some @code{configure} issues. -@item -Made the locking code a bit safer. Fixed very unlikely -deadlock situation. -@item -Fixed a couple of bugs in the range optimizer. Now the new range benchmark -@code{test-select} works. -@end itemize - -@node News-3.21.9, News-3.21.8, News-3.21.10, News-3.21.x -@appendixsubsec Changes in release 3.21.9 - -@itemize @bullet -@item -Added @code{--enable-unix-socket=pathname} option to @code{configure}. -@item -Fixed a couple of portability problems with include files. -@item -Fixed bug in range calculation that could return empty -set when searching on multiple key with only one entry (very rare). -@item -Most things ported to FSU Pthreads, which should allow @strong{MySQL} to -run on SCO. @xref{SCO}. -@end itemize - -@node News-3.21.8, News-3.21.7, News-3.21.9, News-3.21.x -@appendixsubsec Changes in release 3.21.8 - -@itemize @bullet -@item -Works now in Solaris 2.6. -@item -Added handling of calculation of @code{SUM()} functions. -For example, you can now use @code{SUM(column)/COUNT(column)}. -@item -Added handling of trigometric functions: -@code{PI()}, @code{ACOS()}, @code{ASIN()}, @code{ATAN()}, @code{COS()}, -@code{SIN()} and @code{TAN()}. -@item -New languages: norwegian, norwegian-ny and portuguese. -@item -Fixed parameter bug in @code{net_print()} in @file{procedure.cc}. -@item -Fixed a couple of memory leaks. -@item -Now allow also the old @code{SELECT ... INTO OUTFILE} syntax. -@item -Fixed bug with @code{GROUP BY} and @code{SELECT} on key with many values. -@item -@code{mysql_fetch_lengths()} sometimes returned incorrect lengths when you used -@code{mysql_use_result()}. This affected at least some cases of -@code{mysqldump --quick}. -@item -Fixed bug in optimization of @code{WHERE const op field}. -@item -Fixed problem when sorting on @code{NULL} fields. -@item -Fixed a couple of 64-bit (Alpha) problems. -@item -Added @code{--pid-file=#} option to @code{mysqld}. -@item -Added date formatting to @code{FROM_UNIXTIME()}, originally by Zeev Suraski. -@item -Fixed bug in @code{BETWEEN} in range optimizer (Did only test = of the first -argument). -@item -Added machine-dependent files for MIT-pthreads i386-SCO. There is probably -more to do to get this to work on SCO 3.5. -@end itemize - -@node News-3.21.7, News-3.21.6, News-3.21.8, News-3.21.x -@appendixsubsec Changes in release 3.21.7 - -@itemize @bullet -@item -Changed @file{Makefile.am} to take advantage of Automake 1.2. -@item -Added the beginnings of a benchmark suite. -@item -Added more secure password handling. -@item -Added new client function @code{mysql_errno()}, to get the error number of -the error message. This makes error checking in the client much easier. -This makes the new server incompatible with the 3.20.x server when running -without @code{--old-protocol}. The client code is backward compatible. -More information can be found in the @file{README} file! -@item -Fixed some problems when using very long, illegal names. -@end itemize - -@node News-3.21.6, News-3.21.5, News-3.21.7, News-3.21.x -@appendixsubsec Changes in release 3.21.6 - -@itemize @bullet -@item -Fixed more portability issues (incorrect @code{sigwait} and @code{sigset} -defines). -@item -@code{configure} should now be able to detect the last argument to -@code{accept()}. -@end itemize - -@node News-3.21.5, News-3.21.4, News-3.21.6, News-3.21.x -@appendixsubsec Changes in release 3.21.5 - -@itemize @bullet -@item -Should now work with FreeBSD 3.0 if used with -@file{FreeBSD-3.0-libc_r-1.0.diff}, -which can be found at @uref{http://www.mysql.com/Download/Patches}. -@item -Added new option @code{-O tmp_table_size=#} to @code{mysqld}. -@item -New function @code{FROM_UNIXTIME(timestamp)} which returns a date string in -'YYYY-MM-DD HH:MM:DD' format. -@item -New function @code{SEC_TO_TIME(seconds)} which returns a string in -'HH:MM:SS' format. -@item -New function @code{SUBSTRING_INDEX()}, originally by Zeev Suraski. -@end itemize - -@node News-3.21.4, News-3.21.3, News-3.21.5, News-3.21.x -@appendixsubsec Changes in release 3.21.4 - -@itemize @bullet -@item -Should now configure and compile on OSF1 4.0 with the DEC compiler. -@item -Configuration and compilation on BSD/OS 3.0 works, but due to some bugs in -BSD/OS 3.0, @code{mysqld} doesn't work on it yet. -@item -Configuration and compilation on FreeBSD 3.0 works, but I couldn't get -@code{pthread_create} to work. -@end itemize - -@node News-3.21.3, News-3.21.2, News-3.21.4, News-3.21.x -@appendixsubsec Changes in release 3.21.3 - -@itemize @bullet -@item -Added reverse check lookup of hostnames to get better security. -@item -Fixed some possible buffer overflows if filenames that are too long are used. -@item -@code{mysqld} doesn't accept hostnames that start with digits followed by a -@code{'.'}, because the hostname may look like an IP number. -@item -Added @code{--skip-networking} option to @code{mysqld}, to only allow socket -connections. (This will not work with MIT-pthreads!) -@item -Added check of too long table names for alias. -@item -Added check if database name is okay. -@item -Added check if too long table names. -@item -Removed incorrect @code{free()} that killed the server on -@code{CREATE DATABASE} or @code{DROP DATABASE}. -@item -Changed some @code{mysqld} @code{-O} options to better names. -@item -Added @code{-O join_cache_size=#} option to @code{mysqld}. -@item -Added @code{-O max_join_size=#} option to @code{mysqld}, to be able to set a -limit how big queries (in this case big = slow) one should be able to handle -without specifying @code{SET OPTION SQL_BIG_SELECTS=1}. A # = is about 10 -examined records. The default is ``unlimited''. -@item -When comparing a @code{TIME}, @code{DATE}, @code{DATETIME} or @code{TIMESTAMP} -column to a constant, the constant is converted to a time value before -performing the comparison. -This will make it easier to get ODBC (particularly Access97) to work with -the above types. It should also make dates easier to use and the comparisons -should be quicker than before. -@item -Applied patch from Jochen Wiedmann that allows @code{query()} in -@code{mysqlperl} to take a query with @code{\0} in it. -@item -Storing a timestamp with a 2-digit year (@code{YYMMDD}) didn't work. -@item -Fix that timestamp wasn't automatically updated if set in an @code{UPDATE} -clause. -@item -Now the automatic timestamp field is the FIRST timestamp field. -@item -@code{SELECT * INTO OUTFILE}, which didn't correctly if the outfile already -existed. -@item -@code{mysql} now shows the thread ID when starting or doing a reconnect. -@item -Changed the default sort buffer size from 2M to 1M. -@end itemize - -@node News-3.21.2, News-3.21.0, News-3.21.3, News-3.21.x -@appendixsubsec Changes in release 3.21.2 - -@itemize @bullet -@item -The range optimizer is coded, but only 85% tested. It can be enabled with -@code{--new}, but it crashes core a lot yet... -@item -More portable. Should compile on AIX and alpha-digital. -At least the @code{isam} library should be relatively 64-bit clean. -@item -New @code{isamchk} which can detect and fix more problems. -@item -New options for @code{isamlog}. -@item -Using new version of Automake. -@item -Many small portability changes (from the AIX and alpha-digital port) -Better checking of pthread(s) library. -@item -czech error messages by @email{snajdr@@pvt.net}. -@item -Decreased size of some buffers to get fewer problems on systems with little -memory. Also added more checks to handle ``out of memory'' problems. -@item -@code{mysqladmin}: you can now do @code{mysqladmin kill 5,6,7,8} to kill -multiple threads. -@item -When the maximum connection limit is reached, one extra connection by a user -with the @strong{PROCESS_ACL} privilege is granted. -@item -Added @code{-O backlog=#} option to @code{mysqld}. -@item -Increased maximum packet size from 512K to 1024K for client. -@item -Almost all of the function code is now tested in the internal test suite. -@item -@code{ALTER TABLE} now returns warnings from field conversions. -@item -Port changed to 3306 (got it reserved from ISI). -@item -Added a fix for Visual FoxBase so that any schema name from a table -specification is automatically removed. -@item -New function @code{ASCII()}. -@item -Removed function @code{BETWEEN(a,b,c)}. Use the standard ANSI -synax instead: @code{expr BETWEEN expr AND expr}. -@item -@strong{MySQL} no longer has to use an extra temporary table when sorting -on functions or @code{SUM()} functions. -@item -Fixed bug that you couldn't use @code{tbl_name.field_name} in @code{UPDATE}. -@item -Fixed @code{SELECT DISTINCT} when using 'hidden group'. For example: -@example -mysql> SELECT DISTINCT MOD(some_field,10) FROM test - GROUP BY some_field; -@end example -Note: @code{some_field} is normally in the @code{SELECT} part. ANSI SQL should -require it. -@end itemize - -@node News-3.21.0, , News-3.21.2, News-3.21.x -@appendixsubsec Changes in release 3.21.0 - -@itemize @bullet -@item -New reserved words used: @code{INTERVAL}, @code{EXPLAIN}, @code{READ}, -@code{WRITE}, @code{BINARY}. -@item -Added ODBC function @code{CHAR(num,...)}. -@item -New operator @code{IN}. This uses a binary search to find a match. -@item -New command @code{LOCK TABLES tbl_name [AS alias] @{READ|WRITE@} ...} -@item -Added @code{--log-update} option to @code{mysqld}, to get a log suitable for -incremental updates. -@item -New command @code{EXPLAIN SELECT ...} to get information about how the -optimizer will do the join. -@item -For easier client code, the client should no longer use -@code{FIELD_TYPE_TINY_BLOB}, @code{FIELD_TYPE_MEDIUM_BLOB}, -@code{FIELD_TYPE_LONG_BLOB} or @code{FIELD_TYPE_VAR_STRING} (as -previously returned by @code{mysql_list_fields}). You should instead only use -@code{FIELD_TYPE_BLOB} or @code{FIELD_TYPE_STRING}. If you want exact -types, you should use the command @code{SHOW FIELDS}. -@item -Added varbinary syntax: @code{0x######} which can be used as a string -(default) or a number. -@item -@code{FIELD_TYPE_CHAR} is renamed to @code{FIELD_TYPE_TINY}. -@item -Changed all fields to C++ classes. -@item -Removed FORM struct. -@item -Fields with @code{DEFAULT} values no longer need to be @code{NOT NULL}. -@item -New field types: -@table @code -@item ENUM -A string which can take only a couple of defined values. The value is -stored as a 1-3 byte number that is mapped automatically to a string. -This is sorted according to string positions! -@item SET -A string which may have one or many string values separated with ','. -The string is stored as a 1-, 2-, 3-, 4- or 8-byte number where each bit stands -for a specific set member. This is sorted according to the unsigned value -of the stored packed number. -@end table -@item -Now all function calculation is done with @code{double} or @code{long long}. -This will provide the full 64-bit range with bit functions and fix some -conversions that previously could result in precision losses. One should -avoid using @code{unsigned long long} columns with full 64-bit range -(numbers bigger than 9223372036854775807) because calculations are done -with @code{signed long long}. -@item -@code{ORDER BY} will now put @code{NULL} field values first. @code{GROUP BY} -will also work with @code{NULL} values. -@item -Full @code{WHERE} with expressions. -@item -New range optimizer that can resolve ranges when some keypart prefix is -constant. Example: -@example -mysql> SELECT * FROM tbl_name - WHERE key_part_1="customer" - AND key_part_2>=10 AND key_part_2<=10; -@end example -@end itemize - -@node News-3.20.x, News-3.19.x, News-3.21.x, News -@appendixsec Changes in release 3.20.x - -Changes from 3.20.18 to 3.20.32b are not documented here because the -3.21 release branched here. And the relevant changes are also -documented as changes to the 3.21 version. - -@menu -* News-3.20.18:: Changes in release 3.20.18 -* News-3.20.17:: Changes in release 3.20.17 -* News-3.20.16:: Changes in release 3.20.16 -* News-3.20.15:: Changes in release 3.20.15 -* News-3.20.14:: Changes in release 3.20.14 -* News-3.20.13:: Changes in release 3.20.13 -* News-3.20.11:: Changes in release 3.20.11 -* News-3.20.10:: Changes in release 3.20.10 -* News-3.20.9:: Changes in release 3.20.9 -* News-3.20.8:: Changes in release 3.20.8 -* News-3.20.7:: Changes in release 3.20.7 -* News-3.20.6:: Changes in release 3.20.6 -* News-3.20.3:: Changes in release 3.20.3 -* News-3.20.0:: Changes in releases 3.20.0 -@end menu - -@node News-3.20.18, News-3.20.17, News-3.20.x, News-3.20.x -@appendixsubsec Changes in release 3.20.18 - -@itemize @bullet -@item -Added @code{-p#} (remove @code{#} directories from path) to @code{isamlog}. -All files are written with a relative path from the database directory -Now @code{mysqld} shouldn't crash on shutdown when using the -@code{--log-isam} option. -@item -New @code{mysqlperl} version. It is now compatible with @code{msqlperl-0.63}. -@item -New @code{DBD} module available at @uref{http://www.mysql.com/Contrib} -site. -@item -Added group function @code{STD()} (standard deviation). -@item -The @code{mysqld} server is now compiled by default without debugging -information. This will make the daemon smaller and faster. -@item -Now one usually only has to specify the @code{--basedir} option to -@code{mysqld}. All other paths are relative in a normal installation. -@item -@code{BLOB} columns sometimes contained garbage when used with a @code{SELECT} -on more than one table and @code{ORDER BY}. -@item -Fixed that calculations that are not in @code{GROUP BY} work as expected -(ANSI SQL extension). -Example: -@example -mysql> SELECT id,id+1 FROM table GROUP BY id; -@end example -@item -The test of using @code{MYSQL_PWD} was reversed. Now @code{MYSQL_PWD} is -enabled as default in the default release. -@item -Fixed conversion bug which caused @code{mysqld} to core dump with -Arithmetic error on Sparc-386. -@item -Added @code{--unbuffered} option to @code{mysql}, for new @code{mysqlaccess}. -@item -When using overlapping (unnecessary) keys and join over many tables, -the optimizer could get confused and return 0 records. -@end itemize - -@node News-3.20.17, News-3.20.16, News-3.20.18, News-3.20.x -@appendixsubsec Changes in release 3.20.17 - -@itemize @bullet -@item -You can now use @code{BLOB} columns and the functions @code{IS NULL} and -@code{IS NOT NULL} in the @code{WHERE} clause. -@item -All communication packets and row buffers are now allocated dynamically -on demand. The default value of @code{max_allowed_packet} is now 64K for -the server and 512K for the client. This is mainly used to catch -incorrect packets that could trash all memory. The server limit may be -changed when it is started. -@item -Changed stack usage to use less memory. -@item -Changed @code{safe_mysqld} to check for running daemon. -@item -The @code{ELT()} function is renamed to @code{FIELD()}. The new -@code{ELT()} function returns a value based on an index: @code{FIELD()} -is the inverse of @code{ELT()} Example: @code{ELT(2,"A","B","C")} returns -@code{"B"}. @code{FIELD("B","A","B","C")} returns @code{2}. -@item -@code{COUNT(field)}, where @code{field} could have a @code{NULL} value, now -works. -@item -A couple of bugs fixed in @code{SELECT ... GROUP BY}. -@item -Fixed memory overrun bug in @code{WHERE} with many unoptimizable brace levels. -@item -Fixed some small bugs in the grant code. -@item -If hostname isn't found by @code{get_hostname}, only the IP is checked. -Previously, you got @code{Access denied}. -@item -Inserts of timestamps with values didn't always work. -@item -@code{INSERT INTO ... SELECT ... WHERE} could give the error -@code{Duplicated field}. -@item -Added some tests to @code{safe_mysqld} to make it ``safer''. -@item -@code{LIKE} was case sensitive in some places and case insensitive in others. -Now @code{LIKE} is always case insensitive. -@item -@file{mysql.cc}: Allow @code{'#'} anywhere on the line. -@item -New command @code{SET OPTION SQL_SELECT_LIMIT=#}. See the FAQ for more details. -@item -New version of the @code{mysqlaccess} script. -@item -Change @code{FROM_DAYS()} and @code{WEEKDAY()} to also take a full -@code{TIMESTAMP} or @code{DATETIME} as argument. Before they only took a -number of type @code{YYYYMMDD} or @code{YYMMDD}. -@item -Added new function @code{UNIX_TIMESTAMP(timestamp_column)}. -@end itemize - -@node News-3.20.16, News-3.20.15, News-3.20.17, News-3.20.x -@appendixsubsec Changes in release 3.20.16 - -@itemize @bullet -@item -More changes in MIT-pthreads to get them safer. Fixed also some link -bugs at least in SunOS. -@item -Changed @code{mysqld} to work around a bug in MIT-pthreads. This makes multiple -small @code{SELECT} operations 20 times faster. Now @code{lock_test.pl} should -work. -@item -Added @code{mysql_FetchHash(handle)} to @code{mysqlperl}. -@item -The @code{mysqlbug} script is now distributed built to allow for reporting -bugs that appear during the build with it. -@item -Changed @file{libmysql.c} to prefer @code{getpwuid()} instead of -@code{cuserid()}. -@item -Fixed bug in @code{SELECT} optimizer when using many tables with the same -column used as key to different tables. -@item -Added new latin2 and Russian KOI8 character tables. -@item -Added support for a dummy @code{GRANT} command to satisfy Powerbuilder. -@end itemize - -@node News-3.20.15, News-3.20.14, News-3.20.16, News-3.20.x -@appendixsubsec Changes in release 3.20.15 - -@itemize @bullet -@item -Fixed fatal bug @code{packets out of order} when using MIT-pthreads. -@item -Removed possible loop when a thread waits for command from client -and @code{fcntl()} fails. Thanks to Mike Bretz for finding this bug. -@item -Changed alarm loop in @file{mysqld.cc} because shutdown didn't always -succeed in Linux. -@item -Removed use of @code{termbits} from @file{mysql.cc}. This conflicted with -@code{glibc} 2.0. -@item -Fixed some syntax errors for at least BSD and Linux. -@item -Fixed bug when doing a @code{SELECT} as superuser without a database. -@item -Fixed bug when doing @code{SELECT} with group calculation to outfile. -@end itemize - -@node News-3.20.14, News-3.20.13, News-3.20.15, News-3.20.x -@appendixsubsec Changes in release 3.20.14 - -@itemize @bullet -@item -If one gives @code{-p} or @code{--password} option to @code{mysql} without -an argument, the user is solicited for the password from the tty. -@item -Added default password from @code{MYSQL_PWD} (by Elmar Haneke). -@item -Added command @code{kill} to @code{mysqladmin} to kill a specific -@strong{MySQL} thread. -@item -Sometimes when doing a reconnect on a down connection this succeeded -first on second try. -@item -Fixed adding an @code{AUTO_INCREMENT} key with @code{ALTER_TABLE}. -@item -@code{AVG()} gave too small value on some @code{SELECT}s with -@code{GROUP BY} and @code{ORDER BY}. -@item -Added new @code{DATETIME} type (by Giovanni Maruzzelli -@email{maruzz@@matrice.it}). -@item -Fixed that define @code{DONT_USE_DEFAULT_FIELDS} works. -@item -Changed to use a thread to handle alarms instead of signals on Solaris to -avoid race conditions. -@item -Fixed default length of signed numbers. (George Harvey -@email{georgeh@@pinacl.co.uk}.) -@item -Allow anything for @code{CREATE INDEX}. -@item -Add prezeros when packing numbers to @code{DATE}, @code{TIME} and -@code{TIMESTAMP}. -@item -Fixed a bug in @code{OR} of multiple tables (gave empty set). -@item -Added many patches to MIT-pthreads. This fixes at least one lookup bug. -@end itemize - -@node News-3.20.13, News-3.20.11, News-3.20.14, News-3.20.x -@appendixsubsec Changes in release 3.20.13 - -@itemize @bullet -@item -Added ANSI SQL94 @code{DATE} and @code{TIME} types. -@item -Fixed bug in @code{SELECT} with @code{AND}-@code{OR} levels. -@item -Added support for Slovenian characters. The @file{Contrib} directory contains -source and instructions for adding other character sets. -@item -Fixed bug with @code{LIMIT} and @code{ORDER BY}. -@item -Allow @code{ORDER BY} and @code{GROUP BY} on items that aren't in the -@code{SELECT} list. -(Thanks to Wim Bonis @email{bonis@@kiss.de}, for pointing this out.) -@item -Allow setting of timestamp values in @code{INSERT}. -@item -Fixed bug with @code{SELECT ... WHERE ... = NULL}. -@item -Added changes for @code{glibc} 2.0. To get @code{glibc} to work, you should -add the @file{gibc-2.0-sigwait-patch} before compiling @code{glibc}. -@item -Fixed bug in @code{ALTER TABLE} when changing a @code{NOT NULL} field to -allow @code{NULL} values. -@item -Added some ANSI92 synonyms as field types to @code{CREATE TABLE}. -@code{CREATE TABLE} now allows @code{FLOAT(4)} and @code{FLOAT(8)} to mean -@code{FLOAT} and @code{DOUBLE}. -@item -New utility program @code{mysqlaccess} by @email{Yves.Carlier@@rug.ac.be}. -This program shows the access rights for a specific user and the grant -rows that determine this grant. -@item -Added @code{WHERE const op field} (by @email{bonis@@kiss.de}). -@end itemize - -@node News-3.20.11, News-3.20.10, News-3.20.13, News-3.20.x -@appendixsubsec Changes in release 3.20.11 - -@itemize @bullet -@item -When using @code{SELECT ... INTO OUTFILE}, all temporary tables are ISAM -instead of HEAP to allow big dumps. -@item -Changed date functions to be string functions. This fixed some ``funny'' -side effects when sorting on dates. -@item -Extended @code{ALTER TABLE} according to SQL92. -@item -Some minor compability changes. -@item -Added @code{--port} and @code{--socket} options to all utility programs and -@code{mysqld}. -@item -Fixed MIT-pthreads @code{readdir_r()}. Now @code{mysqladmin create database} -and @code{mysqladmin drop database} should work. -@item -Changed MIT-pthreads to use our @code{tempnam()}. This should fix the ``sort -aborted'' bug. -@item -Added sync of records count in @code{sql_update}. This fixed slow updates -on first connection. (Thanks to Vaclav Bittner for the test.) -@end itemize - -@node News-3.20.10, News-3.20.9, News-3.20.11, News-3.20.x -@appendixsubsec Changes in release 3.20.10 - -@itemize @bullet -@item -New insert type: @code{INSERT INTO ... SELECT ...} -@item -@code{MEDIUMBLOB} fixed. -@item -Fixed bug in @code{ALTER TABLE} and @code{BLOB}s. -@item -@code{SELECT ... INTO OUTFILE} now creates the file in the current -database directory. -@item -@code{DROP TABLE} now can take a list of tables. -@item -Oracle synonym @code{DESCRIBE} (@code{DESC}). -@item -Changes to @code{make_binary_distribution}. -@item -Added some comments to installation instructions about @code{configure}'s -C++ link test. -@item -Added @code{--without-perl} option to @code{configure}. -@item -Lots of small portability changes. -@end itemize - -@node News-3.20.9, News-3.20.8, News-3.20.10, News-3.20.x -@appendixsubsec Changes in release 3.20.9 - -@itemize @bullet -@item -@code{ALTER TABLE} didn't copy null bit. As a result, fields that were allowed -to have @code{NULL} values were always @code{NULL}. -@item -@code{CREATE} didn't take numbers as @code{DEFAULT}. -@item -Some compatibility changes for SunOS. -@item -Removed @file{config.cache} from old distribution. -@end itemize - -@node News-3.20.8, News-3.20.7, News-3.20.9, News-3.20.x -@appendixsubsec Changes in release 3.20.8 - -@itemize @bullet -@item -Fixed bug with @code{ALTER TABLE} and multi-part keys. -@end itemize - -@node News-3.20.7, News-3.20.6, News-3.20.8, News-3.20.x -@appendixsubsec Changes in release 3.20.7 - -@itemize @bullet -@item -New commands: @code{ALTER TABLE}, @code{SELECT ... INTO OUTFILE} and -@code{LOAD DATA INFILE}. -@item -New function: @code{NOW()}. -@item -Added new field @strong{file_priv} to @code{mysql/user} table. -@item -New script @code{add_file_priv} which adds the new field @strong{file_priv} -to the @code{user} table. This script must be executed if you want to -use the new @code{SELECT ... INTO} and @code{LOAD DATA INFILE ...} commands -with a version of @strong{MySQL} earlier than 3.20.7. -@item -Fixed bug in locking code, which made @code{lock_test.pl} test fail. -@item -New files @file{NEW} and @file{BUGS}. -@item -Changed @file{select_test.c} and @file{insert_test.c} to include -@file{config.h}. -@item -Added command @code{status} to @code{mysqladmin} for short logging. -@item -Increased maximum number of keys to 16 and maximum number of key parts to 15. -@item -Use of sub keys. A key may now be a prefix of a string field. -@item -Added @code{-k} option to @code{mysqlshow}, to get key information for a table. -@item -Added long options to @code{mysqldump}. -@end itemize - -@node News-3.20.6, News-3.20.3, News-3.20.7, News-3.20.x -@appendixsubsec Changes in release 3.20.6 - -@itemize @bullet -@item -Portable to more systems because of MIT-pthreads, which will -be used automatically if @code{configure} cannot find a @code{-lpthreads} -library. -@item -Added GNU-style long options to almost all programs. Test with -@code{@kbd{program} --help}. -@item -Some shared library support for Linux. -@item -The FAQ is now in @file{.texi} format and is available in @file{.html}, -@file{.txt} and @file{.ps} formats. -@item -Added new SQL function @code{RAND([init])}. -@item -Changed @code{sql_lex} to handle @code{\0} unquoted, but the client can't send -the query through the C API, because it takes a str pointer. -You must use @code{mysql_real_query()} to send the query. -@item -Added API function @code{mysql_get_client_info()}. -@item -@code{mysqld} now uses the @code{N_MAX_KEY_LENGTH} from @file{nisam.h} as -the maximum allowed key length. -@item -The following now works: -@example -mysql> SELECT filter_nr,filter_nr FROM filter ORDER BY filter_nr; -@end example -Previously, this resulted in the error: -@code{Column: 'filter_nr' in order clause is ambiguous}. -@item -@code{mysql} now outputs @code{'\0'}, @code{'\t'}, @code{'\n'} and @code{'\\'} -when encountering ASCII 0, tab, newline or @code{'\'} while writing -tab-separated output. -This is to allow printing of binary data in a portable format. -To get the old behavior, use @code{-r} (or @code{--raw}). -@item -Added german error messages (60 of 80 error messages translated). -@item -Added new API function @code{mysql_fetch_lengths(MYSQL_RES *)}, which -returns an array of of column lengths (of type @code{uint}). -@item -Fixed bug with @code{IS NULL} in @code{WHERE} clause. -@item -Changed the optimizer a little to get better results when searching on a key -part. -@item -Added @code{SELECT} option @code{STRAIGHT_JOIN} to tell the optimizer that -it should join tables in the given order. -@item -Added support for comments starting with @code{'--'} in @file{mysql.cc} -(Postgres syntax). -@item -You can have @code{SELECT} expressions and table columns in a @code{SELECT} -which are not used in the group part. This makes it efficient to implement -lookups. The column that is used should be a constant for each group because -the value is calculated only once for the first row that is found for a group. -@example -mysql> SELECT id,lookup.text,sum(*) FROM test,lookup - WHERE test.id=lookup.id GROUP BY id; -@end example -@item -Fixed bug in @code{SUM(function)} (could cause a core dump). -@item -Changed @code{AUTO_INCREMENT} placement in the SQL query: -@example -INSERT into table (auto_field) values (0); -@end example -inserted 0, but it should insert an @code{AUTO_INCREMENT} value. -@item -@file{mysqlshow.c}: Added number of records in table. Had to change the -client code a little to fix this. -@item -@code{mysql} now allows doubled @code{''} or @code{""} within strings for -embedded @code{'} or @code{"}. -@item -New math functions: -@code{EXP()}, @code{LOG()}, @code{SQRT()}, @code{ROUND()}, @code{CEILING()}. -@end itemize - -@node News-3.20.3, News-3.20.0, News-3.20.6, News-3.20.x -@appendixsubsec Changes in release 3.20.3 - -@itemize @bullet -@item -The @code{configure} source now compiles a thread-free client library -@code{-lmysqlclient}. This is the only library that needs to be linked -with client applications. When using the binary releases, you must -link with @code{-lmysql -lmysys -ldbug -lstrings} as before. -@item -New @code{readline} library from @code{bash-2.0}. -@item -LOTS of small changes to @code{configure} and makefiles (and related source). -@item -It should now be possible to compile in another directory using -@code{VPATH}. Tested with GNU Make 3.75. -@item -@code{safe_mysqld} and @code{mysql.server} changed to be more compatible -between the source and the binary releases. -@item -@code{LIMIT} now takes one or two numeric arguments. -If one argument is given, it indicates the maximum number of rows in -a result. If two arguments are given, the first argument indicates the offset -of the first row to return, the second is the maximum number of rows. -With this it's easy to do a poor man's next page/previous page WWW -application. -@item -Changed name of SQL function @code{FIELDS()} to @code{ELT()}. -Changed SQL function @code{INTERVALL()} to @code{INTERVAL()}. -@item -Made @code{SHOW COLUMNS} a synonym for @code{SHOW FIELDS}. -Added compatibility syntax @code{FRIEND KEY} to @code{CREATE TABLE}. In -@strong{MySQL}, this creates a non-unique key on the given columns. -@item -Added @code{CREATE INDEX} and @code{DROP INDEX} as compatibility functions. -In @strong{MySQL}, @code{CREATE INDEX} only checks if the index exists and -issues an error if it doesn't exist. @code{DROP INDEX} always succeeds. -@item -@file{mysqladmin.c}: added client version to version information. -@item -Fixed core dump bug in @code{sql_acl} (core on new connection). -@item -Removed @code{host}, @code{user} and @code{db} tables from database @code{test} -in the distribution. -@item -@code{FIELD_TYPE_CHAR} can now be signed (-128 - 127) or unsigned (0 - 255) -Previously, it was always unsigned. -@item -Bug fixes in @code{CONCAT()} and @code{WEEKDAY()}. -@item -Changed a lot of source to get @code{mysqld} to be compiled with SunPro -compiler. -@item -SQL functions must now have a @code{'('} immediately after the function name -(no intervening space). -For example, @code{'user('} is regarded as beginning a function call, and -@code{'user ('} is regarded as an identifier @code{user} followed by a -@code{'('}, not as a function call. -@end itemize - -@node News-3.20.0, , News-3.20.3, News-3.20.x -@appendixsubsec Changes in release 3.20.0 - -@itemize @bullet -@item -The source distribution is done with @code{configure} and Automake. -It will make porting much easier. The @code{readline} library is included -in the distribution. -@item -Separate client compilation: -the client code should be very easy to compile on systems which -don't have threads. -@item -The old Perl interface code is automatically compiled and installed. -Automatic compiling of @code{DBD} will follow when the new @code{DBD} code -is ported. -@item -Dynamic language support: @code{mysqld} can now be started with Swedish -or English (default) error messages. -@item -New functions: @code{INSERT()}, @code{RTRIM()}, @code{LTRIM()} and -@code{FORMAT()}. -@item -@code{mysqldump} now works correctly for all field types (even -@code{AUTO_INCREMENT}). The format for @code{SHOW FIELDS FROM tbl_name} -is changed so the @code{Type} column contains information suitable for -@code{CREATE TABLE}. In previous releases, some @code{CREATE TABLE} -information had to be patched when recreating tables. -@item -Some parser bugs from 3.19.5 (@code{BLOB} and @code{TIMESTAMP}) are corrected. -@code{TIMESTAMP} now returns different date information depending on its -create length. -@item -Changed parser to allow a database, table or field name to -start with a number or @code{'_'}. -@item -All old C code from Unireg changed to C++ and cleaned up. This makes -the daemon a little smaller and easier to understand. -@item -A lot of small bug fixes done. -@item -New @file{INSTALL} files (not final version) and some info regarding porting. -@end itemize - -@node News-3.19.x, , News-3.20.x, News -@appendixsec Changes in release 3.19.x - -@menu -* News-3.19.5:: Changes in release 3.19.5 -* News-3.19.4:: Changes in release 3.19.4 -* News-3.19.3:: Changes in release 3.19.3 -@end menu - -@node News-3.19.5, News-3.19.4, News-3.19.x, News-3.19.x -@appendixsubsec Changes in release 3.19.5 - -@itemize @bullet -@item -Some new functions, some more optimization on joins. -@item -Should now compile clean on Linux (2.0.x). -@item -Added functions @code{DATABASE()}, @code{USER()}, @code{POW()}, -@code{LOG10()} (needed for ODBC). -@item -In a @code{WHERE} with an @code{ORDER BY} on fields from only one table, -the table is now preferred as first table in a multi-join. -@item -@code{HAVING} and @code{IS NULL} or @code{IS NOT NULL} now works. -@item -A group on one column and a sort on a group function (@code{SUM()}, -@code{AVG()}...) didn't work together. Fixed. -@item -@code{mysqldump}: Didn't send password to server. -@end itemize - -@node News-3.19.4, News-3.19.3, News-3.19.5, News-3.19.x -@appendixsubsec Changes in release 3.19.4 - -@itemize @bullet -@item -Fixed horrible locking bug when inserting in one thread and reading -in another thread. -@item -Fixed one-off decimal bug. 1.00 was output as 1.0. -@item -Added attribute @code{'Locked'} to process list as info if a query is -locked by another query. -@item -Fixed full magic timestamp. Timestamp length may now be 14, 12, 10, 8, 6, 4 -or 2 bytes. -@item -Sort on some numeric functions could sort incorrectly on last number. -@item -@code{IF(arg,syntax_error,syntax_error)} crashed. -@item -Added functions @code{CEILING()}, @code{ROUND()}, @code{EXP()}, @code{LOG()} and @code{SQRT()}. -@item -Enhanced @code{BETWEEN} to handle strings. -@end itemize - -@node News-3.19.3, , News-3.19.4, News-3.19.x -@appendixsubsec Changes in release 3.19.3 - -@itemize @bullet -@item -Fixed @code{SELECT} with grouping on @code{BLOB} columns not to return -incorrect @code{BLOB} info. Grouping, sorting and distinct on @code{BLOB} -columns will not yet work as -expected (probably it will group/sort by the first 7 characters in the -@code{BLOB}). Grouping on formulas with a fixed string size (use @code{MID()} -on a @code{BLOB}) should work. -@item -When doing a full join (no direct keys) on multiple tables with @code{BLOB} -fields, the @code{BLOB} was garbage on output. -@item -Fixed @code{DISTINCT} with calculated columns. -@end itemize - -@node Bugs, TODO, News, Top -@appendix MySQL ǤδΤΥ顼ȷ礱Ƥǥ - -@itemize @bullet -@item -MIT-pthread ѤȤ¾Υǥ쥯ȥǥӥɽޤ - MIT-pthread ѹ׵᤹뤿ᡢ桹ϡˤʤǤ -@item -@code{BLOB} values can't ``reliably'' be used in @code{GROUP BY} or -@code{ORDER BY} or @code{DISTINCT}. -ξ硢 @code{BLOB} ӤκݤˤϺǽ @code{max_sort_length} Х -ʥǥե1024ˤѤޤ - @code{mysqld} @code{-O max_sort_length} ץѹǽǤ -A workaround for most cases is to use a substring: -@code{SELECT DISTINCT LEFT(blob,2048) FROM tbl_name}. -@item -Calculation is done with @code{BIGINT} or @code{DOUBLE} (both are -normally 64 bits long). It depends on the function which precision one -gets. The general rule is that bit functions are done with @code{BIGINT} -precision, @code{IF}, and @code{ELT()} with @code{BIGINT} or @code{DOUBLE} -precision and the rest with @code{DOUBLE} precision. One should try to -avoid using bigger unsigned long long values than 63 bits -(9223372036854775807) for anything else than bit fields! -@item -ƤʸΥեɡ@code{BLOB} @code{TEXT} ϤΤơϡ -Ȥ˺ǸˤĤƤ륹ڡưǼޤ - @code{CHAR} ǤϤ OK ǡħ ANSI SQL92 ˽äƤȸʤǤ礦 -@strong{MySQL} ΥХϡ @code{VARCHAR} ǤƱͤ˹ԤäƤޤȤǤ -@item -ĤΥơ֥ @code{ENUM} @code{SET} եɤ 255 ޤǤƤޤ -@item -@code{safe_mysqld} re-directs all messages from @code{mysqld} to the -@code{mysqld} log. One problem with this is that if you execute -@code{mysqladmin refresh} to close and reopen the log, -@code{stdout} and @code{stderr} are still redirected to the old log. -If you use @code{--log} extensively, you should edit @code{safe_mysqld} to -log to @file{'hostname'.err} instead of @file{'hostname'.log} so you can -easily reclaim the space for the old log by deleting the old one and -executing @code{mysqladmin refresh}. -@item -In the @code{UPDATE} statement, columns are updated from left to right. -If you refer to a updated column, you will get the updated value instead of the -original value. For example: -@example -mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1 -@end example -will update @code{KEY} with @code{2} instead of with @code{1}. -@item -You can't use temporary tables more than once in the same query. - -@example -select * from temporary_table, temporary_table as t2; -@end example - -@item -Because @strong{MySQL} allows you to work with table types that doesn't -support transactions (and thus can't @code{rollback} data) some things -behaves a little different in @strong{MySQL} than in other SQL servers: -(This is just to ensure that @strong{MySQL} never need to do a rollback -for a SQL command). This may be a little akward at times as column -values must be checked in the application, but this will actually give -you a nice speed increase as it allows @strong{MySQL} to do some -optimizations that otherwice would be hard to do. - -If you set a colum to a wrong value, @strong{MySQL} will instead of doing -a rollback instead store the @code{best possible value} in the column. - -@itemize @bullet -@item -If you try to store a value outside of the range in a numerical column, -@strong{MySQL} will instead store the smallest or biggest possible value in -the column. -@item -If you try to store a string, that doesn't start with a number, into a -numerical column @strong{MySQL} will store 0 into it. -@item -If you try to to store @code{NULL} into a column that doesn't take -@code{NULL} values, @code{MySQL} will store 0 or @code{''} (empty -string) in it instead. (This behavour can however be changed with the --DDONT_USE_DEFAULT_FIELDS compile option). -@item -@strong{MySQL} allows you to store some wrong date values into -@code{DATE} and @code{DATETIME} columns. (Like 2000-02-31 or 2000-02-00). -If the date is totally wrong, @strong{MySQL} will store the special -0000-00-00 date value in the column. -@item -If you set an @code{enum} to an not supported value, it will be set to -the error value 'empty string', with numeric value 0. -@end itemize -@item -If you execute a @code{PROCEDURE} on a query with returns an empty set then -in some cases the @code{PROCEDURE} will not transform the columns. -@end itemize - -The following is known bugs in earlier versions of @strong{MySQL}: - -@itemize @bullet -@item -You can get a hanged thread if you do a @code{DROP TABLE} on a table that is -one among many tables that is locked with @code{LOCK TABLES}. - -@item -In the following case you can get a core dump: -@enumerate -@item -Delayed insert handler has pending inserts to a table. -@item -@code{LOCK table} with @code{WRITE} -@item -@code{FLUSH TABLES} -@end enumerate - -@item -Before @strong{MySQL} 3.23.2 an @code{UPDATE} that updated a key with -a @code{WHERE} on the same key may have failed because the key was used to -search for records and the same row may have been found multiple times: - -@example -UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100; -@end example - -A workaround is to use: - -@example -mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100; -@end example - -This will work because @strong{MySQL} will not use index on expressions in -the @code{WHERE} clause. -@item -@strong{MySQL} 3.23 ǤϡƤοͷǡʬƤޤޤ -ϡΥեɤξĤʤФʤʤä -ȤǤ Ƥη̤10ʤο֤äƤޤ -@end itemize - -For platform-specific bugs, see the sections about compiling and porting. - -@cindex TODO -@node TODO, Porting, Bugs, Top -@appendix MySQL ˾ä (The TODO) - -@menu -* TODO future:: Things that must done in the very near future -* TODO sometime:: Things that have to be done sometime -* TODO unplanned:: Some things we don't have any plans to do -@end menu - -ΥꥹȤΤ٤Ƥϡ줬֤˽񤫤Ƥޤ -⤷ʤ̤ͥ˱ƶڤܤСɤ饤󥹤ݡϿơ -桹ˤʤ®ߤΤäƤ -@xref{Licensing and Support}. - -@node TODO future, TODO sometime, TODO, TODO -@appendixsec ᤤ˴λͤФʤʤ - -@itemize @bullet -@item -Fail safe replication. -@item -Optimize, test and document transactions safe tables -@item -䤤碌 @code{select id from t where grp in (select grp from g where u > 100)} -@item -mysqld ˡƱ¿Υ饯åȤ򥵥ݡȤ -@item -⤷¾ disk symlink Ƥơ֥Ф @code{ALTER TABLE} -¹Ԥ硢ơ֥򤳤 disk ˺褦ˤ -@item -@code{RENAME table as table, table as table [,...]} -@item -Allow users to change startup options. -@item -FreeBSD and MIT-pthreads; Do sleeping threads take CPU? -@item -Check if locked threads take any CPU. -@item -Change to use mkstemp() instead of tempnam() for system that supports the call. -We need to add a my_mkstemp() function in mysys and also change the cache -code to not create the filename until we do the actual open. -@item -ʬǤ JOIN (Ŭ) -@item -Entry for @code{DECRYPT()}. -@item - @file{.frm} ե @code{FOREIGN} 򵭲롣 -@item -СɤΥ -@item -Check if @code{lockd} works with modern Linux kernels; If not, we have -to fix @code{lockd}! To test this, start @code{mysqld} with -@code{--enable-locking} and run the different fork* test suits. They shouldn't -give any errors if @code{lockd} works. -@item -Allow SQL variables in @code{LIMIT}, like in @code{LIMIT @@a,@@b}. -@item -ư @code{DEFAULT} ͤեɤɲäʤ -@code{DEFAULT} ʤեɤޤޤʤ @code{INSERT} λѤ -顼ˤ -@item -꡼ȷ̤Υå塣 -This should be done as a separated -module that examines each query and if this is query is in the cache -the cached result should be returned. When one updates a table one -should remove as few queries as possible from the cache. -This should give a big speed bost on machines with much RAM where -queries are often repeated (like WWW applications). -One idea would be to only cache queries of type: -@code{SELECT CACHED ....} -@item -Fix @file{libmysql.c} to allow two @code{mysql_query()} commands in a row -without reading results or give a nice error message when one does this. -@item -@code{BIT} 1 bit 褦˺Ŭ ʺ @code{BIT} ϰʸȤޤ -@item -ʤĤ FreeBSD ƥ MIT-pthreads @code{ctime()} ưʤڡ -@item -Check if locked threads take any CPU. -@item - @code{ORDER BY} ɲá This would be handy with functions like: -@code{generate_id(start,step)}. -@item -@code{TIMESTAMP} @code{AUTO_INCREMENT} եɤ򹹿ʤ褦ˡ - @code{IMAGE} ץ @code{LOAD DATA INFILE} ɲá -@item -@code{LOAD DATA INFILE} ˰ʲʸ򤵤롧 -@example -LOAD DATA INFILE 'file_name.txt' INTO TABLE tbl_name -TEXT_FIELDS (text_field1, text_field2, text_field3) -SET table_field1=concatenate(text_field1, text_field2), table_field3=23 -IGNORE text_field3 -@end example -@item - @code{VARCHAR} Υݡ (MyISAM ˤϤΥݡȤˤޤ) -@item - @code{mysql} 鼫ưŪ netscape ˽ -@item -@code{LOCK DATABASES}. (ʥץդ) -@item -@code{NATURAL JOIN}. -@item -Change sort to allocate memory in ``hunks'' to get better memory utilization. -@item -@code{DECIMAL} @code{NUMERIC} ؿɽοɤळȤޤ -ˤϡ -@code{Field_decimal::store(const char *from,uint len)} ƥɤʤƤϤʤޤ -@item -Fix @code{mysql.cc} to do fewer @code{malloc()} calls when hashing field -names. -@item -ؿ -ADD_TO_SET(value,set) REMOVE_FROM_SET(value,set) -@item -@code{t1 JOIN t2 ON ...} @code{t1 JOIN t2 USING ...} λѤɲá -ߡ @code{LEFT JOIN} ΤߤѤǤޤ -@item -@code{unsigned long long} δʥݡȡ -@item -@code{CASE} ؿ -@item -@code{show status} ˤä¿ѿ -@code{INSERT}/@code{DELETE}/@code{UPDATE} ʸΥȡ - 쥳ɤɤ߹ߤȹΥȡ - 1ơ֥ǤSELECTJOINȼäSELECTΥȡ - SELECT Υơ֥οΥȡ - Хåե reaad/write Υҥåȿ(ͤȼ¿)Υȡ - @code{ORDER BY}, @code{GROUP BY}, ơ֥κΥ -@item -⤷ @code{mysql} Ǥ硢ʤ¾³ -äƤ륯 kill ʤƤϤʤޤ -ǽŪˤϡäȤϥСǸΤ褦˻ߤ٤Ǥ -@item -ơ֥ξΤΥϥɥ顼󥿡եɲá - 򥷥ƥơ֥ȤƻȤ褦ˡ -Ϥ⤷ʤ٤ƤΥơ֥ˤĤƾꥯȤ -٤ʤǤ礦 ȤƤޤ -Ūʥơ֥ؤ @code{SHOW INFO FROM tbl_name} Ǥϼ¹Ԥ٤Ǥ -@item -UNICODE Υݡ -@item -@code{NATURAL JOIN}. -@item -Oracle like @code{CONNECT BY PRIOR ...} to search hierarchy structures. -@item -@code{RENAME DATABASE} -@item -@code{mysqladmin copy database new-database}. -@item -Processlist queries/thread οɽ٤ -@item -@code{DELETE} @code{REPLACE} ץ @code{UPDATE} ʸɲá ( -Ϲ˵äνʣ顼Τ쥳ɤ -ƺǤ礦). -@item -Change the format of @code{DATETIME} to store fractions of seconds. -@item -ANSI92 ODBC 3.0 ǤƤʪƤɲá -@item -Change table names from empty strings to @code{NULL} for calculated columns. -@item -Don't use 'Item_copy_string' on numerical values to avoid -number->string->number conversion in case of: -@code{SELECT COUNT(*)*(id+0) FROM table_name GROUP BY id} -@item -Make it possible to use the new GNU regexp library instead of the current -one (The GNU library should be much faster than the old one). -@item -Change that @code{ALTER TABLE} doesn't abort clients that executes -@code{INSERT DELAYED}. -@item -Allow @code{select a from crash_me left join crash_me2 using (a)}; In this -case a is assumed to come from the crash_me table. -@item -@code{LOAD DATA INFILE 'file_name' INTO TABLE 'table_name' ERRORS TO err_table_name} -which would cause any errors/warnings to be logged into the err_table_name -table. That table would have a structure like: - -line_number - line number in data file -error_message - the error/warning message -and maybe - data_line - the line from the data file -@item -Fix that when columns referenced in an @code{UPDATE} clause contains the old -values before the update started. -@item -Allow update of varibles in @code{UPDATE} statements. For example: -@code{UPDATE TABLE foo SET @@a=a+b,a=@@a, b=@@a+c} -@item -@code{myisamchk}, @code{REPAIR} and @code{OPTIMIZE TABLE} should be able -to handle cases where the data and/or index files are symbolic links. -@item -Add simulation of @code{pread()}/@code{pwrite()} on windows to enable -concurrent inserts. -@end itemize - -@node TODO sometime, TODO unplanned, TODO future, TODO -@appendixsec ĤϹԤ٤ - -@itemize @bullet -@item -Implement function: @code{get_changed_tables(timeout,table1,table2,...)} -@item -Atomic updates; This includes a language that one can even use for -a set of stored procedures. -@item -@code{update items,month set items.price=month.price where items.id=month.id;} -@item -Change reading through tables to use memmap when possible. Now only -compressed tables use memmap. -@item -Add a new privilege @strong{'Show_priv'} for @code{SHOW} commands. -@item -Make the automatic timestamp code nicer. Add timestamps to the update -log with @code{SET TIMESTAMP=#;} -@item -Use read/write mutex in some places to get more speed. -@item -Full foreign key support. One probably wants to implement a procedural -language first. -@item -Simple views (first on one table, later on any expression). -@item -Automatically close some tables if a table, temporary table or temporary files -gets error 23 (not enough open files). -@item -When one finds a field=#, change all occurrences of field to #. Now this -is only done for some simple cases. -@item -Change all const expressions with calculated expressions if possible. -@item -Optimize key = expression. At the moment only key = field or key = -constant are optimized. -@item -Join some of the copy functions for nicer code. -@item -Change @file{sql_yacc.yy} to an inline parser to reduce its size and get -better error messages (5 days). -@item -Change the parser to use only one rule per different number of arguments -in function. -@item -Use of full calculation names in the order part. (For ACCESS97) -@item -@code{UNION}, @code{MINUS}, @code{INTERSECT} and @code{FULL OUTER JOIN}. -(Currently only @code{LEFT OUTER JOIN} is supported) -@item -Allow @code{UNIQUE} on fields that can be @code{NULL}. -@item -@code{SQL_OPTION MAX_SELECT_TIME=#} to put a time limit on a query. -@item -Make the update log to a database. -@item -Negative @code{LIMIT} to retrieve data from the end. -@item -Alarm around client connect/read/write functions. -@item -Make a @code{mysqld} version which isn't multithreaded (3-5 days). -@item -Please note the changes to @code{safe_mysqld}: according to FSSTND (which -Debian tries to follow) PID files should go into @file{/var/run/.pid} -and log files into @file{/var/log}. It would be nice if you could put the -"DATADIR" in the first declaration of "pidfile" and "log", so the -placement of these files can be changed with a single statement. -@item -Better dynamic record layout to avoid fragmentation. -@item -@code{UPDATE SET blob=read_blob_from_file('my_gif') where id=1;} -@item -Allow a client to request logging. -@item -Add use of @code{zlib()} for @code{gzip}-ed files to @code{LOAD DATA INFILE}. -@item -Fix sorting and grouping of @code{BLOB} columns (partly solved now). -@item -Stored procedures. This is currently not regarded to be very -important as stored procedures are not very standardized yet. -Another problem is that true stored procedures make it much harder for -the optimizer and in many cases the result is slower than before -We will, on the other hand, add a simple (atomic) update language that -can be used to write loops and such in the @strong{MySQL} server. -@item -Change to use semaphores when counting threads. One should first implement -a semaphore library to MIT-pthreads. -@item -Don't assign a new @code{AUTO_INCREMENT} value when one sets a column to 0. -Use @code{NULL} instead. -@item -Add full support for @code{JOIN} with parentheses. -@item -Reuse threads for systems with a lot of connections. -@item -As an alternative for one thread / connection manage a pool of threads -to handle the queries. -@item -Allow one to get more than one lock with @code{GET_LOCK}. When doing this, -one must also handle the possible deadlocks this change will introduce. -@end itemize - -Time is given according to amount of work, not real time. TcX's main -business is the use of @strong{MySQL} not the development of it. But -because TcX is a very flexible company, we have put a lot of resources -into the development of @strong{MySQL}. - -@node TODO unplanned, , TODO sometime, TODO -@appendixsec ԤͽΤʤʪ - -@itemize @bullet -@item -Nothing; In the long run we plan to be fully ANSI 92 / ANSI 99 compliant. -@end itemize - -@node Porting, Regexp, TODO, Top -@appendix ¾ΥƥؤΰܿˤĤ - -A working Posix thread library is needed for the server. On Solaris 2.5 -we use Sun PThreads (the native thread support in 2.4 and earlier -versions are not good enough) and on Linux we use LinuxThreads by Xavier -Leroy, @email{Xavier.Leroy@@inria.fr}. - -The hard part of porting to a new Unix variant without good native -thread support is probably to port MIT-pthreads. See -@file{mit-pthreads/README} and -@uref{http://www.humanfactor.com/pthreads/, Programming POSIX Threads}. - -The @strong{MySQL} distribution includes a patched version of -Provenzano's Pthreads from MIT (see -@uref{http://www.mit.edu:8001/people/proven/pthreads.html, MIT Pthreads -web page}). This can be used for some operating systems that do not -have POSIX threads. - -It is also possible to use another user level thread package named -FSU Pthreads (see -@uref{http://www.informatik.hu-berlin.de/~mueller/pthreads.html, FSU Pthreads -home page}). This implementation is being used for the SCO port. - -See the @file{thr_lock.c} and @file{thr_alarm.c} programs in the @file{mysys} -directory for some tests/examples of these problems. - -Both the server and the client need a working C++ compiler (we use @code{gcc} -and have tried SparcWorks). Another compiler that is known to work is the -Irix @code{cc}. - -To compile only the client use @code{./configure --without-server}. - -There is currently no support for only compiling the server, nor is it -likly to be added unless someone has a good reason for it. - -If you want/need to change any @file{Makefile} or the configure script you must -get Automake and Autoconf. We have used the @code{automake-1.2} and -@code{autoconf-2.12} distributions. - -All steps needed to remake everything from the most basic files. - -@example -/bin/rm */.deps/*.P -/bin/rm -f config.cache -aclocal -autoheader -aclocal -automake -autoconf -./configure --with-debug --prefix='your installation directory' - -# The makefiles generated above need GNU make 3.75 or newer. -# (called gmake below) -gmake clean all install init-db -@end example - -If you run into problems with a new port, you may have to do some debugging -of @strong{MySQL}! -@xref{Debugging server}. - -@strong{Note:} Before you start debugging @code{mysqld}, first get the test -programs @code{mysys/thr_alarm} and @code{mysys/thr_lock} to work. This -will ensure that your thread installation has even a remote chance to work! - -@menu -* Debugging server:: Debugging a @strong{MySQL} server -* Debugging client:: Debugging a @strong{MySQL} client -* RTS-threads:: Comments about RTS threads -* Thread packages:: Differences between different thread packages -@end menu - -@node Debugging server, Debugging client, Porting, Porting -@appendixsec MySQL server ΥǥХå - -⤷ʤ @strong{MySQL} ΤȤƤ⿷뵡ǽȤäƤ硢 - @code{--skip-new} (Ū˴ʵǽ̵ˤޤ) -ޤ @code{--safe-mode} (뤫⤷ʤ¿κŬ̵ˤޤ) -ץ mysqld ¹Ԥ뤳ȤǤޤ -@xref{Crashing}. - -⤷ @code{mysqld} ưʤ褦ʤ顢 @code{my.cnf} ̵åƤ -@code{my.cnf} ΰ @code{mysqld --print-defaults} ǥåǤޤ -ޤ @code{mysqld --no-defaults ...} ǵư뤳Ȥˤꡢ - @code{my.cnf} ̵뤹뤳ȤǽǤ - -⤷ȤƤü꤬СʤϡĤ @strong{MySQL} -ǥХå褦ߤ뤳ȤǤޤ Ԥˤϡ @strong{MySQL} - @code{--with-debug} ץդ configure ʤƤϤʤޤ -@strong{MySQL} ǥХå󥰤ͭˤƥѥ뤵Ƥ뤫 -Τˤϡ @code{mysqld --help} Ȥޤ ⤷ @code{--debug} ե饰 -ꥹȤƤХǥХåͭǤ @code{mysqladmin ver} -@code{mysqld} ΥСꥹȤǤޤ ξ - @code{mysql ... -debug} ȡСֹɽǤ礦 - -gcc egcs ξ硢侩 configure Υ饤ϡ - -@example -CC=gcc CFLAGS="-O6" CXX=gcc CXXFLAGS="-O6 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-debug -@end example - - @code{libstdc++} 饤֥ C++ 㳰ˤ򤱤뤳ȤǤ礦 -(many compilers have problems with C++ exceptions in threaded -code). - -If @code{mysqld} stops crashing when you compile it with -@code{--with-debug}, you have probably found a compiler bug or a timing -bug within @strong{MySQL}. In this case you can try to add @code{-g} to -the @code{CFLAGS} and @code{CXXFLAGS} variables above and not use -@code{--with-debug}. If @code{mysqld} now dies, you can at least -attach to it with @code{gdb} or use @code{gdb} on the core file to find out what happened. - -⤷ @code{mysqld} СΥåľ˰ȤǤʤ顢 -ʤϤΥȥ졼ե뤳ȤǤޤ - -@code{mysqld} Сȥ졼ե @file{/tmp/mysql.trace} ץǵư -ΥեϤȤƤ礭ʤޤ - -@code{mysqld --debug --log} - - - -@code{mysqld --debug=d,info,error,query,general,where:O,/tmp/mysql.trace} - -ϽפʥΤߤϤޤ - - @strong{MySQL} ǥХå configure ȡư¿ΰʸؿ -enable ˤʤޤ @code{mysqld} ξ֤˥Ǥޤ -⤷ؿʤˤ ``ͽ̤'' ȯ顢 -@code{stderr} ˽񤭽Фޤ @code{safe_mysqld} ä error -񤭽Фޤ ΤȤϤɤȤȤȡ @strong{MySQL} ͽ̤Ȥ -硢ޤǽˤ٤Ȥϡ @strong{MySQL} ǥХåͭˤ -configure 뤳ȤǤ ʼˡ @email{mysql@@lists.mysql.com} -᡼ꡢhelp ʹȤǤ ƤΥХݡȡ@strong{MySQL} ΥС -Ϣϡ @code{mysqlbug} ץȤѤƤ - -ۤȤɤΥƥǤϡ⤷ @code{mysqld} å夹ʤ顢 - @code{gdb} @code{mysqld} ư¿ξ뤳ȤǽǤ - -Linux ǤΤĤ @code{gdb} СǤϡ - @code{mysqld} åɤΥǥХåǽˤ硢 - @code{run --one-thread} ѤʤƤϤʤޤ -ξ硢٤ˤĤactiveʥåɤĤȤˤʤޤ - -It's very hard to debug @strong{MySQL} under @code{gdb} if you do a lot of -new connections the whole time as @code{gdb} doesn't free the memory for -old threads. You can avoid this problem by starting @code{mysqld} with -@code{-O thread_cache_size= 'max_connections +1'}. In most cases just -using @code{-O thread_cache_size= 5'} will help a lot! - -⤷ Linux gdb 4.17.x ѤƤʤ顢 @file{.gdb} ե -ˤäơȤΥǥ쥯ȥ꡼˥󥹥ȡ뤹٤Ǥ - -@example -set print sevenbit off -handle SIGUSR1 nostop noprint -handle SIGUSR2 nostop noprint -handle SIGWAITING nostop noprint -handle SIGLWP nostop noprint -handle SIGPIPE nostop -handle SIGALRM nostop -handle SIGHUP nostop -handle SIGTERM nostop noprint -@end example - -If you have problems debugging threads with gdb, you should download -gdb 5.x and try this instead. The new gdb version has very improved -thread handling! - -ʲ mysqld ΥǥХåǤ - -@example -shell> gdb /usr/local/libexec/mysqld -gdb> run -... -back # mysqld å夷ݡԤޤ -info locals -up -info locals -up -... -(until you get some information about local variables) - -quit -@end example - -嵭νϤ @code{mysqlbug} Ǻ᡼˴ޤߡ - @code{mysql@@lists.mysql.com}. äƤ - -⤷ @code{mysqld} ϥ󥰤ʤ顢 - @code{strace} @code{/usr/proc/bin/pstack} Τ褦 -ƥġѤ @code{mysqld} ɤǥϥ󥰤Ƥ뤫 -Ĵ٤뤳ȤǤޤ - -⤷ @code{mysqld} CPU ꡼ 򿩤Ϥ᤿ꡢ``ϥ'' ꤹʤ顢 - @code{mysqladmin processlist status} Ѥï¿λ֤Τ -¹ԤƤ뤫Τ뤳Ȥޤ -ѥեޥ󥹤俷饤Ȥ³ǤʤȤ -⤷ʤͤʤ顢 -ĤΥɥ @code{mysqladmin -i10 processlist status} -¹ԤΤϤ褤ͤǤ礦 - -⤷ @code{mysqld} ϥ󥰤ꤹʤ顢 @code{mysqld} -@code{--log} ǵư٤Ǥ Ƥ @code{mysqld} 顢 -ʤϥեΡ @code{mysqld} kill 륯åޤ -@code{mysqld} @code{--log} ץǵưˡ -ƤΥơ֥ @code{myisamchk} ǥå٤Ǥ -Υå˥ơ֥뤬Ƥ뤫⤷ʤΤǡ -@xref{Maintenance}. - -⤷ @code{mysqld --log} ǥեѤʤ顢'hostname' ե롢 -ϥǡ١ǥ쥯ȥˤޤå -򸫤Ĥޤ -mysqld Ŭڤ˥ǥåѤΤ˻֤ȤƤ⤫Ƥ @code{SELECT} ʸ - @code{EXPLAIN} Ǽ¹Ԥ뤳Ȥߤޤ @xref{EXPLAIN, , @code{EXPLAIN}}. -ޤ@code{mysql} ޥɥ饤ǤϽʤäʣʥƥȤ٤Ǥ - -⤷顼ե(@file{hostname.err}) @code{mysqld restarted} Ȥʸʤ顢 -@code{mysqld} Ԥ륯򸫤Ĥޤ -⤷줬ʤ顢@code{myisamchk} (@pxref{Maintenance}) ƤΥơ֥å -@strong{MySQL} եˤ뤽ΥƥȤ٤Ǥ -⤷Τ褦ʥߤĤʤ顢ޤǽ˺ǿ @strong{MySQL} ˥åץ졼 -ƤߤƤ ⤷Ǥǡ @code{mysql} ᡼󥰥ꥹȤ -֤ˤʤˤ⸫Ĥ뤳Ȥʤäʤ顢 @email{mysql@@lists.mysql.com} -ХݡȤФ٤Ǥ ᡼󥰥ꥹȤΥ֤ؤΥ󥯤 -@uref{http://www.mysql.com/doc.html, @strong{MySQL} documentation page}. - -⤷ʥơ֥򤨤ꡢ @code{mysqld} ˤĤ update ޥɤ -Ԥʤ顢ʲΤ褦ˤƤΥХκƸƥȤޤ - -@itemize @bullet -@item -mysqld daemon (@code{mysqladmin shutdown} ) -@item -@code{myisamchk -s database/*.MYI} ơ֥å. -@code{myisamchk -r database/table.MYI} ǰơ֥ -@item -@code{mysqld} @code{--log-update} ǥ. @xref{Update log}. -@item -줿ơ֥@code{mysqld server} ߡ -@item -Хååפꥹȥ -@item -@code{mysqld} server @code{--log-update} @strong{ʤ} ư -@item -@code{mysql < update-log} ǺƼ¹ԡ update log -@strong{MySQL} ǡ١ǥ쥯ȥ -@code{your-hostname.#} Ȥ̾¸Ƥޤ -@item -Ǥ⤷Ƥӥơ֥뤬ʤʤ顢 @code{ISAM} -ƸǽʥХ򸫤ĤȤˤʤޤ -Υơ֥ update log @uref{ftp://www.mysql.com/pub/mysql/secret} -FTP put ޤ ϤǤ¤®ޤ -@end itemize - -@code{mysqladmin debug} ޥɤϻΥåѤƤꡢ -λѤξmysql եˤĤפޤ -ϤĤΩޤ Υޥɤϡ @strong{MySQL} -ǥХåǽǥѥ뤷ƤʤƤ⡢ĤΩľ󶡤ޤ - -ĤΥơ֥Ǥ٤ʤǤʤ顢 @code{OPTIMIZE TABLE} -@code{myisamchk} ǥơ֥Ŭߤ٤Ǥ -٤ϡ @code{EXPLAIN} ǤåǤޤ -@xref{Maintenance}. - -Υޥ˥奢 OS ͭ ɤ٤Ǥ -@xref{Source install system issues}. - -@findex DBI->trace -@findex trace DBI method -@tindex DBI_TRACE environment variable -@tindex Environment variable, DBI_TRACE -⤷ Perl @code{DBI} ѤƤʤ顢 - @code{trace} ᥽åɡ뤤@code{DBI_TRACE} Ķѿ -ǥХåͭˤǤޤ -@xref{Perl DBI Class, , Perl @code{DBI} Class}. - -@node Debugging client, RTS-threads, Debugging server, Porting -@appendixsec Debugging a MySQL client - -To be able to debug a @strong{MySQL} client with the integrated debug package, -you should configure @strong{MySQL} with @code{--with-debug}. -@xref{configure options}. - -@tindex MYSQL_DEBUG environment variable -@tindex Environment variable, MYSQL_DEBUG -Before running a client, you should set the @code{MYSQL_DEBUG} environment -variable: - -@example -shell> MYSQL_DEBUG=d:t:O,/tmp/client.trace -shell> export MYSQL_DEBUG -@end example - -This causes clients to generate a trace file in @file{/tmp/client.trace}. - -If you have problems with your own client code, you should attempt to -connect to the server and run your query using a client that is known to -work. Do this by running @code{mysql} in debugging mode (assuming you -have compiled @strong{MySQL} with debugging on): - -@example -shell> mysql --debug=d:t:O,/tmp/client.trace -@end example - -This will provide useful information in case you mail a bug report. -@xref{Bug reports}. - -If your client crashes at some 'legal' looking code, you should check -that your @file{mysql.h} include file matches your mysql library file. -A very common mistake is to use an old @file{mysql.h} file from an old -@strong{MySQL} installation with new @strong{MySQL} library. - -@node RTS-threads, Thread packages, Debugging client, Porting -@appendixsec Comments about RTS threads - -I have tried to use the RTS thread packages with @strong{MySQL} but -stumbled on the following problems: - -They use an old version of a lot of POSIX calls and it is very tedious to -make wrappers for all functions. I am inclined to think that it would -be easier to change the thread libraries to the newest POSIX -specification. - -Some wrappers are already written. See @file{mysys/my_pthread.c} for more info. - -At least the following should be changed: - -@code{pthread_get_specific} should use one argument. -@code{sigwait} should take two arguments. -A lot of functions (at least @code{pthread_cond_wait}, -@code{pthread_cond_timedwait}) -should return the error code on error. Now they return -1 and set @code{errno}. - -Another problem is that user-level threads use the @code{ALRM} signal and this -aborts a lot of functions (@code{read}, @code{write}, @code{open}...). -@strong{MySQL} should do a retry on interrupt on all of these but it is -not that easy to verify it. - -The biggest unsolved problem is the following: - -To get thread-level alarms I changed @file{mysys/thr_alarm.c} to wait between -alarms with @code{pthread_cond_timedwait()}, but this aborts with error -@code{EINTR}. I tried to debug the thread library as to why this happens, -but couldn't find any easy solution. - -If someone wants to try @strong{MySQL} with RTS threads I suggest the -following: - -@itemize @bullet -@item -Change functions @strong{MySQL} uses from the thread library to POSIX. -This shouldn't take that long. -@item -Compile all libraries with the @code{-DHAVE_rts_threads}. -@item -Compile @code{thr_alarm}. -@item -If there are some small differences in the implementation, they may be fixed -by changing @file{my_pthread.h} and @file{my_pthread.c}. -@item -Run @code{thr_alarm}. If it runs without any ``warning'', ``error'' or aborted -messages, you are on the right track. Here follows a successful run on -Solaris: -@example -Main thread: 1 -Tread 0 (5) started -Thread: 5 Waiting -process_alarm -Tread 1 (6) started -Thread: 6 Waiting -process_alarm -process_alarm -thread_alarm -Thread: 6 Slept for 1 (1) sec -Thread: 6 Waiting -process_alarm -process_alarm -thread_alarm -Thread: 6 Slept for 2 (2) sec -Thread: 6 Simulation of no alarm needed -Thread: 6 Slept for 0 (3) sec -Thread: 6 Waiting -process_alarm -process_alarm -thread_alarm -Thread: 6 Slept for 4 (4) sec -Thread: 6 Waiting -process_alarm -thread_alarm -Thread: 5 Slept for 10 (10) sec -Thread: 5 Waiting -process_alarm -process_alarm -thread_alarm -Thread: 6 Slept for 5 (5) sec -Thread: 6 Waiting -process_alarm -process_alarm - -... -thread_alarm -Thread: 5 Slept for 0 (1) sec -end -@end example -@end itemize - -@node Thread packages, , RTS-threads, Porting -@appendixsec åɥѥå֤ΰ㤤ϲ - -@strong{MySQL} ϻѤ륹åɥѥå˰¸Ƥޤ -Τᡢ@strong{MySQL} ɤץåȥե򤹤ˤϡ -åɥѥå˽פǤ - -ʤȤ3ĤΥפΥåɥѥåޤ - -@itemize @bullet -@item -󥰥ץΥ桼åɡ -åؤϥ顼Ǵ졢 -åɥ饤֥ϥåȼ󥹥åɰؿΤ٤Ƥޤ -ư楹åɤǡԤɬפ硢read, write select ϡ -̾¾Υåɤؤ륹åɸͭ select Ǵޤ -⤷桼åɥѥåɸ饤֥ (FreeBSD BSDI å) -礵Ƥʤ顢åɥѥåΥСإåɤϡƤ -ޥåפʤФʤʤåɥѥå(MIT-å, FSU-å, RTS å) -⾯ʤʤޤ -¾δĶ(㤨 SCO)ǤϡƤΥƥॳϥåɰʤΤǡ -ޥåԥ󥰤ϤȤƤñ˹Ԥʤޤ(SCO FSU-å) -Downside: ƤΥޥåפ륳Ͼ֤ꡢƤξ -ǽˤ뤳ȤϡȤƤ⺤Ǥ -̾åɥѥåˤäƽǤʤƥॳ뤬Ĥޤ -(MIT-åɤȥåȤΤ褦) åɥ塼󥰤Ͼ˺ -ŬȤ櫓ǤϤ ޤ -@item -̤ΥץʤΥ桼åɡ -åؤϥͥˤäƹԤʤ졢ƤΥǡϥåɴ֤Ƕͭޤ -åɥѥåϡ ɴ֤ΥǡͭĤ뤿ɸॹåɥޤ -LinuxThreads ϤˡѤƤޤ -Downside: ¿Υץå٤Ǥ -⤷ĤΥåɤ̤ȡĤ̾ϥ󥰤ƻĤꡢƵư - kill ɬפޤåؤϤ餫(expensive)Ǥ -@item -ͥ륹åɡ -åؤϥåɥ饤֥꤫ͥˤäƽ졢 -ȤƤ®Ǥ ƤϰĤΥץǹԤʤޤ -ĤΥƥǤϡ@code{ps} ۤʤäåɤ򼨤ޤ -⤷ĤΥåɤܡȤ硢ץΤܡȤޤ -¿ΥƥॳϥåɰǡСإåɤϤȤƤ⾯ʤǤ -Solaris, HP/UX, AIX OSF1 ͥ륹åɤäƤޤ -@end itemize - -ĤΥƥǤϡͥ륹åɤϡƥ饤֥ǡ -桼٥륹åɤˤäƴޤ -ξ硢åؤϥåɥ饤֥ˤäƤԤʤ졢 -ͥϼºݤˤ 'thread aware' ǤϤޤ - - -@node Regexp, Unireg, Porting, Top -@appendix MySQL ɽʸˡˤĤ - -A regular expression (regex) is a powerful way of specifying a complex search. - -@strong{MySQL} ɽ regular Henry Spencers Ѥޤ -Ƥ POSIX 1003.2 ˰פ뤳Ȥ -ŪǤ@strong{MySQL} ϳĥ СѤޤ - -Ͼܺ٤ʤñʥե󥹤Ǥ -Τʾ Henry Spencers @code{regex(7)} ޥ˥奢򸫤Ƥ -ϥۤ˴ޤޤƤޤ @xref{Credits}. - -ɽʸȤ߹碌ƵҤޤ -äȤñʾϡüʸΰʸǤ㤨С -regexp @code{hello} @code{hello} Ŭ礷 ¾ˤŬ礷ޤ - -ñǤʤɽϡ1ĤʸʾŬǤ褦ʡĤ -üʹѤޤ㤨Сregexp @code{hello|word} -ʸ @code{hello} ʸ @code{word} Ŭ礷ޤ - -Ƥʣ regexp @code{B[an]*s} ϡ -ʸ @code{Bananas}, @code{Baaaaas}, @code{Bs} Τɤ줫 - @code{B} ǻϤޤ @code{a} @code{n} -Ǥդο³@code{s} ǽ褦¾ʸŬ礷ޤ - -ɽǤϡüʸ/ѤǤޤ -@table @code -@item ^ -ʸΤλϤޤꡣ -@example -mysql> select "fo\nfo" REGEXP "^fo$"; -> 0 -mysql> select "fofo" REGEXP "^fo"; -> 1 -@end example -@item $ -ʸΤνꡣ -@example -mysql> select "fo\no" REGEXP "^fo\no$"; -> 1 -mysql> select "fo\no" REGEXP "^fo$"; -> 0 -@end example -@item . -Ǥդʸ (Դޤ) -@example -mysql> select "fofo" REGEXP "^f.*"; -> 1 -mysql> select "fo\nfo" REGEXP "^f.*"; -> 1 -@end example -@item a* -0İʾʸ @code{a} ¤ӡ -@example -mysql> select "Ban" REGEXP "^Ba*n"; -> 1 -mysql> select "Baaan" REGEXP "^Ba*n"; -> 1 -mysql> select "Bn" REGEXP "^Ba*n"; -> 1 -@end example -@item a+ -ʸ @code{a} 1İʾ¤֡ -@example -mysql> select "Ban" REGEXP "^Ba+n"; -> 1 -mysql> select "Bn" REGEXP "^Ba+n"; -> 0 -@end example -@item a? -0 ޤ 1Ĥʸ @code{a} -@example -mysql> select "Bn" REGEXP "^Ba?n"; -> 1 -mysql> select "Ban" REGEXP "^Ba?n"; -> 1 -mysql> select "Baan" REGEXP "^Ba?n"; -> 0 -@end example -@item de|abc -@code{de} @code{abc} ˥ޥå -@example -mysql> select "pi" REGEXP "pi|apa"; -> 1 -mysql> select "axe" REGEXP "pi|apa"; -> 0 -mysql> select "apa" REGEXP "pi|apa"; -> 1 -mysql> select "apa" REGEXP "^(pi|apa)$"; -> 1 -mysql> select "pi" REGEXP "^(pi|apa)$"; -> 1 -mysql> select "pix" REGEXP "^(pi|apa)$"; -> 0 -@end example -@item (abc)* -ʸ @code{abc} 0 ʾ¤Ӥ˥ޥå -@example -mysql> select "pi" REGEXP "^(pi)*$"; -> 1 -mysql> select "pip" REGEXP "^(pi)*$"; -> 0 -mysql> select "pipi" REGEXP "^(pi)*$"; -> 1 -@end example -@item @{1@} -@itemx @{2,3@} -¿ȯŬ礹 regexp εҤŪˡ -The is a more general way of writing regexps that match many -occurrences of the previous atom. -@table @code -@item a* -Can be written as @code{a@{0,@}}. -@item a+ -Can be written as @code{a@{1,@}}. -@item a? -Can be written as @code{a@{0,1@}}. -@end table -Τˤϡ1Ĥ i ȥ̵ޤཤ³ȥϡ -̩˥ȥŬ礹 @code{i} ¤ӤŬ礷ޤ - @code{i} ȥޤޤཤ³ȥϡ -ȥŬ礹 @code{i} ʾ¤ӤŬ礷ޤ - @code{i} @code{j} ޤ³ȥϡ -ȥŬ 礹 @code{i} 󤫤 @code{j} ޤǤ¤ӤŬ礷ޤ - -ξΰ @code{0 >= value <= RE_DUP_MAX (default 255)} ǤʤȤ ޤ -ơ2Ĥ硢2ܤ1ܤ礭ƱǤʤȤޤ -@item [a-dX] -@itemx [^a-dX] -@code{a}, @code{b}, @code{c}, @code{d}, @code{X} Τɤ줫ʸ - (@code{^} ѤȤɤǤʤʸ) ˥ޥå -@code{]} ʸޤˤϡ @code{[} ΤȤ³Ƥ˽ɬפޤ - -@code{-} ʸޤˤϺǽ餫Ǹ˽ɬפޤ -@code{[0-9]} Ǥ 10ʿͤŬ礷ޤ @code{[]} ڥ줿 -̣ʤƤʸϡüʰ̣켫ȤˤŬ礷ޤ -@example -mysql> select "aXbc" REGEXP "[a-dXYZ]"; -> 1 -mysql> select "aXbc" REGEXP "^[a-dXYZ]$"; -> 0 -mysql> select "aXbc" REGEXP "^[a-dXYZ]+$"; -> 1 -mysql> select "aXbc" REGEXP "^[^a-dXYZ]+$"; -> 0 -mysql> select "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1 -mysql> select "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0 -@end example -@item [[.characters.]] -ȹ(collating element)ʸ¤ӡ -¤ӤϳɽꥹȤΰĤǤǤ -ʣʸξȹǤޤɽϰİʾʸŬ礷ޤ -㤨Сȹ¤Ӥ @code{ch} ȹǤޤ硢 -ɽ @code{[[.ch.]]*c} @code{chchcc} κǽ5ʸŬ礷ޤ - -@item [=character_class=] -ƱΥ饹ΰĤƤξȹǤʸ¤Ӥɽޤ켫Ȥޤߤޤ - -㤨С@code{o} @code{(+)} Ʊ饹ΥФǤ硢 - @code{[[=o=]]}, @code{[[=(+)=]]}, @code{[[=(+)=]]} ƱǤ -Ʊ饹ϰϤνλ֤ˤϤʤޤ - -@item [:character_class:] -ɽǡ@code{[:} @code{:]} dz줿ʸ饹̾ϡ -Υ饹°ƤʸΥꥹȤɽޤɸʸ饹̾: - -@multitable @columnfractions .33 .33 .33 -@item alnum @tab digit @tab punct -@item alpha @tab graph @tab space -@item blank @tab lower @tab upper -@item cntrl @tab print @tab xdigit -@end multitable - - @code{ctype(3)} ޥ˥奢ڡ˵ܤƤʸ饹ɽޤ -뤬¾Τ󶡤뤳Ȥ⤢ޤʸ饹ϰϤνλ֤ȤƤϻȤޤ -@example -mysql> select "justalnums" REGEXP "[[:alnum:]]+"; -> 1 -mysql> select "!!" REGEXP "[[:alnum:]]+"; -> 0 -@end example - -@item [[:<:]] -@itemx [[:>:]] -줾졢ñλϤȽζʸŬ礷ޤñϡñʸ -ˤʤñʸ¤ӤȤޤñʸ alnum ʸ - (@code{ctype(3)} ޤ) Ȳ(underscore @code{_})Ǥ -@example -mysql> select "a word a" REGEXP "[[:<:]]word[[:>:]]"; -> 1 -mysql> select "a xword a" REGEXP "[[:<:]]word[[:>:]]"; -> 0 -@end example -@end table - -@example -mysql> select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1 -@end example - -@node Unireg, Public license, Regexp, Top -@appendix UNIREG Ȥϲ - -UNIREG ϲ桹 tty 󥿥եӥǤ -ϲ桹 (@strong{MySQL} ǻѤ) ISAM ؤ٥³˻Ѥޤ -줬ȤƤ®Ǥ 1979 ǯ (UNIX C 1986 ǯ) ¸ߤƤޤ - -UNIREG ϼΥݡͥȤޤ: - -@itemize @bullet -@item -ĤΥơ֥λȡ/Ȳˡ -@item -ʣΥơ֥λ (1ϰϤ) -@item -ơ֥ (@strong{MySQL} ǤϺǤʤιܥ) - (tty ) WYSIWYG Ǥ꡼ UNIREG ץץȤܤȤ˥ǥǤޤ -@item -ݡ -@item -Υ桼ƥƥ (ƥȥեؤΥơ֥ι®ݡ/ݡ ȡơ֥Ƥβ...) -@item -Ϥʣơ֥ι (桹ˤˤѤޤ) -BASIC ˻¿ εǽäƤޤ -@item -ưŪʸ(ߤϥǥȥեɸ) -ïѸСߤΤʤ顢ʤȤʤĤΥե뤬ޤ -@item -ŪˤޤϥХåǹ¹Ԥ뵡ǽ -@item -Emacs ˻ܡɥޥդ -@item - 800k ΥХʥꡣ -@item -@code{convform} 桼ƥƥۤʤʸåȴ֤ @file{.frm} ȥƥȥեѴޤ -@item -@code{mpack_isam} 桼ƥƥ ISAM ơ֥ѥåޤ(50-80% Ǥޤ) -Υơ֥̤Υơ֥Ʊ褦 @strong{MySQL} ɤ߹ߤǤޤ -1 쥳 ɤ̲ / ɬפޤ -@code{BLOB} @code{TEXT} ܤȹ(ޤ)Ǥޤ -@end itemize - -桹ϡUNIREG 󥿥ե¿β桹ʥǡ١򹹿 -@strong{MySQL} (ƤĤüʾ硢UNIREG ݡץ) ̤ -Web ڡ󶡤ޤ - -UNIREG 3M ΥǥΰѤʤȤ⼡Υץåȥեưޤ: - SUN OS 4.x, Solaris, Linux, HP/UX, ICL Unix, DNIX, SCO MSDOS - -UNIREG ϸߥǥȥեɸǤΤͭǤ - -UNIREG βʤ 10,000 ǥ kr ( 1500$ US) Ǥ -ϥݡȤޤߤޤ UNIREG ϥХʥۤޤ - (Ƥ ISAM @strong{MySQL} ˸Ĥޤ) -̾桹ϸܵҤΥȤˤƸܵѤ˥Хʥ򥳥ѥ뤷ޤ - -ȯ @strong{MySQL} ˽椷Ƥޤ - -@page -@c This node name is special -@node Public license, Win license, Unireg, Top -@appendix The MySQL server license for non Microsoft operating systems - -@center @strong{MySQL FREE PUBLIC LICENSE} -@center (Version 4, March 5, 1995) - -@center Copyright (C) 1995, 1996 TcX AB & MySQL Finland AB & Detron HB -@center Stockholm SWEDEN, Helsingfors FINLAND and Uppsala SWEDEN -@center All rights reserved. - -NOTE: This license is not the same as any of the GNU Licenses published -by the Free Software Foundation. Its terms are substantially different -from those of the GNU Licenses. If you are familiar with the GNU -Licenses, please read this license with extra care. - -This License applies to the computer program known as "MySQL". The -"Program", below, refers to such program, and a "work based on the -Program" means either the Program or any derivative work of the Program, -as defined in the United States Copyright Act of 1976, such as a -translation or a modification. The Program is a copyrighted work whose -copyright is held by TcX Datakonsult AB and MySQL Finland AB and Detron -HB. - -This License does not apply when running "MySQL" on any Microsoft -operating system. Microsoft operating systems include all versions of -Microsoft Windows NT and Microsoft Windows. - -BY MODIFYING OR DISTRIBUTING THE PROGRAM (OR ANY WORK BASED ON THE -PROGRAM), YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL -ITS TERMS AND CONDITIONS FOR COPYING, DISTRIBUTING OR MODIFYING THE -PROGRAM OR WORKS BASED ON IT. NOTHING OTHER THAN THIS LICENSE GRANTS -YOU PERMISSION TO MODIFY OR DISTRIBUTE THE PROGRAM OR ITS DERIVATIVE -WORKS. THESE ACTIONS ARE PROHIBITED BY LAW. IF YOU DO NOT ACCEPT THESE -TERMS AND CONDITIONS, DO NOT MODIFY OR DISTRIBUTE THE PROGRAM. - -@enumerate -@item -Licenses. - -Licensor hereby grants you the following rights, provided that you -comply with all of the restrictions set forth in this License and -provided, further, that you distribute an unmodified copy of this -License with the Program: - -@enumerate a -@item -You may copy and distribute literal (i.e., verbatim) copies of the -Program's source code as you receive it throughout the world, in any -medium. -@item -You may modify the Program, create works based on the Program and -distribute copies of such throughout the world, in any medium. -@end enumerate - -@item -Restrictions. - -This license is subject to the following restrictions: -@enumerate a -@item -Distribution of the Program or any work based on the Program by a -commercial organization to any third party is prohibited if any payment is -made in connection with such distribution, whether directly (as in payment -for a copy of the Program) or indirectly (as in payment for some service -related to the Program, or payment for some product or service that -includes a copy of the Program "without charge"; these are only examples, -and not an exhaustive enumeration of prohibited activities). However, the -following methods of distribution involving payment shall not in and of -themselves be a violation of this restriction: - -@enumerate A -@item -Posting the Program on a public access information storage and retrieval -service for which a fee is received for retrieving information (such as -an on-line service), provided that the fee is not content-dependent -(i.e., the fee would be the same for retrieving the same volume of -information consisting of random data). -@item -Distributing the Program on a CD-ROM, provided that the files containing -the Program are reproduced entirely and verbatim on such CD-ROM, and -provided further that all information on such CD-ROM be redistributable -for non-commercial purposes without charge. -@end enumerate -@item -Activities other than copying, distribution and modification of the -Program are not subject to this License and they are outside its scope. -Functional use (running) of the Program is not restricted, and any -output produced through the use of the Program is subject to this -license only if its contents constitute a work based on the Program -(independent of having been made by running the Program). -@item -You must meet all of the following conditions with respect to the -distribution of any work based on the Program: -@enumerate A -@item -If you have modified the Program, you must cause your work to carry -prominent notices stating that you have modified the Program's files and -the date of any change; -@item -You must cause any work that you distribute or publish, that in whole or -in part contains or is derived from the Program or any part thereof, to -be licensed as a whole and at no charge to all third parties under the -terms of this License; -@item -If the modified program normally reads commands interactively when run, -you must cause it, at each time the modified program commences -operation, to print or display an announcement including an appropriate -copyright notice and a notice that there is no warranty (or else, saying -that you provide a warranty). Such notice must also state that users -may redistribute the Program only under the conditions of this License -and tell the user how to view the copy of this License included with the -Program. (Exception: if the Program itself is interactive but does not -normally print such an announcement, your work based on the Program is -not required to print an announcement.); -@item -You must accompany any such work based on the Program with the complete -corresponding machine-readable source code, delivered on a medium -customarily used for software interchange. The source code for a work -means the preferred form of the work for making modifications to it. -For an executable work, complete source code means all the source code -for all modules it contains, plus any associated interface definition -files, plus the scripts used to control compilation and installation of -the executable code. However, the source code distributed need not -include anything that is normally distributed (in either source or -binary form) with the major components (compiler, kernel, and so on) of -the operating system on which the executable runs, unless that component -itself accompanies the executable code; -@item -If you distribute any written or printed material at all with the -Program or any work based on the Program, such material must include -either a written copy of this License, or a prominent written indication -that the Program or the work based on the Program is covered by this -License and written instructions for printing and/or displaying the copy -of the License on the distribution medium; -@item -You may not impose any further restrictions on the recipient's -exercise of the rights granted herein. - -If distribution of executable or object code is made by offering the -equivalent ability to copy from a designated place, then offering -equivalent ability to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source code along with the object code. -@end enumerate -@end enumerate -@item -Reservation of Rights. - -No rights are granted to the Program except as expressly set forth -herein. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt otherwise -to copy, modify, sublicense or distribute the Program is void, and will -automatically terminate your rights under this License. However, parties -who have received copies, or rights, from you under this License will not -have their licenses terminated so long as such parties remain in full -compliance. - -@item -Other Restrictions. - -If the distribution and/or use of the Program is restricted in certain -countries for any reason, Licensor may add an explicit geographical -distribution limitation excluding those countries, so that distribution -is permitted only in or among countries not thus excluded. In such case, -this License incorporates the limitation as if written in the body of -this License. - -@item -Limitations. - -THE PROGRAM IS PROVIDED TO YOU "AS IS," WITHOUT WARRANTY. THERE IS NO -WARRANTY FOR THE PROGRAM, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE -ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH -YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL -NECESSARY SERVICING, REPAIR OR CORRECTION. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE -PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS -OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. -@end enumerate - -@c This node name is special -@node Win license, Function Index, Public license, Top -@appendix The MySQL license for Microsoft operating systems - -@center @strong{MySQL shareware license for Microsoft operating systems} -@center (Version 1, September 4, 1998) - -@center Copyright (C) 1998 TcX AB & MySQL Finland AB & Detron HB -@center Stockholm SWEDEN, Helsingfors FINLAND and Uppsala SWEDEN -@center All rights reserved. - -This License applies to the computer program known as "MySQL". - -This License applies when running MySQL on any Microsoft operating system. -Microsoft operating systems include all versions of Microsoft Windows NT -and Microsoft Windows. - -YOU SHOULD CAREFULLY READ THE FOLLOWING TERMS AND CONDITIONS BEFORE -USING, COPYING OR DISTRIBUTING MySQL. BY USING, COPYING AND DISTRIBUTING -MySQL, YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL -ITS TERMS AND CONDITIONS FOR USING, COPYING AND DISTRIBUTING MySQL OR -WORKS BASED ON IT. NOTHING OTHER THAN THIS LICENSE GRANTS YOU -PERMISSION TO USE, COPY OR DISTRIBUTE MySQL OR ITS DERIVATIVE -WORKS. THESE ACTIONS ARE PROHIBITED BY LAW. IF YOU DO NOT ACCEPT THESE -TERMS AND CONDITIONS, DO NOT USE, COPY OR DISTRIBUTE MySQL. - -@enumerate -@item -Evaluation and License Registration. - -This is an evaluation version of MySQL for Win32. Subject to the terms -below, you are hereby licensed to use MySQL for evaluation purposes -without charge for a period of 30 days. If you use MySQL after the 30 -day evaluation period the registration and purchase of a MySQL license -is required. - -The price for a MySQL license is currently 200 US dollars and email -support starts from 200 US dollars/year. Quantity discounts are -available. If you pay by credit card, the currency is EURO (The European -Unions common currency) so the prices will differ slightly. - -The easiest way to register or find options about how to pay for MySQL -is to use the license form at TcX's secure server at -@uref{https://www.mysql.com/license.htmy}. This can be used also when -paying with credit card over the Internet. - -Other applicable methods for paying are SWIFT payments, cheques and -credit cards. - -Payment should be made to: - -@example -Postgirot Bank AB -105 06 STOCKHOLM, SWEDEN - -TCX DataKonsult AB -BOX 6434 -11382 STOCKHOLM, SWEDEN - -SWIFT address: PGSI SESS -Account number: 96 77 06 - 3 -@end example - -Specify: license and/or support and your name and email address. - -In Europe and Japan, EuroGiro (that should be cheaper) can be used to -the same account. - -If you want to pay by cheque make it payable to "MySQL Finland AB" and -mail it to the address below. - -@example -TCX DataKonsult AB -BOX 6434 -11382 STOCKHOLM, SWEDEN -@end example -For more information about commercial licensing, please contact: - -@example -David Axmark -Kungsgatan 65 B -753 21 UPPSALA -SWEDEN -Voice Phone +46-18-10 22 80 GMT 9-21. Swedish and English spoken -Fax +46-8-729 69 05 Email *much* preferred. -E-Mail: mysql-licensing@@mysql.com -@end example - -For more about the license prices and commercial support, like email -support, please refer to the MySQL manual. @xref{Cost}. @xref{Support}. - -The use of MySQL or any work based on MySQL after the 30-day evaluation -period is in violation of international copyright laws. - -@item -Registered version of MySQL. - -After you have purchased a MySQL license we will send you a receipt by -paper mail. You are allowed to use MySQL or any work based on MySQL -after the 30-days evaluation period. The use of MySQL is, however, -restricted to one physical computer, but there are no restrictions on -concurrent uses of MySQL or the number of MySQL servers run on the -computer. - -We will also email you an address and password for a password-protected -WWW page that always has the newest MySQL-Win32 version. Our current -policy is that a user with the MySQL license can get free upgrades. The -best way to ensure that you get the best possible support is to purchase -commercial support! - -@item -Registration for use in education and university or government-sponsored -research. - -You may obtain a MySQL license for the use in education and university -or government-sponsored research for free. In that case, send a detailed -application for licensing MySQL for such use to the email address -@email{mysql-licensing@@mysql.com}. - -The following information is required in the application: -@itemize @bullet -@item -The name of the school or institute. -@item -A short description of the school or institute and of the type of -education, resarch or other functions it provides. -@item -A detailed report of the use of MySQL in the institution. -@end itemize - -In this case you will be provided with a license that entitles you to -use MySQL in a specified manner. - -@item -Distribution. - -Provided that you verify that you are distributing an evaluation or -educational/research version of MySQL you are hereby licensed to make as -many literal (i.e., verbatim) copies of the evaluation version of MySQL -and documentation as you wish. - -@item -Restrictions. - -The client code of MySQL is in the Public Domain or under the GPL (for -example the code for readline) license. You are not allowed to modify, -recompile, translate or create derivative works based upon any part of -the server code of MySQL. - -@item -Reservation of Rights. - -No rights are granted to MySQL except as expressly set forth herein. -You may not copy or distribute MySQL except as expressly provided under -this License. Any attempt otherwise to copy or distribute MySQL is void, -and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - -@item -Other Restrictions. - -If the distribution and/or use of MySQL is restricted in certain -countries for any reason, the Licensor may add an explicit geographical -distribution limitation excluding those countries, so that distribution -is permitted only in or among countries not thus excluded. In such case, -this License incorporates the limitation as if written in the body of -this License. - -@item -Limitations. - -MySQL IS PROVIDED TO YOU "AS IS," WITHOUT WARRANTY. THERE IS NO WARRANTY -FOR MySQL, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO -THE QUALITY AND PERFORMANCE OF MySQL IS WITH YOU. SHOULD MySQL PROVE -DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR -CORRECTION. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL THE LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE -MySQL AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE MySQL (INCLUDING BUT NOT LIMITED TO LOSS OF DATA -OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF MySQL TO OPERATE WITH ANY OTHER PROGRAMS), EVEN -IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. -@end enumerate - -@page -@node Function Index, Concept Index, Win license, Top -@unnumbered SQL command, type and function index - -@printindex fn - -@page -@node Concept Index, , Function Index, Top -@unnumbered Concept Index - -@printindex cp - -@summarycontents -@contents - -@bye diff --git a/Docs/manual.texi b/Docs/manual.texi deleted file mode 100644 index 989a1836a15..00000000000 --- a/Docs/manual.texi +++ /dev/null @@ -1,107 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c -@c ********************************************************* -@c -@c This is a dummy placeholder file for manual.texi in the -@c MySQL source trees. -@c -@c Note, that the manual has been moved into a separate -@c BitKeeper source tree named "mysqldoc" - do not attempt -@c to add NEWS entries or documentation to this file! All -@c changes to the manual should be done in the mysqldoc tree. -@c -@c See http://www.mysql.com/doc/en/Installing_source_tree.html -@c for information about how to work with BitKeeper source trees. -@c -@c This dummy file is being replaced with the real manual from the -@c mysqldoc tree when building the official source distribution. -@c -@c Please e-mail docs@mysql.com for more information or if -@c you are interested in doing a translation. -@c -@c ********************************************************* -@c -@c %**start of header - -@setfilename mysql.info - -@c We want the types in the same index -@syncodeindex tp fn - -@c Get version information. This file is generated by the Makefile!! -@include include.texi - -@ifclear tex-debug -@c This removes the black squares in the right margin -@finalout -@end ifclear - -@c Set background for HTML -@set _body_tags BGCOLOR=silver TEXT=#000000 LINK=#101090 VLINK=#7030B0 -@c Set some style elements for the manual in HTML form. 'suggested' -@c natural language colors: aqua, black, blue, fuchsia, gray, green, -@c lime, maroon, navy, olive, purple, red, silver, teal, white, and -@c yellow. From Steeve Buehler -@set _extra_head - -@settitle Dummy MySQL Reference Manual for version @value{mysql_version}. - -@c We want single-sided heading format, with chapters on new pages. To -@c get double-sided format change 'on' below to 'odd' -@setchapternewpage on - -@paragraphindent 0 - -@c %**end of header - -@ifinfo -@format -START-INFO-DIR-ENTRY -* mysql: (mysql). MySQL documentation. -END-INFO-DIR-ENTRY -@end format -@end ifinfo - -@titlepage -@sp 10 -@center @titlefont{Empty placeholder for the MySQL Reference Manual} -@sp 10 -@center Copyright @copyright{} 1995-2002 MySQL AB -@c blank page after title page makes page 1 be a page front. -@c also makes the back of the title page blank. -@page -@end titlepage - -@c This should be added. The HTML conversion also needs a MySQL version -@c number somewhere. - -@iftex -@c change this to double if you want formatting for double-sided -@c printing -@headings single - -@oddheading @thischapter @| @| @thispage -@evenheading @thispage @| @| MySQL Technical Reference for Version @value{mysql_version} - -@end iftex - -@node Top, (dir), (dir), (dir) - -@ifinfo -This is an empty placeholder file for the MySQL manual. - -The MySQL manual is now maintained in a separate BitKeeper source tree! -Please see @url{http://www.mysql.com/doc/en/Installing_source_tree.html} -for more info on how to work with BitKeeper. - -Please do not attempt to edit this file to add NEWS entries or to add -documentation! Use the one in the @code{mysqldoc} BK tree instead. - -This file will be replaced with the current @code{manual.texi} when building -the official source distribution. - -You can find a specific manual for any older version of MySQL -in the binary or source distribution for that version. -@end ifinfo - -@bye diff --git a/Docs/manual_toc.html b/Docs/manual_toc.html deleted file mode 100644 index b9014e5efb9..00000000000 --- a/Docs/manual_toc.html +++ /dev/null @@ -1,9 +0,0 @@ - - -Place holder for manual_toc.html - - -This is just a place holder for the autogenerated manual_toc.html -to make "make dist" happy. - - diff --git a/Docs/mirrors.texi b/Docs/mirrors.texi deleted file mode 100644 index 651963c57c3..00000000000 --- a/Docs/mirrors.texi +++ /dev/null @@ -1,446 +0,0 @@ -@strong{Europe:} - -@itemize @bullet - -@item -@image{Flags/armenia} Armenia [AbideWeb Technologies] @@ -WWW (@uref{http://mysql.abideweb.com/}) -FTP (@uref{ftp://mysql.abideweb.com/mirrors/MySQL/}) - -@item -@image{Flags/austria} Austria [Univ. of Technology/Vienna] @@ -WWW (@uref{http://gd.tuwien.ac.at/db/mysql/}) -FTP (@uref{ftp://gd.tuwien.ac.at/db/mysql/}) - -@item -@image{Flags/belgium} Belgium [BELNET] @@ -WWW (@uref{http://mysql.belnet.be/}) -FTP (@uref{ftp://ftp.belnet.be/mirror/ftp.mysql.com/pub/mysql/}) - -@item -@image{Flags/bulgaria} Bulgaria [online.bg/Sofia] @@ -WWW (@uref{http://mysql.online.bg/}) -FTP (@uref{ftp://mysql.online.bg/}) - -@item -@image{Flags/czech-republic} Czech Republic [Masaryk University in Brno] @@ -WWW (@uref{http://mysql.linux.cz/}) -FTP (@uref{ftp://ftp.fi.muni.cz/pub/mysql/}) - -@item -@image{Flags/czech-republic} Czech Republic [www.gin.cz] @@ -WWW (@uref{http://mysql.gin.cz/}) -FTP (@uref{ftp://ftp.gin.cz/pub/MIRRORS/www.mysql.com/}) - -@item -@image{Flags/czech-republic} Czech Republic [www.sopik.cz] @@ -WWW (@uref{http://www.mysql.cz/}) - -@item -@image{Flags/denmark} Denmark [Borsen] @@ -WWW (@uref{http://mysql.borsen.dk/}) - -@item -@image{Flags/denmark} Denmark [Cybercity Internet] @@ -WWW (@uref{http://mysql.mirrors.cybercity.dk/}) - -@item -@image{Flags/denmark} Denmark [SunSITE] @@ -WWW (@uref{http://mirrors.sunsite.dk/mysql/}) -FTP (@uref{ftp://sunsite.dk/mirrors/mysql/}) - -@item -@image{Flags/estonia} Estonia [OK Interactive] @@ -WWW (@uref{http://mysql.mirror.ok.ee/}) - -@item -@image{Flags/finland} Finland [KPNQwest] @@ -WWW (@uref{http://mysql.kpnqwest.fi/}) - -@item -@image{Flags/finland} Finland [Mediatraffic] @@ -WWW (@uref{http://mysql.mediatraffic.fi/}) - -@item -@image{Flags/finland} Finland [tonnikala.net] @@ -WWW (@uref{http://mysql.tonnikala.org/}) - -@item -@image{Flags/france} France [free.fr] @@ -WWW (@uref{http://mysql-mirror.free.fr/}) -FTP (@uref{ftp://ftp.free.fr/pub/MySQL/}) - -@item -@image{Flags/france} France [mir2.ovh.net/] @@ -WWW (@uref{http://mir2.ovh.net/ftp.mysql.com/}) -FTP (@uref{ftp://mir1.ovh.net/ftp.mysql.com/}) - -@item -@image{Flags/france} France [Netsample] @@ -WWW (@uref{http://www.mysql.netsample.com/}) - -@item -@image{Flags/france} France [Universite Paris 10] @@ -WWW (@uref{http://ftp.u-paris10.fr/mysql.com}) -FTP (@uref{ftp://ftp.u-paris10.fr/mysql.com}) - -@item -@image{Flags/germany} Germany [GWDG] @@ -WWW (@uref{http://ftp.gwdg.de/pub/misc/mysql/}) -FTP (@uref{ftp://ftp.gwdg.de/pub/misc/mysql/}) - -@item -@image{Flags/germany} Germany [SunSITE Central Europe] @@ -WWW (@uref{http://sunsite.informatik.rwth-aachen.de/mysql/}) -FTP (@uref{ftp://sunsite.informatik.rwth-aachen.de/pub/mirror/www.mysql.com/}) - -@item -@image{Flags/germany} Germany [Tiscali] @@ -WWW (@uref{http://filepile.tiscali.de/mirror/mysql/}) -FTP (@uref{ftp://filepile.tiscali.de/mirror/mysql/}) - -@item -@image{Flags/germany} Germany [Wolfenbuettel] @@ -WWW (@uref{http://www.fh-wolfenbuettel.de/ftp/pub/database/mysql/}) -FTP (@uref{ftp://ftp.fh-wolfenbuettel.de/pub/database/mysql/}) - -@item -@image{Flags/greece} Greece [NTUA, Athens] @@ -WWW (@uref{http://www.ntua.gr/mysql/}) -FTP (@uref{ftp://ftp.ntua.gr/pub/databases/mysql/}) - -@item -@image{Flags/hungary} Hungary [stop.hu] @@ -WWW (@uref{http://mysql.mirror.stop.hu/}) - -@item -@image{Flags/hungary} Hungary [TiszaneT] @@ -WWW (@uref{http://mysql.tiszanet.hu/}) -FTP (@uref{ftp://mysql.tiszanet.hu/pub/mirrors/mysql/}) - -@item -@image{Flags/hungary} Hungary [Xenia] @@ -WWW (@uref{http://mysql.sote.hu/}) -FTP (@uref{ftp://xenia.sote.hu/pub/mirrors/www.mysql.com/}) - -@item -@image{Flags/iceland} Iceland [Tvund] @@ -WWW (@uref{http://mysql.tviund.is/}) - -@item -@image{Flags/ireland} Ireland [Esat Net] @@ -WWW (@uref{http://ftp.esat.net/mirrors/download.sourceforge.net/pub/mirrors/mysql/}) -FTP (@uref{ftp://ftp.esat.net/mirrors/download.sourceforge.net/pub/mirrors/mysql/}) - -@item -@image{Flags/ireland} Ireland [MD NMTB Media] @@ -WWW (@uref{http://mirrors.nmtbmedia.com/mysql/}) - -@item -@image{Flags/israel} Israel [fresh.co.il] @@ -WWW (@uref{http://mysql.fresh.co.il/}) - -@item -@image{Flags/italy} Italy [feelinglinux.com] @@ -WWW (@uref{http://mysql.feelinglinux.com/}) - -@item -@image{Flags/italy} Italy [Teta Srl] @@ -WWW (@uref{http://www.teta.it/mysql/}) - -@item -@image{Flags/italy} Italy [tzone.it] @@ -WWW (@uref{http://mysql.tzone.it/}) - -@item -@image{Flags/latvia} Latvia [linux.lv] @@ -FTP (@uref{ftp://ftp.linux.lv/pub/software/mysql/}) - -@item -@image{Flags/netherlands} Netherlands [OMS-Net] @@ -WWW (@uref{http://mysql.oms-net.nl/}) - -@item -@image{Flags/netherlands} Netherlands [ProServe] @@ -WWW (@uref{http://mysql.proserve.nl/}) - -@item -@image{Flags/netherlands} Netherlands [WideXS BV] @@ -WWW (@uref{http://mysql.mirror.widexs.nl/}) -FTP (@uref{ftp://mirror.widexs.nl/pub/mysql/}) - -@item -@image{Flags/norway} Norway [Brainpeddlers AS] @@ -WWW (@uref{http://mysql.brainpeddlers.com/}) - -@item -@image{Flags/poland} Poland [ncservice.com/Gdansk] @@ -WWW (@uref{http://mysql.service.net.pl/}) - -@item -@image{Flags/poland} Poland [SunSITE] @@ -WWW (@uref{http://sunsite.icm.edu.pl/mysql/}) -FTP (@uref{ftp://sunsite.icm.edu.pl/pub/unix/mysql/}) - -@item -@image{Flags/portugal} Portugal [Instituto Supertior Tcnico] @@ -WWW (@uref{http://darkstar.ist.utl.pt/mysql/}) -FTP (@uref{ftp://darkstar.ist.utl.pt/pub/mysql/}) - -@item -@image{Flags/portugal} Portugal [Netviso] @@ -WWW (@uref{http://mysql.netvisao.pt/}) -FTP (@uref{ftp://mirrors2.netvisao.pt/pub/mysql/}) - -@item -@image{Flags/portugal} Portugal [VIZZAVI] @@ -WWW (@uref{http://ftp.vizzavi.pt/pub/mysql/}) -FTP (@uref{ftp://ftp.vizzavi.pt/pub/mysql/}) - -@item -@image{Flags/romania} Romania [roedu.net/Bucharest] @@ -FTP (@uref{ftp://ftp.roedu.net/pub/mirrors/ftp.mysql.com/}) - -@item -@image{Flags/russia} Russia [DirectNet] @@ -WWW (@uref{http://mysql.directnet.ru/}) -FTP (@uref{ftp://ftp.dn.ru/pub/MySQL/}) - -@item -@image{Flags/russia} Russia [Scientific Center/Chernogolovka] @@ -FTP (@uref{ftp://ftp.chg.ru/pub/databases/mysql/}) - -@item -@image{Flags/slovenia} Slovenia [ARNES] @@ -WWW (@uref{http://ftp.arnes.si/mysql/}) -FTP (@uref{ftp://ftp.arnes.si/packages/mysql/}) - -@item -@image{Flags/sweden} Sweden [Sunet] @@ -WWW (@uref{http://ftp.sunet.se/pub/unix/databases/relational/mysql/}) -FTP (@uref{ftp://ftp.sunet.se/pub/unix/databases/relational/mysql/}) - -@item -@image{Flags/switzerland} Switzerland [SunSITE] @@ -WWW (@uref{http://sunsite.cnlab-switch.ch/ftp/mirror/mysql/}) -FTP (@uref{ftp://sunsite.cnlab-switch.ch/mirror/mysql/}) - -@item -@image{Flags/turkey} Turkey [proGEN] @@ -WWW (@uref{http://mysql.progen.com.tr/}) - -@item -@image{Flags/turkey} Turkey [Turkish National Academic Network & Information Center] @@ -WWW (@uref{http://mysql.ulak.net.tr/}) - -@item -@image{Flags/great-britain} UK [PLiG/UK] @@ -WWW (@uref{http://ftp.plig.org/pub/mysql/}) -FTP (@uref{ftp://ftp.plig.org/pub/mysql/}) - -@item -@image{Flags/ukraine} Ukraine [ISP Alkar Teleport/Dnepropetrovsk] @@ -WWW (@uref{http://mysql.dp.ua/}) -FTP (@uref{ftp://ftp.tlk-l.net/pub/mirrors/mysql.com/}) - -@item -@image{Flags/ukraine} Ukraine [PACO] @@ -WWW (@uref{http://mysql.paco.net.ua/}) -FTP (@uref{ftp://mysql.paco.net.ua/}) - -@item -@image{Flags/yugoslavia} Yugoslavia [Open Source Network of Yugoslavia] @@ -WWW (@uref{http://mysql.boa.org.yu/}) -FTP (@uref{ftp://ftp.linux.org.yu/pub/MySQL/}) - -@end itemize - -@strong{North America:} - -@itemize @bullet - -@item -@image{Flags/canada} Canada [Tryc] @@ -WWW (@uref{http://web.tryc.on.ca/mysql/}) - -@item -@image{Flags/mexico} Mexico [UAM] @@ -WWW (@uref{http://mysql.azc.uam.mx/}) -FTP (@uref{ftp://mysql.azc.uam.mx/mirrors/mysql/}) - -@item -@image{Flags/mexico} Mexico [UNAM] @@ -WWW (@uref{http://mysql.unam.mx/}) -FTP (@uref{ftp://mysql.unam.mx/pub/mysql/}) - -@item -@image{Flags/usa} USA [adgrafix.com / Boston, MA] @@ -WWW (@uref{http://mysql.adgrafix.com/}) - -@item -@image{Flags/usa} USA [Argonne National Laboratory / Chicago, IL] @@ -FTP (@uref{ftp://mirror.mcs.anl.gov/pub/mysql/}) - -@item -@image{Flags/usa} USA [Hurricane Electric / San Jose, CA] @@ -WWW (@uref{http://mysql.he.net/}) - -@item -@image{Flags/usa} USA [netNumina / Cambridge, MA] @@ -WWW (@uref{http://mysql.mirrors.netnumina.com/}) - -@item -@image{Flags/usa} USA [NIXC / Vienna, VA] @@ -WWW (@uref{http://mysql.nixc.net/}) -FTP (@uref{ftp://mysql.nixc.net/pub/mysql/}) - -@item -@image{Flags/usa} USA [Oregon State University / Corvallis, OR] @@ -WWW (@uref{http://mysql.orst.edu/}) -FTP (@uref{ftp://ftp.orst.edu/pub/mysql/}) - -@item -@image{Flags/usa} USA [University of Wisconsin / Wisconsin] @@ -WWW (@uref{http://mirror.sit.wisc.edu/mysql/}) -FTP (@uref{ftp://mirror.sit.wisc.edu/mirrors/mysql/}) - -@item -@image{Flags/usa} USA [UUNet] @@ -WWW (@uref{http://mysql.secsup.org/}) -FTP (@uref{ftp://mysql.secsup.org/pub/software/mysql/}) - -@end itemize - -@strong{South America:} - -@itemize @bullet - -@item -@image{Flags/argentina} Argentina [bannerlandia.com] @@ -WWW (@uref{http://mysql.bannerlandia.com.ar/}) -FTP (@uref{ftp://mysql.bannerlandia.com.ar/mirrors/mysql/}) - -@item -@image{Flags/chile} Chile [PSINet] @@ -WWW (@uref{http://mysql.psinet.cl/}) -FTP (@uref{ftp://ftp.psinet.cl/pub/database/mysql/}) - -@item -@image{Flags/chile} Chile [Tecnoera] @@ -WWW (@uref{http://mysql.tecnoera.com/}) - -@item -@image{Flags/chile} Chile [Vision] @@ -WWW (@uref{http://mysql.vision.cl/}) - -@item -@image{Flags/costa-rica} Costa Rica [Ogmios Communications] @@ -WWW (@uref{http://mysql.ogmios.co.cr/}) -FTP (@uref{ftp://mysql.ogmios.co.cr/pub/mysql/}) - -@end itemize - -@strong{Asia:} - -@itemize @bullet - -@item -@image{Flags/china} China [HKLPG/Hong Kong] @@ -WWW (@uref{http://mysql.hklpg.org/}) - -@item -@image{Flags/china} China [linuxforum.net] @@ -FTP (@uref{http://www2.linuxforum.net/mirror/mysql/}) - -@item -@image{Flags/china} China [shellhung.org/Hong Kong] @@ -WWW (@uref{http://mysql.shellhung.org/}) -FTP (@uref{ftp://ftp.shellhung.org/pub/Mirror/mysql/}) - -@item -@image{Flags/indonesia} Indonesia [CBN] @@ -WWW (@uref{http://mysql.cbn.net.id/}) - -@item -@image{Flags/indonesia} Indonesia [incaf.net] @@ -WWW (@uref{http://mysql.incaf.net/}) -FTP (@uref{ftp://mysql.incaf.net/}) - -@item -@image{Flags/indonesia} Indonesia [M-Web] @@ -WWW (@uref{http://mysql.mweb.net.id/}) -FTP (@uref{ftp://mysql.mweb.net.id/pub/database/mysql/}) - -@item -@image{Flags/indonesia} Indonesia [web.id] @@ -WWW (@uref{http://mysql.itb.web.id/}) -FTP (@uref{ftp://mysql.itb.web.id/pub/MySQL/}) - -@item -@image{Flags/japan} Japan [Soft Agency] @@ -WWW (@uref{http://www.softagency.co.jp/MySQL/}) - -@item -@image{Flags/japan} Japan [u-aizu.ac.jp/Aizu] @@ -FTP (@uref{ftp://ftp.u-aizu.ac.jp/ftp/pub/dbms/mysql/mysql.com/}) - -@item -@image{Flags/philippines} Philippines [Ateneo de Zamboanga University] @@ -WWW (@uref{http://mysql.adzu.edu.ph/}) - -@item -@image{Flags/singapore} Singapore [HJC] @@ -WWW (@uref{http://mysql.hjc.edu.sg/}) -FTP (@uref{ftp://ftp.hjc.edu.sg/mysql/}) - -@item -@image{Flags/south-korea} South Korea [HolyNet] @@ -WWW (@uref{http://mysql.holywar.net/}) - -@item -@image{Flags/south-korea} South Korea [Webiiz] @@ -WWW (@uref{http://mysql.webiiz.com/}) - -@item -@image{Flags/taiwan} Taiwan [I-SHOU University] @@ -WWW (@uref{http://mysql.isu.edu.tw/}) - -@item -@image{Flags/taiwan} Taiwan [nctu.edu/HsinChu] @@ -WWW (@uref{http://mysql.nctu.edu.tw/}) - -@item -@image{Flags/taiwan} Taiwan [TTN] @@ -WWW (@uref{http://mysql.ttn.net/}) - -@end itemize - -@strong{Australia:} - -@itemize @bullet - -@item -@image{Flags/australia} Australia [InterActive Consulting] @@ -WWW (@uref{http://mysql.oranged.to}) - -@item -@image{Flags/australia} Australia [planetmirror.com] @@ -WWW (@uref{http://mysql.planetmirror.com/}) -FTP (@uref{ftp://planetmirror.com/pub/mysql/}) - -@item -@image{Flags/new-zealand} New Zealand [Cubalan] @@ -WWW (@uref{http://mysql.soa.co.nz/}) - -@end itemize - -@strong{Africa:} - -@itemize @bullet - -@item -@image{Flags/south-africa} South African Republic [The Internet Solution/Johannesburg] @@ -FTP (@uref{ftp://ftp.is.co.za/linux/mysql/}) - -@end itemize - diff --git a/Docs/mysql.info b/Docs/mysql.info new file mode 100644 index 00000000000..5846d7aadf6 --- /dev/null +++ b/Docs/mysql.info @@ -0,0 +1,27 @@ +This is mysql.info, produced by makeinfo version 4.8 from manual.texi. + +START-INFO-DIR-ENTRY +* mysql: (mysql). MySQL documentation. +END-INFO-DIR-ENTRY + + +File: mysql.info, Node: Top, Next: (dir), Prev: (dir), Up: (dir) + +This is an empty placeholder file for the MySQL manual. + +The MySQL manual is now maintained in a separate BitKeeper source tree! +Please see `http://www.mysql.com/doc/en/Installing_source_tree.html' +for more info on how to work with BitKeeper. + +This file will be replaced with the current `mysql.info' when building +the official source distribution. + +You can find a specific manual for any older version of MySQL in the +binary or source distribution for that version. + + + +Tag Table: +Node: Top166 + +End Tag Table diff --git a/Docs/mysqld_error.txt b/Docs/mysqld_error.txt deleted file mode 100644 index aeb3a12c263..00000000000 --- a/Docs/mysqld_error.txt +++ /dev/null @@ -1,477 +0,0 @@ -/* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB - This file is public domain and comes with NO WARRANTY of any kind */ - -#define ER_HASHCHK 1000 -"hashchk", -#define ER_NISAMCHK 1001 -"isamchk", -#define ER_NO 1002 -"NO", -#define ER_YES 1003 -"YES", -#define ER_CANT_CREATE_FILE 1004 -"Can't create file '%-.64s' (errno: %d)", -#define ER_CANT_CREATE_TABLE 1005 -"Can't create table '%-.64s' (errno: %d)", -#define ER_CANT_CREATE_DB 1006 -"Can't create database '%-.64s'. (errno: %d)", -#define ER_DB_CREATE_EXISTS 1007 -"Can't create database '%-.64s'. Database exists", -#define ER_DB_DROP_EXISTS 1008 -"Can't drop database '%-.64s'. Database doesn't exist", -#define ER_DB_DROP_DELETE 1009 -"Error dropping database (can't delete '%-.64s', errno: %d)", -#define ER_DB_DROP_RMDIR 1010 -"Error dropping database (can't rmdir '%-.64s', errno: %d)", -#define ER_CANT_DELETE_FILE 1011 -"Error on delete of '%-.64s' (errno: %d)", -#define ER_CANT_FIND_SYSTEM_REC 1012 -"Can't read record in system table", -#define ER_CANT_GET_STAT 1013 -"Can't get status of '%-.64s' (errno: %d)", -#define ER_CANT_GET_WD 1014 -"Can't get working directory (errno: %d)", -#define ER_CANT_LOCK 1015 -"Can't lock file (errno: %d)", -#define ER_CANT_OPEN_FILE 1016 -"Can't open file: '%-.64s'. (errno: %d)", -#define ER_FILE_NOT_FOUND 1017 -"Can't find file: '%-.64s' (errno: %d)", -#define ER_CANT_READ_DIR 1018 -"Can't read dir of '%-.64s' (errno: %d)", -#define ER_CANT_SET_WD 1019 -"Can't change dir to '%-.64s' (errno: %d)", -#define ER_CHECKREAD 1020 -"Record has changed since last read in table '%-.64s'", -#define ER_DISK_FULL 1021 -"Disk full (%s). Waiting for someone to free some space....", -#define ER_DUP_KEY 1022 -"Can't write, duplicate key in table '%-.64s'", -#define ER_ERROR_ON_CLOSE 1023 -"Error on close of '%-.64s' (errno: %d)", -#define ER_ERROR_ON_READ 1024 -"Error reading file '%-.64s' (errno: %d)", -#define ER_ERROR_ON_RENAME 1025 -"Error on rename of '%-.64s' to '%-.64s' (errno: %d)", -#define ER_ERROR_ON_WRITE 1026 -"Error writing file '%-.64s' (errno: %d)", -#define ER_FILE_USED 1027 -"'%-.64s' is locked against change", -#define ER_FILSORT_ABORT 1028 -"Sort aborted", -#define ER_FORM_NOT_FOUND 1029 -"View '%-.64s' doesn't exist for '%-.64s'", -#define ER_GET_ERRNO 1030 -"Got error %d from table handler", -#define ER_ILLEGAL_HA 1031 -"Table handler for '%-.64s' doesn't have this option", -#define ER_KEY_NOT_FOUND 1032 -"Can't find record in '%-.64s'", -#define ER_NOT_FORM_FILE 1033 -"Incorrect information in file: '%-.64s'", -#define ER_NOT_KEYFILE 1034 -"Incorrect key file for table: '%-.64s'. Try to repair it", -#define ER_OLD_KEYFILE 1035 -"Old key file for table '%-.64s'; Repair it!", -#define ER_OPEN_AS_READONLY 1036 -"Table '%-.64s' is read only", -#define ER_OUTOFMEMORY 1037 -"Out of memory. Restart daemon and try again (needed %d bytes)", -#define ER_OUT_OF_SORTMEMORY 1038 -"Out of sort memory. Increase daemon sort buffer size", -#define ER_UNEXPECTED_EOF 1039 -"Unexpected eof found when reading file '%-.64s' (errno: %d)", -#define ER_CON_COUNT_ERROR 1040 -"Too many connections", -#define ER_OUT_OF_RESOURCES 1041 -"Out of memory; Check if mysqld or some other process uses all available memory. If not you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space", -#define ER_BAD_HOST_ERROR 1042 -"Can't get hostname for your address", -#define ER_HANDSHAKE_ERROR 1043 -"Bad handshake", -#define ER_DBACCESS_DENIED_ERROR 1044 -"Access denied for user: '%-.32s@%-.64s' to database '%-.64s'", -#define ER_ACCESS_DENIED_ERROR 1045 -"Access denied for user: '%-.32s@%-.64s' (Using password: %s)", -#define ER_NO_DB_ERROR 1046 -"No Database Selected", -#define ER_UNKNOWN_COM_ERROR 1047 -"Unknown command", -#define ER_BAD_NULL_ERROR 1048 -"Column '%-.64s' cannot be null", -#define ER_BAD_DB_ERROR 1049 -"Unknown database '%-.64s'", -#define ER_TABLE_EXISTS_ERROR 1050 -"Table '%-.64s' already exists", -#define ER_BAD_TABLE_ERROR 1051 -"Unknown table '%-.64s'", -#define ER_NON_UNIQ_ERROR 1052 -"Column: '%-.64s' in %-.64s is ambiguous", -#define ER_SERVER_SHUTDOWN 1053 -"Server shutdown in progress", -#define ER_BAD_FIELD_ERROR 1054 -"Unknown column '%-.64s' in '%-.64s'", -#define ER_WRONG_FIELD_WITH_GROUP 1055 -"'%-.64s' isn't in GROUP BY", -#define ER_WRONG_GROUP_FIELD 1056 -"Can't group on '%-.64s'", -#define ER_WRONG_SUM_SELECT 1057 -"Statement has sum functions and columns in same statement", -#define ER_WRONG_VALUE_COUNT 1058 -"Column count doesn't match value count", -#define ER_TOO_LONG_IDENT 1059 -"Identifier name '%-.100s' is too long", -#define ER_DUP_FIELDNAME 1060 -"Duplicate column name '%-.64s'", -#define ER_DUP_KEYNAME 1061 -"Duplicate key name '%-.64s'", -#define ER_DUP_ENTRY 1062 -"Duplicate entry '%-.64s' for key %d", -#define ER_WRONG_FIELD_SPEC 1063 -"Incorrect column specifier for column '%-.64s'", -#define ER_PARSE_ERROR 1064 -"%s near '%-.80s' at line %d", -#define ER_EMPTY_QUERY 1065 -"Query was empty", -#define ER_NONUNIQ_TABLE 1066 -"Not unique table/alias: '%-.64s'", -#define ER_INVALID_DEFAULT 1067 -"Invalid default value for '%-.64s'", -#define ER_MULTIPLE_PRI_KEY 1068 -"Multiple primary key defined", -#define ER_TOO_MANY_KEYS 1069 -"Too many keys specified. Max %d keys allowed", -#define ER_TOO_MANY_KEY_PARTS 1070 -"Too many key parts specified. Max %d parts allowed", -#define ER_TOO_LONG_KEY 1071 -"Specified key was too long. Max key length is %d", -#define ER_KEY_COLUMN_DOES_NOT_EXITS 1072 -"Key column '%-.64s' doesn't exist in table", -#define ER_BLOB_USED_AS_KEY 1073 -"BLOB column '%-.64s' can't be used in key specification with the used table type", -#define ER_TOO_BIG_FIELDLENGTH 1074 -"Too big column length for column '%-.64s' (max = %d). Use BLOB instead", -#define ER_WRONG_AUTO_KEY 1075 -"Incorrect table definition; There can only be one auto column and it must be defined as a key", -#define ER_READY 1076 -"%s: ready for connections\n", -#define ER_NORMAL_SHUTDOWN 1077 -"%s: Normal shutdown\n", -#define ER_GOT_SIGNAL 1078 -"%s: Got signal %d. Aborting!\n", -#define ER_SHUTDOWN_COMPLETE 1079 -"%s: Shutdown Complete\n", -#define ER_FORCING_CLOSE 1080 -"%s: Forcing close of thread %ld user: '%-.32s'\n", -#define ER_IPSOCK_ERROR 1081 -"Can't create IP socket", -#define ER_NO_SUCH_INDEX 1082 -"Table '%-.64s' has no index like the one used in CREATE INDEX. Recreate the table", -#define ER_WRONG_FIELD_TERMINATORS 1083 -"Field separator argument is not what is expected. Check the manual", -#define ER_BLOBS_AND_NO_TERMINATED 1084 -"You can't use fixed rowlength with BLOBs. Please use 'fields terminated by'.", -#define ER_TEXTFILE_NOT_READABLE 1085 -"The file '%-.64s' must be in the database directory or be readable by all", -#define ER_FILE_EXISTS_ERROR 1086 -"File '%-.80s' already exists", -#define ER_LOAD_INFO 1087 -"Records: %ld Deleted: %ld Skipped: %ld Warnings: %ld", -#define ER_ALTER_INFO 1088 -"Records: %ld Duplicates: %ld", -#define ER_WRONG_SUB_KEY 1089 -"Incorrect sub part key. The used key part isn't a string, the used length is longer than the key part or the table handler doesn't support unique sub keys", -#define ER_CANT_REMOVE_ALL_FIELDS 1090 -"You can't delete all columns with ALTER TABLE. Use DROP TABLE instead", -#define ER_CANT_DROP_FIELD_OR_KEY 1091 -"Can't DROP '%-.64s'. Check that column/key exists", -#define ER_INSERT_INFO 1092 -"Records: %ld Duplicates: %ld Warnings: %ld", -#define ER_INSERT_TABLE_USED 1093 -"INSERT TABLE '%-.64s' isn't allowed in FROM table list", -#define ER_NO_SUCH_THREAD 1094 -"Unknown thread id: %lu", -#define ER_KILL_DENIED_ERROR 1095 -"You are not owner of thread %lu", -#define ER_NO_TABLES_USED 1096 -"No tables used", -#define ER_TOO_BIG_SET 1097 -"Too many strings for column %-.64s and SET", -#define ER_NO_UNIQUE_LOGFILE 1098 -"Can't generate a unique log-filename %-.64s.(1-999)\n", -#define ER_TABLE_NOT_LOCKED_FOR_WRITE 1099 -"Table '%-.64s' was locked with a READ lock and can't be updated", -#define ER_TABLE_NOT_LOCKED 1100 -"Table '%-.64s' was not locked with LOCK TABLES", -#define ER_BLOB_CANT_HAVE_DEFAULT 1101 -"BLOB column '%-.64s' can't have a default value", -#define ER_WRONG_DB_NAME 1102 -"Incorrect database name '%-.100s'", -#define ER_WRONG_TABLE_NAME 1103 -"Incorrect table name '%-.100s'", -#define ER_TOO_BIG_SELECT 1104 -"The SELECT would examine too many records and probably take a very long time. Check your WHERE and use SET OPTION SQL_BIG_SELECTS=1 if the SELECT is ok", -#define ER_UNKNOWN_ERROR 1105 -"Unknown error", -#define ER_UNKNOWN_PROCEDURE 1106 -"Unknown procedure '%-.64s'", -#define ER_WRONG_PARAMCOUNT_TO_PROCEDURE 1107 -"Incorrect parameter count to procedure '%-.64s'", -#define ER_WRONG_PARAMETERS_TO_PROCEDURE 1108 -"Incorrect parameters to procedure '%-.64s'", -#define ER_UNKNOWN_TABLE 1109 -"Unknown table '%-.64s' in %-.32s", -#define ER_FIELD_SPECIFIED_TWICE 1110 -"Column '%-.64s' specified twice", -#define ER_INVALID_GROUP_FUNC_USE 1111 -"Invalid use of group function", -#define ER_UNSUPPORTED_EXTENSION 1112 -"Table '%-.64s' uses an extension that doesn't exist in this MySQL version", -#define ER_TABLE_MUST_HAVE_COLUMNS 1113 -"A table must have at least 1 column", -#define ER_RECORD_FILE_FULL 1114 -"The table '%-.64s' is full", -#define ER_UNKNOWN_CHARACTER_SET 1115 -"Unknown character set: '%-.64s'", -#define ER_TOO_MANY_TABLES 1116 -"Too many tables. MySQL can only use %d tables in a join", -#define ER_TOO_MANY_FIELDS 1117 -"Too many columns", -#define ER_TOO_BIG_ROWSIZE 1118 -"Too big row size. The maximum row size, not counting BLOBs, is %d. You have to change some fields to BLOBs", -#define ER_STACK_OVERRUN 1119 -"Thread stack overrun: Used: %ld of a %ld stack. Use 'mysqld -O thread_stack=#' to specify a bigger stack if needed", -#define ER_WRONG_OUTER_JOIN 1120 -"Cross dependency found in OUTER JOIN. Examine your ON conditions", -#define ER_NULL_COLUMN_IN_INDEX 1121 -"Column '%-.64s' is used with UNIQUE or INDEX but is not defined as NOT NULL", -#define ER_CANT_FIND_UDF 1122 -"Can't load function '%-.64s'", -#define ER_CANT_INITIALIZE_UDF 1123 -"Can't initialize function '%-.64s'; %-.80s", -#define ER_UDF_NO_PATHS 1124 -"No paths allowed for shared library", -#define ER_UDF_EXISTS 1125 -"Function '%-.64s' already exist", -#define ER_CANT_OPEN_LIBRARY 1126 -"Can't open shared library '%-.64s' (errno: %d %-.64s)", -#define ER_CANT_FIND_DL_ENTRY 1127 -"Can't find function '%-.64s' in library'", -#define ER_FUNCTION_NOT_DEFINED 1128 -"Function '%-.64s' is not defined", -#define ER_HOST_IS_BLOCKED 1129 -"Host '%-.64s' is blocked because of many connection errors. Unblock with 'mysqladmin flush-hosts'", -#define ER_HOST_NOT_PRIVILEGED 1130 -"Host '%-.64s' is not allowed to connect to this MySQL server", -#define ER_PASSWORD_ANONYMOUS_USER 1131 -"You are using MySQL as an anonymous users and anonymous users are not allowed to change passwords", -#define ER_PASSWORD_NOT_ALLOWED 1132 -"You must have privileges to update tables in the mysql database to be able to change passwords for others", -#define ER_PASSWORD_NO_MATCH 1133 -"Can't find any matching row in the user table", -#define ER_UPDATE_INFO 1134 -"Rows matched: %ld Changed: %ld Warnings: %ld", -#define ER_CANT_CREATE_THREAD 1135 -"Can't create a new thread (errno %d). If you are not out of available memory, you can consult the manual for a possible OS-dependent bug", -#define ER_WRONG_VALUE_COUNT_ON_ROW 1136 -"Column count doesn't match value count at row %ld", -#define ER_CANT_REOPEN_TABLE 1137 -"Can't reopen table: '%-.64s'", -#define ER_INVALID_USE_OF_NULL 1138 -"Invalid use of NULL value", -#define ER_REGEXP_ERROR 1139 -"Got error '%-.64s' from regexp", -#define ER_MIX_OF_GROUP_FUNC_AND_FIELDS 1140 -"Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause", -#define ER_NONEXISTING_GRANT 1141 -"There is no such grant defined for user '%-.32s' on host '%-.64s'", -#define ER_TABLEACCESS_DENIED_ERROR 1142 -"%-.16s command denied to user: '%-.32s@%-.64s' for table '%-.64s'", -#define ER_COLUMNACCESS_DENIED_ERROR 1143 -"%-.16s command denied to user: '%-.32s@%-.64s' for column '%-.64s' in table '%-.64s'", -#define ER_ILLEGAL_GRANT_FOR_TABLE 1144 -"Illegal GRANT/REVOKE command. Please consult the manual which privileges can be used.", -#define ER_GRANT_WRONG_HOST_OR_USER 1145 -"The host or user argument to GRANT is too long", -#define ER_NO_SUCH_TABLE 1146 -"Table '%-.64s.%-.64s' doesn't exist", -#define ER_NONEXISTING_TABLE_GRANT 1147 -"There is no such grant defined for user '%-.32s' on host '%-.64s' on table '%-.64s'", -#define ER_NOT_ALLOWED_COMMAND 1148 -"The used command is not allowed with this MySQL version", -#define ER_SYNTAX_ERROR 1149 -"You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use", -#define ER_DELAYED_CANT_CHANGE_LOCK 1150 -"Delayed insert thread couldn't get requested lock for table %-.64s", -#define ER_TOO_MANY_DELAYED_THREADS 1151 -"Too many delayed threads in use", -#define ER_ABORTING_CONNECTION 1152 -"Aborted connection %ld to db: '%-.64s' user: '%-.32s' (%-.64s)", -#define ER_NET_PACKET_TOO_LARGE 1153 -"Got a packet bigger than 'max_allowed_packet'", -#define ER_NET_READ_ERROR_FROM_PIPE 1154 -"Got a read error from the connection pipe", -#define ER_NET_FCNTL_ERROR 1155 -"Got an error from fcntl()", -#define ER_NET_PACKETS_OUT_OF_ORDER 1156 -"Got packets out of order", -#define ER_NET_UNCOMPRESS_ERROR 1157 -"Couldn't uncompress communication packet", -#define ER_NET_READ_ERROR 1158 -"Got an error reading communication packets", -#define ER_NET_READ_INTERRUPTED 1159 -"Got timeout reading communication packets", -#define ER_NET_ERROR_ON_WRITE 1160 -"Got an error writing communication packets", -#define ER_NET_WRITE_INTERRUPTED 1161 -"Got timeout writing communication packets", -#define ER_TOO_LONG_STRING 1162 -"Result string is longer than max_allowed_packet", -#define ER_TABLE_CANT_HANDLE_BLOB 1163 -"The used table type doesn't support BLOB/TEXT columns", -#define ER_TABLE_CANT_HANDLE_AUTO_INCREMENT 1164 -"The used table type doesn't support AUTO_INCREMENT columns", -#define ER_DELAYED_INSERT_TABLE_LOCKED 1165 -"INSERT DELAYED can't be used with table '%-.64s', because it is locked with LOCK TABLES", -#define ER_WRONG_COLUMN_NAME 1166 -"Incorrect column name '%-.100s'", -#define ER_WRONG_KEY_COLUMN 1167 -"The used table handler can't index column '%-.64s'", -#define ER_WRONG_MRG_TABLE 1168 -"All tables in the MERGE table are not identically defined", -#define ER_DUP_UNIQUE 1169 -"Can't write, because of unique constraint, to table '%-.64s'", -#define ER_BLOB_KEY_WITHOUT_LENGTH 1170 -"BLOB column '%-.64s' used in key specification without a key length", -#define ER_PRIMARY_CANT_HAVE_NULL 1171 -"All parts of a PRIMARY KEY must be NOT NULL; If you need NULL in a key, use UNIQUE instead", -#define ER_TOO_MANY_ROWS 1172 -"Result consisted of more than one row", -#define ER_REQUIRES_PRIMARY_KEY 1173 -"This table type requires a primary key", -#define ER_NO_RAID_COMPILED 1174 -"This version of MySQL is not compiled with RAID support", -#define ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE 1175 -"You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", -#define ER_KEY_DOES_NOT_EXITS 1176 -"Key '%-.64s' doesn't exist in table '%-.64s'", -#define ER_CHECK_NO_SUCH_TABLE 1177 -"Can't open table", -#define ER_CHECK_NOT_IMPLEMENTED 1178 -"The handler for the table doesn't support %s", -#define ER_CANT_DO_THIS_DURING_AN_TRANSACTION 1179 -"You are not allowed to execute this command in a transaction", -#define ER_ERROR_DURING_COMMIT 1180 -"Got error %d during COMMIT", -#define ER_ERROR_DURING_ROLLBACK 1181 -"Got error %d during ROLLBACK", -#define ER_ERROR_DURING_FLUSH_LOGS 1182 -"Got error %d during FLUSH_LOGS", -#define ER_ERROR_DURING_CHECKPOINT 1183 -"Got error %d during CHECKPOINT", -#define ER_NEW_ABORTING_CONNECTION 1184 -"Aborted connection %ld to db: '%-.64s' user: '%-.32s' host: `%-.64s' (%-.64s)", -#define ER_DUMP_NOT_IMPLEMENTED 1185 -"The handler for the table does not support binary table dump", -#define ER_FLUSH_MASTER_BINLOG_CLOSED 1186 -"Binlog closed, cannot RESET MASTER", -#define ER_INDEX_REBUILD 1187 -"Failed rebuilding the index of dumped table '%-.64s'", -#define ER_MASTER 1188 -"Error from master: '%-.64s'", -#define ER_MASTER_NET_READ 1189 -"Net error reading from master", -#define ER_MASTER_NET_WRITE 1190 -"Net error writing to master", -#define ER_FT_MATCHING_KEY_NOT_FOUND 1191 -"Can't find FULLTEXT index matching the column list", -#define ER_LOCK_OR_ACTIVE_TRANSACTION 1192 -"Can't execute the given command because you have active locked tables or an active transaction", -#define ER_UNKNOWN_SYSTEM_VARIABLE 1193 -"Unknown system variable '%-.64s'", -#define ER_CRASHED_ON_USAGE 1194 -"Table '%-.64s' is marked as crashed and should be repaired", -#define ER_CRASHED_ON_REPAIR 1195 -"Table '%-.64s' is marked as crashed and last (automatic?) repair failed", -#define ER_WARNING_NOT_COMPLETE_ROLLBACK 1196 -"Warning: Some non-transactional changed tables couldn't be rolled back", -#define ER_TRANS_CACHE_FULL 1197 -"Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', -#define ER_SLAVE_MUST_STOP 1198 -"This operation cannot be performed with a running slave, run SLAVE STOP first", -#define ER_SLAVE_NOT_RUNNING 1199 -"This operation requires a running slave, configure slave and do SLAVE START", -#define ER_BAD_SLAVE 1200 -"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", -#define ER_MASTER_INFO 1201 -"Could not initialize master info structure, check permisions on master.info", -#define ER_SLAVE_THREAD 1202 -"Could not create slave thread, check system resources", -#define ER_TOO_MANY_USER_CONNECTIONS 1203 -"User %-.64s has already more than 'max_user_connections' active connections", -#define ER_SET_CONSTANTS_ONLY 1204 -"You may only use constant expressions with SET", -#define ER_LOCK_WAIT_TIMEOUT 1205 -"Lock wait timeout exceeded; Try restarting transaction", -#define ER_LOCK_TABLE_FULL 1206 -"The total number of locks exceeds the lock table size", -#define ER_READ_ONLY_TRANSACTION 1207 -"Update locks cannot be acquired during a READ UNCOMMITTED transaction", -#define ER_DROP_DB_WITH_READ_LOCK 1208 -"DROP DATABASE not allowed while thread is holding global read lock", -#define ER_CREATE_DB_WITH_READ_LOCK 1209 -"CREATE DATABASE not allowed while thread is holding global read lock", -#define ER_WRONG_ARGUMENTS 1210 -"Wrong arguments to %s", -#define ER_NO_PERMISSION_TO_CREATE_USER 1211 -"%-.32s@%-.64s is not allowed to create new users", -#define ER_UNION_TABLES_IN_DIFFERENT_DIR 1212 -"Incorrect table definition; All MERGE tables must be in the same database", -#define ER_LOCK_DEADLOCK 1213 -"Deadlock found when trying to get lock; Try restarting transaction", -#define ER_TABLE_CANT_HANDLE_FULLTEXT 1214 -"The used table type doesn't support FULLTEXT indexes", -#define ER_CANNOT_ADD_FOREIGN 1215 -"Cannot add foreign key constraint", -#define ER_NO_REFERENCED_ROW 1216 -"Cannot add a child row: a foreign key constraint fails", -#define ER_ROW_IS_REFERENCED 1217 -"Cannot delete a parent row: a foreign key constraint fails", -#define ER_CONNECT_TO_MASTER 1218 -"Error connecting to master: %-.128s", -#define ER_QUERY_ON_MASTER 1219 -"Error running query on master: %-.128s", -#define ER_ERROR_WHEN_EXECUTING_COMMAND 1220 -"Error when executing command %s: %-.128s", -#define ER_WRONG_USAGE 1221 -"Wrong usage of %s and %s", -#define ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT 1222 -"The used SELECT statements have a different number of columns", -#define ER_CANT_UPDATE_WITH_READLOCK 1223 -"Can't execute the query because you have a conflicting read lock", -#define ER_MIXING_NOT_ALLOWED 1224 -"Mixing of transactional and non-transactional tables is disabled", -#define ER_DUP_ARGUMENT 1225 -"Option '%s' used twice in statement", -#define ER_USER_LIMIT_REACHED 1226 -"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", -#define ER_SPECIFIC_ACCESS_DENIED_ERROR 1227 -"Access denied. You need the %-.128s privilege for this operation", -#define ER_LOCAL_VARIABLE 1228 -"Variable '%-.64s' is a LOCAL variable and can't be used with SET GLOBAL", -#define ER_GLOBAL_VARIABLE 1229 -"Variable '%-.64s' is a GLOBAL variable and should be set with SET GLOBAL", -#define ER_NO_DEFAULT 1230 -"Variable '%-.64s' doesn't have a default value", -#define ER_WRONG_VALUE_FOR_VAR 1231 -"Variable '%-.64s' can't be set to the value of '%-.64s'", -#define ER_WRONG_TYPE_FOR_VAR 1232 -"Wrong argument type to variable '%-.64s'", -#define ER_VAR_CANT_BE_READ 1233 -"Variable '%-.64s' can only be set, not read", -#define ER_CANT_USE_OPTION_HERE 1234 -"Wrong usage/placement of '%s'", -#define 1235 -"This version of MySQL doesn't yet support '%s'", -#define ER_MASTER_FATAL_ERROR_READING_BINLOG 1236 -"Got fatal error %d: '%-.128s' from master when reading data from binary log", diff --git a/Docs/reservedwords.texi b/Docs/reservedwords.texi deleted file mode 100644 index a6dddfe9a7a..00000000000 --- a/Docs/reservedwords.texi +++ /dev/null @@ -1,14 +0,0 @@ -@c This is a placeholder file for the autogenerated MySQL reserved -@c word list "reservedwords.texi", which is being included in -@c manual.texi when building the manual. -@c -@c This file will be replaced with the actual reserved word list -@c from the "mysqldoc" BK source tree when building the official -@c source distribution. -@c -@c Please note, that the manual is now maintained in a separate -@c "mysqldoc" BitKeeper tree! See -@c -@c http://www.mysql.com/doc/en/Installing_source_tree.html -@c -@c for more info on how to work with the MySQL BK source trees. diff --git a/Docs/section.Infolinks.texi b/Docs/section.Infolinks.texi deleted file mode 100644 index 828722e0e56..00000000000 --- a/Docs/section.Infolinks.texi +++ /dev/null @@ -1,880 +0,0 @@ -@c FIX AGL 20011108 Extracted from manual.texi. -@c Contains links to MySQL related info (books, articles). To web portals! - - -@node MySQL-Books, General-SQL, Questions, MySQL Information Sources -@subsection Books About MySQL - -For the latest book information, with user comments, please visit -@uref{http://www.mysql.com/portal/books/html/}. - -While this manual is still the right place for up to date technical -information, its primary goal is to contain everything there is to know -about MySQL. It is sometimes nice to have a bound book to read -in bed or while you travel. Here is a list of books about MySQL and -related subjects (in English). - -By purchasing a book through these hyperlinks provided herein, you are -contributing to the development of MySQL. - -@emph{MySQL} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0735709211&bfmtype=book} (Barnes and Noble) -@item Publisher @tab New Riders -@item Author @tab Paul DuBois -@item Pub Date @tab 1st Edition December 1999 -@item ISBN @tab 0735709211 -@item Pages @tab 800 -@item Price @tab $49.99 US -@item Downloadable examples @tab - @uref{http://www.kitebird.com/mysql-book/} (@code{samp_db} distribution) -@item Errata @tab -@uref{http://www.kitebird.com/mysql-book/errata.html} -@end multitable - -Foreword by Michael ``Monty'' Widenius, MySQL Moderator. -@* - -In @emph{MySQL}, Paul DuBois provides you with a comprehensive guide to -one of the most popular relational database systems. Paul has -contributed to the online documentation for MySQL and is an -active member of the MySQL community. The principal MySQL -developer, Monty Widenius, and a network of his fellow developers -reviewed the manuscript, and provided Paul with the kind of insight -no one else could supply. -@* - -Instead of merely giving you a general overview of MySQL, Paul -teaches you how to make the most of its capabilities. Through two -sample database applications that run throughout the book, he -gives you solutions to problems you're sure to face. He helps you -integrate MySQL efficiently with third-party tools, such as PHP -and Perl, enabling you to generate dynamic Web pages through -database queries. He teaches you to write programs that access -MySQL databases, and also provides a comprehensive set of -references to column types, operators, functions, SQL syntax, -MySQL programming, C API, Perl @code{DBI}, and PHP API. -@emph{MySQL} simply gives you the kind of information you won't find -anywhere else. -@* - -If you use MySQL, this book provides you with: -@itemize @bullet -@item -An introduction to MySQL and SQL. -@item -Coverage of MySQL's data types and how to use them. -@item -Thorough treatment of how to write client programs in C. -@item -A guide to using the Perl @code{DBI} and PHP APIs for developing -command-line and Web-based applications. -@item -Tips on administrative issues such as user accounts, backup, -crash recovery, and security. -@item -Help in choosing an ISP for MySQL access. -@item -A comprehensive reference for MySQL's data types, operators, -functions, and SQL statements and utilities. -@item -Complete reference guides for MySQL's C API, the Perl @code{DBI} API, -and PHP's MySQL-related functions. -@end itemize -@* - -@emph{MySQL & mSQL} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=1565924347&bfmtype=book} (Barnes and Noble) -@item Publisher @tab O'Reilly -@item Authors @tab Randy Jay Yarger, George Reese & Tim King -@item Pub Date @tab 1st Edition July 1999 -@item ISBN @tab 1-56592-434-7, Order Number: 4347 -@item Pages @tab 506 -@item Price @tab $34.95 -@end multitable - -This book teaches you how to use MySQL and @code{mSQL}, two popular -and robust database products that support key subsets of SQL on both Linux -and Unix systems. Anyone who knows basic C, Java, Perl, or Python can -write a program to interact with a database, either as a stand-alone -application or through a Web page. This book takes you through the -whole process, from installation and configuration to programming -interfaces and basic administration. Includes plenty of tutorial -material. -@* - -@emph{Sams' Teach Yourself MySQL in 21 Days} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0672319144&bfmtype=book} (Barnes and Noble) -@item Publisher @tab Sams -@item Authors @tab Mark Maslakowski and Tony Butcher -@item Pub Date @tab June 2000 -@item ISBN @tab 0672319144 -@item Pages @tab 650 -@item Price @tab $39.99 -@end multitable - -Sams' @emph{Teach Yourself MySQL in 21 Days} is for intermediate Linux users -who want to move into databases. A large share of the audience is Web -developers who need a database to store large amounts of information that -can be retrieved via the Web. - -Sams' @emph{Teach Yourself MySQL in 21 Days} is a practical, step-by-step -tutorial. The reader will learn to design and employ this open source -database technology into his or her website using practical, hands-on -examples to follow. -@* - -@emph{E-Commerce Solutions with MySQL} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0761524452&bfmtype=book} (Barnes and Noble) -@item Publisher @tab Prima Communications, Inc. -@item Authors @tab N/A -@item Pub Date @tab January 2000 -@item ISBN @tab 0761524452 -@item Pages @tab 500 -@item Price @tab $39.99 -@end multitable - -No description available. -@* - -@emph{MySQL and PHP from Scratch} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0789724405&bfmtype=book} (Barnes and Noble) -@item Publisher @tab Que -@item Authors @tab N/A -@item Pub Date @tab September 2000 -@item ISBN @tab 0789724405 -@item Pages @tab 550 -@item Price @tab $34.99 -@end multitable - -This book puts together information on installing, setting up, and -troubleshooting Apache, MySQL, PHP3, and IMP into one complete -volume. You also learn how each piece is part of a whole by learning, -step-by-step, how to create a web-based e-mail system. Learn to run -the equivalent of Active Server Pages (ASP) using PHP3, set up an -e-commerce site using a database and the Apache web server, and create -a data entry system (such as sales, product quality tracking, customer -preferences, etc) that no installation in the PC. -@* - -@emph{Professional MySQL Programming} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=1861005164} (Barnes and Noble) -@item Publisher @tab Wrox Press, Inc. -@item Authors @tab N/A -@item Pub Date @tab Late 2001 -@item ISBN @tab 1861005164 -@item Pages @tab 1000 -@item Price @tab $49.99 -@end multitable - -No description available. -@* - -@emph{Professional Linux Programming} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=1861003013&bfmtype=book} (Barnes and Noble) -@item Publisher @tab Wrox Press, Inc. -@item Authors @tab N/A -@item Pub Date @tab September 2000 -@item ISBN @tab 1861003013 -@item Pages @tab 1155 -@item Price @tab $47.99 -@end multitable - -In this follow-up to the best-selling @emph{Beginning Linux Programming}, -you will learn from the authors' real-world knowledge and experience of -developing software for Linux; you'll be taken through the development -of a sample 'DVD Store' application, with 'theme' chapters addressing -different aspects of its implementation. Meanwhile, individual -``take-a-break'' chapters cover important topics that go beyond the -bounds of the central theme. All focus on the practical aspects of -programming, showing how crucial it is to choose the right tools for -the job, use them as they should be used, and get things right first -time. -@* - -@emph{PHP and MySQL Web Development} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0672317842&bfmtype=book} (Barnes and Noble) -@item Publisher @tab Sams -@item Authors @tab Luke Welling, Laura Thomson -@item Pub Date @tab March 2001 -@item ISBN @tab 0672317842 -@item Pages @tab 700 -@item Price @tab $49.99 -@end multitable - -@emph{PHP and MySQL Web Development} introduces you to the advantages -of implementing both MySQL and PHP. These advantages are detailed -through the provision of both statistics and several case studies. A -practical web application is developed throughout the book, providing -you with the tools necessary to implement a functional online -database. Each function is developed separately, allowing you the -choice to incorporate only those parts that you would like to -implement. Programming concepts of the PHP language are highlighted, -including functions which tie MySQL support into a PHP script and -advanced topics regarding table manipulation. -@* - -@strong{Books recommended by the MySQL Developers} - -@emph{SQL-99 Complete, Really} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0879305681&bfmtype=book} (Barnes and Noble) -@item Publisher @tab CMP Books -@item Authors @tab Peter Gulutzan, Trudy Pelzer -@item Pub Date @tab April 1999 -@item ISBN @tab 0879305681 -@item Pages @tab 1104 -@item Price @tab $55.96 -@end multitable - -This book contains complete descriptions of the new standards for -syntax, data structures, and retrieval processes of SQL databases. As -an example-based reference manual, it includes all of the CLI -functions, information, schema tables, and status codes, as well as a -working SQL database provided on the companion disk. -@* - -@emph{C, A reference manual} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0133262243&bfmtype=book} (Barnes and Noble) -@item Publisher @tab Prentice Hall -@item Authors @tab Samuel P. Harbison, Guy L. Steele -@item Pub Date @tab September 1994 -@item ISBN @tab 0133262243 -@item Pages @tab 480 -@item Price @tab $35.99 -@end multitable - -A new and improved revision of the bestselling C language -reference. This manual introduces the notion of "Clean C", writing C -code that can be compiled as a C++ program, C programming style that -emphasizes correctness, portability, maintainability, and -incorporates the ISO C Amendment 1 (1994) which specifies new -facilities for writing portable, international programs in C. -@* - -@emph{C++ for Real Programmers} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0120499428&bfmtype=book} (Barnes and Noble) -@item Publisher @tab Academic Press, Incorporated -@item Authors @tab Jeff Alger, Jim Keogh -@item Pub Date @tab February 1998 -@item ISBN @tab 0120499428 -@item Pages @tab 388 -@item Price @tab $39.95 -@end multitable - -@emph{C++ For Real Programmers} bridges the gap between C++ as described -in beginner and intermediate-level books and C++ as it is practiced by -experts. Numerous valuable techniques are described, organised into -three simple themes: indirection, class hierarchies, and memory -management. It also provides in-depth coverage of template creation, -exception handling, pointers and optimisation techniques. The focus of -the book is on ANSI C++ and, as such, is compiler independent. - -@emph{C++ For Real Programmers} is a revision of -@emph{Secrets of the C++ Masters} and includes a new appendix comparing C++ -with Java. The book comes with a 3.5" disk for Windows with source code. -@* - -@emph{Algorithms in C} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0201514257&bfmtype=book} (Barnes and Noble) -@item Publisher @tab Addison Wesley Longman, Inc. -@item Authors @tab Robert Sedgewick -@item Pub Date @tab April 1990 -@item ISBN @tab 0201514257 -@item Pages @tab 648 -@item Price @tab $45.75 -@end multitable - -@emph{Algorithms in C} describes a variety of algorithms in a number of -areas of interest, including: sorting, searching, string-processing, and -geometric, graph and mathematical algorithms. The book emphasizes -fundamental techniques, providing readers with the tools to confidently -implement, run, and debug useful algorithms. -@* - -@emph{Multithreaded Programming with Pthreads} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0136807291&bfmtype=book} (Barnes and Noble) -@item Publisher @tab Prentice Hall -@item Authors @tab Bil Lewis, Daniel J. Berg -@item Pub Date @tab October 1997 -@item ISBN @tab 0136807291 -@item Pages @tab 432 -@item Price @tab $34.95 -@end multitable - -Based on the best-selling @emph{Threads Primer}, -@emph{Multithreaded Programming with Pthreads} gives you a solid -understanding of Posix threads: what they are, how they work, when to use -them, and how to optimise them. It retains the clarity and humor of -@emph{Threads Primer}, but includes expanded comparisons to Win32 and OS/2 -implementations. Code examples tested on all of the major UNIX platforms -are featured along with detailed explanations of how and why they use threads. -@* - -@emph{Programming the PERL DBI: Database Programming with PERL} -@multitable @columnfractions .3 .7 -@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=1565926994&bfmtype=book} (Barnes and Noble) -@item Publisher @tab O'Reilly & Associates, Incorporated -@item Authors @tab Alligator Descartes, Tim Bunce -@item Pub Date @tab February 2000 -@item ISBN @tab 1565926994 -@item Pages @tab 400 -@item Price @tab $27.96 -@end multitable - -@emph{Programming the Perl DBI} is coauthored by Alligator Descartes, one -of the most active members of the DBI community, and by Tim Bunce, the -inventor of DBI. For the uninitiated, the book explains the architecture -of DBI and shows you how to write DBI-based programs. For the experienced -DBI dabbler, this book explains DBI's nuances and the peculiarities of each -individual DBD. - -The book includes: -@itemize @bullet -@item -An introduction to DBI and its design. -@item -How to construct queries and bind parameters. -@item -Working with database, driver, and statement handles. -@item -Debugging techniques. -@item -Coverage of each existing DBD. -@item -A complete reference to DBI. -@end itemize -@* - - -@node General-SQL, Useful Links, MySQL-Books, MySQL Information Sources -@subsection General SQL Information and Tutorials - -The MySQL book portal is split into different sections to make it easy -to locate books for various purposes. -@uref{http://www.mysql.com/portal/books/html/} - -Tutorials can be found at: -@uref{http://www.mysql.com/portal/development/html/development-61-1.html} - -@node Useful Links, , General-SQL, MySQL Information Sources -@subsection Useful MySQL-related Links - -The MySQL development portal is the ultimate source of MySQL related -links. @uref{http://www.mysql.com/portal/development/html/} - -Apart from the following links, you can find and download a lot of -MySQL programs, tools and APIs in the Contrib directory -(@uref{http://www.mysql.com/Downloads/Contrib/}). -@cindex @code{Contrib} directory - -@cindex URLs to MySQL information -@cindex MySQL related information URLs -@subheading Tutorials and Manuals - -@table @asis -@item @uref{http://michael.bacarella.com/research/mysqlmyths.html} (MySQL Myths Debunked) -MySQL used in the real world. - -@item @uref{http://www.4t2.com/mysql/} -Information about the German MySQL mailing list. - -@item @uref{http://www2.rent-a-database.de/mysql/} -MySQL handbook in German. - -@item @uref{http://www.bitmover.com:8888/home/bk/mysql/} -Web access to the MySQL BitKeeper repository. - -@item @uref{http://www.analysisandsolutions.com/code/mybasic.htm} -Beginners MySQL Tutorial on how to install and set up -MySQL on a Windows machine. - -@item @uref{http://www.devshed.com/Server_Side/MySQL/} -A lot of MySQL tutorials. - -@item @uref{http://mysql.hitstar.com/} -MySQL manual in Chinese. - -@item @uref{http://www.linuxplanet.com/linuxplanet/tutorials/1046/1/} -Setting Up a MySQL-based website. - -@item @uref{http://www.hotwired.com/webmonkey/backend/tutorials/tutorial1.html} -MySQL-Perl tutorial. - -@item @uref{http://www.iserver.com/support/contrib/perl5/modules.html} -Installing new Perl modules that require locally installed modules. - -@item @uref{http://www.hotwired.com/webmonkey/databases/tutorials/tutorial4.html} -PHP/MySQL Tutorial. - -@item @uref{http://www.useractive.com/} -Hands on tutorial for MySQL. -@end table - -@subheading MySQL Discussion Forums - -@table @asis -@item @uref{http://www.weberdev.com/} -Examples using MySQL; (check Top 20) - -@item @uref{http://futurerealm.com/forum/futureforum.htm} -FutureForum Web Discussion Software. -@end table - -@subheading Porting MySQL/Using MySQL on Different Systems - -@table @asis -@item @uref{http://www.entropy.ch/software/macosx/mysql/} -Binary of MySQL for Mac OS X Client. Includes information of how to -build and use MySQL on Mac OS X. - -@item @uref{http://xclave.macnn.com/MySQL/} -The Mac OS Xclave. Running MySQL on Mac OS X. - -@item @uref{http://www.prnet.de/RegEx/mysql.html} -MySQL for Mac OS X Server. - -@item @uref{http://www.latencyzero.com/macosx/mysql.html} -Building MySQL for Mac OS X. - -@item @uref{http://www.essencesw.com/Software/mysqllib.html} -New Client libraries for the Mac OS Classic (Macintosh). - -@item @uref{http://www.lilback.com/macsql/} -Client libraries for Mac OS Classic (Macintosh). - -@item @uref{http://sixk.maniasys.com/index_en.html} -MySQL for Amiga -@end table - -@subheading Perl-related Links - -@table @asis -@item @uref{http://dbimysql.photoflux.com/} -Perl DBI with MySQL FAQ. -@end table - -@c FIX We should get longer descriptions for things in this category! -@subheading Commercial Applications that Support MySQL - -@table @asis -@item @uref{http://www.supportwizard.com/} -SupportWizard; Interactive helpdesk on the Web. This product includes a -licensed copy of MySQL. - -@item @uref{http://www.sonork.com/} -Sonork, Instant Messenger that is not only Internet oriented. It's -focused on private networks and on small to medium companies. Client -is free, server is free for up to 5 seats. - -@item @uref{http://www.stweb.org/} -StWeb - Stratos Web and Application server - An easy-to-use, cross -platform, Internet/Intranet development and deployment system for -development of web-enabled applications. The standard version of StWeb -has a native interface to MySQL database. - -@item @uref{http://www.rightnowtech.com/} -Right Now Web; Web automation for customer service. - -@item @uref{http://www.icaap.org/Bazaar/} -Bazaar; Interactive Discussion Forums with Web interface. - -@cindex PhoneSweep -@item @uref{http://www.phonesweep.com/} -PhoneSweepT is the world's first commercial Telephone Scanner. Many break-ins -in recent years have come not through the Internet, but through unauthorised -dial-up modems. PhoneSweep lets you find these modems by repeatedly placing -phone calls to every phone number that your organisation -controls. PhoneSweep has a built-in expert system that can recognise -more than 250 different kinds of remote-access programs, including -Carbon Copy(TM), pcANYWHERE(TM), and Windows NT RAS. All information is stored -in the SQL database. It then generates a comprehensive report detailing -which services were discovered on which dial-up numbers in your organisation. -@end table - -@subheading SQL Clients and Report Writers - -@table @asis -@item @uref{http://www.urbanresearch.com/software/utils/urbsql/} (urSQL) -SQL Editor and Query Utility. Custom syntax highlighting, editable -results grid, exportable result-sets, basic MySQL admin functions, -Etc.. For Windows. - -@item @uref{http://www.edatanew.com/} (MySQL Data Manager) -MySQL Data Manager * is platform independent web client -(written in perl) for MySQL server over TCP/IP. - -@item @uref{http://ksql.sourceforge.net/} -KDE MySQL client. - -@item @uref{http://www.ecker-software.de/} -A Windows GUI client by David Ecker. - -@item @uref{http://www.icaap.org/software/kiosk/} -Kiosk; a MySQL client for database management. Written in Perl. -Will be a part of Bazaar. - -@item @uref{http://www.casestudio.com/} -Db design tool that supports MySQL 3.23. - -@item @uref{http://home.skif.net/~voland/zeos/eng/} -Zeos - A client that supports MySQL, Interbase and PostgreSQL. - -@item @uref{http://www.geocities.com/SiliconValley/Ridge/4280/GenericReportWriter/grwhome.html} -A free report writer in Java - -@item @uref{http://www.javaframework.de/} -MySQLExport - Export of MySQL create statements and data in a lot of -different formats (SQL, HTML, CVS, text, ZIP, GZIP...). - -@item @uref{http://dlabs.4t2.com/} -M2D, a MySQL Administration client for Windows. M2D supports -administration of MySQL databases, creation of new databases and -tables, editing, and more. - -@item @uref{http://dlabs.4t2.com/} -Dexter, a small server written in Perl which can be used as a proxy server for -MySQL or as a database extender. - -@item @uref{http://www.scibit.com/Products/Software/Utils/Mascon.asp} -Mascon is a powerful Win32 GUI for administering MySQL databases. - -@item @uref{http://www.rtlabs.com/} -MacSQL Monitor. GUI for MySQL, ODBC, and JDBC databases for the Mac OS. -@end table - -@subheading Distributions that Include MySQL - -@c FIX add the rest (at least a couple more Linuxes) - -@table @asis -@item @uref{http://www.suse.com/} -SuSE Linux (6.1 and above) - -@item @uref{http://www.redhat.com/} -RedHat Linux (7.0 and above) - -@item @uref{http://distro.conectiva.com.br/} -Conectiva Linux (4.0 and above) -@end table - -@subheading Web Development Tools that Support MySQL - -@table @asis -@item @uref{http://www.php.net/} -PHP: A server-side HTML-embedded scripting language. - -@item @uref{http://www.midgard-project.org/} -The Midgard Application Server; a powerful Web development environment -based on MySQL and PHP. - -@cindex dbServ -@item @uref{http://www.dbServ.de/} -dbServ is an extension to a web server to integrate database output into -your HTML code. You may use any HTML function in your output. Only the -client will stop you. It works as standalone server or as Java servlet. - -@item @uref{http://www.chilisoft.com/} -Platform independent ASP from Chili!Soft - -@item @uref{http://www.voicenet.com/~zellert/tjFM/} -A JDBC driver for MySQL. - -@item @uref{http://www.wernhart.priv.at/php/} -MySQL + PHP demos. - -@item @uref{http://www.dbwww.com/} -ForwardSQL: HTML interface to manipulate MySQL databases. - -@item @uref{http://www.daa.com.au/~james/www-sql/} -WWW-SQL: Display database information. - -@item @uref{http://www.heitml.com/} -HeiTML: A server-side extension of HTML and a 4GL language at the same time. - -@item @uref{http://hawkeye.net/} -Hawkeye Internet Server Suite. - -@item @uref{http://www.webgroove.com/} -WebGroove Script: HTML compiler and server-side scripting language. - -@item @uref{http://www.ihtml.com/} -A server-side website scripting language. - -@item @uref{ftp://ftp.igc.apc.org/pub/myodbc/README} -How to use MySQL with ColdFusion on Solaris. - -@item @uref{http://calistra.com/MySQL/} -Calistra's ODBC MySQL Administrator. - -@item @uref{http://phpclub.net/} -PHPclub - Tips and tricks for PHP. - -@item @uref{http://www.widgetchuck.com/} -The Widgetchuck; Website Tools and Gadgets - -@item @uref{http://www.adcycle.com/} -AdCycle - advertising management software. - -@cindex pwPage -@item @uref{http://sourceforge.net/projects/pwpage/} -pwPage - provides an extremely fast and simple approach to the creation -of database forms. That is, if a database table exists and an HTML page -has been constructed using a few simple guidelines, pwPage can be -immediately used for table data selections, insertions, updates, deletions -and selectable table content reviewing. - -@item @uref{http://www.omnis-software.com/products/studio/studio.html} -OMNIS Studio is a rapid application development (RAD) tool. -@end table - -@subheading Database Design Tools with MySQL Support - -@table @asis -@item @uref{http://www.mysql.com/documentation/dezign/} -"DeZign for databases" is a database development tool that uses an -entity relationship diagram (ERD). -@end table - -@subheading Web Servers with MySQL Tools - -@table @asis -@item @uref{ftp://ftp.kcilink.com/pub/} -mod_auth_mysql, An Apache authentication module. - -@item @uref{http://www.roxen.com/} -The Roxen Challenger Web server. -@end table - -@subheading Extensions for Other Programs - -@table @asis -@item @uref{http://www.seawood.org/msql_bind/} -MySQL support for BIND (The Internet Domain Name Server). - -@item @uref{http://www.inet-interactive.com/sendmail/} -MySQL support for Sendmail and Procmail. -@end table - -@subheading Using MySQL with Other Programs - -@table @asis -@item @uref{http://www.iserver.com/support/addonhelp/database/mysql/msaccess.html} -Using MySQL with Access. - -@item @uref{http://www.iserver.com/support/contrib/perl5/modules.html} -Installing new Perl modules that require locally installed modules. -@end table - -@subheading ODBC-related Links - -@table @asis -@item @uref{http://www.iodbc.org/} -Popular iODBC Driver Manager (libiodbc) now available as Open Source. - -@item @uref{http://users.ids.net/~bjepson/freeODBC/} -The FreeODBC Pages. - -@item @uref{http://genix.net/unixODBC/} -The unixODBC Project goals are to develop and promote unixODBC to be the -definitive standard for ODBC on the Linux platform. This is to include GUI -support for KDE. - -@item @uref{http://www.sw-soft.com/products/BtrieveODBC/} -A MySQL-based ODBC driver for Btrieve. -@end table - -@subheading @strong{API}-related Links - -@table @asis -@item @uref{http://www.jppp.com/} -Partially implemented TDataset-compatible components for MySQL. - -@item @uref{http://www.riverstyx.net/qpopmysql/} -qpopmysql - A patch to allow POP3 authentication from a MySQL -database. There's also a link to Paul Khavkine's patch for Procmail to -allow any MTA to deliver to users in a MySQL database. - -@item @uref{http://www.essencesw.com/Software/mysqllib.html} -New Client libraries for the Mac OS Classic (Macintosh). - -@item @uref{http://www.lilback.com/macsql/} -Client libraries for the Macintosh. - -@item @uref{http://www.essencesw.com/Plugins/mysqlplug.html} -Plugin for REALbasic (for Macintosh) - -@item @uref{http://www.iis.ee.ethz.ch/~neeri/macintosh/gusi-qa.html} -A library that emulates BSD sockets and pthreads on Macintosh. This can -be used if you want to compile the MySQL client library on Mac. -It could probably even be sued to port MySQL to Macintosh, but we -don't know of anyone that has tried that. - -@cindex SCMDB -@item @uref{http://www.dedecker.net/jessie/scmdb/} -SCMDB - an add-on for SCM that ports the MySQL C library to scheme -(SCM). With this library scheme developers can make connections to a -MySQL database and use embedded SQL in their programs. -@end table - -@subheading Other MySQL-related Links - -@table @asis -@item @uref{http://www.satisoft.com/} (SAT) -The Small Application Toolkit (SAT) is a collection of utilities -intended to simplify the development of small, multi-user, GUI based -applications in a (Microsoft -or- X) Windows Client / Unix Server -environment. - -@item @uref{http://www.wix.com/mysql-hosting/} -Registry of Web providers who support MySQL. - -@item @uref{http://www.softagency.co.jp/mysql/index.en.html} -Links about using MySQL in Japan/Asia. - -@item @uref{http://abattoir.cc.ndsu.nodak.edu/~nem/mysql/udf/} -MySQL UDF Registry. - -@item @uref{http://www.open.com.au/products.html} -Commercial Web defect tracking system. - -@item @uref{http://www.stonekeep.com/pts/} -PTS: Project Tracking System. - -@item @uref{http://tomato.nvgc.vt.edu/~hroberts/mot/} -Job and software tracking system. - -@item @uref{http://www.cynergi.net/exportsql/} -ExportSQL: A script to export data from Access95+. - -@item @uref{http://SAL.KachinaTech.COM/H/1/MYSQL.html} -SAL (Scientific Applications on Linux) MySQL entry. - -@item @uref{http://www.infotech-nj.com/itech/index.shtml} -A consulting company which mentions MySQL in the right company. - -@item @uref{http://www.pmpcs.com/} -PMP Computer Solutions. Database developers using MySQL and -@code{mSQL}. - -@item @uref{http://www.dedserius.com/y2kmatrix/} -Y2K tester. -@end table - -@subheading SQL and Database Interfaces - -@table @asis -@item @uref{http://java.sun.com/products/jdbc/} -The JDBC database access API. - -@item @uref{http://www.gagme.com/mysql/} -Patch for @code{mSQL} Tcl. - -@item @uref{http://www.amsoft.ru/easysql/} -EasySQL: An ODBC-like driver manager. - -@item @uref{http://www.lightlink.com/hessling/rexxsql.html} -A REXX interface to SQL databases. - -@c @item @uref{http://www.mytcl.cx/} -@c Tcl interface based on tcl-sql with many bugfixes. - -@item @uref{http://www.binevolve.com/~tdarugar/tcl-sql/} -Tcl interface for MySQL. - -@item @uref{http://www.contrib.andrew.cmu.edu/~shadow/sql.html} -SQL Reference Page with a lot of interesting links. - -@end table - -@subheading Examples of MySQL Use - -@table @asis -@c Added 990601 -@c EMAIL: thuss@little6.com (Todd Huss) -@item @uref{http://www.little6.com/about/linux/} -Little6 Inc., An online contract and job finding site that is powered by -MySQL, PHP3, and Linux. - -@c Added 990521 -@c EMAIL: info@worldrecords.com (Jim Rota) -@item @uref{http://www.worldrecords.com/} -World Records - A search engine for information about music that uses -MySQL and PHP. - -@item @uref{http://www.webtechniques.com/archives/1998/01/note/} -A Contact Database using MySQL and PHP. - -@item @uref{http://modems.rosenet.net/mysql/} -Web based interface and Community Calendar with PHP. - -@item @uref{http://www.odbsoft.com/cook/sources.htm} -Perl package to generate html from a SQL table structure and for generating -SQL statements from an html form. - -@item @uref{http://www.gusnet.cx/proj/telsql/} -Basic telephone database using @code{DBI}/@code{DBD}. - -@item @uref{http://tecfa.unige.ch/guides/java/staf2x/ex/jdbc/coffee-break/} -JDBC examples by Daniel K. Schneider. - -@item @uref{http://www.ooc.com/} -Object Oriented Concepts Inc; CORBA applications with examples in source. - -@c EMAIL: paul@sword.damocles.com (Paul Bannister) -@item @uref{http://www.stopbit.com/} -Stopbit - A technology news site using MySQL and PHP. - -@item @uref{http://www.penguinservices.com/scripts/} -Online shopping cart system. - -@c Added 990928 from editor@city-gallery.com -@cindex Old Photo Album -@item @uref{http://www.city-gallery.com/album/} -Old Photo Album - The album is a collaborative popular history of photography -project that generates all pages from data stored in a MySQL -database. Pages are dynamically generated through a php3 interface to the -database content. Users contribute images and descriptions. Contributed -images are stored on the web server to avoid storing them in the database -as BLOBs. All other information is stored on the shared MySQL server. -@end table - -@subheading General Database Links - -@table @asis -@item @uref{http://black.hole-in-the.net/guy/webdb/} -Homepage of the webdb-l (Web Databases) mailing list. - -@item @uref{http://www.symbolstone.org/technology/perl/DBI/} -Perl @code{DBI}/@code{DBD} modules homepage. - -@item @uref{http://www.student.uni-koeln.de/cygwin/} -Cygwin tools. Unix on top of Windows. - -@cindex Tek-Tips forums -@cindex forums, Tek-Tips -@item @uref{http://www.tek-tips.com/} -Tek-Tips Forums are 800+ independent peer-to-peer non-commercial support -forums for Computer Professionals. Features include automatic e-mail -notification of responses, a links library, and member confidentiality -guaranteed. - -@item @uref{http://www.public.asu.edu/~peterjn/btree/} -B-Trees: Balanced Tree Data Structures. - -@item @uref{http://www.fit.qut.edu.au/~maire/baobab/lecture/sld001.htm} -A lecture about B-Trees. -@end table - - diff --git a/Docs/section.Testimonials.texi b/Docs/section.Testimonials.texi deleted file mode 100644 index e757a6a92d0..00000000000 --- a/Docs/section.Testimonials.texi +++ /dev/null @@ -1,31 +0,0 @@ -@c FIX AGL 20011108 Extracted from manual.texi. -@c Should only be on website with new submits by webform. - - -@node MySQL Testimonials, Contrib, Users, Top -@appendix MySQL Testimonials - -@cindex MySQL Testimonials - -The section 'MySQL Users' contains a lot of different links to -MySQL users but doesn't provide that much information about how -they are using MySQL. @xref{Users}. This section gives you an idea -of how other MySQL users are using MySQL to solve their problems. - -Please note that all new stories are added on the MySQL website, -@uref{http://www.mysql.com/}. -Do let us know about @emph{your} success story too! - -@itemize @bullet -@item -@strong{Peter Zaitsev of Spylog.ru} writes: -I think you might be interested in my database size. The whole database -is currently on 15 servers and I think it's about 60.000 of tables -containing about 5.000.000.000 of rows. My mostly loaded server -currently holds about 10.000 of tables with 1.000.000.000 of rows in it. -Hugest tables have about 50.000.000 of rows, and this value will raise -as soon as I'll move to 2.4 kernel with large files. Currently I have to -delete much of logs for large sites to hold table sizes in 2Gb. - -@item - diff --git a/Docs/section.Users.texi b/Docs/section.Users.texi deleted file mode 100644 index 3c8d219fa16..00000000000 --- a/Docs/section.Users.texi +++ /dev/null @@ -1,414 +0,0 @@ -@c FIX AGL 20011108 Extracted from manual.texi. -@c Should only be on website. - - -@node Users, Contrib, Problems, Top -@appendix MySQL Users - -@cindex users, of MySQL -@cindex news sites - -This appendix lists users of MySQL that have given us permission -to list them in our documentation. It is by far not a complete list, but -should give you a general idea of who uses MySQL and what it can -be used for. - -@appendixsec General News Sites - -@itemize @bullet - -@item @uref{http://www.yahoo.com/} (Yahoo!) - -@item @uref{http://slashdot.org/} (Slashdot: A pro-Linux/tech news and comment/discussion site) - -@item @uref{http://www.linux.com/} (All about Linux) - -@item @uref{http://www.linuxtoday.com/} (Linuxtoday) - -@item @uref{http://www.32bitsonline.com/} (32Bits Online: because there's -more than one way to compute) - -@item @uref{http://www.freshmeat.net/} (Freshmeat: News about new versions of computer-related stuff) - -@end itemize - -@cindex search engines, web -@cindex web search engines -@appendixsec Web Search Engines - -@itemize @bullet - -@item @uref{http://www.aaa.com.au/} (AAA Matilda Web Search) -@item @uref{http://www.whatsnu.com/} (What's New) -@item @uref{http://www.aladin.de/} (Aladin) -@item @uref{http://www.columbus-finder.de/} (Columbus Finder) -@item @uref{http://www.spider.de/} (Spider) -@item @uref{http://www.blitzsuche.de/} (Blitzsuche) -@item @uref{http://www.indoseek.co.id/} (Indoseek Indonesia) -@item @uref{http://www.yaboo.dk/} (Yaboo - Yet Another BOOkmarker) -@item @uref{http://www.ozsearch.com.au/} (OzSearch Internet Guide) -@item @uref{http://www.splatsearch.com/} (Splat! Search) -@item @uref{http://osdls.library.arizona.edu/} (The Open Source Digital Library System Project) -@end itemize - -@appendixsec Information Search Engines Specialising in a Particular Area - -@itemize @bullet - -@item @uref{http://www.spylog.ru/} (SpyLOG ; A very popular Web counter site) - -@item @uref{http://www.tucows.com/} (TuCows Network; Free Software archive) - -@item @uref{http://www.jobvertise.com/} (Jobvertise: Post and search for jobs) - -@item @uref{http://www.musicdatabase.com/} (The Music Database) - -@item @uref{http://www.soccersearch.com/} (Football -Soccer- search page) - -@item @uref{http://www.headrush.net/takedown} (TAKEDOWN - wrestling) - -@item @uref{http://www.lyrics.net/} (The International Lyrics Network) - -@item @uref{http://TheMatrix.com/~matrix/band_search.phtml} (Musicians looking for other musicians; free service) - -@item @uref{http://www.addall.com/AddBooks/Stores.html} (AddALL books searching and price comparison) - -@item @uref{http://www.herbaria.harvard.edu/Data/Gray/gray.html} (Harvard's Gray Herbarium Index of Plant Names) - -@item @uref{http://www.game-developer.com/} (The Game Development Search Engine) - -@item @uref{http://www.theinnkeeper.com/} (The Innkeeper Vacation Guides) - -@item @uref{http://www.macgamedatabase.com/} (The Mac Game Database uses PHP and MySQL) -@c From: Marc Antony Vose - -@item @uref{http://www.csse.monash.edu.au/publications/} (Research -Publications at Monash University in Australia) - -@item @uref{http://www.ipielle.emr.it/bts/} -(Occupational Health & Safety Website database; a project for the ECC) -@c c.presutti@ipielle.emr.it - -@item @uref{http://data.mch.mcgill.ca/} (Bioinformatics databases at the -Montreal Children's Hospital using MySQL) -@c saeed@www.debelle.mcgill.ca -@end itemize - -@cindex online magazines -@cindex magazines, online -@appendixsec Online Magazines - -@itemize @bullet -@item @uref{http://www.spoiler.com/} (Spoiler Webzine) -An online magazine featuring music, literature, arts, and design content. -@item @uref{http://www.linux-magazin.de/newsflash/} (Daily news about Linux in German language) -@item @uref{http://www.betazine.com/} (Betazine - The Ultimate Online Beta Tester's Magazine) -@item @uref{http://www.currents.net/ccinfo/aboutcc.html} (Computer Currents Magazine) -@end itemize - -@cindex websites -@appendixsec Websites that Use MySQL as a Backend - -@itemize @bullet - -@item @uref{http://liftoff.msfc.nasa.gov/} (NASA) -@item @uref{http://kids.msfc.nasa.gov/} (NASA KIDS) -@item @uref{http://science.nasa.gov/} (Sience@@NASA) - -@item @uref{http://www.handy.de/} (handy.de) - -@item @uref{http://lindev.jmc.tju.edu/qwor/} (Qt Widget and Object Repository) - -@item @uref{http://www.samba-choro.com.br/} (Brazilian samba site; in Portuguese) - -@item @uref{http://pgss.iss.uw.edu.pl/en_index.ISS} (Polish General Social Survey) - -@item @uref{http://www.expo2000.com/} Expo2000 - world-wide distribution of -tickets for this event is implemented using MySQL and Tcl/Tk. More than -5000 travel agencies all over the world have access to it. - -@item @uref{http://www.freevote.com/} FreeVote.com is a free voting -service with millions of users. - -@item @uref{http://f1.tauzero.se/} (Forza Motorsport) - -@item @uref{http://www.dreamhost.com/} (DreamHost Web Hosting) - -@end itemize - -@cindex services -@appendixsec Domain/Internet/Web and Related Services - -@itemize @bullet - -@item @uref{http://www.wix.com/mysql-hosting/} (Registry of Web providers that -support MySQL) - -@item @uref{http://www.yi.org/} (Dynamic DNS Services) - -@item @uref{http://www.dynodns.net/} (Dynamic domain name service) - -@item @uref{http://www.ods.org/} (Open DNS Project; free dynamic DNS service) - -@c @item @uref{http://dynodns.net/} (Free dynamic DNS implementation) -@c EMAIL: A Moore - -@item @uref{http://www.hn.org/} (Hammernode; Public DNS Servers) - -@item @uref{http://www.fdns.net/} (Free 3rd level domains) - -@item @uref{http://worldcommunity.com/} (Online Database) - -@item @uref{http://www.bigbiz.com/} (BigBiz Internet Services) - -@item @uref{http://virt.circle.net/} (The Virt Gazette) - -@item @uref{http://www.california.com/} (Global InfoNet Inc) - -@item @uref{http://www.webhosters.com/} (WebHosters - A Guide to WWW Providers) - -@item @uref{http://online.dn.ru/} (Internet information server) - -@item @uref{http://www.worldnetla.net/} (WorldNet Communications - An Internet Services Provider) - -@item @uref{http://www.netizen.com.au/} (Netizen: Australian-based Web consultancy) - -@item @uref{http://www.trainingpages.co.uk/} (Search site for training courses in the UK) - -@item @uref{http://chat.nitco.com/} (Gannon Chat; GPL. Written in Perl and Javascript) - -@item @uref{http://www.addurls.com/} (A general links directory) - -@item @uref{http://www.bookmarktracker.com/} (A Web-based bookmark management service) - -@item @uref{http://www.cdrom.com/} (Walnut Creek CDROM) - -@item @uref{http://www.wwwthreads.org/} (WWWThreads; Interactive discussion Forums) - -@item @uref{http://pvmon.portici.enea.it/Meteo/} (In Italian; Storage data from meteo station) - -@item @uref{http://www.buysell.net/} (Online "Person To Person" Auction) - -@item @uref{http://tips.pair.com/} (Tips on Web development) - -@item @uref{http://www.mailfriends.com/} (Mailfriends.com is a FREE service for -everybody who wants to find friends over the internet) - -@item @uref{http://www.uninova.com/cgi-bin/wctelnets?list} (Web Page Telnet BBS List) - -@item @uref{http://www.uninova.com/cnc.html} (UniNova Digital Postcards) - -@c @item @uref{http://cabinboy.powersurfr.com/} (An Internet RFC search engine) - -@item @uref{http://www.dslreports.com/} (DSL-provider search with reviews) -Made with MySQL and Modperl, all pages are generated dynamically out of -the MySQL database -@end itemize - -@cindex PHP, websites -@appendixsec Websites that Use @code{PHP} and MySQL - -@itemize @bullet -@c @item @uref{http://www.wh200th.com/} (White House 200th Anniversary site) - -@item @uref{http://support.jgaa.com/} (Jgaa's Internet - Official Support Site) - -@item @uref{http://io.incluso.com/} (Ionline - online publication) MySQL, -PHP, Java, Web programming, DB development - -@item @uref{http://www.baboo.com/} (BaBoo - Browse and Bookmark. Free Web-based bookmark manager and Calendar) - -@item @uref{http://www.courses.pjc.cc.fl.us/Schedule/} -(Course Schedule System at Pensacola Junior College) - -@item @uref{http://www.fccj.org/} (Florida Community College at Jacksonville) - -@item @uref{http://www.32bit.com/} (32bit.com; An extensive shareware / freeware archive) - -@item @uref{http://www.jokes2000.com/} (Jokes 2000) -@c Added 990604; EMAIL: ah@dybdahl.dk - -@item @uref{http://www.burken.nu/} -Burken is a webhotel that provides scripts, among other things, -for remote users, like counters, guestbooks etc. -@c Added 990608; EMAIL: spacedmp@SpaceDump.Burken.NU (Anders Olausson) - -@item @uref{http://tips.pair.com/} -Contains tips on html, javascript, 2d/3d graphics, and PHP3/MySQL. -All pages are generated from a database. -@c Added 990614; EMAIL: downey@image.dk (Rune Madsen) - -@item @uref{http://www.softwarezrus.com/} -Ecommerce site that is selling computers. -@end itemize - -@cindex consultants, list of -@appendixsec MySQL Consultants - -@itemize @bullet - -@item @uref{http://www.ayni.com/} (Ayni AG) - -@item @uref{http://worldcommunity.com/} (Online Database) - -@item @uref{http://www2.dataguard.no/} (DataGuard; Uses MySQL and PHP) - -@item @uref{http://wwits.net/programs/mysql.phtml} (WWITS; uses MySQL and PHP) - -@item @uref{http://www.worldcommunity.com/} (WCN - The World Community Network) - -@item @uref{http://www.chipcastle.com/} (Chip Castle Dot Com Inc) -@c Added 990603 EMAIL: chip@chipcastle.com (Chip Castle) - -@item @uref{http://www.cyber.com.au/} (Cybersource Pty. Ltd) - -@item @uref{http://www.spring.de/} (Spring infotainment gmbh & co. kg) -@c added 990905 "Oliver Pischke" - -@item @uref{http://www.wamdesign.com/} (Wam Design develops websites using MySQL) -@c Added 990905; max@wamdesign.com - -@item @uref{http://www.berkeleyconsultants.com/} (Berkeley Consultants Group) - -@item @uref{http://www.jammconsulting.com/} (JAMM Consulting Inc) - -@end itemize - -@c Commented out by Arjen 011018, section is empty! -@c appendixsec Programming - -@cindex web pages, miscellaneous -@appendixsec Uncategorised Pages - -@itemize @bullet - -@item @uref{http://www.feature-showcase.com/htmls/demo_mysql.sql} (AZC.COM's Feature Showcase) - -@item @uref{http://www.teach.org.uk/subjects/trainingcourse/g.html} (Course Search) - -@item @uref{http://www.northerbys.com/} (Northerbys Online Auctions) - -@item @uref{http://www.schiphol.nl/flights/home.htm} (Amsterdam Airport Schiphol) - -@item @uref{http://TheMatrix.com/seventhsin/query.phtml} (CD database) - -@item @uref{http://TheMatrix.com/~flmm/GEAR.html} (Used Audio Gear Database) - -@item @uref{http://www.kiss.de/musik-mueller/} (Musical note-sheets) - -@item @uref{http://www.bagism.com/} (Bagism; A John Lennon fan page) - -@item @uref{http://www.selftaught.com/} (US Folk art broker) - -@item @uref{http://organizer.net/} (Mail reading on the Web) - -@item @uref{http://www.mypage.org/} (Free home pages on www.somecoolname.mypage.org) - -@item @uref{http://www.schulweb.de/} (Der Server f@"ur Schulen im Web - in German) - -@item @uref{http://www.ald.net/} (Auldhaefen Online Services) - -@item @uref{http://www.cary.net/} (CaryNET Information Center) - -@item @uref{http://www.dataden.com/} (Dataden Computer Systems) - -@item @uref{http://andree.grm.se/} (Andr@'emuseet; in Swedish) - -@item @uref{http://www.him.net/} (HOMESITE Internet Marketing) - -@item @uref{http://www.jade-v.com/techinfo.html} (Jade-V Network Services) - -@item @uref{http://ww2010.atmos.uiuc.edu/(Gl)/abt/aknw/tech.rxml} -Weather World 2010 Technical Credits - -@item @uref{http://gimp.foebud.org/registry/doc/} -About The Gimp plugin registry - -@item @uref{http://www.fast-inc.com/Products/Archiver/database.html} -Java tool; archiver technical detail (Slightly optimistic about MySQL -ANSI-92 compliance) - -@item @uref{http://www.gamesdomain.com/cheats/usrcheat.phtml} (Games Domain Cheats Database) - -@item @uref{http://www.kcilink.com/poweredby/} (The "Powered By" Page; Kcilink) - -@item @uref{http://www.netcasting.net/index.whtml} (Netcasting) - -@item @uref{http://homepages.tig.com.au/~mjj/nbltips} (NBL: Australian National Basketball League; tipping) - -@item @uref{http://www.cgishop.com/} (CGI shop) - -@item @uref{http://www.whirlycott.com/} (Whirlycott: Website Design) - -@item @uref{http://www.mtp.dk/} (Museum Tusculanum Press) - -@item @uref{http://csdgi.historie.ku.dk/biblio/} (Centro Siciliano di Documentazione) - -@item @uref{http://caribou.dyn.ml.org:8000/} (Quake statistics database) - -@item @uref{http://www.astroforum.ch/} (Astroforum: Astrologie and related things; in German) - -@item @uref{http://www.opendebate.com/} (OpenDebate - Interactive Polls & Open Discussion) - -@item @uref{http://vermeer.organik.uni-erlangen.de/dissertationen/} (Online chemical dissertation server) - -@item @uref{http://www.freschinfo.com/} (FreSch! The Free Scholarship Search Service) - -@item @uref{http://www.nada.kth.se/~staffanu/pinball/} (Stockholm Pinball Locator) - -@item @uref{http://www.hek.com/} (HEK - a construction company) - -@item @uref{http://www.ebi.nl/} (Elsevier Business Information) - -@item @uref{http://vaccination.medicallink.se/} (Medical Links; using ColdFusion and MySQL) - -@item @uref{http://www.joblink-usa.com/} (Search for jobs & people at JobLink-USA) - -@item @uref{http://www.skydive.net/competfs/} (Competition Formation Skydiving) - -@item @uref{http://www.galaxy-net.net/} (Galaxy-NET Telecommunications; E-commerce and internal accounting) - -@item @uref{http://www.borsen.dk/} (Denmark's leading business daily newspaper B@o{}rsen) - -@item @uref{http://tmmm.simplenet.com/indb/} (The Internet NES Database) - -@item @uref{http://www.russia.cz/} (Travel agency in Prague in 3 languages) - -@item @uref{http://www.linkstation.de/} (Linkstation) - -@item @uref{http://www.peoplestaff.com/} (Searchable online database at Peoplestaff) - -@item @uref{http://www.dreamhorse.com/} (A searchable database system for horse classified ads) - -@item @uref{http://pootpoot.com/} (The Poot site) - -@item @uref{http://grateful.net/hw_html/} ("Playin' in the LAN"; a network monitoring suite) - -@c Update from Christopher Milton 1999-12-21 -@item @uref{http://www.usapa.army.mil/} (U.S. Army Publishing Agency) - -@item @uref{http://www.nekretnine.co.yu/} (Realestate handling in Yugoslavia) - -@item @uref{http://demo.cpsoft.com/pims/devFAQ.html} (PIMS; a Patient Information Management System) - -@item @uref{http://cpsoft.com/} (Pilkington Software Inc) - -@item @uref{http://www.no-quarter.org/} (A Vietnam Veteran's Memorial - The Wall - database) - -@item @uref{http://www.gamers-union.com/} (Gamer's Union specializes in auctions of used & out-of-print gaming material) - -@item @uref{http://www.montereyhigh.com/office/dbul.php3} (A daily bulletin at Monterey High school) - -@item @uref{http://www.myEastside.com/} (Community-owned site serving Lake -Washington's Eastside residents and businesses) - -@item @uref{http://bowling-france.net/} (French bowling site) -@end itemize - -Send any additions to this list to @email{webmaster@@mysql.com}. - -@page - - - - diff --git a/configure.in b/configure.in index dbde72b8d4e..7770a981610 100644 --- a/configure.in +++ b/configure.in @@ -2712,7 +2712,7 @@ AC_OUTPUT(Makefile extra/Makefile mysys/Makefile isam/Makefile dnl pstack/Makefile pstack/aout/Makefile sql/Makefile sql/share/Makefile dnl merge/Makefile dbug/Makefile scripts/Makefile dnl include/Makefile sql-bench/Makefile tools/Makefile dnl - tests/Makefile Docs/Makefile Docs/Images/Makefile support-files/Makefile dnl + tests/Makefile Docs/Makefile support-files/Makefile dnl support-files/MacOSX/Makefile mysql-test/Makefile dnl netware/Makefile dnl include/mysql_version.h dnl diff --git a/scripts/make_win_src_distribution.sh b/scripts/make_win_src_distribution.sh index 9aca62527e6..0800fec1ac6 100644 --- a/scripts/make_win_src_distribution.sh +++ b/scripts/make_win_src_distribution.sh @@ -275,9 +275,7 @@ cd $SOURCE for i in COPYING ChangeLog README EXCEPTIONS-CLIENT\ INSTALL-SOURCE INSTALL-WIN \ INSTALL-WIN-SOURCE \ - Docs/manual_toc.html Docs/manual.html \ - Docs/manual.txt Docs/mysqld_error.txt \ - Docs/INSTALL-BINARY Docs/internals.texi + Docs/INSTALL-BINARY do print_debug "Copying file '$i'" @@ -297,8 +295,7 @@ cp support-files/*.cnf $BASE/support-files # Raw dirs from source tree # -for i in Docs/Flags scripts sql-bench SSL \ - tests +for i in scripts sql-bench SSL tests do print_debug "Copying directory '$i'" if [ -d $i ] diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh index eb5b469c8da..3ff5c5d67ad 100644 --- a/support-files/mysql.spec.sh +++ b/support-files/mysql.spec.sh @@ -299,11 +299,6 @@ fi (cd libmysql/.libs; tar cf $RBR/shared-libs.tar *.so*) (cd libmysql_r/.libs; tar rf $RBR/shared-libs.tar *.so*) -# Save manual to avoid rebuilding -mv Docs/manual.ps Docs/manual.ps.save -make distclean -mv Docs/manual.ps.save Docs/manual.ps - # RPM:s destroys Makefile.in files, so we generate them here # aclocal; autoheader; aclocal; automake; autoconf # (cd innobase && aclocal && autoheader && aclocal && automake && autoconf) @@ -458,8 +453,6 @@ fi %defattr(-,root,root,0755) %doc COPYING README -%doc Docs/manual.{html,ps,texi,txt} -%doc Docs/manual_toc.html %doc support-files/my-*.cnf %doc %attr(644, root, root) %{_infodir}/mysql.info* @@ -591,6 +584,11 @@ fi # itself - note that they must be ordered by date (important when # merging BK trees) %changelog +* Wed Mar 13 2005 Lenz Grimmer + +- removed the MySQL manual files (html/ps/texi) - they have been removed + from the MySQL sources and are now available seperately. + * Thu Aug 26 2004 Lenz Grimmer - MySQL-Max now requires MySQL-server instead of MySQL (BUG 3860) From 3416e429031d3fee2a68fcf4d1c9912e06f458f0 Mon Sep 17 00:00:00 2001 From: "msvensson@neptunus.(none)" <> Date: Wed, 13 Apr 2005 12:22:20 +0200 Subject: [PATCH 152/204] BUG#9391 mysqlshow prints incorrect "rows" information - Removed use of mysql->extra_info - Removed unused function send_records_num --- VC++Files/winmysqladmin/mysql.h | 2 +- client/mysqlshow.c | 16 ++++++++++++++-- include/mysql.h | 2 +- libmysqld/lib_sql.cc | 5 ----- sql-common/client.c | 2 -- sql/protocol.cc | 10 ---------- sql/protocol.h | 1 - 7 files changed, 16 insertions(+), 22 deletions(-) diff --git a/VC++Files/winmysqladmin/mysql.h b/VC++Files/winmysqladmin/mysql.h index f01b55f5d3f..734d78efea0 100644 --- a/VC++Files/winmysqladmin/mysql.h +++ b/VC++Files/winmysqladmin/mysql.h @@ -145,7 +145,7 @@ typedef struct st_mysql { unsigned long thread_id; /* Id for connection in server */ my_ulonglong affected_rows; my_ulonglong insert_id; /* id if insert on table with NEXTNR */ - my_ulonglong extra_info; /* Used by mysqlshow */ + my_ulonglong extra_info; /* Not used */ unsigned long packet_length; enum mysql_status status; MYSQL_FIELD *fields; diff --git a/client/mysqlshow.c b/client/mysqlshow.c index eee96a9c3eb..5631d296a54 100644 --- a/client/mysqlshow.c +++ b/client/mysqlshow.c @@ -611,6 +611,7 @@ list_fields(MYSQL *mysql,const char *db,const char *table, char query[1024],*end; MYSQL_RES *result; MYSQL_ROW row; + ulong rows; if (mysql_select_db(mysql,db)) { @@ -618,6 +619,17 @@ list_fields(MYSQL *mysql,const char *db,const char *table, mysql_error(mysql)); return 1; } + sprintf(query,"select count(*) from `%s`", table); + if (mysql_query(mysql,query) || !(result=mysql_store_result(mysql))) + { + fprintf(stderr,"%s: Cannot get record count for db: %s, table: %s: %s\n", + my_progname,db,table,mysql_error(mysql)); + return 1; + } + row = mysql_fetch_row(result); + rows = (ulong) strtoull(row[0], (char**) 0, 10); + mysql_free_result(result); + end=strmov(strmov(strmov(query,"show /*!32332 FULL */ columns from `"),table),"`"); if (wild && wild[0]) strxmov(end," like '",wild,"'",NullS); @@ -628,8 +640,8 @@ list_fields(MYSQL *mysql,const char *db,const char *table, return 1; } - printf("Database: %s Table: %s Rows: %lu", db,table, - (ulong) mysql->extra_info); + printf("Database: %s Table: %s Rows: %lu", db, table, rows); + if (wild && wild[0]) printf(" Wildcard: %s",wild); putchar('\n'); diff --git a/include/mysql.h b/include/mysql.h index b87b865608e..24f1961a260 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -231,7 +231,7 @@ typedef struct st_mysql MEM_ROOT field_alloc; my_ulonglong affected_rows; my_ulonglong insert_id; /* id if insert on table with NEXTNR */ - my_ulonglong extra_info; /* Used by mysqlshow */ + my_ulonglong extra_info; /* Not used */ unsigned long thread_id; /* Id for connection in server */ unsigned long packet_length; unsigned int port; diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index 79fe36615b9..74a1c8c7922 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -709,11 +709,6 @@ bool Protocol::send_fields(List *list, uint flags) DBUG_RETURN(1); /* purecov: inspected */ } -bool Protocol::send_records_num(List *list, ulonglong records) -{ - return false; -} - bool Protocol::write() { if (!thd->mysql) // bootstrap file handling diff --git a/sql-common/client.c b/sql-common/client.c index df7a3fe4974..59e27e4090a 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -2446,8 +2446,6 @@ get_info: if (!(mysql->server_status & SERVER_STATUS_AUTOCOMMIT)) mysql->server_status|= SERVER_STATUS_IN_TRANS; - mysql->extra_info= net_field_length_ll(&pos); /* Maybe number of rec */ - if (!(fields=(*mysql->methods->read_rows)(mysql,(MYSQL_FIELD*)0, protocol_41(mysql) ? 7 : 5))) DBUG_RETURN(1); diff --git a/sql/protocol.cc b/sql/protocol.cc index 71908d2a958..dc9ab7bf795 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -645,16 +645,6 @@ err: } -bool Protocol::send_records_num(List *list, ulonglong records) -{ - char *pos; - char buff[20]; - pos=net_store_length(buff, (uint) list->elements); - pos=net_store_length(pos, records); - return my_net_write(&thd->net, buff,(uint) (pos-buff)); -} - - bool Protocol::write() { DBUG_ENTER("Protocol::write"); diff --git a/sql/protocol.h b/sql/protocol.h index ad2593d3ab7..de379db541b 100644 --- a/sql/protocol.h +++ b/sql/protocol.h @@ -54,7 +54,6 @@ public: enum { SEND_NUM_ROWS= 1, SEND_DEFAULTS= 2, SEND_EOF= 4 }; virtual bool send_fields(List *list, uint flags); - bool send_records_num(List *list, ulonglong records); bool store(I_List *str_list); bool store(const char *from, CHARSET_INFO *cs); String *storage_packet() { return packet; } From f5855f2d5734b4297aa568905ba96ae42f8c8334 Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Wed, 13 Apr 2005 12:42:23 +0200 Subject: [PATCH 153/204] Fix for bug#9813: Test 'ndb_basic': Autoincrement fails in 64 bit --- ndb/src/ndbapi/Ndb.cpp | 42 +++++++++++++++++++++++++----------------- sql/ha_ndbcluster.cc | 34 ++++++++++++++++++++++------------ sql/mysqld.cc | 2 +- 3 files changed, 48 insertions(+), 30 deletions(-) diff --git a/ndb/src/ndbapi/Ndb.cpp b/ndb/src/ndbapi/Ndb.cpp index b5493622b70..9d520d5eac9 100644 --- a/ndb/src/ndbapi/Ndb.cpp +++ b/ndb/src/ndbapi/Ndb.cpp @@ -722,26 +722,28 @@ Remark: Returns a new TupleId to the application. Uint64 Ndb::getAutoIncrementValue(const char* aTableName, Uint32 cacheSize) { - DEBUG_TRACE("getAutoIncrementValue"); + DBUG_ENTER("getAutoIncrementValue"); const char * internalTableName = internalizeTableName(aTableName); Ndb_local_table_info *info= theDictionary->get_local_table_info(internalTableName, false); if (info == 0) - return ~0; + DBUG_RETURN(~(Uint64)0); const NdbTableImpl *table= info->m_table_impl; Uint64 tupleId = getTupleIdFromNdb(table->m_tableId, cacheSize); - return tupleId; + DBUG_PRINT("info", ("value %u", tupleId)); + DBUG_RETURN(tupleId); } Uint64 Ndb::getAutoIncrementValue(const NdbDictionary::Table * aTable, Uint32 cacheSize) { - DEBUG_TRACE("getAutoIncrementValue"); + DBUG_ENTER("getAutoIncrementValue"); if (aTable == 0) - return ~0; + DBUG_RETURN(~(Uint64)0); const NdbTableImpl* table = & NdbTableImpl::getImpl(*aTable); Uint64 tupleId = getTupleIdFromNdb(table->m_tableId, cacheSize); - return tupleId; + DBUG_PRINT("info", ("value %u", tupleId)); + DBUG_RETURN(tupleId); } Uint64 @@ -749,46 +751,52 @@ Ndb::getTupleIdFromNdb(const char* aTableName, Uint32 cacheSize) { const NdbTableImpl* table = theDictionary->getTable(aTableName); if (table == 0) - return ~0; + return ~(Uint64)0; return getTupleIdFromNdb(table->m_tableId, cacheSize); } Uint64 Ndb::getTupleIdFromNdb(Uint32 aTableId, Uint32 cacheSize) { + DBUG_ENTER("getTupleIdFromNdb"); if ( theFirstTupleId[aTableId] != theLastTupleId[aTableId] ) { theFirstTupleId[aTableId]++; - return theFirstTupleId[aTableId]; + DBUG_PRINT("info", ("next cached value %u", theFirstTupleId[aTableId])); + DBUG_RETURN(theFirstTupleId[aTableId]); } else // theFirstTupleId == theLastTupleId { - return opTupleIdOnNdb(aTableId, cacheSize, 0); + DBUG_PRINT("info",("reading %u values from database", + (cacheSize == 0) ? 1 : cacheSize)); + DBUG_RETURN(opTupleIdOnNdb(aTableId, (cacheSize == 0) ? 1 : cacheSize, 0)); } } Uint64 Ndb::readAutoIncrementValue(const char* aTableName) { - DEBUG_TRACE("readtAutoIncrementValue"); + DBUG_ENTER("readtAutoIncrementValue"); const NdbTableImpl* table = theDictionary->getTable(aTableName); if (table == 0) { theError= theDictionary->getNdbError(); - return ~0; + DBUG_RETURN(~(Uint64)0); } Uint64 tupleId = readTupleIdFromNdb(table->m_tableId); - return tupleId; + DBUG_PRINT("info", ("value %u", tupleId)); + DBUG_RETURN(tupleId); } Uint64 Ndb::readAutoIncrementValue(const NdbDictionary::Table * aTable) { - DEBUG_TRACE("readtAutoIncrementValue"); + DBUG_ENTER("readtAutoIncrementValue"); if (aTable == 0) - return ~0; + DBUG_RETURN(~(Uint64)0); const NdbTableImpl* table = & NdbTableImpl::getImpl(*aTable); Uint64 tupleId = readTupleIdFromNdb(table->m_tableId); - return tupleId; + DBUG_PRINT("info", ("value %u", tupleId)); + DBUG_RETURN(tupleId); } Uint64 @@ -821,7 +829,7 @@ Ndb::setAutoIncrementValue(const NdbDictionary::Table * aTable, Uint64 val, bool { DEBUG_TRACE("setAutoIncrementValue " << val); if (aTable == 0) - return ~0; + return ~(Uint64)0; const NdbTableImpl* table = & NdbTableImpl::getImpl(*aTable); return setTupleIdInNdb(table->m_tableId, val, increase); } @@ -971,7 +979,7 @@ Ndb::opTupleIdOnNdb(Uint32 aTableId, Uint64 opValue, Uint32 op) setDatabaseName(currentDb.c_str()); setDatabaseSchemaName(currentSchema.c_str()); - return ~0; + return ~(Uint64)0; } Uint32 diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 7025ac2cd1a..fc1e838fbd2 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -1854,7 +1854,7 @@ int ha_ndbcluster::write_row(byte *record) m_rows_inserted++; no_uncommitted_rows_update(1); m_bulk_insert_not_flushed= TRUE; - if ((m_rows_to_insert == 1) || + if ((m_rows_to_insert == (ha_rows) 1) || ((m_rows_inserted % m_bulk_insert_rows) == 0) || set_blob_value) { @@ -2919,8 +2919,12 @@ void ha_ndbcluster::start_bulk_insert(ha_rows rows) DBUG_ENTER("start_bulk_insert"); DBUG_PRINT("enter", ("rows: %d", (int)rows)); - m_rows_inserted= 0; - m_rows_to_insert= rows; + m_rows_inserted= (ha_rows) 0; + if (rows == (ha_rows) 0) + /* We don't know how many will be inserted, guess */ + m_rows_to_insert= m_autoincrement_prefetch; + else + m_rows_to_insert= rows; /* Calculate how many rows that should be inserted @@ -2954,7 +2958,7 @@ int ha_ndbcluster::end_bulk_insert() // Send rows to NDB DBUG_PRINT("info", ("Sending inserts to NDB, "\ "rows_inserted:%d, bulk_insert_rows: %d", - m_rows_inserted, m_bulk_insert_rows)); + (int) m_rows_inserted, (int) m_bulk_insert_rows)); m_bulk_insert_not_flushed= FALSE; if (execute_no_commit(this,trans) != 0) { no_uncommitted_rows_execute_failure(); @@ -2962,8 +2966,8 @@ int ha_ndbcluster::end_bulk_insert() } } - m_rows_inserted= 0; - m_rows_to_insert= 1; + m_rows_inserted= (ha_rows) 0; + m_rows_to_insert= (ha_rows) 1; DBUG_RETURN(error); } @@ -3152,7 +3156,8 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type) // store thread specific data first to set the right context m_force_send= thd->variables.ndb_force_send; m_ha_not_exact_count= !thd->variables.ndb_use_exact_count; - m_autoincrement_prefetch= thd->variables.ndb_autoincrement_prefetch_sz; + m_autoincrement_prefetch= + (ha_rows) thd->variables.ndb_autoincrement_prefetch_sz; if (!thd->transaction.on) m_transaction_on= FALSE; else @@ -3566,7 +3571,7 @@ static int create_ndb_column(NDBCOL &col, static void ndb_set_fragmentation(NDBTAB &tab, TABLE *form, uint pk_length) { - if (form->max_rows == 0) /* default setting, don't set fragmentation */ + if (form->max_rows == (ha_rows) 0) /* default setting, don't set fragmentation */ return; /** * get the number of fragments right @@ -3929,7 +3934,12 @@ longlong ha_ndbcluster::get_auto_increment() DBUG_ENTER("get_auto_increment"); DBUG_PRINT("enter", ("m_tabname: %s", m_tabname)); Ndb *ndb= get_ndb(); + + if (m_rows_inserted > m_rows_to_insert) + /* We guessed too low */ + m_rows_to_insert+= m_autoincrement_prefetch; int cache_size= + (int) (m_rows_to_insert - m_rows_inserted < m_autoincrement_prefetch) ? m_rows_to_insert - m_rows_inserted : (m_rows_to_insert > m_autoincrement_prefetch) ? @@ -3964,9 +3974,9 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg): m_primary_key_update(FALSE), m_retrieve_all_fields(FALSE), m_retrieve_primary_key(FALSE), - m_rows_to_insert(1), - m_rows_inserted(0), - m_bulk_insert_rows(1024), + m_rows_to_insert((ha_rows) 1), + m_rows_inserted((ha_rows) 0), + m_bulk_insert_rows((ha_rows) 1024), m_bulk_insert_not_flushed(FALSE), m_ops_pending(0), m_skip_auto_increment(TRUE), @@ -3976,7 +3986,7 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg): m_dupkey((uint) -1), m_ha_not_exact_count(FALSE), m_force_send(TRUE), - m_autoincrement_prefetch(32), + m_autoincrement_prefetch((ha_rows) 32), m_transaction_on(TRUE), m_use_local_query_cache(FALSE) { diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 0590333a20f..ade747ac180 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4548,7 +4548,7 @@ Disable with --skip-ndbcluster (will save memory).", "Specify number of autoincrement values that are prefetched.", (gptr*) &global_system_variables.ndb_autoincrement_prefetch_sz, (gptr*) &global_system_variables.ndb_autoincrement_prefetch_sz, - 0, GET_INT, REQUIRED_ARG, 32, 1, 256, 0, 0, 0}, + 0, GET_ULONG, REQUIRED_ARG, 32, 1, 256, 0, 0, 0}, {"ndb-force-send", OPT_NDB_FORCE_SEND, "Force send of buffers to ndb immediately without waiting for " "other threads.", From 2ed9965b14ebd6e3fa4cd973ccd9f4098efea448 Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Wed, 13 Apr 2005 13:17:39 +0200 Subject: [PATCH 154/204] Fixed failed merge --- sql/ha_ndbcluster.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index f1ec5e1c56b..d9ce1909c6d 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -3728,7 +3728,7 @@ static int create_ndb_column(NDBCOL &col, static void ndb_set_fragmentation(NDBTAB &tab, TABLE *form, uint pk_length) { - if (form->max_rows == (ha_rows) 0) /* default setting, don't set fragmentation */ + if (form->s->max_rows == (ha_rows) 0) /* default setting, don't set fragmentation */ return; /** * get the number of fragments right From 3c0a885fed119f08907dbc3c11c604508e030c49 Mon Sep 17 00:00:00 2001 From: "pekka@mysql.com" <> Date: Wed, 13 Apr 2005 13:40:53 +0200 Subject: [PATCH 155/204] ndb - bug#9865 fix error message --- ndb/src/kernel/blocks/dblqh/DblqhMain.cpp | 4 ++-- ndb/src/ndbapi/ndberror.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp b/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp index c79f4dfc6c7..3358593b150 100644 --- a/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp +++ b/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp @@ -7554,13 +7554,13 @@ void Dblqh::execSCAN_FRAGREQ(Signal* signal) ndbrequire(max_rows > 0 && max_rows <= MAX_PARALLEL_OP_PER_SCAN); if (!getFragmentrec(signal, fragId)) { - errorCode = __LINE__; + errorCode = 1231; goto error_handler; }//if // Verify scan type vs table type (both sides are boolean) if (rangeScan != DictTabInfo::isOrderedIndex(fragptr.p->tableType)) { - errorCode = __LINE__; // XXX fix + errorCode = 1232; goto error_handler; }//if diff --git a/ndb/src/ndbapi/ndberror.c b/ndb/src/ndbapi/ndberror.c index d4ad9cd6f1c..94e1aeb5545 100644 --- a/ndb/src/ndbapi/ndberror.c +++ b/ndb/src/ndbapi/ndberror.c @@ -320,6 +320,8 @@ ErrorBundle ErrorCodes[] = { { 1226, SE, "Table is being dropped" }, { 1228, SE, "Cannot use drop table for drop index" }, { 1229, SE, "Too long frm data supplied" }, + { 1231, SE, "Invalid table or index to scan" }, + { 1232, SE, "Invalid table or index to scan" }, /** * FunctionNotImplemented From aefe018b67d20747960872787b811a94dda01e3a Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Wed, 13 Apr 2005 15:49:28 +0300 Subject: [PATCH 156/204] row0sel.c: Do not test the value of err if the lock operation was skipped because innodb_logs_unsafe_for_binlog was TRUE; though this did not cause any bugs visible to the user, because err is inited to DB_SUCCESS at the start of the function row_search_for_mysql() --- innobase/row/row0sel.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c index eb88ac31ba9..f8218e08297 100644 --- a/innobase/row/row0sel.c +++ b/innobase/row/row0sel.c @@ -3305,12 +3305,12 @@ rec_loop: err = sel_set_rec_lock(rec, index, prebuilt->select_lock_type, LOCK_ORDINARY, thr); + if (err != DB_SUCCESS) { + + goto lock_wait_or_error; + } } - if (err != DB_SUCCESS) { - - goto lock_wait_or_error; - } } /* A page supremum record cannot be in the result set: skip it now that we have placed a possible lock on it */ @@ -3413,12 +3413,12 @@ rec_loop: err = sel_set_rec_lock(rec, index, prebuilt->select_lock_type, LOCK_GAP, thr); + if (err != DB_SUCCESS) { + + goto lock_wait_or_error; + } } - if (err != DB_SUCCESS) { - - goto lock_wait_or_error; - } } btr_pcur_store_position(pcur, &mtr); @@ -3446,12 +3446,12 @@ rec_loop: err = sel_set_rec_lock(rec, index, prebuilt->select_lock_type, LOCK_GAP, thr); + if (err != DB_SUCCESS) { + + goto lock_wait_or_error; + } } - if (err != DB_SUCCESS) { - - goto lock_wait_or_error; - } } btr_pcur_store_position(pcur, &mtr); From 9cfa9b91f8e625a1092b1e7918c967d2d57390c1 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Wed, 13 Apr 2005 16:49:28 +0300 Subject: [PATCH 157/204] row0sel.c: Fix the patch of Jan to optimize next-key locking in searches of type 'primary key >= some value' --- innobase/row/row0sel.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c index c657a03bd38..a43faaf8096 100644 --- a/innobase/row/row0sel.c +++ b/innobase/row/row0sel.c @@ -3686,16 +3686,23 @@ rec_loop: } } - /* If a constant search tuple is found directly from - the cluster index we lock only a record. - For example: WHERE a >= 100, where a is primary key */ + /* If we are doing a 'greater or equal than a primary key + value' search from a clustered index, and we find a record + that has that exact primary key value, then there is no need + to lock the gap before the record, because no insert in the + gap can be in our search range. That is, no phantom row can + appear that way. - if(index == clust_index && - match_mode == ROW_SEL_OPEN_CURSOR && - mode == PAGE_CUR_GE && - dtuple_get_n_fields_cmp(search_tuple) - == dict_index_get_n_unique(index) && - !cmp_dtuple_rec(search_tuple, rec, offsets)) { + An example: if col1 is the primary key, the search is WHERE + col1 >= 100, and we find a record where col1 = 100, then no + need to lock the gap before that record. */ + + if (index == clust_index + && mode == PAGE_CUR_GE + && direction == 0 + && dtuple_get_n_fields_cmp(search_tuple) + == dict_index_get_n_unique(index) + && 0 == cmp_dtuple_rec(search_tuple, rec, offsets)) { lock_type = LOCK_REC_NOT_GAP; } From 6a46d0cd8a28be0d77dcefeb4bc0630b6d8ed8d7 Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Wed, 13 Apr 2005 16:09:28 +0200 Subject: [PATCH 158/204] Added test case for BUG#6129: Stored procedure won't display @@sql_mode value. --- mysql-test/r/sp.result | 12 ++++++++++++ mysql-test/t/sp.test | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 3ea9b3676dd..43dc6c3a096 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -2850,4 +2850,16 @@ begin end| call avg ()| drop procedure avg| +drop procedure if exists bug6129| +set @@sql_mode = 'traditional'| +create procedure bug6129(mode text) +select @@sql_mode = mode| +call bug6129(@@sql_mode)| +@@sql_mode = mode +1 +set @@sql_mode = ''| +call bug6129(@@sql_mode)| +@@sql_mode = mode +0 +drop procedure bug6129| drop table t1,t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index e31d360c52f..8ff75e6dfdd 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3495,6 +3495,25 @@ call avg ()| drop procedure avg| +# +# BUG#6129: Stored procedure won't display @@sql_mode value +# +--disable_warnings +drop procedure if exists bug6129| +--enable_warnings +set @@sql_mode = 'traditional'| +create procedure bug6129(mode text) + select @@sql_mode = mode| + +# 1 +call bug6129(@@sql_mode)| +set @@sql_mode = ''| +# 0 +call bug6129(@@sql_mode)| + +drop procedure bug6129| + + # # BUG#NNNN: New bug synopsis # From 7cdb04b18b0e419f3f7e7110d9b3c13a068d918d Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Wed, 13 Apr 2005 17:22:04 +0300 Subject: [PATCH 159/204] fil0fil.c: At the shutdown, write the latest lsn only to the first pages of the ibdata files of the system tablespace, NOT to the .ibd files; writing to tens of thousands .ibd files can take minutes --- innobase/fil/fil0fil.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c index 16ae8e6e228..0f5941ca0d9 100644 --- a/innobase/fil/fil0fil.c +++ b/innobase/fil/fil0fil.c @@ -1447,7 +1447,8 @@ fil_write_flushed_lsn_to_data_files( cache. Note that all data files in the system tablespace 0 are always open. */ - if (space->purpose == FIL_TABLESPACE) { + if (space->purpose == FIL_TABLESPACE + && space->id == 0) { sum_of_sizes = 0; node = UT_LIST_GET_FIRST(space->chain); From 387afb3d29578edf1da967158a7d6c496865642b Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Wed, 13 Apr 2005 16:57:49 +0200 Subject: [PATCH 160/204] Fixed BUG#9856: Stored procedures: crash if handler for sqlexception, not found. --- mysql-test/r/sp.result | 18 ++++++++++++++++++ mysql-test/t/sp.test | 23 +++++++++++++++++++++++ sql/sp_pcontext.h | 8 +------- sql/sql_yacc.yy | 2 +- 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 43dc6c3a096..32a08badd67 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -2862,4 +2862,22 @@ call bug6129(@@sql_mode)| @@sql_mode = mode 0 drop procedure bug6129| +drop procedure if exists bug9856| +create procedure bug9856() +begin +declare v int; +declare c cursor for select data from t1; +declare exit handler for sqlexception, not found select '16'; +open c; +fetch c into v; +select v; +end| +delete from t1| +call bug9856()| +16 +16 +call bug9856()| +16 +16 +drop procedure bug9856| drop table t1,t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 8ff75e6dfdd..13ef8e3533a 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3514,6 +3514,29 @@ call bug6129(@@sql_mode)| drop procedure bug6129| +# +# BUG#9856: Stored procedures: crash if handler for sqlexception, not found +# +--disable_warnings +drop procedure if exists bug9856| +--enable_warnings +create procedure bug9856() +begin + declare v int; + declare c cursor for select data from t1; + declare exit handler for sqlexception, not found select '16'; + + open c; + fetch c into v; + select v; +end| + +delete from t1| +call bug9856()| +call bug9856()| +drop procedure bug9856| + + # # BUG#NNNN: New bug synopsis # diff --git a/sql/sp_pcontext.h b/sql/sp_pcontext.h index dbce191975a..749b99dcf14 100644 --- a/sql/sp_pcontext.h +++ b/sql/sp_pcontext.h @@ -235,12 +235,6 @@ class sp_pcontext : public Sql_alloc // Handlers // - inline void - add_handler() - { - m_handlers+= 1; - } - inline void push_handler(sp_cond_type_t *cond) { @@ -257,7 +251,7 @@ class sp_pcontext : public Sql_alloc } inline void - push_handlers(uint n) + add_handlers(uint n) { m_handlers+= n; } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 5af0cbbb00b..fe43447a8b6 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1681,7 +1681,6 @@ sp_decl: sp->add_instr(i); sp->push_backpatch(i, ctx->push_label((char *)"", 0)); - ctx->add_handler(); sp->m_in_handler= TRUE; } sp_hcond_list sp_proc_stmt @@ -1709,6 +1708,7 @@ sp_decl: sp->m_in_handler= FALSE; $$.vars= $$.conds= $$.curs= 0; $$.hndlrs= $6; + ctx->add_handlers($6); } | DECLARE_SYM ident CURSOR_SYM FOR_SYM sp_cursor_stmt { From 7a4f495f5be2f678a85c5409e78e97093ec57544 Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Wed, 13 Apr 2005 17:43:53 +0200 Subject: [PATCH 161/204] Fixed BUG#9674: Stored Procs: Using declared vars in algebric operation causes system crash. --- mysql-test/r/sp.result | 28 ++++++++++++++++++++++++++++ mysql-test/t/sp.test | 34 ++++++++++++++++++++++++++++++++++ sql/item.cc | 2 +- 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 32a08badd67..cac847fd602 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -2880,4 +2880,32 @@ call bug9856()| 16 16 drop procedure bug9856| +drop procedure if exists bug9674_1| +drop procedure if exists bug9674_2| +create procedure bug9674_1(out arg int) +begin +declare temp_in1 int default 0; +declare temp_fl1 int default 0; +set temp_in1 = 100; +set temp_fl1 = temp_in1/10; +set arg = temp_fl1; +end| +create procedure bug9674_2() +begin +declare v int default 100; +select v/10; +end| +call bug9674_1(@sptmp)| +call bug9674_1(@sptmp)| +select @sptmp| +@sptmp +10 +call bug9674_2()| +v/10 +10.00000 +call bug9674_2()| +v/10 +10.00000 +drop procedure bug9674_1| +drop procedure bug9674_2| drop table t1,t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 13ef8e3533a..866db5c0191 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3537,6 +3537,40 @@ call bug9856()| drop procedure bug9856| +# +# BUG##9674: Stored Procs: Using declared vars in algebric operation causes +# system crash. +# +--disable_warnings +drop procedure if exists bug9674_1| +drop procedure if exists bug9674_2| +--enable_warnings +create procedure bug9674_1(out arg int) +begin + declare temp_in1 int default 0; + declare temp_fl1 int default 0; + + set temp_in1 = 100; + set temp_fl1 = temp_in1/10; + set arg = temp_fl1; +end| + +create procedure bug9674_2() +begin + declare v int default 100; + + select v/10; +end| + +call bug9674_1(@sptmp)| +call bug9674_1(@sptmp)| +select @sptmp| +call bug9674_2()| +call bug9674_2()| +drop procedure bug9674_1| +drop procedure bug9674_2| + + # # BUG#NNNN: New bug synopsis # diff --git a/sql/item.cc b/sql/item.cc index d24cc6cbf51..46fbaf2ed85 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -700,7 +700,7 @@ my_decimal *Item_splocal::val_decimal(my_decimal *decimal_value) { DBUG_ASSERT(fixed); Item *it= this_item(); - my_decimal value, *val= it->val_decimal(&value); + my_decimal *val= it->val_decimal(decimal_value); Item::null_value= it->null_value; return val; } From 016270229084a39bda27e7fc7b3400ecb15a7d8d Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Wed, 13 Apr 2005 09:02:12 -0700 Subject: [PATCH 162/204] Fix ctype_ucs_binlog test when ucs2 not available --- mysql-test/t/ctype_ucs_binlog.test | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/t/ctype_ucs_binlog.test b/mysql-test/t/ctype_ucs_binlog.test index 57b831a9dcb..b50fe3b4180 100644 --- a/mysql-test/t/ctype_ucs_binlog.test +++ b/mysql-test/t/ctype_ucs_binlog.test @@ -1,4 +1,5 @@ --source include/not_embedded.inc +--source include/have_ucs2.inc # # Check correct binlogging of UCS2 user variables (BUG#3875) From 077368fc28da81cc05eeb515b58b6dff47b79afe Mon Sep 17 00:00:00 2001 From: "lenz@mysql.com" <> Date: Wed, 13 Apr 2005 18:29:23 +0200 Subject: [PATCH 163/204] More changes to reflect the removal of manual.texi from the sources: - Added a stub scripts/fill_help_tables.sql file to satisfy the build dependencies - Removed scripts/fill_help_tables.sh and updated scripts/Makefile.am accordingly The fill_help_tables.sql stub will be replaced with the approriate content when building the official source distribution via Bootstrap - it's now autogenerated on the documentation server and will be copied into place before packing up the source distribution. --- scripts/Makefile.am | 7 +------ scripts/fill_help_tables.sql | 3 +++ support-files/mysql.spec.sh | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) create mode 100644 scripts/fill_help_tables.sql diff --git a/scripts/Makefile.am b/scripts/Makefile.am index d5337df35b1..b170fa483b2 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -59,7 +59,6 @@ EXTRA_SCRIPTS = make_binary_distribution.sh \ mysqld_multi.sh \ mysql_tableinfo.sh \ mysqld_safe.sh \ - fill_help_tables.sh \ mysql_create_system_tables.sh EXTRA_DIST = $(EXTRA_SCRIPTS) \ @@ -87,7 +86,6 @@ CLEANFILES = @server_scripts@ \ mysqldumpslow \ mysqld_multi \ make_win_src_distribution \ - fill_help_tables \ mysql_create_system_tables SUPERCLEANFILES = mysqlbug @@ -151,7 +149,4 @@ SUFFIXES = .sh # Don't update the files from bitkeeper %::SCCS/s.% -all: fill_help_tables.sql make_win_src_distribution make_binary_distribution make_sharedlib_distribution - -fill_help_tables.sql: fill_help_tables ../Docs/manual.texi - ./fill_help_tables < ../Docs/manual.texi > fill_help_tables.sql +all: make_win_src_distribution make_binary_distribution make_sharedlib_distribution diff --git a/scripts/fill_help_tables.sql b/scripts/fill_help_tables.sql new file mode 100644 index 00000000000..9f527c288e9 --- /dev/null +++ b/scripts/fill_help_tables.sql @@ -0,0 +1,3 @@ +-- fill_help_tables.sql - this file is a placeholder to satisfy build dependencies - +-- it will be replaced with the appropriate content by the Boostrap script that +-- creates the official source distribution. diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh index c7e58f26a2f..f02acda07df 100644 --- a/support-files/mysql.spec.sh +++ b/support-files/mysql.spec.sh @@ -695,7 +695,7 @@ fi * Mon Feb 14 2005 Lenz Grimmer -* Fixed the compilation comments and moved them into the separate build sections +- Fixed the compilation comments and moved them into the separate build sections for Max and Standard * Mon Feb 7 2005 Tomas Ulin From ba89d0fd8fc8b4ced8e816e05a5ccd828a206519 Mon Sep 17 00:00:00 2001 From: "lenz@mysql.com" <> Date: Wed, 13 Apr 2005 19:05:05 +0200 Subject: [PATCH 164/204] - bumped up version number to 4.1.12 (4.1.11 has been released already) --- configure.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.in b/configure.in index f271119bd38..d191463d0f9 100644 --- a/configure.in +++ b/configure.in @@ -5,7 +5,7 @@ AC_INIT(sql/mysqld.cc) AC_CANONICAL_SYSTEM # The Docs Makefile.am parses this line! # remember to also change ndb version below and update version.c in ndb -AM_INIT_AUTOMAKE(mysql, 4.1.11) +AM_INIT_AUTOMAKE(mysql, 4.1.12) AM_CONFIG_HEADER(config.h) PROTOCOL_VERSION=10 @@ -16,7 +16,7 @@ SHARED_LIB_VERSION=14:0:0 # ndb version NDB_VERSION_MAJOR=4 NDB_VERSION_MINOR=1 -NDB_VERSION_BUILD=11 +NDB_VERSION_BUILD=12 NDB_VERSION_STATUS="" # Set all version vars based on $VERSION. How do we do this more elegant ? From ff90e42f57cc876398c171fa04b77b91997bec07 Mon Sep 17 00:00:00 2001 From: "lenz@mysql.com" <> Date: Wed, 13 Apr 2005 19:05:31 +0200 Subject: [PATCH 165/204] - Cleanup: removed obsolete build tools (build toolchain is now maintained sepearately) --- Build-tools/Bootstrap | 461 ------------------ Build-tools/Do-all-build-steps | 108 ----- Build-tools/Do-compile | 835 -------------------------------- Build-tools/Do-create-perl-rpms | 64 --- Build-tools/Do-linux-build | 28 -- Build-tools/Do-local-patch-file | 37 -- Build-tools/Do-patch-file | 44 -- Build-tools/Do-pkg | 313 ------------ Build-tools/Do-rpm | 332 ------------- Build-tools/Do-win-build | 124 ----- Build-tools/cvs-sanity-check | 15 - Build-tools/logger.pm | 112 ----- Build-tools/my_md5sum | 141 ------ Build-tools/mysql-copyright | 372 -------------- Build-tools/mysql-copyright-2 | 169 ------- Build-tools/newest | 116 ----- 16 files changed, 3271 deletions(-) delete mode 100755 Build-tools/Bootstrap delete mode 100755 Build-tools/Do-all-build-steps delete mode 100755 Build-tools/Do-compile delete mode 100755 Build-tools/Do-create-perl-rpms delete mode 100755 Build-tools/Do-linux-build delete mode 100755 Build-tools/Do-local-patch-file delete mode 100755 Build-tools/Do-patch-file delete mode 100755 Build-tools/Do-pkg delete mode 100755 Build-tools/Do-rpm delete mode 100755 Build-tools/Do-win-build delete mode 100755 Build-tools/cvs-sanity-check delete mode 100644 Build-tools/logger.pm delete mode 100755 Build-tools/my_md5sum delete mode 100755 Build-tools/mysql-copyright delete mode 100755 Build-tools/mysql-copyright-2 delete mode 100644 Build-tools/newest diff --git a/Build-tools/Bootstrap b/Build-tools/Bootstrap deleted file mode 100755 index 8b769dca3c4..00000000000 --- a/Build-tools/Bootstrap +++ /dev/null @@ -1,461 +0,0 @@ -#!/usr/bin/perl -w -# -# Bootstrap -# -# Script to export a given BK source tree into a separate directory -# and create the source distribution to be used for all binary builds -# -# Use the "--help" option for more info! -# -# written by Lenz Grimmer -# - -use Cwd; -use Getopt::Long; -Getopt::Long::Configure ("bundling"); - -# Include helper functions -$LOGGER= "$ENV{HOME}/bin/logger.pm"; -if (-f $LOGGER) -{ - do "$LOGGER"; -} -else -{ - die "ERROR: $LOGGER cannot be found!\n"; -} - -# Some predefined settings -$build_command= "BUILD/compile-dist"; -$PWD= cwd(); -$opt_docdir= $PWD . "/mysqldoc"; -$opt_archive_log= undef; -$opt_build_command= undef; -$opt_changelog= undef; -$opt_delete= undef; -$opt_directory= $PWD; -$opt_dry_run= undef; -$opt_export_only= undef; -$opt_help= $opt_verbose= 0; -$opt_log= undef; -$opt_mail= "build\@mysql.com"; -$opt_pull= undef; -$opt_revision= undef; -$opt_suffix= ""; -$opt_test= undef; -$opt_skip_check= undef; -$opt_skip_manual= undef; -$opt_win_dist= undef; -$opt_quiet= undef; -$version= "unknown"; -$major=$minor=$release=0; - -GetOptions( - "archive-log|a", - "build-command|b=s", - "changelog|c:s", - "directory|d=s", - "delete", - "docdir=s", - "dry-run", - "export-only|e", - "help|h", - "log|l:s", - "mail|m=s", - "pull|p", - "revision|r=s", - "skip-check|s", - "skip-manual", - "suffix=s", - "test|t", - "verbose|v", - "win-dist|w", - "quiet|q", -) || print_help(""); - -# -# Override predefined build command -# -if (defined $opt_build_command) -{ - $build_command= $opt_build_command; -} - -print_help("") if ($opt_help); -defined($REPO=$ARGV[0]) || print_help("Please enter the BK repository to be used!"); - -# -# Override predefined Log file name -# -if (defined $opt_log) -{ - if ($opt_log ne "") - { - if ($opt_log =~ /^\/.*/) - { - $LOGFILE= $opt_log; - } - else - { - $LOGFILE= $PWD . "/" . $opt_log; - } - } -} - -$LOGFILE= $PWD . "/Bootstrap-" . $REPO . ".log" unless ($LOGFILE); - -&logger("Starting build"); -&abort("The directory \"$REPO\" could not be found!") if (!-d $REPO); -&logger("Using $REPO as the BK parent repository"); -system ("bk help > /dev/null") == 0 or &abort("Cannot execute BitKeeper binary!"); -system ("bk root $REPO > /dev/null 2>&1") == 0 or &abort("$REPO does not seem to be a valid BK repository!"); - -if (($opt_directory ne $PWD) && (!-d $opt_directory && !$opt_dry_run)) -{ - &abort("Could not find target directory \"$opt_directory\"!"); -} - -&logger("Logging to $LOGFILE") if (defined $opt_log); - -# -# Pull recent changes first -# -if ($opt_pull) -{ - &bk_pull("$REPO"); - &bk_pull("$opt_docdir") unless ($opt_skip_manual); -} - -# -# Use a temporary name until we know the version number -# -$target_dir= $opt_directory . "/mysql-" . $$ . "-" . time() . ".tmp"; -&logger("Using temporary directory $target_dir"); -&abort("Target directory $target_dir already exists!") if (-d $target_dir && !$opt_dry_run); - -# -# Export the BK tree -# -$command= "bk export "; -$command.= "-r " . $opt_revision . " " if $opt_revision; -$command.= "-v " if ($opt_verbose || defined $opt_log); -$command.= $REPO . " " . $target_dir; -&logger("Exporting $REPO"); -&run_command($command, "Could not create $target_dir!"); - -# -# Make sure we can write all files -# -$command= "find $target_dir -type f -print0 | xargs --null chmod u+w"; -&run_command($command, "Failed to fix file permissions!"); - -# -# Try to obtain version number from newly extracted configure.in -# -$CONF="$target_dir/configure.in"; -&abort("Could not find \"$CONF\" to determine version!") if (!-f $CONF && !$opt_dry_run); - -# -# The following can only be done, if the tree has actually been -# exported - it cannot be performed in a dry run. -# -if (!$opt_dry_run) -{ - open (CONF, $CONF) or &abort("Unable to open \"$CONF\": $!"); - @conf= ; - close CONF; - - foreach (@conf) - { - m/^AM_INIT_AUTOMAKE\(mysql, ([1-9]\.[0-9]{1,2}\.[0-9]{1,2}.*)\)/; - $version= $1; - ($major, $minor, $release) = split(/\./,$version); - } - &logger("Found version string: $version"); - - # - # Add suffix to version string and write out the modified file - # - if ($opt_suffix) - { - $opt_suffix= "-" . &ymd() if ($opt_suffix eq "YMD"); - - &logger("Replacing $version with $version$opt_suffix"); - foreach (@conf) - { - s/^AM_INIT_AUTOMAKE.*/AM_INIT_AUTOMAKE\(mysql, $version$opt_suffix\)/; - } - open(CONF,">$CONF") or &abort("Unable to open \"$CONF\": $!"); - print CONF @conf; - close(CONF); - } -} - -# -# Rename directory according to the version number found in configure.in -# of the extracted tree (plus suffix, if requested) -# -$temp_name= $target_dir; -$target_dir= $opt_directory . "/mysql-" . $version . $opt_suffix . "-build"; -if (-d $target_dir) -{ - &logger("Target directory $target_dir already exists!"); - if ($opt_delete) - { - &logger("Deleting $target_dir..."); - $command= "rm "; - $command.= "-v " if ($opt_verbose || defined $opt_log); - $command.= "$target_dir"; - &run_command($command, "Could not delete $target_dir!"); - } - else - { - # Get the time stamp of "configure.in" - @stat= stat("$target_dir/configure.in"); - my $mtime= $stat[9]; - my ($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime); - my $mtime= sprintf("%04d-%02d-%02d-%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min); - - &logger("Renaming $target_dir to $target_dir-$mtime"); - $command= "mv "; - $command.= "-v " if ($opt_verbose || defined $opt_log); - $command.= "$target_dir $target_dir-$mtime"; - &run_command($command, "Could not rename $target_dir!"); - } -} - -&logger("Renaming temporary directory to $target_dir"); -$command= "mv "; -$command.= "-v " if ($opt_verbose || defined $opt_log); -$command.= "$temp_name $target_dir"; -&run_command($command, "Could not rename $temp_name!"); - -# -# Add a ChangeLog (make dist will pick it up automatically) -# -if (defined $opt_changelog) -{ - # - # Use some magic to obtain the correct ChangeSet number that identifies - # the last tagged ChangeSet (this relies heavily on our current tagging - # practice!) - # - my $revision= ""; - if ($opt_changelog eq "last") - { - if (!$opt_revision) - { - $revision= `bk changes -t -d':REV:::TAG:' -n $REPO | grep mysql-$major.$minor | head -1 | cut -f1 -d ":"`; - } - else - { - $revision= `bk changes -r..$opt_revision -t -d':REV:' -n $REPO | head -2 | tail -1`; - } - chomp($revision); - $opt_changelog= $revision; - } - - $msg= "Adding $target_dir/ChangeLog"; - $msg.= " (down to revision $opt_changelog)" if $opt_changelog ne ""; - &logger($msg); - $command= "bk changes -v"; - $command.= " -r" if ($opt_changelog ne "" || $opt_revision); - $command.= $opt_changelog if $opt_changelog ne ""; - $command.= ".." if ($opt_changelog ne "" && !$opt_revision); - $command.= ".." . $opt_revision if $opt_revision; - $command.= " " . $REPO . " > $target_dir/ChangeLog"; - &logger($command); - # We cannot use run_command here because of output redirection - unless ($opt_dry_run) - { - system($command) == 0 or &abort("Could not create $target_dir/ChangeLog!"); - } -} - -# -# Add the latest manual from the mysqldoc tree -# -unless ($opt_skip_manual) -{ - &logger("Updating manual files"); - foreach $file qw/internals manual reservedwords/ - { - system ("bk cat $opt_docdir/Docs/$file.texi > $target_dir/Docs/$file.texi") == 0 - or &abort("Could not update $file.texi in $target_dir/Docs/!"); - } - - &run_command("rm -f $target_dir/Docs/Images/Makefile*", - "Could not remove Makefiles in $target_dir/Docs/Images/!"); - &run_command("cp $opt_docdir/Docs/Images/*.* $target_dir/Docs/Images", - "Could not copy image files in $target_dir/Docs/Images/!"); -} - -# -# Abort here, if we just wanted to export the tree -# -if ($opt_export_only) -{ - &logger("SUCCESS: Export finished successfully."); - exit 0; -} - -# -# Enter the target directory first -# -&logger("Entering $target_dir"); -if (!$opt_dry_run) -{ - chdir($target_dir) or &abort("Cannot chdir to $target_dir: $!"); -} - -# -# Now build the source distribution -# -&logger("Compiling..."); -$command= $build_command; -&run_command($command, "Compilation failed!"); - -# -# Testing the built binary by running "make test" (optional) -# -if ($opt_test) -{ - &logger ("Running test suite"); - $command= "make test"; - &run_command($command, "\"make test\" failed!"); -} - -# -# Pack it all up -# -&logger("Creating source distribution"); -$command= "make dist"; -&run_command($command, "make dist failed!"); - -# -# Package the Windows source -# -if ($opt_win_dist) -{ - &logger ("Creating Windows source package"); - $command= "./scripts/make_win_src_distribution --tar --zip"; - &run_command($command, "make_win_src_distribution failed!"); -} - -# -# Run "make distcheck" to verify the source archive -# -if (!$opt_skip_check) -{ - &logger ("Checking source distribution"); - $command= "make distcheck"; - &run_command($command, "make distcheck failed!"); -} - -# -# All done when we came down here -# -&logger("SUCCESS: Build finished successfully.") if (!$opt_dry_run); - -# -# Move the log file into the Log dir of the target dir -# -if ($opt_archive_log) -{ - my $logdir= $target_dir . "/Logs"; - &logger("Moving $LOGFILE to $logdir"); - mkdir "$logdir" if (! -d $logdir); - $command= "mv "; - $command.= "-v " if ($opt_verbose || defined $opt_log); - $command.= "$LOGFILE $logdir"; - &run_command($command, "Could not move $LOGFILE to $logdir!"); -} - -exit 0; - -# -# Run a BK pull on the given BK tree -# -sub bk_pull -{ - my $bk_tree= $_[0]; - &logger("Updating BK tree $bk_tree to latest ChangeSet first"); - chdir ($bk_tree) or &abort("Could not chdir to $bk_tree!"); - &run_command("bk pull", "Could not update $bk_tree!"); - chdir ($PWD) or &abort("Could not chdir to $PWD!"); -} - -# -# Print the help text message (with an optional message on top) -# -sub print_help -{ - my $message= $_[0]; - if ($message ne "") - { - print "\n"; - print "ERROR: $message\n"; - } - print < - -Creates a MySQL source distribution to be used for the release builds. - -It checks out (exports) a clear-text version of the given local BitKeeper -repository, creates and adds a Changelog file (if requested), adds the -latest manual files from the mysqldoc BK tree and builds a source -distribution (*.tar.gz) file. Optionally, the test suite and the -distribution check can be run before the source archive is being created. - -Options: - --a, --archive-log Move the log file into the Logs directory of - the exported tree after a successful build --b, --build-command= Use to compile the sources before packing - the distribution. - (default is "$build_command") --c, --changelog[=] Add a ChangeLog [down to revision ] - This will automatically be included in the source - distribution. To get a ChangeLog down to the last - tagged Changeset, simply use "last" as the revision - number. ---delete Delete an already existing distribution directory - in the target directory instead of renaming it. --d, --directory=

    Specify the target directory - (default is "$opt_directory") ---docdir= Use the MySQL documentation BK tree located - in - (default is "$opt_docdir") ---dry-run Dry run without executing --e, --export-only Just export (and add the ChangeLog, if requested), - do not build or test the source distribution --h, --help Print this help message --l, --log[=] Write a log file [to ] - (default is "./Bootstrap-.log") --m, --mail=
    Mail a failure report to the given address (and - include a log file snippet, if logging is enabled) - Note that the \@-Sign needs to be quoted! - Example: --mail=user\\\@domain.com - Default: build\@mysql.com --q, --quiet Be quiet --p, --pull Update the source BK trees before building --r, --revision= Export the tree as of revision - (default is up to the latest revision) --s, --skip-check Skip checking the distribution with "make distcheck" ---skip-manual Skip updating the manual from the mysqldoc tree ---suffix= Append to the version number in - configure.in. Using the special suffix "YMD" will - add the current date as the suffix - (e.g. "-20020518"). --t, --test Run the test suite after build --v, --verbose Be verbose --w, --win-dist Also make Windows source distribution - -Example: - - Bootstrap -c last -v -l -- mysql-4.0 - -EOF - exit 1; -} diff --git a/Build-tools/Do-all-build-steps b/Build-tools/Do-all-build-steps deleted file mode 100755 index 8ff8851aecd..00000000000 --- a/Build-tools/Do-all-build-steps +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/sh - -WD=`pwd` -# Don't write a wrong path for BD !!!!! -if [ -w /my/tmp ] -then - BD=/my/tmp/BUILD -elif [ -n "$TMPDIR" ] -then - BD=$TMPDIR/BUILD -else - BD=/tmp/BUILD -fi -TMP_SCRIPT=$WD/Logs/00-temp-for-do-all-build-steps.$$ - -# We build on work -to_host=`hostname` -cc=gcc -ccc=gcc -EXTRA_CONFIG="--without-perl" -#AM_MAKEFLAGS="-j 2" -echo "Building on $to_host" - -rm -rf $BD/* -rm -f $WD/binary/* -mkdir -p $WD/binary -mkdir -p $WD/Logs -mkdir -p $BD/Logs - -cat > $TMP_SCRIPT < $log 2>&1 -else - time sh $TMP_SCRIPT > $log 2>&1 -fi - -# Create a commercial MySQL distribution (mysqlcom-VER.tar.gz) from -# the newly made source distribution - -cd "$BD" -DIST=`ls -t mysql-*.tar.gz | head -1` -$BD/Build-tools/mysql-copyright --target=. $DIST - -# move the binaries to the 'binary' directory -mv $BD/mysql*tar.gz $WD/binary -mv $BD/NEW-RPMS/* $WD/binary diff --git a/Build-tools/Do-compile b/Build-tools/Do-compile deleted file mode 100755 index aa026ab22b4..00000000000 --- a/Build-tools/Do-compile +++ /dev/null @@ -1,835 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; -use Getopt::Long; -use Sys::Hostname; - -@config_options= (); -@make_options= (); - -$opt_distribution=$opt_user=$opt_config_env=$opt_config_extra_env=""; -$opt_dbd_options=$opt_perl_options=$opt_config_options=$opt_make_options=$opt_suffix=""; -$opt_tmp=$opt_version_suffix=""; -$opt_help=$opt_delete=$opt_debug=$opt_stage=$opt_no_test=$opt_no_perl=$opt_one_error=$opt_with_low_memory=$opt_fast_benchmark=$opt_static_client=$opt_static_server=$opt_static_perl=$opt_sur=$opt_with_small_disk=$opt_local_perl=$opt_tcpip=$opt_build_thread=$opt_use_old_distribution=$opt_enable_shared=$opt_no_crash_me=$opt_no_strip=$opt_with_debug=$opt_no_benchmark=$opt_no_mysqltest=$opt_without_embedded=0; -$opt_innodb=$opt_bdb=$opt_raid=$opt_libwrap=$opt_clearlogs=$opt_without_ndbcluster=$opt_with_big_tables=0; - -GetOptions( - "bdb", - "build-thread=i", - "config-env=s" => \@config_env, - "config-extra-env=s" => \@config_extra_env, - "config-options=s" => \@config_options, - "dbd-options=s", - "debug", - "delete", - "distribution=s", - "enable-shared", - "fast-benchmark", - "help|Information", - "innodb", - "libwrap", - "local-perl", - "make-options=s" => \@make_options, - "no-crash-me", - "no-perl", - "no-strip", - "no-test", - "no-mysqltest", - "no-benchmark", - "one-error", - "perl-files=s", - "perl-options=s", - "raid", - "stage=i", - "static-client", - "static-perl", - "static-server", - "suffix=s", - "sur", - "tcpip", - "tmp=s", - "use-old-distribution", - "user=s", - "version-suffix=s", - "with-big-tables", - "with-debug", - "with-low-memory", - "with-other-libc=s", - "with-small-disk", - "without-embedded", - "clearlogs", - "without-ndbcluster", -) || usage(); - -usage() if ($opt_help); -usage() if (!$opt_distribution); - -if (@make_options > 0) -{ - chomp(@make_options); - $opt_make_options= join(" ", @make_options); -} - -if (@config_options > 0) -{ - chomp(@config_options); - $opt_config_options= join(" ", @config_options); -} - -if (@config_env > 0) -{ - chomp(@config_env); - $opt_config_env= join(" ", @config_env); -} - -if (@config_extra_env > 0) -{ - chomp(@config_extra_env); - $opt_config_extra_env= join(" ", @config_extra_env); -} - -$host= hostname(); -chomp($uname=`uname`); -$full_host_name=$host; -$connect_option= ($opt_tcpip ? "--host=$host" : ""); -$host =~ /^([^.-]*)/; -$host=$1 . $opt_suffix; -$email="$opt_user\@mysql.com"; -chomp($pwd = `pwd`); -$VER= basename($opt_distribution); -$VER=~ /mysql.*-([1-9]\.[0-9]{1,2}\.[0-9]{1,2}.*)\.tar*/; $version=$1; -$release=""; # Shut up perl -($major, $minor, $release) = split(/\./,$version); -$log="$pwd/Logs/$host-$major.$minor$opt_version_suffix.log"; -$opt_distribution =~ /(mysql[^\/]*)\.tar/; -$ver=$1; -$gcc_version=which("gcc"); -if (defined($gcc_version) && ! $opt_config_env) -{ - $tmp=`$gcc_version -v 2>&1`; - if ($tmp =~ /version 2\.7\./) - { - $opt_config_env= 'CC=gcc CFLAGS="-O2 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O2 -fno-omit-frame-pointer"'; - } - elsif ($tmp =~ /version 3\.0\./) - { - $opt_config_env= 'CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti"'; - } - else - { - $opt_config_env= 'CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti"'; - } -} - -$opt_config_env.=" $opt_config_extra_env"; - -$new_opt_tmp=0; -if ($opt_tmp) -{ - unless (-d $opt_tmp) - { - safe_system("mkdir $opt_tmp"); - $new_opt_tmp=1; - } - $ENV{'TMPDIR'}=$opt_tmp; -} -else -{ - $opt_tmp="/tmp"; -} -$bench_tmpdir="$opt_tmp/my_build-$host"; -$ENV{'PATH'}= "$pwd/$host/bin:" . $ENV{'PATH'}; -$make=which("gmake","make"); # Can't use -j here! -$tar=which("gtar","tar"); -$sendmail=find("/usr/lib/sendmail","/usr/sbin/sendmail"); -$sur= $opt_sur ? "/my/local/bin/sur" : ""; -delete $ENV{'MYSQL_PWD'}; # Reset possibly password -delete $ENV{'MY_BASEDIR_VERSION'}; -$ENV{'MYSQL_TCP_PORT'}= $mysql_tcp_port= 3334 + $opt_build_thread*2; -$ENV{'MYSQL_UNIX_PORT'}=$mysql_unix_port="$opt_tmp/mysql$opt_suffix.build"; -$ENV{"PERL5LIB"}="$pwd/$host/perl5:$pwd/$host/perl5/site_perl"; -$slave_port=$mysql_tcp_port+16; -$manager_port=$mysql_tcp_port+1; -$mysqladmin_args="--no-defaults -u root --connect_timeout=5 --shutdown_timeout=20"; - -if ($opt_stage == 0 || $opt_clearlogs) -{ - system("mkdir Logs") if (! -d "Logs"); - system("mv $log ${log}-old") if (-f $log); - unlink($log); -} - -open(LOG,">>$log") || abort("Can't open log file, error $?"); -select LOG; -$|=1; -select STDOUT; -$|=1; - -info("Compiling MySQL$opt_version_suffix at $host$opt_suffix, stage: $opt_stage\n"); -info("LD_LIBRARY_PATH is $ENV{LD_LIBRARY_PATH}"); -info("PATH is $ENV{PATH}"); - -log_timestamp(); - -$md5_result= safe_system("perl $ENV{HOME}/my_md5sum -c ${opt_distribution}.md5"); - -if ($md5_result != 0) -{ - abort("MD5 check failed for $opt_distribution!"); -} -else -{ - info("SUCCESS: MD5 checks for $opt_distribution"); -} - -if (-x "$host/bin/mysqladmin") -{ - log_system("$host/bin/mysqladmin $mysqladmin_args -S $mysql_unix_port -s shutdown"); - log_system("$host/bin/mysqladmin $mysqladmin_args -P $mysql_tcp_port -h $host -s shutdown"); - log_system("$host/bin/mysqladmin $mysqladmin_args -P $slave_port -h $host -s shutdown"); - log_system("$host/bin/mysqladmin $mysqladmin_args -P 9306 -h $host -s shutdown"); - log_system("$host/bin/mysqladmin $mysqladmin_args -P 9307 -h $host -s shutdown"); -} -kill_all("mysqlmanager"); -# -# Kill all old processes that are in the build directories -# This is to find any old mysqld servers left from previous builds -kill_all("$pwd/host/mysql"); -kill_all("$pwd/host/test"); - -if ($opt_stage == 0) -{ - log_timestamp(); - print "$host: Removing old distribution\n" if ($opt_debug); - if (!$opt_use_old_distribution) - { - system("mkdir $host") if (! -d $host); - system("touch $host/mysql-fix-for-glob"); - rm_all(<$host/mysql*>); - system("mkdir $host/bin") if (! -d "$host/bin"); - } - rm_all("$host/test"); - system("mkdir $host/test") if (! -d "$host/test"); -} - -safe_cd($host); -if ($opt_stage == 0 && ! $opt_use_old_distribution) -{ - safe_system("gunzip < $opt_distribution | $tar xf -"); - - # Fix file times; This is needed because the time for files may be - # in the future. The following is done this way to ensure that - # we don't get any errors from xargs touch - system("touch timestamp"); - sleep(2); - system("touch timestamp2"); - system("find . -newer timestamp -print | xargs touch"); - unlink("timestamp"); - unlink("timestamp2"); - sleep(2); - # Ensure that files we don't want to rebuild are newer than other files - safe_cd($ver); - foreach $name ("configure", - "Docs/include.texi", - "Docs/*.html", "Docs/manual.txt", "Docs/mysql.info", - "sql/sql_yacc.h", "sql/sql_yacc.cc") - { - system("touch $name"); - } - # Fix some file modes in BDB tables that makes life harder. - system("chmod -R u+rw ."); -} - -safe_cd("$pwd/$host/$ver"); - -# -# Configure the sources -# -if ($opt_stage <= 1) -{ - # Fix files if this is in another timezone than the build host - log_timestamp(); - unlink("config.cache"); - unlink("bdb/build_unix/config.cache"); - unlink("innobase/config.cache"); - log_system("$make clean") if ($opt_use_old_distribution); - $opt_config_options.= " --disable-shared" if (!$opt_enable_shared); # Default for binary versions - $opt_config_options.= " --with-berkeley-db" if ($opt_bdb); - $opt_config_options.= " --with-client-ldflags=-all-static" if ($opt_static_client); - $opt_config_options.= " --with-debug" if ($opt_with_debug); - $opt_config_options.= " --with-libwrap" if ($opt_libwrap); - $opt_config_options.= " --with-low-memory" if ($opt_with_low_memory); - $opt_config_options.= " --with-big-tables" if ($opt_with_big_tables); - $opt_config_options.= " --with-mysqld-ldflags=-all-static" if ($opt_static_server); - $opt_config_options.= " --with-raid" if ($opt_raid); - $opt_config_options.= " --with-embedded-server" unless ($opt_without_embedded); - $opt_config_options.= " --without-ndbcluster" if ($opt_without_ndbcluster); - - # Only enable InnoDB when requested (required to be able to - # build the "Classic" packages that do not include InnoDB) - if ($opt_innodb) - { - $opt_config_options.= " --with-innodb"; - } - else - { - $opt_config_options.= " --without-innodb"; - } - - if ($opt_with_other_libc) - { - $opt_with_other_libc= " --with-other-libc=$opt_with_other_libc"; - $opt_config_options.= $opt_with_other_libc; - } - - $prefix="/usr/local/mysql"; - check_system("$opt_config_env ./configure --prefix=$prefix --localstatedir=$prefix/data --libexecdir=$prefix/bin --with-comment=\"Official MySQL$opt_version_suffix binary\" --with-extra-charsets=complex --with-server-suffix=\"$opt_version_suffix\" --enable-thread-safe-client --enable-local-infile $opt_config_options","Thank you for choosing MySQL"); - if (-d "$pwd/$host/include-mysql") - { - safe_system("cp -r $pwd/$host/include-mysql/* $pwd/$host/$ver/include"); - } -} - -# -# Compile the binaries -# -if ($opt_stage <= 2) -{ - my ($command); - log_timestamp(); - unlink($opt_distribution) if ($opt_delete && !$opt_use_old_distribution); - $command=$make; - $command.= " $opt_make_options" if (defined($opt_make_options) && $opt_make_options ne ""); - safe_system($command); - print LOG "Do-compile: Build successful\n"; -} - -# -# Create the binary distribution -# -if ($opt_stage <= 3) -{ - my $flags= ""; - log_timestamp(); - log_system("rm -fr mysql-{3,4,5}* $pwd/$host/mysql*.t*gz"); - # No need to add the debug symbols, if the binaries are not stripped (saves space) - unless ($opt_with_debug || $opt_no_strip) - { - log_system("nm -n sql/mysqld | gzip -9 -v 2>&1 > sql/mysqld.sym.gz | cat"); - } - - $flags.= "--no-strip" if ($opt_no_strip || $opt_with_debug); - check_system("scripts/make_binary_distribution --tmp=$opt_tmp --suffix=$opt_suffix $flags",".tar.gz created"); - safe_system("mv mysql*.t*gz $pwd/$host"); - if (-f "client/.libs/mysqladmin") - { - safe_system("cp client/.libs/mysqladmin $pwd/$host/bin"); - } - else - { - safe_system("cp client/mysqladmin $pwd/$host/bin"); - } - safe_system("$make clean") if ($opt_with_small_disk); -} - -$tar_file=<$pwd/$host/mysql*.t*gz>; -abort ("Could not find tarball!") unless ($tar_file); - -# Generate the MD5 for the binary distribution -$tar_file=~ /(mysql[^\/]*)\.(tar\.gz|tgz)/; -$tar_file_lite= "$1.$2"; -system("cd $pwd/$host; perl $ENV{HOME}/my_md5sum $tar_file_lite > ${tar_file_lite}.md5"); - -# -# Unpack the binary distribution -# -if ($opt_stage <= 4 && !$opt_no_test) -{ - log_timestamp(); - rm_all(<$pwd/$host/test/*>); - safe_cd("$pwd/$host/test"); - safe_system("gunzip < $tar_file | $tar xf -"); -} - -$tar_file =~ /(mysql[^\/]*)\.(tar\.gz|tgz)/; -$ver=$1; -$test_dir="$pwd/$host/test/$ver"; -$ENV{"LD_LIBRARY_PATH"}= ("$test_dir/lib" . - (defined($ENV{"LD_LIBRARY_PATH"}) ? - ":" . $ENV{"LD_LIBRARY_PATH"} : "")); -# -# Run the test suite -# -if ($opt_stage <= 5 && !$opt_no_test && !$opt_no_mysqltest) -{ - my $force= ""; - if (!$opt_one_error) - { - $force= "--force"; # default - } - log_timestamp(); - system("mkdir $bench_tmpdir") if (! -d $bench_tmpdir); - safe_cd("${test_dir}/mysql-test"); - check_system("./mysql-test-run $force --tmpdir=$bench_tmpdir --master_port=$mysql_tcp_port --slave_port=$slave_port --manager-port=$manager_port --no-manager --sleep=10", "tests were successful"); - # 'mysql-test-run' writes its own final message for log evaluation. -} - -# -# Start the server if we are going to run any of the benchmarks -# -if (!$opt_no_test && !$opt_no_benchmark) -{ - my $extra; - safe_cd($test_dir); - log_system("./bin/mysqladmin $mysqladmin_args -S $mysql_unix_port -s shutdown") || info("There was no mysqld running\n"); - sleep(2); - log_system("rm -f ./data/mysql/*"); - check_system("scripts/mysql_install_db --no-defaults --skip-locking","https://order"); - $extra=""; - if ($opt_bdb) - { - $extra.=" --bdb_cache_size=16M --bdb_max_lock=60000" - } - if ($opt_innodb) - { - $extra.=" --innodb_data_file_path=ibdata1:100M:autoextend"; - } - safe_system("./bin/mysqld --no-defaults --basedir . --datadir ./data --skip-locking $extra >> $log 2>&1 &"); - sleep(2); -} - -# -# Compile and install the required Perl modules -# -if ($opt_stage <= 7 && $opt_perl_files && !$opt_no_perl && !$opt_no_test && - !$opt_no_benchmark) -{ - log_timestamp(); - safe_cd($test_dir); - rm_all("perl"); - safe_system("mkdir perl"); - $ENV{'IN_MYSQL_DISTRIBUTION'}=1; - $ENV{'MYSQL_BUILD'}=$test_dir; - - foreach $module (split(/,/,$opt_perl_files)) - { - my $options; - safe_cd("$test_dir/perl"); - if ($opt_debug) - { - safe_system("gunzip < $pwd/$module | tar xvf -"); - } - else - { - safe_system("gunzip < $pwd/$module | tar xf -"); - } - $module =~ m|([^/]+)\.tar\.gz|; - $module = $1; - safe_cd($module); - $options=""; - $options= "--mysql-install --noprompt --mysql-incdir=$test_dir/include --mysql-libdir=$test_dir/lib -nomsql-install -nomsql1-install --mysql-test-db=test $opt_dbd_options" if ($module =~ /Msql-Mysql/); - $options.= " PREFIX=$pwd/$host INSTALLPRIVLIB=$pwd/$host/perl5 INSTALLSCRIPT=$pwd/$host/bin INSTALLSITELIB=$pwd/$host/perl5/site_perl INSTALLBIN=$pwd/$host/bin INSTALLMAN1DIR=$pwd/$host/man INSTALLMAN3DIR=$pwd/$host/man/man3" if ($opt_local_perl); - $options.= " $opt_perl_options" if (defined($opt_perl_options)); - safe_system($opt_static_perl ? "perl Makefile.PL -static $options" : "perl Makefile.PL $options"); - safe_system("$make ; $sur $make install"); - } -} - -# -# Run crash-me test -# -if ($opt_stage <= 8 && !$opt_no_test && !$opt_no_crash_me) -{ - log_timestamp(); - safe_cd("$test_dir/sql-bench"); - log_system("rm -f limits/mysql.cfg"); - safe_system("perl ./crash-me --force --batch-mode $connect_option"); -} - -# -# Run sql-bench Benchmarks -# -if ($opt_stage <= 9 && !$opt_no_test && !$opt_no_benchmark) -{ - log_timestamp(); - safe_cd("$test_dir/sql-bench"); - log_system("rm -f output/*"); - $tmp= $opt_fast_benchmark ? "--fast --user root --small-test" : ""; - check_system("perl ./run-all-tests --log --die-on-errors $connect_option $tmp","RUN-mysql"); - # Run additional fast test with dynamic-row tables - check_system("perl ./run-all-tests --log --suffix=\"_dynamic_rows\" --die-on-errors $connect_option --fast --user=root --small-test --create-options=\"row_format=dynamic\"","RUN-mysql"); - if ($opt_innodb) - { - check_system("perl ./run-all-tests --log --suffix=\"_innodb\" --die-on-errors $connect_option $tmp --create-options=\"type=innodb\"","RUN-mysql"); - } - if ($opt_bdb) - { - check_system("perl ./run-all-tests --log --suffix=\"_bdb\" --die-on-errors $connect_option $tmp --create-options=\"type=bdb\"","RUN-mysql"); - } -} - -rm_all($bench_tmpdir); -rm_all("$opt_tmp") if ($new_opt_tmp); - -log_system("$pwd/$host/bin/mysqladmin $mysqladmin_args -S $mysql_unix_port shutdown"); -print LOG "ok\n"; -close LOG; -print "$host: ok\n"; - -exit 0; - - -sub usage -{ -print < -To set up the environment, like 'CC=cc CXX=gcc CXXFLAGS=-O3' - ---config-extra-env -Additional flags for environment (not CC or CXX). Should be used when one -wants Do-compile to propose proper CC and CXX flags. - ---config-options -To add some extra options to configure (e.g. '--with-perl=yes') - ---dbd-options -Options for Makefile.PL when configuring msql-mysql-modules. - ---debug -Print all shell commands on stdout. - ---delete -Delete the distribution file. - ---distribution -Name of the MySQL source distribution file. - ---enable-shared -Compile with shared libraries - ---fast-benchmark -Run fast benchmark only to speed up testing - ---help or --Information -Show this help - ---innodb -Compile with support for Innodb tables - ---libwrap -Compile with TCP wrapper support - ---local-perl -Install Perl modules locally - ---make-options -Options to make after configure. (Like 'CXXLD=gcc') - ---no-crash-me -Do not run the "crash-me" test - ---no-strip -Do not strip the binaries included in the binary distribution - ---no-test -Do not run any tests. - ---no-benchmark -Do not run the benchmark test (written in perl) - ---no-mysqltest -Do not run the mysql-test-run test (Same as 'make test') - ---one-error -Terminate the mysql-test-run test after the first difference (default: use '--force') - ---perl-files=list of files -Compile and install the given perl modules. - ---perl-options -Build Perl modules with the additional options - ---raid -Compile with RAID support - ---stage (1-6) -Start script from some specific point. - ---static-client -Build statically linked client binaries - ---static-perl -Build statically linked Perl modules - ---static-server -Build statically linked server binary - ---tcpip -Connect to the server to be tested via TCP/IP instead of socket - ---tmp -Use a different temporary directory than /tmp - ---use-old-distribution -Do not clean up the build environment and extract a fresh source -distribution, use an existing one instead. - ---user -Mail 'user_name'\@mysql.com if something went wrong. -If user is empty then no mail is sent. - ---version-suffix suffix -Set name suffix (e.g. 'com' or '-max') for a distribution - ---with-debug -Build binaries with debug information (implies "--no-strip") - ---with-low-memory -Use less memory when compiling. - ---with-other-libc -Link against libc and other standard libraries installed in the specified -non-standard location overriding default. - ---with-small-disk -Clean up the build environment before testing the binary distribution -(to save disk space) - ---without-embedded -Don't compile the embedded server. -EOF -exit 1; -} - -sub abort -{ - my($message)=@_; - my($mail_header_file); - print LOG "\n$message\n"; - print "$host: $message\n" if ($opt_debug); - print LOG "Aborting\n"; - close LOG; - - if ($opt_user) - { - # Take the last 40 lines of the build log - open(LOG, "$log") or die $!; - my @log= ; - close LOG; - splice @log => 0, -40; - my $mail_file="$opt_tmp/do-command.$$"; - open(TMP,">$mail_file") or die $!; - print TMP "From: mysqldev\@$full_host_name\n"; - print TMP "To: $email\n"; - print TMP "Subject: $host($uname): $ver$opt_version_suffix compilation failed\n\n"; - print TMP @log; - close TMP; - system("$sendmail -t -f $email < $mail_file"); - unlink($mail_file); - } - exit 1; -} - -sub info -{ - my($message)=@_; - print LOG "$message\n"; - print "$host: $message\n"; -} - -sub log_system -{ - my($com)=@_; - print "$host: $com\n" if ($opt_debug); - if (defined($log)) - { - print LOG "$com\n"; - system("$com >> $log 2>&1") && - print LOG ("Info: couldn't execute command, error: " . ($? / 256) ."\n"); - } - else - { - system($com) && print "$host: Couldn't execute command, error: " . ($? / 256) ."\n"; - } -} - - -sub safe_system -{ - my($com,$res)=@_; - print LOG "$com\n"; - print "$host: $com\n" if ($opt_debug); - my $result= system("$com >> $log 2>&1"); - abort("error: Couldn't execute command, error: " . ($? / 256)) unless $result == 0; - - return $result; -} - -sub check_system -{ - my($com,$res)=@_; - my ($error,$found); - print LOG "$com\n"; - print "$host: $com\n" if ($opt_debug); - open (COM, "$com 2>&1 < /dev/null|") || abort("Got error " . ($?/256) ." opening pipe"); - $found=0; - while () - { - print LOG $_; - if (index($_,$res) >= 0) - { - $found=1; - last; - } - } - close COM; - abort("Couldn't find '$res' in the command result") if (!$found); - print "$host: Command ok\n" if ($opt_debug); -} - -sub safe_cd -{ - my($dir)=@_; - print LOG "cd $dir\n"; - print "$host: cd $dir\n" if ($opt_debug); - chdir($dir) || abort("Can't cd to $dir"); -} - -sub which -{ - my(@progs)=@_; - foreach $prog (@progs) - { - chomp($found=`which $prog | head -n 1`); - if ($? == 0 && $found ne "" && index($found," ") == -1) - { - $found =~ s|/+|/|g; # Make nicer output - return $found; - } - } - return undef(); -} - -sub find -{ - my (@progs)=@_; - foreach $prog (@progs) - { - return $prog if (-x $prog); - } - return undef(); -} - -# -# Remove recursively all from a directory -# This is needed because problems with NFS and open files -# - -sub rm_all -{ - my(@rm_files)=@_; - my($dir,$current_dir,@files,@dirs,$removed); - $current_dir = `pwd`; chomp($current_dir); - - foreach $dir (@rm_files) - { - if (-d $dir) - { - chdir($dir) || abort("Can't cd to $dir"); - print "$host: Removing from $dir\n" if ($opt_debug); - while (<* .*>) - { - next if ($_ eq "." x (length($_))); - if (-d $_) - { -# die "Can't remove directory that starts with ." if ($_ =~ /^\./ && $_ ne ".libs"); # Safety - push (@dirs,$_); - } - else - { - push (@files,$_); - } - } - if ($#files >= 0) - { - $removed= unlink @files; - print "rm_all : removed $removed files in $current_dir/$dir\n" if ($opt_debug); - abort("Can't remove all $#files+1 from $current_dir/$dir, just $removed") if $removed != $#files+1; - } - foreach $dir (@dirs) - { - rm_all($dir); - } - chdir($current_dir) || abort("Can't cd to $current_dir"); - log_system("rmdir $dir"); - } - else - { - system("rm -f $dir") && abort("Can't remove file $dir"); - } - } -} - -sub kill_all -{ - my ($pattern) = @_; - my ($USER,$BSD,$LINUX, $pscmd, $user, $os, $pid); - $user=$ENV{'USER'}; - $os=defined($ENV{'OS'}) ? $ENV{'OS'} : "unknown"; - $BSD = -f '/vmunix' || $os eq "SunOS4" || $^O eq 'darwin'; - $LINUX = $^O eq 'linux'; - $pscmd = $BSD ? "/bin/ps -auxww" : $LINUX ? "/bin/ps axuw" : "/bin/ps -ef"; - - if (!open(PS, "$pscmd|")) - { - print "Warning: Can't run $pscmd: $!\n"; - exit; - } - - # Catch any errors with eval. A bad pattern, for instance. - process: - while ($cand = ) - { - chop($cand); - ($pid_user, $pid) = split(' ', $cand); - next if $pid eq $$; - next process if (! ($cand =~ $pattern) || $pid_user ne $user); - print LOG "Killing $_\n"; - &killpid($pid); - } -} - -sub killpid -{ - local($pid) = @_; - kill 15, $pid; - for (1..5) - { - sleep 2; - return if kill(0, $pid) == 0; - } - kill 9, $pid; - for (1..5) { - sleep 2; - return if kill(0, $pid) == 0; - } - print LOG "$pid will not die!\n"; -} - -# -# return the current date as a string (YYYY-MM-DD HH:MM:SS) -# -sub log_timestamp -{ - my @ta=localtime(time()); - print LOG sprintf("%4d-%02d-%02d %02d:%02d:%02d\n", - $ta[5]+1900, $ta[4]+1, $ta[3], $ta[2], $ta[1], $ta[0]); - -} diff --git a/Build-tools/Do-create-perl-rpms b/Build-tools/Do-create-perl-rpms deleted file mode 100755 index 2aa71740b58..00000000000 --- a/Build-tools/Do-create-perl-rpms +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash - - -PM_FILES='Data-Dumper Data-ShowTable DBI Msql-Mysql-modules' -FILE_EXT='tar.gz' -ARCH=`uname -m | perl -p -e 's/^i[0-9]86$/i386/'` - -# directories -[ -d /usr/src/redhat ] && RPM_SRC=/usr/src/redhat -[ -d /usr/src/packages ] && RPM_SRC=/usr/src/packages -SRC_DIR=/home/matt/work/pm_rpm/tarballs # pristine tarballs -DEST_DIR=${RPM_SRC}/SOURCES # RPM SOURCES (building area) -RPM_DEPOSIT=/var/tmp/ftp/RPMS # RPM production deposit -SRPM_DEPOSIT=/var/tmp/ftp/SRPMS # SRPM production deposit - -# keyword replacement for SPEC templates -REPLACE_KEY='REPLACE_VERSION' - -# paths to beloved programs -NEWEST=/home/matt/work/build_pm_rpms/newest -REPLACE=/usr/local/bin/replace - - -#++ -# Copy the source tarballs up to staging area for RPM building. -#-- -cd $SRC_DIR -for i in $PM_FILES -do - echo Copying $i... - cp ${SRC_DIR}/`$NEWEST -s $SRC_DIR -b $i -t $FILE_EXT` $DEST_DIR -done - - -#++ -# Do keyword replacements on the SPEC templates, and build RPMS -#-- -cd ${RPM_SRC}/SPECS -for i in $PM_FILES -do - cat ${i}.spec.template | $REPLACE $REPLACE_KEY `$NEWEST -s $DEST_DIR -b $i -t $FILE_EXT -v` > ${i}.spec - rpm -ba ${i}.spec - rm ${i}.spec -done - - -#++ -# Copy new RPMS and SRPMS to production deposit -#-- -cd $RPM_SRC - -# kludge code -PM_FILES=`echo $PM_FILES | $REPLACE Msql-Mysql-modules DBD-Mysql` -tmpv=`$NEWEST -s $DEST_DIR -b Msql-Mysql-modules -t $FILE_EXT -v` -mv SOURCES/Msql-Mysql-modules-${tmpv}.${FILE_EXT} SOURCES/DBD-Mysql-${tmpv}.${FILE_EXT} - - -for i in $PM_FILES -do - cp RPMS/${ARCH}/${i}-`$NEWEST -s $DEST_DIR -b $i -t $FILE_EXT -v`-1.${ARCH}.rpm $RPM_DEPOSIT - cp SRPMS/${i}-`$NEWEST -s $DEST_DIR -b $i -t $FILE_EXT -v`-1.src.rpm $SRPM_DEPOSIT - rm SOURCES/`$NEWEST -s $DEST_DIR -b $i -t $FILE_EXT` -done - diff --git a/Build-tools/Do-linux-build b/Build-tools/Do-linux-build deleted file mode 100755 index 44a9ad05fa2..00000000000 --- a/Build-tools/Do-linux-build +++ /dev/null @@ -1,28 +0,0 @@ -#! /bin/sh - -set -e -x - -# Only use the "--with-other-libc" parameter, if another libc actually -# exists, since this will also force static linking, which does not work -# together with OpenSSL -OTHER_LIBC_DIR=/usr/local/mysql-glibc -OTHER_LIBC="" -if [ -d OTHER_LIBC_DIR ] ; then - OTHER_LIBC="--with-other-libc=$OTHER_LIBC_DIR" -fi - -BUILD/compile-pentium-max $OTHER_LIBC \ - --with-comment="Official MySQL Binary" \ - --prefix=/usr/local/mysql --with-extra-charset=complex \ - --enable-thread-safe-client --enable-local-infile \ - --with-server-suffix=-max -nm -n sql/mysqld | gzip -9 -v 2>&1 > sql/mysqld.sym.gz -scripts/make_binary_distribution -make dist -Build-tools/Do-rpm --local -BUILD/compile-pentium --with-other-libc=$OTHER_LIBC_DIR \ - --with-comment="Official MySQL Binary" \ - --prefix=/usr/local/mysql --with-extra-charset=complex \ - --enable-thread-safe-client --enable-local-infile -nm -n sql/mysqld | gzip -9 -v 2>&1 > sql/mysqld.sym.gz -scripts/make_binary_distribution diff --git a/Build-tools/Do-local-patch-file b/Build-tools/Do-local-patch-file deleted file mode 100755 index 708d06966d3..00000000000 --- a/Build-tools/Do-local-patch-file +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh -# make a patch file of a mysql distribution -# takes as argument the previous version - -case $# in -0) echo Usage: $0 previous_version; exit 1;; -esac - -PVER=$1; -VER=`grep SERVER_VERSION include/mysql_version.h | cut -d'"' -f2` -NEW="mysql-$VER.tar.gz" -OLD="mysql-$PVER.tar.gz" -RESULT="mysql-$PVER-$VER.patch.gz" -PATCH_DIR=/my/data/tcxwww/html/Downloads/Patches -RESULT_DIR=/my/data/tcxwww/html/Downloads/MySQL-3.22 - -if test ! -f $NEW -then - echo "$NEW doesn't exist"; - exit 1; -fi - -if test ! -f $RESULT_DIR/$OLD -then - echo "$RESULT_DIR/$OLD doesn't exist"; - exit 1; -fi - -mkdir patch -cd patch -gtar xfz ../$NEW -gtar xfz $RESULT_DIR/$OLD -cd mysql-$PVER -diff --context --new-file --recursive . ../mysql-$VER | gzip -9 > ../../$RESULT -cd ../.. -/bin/rm -rf patch - diff --git a/Build-tools/Do-patch-file b/Build-tools/Do-patch-file deleted file mode 100755 index 7e6d4c493d8..00000000000 --- a/Build-tools/Do-patch-file +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh -# make a patch file of a mysql distribution -# takes as argument the previous version - -case $# in -0) echo Usage: $0 previous_version; exit 1;; -esac - -PVER=$1; -VER=`grep SERVER_VERSION /my/tmp/BUILD/include/mysql_version.h | cut -d'"' -f2` -NEWDIR="binary" -NEW="mysql-$VER.tar.gz" -OLD="mysql-$PVER.tar.gz" -RESULT="mysql-$PVER-$VER.patch.gz" -PATCH_DIR=/my/web/Downloads-live/Patches -RESULT_DIR=/my/web/Downloads-live/MySQL-4.0 -RESULT_DIR_MAX=/my/web/Downloads-live/MySQL-Max-4.0 - -if test ! -f $NEWDIR/$NEW -then - echo "$NEWDIR/$NEW doesn't exist"; - exit 1; -fi - -if test ! -f $RESULT_DIR/$OLD -then - echo "$RESULT_DIR/$OLD doesn't exist"; - exit 1; -fi - -mkdir patch -cd patch -gtar xfz ../$NEWDIR/$NEW -gtar xfz $RESULT_DIR/$OLD -cd mysql-$PVER -diff --unified --new-file --recursive . ../mysql-$VER | gzip -9 > ../../$RESULT -cd ../.. -/bin/rm -rf patch -chmod a+r,o-w $RESULT binary/* -mv $RESULT $PATCH_DIR -cp binary/mysqlcom-* binary/mysql*win* /net/web/home/production/data/nweb/customer/Downloads -rm binary/mysqlcom-* -mv binary/*Max* binary/*-max* $RESULT_DIR_MAX -cp binary/* $RESULT_DIR diff --git a/Build-tools/Do-pkg b/Build-tools/Do-pkg deleted file mode 100755 index 04d7ba021e5..00000000000 --- a/Build-tools/Do-pkg +++ /dev/null @@ -1,313 +0,0 @@ -#!/usr/bin/perl -w -# -# Do-pkg - convert a binary distribution into a Mac OS X PKG and put it -# inside a Disk Image (.dmg). Additionally, add a separate package, -# including the required Startup Item to automatically start MySQL on -# bootup. -# -# The script currently assumes the following environment (which should exist -# like that, if the Do-compile script was used to build the binary -# distribution) -# -# - there must be a binary distribution (*.tar.gz) in the directory -# `hostname` of the current directory -# - the extracted and compiled source tree should be located in the -# `hostname` directory, too -# -# Use the "--help" option for more info! -# -# written by Lenz Grimmer -# - -use Cwd; -use File::Basename; -use File::Copy; -use Getopt::Long; -Getopt::Long::Configure ("bundling"); -use Sys::Hostname; - -$opt_dry_run= undef; -$opt_help= undef; -$opt_log= undef; -$opt_mail= ""; -$opt_skip_dmg= undef; -$opt_skip_si= undef; -$opt_suffix= undef; -$opt_verbose= undef; -$opt_version= undef; - -GetOptions( - "dry-run", - "help|h", - "log|l:s", - "mail|m=s", - "skip-dmg|skip-disk-image|s", - "skip-si|skip-startup-item", - "suffix=s", - "verbose|v", - "version=s", -) || &print_help; - -# Include helper functions -$PWD= cwd(); -$LOGGER= "$PWD/logger.pm"; -if (-f "$LOGGER") -{ - do "$LOGGER"; -} -else -{ - die "ERROR: $LOGGER cannot be found!\n"; -} - -$PM= "/Developer/Applications/PackageMaker.app/Contents/MacOS/PackageMaker"; -# Try another location on 10.3.3 -unless (-e "$PM") -{ - $PM= "/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker"; -} - -$TMP= $ENV{TMPDIR}; -$TMP eq "" ? $TMP= $TMP . "/PKGBUILD.$$": $TMP= "/tmp/PKGBUILD.$$"; -$PKGROOT= "$TMP/PMROOT"; -$PKGDEST= "$TMP/PKG"; -$RESOURCE_DIR= "$TMP/Resources"; -$SUFFIX= $opt_suffix; -$VERSION= $opt_version; -($MAJOR, $MINOR, $RELEASE)= split(/\./, $VERSION); -$NAME= "mysql$SUFFIX-$VERSION"; -$HOST= hostname(); -$ID= getpwuid($>); -$HOST=~ /^([^.-]*)/; -$HOST= $1; -$LOGFILE= "$PWD/Logs/$HOST-$MAJOR.$MINOR$SUFFIX.log"; -$BUILDDIR= "$PWD/$HOST"; -$SRCBASEDIR= <$BUILDDIR/mysql*-$VERSION>; -$SUPFILEDIR= <$SRCBASEDIR/support-files/MacOSX>; -$TAR= <$BUILDDIR/$NAME-apple-darwin*-powerpc*.tar.gz>; -$TAR =~ /.*\/$NAME(.*)\.tar\.gz$/; -$ARCH= $1; -$NAME= $NAME . $ARCH; -$INFO= <$SUPFILEDIR/Info.plist>; -$DESC= <$SUPFILEDIR/Description.plist>; -$SI_INFO= <$SUPFILEDIR/StartupItem.Info.plist>; -$SI_DESC= <$SUPFILEDIR/StartupItem.Description.plist>; -$SI_PARAMS= <$SUPFILEDIR/StartupParameters.plist>; -$SI_POST= <$SUPFILEDIR/StartupItem.postinstall>; -$SI_NAME= "MySQLStartupItem"; -$SI_SCRIPT= <$SUPFILEDIR/MySQL>; -@RESOURCES= qw/ ReadMe.txt postinstall preinstall /; -@LICENSES= ("$SRCBASEDIR/COPYING","$SRCBASEDIR/MySQLEULA.txt"); - -&print_help("") if ($opt_help || !$opt_suffix || !$opt_version); - -# -# Override predefined Log file name -# -if (defined $opt_log) -{ - if ($opt_log ne "") - { - if ($opt_log =~ /^\/.*/) - { - $LOGFILE= $opt_log; - } - else - { - $LOGFILE= $PWD . "/" . $opt_log; - } - } -} - -# Creating the UFS disk image requires root privileges -die("You must be root to run this script!") if ($ID ne "root" && !$opt_dry_run); - -@files= ($TAR, $INFO, $DESC); -@files= (@files, $SI_INFO, $SI_DESC, $SI_POST, $SI_SCRIPT) unless $opt_skip_si; -foreach $file (@files) -{ - &abort("Unable to find $file!") unless (-f "$file"); -} - -# Remove old temporary build directories first -&logger("Cleaning up temporary build directories"); -&run_command("rm -rf $TMP", "Could not clean up $TMP!"); -&logger("Creating temp directories"); -foreach $dir ($TMP, $PKGROOT, $PKGDEST, $RESOURCE_DIR) -{ - if (!-d $dir) - { - &logger("Creating directory $dir!"); - unless($opt_dry_run) - { - mkdir($dir) or &abort("Could not make directory $dir!"); - } - } -} - -foreach $resfile (@RESOURCES) -{ - &logger("Copying $SUPFILEDIR/$resfile to $RESOURCE_DIR"); - unless($opt_dry_run) - { - copy("$SUPFILEDIR/$resfile", "$RESOURCE_DIR") or - &abort("Error while copying $SUPFILEDIR/$resfile to $RESOURCE_DIR"); - } -} - -# Search for license file -foreach $license (@LICENSES) -{ - if (-f "$license") - { - &logger("Copy $license to $RESOURCE_DIR/License.txt"); - unless($opt_dry_run) - { - copy("$license", "$RESOURCE_DIR/License.txt") or - &abort("Error while copying $license to $RESOURCE_DIR"); - } - } -} - -&abort("Could not find a license file!") -unless (-f "$RESOURCE_DIR/License.txt"); - -# Extract the binary tarball and create the "mysql" symlink -&logger("Extracting $TAR to $PKGROOT"); -&run_command("gnutar zxf $TAR -C $PKGROOT", "Unable to extract $TAR!"); -&run_command("cd $PKGROOT ; ln -s mysql* ./mysql", "Unable to create symlink!"); -&run_command("chown -R root:wheel $PKGROOT/*", "Cannot chown $PKGROOT!"); - -# Now build the PGK using PackageMaker -# The "|| true" is a nasty hack to work around a problem with Package Maker -# returning a non-zero value, even though the package was created correctly -&logger("Running PackageMaker"); -$command= "$PM -build -p $PKGDEST/$NAME.pkg -f $PKGROOT -r $RESOURCE_DIR -i $INFO -d $DESC || true"; -&run_command($command, "Error while building package $NAME.pkg!"); - -# -# Build the Startup Item PKG -# -unless ($opt_skip_si) -{ - &logger("Cleaning up $PKGROOT"); - &run_command("rm -rf $PKGROOT/*", "Unable to clean up $PKGROOT!"); - &logger("Cleaning up $RESOURCE_DIR"); - &run_command("rm -rf $RESOURCE_DIR/*", "Unable to clean up $RESOURCE_DIR!"); - - &logger("Installing MySQL StartupItem files into $PKGROOT/MySQL"); - unless($opt_dry_run) - { - mkdir("$PKGROOT/MySQL") or &abort("Error creating $PKGROOT/MySQL"); - copy("$SI_SCRIPT", "$PKGROOT/MySQL/") - or &abort("Error copying $SI_SCRIPT!"); - chmod(0755, "$PKGROOT/MySQL/" . basename("$SI_SCRIPT")); - copy("$SI_PARAMS", "$PKGROOT/MySQL/") - or &abort("Error copying $SI_PARAMS!"); - chmod(0644, "$PKGROOT/MySQL/" . basename("$SI_PARAMS")); - &run_command("chown -R root:wheel $PKGROOT/*", "Cannot chown $PKGROOT!"); - copy("$SI_POST", "$RESOURCE_DIR/postinstall") - or &abort("Error copying $SI_POST!"); - chmod(0644, "$RESOURCE_DIR/postinstall"); - } - - &logger("Building $SI_NAME.pkg using PackageMaker"); - $command= "$PM -build -p $PKGDEST/$SI_NAME.pkg -f $PKGROOT -r $RESOURCE_DIR -i $SI_INFO -d $SI_DESC || true"; - &run_command($command, "Error while building package $SI_NAME.pkg!"); -} - -if ($opt_skip_dmg) -{ - &logger("SUCCESS: Package $PKGDEST/$NAME.pkg created"); - exit 0; -} - -# Determine the size of the Disk image to be created and add a 5% safety -# margin for filesystem overhead -&logger("Determining required disk image size for $PKGDEST"); -unless($opt_dry_run) -{ - chomp($_= `du -sk $PKGDEST`); - @size= split(); - $size= int($size[0]+($size[0]*0.05)); - &logger("Disk image size: $size KB"); -} - -unless($opt_dry_run) -{ - &abort("Zero bytes? Something is wrong here!") if ($size == 0); -} - -# Now create and mount the disk image -$TMPNAME= $NAME . ".tmp"; -&logger("Creating temporary Disk image $TMPNAME.dmg"); -$command= "hdiutil create $TMPNAME -size ${size}k -ov -fs UFS -volname $NAME"; -&run_command($command, "Unable to create disk image $TMPNAME.dmg!"); -&logger("Attaching Disk image $TMPNAME.dmg"); -&run_command("hdid $TMPNAME.dmg", "Unable to attach $TMPNAME.dmg!"); - -# Install the PKG into the .dmg -chomp($mountpoint=`mount | grep "\/Volumes\/$NAME" | cut -f3 -d" "`) if (!$opt_dry_run); -&logger("Copying $PKGDEST/$NAME.pkg to Disk image /Volumes/$NAME"); -&run_command("ditto $PKGDEST /Volumes/$NAME", "Could not copy $PKGDEST to /Volumes/$NAME!"); -&run_command("ditto $SUPFILEDIR/ReadMe.txt /Volumes/$NAME", "Could not copy $SPFILEDIR/ReadMe.txt to /Volumes/$NAME!"); -chomp($mountpoint=`mount | grep "\/Volumes\/$NAME" | cut -f1 -d" "`) if (!$opt_dry_run); -&abort("/Volumes/$NAME not attached!") if (!$mountpoint && !$opt_dry_run); -&logger("Unmounting $mountpoint"); -&run_command("hdiutil detach $mountpoint", "Unable to detach $mountpoint"); -&run_command("rm -f $NAME.dmg", "Unable to remove $NAME.dmg!") if (-f "$NAME.dmg"); -&logger("Compressing disk image"); -$command= "hdiutil convert $TMPNAME.dmg -format UDZO -imagekey zlib-level=9 -o $NAME.dmg"; -&run_command($command, "Unable to compress disk image!"); - -# Final cleanups -&logger("Removing $TMPNAME.dmg"); -&run_command("rm -f $TMPNAME.dmg", "Unable to remove $TMPNAME.dmg!"); -&logger("Removing $TMP"); -&run_command("rm -rf $TMP", "Unable to remove $TMP!"); - -&logger("SUCCESS: $NAME.dmg created.") if (!$opt_dry_run); -exit 0; - -sub print_help -{ - my $message= $_[0]; - if ($message ne "") - { - print "\n"; - print "ERROR: $message\n"; - } - print < --suffix= --version= - -Creates a Mac OS X installation package (PKG) and stores it inside -a Disk Image (.dmg) file. You need to create a binary distribution -tarball with scripts/make_binary_distribution first! - -NOTE: You need to run this script with root privileges (required - to create the disk image) - -Options: - - --dry-run Dry run without executing --h, --help Print this help --l, --log[=] Write a log file [to ] - (default is "$LOGFILE") --m, --mail=
    Mail a failure report to the given - address (and include a log file snippet, - if logging is enabled) - Note that the \@-Sign needs to be quoted! - Example: --mail=user\\\@domain.com --s, --skip-disk-image, --skip-dmg Just build the PKGs, don't put it into a - disk image afterwards - --skip-startup-item, --skip-si Skip the creation of the StartupItem PKG - --suffix= The package suffix - (e.g. "-standard" or "-pro) - --version= The MySQL version number - (e.g. 4.0.11-gamma) --v, --verbose Verbose execution - -EOF - exit 1; -} diff --git a/Build-tools/Do-rpm b/Build-tools/Do-rpm deleted file mode 100755 index 23602debfb1..00000000000 --- a/Build-tools/Do-rpm +++ /dev/null @@ -1,332 +0,0 @@ -#!/usr/bin/perl -w -# -# Do-rpm - compile RPM packages out of a source tarball and move the -# resulting RPM packages into the current directory. -# -# The script currently assumes the following environment: -# -# - there must be a source distribution (mysql-.tar.gz) -# in the current directory -# - You must provide the name of an RPM spec file (mysql-.spec) -# as the argument -# -# Use the "--help" option for more info! -# -# written by Lenz Grimmer -# - -use Cwd; -use File::Basename; -use File::Copy; -use Getopt::Long; -Getopt::Long::Configure ("bundling"); -use Sys::Hostname; - -$opt_cc= undef; -$opt_cflags= undef; -$opt_clean= undef; -$opt_cxx= undef; -$opt_cxxflags= undef; -$opt_dry_run= undef; -$opt_help= undef; -$opt_log= undef; -$opt_mail= ""; -$opt_verbose= undef; -$opt_susebuild= undef; -$opt_susebuildroot= undef; -$opt_suserpms= undef; - -# Set a dummy version until we know the correct one -$VERSION= "x.y.z"; -$MAJOR= $MINOR= $RELEASE= 0; -$SUFFIX= ""; - -GetOptions( - "cc=s", - "cflags=s", - "clean|c", - "cxx=s", - "cxxflags=s", - "dry-run|t", - "help|h", - "log|l:s", - "mail|m=s", - "susebuild|s", - "susebuildroot|r=s", - "suserpms=s", - "verbose|v", -) || &print_help; - -&print_help("") if ($opt_help); - -defined($SPECFILE=$ARGV[0]) || print_help("Please provide the spec file name!"); - -&print_help("Please define the location of the RPM repository!") if $opt_susebuild && !($opt_suserpms || $ENV{BUILD_RPMS}); - -unless ($opt_susebuildroot) -{ - if ($ENV{BUILD_ROOT}) - { - $opt_susebuildroot= $ENV{BUILD_ROOT}; - } - else - { - $opt_susebuildroot="/var/tmp/build-root"; - } -} - -# Include helper functions -$PWD= cwd(); -$LOGGER= "$PWD/logger.pm"; -if (-f "$LOGGER") -{ - do "$LOGGER"; -} -else -{ - die "ERROR: $LOGGER cannot be found!\n"; -} - -$subject= "RPM build for $SPECFILE failed" if $opt_mail; - -# Open the spec file and extract the version number -open(SPEC, $SPECFILE) or die "Unable to open \"$ARGV[0]\": $!"; -@spec= ; -close SPEC; - -foreach (@spec) -{ - if (m/^%define\s*mysql_version\s*(.*)/) - { - $VERSION= $1; - $VERSION_SRPM=$VERSION; - ($MAJOR, $MINOR, $RELEASE)= split(/\./,$VERSION); - $VERSION_SRPM= $MAJOR . '.' . $MINOR . '.' . $RELEASE; - $VERSION_SRPM =~ s/\-\w+$//; - ($RELEASE, $SUFFIX)= split(/\-/,$RELEASE); - $SUFFIX= "-" . $SUFFIX if ($SUFFIX); - } -} - -$HOST= hostname(); -$HOST=~ /^([^.-]*)/; -$HOST= $1; -$LOGFILE= "$PWD/Logs/Do-rpm-$HOST-$MAJOR.$MINOR.log"; -&logger("Logging to $LOGFILE"); - -# -# Override predefined Log file name -# -if (defined $opt_log) -{ - if ($opt_log ne "") - { - if ($opt_log =~ /^\/.*/) - { - $LOGFILE= $opt_log; - } - else - { - $LOGFILE= $PWD . "/" . $opt_log; - } - } -} - -&logger("Using spec file for version: $VERSION"); - -if ($opt_susebuild) -{ - &susebuild; -} -else -{ - &rpmbuild; -} - -&logger("SUCCESS: RPM files successfully created.") unless ($opt_dry_run); -exit 0; - -# -# Build using SUSE's "build" script -# -sub susebuild -{ - $BUILD= "/usr/bin/build"; - ( -x $BUILD) ? &logger("$BUILD found, proceeding.") : &abort("$BUILD could not be found!"); - $command= "sudo $BUILD --clean"; - $command.= " --root=$opt_susebuildroot"; - $command.= " --rpms=$opt_suserpms" if $opt_suserpms; - $command.= " $SPECFILE"; - &logger("Building RPMs using SUSE build."); - &run_command($command, "Error while running the SUSE RPM build!"); - - # - # Move the resulting RPMs into the pwd - we can use broad globs here - # as the build root has been cleaned up before so there should not be - # any residuals from previous build runs - # - $command= "cp"; - $command.= " -v " if ($opt_verbose); - $command.= " $opt_susebuildroot/usr/src/packages/SRPMS/MySQL*.src.rpm $PWD"; - &logger("Copying source RPM to current dir."); - &run_command($command, "Error moving source RPM!"); - - $command= "cp"; - $command.= " -v " if ($opt_verbose); - $command.= " $opt_susebuildroot/usr/src/packages/RPMS/*/MySQL*.rpm $PWD"; - &logger("Copying binary RPMs to current dir."); - &run_command($command, "Error moving binary RPMs!"); -} - -# -# Build using "plain" RPM -# -sub rpmbuild -{ - - # - # Newer RPM versions ship with a separate tool "rpmbuild" to build RPMs - # - if (-x "/usr/bin/rpmbuild") - { - $RPM= "/usr/bin/rpmbuild"; - $RMSOURCE= "--rmsource --rmspec"; - } - else - { - $RPM= "/bin/rpm"; - $RMSOURCE= "--rmspec"; - } - - if ($RPM) - { - &logger("Found rpm binary: $RPM"); - } - else - { - &abort("Unable to find RPM binary!"); - } - - # - # determine some RPM settings for this host - # - chomp($RPMARCH= `$RPM --eval "%{_arch}" 2> /dev/null`); - chomp($RPMDIR= `$RPM --eval "%{_rpmdir}" 2> /dev/null`); - chomp($SOURCEDIR= `$RPM --eval "%{_sourcedir}" 2> /dev/null`); - chomp($SPECDIR= `$RPM --eval "%{_specdir}" 2> /dev/null`); - chomp($SRCRPMDIR= `$RPM --eval "%{_srcrpmdir}" 2> /dev/null`); - - $SOURCEFILE= glob "mysql*-$VERSION.tar.gz"; - - &logger("Starting RPM build of MySQL-$VERSION on $HOST"); - - foreach $file ($SOURCEFILE, $SPECFILE) - { - &abort("Unable to find $file!") unless (-f "$file"); - } - - # - # Install source and spec file - # - &logger("Copying SOURCE and SPEC file to build directories."); - unless ($opt_dry_run) - { - copy($SOURCEFILE, $SOURCEDIR) - or &abort("Unable to copy $SOURCEFILE to $SOURCEDIR!"); - copy($SPECFILE, $SPECDIR) - or &abort("Unable to copy $SPECFILE to $SPECDIR!"); - } - - # - # Set environment variables - these are being used in the - # official MySQL RPM spec file - # - &logger("Setting special build environment variables") - if ($opt_cc) or ($opt_cflags) or ($opt_cxxflags) or ($opt_cxx); - $ENV{MYSQL_BUILD_CC}=$opt_cc if ($opt_cc); - $ENV{MYSQL_BUILD_CFLAGS}=$opt_cflags if ($opt_cflags); - $ENV{MYSQL_BUILD_CXXFLAGS}=$opt_cxxflags if ($opt_cxxflags); - $ENV{MYSQL_BUILD_CXX}=$opt_cxx if ($opt_cxx); - - # - # Build the RPMs - # - $command= "$RPM"; - $command.= " -v" if ($opt_verbose); - $command.= " -ba"; - $command.= " --clean $RMSOURCE" if $opt_clean; - $command.= " $SPECDIR/"; - $command.= basename($SPECFILE); - &logger("Building RPM."); - &run_command($command, "Error while building the RPMs!"); - - # - # Move the resulting RPMs into the pwd - # - $command= "mv"; - $command.= " -v " if ($opt_verbose); - $command.= " $SRCRPMDIR/MySQL*$VERSION_SRPM*.src.rpm $PWD"; - &logger("Moving source RPM to current dir."); - &run_command($command, "Error moving source RPM!"); - - $command= "mv"; - $command.= " -v " if ($opt_verbose); - $command.= " $RPMDIR/$RPMARCH/MySQL*$VERSION_SRPM*.$RPMARCH.rpm $PWD"; - &logger("Moving binary RPMs to current dir."); - &run_command($command, "Error moving binary RPMs!"); -} - -sub print_help -{ - my $message= $_[0]; - if ($message ne "") - { - print "\n"; - print "ERROR: $message\n\n"; - } - print < - -Creates a binary RPM package out of a MySQL source distribution and moves -the resulting RPMs into the current directory. is the MySQL RPM -spec file to use (e.g. mysql-4.0.17.spec). - -This script expects to find the required MySQL source distribution -(mysql-.tar.gz) in the current directory. - -Options: - - --cc= Use to compile C code - --ccflags= Use special C compiler flags - --cxx= Use to compile C++ code - --cxxflags= Use special C++ compiler flags --c, --clean Clean up after the build --t, --dry-run Dry run without executing --h, --help Print this help --l, --log[=] Write a log file [to ] --m, --mail=
    Mail a failure report to the given address - (and include a log file snippet, if logging - is enabled) - Note that the \@-Sign needs to be quoted! - Example: --mail=user\\\@domain.com --s, --susebuild Use the SUSE "build" script instead of RPM - directly (requires sudo privileges to run the - /usr/bin/build command) --r, --susebuildroot= Use as the build root directory for the - SUSE "build" (default is /var/tmp/build-root - or defined by the BUILD_ROOT environment - variable) ---suserpms= Path to the SUSE RPM repository to build up - the build root (mandatory option when using - --susebuild and the BUILD_RPMS environment - variable is not set.) --v, --verbose Verbose execution - -Example: - - Do-rpm -cv mysql-4.0.17.spec - -EOF - exit 1; -} diff --git a/Build-tools/Do-win-build b/Build-tools/Do-win-build deleted file mode 100755 index a78b091a737..00000000000 --- a/Build-tools/Do-win-build +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/perl -w - -use Getopt::Long; - -$opt_help=0; -$opt_tarball=$opt_builddir=$opt_suffix=""; - -GetOptions( - "help", - "tarball=s", - "builddir=s", - "suffix=s" -) || print_help(); - -print_help() if ($opt_help); - -chomp($MSDEV=`which msdev`); - -if (!$opt_builddir) { - $opt_builddir = "/cygdrive/c/mysql-win-build"; -} - -$opt_tarball =~ /(mysql[^\/]*)-win-src\.tar/; -$mysqlver=$1; -$basedir = "$opt_builddir/$mysqlver"; -$scriptdir = `pwd`; - -# Make sure build dir exists -mkdir($opt_builddir); -# Clean out any previous build -system("rm -rf $basedir"); - -# Unpack in the script directory -system("tar -zxvf $opt_tarball"); -# Move to the build directory -system("mv $mysqlver $opt_builddir"); - -if (!chdir($basedir)) -{ - print "Do-win-build error: Could not change to $basedir"; - exit 1; -} - -# Check whether this is a classic edition build -if ($opt_suffix =~ /-classic/) -{ - # Blank out ha_innodb.cpp - chmod 0644, 'sql/ha_innodb.cpp'; - open(OUT, '>', 'sql/ha_innodb.cpp'); - close(OUT); - - # Remove HAVE_INNOBASE_DB from the requisite project files - for $dspfile ('libmysqld/libmysqld.dsp', 'mysqldemb/mysqldemb.dsp', 'mysqlserver/mysqlserver.dsp', 'sql/mysqld.dsp', 'sql/mysqldmax.dsp') - { - open(IN, '<', $dspfile); - open(OUT, '>', "$dspfile.tmp"); - while (readline IN) - { - s/\D \"HAVE_INNOBASE_DB\" //g; - print OUT $_; - } - close(IN); - close(OUT); - unlink $dspfile; - rename "$dspfile.tmp", $dspfile; - } -} - -# Perform compilation -system("\"$MSDEV\" mysql.dsw /MAKE \"ALL\" /OUT $mysqlver-build.log"); - -# Package binary -system("./scripts/make_win_binary_distribution --suffix=$opt_suffix"); - -# Copy log back to script directory -system("cp $mysqlver$suffix-build.log $scriptdir"); - -# Move binary package to script directory -system("mv *.zip $scriptdir"); - -# -# Print a help text message -# -sub print_help -{ - print < -Set the Cygwin path to build under; the tarball will actually -be moved to /mysql-/tarball and extracted under -/mysql-/build. -Default: /cygdrive/c/mysql-win-build - ---suffix= -If specified, the resulting binary will have the specified suffix -in its name. If the suffix is "-classic", the project files will -be stripped of all occurrences of HAVE_INNOBASE_DB and -ha_innodb.cpp will be blanked out, to create classic edition -server binaries. - ---tarball= -Windows source tarball to use for this build. Must be of the form -mysql[com]-x.x.x-win-src.tar.gz (REQUIRED) - -EOF - exit 1; -} diff --git a/Build-tools/cvs-sanity-check b/Build-tools/cvs-sanity-check deleted file mode 100755 index b3d57e98033..00000000000 --- a/Build-tools/cvs-sanity-check +++ /dev/null @@ -1,15 +0,0 @@ -#! /bin/sh - -CVSROOT=my@work.mysql.com:/home/cvs -CVS_RSH=ssh -TMPDIR=/tmp -cd $TMPDIR -[ -d mysql ] && rm -rf mysql -CVSROOT=$CVSROOT CVS_RSH=$CVS_RSH cvs -z 9 co mysql && cd mysql && \ - chmod u+w -R * && BUILD/compile-pentium -if test $? = 0 -then -cd $TMPDIR && rm -rf mysql -fi - - diff --git a/Build-tools/logger.pm b/Build-tools/logger.pm deleted file mode 100644 index d3fb4c9db2f..00000000000 --- a/Build-tools/logger.pm +++ /dev/null @@ -1,112 +0,0 @@ -# Helper functions - -# -# Create a log entry -# -sub logger -{ - my $message= $_[0]; - my $cmnd= $_[1]; - - print $message . "\n" if !$opt_quiet && !$opt_verbose && !$cmnd; - print timestamp() . " " . $message . "\n" if $opt_verbose; - if (defined $opt_log && !$opt_dry_run) - { - open LOG, ">>$LOGFILE" or die "Can't open logfile $LOGFILE!"; - print LOG timestamp() . " " . $message . "\n"; - close LOG; - } -} - -# -# run_command(,) -# Execute the given command or die with the respective error message -# Just print out the command when doing a dry run -# -sub run_command -{ - my $command= $_[0]; - my $errormsg= $_[1]; - if ($opt_dry_run) - { - print "$command\n"; - } - else - { - &logger($command, 1); - - $command.= ';' unless ($command =~ m/^.*;$/); - - $command =~ s/;/ >> $LOGFILE 2>&1;/g if defined $opt_log; - $command =~ s/;/ > \/dev\/null;/g if (!$opt_verbose && !$opt_log); - system($command) == 0 or &abort("$errormsg\n"); - } -} - -# -# abort() -# Exit with giving out the given error message or by sending -# it via email to the given mail address (including a log file snippet, -# if available) -# -sub abort -{ - my $message= $_[0]; - my $messagefile; - my $subject= "Bootstrap of $REPO failed" if $opt_mail; - $message= "ERROR: " . $message; - &logger($message); - - if ($opt_mail && !$opt_dry_run) - { - $messagefile= "/tmp/message.$$"; - open(TMP,">$messagefile"); - print TMP "$message\n\n"; - close TMP; - if (defined $opt_log) - { - system("tail -n 40 $LOGFILE >> $messagefile"); - } - system("mail -s \"$subject\" $opt_mail < $messagefile"); - unlink($messagefile); - } - - exit 1; -} - -# Create a time stamp for logging purposes -sub timestamp -{ - return &ymd() . " " . &hms(); -} - -# -# return the current time as a string (HH:MM:SS) -# -sub hms -{ - my @ta= localtime(time()); - my $h= $ta[2]; - $h= "0" . "$h" if ($h <= 9); - my $m= $ta[1]; - $m= "0" . "$m" if ($m <= 9); - my $s= $ta[0]; - $s="0" . "$s" if ($s <= 9); - - return "$h:$m:$s"; -} - -# -# return the current date as a string (YYYYMMDD) -# -sub ymd -{ - my @ta=localtime(time()); - my $d=$ta[3]; - $d="0" . "$d" if ($d <= 9); - my $m=$ta[4]+1; - $m="0" . "$m" if ($m <= 9); - my $y=1900+$ta[5]; - - return "$y$m$d"; -} diff --git a/Build-tools/my_md5sum b/Build-tools/my_md5sum deleted file mode 100755 index f4ac2f7d674..00000000000 --- a/Build-tools/my_md5sum +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/perl -# -# my_md5sum -# -# Script to clone the 'md5sum' command found on modern systems, since that -# command is not always found on all systems. -# -# Use the "--help" option for more info! -# -# Written by Matt Wagner -# -use strict; - -# -# Use local perl libraries first. 'unshift' adds to the front of @INC -# The local perl library dir hidden is $HOME/.perllibs on each build host -# -BEGIN -{ - my $homedir= $ENV{HOME}; - unshift (@INC, "$homedir/.perllibs"); -} - -use Digest::MD5; -use Getopt::Long; - -my $VER= "1.3"; -my $EXIT= 0; - -# -# Strip the leading path info off the program name ($0). We want 'my_md5sum' -# not './my_md5sum'. -# -$0=~ s/^.*\/(.+)$/$1/; - -my ($opt_check, $opt_help)= undef; - -GetOptions( - "check|c" => \$opt_check, - "help|h" => \$opt_help, - ) || usage(); - -# -# Put all the [file1 file2 file3 ...]'s into an array -# -my @files = @ARGV; - -# -# Give the "--help" text if: -# - "--help|-h" was specified -# - The number of files given as arguments is nil -# - The "--check|-c" option is used with more than one [file] argument -# -usage() if $opt_help || $#files == -1 || ($opt_check && $#files > 0); - -# If "--check|-c", then go into checking -if ($opt_check) -{ - open (CHECKFILE, $files[0]) or die "$files[0]: $!"; - - while () - { - # - # Goto the next line in the file if it does not match a typical - # digest line like: - # - # f1007efa2c72daa693981ec764cdeaca Bootstrap - # - next if $_!~ m/^([a-z0-9]{32})\s+(.+)$/; - - # Collect the trappings from the above regex - my $checksum= $1; - my $checkfile= $2; - - # Generate a fresh MD5 for the file in question - my $digest= &mkmd5($checkfile); - - # Check the fresh MD5 against what is recorded in the file - # Print an error message if they don't match, else print OK - print "$checkfile: FAILED\n" if $digest ne $checksum; - print "$checkfile: OK\n" if $digest eq $checksum; - - # Set the exit() status to non-zero if FAILED - $EXIT= 1 if $digest ne $checksum; - } -} -# Else generate the MD5 digest to STDOUT -else -{ - foreach my $file (@files) - { - my $digest= &mkmd5($file); - - print "$digest $file\n"; - } -} - -exit($EXIT); - - -# -# This routine generates the MD5 digest of a file -# -sub mkmd5 -{ - my $file= shift; - - open (FILE, $file) or die "$file: $!"; - binmode(FILE); - - my $digest= Digest::MD5->new->addfile(*FILE)->hexdigest; - - close FILE; - - return $digest; -} - -# -# Print the help text -# -sub usage -{ - print < - -Usage: -$0 [-c [file]] | [file1...] -Generates or checks MD5 message digests. - -Options: --c, --check Check message digests (default is generate) --h, --help Display this text and exit - -The input for -c should be the list of message digests and file names that is -printed on STDOUT by this program when it generates digests. - -EOF - - exit(0); -} diff --git a/Build-tools/mysql-copyright b/Build-tools/mysql-copyright deleted file mode 100755 index 81d6d761498..00000000000 --- a/Build-tools/mysql-copyright +++ /dev/null @@ -1,372 +0,0 @@ -#!/usr/bin/perl -wi - -# Untar a MySQL distribution, change the copyright texts, -# pack it up again to a given directory - -$VER="1.5"; - -use Cwd; -use File::Basename; -use File::Copy; -use Getopt::Long; - -$opt_help = 0; -$opt_version = 0; -$opt_verbose = 0; -$opt_target = "mysql-copyright-target-"; -$opt_target .= `date +%d%m%y-%H%M%S`; -chop $opt_target; - -GetOptions("help","version","target=s", "verbose") || error(); - -# fix the directory prefix for target dir - -$WD= cwd(); -my $win_flag = 0; -$opt_target= $WD . '/' . $opt_target; - -&main(); - -#### -#### main -#### - -sub main -{ - my $REG_BASENAME = '[a-z0-9A-Z\-\_\+]+'; - my $REG_VERSION = '[0-9\.\-]+[a-z]?[0-9\.\-]+?(.alpha|.beta|.gamma|pre\d|[0-9\.\-a-z])?'; - my $target; - - if ($opt_version) - { - print "$0 version $VER by Jani Tolonen\n"; - exit(0); - } - usage() if ($opt_help); - print error() if ($#ARGV == -1); - - `mkdir -p $opt_target`; - $pec= $? >> 8; - die "Couldn't make the target directory!\n" if ($pec); - - for ($i=0; $ARGV[$i]; $i++) - { - my $distfile= $ARGV[$i]; - $win_flag = ($distfile =~ /win-src/) ? 1 : 0; - my $dir; - - $dir= "mysql-copyright-"; - $dir.= `date +%d%m%y-%H%M%S`; - chop $dir; - - if (!(mkdir "$dir", 0700)) - { - die "Couldn't make directory $dir!"; - } - if (!(chdir "$dir")) - { - abort($dir, "Couldn't cd to $dir!"); - } - # if the distfile is mysql-3.22.22-alpha.tar.gz, then - # distname is 'mysql-3.22.22-alpha' and suffix '.tar.gz' - if ($distfile =~ - m/^($REG_BASENAME)([\-\_])($REG_VERSION){1}([\.\-\+]\w+\-\w+)?[\.\-\+](.*)?$/xo) - { - $distname= $1.$2.$3; - $suffix= $5; - $fileext = $6; - $newdistname= $1."com".$2.$3; - $newdistname .= $suffix if $win_flag; - } - # find out the extract path (should be same as distname!) - chomp($destdir= `tar ztf ../$distfile | head -1`); - # remove slash from the end - $destdir= substr($destdir, 0, -1); - - if ("$destdir" ne "$distname") - { - print "Destination directory (the directory that will be extracted\n"; - print "from the original distribution file) differs from the\n"; - print "distribution name! Are you sure you want to continue? (Y/N) [N]:"; - $ans= my_read(1); - abort($dir, "Aborted!") if ("$ans" ne "Y" && "$ans" ne "y"); - } - - # everything should be ok, continue with extracting.. - `tar xfz ../$distfile`; - $pec= $? >> 8; - abort($dir, "Extracting from tar failed!\n") if ($pec); - - # remove the 'PUBLIC' file from distribution and copy MySQLEULA.txt - # on the toplevel of the directory instead. file 'PUBLIC' shouldn't - # exist in the new mysql distributions, but let's be sure.. - unlink("$destdir/PUBLIC", "$destdir/README"); - unlink("$destdir/COPYING", "$destdir/EXCEPTIONS-CLIENT"); - copy("$WD/Docs/MySQLEULA.txt", "$destdir"); - - # remove subdirectories 'bdb', 'cmd-line-utils/readline' - my @extra_fat= ('bdb', 'cmd-line-utils/readline'); - - foreach my $fat (@extra_fat) - { - &trim_the_fat($fat); - } - - # fix file copyrights - &fix_usage_copyright(); - &add_copyright(); - - # fix LICENSE tag in include/mysql_version.h - &fix_mysql_version(); - - # apply "autotools" - must be last to ensure proper timestamps - &run_autotools(); - - # rename the directory with new distribution name - chdir("$WD/$dir"); - print "renaming $destdir $newdistname\n" if $opt_verbose; - rename($destdir, $newdistname); - - # tar the new distribution - `tar cz -f $WD/$newdistname.tar.gz $newdistname`; - $pec= $? >> 8; - abort($dir, "Making new tar archive failed!\n") if ($pec); - - # remove temporary directory - chdir($WD) or print "$! Unable to move up one dir\n"; - my $cwd = getcwd(); - print "current dir is $cwd\n" if $opt_verbose ; - if (-e $dir) { - print "Trying to delete $dir\n" if $opt_verbose; - if ( system("rm -rf $dir")){ - print "$! Unable to delete $dir!\n"; - } - } - } - exit(0); -} - -#### -#### This function will s/GPL/Commercial/ in include/mysql_version.h for the -#### LICENSE tag. -#### -sub fix_mysql_version -{ - my $cwd= getcwd(); - chdir("$destdir"); - my $header_file= (-f 'include/mysql_version.h.in')? 'include/mysql_version.h.in' : 'include/mysql_version.h'; - - open(MYSQL_VERSION,"<$header_file") or die "Unable to open $header_file for read: $!\n"; - undef $/; - my $mysql_version= ; - close(MYSQL_VERSION); - - $mysql_version=~ s/\#define LICENSE[\s\t]+GPL/#define LICENSE Commercial/; - - open(MYSQL_VERSION,">$header_file") or die "Unable to open $header_file for write: $!\n"; - print MYSQL_VERSION $mysql_version; - close(MYSQL_VERSION); - chdir("$cwd"); -} - -#### -#### This function will remove unwanted parts of a src tree for the mysqlcom -#### distributions. -#### - -sub trim_the_fat -{ - my $the_fat= shift; - my $cwd= getcwd(); - - chdir("$destdir"); - if ( -d "${the_fat}" ) - { - system("rm -rf ${the_fat}"); - if (!$win_flag) - { - open(CONFIG_IN,"; - close(CONFIG_IN); - - # - # If $the_fat Makefile line closes the parenthesis, then - # replace that line with just the closing parenthesis. - # - if ($config_in=~ m|${the_fat}/Makefile\)\n?|) - { - $config_in=~ s|${the_fat}/Makefile(\)\n?)|$1|; - } - # - # Else just delete the line - # - else - { - $config_in=~ s|${the_fat}/Makefile dnl\n?||; - } - - open(CONFIG_IN,">configure.in") or die "Unable to open configure.in for write: $!\n"; - print CONFIG_IN $config_in; - close(CONFIG_IN); - } - } - chdir("$cwd"); -} - - -#### -#### This function will run the autotools on the reduced source tree. -#### - -sub run_autotools -{ - my $cwd= getcwd(); - - if (!$win_flag) - { - chdir("$destdir"); - unlink ("configure") or die "Can't delete $destdir/configure: $!\n"; - - # File "configure.in" has already been modified by "trim_the_fat()" - - # It must be ensured that the timestamps of the relevant files are really - # ascending, for otherwise the Makefile may cause a re-run of these - # autotools. Experience shows that deletion is the only safe way. - unlink ("config.h.in") or die "Can't delete $destdir/config.h.in: $!\n"; - unlink ("aclocal.m4") or die "Can't delete $destdir/aclocal.m4: $!\n"; - - # These sleep commands also ensure the ascending order. - `aclocal && sleep 2 && autoheader && sleep 2 && automake && sleep 2 && autoconf`; - die "'./configure' was not produced!" unless (-f "configure"); - - if (-d "autom4te.cache") { - print "Trying to delete autom4te.cache dir\n" if $opt_verbose; - system("rm -rf autom4te.cache") or print "Unable to delete autom4te.cache dir: $!\n"; - } - - chdir("$cwd"); - } -} - - -#### -#### mysqld and MySQL client programs have a usage printed with --help. -#### This usage includes a copyright, which needs to be modified -#### -sub fix_usage_copyright -{ - my $findlist = `find . -type f -name \"*.c*\"`; - my @files = split("\n", $findlist); - my $cwd = getcwd(); - - foreach my $file (@files) - { - next if ! -f $file; - print "processing file $file in cwd $cwd\n" if $opt_verbose; - `replace "This is free software," "This is commercial software," "and you are welcome to modify and redistribute it under the GPL license" "please see the file MySQLEULA.txt for details" -- "$file"` ; - } -} - -#### -#### change the copyright text in the beginning of the files -#### - -sub add_copyright -{ - my $findlist = `find . -type f -name "*"`; - my @files = split("\n", $findlist); - my $cwd = getcwd(); - - foreach my $file (@files) - { - next if ! -f $file; - next if -B $file; - print "processing file $file in cwd $cwd\n" if $opt_verbose; - `$WD/Build-tools/mysql-copyright-2 "$file"`; - } -} - -#### -#### read stdin -#### - -sub my_read -{ - ($length)= @_; # Max allowed length for the string. - - $input= getc(STDIN); - if($input eq "\n") - { - return "\n"; - } - for($new_input= getc(STDIN); $new_input ne "\n" ;) - { - if(length($input) < $length) - { - $input.= $new_input; - } - $new_input= getc(STDIN); - } - return $input; -} - -#### -#### abort -#### - -sub abort -{ - my ($dir, $errstr)= @_; - # remove newly made directory and it's contents - print "$errstr\n"; - chdir ".."; - print "Removing directory $dir...\n"; - `rm -rf $dir`; - exit(0); -} - -#### -#### usage -#### - -sub usage -{ - print < -mysqlcom-3.23.18-beta.tar.gz. DATE is of form DDMMYY-HHMMSS. The -target directory can be changed with option ---target=... mysql-copyright consists of two perl programs, this one -and another, mysql-copyright-2. Make sure the second part of the -script is available to the main script. - -Usage: -$0 [options] file1 [file2 file3...] - -Options: ---help Show this help and exit. ---target Target directory for new distribution files. - '.' can be used for the current directory. - (Default: $opt_target) -EOF - exit(0); -} - -#### -#### error -#### - -sub error -{ - if ($#ARGV == -1) - { - print "Too few arguments to $0!\n"; - } - exit(1); -} diff --git a/Build-tools/mysql-copyright-2 b/Build-tools/mysql-copyright-2 deleted file mode 100755 index 2ea2e8ef441..00000000000 --- a/Build-tools/mysql-copyright-2 +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/perl -i - -# Add the header to all given files -# This program asumes that after the copyright there is a empty line -# - -$opt_v= 0; -require "getopts.pl"; -Getopts("v") || die "Aborted"; - -@copyright= -( - "Copyright (C) 2000 MySQL AB & MySQL Finland AB", - "", - "This software is distributed with NO WARRANTY OF ANY KIND. No author or", - "distributor accepts any responsibility for the consequences of using it, or", - "for whether it serves any particular purpose or works at all, unless he or", - "she says so in writing. Refer to the MySQLEULA.txt file for details.", - "", - "Every copy of this file must include a copy of the License, normally in a", - "plain ASCII text file named MySQLEULA.txt. The License grants you the right to", - "copy, modify and redistribute this file, but only under certain conditions", - "described in the License. Among other things, the License requires that", - "the copyright notice and this notice be preserved on all copies" -); - -while (<>) -{ - if (!$first++) - { - add_copyright($_); - } - if ($in_copyright) - { - $in_copyright=check_in_copyright($_); - } - print $_ if (!$in_copyright); - if (eof) - { - $first=0; $in_copyright=1; - } -} - -exit 0; - -sub add_copyright -{ - my ($line)=@_; - my ($row); - - $in_copyright= $line =~ /copyright/i; - $found_end_copyright=$skip_this_line=0; - - if (!($line =~ /Monty/ || $line =~ /MySQL AB/)) - { - $in_copyright=0; - print STDERR "File with unknown copyright ", $ARGV,"\n" if ($opt_v); - return; - } - else - { - print STDERR "To be Changed: ", $ARGV, "\n" if ($opt_v); - } - if ($ARGV =~ /Makefile/ || - $ARGV =~ /makefile/) - { # Makefile - $start_copyright="# "; - $line_copyright= "# "; - $end_copyright= ""; - } - elsif ($line =~ "^#!") - { # Shell script - $start_copyright="# "; - $line_copyright= "# "; - $end_copyright= ""; - $skip_this_line=1; - print $line; - while ($line=<>) # Copy all until new line or copyright - { - if ($line =~ /copyright/i) - { - last; - } - print $line; - last if ($line =~ /^(\s|\n)*$/); - } - $in_copyright=1; - } - elsif ($ARGV =~ /\.c$/ || - $ARGV =~ /\.cc$/ || - $ARGV =~ /\.h$/ || - $ARGV =~ /\.cpp$/ || - $ARGV =~ /\.txt$/ || - $ARGV =~ /\.yy$/) - { - $start_copyright="/* "; - $line_copyright= " "; - $end_copyright= "*/"; - } - elsif ($ARGV =~ /-x86\.s$/) - { - $start_copyright="# "; - $line_copyright= "# "; - $end_copyright= ""; - } - elsif ($ARGV =~ /\.s$/) - { - $start_copyright="! "; - $line_copyright= "! "; - $end_copyright= ""; - } - elsif ($ARGV =~ /\.asm$/) - { - $start_copyright="; "; - $line_copyright= "; "; - $end_copyright= ""; - } - else # Unknown file - { - $in_copyright=0; - print STDERR "Unknown file type ", $ARGV,"\n" if ($opt_v); - return; - } - $data=\@copyright; - - for ($row=0 ; $row <= $#$data ; $row++) - { - print $row == 0 ? $start_copyright : $line_copyright; - print $data->[$row]; - print $row != $#$data ? "\n" : $end_copyright . "\n"; - } - print "\n"; - $end_copyright =~ /\s*([^\s]+)\s*(([^\s].*)|)$/; # Remove pre and post spaces -} - -# -# Return 1 if in copyright -# - -sub check_in_copyright -{ - my ($line)=@_; - $line =~ /^(.*[^\s])(\s|\n|\r)*$/; # Remove end space and newline - $line=$1; - if (!$line) - { - $found_end_copyright=1 if (!length($end_copyright)); - return 1; # Skip empty lines - } - return 0 if ($found_end_copyright); - if ($end_copyright) - { - if (index($line,$end_copyright) != -1) - { - $found_end_copyright=1; - } - return 1; - } - if ($line =~ /copyright/i || index($line . " ",$line_copyright) == 0) - { - return 1; - } - if ($skip_this_line) - { - $skip_this_line=0; - return 1; - } - return 0; # Can't trust the empty copyright line yet -} diff --git a/Build-tools/newest b/Build-tools/newest deleted file mode 100644 index 367c9bd1f1b..00000000000 --- a/Build-tools/newest +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/perl - -package NEWEST; - -use Getopt::Long; -use File::Basename; - -my $src_dir; -my $basename; -my $type = "tar.gz"; -my $versions; -my $help; -my %KEEPER; - - -GetOptions( - "src_dir=s" => \$src_dir, - "basename=s" => \$basename, - "type=s" => \$type, - "versions!" => \$versions, - "help!" => \$help - ); - -if (!defined $src_dir || !defined $basename) { - $help = 1; -} - -if ($help) { - &help(); - exit; -} - - -&extract_version(\$src_dir, \$basename, \$type, \%KEEPER); -&print_max(\%KEEPER, \$type, \$versions, &find_max(\%KEEPER)); - - - -sub extract_version { - my $src_dir = shift; - my $basename = shift; - my $type = shift; - my $KEEPER = shift; - - while (glob("$${src_dir}/$${basename}*")) { - my $base = basename("$_",".$${type}"); - my @ver = split /-/, $base; - my @nums = split /\./, $ver[$#ver]; - - my $new; - for (my $i=0; $i<$#nums+1; $i++) { - $new =~ s/^([0-9]*)([a-zA-Z]*)$/$1/; - $new .= 10000+$nums[$i]; - $new .= $2; - } - $KEEPER->{"$new"} = [$base,$ver[$#ver]]; - } - - return; -} - - - -sub find_max { - my $KEEPER = shift; - - return reverse sort (keys %$KEEPER); -} - - - -sub print_max { - my $KEEPER = shift; - my $type = shift; - my $versions = shift; - my $max_key = shift; - - if ($${versions}) { - print "$KEEPER->{$max_key}->[1]\n"; - } - else { - print "$KEEPER->{$max_key}->[0]" . ".$${type}\n"; - } - - return; -} - - - -sub help { - - print qq("newest" finds the tarball in a given directory with the newest version number -and returns it's filename. "newest" is meant to be embedded in UNIX shell -scripts. - -Usage: - -newest -(src_dir | s) /path/to/dir/with/tarballs - -(basename | b) BaseName (ex. BaseName-2.10.tar.gz) - -(type | t) Type of file (default: tar.gz) - -(versions | v) Print only version information - -(help | h) Prints usage help - -Ex: \$ /opt/bin/newest -s /opt/incoming/pm_modules -b Data-Dumper - Data-Dumper-2.101.tar.gz - -Both arguments, '-s' and '-b' are required; '-t' and '-v' are optional. - -); - - return; -} - - - - From 1fa67251456692273d8bfd84a680349c6e47b934 Mon Sep 17 00:00:00 2001 From: "lenz@mysql.com" <> Date: Wed, 13 Apr 2005 19:18:22 +0200 Subject: [PATCH 166/204] - removed more build tools that are now maintained seperately --- Build-tools/Do-hpux-depot | 85 ----------------- Build-tools/Do-solaris-pkg | 183 ------------------------------------- 2 files changed, 268 deletions(-) delete mode 100755 Build-tools/Do-hpux-depot delete mode 100644 Build-tools/Do-solaris-pkg diff --git a/Build-tools/Do-hpux-depot b/Build-tools/Do-hpux-depot deleted file mode 100755 index f7e8e2c020d..00000000000 --- a/Build-tools/Do-hpux-depot +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/perl - -# -# By Matt Wagner 2005 -# -# This script generates HP Depot packages for MySQL Server. -# It basically repackages a binary tarball as a depot. -# -# Usage: ./Do-hpux-depot -# - -$fullname = shift @ARGV; -$fullname or die "No package name was specified"; --d $fullname or die "That directory is not present!"; - -$fullname =~ s,/+$,,; # Remove ending slash if any - -chomp($pwd= `pwd`); - -%title= ( - "mysql-standard" => "MySQL Community Edition - Standard (GPL)", - "mysql-debug" => "MySQL Community Edition - Debug (GPL)", - "mysql-max" => "MySQL Community Edition - Experimental (GPL)", - "mysql-pro" => "MySQL Pro (Commercial)", - "mysql-classic" => "MySQL Classic (Commercial)", - "mysql-cluster" => "MySQL Cluster (Commercial)", -); - -%architecture= ( - "hpux11.23" => "HP-UX_B.11.23", - "hpux11.11" => "HP-UX_B.11.11", - "hpux11.00" => "HP-UX_B.11.00", -); - -%os_release= ( - "hpux11.23" => "?.11.2?", - "hpux11.11" => "?.11.1?", - "hpux11.00" => "?.11.0?", -); - -%machine_type= ( - "ia64" => "ia64*", - "hppa2.0w" => "9000/*", -); - -$fullname =~ m/^(mysql-\w+)-([\d\.]+)-hp-(hpux11\.\d\d)-(hppa2\.0w|(ia64))-?(64bit)?$/; - -# print "title: $1\n"; -# print "version: $2\n"; -# print "os: $3\n"; -# print "cpu: $4\n"; -# print "64: $6\n"; - -$cpu64= ($6 ne "") ? "_64" : ""; - -open (PSF,">${fullname}.psf") or die "Unable to write PSF file ($!)\n"; - -print PSF < $fullname.depot.gz\" -x target_type=tape -s ${pwd}/${fullname}.psf"); - diff --git a/Build-tools/Do-solaris-pkg b/Build-tools/Do-solaris-pkg deleted file mode 100644 index 22d68793808..00000000000 --- a/Build-tools/Do-solaris-pkg +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/perl -# -# Script to create Solaris packages -# -$INTERACTIVE= 0; -chomp ($hostname= `hostname`); -$find = "/usr/bin/find"; -$pkgproto = "/usr/bin/pkgproto"; -$pkgmk = "/usr/bin/pkgmk -o"; -$pkgtrans = "/usr/bin/pkgtrans"; -$temp = "/tmp/prototype$$"; -$prototype = "prototype"; -$pkginfo = "pkginfo"; -($gid ,$pkg ,$uid ,$userInfo ,$email ,$quota ,$group ,$passwd -,$category ,$userHome ,$vendor ,$loginShell ,$pstamp ,$basedir)=(); - -$tarball= $fullname= shift @ARGV; -$fullname=~ s/.*(mysql.*)\.tar\.gz/$1/; -$workdir= $$; -chomp ($parent_workdir= `pwd`); - -$hostname= ($fullname=~ m/^.+-64bit$/) ? $hostname . "-64bit" : $hostname; -$pkgdir= "$ENV{'HOME'}/$hostname"; - -mkdir $workdir or die "Can't make workdir: $!\n"; -chdir $workdir or die "Can't change to workdir: $!\n"; -system ("tar xzvf $tarball") == 0 or die "Can't untar: $!\n"; - -system ("$find . -print | $pkgproto > $temp"); -open (PREPROTO,"<$temp") or die "Unable to read prototype information ($!)\n"; -open (PROTO,">$prototype") or die "Unable to write file prototype ($!)\n"; -print PROTO "i pkginfo=./$pkginfo\n"; -while () { - # Read the prototype information from /tmp/prototype$$ - chomp; - $thisline = $_; - if ($thisline =~ " prototype " - or $thisline =~ " pkginfo ") { - # We don't need that line - } elsif ($thisline =~ "^[fd] ") { - # Change the ownership for files and directories - ($dir, $none, $file, $mode, $user, $group) = split / /,$thisline; - print PROTO "$dir $none $file $mode bin bin\n"; - } else { - # Symlinks and other stuff should be printed as well ofcourse - print PROTO "$thisline\n"; - } -} -close PROTO; -close PREPROTO; - -# Clean up -unlink $temp or warn "Unable to remove tempfile ($!)\n"; - -# Now we can start building the package -# -# First get some info -$fullname =~ s,/+$,,; # Remove ending slash if any - -$fullname =~ /^((mysql)(?:-\w+){1,3})-([\d\.]+\w?)-.+$/ - or die "This name is not what I expected - \"$fullname\""; - -$default{"name"}= $2; -$default{"version"}= $3; -$default{"pkg"}= $1; -$default{"arch"} = `uname -m`; -chomp $default{"arch"}; -$default{"category"}= "application"; -$default{"vendor"}= "MySQL AB"; -$default{"email"}= "build\@mysql.com"; -$default{"pstamp"}= "MySQL AB Build Engineers"; -$os = `uname -r`; -$os =~ '\.'; -$os = "sol$'"; -chomp $os; -$default{"basedir"}= "/usr/local"; -$default{"packagename"}= "${fullname}.pkg"; - -# Check for correctness of guessed values by userinput - -%questions = ( - pkg => "Please give the name for this package", - name => "Now enter the real name for this package", - arch => "What architecture did you build the package on?", - version => "Enter the version number of the package", - category => "What category does this package belong to?", - vendor => "Who is the vendor of this package?", - email => "Enter the email adress for contact", - pstamp => "Enter your own name", - basedir => "What is the basedir this package will install into?", - packagename => "How should I call the packagefile?", -); - -@vars = qw(pkg name arch version category vendor email pstamp basedir - packagename); -foreach $varname (@vars) { - getvar_noq($varname); -} - -if ($INTERACTIVE) { - while (!&chkvar()) { - print "\n"; - foreach $varname (@vars) { - getvar($varname); - } - @vars = qw(pkg name arch version category vendor email pstamp basedir - packagename); - } -} -$classes = "none"; - -# Create the pkginfo file - -print "\nNow creating $pkginfo file\n"; -open (PKGINFO,">$pkginfo") || die "Unable to open $pkginfo for writing ($!)\n"; -print PKGINFO "PKG=\"$pkg\"\n"; -print PKGINFO "NAME=\"$name\"\n"; -print PKGINFO "ARCH=\"$arch\"\n"; -print PKGINFO "VERSION=\"$version\"\n"; -print PKGINFO "CATEGORY=\"$category\"\n"; -print PKGINFO "VENDOR=\"$vendor\"\n"; -print PKGINFO "EMAIL=\"$email\"\n"; -print PKGINFO "PSTAMP=\"$pstamp\"\n"; -print PKGINFO "BASEDIR=\"$basedir\"\n"; -print PKGINFO "CLASSES=\"$classes\"\n"; -close PKGINFO; -print "Done.\n"; - -# Build and zip the package - -print "Building package\n"; -system ("$pkgmk -r `pwd`"); -system ("(cd /var/spool/pkg; $pkgtrans -s -o `pwd` /tmp/$packagename $pkg)"); -system ("gzip /tmp/$packagename"); - -# Clean-up the spool area -system ("(cd /var/spool/pkg; rm -rf $pkg)"); -# Clean-up the ~/packaging/ area -unlink $pkginfo; -unlink $prototype; -chdir $parent_workdir or die "Can't change to parent workdir '$parent_workdir': $!\n"; -system ("rm -rf $workdir") == 0 or die "Can't remove the working dir: $!\n"; -system ("mv /tmp/${packagename}.gz $pkgdir") == 0 or die "Can't move the finished package out of /tmp: $!\n"; -print "Done. (~/$hostname/$packagename.gz)\n"; -# The subroutines -sub chkvar { - print "\n"; - - print "PKG=$pkg\n"; - print "NAME=$name\n"; - print "ARCH=$arch\n"; - print "VERSION=$version\n"; - print "CATEGORY=$category\n"; - print "VENDOR=$vendor\n"; - print "EMAIL=$email\n"; - print "PSTAMP=$pstamp\n"; - print "BASEDIR=$basedir\n"; - print "PACKAGENAME=$packagename\n"; - - - print "\nIs this information correct? [Y/n]: "; - my $answer= ; - chomp $answer; - $answer= 'Y' if ($answer eq ""); - $answer= uc $answer; - my $res= ($answer eq 'Y')? 1 : 0; - return($res); -} - -sub getvar_noq { - my $questionname = "@_"; - $$questionname = $default{$questionname}; -} - -sub getvar { - my $questionname = "@_"; - my $ucquestionname= uc $questionname; - print "$ucquestionname: $questions{$questionname} [$default{\"$questionname\"}]: "; - my $answer = ; - chomp $answer; - $$questionname = $answer; - $$questionname = $default{$questionname} if ($$questionname eq ""); -} From b698b8620ea5cd5958f61fccbe56ac494604e5b5 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Wed, 13 Apr 2005 20:21:28 +0300 Subject: [PATCH 167/204] ha_innodb.cc: Fix part of bug #9670: if MySQL calls ::store_lock with TL_IGNORE, do not change prebuilt->select_lock_type; this fix may heal the assertion failures reported in UPDATE and multi-table UPDATE; it is not clear if this fixes the problems in OPTIMIZE TABLE --- sql/ha_innodb.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index bd2a5139021..6cb35fb392d 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -5320,7 +5320,8 @@ ha_innobase::store_lock( (lock_type == TL_READ_HIGH_PRIORITY && thd->in_lock_tables) || lock_type == TL_READ_WITH_SHARED_LOCKS || lock_type == TL_READ_NO_INSERT || - thd->lex->sql_command != SQLCOM_SELECT) { + (thd->lex->sql_command != SQLCOM_SELECT + && lock_type != TL_IGNORE)) { /* The OR cases above are in this order: 1) MySQL is doing LOCK TABLES ... READ LOCAL, or From c8225b62fd309648dee57ec44213a7adf0f19f0b Mon Sep 17 00:00:00 2001 From: "lenz@mysql.com" <> Date: Wed, 13 Apr 2005 19:50:54 +0200 Subject: [PATCH 168/204] - fixed a date for a changelog entry in the RPM spec file (s/Mar/Apr/) - RPM complains about wrongly ordered entries. --- support-files/mysql.spec.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh index 3ff5c5d67ad..8b880c32051 100644 --- a/support-files/mysql.spec.sh +++ b/support-files/mysql.spec.sh @@ -584,7 +584,7 @@ fi # itself - note that they must be ordered by date (important when # merging BK trees) %changelog -* Wed Mar 13 2005 Lenz Grimmer +* Wed Apr 13 2005 Lenz Grimmer - removed the MySQL manual files (html/ps/texi) - they have been removed from the MySQL sources and are now available seperately. From ced43177745f7103a9a341056f7ddcb415e3e4e4 Mon Sep 17 00:00:00 2001 From: "konstantin@mysql.com" <> Date: Wed, 13 Apr 2005 12:36:15 -0700 Subject: [PATCH 169/204] Allow SQLCOM_CALL in prepared mode. --- mysql-test/r/ps.result | 28 ++++++++++++++++++++++++++++ mysql-test/t/ps.test | 26 ++++++++++++++++++++++++++ sql/sql_prepare.cc | 1 + 3 files changed, 55 insertions(+) diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index 94972ea8721..bbd95da2f82 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -542,3 +542,31 @@ execute my_stmt; COUNT(*) 37 deallocate prepare my_stmt; +drop procedure if exists p1| +drop table if exists t1| +create table t1 (id int)| +insert into t1 values(1)| +create procedure p1(a int, b int) +begin +declare c int; +select max(id)+1 into c from t1; +insert into t1 select a+b; +insert into t1 select a-b; +insert into t1 select a-c; +end| +set @a= 3, @b= 4| +prepare stmt from "call p1(?, ?)"| +execute stmt using @a, @b| +execute stmt using @a, @b| +select * from t1| +id +1 +7 +-1 +1 +7 +-1 +-5 +deallocate prepare stmt| +drop procedure p1| +drop table t1| diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index 271d553e221..820fae12db0 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -561,3 +561,29 @@ while ($exec_loop_count) dec $exec_loop_count; } deallocate prepare my_stmt; + +# Test CALL in prepared mode +delimiter |; +--disable_warnings +drop procedure if exists p1| +drop table if exists t1| +--enable_warnings +create table t1 (id int)| +insert into t1 values(1)| +create procedure p1(a int, b int) +begin + declare c int; + select max(id)+1 into c from t1; + insert into t1 select a+b; + insert into t1 select a-b; + insert into t1 select a-c; +end| +set @a= 3, @b= 4| +prepare stmt from "call p1(?, ?)"| +execute stmt using @a, @b| +execute stmt using @a, @b| +select * from t1| +deallocate prepare stmt| +drop procedure p1| +drop table t1| +delimiter ;| diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 416105c6523..7c00299d482 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1654,6 +1654,7 @@ static int check_prepared_statement(Prepared_statement *stmt, case SQLCOM_DROP_INDEX: case SQLCOM_ROLLBACK: case SQLCOM_TRUNCATE: + case SQLCOM_CALL: break; default: From 75cfee68fb59fe0b2c5d4f7d3bb5f18d3a321060 Mon Sep 17 00:00:00 2001 From: "petr@mysql.com" <> Date: Thu, 14 Apr 2005 01:39:24 +0400 Subject: [PATCH 170/204] post review fix --- mysys/default.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/mysys/default.c b/mysys/default.c index 841a5f6004f..63323f15fd5 100644 --- a/mysys/default.c +++ b/mysys/default.c @@ -418,15 +418,16 @@ static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, /* trim trailing whitespace from directory name */ end= ptr + strlen(ptr) - 1; - /* - This would work fine even if no whitespaces are met - since fgets() stores the newline character in the buffer - */ - for (; my_isspace(&my_charset_latin1, *(end - 1)); end--) - {} - end[0]= 0; + /* fgets() stores the newline character in the buffer */ + if ((end[0] == '\n') || (end[0] == '\r') || + my_isspace(&my_charset_latin1, end[0])) + { + for (; my_isspace(&my_charset_latin1, *(end - 1)); end--) + {} + end[0]= 0; + } - /* print error msg if there is nothing after !inludedir directive */ + /* print error msg if there is nothing after !includedir directive */ if (end == ptr) { fprintf(stderr, @@ -444,7 +445,7 @@ static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, search_file= search_dir->dir_entry + i; ext= fn_ext(search_file->name); - /* check extenstion */ + /* check extension */ for (tmp_ext= (char**) f_extensions; *tmp_ext; *tmp_ext++) { if (!strcmp(ext, *tmp_ext)) @@ -496,6 +497,14 @@ static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, continue; } + else + if (recursion_level >= max_recursion_level) + { + fprintf(stderr, + "warning: skipping !include directive as maximum include" + "recursion level was reached in file %s at line %d\n", + name, line); + } if (*ptr == '[') /* Group name */ { From 47ab7c87851fa49495230927d4156ed0259fa5e5 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Wed, 13 Apr 2005 15:43:29 -0700 Subject: [PATCH 171/204] Don't allow the server to start up when an invalid user is specified via --user or in configuration. (Bug #9833) --- sql/mysqld.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b568b75fbad..115c21a95d8 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1165,6 +1165,7 @@ static struct passwd *check_user(const char *user) err: sql_print_error("Fatal error: Can't change to run as user '%s' ; Please check that the user exists!\n",user); + unireg_abort(1); #endif return NULL; } From 6632ed5ce75987d98ea05542d90e359d201aced0 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Wed, 13 Apr 2005 18:25:31 -0700 Subject: [PATCH 172/204] Check that the default storage engine is really available, and refuse to start up if it is not. (Bug #9815) --- sql/handler.cc | 14 ++++++++++++++ sql/handler.h | 1 + sql/mysqld.cc | 12 ++++++++++++ 3 files changed, 27 insertions(+) diff --git a/sql/handler.cc b/sql/handler.cc index b12032ccd81..7d8fc5d8110 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -145,6 +145,20 @@ const char *ha_get_storage_engine(enum db_type db_type) return "none"; } + +my_bool ha_storage_engine_is_enabled(enum db_type database_type) +{ + show_table_type_st *types; + for (types= sys_table_types; types->type; types++) + { + if ((database_type == types->db_type) && + (*types->value == SHOW_OPTION_YES)) + return TRUE; + } + return FALSE; +} + + /* Use other database handler if databasehandler is not incompiled */ enum db_type ha_checktype(enum db_type database_type) diff --git a/sql/handler.h b/sql/handler.h index 4c31da6a492..d2f77c4149a 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -542,6 +542,7 @@ int ha_init(void); int ha_panic(enum ha_panic_function flag); void ha_close_connection(THD* thd); enum db_type ha_checktype(enum db_type database_type); +my_bool ha_storage_engine_is_enabled(enum db_type database_type); int ha_create_table(const char *name, HA_CREATE_INFO *create_info, bool update_create_info); int ha_create_table_from_engine(THD* thd, const char *db, const char *name, diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b568b75fbad..41e3069a6c0 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -6435,6 +6435,18 @@ static void get_options(int argc,char **argv) sql_print_warning("this binary does not contain BDB storage engine"); #endif + /* + Check that the default storage engine is actually available. + */ + if (!ha_storage_engine_is_enabled((enum db_type) + global_system_variables.table_type)) + { + sql_print_error("Default storage engine (%s) is not available", + ha_get_storage_engine((enum db_type) + global_system_variables.table_type)); + exit(1); + } + if (argc > 0) { fprintf(stderr, "%s: Too many arguments (first extra is '%s').\nUse --help to get a list of available options\n", my_progname, *argv); From b622aba19ff40d708f916983cc74e5f6ad5f1026 Mon Sep 17 00:00:00 2001 From: "igor@rurik.mysql.com" <> Date: Wed, 13 Apr 2005 23:06:37 -0700 Subject: [PATCH 173/204] information_schema.result, information_schema.test: Added a test in connection with the fix for bug #6106. view.result, view.test: Added test cases for bugs #6106/6107. sql_show.cc: The addition of the case for items of the type REF_ITEM in the function uses_only_table_name_fields became necessary after the fix for bug #6106. sql_base.cc: The problem was due to the fact that two different column references were glued together though one of them belonged to a subquery while another to an outer query. This caused eventually a wrong calculation of values for the used_tables attribute. --- mysql-test/r/information_schema.result | 17 ++++++ mysql-test/r/view.result | 82 ++++++++++++++++++++++++++ mysql-test/t/information_schema.test | 5 ++ mysql-test/t/view.test | 62 +++++++++++++++++++ sql/sql_base.cc | 2 +- sql/sql_show.cc | 2 + 6 files changed, 169 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result index 0e75ebe9471..c53779582f1 100644 --- a/mysql-test/r/information_schema.result +++ b/mysql-test/r/information_schema.result @@ -68,6 +68,23 @@ t2 t3 v1 select c,table_name from v1 +inner join information_schema.TABLES v2 on (v1.c=v2.table_name) +where v1.c like "t%"; +c table_name +TABLES TABLES +TABLE_PRIVILEGES TABLE_PRIVILEGES +TABLE_CONSTRAINTS TABLE_CONSTRAINTS +tables_priv tables_priv +time_zone time_zone +time_zone_leap_second time_zone_leap_second +time_zone_name time_zone_name +time_zone_transition time_zone_transition +time_zone_transition_type time_zone_transition_type +t1 t1 +t4 t4 +t2 t2 +t3 t3 +select c,table_name from v1 left join information_schema.TABLES v2 on (v1.c=v2.table_name) where v1.c like "t%"; c table_name diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 417617c0e3c..bfbc1574149 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -1612,3 +1612,85 @@ insert into t3 select x from v1; insert into t2 select x from v1; drop view v1; drop table t1,t2,t3; +CREATE TABLE t1 (col1 int PRIMARY KEY, col2 varchar(10)); +INSERT INTO t1 VALUES(1,'trudy'); +INSERT INTO t1 VALUES(2,'peter'); +INSERT INTO t1 VALUES(3,'sanja'); +INSERT INTO t1 VALUES(4,'monty'); +INSERT INTO t1 VALUES(5,'david'); +INSERT INTO t1 VALUES(6,'kent'); +INSERT INTO t1 VALUES(7,'carsten'); +INSERT INTO t1 VALUES(8,'ranger'); +INSERT INTO t1 VALUES(10,'matt'); +CREATE TABLE t2 (col1 int, col2 int, col3 char(1)); +INSERT INTO t2 VALUES (1,1,'y'); +INSERT INTO t2 VALUES (1,2,'y'); +INSERT INTO t2 VALUES (2,1,'n'); +INSERT INTO t2 VALUES (3,1,'n'); +INSERT INTO t2 VALUES (4,1,'y'); +INSERT INTO t2 VALUES (4,2,'n'); +INSERT INTO t2 VALUES (4,3,'n'); +INSERT INTO t2 VALUES (6,1,'n'); +INSERT INTO t2 VALUES (8,1,'y'); +CREATE VIEW v1 AS SELECT * FROM t1; +SELECT a.col1,a.col2,b.col2,b.col3 +FROM t1 a LEFT JOIN t2 b ON a.col1=b.col1 +WHERE b.col2 IS NULL OR +b.col2=(SELECT MAX(col2) FROM t2 b WHERE b.col1=a.col1); +col1 col2 col2 col3 +1 trudy 2 y +2 peter 1 n +3 sanja 1 n +4 monty 3 n +5 david NULL NULL +6 kent 1 n +7 carsten NULL NULL +8 ranger 1 y +10 matt NULL NULL +SELECT a.col1,a.col2,b.col2,b.col3 +FROM v1 a LEFT JOIN t2 b ON a.col1=b.col1 +WHERE b.col2 IS NULL OR +b.col2=(SELECT MAX(col2) FROM t2 b WHERE b.col1=a.col1); +col1 col2 col2 col3 +1 trudy 2 y +2 peter 1 n +3 sanja 1 n +4 monty 3 n +5 david NULL NULL +6 kent 1 n +7 carsten NULL NULL +8 ranger 1 y +10 matt NULL NULL +CREATE VIEW v2 AS SELECT * FROM t2; +SELECT a.col1,a.col2,b.col2,b.col3 +FROM v2 b RIGHT JOIN v1 a ON a.col1=b.col1 +WHERE b.col2 IS NULL OR +b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1); +col1 col2 col2 col3 +1 trudy 2 y +2 peter 1 n +3 sanja 1 n +4 monty 3 n +5 david NULL NULL +6 kent 1 n +7 carsten NULL NULL +8 ranger 1 y +10 matt NULL NULL +SELECT a.col1,a.col2,b.col2,b.col3 +FROM v2 b RIGHT JOIN v1 a ON a.col1=b.col1 +WHERE a.col1 IN (1,5,9) AND +(b.col2 IS NULL OR +b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1)); +col1 col2 col2 col3 +1 trudy 2 y +5 david NULL NULL +CREATE VIEW v3 AS SELECT * FROM t1 WHERE col1 IN (1,5,9); +SELECT a.col1,a.col2,b.col2,b.col3 +FROM v2 b RIGHT JOIN v3 a ON a.col1=b.col1 +WHERE b.col2 IS NULL OR +b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1); +col1 col2 col2 col3 +1 trudy 2 y +5 david NULL NULL +DROP VIEW v1,v2,v3; +DROP TABLE t1,t2; diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test index 243c3ce6829..b4cc118c62f 100644 --- a/mysql-test/t/information_schema.test +++ b/mysql-test/t/information_schema.test @@ -24,6 +24,11 @@ create table t3(a int, KEY a_data (a)); create table mysqltest.t4(a int); create view v1 (c) as select table_name from information_schema.TABLES; select * from v1; + +select c,table_name from v1 +inner join information_schema.TABLES v2 on (v1.c=v2.table_name) +where v1.c like "t%"; + select c,table_name from v1 left join information_schema.TABLES v2 on (v1.c=v2.table_name) where v1.c like "t%"; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 8205680627d..0c3c81d0b89 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -1457,3 +1457,65 @@ insert into t3 select x from v1; insert into t2 select x from v1; drop view v1; drop table t1,t2,t3; + +# +# Test for BUG #6106: query over a view using subquery for the underlying table +# + +CREATE TABLE t1 (col1 int PRIMARY KEY, col2 varchar(10)); +INSERT INTO t1 VALUES(1,'trudy'); +INSERT INTO t1 VALUES(2,'peter'); +INSERT INTO t1 VALUES(3,'sanja'); +INSERT INTO t1 VALUES(4,'monty'); +INSERT INTO t1 VALUES(5,'david'); +INSERT INTO t1 VALUES(6,'kent'); +INSERT INTO t1 VALUES(7,'carsten'); +INSERT INTO t1 VALUES(8,'ranger'); +INSERT INTO t1 VALUES(10,'matt'); +CREATE TABLE t2 (col1 int, col2 int, col3 char(1)); +INSERT INTO t2 VALUES (1,1,'y'); +INSERT INTO t2 VALUES (1,2,'y'); +INSERT INTO t2 VALUES (2,1,'n'); +INSERT INTO t2 VALUES (3,1,'n'); +INSERT INTO t2 VALUES (4,1,'y'); +INSERT INTO t2 VALUES (4,2,'n'); +INSERT INTO t2 VALUES (4,3,'n'); +INSERT INTO t2 VALUES (6,1,'n'); +INSERT INTO t2 VALUES (8,1,'y'); + +CREATE VIEW v1 AS SELECT * FROM t1; + +SELECT a.col1,a.col2,b.col2,b.col3 + FROM t1 a LEFT JOIN t2 b ON a.col1=b.col1 + WHERE b.col2 IS NULL OR + b.col2=(SELECT MAX(col2) FROM t2 b WHERE b.col1=a.col1); + +SELECT a.col1,a.col2,b.col2,b.col3 + FROM v1 a LEFT JOIN t2 b ON a.col1=b.col1 + WHERE b.col2 IS NULL OR + b.col2=(SELECT MAX(col2) FROM t2 b WHERE b.col1=a.col1); + +CREATE VIEW v2 AS SELECT * FROM t2; + +SELECT a.col1,a.col2,b.col2,b.col3 + FROM v2 b RIGHT JOIN v1 a ON a.col1=b.col1 + WHERE b.col2 IS NULL OR + b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1); + +# Tests from the report for bug #6107 + +SELECT a.col1,a.col2,b.col2,b.col3 + FROM v2 b RIGHT JOIN v1 a ON a.col1=b.col1 + WHERE a.col1 IN (1,5,9) AND + (b.col2 IS NULL OR + b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1)); + +CREATE VIEW v3 AS SELECT * FROM t1 WHERE col1 IN (1,5,9); + +SELECT a.col1,a.col2,b.col2,b.col3 + FROM v2 b RIGHT JOIN v3 a ON a.col1=b.col1 + WHERE b.col2 IS NULL OR + b.col2=(SELECT MAX(col2) FROM v2 b WHERE b.col1=a.col1); + +DROP VIEW v1,v2,v3; +DROP TABLE t1,t2; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 145244f1c02..d79811aa4e2 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -3588,7 +3588,7 @@ int setup_conds(THD *thd, TABLE_LIST *tables, TABLE_LIST *leaves, COND **conds) thd->set_query_id=1; - thd->lex->current_select->no_wrap_view_item= 1; + thd->lex->current_select->no_wrap_view_item= 0; select_lex->cond_count= 0; if (*conds) { diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 8b906f133ba..d6027699257 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1704,6 +1704,8 @@ bool uses_only_table_name_fields(Item *item, TABLE_LIST *table) strlen(item_field->field_name), 0))) return 0; } + else if (item->type() == Item::REF_ITEM) + return uses_only_table_name_fields(item->real_item(), table); if (item->type() == Item::SUBSELECT_ITEM && !item->const_item()) return 0; From c7a6c8de06340f019e32a06ccf0daa3fed4b31e4 Mon Sep 17 00:00:00 2001 From: "ramil@mysql.com" <> Date: Thu, 14 Apr 2005 11:13:08 +0500 Subject: [PATCH 174/204] In order not to conflict with a Linux kernel header set_bit replaced with internal_set_bit, clear_bit replaced with internal_clear_bit. --- client/mysqltest.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/client/mysqltest.c b/client/mysqltest.c index 2ec07692a4d..14e401f1708 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -2872,8 +2872,8 @@ static REP_SET *make_new_set(REP_SETS *sets); static void make_sets_invisible(REP_SETS *sets); static void free_last_set(REP_SETS *sets); static void free_sets(REP_SETS *sets); -static void set_bit(REP_SET *set, uint bit); -static void clear_bit(REP_SET *set, uint bit); +static void internal_set_bit(REP_SET *set, uint bit); +static void internal_clear_bit(REP_SET *set, uint bit); static void or_bits(REP_SET *to,REP_SET *from); static void copy_bits(REP_SET *to,REP_SET *from); static int cmp_bits(REP_SET *set1,REP_SET *set2); @@ -2950,7 +2950,7 @@ REPLACE *init_replace(my_string *from, my_string *to,uint count, { if (from[i][0] == '\\' && from[i][1] == '^') { - set_bit(start_states,states+1); + internal_set_bit(start_states,states+1); if (!from[i][2]) { start_states->table_offset=i; @@ -2959,8 +2959,8 @@ REPLACE *init_replace(my_string *from, my_string *to,uint count, } else if (from[i][0] == '\\' && from[i][1] == '$') { - set_bit(start_states,states); - set_bit(word_states,states); + internal_set_bit(start_states,states); + internal_set_bit(word_states,states); if (!from[i][2] && start_states->table_offset == (uint) ~0) { start_states->table_offset=i; @@ -2969,11 +2969,11 @@ REPLACE *init_replace(my_string *from, my_string *to,uint count, } else { - set_bit(word_states,states); + internal_set_bit(word_states,states); if (from[i][0] == '\\' && (from[i][1] == 'b' && from[i][2])) - set_bit(start_states,states+1); + internal_set_bit(start_states,states+1); else - set_bit(start_states,states); + internal_set_bit(start_states,states); } for (pos=from[i], len=0; *pos ; pos++) { @@ -3079,9 +3079,9 @@ REPLACE *init_replace(my_string *from, my_string *to,uint count, follow[i].len > found_end) found_end=follow[i].len; if (chr && follow[i].chr) - set_bit(new_set,i+1); /* To next set */ + internal_set_bit(new_set,i+1); /* To next set */ else - set_bit(new_set,i); + internal_set_bit(new_set,i); } } if (found_end) @@ -3098,7 +3098,7 @@ REPLACE *init_replace(my_string *from, my_string *to,uint count, if (follow[bit_nr-1].len < found_end || (new_set->found_len && (chr == 0 || !follow[bit_nr].chr))) - clear_bit(new_set,i); + internal_clear_bit(new_set,i); else { if (chr == 0 || !follow[bit_nr].chr) @@ -3247,13 +3247,13 @@ static void free_sets(REP_SETS *sets) return; } -static void set_bit(REP_SET *set, uint bit) +static void internal_set_bit(REP_SET *set, uint bit) { set->bits[bit / WORD_BIT] |= 1 << (bit % WORD_BIT); return; } -static void clear_bit(REP_SET *set, uint bit) +static void internal_clear_bit(REP_SET *set, uint bit) { set->bits[bit / WORD_BIT] &= ~ (1 << (bit % WORD_BIT)); return; From 7731e5f4cf2ad718a9ebc9a6cfd15ee5160df90f Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Thu, 14 Apr 2005 11:12:12 +0300 Subject: [PATCH 175/204] ha_innodb.cc: Add a big fat warning for future programmers that MySQL may call ::store_lock() also with lock 'type' TL_IGNORE; my ignorance of this caused bug 9670 --- sql/ha_innodb.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index eed515b30d2..4f640242297 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -6128,10 +6128,15 @@ ha_innobase::store_lock( of current handle is stored next to this array */ enum thr_lock_type lock_type) /* in: lock type to store in - 'lock' */ + 'lock'; this may also be + TL_IGNORE */ { row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; + /* NOTE: MySQL can call this function with lock 'type' TL_IGNORE! + Be careful to ignore TL_IGNORE if we are going to do something with + only 'real' locks! */ + if ((lock_type == TL_READ && thd->in_lock_tables) || (lock_type == TL_READ_HIGH_PRIORITY && thd->in_lock_tables) || lock_type == TL_READ_WITH_SHARED_LOCKS || @@ -6180,10 +6185,6 @@ ha_innobase::store_lock( } else if (lock_type != TL_IGNORE) { - /* In ha_berkeley.cc there is a comment that MySQL - may in exceptional cases call this with TL_IGNORE also - when it is NOT going to release the lock. */ - /* We set possible LOCK_X value in external_lock, not yet here even if this would be SELECT ... FOR UPDATE */ @@ -6214,7 +6215,7 @@ ha_innobase::store_lock( lock_type = TL_READ; } - lock.type=lock_type; + lock.type = lock_type; } *to++= &lock; From b2dbaea39416cfb57ad73db2f72b1d1b86036e5a Mon Sep 17 00:00:00 2001 From: "ramil@mysql.com" <> Date: Thu, 14 Apr 2005 14:32:25 +0500 Subject: [PATCH 176/204] Bit type: fix for create_field::create_field(). --- mysql-test/r/type_bit_innodb.result | 22 ++++++++++++++++++++++ mysql-test/t/type_bit_innodb.test | 12 ++++++++++++ sql/field.cc | 4 +++- sql/field.h | 3 +-- 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/mysql-test/r/type_bit_innodb.result b/mysql-test/r/type_bit_innodb.result index 57068f6502a..f3e9dad3baa 100644 --- a/mysql-test/r/type_bit_innodb.result +++ b/mysql-test/r/type_bit_innodb.result @@ -380,3 +380,25 @@ drop table t1; create table t1(a int, b bit not null) engine=innodb; alter table t1 add primary key (a); drop table t1; +create table t1 (a bit, b bit(10)) engine=innodb; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bit(1) default NULL, + `b` bit(10) default NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +alter table t1 engine=heap; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bit(1) default NULL, + `b` bit(10) default NULL +) ENGINE=MEMORY DEFAULT CHARSET=latin1 +alter table t1 engine=innodb; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bit(1) default NULL, + `b` bit(10) default NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +drop table t1; diff --git a/mysql-test/t/type_bit_innodb.test b/mysql-test/t/type_bit_innodb.test index 6410b98fcd0..693fc169717 100644 --- a/mysql-test/t/type_bit_innodb.test +++ b/mysql-test/t/type_bit_innodb.test @@ -121,3 +121,15 @@ drop table t1; create table t1(a int, b bit not null) engine=innodb; alter table t1 add primary key (a); drop table t1; + +# +# altering tables +# + +create table t1 (a bit, b bit(10)) engine=innodb; +show create table t1; +alter table t1 engine=heap; +show create table t1; +alter table t1 engine=innodb; +show create table t1; +drop table t1; diff --git a/sql/field.cc b/sql/field.cc index ea551f410b7..00f729d5b07 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -8358,7 +8358,9 @@ create_field::create_field(Field *old_field,Field *orig_field) break; #endif case FIELD_TYPE_BIT: - length= ((Field_bit *) old_field)->bit_len + length * 8; + length= (old_field->key_type() == HA_KEYTYPE_BIT) ? + ((Field_bit *) old_field)->bit_len + length * 8 : + ((Field_bit_as_char *) old_field)->create_length; break; default: break; diff --git a/sql/field.h b/sql/field.h index 6a1a7af194e..22787850442 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1313,9 +1313,8 @@ public: class Field_bit_as_char: public Field_bit { -protected: - uchar create_length; public: + uchar create_length; Field_bit_as_char(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, uchar *bit_ptr_arg, uchar bit_ofs_arg, enum utype unireg_check_arg, const char *field_name_arg, From f1496eb6f774072b129da11eef4009ecf3cb6ae9 Mon Sep 17 00:00:00 2001 From: "msvensson@neptunus.(none)" <> Date: Thu, 14 Apr 2005 11:56:13 +0200 Subject: [PATCH 177/204] BUG#9455 mysqladmin status crash the server - Send error to client when mysql_change_db fails. --- sql/sql_db.cc | 3 +++ sql/sql_parse.cc | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 1f345a28d2c..3bdd800cd2f 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -1009,6 +1009,9 @@ err: replication slave SQL thread (for that thread, setting of thd->db is done in ::exec_event() methods of log_event.cc). + This function does not send the error message to the client, if that + should be sent to the client, call net_send_error after this function + RETURN VALUES 0 ok 1 error diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 851be2b3434..bef35dcfd0d 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -260,13 +260,15 @@ int check_user(THD *thd, enum enum_server_command command, #ifdef NO_EMBEDDED_ACCESS_CHECKS thd->master_access= GLOBAL_ACLS; // Full rights - /* Change database if necessary: OK or FAIL is sent in mysql_change_db */ + /* Change database if necessary */ if (db && db[0]) { thd->db= 0; thd->db_length= 0; if (mysql_change_db(thd, db)) { + /* Send the error to the client */ + net_send_error(thd); if (thd->user_connect) decrease_user_connections(thd->user_connect); DBUG_RETURN(-1); @@ -395,11 +397,13 @@ int check_user(THD *thd, enum enum_server_command command, check_for_max_user_connections(thd, thd->user_connect)) DBUG_RETURN(-1); - /* Change database if necessary: OK or FAIL is sent in mysql_change_db */ + /* Change database if necessary */ if (db && db[0]) { if (mysql_change_db(thd, db)) { + /* Send error to the client */ + net_send_error(thd); if (thd->user_connect) decrease_user_connections(thd->user_connect); DBUG_RETURN(-1); From 6aad6835c62d4bdb03047ee10f7864c73942bc1f Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Thu, 14 Apr 2005 14:52:35 +0200 Subject: [PATCH 178/204] Fixed BUG#9598: stored procedure call within stored procedure overwrites IN variable and added error checking of variables for [IN]OUT parameters while rewriting the out parameter handling. --- mysql-test/r/sp-error.result | 26 +++++++++-- mysql-test/r/sp.result | 28 ++++++++++++ mysql-test/t/sp-error.test | 25 +++++++++++ mysql-test/t/sp.test | 32 ++++++++++++++ sql/item.h | 4 ++ sql/share/errmsg.txt | 2 + sql/sp_head.cc | 86 +++++++++++++++++++----------------- sql/sp_rcontext.cc | 1 - sql/sp_rcontext.h | 13 ------ 9 files changed, 159 insertions(+), 58 deletions(-) diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result index b9d33bbe606..3f224d790f7 100644 --- a/mysql-test/r/sp-error.result +++ b/mysql-test/r/sp-error.result @@ -125,13 +125,13 @@ set @x = x| create function f(x int) returns int return x+42| call p()| -ERROR 42000: Incorrect number of arguments for PROCEDURE p; expected 1, got 0 +ERROR 42000: Incorrect number of arguments for PROCEDURE test.p; expected 1, got 0 call p(1, 2)| -ERROR 42000: Incorrect number of arguments for PROCEDURE p; expected 1, got 2 +ERROR 42000: Incorrect number of arguments for PROCEDURE test.p; expected 1, got 2 select f()| -ERROR 42000: Incorrect number of arguments for FUNCTION f; expected 1, got 0 +ERROR 42000: Incorrect number of arguments for FUNCTION test.f; expected 1, got 0 select f(1, 2)| -ERROR 42000: Incorrect number of arguments for FUNCTION f; expected 1, got 2 +ERROR 42000: Incorrect number of arguments for FUNCTION test.f; expected 1, got 2 drop procedure p| drop function f| create procedure p(val int, out res int) @@ -318,6 +318,24 @@ select field from t1; label L1; end| ERROR HY000: GOTO is not allowed in a stored procedure handler +drop procedure if exists p| +create procedure p(in x int, inout y int, out z int) +begin +set y = x+y; +set z = x+y; +end| +set @tmp_x = 42| +set @tmp_y = 3| +set @tmp_z = 0| +call p(@tmp_x, @tmp_y, @tmp_z)| +select @tmp_x, @tmp_y, @tmp_z| +@tmp_x @tmp_y @tmp_z +42 45 87 +call p(42, 43, @tmp_z)| +ERROR 42000: OUT or INOUT argument 2 for routine test.p is not a variable +call p(42, @tmp_y, 43)| +ERROR 42000: OUT or INOUT argument 3 for routine test.p is not a variable +drop procedure p| create procedure bug1965() begin declare c cursor for select val from t1 order by valname; diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index cac847fd602..99d5e82a83b 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -2908,4 +2908,32 @@ v/10 10.00000 drop procedure bug9674_1| drop procedure bug9674_2| +drop procedure if exists bug9598_1| +drop procedure if exists bug9598_2| +create procedure bug9598_1(in var_1 char(16), +out var_2 integer, out var_3 integer) +begin +set var_2 = 50; +set var_3 = 60; +end| +create procedure bug9598_2(in v1 char(16), +in v2 integer, +in v3 integer, +in v4 integer, +in v5 integer) +begin +select v1,v2,v3,v4,v5; +call bug9598_1(v1,@tmp1,@tmp2); +select v1,v2,v3,v4,v5; +end| +call bug9598_2('Test',2,3,4,5)| +v1 v2 v3 v4 v5 +Test 2 3 4 5 +v1 v2 v3 v4 v5 +Test 2 3 4 5 +select @tmp1, @tmp2| +@tmp1 @tmp2 +50 60 +drop procedure bug9598_1| +drop procedure bug9598_2| drop table t1,t2; diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test index a02d2ff6733..ecbc98f86e9 100644 --- a/mysql-test/t/sp-error.test +++ b/mysql-test/t/sp-error.test @@ -410,6 +410,31 @@ begin label L1; end| +# Check in and inout arguments. +--disable_warnings +drop procedure if exists p| +--enable_warnings +create procedure p(in x int, inout y int, out z int) +begin + set y = x+y; + set z = x+y; +end| + +set @tmp_x = 42| +set @tmp_y = 3| +set @tmp_z = 0| +# For reference: this is ok +call p(@tmp_x, @tmp_y, @tmp_z)| +select @tmp_x, @tmp_y, @tmp_z| + +--error ER_SP_NOT_VAR_ARG +call p(42, 43, @tmp_z)| +--error ER_SP_NOT_VAR_ARG +call p(42, @tmp_y, 43)| + +drop procedure p| + + # # BUG#1965 # diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 866db5c0191..ad6f5406a16 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3571,6 +3571,38 @@ drop procedure bug9674_1| drop procedure bug9674_2| +# +# BUG#9598: stored procedure call within stored procedure overwrites IN variable +# +--disable_warnings +drop procedure if exists bug9598_1| +drop procedure if exists bug9598_2| +--enable_warnings +create procedure bug9598_1(in var_1 char(16), + out var_2 integer, out var_3 integer) +begin + set var_2 = 50; + set var_3 = 60; +end| + +create procedure bug9598_2(in v1 char(16), + in v2 integer, + in v3 integer, + in v4 integer, + in v5 integer) +begin + select v1,v2,v3,v4,v5; + call bug9598_1(v1,@tmp1,@tmp2); + select v1,v2,v3,v4,v5; +end| + +call bug9598_2('Test',2,3,4,5)| +select @tmp1, @tmp2| + +drop procedure bug9598_1| +drop procedure bug9598_2| + + # # BUG#NNNN: New bug synopsis # diff --git a/sql/item.h b/sql/item.h index f4ca292e574..f7bb98bb8ad 100644 --- a/sql/item.h +++ b/sql/item.h @@ -545,6 +545,8 @@ public: cleanup(); delete this; } + + virtual bool is_splocal() { return 0; } /* Needed for error checking */ }; @@ -564,6 +566,8 @@ public: Item::maybe_null= TRUE; } + bool is_splocal() { return 1; } /* Needed for error checking */ + Item *this_item(); Item *this_const_item() const; diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index 95fb1736741..e93229a4a3e 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -5340,3 +5340,5 @@ ER_TABLE_DEF_CHANGED eng "Table definition has changed, please retry transaction" ER_SP_DUP_HANDLER 42000 eng "Duplicate handler declared in the same block" +ER_SP_NOT_VAR_ARG 42000 + eng "OUT or INOUT argument %d for routine %s is not a variable" diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 63f67959f33..0fe9c449540 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -638,7 +638,7 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp) // Need to use my_printf_error here, or it will not terminate the // invoking query properly. my_error(ER_SP_WRONG_NO_OF_ARGS, MYF(0), - "FUNCTION", m_name.str, params, argcount); + "FUNCTION", m_qname.str, params, argcount); DBUG_RETURN(-1); } @@ -691,6 +691,19 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp) DBUG_RETURN(ret); } +static Item_func_get_user_var * +item_is_user_var(Item *it) +{ + if (it->type() == Item::FUNC_ITEM) + { + Item_func *fi= static_cast(it); + + if (fi->functype() == Item_func::GUSERVAR_FUNC) + return static_cast(fi); + } + return NULL; +} + int sp_head::execute_procedure(THD *thd, List *args) { @@ -708,7 +721,7 @@ sp_head::execute_procedure(THD *thd, List *args) if (args->elements != params) { my_error(ER_SP_WRONG_NO_OF_ARGS, MYF(0), "PROCEDURE", - m_name.str, params, args->elements); + m_qname.str, params, args->elements); DBUG_RETURN(-1); } @@ -728,12 +741,19 @@ sp_head::execute_procedure(THD *thd, List *args) // QQ: Should do type checking? for (i = 0 ; (it= li++) && i < params ; i++) { - sp_pvar_t *pvar = m_pcont->find_pvar(i); + sp_pvar_t *pvar= m_pcont->find_pvar(i); - if (! pvar) - nctx->set_oindex(i, -1); // Shouldn't happen - else + if (pvar) { + if (pvar->mode != sp_param_in) + { + if (!it->is_splocal() && !item_is_user_var(it)) + { + my_error(ER_SP_NOT_VAR_ARG, MYF(0), i+1, m_qname.str); + ret= -1; + break; + } + } if (pvar->mode == sp_param_out) { if (! nit) @@ -742,7 +762,7 @@ sp_head::execute_procedure(THD *thd, List *args) } else { - Item *it2= sp_eval_func_item(thd, it,pvar->type); + Item *it2= sp_eval_func_item(thd, it, pvar->type); if (it2) nctx->push_item(it2); // IN or INOUT @@ -752,13 +772,6 @@ sp_head::execute_procedure(THD *thd, List *args) break; } } - // Note: If it's OUT or INOUT, it must be a variable. - // QQ: We can check for global variables here, or should we do it - // while parsing? - if (pvar->mode == sp_param_in) - nctx->set_oindex(i, -1); // IN - else // OUT or INOUT - nctx->set_oindex(i, static_cast(it)->get_offset()); } } @@ -786,38 +799,31 @@ sp_head::execute_procedure(THD *thd, List *args) // set global user variables for (uint i = 0 ; (it= li++) && i < params ; i++) { - int oi = nctx->get_oindex(i); + sp_pvar_t *pvar= m_pcont->find_pvar(i); - if (oi >= 0) + if (pvar->mode != sp_param_in) { - if (! tmp_octx) - octx->set_item(nctx->get_oindex(i), nctx->get_item(i)); + if (it->is_splocal()) + octx->set_item(static_cast(it)->get_offset(), + nctx->get_item(i)); else { - // QQ Currently we just silently ignore non-user-variable arguments. - // We should check this during parsing, when setting up the call - // above - if (it->type() == Item::FUNC_ITEM) + Item_func_get_user_var *guv= item_is_user_var(it); + + if (guv) { - Item_func *fi= static_cast(it); + Item *item= nctx->get_item(i); + Item_func_set_user_var *suv; - if (fi->functype() == Item_func::GUSERVAR_FUNC) - { // A global user variable - Item *item= nctx->get_item(i); - Item_func_set_user_var *suv; - Item_func_get_user_var *guv= - static_cast(fi); - - suv= new Item_func_set_user_var(guv->get_name(), item); - /* - we do not check suv->fixed, because it can't be fixed after - creation - */ - suv->fix_fields(thd, NULL, &item); - suv->fix_length_and_dec(); - suv->check(); - suv->update(); - } + suv= new Item_func_set_user_var(guv->get_name(), item); + /* + we do not check suv->fixed, because it can't be fixed after + creation + */ + suv->fix_fields(thd, NULL, &item); + suv->fix_length_and_dec(); + suv->check(); + suv->update(); } } } diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc index d98cdfdd226..def38009eee 100644 --- a/sql/sp_rcontext.cc +++ b/sql/sp_rcontext.cc @@ -34,7 +34,6 @@ sp_rcontext::sp_rcontext(uint fsize, uint hmax, uint cmax) { in_handler= FALSE; m_frame= (Item **)sql_alloc(fsize * sizeof(Item*)); - m_outs= (int *)sql_alloc(fsize * sizeof(int)); m_handler= (sp_handler_t *)sql_alloc(hmax * sizeof(sp_handler_t)); m_hstack= (uint *)sql_alloc(hmax * sizeof(uint)); m_cstack= (sp_cursor **)sql_alloc(cmax * sizeof(sp_cursor *)); diff --git a/sql/sp_rcontext.h b/sql/sp_rcontext.h index 37d718048a0..afcd937a369 100644 --- a/sql/sp_rcontext.h +++ b/sql/sp_rcontext.h @@ -82,18 +82,6 @@ class sp_rcontext : public Sql_alloc return m_frame[idx]; } - inline void - set_oindex(uint idx, int oidx) - { - m_outs[idx] = oidx; - } - - inline int - get_oindex(uint idx) - { - return m_outs[idx]; - } - inline void set_result(Item *it) { @@ -187,7 +175,6 @@ private: uint m_count; uint m_fsize; Item **m_frame; - int *m_outs; Item *m_result; // For FUNCTIONs From 533e0551f20afb356936c2ecd966721c911d688e Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Thu, 14 Apr 2005 18:14:54 +0200 Subject: [PATCH 179/204] TRUNCATE is always a transaction on itself. pretent we're in auto-commit mode bug#8151 --- mysql-test/r/innodb.result | 1 + mysql-test/t/innodb.test | 1 + sql/sql_delete.cc | 8 ++++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index c282ec68c78..f00679801f8 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -821,6 +821,7 @@ truncate table t1; Can't execute the given command because you have active locked tables or an active transaction commit; truncate table t1; +truncate table t1; select * from t1; a insert into t1 values(1),(2); diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test index 34eabcc22df..2c8002ea841 100644 --- a/mysql-test/t/innodb.test +++ b/mysql-test/t/innodb.test @@ -528,6 +528,7 @@ insert into t1 values(1),(2); truncate table t1; commit; truncate table t1; +truncate table t1; select * from t1; insert into t1 values(1),(2); delete from t1; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 475df34dc4f..166a0e130e3 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -590,8 +590,12 @@ int mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) { /* Probably InnoDB table */ table_list->lock_type= TL_WRITE; - DBUG_RETURN(mysql_delete(thd, table_list, (COND*) 0, (ORDER*) 0, - HA_POS_ERROR, 0)); + ulong save_options= thd->options; + thd->options&= ~(ulong) (OPTION_BEGIN | OPTION_NOT_AUTOCOMMIT); + int res= mysql_delete(thd, table_list, (COND*) 0, (ORDER*) 0, + HA_POS_ERROR, 0); + thd->options= save_options; + DBUG_RETURN(res); } if (lock_and_wait_for_table_name(thd, table_list)) DBUG_RETURN(-1); From a1f7f57be9b1dec193d02415a6524e2d54c8a8dd Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Thu, 14 Apr 2005 22:27:15 +0300 Subject: [PATCH 180/204] fil0fil.c: Add fault tolerance in the scan of .ibd files at a crash recovery; formerly a single failure of readdir_get_next caused the rest of the directory to be skipped --- innobase/fil/fil0fil.c | 70 ++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 19 deletions(-) diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c index 0f5941ca0d9..773bd709fb7 100644 --- a/innobase/fil/fil0fil.c +++ b/innobase/fil/fil0fil.c @@ -2924,6 +2924,44 @@ func_exit: mem_free(filepath); } +/*************************************************************************** +A fault-tolerant function that tries to read the next file name in the +directory. We retry 100 times if os_file_readdir_next_file() returns -1. The +idea is to read as much good data as we can and jump over bad data. */ +static +int +fil_file_readdir_next_file( +/*=======================*/ + /* out: 0 if ok, -1 if error even after the + retries, 1 if at the end of the directory */ + ulint* err, /* out: this is set to DB_ERROR if an error + was encountered, otherwise not changed */ + const char* dirname,/* in: directory name or path */ + os_file_dir_t dir, /* in: directory stream */ + os_file_stat_t* info) /* in/out: buffer where the info is returned */ +{ + ulint i; + int ret; + + for (i = 0; i < 100; i++) { + ret = os_file_readdir_next_file(dirname, dir, info); + + if (ret != -1) { + + return(ret); + } + + fprintf(stderr, +"InnoDB: Error: os_file_readdir_next_file() returned -1 in\n" +"InnoDB: directory %s\n" +"InnoDB: Crash recovery may have failed for some .ibd files!\n", dirname); + + *err = DB_ERROR; + } + + return(-1); +} + /************************************************************************ At the server startup, if we need crash recovery, scans the database directories under the MySQL datadir, looking for .ibd files. Those files are @@ -2944,6 +2982,7 @@ fil_load_single_table_tablespaces(void) os_file_dir_t dbdir; os_file_stat_t dbinfo; os_file_stat_t fileinfo; + ulint err = DB_SUCCESS; /* The datadir of MySQL is always the default directory of mysqld */ @@ -2959,7 +2998,7 @@ fil_load_single_table_tablespaces(void) /* Scan all directories under the datadir. They are the database directories of MySQL. */ - ret = os_file_readdir_next_file(fil_path_to_mysql_datadir, dir, + ret = fil_file_readdir_next_file(&err, fil_path_to_mysql_datadir, dir, &dbinfo); while (ret == 0) { ulint len; @@ -2997,7 +3036,7 @@ fil_load_single_table_tablespaces(void) /* We found a database directory; loop through it, looking for possible .ibd files in it */ - ret = os_file_readdir_next_file(dbpath, dbdir, + ret = fil_file_readdir_next_file(&err, dbpath, dbdir, &fileinfo); while (ret == 0) { /* printf( @@ -3019,36 +3058,29 @@ fil_load_single_table_tablespaces(void) dbinfo.name, fileinfo.name); } next_file_item: - ret = os_file_readdir_next_file(dbpath, dbdir, + ret = fil_file_readdir_next_file(&err, + dbpath, dbdir, &fileinfo); } if (0 != os_file_closedir(dbdir)) { - fputs( + fputs( "InnoDB: Warning: could not close database directory ", stderr); - ut_print_filename(stderr, dbpath); - putc('\n', stderr); + ut_print_filename(stderr, dbpath); + putc('\n', stderr); + + err = DB_ERROR; } } next_datadir_item: - ret = os_file_readdir_next_file(fil_path_to_mysql_datadir, + ret = fil_file_readdir_next_file(&err, + fil_path_to_mysql_datadir, dir, &dbinfo); } mem_free(dbpath); - /* At the end of directory we should get 1 as the return value, -1 - if there was an error */ - if (ret != 1) { - fprintf(stderr, -"InnoDB: Error: os_file_readdir_next_file returned %d in MySQL datadir\n", - ret); - os_file_closedir(dir); - - return(DB_ERROR); - } - if (0 != os_file_closedir(dir)) { fprintf(stderr, "InnoDB: Error: could not close MySQL datadir\n"); @@ -3056,7 +3088,7 @@ next_datadir_item: return(DB_ERROR); } - return(DB_SUCCESS); + return(err); } /************************************************************************ From 06c5e43c5616b4c77bd76738cbba2008eb0826f7 Mon Sep 17 00:00:00 2001 From: "konstantin@mysql.com" <> Date: Thu, 14 Apr 2005 15:14:34 -0700 Subject: [PATCH 181/204] A test case for Bug#4956 (decimal -> string conversion problem) --- mysql-test/r/type_decimal.result | 16 ++++++++++++++++ mysql-test/t/type_decimal.test | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/mysql-test/r/type_decimal.result b/mysql-test/r/type_decimal.result index 6a0c0090e79..a01f8ee08a1 100644 --- a/mysql-test/r/type_decimal.result +++ b/mysql-test/r/type_decimal.result @@ -748,3 +748,19 @@ HAVING a <> b; i a b 6 -51.40 0.00 drop table t1; +create table t1 (c1 varchar(100), c2 longtext); +insert into t1 set c1= 'non PS, 1.0 as constant', c2=1.0; +prepare stmt from "insert into t1 set c1='PS, 1.0 as constant ', c2=1.0"; +execute stmt; +set @a=1.0; +insert into t1 set c1='non PS, 1.0 in parameter', c2=@a; +prepare stmt from "insert into t1 set c1='PS, 1.0 in parameter ', c2=?"; +execute stmt using @a; +select * from t1; +c1 c2 +non PS, 1.0 as constant 1.0 +PS, 1.0 as constant 1.0 +non PS, 1.0 in parameter 1.0 +PS, 1.0 in parameter 1.0 +deallocate prepare stmt; +drop table t1; diff --git a/mysql-test/t/type_decimal.test b/mysql-test/t/type_decimal.test index 3205eabe01a..107f4a06ec5 100644 --- a/mysql-test/t/type_decimal.test +++ b/mysql-test/t/type_decimal.test @@ -326,3 +326,20 @@ SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1 GROUP BY i HAVING a <> b; SELECT i, ROUND(SUM(d1), 2) AS a, ROUND(SUM(d2), 2) AS b FROM t1 GROUP BY i HAVING a <> b; drop table t1; + +# +# A test case for Bug#4956 "strange result, insert into longtext, parameter +# with numeric value": ensure that conversion is done identically no matter +# where the input data comes from. +# +create table t1 (c1 varchar(100), c2 longtext); +insert into t1 set c1= 'non PS, 1.0 as constant', c2=1.0; +prepare stmt from "insert into t1 set c1='PS, 1.0 as constant ', c2=1.0"; +execute stmt; +set @a=1.0; +insert into t1 set c1='non PS, 1.0 in parameter', c2=@a; +prepare stmt from "insert into t1 set c1='PS, 1.0 in parameter ', c2=?"; +execute stmt using @a; +select * from t1; +deallocate prepare stmt; +drop table t1; From 5e581186a47de8d2d562b83106436c597fb37310 Mon Sep 17 00:00:00 2001 From: "jimw@mysql.com" <> Date: Thu, 14 Apr 2005 17:22:18 -0700 Subject: [PATCH 182/204] Fix mysql.server.sh to use shell functions as replacement for LSB init functions when they aren't available. (Bug #9852) --- support-files/mysql.server.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh index 376d9051b10..f9015824e6b 100644 --- a/support-files/mysql.server.sh +++ b/support-files/mysql.server.sh @@ -61,8 +61,14 @@ lsb_functions="/lib/lsb/init-functions" if test -f $lsb_functions ; then source $lsb_functions else - alias log_success_msg="echo \ SUCCESS! " - alias log_failure_msg="echo \ ERROR! " + log_success_msg() + { + echo " SUCCESS! $@" + } + log_failure_msg() + { + echo " ERROR! $@" + } fi PATH=/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin From 303af4052ea7d16d0ff10983fed7180cba77029d Mon Sep 17 00:00:00 2001 From: "konstantin@mysql.com" <> Date: Thu, 14 Apr 2005 17:47:48 -0700 Subject: [PATCH 183/204] Add a comment to update_ref_and_keys --- sql/sql_select.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 8031a99f4d1..a54294f00c0 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3161,10 +3161,14 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, } /* - Special treatment for ft-keys. - Remove the following things from KEYUSE: + Sort the array of possible keys and remove the following key parts: - ref if there is a keypart which is a ref and a const. - - keyparts without previous keyparts. + (e.g. if there is a key(a,b) and the clause is a=3 and b=7 and b=t2.d, + then we skip the key part corresponding to b=t2.d) + - keyparts without previous keyparts + (e.g. if there is a key(a,b,c) but only b < 5 (or a=2 and c < 3) is + used in the query, we drop the partial key parts from consideration). + Special treatment for ft-keys. */ if (keyuse->elements) { From da22f75b688bd15cc3b2380a799854637f2ed911 Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Fri, 15 Apr 2005 11:06:25 +0200 Subject: [PATCH 184/204] Fixed BUG#9902: Crash with simple stored function using user defined variables ... actually, it was a query cache problem. (It shouldn't cache such queries) --- mysql-test/r/sp.result | 22 ++++++++++++++++++++++ mysql-test/t/sp.test | 25 +++++++++++++++++++++++++ sql/sql_yacc.yy | 8 ++++++-- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 99d5e82a83b..4bb1640f0eb 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -2936,4 +2936,26 @@ select @tmp1, @tmp2| 50 60 drop procedure bug9598_1| drop procedure bug9598_2| +drop procedure if exists bug9902| +create function bug9902() returns int(11) +begin +set @x = @x + 1; +return @x; +end| +set @qcs1 = @@query_cache_size| +set global query_cache_size = 100000| +set @x = 1| +insert into t1 values ("qc", 42)| +select bug9902() from t1| +bug9902() +2 +select bug9902() from t1| +bug9902() +3 +select @x| +@x +3 +set global query_cache_size = @qcs1| +delete from t1| +drop function bug9902| drop table t1,t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index ad6f5406a16..4101a7a4bfa 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3603,6 +3603,31 @@ drop procedure bug9598_1| drop procedure bug9598_2| +# +# BUG#9902: Crash with simple stored function using user defined variables +# +--disable_warnings +drop procedure if exists bug9902| +--enable_warnings +create function bug9902() returns int(11) +begin + set @x = @x + 1; + return @x; +end| + +set @qcs1 = @@query_cache_size| +set global query_cache_size = 100000| +set @x = 1| +insert into t1 values ("qc", 42)| +select bug9902() from t1| +select bug9902() from t1| +select @x| + +set global query_cache_size = @qcs1| +delete from t1| +drop function bug9902| + + # # BUG#NNNN: New bug synopsis # diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index fe43447a8b6..a6d02e15ab0 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -4598,14 +4598,16 @@ simple_expr: { $$= new Item_int((char*) "TRUE",1,1); } | ident '.' ident '(' udf_expr_list ')' { + LEX *lex= Lex; sp_name *name= new sp_name($1, $3); name->init_qname(YYTHD); - sp_add_to_hash(&Lex->spfuns, name); + sp_add_to_hash(&lex->spfuns, name); if ($5) $$= new Item_func_sp(name, *$5); else $$= new Item_func_sp(name); + lex->safe_to_cache_query=0; } | IDENT_sys '(' udf_expr_list ')' { @@ -4686,13 +4688,15 @@ simple_expr: else #endif /* HAVE_DLOPEN */ { + LEX *lex= Lex; sp_name *name= sp_name_current_db_new(YYTHD, $1); - sp_add_to_hash(&Lex->spfuns, name); + sp_add_to_hash(&lex->spfuns, name); if ($3) $$= new Item_func_sp(name, *$3); else $$= new Item_func_sp(name); + lex->safe_to_cache_query=0; } } | UNIQUE_USERS '(' text_literal ',' NUM ',' NUM ',' expr_list ')' From e889d234cb57c27e254b511c09da978816b6ee5a Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Fri, 15 Apr 2005 15:52:07 +0200 Subject: [PATCH 185/204] Bug #9839 Column with AUTOINC contains -1 Value on node stop --- sql/ha_ndbcluster.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 6dc9c8df64a..242bdec75cb 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -47,6 +47,7 @@ static const char *ha_ndb_ext=".ndb"; #define NDB_HIDDEN_PRIMARY_KEY_LENGTH 8 +#define NDB_FAILED_AUTO_INCREMENT ~(Uint64)0 #define ERR_PRINT(err) \ DBUG_PRINT("error", ("%d message: %s", err.code, err.message)) @@ -1839,6 +1840,8 @@ int ha_ndbcluster::write_row(byte *record) // Table has hidden primary key Ndb *ndb= get_ndb(); Uint64 auto_value= ndb->getAutoIncrementValue((const NDBTAB *) m_table); + if (auto_value == NDB_FAILED_AUTO_INCREMENT) + ERR_RETURN(ndb->getNdbError()); if (set_hidden_key(op, table->fields, (const byte*)&auto_value)) ERR_RETURN(op->getNdbError()); } @@ -3975,6 +3978,8 @@ longlong ha_ndbcluster::get_auto_increment() (m_skip_auto_increment) ? ndb->readAutoIncrementValue((const NDBTAB *) m_table) : ndb->getAutoIncrementValue((const NDBTAB *) m_table, cache_size); + if (auto_value == NDB_FAILED_AUTO_INCREMENT) + ERR_RETURN(ndb->getNdbError()); DBUG_RETURN((longlong)auto_value); } From 40a0548a1bc3f7a2dddd2adb9274edc9f8b944da Mon Sep 17 00:00:00 2001 From: "mskold@mysql.com" <> Date: Fri, 15 Apr 2005 16:14:08 +0200 Subject: [PATCH 186/204] Bug #9839 Column with AUTOINC contains -1 Value on node stop, post review fix --- sql/ha_ndbcluster.cc | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 242bdec75cb..d14d5f6f5c3 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -48,6 +48,7 @@ static const char *ha_ndb_ext=".ndb"; #define NDB_HIDDEN_PRIMARY_KEY_LENGTH 8 #define NDB_FAILED_AUTO_INCREMENT ~(Uint64)0 +#define NDB_AUTO_INCREMENT_RETRIES 10 #define ERR_PRINT(err) \ DBUG_PRINT("error", ("%d message: %s", err.code, err.message)) @@ -1839,7 +1840,13 @@ int ha_ndbcluster::write_row(byte *record) { // Table has hidden primary key Ndb *ndb= get_ndb(); - Uint64 auto_value= ndb->getAutoIncrementValue((const NDBTAB *) m_table); + Uint64 auto_value= NDB_FAILED_AUTO_INCREMENT; + uint retries= NDB_AUTO_INCREMENT_RETRIES; + do { + auto_value= ndb->getAutoIncrementValue((const NDBTAB *) m_table); + } while (auto_value == NDB_FAILED_AUTO_INCREMENT && + --retries && + ndb->getNdbError().status == NdbError::TemporaryError); if (auto_value == NDB_FAILED_AUTO_INCREMENT) ERR_RETURN(ndb->getNdbError()); if (set_hidden_key(op, table->fields, (const byte*)&auto_value)) @@ -3974,10 +3981,16 @@ longlong ha_ndbcluster::get_auto_increment() : (m_rows_to_insert > m_autoincrement_prefetch) ? m_rows_to_insert : m_autoincrement_prefetch; - Uint64 auto_value= - (m_skip_auto_increment) ? - ndb->readAutoIncrementValue((const NDBTAB *) m_table) - : ndb->getAutoIncrementValue((const NDBTAB *) m_table, cache_size); + Uint64 auto_value= NDB_FAILED_AUTO_INCREMENT; + uint retries= NDB_AUTO_INCREMENT_RETRIES; + do { + auto_value= + (m_skip_auto_increment) ? + ndb->readAutoIncrementValue((const NDBTAB *) m_table) + : ndb->getAutoIncrementValue((const NDBTAB *) m_table, cache_size); + } while (auto_value == NDB_FAILED_AUTO_INCREMENT && + --retries && + ndb->getNdbError().status == NdbError::TemporaryError); if (auto_value == NDB_FAILED_AUTO_INCREMENT) ERR_RETURN(ndb->getNdbError()); DBUG_RETURN((longlong)auto_value); From bc48cda57d4117c2cc0696318e840a514fdcc1e5 Mon Sep 17 00:00:00 2001 From: "gbichot@quadita2.mysql.com" <> Date: Fri, 15 Apr 2005 18:00:38 +0200 Subject: [PATCH 187/204] Adding --innodb_fast_shutdown=2 which shuts down InnoDB faster than the default "1": most InnoDB threads are not terminated properly and the buffer pool is not flushed to disk. Still no committed transaction is lost as we flush the logs to disk. InnoDB does crash recovery at startup after this shutdown. Using this shutdown in testsuite (mysql-test-run --mysqld=--innodb_fast_shutdown=2) saved 3 minutes (13% of total time). --- innobase/include/srv0srv.h | 10 ++++++---- innobase/log/log0log.c | 10 ++++------ innobase/srv/srv0srv.c | 17 +++++++---------- innobase/srv/srv0start.c | 9 +++++++++ sql/ha_innodb.cc | 19 ++----------------- sql/ha_innodb.h | 4 ++-- sql/mysqld.cc | 23 ++++++++++++++++++----- sql/set_var.cc | 5 ++++- 8 files changed, 52 insertions(+), 45 deletions(-) diff --git a/innobase/include/srv0srv.h b/innobase/include/srv0srv.h index 82b132a8bac..4a1833a1a21 100644 --- a/innobase/include/srv0srv.h +++ b/innobase/include/srv0srv.h @@ -99,11 +99,13 @@ extern ulint srv_max_n_threads; extern lint srv_conc_n_threads; -extern ibool srv_fast_shutdown; -extern ibool srv_very_fast_shutdown; /* if this TRUE, do not flush the +extern ulint srv_fast_shutdown; /* If this is 1, do not do a + purge and index buffer merge. + If this 2, do not even flush the buffer pool to data files at the - shutdown; we effectively 'crash' - InnoDB */ + shutdown: we effectively 'crash' + InnoDB (but lose no committed + transactions). */ extern ibool srv_innodb_status; extern ibool srv_use_doublewrite_buf; diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c index e8a720e8a88..560f51401ac 100644 --- a/innobase/log/log0log.c +++ b/innobase/log/log0log.c @@ -3059,15 +3059,13 @@ loop: goto loop; } - if (srv_very_fast_shutdown) { - /* In a 'very fast' shutdown we do not flush the buffer pool: + if (srv_fast_shutdown == 2) { + /* In this fastest shutdown we do not flush the buffer pool: it is essentially a 'crash' of the InnoDB server. - Make sure that the log is all flushed to disk, so that + Make sure that the log is all flushed to disk, so that we can recover all committed transactions in a crash recovery. - In a 'very fast' shutdown we do not flush the buffer pool: - it is essentially a 'crash' of the InnoDB server. Then we must - not write the lsn stamps to the data files, since at a + We must not write the lsn stamps to the data files, since at a startup InnoDB deduces from the stamps if the previous shutdown was clean. */ diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 41b0594d705..a4bfdb6162d 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -300,15 +300,12 @@ SQL query after it has once got the ticket at srv_conc_enter_innodb */ #define SRV_FREE_TICKETS_TO_ENTER srv_n_free_tickets_to_enter #define SRV_THREAD_SLEEP_DELAY srv_thread_sleep_delay /*-----------------------*/ -/* If the following is set TRUE then we do not run purge and insert buffer -merge to completion before shutdown */ +/* If the following is set to 1 then we do not run purge and insert buffer +merge to completion before shutdown. If it is set to 2, do not even flush the +buffer pool to data files at the shutdown: we effectively 'crash' +InnoDB (but lose no committed transactions). */ +ulint srv_fast_shutdown = 0; -ibool srv_fast_shutdown = FALSE; - -ibool srv_very_fast_shutdown = FALSE; /* if this TRUE, do not flush the - buffer pool to data files at the - shutdown; we effectively 'crash' - InnoDB */ /* Generate a innodb_status. file */ ibool srv_innodb_status = FALSE; @@ -2471,11 +2468,11 @@ background_loop: flush_loop: srv_main_thread_op_info = "flushing buffer pool pages"; - if (!srv_very_fast_shutdown) { + if (srv_fast_shutdown < 2) { n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST, 100, ut_dulint_max); } else { - /* In a 'very fast' shutdown we do not flush the buffer pool + /* In the fastest shutdown we do not flush the buffer pool to data files: we set n_pages_flushed to 0 artificially. */ n_pages_flushed = 0; diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index 5bb7cfa7421..e136aee43e8 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -1729,6 +1729,15 @@ innobase_shutdown_for_mysql(void) The step 1 is the real InnoDB shutdown. The remaining steps 2 - ... just free data structures after the shutdown. */ + + if (srv_fast_shutdown == 2) { + ut_print_timestamp(stderr); + fprintf(stderr, +" InnoDB: MySQL has requested a very fast shutdown without flushing " +"the InnoDB buffer pool to data files. At the next mysqld startup " +"InnoDB will do a crash recovery!\n"); + } + #ifdef __NETWARE__ if(!panic_shutdown) #endif diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 4f640242297..a26c706bb08 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -116,15 +116,12 @@ char* innobase_unix_file_flush_method = NULL; values */ uint innobase_flush_log_at_trx_commit = 1; +ulong innobase_fast_shutdown = 1; my_bool innobase_log_archive = FALSE;/* unused */ my_bool innobase_use_doublewrite = TRUE; my_bool innobase_use_checksums = TRUE; my_bool innobase_use_large_pages = FALSE; my_bool innobase_use_native_aio = FALSE; -my_bool innobase_fast_shutdown = TRUE; -my_bool innobase_very_fast_shutdown = FALSE; /* this can be set to - 1 just prior calling - innobase_end() */ my_bool innobase_file_per_table = FALSE; my_bool innobase_locks_unsafe_for_binlog = FALSE; my_bool innobase_create_status_file = FALSE; @@ -1238,8 +1235,6 @@ innobase_init(void) srv_lock_wait_timeout = (ulint) innobase_lock_wait_timeout; srv_force_recovery = (ulint) innobase_force_recovery; - srv_fast_shutdown = (ibool) innobase_fast_shutdown; - srv_use_doublewrite_buf = (ibool) innobase_use_doublewrite; srv_use_checksums = (ibool) innobase_use_checksums; @@ -1330,17 +1325,7 @@ innobase_end(void) #endif if (innodb_inited) { -#ifndef __NETWARE__ /* NetWare can't close unclosed files, kill remaining - threads, etc, so we disable the very fast shutdown */ - if (innobase_very_fast_shutdown) { - srv_very_fast_shutdown = TRUE; - fprintf(stderr, -"InnoDB: MySQL has requested a very fast shutdown without flushing\n" -"InnoDB: the InnoDB buffer pool to data files. At the next mysqld startup\n" -"InnoDB: InnoDB will do a crash recovery!\n"); - } -#endif - + srv_fast_shutdown = (ulint) innobase_fast_shutdown; innodb_inited = 0; if (innobase_shutdown_for_mysql() != DB_SUCCESS) { err = 1; diff --git a/sql/ha_innodb.h b/sql/ha_innodb.h index ff3014ece1e..35f95ead757 100644 --- a/sql/ha_innodb.h +++ b/sql/ha_innodb.h @@ -210,7 +210,7 @@ class ha_innobase: public handler extern struct show_var_st innodb_status_variables[]; extern uint innobase_init_flags, innobase_lock_type; extern uint innobase_flush_log_at_trx_commit; -extern ulong innobase_cache_size; +extern ulong innobase_cache_size, innobase_fast_shutdown; extern ulong innobase_large_page_size; extern char *innobase_home, *innobase_tmpdir, *innobase_logdir; extern long innobase_lock_scan_time; @@ -229,7 +229,7 @@ extern my_bool innobase_log_archive, innobase_use_doublewrite, innobase_use_checksums, innobase_use_large_pages, - innobase_use_native_aio, innobase_fast_shutdown, + innobase_use_native_aio, innobase_file_per_table, innobase_locks_unsafe_for_binlog, innobase_create_status_file; extern my_bool innobase_very_fast_shutdown; /* set this to 1 just before diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 15f40ebd288..39ec71acf34 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4494,8 +4494,24 @@ Disable with --skip-innodb-checksums.", (gptr*) &innobase_use_checksums, Disable with --skip-innodb-doublewrite.", (gptr*) &innobase_use_doublewrite, (gptr*) &innobase_use_doublewrite, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"innodb_fast_shutdown", OPT_INNODB_FAST_SHUTDOWN, - "Speeds up server shutdown process.", (gptr*) &innobase_fast_shutdown, - (gptr*) &innobase_fast_shutdown, 0, GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, 0}, + "Speeds up the shutdown process of the InnoDB storage engine. Possible " + "values are 0, 1 (faster)" + /* + NetWare can't close unclosed files, can't automatically kill remaining + threads, etc, so on this OS we disable the crash-like InnoDB shutdown. + */ +#ifndef __NETWARE__ + " or 2 (fastest - crash-like)" +#endif + ".", + (gptr*) &innobase_fast_shutdown, + (gptr*) &innobase_fast_shutdown, 0, GET_ULONG, OPT_ARG, 1, 0, +#ifndef __NETWARE__ + 2, +#else + 1, +#endif + 0, 0, 0}, {"innodb_file_per_table", OPT_INNODB_FILE_PER_TABLE, "Stores each InnoDB table to an .ibd file in the database dir.", (gptr*) &innobase_file_per_table, @@ -6510,9 +6526,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), case OPT_INNODB_LOG_ARCHIVE: innobase_log_archive= argument ? test(atoi(argument)) : 1; break; - case OPT_INNODB_FAST_SHUTDOWN: - innobase_fast_shutdown= argument ? test(atoi(argument)) : 1; - break; #endif /* HAVE_INNOBASE_DB */ case OPT_MYISAM_RECOVER: { diff --git a/sql/set_var.cc b/sql/set_var.cc index 3523e444216..fa8eddf7218 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -386,6 +386,8 @@ sys_var_thd_ulong sys_net_wait_timeout("wait_timeout", &SV::net_wait_timeout); #ifdef HAVE_INNOBASE_DB +sys_var_long_ptr sys_innodb_fast_shutdown("innodb_fast_shutdown", + &innobase_fast_shutdown); sys_var_long_ptr sys_innodb_max_dirty_pages_pct("innodb_max_dirty_pages_pct", &srv_max_buf_pool_modified_pct); sys_var_long_ptr sys_innodb_max_purge_lag("innodb_max_purge_lag", @@ -689,6 +691,7 @@ sys_var *sys_variables[]= &sys_tx_isolation, &sys_os, #ifdef HAVE_INNOBASE_DB + &sys_innodb_fast_shutdown, &sys_innodb_max_dirty_pages_pct, &sys_innodb_max_purge_lag, &sys_innodb_table_locks, @@ -795,7 +798,7 @@ struct show_var_st init_vars[]= { {"innodb_data_file_path", (char*) &innobase_data_file_path, SHOW_CHAR_PTR}, {"innodb_data_home_dir", (char*) &innobase_data_home_dir, SHOW_CHAR_PTR}, {"innodb_doublewrite", (char*) &innobase_use_doublewrite, SHOW_MY_BOOL}, - {"innodb_fast_shutdown", (char*) &innobase_fast_shutdown, SHOW_MY_BOOL}, + {sys_innodb_fast_shutdown.name,(char*) &sys_innodb_fast_shutdown, SHOW_SYS}, {"innodb_file_io_threads", (char*) &innobase_file_io_threads, SHOW_LONG }, {"innodb_file_per_table", (char*) &innobase_file_per_table, SHOW_MY_BOOL}, {"innodb_flush_log_at_trx_commit", (char*) &innobase_flush_log_at_trx_commit, SHOW_INT}, From 08ae28f4b8569f7e2cc1238e8b4bd9853bddcd12 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Fri, 15 Apr 2005 19:20:15 +0200 Subject: [PATCH 188/204] BUG#9922 - INSERT SELECT with UNIONs allows concurrent INSERTs don't set lex->lock_option=TL_READ in the parser for SELECT --- sql/sql_lex.cc | 1 + sql/sql_yacc.yy | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index d62edf83c11..20aacf42be0 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -147,6 +147,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) lex->select->in_sum_expr=0; lex->select->expr_list.empty(); lex->select->ftfunc_list.empty(); + lex->lock_option=TL_READ; lex->convert_set=(lex->thd=thd)->variables.convert_set; lex->yacc_yyss=lex->yacc_yyvs=0; lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 39b57061507..8c5c4d61d1d 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1531,7 +1531,6 @@ select_init: select_part2: { LEX *lex=Lex; - lex->lock_option=TL_READ; mysql_init_select(lex); } select_options select_item_list select_into select_lock_type; From e2cf8b309e3824ba69fbaed0584bff18e720cf25 Mon Sep 17 00:00:00 2001 From: "ingo@mysql.com" <> Date: Fri, 15 Apr 2005 19:26:38 +0200 Subject: [PATCH 189/204] Bug#9487 - myisampack segmentation violation and bus error Fixed some casts for 64-bit systems. Fixed a possible buffer overflow. --- myisam/myisampack.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/myisam/myisampack.c b/myisam/myisampack.c index eae75b07760..263a468d96d 100644 --- a/myisam/myisampack.c +++ b/myisam/myisampack.c @@ -1709,7 +1709,7 @@ static int compress_isam_file(PACK_MRG_INFO *mrg, HUFF_COUNTS *huff_counts) ulong tot_blob_length=0; if (! error) { - if (flush_buffer(max_calc_length+max_pack_length)) + if (flush_buffer((ulong) max_calc_length + (ulong) max_pack_length)) break; record_pos=file_buffer.pos; file_buffer.pos+=max_pack_length; @@ -1930,7 +1930,20 @@ static void init_file_buffer(File file, pbool read_buffer) static int flush_buffer(ulong neaded_length) { ulong length; - if ((ulong) (file_buffer.end - file_buffer.pos) > neaded_length) + + /* + file_buffer.end is 8 bytes lower than the real end of the buffer. + This is done so that the end-of-buffer condition does not need to be + checked for every byte (see write_bits()). Consequently, + file_buffer.pos can become greater than file_buffer.end. The + algorithms in the other functions ensure that there will never be + more than 8 bytes written to the buffer without an end-of-buffer + check. So the buffer cannot be overrun. But we need to check for the + near-to-buffer-end condition to avoid a negative result, which is + casted to unsigned and thus becomes giant. + */ + if ((file_buffer.pos < file_buffer.end) && + ((ulong) (file_buffer.end - file_buffer.pos) > neaded_length)) return 0; length=(ulong) (file_buffer.pos-file_buffer.buffer); file_buffer.pos=file_buffer.buffer; @@ -2002,7 +2015,7 @@ static void write_bits (register ulong value, register uint bits) } #endif if (file_buffer.pos >= file_buffer.end) - VOID(flush_buffer((uint) ~0)); + VOID(flush_buffer(~ (ulong) 0)); file_buffer.bits=(int) (BITS_SAVED - bits); file_buffer.current_byte=(uint) (value << (BITS_SAVED - bits)); } From 8d919770c71178cc430fd515eaed3859e65792da Mon Sep 17 00:00:00 2001 From: "monty@mishka.local" <> Date: Sat, 16 Apr 2005 03:40:33 +0300 Subject: [PATCH 190/204] Fixed core dump with long timezone names Don't abort on bootstrap if a wrong --default-storage-engine is specified --- sql/handler.cc | 9 ++------- sql/mysqld.cc | 26 +++++++++++++++++--------- sql/set_var.cc | 4 ++-- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index 7d8fc5d8110..7c369a72392 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -163,13 +163,8 @@ my_bool ha_storage_engine_is_enabled(enum db_type database_type) enum db_type ha_checktype(enum db_type database_type) { - show_table_type_st *types; - for (types= sys_table_types; types->type; types++) - { - if ((database_type == types->db_type) && - (*types->value == SHOW_OPTION_YES)) - return database_type; - } + if (ha_storage_engine_is_enabled(database_type)) + return database_type; switch (database_type) { #ifndef NO_HASH diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b13851df479..056c2a7ad7f 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2426,8 +2426,10 @@ static int init_common_variables(const char *conf_file_name, int argc, { struct tm tm_tmp; localtime_r(&start_time,&tm_tmp); - strmov(system_time_zone, tzname[tm_tmp.tm_isdst != 0 ? 1 : 0]); - } + strmake(system_time_zone, tzname[tm_tmp.tm_isdst != 0 ? 1 : 0], + sizeof(system_time_zone)-1); + + } #endif /* We set SYSTEM time zone as reasonable default and @@ -3081,7 +3083,8 @@ we force server id to 2, but this MySQL server will not act as a slave."); if (opt_bootstrap) { - int error=bootstrap(stdin); + select_thread_in_use= 0; // Allow 'kill' to work + int error= bootstrap(stdin); end_thr_alarm(1); // Don't allow alarms unireg_abort(error ? 1 : 0); } @@ -6184,9 +6187,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), case OPT_STORAGE_ENGINE: { if ((enum db_type)((global_system_variables.table_type= - ha_resolve_by_name(argument, strlen(argument)))) == DB_TYPE_UNKNOWN) + ha_resolve_by_name(argument, strlen(argument)))) == + DB_TYPE_UNKNOWN) { - fprintf(stderr,"Unknown table type: %s\n",argument); + fprintf(stderr,"Unknown/unsupported table type: %s\n",argument); exit(1); } break; @@ -6442,10 +6446,14 @@ static void get_options(int argc,char **argv) if (!ha_storage_engine_is_enabled((enum db_type) global_system_variables.table_type)) { - sql_print_error("Default storage engine (%s) is not available", - ha_get_storage_engine((enum db_type) - global_system_variables.table_type)); - exit(1); + if (!opt_bootstrap) + { + sql_print_error("Default storage engine (%s) is not available", + ha_get_storage_engine((enum db_type) + global_system_variables.table_type)); + exit(1); + } + global_system_variables.table_type= DB_TYPE_MYISAM; } if (argc > 0) diff --git a/sql/set_var.cc b/sql/set_var.cc index 9cf3dcac047..9f63188c28a 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -2985,8 +2985,8 @@ bool sys_var_thd_storage_engine::check(THD *thd, set_var *var) enum db_type db_type; if (!(res=var->value->val_str(&str)) || !(var->save_result.ulong_value= - (ulong) (db_type= ha_resolve_by_name(res->ptr(), res->length()))) || - ha_checktype(db_type) != db_type) + (ulong) (db_type= ha_resolve_by_name(res->ptr(), res->length()))) || + ha_checktype(db_type) != db_type) { value= res ? res->c_ptr() : "NULL"; goto err; From 2b322f36d8e458927845e81e6585a61e8dfff038 Mon Sep 17 00:00:00 2001 From: "monty@mishka.local" <> Date: Sat, 16 Apr 2005 04:12:30 +0300 Subject: [PATCH 191/204] Ensure that all privilege tables are created in MyISAM --- scripts/mysql_create_system_tables.sh | 1 + scripts/mysql_fix_privilege_tables.sql | 2 ++ 2 files changed, 3 insertions(+) diff --git a/scripts/mysql_create_system_tables.sh b/scripts/mysql_create_system_tables.sh index 993efcb0fda..4c642423879 100644 --- a/scripts/mysql_create_system_tables.sh +++ b/scripts/mysql_create_system_tables.sh @@ -629,6 +629,7 @@ fi cat << END_OF_DATA use mysql; +set table_type=myisam; $c_d $i_d diff --git a/scripts/mysql_fix_privilege_tables.sql b/scripts/mysql_fix_privilege_tables.sql index 8f398689bd9..0d7d32fd6a9 100644 --- a/scripts/mysql_fix_privilege_tables.sql +++ b/scripts/mysql_fix_privilege_tables.sql @@ -9,6 +9,8 @@ -- this sql script. -- On windows you should do 'mysql --force mysql < mysql_fix_privilege_tables.sql' +set table_type=MyISAM; + CREATE TABLE IF NOT EXISTS func ( name char(64) binary DEFAULT '' NOT NULL, ret tinyint(1) DEFAULT '0' NOT NULL, From 0f043429e43697bc8608530a203a9102ea9dd85c Mon Sep 17 00:00:00 2001 From: "igor@rurik.mysql.com" <> Date: Fri, 15 Apr 2005 20:43:45 -0700 Subject: [PATCH 192/204] subselect.result, subselect.test: Added a test case for bug #9338. sql_select.cc: Fixed bug #9338. When an occurence of a field reference has to be replaced by another field reference the whole Item_field must be replaced. item.cc: Fixed bug #9338. The method Item_field::replace_equal_field_processor was replaced by Item_field::replace_equal_field. The new method is used to replace the occurences of Item_field objects. item.h: Fixed bug #9338. The virtual function replace_equal_field_processor was replaced by replace_equal_field. The latter is supposed to be used as a callback function in calls of the method transform. --- mysql-test/r/subselect.result | 16 ++++++++++++++++ mysql-test/t/subselect.test | 21 +++++++++++++++++++++ sql/item.cc | 29 +++++++++++++---------------- sql/item.h | 4 ++-- sql/sql_select.cc | 2 +- 5 files changed, 53 insertions(+), 19 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 0e8ba49d88d..f04e76a6bb2 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -2746,3 +2746,19 @@ NULL 2.00 4.00 drop table t1; +CREATE table t1 ( c1 integer ); +INSERT INTO t1 VALUES ( 1 ); +INSERT INTO t1 VALUES ( 2 ); +INSERT INTO t1 VALUES ( 3 ); +CREATE TABLE t2 ( c2 integer ); +INSERT INTO t2 VALUES ( 1 ); +INSERT INTO t2 VALUES ( 4 ); +INSERT INTO t2 VALUES ( 5 ); +SELECT * FROM t1 LEFT JOIN t2 ON c1 = c2 WHERE c2 IN (1); +c1 c2 +1 1 +SELECT * FROM t1 LEFT JOIN t2 ON c1 = c2 +WHERE c2 IN ( SELECT c2 FROM t2 WHERE c2 IN ( 1 ) ); +c1 c2 +1 1 +DROP TABLE t1,t2; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 3bb1da0eddf..70e62b9544c 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -1752,3 +1752,24 @@ insert into t1 values (1, 1), (2, 2), (2, 3), (3, 4), (3, 5), (3, 6), (NULL, NUL select * from t1; select min(a) from t1 group by grp; drop table t1; + +# +# Test for bug #9338: lame substitution of c1 instead of c2 +# + +CREATE table t1 ( c1 integer ); +INSERT INTO t1 VALUES ( 1 ); +INSERT INTO t1 VALUES ( 2 ); +INSERT INTO t1 VALUES ( 3 ); + +CREATE TABLE t2 ( c2 integer ); +INSERT INTO t2 VALUES ( 1 ); +INSERT INTO t2 VALUES ( 4 ); +INSERT INTO t2 VALUES ( 5 ); + +SELECT * FROM t1 LEFT JOIN t2 ON c1 = c2 WHERE c2 IN (1); + +SELECT * FROM t1 LEFT JOIN t2 ON c1 = c2 + WHERE c2 IN ( SELECT c2 FROM t2 WHERE c2 IN ( 1 ) ); + +DROP TABLE t1,t2; diff --git a/sql/item.cc b/sql/item.cc index 46fbaf2ed85..73c8e80228b 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -2978,41 +2978,38 @@ Item *Item_field::set_no_const_sub(byte *arg) /* - Set a pointer to the multiple equality the field reference belongs to + Replace an Item_field for an equal Item_field that evaluated earlier (if any) SYNOPSIS - replace_equal_field_processor() + replace_equal_field_() arg - a dummy parameter, is not used here DESCRIPTION - The function replaces a pointer to a field in the Item_field object - by a pointer to another field. - The replacement field is taken from the very beginning of - the item_equal list which the Item_field object refers to (belongs to) - If the Item_field object does not refer any Item_equal object, - nothing is done. + The function returns a pointer to an item that is taken from + the very beginning of the item_equal list which the Item_field + object refers to (belongs to). + If the Item_field object does not refer any Item_equal object + 'this' is returned NOTES This function is supposed to be called as a callback parameter in calls - of the walk method. + of the thransformer method. RETURN VALUES - 0 + pointer to a replacement Item_field if there is a better equal item; + this - otherwise. */ -bool Item_field::replace_equal_field_processor(byte *arg) +Item *Item_field::replace_equal_field(byte *arg) { if (item_equal) { Item_field *subst= item_equal->get_first(); if (!field->eq(subst->field)) - { - field= subst->field; - return 0; - } + return subst; } - return 0; + return this; } diff --git a/sql/item.h b/sql/item.h index f4ca292e574..33c7a164c5b 100644 --- a/sql/item.h +++ b/sql/item.h @@ -520,7 +520,7 @@ public: virtual bool collect_item_field_processor(byte * arg) { return 0; } virtual Item *equal_fields_propagator(byte * arg) { return this; } virtual Item *set_no_const_sub(byte *arg) { return this; } - virtual bool replace_equal_field_processor(byte * arg) { return 0; } + virtual Item *replace_equal_field(byte * arg) { return this; } virtual Item *this_item() { return this; } /* For SPs mostly. */ virtual Item *this_const_item() const { return const_cast(this); } /* For SPs mostly. */ @@ -750,7 +750,7 @@ public: Item_equal *find_item_equal(COND_EQUAL *cond_equal); Item *equal_fields_propagator(byte *arg); Item *set_no_const_sub(byte *arg); - bool replace_equal_field_processor(byte *arg); + Item *replace_equal_field(byte *arg); inline uint32 max_disp_length() { return field->max_length(); } Item_field *filed_for_view_update() { return this; } Item *safe_charset_converter(CHARSET_INFO *tocs); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 8031a99f4d1..4bac3546ad7 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -7050,7 +7050,7 @@ static COND* substitute_for_best_equal_field(COND *cond, return eliminate_item_equal(0, cond_equal, item_equal); } else - cond->walk(&Item::replace_equal_field_processor, 0); + cond->transform(&Item::replace_equal_field, 0); return cond; } From d92d4007f215e132c2279621b309e9f7ea45c346 Mon Sep 17 00:00:00 2001 From: "igor@rurik.mysql.com" <> Date: Fri, 15 Apr 2005 22:08:34 -0700 Subject: [PATCH 193/204] subselect.result, subselect.test: Added a test case for bug #9516. item_subselect.h: Fixed bug #9516. The bug was due to that fact that the class Item_subselect inherited the generic implementation of the function not_null_tables that was not valid for the objects of this class. As a result evaluation of the not_null_tables attribute was not correct for subqueries. This caused invalid transformations of outer joins into inner joins. --- mysql-test/r/subselect.result | 19 +++++++++++++++++++ mysql-test/t/subselect.test | 26 ++++++++++++++++++++++++++ sql/item_subselect.h | 1 + 3 files changed, 46 insertions(+) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index f04e76a6bb2..fa5f27b7eed 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -2762,3 +2762,22 @@ WHERE c2 IN ( SELECT c2 FROM t2 WHERE c2 IN ( 1 ) ); c1 c2 1 1 DROP TABLE t1,t2; +CREATE TABLE t1 ( c1 integer ); +INSERT INTO t1 VALUES ( 1 ); +INSERT INTO t1 VALUES ( 2 ); +INSERT INTO t1 VALUES ( 3 ); +INSERT INTO t1 VALUES ( 6 ); +CREATE TABLE t2 ( c2 integer ); +INSERT INTO t2 VALUES ( 1 ); +INSERT INTO t2 VALUES ( 4 ); +INSERT INTO t2 VALUES ( 5 ); +INSERT INTO t2 VALUES ( 6 ); +CREATE TABLE t3 ( c3 integer ); +INSERT INTO t3 VALUES ( 7 ); +INSERT INTO t3 VALUES ( 8 ); +SELECT c1,c2 FROM t1 LEFT JOIN t2 ON c1 = c2 +WHERE EXISTS (SELECT c3 FROM t3 WHERE c2 IS NULL ); +c1 c2 +2 NULL +3 NULL +DROP TABLE t1,t2,t3; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 70e62b9544c..fe7cd42995d 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -1773,3 +1773,29 @@ SELECT * FROM t1 LEFT JOIN t2 ON c1 = c2 WHERE c2 IN ( SELECT c2 FROM t2 WHERE c2 IN ( 1 ) ); DROP TABLE t1,t2; + +# +# Test for bug #9516: wrong evaluation of not_null_tables attribute in SQ +# + +CREATE TABLE t1 ( c1 integer ); +INSERT INTO t1 VALUES ( 1 ); +INSERT INTO t1 VALUES ( 2 ); +INSERT INTO t1 VALUES ( 3 ); +INSERT INTO t1 VALUES ( 6 ); + +CREATE TABLE t2 ( c2 integer ); +INSERT INTO t2 VALUES ( 1 ); +INSERT INTO t2 VALUES ( 4 ); +INSERT INTO t2 VALUES ( 5 ); +INSERT INTO t2 VALUES ( 6 ); + +CREATE TABLE t3 ( c3 integer ); +INSERT INTO t3 VALUES ( 7 ); +INSERT INTO t3 VALUES ( 8 ); + +SELECT c1,c2 FROM t1 LEFT JOIN t2 ON c1 = c2 + WHERE EXISTS (SELECT c3 FROM t3 WHERE c2 IS NULL ); + +DROP TABLE t1,t2,t3; + diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 56864109a04..1a407c695b2 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -96,6 +96,7 @@ public: virtual bool exec(); virtual void fix_length_and_dec(); table_map used_tables() const; + table_map not_null_tables() const { return 0; } bool const_item() const; inline table_map get_used_tables_cache() { return used_tables_cache; } inline bool get_const_item_cache() { return const_item_cache; } From de1b1fe54d4e7cac521fd0447031786e86ae8727 Mon Sep 17 00:00:00 2001 From: "monty@mishka.local" <> Date: Sat, 16 Apr 2005 10:53:30 +0300 Subject: [PATCH 194/204] Added more rows to test to get predictable results --- mysql-test/r/range.result | 6 +-- mysql-test/t/range.test | 2 +- scripts/make_binary_distribution.sh | 2 +- support-files/mysql.server.sh | 80 ++++++++++++++++++++++++----- 4 files changed, 73 insertions(+), 17 deletions(-) diff --git a/mysql-test/r/range.result b/mysql-test/r/range.result index d98ed90e158..049d6c0fd44 100644 --- a/mysql-test/r/range.result +++ b/mysql-test/r/range.result @@ -250,18 +250,18 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index x x 5 NULL 9 Using where; Using index drop table t1; CREATE TABLE t1 (key1 int(11) NOT NULL default '0', KEY i1 (key1)); -INSERT INTO t1 VALUES (0),(1),(1); +INSERT INTO t1 VALUES (0),(0),(0),(0),(0),(1),(1); CREATE TABLE t2 (keya int(11) NOT NULL default '0', KEY j1 (keya)); INSERT INTO t2 VALUES (0),(0),(1),(1),(2),(2); explain select * from t1, t2 where (t1.key1 $BASE/scripts/mysql_install_db - $BASE/bin/replace \@prefix\@ /usr/local/mysql \@bindir\@ ./bin \@sbindir\@ ./bin \@MYSQLD_USER\@ mysql \@localstatedir\@ /usr/local/mysql/data \@HOSTNAME\@ @HOSTNAME@ < $SOURCE/support-files/mysql.server.sh > $BASE/support-files/mysql.server + $BASE/bin/replace \@prefix\@ /usr/local/mysql \@bindir\@ ./bin \@sbindir\@ ./bin \@libexecdir\@ ./bin \@MYSQLD_USER\@ @MYSQLD_USER@ \@localstatedir\@ /usr/local/mysql/data \@HOSTNAME\@ @HOSTNAME@ < $SOURCE/support-files/mysql.server.sh > $BASE/support-files/mysql.server $BASE/bin/replace /my/gnu/bin/hostname /bin/hostname -- $BASE/bin/mysqld_safe mv $BASE/support-files/binary-configure $BASE/configure chmod a+x $BASE/bin/* $BASE/scripts/* $BASE/support-files/mysql-* $BASE/support-files/mysql.server $BASE/configure diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh index a03e870004d..04fd9a312da 100644 --- a/support-files/mysql.server.sh +++ b/support-files/mysql.server.sh @@ -48,15 +48,19 @@ datadir= # Set some defaults pid_file= +server_pid_file= +user=@MYSQLD_USER@ if test -z "$basedir" then basedir=@prefix@ bindir=@bindir@ datadir=@localstatedir@ sbindir=@sbindir@ + libexecdir=@libexecdir@ else bindir="$basedir/bin" - sbindir="$basedir/sbin" + sbindir="$basedir/bin" + libexecdir="$basedir/bin" fi # @@ -92,6 +96,8 @@ parse_server_arguments() { case "$arg" in --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; --datadir=*) datadir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --user=*) user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --pid-file=*) server_pid_file=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; esac done } @@ -100,6 +106,7 @@ parse_manager_arguments() { for arg do case "$arg" in --pid-file=*) pid_file=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --user=*) user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; esac done } @@ -181,7 +188,7 @@ then extra_args="-e $datadir/my.cnf" fi -parse_server_arguments `$print_defaults $extra_args mysqld` +parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server` # Look for the pidfile parse_manager_arguments `$print_defaults $extra_args manager` @@ -198,9 +205,15 @@ else * ) pid_file="$datadir/$pid_file" ;; esac fi - -user=@MYSQLD_USER@ -USER_OPTION="--user=$user" +if test -z "$server_pid_file" +then + server_pid_file=$datadir/`@HOSTNAME@`.pid +else + case "$server_pid_file" in + /* ) ;; + * ) server_pid_file="$datadir/$server_pid_file" ;; + esac +fi # Safeguard (relative paths, core dumps..) cd $basedir @@ -209,12 +222,21 @@ case "$mode" in 'start') # Start daemon - if test -x $sbindir/mysqlmanager + manager=$bindir/mysqlmanager + if test -x $libexecdir/mysqlmanager + then + manager=$libexecdir/mysqlmanager + elif test -x $bindir/mysqlmanager + then + manager=$sbindir/mysqlmanager + fi + + if test -x $manager then # Give extra arguments to mysqld with the my.cnf file. This script may # be overwritten at next upgrade. echo $echo_n "Starting MySQL" - $sbindir/mysqlmanager $USER_OPTION --pid-file=$pid_file >/dev/null 2>&1 & + $manager --user=$user --pid-file=$pid_file >/dev/null 2>&1 & wait_for_pid created # Make lock for RedHat / SuSE @@ -222,14 +244,38 @@ case "$mode" in then touch /var/lock/subsys/mysqlmanager fi + elif test -x $bindir/mysqld_safe + then + # Give extra arguments to mysqld with the my.cnf file. This script may be overwritten at next upgrade. + echo $echo_n "Starting MySQL" + pid_file=$server_pid_file + $bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file >/dev/null 2>&1 & + wait_for_pid created + + # Make lock for RedHat / SuSE + if test -w /var/lock/subsys + then + touch /var/lock/subsys/mysql + fi else - log_failure_msg "Can't execute $sbindir/mysqlmanager" + log_failure_msg "Couldn't find MySQL manager or server" fi ;; 'stop') # Stop daemon. We use a signal here to avoid having to know the # root password. + + # The RedHat / SuSE lock directory to remove + lock_dir=/var/lock/subsys/mysqlmanager + + # If the manager pid_file doesn't exist, try the server's + if test ! -s "$pid_file" + then + pid_file=$server_pid_file + lock_dir=/var/lock/subsys/mysql + fi + if test -s "$pid_file" then mysqlmanager_pid=`cat $pid_file` @@ -239,12 +285,12 @@ case "$mode" in wait_for_pid removed # delete lock for RedHat / SuSE - if test -f /var/lock/subsys/mysqlmanager + if test -f $lock_dir then - rm -f /var/lock/subsys/mysqlmanager + rm -f $lock_dir fi else - log_failure_msg "mysqlmanager PID file could not be found!" + log_failure_msg "MySQL manager or server PID file could not be found!" fi ;; @@ -255,9 +301,19 @@ case "$mode" in $0 start ;; + 'reload') + if test -s "$server_pid_file" ; then + mysqld_pid=`cat $server_pid_file` + kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL" + touch $server_pid_file + else + log_failure_msg "MySQL PID file could not be found!" + fi + ;; + *) # usage - echo "Usage: $0 start|stop|restart" + echo "Usage: $0 start|stop|restart|reload" exit 1 ;; esac From 0c03aea1aa6b94b7b96324dbd597e295e268e85b Mon Sep 17 00:00:00 2001 From: "monty@mishka.local" <> Date: Sat, 16 Apr 2005 11:40:41 +0300 Subject: [PATCH 195/204] Set bindir, datadir & others if --basedir is given. This ensures that one only has to set basedir in [mysqld] group when moving a binary installation to a not default polace Use for now safe_mysqld by default. (unless use-manager is set in the [mysql.server] option in my.cnf) Search first for defaults files in basedir and then in datadir (like mysqld_safe) --- support-files/mysql.server.sh | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh index 04fd9a312da..071b7696908 100644 --- a/support-files/mysql.server.sh +++ b/support-files/mysql.server.sh @@ -49,6 +49,7 @@ datadir= # Set some defaults pid_file= server_pid_file= +use_mysqld_safe=1 user=@MYSQLD_USER@ if test -z "$basedir" then @@ -59,6 +60,7 @@ then libexecdir=@libexecdir@ else bindir="$basedir/bin" + datadir="$basedir/data" sbindir="$basedir/bin" libexecdir="$basedir/bin" fi @@ -94,10 +96,17 @@ esac parse_server_arguments() { for arg do case "$arg" in - --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` + bindir="$basedir/bin" + datadir="$basedir/data" + sbindir="$basedir/bin" + libexecdir="$basedir/bin" + ;; --datadir=*) datadir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; --user=*) user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; --pid-file=*) server_pid_file=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --use-mysqld_safe) use_mysqld_safe=1;; + --use-manager) use_mysqld_safe=0;; esac done } @@ -178,14 +187,19 @@ else fi # -# Test if someone changed datadir; In this case we should also read the -# default arguments from this directory +# Read defaults file from 'basedir'. If there is no defaults file there +# check if it's in the old (depricated) place (datadir) and read it from there # extra_args="" -if test "$datadir" != "@localstatedir@" +if test -r "$basedir/my.cnf" then - extra_args="-e $datadir/my.cnf" + extra_args="-e $basedir/my.cnf" +else + if test -r "$datadir/my.cnf" + then + extra_args="-e $datadir/my.cnf" + fi fi parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server` @@ -231,11 +245,11 @@ case "$mode" in manager=$sbindir/mysqlmanager fi - if test -x $manager + echo $echo_n "Starting MySQL" + if test -x $manager -a "$use_mysqld_safe" = "0" then # Give extra arguments to mysqld with the my.cnf file. This script may # be overwritten at next upgrade. - echo $echo_n "Starting MySQL" $manager --user=$user --pid-file=$pid_file >/dev/null 2>&1 & wait_for_pid created @@ -246,8 +260,8 @@ case "$mode" in fi elif test -x $bindir/mysqld_safe then - # Give extra arguments to mysqld with the my.cnf file. This script may be overwritten at next upgrade. - echo $echo_n "Starting MySQL" + # Give extra arguments to mysqld with the my.cnf file. This script + # may be overwritten at next upgrade. pid_file=$server_pid_file $bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file >/dev/null 2>&1 & wait_for_pid created From 6b4e759cf77b4193c1b8152bef8d10c0be1edf8a Mon Sep 17 00:00:00 2001 From: "sergefp@mysql.com" <> Date: Sat, 16 Apr 2005 23:35:39 +0400 Subject: [PATCH 196/204] Fix for BUG#9439: Changed type of "Sub_part" column in SHOW KEYS from TINYINT to SMALLINT (as MAX_KEY_LENGTH=1024) (this is the final cset with proper tests) --- mysql-test/r/show_check.result | 21 +++++++++++++++++++++ mysql-test/t/show_check.test | 11 +++++++++++ sql/sql_show.cc | 4 ++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 0d580ae2505..4a9e28e9ea4 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -477,3 +477,24 @@ t1 CREATE TABLE `t1` ( KEY `i` TYPE BTREE (`i`) ) ENGINE=HEAP DEFAULT CHARSET=latin1 DROP TABLE t1; +CREATE TABLE t1( +field1 text NOT NULL, +PRIMARY KEY(field1(1000)) +); +show index from t1; +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def Table 253 64 2 N 129 31 63 +def Non_unique 1 1 1 N 32929 0 63 +def Key_name 253 64 7 N 129 31 63 +def Seq_in_index 1 2 1 N 32929 0 63 +def Column_name 253 64 6 N 129 31 63 +def Collation 253 1 1 Y 128 31 63 +def Cardinality 8 21 1 Y 32896 0 63 +def Sub_part 2 3 4 Y 32928 0 63 +def Packed 253 10 0 Y 128 31 63 +def Null 253 3 0 N 129 31 63 +def Index_type 253 16 5 N 129 31 63 +def Comment 253 255 0 N 129 31 63 +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment +t1 0 PRIMARY 1 field1 A 0 1000 NULL BTREE +drop table t1; diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index 0cf1476b24c..f80e720275a 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -357,3 +357,14 @@ SHOW CREATE TABLE t1; ALTER TABLE t1 ENGINE=MEMORY; SHOW CREATE TABLE t1; DROP TABLE t1; + +# Test for BUG#9439 "Reporting wrong datatype for sub_part on show index" +CREATE TABLE t1( + field1 text NOT NULL, + PRIMARY KEY(field1(1000)) +); +--enable_metadata +show index from t1; +--disable_metadata +drop table t1; + diff --git a/sql/sql_show.cc b/sql/sql_show.cc index f979b3ca771..7e0ee0dab68 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -980,7 +980,7 @@ mysqld_show_keys(THD *thd, TABLE_LIST *table_list) field_list.push_back(item=new Item_int("Cardinality",0,21)); item->maybe_null=1; field_list.push_back(item=new Item_return_int("Sub_part",3, - MYSQL_TYPE_TINY)); + MYSQL_TYPE_SHORT)); item->maybe_null=1; field_list.push_back(item=new Item_empty_string("Packed",10)); item->maybe_null=1; @@ -1025,7 +1025,7 @@ mysqld_show_keys(THD *thd, TABLE_LIST *table_list) /* Check if we have a key part that only uses part of the field */ if (!(key_info->flags & HA_FULLTEXT) && (!key_part->field || key_part->length != table->field[key_part->fieldnr-1]->key_length())) - protocol->store_tiny((longlong) key_part->length / + protocol->store_short((longlong) key_part->length / key_part->field->charset()->mbmaxlen); else protocol->store_null(); From 8c3312fed32f77b254125631bd6058fa7ac73feb Mon Sep 17 00:00:00 2001 From: "petr@mysql.com" <> Date: Sat, 16 Apr 2005 23:57:15 +0400 Subject: [PATCH 197/204] mysql.server script fixed to use mysqld_safe by default + lots of minor additions --- scripts/make_binary_distribution.sh | 2 +- support-files/mysql.server.sh | 116 +++++++++++++++++++++++----- 2 files changed, 97 insertions(+), 21 deletions(-) diff --git a/scripts/make_binary_distribution.sh b/scripts/make_binary_distribution.sh index b99519b87c9..17a9be17108 100644 --- a/scripts/make_binary_distribution.sh +++ b/scripts/make_binary_distribution.sh @@ -233,7 +233,7 @@ if [ $BASE_SYSTEM != "netware" ] ; then chmod a+x $BASE/bin/* $CP scripts/* $BASE/bin $BASE/bin/replace \@localstatedir\@ ./data \@bindir\@ ./bin \@scriptdir\@ ./bin \@libexecdir\@ ./bin \@sbindir\@ ./bin \@prefix\@ . \@HOSTNAME\@ @HOSTNAME@ \@pkgdatadir\@ ./support-files < $SOURCE/scripts/mysql_install_db.sh > $BASE/scripts/mysql_install_db - $BASE/bin/replace \@prefix\@ /usr/local/mysql \@bindir\@ ./bin \@sbindir\@ ./bin \@MYSQLD_USER\@ mysql \@localstatedir\@ /usr/local/mysql/data \@HOSTNAME\@ @HOSTNAME@ < $SOURCE/support-files/mysql.server.sh > $BASE/support-files/mysql.server + $BASE/bin/replace \@prefix\@ /usr/local/mysql \@bindir\@ ./bin \@sbindir\@ ./bin \@libexecdir\@ ./bin \@MYSQLD_USER\@ @MYSQLD_USER@ \@localstatedir\@ /usr/local/mysql/data \@HOSTNAME\@ @HOSTNAME@ < $SOURCE/support-files/mysql.server.sh > $BASE/support-files/mysql.server $BASE/bin/replace /my/gnu/bin/hostname /bin/hostname -- $BASE/bin/mysqld_safe mv $BASE/support-files/binary-configure $BASE/configure chmod a+x $BASE/bin/* $BASE/scripts/* $BASE/support-files/mysql-* $BASE/support-files/mysql.server $BASE/configure diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh index 2735ad91c6e..071b7696908 100644 --- a/support-files/mysql.server.sh +++ b/support-files/mysql.server.sh @@ -48,15 +48,21 @@ datadir= # Set some defaults pid_file= +server_pid_file= +use_mysqld_safe=1 +user=@MYSQLD_USER@ if test -z "$basedir" then basedir=@prefix@ bindir=@bindir@ datadir=@localstatedir@ sbindir=@sbindir@ + libexecdir=@libexecdir@ else bindir="$basedir/bin" - sbindir="$basedir/sbin" + datadir="$basedir/data" + sbindir="$basedir/bin" + libexecdir="$basedir/bin" fi # @@ -66,8 +72,14 @@ lsb_functions="/lib/lsb/init-functions" if test -f $lsb_functions ; then source $lsb_functions else - alias log_success_msg="echo \ SUCCESS! " - alias log_failure_msg="echo \ ERROR! " + log_success_msg() + { + echo " SUCCESS! $@" + } + log_failure_msg() + { + echo " ERROR! $@" + } fi PATH=/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin @@ -84,8 +96,17 @@ esac parse_server_arguments() { for arg do case "$arg" in - --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` + bindir="$basedir/bin" + datadir="$basedir/data" + sbindir="$basedir/bin" + libexecdir="$basedir/bin" + ;; --datadir=*) datadir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --user=*) user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --pid-file=*) server_pid_file=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --use-mysqld_safe) use_mysqld_safe=1;; + --use-manager) use_mysqld_safe=0;; esac done } @@ -94,6 +115,7 @@ parse_manager_arguments() { for arg do case "$arg" in --pid-file=*) pid_file=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --user=*) user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; esac done } @@ -165,17 +187,22 @@ else fi # -# Test if someone changed datadir; In this case we should also read the -# default arguments from this directory +# Read defaults file from 'basedir'. If there is no defaults file there +# check if it's in the old (depricated) place (datadir) and read it from there # extra_args="" -if test "$datadir" != "@localstatedir@" +if test -r "$basedir/my.cnf" then - extra_args="-e $datadir/my.cnf" + extra_args="-e $basedir/my.cnf" +else + if test -r "$datadir/my.cnf" + then + extra_args="-e $datadir/my.cnf" + fi fi -parse_server_arguments `$print_defaults $extra_args mysqld` +parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server` # Look for the pidfile parse_manager_arguments `$print_defaults $extra_args manager` @@ -192,9 +219,15 @@ else * ) pid_file="$datadir/$pid_file" ;; esac fi - -user=@MYSQLD_USER@ -USER_OPTION="--user=$user" +if test -z "$server_pid_file" +then + server_pid_file=$datadir/`@HOSTNAME@`.pid +else + case "$server_pid_file" in + /* ) ;; + * ) server_pid_file="$datadir/$server_pid_file" ;; + esac +fi # Safeguard (relative paths, core dumps..) cd $basedir @@ -203,12 +236,21 @@ case "$mode" in 'start') # Start daemon - if test -x $sbindir/mysqlmanager + manager=$bindir/mysqlmanager + if test -x $libexecdir/mysqlmanager + then + manager=$libexecdir/mysqlmanager + elif test -x $bindir/mysqlmanager + then + manager=$sbindir/mysqlmanager + fi + + echo $echo_n "Starting MySQL" + if test -x $manager -a "$use_mysqld_safe" = "0" then # Give extra arguments to mysqld with the my.cnf file. This script may # be overwritten at next upgrade. - echo $echo_n "Starting MySQL" - $sbindir/mysqlmanager $USER_OPTION --pid-file=$pid_file >/dev/null 2>&1 & + $manager --user=$user --pid-file=$pid_file >/dev/null 2>&1 & wait_for_pid created # Make lock for RedHat / SuSE @@ -216,14 +258,38 @@ case "$mode" in then touch /var/lock/subsys/mysqlmanager fi + elif test -x $bindir/mysqld_safe + then + # Give extra arguments to mysqld with the my.cnf file. This script + # may be overwritten at next upgrade. + pid_file=$server_pid_file + $bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file >/dev/null 2>&1 & + wait_for_pid created + + # Make lock for RedHat / SuSE + if test -w /var/lock/subsys + then + touch /var/lock/subsys/mysql + fi else - log_failure_msg "Can't execute $sbindir/mysqlmanager" + log_failure_msg "Couldn't find MySQL manager or server" fi ;; 'stop') # Stop daemon. We use a signal here to avoid having to know the # root password. + + # The RedHat / SuSE lock directory to remove + lock_dir=/var/lock/subsys/mysqlmanager + + # If the manager pid_file doesn't exist, try the server's + if test ! -s "$pid_file" + then + pid_file=$server_pid_file + lock_dir=/var/lock/subsys/mysql + fi + if test -s "$pid_file" then mysqlmanager_pid=`cat $pid_file` @@ -233,12 +299,12 @@ case "$mode" in wait_for_pid removed # delete lock for RedHat / SuSE - if test -f /var/lock/subsys/mysqlmanager + if test -f $lock_dir then - rm -f /var/lock/subsys/mysqlmanager + rm -f $lock_dir fi else - log_failure_msg "mysqlmanager PID file could not be found!" + log_failure_msg "MySQL manager or server PID file could not be found!" fi ;; @@ -249,9 +315,19 @@ case "$mode" in $0 start ;; + 'reload') + if test -s "$server_pid_file" ; then + mysqld_pid=`cat $server_pid_file` + kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL" + touch $server_pid_file + else + log_failure_msg "MySQL PID file could not be found!" + fi + ;; + *) # usage - echo "Usage: $0 start|stop|restart" + echo "Usage: $0 start|stop|restart|reload" exit 1 ;; esac From 2ef1963c9142e98f638c07ccdbe3e131868c90e8 Mon Sep 17 00:00:00 2001 From: "sergefp@mysql.com" <> Date: Sun, 17 Apr 2005 02:05:09 +0400 Subject: [PATCH 198/204] Fix for BUG#9348: when computing union of two intervals set lower bound to minimum of lower bounds of two joined intervals. --- mysql-test/r/range.result | 19 +++++++++++++++++++ mysql-test/t/range.test | 21 +++++++++++++++++++++ sql/opt_range.cc | 1 + 3 files changed, 41 insertions(+) diff --git a/mysql-test/r/range.result b/mysql-test/r/range.result index fc2b4a78469..afd91ce5fe9 100644 --- a/mysql-test/r/range.result +++ b/mysql-test/r/range.result @@ -577,3 +577,22 @@ id select_type table type possible_keys key key_len ref rows Extra explain select * from t1 where a='aaa' collate latin1_german1_ci; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL a NULL NULL NULL 9 Using where +drop table t1; +CREATE TABLE t1 ( +`CLIENT` char(3) character set latin1 collate latin1_bin NOT NULL default '000', +`ARG1` char(3) character set latin1 collate latin1_bin NOT NULL default '', +`ARG2` char(3) character set latin1 collate latin1_bin NOT NULL default '', +`FUNCTION` varchar(10) character set latin1 collate latin1_bin NOT NULL default '', +`FUNCTINT` int(11) NOT NULL default '0', +KEY `VERI_CLNT~2` (`ARG1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES ('000',' 0',' 0','Text 001',0), ('000',' 0',' 1','Text 002',0), +('000',' 1',' 2','Text 003',0), ('000',' 2',' 3','Text 004',0), +('001',' 3',' 0','Text 017',0); +SELECT count(*) FROM t1 WHERE CLIENT='000' AND (ARG1 != ' 1' OR ARG1 != ' 2'); +count(*) +4 +SELECT count(*) FROM t1 WHERE CLIENT='000' AND (ARG1 != ' 2' OR ARG1 != ' 1'); +count(*) +4 +drop table t1; diff --git a/mysql-test/t/range.test b/mysql-test/t/range.test index 44f55da5722..3d3d4748fe3 100644 --- a/mysql-test/t/range.test +++ b/mysql-test/t/range.test @@ -445,3 +445,24 @@ explain select * from t1 where a=binary 'aaa'; explain select * from t1 where a='aaa' collate latin1_bin; # this one cannot: explain select * from t1 where a='aaa' collate latin1_german1_ci; +drop table t1; + +# Test for BUG#9348 "result for WHERE A AND (B OR C) differs from WHERE a AND (C OR B)" +CREATE TABLE t1 ( + `CLIENT` char(3) character set latin1 collate latin1_bin NOT NULL default '000', + `ARG1` char(3) character set latin1 collate latin1_bin NOT NULL default '', + `ARG2` char(3) character set latin1 collate latin1_bin NOT NULL default '', + `FUNCTION` varchar(10) character set latin1 collate latin1_bin NOT NULL default '', + `FUNCTINT` int(11) NOT NULL default '0', + KEY `VERI_CLNT~2` (`ARG1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +INSERT INTO t1 VALUES ('000',' 0',' 0','Text 001',0), ('000',' 0',' 1','Text 002',0), + ('000',' 1',' 2','Text 003',0), ('000',' 2',' 3','Text 004',0), + ('001',' 3',' 0','Text 017',0); + +SELECT count(*) FROM t1 WHERE CLIENT='000' AND (ARG1 != ' 1' OR ARG1 != ' 2'); + +SELECT count(*) FROM t1 WHERE CLIENT='000' AND (ARG1 != ' 2' OR ARG1 != ' 1'); +drop table t1; + diff --git a/sql/opt_range.cc b/sql/opt_range.cc index d25901e56b1..e2cae0598a0 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -1683,6 +1683,7 @@ key_or(SEL_ARG *key1,SEL_ARG *key2) last=last->next; key1=key1->tree_delete(save); } + last->copy_min(tmp); if (last->copy_min(key2) || last->copy_max(key2)) { // Full range key1->free_tree(); From 4bc0a01d33e7a7438b5d8c49a61772d4450e245a Mon Sep 17 00:00:00 2001 From: "lenz@mysql.com" <> Date: Sun, 17 Apr 2005 12:44:59 +0200 Subject: [PATCH 199/204] - removed ReadMe.txt from CLEANFILES, as it's cleaned by Docs/Makefile.am already (and that's the Makefile that acutally creates it) --- support-files/MacOSX/Makefile.am | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/support-files/MacOSX/Makefile.am b/support-files/MacOSX/Makefile.am index ff16fa3235a..4cdd7348cd7 100644 --- a/support-files/MacOSX/Makefile.am +++ b/support-files/MacOSX/Makefile.am @@ -38,8 +38,7 @@ CLEANFILES = Info.plist \ Description.plist \ StartupParameters.plist \ postinstall \ - preinstall \ - ReadMe.txt + preinstall SUFFIXES = .sh From 03d8c01a4c14b988c7d32d86f7d2c02861eeae3e Mon Sep 17 00:00:00 2001 From: "dlenev@brandersnatch.localdomain" <> Date: Mon, 18 Apr 2005 15:58:58 +0400 Subject: [PATCH 200/204] Fixed test results after merging fix for bug #8068 "TIMEDIFF with first negative argument gives wrong result" into 5.0 tree. --- mysql-test/r/func_sapdb.result | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/func_sapdb.result b/mysql-test/r/func_sapdb.result index 729c5f73e0e..f209866d953 100644 --- a/mysql-test/r/func_sapdb.result +++ b/mysql-test/r/func_sapdb.result @@ -215,7 +215,8 @@ ttt qqq eee rrr -744:00:00 NULL NULL NULL 26305:01:02 22:58:58 -22:58:58 NULL -26305:01:02 -22:58:58 22:58:58 NULL -NULL 26:02:02 26:02:02 NULL +NULL 26:02:02 -26:02:02 NULL +00:00:00 -26:02:02 26:02:02 NULL NULL NULL NULL NULL NULL NULL NULL NULL 00:00:00 -24:00:00 24:00:00 NULL From 69d4d438d2fd7a12a7fac7d95c55478320d3ccb3 Mon Sep 17 00:00:00 2001 From: "heikki@hundin.mysql.fi" <> Date: Mon, 18 Apr 2005 14:59:25 +0300 Subject: [PATCH 201/204] ha_innodb.cc: Style fix --- sql/ha_innodb.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index a26c706bb08..3f592e36219 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -6518,7 +6518,7 @@ prototype for this function ! */ ibool innobase_query_is_update(void) -/*===========================*/ +/*==========================*/ { THD* thd; From 969263cf1df22b74be8da7d48878075c7f1edcce Mon Sep 17 00:00:00 2001 From: "sergefp@mysql.com" <> Date: Mon, 18 Apr 2005 22:30:22 +0400 Subject: [PATCH 202/204] Post merge fix - updated the test results (BUG#9439) --- mysql-test/r/show_check.result | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 7ecfc8059fd..dd07e0ba755 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -482,18 +482,18 @@ PRIMARY KEY(field1(1000)) ); show index from t1; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def Table 253 64 2 N 129 31 63 -def Non_unique 1 1 1 N 32929 0 63 -def Key_name 253 64 7 N 129 31 63 -def Seq_in_index 1 2 1 N 32929 0 63 -def Column_name 253 64 6 N 129 31 63 -def Collation 253 1 1 Y 128 31 63 -def Cardinality 8 21 1 Y 32896 0 63 -def Sub_part 2 3 4 Y 32928 0 63 -def Packed 253 10 0 Y 128 31 63 -def Null 253 3 0 N 129 31 63 -def Index_type 253 16 5 N 129 31 63 -def Comment 253 255 0 N 129 31 63 +def STATISTICS TABLE_NAME Table 253 64 2 N 1 0 63 +def STATISTICS NON_UNIQUE Non_unique 8 1 1 N 32769 0 63 +def STATISTICS INDEX_NAME Key_name 253 64 7 N 1 0 63 +def STATISTICS SEQ_IN_INDEX Seq_in_index 8 2 1 N 32769 0 63 +def STATISTICS COLUMN_NAME Column_name 253 64 6 N 1 0 63 +def STATISTICS COLLATION Collation 253 1 1 Y 0 0 63 +def STATISTICS CARDINALITY Cardinality 8 21 1 Y 32768 0 63 +def STATISTICS SUB_PART Sub_part 8 3 4 Y 32768 0 63 +def STATISTICS PACKED Packed 253 10 0 Y 0 0 63 +def STATISTICS NULLABLE Null 253 3 0 N 1 0 63 +def STATISTICS INDEX_TYPE Index_type 253 16 5 N 1 0 63 +def STATISTICS COMMENT Comment 253 16 0 Y 0 0 63 Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment t1 0 PRIMARY 1 field1 A 0 1000 NULL BTREE drop table t1; From 1658d737b3fdb1417854cc4d34d5c4fe49f7c265 Mon Sep 17 00:00:00 2001 From: "jani@a193-229-222-105.elisa-laajakaista.fi" <> Date: Tue, 19 Apr 2005 00:22:57 +0300 Subject: [PATCH 203/204] Fixed Bug#6593, "Inconsistency in handling option prefixes (--skip, --disable, etc.)" --- mysys/my_getopt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index 53e46932167..5e93ad56cb5 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -205,7 +205,8 @@ int handle_options(int *argc, char ***argv, { if (!getopt_compare_strings(special_opt_prefix[i], opt_str, special_opt_prefix_lengths[i]) && - opt_str[special_opt_prefix_lengths[i]] == '-') + (opt_str[special_opt_prefix_lengths[i]] == '-' || + opt_str[special_opt_prefix_lengths[i]] == '_')) { /* We were called with a special prefix, we can reuse opt_found From 60164ced473aa19498a387f2214c89ce4014502f Mon Sep 17 00:00:00 2001 From: "igor@rurik.mysql.com" <> Date: Mon, 18 Apr 2005 14:44:14 -0700 Subject: [PATCH 204/204] view.result: Correction after fix for bug #9902. --- mysql-test/r/view.result | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index bfbc1574149..59ff6abdde2 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -782,7 +782,7 @@ create function `f``1` () returns int return 5; create view v1 as select test.`f``1` (); show create view v1; View Create View -v1 CREATE ALGORITHM=UNDEFINED VIEW `test`.`v1` AS select `test`.`f``1`() AS `test.``f````1`` ()` +v1 CREATE ALGORITHM=UNDEFINED VIEW `test`.`v1` AS select sql_no_cache `test`.`f``1`() AS `test.``f````1`` ()` select * from v1; test.`f``1` () 5