summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xBUILD/compile-pentium-debug-max-no-embedded13
-rw-r--r--BitKeeper/etc/logging_ok1
-rw-r--r--client/mysql.cc4
-rw-r--r--client/mysqlcheck.c3
-rw-r--r--client/mysqldump.c7
-rw-r--r--client/mysqlimport.c3
-rw-r--r--configure.in3
-rw-r--r--include/mysql.h4
-rw-r--r--libmysql/libmysql.c75
-rw-r--r--libmysqld/lib_sql.cc20
-rw-r--r--mysql-test/r/cast.result6
-rw-r--r--mysql-test/r/ctype_many.result123
-rw-r--r--mysql-test/r/ctype_utf8.result79
-rw-r--r--mysql-test/r/func_system.result14
-rw-r--r--mysql-test/r/mysqldump.result23
-rw-r--r--mysql-test/t/cast.test2
-rw-r--r--mysql-test/t/ctype_many.test5
-rw-r--r--mysql-test/t/ctype_utf8.test37
-rw-r--r--mysql-test/t/func_system.test6
-rw-r--r--mysql-test/t/mysqldump.test8
-rw-r--r--sql/field.cc32
-rw-r--r--sql/field.h9
-rw-r--r--sql/item.cc2
-rw-r--r--sql/item_func.cc4
-rw-r--r--sql/item_strfunc.cc40
-rw-r--r--sql/item_strfunc.h14
-rw-r--r--sql/protocol.cc9
-rw-r--r--sql/set_var.cc1
-rw-r--r--sql/sql_class.h2
-rw-r--r--sql/sql_lex.cc59
-rw-r--r--sql/sql_parse.cc31
-rw-r--r--sql/sql_prepare.cc10
-rw-r--r--sql/sql_string.cc1
-rw-r--r--sql/sql_yacc.yy2
-rw-r--r--strings/ctype-mb.c17
-rw-r--r--tests/client_test.c418
36 files changed, 591 insertions, 496 deletions
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/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/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 0025968ae5b..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))
@@ -664,7 +665,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;
@@ -1662,7 +1663,7 @@ static int dump_all_tables_in_db(char *database)
if (opt_xml)
fputs("</database>\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/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)
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"
;;
diff --git a/include/mysql.h b/include/mysql.h
index d1b467f9649..0bb42c7f5eb 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' */
@@ -575,6 +572,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/libmysql.c b/libmysql/libmysql.c
index 977657f8998..5c5898dfd7d 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)
@@ -3510,7 +3460,6 @@ my_bool STDCALL mysql_more_results(MYSQL *mysql)
/*
Reads and returns the next query results
*/
-
int STDCALL mysql_next_result(MYSQL *mysql)
{
DBUG_ENTER("mysql_next_result");
@@ -3529,8 +3478,8 @@ int STDCALL mysql_next_result(MYSQL *mysql)
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((*mysql->methods->next_result)(mysql));
+
DBUG_RETURN(-1); /* No more results */
}
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/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/ctype_utf8.result b/mysql-test/r/ctype_utf8.result
index 815ab492fa4..658a7b8f5f6 100644
--- a/mysql-test/r/ctype_utf8.result
+++ b/mysql-test/r/ctype_utf8.result
@@ -88,3 +88,82 @@ 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;
+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/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/r/mysqldump.result b/mysql-test/r/mysqldump.result
index 0414d6fa738..fd9e2a1f42b 100644
--- a/mysql-test/r/mysqldump.result
+++ b/mysql-test/r/mysqldump.result
@@ -179,3 +179,26 @@ UNLOCK TABLES;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
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
+) 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/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/ctype_utf8.test b/mysql-test/t/ctype_utf8.test
index 9da7b32eb6d..0615de99b7a 100644
--- a/mysql-test/t/ctype_utf8.test
+++ b/mysql-test/t/ctype_utf8.test
@@ -61,3 +61,40 @@ 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;
+
+#
+# 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;
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/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test
index 9bfaaa51b09..dc0d45187b4 100644
--- a/mysql-test/t/mysqldump.test
+++ b/mysql-test/t/mysqldump.test
@@ -63,3 +63,11 @@ INSERT INTO t1 VALUES (1), (2);
--exec $MYSQL_DUMP --skip-comments --compatible=mysql40 test t1
--exec $MYSQL_DUMP --skip-comments --compatible=mysql323 test t1
DROP TABLE t1;
+
+#
+# Bug #2592 'mysqldum doesn't quote "tricky" names correctly'
+#
+
+create table ```a` (i int);
+--exec $MYSQL_DUMP --skip-comments test
+drop table ```a`;
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/sql/item.cc b/sql/item.cc
index 3b9f49b8c32..1b5518cbd8c 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;
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);
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/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<Item> *list, uint flag)
#endif
}
- send_eof(thd, 1);
+ my_net_write(&thd->net, eof_buff, 1);
DBUG_RETURN(prepare_for_send(list));
err:
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
diff --git a/sql/sql_class.h b/sql/sql_class.h
index bf0d57e40b3..0d75575f6b7 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -591,6 +591,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_lex.cc b/sql/sql_lex.cc
index 4bc04ddf9ac..f145a232809 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;
@@ -667,32 +674,17 @@ 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 `
+ while ((c=yyGet()))
+ {
#ifdef USE_MB
- if (use_mb(cs))
- {
- while ((c=yyGet()) && c != delim && c != (uchar) NAMES_SEP_CHAR)
- {
- 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;
- }
- }
- yylval->lex_str=get_token(lex,yyLength());
- }
- else
+ if (my_mbcharlen(cs, c) == 1)
#endif
- {
- uint double_quotes= 0;
- char quote_char= c;
- 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)
@@ -701,16 +693,25 @@ int yylex(void *arg, void *yythd)
double_quotes++;
continue;
}
- if (c == (uchar) NAMES_SEP_CHAR)
- break;
}
- if (double_quotes)
- yylval->lex_str=get_quoted_token(lex,yyLength() - double_quotes,
- quote_char);
+#ifdef USE_MB
else
- yylval->lex_str=get_token(lex,yyLength());
+ {
+ 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 (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);
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 42ea6039b6c..81d6b80678d 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))
@@ -3845,7 +3854,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 2cc90601052..34ccb67cda9 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -926,7 +926,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/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 <my_sys.h>
#include <m_string.h>
#include <m_ctype.h>
+#include <assert.h>
#ifdef HAVE_FCONVERT
#include <floatingpoint.h>
#endif
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 ')'
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 && b<e)
+ while (pos)
{
- b+= (mblen= my_ismbchar(cs,b,e)) ? mblen : 1;
+ if ((mblen= cs->cset->mb_wc(cs, &wc, b, e)) <0)
+ break;
+ b+= mblen;
pos--;
}
- return b-b0;
+ return b - b0;
}
diff --git a/tests/client_test.c b/tests/client_test.c
index 0553d06385d..1e34b5a6f30 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,18 +959,16 @@ 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);
- rc = mysql_execute(stmt);
- mystmt_r(stmt, rc);
mysql_stmt_close(stmt);
/* 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 +1006,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 +1054,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 +1104,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 +1168,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 +1275,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 +1356,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 +1402,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 +1412,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 +1484,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 +1525,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 +1547,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 +1639,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 +1669,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 +1724,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 +1783,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 +1861,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 +1941,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 +2039,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 +2050,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 +2063,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 +2072,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 +2124,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 +2199,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 +2291,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 +2382,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 +2471,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 +2566,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 +2646,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 +2676,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 +2742,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 +2821,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 +2942,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 +3067,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 +3127,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 +3160,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 +3330,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 +3660,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 +3713,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 +3859,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 +3931,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 +4043,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 +4128,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 +4159,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 +4234,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 +4245,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 +4297,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 +4308,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 +4364,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 +4373,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 +4508,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 +4553,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 +4593,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 +4640,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 +4744,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 +4779,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 +4805,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 +4987,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 +5098,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 +5169,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 +5261,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 +5284,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 +5344,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 +5398,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,30 +5595,27 @@ 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);
- mystmt_init_r(stmt);
-
-#ifndef DBUG_OFF
- stmt = mysql_prepare(mysql,(const char *)0,0);
+ stmt = mysql_simple_prepare(mysql,"insert into test_pure(c67788) values(10)");
mystmt_init_r(stmt);
- stmt = mysql_prepare(mysql,"insert into test_pure(c2) values(10)",100);
+ /* Query without params and result should allow to bind 0 arrays */
+ stmt = mysql_simple_prepare(mysql,"insert into test_pure(c2) values(10)");
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);
+ stmt = mysql_simple_prepare(mysql,"insert into test_pure(c2) values(?)");
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,28 +5628,20 @@ 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);
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);
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);
@@ -5682,7 +5680,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 +5758,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 +5797,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 +5816,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 +5847,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 +5921,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 +6005,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 +6089,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 +6174,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 +6194,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 +6218,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 +6238,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 +6258,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 +6278,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 +6339,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 +6354,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 +6431,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 +6487,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 +6570,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 +6666,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 +6702,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 +6950,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 +7015,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 +7125,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 +7172,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 +7267,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;
@@ -7291,9 +7291,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);
@@ -7350,7 +7347,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;
@@ -7411,9 +7408,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);
@@ -7537,7 +7531,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 +7577,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 +7656,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 +7743,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 +7775,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 +7786,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 +7803,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 +7826,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 +7867,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 +7906,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 +7977,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 +8012,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 +8040,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 +8078,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 +8089,30 @@ 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));
+}
+
+
static void test_subqueries()
{
MYSQL_STMT *stmt;
@@ -8175,6 +8193,65 @@ static void test_distinct()
myquery(rc);
}
+
+/*
+ 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
*/
@@ -8421,6 +8498,9 @@ 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 */
+ test_parse_error_and_bad_length(); /* test if bad length param in
+ mysql_prepare() triggers error */
test_subqueries(); /* repeatable subqueries */
test_bad_union(); /* correct setup of UNION */
test_distinct(); /* distinct aggregate functions */