From a54adfc3ab4d6fcb20570202d33495e2b6ffd613 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 7 Feb 2004 02:22:12 +0400 Subject: [PATCH 01/18] fixed bug #2592 mysqldump doesn't quote "tricky" names correctly mysql-test/r/mysqldump.result: added test for bug #2592 mysqldump doesn't quote "tricky" names correctly please note, output's still looking wrong because of bug #2593 it will be fixed when fix for bug #2593 will be pushed mysql-test/t/mysqldump.test: added test for bug #2592 mysqldump doesn't quote "tricky" names correctly sql/sql_lex.cc: fixed processing of multibyte quoted variables --- client/mysqldump.c | 4 ++-- mysql-test/r/mysqldump.result | 18 ++++++++++++++++++ mysql-test/t/mysqldump.test | 8 ++++++++ sql/sql_lex.cc | 30 +++++++++++++++++++----------- 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/client/mysqldump.c b/client/mysqldump.c index 921ffbaab5b..74799ff4845 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -649,7 +649,7 @@ static char *quote_name(const char *name, char *buff, my_bool force) while (*name) { if (*name == QUOTE_CHAR) - *to= QUOTE_CHAR; + *to++= QUOTE_CHAR; *to++= *name++; } to[0]=QUOTE_CHAR; @@ -1647,7 +1647,7 @@ static int dump_all_tables_in_db(char *database) if (opt_xml) fputs("\n", md_result_file); if (lock_tables) - mysql_query(sock,"UNLOCK_TABLES"); + mysql_query(sock,"UNLOCK TABLES"); return 0; } /* dump_all_tables_in_db */ diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index f51caee39d6..651a33ac1db 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -123,3 +123,21 @@ UNLOCK TABLES; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; DROP TABLE t1; +create table ```a` (i int); +DROP TABLE IF EXISTS ```a`; +CREATE TABLE ``a` ( + `i` int(11) default NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + + +/*!40000 ALTER TABLE ```a` DISABLE KEYS */; +LOCK TABLES ```a` WRITE; +UNLOCK TABLES; +/*!40000 ALTER TABLE ```a` ENABLE KEYS */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; + +drop table ```a`; diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index 93b0dd4a75d..e6115b61bbf 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -53,3 +53,11 @@ CREATE TABLE t1 (a VARCHAR(255)) DEFAULT CHARSET koi8r; INSERT INTO t1 VALUES (_koi8r x'C1C2C3C4C5'); --exec $MYSQL_DUMP --skip-comments test t1 DROP TABLE t1; + +# +# Bug #2592 +# + +create table ```a` (i int); +--exec $MYSQL_DUMP --skip-comments test +drop table ```a`; \ No newline at end of file diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 65c958093bd..017b5677ced 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -667,13 +667,24 @@ int yylex(void *arg, void *yythd) case MY_LEX_USER_VARIABLE_DELIMITER: { - char delim= c; // Used char + uint double_quotes= 0; + char quote_char= c; // Used char lex->tok_start=lex->ptr; // Skip first ` #ifdef USE_MB if (use_mb(cs)) { - while ((c=yyGet()) && c != delim && c != (uchar) NAMES_SEP_CHAR) + while ((c= yyGet())) { + if (c == quote_char) + { + if (yyPeek() != quote_char) + break; + c= yyGet(); + double_quotes++; + continue; + } + if (c == (uchar) NAMES_SEP_CHAR) + break; if (my_mbcharlen(cs, c) > 1) { int l; @@ -684,13 +695,10 @@ int yylex(void *arg, void *yythd) lex->ptr += l-1; } } - yylval->lex_str=get_token(lex,yyLength()); } else #endif { - uint double_quotes= 0; - char quote_char= c; while ((c=yyGet())) { if (c == quote_char) @@ -704,13 +712,13 @@ int yylex(void *arg, void *yythd) if (c == (uchar) NAMES_SEP_CHAR) break; } - if (double_quotes) - yylval->lex_str=get_quoted_token(lex,yyLength() - double_quotes, - quote_char); - else - yylval->lex_str=get_token(lex,yyLength()); } - if (c == delim) + if (double_quotes) + yylval->lex_str=get_quoted_token(lex,yyLength() - double_quotes, + quote_char); + else + yylval->lex_str=get_token(lex,yyLength()); + if (c == quote_char) yySkip(); // Skip end ` lex->next_state= MY_LEX_START; return(IDENT_QUOTED); From 102a9c6f50416b3faf79abd3ea360dd3b49b7513 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 15:42:46 +0400 Subject: [PATCH 02/18] http://bugs.mysql.com/bug.php?id=2368 Multibyte charsets do not check that incoming data is well-formed --- BUILD/compile-pentium-debug-max-no-embedded | 13 +++++ mysql-test/r/ctype_utf8.result | 55 +++++++++++++++++++++ mysql-test/t/ctype_utf8.test | 19 +++++++ sql/field.cc | 32 ++++++------ sql/field.h | 9 ++++ strings/ctype-mb.c | 17 ++++--- 6 files changed, 120 insertions(+), 25 deletions(-) create mode 100755 BUILD/compile-pentium-debug-max-no-embedded diff --git a/BUILD/compile-pentium-debug-max-no-embedded b/BUILD/compile-pentium-debug-max-no-embedded new file mode 100755 index 00000000000..4554e38fdc1 --- /dev/null +++ b/BUILD/compile-pentium-debug-max-no-embedded @@ -0,0 +1,13 @@ +#! /bin/sh + +path=`dirname $0` +. "$path/SETUP.sh" + +extra_flags="$pentium_cflags $debug_cflags" +c_warnings="$c_warnings $debug_extra_warnings" +cxx_warnings="$cxx_warnings $debug_extra_warnings" +extra_configs="$pentium_configs $debug_configs" + +extra_configs="$extra_configs --with-berkeley-db --with-innodb --without-isam --with-openssl --with-raid" + +. "$path/FINISH.sh" diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index 815ab492fa4..a75b2b6065c 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -88,3 +88,58 @@ select s1,hex(s1),char_length(s1),octet_length(s1) from t1; s1 hex(s1) char_length(s1) octet_length(s1) Á D0B0 1 2 drop table t1; +create table t1 (s1 tinytext character set utf8); +insert into t1 select repeat('a',300); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +insert into t1 select repeat('Ñ',300); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +insert into t1 select repeat('aÑ',300); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +insert into t1 select repeat('Ña',300); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +insert into t1 select repeat('ÑÑ',300); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +select hex(s1) from t1; +hex(s1) +616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161 +D18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18F +61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F +D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61D18F61 +D18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18FD18F +select length(s1),char_length(s1) from t1; +length(s1) char_length(s1) +255 255 +254 127 +255 170 +255 170 +254 127 +drop table t1; +create table t1 (s1 text character set utf8); +insert into t1 select repeat('a',66000); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +insert into t1 select repeat('Ñ',66000); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +insert into t1 select repeat('aÑ',66000); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +insert into t1 select repeat('Ña',66000); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +insert into t1 select repeat('ÑÑ',66000); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +select length(s1),char_length(s1) from t1; +length(s1) char_length(s1) +65535 65535 +65534 32767 +65535 43690 +65535 43690 +65534 32767 +drop table t1; diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index 9da7b32eb6d..0d42533c95f 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -61,3 +61,22 @@ create table t1 (s1 char(1) character set utf8); insert into t1 values (_koi8r'ÁÂ'); select s1,hex(s1),char_length(s1),octet_length(s1) from t1; drop table t1; + +create table t1 (s1 tinytext character set utf8); +insert into t1 select repeat('a',300); +insert into t1 select repeat('Ñ',300); +insert into t1 select repeat('aÑ',300); +insert into t1 select repeat('Ña',300); +insert into t1 select repeat('ÑÑ',300); +select hex(s1) from t1; +select length(s1),char_length(s1) from t1; +drop table t1; + +create table t1 (s1 text character set utf8); +insert into t1 select repeat('a',66000); +insert into t1 select repeat('Ñ',66000); +insert into t1 select repeat('aÑ',66000); +insert into t1 select repeat('Ña',66000); +insert into t1 select repeat('ÑÑ',66000); +select length(s1),char_length(s1) from t1; +drop table t1; diff --git a/sql/field.cc b/sql/field.cc index cce7446dcff..d26534b5ac7 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -4485,19 +4485,9 @@ void Field_blob::store_length(uint32 number) { switch (packlength) { case 1: - if (number > 255) - { - number=255; - set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED); - } ptr[0]= (uchar) number; break; case 2: - if (number > (uint16) ~0) - { - number= (uint16) ~0; - set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED); - } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) { @@ -4508,11 +4498,6 @@ void Field_blob::store_length(uint32 number) shortstore(ptr,(unsigned short) number); break; case 3: - if (number > (uint32) (1L << 24)) - { - number= (uint32) (1L << 24)-1L; - set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED); - } int3store(ptr,number); break; case 4: @@ -4573,6 +4558,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) bool was_conversion; char buff[80]; String tmpstr(buff,sizeof(buff), &my_charset_bin); + uint copy_length; uint32 not_used; /* Convert character set if nesessary */ @@ -4583,12 +4569,22 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) from= tmpstr.ptr(); length= tmpstr.length(); } - Field_blob::store_length(length); - if (was_conversion || table->copy_blobs || length <= MAX_FIELD_WIDTH) + + copy_length= max_data_length(); + if (copy_length > length) + copy_length= length; + copy_length= field_charset->cset->wellformedlen(field_charset, + from,from+copy_length, + field_length); + if (copy_length < length) + set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED); + + Field_blob::store_length(copy_length); + if (was_conversion || table->copy_blobs || copy_length <= MAX_FIELD_WIDTH) { // Must make a copy if (from != value.ptr()) // For valgrind { - value.copy(from,length,charset()); + value.copy(from,copy_length,charset()); from=value.ptr(); } } diff --git a/sql/field.h b/sql/field.h index 9a12fd48e54..b62b7a7859e 100644 --- a/sql/field.h +++ b/sql/field.h @@ -949,6 +949,15 @@ public: void sort_string(char *buff,uint length); uint32 pack_length() const { return (uint32) (packlength+table->blob_ptr_size); } + uint32 max_data_length() const + { + switch (packlength) { + case 1: return 255; + case 2: return (uint32) 0xFFFFL; + case 3: return (uint32) 0xFFFFFF; + default: return (uint32) 0xFFFFFFFF; + } + } void reset(void) { bzero(ptr, packlength+sizeof(char*)); } void reset_fields() { bzero((char*) &value,sizeof(value)); } void store_length(uint32 number); diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index 377bf311d38..46f3e2f4fc3 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -274,18 +274,21 @@ uint my_charpos_mb(CHARSET_INFO *cs __attribute__((unused)), return pos ? e+2-b0 : b-b0; } -uint my_wellformedlen_mb(CHARSET_INFO *cs __attribute__((unused)), - const char *b, const char *e, uint pos) +uint my_wellformedlen_mb(CHARSET_INFO *cs, + const char *b, const char *e, uint pos) { - uint mblen; - const char *b0=b; + my_wc_t wc; + int mblen; + const char *b0= b; - while (pos && bcset->mb_wc(cs, &wc, b, e)) <0) + break; + b+= mblen; pos--; } - return b-b0; + return b - b0; } From b4fc7c7fbf643b39f3686bfe344b21cdd7233fb5 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 17:09:59 +0400 Subject: [PATCH 03/18] Fix for #2208 (multi-query returns wrong result in embedded library) now we execute only one first select during mysql_real_query others - during 'mysql_next_result' include/mysql.h: 'virtual' next_result added libmysql/client_settings.h: cli_next_result declaration added libmysql/libmysql.c: mysql_next_result now works in embedded library as well libmysqld/lib_sql.cc: emb_next_result implemented sql/sql_class.h: fields to store the rest of the query added sql/sql_parse.cc: Saving the rest of the query added for embedded case --- include/mysql.h | 1 + libmysql/client_settings.h | 1 + libmysql/libmysql.c | 25 ++++++++++++++++--------- libmysqld/lib_sql.cc | 20 +++++++++++++++++++- sql/sql_class.h | 2 ++ sql/sql_parse.cc | 13 +++++++++++-- 6 files changed, 50 insertions(+), 12 deletions(-) diff --git a/include/mysql.h b/include/mysql.h index d1b467f9649..3679b65ba4a 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -575,6 +575,7 @@ typedef struct st_mysql_methods int (*unbuffered_fetch)(MYSQL *mysql, char **row); void (*free_embedded_thd)(MYSQL *mysql); const char *(*read_statistic)(MYSQL *mysql); + int (*next_result)(MYSQL *mysql); #endif } MYSQL_METHODS; diff --git a/libmysql/client_settings.h b/libmysql/client_settings.h index b1a85f567f9..6a7da0bcc81 100644 --- a/libmysql/client_settings.h +++ b/libmysql/client_settings.h @@ -58,6 +58,7 @@ int cli_stmt_execute(MYSQL_STMT *stmt); MYSQL_DATA * cli_read_binary_rows(MYSQL_STMT *stmt); int cli_unbuffered_fetch(MYSQL *mysql, char **row); const char * cli_read_statistic(MYSQL *mysql); +int cli_next_result(MYSQL *mysql); #ifdef EMBEDDED_LIBRARY int init_embedded_server(int argc, char **argv, char **groups); diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 977657f8998..a3e88ccd03d 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -3511,6 +3511,21 @@ my_bool STDCALL mysql_more_results(MYSQL *mysql) Reads and returns the next query results */ +int cli_next_result(MYSQL *mysql) +{ + DBUG_ENTER("cli_next_result"); + + mysql->net.last_error[0]= 0; + mysql->net.last_errno= 0; + strmov(mysql->net.sqlstate, not_error_sqlstate); + mysql->affected_rows= ~(my_ulonglong) 0; + + if (mysql->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS) + DBUG_RETURN((*mysql->methods->read_query_result)(mysql)); + + DBUG_RETURN(-1); /* No more results */ +} + int STDCALL mysql_next_result(MYSQL *mysql) { DBUG_ENTER("mysql_next_result"); @@ -3523,15 +3538,7 @@ int STDCALL mysql_next_result(MYSQL *mysql) DBUG_RETURN(1); } - mysql->net.last_error[0]= 0; - mysql->net.last_errno= 0; - strmov(mysql->net.sqlstate, not_error_sqlstate); - mysql->affected_rows= ~(my_ulonglong) 0; - - if (mysql->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS) - DBUG_RETURN((*mysql->methods->read_query_result)(mysql)); - - DBUG_RETURN(-1); /* No more results */ + DBUG_RETURN((*mysql->methods->next_result)(mysql)); } diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index e36e878d4b1..81235ce0c22 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -245,6 +245,18 @@ static MYSQL_RES * emb_mysql_store_result(MYSQL *mysql) return mysql_store_result(mysql); } +int emb_next_result(MYSQL *mysql) +{ + THD *thd= (THD*)mysql->thd; + DBUG_ENTER("emb_next_result"); + + if (emb_advanced_command(mysql, COM_QUERY,0,0, + thd->query_rest,thd->query_rest_length,1) + || emb_mysql_read_query_result(mysql)) + DBUG_RETURN(1); + + DBUG_RETURN(0); /* No more results */ +} MYSQL_METHODS embedded_methods= { @@ -259,7 +271,8 @@ MYSQL_METHODS embedded_methods= emb_read_binary_rows, emb_unbuffered_fetch, emb_free_embedded_thd, - emb_read_statistic + emb_read_statistic, + emb_next_result }; C_MODE_END @@ -749,6 +762,11 @@ bool Protocol::net_store_data(const char *from, uint length) return false; } +char *memdup_mysql(struct st_mysql *mysql, const char*data, int length) +{ + return memdup_root(&mysql->field_alloc, data, length); +} + #if 0 /* The same as Protocol::net_store_data but does the converstion */ diff --git a/sql/sql_class.h b/sql/sql_class.h index 7971137d848..879d75fe26a 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -565,6 +565,8 @@ public: struct st_mysql_bind *client_params; char *extra_data; ulong extra_length; + char *query_rest; + uint32 query_rest_length; #endif NET net; // client connection descriptor MEM_ROOT warn_root; // For warnings and errors diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 9d742995976..564c22dd004 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -48,6 +48,7 @@ extern "C" int gethostname(char *name, int namelen); #endif +char *memdup_mysql(struct st_mysql *mysql, const char*data, int length); static int check_for_max_user_connections(THD *thd, USER_CONN *uc); static void decrease_user_connections(USER_CONN *uc); static bool check_db_used(THD *thd,TABLE_LIST *tables); @@ -1397,11 +1398,13 @@ bool dispatch_command(enum enum_server_command command, THD *thd, char *packet= thd->lex->found_colon; /* Multiple queries exits, execute them individually + in embedded server - just store them to be executed later */ +#ifndef EMBEDDED_LIBRARY if (thd->lock || thd->open_tables || thd->derived_tables) close_thread_tables(thd); - - ulong length= thd->query_length-(ulong)(thd->lex->found_colon-thd->query); +#endif + ulong length= thd->query_length-(ulong)(packet-thd->query); /* Remove garbage at start of query */ while (my_isspace(thd->charset(), *packet) && length > 0) @@ -1414,7 +1417,13 @@ bool dispatch_command(enum enum_server_command command, THD *thd, VOID(pthread_mutex_lock(&LOCK_thread_count)); thd->query_id= query_id++; VOID(pthread_mutex_unlock(&LOCK_thread_count)); +#ifndef EMBEDDED_LIBRARY mysql_parse(thd, packet, length); +#else + thd->query_rest= (char*)memdup_mysql(thd->mysql, packet, length); + thd->query_rest_length= length; + break; +#endif /*EMBEDDED_LIBRARY*/ } if (!(specialflag & SPECIAL_NO_PRIOR)) From 4138b2ac5f51e71737b025ce04342866b384edc4 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 13:11:55 +0000 Subject: [PATCH 04/18] An include was missing. BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + sql/sql_string.cc | 1 + 2 files changed, 2 insertions(+) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index a7eb7c81105..2eb24c49273 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -54,6 +54,7 @@ jani@janikt.pp.saunalahti.fi jani@rhols221.adsl.netsonic.fi jani@rhols221.arenanet.fi jani@ua126d19.elisa.omakaista.fi +jani@ua141d10.elisa.omakaista.fi jani@ua167d18.elisa.omakaista.fi jcole@abel.spaceapes.com jcole@main.burghcom.com diff --git a/sql/sql_string.cc b/sql/sql_string.cc index cbee67c0a4a..093b85b46b7 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -24,6 +24,7 @@ #include #include #include +#include #ifdef HAVE_FCONVERT #include #endif From dc792940232f3265e21905cb939853f4db5ebd16 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 13:36:21 +0000 Subject: [PATCH 05/18] Wrong type of an argument was sent to my_printf_error(), which caused UDF functions to segmenation fault when they tried to print an error during wrong usage. --- sql/item_func.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/item_func.cc b/sql/item_func.cc index b1378784f92..34a61ba0353 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1552,7 +1552,7 @@ udf_handler::fix_fields(THD *thd, TABLE_LIST *tables, Item_result_field *func, if ((error=(uchar) init(&initid, &f_args, thd->net.last_error))) { my_printf_error(ER_CANT_INITIALIZE_UDF,ER(ER_CANT_INITIALIZE_UDF),MYF(0), - u_d->name,thd->net.last_error); + u_d->name.str, thd->net.last_error); free_udf(u_d); DBUG_RETURN(1); } @@ -1565,7 +1565,7 @@ udf_handler::fix_fields(THD *thd, TABLE_LIST *tables, Item_result_field *func, if (error) { my_printf_error(ER_CANT_INITIALIZE_UDF,ER(ER_CANT_INITIALIZE_UDF),MYF(0), - u_d->name, ER(ER_UNKNOWN_ERROR)); + u_d->name.str, ER(ER_UNKNOWN_ERROR)); DBUG_RETURN(1); } DBUG_RETURN(0); From 94f215cbe1d75b5eaf88f0e022a53918a36609a5 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 16:58:20 +0300 Subject: [PATCH 06/18] Fixed bug #2248 "mysql_fetch without prior mysql_execute hangs" Done clean-up in prep stmt API functions: 1) Removed some checks that were performed only in debug version were making debug version more tolerable to user errors than production (and thus caused problems for example masking some bugs). 2) Also removed some other checks to make prep stmt API consistent with the rest of C API (this also in line with general politics - make checks in only those places where errors are very common and hard to spot). include/mysql.h: Removed CHECK_EXTRA_ARGUMENTS define since it is no longer used anywhere. libmysql/libmysql.c: Added check that will cause mysql_fetch() to bark then it is used without calling mysql_execute() before. Removed checks that were performed only in debug version and caused problems since they were making debug version more tolerable to user errors than production. Also removed some other checks to make prep stmt API consistent in this regard with the rest of C API (this also in line with general politics - make checks in only those places where errors are very common and hard to spot). tests/client_test.c: Updated tests to reflect removal of some checks in prep stmt API. Removed lines that caused bug #2473 to pop up, should be added as separate test with the fix for this bug. Added test for bug#2248 "mysql_fetch without prior mysql_execute hangs" --- include/mysql.h | 3 -- libmysql/libmysql.c | 70 +++++--------------------------- tests/client_test.c | 98 +++++++++++++++++++++++++++++++-------------- 3 files changed, 79 insertions(+), 92 deletions(-) diff --git a/include/mysql.h b/include/mysql.h index d1b467f9649..ebf3928ce9c 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -57,9 +57,6 @@ typedef int my_socket; #include "mysql_com.h" #include "mysql_version.h" #include "typelib.h" -#ifndef DBUG_OFF -#define CHECK_EXTRA_ARGUMENTS -#endif #include "my_list.h" /* for LISTs used in 'MYSQL' and 'MYSQL_STMT' */ diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 977657f8998..829ee09090e 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -1653,14 +1653,6 @@ mysql_prepare(MYSQL *mysql, const char *query, ulong length) DBUG_ENTER("mysql_prepare"); DBUG_ASSERT(mysql != 0); -#ifdef CHECK_EXTRA_ARGUMENTS - if (!query) - { - set_mysql_error(mysql, CR_NULL_POINTER, unknown_sqlstate); - DBUG_RETURN(0); - } -#endif - if (!(stmt= (MYSQL_STMT *) my_malloc(sizeof(MYSQL_STMT), MYF(MY_WME | MY_ZEROFILL))) || !(stmt->query= my_strdup_with_length((byte *) query, length, MYF(0)))) @@ -2086,19 +2078,6 @@ int STDCALL mysql_execute(MYSQL_STMT *stmt) { DBUG_ENTER("mysql_execute"); - if (stmt->state == MY_ST_UNKNOWN) - { - set_stmt_error(stmt, CR_NO_PREPARE_STMT, unknown_sqlstate); - DBUG_RETURN(1); - } -#ifdef CHECK_EXTRA_ARGUMENTS - if (stmt->param_count && !stmt->param_buffers) - { - /* Parameters exists, but no bound buffers */ - set_stmt_error(stmt, CR_NOT_ALL_PARAMS_BOUND, unknown_sqlstate); - DBUG_RETURN(1); - } -#endif if ((*stmt->mysql->methods->stmt_execute)(stmt)) DBUG_RETURN(1); @@ -2144,19 +2123,6 @@ my_bool STDCALL mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND * bind) MYSQL_BIND *param, *end; DBUG_ENTER("mysql_bind_param"); -#ifdef CHECK_EXTRA_ARGUMENTS - if (stmt->state == MY_ST_UNKNOWN) - { - set_stmt_error(stmt, CR_NO_PREPARE_STMT, unknown_sqlstate); - DBUG_RETURN(1); - } - if (!stmt->param_count) - { - set_stmt_error(stmt, CR_NO_PARAMETERS_EXISTS, unknown_sqlstate); - DBUG_RETURN(1); - } -#endif - /* Allocated on prepare */ memcpy((char*) stmt->params, (char*) bind, sizeof(MYSQL_BIND) * stmt->param_count); @@ -2279,11 +2245,6 @@ mysql_send_long_data(MYSQL_STMT *stmt, uint param_number, DBUG_PRINT("enter",("param no : %d, data : %lx, length : %ld", param_number, data, length)); - if (param_number >= stmt->param_count) - { - set_stmt_error(stmt, CR_INVALID_PARAMETER_NO, unknown_sqlstate); - DBUG_RETURN(1); - } param= stmt->params+param_number; if (param->buffer_type < MYSQL_TYPE_TINY_BLOB || param->buffer_type > MYSQL_TYPE_STRING) @@ -2853,18 +2814,6 @@ my_bool STDCALL mysql_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind) DBUG_ENTER("mysql_bind_result"); DBUG_ASSERT(stmt != 0); -#ifdef CHECK_EXTRA_ARGUMENTS - if (stmt->state == MY_ST_UNKNOWN) - { - set_stmt_error(stmt, CR_NO_PREPARE_STMT, unknown_sqlstate); - DBUG_RETURN(1); - } - if (!bind) - { - set_stmt_error(stmt, CR_NULL_POINTER, unknown_sqlstate); - DBUG_RETURN(1); - } -#endif if (!(bind_count= stmt->field_count) && !(bind_count= alloc_stmt_fields(stmt))) DBUG_RETURN(0); @@ -3035,6 +2984,15 @@ int STDCALL mysql_fetch(MYSQL_STMT *stmt) } else /* un-buffered */ { + if (mysql->status != MYSQL_STATUS_GET_RESULT) + { + if (!stmt->field_count) + goto no_data; + + set_stmt_error(stmt, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate); + DBUG_RETURN(1); + } + if((*mysql->methods->unbuffered_fetch)(mysql, ( char **)&row)) { set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno, @@ -3065,7 +3023,7 @@ no_data: mysql_fetch_column() stmt Prepared statement handler bind Where data should be placed. Should be filled in as - when calling mysql_bind_param() + when calling mysql_bind_result() column Column to fetch (first column is 0) ulong offset Offset in result data (to fetch blob in pieces) This is normally 0 @@ -3083,14 +3041,6 @@ int STDCALL mysql_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind, if (!stmt->current_row) goto no_data; -#ifdef CHECK_EXTRA_ARGUMENTS - if (column >= stmt->field_count) - { - set_stmt_errmsg(stmt, "Invalid column descriptor",1, unknown_sqlstate); - DBUG_RETURN(1); - } -#endif - if (param->null_field) { if (bind->is_null) diff --git a/tests/client_test.c b/tests/client_test.c index 66637dcb04b..992c0ce5e78 100644 --- a/tests/client_test.c +++ b/tests/client_test.c @@ -953,8 +953,6 @@ static void test_prepare_simple() verify_param_count(stmt,1); - rc = mysql_execute(stmt); - mystmt_r(stmt, rc); mysql_stmt_close(stmt); /* select */ @@ -5589,27 +5587,24 @@ static void test_pure_coverage() stmt = mysql_prepare(mysql,"insert into test_pure(c67788) values(10)",100); mystmt_init_r(stmt); -#ifndef DBUG_OFF - stmt = mysql_prepare(mysql,(const char *)0,0); - mystmt_init_r(stmt); - + /* Query without params and result should allow to bind 0 arrays */ stmt = mysql_prepare(mysql,"insert into test_pure(c2) values(10)",100); mystmt_init(stmt); + + rc = mysql_bind_param(stmt, (MYSQL_BIND*)0); + mystmt(stmt, rc); + + rc = mysql_execute(stmt); + mystmt(stmt, rc); - rc = mysql_bind_param(stmt, bind); - mystmt_r(stmt, rc); - + rc = mysql_bind_result(stmt, (MYSQL_BIND*)0); + mystmt(stmt, rc); + mysql_stmt_close(stmt); -#endif stmt = mysql_prepare(mysql,"insert into test_pure(c2) values(?)",100); mystmt_init(stmt); -#ifndef DBUG_OFF - rc = mysql_execute(stmt); - mystmt_r(stmt, rc);/* No parameters supplied */ -#endif - bind[0].length= &length; bind[0].is_null= 0; bind[0].buffer_length= 0; @@ -5622,9 +5617,6 @@ static void test_pure_coverage() rc = mysql_bind_param(stmt, bind); mystmt(stmt, rc); - rc = mysql_send_long_data(stmt, 20, (char *)"venu", 4); - mystmt_r(stmt, rc); /* wrong param number */ - rc = mysql_stmt_store_result(stmt); mystmt(stmt, rc); @@ -5636,14 +5628,9 @@ static void test_pure_coverage() rc = mysql_execute(stmt); mystmt(stmt, rc); -#ifndef DBUG_OFF - rc = mysql_bind_result(stmt, (MYSQL_BIND *)0); - mystmt_r(stmt, rc); - bind[0].buffer_type= MYSQL_TYPE_GEOMETRY; rc = mysql_bind_result(stmt, bind); mystmt_r(stmt, rc); /* unsupported buffer type */ -#endif rc = mysql_stmt_store_result(stmt); mystmt(stmt, rc); @@ -7291,9 +7278,6 @@ static void test_fetch_offset() rc = mysql_fetch(stmt); mystmt(stmt,rc); - rc = mysql_fetch_column(stmt,bind,4,0); - mystmt_r(stmt,rc); - data[0]= '\0'; rc = mysql_fetch_column(stmt,bind,0,0); mystmt(stmt,rc); @@ -7411,9 +7395,6 @@ static void test_fetch_column() fprintf(stdout, "\n col 0: %d(%ld)", c1, l1); assert(c1 == 1 && l1 == 4); - rc = mysql_fetch_column(stmt,bind,10,0); - mystmt_r(stmt,rc); - rc = mysql_fetch(stmt); mystmt(stmt,rc); @@ -8096,6 +8077,64 @@ static void test_bug1946() } +/* + Test for bug#2248 "mysql_fetch without prior mysql_execute hangs" +*/ + +static void test_bug2248() +{ + MYSQL_STMT *stmt; + int rc; + const char *query1= "SELECT DATABASE()"; + const char *query2= "INSERT INTO test_bug2248 VALUES (10)"; + + myheader("test_bug2248"); + + rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_bug2248"); + myquery(rc); + + rc= mysql_query(mysql, "CREATE TABLE test_bug2248 (id int)"); + myquery(rc); + + stmt= mysql_prepare(mysql, query1, strlen(query1)); + mystmt_init(stmt); + + /* This should not hang */ + rc= mysql_fetch(stmt); + mystmt_r(stmt,rc); + + /* And this too */ + rc= mysql_stmt_store_result(stmt); + mystmt_r(stmt,rc); + + mysql_stmt_close(stmt); + + stmt= mysql_prepare(mysql, query2, strlen(query2)); + mystmt_init(stmt); + + rc= mysql_execute(stmt); + mystmt(stmt,rc); + + /* This too should not hang but should return proper error */ + rc= mysql_fetch(stmt); + assert(rc==MYSQL_NO_DATA); + + /* This too should not hang but should not bark */ + rc= mysql_stmt_store_result(stmt); + mystmt(stmt,rc); + + /* This should return proper error */ + rc= mysql_fetch(stmt); + mystmt_r(stmt,rc); + assert(rc==MYSQL_NO_DATA); + + mysql_stmt_close(stmt); + + rc= mysql_query(mysql,"DROP TABLE test_bug2248"); + myquery(rc); +} + + /* Read and parse arguments and MySQL options from my.cnf */ @@ -8340,6 +8379,7 @@ int main(int argc, char **argv) test_bug1644(); /* BUG#1644 */ test_bug1946(); /* test that placeholders are allowed only in prepared queries */ + test_bug2248(); /* BUG#2248 */ end_time= time((time_t *)0); total_time+= difftime(end_time, start_time); From 757c8c8a62b6b780f48d6f197981839ebb028fb8 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 15:14:48 +0100 Subject: [PATCH 07/18] Follow-up of a discussion on dev-docs@ : Don't show PSEUDO_THREAD_ID in SHOW VARIABLES because: - we don't want people to discover this variable as it could never do good to set it (it was designed for use by mysqlbinlog only, so that a thread can have several temp tables of the same name at the same time) - if we show it in SHOW VARIABLES, Mysql Administrator will display it and this will force us to put a description, so all MySQL Administrator user will be aware of this variable, some may have the idea to set it with a SET command, and then it will cause bad things. The variable is still settable, and still visible with SELECT @@. sql/set_var.cc: Don't show PSEUDO_THREAD_ID in SHOW VARIABLES because: - we don't want people to discover this variable as it could never do good to set it (it was designed for use by mysqlbinlog only, so that a thread can have several temp tables of the same name at the same time) - if we show it in SHOW VARIABLES, Mysql Administrator will display it and this will force us to put a description, so all MySQL Administrator user will be aware of this variable, some may have the idea to set it with a SET command, and then it will cause bad things. The variable is still settable, and still visible with SELECT @@. --- sql/set_var.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/sql/set_var.cc b/sql/set_var.cc index ecb85440068..073330e06be 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -695,7 +695,6 @@ struct show_var_st init_vars[]= { {"port", (char*) &mysqld_port, SHOW_INT}, {"protocol_version", (char*) &protocol_version, SHOW_INT}, {sys_preload_buff_size.name, (char*) &sys_preload_buff_size, SHOW_SYS}, - {sys_pseudo_thread_id.name, (char*) &sys_pseudo_thread_id, SHOW_SYS}, {sys_query_alloc_block_size.name, (char*) &sys_query_alloc_block_size, SHOW_SYS}, #ifdef HAVE_QUERY_CACHE From aaa35925ac66b00eb1fcee5e4bcc9c05472f6950 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 18:44:27 +0400 Subject: [PATCH 08/18] added skiped newline to the end of file mysql-test/t/mysqldump.test mysql-test/t/mysqldump.test: added skiped newline to the end of file --- mysql-test/t/mysqldump.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index e6115b61bbf..eca83ce77d8 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -60,4 +60,4 @@ DROP TABLE t1; create table ```a` (i int); --exec $MYSQL_DUMP --skip-comments test -drop table ```a`; \ No newline at end of file +drop table ```a`; From e4f3eb79be9dc5da27097f73e9477d9318373105 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 19:29:28 +0400 Subject: [PATCH 09/18] correcting mysql-test/r/mysqldump.result after merge mysql-test/r/mysqldump.result: correcting result after merge --- mysql-test/r/mysqldump.result | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index 37a604258d9..fd9e2a1f42b 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -180,6 +180,11 @@ UNLOCK TABLES; DROP TABLE t1; create table ```a` (i int); + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT, CHARACTER_SET_CLIENT=utf8 */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=NO_AUTO_VALUE_ON_ZERO */; DROP TABLE IF EXISTS ```a`; CREATE TABLE ``a` ( `i` int(11) default NULL From ad2c55b6ce922f9541d15b6817ce54419c462e2b Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 19:33:04 +0400 Subject: [PATCH 10/18] Bug #2368 Multibyte charsets do not check that incoming data is well-formed It was together with the previous but. This test tends to prove it. --- mysql-test/r/ctype_utf8.result | 24 ++++++++++++++++++++++++ mysql-test/t/ctype_utf8.test | 18 ++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index a75b2b6065c..658a7b8f5f6 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -143,3 +143,27 @@ length(s1) char_length(s1) 65535 43690 65534 32767 drop table t1; +create table t1 (s1 char(10) character set utf8); +insert into t1 values (0x41FF); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +select hex(s1) from t1; +hex(s1) +41 +drop table t1; +create table t1 (s1 varchar(10) character set utf8); +insert into t1 values (0x41FF); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +select hex(s1) from t1; +hex(s1) +41 +drop table t1; +create table t1 (s1 text character set utf8); +insert into t1 values (0x41FF); +Warnings: +Warning 1264 Data truncated for column 's1' at row 1 +select hex(s1) from t1; +hex(s1) +41 +drop table t1; diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index 0d42533c95f..0615de99b7a 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -80,3 +80,21 @@ insert into t1 select repeat(' insert into t1 select repeat('ÑÑ',66000); select length(s1),char_length(s1) from t1; drop table t1; + +# +# Bug #2368 Multibyte charsets do not check that incoming data is well-formed +# +create table t1 (s1 char(10) character set utf8); +insert into t1 values (0x41FF); +select hex(s1) from t1; +drop table t1; + +create table t1 (s1 varchar(10) character set utf8); +insert into t1 values (0x41FF); +select hex(s1) from t1; +drop table t1; + +create table t1 (s1 text character set utf8); +insert into t1 values (0x41FF); +select hex(s1) from t1; +drop table t1; From f709bc18607a52d280e13aab3fb0a29ff09a214b Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 19:33:05 +0400 Subject: [PATCH 11/18] configure.in: FreeBSD "ps" detection usually failed, in 90% cases, on FreeBSD-5.1. This change should work fine under 5.x and 4.x, and I believe in 3.x. too. configure.in: FreeBSD "ps" detection usually failed, in 90% cases. Thi --- configure.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configure.in b/configure.in index e607f87747b..9cdb9d209c2 100644 --- a/configure.in +++ b/configure.in @@ -452,6 +452,9 @@ then FIND_PROC="$PS \$\$PID | grep mysqld > /dev/null" else case $SYSTEM_TYPE in + *freebsd*) + FIND_PROC="$PS p \$\$PID | grep mysqld > /dev/null" + ;; *darwin*) FIND_PROC="$PS -uaxww | grep mysqld | grep \" \$\$PID \" > /dev/null" ;; From 98216bc9d4a65bd133d9a374fd3fe77d8c333d33 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 18:33:06 +0300 Subject: [PATCH 12/18] Another implementation of send_eof() cleanup --- sql/protocol.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sql/protocol.cc b/sql/protocol.cc index bef567ad346..40adc9e8961 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -313,6 +313,7 @@ send_ok(THD *thd, ha_rows affected_rows, ulonglong id, const char *message) DBUG_VOID_RETURN; } +static char eof_buff[1]= { (char) 254 }; /* Marker for end of fields */ /* Send eof (= end of result set) to the client @@ -339,12 +340,11 @@ send_ok(THD *thd, ha_rows affected_rows, ulonglong id, const char *message) void send_eof(THD *thd, bool no_flush) { - static char eof_buff[1]= { (char) 254 }; /* Marker for end of fields */ NET *net= &thd->net; DBUG_ENTER("send_eof"); if (net->vio != 0) { - if (!no_flush && (thd->client_capabilities & CLIENT_PROTOCOL_41)) + if (thd->client_capabilities & CLIENT_PROTOCOL_41) { uchar buff[5]; uint tmp= min(thd->total_warn_count, 65535); @@ -384,9 +384,8 @@ send_eof(THD *thd, bool no_flush) bool send_old_password_request(THD *thd) { - static char buff[1]= { (char) 254 }; NET *net= &thd->net; - return my_net_write(net, buff, 1) || net_flush(net); + return my_net_write(net, eof_buff, 1) || net_flush(net); } #endif /* EMBEDDED_LIBRARY */ @@ -585,7 +584,7 @@ bool Protocol::send_fields(List *list, uint flag) #endif } - send_eof(thd, 1); + my_net_write(&thd->net, eof_buff, 1); DBUG_RETURN(prepare_for_send(list)); err: From 69651163209efd701736fe09da4648e3b5ba1aa7 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 11 Feb 2004 00:47:18 +0400 Subject: [PATCH 13/18] code cleanup of processing MY_LEX_USER_VARIABLE_DELIMITER in sql/sql_lex.cc sql/sql_lex.cc: code cleanup of processing MY_LEX_USER_VARIABLE_DELIMITER --- sql/sql_lex.cc | 53 ++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 2484ff0e30f..70c69bb7389 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -193,6 +193,13 @@ static LEX_STRING get_token(LEX *lex,uint length) return tmp; } +/* + todo: + There are no dangerous charsets in mysql for function + get_quoted_token yet. But it should be fixed in the + future to operate multichar strings (like ucs2) +*/ + static LEX_STRING get_quoted_token(LEX *lex,uint length, char quote) { LEX_STRING tmp; @@ -670,37 +677,14 @@ int yylex(void *arg, void *yythd) uint double_quotes= 0; char quote_char= c; // Used char lex->tok_start=lex->ptr; // Skip first ` + while ((c=yyGet())) + { #ifdef USE_MB - if (use_mb(cs)) - { - while ((c= yyGet())) - { - if (c == quote_char) - { - if (yyPeek() != quote_char) - break; - c= yyGet(); - double_quotes++; - continue; - } - if (c == (uchar) NAMES_SEP_CHAR) - break; - if (my_mbcharlen(cs, c) > 1) - { - int l; - if ((l = my_ismbchar(cs, - (const char *)lex->ptr-1, - (const char *)lex->end_of_query)) == 0) - break; - lex->ptr += l-1; - } - } - } - else + if (my_mbcharlen(cs, c) == 1) #endif - { - while ((c=yyGet())) { + if (c == (uchar) NAMES_SEP_CHAR) + break; /* Old .frm format can't handle this char */ if (c == quote_char) { if (yyPeek() != quote_char) @@ -709,9 +693,18 @@ int yylex(void *arg, void *yythd) double_quotes++; continue; } - if (c == (uchar) NAMES_SEP_CHAR) - break; } +#ifdef USE_MB + else + { + int l; + if ((l = my_ismbchar(cs, + (const char *)lex->ptr-1, + (const char *)lex->end_of_query)) == 0) + break; + lex->ptr += l-1; + } +#endif } if (double_quotes) yylval->lex_str=get_quoted_token(lex,yyLength() - double_quotes, From 38caa8c060053ef58017e0fa227eb3763f56e6ac Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Feb 2004 23:47:34 +0100 Subject: [PATCH 14/18] Fix for prepared statements: added setting of 'neg' in Item_param::set_time() (looks like the only forgotten member). It's the second place I find where 'neg' was forgotten. The symptom was unexpected negative times in the binary log when running tests/client_test.c (test_date() in fact): # at 43009 #040210 15:46:42 server id 1 log_pos 43009 Query thread_id=1 exec_time=0 error_code=0 SET TIMESTAMP=1076424402; INSERT INTO test_date VALUES('2000-01-10 11:16:20','-11:16:20' etc sql/item.cc: Don't forget to copy 'neg'. --- sql/item.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sql/item.cc b/sql/item.cc index 4d06d0d7765..850d5a3cad3 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -568,6 +568,8 @@ void Item_param::set_time(TIME *tm, timestamp_type type) ltime.second_part= tm->second_part; + ltime.neg= tm->neg; + ltime.time_type= type; item_is_time= true; From 24e3862cb8752618a5c8d5a41eb739e698b727cb Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 11 Feb 2004 15:15:39 +0400 Subject: [PATCH 15/18] mysqlimport.c, mysqldump.c, mysqlcheck.c, mysql.cc: No needs to load charset index if the character set is build-in. client/mysql.cc: No needs to load charset index if the character set is build-in. client/mysqlcheck.c: No needs to load charset index if the character set is build-in. client/mysqldump.c: No needs to load charset index if the character set is build-in. client/mysqlimport.c: No needs to load charset index if the character set is build-in. --- client/mysql.cc | 4 +++- client/mysqlcheck.c | 3 ++- client/mysqldump.c | 3 ++- client/mysqlimport.c | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/client/mysql.cc b/client/mysql.cc index 665a8dde82d..eb466a86c91 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -839,7 +839,9 @@ static int get_options(int argc, char **argv) opt_reconnect= 0; connect_flag= 0; /* Not in interactive mode */ } - if (!(charset_info= get_charset_by_csname(default_charset, + + if (strcmp(default_charset, charset_info->csname) && + !(charset_info= get_charset_by_csname(default_charset, MY_CS_PRIMARY, MYF(MY_WME)))) exit(1); if (argc > 1) diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index 1768d948373..03ab45957d4 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -311,7 +311,8 @@ static int get_options(int *argc, char ***argv) } /* TODO: This variable is not yet used */ - if (!(charset_info= get_charset_by_csname(default_charset, + if (strcmp(default_charset, charset_info->csname) && + !(charset_info= get_charset_by_csname(default_charset, MY_CS_PRIMARY, MYF(MY_WME)))) exit(1); if (*argc > 0 && opt_alldbs) diff --git a/client/mysqldump.c b/client/mysqldump.c index 1383e0e0d02..345c7f0b945 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -536,7 +536,8 @@ static int get_options(int *argc, char ***argv) my_progname); return(1); } - if (!(charset_info= get_charset_by_csname(default_charset, + if (strcmp(default_charset, charset_info->csname) && + !(charset_info= get_charset_by_csname(default_charset, MY_CS_PRIMARY, MYF(MY_WME)))) exit(1); if ((*argc < 1 && !opt_alldbs) || (*argc > 0 && opt_alldbs)) diff --git a/client/mysqlimport.c b/client/mysqlimport.c index 5ad6d1dc429..d47ae48b1ac 100644 --- a/client/mysqlimport.c +++ b/client/mysqlimport.c @@ -238,7 +238,8 @@ static int get_options(int *argc, char ***argv) fprintf(stderr, "You can't use --ignore (-i) and --replace (-r) at the same time.\n"); return(1); } - if (!(charset_info= get_charset_by_csname(default_charset, + if (strcmp(default_charset, charset_info->csname) && + !(charset_info= get_charset_by_csname(default_charset, MY_CS_PRIMARY, MYF(MY_WME)))) exit(1); if (*argc < 2) From 0aa48dc500a38c46ee5fa47e26382260364b06f5 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 11 Feb 2004 12:32:47 +0100 Subject: [PATCH 16/18] Fix for BUG#2703 "MySQL server does not detect if garbage chars at the end of query": Detect garbage chars at the end of the query or at the end of a query for a prepared statement (which happens if mysql_real_query() or mysql_prepare() were called with a too big 'length' parameter (bigger than the real intended length of the query: then we receive a query + garbage characters from the client). This resulted in garbage chars written into the binlog. Now instead the client receives something like: '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 '!stmt' at line 1' i.e. the server is pointing at the weird tail of the query (this '!stmt' are the garbage chars sent by the client). All tests pass, except mysqldump.test and ctype_utf8.test but they failed before the patch. sql/sql_parse.cc: Detect garbage chars at the end of the query (which happens if mysql_real_query() was called with a too big 'length' parameter (bigger than the real intended length of the query: then we receive a query + garbage characters from the client). sql/sql_prepare.cc: Detect garbage chars at the end of the query (which happens if mysql_prepare() was called with a too big 'length' parameter (bigger than the real intended length of the query: then we receive a query + garbage characters from the client). tests/client_test.c: The change to sql_parse.cc and sql_prepare.cc rightfully gives many syntax errors to tests/client_test.c which is full of mysql_prepare(mysql, "SHOW TABLES", 100). Correcting all these commands. --- sql/sql_parse.cc | 18 ++- sql/sql_prepare.cc | 10 +- tests/client_test.c | 317 +++++++++++++++++++++++++------------------- 3 files changed, 203 insertions(+), 142 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 42ea6039b6c..80aa575265b 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3845,7 +3845,23 @@ mysql_parse(THD *thd, char *inBuf, uint length) if (query_cache_send_result_to_client(thd, inBuf, length) <= 0) { LEX *lex=lex_start(thd, (uchar*) inBuf, length); - if (!yyparse((void *)thd) && ! thd->is_fatal_error) + if (!yyparse((void *)thd) && ! thd->is_fatal_error && + /* + If this is not a multiple query, ensure that it has been + successfully parsed until the last character. This is to prevent + against a wrong (too big) length passed to mysql_real_query(), + mysql_prepare()... which can generate garbage characters at the + end. If the query was initially multiple, found_colon will be false + only when we are in the last query; this last query had already + been end-spaces-stripped by alloc_query() in dispatch_command(); as + end spaces are the only thing we accept at the end of a query, and + they have been stripped already, here we can require that nothing + remains after parsing. + */ + (thd->lex->found_colon || + (char*)(thd->lex->ptr) == (thd->query+thd->query_length+1) || + /* yyerror() will show the garbage chars to the user */ + (yyerror("syntax error"), 0))) { #ifndef NO_EMBEDDED_ACCESS_CHECKS if (mqh_used && thd->user_connect && diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 2cf0000d973..cf723e18d85 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -909,7 +909,15 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length) lex->safe_to_cache_query= 0; lex->param_count= 0; - if (yyparse((void *)thd) || thd->is_fatal_error || send_prepare_results(stmt)) + if (yyparse((void *)thd) || thd->is_fatal_error || + /* + Check for wrong (too big) length passed to mysql_prepare() resulting in + garbage at the end of the query. There is a similar check in mysql_parse(). + */ + (!thd->lex->found_colon && + (char*)(thd->lex->ptr) != (thd->query+thd->query_length+1) && + /* yyerror() will show the garbage chars to the user */ + (yyerror("syntax error"), 1)) || send_prepare_results(stmt)) goto yyparse_err; lex_end(lex); diff --git a/tests/client_test.c b/tests/client_test.c index 66637dcb04b..e0785f9d633 100644 --- a/tests/client_test.c +++ b/tests/client_test.c @@ -153,6 +153,17 @@ static void print_st_error(MYSQL_STMT *stmt, const char *msg) else if (msg) fprintf(stderr, " [MySQL] %s\n", msg); } +/* + This is to be what mysql_query() is for mysql_real_query(), for + mysql_prepare(): a variant without the 'length' parameter. +*/ +MYSQL_STMT *STDCALL +mysql_simple_prepare(MYSQL *mysql, const char *query) +{ + return mysql_prepare(mysql, query, strlen(query)); +} + + /******************************************************** * connect to the server * *********************************************************/ @@ -459,14 +470,14 @@ uint my_process_stmt_result(MYSQL_STMT *stmt) /******************************************************** * process the stmt result set * *********************************************************/ -uint my_stmt_result(const char *buff, unsigned long length) +uint my_stmt_result(const char *buff) { MYSQL_STMT *stmt; uint row_count; int rc; fprintf(stdout,"\n\n %s", buff); - stmt= mysql_prepare(mysql,buff,length); + stmt= mysql_simple_prepare(mysql,buff); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -605,7 +616,7 @@ static void execute_prepare_query(const char *query, ulonglong exp_count) ulonglong affected_rows; int rc; - stmt= mysql_prepare(mysql,query,strlen(query)); + stmt= mysql_simple_prepare(mysql,query); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -913,7 +924,7 @@ static void test_prepare_simple() /* alter table */ strmov(query,"ALTER TABLE test_prepare_simple ADD new char(20)"); - stmt = mysql_prepare(mysql, query, 70); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,0); @@ -921,7 +932,7 @@ static void test_prepare_simple() /* insert */ strmov(query,"INSERT INTO test_prepare_simple VALUES(?,?)"); - stmt = mysql_prepare(mysql, query, 70); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -929,7 +940,7 @@ static void test_prepare_simple() /* update */ strmov(query,"UPDATE test_prepare_simple SET id=? WHERE id=? AND name= ?"); - stmt = mysql_prepare(mysql, query, 100); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,3); @@ -937,7 +948,7 @@ static void test_prepare_simple() /* delete */ strmov(query,"DELETE FROM test_prepare_simple WHERE id=10"); - stmt = mysql_prepare(mysql, query, 60); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,0); @@ -948,7 +959,7 @@ static void test_prepare_simple() /* delete */ strmov(query,"DELETE FROM test_prepare_simple WHERE id=?"); - stmt = mysql_prepare(mysql, query, 50); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,1); @@ -959,7 +970,7 @@ static void test_prepare_simple() /* select */ strmov(query,"SELECT * FROM test_prepare_simple WHERE id=? AND name= ?"); - stmt = mysql_prepare(mysql, query, 100); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -997,7 +1008,7 @@ static void test_prepare_field_result() /* insert */ strmov(query,"SELECT int_c,var_c,date_c as date,ts_c,char_c FROM \ test_prepare_field_result as t1 WHERE int_c=?"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,1); @@ -1045,11 +1056,11 @@ static void test_prepare_syntax() myquery(rc); strmov(query,"INSERT INTO test_prepare_syntax VALUES(?"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init_r(stmt); strmov(query,"SELECT id,name FROM test_prepare_syntax WHERE id=? AND WHERE"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init_r(stmt); /* now fetch the results ..*/ @@ -1095,7 +1106,7 @@ static void test_prepare() /* insert by prepare */ strxmov(query,"INSERT INTO my_prepare VALUES(?,?,?,?,?,?,?)",NullS); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,7); @@ -1159,9 +1170,9 @@ static void test_prepare() myquery(rc); /* test the results now, only one row should exists */ - assert(tiny_data == (char) my_stmt_result("SELECT * FROM my_prepare",50)); + assert(tiny_data == (char) my_stmt_result("SELECT * FROM my_prepare")); - stmt = mysql_prepare(mysql,"SELECT * FROM my_prepare",50); + stmt = mysql_simple_prepare(mysql,"SELECT * FROM my_prepare"); mystmt_init(stmt); rc = mysql_bind_result(stmt, bind); @@ -1266,7 +1277,7 @@ static void test_double_compare() myquery(rc); strmov(query, "UPDATE test_double_compare SET col1=100 WHERE col1 = ? AND col2 = ? AND COL3 = ?"); - stmt = mysql_prepare(mysql,query, strlen(query)); + stmt = mysql_simple_prepare(mysql,query); mystmt_init(stmt); verify_param_count(stmt,3); @@ -1347,11 +1358,11 @@ static void test_null() /* insert by prepare, wrong column name */ strmov(query,"INSERT INTO test_null(col3,col2) VALUES(?,?)"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init_r(stmt); strmov(query,"INSERT INTO test_null(col1,col2) VALUES(?,?)"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -1393,7 +1404,7 @@ static void test_null() myquery(rc); nData*= 2; - assert(nData == my_stmt_result("SELECT * FROM test_null", 30)); + assert(nData == my_stmt_result("SELECT * FROM test_null")); /* Fetch results */ bind[0].buffer_type= MYSQL_TYPE_LONG; @@ -1403,7 +1414,7 @@ static void test_null() bind[0].is_null= &is_null[0]; bind[1].is_null= &is_null[1]; - stmt = mysql_prepare(mysql,"SELECT * FROM test_null",30); + stmt = mysql_simple_prepare(mysql,"SELECT * FROM test_null"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -1475,9 +1486,9 @@ static void test_fetch_null() strmov((char *)query , "SELECT * FROM test_fetch_null"); - assert(3 == my_stmt_result(query,50)); + assert(3 == my_stmt_result(query)); - stmt = mysql_prepare(mysql, query, 50); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); rc = mysql_bind_result(stmt,bind); @@ -1516,7 +1527,7 @@ static void test_select_version() myheader("test_select_version"); - stmt = mysql_prepare(mysql, "SELECT @@version", 30); + stmt = mysql_simple_prepare(mysql, "SELECT @@version"); mystmt_init(stmt); verify_param_count(stmt,0); @@ -1538,7 +1549,7 @@ static void test_select_simple() myheader("test_select_simple"); - stmt = mysql_prepare(mysql, "SHOW TABLES FROM mysql", 50); + stmt = mysql_simple_prepare(mysql, "SHOW TABLES FROM mysql"); mystmt_init(stmt); verify_param_count(stmt,0); @@ -1630,7 +1641,7 @@ static void test_select_prepare() rc = mysql_commit(mysql); myquery(rc); - stmt = mysql_prepare(mysql,"SELECT * FROM test_select",50); + stmt = mysql_simple_prepare(mysql,"SELECT * FROM test_select"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -1660,7 +1671,7 @@ static void test_select_prepare() rc = mysql_commit(mysql); myquery(rc); - stmt = mysql_prepare(mysql,"SELECT * FROM test_select",25); + stmt = mysql_simple_prepare(mysql,"SELECT * FROM test_select"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -1715,7 +1726,7 @@ static void test_select() myquery(rc); strmov(query,"SELECT * FROM test_select WHERE id=? AND name=?"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -1774,7 +1785,7 @@ session_id char(9) NOT NULL, \ myquery(rc); strmov(query,"SELECT * FROM test_select WHERE session_id = ?"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,1); @@ -1852,7 +1863,7 @@ static void test_bug1180() myquery(rc); strmov(query,"SELECT * FROM test_select WHERE ?=\"1111\" and session_id = \"abc\""); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,1); @@ -1932,7 +1943,7 @@ static void test_bug1644() myquery(rc); strmov(query, "INSERT INTO foo_dfr VALUES (?,?,?,? )"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt, 4); @@ -2030,7 +2041,7 @@ static void test_select_show() rc = mysql_query(mysql, "CREATE TABLE test_show(id int(4) NOT NULL primary key, name char(2))"); myquery(rc); - stmt = mysql_prepare(mysql, "show columns from test_show", 30); + stmt = mysql_simple_prepare(mysql, "show columns from test_show"); mystmt_init(stmt); verify_param_count(stmt,0); @@ -2041,11 +2052,11 @@ static void test_select_show() my_process_stmt_result(stmt); mysql_stmt_close(stmt); - stmt = mysql_prepare(mysql, "show tables from mysql like ?", 50); + stmt = mysql_simple_prepare(mysql, "show tables from mysql like ?"); mystmt_init_r(stmt); strxmov(query,"show tables from ", current_db, " like \'test_show\'", NullS); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -2054,7 +2065,7 @@ static void test_select_show() my_process_stmt_result(stmt); mysql_stmt_close(stmt); - stmt = mysql_prepare(mysql, "describe test_show", 30); + stmt = mysql_simple_prepare(mysql, "describe test_show"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -2063,7 +2074,7 @@ static void test_select_show() my_process_stmt_result(stmt); mysql_stmt_close(stmt); - stmt = mysql_prepare(mysql, "show keys from test_show", 30); + stmt = mysql_simple_prepare(mysql, "show keys from test_show"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -2115,7 +2126,7 @@ static void test_simple_update() /* insert by prepare */ strmov(query,"UPDATE test_update SET col2=? WHERE col1=?"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -2190,11 +2201,11 @@ static void test_long_data() myquery(rc); strmov(query,"INSERT INTO test_long_data(col1,col2) VALUES(?)"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init_r(stmt); strmov(query,"INSERT INTO test_long_data(col1,col2,col3) VALUES(?,?,?)"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,3); @@ -2282,7 +2293,7 @@ static void test_long_data_str() myquery(rc); strmov(query,"INSERT INTO test_long_data_str VALUES(?,?)"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -2373,7 +2384,7 @@ static void test_long_data_str1() myquery(rc); strmov(query,"INSERT INTO test_long_data_str VALUES(?,?)"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -2462,7 +2473,7 @@ static void test_long_data_bin() myquery(rc); strmov(query,"INSERT INTO test_long_data_bin VALUES(?,?)"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -2557,7 +2568,7 @@ static void test_simple_delete() /* insert by prepare */ strmov(query,"DELETE FROM test_simple_delete WHERE col1=? AND col2=? AND col3=100"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -2637,7 +2648,7 @@ static void test_update() myquery(rc); strmov(query,"INSERT INTO test_update(col2,col3) VALUES(?,?)"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -2667,7 +2678,7 @@ static void test_update() mysql_stmt_close(stmt); strmov(query,"UPDATE test_update SET col2=? WHERE col3=?"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -2733,7 +2744,7 @@ static void test_prepare_noparam() /* insert by prepare */ strmov(query,"INSERT INTO my_prepare VALUES(10,'venu')"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,0); @@ -2812,7 +2823,7 @@ static void test_bind_result() bind[1].length= &length1; bind[1].is_null= &is_null[1]; - stmt = mysql_prepare(mysql, "SELECT * FROM test_bind_result", 50); + stmt = mysql_simple_prepare(mysql, "SELECT * FROM test_bind_result"); mystmt_init(stmt); rc = mysql_bind_result(stmt,bind); @@ -2933,7 +2944,7 @@ static void test_bind_result_ext() bind[7].length= &bLength; bind[7].buffer_length= sizeof(bData); - stmt = mysql_prepare(mysql, "select * from test_bind_result", 50); + stmt = mysql_simple_prepare(mysql, "select * from test_bind_result"); mystmt_init(stmt); rc = mysql_bind_result(stmt,bind); @@ -3058,7 +3069,7 @@ static void test_bind_result_ext1() bind[i].length= &length[i]; } - stmt = mysql_prepare(mysql, "select * from test_bind_result", 50); + stmt = mysql_simple_prepare(mysql, "select * from test_bind_result"); mystmt_init(stmt); rc = mysql_bind_result(stmt,bind); @@ -3118,7 +3129,7 @@ static void bind_fetch(int row_count) MYSQL_BIND bind[7]; my_bool is_null[7]; - stmt = mysql_prepare(mysql,"INSERT INTO test_bind_fetch VALUES(?,?,?,?,?,?,?)",100); + stmt = mysql_simple_prepare(mysql,"INSERT INTO test_bind_fetch VALUES(?,?,?,?,?,?,?)"); mystmt_init(stmt); verify_param_count(stmt, 7); @@ -3151,9 +3162,9 @@ static void bind_fetch(int row_count) mysql_stmt_close(stmt); assert(row_count == (int) - my_stmt_result("SELECT * FROM test_bind_fetch",50)); + my_stmt_result("SELECT * FROM test_bind_fetch")); - stmt = mysql_prepare(mysql,"SELECT * FROM test_bind_fetch",50); + stmt = mysql_simple_prepare(mysql,"SELECT * FROM test_bind_fetch"); myquery(rc); for (i= 0; i < (int) array_elements(bind); i++) @@ -3321,9 +3332,9 @@ static void test_fetch_date() bind[6].buffer_length= sizeof(ts_6); bind[6].length= &ts6_length; - assert(1 == my_stmt_result("SELECT * FROM test_bind_result",50)); + assert(1 == my_stmt_result("SELECT * FROM test_bind_result")); - stmt = mysql_prepare(mysql, "SELECT * FROM test_bind_result", 50); + stmt = mysql_simple_prepare(mysql, "SELECT * FROM test_bind_result"); mystmt_init(stmt); rc = mysql_bind_result(stmt,bind); @@ -3651,7 +3662,7 @@ static void test_prepare_ext() /* insert by prepare - all integers */ strmov(query,(char *)"INSERT INTO test_prepare_ext(c1,c2,c3,c4,c5,c6) VALUES(?,?,?,?,?,?)"); - stmt = mysql_prepare(mysql,query, strlen(query)); + stmt = mysql_simple_prepare(mysql,query); mystmt_init(stmt); verify_param_count(stmt,6); @@ -3704,7 +3715,7 @@ static void test_prepare_ext() rc = mysql_commit(mysql); myquery(rc); - stmt = mysql_prepare(mysql,"SELECT c1,c2,c3,c4,c5,c6 FROM test_prepare_ext",100); + stmt = mysql_simple_prepare(mysql,"SELECT c1,c2,c3,c4,c5,c6 FROM test_prepare_ext"); mystmt_init(stmt); /* get the result */ @@ -3850,7 +3861,7 @@ static void test_insert() myquery(rc); /* insert by prepare */ - stmt = mysql_prepare(mysql, "INSERT INTO test_prep_insert VALUES(?,?)", 70); + stmt = mysql_simple_prepare(mysql, "INSERT INTO test_prep_insert VALUES(?,?)"); mystmt_init(stmt); verify_param_count(stmt,2); @@ -3922,7 +3933,7 @@ static void test_prepare_resultset() name varchar(50),extra double)"); myquery(rc); - stmt = mysql_prepare(mysql, "SELECT * FROM test_prepare_resultset", 60); + stmt = mysql_simple_prepare(mysql, "SELECT * FROM test_prepare_resultset"); mystmt_init(stmt); verify_param_count(stmt,0); @@ -4034,25 +4045,25 @@ static void test_stmt_close() myquery(rc); strmov(query,"ALTER TABLE test_stmt_close ADD name varchar(20)"); - stmt1= mysql_prepare(lmysql, query, 70); + stmt1= mysql_simple_prepare(lmysql, query); mystmt_init(stmt1); verify_param_count(stmt1, 0); strmov(query,"INSERT INTO test_stmt_close(id) VALUES(?)"); - stmt_x= mysql_prepare(mysql, query, 70); + stmt_x= mysql_simple_prepare(mysql, query); mystmt_init(stmt_x); verify_param_count(stmt_x, 1); strmov(query,"UPDATE test_stmt_close SET id=? WHERE id=?"); - stmt3= mysql_prepare(lmysql, query, 70); + stmt3= mysql_simple_prepare(lmysql, query); mystmt_init(stmt3); verify_param_count(stmt3, 2); strmov(query,"SELECT * FROM test_stmt_close WHERE id=?"); - stmt2= mysql_prepare(lmysql, query, 70); + stmt2= mysql_simple_prepare(lmysql, query); mystmt_init(stmt2); verify_param_count(stmt2, 1); @@ -4119,7 +4130,7 @@ static void test_set_variable() mysql_autocommit(mysql, TRUE); - stmt1 = mysql_prepare(mysql, "show variables like 'max_error_count'", 50); + stmt1 = mysql_simple_prepare(mysql, "show variables like 'max_error_count'"); mystmt_init(stmt1); get_bind[0].buffer_type= MYSQL_TYPE_STRING; @@ -4150,7 +4161,7 @@ static void test_set_variable() rc = mysql_fetch(stmt1); assert(rc == MYSQL_NO_DATA); - stmt = mysql_prepare(mysql, "set max_error_count=?", 50); + stmt = mysql_simple_prepare(mysql, "set max_error_count=?"); mystmt_init(stmt); set_bind[0].buffer_type= MYSQL_TYPE_LONG; @@ -4225,7 +4236,7 @@ static void test_insert_meta() myquery(rc); strmov(query,"INSERT INTO test_prep_insert VALUES(10,'venu1','test')"); - stmt = mysql_prepare(mysql, query, 70); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,0); @@ -4236,7 +4247,7 @@ static void test_insert_meta() mysql_stmt_close(stmt); strmov(query,"INSERT INTO test_prep_insert VALUES(?,'venu',?)"); - stmt = mysql_prepare(mysql, query, 70); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -4288,7 +4299,7 @@ static void test_update_meta() myquery(rc); strmov(query,"UPDATE test_prep_update SET col1=10, col2='venu1' WHERE col3='test'"); - stmt = mysql_prepare(mysql, query, 100); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,0); @@ -4299,7 +4310,7 @@ static void test_update_meta() mysql_stmt_close(stmt); strmov(query,"UPDATE test_prep_update SET col1=?, col2='venu' WHERE col3=?"); - stmt = mysql_prepare(mysql, query, 100); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -4355,7 +4366,7 @@ static void test_select_meta() myquery(rc); strmov(query,"SELECT * FROM test_prep_select WHERE col1=10"); - stmt = mysql_prepare(mysql, query, 70); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,0); @@ -4364,7 +4375,7 @@ static void test_select_meta() mytest_r(result); strmov(query,"SELECT col1, col3 from test_prep_select WHERE col1=? AND col3='test' AND col2= ?"); - stmt = mysql_prepare(mysql, query, 120); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); verify_param_count(stmt,2); @@ -4499,10 +4510,10 @@ static void test_multi_stmt() rc = mysql_query(mysql,"INSERT INTO test_multi_table values(10,'mysql')"); myquery(rc); - stmt = mysql_prepare(mysql, "SELECT * FROM test_multi_table WHERE id = ?", 100); + stmt = mysql_simple_prepare(mysql, "SELECT * FROM test_multi_table WHERE id = ?"); mystmt_init(stmt); - stmt2 = mysql_prepare(mysql, "UPDATE test_multi_table SET name='updated' WHERE id=10",100); + stmt2 = mysql_simple_prepare(mysql, "UPDATE test_multi_table SET name='updated' WHERE id=10"); mystmt_init(stmt2); verify_param_count(stmt,1); @@ -4544,7 +4555,7 @@ static void test_multi_stmt() assert(rc == MYSQL_NO_DATA); /* alter the table schema now */ - stmt1 = mysql_prepare(mysql,"DELETE FROM test_multi_table WHERE id = ? AND name=?",100); + stmt1 = mysql_simple_prepare(mysql,"DELETE FROM test_multi_table WHERE id = ? AND name=?"); mystmt_init(stmt1); verify_param_count(stmt1,2); @@ -4584,7 +4595,7 @@ static void test_multi_stmt() rc = mysql_fetch(stmt); assert(rc == MYSQL_NO_DATA); - assert(0 == my_stmt_result("SELECT * FROM test_multi_table",50)); + assert(0 == my_stmt_result("SELECT * FROM test_multi_table")); mysql_stmt_close(stmt); mysql_stmt_close(stmt2); @@ -4631,7 +4642,7 @@ static void test_manual_sample() /* Prepare a insert query with 3 parameters */ strmov(query, "INSERT INTO test_table(col1,col2,col3) values(?,?,?)"); - if (!(stmt = mysql_prepare(mysql,query,strlen(query)))) + if (!(stmt = mysql_simple_prepare(mysql,query))) { fprintf(stderr, "\n prepare, insert failed"); fprintf(stderr, "\n %s", mysql_error(mysql)); @@ -4735,7 +4746,7 @@ static void test_manual_sample() fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } - assert(2 == my_stmt_result("SELECT * FROM test_table",50)); + assert(2 == my_stmt_result("SELECT * FROM test_table")); /* DROP THE TABLE */ if (mysql_query(mysql,"DROP TABLE test_table")) @@ -4770,7 +4781,7 @@ static void test_prepare_alter() rc = mysql_query(mysql,"INSERT INTO test_prep_alter values(10,'venu'),(20,'mysql')"); myquery(rc); - stmt = mysql_prepare(mysql, "INSERT INTO test_prep_alter VALUES(?,'monty')", 100); + stmt = mysql_simple_prepare(mysql, "INSERT INTO test_prep_alter VALUES(?,'monty')"); mystmt_init(stmt); verify_param_count(stmt,1); @@ -4796,7 +4807,7 @@ static void test_prepare_alter() rc = mysql_execute(stmt); mystmt(stmt, rc); - assert(4 == my_stmt_result("SELECT * FROM test_prep_alter",50)); + assert(4 == my_stmt_result("SELECT * FROM test_prep_alter")); mysql_stmt_close(stmt); } @@ -4978,7 +4989,7 @@ static void test_store_result() bind[1].is_null= &is_null[1]; length1= 0; - stmt = mysql_prepare(mysql, "SELECT * FROM test_store_result", 50); + stmt = mysql_simple_prepare(mysql, "SELECT * FROM test_store_result"); mystmt_init(stmt); rc = mysql_bind_result(stmt,bind); @@ -5089,7 +5100,7 @@ static void test_store_result1() rc = mysql_commit(mysql); myquery(rc); - stmt = mysql_prepare(mysql,"SELECT * FROM test_store_result",100); + stmt = mysql_simple_prepare(mysql,"SELECT * FROM test_store_result"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -5160,7 +5171,7 @@ static void test_store_result2() bind[0].is_null= 0; strmov((char *)query , "SELECT col1 FROM test_store_result where col1= ?"); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); rc = mysql_bind_param(stmt,bind); @@ -5252,7 +5263,7 @@ static void test_subselect() bind[0].length= 0; bind[0].is_null= 0; - stmt = mysql_prepare(mysql, "INSERT INTO test_sub2(id) SELECT * FROM test_sub1 WHERE id=?", 100); + stmt = mysql_simple_prepare(mysql, "INSERT INTO test_sub2(id) SELECT * FROM test_sub1 WHERE id=?", 100); mystmt_init(stmt); rc = mysql_bind_param(stmt,bind); @@ -5275,13 +5286,13 @@ static void test_subselect() mysql_stmt_close(stmt); - assert(3 == my_stmt_result("SELECT * FROM test_sub2",50)); + assert(3 == my_stmt_result("SELECT * FROM test_sub2")); strmov((char *)query , "SELECT ROW(1,7) IN (select id, id1 from test_sub2 WHERE id1=?)"); - assert(1 == my_stmt_result("SELECT ROW(1,7) IN (select id, id1 from test_sub2 WHERE id1=8)",100)); - assert(1 == my_stmt_result("SELECT ROW(1,7) IN (select id, id1 from test_sub2 WHERE id1=7)",100)); + assert(1 == my_stmt_result("SELECT ROW(1,7) IN (select id, id1 from test_sub2 WHERE id1=8)")); + assert(1 == my_stmt_result("SELECT ROW(1,7) IN (select id, id1 from test_sub2 WHERE id1=7)")); - stmt = mysql_prepare(mysql, query, 150); + stmt = mysql_simple_prepare(mysql, query, 150); mystmt_init(stmt); rc = mysql_bind_param(stmt,bind); @@ -5335,7 +5346,7 @@ static void test_bind_date_conv(uint row_count) ulong second_part; uint year, month, day, hour, minute, sec; - stmt = mysql_prepare(mysql,"INSERT INTO test_date VALUES(?,?,?,?)", 100); + stmt = mysql_simple_prepare(mysql,"INSERT INTO test_date VALUES(?,?,?,?)"); mystmt_init(stmt); verify_param_count(stmt, 4); @@ -5389,9 +5400,9 @@ static void test_bind_date_conv(uint row_count) mysql_stmt_close(stmt); - assert(row_count == my_stmt_result("SELECT * FROM test_date",50)); + assert(row_count == my_stmt_result("SELECT * FROM test_date")); - stmt = mysql_prepare(mysql,"SELECT * FROM test_date",50); + stmt = mysql_simple_prepare(mysql,"SELECT * FROM test_date"); myquery(rc); rc = mysql_bind_result(stmt, bind); @@ -5586,14 +5597,14 @@ static void test_pure_coverage() rc = mysql_query(mysql,"CREATE TABLE test_pure(c1 int, c2 varchar(20))"); myquery(rc); - stmt = mysql_prepare(mysql,"insert into test_pure(c67788) values(10)",100); + stmt = mysql_simple_prepare(mysql,"insert into test_pure(c67788) values(10)"); mystmt_init_r(stmt); #ifndef DBUG_OFF stmt = mysql_prepare(mysql,(const char *)0,0); mystmt_init_r(stmt); - stmt = mysql_prepare(mysql,"insert into test_pure(c2) values(10)",100); + stmt = mysql_simple_prepare(mysql,"insert into test_pure(c2) values(10)"); mystmt_init(stmt); rc = mysql_bind_param(stmt, bind); @@ -5602,7 +5613,7 @@ static void test_pure_coverage() mysql_stmt_close(stmt); #endif - stmt = mysql_prepare(mysql,"insert into test_pure(c2) values(?)",100); + stmt = mysql_simple_prepare(mysql,"insert into test_pure(c2) values(?)"); mystmt_init(stmt); #ifndef DBUG_OFF @@ -5630,7 +5641,7 @@ static void test_pure_coverage() mysql_stmt_close(stmt); - stmt = mysql_prepare(mysql,"select * from test_pure",100); + stmt = mysql_simple_prepare(mysql,"select * from test_pure"); mystmt(stmt, rc); rc = mysql_execute(stmt); @@ -5682,7 +5693,7 @@ static void test_buffers() ,('Database'),('Open-Source'),('Popular')"); myquery(rc); - stmt = mysql_prepare(mysql,"select str from test_buffer",100); + stmt = mysql_simple_prepare(mysql,"select str from test_buffer"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -5760,7 +5771,7 @@ static void test_open_direct() rc = mysql_query(mysql,"CREATE TABLE test_open_direct(id int, name char(6))"); myquery(rc); - stmt = mysql_prepare(mysql,"INSERT INTO test_open_direct values(10,'mysql')", 100); + stmt = mysql_simple_prepare(mysql,"INSERT INTO test_open_direct values(10,'mysql')"); mystmt_init(stmt); rc = mysql_query(mysql, "SELECT * FROM test_open_direct"); @@ -5799,7 +5810,7 @@ static void test_open_direct() mysql_stmt_close(stmt); /* run a direct query in the middle of a fetch */ - stmt= mysql_prepare(mysql,"SELECT * FROM test_open_direct",100); + stmt= mysql_simple_prepare(mysql,"SELECT * FROM test_open_direct"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -5818,7 +5829,7 @@ static void test_open_direct() myquery(rc); /* run a direct query with store result */ - stmt= mysql_prepare(mysql,"SELECT * FROM test_open_direct",100); + stmt= mysql_simple_prepare(mysql,"SELECT * FROM test_open_direct"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -5849,8 +5860,8 @@ static void test_fetch_nobuffs() myheader("test_fetch_nobuffs"); - stmt = mysql_prepare(mysql,"SELECT DATABASE(), CURRENT_USER(), \ - CURRENT_DATE(), CURRENT_TIME()",100); + stmt = mysql_simple_prepare(mysql,"SELECT DATABASE(), CURRENT_USER(), \ + CURRENT_DATE(), CURRENT_TIME()"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -5923,7 +5934,7 @@ static void test_ushort_bug() myquery(rc); - stmt = mysql_prepare(mysql,"SELECT * FROM test_ushort",50); + stmt = mysql_simple_prepare(mysql,"SELECT * FROM test_ushort"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -6007,7 +6018,7 @@ static void test_sshort_bug() myquery(rc); - stmt = mysql_prepare(mysql,"SELECT * FROM test_sshort",50); + stmt = mysql_simple_prepare(mysql,"SELECT * FROM test_sshort"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -6091,7 +6102,7 @@ static void test_stiny_bug() myquery(rc); - stmt = mysql_prepare(mysql,"SELECT * FROM test_stiny",50); + stmt = mysql_simple_prepare(mysql,"SELECT * FROM test_stiny"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -6176,7 +6187,7 @@ static void test_field_misc() mysql_free_result(result); - stmt = mysql_prepare(mysql,"SELECT @@autocommit",20); + stmt = mysql_simple_prepare(mysql,"SELECT @@autocommit"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -6196,7 +6207,7 @@ static void test_field_misc() mysql_free_result(result); mysql_stmt_close(stmt); - stmt = mysql_prepare(mysql, "SELECT @@table_type", 30); + stmt = mysql_simple_prepare(mysql, "SELECT @@table_type"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -6220,7 +6231,7 @@ static void test_field_misc() mysql_stmt_close(stmt); - stmt = mysql_prepare(mysql, "SELECT @@table_type", 30); + stmt = mysql_simple_prepare(mysql, "SELECT @@table_type"); mystmt_init(stmt); result = mysql_get_metadata(stmt); @@ -6240,7 +6251,7 @@ static void test_field_misc() mysql_free_result(result); mysql_stmt_close(stmt); - stmt = mysql_prepare(mysql, "SELECT @@max_error_count", 30); + stmt = mysql_simple_prepare(mysql, "SELECT @@max_error_count"); mystmt_init(stmt); result = mysql_get_metadata(stmt); @@ -6260,7 +6271,7 @@ static void test_field_misc() mysql_free_result(result); mysql_stmt_close(stmt); - stmt = mysql_prepare(mysql, "SELECT @@max_allowed_packet", 30); + stmt = mysql_simple_prepare(mysql, "SELECT @@max_allowed_packet"); mystmt_init(stmt); result = mysql_get_metadata(stmt); @@ -6280,7 +6291,7 @@ static void test_field_misc() mysql_free_result(result); mysql_stmt_close(stmt); - stmt = mysql_prepare(mysql, "SELECT @@sql_warnings", 30); + stmt = mysql_simple_prepare(mysql, "SELECT @@sql_warnings"); mystmt_init(stmt); result = mysql_get_metadata(stmt); @@ -6341,7 +6352,7 @@ static void test_set_option() mysql_free_result(result); fprintf(stdout,"\n with SQL_SELECT_LIMIT=2 (prepare)"); - stmt = mysql_prepare(mysql, "SELECT * FROM test_limit", 50); + stmt = mysql_simple_prepare(mysql, "SELECT * FROM test_limit"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -6356,7 +6367,7 @@ static void test_set_option() rc= mysql_query(mysql,"SET OPTION SQL_SELECT_LIMIT=DEFAULT"); myquery(rc); - stmt = mysql_prepare(mysql, "SELECT * FROM test_limit", 50); + stmt = mysql_simple_prepare(mysql, "SELECT * FROM test_limit"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -6433,18 +6444,20 @@ static void test_prepare_grant() execute_prepare_query("INSERT INTO test_grant(a) VALUES(NULL)",1); execute_prepare_query("INSERT INTO test_grant VALUES(NULL)",1); execute_prepare_query("UPDATE test_grant SET a=9 WHERE a=1",1); - assert(4 == my_stmt_result("SELECT a FROM test_grant",50)); - + assert(4 == my_stmt_result("SELECT a FROM test_grant")); + + /* Both DELETE expected to fail as user does not have DELETE privs */ + rc = mysql_query(mysql,"DELETE FROM test_grant"); myquery_r(rc); - stmt= mysql_prepare(mysql,"DELETE FROM test_grant",50); + stmt= mysql_simple_prepare(mysql,"DELETE FROM test_grant"); mystmt_init(stmt); rc = mysql_execute(stmt); myquery_r(rc); - assert(4 == my_stmt_result("SELECT * FROM test_grant",50)); + assert(4 == my_stmt_result("SELECT * FROM test_grant")); mysql_close(lmysql); mysql= org_mysql; @@ -6487,7 +6500,7 @@ static void test_frm_bug() rc= mysql_query(mysql,"flush tables"); myquery(rc); - stmt = mysql_prepare(mysql, "show variables like 'datadir'", 50); + stmt = mysql_simple_prepare(mysql, "show variables like 'datadir'"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -6570,7 +6583,7 @@ static void test_decimal_bug() rc = mysql_query(mysql, "insert into test_decimal_bug value(8),(10.22),(5.61)"); myquery(rc); - stmt = mysql_prepare(mysql,"select c1 from test_decimal_bug where c1= ?",50); + stmt = mysql_simple_prepare(mysql,"select c1 from test_decimal_bug where c1= ?"); mystmt_init(stmt); bind[0].buffer_type= MYSQL_TYPE_DOUBLE; @@ -6666,7 +6679,7 @@ static void test_explain_bug() rc = mysql_query(mysql, "CREATE TABLE test_explain(id int, name char(2))"); myquery(rc); - stmt = mysql_prepare(mysql, "explain test_explain", 30); + stmt = mysql_simple_prepare(mysql, "explain test_explain"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -6702,7 +6715,7 @@ static void test_explain_bug() mysql_free_result(result); mysql_stmt_close(stmt); - stmt = mysql_prepare(mysql, "explain select id, name FROM test_explain", 50); + stmt = mysql_simple_prepare(mysql, "explain select id, name FROM test_explain"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -6950,10 +6963,10 @@ static void test_logs() myheader("test_logs"); - rc = mysql_real_query(mysql, "DROP TABLE IF EXISTS test_logs", 100); + rc = mysql_query(mysql, "DROP TABLE IF EXISTS test_logs"); myquery(rc); - rc = mysql_real_query(mysql, "CREATE TABLE test_logs(id smallint, name varchar(20))", 100); + rc = mysql_query(mysql, "CREATE TABLE test_logs(id smallint, name varchar(20))"); myquery(rc); length= (ulong)(strmov((char *)data,"INSERT INTO test_logs VALUES(?,?)") - data); @@ -7015,7 +7028,7 @@ static void test_logs() mysql_stmt_close(stmt); length= (ulong)(strmov((char *)data, "SELECT * FROM test_logs WHERE id=?") - data); - stmt = mysql_prepare(mysql, data, length+2); + stmt = mysql_prepare(mysql, data, length); mystmt_init(stmt); rc = mysql_bind_param(stmt, bind); @@ -7125,7 +7138,7 @@ static void test_nstmts() mysql_stmt_close(stmt); } - stmt = mysql_prepare(mysql," select count(*) from test_nstmts", 50); + stmt = mysql_simple_prepare(mysql," select count(*) from test_nstmts"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -7172,7 +7185,7 @@ static void test_fetch_seek() rc = mysql_query(mysql, "insert into test_seek(c2) values('venu'),('mysql'),('open'),('source')"); myquery(rc); - stmt = mysql_prepare(mysql,"select * from test_seek",50); + stmt = mysql_simple_prepare(mysql,"select * from test_seek"); mystmt_init(stmt); bind[0].buffer_type= MYSQL_TYPE_LONG; @@ -7267,7 +7280,7 @@ static void test_fetch_offset() rc = mysql_query(mysql, "insert into test_column values('abcdefghij'),(null)"); myquery(rc); - stmt = mysql_prepare(mysql,"select * from test_column",50); + stmt = mysql_simple_prepare(mysql,"select * from test_column"); mystmt_init(stmt); bind[0].buffer_type= MYSQL_TYPE_STRING; @@ -7350,7 +7363,7 @@ static void test_fetch_column() rc = mysql_query(mysql, "insert into test_column(c2) values('venu'),('mysql')"); myquery(rc); - stmt = mysql_prepare(mysql,"select * from test_column order by c2 desc", 50); + stmt = mysql_simple_prepare(mysql,"select * from test_column order by c2 desc"); mystmt_init(stmt); bind[0].buffer_type= MYSQL_TYPE_LONG; @@ -7537,7 +7550,7 @@ static void test_mem_overun() assert(1 == my_process_result(mysql)); - stmt = mysql_prepare(mysql, "select * from t_mem_overun",30); + stmt = mysql_simple_prepare(mysql, "select * from t_mem_overun"); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -7583,7 +7596,7 @@ static void test_free_result() rc = mysql_query(mysql, "insert into test_free_result values(),(),()"); myquery(rc); - stmt = mysql_prepare(mysql,"select * from test_free_result",50); + stmt = mysql_simple_prepare(mysql,"select * from test_free_result"); mystmt_init(stmt); bind[0].buffer_type= MYSQL_TYPE_LONG; @@ -7662,7 +7675,7 @@ static void test_free_store_result() rc = mysql_query(mysql, "insert into test_free_result values(),(),()"); myquery(rc); - stmt = mysql_prepare(mysql,"select * from test_free_result",50); + stmt = mysql_simple_prepare(mysql,"select * from test_free_result"); mystmt_init(stmt); bind[0].buffer_type= MYSQL_TYPE_LONG; @@ -7749,7 +7762,7 @@ static void test_sqlmode() strcpy(query, "INSERT INTO test_piping VALUES(?||?)"); fprintf(stdout,"\n query: %s", query); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); fprintf(stdout,"\n total parameters: %ld", mysql_param_count(stmt)); @@ -7781,7 +7794,7 @@ static void test_sqlmode() strcpy(query, "SELECT connection_id ()"); fprintf(stdout,"\n query: %s", query); - stmt = mysql_prepare(mysql, query, 70); + stmt = mysql_simple_prepare(mysql, query); mystmt_init_r(stmt); /* ANSI */ @@ -7792,7 +7805,7 @@ static void test_sqlmode() strcpy(query, "INSERT INTO test_piping VALUES(?||?)"); fprintf(stdout,"\n query: %s", query); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); fprintf(stdout,"\n total parameters: %ld", mysql_param_count(stmt)); @@ -7809,7 +7822,7 @@ static void test_sqlmode() /* ANSI mode spaces ... */ strcpy(query, "SELECT connection_id ()"); fprintf(stdout,"\n query: %s", query); - stmt = mysql_prepare(mysql, query, 70); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -7832,7 +7845,7 @@ static void test_sqlmode() strcpy(query, "SELECT connection_id ()"); fprintf(stdout,"\n query: %s", query); - stmt = mysql_prepare(mysql, query, 70); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); rc = mysql_execute(stmt); @@ -7873,7 +7886,7 @@ static void test_ts() rc = mysql_commit(mysql); myquery(rc); - stmt = mysql_prepare(mysql,"INSERT INTO test_ts VALUES(?,?,?),(?,?,?)",50); + stmt = mysql_simple_prepare(mysql,"INSERT INTO test_ts VALUES(?,?,?),(?,?,?)"); mystmt_init(stmt); ts.year= 2003; @@ -7912,7 +7925,7 @@ static void test_ts() verify_col_data("test_ts","b","21:07:46"); verify_col_data("test_ts","c","2003-07-12 21:07:46"); - stmt = mysql_prepare(mysql,"SELECT * FROM test_ts",50); + stmt = mysql_simple_prepare(mysql,"SELECT * FROM test_ts"); mystmt_init(stmt); prep_res = mysql_get_metadata(stmt); @@ -7983,7 +7996,7 @@ static void test_bug1500() rc= mysql_commit(mysql); myquery(rc); - stmt= mysql_prepare(mysql,"SELECT i FROM test_bg1500 WHERE i IN (?,?,?)",44); + stmt= mysql_simple_prepare(mysql,"SELECT i FROM test_bg1500 WHERE i IN (?,?,?)"); mystmt_init(stmt); verify_param_count(stmt,3); @@ -8018,8 +8031,8 @@ static void test_bug1500() rc= mysql_commit(mysql); myquery(rc); - stmt= mysql_prepare(mysql, - "SELECT s FROM test_bg1500 WHERE MATCH (s) AGAINST (?)",53); + stmt= mysql_simple_prepare(mysql, + "SELECT s FROM test_bg1500 WHERE MATCH (s) AGAINST (?)"); mystmt_init(stmt); verify_param_count(stmt,1); @@ -8046,8 +8059,8 @@ static void test_bug1500() mysql_stmt_close(stmt); /* This should work too */ - stmt= mysql_prepare(mysql, - "SELECT s FROM test_bg1500 WHERE MATCH (s) AGAINST (CONCAT(?,'digger'))", 70); + stmt= mysql_simple_prepare(mysql, + "SELECT s FROM test_bg1500 WHERE MATCH (s) AGAINST (CONCAT(?,'digger'))"); mystmt_init(stmt); verify_param_count(stmt,1); @@ -8084,7 +8097,7 @@ static void test_bug1946() rc= mysql_query(mysql,"CREATE TABLE prepare_command(ID INT)"); myquery(rc); - stmt = mysql_prepare(mysql, query, strlen(query)); + stmt = mysql_simple_prepare(mysql, query); mystmt_init(stmt); rc= mysql_real_query(mysql, query, strlen(query)); assert(rc != 0); @@ -8095,6 +8108,28 @@ static void test_bug1946() rc= mysql_query(mysql,"DROP TABLE prepare_command"); } +static void test_parse_error_and_bad_length() +{ + MYSQL_STMT *stmt; + int rc; + + /* check that we get 4 syntax errors over the 4 calls */ + myheader("test_parse_error_and_bad_length"); + + rc= mysql_query(mysql,"SHOW DATABAAAA"); + assert(rc); + fprintf(stdout, "Got error (as expected): '%s'\n", mysql_error(mysql)); + rc= mysql_real_query(mysql,"SHOW DATABASES",100); + assert(rc); + fprintf(stdout, "Got error (as expected): '%s'\n", mysql_error(mysql)); + + stmt= mysql_simple_prepare(mysql,"SHOW DATABAAAA"); + assert(!stmt); + fprintf(stdout, "Got error (as expected): '%s'\n", mysql_error(mysql)); + stmt= mysql_prepare(mysql,"SHOW DATABASES",100); + assert(!stmt); + fprintf(stdout, "Got error (as expected): '%s'\n", mysql_error(mysql)); +} /* Read and parse arguments and MySQL options from my.cnf @@ -8340,6 +8375,8 @@ int main(int argc, char **argv) test_bug1644(); /* BUG#1644 */ test_bug1946(); /* test that placeholders are allowed only in prepared queries */ + test_parse_error_and_bad_length(); /* test if bad length param in + mysql_prepare() triggers error */ end_time= time((time_t *)0); total_time+= difftime(end_time, start_time); From e5c142a412f1c2ead19f8d8612e4278ffe92495e Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 11 Feb 2004 16:35:56 +0400 Subject: [PATCH 17/18] Addition to the fix for #2208 Made code shorter and more correct libmysql/client_settings.h: cli_next_result removed libmysql/libmysql.c: cli_next_result removed --- libmysql/client_settings.h | 1 - libmysql/libmysql.c | 26 +++++++++----------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/libmysql/client_settings.h b/libmysql/client_settings.h index 6a7da0bcc81..b1a85f567f9 100644 --- a/libmysql/client_settings.h +++ b/libmysql/client_settings.h @@ -58,7 +58,6 @@ int cli_stmt_execute(MYSQL_STMT *stmt); MYSQL_DATA * cli_read_binary_rows(MYSQL_STMT *stmt); int cli_unbuffered_fetch(MYSQL *mysql, char **row); const char * cli_read_statistic(MYSQL *mysql); -int cli_next_result(MYSQL *mysql); #ifdef EMBEDDED_LIBRARY int init_embedded_server(int argc, char **argv, char **groups); diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index a3e88ccd03d..27eb9bd3857 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -3510,22 +3510,6 @@ my_bool STDCALL mysql_more_results(MYSQL *mysql) /* Reads and returns the next query results */ - -int cli_next_result(MYSQL *mysql) -{ - DBUG_ENTER("cli_next_result"); - - mysql->net.last_error[0]= 0; - mysql->net.last_errno= 0; - strmov(mysql->net.sqlstate, not_error_sqlstate); - mysql->affected_rows= ~(my_ulonglong) 0; - - if (mysql->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS) - DBUG_RETURN((*mysql->methods->read_query_result)(mysql)); - - DBUG_RETURN(-1); /* No more results */ -} - int STDCALL mysql_next_result(MYSQL *mysql) { DBUG_ENTER("mysql_next_result"); @@ -3538,7 +3522,15 @@ int STDCALL mysql_next_result(MYSQL *mysql) DBUG_RETURN(1); } - DBUG_RETURN((*mysql->methods->next_result)(mysql)); + mysql->net.last_error[0]= 0; + mysql->net.last_errno= 0; + strmov(mysql->net.sqlstate, not_error_sqlstate); + mysql->affected_rows= ~(my_ulonglong) 0; + + if (mysql->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS) + DBUG_RETURN((*mysql->methods->next_result)(mysql)); + + DBUG_RETURN(-1); /* No more results */ } From b268952faf2a3a3eca9794018f1a368a5653aede Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 11 Feb 2004 16:53:39 +0400 Subject: [PATCH 18/18] Bug 2701: Function CHARSET() inconsistency CONVERT3 was removed, it was for test purposes, and rather harmful. --- mysql-test/r/cast.result | 6 -- mysql-test/r/ctype_many.result | 123 -------------------------------- mysql-test/r/func_system.result | 14 ++++ mysql-test/t/cast.test | 2 - mysql-test/t/ctype_many.test | 5 -- mysql-test/t/func_system.test | 6 ++ sql/item_strfunc.cc | 40 +---------- sql/item_strfunc.h | 14 +--- sql/sql_yacc.yy | 2 - 9 files changed, 24 insertions(+), 188 deletions(-) diff --git a/mysql-test/r/cast.result b/mysql-test/r/cast.result index c60d8e19fb4..877a349d188 100644 --- a/mysql-test/r/cast.result +++ b/mysql-test/r/cast.result @@ -64,12 +64,6 @@ test select cast(_koi8r'ÔÅÓÔ' as char character set cp1251); cast(_koi8r'ÔÅÓÔ' as char character set cp1251) òåñò -select convert(_latin1'test', "latin1_german1_ci", "latin1_swedish_ci"); -convert(_latin1'test', "latin1_german1_ci", "latin1_swedish_ci") -test -select convert(_koi8r'ÔÅÓÔ', "koi8r_general_ci", "cp1251_general_ci"); -convert(_koi8r'ÔÅÓÔ', "koi8r_general_ci", "cp1251_general_ci") -òåñò create table t1 select cast(_koi8r'ÔÅÓÔ' as char character set cp1251) as t; show create table t1; Table Create Table diff --git a/mysql-test/r/ctype_many.result b/mysql-test/r/ctype_many.result index 173d41ecdd1..8bfc6e98226 100644 --- a/mysql-test/r/ctype_many.result +++ b/mysql-test/r/ctype_many.result @@ -340,129 +340,6 @@ CYR CAPIT SOFT SIGN CYR CAPIT E ü ü CYR CAPIT YU à à CYR CAPIT YA ñ ñ -select CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci'), comment from t1; -CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci') comment -a LAT SMALL A -b LAT SMALL B -c LAT SMALL C -d LAT SMALL D -e LAT SMALL E -f LAT SMALL F -g LAT SMALL G -h LAT SMALL H -i LAT SMALL I -j LAT SMALL J -k LAT SMALL K -l LAT SMALL L -m LAT SMALL M -n LAT SMALL N -o LAT SMALL O -p LAT SMALL P -q LAT SMALL Q -r LAT SMALL R -s LAT SMALL S -t LAT SMALL T -u LAT SMALL U -v LAT SMALL V -w LAT SMALL W -x LAT SMALL X -y LAT SMALL Y -z LAT SMALL Z -A LAT CAPIT A -B LAT CAPIT B -C LAT CAPIT C -D LAT CAPIT D -E LAT CAPIT E -F LAT CAPIT F -G LAT CAPIT G -H LAT CAPIT H -I LAT CAPIT I -J LAT CAPIT J -K LAT CAPIT K -L LAT CAPIT L -M LAT CAPIT M -N LAT CAPIT N -O LAT CAPIT O -P LAT CAPIT P -Q LAT CAPIT Q -R LAT CAPIT R -S LAT CAPIT S -T LAT CAPIT T -U LAT CAPIT U -V LAT CAPIT V -W LAT CAPIT W -X LAT CAPIT X -Y LAT CAPIT Y -Z LAT CAPIT Z -â CYR SMALL A -÷ CYR SMALL BE -þ CYR SMALL VE -ú CYR SMALL GE -ä CYR SMALL DE -å CYR SMALL IE -? CYR SMALL IO -ã CYR SMALL ZHE -ÿ CYR SMALL ZE -ê CYR SMALL I -ì CYR SMALL KA -í CYR SMALL EL -î CYR SMALL EM -ï CYR SMALL EN -ð CYR SMALL O -ò CYR SMALL PE -ô CYR SMALL ER -õ CYR SMALL ES -æ CYR SMALL TE -è CYR SMALL U -ö CYR SMALL EF -é CYR SMALL HA -ç CYR SMALL TSE -à CYR SMALL CHE -ù CYR SMALL SHA -ü CYR SMALL SCHA -ñ CYR SMALL HARD SIGN -ý CYR SMALL YERU -û CYR SMALL SOFT SIGN -ø CYR SMALL E -á CYR SMALL YU -ó CYR SMALL YA -Â CYR CAPIT A -× CYR CAPIT BE -Þ CYR CAPIT VE -Ú CYR CAPIT GE -Ä CYR CAPIT DE -Å CYR CAPIT IE -? CYR CAPIT IO -Ã CYR CAPIT ZHE -ß CYR CAPIT ZE -Ê CYR CAPIT I -Ì CYR CAPIT KA -Í CYR CAPIT EL -Î CYR CAPIT EM -Ï CYR CAPIT EN -Ð CYR CAPIT O -Ò CYR CAPIT PE -Ô CYR CAPIT ER -Õ CYR CAPIT ES -Æ CYR CAPIT TE -È CYR CAPIT U -Ö CYR CAPIT EF -É CYR CAPIT HA -Ç CYR CAPIT TSE -À CYR CAPIT CHE -Ù CYR CAPIT SHA -Ü CYR CAPIT SCHA -Ñ CYR CAPIT HARD SIGN -Ý CYR CAPIT YERU -Û CYR CAPIT SOFT SIGN -Ø CYR CAPIT E -Á CYR CAPIT YU -Ó CYR CAPIT YA -explain extended select CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci'), comment from t1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL NULL NULL NULL NULL 116 -Warnings: -Note 1003 select high_priority convert(test.t1.koi8_ru_f,_latin1'utf8_general_ci',_latin1'cp1251_general_ci') AS `CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci')`,test.t1.comment AS `comment` from test.t1 ALTER TABLE t1 ADD bin_f CHAR(32) BYTE NOT NULL; 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/r/func_system.result b/mysql-test/r/func_system.result index a0437ca1c56..338902e3f3a 100644 --- a/mysql-test/r/func_system.result +++ b/mysql-test/r/func_system.result @@ -51,6 +51,20 @@ t1 CREATE TABLE `t1` ( `version` char(40) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; +select charset(charset(_utf8'a')), charset(collation(_utf8'a')); +charset(charset(_utf8'a')) charset(collation(_utf8'a')) +utf8 utf8 +select collation(charset(_utf8'a')), collation(collation(_utf8'a')); +collation(charset(_utf8'a')) collation(collation(_utf8'a')) +utf8_general_ci utf8_general_ci +create table t1 select charset(_utf8'a'), collation(_utf8'a'); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `charset(_utf8'a')` char(64) character set utf8 NOT NULL default '', + `collation(_utf8'a')` char(64) character set utf8 NOT NULL default '' +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1; select TRUE,FALSE,NULL; TRUE FALSE NULL 1 0 NULL diff --git a/mysql-test/t/cast.test b/mysql-test/t/cast.test index ab0242990fc..fab35bb334a 100644 --- a/mysql-test/t/cast.test +++ b/mysql-test/t/cast.test @@ -28,8 +28,6 @@ select CAST(DATE "2004-01-22 21:45:33" AS CHAR(4) BINARY); set names binary; select cast(_latin1'test' as char character set latin2); select cast(_koi8r'ÔÅÓÔ' as char character set cp1251); -select convert(_latin1'test', "latin1_german1_ci", "latin1_swedish_ci"); -select convert(_koi8r'ÔÅÓÔ', "koi8r_general_ci", "cp1251_general_ci"); create table t1 select cast(_koi8r'ÔÅÓÔ' as char character set cp1251) as t; show create table t1; drop table t1; diff --git a/mysql-test/t/ctype_many.test b/mysql-test/t/ctype_many.test index 7b44439aa50..26057e7c997 100644 --- a/mysql-test/t/ctype_many.test +++ b/mysql-test/t/ctype_many.test @@ -147,11 +147,6 @@ UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8); SET CHARACTER SET koi8r; SELECT * FROM t1; -# -# codecovarage for Item_func_conv_charset3 -# -select CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci'), comment from t1; -explain extended select CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci'), comment from t1; ALTER TABLE t1 ADD bin_f CHAR(32) BYTE NOT NULL; UPDATE t1 SET bin_f=koi8_ru_f; diff --git a/mysql-test/t/func_system.test b/mysql-test/t/func_system.test index f3b9b4ffc3f..a05b80ca56b 100644 --- a/mysql-test/t/func_system.test +++ b/mysql-test/t/func_system.test @@ -23,4 +23,10 @@ create table t1 (version char(40)) select database(), user(), version() as 'vers show create table t1; drop table t1; +select charset(charset(_utf8'a')), charset(collation(_utf8'a')); +select collation(charset(_utf8'a')), collation(collation(_utf8'a')); +create table t1 select charset(_utf8'a'), collation(_utf8'a'); +show create table t1; +drop table t1; + select TRUE,FALSE,NULL; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index fd1222d5f1a..ed6e44262c7 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -2124,42 +2124,6 @@ void Item_func_conv_charset::print(String *str) str->append(')'); } -String *Item_func_conv_charset3::val_str(String *str) -{ - char cs1[30], cs2[30]; - String to_cs_buff(cs1, sizeof(cs1), default_charset_info); - String from_cs_buff(cs2, sizeof(cs2), default_charset_info); - String *arg= args[0]->val_str(str); - String *to_cs= args[1]->val_str(&to_cs_buff); - String *from_cs= args[2]->val_str(&from_cs_buff); - CHARSET_INFO *from_charset; - CHARSET_INFO *to_charset; - - if (!arg || args[0]->null_value || - !to_cs || args[1]->null_value || - !from_cs || args[2]->null_value || - !(from_charset=get_charset_by_name(from_cs->ptr(), MYF(MY_WME))) || - !(to_charset=get_charset_by_name(to_cs->ptr(), MYF(MY_WME)))) - { - null_value= 1; - return 0; - } - - if (str_value.copy(arg->ptr(), arg->length(), from_charset, to_charset)) - { - null_value= 1; - return 0; - } - null_value= 0; - return &str_value; -} - - -void Item_func_conv_charset3::fix_length_and_dec() -{ - max_length = args[0]->max_length; -} - String *Item_func_set_collation::val_str(String *str) { str=args[0]->val_str(str); @@ -2226,7 +2190,7 @@ String *Item_func_charset::val_str(String *str) if ((null_value=(args[0]->null_value || !res->charset()))) return 0; str->copy(res->charset()->csname,strlen(res->charset()->csname), - &my_charset_latin1, default_charset()); + &my_charset_latin1, collation.collation); return str; } @@ -2237,7 +2201,7 @@ String *Item_func_collation::val_str(String *str) if ((null_value=(args[0]->null_value || !res->charset()))) return 0; str->copy(res->charset()->name,strlen(res->charset()->name), - &my_charset_latin1, default_charset()); + &my_charset_latin1, collation.collation); return str; } diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 465300e721e..4832ddbd1b1 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -619,16 +619,6 @@ public: void print(String *str) { print_op(str); } }; -class Item_func_conv_charset3 :public Item_str_func -{ -public: - Item_func_conv_charset3(Item *arg1,Item *arg2,Item *arg3) - :Item_str_func(arg1,arg2,arg3) {} - String *val_str(String *); - void fix_length_and_dec(); - const char *func_name() const { return "convert"; } -}; - class Item_func_charset :public Item_str_func { public: @@ -637,8 +627,8 @@ public: const char *func_name() const { return "charset"; } void fix_length_and_dec() { - max_length=40; // should be enough collation.set(system_charset_info); + max_length= 64 * collation.collation->mbmaxlen; // should be enough }; }; @@ -650,8 +640,8 @@ public: const char *func_name() const { return "collation"; } void fix_length_and_dec() { - max_length=40; // should be enough collation.set(system_charset_info); + max_length= 64 * collation.collation->mbmaxlen; // should be enough }; }; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 0dbe8981466..bdeaf5a0b86 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2574,8 +2574,6 @@ simple_expr: } | CONVERT_SYM '(' expr USING charset_name ')' { $$= new Item_func_conv_charset($3,$5); } - | CONVERT_SYM '(' expr ',' expr ',' expr ')' - { $$= new Item_func_conv_charset3($3,$7,$5); } | DEFAULT '(' simple_ident ')' { $$= new Item_default_value($3); } | VALUES '(' simple_ident ')'