mirror of
https://github.com/aljazceru/turso.git
synced 2026-01-03 00:14:21 +01:00
This PR fixes [#1040](https://github.com/tursodatabase/limbo/issues/1040) and modifies the `LIKE` function in the VDBE to work on expressions of all types like SQLite. Looking at how SQLite handles this, it gets the text value of the expression regardless of its affinity. I used `exec_cast(exp, "TEXT")` to achieve the same effect. Since most `LIKE` queries will probably be done on `TEXT` expressions, I avoid casting the expression if it's already `TEXT`. If either of the expressions was `NULL`, SQLite returns nothing i.e. `NULL`. I also changed the unreachable arm message from `Like on non-text registers` to `Like failed`. The following queries produced the same results in Limbo: ``` SQLite version 3.46.1 2024-08-13 09:16:08 (UTF-16 console I/O) Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> CREATE TABLE tbl (n NULL, i INTEGER, r REAL, t TEXT, b BLOB); sqlite> INSERT INTO tbl VALUES(NULL,1,2.0,'a',X'0500'); sqlite> SELECT * FROM tbl; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE n LIKE NULL; sqlite> SELECT * FROM tbl WHERE n LIKE 'NULL'; sqlite> SELECT * FROM tbl WHERE n LIKE 1; sqlite> SELECT * FROM tbl WHERE n LIKE 2.0; sqlite> SELECT * FROM tbl WHERE n LIKE x'0500'; sqlite> sqlite> SELECT * FROM tbl WHERE i LIKE NULL; sqlite> SELECT * FROM tbl WHERE i LIKE 1; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE i LIKE '1'; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE i LIKE 2.0; sqlite> SELECT * FROM tbl WHERE i LIKE 1.0; sqlite> SELECT * FROM tbl WHERE i LIKE x'0500'; sqlite> sqlite> SELECT * FROM tbl WHERE r LIKE NULL; sqlite> SELECT * FROM tbl WHERE r LIKE 2; sqlite> SELECT * FROM tbl WHERE r LIKE 2.0; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE r LIKE '2.0'; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE r LIKE 'a'; sqlite> SELECT * FROM tbl WHERE r LIKE x'0500'; sqlite> sqlite> SELECT * FROM tbl WHERE t LIKE NULL; sqlite> SELECT * FROM tbl WHERE t LIKE 1; sqlite> SELECT * FROM tbl WHERE t LIKE 2.0; sqlite> SELECT * FROM tbl WHERE t LIKE 'a'; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE t LIKE x'0500'; sqlite> sqlite> SELECT * FROM tbl WHERE b LIKE NULL; sqlite> SELECT * FROM tbl WHERE b LIKE 1; sqlite> SELECT * FROM tbl WHERE b LIKE 2.0; sqlite> SELECT * FROM tbl WHERE b LIKE 'a'; sqlite> SELECT * FROM tbl WHERE b LIKE x'0500'; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE b LIKE 'x''0500'''; sqlite> SELECT * FROM tbl WHERE b LIKE '♣'; sqlite> sqlite> SELECT * FROM tbl WHERE 1 LIKE 1; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE 2.0 LIKE 2.0; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE 2.0 LIKE '2.0'; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE '2.0' LIKE 2.0; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE '123.45' LIKE 123.45; |1|2.0|a|♣ sqlite> SELECT * FROM tbl WHERE NULL LIKE NULL; sqlite> SELECT * FROM tbl WHERE x'0500' LIKE x'0500'; |1|2.0|a|♣ sqlite> SELECT typeof(n), typeof(i), typeof(r), typeof(t), typeof(b) FROM tbl; null|integer|real|text|blob ``` Though, these queries are very basic, and more testing could be done. Closes #1044