14a32431cSdrh# 2001 September 15 24a32431cSdrh# 34a32431cSdrh# The author disclaims copyright to this source code. In place of 44a32431cSdrh# a legal notice, here is a blessing: 54a32431cSdrh# 64a32431cSdrh# May you do good and not evil. 74a32431cSdrh# May you find forgiveness for yourself and forgive others. 84a32431cSdrh# May you share freely, never taking more than you give. 94a32431cSdrh# 104a32431cSdrh#*********************************************************************** 114a32431cSdrh# This file implements regression tests for SQLite library. 124a32431cSdrh# 134a32431cSdrh# This file implements tests for the special processing associated 144a32431cSdrh# with INTEGER PRIMARY KEY columns. 154a32431cSdrh# 1621de2e75Sdanielk1977# $Id: intpkey.test,v 1.24 2007/11/29 17:43:28 danielk1977 Exp $ 174a32431cSdrh 184a32431cSdrhset testdir [file dirname $argv0] 194a32431cSdrhsource $testdir/tester.tcl 204a32431cSdrh 214a32431cSdrh# Create a table with a primary key and a datatype other than 224a32431cSdrh# integer 234a32431cSdrh# 244a32431cSdrhdo_test intpkey-1.0 { 254a32431cSdrh execsql { 264a32431cSdrh CREATE TABLE t1(a TEXT PRIMARY KEY, b, c); 274a32431cSdrh } 284a32431cSdrh} {} 294a32431cSdrh 304a32431cSdrh# There should be an index associated with the primary key 314a32431cSdrh# 324a32431cSdrhdo_test intpkey-1.1 { 334a32431cSdrh execsql { 344a32431cSdrh SELECT name FROM sqlite_master 354a32431cSdrh WHERE type='index' AND tbl_name='t1'; 364a32431cSdrh } 37d8123366Sdanielk1977} {sqlite_autoindex_t1_1} 384a32431cSdrh 394a32431cSdrh# Now create a table with an integer primary key and verify that 404a32431cSdrh# there is no associated index. 414a32431cSdrh# 424a32431cSdrhdo_test intpkey-1.2 { 434a32431cSdrh execsql { 444a32431cSdrh DROP TABLE t1; 454a32431cSdrh CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); 464a32431cSdrh SELECT name FROM sqlite_master 474a32431cSdrh WHERE type='index' AND tbl_name='t1'; 484a32431cSdrh } 494a32431cSdrh} {} 504a32431cSdrh 514a32431cSdrh# Insert some records into the new table. Specify the primary key 524a32431cSdrh# and verify that the key is used as the record number. 534a32431cSdrh# 544a32431cSdrhdo_test intpkey-1.3 { 554a32431cSdrh execsql { 564a32431cSdrh INSERT INTO t1 VALUES(5,'hello','world'); 574a32431cSdrh } 58af9ff33aSdrh db last_insert_rowid 59af9ff33aSdrh} {5} 604a32431cSdrhdo_test intpkey-1.4 { 614a32431cSdrh execsql { 624a32431cSdrh SELECT * FROM t1; 634a32431cSdrh } 644a32431cSdrh} {5 hello world} 654a32431cSdrhdo_test intpkey-1.5 { 664a32431cSdrh execsql { 674a32431cSdrh SELECT rowid, * FROM t1; 684a32431cSdrh } 694a32431cSdrh} {5 5 hello world} 704a32431cSdrh 714a32431cSdrh# Attempting to insert a duplicate primary key should give a constraint 724a32431cSdrh# failure. 734a32431cSdrh# 744a32431cSdrhdo_test intpkey-1.6 { 754a32431cSdrh set r [catch {execsql { 764a32431cSdrh INSERT INTO t1 VALUES(5,'second','entry'); 774a32431cSdrh }} msg] 784a32431cSdrh lappend r $msg 79f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t1.a}} 804a32431cSdrhdo_test intpkey-1.7 { 814a32431cSdrh execsql { 824a32431cSdrh SELECT rowid, * FROM t1; 834a32431cSdrh } 844a32431cSdrh} {5 5 hello world} 854a32431cSdrhdo_test intpkey-1.8 { 864a32431cSdrh set r [catch {execsql { 874a32431cSdrh INSERT INTO t1 VALUES(6,'second','entry'); 884a32431cSdrh }} msg] 894a32431cSdrh lappend r $msg 904a32431cSdrh} {0 {}} 91af9ff33aSdrhdo_test intpkey-1.8.1 { 92af9ff33aSdrh db last_insert_rowid 93af9ff33aSdrh} {6} 944a32431cSdrhdo_test intpkey-1.9 { 954a32431cSdrh execsql { 964a32431cSdrh SELECT rowid, * FROM t1; 974a32431cSdrh } 984a32431cSdrh} {5 5 hello world 6 6 second entry} 994a32431cSdrh 1004a32431cSdrh# A ROWID is automatically generated for new records that do not specify 1014a32431cSdrh# the integer primary key. 1024a32431cSdrh# 1034a32431cSdrhdo_test intpkey-1.10 { 1044a32431cSdrh execsql { 1054a32431cSdrh INSERT INTO t1(b,c) VALUES('one','two'); 1064a32431cSdrh SELECT b FROM t1 ORDER BY b; 1074a32431cSdrh } 1084a32431cSdrh} {hello one second} 1094a32431cSdrh 1104a32431cSdrh# Try to change the ROWID for the new entry. 1114a32431cSdrh# 1124a32431cSdrhdo_test intpkey-1.11 { 1134a32431cSdrh execsql { 1145cf8e8c7Sdrh UPDATE t1 SET a=4 WHERE b='one'; 1154a32431cSdrh SELECT * FROM t1; 1164a32431cSdrh } 1175cf8e8c7Sdrh} {4 one two 5 hello world 6 second entry} 1184a32431cSdrh 1194a32431cSdrh# Make sure SELECT statements are able to use the primary key column 1204a32431cSdrh# as an index. 1214a32431cSdrh# 1227ec764a2Sdrhdo_test intpkey-1.12.1 { 1234a32431cSdrh execsql { 1245cf8e8c7Sdrh SELECT * FROM t1 WHERE a==4; 1254a32431cSdrh } 1265cf8e8c7Sdrh} {4 one two} 1277ec764a2Sdrhdo_test intpkey-1.12.2 { 1287c171098Sdrh execsql { 1297c171098Sdrh EXPLAIN QUERY PLAN 1307c171098Sdrh SELECT * FROM t1 WHERE a==4; 1317c171098Sdrh } 132*8210233cSdrh} {/SEARCH t1 /} 1334a32431cSdrh 1348aff1015Sdrh# Try to insert a non-integer value into the primary key field. This 1358aff1015Sdrh# should result in a data type mismatch. 1368aff1015Sdrh# 1379468c7f4Sdrhdo_test intpkey-1.13.1 { 1388aff1015Sdrh set r [catch {execsql { 1398aff1015Sdrh INSERT INTO t1 VALUES('x','y','z'); 1408aff1015Sdrh }} msg] 1418aff1015Sdrh lappend r $msg 1428aff1015Sdrh} {1 {datatype mismatch}} 1439468c7f4Sdrhdo_test intpkey-1.13.2 { 1449468c7f4Sdrh set r [catch {execsql { 1459468c7f4Sdrh INSERT INTO t1 VALUES('','y','z'); 1469468c7f4Sdrh }} msg] 1479468c7f4Sdrh lappend r $msg 1489468c7f4Sdrh} {1 {datatype mismatch}} 1498aff1015Sdrhdo_test intpkey-1.14 { 1508aff1015Sdrh set r [catch {execsql { 1518aff1015Sdrh INSERT INTO t1 VALUES(3.4,'y','z'); 1528aff1015Sdrh }} msg] 1538aff1015Sdrh lappend r $msg 1548aff1015Sdrh} {1 {datatype mismatch}} 1558aff1015Sdrhdo_test intpkey-1.15 { 1568aff1015Sdrh set r [catch {execsql { 1578aff1015Sdrh INSERT INTO t1 VALUES(-3,'y','z'); 1588aff1015Sdrh }} msg] 1598aff1015Sdrh lappend r $msg 1608aff1015Sdrh} {0 {}} 1618aff1015Sdrhdo_test intpkey-1.16 { 1628aff1015Sdrh execsql {SELECT * FROM t1} 1635cf8e8c7Sdrh} {-3 y z 4 one two 5 hello world 6 second entry} 1648aff1015Sdrh 1658aff1015Sdrh#### INDICES 1668aff1015Sdrh# Check to make sure indices work correctly with integer primary keys 1678aff1015Sdrh# 1688aff1015Sdrhdo_test intpkey-2.1 { 1698aff1015Sdrh execsql { 1708aff1015Sdrh CREATE INDEX i1 ON t1(b); 1718aff1015Sdrh SELECT * FROM t1 WHERE b=='y' 1728aff1015Sdrh } 1738aff1015Sdrh} {-3 y z} 1748aff1015Sdrhdo_test intpkey-2.1.1 { 1758aff1015Sdrh execsql { 1768aff1015Sdrh SELECT * FROM t1 WHERE b=='y' AND rowid<0 1778aff1015Sdrh } 1788aff1015Sdrh} {-3 y z} 1798aff1015Sdrhdo_test intpkey-2.1.2 { 1808aff1015Sdrh execsql { 1818aff1015Sdrh SELECT * FROM t1 WHERE b=='y' AND rowid<0 AND rowid>=-20 1828aff1015Sdrh } 1838aff1015Sdrh} {-3 y z} 1848aff1015Sdrhdo_test intpkey-2.1.3 { 1858aff1015Sdrh execsql { 1868aff1015Sdrh SELECT * FROM t1 WHERE b>='y' 1878aff1015Sdrh } 1888aff1015Sdrh} {-3 y z} 1898aff1015Sdrhdo_test intpkey-2.1.4 { 1908aff1015Sdrh execsql { 1918aff1015Sdrh SELECT * FROM t1 WHERE b>='y' AND rowid<10 1928aff1015Sdrh } 1938aff1015Sdrh} {-3 y z} 1940ca3e24bSdrh 1958aff1015Sdrhdo_test intpkey-2.2 { 1968aff1015Sdrh execsql { 1978aff1015Sdrh UPDATE t1 SET a=8 WHERE b=='y'; 1988aff1015Sdrh SELECT * FROM t1 WHERE b=='y'; 1998aff1015Sdrh } 2008aff1015Sdrh} {8 y z} 2018aff1015Sdrhdo_test intpkey-2.3 { 2028aff1015Sdrh execsql { 2038aff1015Sdrh SELECT rowid, * FROM t1; 2048aff1015Sdrh } 2055cf8e8c7Sdrh} {4 4 one two 5 5 hello world 6 6 second entry 8 8 y z} 2068aff1015Sdrhdo_test intpkey-2.4 { 2078aff1015Sdrh execsql { 2088aff1015Sdrh SELECT rowid, * FROM t1 WHERE b<'second' 2098aff1015Sdrh } 2105cf8e8c7Sdrh} {5 5 hello world 4 4 one two} 2118aff1015Sdrhdo_test intpkey-2.4.1 { 2128aff1015Sdrh execsql { 2138aff1015Sdrh SELECT rowid, * FROM t1 WHERE 'second'>b 2148aff1015Sdrh } 2155cf8e8c7Sdrh} {5 5 hello world 4 4 one two} 2168aff1015Sdrhdo_test intpkey-2.4.2 { 2178aff1015Sdrh execsql { 2188aff1015Sdrh SELECT rowid, * FROM t1 WHERE 8>rowid AND 'second'>b 2198aff1015Sdrh } 2205cf8e8c7Sdrh} {4 4 one two 5 5 hello world} 2218aff1015Sdrhdo_test intpkey-2.4.3 { 2228aff1015Sdrh execsql { 2238aff1015Sdrh SELECT rowid, * FROM t1 WHERE 8>rowid AND 'second'>b AND 0<rowid 2248aff1015Sdrh } 2255cf8e8c7Sdrh} {4 4 one two 5 5 hello world} 2268aff1015Sdrhdo_test intpkey-2.5 { 2278aff1015Sdrh execsql { 2288aff1015Sdrh SELECT rowid, * FROM t1 WHERE b>'a' 2298aff1015Sdrh } 2305cf8e8c7Sdrh} {5 5 hello world 4 4 one two 6 6 second entry 8 8 y z} 2318aff1015Sdrhdo_test intpkey-2.6 { 2328aff1015Sdrh execsql { 2335cf8e8c7Sdrh DELETE FROM t1 WHERE rowid=4; 2348aff1015Sdrh SELECT * FROM t1 WHERE b>'a'; 2358aff1015Sdrh } 2368aff1015Sdrh} {5 hello world 6 second entry 8 y z} 2378aff1015Sdrhdo_test intpkey-2.7 { 2388aff1015Sdrh execsql { 2398aff1015Sdrh UPDATE t1 SET a=-4 WHERE rowid=8; 2408aff1015Sdrh SELECT * FROM t1 WHERE b>'a'; 2418aff1015Sdrh } 2428aff1015Sdrh} {5 hello world 6 second entry -4 y z} 2438aff1015Sdrhdo_test intpkey-2.7 { 2448aff1015Sdrh execsql { 2458aff1015Sdrh SELECT * FROM t1 2468aff1015Sdrh } 2478aff1015Sdrh} {-4 y z 5 hello world 6 second entry} 2488aff1015Sdrh 2498aff1015Sdrh# Do an SQL statement. Append the search count to the end of the result. 2508aff1015Sdrh# 2518aff1015Sdrhproc count sql { 2528aff1015Sdrh set ::sqlite_search_count 0 2538aff1015Sdrh return [concat [execsql $sql] $::sqlite_search_count] 2548aff1015Sdrh} 2558aff1015Sdrh 2568aff1015Sdrh# Create indices that include the integer primary key as one of their 2578aff1015Sdrh# columns. 2588aff1015Sdrh# 2598aff1015Sdrhdo_test intpkey-3.1 { 2608aff1015Sdrh execsql { 2618aff1015Sdrh CREATE INDEX i2 ON t1(a); 2628aff1015Sdrh } 2638aff1015Sdrh} {} 2648aff1015Sdrhdo_test intpkey-3.2 { 2658aff1015Sdrh count { 2668aff1015Sdrh SELECT * FROM t1 WHERE a=5; 2678aff1015Sdrh } 2688aff1015Sdrh} {5 hello world 0} 2698aff1015Sdrhdo_test intpkey-3.3 { 2708aff1015Sdrh count { 2718aff1015Sdrh SELECT * FROM t1 WHERE a>4 AND a<6; 2728aff1015Sdrh } 2738aff1015Sdrh} {5 hello world 2} 2748aff1015Sdrhdo_test intpkey-3.4 { 2758aff1015Sdrh count { 2768aff1015Sdrh SELECT * FROM t1 WHERE b>='hello' AND b<'hello2'; 2778aff1015Sdrh } 2788aff1015Sdrh} {5 hello world 3} 2798aff1015Sdrhdo_test intpkey-3.5 { 2808aff1015Sdrh execsql { 2818aff1015Sdrh CREATE INDEX i3 ON t1(c,a); 2828aff1015Sdrh } 2838aff1015Sdrh} {} 2848aff1015Sdrhdo_test intpkey-3.6 { 2858aff1015Sdrh count { 2868aff1015Sdrh SELECT * FROM t1 WHERE c=='world'; 2878aff1015Sdrh } 2888aff1015Sdrh} {5 hello world 3} 2898aff1015Sdrhdo_test intpkey-3.7 { 2908aff1015Sdrh execsql {INSERT INTO t1 VALUES(11,'hello','world')} 2918aff1015Sdrh count { 2928aff1015Sdrh SELECT * FROM t1 WHERE c=='world'; 2938aff1015Sdrh } 2948aff1015Sdrh} {5 hello world 11 hello world 5} 2958aff1015Sdrhdo_test intpkey-3.8 { 2968aff1015Sdrh count { 2978aff1015Sdrh SELECT * FROM t1 WHERE c=='world' AND a>7; 2988aff1015Sdrh } 299892ffcc7Sdrh} {11 hello world 3} 3008aff1015Sdrhdo_test intpkey-3.9 { 3018aff1015Sdrh count { 3028aff1015Sdrh SELECT * FROM t1 WHERE 7<a; 3038aff1015Sdrh } 3048aff1015Sdrh} {11 hello world 1} 3058aff1015Sdrh 3068aff1015Sdrh# Test inequality constraints on integer primary keys and rowids 3078aff1015Sdrh# 3088aff1015Sdrhdo_test intpkey-4.1 { 3098aff1015Sdrh count { 3108aff1015Sdrh SELECT * FROM t1 WHERE 11=rowid 3118aff1015Sdrh } 3128aff1015Sdrh} {11 hello world 0} 3138aff1015Sdrhdo_test intpkey-4.2 { 3148aff1015Sdrh count { 3158aff1015Sdrh SELECT * FROM t1 WHERE 11=rowid AND b=='hello' 3168aff1015Sdrh } 3178aff1015Sdrh} {11 hello world 0} 3188aff1015Sdrhdo_test intpkey-4.3 { 3198aff1015Sdrh count { 3208aff1015Sdrh SELECT * FROM t1 WHERE 11=rowid AND b=='hello' AND c IS NOT NULL; 3218aff1015Sdrh } 3228aff1015Sdrh} {11 hello world 0} 3238aff1015Sdrhdo_test intpkey-4.4 { 3248aff1015Sdrh count { 3258aff1015Sdrh SELECT * FROM t1 WHERE rowid==11 3268aff1015Sdrh } 3278aff1015Sdrh} {11 hello world 0} 3288aff1015Sdrhdo_test intpkey-4.5 { 3298aff1015Sdrh count { 3308aff1015Sdrh SELECT * FROM t1 WHERE oid==11 AND b=='hello' 3318aff1015Sdrh } 3328aff1015Sdrh} {11 hello world 0} 3338aff1015Sdrhdo_test intpkey-4.6 { 3348aff1015Sdrh count { 3358aff1015Sdrh SELECT * FROM t1 WHERE a==11 AND b=='hello' AND c IS NOT NULL; 3368aff1015Sdrh } 3378aff1015Sdrh} {11 hello world 0} 3388aff1015Sdrh 3398aff1015Sdrhdo_test intpkey-4.7 { 3408aff1015Sdrh count { 3418aff1015Sdrh SELECT * FROM t1 WHERE 8<rowid; 3428aff1015Sdrh } 3438aff1015Sdrh} {11 hello world 1} 3448aff1015Sdrhdo_test intpkey-4.8 { 3458aff1015Sdrh count { 3468aff1015Sdrh SELECT * FROM t1 WHERE 8<rowid AND 11>=oid; 3478aff1015Sdrh } 3488aff1015Sdrh} {11 hello world 1} 3498aff1015Sdrhdo_test intpkey-4.9 { 3508aff1015Sdrh count { 3518aff1015Sdrh SELECT * FROM t1 WHERE 11<=_rowid_ AND 12>=a; 3528aff1015Sdrh } 3538aff1015Sdrh} {11 hello world 1} 3548aff1015Sdrhdo_test intpkey-4.10 { 3558aff1015Sdrh count { 3568aff1015Sdrh SELECT * FROM t1 WHERE 0>=_rowid_; 3578aff1015Sdrh } 3588aff1015Sdrh} {-4 y z 1} 3598aff1015Sdrhdo_test intpkey-4.11 { 3608aff1015Sdrh count { 3618aff1015Sdrh SELECT * FROM t1 WHERE a<0; 3628aff1015Sdrh } 3638aff1015Sdrh} {-4 y z 1} 3648aff1015Sdrhdo_test intpkey-4.12 { 3658aff1015Sdrh count { 3668aff1015Sdrh SELECT * FROM t1 WHERE a<0 AND a>10; 3678aff1015Sdrh } 3688aff1015Sdrh} {1} 3698aff1015Sdrh 3708aff1015Sdrh# Make sure it is OK to insert a rowid of 0 3718aff1015Sdrh# 3728aff1015Sdrhdo_test intpkey-5.1 { 3738aff1015Sdrh execsql { 3748aff1015Sdrh INSERT INTO t1 VALUES(0,'zero','entry'); 3758aff1015Sdrh } 3768aff1015Sdrh count { 3778aff1015Sdrh SELECT * FROM t1 WHERE a=0; 3788aff1015Sdrh } 3798aff1015Sdrh} {0 zero entry 0} 380b45bb9f1Sdrhdo_test intpkey-5.2 { 3818aff1015Sdrh execsql { 3823f4d1d1bSdrh SELECT rowid, a FROM t1 ORDER BY rowid 3838aff1015Sdrh } 3848aff1015Sdrh} {-4 -4 0 0 5 5 6 6 11 11} 3858aff1015Sdrh 386e7ec2201Sdrh# Test the ability of the COPY command to put data into a 387e7ec2201Sdrh# table that contains an integer primary key. 388e7ec2201Sdrh# 3895f3b4ab5Sdrh# COPY command has been removed. But we retain these tests so 3905f3b4ab5Sdrh# that the tables will contain the right data for tests that follow. 3915f3b4ab5Sdrh# 392e7ec2201Sdrhdo_test intpkey-6.1 { 393e7ec2201Sdrh execsql { 3945f3b4ab5Sdrh BEGIN; 3955f3b4ab5Sdrh INSERT INTO t1 VALUES(20,'b-20','c-20'); 3965f3b4ab5Sdrh INSERT INTO t1 VALUES(21,'b-21','c-21'); 3975f3b4ab5Sdrh INSERT INTO t1 VALUES(22,'b-22','c-22'); 3985f3b4ab5Sdrh COMMIT; 399e7ec2201Sdrh SELECT * FROM t1 WHERE a>=20; 400e7ec2201Sdrh } 401e7ec2201Sdrh} {20 b-20 c-20 21 b-21 c-21 22 b-22 c-22} 402e7ec2201Sdrhdo_test intpkey-6.2 { 403e7ec2201Sdrh execsql { 404e7ec2201Sdrh SELECT * FROM t1 WHERE b=='hello' 405e7ec2201Sdrh } 406e7ec2201Sdrh} {5 hello world 11 hello world} 407e7ec2201Sdrhdo_test intpkey-6.3 { 408e7ec2201Sdrh execsql { 409e7ec2201Sdrh DELETE FROM t1 WHERE b='b-21'; 410e7ec2201Sdrh SELECT * FROM t1 WHERE b=='b-21'; 411e7ec2201Sdrh } 412e7ec2201Sdrh} {} 413e7ec2201Sdrhdo_test intpkey-6.4 { 414e7ec2201Sdrh execsql { 415e7ec2201Sdrh SELECT * FROM t1 WHERE a>=20 416e7ec2201Sdrh } 417e7ec2201Sdrh} {20 b-20 c-20 22 b-22 c-22} 418e7ec2201Sdrh 419e7ec2201Sdrh# Do an insert of values with the columns specified out of order. 420e7ec2201Sdrh# 421e7ec2201Sdrhdo_test intpkey-7.1 { 422e7ec2201Sdrh execsql { 423e7ec2201Sdrh INSERT INTO t1(c,b,a) VALUES('row','new',30); 424e7ec2201Sdrh SELECT * FROM t1 WHERE rowid>=30; 425e7ec2201Sdrh } 426e7ec2201Sdrh} {30 new row} 4279aa028daSdrhdo_test intpkey-7.2 { 4289aa028daSdrh execsql { 4299aa028daSdrh SELECT * FROM t1 WHERE rowid>20; 4309aa028daSdrh } 4319aa028daSdrh} {22 b-22 c-22 30 new row} 4324a32431cSdrh 4339647ff85Sdrh# Do an insert from a select statement. 4349647ff85Sdrh# 4359647ff85Sdrhdo_test intpkey-8.1 { 4369647ff85Sdrh execsql { 4379647ff85Sdrh CREATE TABLE t2(x INTEGER PRIMARY KEY, y, z); 4389647ff85Sdrh INSERT INTO t2 SELECT * FROM t1; 4399647ff85Sdrh SELECT rowid FROM t2; 4409647ff85Sdrh } 4419647ff85Sdrh} {-4 0 5 6 11 20 22 30} 4429647ff85Sdrhdo_test intpkey-8.2 { 4439647ff85Sdrh execsql { 4449647ff85Sdrh SELECT x FROM t2; 4459647ff85Sdrh } 4469647ff85Sdrh} {-4 0 5 6 11 20 22 30} 4479647ff85Sdrh 4489647ff85Sdrhdo_test intpkey-9.1 { 4499647ff85Sdrh execsql { 4509647ff85Sdrh UPDATE t1 SET c='www' WHERE c='world'; 4519647ff85Sdrh SELECT rowid, a, c FROM t1 WHERE c=='www'; 4529647ff85Sdrh } 4539647ff85Sdrh} {5 5 www 11 11 www} 4549647ff85Sdrh 455e1e68f49Sdrh 456e1e68f49Sdrh# Check insert of NULL for primary key 457e1e68f49Sdrh# 458e1e68f49Sdrhdo_test intpkey-10.1 { 459e1e68f49Sdrh execsql { 460e1e68f49Sdrh DROP TABLE t2; 461e1e68f49Sdrh CREATE TABLE t2(x INTEGER PRIMARY KEY, y, z); 462e1e68f49Sdrh INSERT INTO t2 VALUES(NULL, 1, 2); 463e1e68f49Sdrh SELECT * from t2; 464e1e68f49Sdrh } 465e1e68f49Sdrh} {1 1 2} 466e1e68f49Sdrhdo_test intpkey-10.2 { 467e1e68f49Sdrh execsql { 468e1e68f49Sdrh INSERT INTO t2 VALUES(NULL, 2, 3); 469e1e68f49Sdrh SELECT * from t2 WHERE x=2; 470e1e68f49Sdrh } 471e1e68f49Sdrh} {2 2 3} 47227a32783Sdrhdo_test intpkey-10.3 { 47327a32783Sdrh execsql { 47427a32783Sdrh INSERT INTO t2 SELECT NULL, z, y FROM t2; 47527a32783Sdrh SELECT * FROM t2; 47627a32783Sdrh } 47727a32783Sdrh} {1 1 2 2 2 3 3 2 1 4 3 2} 478e1e68f49Sdrh 4793d037a91Sdrh# This tests checks to see if a floating point number can be used 4803d037a91Sdrh# to reference an integer primary key. 4813d037a91Sdrh# 4823d037a91Sdrhdo_test intpkey-11.1 { 4833d037a91Sdrh execsql { 4843d037a91Sdrh SELECT b FROM t1 WHERE a=2.0+3.0; 4853d037a91Sdrh } 4863d037a91Sdrh} {hello} 4873d037a91Sdrhdo_test intpkey-11.1 { 4883d037a91Sdrh execsql { 4893d037a91Sdrh SELECT b FROM t1 WHERE a=2.0+3.5; 4903d037a91Sdrh } 4913d037a91Sdrh} {} 4923d037a91Sdrh 493ed717fe3Sdrhintegrity_check intpkey-12.1 494ed717fe3Sdrh 49554bbdf4fSdrh# Try to use a string that looks like a floating point number as 49654bbdf4fSdrh# an integer primary key. This should actually work when the floating 49754bbdf4fSdrh# point value can be rounded to an integer without loss of data. 49854bbdf4fSdrh# 49954bbdf4fSdrhdo_test intpkey-13.1 { 50054bbdf4fSdrh execsql { 50154bbdf4fSdrh SELECT * FROM t1 WHERE a=1; 50254bbdf4fSdrh } 50354bbdf4fSdrh} {} 50454bbdf4fSdrhdo_test intpkey-13.2 { 50554bbdf4fSdrh execsql { 50654bbdf4fSdrh INSERT INTO t1 VALUES('1.0',2,3); 50754bbdf4fSdrh SELECT * FROM t1 WHERE a=1; 50854bbdf4fSdrh } 50954bbdf4fSdrh} {1 2 3} 51054bbdf4fSdrhdo_test intpkey-13.3 { 51154bbdf4fSdrh catchsql { 51254bbdf4fSdrh INSERT INTO t1 VALUES('1.5',3,4); 51354bbdf4fSdrh } 51454bbdf4fSdrh} {1 {datatype mismatch}} 515a71aa001Sdrhifcapable {bloblit} { 51654bbdf4fSdrh do_test intpkey-13.4 { 51754bbdf4fSdrh catchsql { 51854bbdf4fSdrh INSERT INTO t1 VALUES(x'123456',3,4); 51954bbdf4fSdrh } 52054bbdf4fSdrh } {1 {datatype mismatch}} 521a71aa001Sdrh} 5229d213ef0Sdrhdo_test intpkey-13.5 { 5239d213ef0Sdrh catchsql { 5249d213ef0Sdrh INSERT INTO t1 VALUES('+1234567890',3,4); 5259d213ef0Sdrh } 5269d213ef0Sdrh} {0 {}} 52754bbdf4fSdrh 5283fdf8266Sdanielk1977# Compare an INTEGER PRIMARY KEY against a TEXT expression. The INTEGER 5293fdf8266Sdanielk1977# affinity should be applied to the text value before the comparison 5303fdf8266Sdanielk1977# takes place. 5313fdf8266Sdanielk1977# 5323fdf8266Sdanielk1977do_test intpkey-14.1 { 5333fdf8266Sdanielk1977 execsql { 5343fdf8266Sdanielk1977 CREATE TABLE t3(a INTEGER PRIMARY KEY, b INTEGER, c TEXT); 5353fdf8266Sdanielk1977 INSERT INTO t3 VALUES(1, 1, 'one'); 5363fdf8266Sdanielk1977 INSERT INTO t3 VALUES(2, 2, '2'); 5373fdf8266Sdanielk1977 INSERT INTO t3 VALUES(3, 3, 3); 5383fdf8266Sdanielk1977 } 5393fdf8266Sdanielk1977} {} 5403fdf8266Sdanielk1977do_test intpkey-14.2 { 5413fdf8266Sdanielk1977 execsql { 5423fdf8266Sdanielk1977 SELECT * FROM t3 WHERE a>2; 5433fdf8266Sdanielk1977 } 5443fdf8266Sdanielk1977} {3 3 3} 5453fdf8266Sdanielk1977do_test intpkey-14.3 { 5463fdf8266Sdanielk1977 execsql { 5473fdf8266Sdanielk1977 SELECT * FROM t3 WHERE a>'2'; 5483fdf8266Sdanielk1977 } 5493fdf8266Sdanielk1977} {3 3 3} 5503fdf8266Sdanielk1977do_test intpkey-14.4 { 5513fdf8266Sdanielk1977 execsql { 5523fdf8266Sdanielk1977 SELECT * FROM t3 WHERE a<'2'; 5533fdf8266Sdanielk1977 } 5543fdf8266Sdanielk1977} {1 1 one} 5553fdf8266Sdanielk1977do_test intpkey-14.5 { 5563fdf8266Sdanielk1977 execsql { 5573fdf8266Sdanielk1977 SELECT * FROM t3 WHERE a<c; 5583fdf8266Sdanielk1977 } 5593fdf8266Sdanielk1977} {1 1 one} 5603fdf8266Sdanielk1977do_test intpkey-14.6 { 5613fdf8266Sdanielk1977 execsql { 5623fdf8266Sdanielk1977 SELECT * FROM t3 WHERE a=c; 5633fdf8266Sdanielk1977 } 5643fdf8266Sdanielk1977} {2 2 2 3 3 3} 56554bbdf4fSdrh 566f4f8fd51Sdrh# Check for proper handling of primary keys greater than 2^31. 567f4f8fd51Sdrh# Ticket #1188 568f4f8fd51Sdrh# 569f4f8fd51Sdrhdo_test intpkey-15.1 { 570f4f8fd51Sdrh execsql { 571f4f8fd51Sdrh INSERT INTO t1 VALUES(2147483647, 'big-1', 123); 572f4f8fd51Sdrh SELECT * FROM t1 WHERE a>2147483648; 573f4f8fd51Sdrh } 574f4f8fd51Sdrh} {} 575f4f8fd51Sdrhdo_test intpkey-15.2 { 576f4f8fd51Sdrh execsql { 577f4f8fd51Sdrh INSERT INTO t1 VALUES(NULL, 'big-2', 234); 578f4f8fd51Sdrh SELECT b FROM t1 WHERE a>=2147483648; 579f4f8fd51Sdrh } 580f4f8fd51Sdrh} {big-2} 581f4f8fd51Sdrhdo_test intpkey-15.3 { 582f4f8fd51Sdrh execsql { 583f4f8fd51Sdrh SELECT b FROM t1 WHERE a>2147483648; 584f4f8fd51Sdrh } 585f4f8fd51Sdrh} {} 586f4f8fd51Sdrhdo_test intpkey-15.4 { 587f4f8fd51Sdrh execsql { 588f4f8fd51Sdrh SELECT b FROM t1 WHERE a>=2147483647; 589f4f8fd51Sdrh } 590f4f8fd51Sdrh} {big-1 big-2} 591f4f8fd51Sdrhdo_test intpkey-15.5 { 592f4f8fd51Sdrh execsql { 593f4f8fd51Sdrh SELECT b FROM t1 WHERE a<2147483648; 594f4f8fd51Sdrh } 595f4f8fd51Sdrh} {y zero 2 hello second hello b-20 b-22 new 3 big-1} 596f4f8fd51Sdrhdo_test intpkey-15.6 { 597f4f8fd51Sdrh execsql { 598f4f8fd51Sdrh SELECT b FROM t1 WHERE a<12345678901; 599f4f8fd51Sdrh } 600f4f8fd51Sdrh} {y zero 2 hello second hello b-20 b-22 new 3 big-1 big-2} 601f4f8fd51Sdrhdo_test intpkey-15.7 { 602f4f8fd51Sdrh execsql { 603f4f8fd51Sdrh SELECT b FROM t1 WHERE a>12345678901; 604f4f8fd51Sdrh } 605f4f8fd51Sdrh} {} 6063fdf8266Sdanielk1977 607a6dddd9bSdrh# 2016-04-18 ticket https://www.sqlite.org/src/tktview/7d7525cb01b68712495d3a 608a6dddd9bSdrh# Be sure to escape quoted typenames. 609a6dddd9bSdrh# 610a6dddd9bSdrhdo_execsql_test intpkey-16.0 { 611a6dddd9bSdrh CREATE TABLE t16a(id "INTEGER" PRIMARY KEY AUTOINCREMENT, b [TEXT], c `INT`); 612a6dddd9bSdrh} {} 613a6dddd9bSdrhdo_execsql_test intpkey-16.1 { 614a6dddd9bSdrh PRAGMA table_info=t16a; 615a6dddd9bSdrh} {0 id INTEGER 0 {} 1 1 b TEXT 0 {} 0 2 c INT 0 {} 0} 616a6dddd9bSdrh 61770077d17Sdrh# 2016-05-06 ticket https://www.sqlite.org/src/tktview/16c9801ceba4923939085 61870077d17Sdrh# When the schema contains an index on the IPK and no other index 61970077d17Sdrh# and a WHERE clause on a delete uses an OR where both sides referencing 62070077d17Sdrh# the IPK, then it is possible that the OP_Delete will fail because there 62170077d17Sdrh# deferred seek of the OP_Seek is not resolved prior to reaching the OP_Delete. 62270077d17Sdrh# 62370077d17Sdrhdo_execsql_test intpkey-17.0 { 62470077d17Sdrh CREATE TABLE t17(x INTEGER PRIMARY KEY, y TEXT); 62570077d17Sdrh INSERT INTO t17(x,y) VALUES(123,'elephant'),(248,'giraffe'); 62670077d17Sdrh CREATE INDEX t17x ON t17(x); 62770077d17Sdrh DELETE FROM t17 WHERE x=99 OR x<130; 62870077d17Sdrh SELECT * FROM t17; 62970077d17Sdrh} {248 giraffe} 630bcf6884aSdrhdo_execsql_test intpkey-17.1 { 631bcf6884aSdrh DROP INDEX t17x; 632bcf6884aSdrh DELETE FROM t17; 633bcf6884aSdrh INSERT INTO t17(x,y) VALUES(123,'elephant'),(248,'giraffe'); 634f09c4823Sdrh CREATE UNIQUE INDEX t17x ON t17(abs(x)); 635bcf6884aSdrh DELETE FROM t17 WHERE abs(x) IS NULL OR abs(x)<130; 636bcf6884aSdrh SELECT * FROM t17; 637bcf6884aSdrh} {248 giraffe} 638f09c4823Sdrhdo_execsql_test intpkey-17.2 { 639f09c4823Sdrh DELETE FROM t17; 640f09c4823Sdrh INSERT INTO t17(x,y) VALUES(123,'elephant'),(248,'giraffe'); 6413eead270Sdrh UPDATE t17 SET y='ostrich' WHERE abs(x)=248; 642f09c4823Sdrh SELECT * FROM t17 ORDER BY +x; 643f09c4823Sdrh} {123 elephant 248 ostrich} 644f4f8fd51Sdrh 645f4f8fd51Sdrhfinish_test 646