Details
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)
Gliffy Diagrams
Attachments
Activity
- All
- Comments
- Work Log
- History
- Activity
- Transitions