[MDEV-5797] PS protocol does ignores no_zero_date/no_zero_in_date Created: 2014-03-05  Updated: 2022-09-08

Status: Open
Project: MariaDB Server
Component/s: None
Affects Version/s: 5.5.36, 10.0.8
Fix Version/s: 5.5

Type: Bug Priority: Minor
Reporter: Alexander Barkov Assignee: Alexander Barkov
Resolution: Unresolved Votes: 0
Labels: 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)


Generated at Thu Feb 08 07:07:07 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.