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

Incorrect Result with WHERE/HAVING Clause on REAL UNIQUE Column Due to '-0.0' and 0 Comparison

    XMLWordPrintable

Details

    • Bug
    • Status: Open (View Workflow)
    • Minor
    • Resolution: Unresolved
    • 10.11, 11.4, 11.8
    • 10.11, 11.4, 11.8
    • None
    • None
    • docker pull mariadb:latest

    Description

      Hi, MariaDB developers:

      I would like to report an issue regarding incorrect query results when operating on a REAL column with a UNIQUE constraint. The problem arises when comparing the negative zero floating-point value '-0.0' with the integer 0.

      CREATE TABLE t0(c0 REAL UNIQUE,PRIMARY KEY(c0));
      CREATE TABLE t1 LIKE t0;
      INSERT INTO t0 SELECT seq FROM seq_0_to_10;
      UPDATE IGNORE t0 SET c0='-0.0';
      INSERT INTO t1 VALUES (0);
       
      -- Expected: Empty result set
      -- Actual: Returns one row with value '-0.0'
      SELECT * FROM t0 
      WHERE NOT EXISTS (SELECT 1 FROM t1 WHERE t0.c0 = t1.c0) 
      HAVING EXISTS (SELECT 1 FROM t1 WHERE t0.c0 = t1.c0); --{-0.0}
      

      This issue can be reproduced using both Python and Java connectors.

      import pymysql
      import sys
       
      def test_mysql():
          # Database configuration
          host = "localhost"
          database = "mysql"
          user = "root"
          password = ""
          port = 3307
          
          connection = None
          cursor = None
          
          try:
              # 1. Establish database connection
              connection = pymysql.connect(
                  host=host,
                  user=user,
                  password=password,
                  database=database,
                  port=port,
                  charset='utf8mb4',
                  cursorclass=pymysql.cursors.DictCursor
              )
              print("Successfully connected to database!")
              
              # 2. Create cursor object
              cursor = connection.cursor()
              
              # 3. Execute all SQL statements
              sql_statements = [
                  "DROP TABLE IF EXISTS t0",
                  "DROP TABLE IF EXISTS t1",
                  "CREATE TABLE t0(c0 REAL UNIQUE,PRIMARY KEY(c0))",
                  "CREATE TABLE t1 LIKE t0",
                  "INSERT INTO t0 SELECT seq FROM seq_0_to_10",
                  "UPDATE IGNORE t0 SET c0='-0.0'",
                  "INSERT INTO t1 VALUES (0)"
              ]
              
              for sql in sql_statements:
                  try:
                      cursor.execute(sql)
                      connection.commit()
                      print(f"Execution successful: {sql[:50]}..." if len(sql) > 50 else f"Execution successful: {sql}")
                  except pymysql.Error as e:
                      print(f"Execution failed: {sql[:50]}..." if len(sql) > 50 else f"Execution failed: {sql}")
                      print(f"Error message: {e}")
              
              # 4. Execute query statement
              query_sql = "SELECT * FROM t0 WHERE NOT EXISTS (SELECT 1 FROM t1 WHERE t0.c0 = t1.c0) HAVING EXISTS (SELECT 1 FROM t1 WHERE t0.c0 = t1.c0)"
       
              
              print(f"\nExecuting query: {query_sql}")
              cursor.execute(query_sql)
              
              # 5. Process query results
              result = cursor.fetchall()
              
              # Print column names
              if result:
                  print("Query results:")
                  columns = [desc[0] for desc in cursor.description]
                  print("\t".join(columns))
                  print("----------------------------------------")
                  
                  # Print data
                  row_count = 0
                  for row in result:
                      values = [str(value) for value in row.values()]
                      print("\t".join(values))
                      row_count += 1
                  
                  print(f"Total rows returned: {row_count}")
                  
                  # Add assertion to verify test results
                  assert row_count >= 0, "Query should return zero or more rows of data"
              else:
                  print("No results returned")
                  
          except pymysql.Error as e:
              print(f"Database operation error: {e}")
              sys.exit(1)
          except Exception as e:
              print(f"Unexpected error: {e}")
              sys.exit(1)
          finally:
              # 6. Close resources
              if cursor:
                  cursor.close()
              if connection:
                  connection.close()
                  print("\nDatabase connection closed")
       
      if __name__ == "__main__":
          test_mysql()
      

      Attachments

        Activity

          People

            bar Alexander Barkov
            jinhui lai jinhui lai
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:

              Git Integration

                Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.