Details
-
Bug
-
Status: Open (View Workflow)
-
Minor
-
Resolution: Unresolved
-
5.5.36, 10.0.8
-
None
-
None
Description
This program:
#include <stdio.h>
|
#include <string.h>
|
#include <mysql/mysql.h>
|
#include <mysql/errmsg.h>
|
|
|
static int die(MYSQL *mysql, MYSQL_STMT *stmt, const char *func)
|
{
|
printf("%s failed: [%s][%s]\n", func, mysql_error(mysql),
|
stmt ? mysql_stmt_error(stmt) : "");
|
return 1;
|
}
|
|
|
|
|
int main()
|
{
|
MYSQL mysql;
|
MYSQL_STMT *stmt;
|
MYSQL_TIME date;
|
MYSQL_BIND bind, fetch;
|
MYSQL_ROW row;
|
unsigned long buflen= 0;
|
my_bool is_null= 0;
|
my_bool error= 0;
|
char buf[1024]= "";
|
int rc;
|
char query[]= "SELECT ?";
|
|
|
mysql_init(&mysql);
|
if (!mysql_real_connect(&mysql, "localhost", "root", "",
|
"test", 0, "/tmp/mysql.sock", 0))
|
return die(&mysql, NULL, "mysql_real_connect");
|
|
|
if (mysql_query(&mysql, "SET sql_mode='no_zero_date'"))
|
die(&mysql, NULL, "mysql_query");
|
|
|
if (!(stmt= mysql_stmt_init(&mysql)))
|
return die(&mysql, NULL, "mysql_stmt_init");
|
|
|
if (mysql_stmt_prepare(stmt, query, strlen(query)))
|
return die(&mysql, NULL, "mysql_stmt_prepare");
|
|
|
bzero(&date, sizeof(date));
|
date.time_type= MYSQL_TIMESTAMP_DATE;
|
bzero(&bind, sizeof(bind));
|
bind.buffer_type= MYSQL_TYPE_DATE;
|
bind.buffer= &date;
|
if (mysql_stmt_bind_param(stmt, &bind))
|
return die(&mysql, stmt, "mysql_stmt_bind_param");
|
|
|
if (mysql_stmt_execute(stmt))
|
return die(&mysql, stmt, "mysql_stmt_execute");
|
|
|
if (mysql_stmt_store_result(stmt))
|
return die(&mysql, stmt, "mysql_stmt_store_result");
|
|
|
bzero(&fetch, sizeof(fetch));
|
fetch.buffer_type= MYSQL_TYPE_STRING;
|
fetch.buffer= (char *) &buf;
|
fetch.buffer_length= sizeof(buf);
|
fetch.is_null= &is_null;
|
fetch.length= &buflen;
|
buflen= sizeof(buf);
|
fetch.error= &error;
|
|
|
if (mysql_stmt_bind_result(stmt, &fetch))
|
return die(&mysql, stmt, "mysql_stmt_bind_result");
|
|
|
while (!(rc= mysql_stmt_fetch(stmt)))
|
{
|
printf("row: '%s'\n", is_null ? "NULL" : buf);
|
}
|
mysql_close(&mysql);
|
}
|
prints this output:
row: '0000-00-00'
|
This is wrong, as no_zero_date is ignored.
The expected result is NULL with a warning, similar to
what happens with direct execution in this script:
mysql> SET sql_mode='no_zero_date';
|
Query OK, 0 rows affected (0.00 sec)
|
|
|
mysql> SELECT DATE('0000-00-00');
|
+--------------------+
|
| DATE('0000-00-00') |
|
+--------------------+
|
| NULL |
|
+--------------------+
|
1 row in set, 1 warning (0.00 sec)
|
|
|
mysql> SHOW WARNINGS;
|
+---------+------+----------------------------------------+
|
| Level | Code | Message |
|
+---------+------+----------------------------------------+
|
| Warning | 1292 | Incorrect datetime value: '0000-00-00' |
|
+---------+------+----------------------------------------+
|
1 row in set (0.00 sec)
|