Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-5797

PS protocol does ignores no_zero_date/no_zero_in_date

    Details

    • Type: Bug
    • Status: Open
    • Priority: Minor
    • Resolution: Unresolved
    • Affects Version/s: 5.5.36, 10.0.8
    • Fix Version/s: 10.0, 5.5
    • Component/s: None
    • 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)
      

        Gliffy Diagrams

          Attachments

            Activity

            There are no comments yet on this issue.

              People

              • Assignee:
                bar Alexander Barkov
                Reporter:
                bar Alexander Barkov
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated: