diff --git a/README.md b/README.md index 8e1993a5..168a5b31 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Features - `timestamp`: `text` and `int`, - `uuid`: `text`(32..39) and `blob`(16), - `bool`: `text`(1..5) and `int`, - - `double precision`, `float` and `numeric`: `real` values and special values with `text` affinity (`+Infinity` and `-Infinity`). + - `double precision`, `float` and `numeric`: `real` values and special values with `text` affinity (`+Infinity`, `-Infinity`, `NaN`). - Support mixed SQLite [data affinity](https://www.sqlite.org/datatype3.html) output (`INSERT`/`UPDATE`) for such data types as - `timestamp`: `text`(default) or `int`, - `uuid`: `text`(36) or `blob`(16)(default). @@ -593,7 +593,7 @@ Array support is experimental. Please be careful. - SQLite promises to preserve the 15 most significant digits of a floating point value. The big value which exceed 15 most significant digits may become different value after inserted. - SQLite does not support `numeric` type as PostgreSQL. Therefore, it does not allow to store numbers with too high precision and scale. Error out of range occurs. - SQLite does not support `NaN` special value for IEEE 754-2008 numbers. Please use this special value very cerefully because there is no such conception in SQLite at all and `NaN` value treated in SQLite as `NULL`. -- SQLite support `+Infinity` and `-Infinity` special values for IEEE 754-2008 numbers in SQL expressions with numeric context. This values can be readed with both `text` and `real` affiniy, but can be writed to SQLite only with `real` affinity (as signed out of range value `9e999`). +- SQLite support `+Infinity` and `-Infinity` special values for IEEE 754-2008 numbers in SQL expressions with numeric context. This values can be readed with both `text` and `real` affiniy, but can be writed to SQLite only with `real` affinity (as signed out of range value `9.0e999`). ### Boolean values - `sqlite_fdw` boolean values support exists only for `bool` columns in foreign table. SQLite documentation recommends to store boolean as value with `integer` [affinity](https://www.sqlite.org/datatype3.html). `NULL` isn't converted, 1 converted to `true`, all other `NOT NULL` values converted to `false`. During `SELECT ... WHERE condition_column` condition converted only to `condition_column`. diff --git a/expected/12.16/extra/float4.out b/expected/12.16/extra/float4.out index 4f1d47d8..7b53576e 100644 --- a/expected/12.16/extra/float4.out +++ b/expected/12.16/extra/float4.out @@ -1240,6 +1240,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -1255,7 +1258,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -1293,13 +1296,15 @@ SELECT * FROM "type_FLOAT_INF"; 13 | Infinity 14 | Infinity 15 | -Infinity + 16 | 17 | Infinity 18 | Infinity 19 | -Infinity 20 | Infinity 21 | Infinity 22 | -Infinity -(19 rows) + 23 | NaN +(21 rows) --Testcase 306: SELECT * FROM "type_FLOAT_INF+"; @@ -1318,13 +1323,15 @@ SELECT * FROM "type_FLOAT_INF+"; 13 | Infinity | real | 3 14 | Infinity | real | 3 15 | -Infinity | real | 4 + 16 | | null | 17 | Infinity | text | 8 18 | Infinity | text | 9 19 | -Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 22 | -Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 +(21 rows) --Testcase 307: SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; @@ -1349,12 +1356,16 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 + 16 | | null | +(21 rows) --Testcase 308: SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; i | f | t | l ----+-----------+------+--- + 16 | | null | + 23 | NaN | text | 3 2 | Infinity | real | 3 4 | Infinity | real | 3 10 | Infinity | real | 3 @@ -1374,13 +1385,14 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; 15 | -Infinity | real | 4 19 | -Infinity | text | 9 22 | -Infinity | text | 4 -(19 rows) +(21 rows) --Testcase 309: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 310: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i; @@ -1415,9 +1427,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i; --Testcase 312: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 313: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i; @@ -1467,7 +1480,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 316: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i; @@ -1504,7 +1518,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 319: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i; @@ -1526,9 +1541,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i; --Testcase 321: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 322: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i; @@ -1563,9 +1579,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i; --Testcase 324: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 325: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; @@ -1598,6 +1615,44 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; 21 | Infinity | text | 4 (10 rows) +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + i | f | t | l +---+---+---+--- +(0 rows) + +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + i | f | t | l +----+-----------+------+--- + 1 | -Infinity | real | 4 + 2 | Infinity | real | 3 + 3 | -Infinity | real | 4 + 4 | Infinity | real | 3 + 5 | -1e+308 | real | 9 + 6 | 0 | real | 3 + 7 | 1e+308 | real | 8 + 10 | Infinity | real | 3 + 11 | Infinity | real | 3 + 12 | -Infinity | real | 4 + 13 | Infinity | real | 3 + 14 | Infinity | real | 3 + 15 | -Infinity | real | 4 + 17 | Infinity | text | 8 + 18 | Infinity | text | 9 + 19 | -Infinity | text | 9 + 20 | Infinity | text | 3 + 21 | Infinity | text | 4 + 22 | -Infinity | text | 4 +(19 rows) + +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) + --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; @@ -1796,6 +1851,39 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 9e999)) (6 rows) +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) > 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) < 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: i, f, t, l + Sort Key: "type_FLOAT_INF+".i + -> Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 'NaN')) +(6 rows) + --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; --Testcase 352: diff --git a/expected/12.16/extra/float8.out b/expected/12.16/extra/float8.out index aaee542c..e9e029a1 100644 --- a/expected/12.16/extra/float8.out +++ b/expected/12.16/extra/float8.out @@ -1657,6 +1657,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -1672,7 +1675,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -1710,13 +1713,15 @@ SELECT * FROM "type_FLOAT_INF"; 13 | Infinity 14 | Infinity 15 | -Infinity + 16 | 17 | Infinity 18 | Infinity 19 | -Infinity 20 | Infinity 21 | Infinity 22 | -Infinity -(19 rows) + 23 | NaN +(21 rows) --Testcase 306: SELECT * FROM "type_FLOAT_INF+"; @@ -1735,13 +1740,15 @@ SELECT * FROM "type_FLOAT_INF+"; 13 | Infinity | real | 3 14 | Infinity | real | 3 15 | -Infinity | real | 4 + 16 | | null | 17 | Infinity | text | 8 18 | Infinity | text | 9 19 | -Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 22 | -Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 +(21 rows) --Testcase 307: SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; @@ -1766,12 +1773,16 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 + 16 | | null | +(21 rows) --Testcase 308: SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; i | f | t | l ----+-----------+------+--- + 16 | | null | + 23 | NaN | text | 3 2 | Infinity | real | 3 4 | Infinity | real | 3 10 | Infinity | real | 3 @@ -1791,13 +1802,14 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; 15 | -Infinity | real | 4 19 | -Infinity | text | 9 22 | -Infinity | text | 4 -(19 rows) +(21 rows) --Testcase 309: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 310: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i; @@ -1832,9 +1844,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i; --Testcase 312: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 313: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i; @@ -1884,7 +1897,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 316: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i; @@ -1921,7 +1935,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 319: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i; @@ -1943,9 +1958,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i; --Testcase 321: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 322: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i; @@ -1980,9 +1996,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i; --Testcase 324: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 325: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; @@ -2015,6 +2032,44 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; 21 | Infinity | text | 4 (10 rows) +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + i | f | t | l +---+---+---+--- +(0 rows) + +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + i | f | t | l +----+-----------+------+--- + 1 | -Infinity | real | 4 + 2 | Infinity | real | 3 + 3 | -Infinity | real | 4 + 4 | Infinity | real | 3 + 5 | -1e+308 | real | 9 + 6 | 0 | real | 3 + 7 | 1e+308 | real | 8 + 10 | Infinity | real | 3 + 11 | Infinity | real | 3 + 12 | -Infinity | real | 4 + 13 | Infinity | real | 3 + 14 | Infinity | real | 3 + 15 | -Infinity | real | 4 + 17 | Infinity | text | 8 + 18 | Infinity | text | 9 + 19 | -Infinity | text | 9 + 20 | Infinity | text | 3 + 21 | Infinity | text | 4 + 22 | -Infinity | text | 4 +(19 rows) + +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) + --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; @@ -2213,6 +2268,39 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 9e999)) (6 rows) +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) > 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) < 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: i, f, t, l + Sort Key: "type_FLOAT_INF+".i + -> Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 'NaN')) +(6 rows) + --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; --Testcase 352: diff --git a/expected/13.12/extra/float4.out b/expected/13.12/extra/float4.out index 4f1d47d8..7b53576e 100644 --- a/expected/13.12/extra/float4.out +++ b/expected/13.12/extra/float4.out @@ -1240,6 +1240,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -1255,7 +1258,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -1293,13 +1296,15 @@ SELECT * FROM "type_FLOAT_INF"; 13 | Infinity 14 | Infinity 15 | -Infinity + 16 | 17 | Infinity 18 | Infinity 19 | -Infinity 20 | Infinity 21 | Infinity 22 | -Infinity -(19 rows) + 23 | NaN +(21 rows) --Testcase 306: SELECT * FROM "type_FLOAT_INF+"; @@ -1318,13 +1323,15 @@ SELECT * FROM "type_FLOAT_INF+"; 13 | Infinity | real | 3 14 | Infinity | real | 3 15 | -Infinity | real | 4 + 16 | | null | 17 | Infinity | text | 8 18 | Infinity | text | 9 19 | -Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 22 | -Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 +(21 rows) --Testcase 307: SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; @@ -1349,12 +1356,16 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 + 16 | | null | +(21 rows) --Testcase 308: SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; i | f | t | l ----+-----------+------+--- + 16 | | null | + 23 | NaN | text | 3 2 | Infinity | real | 3 4 | Infinity | real | 3 10 | Infinity | real | 3 @@ -1374,13 +1385,14 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; 15 | -Infinity | real | 4 19 | -Infinity | text | 9 22 | -Infinity | text | 4 -(19 rows) +(21 rows) --Testcase 309: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 310: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i; @@ -1415,9 +1427,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i; --Testcase 312: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 313: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i; @@ -1467,7 +1480,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 316: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i; @@ -1504,7 +1518,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 319: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i; @@ -1526,9 +1541,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i; --Testcase 321: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 322: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i; @@ -1563,9 +1579,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i; --Testcase 324: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 325: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; @@ -1598,6 +1615,44 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; 21 | Infinity | text | 4 (10 rows) +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + i | f | t | l +---+---+---+--- +(0 rows) + +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + i | f | t | l +----+-----------+------+--- + 1 | -Infinity | real | 4 + 2 | Infinity | real | 3 + 3 | -Infinity | real | 4 + 4 | Infinity | real | 3 + 5 | -1e+308 | real | 9 + 6 | 0 | real | 3 + 7 | 1e+308 | real | 8 + 10 | Infinity | real | 3 + 11 | Infinity | real | 3 + 12 | -Infinity | real | 4 + 13 | Infinity | real | 3 + 14 | Infinity | real | 3 + 15 | -Infinity | real | 4 + 17 | Infinity | text | 8 + 18 | Infinity | text | 9 + 19 | -Infinity | text | 9 + 20 | Infinity | text | 3 + 21 | Infinity | text | 4 + 22 | -Infinity | text | 4 +(19 rows) + +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) + --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; @@ -1796,6 +1851,39 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 9e999)) (6 rows) +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) > 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) < 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: i, f, t, l + Sort Key: "type_FLOAT_INF+".i + -> Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 'NaN')) +(6 rows) + --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; --Testcase 352: diff --git a/expected/13.12/extra/float8.out b/expected/13.12/extra/float8.out index aaee542c..e9e029a1 100644 --- a/expected/13.12/extra/float8.out +++ b/expected/13.12/extra/float8.out @@ -1657,6 +1657,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -1672,7 +1675,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -1710,13 +1713,15 @@ SELECT * FROM "type_FLOAT_INF"; 13 | Infinity 14 | Infinity 15 | -Infinity + 16 | 17 | Infinity 18 | Infinity 19 | -Infinity 20 | Infinity 21 | Infinity 22 | -Infinity -(19 rows) + 23 | NaN +(21 rows) --Testcase 306: SELECT * FROM "type_FLOAT_INF+"; @@ -1735,13 +1740,15 @@ SELECT * FROM "type_FLOAT_INF+"; 13 | Infinity | real | 3 14 | Infinity | real | 3 15 | -Infinity | real | 4 + 16 | | null | 17 | Infinity | text | 8 18 | Infinity | text | 9 19 | -Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 22 | -Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 +(21 rows) --Testcase 307: SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; @@ -1766,12 +1773,16 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 + 16 | | null | +(21 rows) --Testcase 308: SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; i | f | t | l ----+-----------+------+--- + 16 | | null | + 23 | NaN | text | 3 2 | Infinity | real | 3 4 | Infinity | real | 3 10 | Infinity | real | 3 @@ -1791,13 +1802,14 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; 15 | -Infinity | real | 4 19 | -Infinity | text | 9 22 | -Infinity | text | 4 -(19 rows) +(21 rows) --Testcase 309: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 310: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i; @@ -1832,9 +1844,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i; --Testcase 312: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 313: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i; @@ -1884,7 +1897,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 316: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i; @@ -1921,7 +1935,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 319: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i; @@ -1943,9 +1958,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i; --Testcase 321: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 322: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i; @@ -1980,9 +1996,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i; --Testcase 324: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 325: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; @@ -2015,6 +2032,44 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; 21 | Infinity | text | 4 (10 rows) +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + i | f | t | l +---+---+---+--- +(0 rows) + +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + i | f | t | l +----+-----------+------+--- + 1 | -Infinity | real | 4 + 2 | Infinity | real | 3 + 3 | -Infinity | real | 4 + 4 | Infinity | real | 3 + 5 | -1e+308 | real | 9 + 6 | 0 | real | 3 + 7 | 1e+308 | real | 8 + 10 | Infinity | real | 3 + 11 | Infinity | real | 3 + 12 | -Infinity | real | 4 + 13 | Infinity | real | 3 + 14 | Infinity | real | 3 + 15 | -Infinity | real | 4 + 17 | Infinity | text | 8 + 18 | Infinity | text | 9 + 19 | -Infinity | text | 9 + 20 | Infinity | text | 3 + 21 | Infinity | text | 4 + 22 | -Infinity | text | 4 +(19 rows) + +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) + --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; @@ -2213,6 +2268,39 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 9e999)) (6 rows) +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) > 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) < 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: i, f, t, l + Sort Key: "type_FLOAT_INF+".i + -> Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 'NaN')) +(6 rows) + --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; --Testcase 352: diff --git a/expected/14.9/extra/float4.out b/expected/14.9/extra/float4.out index a15f038d..1bbaed3f 100644 --- a/expected/14.9/extra/float4.out +++ b/expected/14.9/extra/float4.out @@ -1262,6 +1262,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -1277,7 +1280,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -1315,13 +1318,15 @@ SELECT * FROM "type_FLOAT_INF"; 13 | Infinity 14 | Infinity 15 | -Infinity + 16 | 17 | Infinity 18 | Infinity 19 | -Infinity 20 | Infinity 21 | Infinity 22 | -Infinity -(19 rows) + 23 | NaN +(21 rows) --Testcase 306: SELECT * FROM "type_FLOAT_INF+"; @@ -1340,13 +1345,15 @@ SELECT * FROM "type_FLOAT_INF+"; 13 | Infinity | real | 3 14 | Infinity | real | 3 15 | -Infinity | real | 4 + 16 | | null | 17 | Infinity | text | 8 18 | Infinity | text | 9 19 | -Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 22 | -Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 +(21 rows) --Testcase 307: SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; @@ -1371,12 +1378,16 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 + 16 | | null | +(21 rows) --Testcase 308: SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; i | f | t | l ----+-----------+------+--- + 16 | | null | + 23 | NaN | text | 3 2 | Infinity | real | 3 4 | Infinity | real | 3 10 | Infinity | real | 3 @@ -1396,13 +1407,14 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; 15 | -Infinity | real | 4 19 | -Infinity | text | 9 22 | -Infinity | text | 4 -(19 rows) +(21 rows) --Testcase 309: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 310: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i; @@ -1437,9 +1449,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i; --Testcase 312: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 313: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i; @@ -1489,7 +1502,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 316: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i; @@ -1526,7 +1540,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 319: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i; @@ -1548,9 +1563,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i; --Testcase 321: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 322: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i; @@ -1585,9 +1601,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i; --Testcase 324: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 325: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; @@ -1620,6 +1637,44 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; 21 | Infinity | text | 4 (10 rows) +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + i | f | t | l +---+---+---+--- +(0 rows) + +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + i | f | t | l +----+-----------+------+--- + 1 | -Infinity | real | 4 + 2 | Infinity | real | 3 + 3 | -Infinity | real | 4 + 4 | Infinity | real | 3 + 5 | -1e+308 | real | 9 + 6 | 0 | real | 3 + 7 | 1e+308 | real | 8 + 10 | Infinity | real | 3 + 11 | Infinity | real | 3 + 12 | -Infinity | real | 4 + 13 | Infinity | real | 3 + 14 | Infinity | real | 3 + 15 | -Infinity | real | 4 + 17 | Infinity | text | 8 + 18 | Infinity | text | 9 + 19 | -Infinity | text | 9 + 20 | Infinity | text | 3 + 21 | Infinity | text | 4 + 22 | -Infinity | text | 4 +(19 rows) + +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) + --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; @@ -1818,6 +1873,39 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 9e999)) (6 rows) +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) > 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) < 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: i, f, t, l + Sort Key: "type_FLOAT_INF+".i + -> Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 'NaN')) +(6 rows) + --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; --Testcase 352: diff --git a/expected/14.9/extra/float8.out b/expected/14.9/extra/float8.out index 20ca391a..8baeb448 100644 --- a/expected/14.9/extra/float8.out +++ b/expected/14.9/extra/float8.out @@ -1986,6 +1986,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -2001,7 +2004,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -2039,13 +2042,15 @@ SELECT * FROM "type_FLOAT_INF"; 13 | Infinity 14 | Infinity 15 | -Infinity + 16 | 17 | Infinity 18 | Infinity 19 | -Infinity 20 | Infinity 21 | Infinity 22 | -Infinity -(19 rows) + 23 | NaN +(21 rows) --Testcase 306: SELECT * FROM "type_FLOAT_INF+"; @@ -2064,13 +2069,15 @@ SELECT * FROM "type_FLOAT_INF+"; 13 | Infinity | real | 3 14 | Infinity | real | 3 15 | -Infinity | real | 4 + 16 | | null | 17 | Infinity | text | 8 18 | Infinity | text | 9 19 | -Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 22 | -Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 +(21 rows) --Testcase 307: SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; @@ -2095,12 +2102,16 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 + 16 | | null | +(21 rows) --Testcase 308: SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; i | f | t | l ----+-----------+------+--- + 16 | | null | + 23 | NaN | text | 3 2 | Infinity | real | 3 4 | Infinity | real | 3 10 | Infinity | real | 3 @@ -2120,13 +2131,14 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; 15 | -Infinity | real | 4 19 | -Infinity | text | 9 22 | -Infinity | text | 4 -(19 rows) +(21 rows) --Testcase 309: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 310: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i; @@ -2161,9 +2173,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i; --Testcase 312: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 313: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i; @@ -2213,7 +2226,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 316: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i; @@ -2250,7 +2264,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 319: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i; @@ -2272,9 +2287,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i; --Testcase 321: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 322: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i; @@ -2309,9 +2325,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i; --Testcase 324: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 325: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; @@ -2344,6 +2361,44 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; 21 | Infinity | text | 4 (10 rows) +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + i | f | t | l +---+---+---+--- +(0 rows) + +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + i | f | t | l +----+-----------+------+--- + 1 | -Infinity | real | 4 + 2 | Infinity | real | 3 + 3 | -Infinity | real | 4 + 4 | Infinity | real | 3 + 5 | -1e+308 | real | 9 + 6 | 0 | real | 3 + 7 | 1e+308 | real | 8 + 10 | Infinity | real | 3 + 11 | Infinity | real | 3 + 12 | -Infinity | real | 4 + 13 | Infinity | real | 3 + 14 | Infinity | real | 3 + 15 | -Infinity | real | 4 + 17 | Infinity | text | 8 + 18 | Infinity | text | 9 + 19 | -Infinity | text | 9 + 20 | Infinity | text | 3 + 21 | Infinity | text | 4 + 22 | -Infinity | text | 4 +(19 rows) + +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) + --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; @@ -2542,6 +2597,39 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 9e999)) (6 rows) +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) > 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) < 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: i, f, t, l + Sort Key: "type_FLOAT_INF+".i + -> Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 'NaN')) +(6 rows) + --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; --Testcase 352: diff --git a/expected/15.4/extra/float4.out b/expected/15.4/extra/float4.out index a15f038d..1bbaed3f 100644 --- a/expected/15.4/extra/float4.out +++ b/expected/15.4/extra/float4.out @@ -1262,6 +1262,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -1277,7 +1280,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -1315,13 +1318,15 @@ SELECT * FROM "type_FLOAT_INF"; 13 | Infinity 14 | Infinity 15 | -Infinity + 16 | 17 | Infinity 18 | Infinity 19 | -Infinity 20 | Infinity 21 | Infinity 22 | -Infinity -(19 rows) + 23 | NaN +(21 rows) --Testcase 306: SELECT * FROM "type_FLOAT_INF+"; @@ -1340,13 +1345,15 @@ SELECT * FROM "type_FLOAT_INF+"; 13 | Infinity | real | 3 14 | Infinity | real | 3 15 | -Infinity | real | 4 + 16 | | null | 17 | Infinity | text | 8 18 | Infinity | text | 9 19 | -Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 22 | -Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 +(21 rows) --Testcase 307: SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; @@ -1371,12 +1378,16 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 + 16 | | null | +(21 rows) --Testcase 308: SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; i | f | t | l ----+-----------+------+--- + 16 | | null | + 23 | NaN | text | 3 2 | Infinity | real | 3 4 | Infinity | real | 3 10 | Infinity | real | 3 @@ -1396,13 +1407,14 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; 15 | -Infinity | real | 4 19 | -Infinity | text | 9 22 | -Infinity | text | 4 -(19 rows) +(21 rows) --Testcase 309: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 310: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i; @@ -1437,9 +1449,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i; --Testcase 312: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 313: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i; @@ -1489,7 +1502,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 316: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i; @@ -1526,7 +1540,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 319: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i; @@ -1548,9 +1563,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i; --Testcase 321: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 322: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i; @@ -1585,9 +1601,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i; --Testcase 324: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 325: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; @@ -1620,6 +1637,44 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; 21 | Infinity | text | 4 (10 rows) +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + i | f | t | l +---+---+---+--- +(0 rows) + +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + i | f | t | l +----+-----------+------+--- + 1 | -Infinity | real | 4 + 2 | Infinity | real | 3 + 3 | -Infinity | real | 4 + 4 | Infinity | real | 3 + 5 | -1e+308 | real | 9 + 6 | 0 | real | 3 + 7 | 1e+308 | real | 8 + 10 | Infinity | real | 3 + 11 | Infinity | real | 3 + 12 | -Infinity | real | 4 + 13 | Infinity | real | 3 + 14 | Infinity | real | 3 + 15 | -Infinity | real | 4 + 17 | Infinity | text | 8 + 18 | Infinity | text | 9 + 19 | -Infinity | text | 9 + 20 | Infinity | text | 3 + 21 | Infinity | text | 4 + 22 | -Infinity | text | 4 +(19 rows) + +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) + --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; @@ -1818,6 +1873,39 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 9e999)) (6 rows) +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) > 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) < 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: i, f, t, l + Sort Key: "type_FLOAT_INF+".i + -> Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 'NaN')) +(6 rows) + --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; --Testcase 352: diff --git a/expected/15.4/extra/float8.out b/expected/15.4/extra/float8.out index 20ca391a..8baeb448 100644 --- a/expected/15.4/extra/float8.out +++ b/expected/15.4/extra/float8.out @@ -1986,6 +1986,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -2001,7 +2004,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -2039,13 +2042,15 @@ SELECT * FROM "type_FLOAT_INF"; 13 | Infinity 14 | Infinity 15 | -Infinity + 16 | 17 | Infinity 18 | Infinity 19 | -Infinity 20 | Infinity 21 | Infinity 22 | -Infinity -(19 rows) + 23 | NaN +(21 rows) --Testcase 306: SELECT * FROM "type_FLOAT_INF+"; @@ -2064,13 +2069,15 @@ SELECT * FROM "type_FLOAT_INF+"; 13 | Infinity | real | 3 14 | Infinity | real | 3 15 | -Infinity | real | 4 + 16 | | null | 17 | Infinity | text | 8 18 | Infinity | text | 9 19 | -Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 22 | -Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 +(21 rows) --Testcase 307: SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; @@ -2095,12 +2102,16 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 + 16 | | null | +(21 rows) --Testcase 308: SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; i | f | t | l ----+-----------+------+--- + 16 | | null | + 23 | NaN | text | 3 2 | Infinity | real | 3 4 | Infinity | real | 3 10 | Infinity | real | 3 @@ -2120,13 +2131,14 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; 15 | -Infinity | real | 4 19 | -Infinity | text | 9 22 | -Infinity | text | 4 -(19 rows) +(21 rows) --Testcase 309: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 310: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i; @@ -2161,9 +2173,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i; --Testcase 312: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 313: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i; @@ -2213,7 +2226,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 316: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i; @@ -2250,7 +2264,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 319: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i; @@ -2272,9 +2287,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i; --Testcase 321: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 322: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i; @@ -2309,9 +2325,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i; --Testcase 324: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 325: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; @@ -2344,6 +2361,44 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; 21 | Infinity | text | 4 (10 rows) +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + i | f | t | l +---+---+---+--- +(0 rows) + +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + i | f | t | l +----+-----------+------+--- + 1 | -Infinity | real | 4 + 2 | Infinity | real | 3 + 3 | -Infinity | real | 4 + 4 | Infinity | real | 3 + 5 | -1e+308 | real | 9 + 6 | 0 | real | 3 + 7 | 1e+308 | real | 8 + 10 | Infinity | real | 3 + 11 | Infinity | real | 3 + 12 | -Infinity | real | 4 + 13 | Infinity | real | 3 + 14 | Infinity | real | 3 + 15 | -Infinity | real | 4 + 17 | Infinity | text | 8 + 18 | Infinity | text | 9 + 19 | -Infinity | text | 9 + 20 | Infinity | text | 3 + 21 | Infinity | text | 4 + 22 | -Infinity | text | 4 +(19 rows) + +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) + --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; @@ -2542,6 +2597,39 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 9e999)) (6 rows) +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) > 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) < 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: i, f, t, l + Sort Key: "type_FLOAT_INF+".i + -> Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 'NaN')) +(6 rows) + --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; --Testcase 352: diff --git a/expected/16.0/extra/float4.out b/expected/16.0/extra/float4.out index 62874bc9..1d3d83e2 100644 --- a/expected/16.0/extra/float4.out +++ b/expected/16.0/extra/float4.out @@ -1289,6 +1289,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -1304,7 +1307,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -1342,13 +1345,15 @@ SELECT * FROM "type_FLOAT_INF"; 13 | Infinity 14 | Infinity 15 | -Infinity + 16 | 17 | Infinity 18 | Infinity 19 | -Infinity 20 | Infinity 21 | Infinity 22 | -Infinity -(19 rows) + 23 | NaN +(21 rows) --Testcase 306: SELECT * FROM "type_FLOAT_INF+"; @@ -1367,13 +1372,15 @@ SELECT * FROM "type_FLOAT_INF+"; 13 | Infinity | real | 3 14 | Infinity | real | 3 15 | -Infinity | real | 4 + 16 | | null | 17 | Infinity | text | 8 18 | Infinity | text | 9 19 | -Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 22 | -Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 +(21 rows) --Testcase 307: SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; @@ -1398,12 +1405,16 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 + 16 | | null | +(21 rows) --Testcase 308: SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; i | f | t | l ----+-----------+------+--- + 16 | | null | + 23 | NaN | text | 3 2 | Infinity | real | 3 4 | Infinity | real | 3 10 | Infinity | real | 3 @@ -1423,13 +1434,14 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; 15 | -Infinity | real | 4 19 | -Infinity | text | 9 22 | -Infinity | text | 4 -(19 rows) +(21 rows) --Testcase 309: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 310: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i; @@ -1464,9 +1476,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i; --Testcase 312: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 313: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i; @@ -1516,7 +1529,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 316: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i; @@ -1553,7 +1567,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 319: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i; @@ -1575,9 +1590,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i; --Testcase 321: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 322: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i; @@ -1612,9 +1628,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i; --Testcase 324: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 325: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; @@ -1647,6 +1664,44 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; 21 | Infinity | text | 4 (10 rows) +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + i | f | t | l +---+---+---+--- +(0 rows) + +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + i | f | t | l +----+-----------+------+--- + 1 | -Infinity | real | 4 + 2 | Infinity | real | 3 + 3 | -Infinity | real | 4 + 4 | Infinity | real | 3 + 5 | -1e+308 | real | 9 + 6 | 0 | real | 3 + 7 | 1e+308 | real | 8 + 10 | Infinity | real | 3 + 11 | Infinity | real | 3 + 12 | -Infinity | real | 4 + 13 | Infinity | real | 3 + 14 | Infinity | real | 3 + 15 | -Infinity | real | 4 + 17 | Infinity | text | 8 + 18 | Infinity | text | 9 + 19 | -Infinity | text | 9 + 20 | Infinity | text | 3 + 21 | Infinity | text | 4 + 22 | -Infinity | text | 4 +(19 rows) + +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) + --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; @@ -1845,6 +1900,39 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 9e999)) (6 rows) +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) > 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) < 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: i, f, t, l + Sort Key: "type_FLOAT_INF+".i + -> Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 'NaN')) +(6 rows) + --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; --Testcase 352: diff --git a/expected/16.0/extra/float8.out b/expected/16.0/extra/float8.out index bd6be9f6..a6d2f712 100644 --- a/expected/16.0/extra/float8.out +++ b/expected/16.0/extra/float8.out @@ -2054,6 +2054,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -2069,7 +2072,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -2107,13 +2110,15 @@ SELECT * FROM "type_FLOAT_INF"; 13 | Infinity 14 | Infinity 15 | -Infinity + 16 | 17 | Infinity 18 | Infinity 19 | -Infinity 20 | Infinity 21 | Infinity 22 | -Infinity -(19 rows) + 23 | NaN +(21 rows) --Testcase 306: SELECT * FROM "type_FLOAT_INF+"; @@ -2132,13 +2137,15 @@ SELECT * FROM "type_FLOAT_INF+"; 13 | Infinity | real | 3 14 | Infinity | real | 3 15 | -Infinity | real | 4 + 16 | | null | 17 | Infinity | text | 8 18 | Infinity | text | 9 19 | -Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 22 | -Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 +(21 rows) --Testcase 307: SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; @@ -2163,12 +2170,16 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(19 rows) + 23 | NaN | text | 3 + 16 | | null | +(21 rows) --Testcase 308: SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; i | f | t | l ----+-----------+------+--- + 16 | | null | + 23 | NaN | text | 3 2 | Infinity | real | 3 4 | Infinity | real | 3 10 | Infinity | real | 3 @@ -2188,13 +2199,14 @@ SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i; 15 | -Infinity | real | 4 19 | -Infinity | text | 9 22 | -Infinity | text | 4 -(19 rows) +(21 rows) --Testcase 309: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 310: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i; @@ -2229,9 +2241,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i; --Testcase 312: SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 313: SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i; @@ -2281,7 +2294,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 316: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i; @@ -2318,7 +2332,8 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i; 18 | Infinity | text | 9 20 | Infinity | text | 3 21 | Infinity | text | 4 -(13 rows) + 23 | NaN | text | 3 +(14 rows) --Testcase 319: SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i; @@ -2340,9 +2355,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i; --Testcase 321: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 322: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i; @@ -2377,9 +2393,10 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i; --Testcase 324: SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; - i | f | t | l ----+---+---+--- -(0 rows) + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) --Testcase 325: SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; @@ -2412,6 +2429,44 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; 21 | Infinity | text | 4 (10 rows) +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + i | f | t | l +---+---+---+--- +(0 rows) + +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + i | f | t | l +----+-----------+------+--- + 1 | -Infinity | real | 4 + 2 | Infinity | real | 3 + 3 | -Infinity | real | 4 + 4 | Infinity | real | 3 + 5 | -1e+308 | real | 9 + 6 | 0 | real | 3 + 7 | 1e+308 | real | 8 + 10 | Infinity | real | 3 + 11 | Infinity | real | 3 + 12 | -Infinity | real | 4 + 13 | Infinity | real | 3 + 14 | Infinity | real | 3 + 15 | -Infinity | real | 4 + 17 | Infinity | text | 8 + 18 | Infinity | text | 9 + 19 | -Infinity | text | 9 + 20 | Infinity | text | 3 + 21 | Infinity | text | 4 + 22 | -Infinity | text | 4 +(19 rows) + +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + i | f | t | l +----+-----+------+--- + 23 | NaN | text | 3 +(1 row) + --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i; @@ -2610,6 +2665,39 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 9e999)) (6 rows) +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) > 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) < 'NaN')) ORDER BY `i` ASC NULLS LAST +(3 rows) + +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: i, f, t, l + Sort Key: "type_FLOAT_INF+".i + -> Foreign Scan on public."type_FLOAT_INF+" + Output: i, f, t, l + SQLite query: SELECT `i`, sqlite_fdw_float(`f`), `t`, `l` FROM main."type_FLOAT_INF+" WHERE ((sqlite_fdw_float(`f`) = 'NaN')) +(6 rows) + --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; --Testcase 352: diff --git a/sql/12.16/extra/float4.sql b/sql/12.16/extra/float4.sql index 9aba8aee..7532f63b 100644 --- a/sql/12.16/extra/float4.sql +++ b/sql/12.16/extra/float4.sql @@ -676,6 +676,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -691,7 +694,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -750,6 +753,12 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 326: SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) @@ -805,7 +814,15 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 347: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; - +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; diff --git a/sql/12.16/extra/float8.sql b/sql/12.16/extra/float8.sql index 339dd2ab..1a944995 100644 --- a/sql/12.16/extra/float8.sql +++ b/sql/12.16/extra/float8.sql @@ -922,6 +922,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -937,7 +940,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -996,6 +999,12 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 326: SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) @@ -1051,7 +1060,15 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 347: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; - +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; diff --git a/sql/13.12/extra/float4.sql b/sql/13.12/extra/float4.sql index 9aba8aee..7532f63b 100644 --- a/sql/13.12/extra/float4.sql +++ b/sql/13.12/extra/float4.sql @@ -676,6 +676,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -691,7 +694,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -750,6 +753,12 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 326: SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) @@ -805,7 +814,15 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 347: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; - +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; diff --git a/sql/13.12/extra/float8.sql b/sql/13.12/extra/float8.sql index 339dd2ab..1a944995 100644 --- a/sql/13.12/extra/float8.sql +++ b/sql/13.12/extra/float8.sql @@ -922,6 +922,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -937,7 +940,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -996,6 +999,12 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 326: SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) @@ -1051,7 +1060,15 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 347: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; - +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; diff --git a/sql/14.9/extra/float4.sql b/sql/14.9/extra/float4.sql index f2fbd0b9..ede07e7a 100644 --- a/sql/14.9/extra/float4.sql +++ b/sql/14.9/extra/float4.sql @@ -688,6 +688,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -703,7 +706,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -762,6 +765,12 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 326: SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) @@ -817,7 +826,15 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 347: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; - +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; diff --git a/sql/14.9/extra/float8.sql b/sql/14.9/extra/float8.sql index fb96a4c3..0074fe52 100644 --- a/sql/14.9/extra/float8.sql +++ b/sql/14.9/extra/float8.sql @@ -1109,6 +1109,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -1124,7 +1127,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -1183,6 +1186,12 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 326: SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) @@ -1238,7 +1247,15 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 347: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; - +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; diff --git a/sql/15.4/extra/float4.sql b/sql/15.4/extra/float4.sql index f2fbd0b9..ede07e7a 100644 --- a/sql/15.4/extra/float4.sql +++ b/sql/15.4/extra/float4.sql @@ -688,6 +688,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -703,7 +706,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -762,6 +765,12 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 326: SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) @@ -817,7 +826,15 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 347: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; - +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; diff --git a/sql/15.4/extra/float8.sql b/sql/15.4/extra/float8.sql index fb96a4c3..0074fe52 100644 --- a/sql/15.4/extra/float8.sql +++ b/sql/15.4/extra/float8.sql @@ -1109,6 +1109,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -1124,7 +1127,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -1183,6 +1186,12 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 326: SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) @@ -1238,7 +1247,15 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 347: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; - +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; diff --git a/sql/16.0/extra/float4.sql b/sql/16.0/extra/float4.sql index cb2ccbdc..85a75181 100644 --- a/sql/16.0/extra/float4.sql +++ b/sql/16.0/extra/float4.sql @@ -697,6 +697,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -712,7 +715,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -771,6 +774,12 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 326: SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) @@ -826,7 +835,15 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 347: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; - +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; diff --git a/sql/16.0/extra/float8.sql b/sql/16.0/extra/float8.sql index 99d9e66a..d5014224 100644 --- a/sql/16.0/extra/float8.sql +++ b/sql/16.0/extra/float8.sql @@ -1134,6 +1134,9 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf'); INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf'); --Testcase 288: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf'); +--Testcase 289: SQLite ignores NaN +--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973 +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN'); --Testcase 290: ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text; --Testcase 291: @@ -1149,7 +1152,7 @@ INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf'); --Testcase 296: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf'); --Testcase 297: ---INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); +INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN'); --Testcase 298: INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__'); --Testcase 299: @@ -1208,6 +1211,12 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i; SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 326: SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; +--Testcase 327: +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 328: +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 329: +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 330: EXPLAIN (VERBOSE, COSTS OFF) @@ -1263,7 +1272,15 @@ SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i; --Testcase 347: EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i; - +--Testcase 348: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i; +--Testcase 349: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i; +--Testcase 350: +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i; --Testcase 351: DELETE FROM "type_FLOAT_INF" WHERE i >= 10; diff --git a/sqlite_query.c b/sqlite_query.c index 42121b5c..5ae8cd22 100644 --- a/sqlite_query.c +++ b/sqlite_query.c @@ -231,6 +231,20 @@ sqlite_convert_to_pg(Form_pg_attribute att, sqlite3_value * val, AttInMetadata * Datum d = DirectFunctionCall1(dtof, Float8GetDatum((float8)value)); return (struct NullableDatum) {d, false}; } + case SQLITE3_TEXT: + { + if (value_byte_size_blob_or_utf8) + { + const char* text_value = (const char*) sqlite3_value_text(val); + if (strcasecmp(text_value, "NaN") == 0) + return (struct NullableDatum) {Float8GetDatum(NAN), false}; + else + sqlite_value_to_pg_error(); + } + else + pg_column_void_text_error(); + break; + } case SQLITE_INTEGER: case SQLITE_BLOB: default: @@ -238,16 +252,6 @@ sqlite_convert_to_pg(Form_pg_attribute att, sqlite3_value * val, AttInMetadata * sqlite_value_to_pg_error(); break; } - case SQLITE3_TEXT: - { - if (value_byte_size_blob_or_utf8) - { - sqlite_value_to_pg_error(); - } - else - pg_column_void_text_error(); - break; - } } break; } @@ -260,6 +264,20 @@ sqlite_convert_to_pg(Form_pg_attribute att, sqlite3_value * val, AttInMetadata * double value = sqlite3_value_double(val); return (struct NullableDatum) {Float8GetDatum((float8) value), false}; } + case SQLITE3_TEXT: + { + if (value_byte_size_blob_or_utf8) + { + const char* text_value = (const char*) sqlite3_value_text(val); + if (strcasecmp(text_value, "NaN") == 0) + return (struct NullableDatum) {Float8GetDatum(NAN), false}; + else + sqlite_value_to_pg_error(); + } + else + pg_column_void_text_error(); + break; + } case SQLITE_INTEGER: case SQLITE_BLOB: default: @@ -267,16 +285,6 @@ sqlite_convert_to_pg(Form_pg_attribute att, sqlite3_value * val, AttInMetadata * sqlite_value_to_pg_error(); break; } - case SQLITE3_TEXT: - { - if (value_byte_size_blob_or_utf8) - { - sqlite_value_to_pg_error(); - } - else - pg_column_void_text_error(); - break; - } } break; } @@ -346,7 +354,11 @@ sqlite_convert_to_pg(Form_pg_attribute att, sqlite3_value * val, AttInMetadata * { if (value_byte_size_blob_or_utf8) { - sqlite_value_to_pg_error(); + const char* text_value = (const char*) sqlite3_value_text(val); + if (strcasecmp(text_value, "NaN") == 0) + return (struct NullableDatum) {Float8GetDatum(NAN), false}; + else + sqlite_value_to_pg_error(); } else pg_column_void_text_error();