Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Incorrect predicate evaluation result in a query (SQLancer-NoREC) #11621

Closed
2010YOUY01 opened this issue Jul 23, 2024 · 1 comment · Fixed by #11693
Closed

Incorrect predicate evaluation result in a query (SQLancer-NoREC) #11621

2010YOUY01 opened this issue Jul 23, 2024 · 1 comment · Fixed by #11693
Assignees
Labels
bug Something isn't working

Comments

@2010YOUY01
Copy link
Contributor

Describe the bug

In the following reproducer, two rows in each table should first be joined, then get evaluted to true by the predicate, and finally output to the final result.
But the final result showed 0 rows output, it should be a logic bug.
(Verified in DuckDB and PostgreSQL)

To Reproduce

Run in datafusion-cli

    /*DML*/CREATE TABLE t1(v0 DOUBLE, v1 BOOLEAN, v2 STRING, v3 STRING);
    /*DML*/CREATE TABLE t48(v0 DOUBLE, v1 STRING);
	
    /*DML*/INSERT INTO t1(v3, v0) VALUES ('', '-Inf'::Double);
    /*DML*/INSERT INTO t48(v1, v0) VALUES ('', '-Inf'::Double);

And the executed result

> SELECT * FROM t1 JOIN t48 ON ((t1.v0)=(t48.v0)) WHERE ((((t48.v0)==(t1.v0)))OR(t1.v1));
+----+----+----+----+----+----+
| v0 | v1 | v2 | v3 | v0 | v1 |
+----+----+----+----+----+----+
+----+----+----+----+----+----+
0 row(s) fetched.
Elapsed 0.041 seconds.

expected result should be 1 row output:

D SELECT * FROM t1 JOIN t48 ON ((t1.v0)=(t48.v0)) WHERE ((((t48.v0)==(t1.v0)))OR(t1.v1));
┌────────┬─────────┬─────────┬─────────┬────────┬─────────┐
│   v0   │   v1    │   v2    │   v3    │   v0   │   v1    │
│ double │ boolean │ varchar │ varchar │ double │ varchar │
├────────┼─────────┼─────────┼─────────┼────────┼─────────┤
│   -inf │         │         │         │   -inf │         │
└────────┴─────────┴─────────┴─────────┴────────┴─────────┘

Expected behavior

No response

Additional context

Found by SQLancer #11030

@2010YOUY01 2010YOUY01 added the bug Something isn't working label Jul 23, 2024
@jonahgao jonahgao self-assigned this Jul 24, 2024
@2010YOUY01
Copy link
Contributor Author

2010YOUY01 commented Jul 24, 2024

Note to myself: check if duplicate for checked

/*DML*/CREATE TABLE t33(v0 BIGINT);
/*DML*/CREATE TABLE t4(v0 BIGINT);
/*DML*/INSERT INTO t33(v0) VALUES (-565043224);
/*DML*/INSERT INTO t4(v0) VALUES (-565043224);

/* This query should return 1 row instead of 0 row */
SELECT COUNT(*)
FROM t33
NATURAL JOIN t4
WHERE (t4.v0 > t4.v0) OR (t33.v0 = t4.v0);
NoREC oracle violated:
        Q1(result size 6):SELECT COUNT(*) FROM t23 CROSS JOIN t1 LEFT JOIN t3 ON ((t23.v0)==(t1.v1)) WHERE ((t3.v1)<(t1.v0));
        Q2(result size 0):SELECT COUNT(CASE WHEN ((t3.v1)<(t1.v0)) THEN 1 ELSE NULL END) FROM t23 CROSS JOIN t1 LEFT OUTER JOIN t3 ON ((t23.v0)==(t1.v1));
    =======================================
    Reproducer:
    /*DML*/CREATE TABLE t0(v0 DOUBLE);
    /*DML*/CREATE TABLE t1(v0 BOOLEAN, v1 BIGINT, v2 STRING, v3 STRING);
    /*DML*/CREATE TABLE t2(v0 DOUBLE, v1 DOUBLE, v2 DOUBLE, v3 BIGINT);
    /*DML*/CREATE TABLE t3(v0 STRING, v1 BOOLEAN);
    /*DML*/CREATE TABLE t23(v0 BIGINT, v1 STRING);
    /*DML*/INSERT INTO t0(v0) VALUES (0.44331124448475445), (0.5093171877555834);
    /*DML*/INSERT INTO t0(v0) VALUES (0.652439619162895);
    /*DML*/INSERT INTO t0(v0) VALUES (0.9485305600990145);
    /*DML*/INSERT INTO t1(v2, v1, v3, v0) VALUES ('gp', -167978840, 'l,p', false), ('', 3, '/P', false);
    /*DML*/INSERT INTO t1(v0) VALUES (false);
    /*DML*/INSERT INTO t1(v1, v0, v2) VALUES (-5, true, '''L(h0 a');
    /*DML*/INSERT INTO t1(v3, v1) VALUES ('', 1381560824), ('0.5093171877555834', 2);
    /*DML*/INSERT INTO t1(v2, v1, v0, v3) VALUES ('0.652439619162895', NULL, false, '');
    /*DML*/INSERT INTO t1(v1, v0, v3) VALUES (-3, false, '-167978840');
    /*DML*/INSERT INTO t1(v0, v3) VALUES (true, 'ZJ#>u]&'), (true, '_T(');
    /*DML*/INSERT INTO t1(v0, v3) VALUES (false, 'Bs');
    /*DML*/INSERT INTO t2(v0) VALUES (0.8348888385279412), (0.34686910453550635);
    /*DML*/INSERT INTO t2(v3) VALUES (1381560824), (-4);
    /*DML*/INSERT INTO t2(v1, v2) VALUES (0.7755984744250121, -1.6797884E8);
    /*DML*/INSERT INTO t23(v1) VALUES ('1381560824'), ('e+1맅F_D'), ('UU+');
    /*DML*/INSERT INTO t3(v1) VALUES (false);
NoREC oracle violated:
    Q1(result size 0):SELECT COUNT(*) FROM t1 NATURAL JOIN t2 WHERE ((((((t2.v0)&(t2.v0)))==((+ t1.v0))))OR(((t2.v1)<(t2.v1))));
    Q2(result size 1):SELECT COUNT(CASE WHEN ((((((t2.v0)&(t2.v0)))==((+ t1.v0))))OR(((t2.v1)<(t2.v1)))) THEN 1 ELSE NULL END) FROM t1 NATURAL JOIN t2;
=======================================
Reproducer:
/*DML*/CREATE TABLE t0(v0 BOOLEAN, v1 STRING, v2 STRING, v3 STRING, v4 BOOLEAN, v5 DOUBLE, v6 DOUBLE, v7 STRING, v8 BIGINT);
/*DML*/CREATE TABLE t1(v0 DOUBLE);
/*DML*/CREATE TABLE t2(v0 DOUBLE, v1 BOOLEAN, v2 BIGINT);
/*DML*/INSERT INTO t0(v3, v2, v7, v6, v0, v8, v1, v5) VALUES ('0/C[O', '0/C[O', '[C', 0.27347108307301715, true, 1731582409, '', 'NaN'::Double);
/*DML*/INSERT INTO t0(v3, v7, v8, v4, v5, v6, v1) VALUES ('', 'P锢', -5, true, 0.29144975861046185, -8.144589576148658E307, 'D~hNbW'), ('', 'gf', 0, false, 0.16239537470122678, 'NaN'::Double, '8TNR)O');
/*DML*/INSERT INTO t0(v2, v0, v1, v3, v5, v4, v6) VALUES ('', true, '0.16239537470122678', '', 1.731582409E9, true, 'NaN'::Double);
/*DML*/INSERT INTO t0(v8, v6, v1, v5, v3, v4, v0) VALUES (3, 0.16239537470122678, '_vt緢', 0.016715170193260853, 'eSS', false, false), (-9223372036854775808, 0.18617628002755982, '0.16239537470122678', 0.28617162054314593, '1731582409', true, false);
/*DML*/INSERT INTO t0(v3, v4, v6, v8, v5, v1, v0) VALUES ('', false, -1.2231174547503788E308, -1, 1.731582409E9, '', false);
/*DML*/INSERT INTO t0(v4, v8, v5, v7, v0) VALUES (true, 3, -1.4428117249068804E308, '1731582409', false), (true, -3, 0.3501379778681234, '(   L+z*-<', true);
/*DML*/INSERT INTO t0(v0, v2, v4, v7, v5, v6, v1, v8, v3) VALUES (false, NULL, false, 'gDB+', 0.11381256489099878, 0.851214926301259, '0.851214926301259', 3, '');
/*DML*/INSERT INTO t0(v2, v4, v0, v8, v6) VALUES ('A', true, true, -5, 0.7873157566637504), ('hUSo', false, false, -480904548, -8.959479651983341E307);
/*DML*/INSERT INTO t0(v1, v4, v6, v5) VALUES ('-480904548', true, 0.12428985786574853, '+Inf'::Double);
/*DML*/INSERT INTO t1(v0) VALUES (-4.80904548E8), (-9.317050595615664E307);
/*DML*/INSERT INTO t1(v0) VALUES ('+Inf'::Double);
/*DML*/INSERT INTO t1(v0) VALUES (0.010407407700984583);
/*DML*/INSERT INTO t1(v0) VALUES (-7.687956195766415E307);
/*DML*/INSERT INTO t2(v0, v1) VALUES (-4.80904548E8, false);
/*DML*/INSERT INTO t2(v1) VALUES (false), (false), (true);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants