Skip to content

Semantic difference in division operator (SQLite vs. MySQL) #2

@wanteatfruit

Description

@wanteatfruit

@Beliefuture Thank you for your hard work on this impactful project!

I have a quick question about semantic equivalence. If I understand correctly, the sqlite and mysql queries in the source-target query pair are intended to be equivalent?

I noticed a subtle semantic difference in the BIRD example. SQLite defaults to floor (integer) division for the / operator, while MySQL performs an implicit type conversion and returns a decimal, even though the operator is the same.

{
  "norm": "SELECT SUM(identifier) / NULLIF(COUNT(identifier), 0) FROM identifier WHERE SUBSTRING(identifier, 'value', 'value') BETWEEN '''value''' AND '''value'''",
  "sqlite": "SELECT SUM(height) / COUNT(id) FROM Player WHERE SUBSTR(birthday, 1, 4) BETWEEN '1990' AND '1995'",
  "mysql": "SELECT SUM(height) / COUNT(id) FROM Player WHERE SUBSTRING(birthday, 1, 4) BETWEEN '1990' AND '1995'",
  "id": "BIRD"
}

To illustrate, for the following minimal database instance:

CREATE TABLE Player (
    id INT,
    birthday VARCHAR(20),
    height INT
);

INSERT INTO Player (id, birthday, height) VALUES (0, '1995', 150);
INSERT INTO Player (id, birthday, height) VALUES (1, '1990', 151);

SQLite returns 150 while MySQL returns 150.5.

For the queries to be semantically equivalent (matching SQLite's integer division), I believe the MySQL query would need to use the DIV operator: SELECT SUM(height) DIV COUNT(id) FROM ...

Is this behavior intended, or is this a case where the translation could be more precise? Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions