diff options
author | unknown <konstantin@mysql.com> | 2004-09-02 20:16:01 +0400 |
---|---|---|
committer | unknown <konstantin@mysql.com> | 2004-09-02 20:16:01 +0400 |
commit | 0c58737ad6700e844ab38cc2b1154509f0c236db (patch) | |
tree | 0f4b1b3d310d80daa00185bb4406575d041ac80e /tests | |
parent | 3c3db07321d1a75a241e1d6689dc56d9415519a5 (diff) | |
download | mariadb-git-0c58737ad6700e844ab38cc2b1154509f0c236db.tar.gz |
A fix and test case for Bug#4231 "Wrong result with MYSQL_TIME
parameters": when unpacking binary time recieved from client, handle
the case when length is 0: it means all MYSQL_TIME members are zero.
include/my_time.h:
Declaration for set_zero_time: a tiny piece of code, which I
see no reason to not reuse.
libmysql/libmysql.c:
set_zero_time implementation is now shared between client and
server.
sql-common/my_time.c:
set_zero_time implementation added.
sql/sql_prepare.cc:
A fix for Bug#4231 "Wrong result with MYSQL_TIME parameters":
when unpacking binary time recieved from client, handle the
case when length is 0: it means all MYSQL_TIME members are zero.
tests/client_test.c:
Test case for bug#4231 "Wrong result with MYSQL_TIME parameters"
Diffstat (limited to 'tests')
-rw-r--r-- | tests/client_test.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/client_test.c b/tests/client_test.c index 552e49ec862..8a14fe3b4f7 100644 --- a/tests/client_test.c +++ b/tests/client_test.c @@ -10091,6 +10091,78 @@ static void test_bug5126() } +static void test_bug4231() +{ + MYSQL_STMT *stmt; + MYSQL_BIND bind[2]; + MYSQL_TIME tm[2]; + const char *stmt_text; + int rc; + + myheader("test_bug4231"); + + stmt_text= "DROP TABLE IF EXISTS t1"; + rc= mysql_real_query(mysql, stmt_text, strlen(stmt_text)); + myquery(rc); + + stmt_text= "CREATE TABLE t1 (a int)"; + rc= mysql_real_query(mysql, stmt_text, strlen(stmt_text)); + myquery(rc); + + stmt_text= "INSERT INTO t1 VALUES (1)"; + rc= mysql_real_query(mysql, stmt_text, strlen(stmt_text)); + myquery(rc); + + stmt= mysql_stmt_init(mysql); + stmt_text= "SELECT a FROM t1 WHERE ? = ?"; + rc= mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text)); + check_execute(stmt, rc); + + /* Bind input buffers */ + bzero(bind, sizeof(bind)); + bzero(tm, sizeof(tm)); + + bind[0].buffer_type= MYSQL_TYPE_TIME; + bind[0].buffer= (void*) tm; + bind[1].buffer_type= MYSQL_TYPE_TIME; + bind[1].buffer= (void*) tm+1; + + mysql_stmt_bind_param(stmt, bind); + check_execute(stmt, rc); + + /* + First set server-side params to some non-zero non-equal values: + then we will check that they are not used when client sends + new (zero) times. + */ + tm[0].time_type = MYSQL_TIMESTAMP_DATE; + tm[0].year = 2000; + tm[0].month = 1; + tm[0].day = 1; + tm[1]= tm[0]; + --tm[1].year; /* tm[0] != tm[1] */ + + rc= mysql_stmt_execute(stmt); + check_execute(stmt, rc); + + rc= mysql_stmt_fetch(stmt); + + /* binds are unequal, no rows should be returned */ + DBUG_ASSERT(rc == MYSQL_NO_DATA); + + /* Set one of the dates to zero */ + tm[0].year= tm[0].month= tm[0].day= 0; + tm[1]= tm[1]; + mysql_stmt_execute(stmt); + rc= mysql_stmt_fetch(stmt); + DBUG_ASSERT(rc == 0); + + mysql_stmt_close(stmt); + stmt_text= "DROP TABLE t1"; + rc= mysql_real_query(mysql, stmt_text, strlen(stmt_text)); + myquery(rc); +} + /* Read and parse arguments and MySQL options from my.cnf */ @@ -10389,6 +10461,8 @@ int main(int argc, char **argv) test_bug4030(); /* test conversion string -> time types in libmysql */ test_bug5126(); /* support for mediumint type in libmysql */ + test_bug4231(); /* proper handling of all-zero times and + dates in the server */ /* XXX: PLEASE RUN THIS PROGRAM UNDER VALGRIND AND VERIFY THAT YOUR TEST DOESN'T CONTAIN WARNINGS/ERRORS BEFORE YOU PUSH. |