diff options
author | unknown <monty@tik.mysql.com> | 2000-12-15 10:58:17 +0200 |
---|---|---|
committer | unknown <monty@tik.mysql.com> | 2000-12-15 10:58:17 +0200 |
commit | e1e7ba756a609f9e78d4cbf8291b7f1859df4425 (patch) | |
tree | af18dadc582d3cff29172087140d13e2a78fecac | |
parent | 6d8a5e9088526f2fb86bf7aaefc7426ee1291afc (diff) | |
download | mariadb-git-e1e7ba756a609f9e78d4cbf8291b7f1859df4425.tar.gz |
Fixed that LPAD() and RPAD() cuts arguments
New test for string functions
Docs/manual.texi:
Updated changes for 3.23.29
client/mysqldump.c:
Cleanup
libmysql/libmysql.c:
Fixed possible overflow
sql/handler.cc:
Fixed typo
sql/item_strfunc.cc:
Fixed that LPAD() and RPAD() cuts arguments
sql/mysqld.cc:
Better error message on core dump
BitKeeper/etc/logging_ok:
Logging to logging@openlogging.org accepted
-rw-r--r-- | BitKeeper/etc/logging_ok | 7 | ||||
-rw-r--r-- | Docs/manual.texi | 59 | ||||
-rw-r--r-- | client/mysqldump.c | 3 | ||||
-rw-r--r-- | libmysql/libmysql.c | 8 | ||||
-rw-r--r-- | mysql-test/r/strfunc.result | 62 | ||||
-rw-r--r-- | mysql-test/t/strfunc.test | 40 | ||||
-rw-r--r-- | sql/handler.cc | 2 | ||||
-rw-r--r-- | sql/item_strfunc.cc | 10 | ||||
-rw-r--r-- | sql/mysqld.cc | 6 |
9 files changed, 168 insertions, 29 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index b239a449652..a6b0f220269 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -1,6 +1 @@ -jani@prima.mysql.com -jani@prima.mysql.fi -monty@donna.mysql.com -sasha@mysql.sashanet.com -sasha@work.mysql.com -serg@serg.mysql.com +monty@tik.mysql.com diff --git a/Docs/manual.texi b/Docs/manual.texi index 9e39092318e..b319edc01d8 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -9778,8 +9778,7 @@ the sort order! @item The default return type of @code{IF} will now depend on both arguments and not only the first argument. @item @code{AUTO_INCREMENT} will not work with negative numbers. -@item @code{INNER}, @code{DELAYED}, @code{RIGHT} and @code{WHEN} -are now reserved words. +@item @code{INNER}, @code{DELAYED}, @code{RIGHT}, @code{CASE}, @code{THEN}, @code{WHEN}, @code{ELSE}, @code{END} and @code{WHEN} are now reserved words. @item @code{FLOAT(X)} is now a true floating-point type and not a value with a fixed number of decimals. @item When declaring @code{DECIMAL(length,dec)} the length argument no @@ -9816,10 +9815,11 @@ almost always sorted. In Version 3.23, you must use @code{GROUP BY} or @item @code{SUM()} now returns @code{NULL}, instead of 0, if there is no matching rows. This is according to ANSI SQL. -@item New restricted words: @code{CASE, THEN, WHEN, ELSE, END, and RIGHT}. @item An @code{AND} or @code{OR} with @code{NULL} values will now return @code{NULL} instead of 0. This mostly affects queries that use @code{NOT} on an @code{AND/OR} expression as @code{NOT NULL} = @code{NULL}. +@code{LPAD()} and @code{RPAD()} will shorten the result string if it's longer +than the length argument. @end itemize @cindex compatibility, between MySQL versions @@ -14389,11 +14389,13 @@ The values retrieved from the @code{CHAR(4)} and @code{VARCHAR(4)} columns will be the same in each case, because trailing spaces are removed from @code{CHAR} columns upon retrieval. -Values in @code{CHAR} and @code{VARCHAR} columns are sorted and compared in -case-insensitive fashion, unless the @code{BINARY} attribute was specified -when the table was created. The @code{BINARY} attribute means that column -values are sorted and compared in case-sensitive fashion according to the -ASCII order of the machine where the @strong{MySQL} server is running. +Values in @code{CHAR} and @code{VARCHAR} columns are sorted and compared +in case-insensitive fashion, unless the @code{BINARY} attribute was +specified when the table was created. The @code{BINARY} attribute means +that column values are sorted and compared in case-sensitive fashion +according to the ASCII order of the machine where the @strong{MySQL} +server is running. @code{BINARY} doesn't affect how the column is stored +or retrieved. The @code{BINARY} attribute is sticky. This means that if a column marked @code{BINARY} is used in an expression, the whole expression is compared as a @@ -14831,6 +14833,11 @@ between function calls and references to tables or columns that happen to have the same name as a function. Spaces around arguments are permitted, though. +You can force @strong{MySQL} to accept spaces after the function name by +starting @code{mysqld} with @code{--ansi} or using the +@code{CLIENT_IGNORE_SPACE} to @code{mysql_connect()}, but in this case all +function names will become reserved words. @xref{ANSI mode}. + @need 2000 For the sake of brevity, examples display the output from the @code{mysql} program in abbreviated form. So this: @@ -16160,8 +16167,9 @@ This function is multi-byte safe. @findex LPAD() @item LPAD(str,len,padstr) -Returns the string @code{str}, left-padded with the string -@code{padstr} until @code{str} is @code{len} characters long: +Returns the string @code{str}, left-padded with the string @code{padstr} +until @code{str} is @code{len} characters long. If @code{str} is longer +than @code{len'} then it will be shortened to @code{len} characters. @example mysql> select LPAD('hi',4,'??'); @@ -16171,7 +16179,10 @@ mysql> select LPAD('hi',4,'??'); @findex RPAD() @item RPAD(str,len,padstr) Returns the string @code{str}, right-padded with the string -@code{padstr} until @code{str} is @code{len} characters long. +@code{padstr} until @code{str} is @code{len} characters long. If +@code{str} is longer than @code{len'} then it will be shortened to +@code{len} characters. + @example mysql> select RPAD('hi',5,'?'); -> 'hi???' @@ -20624,6 +20635,12 @@ threads. Otherwise, you can see only your own threads. @xref{KILL, , @code{KILL}}. If you don't use the @code{FULL} option, then only the first 100 characters of each query will be shown. +This command is very useful if you get the 'too many connections' error +message and want to find out what's going on. @strong{MySQL} reserves +one extra connection for a client with the @code{Process_priv} privilege +to ensure that you should always be able to login and check the system +(assuming you are not giving this privilege to all your users). + @cindex privileges, display @node SHOW GRANTS, SHOW CREATE TABLE, SHOW PROCESSLIST, SHOW @subsection SHOW GRANTS (Privileges) for a User @@ -26846,8 +26863,8 @@ statement. In this case the last @code{SELECT} statement in the previous scenario would execute before the @code{INSERT} statement. @item -You can give a specific @code{INSERT}, @code{UPDATE}, or @code{DELETE} statement -lower priority with the @code{LOW_PRIORITY} attribute. +You can give a specific @code{INSERT}, @code{UPDATE}, or @code{DELETE} +statement lower priority with the @code{LOW_PRIORITY} attribute. @item Start @code{mysqld} with a low value for @strong{max_write_lock_count} to give @@ -39765,6 +39782,11 @@ though, so Version 3.23 is not released as a stable version yet. @appendixsubsec Changes in release 3.23.29 @itemize @bullet @item +Fixed bug in @code{REPLACE} with BDB tables. +@item +@code{LPAD()} and @code{RPAD()} will shorten the result string if it's longer +than the length argument. +@item Remove not used BDB logs on shutdown. @item When creating a table, put @code{PRIMARY} keys first, followed by @@ -44994,6 +45016,17 @@ using @code{-O thread_cache_size= 5'} will help a lot! If you want to get a core dump on Linux if @code{mysqld} dies with a SIGSEGV signal, you can start mysqld with the @code{--core-file} option. +This core file can be used to make a backtrace that may help you +find out why @code{mysqld} died: + +@example +shell> gdb mysqld core +gdb> backtrace +gdb> info local +gdb> exit +@end example + +@xref{Crashing}. If you are using gdb 4.17.x or above on Linux, you should install a @file{.gdb} file, with the following information, in your current diff --git a/client/mysqldump.c b/client/mysqldump.c index ac9aed87022..f27f5c5e35b 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -660,11 +660,10 @@ static uint getTableStructure(char *table, char* db) strpos=strend(insert_pat); while ((row=mysql_fetch_row(tableRes))) { - ulong *lengths=mysql_fetch_lengths(tableRes); if (init) { if (cFlag) - strpos=strmov(strpos,", "); + strpos=strmov(strpos,", "); } init=1; if (cFlag) diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 8f750affd5f..9f71273b119 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -531,8 +531,8 @@ static void read_user_name(char *name) static void read_user_name(char *name) { - char *str=getenv("USER"); - strmov(name,str ? str : "ODBC"); /* ODBC will send user variable */ + char *str=getenv("USER"); /* ODBC will send user variable */ + strmake(name,str ? str : "ODBC", USERNAME_LENGTH); } #endif @@ -1149,8 +1149,8 @@ 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) { - char buff[NAME_LEN+100],charset_name_buff[16],*end,*host_info, - *charset_name; + char buff[NAME_LEN+USERNAME_LENGTH+100],charset_name_buff[16]; + char *end,*host_info,*charset_name; my_socket sock; uint32 ip_addr; struct sockaddr_in sock_addr; diff --git a/mysql-test/r/strfunc.result b/mysql-test/r/strfunc.result new file mode 100644 index 00000000000..ac352d2ffb7 --- /dev/null +++ b/mysql-test/r/strfunc.result @@ -0,0 +1,62 @@ +hello 'hello' ""hello"" 'h'e'l'l'o' hel"lo hel'lo +hello 'hello' ""hello"" 'h'e'l'l'o' hel"lo hel'lo +hello +hellomonty +length('\n\t\r\b\0\_\%\\') +10 +concat('monty',' was here ','again') length('hello') char(ascii('h')) +monty was here again 5 h +locate('he','hello') locate('he','hello',2) locate('lo','hello',2) +1 0 4 +instr('hello','he') +1 +position('ll' in 'hello') position('a' in 'hello') +3 0 +left('hello',2) right('hello',2) substring('hello',2,2) mid('hello',1,5) +he lo el hello +concat('',left(right(concat('what ',concat('is ','happening')),9),4),'',substring('monty',5,1)) +happy +substring_index('www.tcx.se','.',-2) substring_index('www.tcx.se','.',1) +tcx.se www +substring_index('www.tcx.se','tcx',1) substring_index('www.tcx.se','tcx',-1) +www. .se +substring_index('.tcx.se','.',-2) substring_index('.tcx.se','.tcx',-1) +tcx.se .se +concat(':',ltrim(' left '),':',rtrim(' right '),':') +:left : right: +concat(':',trim(LEADING FROM ' left'),':',trim(TRAILING FROM ' right '),':') +:left: right: +concat(':',trim(' m '),':',trim(BOTH FROM ' y '),':',trim('*' FROM '*s*'),':') +:m:y:s: +concat(':',trim(BOTH 'ab' FROM 'ababmyabab'),':',trim(BOTH '*' FROM '***sql'),':') +:my:sql: +concat(':',trim(LEADING '.*' FROM '.*my'),':',trim(TRAILING '.*' FROM 'sql.*.*'),':') +:my:sql: +insert('txs',2,1,'hi') insert('is ',4,0,'a') insert('txxxxt',2,4,'es') +this is a test +replace('aaaa','a','b') replace('aaaa','aa','b') replace('aaaa','a','bb') replace('aaaa','','b') replace('bbbb','a','c') +bbbb bb bbbbbbbb aaaa bbbb +replace(concat(lcase(concat('THIS',' ','IS',' ','A',' ')),ucase('false'),' ','test'),'FALSE','REAL') +this is a REAL test +soundex('') soundex('he') soundex('hello all folks') + H000 H4142 +password('test') length(encrypt('test')) encrypt('test','aa') +378b243e220ca493 13 aaqPiZY5xR5l. +md5('hello') +5d41402abc4b2a76b9719d911017c592 +repeat('monty',5) concat('*',space(5),'*') +montymontymontymontymonty * * +reverse('abc') reverse('abcd') +cba dcba +rpad('a',4,'1') rpad('a',4,'12') rpad('abcd',3,'12') +a111 a121 abc +lpad('a',4,'1') lpad('a',4,'12') lpad('abcd',3,'12') +111a 121a abc +rpad(741653838,17,'0') lpad(741653838,17,'0') +74165383800000000 00000000741653838 +rpad('abcd',7,'ab') lpad('abcd',7,'ab') +abcdaba abaabcd +rpad('abcd',1,'ab') lpad('abcd',1,'ab') +a a +LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD') GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD') +HAROLD HARRY diff --git a/mysql-test/t/strfunc.test b/mysql-test/t/strfunc.test new file mode 100644 index 00000000000..7b49da05614 --- /dev/null +++ b/mysql-test/t/strfunc.test @@ -0,0 +1,40 @@ +# Version: 3.23.29 +# +# Description +# ----------- +# Testing string functions + +select 'hello',"'hello'",'""hello""','''h''e''l''l''o''',"hel""lo",'hel\'lo'; +select 'hello' 'monty'; +select length('\n\t\r\b\0\_\%\\'); +select concat('monty',' was here ','again'),length('hello'),char(ascii('h')); +select locate('he','hello'),locate('he','hello',2),locate('lo','hello',2) ; +select instr('hello','he'); +select position('ll' in 'hello'),position('a' in 'hello'); +select left('hello',2),right('hello',2),substring('hello',2,2),mid('hello',1,5) ; +select concat('',left(right(concat('what ',concat('is ','happening')),9),4),'',substring('monty',5,1)) ; +select substring_index('www.tcx.se','.',-2),substring_index('www.tcx.se','.',1); +select substring_index('www.tcx.se','tcx',1),substring_index('www.tcx.se','tcx',-1); +select substring_index('.tcx.se','.',-2),substring_index('.tcx.se','.tcx',-1); + +select concat(':',ltrim(' left '),':',rtrim(' right '),':'); +select concat(':',trim(LEADING FROM ' left'),':',trim(TRAILING FROM ' right '),':'); +select concat(':',trim(' m '),':',trim(BOTH FROM ' y '),':',trim('*' FROM '*s*'),':'); +select concat(':',trim(BOTH 'ab' FROM 'ababmyabab'),':',trim(BOTH '*' FROM '***sql'),':'); +select concat(':',trim(LEADING '.*' FROM '.*my'),':',trim(TRAILING '.*' FROM 'sql.*.*'),':'); + +select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es'); +select replace('aaaa','a','b'),replace('aaaa','aa','b'),replace('aaaa','a','bb'),replace('aaaa','','b'),replace('bbbb','a','c'); +select replace(concat(lcase(concat('THIS',' ','IS',' ','A',' ')),ucase('false'),' ','test'),'FALSE','REAL') ; +select soundex(''),soundex('he'),soundex('hello all folks'); +select password('test'),length(encrypt('test')),encrypt('test','aa'); +select md5('hello'); +select repeat('monty',5),concat('*',space(5),'*'); +select reverse('abc'),reverse('abcd'); +select rpad('a',4,'1'),rpad('a',4,'12'),rpad('abcd',3,'12'); +select lpad('a',4,'1'),lpad('a',4,'12'),lpad('abcd',3,'12'); +select rpad(741653838,17,'0'),lpad(741653838,17,'0'); +select rpad('abcd',7,'ab'),lpad('abcd',7,'ab'); +select rpad('abcd',1,'ab'),lpad('abcd',1,'ab'); + +select LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'),GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'); diff --git a/sql/handler.cc b/sql/handler.cc index 24bf16b3604..930bfa2ed28 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -615,7 +615,7 @@ void handler::print_error(int error, myf errflag) uint handler::get_dup_key(int error) { - DBUG_ENTER("key_error"); + DBUG_ENTER("get_dup_key"); table->file->errkey = (uint) -1; if (error == HA_ERR_FOUND_DUPP_KEY || error == HA_ERR_FOUND_DUPP_UNIQUE) info(HA_STATUS_ERRKEY | HA_STATUS_NO_LOCK); diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 39bbdcaff1f..103d82f36aa 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1465,7 +1465,10 @@ String *Item_func_rpad::val_str(String *str) goto err; null_value=0; if (count <= (int32) (res_length=res->length())) - return (res); // String to pad is big enough + { // String to pad is big enough + res->length(count); // Shorten result if longer + return (res); + } length_pad= rpad->length(); if ((ulong) count > max_allowed_packet || args[2]->null_value || !length_pad) goto err; @@ -1521,7 +1524,10 @@ String *Item_func_lpad::val_str(String *str) goto err; null_value=0; if (count <= (res_length=res->length())) - return (res); // String to pad is big enough + { // String to pad is big enough + res->length(count); // Shorten result if longer + return (res); + } length_pad= lpad->length(); if (count > max_allowed_packet || args[2]->null_value || !length_pad) goto err; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 8ebda66ffdb..93a696bac13 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1042,7 +1042,11 @@ static void init_signals(void) static sig_handler write_core(int sig) { - fprintf(stderr,"Got signal %s in thread %d\n",sys_siglist[sig],getpid()); + fprintf(stderr,"\ +mysqld got signal %s in thread %d; Writing core file: %s\n\ +The manual section 'Debugging a MySQL server' tells you how to use a \n\ +debugger on the core file to produce a backtrace that may help you find out\n\ +why mysqld died\n",sys_siglist[sig],getpid(),mysql_home); signal(sig, SIG_DFL); if (fork() != 0) exit(1); // Abort main program // Core will be written at exit |