1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00
Files
sqlite/test/intreal.test
drh ac2685b071 Fix new test cases added by [c77ff6089de242d8] so that they work
on all configurations.

FossilOrigin-Name: 78d3370d36fb8872de1ed853f3a479273b54d2cff9fdfe83db963f4da9c7f999
2026-09-19 10:58:12 +00:00

260 lines
7.4 KiB
Plaintext

# 2019-05-03
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
# Tests to exercise the MEM_IntReal representation of Mem objects.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set ::testprefix intreal
sqlite3_create_function db
do_execsql_test 100 {
SELECT intreal(5);
} {5.0}
do_execsql_test 110 {
SELECT intreal(5)=5, 6=intreal(6);
} {1 1}
do_execsql_test 120 {
SELECT intreal(7)=7.0, 8.0=intreal(8);
} {1 1}
do_execsql_test 130 {
SELECT typeof(intreal(9));
} {real}
do_execsql_test 140 {
SELECT 'a'||intreal(11)||'z';
} {a11.0z}
do_execsql_test 150 {
SELECT max(1.0,intreal(2),3.0), max(1,intreal(2),3);
} {3.0 3}
do_execsql_test 160 {
SELECT max(1.0,intreal(4),3.0), max(1,intreal(4),3);
} {4.0 4.0}
do_execsql_test 170 {
SELECT max(1.0,intreal(2),intreal(3),4.0),
max(1,intreal(2),intreal(3),4);
} {4.0 4}
do_execsql_test 180 {
SELECT max(1.0,intreal(5),intreal(3),4.0),
max(1,intreal(5),intreal(3),4);
} {5.0 5.0}
#-------------------------------------------------------------------------
do_execsql_test 2.1 {
CREATE TABLE t2(a REAL);
INSERT INTO t2 VALUES( 836627109860825358 );
SELECT substr(a,1,4) FROM t2 WHERE a = CAST(836627109860825358 AS REAL);
} {8.36}
do_execsql_test 2.2 {
CREATE INDEX i2 ON t2(a);
SELECT substr(a,1,4) FROM t2 WHERE a = CAST(836627109860825358 AS REAL);
} {8.36}
do_execsql_test 2.3 {
CREATE TABLE t0 (c0);
CREATE TABLE t1 (c1 REAL);
INSERT INTO t1(c1) VALUES (8366271098608253588);
INSERT INTO t0(c0) VALUES ('a');
}
set D [db one {SELECT c1 FROM t1}]
do_execsql_test 2.4 {
SELECT * FROM t1 WHERE (t1.c1 = CAST(8366271098608253588 AS REAL));
} $D
do_execsql_test 2.5 {
SELECT * FROM t0, t1 WHERE (t1.c1 = CAST(8366271098608253588 AS REAL));
} [list a $D]
do_execsql_test 2.6 {
SELECT * FROM t0, t1
WHERE (
t1.c1 >= CAST(8366271098608253588 AS REAL)
AND t1.c1 <= CAST(8366271098608253588 AS REAL)
);
} [list a $D]
# 2019-07-29 ticket ba2f4585cf495231
#
db close
sqlite3 db :memory:
do_execsql_test 3.0 {
CREATE TABLE t0 (c0 REAL, c1);
CREATE UNIQUE INDEX i0 ON t0(c1, 0 | c0);
INSERT INTO t0(c0) VALUES (4750228396194493326), (0);
UPDATE OR REPLACE t0 SET c0 = 'a', c1 = '';
SELECT * FROM t0 ORDER BY t0.c1;
PRAGMA integrity_check;
} {a {} ok}
reset_db
do_execsql_test 4.0 {
CREATE TABLE t1(a REAL, b AS ('expr') );
}
do_execsql_test 4.1 {
INSERT INTO t1 VALUES( REPLACE(0, '', 'expr') );
}
do_execsql_test 4.2 {
INSERT INTO t1 SELECT REPLACE(4, '', 'expr');
}
do_execsql_test 4.3 {
SELECT typeof(a), a FROM t1;
} {
real 0.0
real 4.0
}
reset_db
do_execsql_test 5.0 {
CREATE TABLE t1(a TEXT, b FLOAT);
INSERT INTO t1(b,a) VALUES
(2,'A'),
(5.0,'B'),
(8.5,'C');
SELECT a,b FROM t1;
} {A 2.0 B 5.0 C 8.5}
do_execsql_test 5.1 {
CREATE INDEX t1x1 ON t1(a,b);
CREATE INDEX t1x2 ON t1(b,a);
}
do_execsql_test 5.2 {
SELECT a,b FROM t1 ORDER BY a,b;
} {A 2.0 B 5.0 C 8.5}
do_execsql_test 5.3 {
SELECT a,b FROM t1 ORDER BY b,a;
} {A 2.0 B 5.0 C 8.5}
# Set up an imposter table for t1 named "x1" that does not have datatypes
set t1_root [db one {SELECT rootpage FROM sqlite_master WHERE name='t1'}]
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 1 $t1_root
db eval {CREATE TABLE x1(a,b)}
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 0 0
# Verify that 2 and 5 are stored as integer values.
#
do_execsql_test 5.4 {
SELECT * FROM x1;
} {A 2 B 5 C 8.5}
# Set up an imposter table for the indexes
set t1x1_root [db one {SELECT rootpage FROM sqlite_master WHERE name='t1x1'}]
set t1x2_root [db one {SELECT rootpage FROM sqlite_master WHERE name='t1x2'}]
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 1 $t1x1_root
db eval {CREATE TABLE x1x1(a,b,rowid,PRIMARY KEY(a,b,rowid))WITHOUT ROWID}
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 0 0
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 1 $t1x2_root
db eval {CREATE TABLE x1x2(b,a,rowid,PRIMARY KEY(b,a,rowid))WITHOUT ROWID}
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 0 0
# Verify that 2 and 5 are stored as integers in the indexes
#
do_execsql_test 5.5 {
SELECT * FROM x1x1;
} {A 2 1 B 5 2 C 8.5 3}
do_execsql_test 5.6 {
SELECT * FROM x1x2;
} {2 A 1 5 B 2 8.5 C 3}
# Bug 2026-08-13T08:12:13Z
#
reset_db
db null NULL
do_execsql_test 6.0 {
CREATE TABLE t1(a INT, c TEXT NOT NULL, b FLOAT AS (a) VIRTUAL);
INSERT INTO t1(c, a) VALUES ('x', 0);
SELECT t1.c, t1.c='x' AS p
FROM t1 RIGHT JOIN (SELECT if(1,b) AS v FROM t1) s ON v GLOB '0.0';
} {x 1}
do_execsql_test 6.1 {
SELECT *
FROM t1 RIGHT JOIN (SELECT if(1,b) AS v FROM t1) s ON v GLOB '0.0'
WHERE t1.c='x';
} {0 x 0.0 0.0}
do_execsql_test 6.2 {
DROP TABLE t1;
CREATE TABLE t1(a INT, b FLOAT AS (a) VIRTUAL);
INSERT INTO t1(a) VALUES (0);
WITH s AS MATERIALIZED (SELECT if(1,b) AS x FROM t1)
SELECT x, typeof(x) FROM s;
} {0.0 real}
ifcapable vtab {
# Bug 2026-08-23T15:39:59Z with the revised fix on 2026-08-29
#
# Verify that sqlite3ValueFromExpr() only converts integers into floating-point
# if the integer is too big to represent in 48 bits (6 bytes).
#
reset_db
do_execsql_test 7.10 {
CREATE TABLE t1(a INT);
INSERT INTO t1(a) VALUES(1);
ALTER TABLE t1 ADD COLUMN b REAL DEFAULT(-140737488355329);
CREATE INDEX t1b ON t1(b);
SELECT a, typeof(b) FROM t1;
} {1 real}
set t1broot [db onecolumn {SELECT rootpage FROM sqlite_schema WHERE name='t1b'}]
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 1 $t1broot
db eval {CREATE TABLE t2(b,rowid,PRIMARY KEY(b,rowid))WITHOUT ROWID}
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 0 0
do_execsql_test 7.11 {
SELECT b, typeof(b), rowid FROM t2;
} {-140737488355329.0 real 1}
reset_db
do_execsql_test 7.20 {
CREATE TABLE t1(a INT);
INSERT INTO t1(a) VALUES(1);
ALTER TABLE t1 ADD COLUMN b REAL DEFAULT(-140737488355328);
CREATE INDEX t1b ON t1(b);
SELECT a, typeof(b) FROM t1;
} {1 real}
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 1 $t1broot
db eval {CREATE TABLE t2(b,rowid,PRIMARY KEY(b,rowid))WITHOUT ROWID}
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 0 0
do_execsql_test 7.21 {
SELECT b, typeof(b), rowid FROM t2;
} {-140737488355328 integer 1}
reset_db
do_execsql_test 7.30 {
CREATE TABLE t1(a INT);
INSERT INTO t1(a) VALUES(1);
ALTER TABLE t1 ADD COLUMN b REAL DEFAULT(140737488355327);
CREATE INDEX t1b ON t1(b);
SELECT a, typeof(b) FROM t1;
} {1 real}
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 1 $t1broot
db eval {CREATE TABLE t2(b,rowid,PRIMARY KEY(b,rowid))WITHOUT ROWID}
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 0 0
do_execsql_test 7.31 {
SELECT b, typeof(b), rowid FROM t2;
} {140737488355327 integer 1}
reset_db
do_execsql_test 7.40 {
CREATE TABLE t1(a INT);
INSERT INTO t1(a) VALUES(1);
ALTER TABLE t1 ADD COLUMN b REAL DEFAULT(140737488355328);
CREATE INDEX t1b ON t1(b);
SELECT a, typeof(b) FROM t1;
} {1 real}
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 1 $t1broot
db eval {CREATE TABLE t2(b,rowid,PRIMARY KEY(b,rowid))WITHOUT ROWID}
sqlite3_test_control SQLITE_TESTCTRL_IMPOSTER db main 0 0
do_execsql_test 7.41 {
SELECT b, typeof(b), rowid FROM t2;
} {140737488355328.0 real 1}
} ;# endif capable vtab
finish_test